[
  {
    "path": ".hgignore",
    "content": "syntax: glob\nOptolithiumGui/icons/.DS_Store\nOptolithiumGui/database/.DS_Store\n.DS_Store\nOptolithiumC/.idea/*\nOptolithiumC/.settings/*\nOptolithiumC/.cproject\nOptolithiumC/.project\nOptolithiumGui/.idea/*\nOptolithiumGui/.project\nOptolithiumC/build/*\nOptolithiumC/CMakeFiles/*\nOptolithiumC/plugins/CMakeFiles/*\nOptolithiumC/plugins/build/*\nOptolithiumGui/_clipper.so\nOptolithiumGui/_optolithiumc.so\nOptolithiumC/plugins/cmake_install.cmake\nOptolithiumC/plugins/Makefile\nOptolithiumC/liboptolithiumc.a\nOptolithiumC/cmake_install.cmake\nOptolithiumGui/clipper.py\nOptolithiumC/CMakeCache.txt\nOptolithiumC/Makefile\nOptolithiumGui/optolithiumc.py\nOptolithiumGui/*.pyc\nOptolithiumGui/database/*.pyc\nOptolithiumGui/options/*.pyc\nOptolithiumGui/views/*.pyc\nOptolithiumC/libs/clipper/CMakeFiles/*\nOptolithiumC/libs/eikonal/CMakeFiles/*\nOptolithiumC/libs/kissfft/CMakeFiles/*\nOptolithiumC/install_manifest.txt\nOptolithiumC/libs/clipper/Makefile\nOptolithiumC/libs/clipper/cmake_install.cmake\nOptolithiumC/libs/clipper/libpolyclipping.a\nOptolithiumC/libs/eikonal/Makefile\nOptolithiumC/libs/eikonal/cmake_install.cmake\nOptolithiumC/libs/eikonal/libeikonal.a\nOptolithiumC/libs/kissfft/Makefile\nOptolithiumC/libs/kissfft/cmake_install.cmake\nOptolithiumC/libs/kissfft/libkissfft.a\nOptolithiumGui/logs/myeasylog.log\nOptolithiumGui/test/*\nOptolithiumC/libs/fourier/CMakeFiles/*\nOptolithiumC/libs/fourier/libfourier.a\nOptolithiumC/libs/fourier/cmake_install.cmake\nOptolithiumC/libs/fourier/Makefile\nOptolithiumC/libs/fourier/check\nOptolithiumGui/logs/*\nOptolithiumGui/plugins/dev_models/*.dylib\nOptolithiumGui/plugins/masks/*.dylib\nOptolithiumGui/plugins/source_shapes/*.dylib\nOptolithiumGui/plugins/pupil_filters/*.dylib\nOptolithiumGui/*.db\nOptolithiumC/plugins/*.dll\nOptolithiumC/plugins/*.dll.a\nOptolithiumGui/build/*\nOptolithiumGui/plugins/*\nOptolithiumGui/_optolithiumc.pyd\nOptolithiumGui/_clipper.pyd\nOptolithiumC/_optolithiumc.pyd\nOptolithiumC/_clipper.pyd\ninstaller/Optolithium-cache/*\ninstaller/Optolithium-SetupFiles/*\n"
  },
  {
    "path": "COPYRIGHT",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */"
  },
  {
    "path": "LICENSE.TXT",
    "content": "GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License."
  },
  {
    "path": "OptolithiumC/CMakeLists.txt",
    "content": "PROJECT(\"optolithiumc\")\nCMAKE_MINIMUM_REQUIRED(VERSION 2.8)\nCMAKE_POLICY(SET CMP0015 NEW)\n\nSET(CMAKE_USE_RELATIVE_PATHS ON)\nSET(CMAKE_SKIP_RPATH TRUE)\nSET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)\n\nSET(OPTOLITHIUMGUI_DIR \"${CMAKE_HOME_DIRECTORY}/../OptolithiumGui\")\n\nSET(CMAKE_MODULE_PATH \"${CMAKE_HOME_DIRECTORY}\")\n# SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY \"${OPTOLITHIUMGUI_DIR}\")\n# SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY \"${OPTOLITHIUMGUI_DIR}\")\n\nSET(OPTOLITHIUMC_DIR \"src\")\nSET(LIBRARIES_DIR \"libs\")\n\nSET(OPTOLITHIUMC_USE_FFTW_LIBRARY \"ON\")\n# SET(OPTOLITHIUMC_USE_KISSFFT_LIBRARY \"ON\")\n# SET(OPTOLITHIUMC_USE_FOURIER_LIBRARY \"ON\")\n\nSET(EIKONAL_DIR \"${LIBRARIES_DIR}/eikonal\")\nSET(CLIPPER_DIR \"${LIBRARIES_DIR}/clipper\")\nSET(KISSFFT_DIR \"${LIBRARIES_DIR}/kissfft\")\nSET(FOURIER_DIR \"${LIBRARIES_DIR}/fourier\")\n\nADD_DEFINITIONS(-DARMA_NO_DEBUG)\nADD_DEFINITIONS(-D_ELPP_DISABLE_PERFORMANCE_TRACKING)\nADD_DEFINITIONS(-D__NO_MINGW_LFS)\n\nSET(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -include cmath -std=gnu++11 -Wall\")\n\nSET(ARMADILLO_INCLUDE_DIR \"${LIBRARIES_DIR}/armadillo/include/\")\nSET(ARMANPY_INCLUDE_DIR \"${LIBRARIES_DIR}/armanpy/include\")\nSET(EASYLOGGING_INCLUDE_DIR \"${LIBRARIES_DIR}/easylogging\")\nSET(EIKONAL_INCLUDE_DIR \"${EIKONAL_DIR}/include\")\nSET(CLIPPER_INCLUDE_DIR \"${CLIPPER_DIR}/include\")\n\nSET(CMAKE_BUILD_TYPE \"Release\")\n\nFIND_PACKAGE(Threads REQUIRED)\nFIND_PACKAGE(SWIG REQUIRED)\nFIND_PACKAGE(PythonLibs 2.7 REQUIRED)\nFIND_PACKAGE(NumPy REQUIRED)\n\n\nIF (DEFINED OPTOLITHIUMC_USE_FFTW_LIBRARY)\n    IF (WIN32)\n        SET(FFTW_DIR \"${LIBRARIES_DIR}/fftw3-win32\")\n        INCLUDE_DIRECTORIES(${FFTW_DIR})\n    ELSE()\n        FIND_PACKAGE(FFTW REQUIRED)\n        INCLUDE_DIRECTORIES(\"${FFTW_INCLUDES}\")\n    ENDIF()\nELSEIF (DEFINED OPTOLITHIUMC_USE_KISSFFT_LIBRARY)\n    ADD_SUBDIRECTORY(${KISSFFT_DIR})\n    INCLUDE_DIRECTORIES(\"${KISSFFT_DIR}/include\")\nELSEIF (DEFINED OPTOLITHIUMC_USE_FOURIER_LIBRARY)\n    ADD_SUBDIRECTORY(${FOURIER_DIR})\n    INCLUDE_DIRECTORIES(\"${FOURIER_DIR}/include\")\nENDIF()\n\n\nINCLUDE(\"${SWIG_USE_FILE}\")\n\nINCLUDE_DIRECTORIES(\"include\")\nINCLUDE_DIRECTORIES(\"${CMAKE_SOURCE_DIR}\")\nINCLUDE_DIRECTORIES(\"${PYTHON_INCLUDE_DIR}\")\nINCLUDE_DIRECTORIES(\"${ARMADILLO_INCLUDE_DIR}\")\nINCLUDE_DIRECTORIES(\"${ARMANPY_INCLUDE_DIR}\")\nINCLUDE_DIRECTORIES(\"${NUMPY_INCLUDE_DIRS}\")\nINCLUDE_DIRECTORIES(\"${EASYLOGGING_INCLUDE_DIR}\")\nINCLUDE_DIRECTORIES(\"${EIKONAL_INCLUDE_DIR}\")\nINCLUDE_DIRECTORIES(\"${CLIPPER_INCLUDE_DIR}\")\n\nADD_SUBDIRECTORY(\"${EIKONAL_DIR}\")\nADD_SUBDIRECTORY(\"${CLIPPER_DIR}\")\nADD_SUBDIRECTORY(\"plugins\")\n\n# build the optolithiumc library\nADD_LIBRARY(optolithiumc STATIC\n\t\"${OPTOLITHIUMC_DIR}/opl_log.cpp\"\n\t\"${OPTOLITHIUMC_DIR}/opl_geometry.cpp\"\n\t\"${OPTOLITHIUMC_DIR}/opl_contours.cpp\"\n\t\"${OPTOLITHIUMC_DIR}/opl_interp.cpp\"\n    \"${OPTOLITHIUMC_DIR}/opl_capi.cpp\"\n    \"${OPTOLITHIUMC_DIR}/opl_sim.cpp\"\n)\n\nLINK_DIRECTORIES(\"${CLIPPER_DIR}\")\nTARGET_LINK_LIBRARIES(optolithiumc \"eikonal\")\n\nIF (DEFINED OPTOLITHIUMC_USE_FFTW_LIBRARY)\n    IF (WIN32)\n        LINK_DIRECTORIES(\"${FFTW_DIR}\")\n        TARGET_LINK_LIBRARIES(optolithiumc \"fftw3\")\n    ELSE()\n        TARGET_LINK_LIBRARIES(optolithiumc ${FFTW_LIBRARIES})\n    ENDIF()\n    ADD_DEFINITIONS(-DOPTOLITHIUMC_USE_FFTW_LIBRARY)\nELSEIF (DEFINED OPTOLITHIUMC_USE_KISSFFT_LIBRARY)\n    TARGET_LINK_LIBRARIES(optolithiumc \"kissfft\")\n    ADD_DEFINITIONS(-DOPTOLITHIUMC_USE_KISSFFT_LIBRARY)\nELSEIF (DEFINED OPTOLITHIUMC_USE_FOURIER_LIBRARY)\n    TARGET_LINK_LIBRARIES(optolithiumc \"fourier\")\n    ADD_DEFINITIONS(-DOPTOLITHIUMC_USE_FOURIER_LIBRARY)\nENDIF()\n\n# Swig shall but all stuff to the same directory where the *.so or *.pyd are placed\nSET(CMAKE_SWIG_OUTDIR \"${CMAKE_HOME_DIRECTORY}/build/\")\n\n# Set up the swig wrapper for optolithiumc\nSET_SOURCE_FILES_PROPERTIES(optolithiumc.i PROPERTIES CPLUSPLUS ON)\nSET_SOURCE_FILES_PROPERTIES(optolithiumc.i PROPERTIES SWIG_FLAGS \"-ignoremissing;-w509\")\nSWIG_ADD_MODULE(optolithiumc python optolithiumc.i)\nSWIG_LINK_LIBRARIES(optolithiumc optolithiumc ${PYTHON_LIBRARIES})\n\n# Set up the swig wrapper for clipper\nSET_SOURCE_FILES_PROPERTIES(clipper.i PROPERTIES CPLUSPLUS ON)\nSET_SOURCE_FILES_PROPERTIES(clipper.i PROPERTIES SWIG_FLAGS \"-ignoremissing;-w509\")\nSWIG_ADD_MODULE(clipper python clipper.i)\nSWIG_LINK_LIBRARIES(clipper polyclipping ${PYTHON_LIBRARIES})\n\n# Install stage\nINSTALL(FILES \"${CMAKE_SWIG_OUTDIR}/optolithiumc.py\" DESTINATION \"${OPTOLITHIUMGUI_DIR}\")\nINSTALL(FILES \"${CMAKE_SWIG_OUTDIR}/clipper.py\" DESTINATION \"${OPTOLITHIUMGUI_DIR}\")\nINSTALL(TARGETS _optolithiumc _clipper LIBRARY DESTINATION \"${OPTOLITHIUMGUI_DIR}\")\n\nINSTALL(TARGETS _optolithiumc _clipper LIBRARY DESTINATION \"${CMAKE_HOME_DIRECTORY}/build\")\n\n# ADD_CUSTOM_COMMAND(TARGET _optolithiumc PRE_BUILD \n#     COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_HOME_DIRECTORY}/build/optolithiumcPYTHON_wrap.cxx\n#     COMMAND ${CMAKE_COMMAND} -E remove \"${OPTOLITHIUMGUI_DIR}/optolithiumc.py\"\n# )\n\n# ADD_CUSTOM_COMMAND(TARGET _clipper PRE_BUILD\n#    COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_HOME_DIRECTORY}/build/clipperPYTHON_wrap.cxx\n#    COMMAND ${CMAKE_COMMAND} -E remove \"${OPTOLITHIUMGUI_DIR}/clipper.py\"\n# )"
  },
  {
    "path": "OptolithiumC/FindFFTW.cmake",
    "content": " # - Find FFTW\n# Find the native FFTW includes and library\n#\n# FFTW_INCLUDES - where to find fftw3.h\n# FFTW_LIBRARIES - List of libraries when using FFTW.\n# FFTW_FOUND - True if FFTW found.\nif (FFTW_INCLUDES)\n    # Already in cache, be silent\n    set (FFTW_FIND_QUIETLY TRUE )\nendif (FFTW_INCLUDES)\n\nfind_path (FFTW_INCLUDES fftw3.h)\nfind_library (FFTW_LIBRARIES NAMES fftw3)\n# handle the QUIETLY and REQUIRED arguments and set FFTW_FOUND to TRUE if\n# all listed variables are TRUE\ninclude (FindPackageHandleStandardArgs)\nfind_package_handle_standard_args (FFTW DEFAULT_MSG FFTW_LIBRARIES FFTW_INCLUDES)\nmark_as_advanced (FFTW_LIBRARIES FFTW_INCLUDES)"
  },
  {
    "path": "OptolithiumC/FindNumPy.cmake",
    "content": "# - Find the NumPy libraries\r\n# This module finds if NumPy is installed, and sets the following variables\r\n# indicating where it is.\r\n#\r\n# TODO: Update to provide the libraries and paths for linking npymath lib.\r\n#\r\n#  NUMPY_FOUND               - was NumPy found\r\n#  NUMPY_VERSION             - the version of NumPy found as a string\r\n#  NUMPY_VERSION_MAJOR       - the major version number of NumPy\r\n#  NUMPY_VERSION_MINOR       - the minor version number of NumPy\r\n#  NUMPY_VERSION_PATCH       - the patch version number of NumPy\r\n#  NUMPY_VERSION_DECIMAL     - e.g. version 1.6.1 is 10601\r\n#  NUMPY_INCLUDE_DIRS        - path to the NumPy include files\r\n\r\n#============================================================================\r\n# Copyright 2012 Continuum Analytics, Inc.\r\n#\r\n# MIT License\r\n#\r\n# Permission is hereby granted, free of charge, to any person obtaining\r\n# a copy of this software and associated documentation files\r\n# (the \"Software\"), to deal in the Software without restriction, including\r\n# without limitation the rights to use, copy, modify, merge, publish,\r\n# distribute, sublicense, and/or sell copies of the Software, and to permit\r\n# persons to whom the Software is furnished to do so, subject to\r\n# the following conditions:\r\n#\r\n# The above copyright notice and this permission notice shall be included\r\n# in all copies or substantial portions of the Software.\r\n#\r\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r\n# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\n# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR\r\n# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\r\n# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r\n# OTHER DEALINGS IN THE SOFTWARE.\r\n#\r\n#============================================================================\r\n\r\n# Finding NumPy involves calling the Python interpreter\r\nif(NumPy_FIND_REQUIRED)\r\n    find_package(PythonInterp REQUIRED)\r\nelse()\r\n    find_package(PythonInterp)\r\nendif()\r\n\r\nif(NOT PYTHONINTERP_FOUND)\r\n    set(NUMPY_FOUND FALSE)\r\n    return()\r\nendif()\r\n\r\nexecute_process(COMMAND \"${PYTHON_EXECUTABLE}\" \"-c\"\r\n    \"import numpy as n; print(n.__version__); print(n.get_include());\"\r\n    RESULT_VARIABLE _NUMPY_SEARCH_SUCCESS\r\n    OUTPUT_VARIABLE _NUMPY_VALUES_OUTPUT\r\n    ERROR_VARIABLE _NUMPY_ERROR_VALUE\r\n    OUTPUT_STRIP_TRAILING_WHITESPACE)\r\n\r\nif(NOT _NUMPY_SEARCH_SUCCESS MATCHES 0)\r\n    if(NumPy_FIND_REQUIRED)\r\n        message(FATAL_ERROR\r\n            \"NumPy import failure:\\n${_NUMPY_ERROR_VALUE}\")\r\n    endif()\r\n    set(NUMPY_FOUND FALSE)\r\n    return()\r\nendif()\r\n\r\n# Convert the process output into a list\r\nstring(REGEX REPLACE \";\" \"\\\\\\\\;\" _NUMPY_VALUES ${_NUMPY_VALUES_OUTPUT})\r\nstring(REGEX REPLACE \"\\n\" \";\" _NUMPY_VALUES ${_NUMPY_VALUES})\r\n# Just in case there is unexpected output from the Python command.\r\nlist(GET _NUMPY_VALUES -2 NUMPY_VERSION)\r\nlist(GET _NUMPY_VALUES -1 NUMPY_INCLUDE_DIRS)\r\n\r\nstring(REGEX MATCH \"^[0-9]+\\\\.[0-9]+\\\\.[0-9]+\" _VER_CHECK \"${NUMPY_VERSION}\")\r\nif(\"${_VER_CHECK}\" STREQUAL \"\")\r\n    # The output from Python was unexpected. Raise an error always\r\n    # here, because we found NumPy, but it appears to be corrupted somehow.\r\n    message(FATAL_ERROR\r\n        \"Requested version and include path from NumPy, got instead:\\n${_NUMPY_VALUES_OUTPUT}\\n\")\r\n    return()\r\nendif()\r\n\r\n# Make sure all directory separators are '/'\r\nstring(REGEX REPLACE \"\\\\\\\\\" \"/\" NUMPY_INCLUDE_DIRS ${NUMPY_INCLUDE_DIRS})\r\n\r\n# Get the major and minor version numbers\r\nstring(REGEX REPLACE \"\\\\.\" \";\" _NUMPY_VERSION_LIST ${NUMPY_VERSION})\r\nlist(GET _NUMPY_VERSION_LIST 0 NUMPY_VERSION_MAJOR)\r\nlist(GET _NUMPY_VERSION_LIST 1 NUMPY_VERSION_MINOR)\r\nlist(GET _NUMPY_VERSION_LIST 2 NUMPY_VERSION_PATCH)\r\nstring(REGEX MATCH \"[0-9]*\" NUMPY_VERSION_PATCH ${NUMPY_VERSION_PATCH})\r\nmath(EXPR NUMPY_VERSION_DECIMAL\r\n    \"(${NUMPY_VERSION_MAJOR} * 10000) + (${NUMPY_VERSION_MINOR} * 100) + ${NUMPY_VERSION_PATCH}\")\r\n\r\nfind_package_message(NUMPY\r\n    \"Found NumPy: version \\\"${NUMPY_VERSION}\\\" ${NUMPY_INCLUDE_DIRS}\"\r\n    \"${NUMPY_INCLUDE_DIRS}${NUMPY_VERSION}\")\r\n\r\nset(NUMPY_FOUND TRUE)\r\n\r\n"
  },
  {
    "path": "OptolithiumC/clipper.i",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n%module clipper\n%{\n    #include \"clipper.hpp\"\n%}\n\n%include <std_vector.i>\n\n%include \"clipper.hpp\"\n\n%template(Path) std::vector<ClipperLib::IntPoint>;\n%template(Paths) std::vector<ClipperLib::Path>;\n\nnamespace ClipperLib {\n\n\t%pythoncode %{\n\n        def merge(polygons, fillType=pftNonZero):\n            result = Paths()\n            c = Clipper();\n            # c.ForceSimple = True\n            for polygon in polygons:\n                path = Path([IntPoint(*p) for p in polygon])\n                c.AddPath(path, ptSubject, True);\n            c.Execute(ctUnion, result, fillType, fillType)\n            return [[(point.X, point.Y) for point in polygon] for polygon in polygons]\n\t%}\n}"
  },
  {
    "path": "OptolithiumC/examples/aerial_image_various_source_shapes.py",
    "content": "__author__ = 'OlaPsema'\r\n\r\nimport optolithiumc as oplc\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\n\r\n\r\ndef get_quasar_source_shape_model(x, y, sigma_in, sigma_out, blade_angle):\r\n    xv, yv = np.meshgrid(x, y)\r\n    if blade_angle <= 90.:\r\n        blade_angle = (90. + blade_angle) / 2.\r\n        cond3 = np.abs(yv) <= np.abs(np.tan(np.deg2rad(blade_angle)) * x)\r\n        cond4 = np.abs(xv) <= np.abs(np.tan(np.deg2rad(blade_angle)) * np.transpose(np.array([y])))\r\n    else:\r\n        cond3 = cond4 = 1\r\n    cond1 = ((xv - 0.) ** 2 + (yv - 0.) ** 2) <= sigma_out ** 2\r\n    cond2 = ((xv - 0.) ** 2 + (yv - 0.) ** 2) >= sigma_in ** 2\r\n    val = np.array(cond1 & cond2 & cond3 & cond4, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    val = np.asfortranarray(val / np.sum(val))\r\n    return val\r\n\r\n\r\ndef get_conventional_coherent_source_shape_model(step, x, y):\r\n    xv, yv = np.meshgrid(x, y)\r\n    val = np.array(((xv - 0.) ** 2 + (yv - 0.) ** 2) <= (step / 10.) ** 2, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    return np.asfortranarray(val)\r\n\r\n\r\ndef get_conventional_partially_coherent_source_shape_model(x, y, sigma):\r\n    xv, yv = np.meshgrid(x, y)\r\n    cond = ((xv - 0.) ** 2 + (yv - 0.) ** 2) <= sigma ** 2\r\n    val = np.array(cond, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    val = np.asfortranarray(val / np.sum(val))\r\n    return val\r\n\r\n\r\ndef get_annular_source_shape_model(x, y, sigma_in, sigma_out):\r\n    xv, yv = np.meshgrid(x, y)\r\n    cond1 = ((xv - 0.) ** 2 + (yv - 0.) ** 2) <= sigma_out ** 2\r\n    cond2 = ((xv - 0.) ** 2 + (yv - 0.) ** 2) >= sigma_in ** 2\r\n    val = np.array(cond1 & cond2, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    val = np.asfortranarray(val / np.sum(val))\r\n    return val\r\n\r\n\r\ndef get_dipole_source_shape_model(x, y, center_sigma, radius_sigma):\r\n    xv, yv = np.meshgrid(x, y)\r\n    cond1 = ((xv - center_sigma) ** 2 + (yv - 0.) ** 2) <= radius_sigma ** 2\r\n    cond2 = ((xv + center_sigma) ** 2 + (yv - 0.) ** 2) <= radius_sigma ** 2\r\n    val = np.array(cond1 | cond2, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    val = np.asfortranarray(val / np.sum(val))\r\n    return val\r\n\r\n\r\ndef get_monopole_source_shape_model(x, y, center_x, center_y, radius_sigma):\r\n    xv, yv = np.meshgrid(x, y)\r\n    cond1 = ((xv - center_x) ** 2 + (yv + center_y) ** 2) <= radius_sigma ** 2\r\n    val = np.array(cond1, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    val = np.asfortranarray(val / np.sum(val))\r\n    return val\r\n\r\n\r\ndef get_quadrupole_source_shape_model(x, y, center_sigma, radius_sigma, geometry_type):\r\n    xv, yv = np.meshgrid(x, y)\r\n    if geometry_type == 1:\r\n        center_sigma = center_sigma * np.sqrt(1. / 2.)\r\n        cond1 = ((xv - center_sigma) ** 2 + (yv - center_sigma) ** 2) <= radius_sigma ** 2\r\n        cond2 = ((xv - center_sigma) ** 2 + (yv + center_sigma) ** 2) <= radius_sigma ** 2\r\n        cond3 = ((xv + center_sigma) ** 2 + (yv - center_sigma) ** 2) <= radius_sigma ** 2\r\n        cond4 = ((xv + center_sigma) ** 2 + (yv + center_sigma) ** 2) <= radius_sigma ** 2\r\n    else:\r\n        cond1 = ((xv - center_sigma) ** 2 + (yv - 0.) ** 2) <= radius_sigma ** 2\r\n        cond2 = ((xv + center_sigma) ** 2 + (yv + 0.) ** 2) <= radius_sigma ** 2\r\n        cond3 = ((xv - 0.) ** 2 + (yv - center_sigma) ** 2) <= radius_sigma ** 2\r\n        cond4 = ((xv - 0.) ** 2 + (yv + center_sigma) ** 2) <= radius_sigma ** 2\r\n    val = np.array(cond1 | cond2 | cond3 | cond4, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    val = np.asfortranarray(val / np.sum(val))\r\n    return val\r\n\r\n\r\ndef get_shrinc_source_shape_model(x, y, sigma_out, stripe_width):\r\n    xv, yv = np.meshgrid(x, y)\r\n    cond1 = ((xv - 0.) ** 2 + (yv - 0.) ** 2) <= sigma_out ** 2\r\n    cond2 = np.abs(yv) >= stripe_width/2.\r\n    cond3 = np.abs(xv) >= stripe_width/2.\r\n    val = np.array(cond1 & cond2 & cond3, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    val = np.asfortranarray(val / np.sum(val))\r\n    return val\r\n\r\n\r\ndef get_square_source_shape_model(x, y, half_width_sigma):\r\n    xv, yv = np.meshgrid(x, y)\r\n    cond1 = np.abs(yv) <= half_width_sigma\r\n    cond2 = np.abs(xv) <= half_width_sigma\r\n    val = np.array(cond1 & cond2, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    val = np.asfortranarray(val / np.sum(val))\r\n    return val\r\n\r\n\r\nclass AerialImage(object):\r\n    def __init__(self):\r\n        # setting pattern properties:\r\n        # example: pattern with 1 feature _I_\r\n\r\n        self.featureWidth = 240.  # nm\r\n        self.pitch = 600.  # nm\r\n        self.featureTransmittance = 0.  # from 0. to 1.\r\n        self.maskTransmittance = 1.  # from 0. to 1.\r\n        self.featurePhase = 0.\r\n        self.maskPhase = 0.\r\n\r\n        self.wavelength = 365.0  # nanometers\r\n        self.numericalAperture = 0.9\r\n        self.reductionRatio = 1.0\r\n        self.flare = 0.\r\n        self.immersion = 0.\r\n        self.focus = 0.\r\n        self.nominalDose = 145  # mJ/cm^2\r\n        self.correctable = 0.5\r\n\r\n        self.sourceStep = 0.01\r\n        self.maskStep = 5.\r\n\r\n        self.sourceShapeType = 6\r\n        # 1  - conventional coherent\r\n        # 3  - conventional partially coherent\r\n        # 4  - dipole\r\n        # 5  - monopole\r\n        # 6  - quadrupole\r\n        # 7  - quasar\r\n        # 8  - shrinc\r\n        # 9  - square\r\n        # 10 - annular\r\n        self.aerial_image_formation()\r\n\r\n    def source_shape_model_choice(self, x, y):\r\n        if self.sourceShapeType == 1:\r\n            return get_conventional_coherent_source_shape_model(self.sourceStep, x, y)\r\n        elif self.sourceShapeType == 3:\r\n            return get_conventional_partially_coherent_source_shape_model(x, y, sigma=0.5)\r\n        elif self.sourceShapeType == 4:\r\n            return get_dipole_source_shape_model(x, y, center_sigma=0.5, radius_sigma=0.3)\r\n        elif self.sourceShapeType == 5:\r\n            return get_monopole_source_shape_model(x, y, center_x=0.5, center_y=0.3, radius_sigma=0.2)\r\n        elif self.sourceShapeType == 6:\r\n            # types:\r\n            # 1 - Normal (90deg)\r\n            # 2 - Cross  (45deg)\r\n            return get_quadrupole_source_shape_model(x, y, center_sigma=0.5, radius_sigma=0.2, geometry_type=1)\r\n        elif self.sourceShapeType == 7:\r\n            return get_quasar_source_shape_model(x, y, sigma_in=0.4, sigma_out=0.8, blade_angle=60.)\r\n        elif self.sourceShapeType == 8:\r\n            return get_shrinc_source_shape_model(x, y, sigma_out=0.8, stripe_width=0.2)\r\n        elif self.sourceShapeType == 9:\r\n            return get_square_source_shape_model(x, y, half_width_sigma=0.5)\r\n        elif self.sourceShapeType == 10:\r\n            return get_annular_source_shape_model(x, y, sigma_in=0.4, sigma_out=0.8)\r\n        else:\r\n            raise ValueError(\"Wrong source shape id\")\r\n\r\n    def aerial_image_formation(self):\r\n        core_logging = oplc.OptolithiumCoreLog()\r\n        core_logging.set_verbose_level(0)\r\n\r\n        # feature formation\r\n        point1 = oplc.Point2d(-self.featureWidth / 2., 0.)\r\n        point2 = oplc.Point2d(self.featureWidth / 2., 0.)\r\n        points_array = oplc.Points2dArray((point1, point2))\r\n        region = oplc.Region(points_array, self.featureTransmittance, self.featurePhase)\r\n        region_array = (region, )\r\n\r\n        # repeatable part formation\r\n        point1 = oplc.Point2d(-self.pitch / 2., 0.)\r\n        point2 = oplc.Point2d(self.pitch / 2., 0.)\r\n        box = oplc.Box(point1, point2, self.maskTransmittance, self.maskPhase)\r\n\r\n        # mask formation\r\n        mask = oplc.Mask(region_array, box)\r\n\r\n        # source calculation\r\n        points_count = int(2 / self.sourceStep) + 1\r\n        nx, ny = (points_count, points_count)\r\n        x = np.linspace(-1, 1, nx)\r\n        y = np.linspace(-1, 1, ny)\r\n        x = np.round(x/self.sourceStep)*self.sourceStep\r\n        y = np.round(y/self.sourceStep)*self.sourceStep\r\n        values = self.source_shape_model_choice(x, y)\r\n\r\n        source_shape_model_sheet = oplc.SourceShapeModelSheet(x, y, values)\r\n        source_shape = oplc.SourceShape(source_shape_model_sheet, self.sourceStep, self.sourceStep)\r\n\r\n        pupil_filter_model = oplc.PupilFilterModelEmpty()\r\n        imaging_tool = oplc.ImagingTool(source_shape, pupil_filter_model, self.wavelength, self.numericalAperture,\r\n                                        self.reductionRatio, self.flare, self.immersion)\r\n\r\n        diffraction = oplc.diffraction(imaging_tool, mask)\r\n\r\n        exposure = oplc.Exposure(self.focus, self.nominalDose, self.correctable)\r\n\r\n        optical_transfer_function = oplc.OpticalTransferFunction(imaging_tool, exposure, None)\r\n\r\n        aerial_image = oplc.aerial_image(diffraction, optical_transfer_function, self.maskStep)\r\n\r\n        plt.plot(aerial_image.x, aerial_image.values[0])\r\n        plt.show()\r\n        with open(\"results.txt\", 'w') as f:\r\n            for i in range(len(aerial_image.x)):\r\n                f.write('%f' % aerial_image.x[i])\r\n                f.write(\"\\t\")\r\n                f.write('%f' % aerial_image.values[0][i])\r\n                f.write(\"\\n\")\r\n\r\n\r\ndef main():\r\n    AerialImage()\r\n\r\n\r\nif __name__ == \"__main__\":\r\n    main()"
  },
  {
    "path": "OptolithiumC/examples/resist_images_and_contours.py",
    "content": "__author__ = 'OlaPsema'\r\n\r\nimport optolithiumc as oplc\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\n\r\n\r\ndef get_quasar_source_shape_model(x, y, sigma_in, sigma_out, blade_angle):\r\n    xv, yv = np.meshgrid(x, y)\r\n    if blade_angle <= 90.:\r\n        blade_angle = (90. + blade_angle) / 2.\r\n        cond3 = np.abs(yv) <= np.abs(np.tan(np.deg2rad(blade_angle)) * x)\r\n        cond4 = np.abs(xv) <= np.abs(np.tan(np.deg2rad(blade_angle)) * np.transpose(np.array([y])))\r\n    else:\r\n        cond3 = cond4 = 1\r\n    cond1 = ((xv - 0.) ** 2 + (yv - 0.) ** 2) <= sigma_out ** 2\r\n    cond2 = ((xv - 0.) ** 2 + (yv - 0.) ** 2) >= sigma_in ** 2\r\n    val = np.array(cond1 & cond2 & cond3 & cond4, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    val = np.asfortranarray(val / np.sum(val))\r\n    return val\r\n\r\n\r\ndef get_conventional_coherent_source_shape_model(step, x, y):\r\n    xv, yv = np.meshgrid(x, y)\r\n    val = np.array(((xv - 0.) ** 2 + (yv - 0.) ** 2) <= (step / 10.) ** 2, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    return np.asfortranarray(val)\r\n\r\n\r\ndef get_conventional_partially_coherent_source_shape_model(x, y, sigma):\r\n    xv, yv = np.meshgrid(x, y)\r\n    cond = ((xv - 0.) ** 2 + (yv - 0.) ** 2) <= sigma ** 2\r\n    val = np.array(cond, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    val = np.asfortranarray(val / np.sum(val))\r\n    return val\r\n\r\n\r\ndef get_annular_source_shape_model(x, y, sigma_in, sigma_out):\r\n    xv, yv = np.meshgrid(x, y)\r\n    cond1 = ((xv - 0.) ** 2 + (yv - 0.) ** 2) <= sigma_out ** 2\r\n    cond2 = ((xv - 0.) ** 2 + (yv - 0.) ** 2) >= sigma_in ** 2\r\n    val = np.array(cond1 & cond2, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    val = np.asfortranarray(val / np.sum(val))\r\n    return val\r\n\r\n\r\ndef get_dipole_source_shape_model(x, y, center_sigma, radius_sigma):\r\n    xv, yv = np.meshgrid(x, y)\r\n    cond1 = ((xv - center_sigma) ** 2 + (yv - 0.) ** 2) <= radius_sigma ** 2\r\n    cond2 = ((xv + center_sigma) ** 2 + (yv - 0.) ** 2) <= radius_sigma ** 2\r\n    val = np.array(cond1 | cond2, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    val = np.asfortranarray(val / np.sum(val))\r\n    return val\r\n\r\n\r\ndef get_monopole_source_shape_model(x, y, center_x, center_y, radius_sigma):\r\n    xv, yv = np.meshgrid(x, y)\r\n    cond1 = ((xv - center_x) ** 2 + (yv + center_y) ** 2) <= radius_sigma ** 2\r\n    val = np.array(cond1, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    val = np.asfortranarray(val / np.sum(val))\r\n    return val\r\n\r\n\r\ndef get_quadrupole_source_shape_model(x, y, center_sigma, radius_sigma, geometry_type):\r\n    xv, yv = np.meshgrid(x, y)\r\n    if geometry_type == 1:\r\n        center_sigma = center_sigma * np.sqrt(1. / 2.)\r\n        cond1 = ((xv - center_sigma) ** 2 + (yv - center_sigma) ** 2) <= radius_sigma ** 2\r\n        cond2 = ((xv - center_sigma) ** 2 + (yv + center_sigma) ** 2) <= radius_sigma ** 2\r\n        cond3 = ((xv + center_sigma) ** 2 + (yv - center_sigma) ** 2) <= radius_sigma ** 2\r\n        cond4 = ((xv + center_sigma) ** 2 + (yv + center_sigma) ** 2) <= radius_sigma ** 2\r\n    else:\r\n        cond1 = ((xv - center_sigma) ** 2 + (yv - 0.) ** 2) <= radius_sigma ** 2\r\n        cond2 = ((xv + center_sigma) ** 2 + (yv + 0.) ** 2) <= radius_sigma ** 2\r\n        cond3 = ((xv - 0.) ** 2 + (yv - center_sigma) ** 2) <= radius_sigma ** 2\r\n        cond4 = ((xv - 0.) ** 2 + (yv + center_sigma) ** 2) <= radius_sigma ** 2\r\n    val = np.array(cond1 | cond2 | cond3 | cond4, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    val = np.asfortranarray(val / np.sum(val))\r\n    return val\r\n\r\n\r\ndef get_shrinc_source_shape_model(x, y, sigma_out, stripe_width):\r\n    xv, yv = np.meshgrid(x, y)\r\n    cond1 = ((xv - 0.) ** 2 + (yv - 0.) ** 2) <= sigma_out ** 2\r\n    cond2 = np.abs(yv) >= stripe_width / 2.\r\n    cond3 = np.abs(xv) >= stripe_width / 2.\r\n    val = np.array(cond1 & cond2 & cond3, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    val = np.asfortranarray(val / np.sum(val))\r\n    return val\r\n\r\n\r\ndef get_square_source_shape_model(x, y, half_width_sigma):\r\n    xv, yv = np.meshgrid(x, y)\r\n    cond1 = np.abs(yv) <= half_width_sigma\r\n    cond2 = np.abs(xv) <= half_width_sigma\r\n    val = np.array(cond1 & cond2, dtype=float)\r\n    plt.imshow(val)\r\n    plt.show()\r\n    val = np.asfortranarray(val / np.sum(val))\r\n    return val\r\n\r\n\r\nclass ResistImagesAndContours(object):\r\n    def __init__(self):\r\n        self.featureWidth = 240.  # nm\r\n        self.pitch = 600.  # nm\r\n        self.featureTransmittance = 0.  # from 0. to 1.\r\n        self.maskTransmittance = 1.  # from 0. to 1.\r\n        self.featurePhase = 0.\r\n        self.maskPhase = 0.\r\n\r\n        self.wavelength = 365.0  # nanometers\r\n        self.numericalAperture = 0.9\r\n        self.reductionRatio = 1.0\r\n        self.flare = 0.\r\n        self.immersion = 0.\r\n        self.focus = 0.\r\n        self.nominalDose = 145  # mJ/cm^2\r\n        self.correctable = 0.5\r\n        self.resistThickness = 600.\r\n\r\n        self.stepZ = 5.\r\n        self.sourceStep = 0.05\r\n        self.maskStep = 5.\r\n\r\n        self.a = 0.  # exposure-dependent absorption of resist\r\n        self.b = 0.81  # exposure-independent absorption of resist\r\n        self.c = 0.008  # rate of absorption change or bleaching rate\r\n        self.n = 1.835  # refractive index (exposed and unexposed)\r\n\r\n        self.ea = 33.5  # PEB acid diffusivity activation energy\r\n        self.ln_ar = 45.  # PEB acid diffusivity Ln(Ar)\r\n\r\n        self.substrateRefractiveIndexReal = 6.49\r\n        self.substrateRefractiveIndexImage = 2.6\r\n        self.barcThickness = 172.\r\n        self.barcRefractiveIndexReal = 1.81\r\n        self.barcRefractiveIndexImage = 0.34\r\n        self.environmentRefractiveIndexReal = 1.\r\n        self.environmentRefractiveIndexImage = 0.\r\n\r\n        self.pac = np.linspace(0., 1., np.int(self.pitch / self.maskStep))\r\n        # relative inhibitor concentration = (inhibitor concentration)/(initial inhibitor concentration)\r\n        self.pn = 2\r\n        max_development_rate = 100  # nm/s\r\n        min_development_rate = 0.1  # nm/s\r\n        self.rate = max_development_rate * np.power((1 - self.pac), self.pn) + min_development_rate\r\n        # development rate\r\n        self.sourceShapeType = 3\r\n        # 1  - conventional coherent\r\n        # 3  - conventional partially coherent\r\n        # 4  - dipole\r\n        # 5  - monopole\r\n        # 6  - quadrupole\r\n        # 7  - quasar\r\n        # 8  - shrinc\r\n        # 9  - square\r\n        # 10 - annular\r\n        self.image_formation()\r\n\r\n    def source_shape_model_choice(self, x, y):\r\n        if self.sourceShapeType == 1:\r\n            return get_conventional_coherent_source_shape_model(self.sourceStep, x, y)\r\n        elif self.sourceShapeType == 3:\r\n            return get_conventional_partially_coherent_source_shape_model(x, y, sigma=0.9)\r\n        elif self.sourceShapeType == 4:\r\n            return get_dipole_source_shape_model(x, y, center_sigma=0.5, radius_sigma=0.3)\r\n        elif self.sourceShapeType == 5:\r\n            return get_monopole_source_shape_model(x, y, center_x=0.5, center_y=0.3, radius_sigma=0.2)\r\n        elif self.sourceShapeType == 6:\r\n            # types:\r\n            # 1 - Normal (90deg)\r\n            # 2 - Cross  (45deg)\r\n            return get_quadrupole_source_shape_model(x, y, center_sigma=0.5, radius_sigma=0.2, geometry_type=1)\r\n        elif self.sourceShapeType == 7:\r\n            return get_quasar_source_shape_model(x, y, sigma_in=0.4, sigma_out=0.8, blade_angle=60.)\r\n        elif self.sourceShapeType == 8:\r\n            return get_shrinc_source_shape_model(x, y, sigma_out=0.8, stripe_width=0.2)\r\n        elif self.sourceShapeType == 9:\r\n            return get_square_source_shape_model(x, y, half_width_sigma=0.5)\r\n        elif self.sourceShapeType == 10:\r\n            return get_annular_source_shape_model(x, y, sigma_in=0.4, sigma_out=0.8)\r\n        else:\r\n            raise ValueError(\"Wrong source shape id\")\r\n\r\n    def image_formation(self):\r\n        core_logging = oplc.OptolithiumCoreLog()\r\n        core_logging.set_verbose_level(0)\r\n\r\n        # feature formation\r\n        point1 = oplc.Point2d(-self.featureWidth / 2., 0.)\r\n        point2 = oplc.Point2d(self.featureWidth / 2., 0.)\r\n        points_array = oplc.Points2dArray((point1, point2))\r\n        region = oplc.Region(points_array, self.featureTransmittance, self.featurePhase)\r\n        region_array = (region, )\r\n\r\n        # repeatable part formation\r\n        point1 = oplc.Point2d(-self.pitch / 2., 0.)\r\n        point2 = oplc.Point2d(self.pitch / 2., 0.)\r\n        box = oplc.Box(point1, point2, self.maskTransmittance, self.maskPhase)\r\n\r\n        # mask formation\r\n        mask = oplc.Mask(region_array, box)\r\n\r\n        # source calculation\r\n        points_count = int(2 / self.sourceStep) + 1\r\n        nx, ny = (points_count, points_count)\r\n        x = np.linspace(-1, 1, nx)\r\n        y = np.linspace(-1, 1, ny)\r\n        x = np.round(x / self.sourceStep) * self.sourceStep\r\n        y = np.round(y / self.sourceStep) * self.sourceStep\r\n        values = self.source_shape_model_choice(x, y)\r\n\r\n        source_shape_model_sheet = oplc.SourceShapeModelSheet(x, y, values)\r\n        source_shape = oplc.SourceShape(source_shape_model_sheet, self.sourceStep, self.sourceStep)\r\n\r\n        pupil_filter_model = oplc.PupilFilterModelEmpty()\r\n        imaging_tool = oplc.ImagingTool(source_shape, pupil_filter_model, self.wavelength, self.numericalAperture,\r\n                                        self.reductionRatio, self.flare, self.immersion)\r\n\r\n        diffraction = oplc.diffraction(imaging_tool, mask)\r\n\r\n        exposure = oplc.Exposure(self.focus, self.nominalDose, self.correctable)\r\n\r\n        exposure_resist_model = oplc.ExposureResistModel(self.wavelength, self.a, self.b, self.c, self.n)\r\n\r\n        peb_resist_model = oplc.PebResistModel(self.ea, self.ln_ar)\r\n\r\n        rate_model = oplc.ResistRateModelSheet(self.pac, self.rate)\r\n\r\n        plt.plot(self.pac, self.rate)\r\n        plt.show()\r\n\r\n        # wafer stack formation\r\n        substrate_layer = oplc.ConstantWaferLayer(oplc.SUBSTRATE_LAYER, self.substrateRefractiveIndexReal,\r\n                                                  self.substrateRefractiveIndexImage)\r\n        resist_layer = oplc.ResistWaferLayer(self.resistThickness, exposure_resist_model, peb_resist_model, rate_model)\r\n        barc_layer = oplc.ConstantWaferLayer(oplc.MATERIAL_LAYER, self.barcThickness, self.barcRefractiveIndexReal,\r\n                                             self.barcRefractiveIndexImage)\r\n        environment_layer = oplc.ConstantWaferLayer(oplc.ENVIRONMENT_LAYER, self.environmentRefractiveIndexReal,\r\n                                                    self.environmentRefractiveIndexImage)\r\n\r\n        wafer_stack = oplc.WaferStack()\r\n        wafer_stack.push(substrate_layer)\r\n        wafer_stack.push(barc_layer)\r\n        wafer_stack.push(resist_layer)\r\n        wafer_stack.push(environment_layer)\r\n\r\n        optical_transfer_function = oplc.OpticalTransferFunction(imaging_tool, exposure, wafer_stack)\r\n\r\n        image_in_resist = oplc.image_in_resist(diffraction, optical_transfer_function, self.maskStep, self.stepZ)\r\n\r\n        fig, ax = plt.subplots(figsize=(6, 6))\r\n        tmp = np.rot90(image_in_resist.values[0])\r\n        with open(\"resultsImageInResist.txt\", 'w') as f:\r\n            for i in range(len(tmp)):\r\n                for j in range(len(tmp[i])):\r\n                    f.write('%f\\t' % tmp[i][j])\r\n                f.write(\"\\n\")\r\n        ax.imshow(tmp, interpolation='none', extent=[-self.pitch / 2, self.pitch / 2., 0, self.resistThickness])\r\n        ax.set_aspect(\"equal\")\r\n        plt.show()\r\n\r\n        latent_image = oplc.latent_image(image_in_resist, resist_layer, exposure)\r\n        fig, ax = plt.subplots(figsize=(6, 6))\r\n        tmp = np.rot90((latent_image.values[0]))\r\n        with open(\"resultsLatentImage.txt\", 'w') as f:\r\n            for i in range(len(tmp)):\r\n                for j in range(len(tmp[i])):\r\n                    f.write('%f\\t' % tmp[i][j])\r\n                f.write(\"\\n\")\r\n        ax.imshow(tmp, interpolation='none', extent=[-self.pitch / 2, self.pitch / 2., 0, self.resistThickness])\r\n        ax.set_aspect(\"equal\")\r\n        plt.show()\r\n\r\n        time_contours = oplc.develop_time_contours(latent_image, resist_layer)\r\n\r\n        tmp = np.rot90((time_contours.values[0]))\r\n        with open(\"resultsTimeContours.txt\", 'w') as f:\r\n            for i in range(len(tmp)):\r\n                for j in range(len(tmp[i])):\r\n                    f.write('%f\\t' % tmp[i][j])\r\n                f.write(\"\\n\")\r\n        fig, ax = plt.subplots(figsize=(6, 6))\r\n        ax.imshow(tmp, interpolation='none', extent=[-self.pitch / 2., self.pitch / 2., 0, self.resistThickness])\r\n        ax.set_aspect(\"equal\")\r\n        plt.show()\r\n\r\n\r\ndef main():\r\n    ResistImagesAndContours()\r\n\r\n\r\nif __name__ == \"__main__\":\r\n    main()"
  },
  {
    "path": "OptolithiumC/include/opl_capi.h",
    "content": "/*\r\n *\r\n * This file is part of Optolithium lithography modelling software.\r\n *\r\n * Copyright (C) 2015 Alexei Gladkikh\r\n *\r\n * This software is dual-licensed: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 2 of the License, or\r\n * (at your option) any later version only for NON-COMMERCIAL usage.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program; if not, write to the Free Software\r\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n *\r\n * If you are interested in other licensing models, including a commercial-\r\n * license, please contact the author at gladkikhalexei@gmail.com\r\n *\r\n */\r\n\r\n#ifndef OPTOLITHIUMC_HPP_\r\n#define OPTOLITHIUMC_HPP_\r\n\r\n#include <complex>\r\n#include <algorithm>\r\n\r\n#if !defined( SWIG )\r\n    // SWIG should not see #include <armadillo> as it can not handle it\r\n\t#include <armadillo>\r\n#endif\r\n\r\n#include \"opl_geometry.h\"\r\n#include \"opl_interp.h\"\r\n#include \"opl_contours.h\"\r\n#include \"opl_physc.h\"\r\n#include \"opl_misc.h\"\r\n#include \"optolithium.h\"\r\n\r\n\r\n#define OPTOLITHIUM_CORE_VERSION \"0.7a\"\r\n\r\n\r\nnamespace oplc {\r\n\r\n    using namespace geometry;\r\n\r\n    //using namespace std::literals::complex_literals;\r\n    const arma::cx_double j = arma::cx_double(0.0, 1.0);\r\n\r\n\r\n    inline arma::cx_double _etransmit(double transmit, double phase) {\r\n        return std::sqrt(transmit) * std::exp(j*phase*M_PI/180.0);\r\n    }\r\n\r\n\r\n    typedef enum {   // z y x\r\n          X_1D = 1,  // 0 0 1\r\n          Y_1D = 2,  // 0 1 0\r\n         XY_2D = 3,  // 0 1 1\r\n         XZ_2D = 5,  // 1 0 1\r\n         YZ_2D = 6,  // 1 1 0\r\n        XYZ_3D = 7,  // 1 1 1\r\n    } resist_volume_type_t;\r\n\r\n\r\n    typedef enum {\r\n        RESIST_VOLUME = 0,\r\n        RESIST_PROFILE = 1,\r\n    } resist_simulations_t;\r\n\r\n\r\n    class AbstractResistSimulations {\r\n    protected:\r\n        // Each coordinate values data\r\n        std::shared_ptr<arma::vec> _x;\r\n        std::shared_ptr<arma::vec> _y;\r\n        std::shared_ptr<arma::vec> _z;\r\n\r\n        double _stepx;\r\n        double _stepy;\r\n        double _stepz;\r\n    public:\r\n        virtual resist_simulations_t type(void) const = 0;\r\n        virtual ~AbstractResistSimulations(void) { }\r\n\r\n        std::shared_ptr<arma::vec> x(void) const;\r\n        std::shared_ptr<arma::vec> y(void) const;\r\n        std::shared_ptr<arma::vec> z(void) const;\r\n        \r\n        double x(uint32_t k) const;\r\n        double y(uint32_t k) const;\r\n        double z(uint32_t k) const;\r\n\r\n        bool has_x(void) const;\r\n        bool has_y(void) const;\r\n        bool has_z(void) const;\r\n\r\n        double stepx(void) const;\r\n        double stepy(void) const;\r\n        double stepz(void) const;\r\n\r\n        resist_volume_type_t axes(void) const;\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<AbstractResistSimulations> SharedAbstractResistSimulations;\r\n\r\n\r\n    class ResistVolume : public AbstractResistSimulations {\r\n    private:\r\n        // Values being calculated\r\n        std::shared_ptr<arma::cube> _values;\r\n\r\n        inline static double _calc_lateral_step(double mask_pitch, double desired_step) {\r\n            if (mask_pitch == 0.0 || desired_step == 0.0) {\r\n                return 0.0;\r\n            } else {\r\n                int32_t n = static_cast<int32_t>(ceil(mask_pitch/desired_step));\r\n                if (mask_pitch/static_cast<double>(n-1) > desired_step) {\r\n                    n += (n % 2) ? 2 : 1;\r\n                }\r\n                return mask_pitch/static_cast<double>(n-1);\r\n            }\r\n        }\r\n\r\n        inline static double _calc_normal_step(double thickness, double desired_step) {\r\n            if (thickness == 0.0 || desired_step == 0.0) {\r\n                return 0.0;\r\n            } else {\r\n                double tmp = thickness / desired_step;\r\n                if (tmp - round(tmp) != 0.0) {\r\n                    return thickness/ceil(tmp + 1);\r\n                } else {\r\n                    return desired_step;\r\n                }\r\n            }\r\n        }\r\n\r\n        // Offset required to make lateral counts odd\r\n        inline static uint32_t _get_count(double size, double step, uint32_t offset=0) {\r\n            if (size == 0.0 || step == 0.0) {\r\n                return 1;\r\n            } else {\r\n                return static_cast<uint32_t>(ceil(size/step)+offset);\r\n            }\r\n        }\r\n\r\n        inline static void _init_vector(arma::vec& vec, double start, double step) {\r\n            for (uint32_t k = 0; k < vec.n_elem; k++) {\r\n                vec(k) = k * step + start;\r\n            }\r\n        }\r\n    public:\r\n        // Cached input data\r\n        const RectangleGeometry boundary;\r\n        const double thickness;\r\n        const double desired_stepxy;\r\n        const double desired_stepz;\r\n\r\n        // Initialization for 2D/3D cases (e.g. Image in Resist, Latent Image, PAC, Development Rates)\r\n        ResistVolume(const RectangleGeometry& boundary, double thickness, double desired_stepxy, double desired_stepz);\r\n        // Initialization for 1D/2D cases (e.g. for AerialImage)\r\n        ResistVolume(const RectangleGeometry& boundary, double desired_step);\r\n        ResistVolume(const ResistVolume& other, bool copydata=false);\r\n        \r\n        std::shared_ptr<arma::cube> values(void) const;\r\n        double& value(uint32_t u, uint32_t v=0, uint32_t k=0) const;\r\n        resist_simulations_t type(void) const;\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<ResistVolume> SharedResistVolume;\r\n\r\n\r\n    class ResistProfile : public AbstractResistSimulations {\r\n    private:\r\n        ArrayOfSharedPolygons _polygons;\r\n    public:\r\n        ResistProfile(SharedResistVolume volume, double level);\r\n        ArrayOfSharedPolygons polygons(void) const;\r\n        resist_simulations_t type(void) const;\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<ResistProfile> SharedResistProfile;\r\n\r\n\r\n    class AbstractMaskGeometry : public virtual AbstractGeometry {\r\n    protected:\r\n        double _transmittance;\r\n        double _phase;\r\n    public:\r\n        AbstractMaskGeometry(double transmittance, double phase) : _transmittance(transmittance), _phase(phase) { }\r\n\r\n        double transmittance(void) const;\r\n        double phase(void) const;\r\n        bool is_mask(void) const;\r\n\r\n        // Effective transmittance of the region\r\n        arma::cx_double etransmit(void);\r\n\r\n        bool operator==(const AbstractGeometry& other) const;\r\n    };\r\n\r\n\r\n    class Region : public AbstractMaskGeometry, public PolygonGeometry {\r\n    public:\r\n        Region(const ArrayOfSharedPoints2d &points, double transmittance, double phase) :\r\n            AbstractMaskGeometry(transmittance, phase), PolygonGeometry(points) { }\r\n\r\n        Region(const Region& other) : AbstractMaskGeometry(other._transmittance, other._phase), PolygonGeometry(other) { }\r\n\r\n        bool operator==(const AbstractGeometry& other) const {\r\n            return AbstractMaskGeometry::operator ==(other) && PolygonGeometry::operator ==(other);\r\n        }\r\n    };\r\n\r\n\r\n    class Box : public AbstractMaskGeometry, public RectangleGeometry {\r\n    public:\r\n        Box(const Point2d& lb, const Point2d& rt, double transmittance, double phase) :\r\n            AbstractMaskGeometry(transmittance, phase), RectangleGeometry(lb, rt) { }\r\n\r\n        Box(ArrayOfSharedPoints2d points, double transmittance, double phase) :\r\n            Box(*points[0], *points[1], transmittance, phase) { }\r\n\r\n        Box(const Box& other) : Box(other.left_bottom(), other.right_top(), other._transmittance, other._phase) { }\r\n\r\n        bool operator==(const AbstractGeometry& other) const {\r\n            return AbstractMaskGeometry::operator ==(other) && RectangleGeometry::operator ==(other);\r\n        }\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<AbstractMaskGeometry> SharedAbstractMaskGeometry;\r\n    typedef std::vector<SharedAbstractMaskGeometry> ArrayOfSharedAbstractMaskGeometry;\r\n\r\n    typedef std::shared_ptr<Region> SharedRegion;\r\n    typedef std::shared_ptr<const Region> ConstSharedRegion;\r\n    typedef std::vector<SharedRegion> ArrayOfSharedRegions;\r\n    typedef std::shared_ptr<Box> SharedBox;\r\n    typedef std::shared_ptr<const Box> ConstSharedBox;\r\n\r\n\r\n    class Mask: public Iterable::Interface<SharedRegion> {\r\n    protected:\r\n        SharedBox _boundary;\r\n        ArrayOfSharedRegions _regions;\r\n        Sizes _sizes;\r\n\r\n        // Correct mask region according to diffraction calculation requirements\r\n        static SharedRegion _make_region(ConstSharedRegion region, const Point2d& center_offset);\r\n    public:\r\n        SharedRegion at(uint32_t index) const;\r\n        uint32_t length(void) const;\r\n\r\n        Mask(const ArrayOfSharedRegions& regions, SharedBox boundary);\r\n        Mask(const Mask& other);\r\n\r\n        SharedBox boundary(void) const;\r\n        Sizes pitch(void) const;\r\n        bool is_opaque(void) const;\r\n        bool is_clear(void) const;\r\n        bool is_bad(void) const;\r\n        bool is_1d(void) const;\r\n        bool operator==(const Mask& other) const;\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<Mask> SharedMask;\r\n\r\n\r\n    typedef enum {\r\n        PLUGIN_MODEL_TYPE = 0,\r\n        SHEET_MODEL_TYPE = 1,\r\n        EMPTY_MODEL_TYPE = 2\r\n    } common_model_type_t;\r\n\r\n\r\n    class AbstractSourceShapeModel {\r\n    public:\r\n        const common_model_type_t type;\r\n\r\n        AbstractSourceShapeModel(common_model_type_t type) : type(type) { }\r\n        virtual ~AbstractSourceShapeModel(void) { };\r\n        virtual double calculate(double sx, double sy) const = 0;\r\n        virtual bool operator==(const AbstractSourceShapeModel& other) const = 0;\r\n    };\r\n\r\n\r\n    class SourceShapeModelPlugin : public AbstractSourceShapeModel {\r\n    private:\r\n        const source_shape_expr_t _expression;\r\n        const std::vector<double> _args;\r\n        const void *_pargs;\r\n    public:\r\n        SourceShapeModelPlugin(source_shape_expr_t expression, std::vector<double> args);\r\n        double calculate(double sx, double sy) const;\r\n        bool operator==(const AbstractSourceShapeModel& other) const;\r\n    };\r\n\r\n\r\n    class SourceShapeModelSheet : public AbstractSourceShapeModel {\r\n    private:\r\n        const interp::LinearInterpolation2d _interp;\r\n    public:\r\n        // armanpy not support pass arrays by shared_ptr\r\n        SourceShapeModelSheet(const arma::vec& sx, const arma::vec& sy, const arma::mat& intensity);\r\n        double calculate(double sx, double sy) const;\r\n        bool operator==(const AbstractSourceShapeModel& other) const;\r\n    };\r\n\r\n\r\n    class AbstractResistRateModel {\r\n    public:\r\n        const common_model_type_t type;\r\n\r\n        AbstractResistRateModel(common_model_type_t type) : type(type) { }\r\n        virtual ~AbstractResistRateModel(void) { };\r\n        virtual double calculate(double pac, double depth=0.0) const = 0;\r\n        virtual bool operator==(const AbstractResistRateModel& other) const = 0;\r\n    };\r\n\r\n\r\n    class ResistRateModelExpression : public AbstractResistRateModel {\r\n    private:\r\n        const rate_model_expr_t _expression;\r\n        const std::vector<double> _args;\r\n        const void *_pargs;\r\n    public:\r\n        ResistRateModelExpression(rate_model_expr_t expression, std::vector<double> args);\r\n        double calculate(double pac, double depth=0.0) const;\r\n        bool operator==(const AbstractResistRateModel& other) const;\r\n    };\r\n\r\n\r\n    class ResistRateModelDepthSheet : public AbstractResistRateModel {\r\n    private:\r\n        const interp::LinearInterpolation2d _interp;\r\n    public:\r\n    //\tarmanpy not support pass arrays by shared_ptr\r\n        ResistRateModelDepthSheet(const arma::vec& pac, const arma::vec& depth, const arma::mat& rate);\r\n        double calculate(double pac, double depth=0.0) const;\r\n        bool operator==(const AbstractResistRateModel& other) const;\r\n    };\r\n\r\n\r\n    class ResistRateModelSheet : public AbstractResistRateModel {\r\n    private:\r\n        const interp::LinearInterpolation1d _interp;\r\n    public:\r\n    //\tarmanpy not support pass arrays by shared_ptr\r\n        ResistRateModelSheet(const arma::vec& pac, const arma::vec& rate);\r\n        double calculate(double pac, double depth=0.0) const;\r\n        bool operator==(const AbstractResistRateModel& other) const;\r\n    };\r\n\r\n\r\n    class AbstractPupilFilterModel {\r\n    public:\r\n        const common_model_type_t type;\r\n\r\n        AbstractPupilFilterModel(common_model_type_t type) : type(type) { }\r\n        virtual ~AbstractPupilFilterModel(void) { };\r\n        virtual arma::cx_double calculate(double sx, double sy) const = 0;\r\n        virtual bool operator==(const AbstractPupilFilterModel& other) const = 0;\r\n    };\r\n\r\n\r\n    class PupilFilterModelPlugin : public AbstractPupilFilterModel {\r\n    private:\r\n        const pupil_filter_expr_t _expression;\r\n        const std::vector<double> _args;\r\n        const void *_pargs;\r\n    public:\r\n        PupilFilterModelPlugin(pupil_filter_expr_t expression, std::vector<double> args);\r\n        arma::cx_double calculate(double sx, double sy) const;\r\n        bool operator==(const AbstractPupilFilterModel& other) const;\r\n    };\r\n\r\n\r\n    class PupilFilterModelSheet : public AbstractPupilFilterModel {\r\n    private:\r\n        interp::LinearInterpolation2d _interp_real;\r\n        interp::LinearInterpolation2d _interp_imag;\r\n    public:\r\n        // armanpy not support pass arrays by shared_ptr\r\n        PupilFilterModelSheet(const arma::vec& sx, const arma::vec& sy, const arma::cx_mat& coef);\r\n        arma::cx_double calculate(double sx, double sy) const;\r\n        bool operator==(const AbstractPupilFilterModel& other) const;\r\n    };\r\n\r\n\r\n    class PupilFilterModelEmpty : public AbstractPupilFilterModel {\r\n    public:\r\n        PupilFilterModelEmpty(void);\r\n        arma::cx_double calculate(double sx, double sy) const;\r\n        bool operator==(const AbstractPupilFilterModel& other) const;\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<AbstractResistRateModel> SharedAbstractResistRateModel;\r\n    typedef std::shared_ptr<const AbstractResistRateModel> ConstSharedAbstractResistRateModel;\r\n    typedef std::shared_ptr<ResistRateModelExpression> SharedResistRateModelExpression;\r\n    typedef std::shared_ptr<ResistRateModelSheet> SharedResistRateModelSheet;\r\n\r\n    typedef std::shared_ptr<AbstractSourceShapeModel> SharedAbstractSourceShapeModel;\r\n    typedef std::shared_ptr<const AbstractSourceShapeModel> ConstSharedAbstractSourceShapeModel;\r\n    typedef std::shared_ptr<SourceShapeModelPlugin> SharedSourceShapePlugin;\r\n    typedef std::shared_ptr<SourceShapeModelSheet> SharedSourceShapeSheet;\r\n\r\n    typedef std::shared_ptr<AbstractPupilFilterModel> SharedAbstractPupilFilterModel;\r\n    typedef std::shared_ptr<const AbstractPupilFilterModel> ConstSharedAbstractPupilFilterModel;\r\n    typedef std::shared_ptr<PupilFilterModelPlugin> SharedPupilFilterPlugin;\r\n    typedef std::shared_ptr<PupilFilterModelSheet> SharedPupilFilterSheet;\r\n\r\n\r\n    class SourceShape {\r\n    private:\r\n        // Direction cosine limit in any direction for the source shape\r\n        static constexpr double _clim = 1.0;\r\n\r\n        // Simulation's model of the source shape either function or data grid\r\n        SharedAbstractSourceShapeModel _model;\r\n\r\n        // Simulation's step by x and y axis\r\n        double _stepx;\r\n        double _stepy;\r\n\r\n        std::shared_ptr<arma::mat> _values;\r\n\r\n        std::shared_ptr<arma::s32_vec> _kx;\r\n        std::shared_ptr<arma::s32_vec> _ky;\r\n\r\n        std::shared_ptr<arma::vec> _cx;\r\n        std::shared_ptr<arma::vec> _cy;\r\n\r\n        // Non-zeros item's indexes\r\n        std::shared_ptr<arma::umat> _non_zeros;\r\n\r\n        // Non-zeros limits of the source shape\r\n        double _sx_min;\r\n        double _sx_max;\r\n        double _sy_min;\r\n        double _sy_max;\r\n\r\n        static void _init_vectors(std::shared_ptr<arma::s32_vec> &k, std::shared_ptr<arma::vec> &dcos, double step);\r\n        static std::shared_ptr<arma::mat> _init_values(\r\n                const arma::vec &cx, const arma::vec &cy, SharedAbstractSourceShapeModel model);\r\n                \r\n        static std::shared_ptr<arma::umat> _get_non_zeros_indexes(const arma::mat &values);\r\n\r\n        static void _get_limits(double &sx_min, double &sx_max, double &sy_min, double &sy_max,\r\n                std::shared_ptr<arma::umat> non_zeros, std::shared_ptr<arma::vec> cx, std::shared_ptr<arma::vec> cy);\r\n    public:\r\n        SourceShape(SharedAbstractSourceShapeModel model, double stepx, double stepy);\r\n        \r\n        std::shared_ptr<arma::mat> values(void) const;\r\n        \r\n        double value(uint32_t r, uint32_t c) const;\r\n        \r\n        double cx(uint32_t i) const;\r\n        double cy(uint32_t i) const;\r\n        \r\n        std::shared_ptr<arma::vec> cx(void) const;\r\n        std::shared_ptr<arma::vec> cy(void) const;\r\n        \r\n        std::shared_ptr<arma::umat> non_zeros(void) const;\r\n        \r\n        double sx_min(void) const;\r\n        double sx_max(void) const;\r\n        double sy_min(void) const;\r\n        double sy_max(void) const;\r\n        \r\n        bool operator==(const SourceShape& other) const;\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<SourceShape> SharedSourceShape;\r\n    typedef std::shared_ptr<const SourceShape> ConstSharedSourceShape;\r\n\r\n\r\n    class ImagingTool {\r\n    private:\r\n        SharedSourceShape _source_shape;\r\n        SharedAbstractPupilFilterModel _pupil_filter_model;\r\n        double _reduction_ratio;\r\n        double _squared_reduction_ratio;\r\n        double _flare;\r\n        double _immersion;\r\n    public:\r\n        const double wavelength;\r\n        const double numeric_aperture;\r\n\r\n        ImagingTool(SharedSourceShape source_shape, SharedAbstractPupilFilterModel pupil_filter_model, \r\n                    double wavelength, double numeric_aperture, double reduction_ratio, double flare, double immersion);\r\n        SharedSourceShape source_shape(void) const;\r\n        arma::cx_double filter(double cx, double cy) const;\r\n        double reduction(double cx, double cy, arma::cx_double environment_refraction=physc::air_nk) const;\r\n        void flare(SharedResistVolume intensity) const;\r\n        bool operator==(const ImagingTool& other) const;\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<ImagingTool> SharedImagingTool;\r\n    typedef std::shared_ptr<const ImagingTool> ConstSharedImagingTool;\r\n\r\n\r\n    class Exposure {\r\n    public:\r\n        const double focus;\r\n        const double nominal_dose;\r\n        const double correctable;\r\n\r\n        Exposure(double focus, double nominal_dose, double correctable);\r\n        arma::cx_double defocus(double cx, double cy, double wvl) const;\r\n        double dose(void) const;\r\n        bool operator==(const Exposure& other) const;\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<Exposure> SharedExposure;\r\n    typedef std::shared_ptr<const Exposure> ConstSharedExposure;\r\n\r\n\r\n    inline bool within_circle(double dx, double dy, double r) {\r\n        double adx = std::abs(dx);\r\n        double ady = std::abs(dy);\r\n        if (adx + ady <= r) {\r\n            return true;\r\n        } else if (adx > r || ady > r) {\r\n            return false;\r\n        } else if (adx*adx + ady*ady <= r*r) {\r\n            return true;\r\n        } else {\r\n            return false;\r\n        }\r\n    }\r\n\r\n\r\n    inline bool within_circle(double x, double y, double cx, double cy, double r) {\r\n        return within_circle(x - cx, y - cy, r);\r\n    }\r\n\r\n\r\n    class Diffraction {\r\n    private:\r\n        // Diffraction orders values\r\n        std::shared_ptr<arma::cx_mat> _values;\r\n\r\n        // Diffraction orders spatial frequencies arrays\r\n        std::shared_ptr<arma::vec> _frqx;\r\n        std::shared_ptr<arma::vec> _frqy;\r\n\r\n        // Diffraction orders indexes\r\n        std::shared_ptr<arma::s32_vec> _kx;\r\n        std::shared_ptr<arma::s32_vec> _ky;\r\n\r\n        // Direction cosines matrix and vectors\r\n        std::shared_ptr<arma::mat> _cxy;\r\n        std::shared_ptr<arma::vec> _cx;\r\n        std::shared_ptr<arma::vec> _cy;\r\n\r\n        inline static void _init_vectors(arma::s32_vec& k, arma::vec& frq, arma::vec& dcos,\r\n                double pitch, double wavelength, std::pair<int32_t, int32_t> limits) {\r\n            if (pitch == 0.0) {\r\n                k(0) = 0;\r\n                frq(0) = 0.0;\r\n                dcos(0) = 0.0;\r\n            } else {\r\n                int32_t k_min = limits.first;\r\n                // int32_t k_max = limits.second;\r\n                // int32_t median = static_cast<int32_t>(round(static_cast<double>(k_max - k_min)/2.0));\r\n                // VLOG(4) << \"k_min = \" << k_min << \" k_max = \" << k_max << \" median = \" << median;\r\n                for (uint32_t i = 0; i < k.n_elem; i++) {\r\n                    k(i) = k_min + i;\r\n                    frq(i) = k(i) / pitch;\r\n                    dcos(i) = frq(i) * wavelength;\r\n                }\r\n            }\r\n        }\r\n\r\n        inline static void _init_cosines(arma::mat& cxy, arma::vec& cx, arma::vec& cy) {\r\n            for (uint32_t c = 0; c < cx.n_elem; c++) {\r\n                for (uint32_t r = 0; r < cy.n_elem; r++) {\r\n                    cxy(r, c) = sqrt(cx(c)*cx(c) + cy(r)*cy(r));\r\n                }\r\n            }\r\n        }\r\n\r\n        // Calculate total size of the diffraction array taking account source shape tilt\r\n        // median - center point of the diffraction pattern belong axis\r\n        // na - numeric aperture\r\n        // wvl - wavelength\r\n        // pitch - mask pitch for specified direction\r\n        // cs_min/cx_max - minimum/maximum value of direction cosine in source shape\r\n        //                 coordinate system where intensity is not zero\r\n        inline static std::pair<int32_t, int32_t> _calc_size(\r\n                double na, double wvl, double pitch, double cs_min, double cs_max) {\r\n            if (cs_min > cs_max) {\r\n                std::ostringstream error_msg;\r\n                error_msg << \"Maximum direction cosine of source shape must be greater than minimum value: \"\r\n                        << \"Max = \" << cs_max << \" Min = \" << cs_min;\r\n                throw std::invalid_argument(error_msg.str());\r\n            }\r\n            int32_t k_min = static_cast<int32_t>(-floor(na*(1.0-cs_min)/wvl*pitch));\r\n            int32_t k_max = static_cast<int32_t>(floor(na*(1.0+cs_max)/wvl*pitch));\r\n            return std::pair<int32_t, int32_t>(k_min, k_max);\r\n        }\r\n\r\n        template <typename T>\r\n        inline static std::shared_ptr<T> _select_axis(uint32_t axis, std::shared_ptr<T> x, std::shared_ptr<T> y) {\r\n            if (axis == DIM_1D_X) {\r\n                return x;\r\n            } else if (axis == DIM_1D_Y) {\r\n                return y;\r\n            } else {\r\n                throw std::runtime_error(\"Can't get using axis from non-1D storage\");\r\n            }\r\n        }\r\n\r\n        void _add_1d_region(SharedAbstractMaskGeometry region, arma::cx_double factor);\r\n        static arma::cx_double _calc_2d_region(SharedAbstractMaskGeometry region,\r\n                int32_t kx, int32_t ky, double frqx, double frqy);\r\n        void _add_2d_region(SharedAbstractMaskGeometry region, arma::cx_double factor);\r\n\r\n    public:\r\n        // Corresponding source shape data\r\n        ConstSharedSourceShape source_shape;\r\n\r\n        // Corresponding mask pitch (it's hard linked with spatial frequencies step = 1/pitch)\r\n        const Sizes pitch;\r\n        const Box boundary;\r\n\r\n        // Required to pass diffraction points over the objective lens at the corners\r\n        const double numeric_aperture;\r\n        const double wavelength;\r\n\r\n\r\n        Diffraction(SharedMask mask, SharedImagingTool imaging_tool);\r\n\r\n        // Return direction cosines for given axis\r\n        std::shared_ptr<arma::vec> c(uint32_t axis) const;\r\n        // Return diffraction terms order number for given axis\r\n        std::shared_ptr<arma::s32_vec> k(uint32_t axis) const;\r\n        // Return spatial frequencies for given axis\r\n        std::shared_ptr<arma::vec> frq(uint32_t axis) const;\r\n        // Return plane waves of diffraction pattern values\r\n        std::shared_ptr<arma::cx_mat> values(void) const;\r\n        arma::cx_double value(uint32_t r, uint32_t c) const;\r\n        \r\n        // Return absolute value of direction cosines\r\n        std::shared_ptr<arma::mat> cxy(void) const;\r\n        // Return direction cosine belong to x-axis\r\n        std::shared_ptr<arma::vec> cx(void) const;\r\n        double cx(uint32_t i) const;\r\n        \r\n        // Return direction cosine belong to y-axis\r\n        std::shared_ptr<arma::vec> cy(void) const;\r\n        double cy(uint32_t i) const;\r\n\r\n        // Return spatial frequencies belong to x-axis\r\n        std::shared_ptr<arma::vec> frqx(void) const;\r\n        // Return spatial frequencies belong to y-axis\r\n        std::shared_ptr<arma::vec> frqy(void) const;\r\n        // Return diffraction terms order numbers belong x-axis\r\n        std::shared_ptr<arma::s32_vec> kx(void) const;\r\n        int32_t kx(uint32_t i) const;\r\n\r\n        // Return diffraction terms order numbers belong y-axis\r\n        std::shared_ptr<arma::s32_vec> ky(void) const;\r\n        int32_t ky(uint32_t i) const;\r\n\r\n        void add_region(SharedAbstractMaskGeometry region, arma::cx_double factor);\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<Diffraction> SharedDiffraction;\r\n    typedef std::shared_ptr<const Diffraction> ConstSharedDiffraction;\r\n\r\n\r\n    typedef enum {\r\n        ENVIRONMENT_LAYER = 0,\r\n        RESIST_LAYER = 1,\r\n        MATERIAL_LAYER = 2,\r\n        SUBSTRATE_LAYER = 3\r\n    } layer_type_t;\r\n\r\n\r\n    class AbstractWaferLayer {\r\n    public:\r\n        const layer_type_t type;\r\n        const double thickness;\r\n\r\n        AbstractWaferLayer(layer_type_t layer_type, double thickness) : type(layer_type), thickness(thickness) { }\r\n\r\n        virtual ~AbstractWaferLayer(void) { };\r\n        // 0 < m < 1 - for resist layer current PAC value, for others layer should be ignored\r\n        virtual arma::cx_double refraction(double wavelength, double m=1.0) const = 0;\r\n\r\n        bool is_environment(void) const;\r\n        bool is_resist(void) const;\r\n        bool is_material(void) const;\r\n        bool is_substrate(void) const;\r\n        \r\n        arma::cx_double effective_refraction(arma::cx_double incident_angle, double wavelength) const;\r\n\r\n        // WARNING: valid only for zero order\r\n        arma::cx_double internal_transmit(double wavelength, double power=1.0) const;\r\n        \r\n        // Can be used for others d.ords\r\n        arma::cx_double internal_transmit(arma::cx_double incident_angle, double dz, double wavelength) const;\r\n\r\n        std::string str(void) const;\r\n\r\n        virtual bool operator==(const AbstractWaferLayer& other) const = 0;\r\n    };\r\n\r\n\r\n    class StandardWaferLayer : public AbstractWaferLayer {\r\n    private:\r\n        interp::LinearInterpolation1d _refraction_real;\r\n        interp::LinearInterpolation1d _refraction_imag;\r\n    public:\r\n        StandardWaferLayer(layer_type_t layer_type, double thickness, const arma::vec& wavelength,\r\n                const arma::vec& refraction_real, const arma::vec& refraction_imag);\r\n                    \r\n        StandardWaferLayer(layer_type_t layer_type, const arma::vec& wavelength,\r\n                const arma::vec& refraction_real, const arma::vec& refraction_imag) :\r\n                StandardWaferLayer(layer_type, NAN, wavelength, refraction_real, refraction_imag) { };\r\n\r\n        arma::cx_double refraction(double wavelength, double m=1.0) const;\r\n        bool operator==(const AbstractWaferLayer& other) const;\r\n    };\r\n\r\n\r\n    class ConstantWaferLayer : public AbstractWaferLayer {\r\n    private:\r\n        arma::cx_double _refraction;\r\n    public:\r\n        ConstantWaferLayer(layer_type_t layer_type, double thickness, double real, double imag);\r\n        \r\n        ConstantWaferLayer(layer_type_t layer_type, double real, double imag) :\r\n            ConstantWaferLayer(layer_type, NAN, real, imag) { }\r\n\r\n        arma::cx_double refraction(double wavelength=0.0, double m=1.0) const;\r\n        bool operator==(const AbstractWaferLayer& other) const;\r\n    };\r\n\r\n\r\n    class ExposureResistModel {\r\n    public:\r\n        const double wavelength;\r\n        // Dill model constants\r\n        const double a;\r\n        const double b;\r\n        const double c;\r\n        // Real refractive index\r\n        const double n;\r\n\r\n        ExposureResistModel(double wavelength, double a, double b, double c, double n) :\r\n            wavelength(wavelength), a(a), b(b), c(c), n(n) { }\r\n\r\n        arma::cx_double refraction(double m=1.0) const;\r\n        bool operator==(const ExposureResistModel& other) const;\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<ExposureResistModel> SharedExposureResistModel;\r\n    typedef std::shared_ptr<const ExposureResistModel> ConstSharedExposureResistModel;\r\n\r\n\r\n    class PostExposureBake {\r\n    public:\r\n        const double time;\r\n        const double temp;\r\n        PostExposureBake(double time, double temp) : time(time), temp(temp) { }\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<PostExposureBake> SharedPostExposureBake;\r\n    typedef std::shared_ptr<const PostExposureBake> ConstSharedPostExposureBake;\r\n\r\n\r\n    class PebResistModel {\r\n    public:\r\n        const double ea;\r\n        const double ln_ar;\r\n\r\n        PebResistModel(double ea, double ln_ar) : ea(ea), ln_ar(ln_ar) { }\r\n\r\n        double diffusivity(double temp) const;\r\n        double diffusion_length(double temp, double time) const;\r\n        arma::vec kernel(SharedPostExposureBake peb, double step) const;\r\n        bool operator==(const PebResistModel& other) const;\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<PebResistModel> SharedPebResistModel;\r\n    typedef std::shared_ptr<const PebResistModel> ConstSharedPebResistModel;\r\n\r\n\r\n    class ResistWaferLayer : public AbstractWaferLayer {\r\n    public:\r\n        const ConstSharedExposureResistModel exposure;\r\n        const ConstSharedPebResistModel peb;\r\n        const ConstSharedAbstractResistRateModel rate;\r\n\r\n        ResistWaferLayer(double thickness, SharedExposureResistModel exposure_model,\r\n                SharedPebResistModel peb_model, SharedAbstractResistRateModel rate_model) :\r\n                AbstractWaferLayer(RESIST_LAYER, thickness),\r\n                exposure(exposure_model), peb(peb_model), rate(rate_model) { }\r\n\r\n        arma::cx_double refraction(double wavelength, double m=1.0) const;\r\n        bool operator==(const AbstractWaferLayer& other) const;\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<AbstractWaferLayer> SharedAbstractWaferLayer;\r\n    typedef std::shared_ptr<StandardWaferLayer> SharedStandardWaferLayer;\r\n    typedef std::shared_ptr<ResistWaferLayer> SharedResistWaferLayer;\r\n    typedef std::shared_ptr<ConstantWaferLayer> SharedConstantWaferLayer;\r\n    typedef std::vector<SharedAbstractWaferLayer> ArrayOfSharedAbstractWaferLayers;\r\n\r\n\r\n    class WaferStack {\r\n    private:\r\n        ArrayOfSharedAbstractWaferLayers _layers;\r\n        SharedAbstractWaferLayer _resist;\r\n        SharedAbstractWaferLayer _substrate;\r\n        SharedAbstractWaferLayer _environment;\r\n\r\n        std::map<std::pair<double, double>, std::shared_ptr<arma::cx_vec>> _cached_top_reflections;\r\n        std::map<std::pair<double, double>, std::shared_ptr<arma::cx_vec>> _cached_bottom_reflections;\r\n        double _cached_wavelength;\r\n\r\n        static inline arma::cx_double _angle(arma::cx_double incident_angle,\r\n                arma::cx_double top_refraction, arma::cx_double bottom_refraction) {\r\n            return std::asin(top_refraction / bottom_refraction * std::sin(incident_angle));\r\n        }\r\n\r\n        static inline arma::cx_double _reflection(arma::cx_double top_refraction, arma::cx_double bottom_refraction) {\r\n            return (top_refraction - bottom_refraction) / (top_refraction + bottom_refraction);\r\n        }\r\n\r\n        static inline arma::cx_double _transmittance(arma::cx_double top_refraction, arma::cx_double bottom_refraction) {\r\n            return 2.0 * top_refraction / (top_refraction + bottom_refraction);\r\n        }\r\n\r\n        // Calculate refractive indexes between layers (for all layers in the stack)\r\n        arma::cx_vec _calc_refractive_indexes(double cxy, double wavelength);\r\n\r\n        // Calculate effective reflection for all stack from top to bottom\r\n        // (reflection with taking account of all top layers)\r\n        std::shared_ptr<arma::cx_vec> _calc_effective_top_reflections(double cxy, double wavelength);\r\n\r\n        // Return cached value or calculate\r\n        std::shared_ptr<arma::cx_vec> effective_top_reflection(double cx, double cy, double wavelength);\r\n\r\n        // Calculate effective reflection for all stack from bottom to top\r\n        // (reflection with taking account of all bottom layers)\r\n        std::shared_ptr<arma::cx_vec> _calc_effective_bottom_reflections(double cxy, double wavelength);\r\n\r\n        // Return cached value or calculate\r\n        std::shared_ptr<arma::cx_vec> effective_bottom_reflection(double cx, double cy, double wavelength);\r\n\r\n    public:\r\n        WaferStack(void);\r\n        WaferStack(ArrayOfSharedAbstractWaferLayers layers);\r\n\r\n        void push(SharedAbstractWaferLayer layer);\r\n\r\n        bool is_ok(void);\r\n\r\n        SharedAbstractWaferLayer operator[](int32_t i) const;\r\n        SharedAbstractWaferLayer environment(void) const;\r\n        SharedAbstractWaferLayer resist(void) const;\r\n        SharedAbstractWaferLayer substrate(void) const;\r\n        uint32_t index_of(SharedAbstractWaferLayer layer) const;\r\n        std::complex<double> reflectivity(uint32_t indx, double wavelength);\r\n\r\n        // This routine only suitable for the stack where resist is the SECOND layer!\r\n        std::complex<double> standing_waves(double cx, double cy, double dz, double wavelength);\r\n\r\n        bool operator==(const WaferStack& other) const;\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<WaferStack> SharedWaferStack;\r\n    typedef std::shared_ptr<const WaferStack> ConstSharedWaferStack;\r\n\r\n\r\n    class Development {\r\n    public:\r\n        const double time;\r\n        Development(double time) : time(time) { }\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<Development> SharedDevelopment;\r\n    typedef std::shared_ptr<const Development> ConstSharedDevelopment;\r\n\r\n\r\n    class OpticalTransferFunction {\r\n    private:\r\n        ConstSharedImagingTool _imaging_tool;\r\n        ConstSharedExposure _exposure;\r\n\r\n        // This object is not constant because when calculating it change it internal precalculated values\r\n        SharedWaferStack _wafer_stack;\r\n\r\n        const double _wavelength;\r\n        const double _numeric_aperture;\r\n\r\n    //\tstd::map<std::pair<double, double>, arma::cx_double> _cached_data;\r\n    public:\r\n        OpticalTransferFunction(SharedImagingTool imaging_tool, \r\n            SharedExposure exposure=nullptr, SharedWaferStack wafer_stack=nullptr) :\r\n            _imaging_tool(imaging_tool), _exposure(exposure), _wafer_stack(wafer_stack),\r\n            _wavelength(imaging_tool->wavelength), _numeric_aperture(imaging_tool->numeric_aperture) { }\r\n\r\n        // Calculate optical transfer function value for given direction cosines values cx, cy\r\n        // and given offset from the resist top dz.\r\n        arma::cx_double calc(double cx, double cy, double dz=0.0);\r\n\r\n        ConstSharedImagingTool imaging_tool(void) const;\r\n        ConstSharedExposure exposure(void) const;\r\n        ConstSharedWaferStack wafer_stack(void) const;\r\n    };\r\n\r\n\r\n    typedef std::shared_ptr<OpticalTransferFunction> SharedOpticalTransferFunction;\r\n\r\n\r\n    // WARNING: !!! REQUIRED OTHERWISE SWIG NOT INCLUDE ARMANPY.I !!!\r\n    class  Example\r\n    {\r\n    private:\r\n        arma::imat m;\r\n    public:\r\n        Example(int rows, int cols) {\r\n            m = arma::randi(rows, cols, arma::distr_param(0, 100));\r\n        };\r\n\r\n        arma::imat get(void) {\r\n            return m;\r\n        };\r\n\r\n        // THIS METHOD MUST EXISTS\r\n        void set(const arma::imat& m) {\r\n            this->m = m;\r\n        };\r\n\r\n        void set(int v, int r, int c) {\r\n            this->m(r, c) = v;\r\n        }\r\n\r\n        void rnd(unsigned s) {\r\n            this->m.randn(s,s);\r\n        };\r\n\r\n        std::shared_ptr<arma::imat> get_sptr(void) {\r\n            std::shared_ptr<arma::imat> p(new arma::imat(m));\r\n            return p;\r\n        };\r\n\r\n        void modify(arma::imat& A, unsigned rows, unsigned cols) {\r\n            A.resize( rows, cols );\r\n            A.randn( rows, cols );\r\n            for( unsigned r = 0; r < rows; r++) {\r\n                for( unsigned c = 0; c < cols; c++) {\r\n                    A(r, c) = 10.0*r+c;\r\n                }\r\n            }\r\n        };\r\n\r\n        arma::imat reshape(int rows, int cols) const {\r\n            return arma::reshape(this->m, rows, cols);\r\n        }\r\n\r\n        arma::imat rot90(void) const {\r\n            return misc::rot90(this->m);\r\n        }\r\n    };\r\n\r\n}  // namespace oplc\r\n\r\n#endif /* OPTOLITHIUMC_HPP_ */\r\n"
  },
  {
    "path": "OptolithiumC/include/opl_contours.h",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for non-commercial usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#ifndef OPL_CONTOURS_H_\n#define OPL_CONTOURS_H_\n\n\n#if !defined( SWIG )\n    // SWIG should not see #include <armadillo> as it can not handle it\n\t#include <armadillo>\n#endif\n\n#include \"opl_log.h\"\n#include \"opl_geometry.h\"\n#include \"opl_interp.h\"\n\nnamespace contours {\n\n\tusing namespace geometry;\n\n\ttypedef std::shared_ptr<ArrayOfSharedPoints2d> SharedArrayOfSharedPoints;\n\n\tclass _ContourEngine {\n\tprivate:\n\t\ttypedef arma::Mat<char> CharMat;\n\n\t\tstd::shared_ptr<const arma::vec> _x;\n\t\tstd::shared_ptr<const arma::vec> _y;\n\t\tstd::shared_ptr<const arma::mat> _values;\n\n\t\tCharMat _marks;\n\t\tstd::list<SharedArrayOfSharedPoints> _contours_list;\n\t\tArrayOfSharedPolygons _polygons;\n\n\t\tvoid _mark_facets(double lvl, int32_t sign);\n\t\tvoid _drawcn(double lvl, int32_t r, int32_t c, Point2d ct, uint8_t start_edge, bool first);\n\t\tvoid _calculate_level_lines(double level);\n\t\tvoid _erase_contour(SharedArrayOfSharedPoints contour);\n\t\tvoid _extract_polygons(void);\n\tpublic:\n\t\t_ContourEngine(const arma::vec& x, const arma::vec& y,\n\t\t\t\tconst arma::mat& values, double level, bool negative=false);\n\t\tArrayOfSharedPolygons polygons(void) const;\n\t};\n\n\tclass _SurfaceCell;\n\n\tclass _SurfaceEngine {\n\tprivate:\n\t\tfriend class _SurfaceCell;\n\n\t\tconst arma::vec& _x;\n\t\tconst arma::vec& _y;\n\t\tconst arma::vec& _z;\n\t\tconst arma::cube& _values;\n\n\t\tconst double _level;\n\n\t\tconst int32_t _negative;\n\n\t\tArrayOfSharedTriangles3d _triangles;\n\t\tArrayOfSharedPoints3d _verteces;\n\n\t\t// Lookup tables used in the construction of the isosurface.\n\t\tstatic const uint32_t edgeTable[256];\n\t\tstatic const int32_t triTable[256][16];\n\n\t\tstatic const uint32_t indexes_p[12];\n\t\tstatic const uint32_t indexes_q[12];\n\n\t\t// Calculate table lookup index from those vertices which are below the isolevel.\n\t\tstatic uint32_t _calculate_table_index(const _SurfaceCell& cell, double level, int32_t negative);\n\t\tstatic ArrayOfSharedPoints3d _calculate_vertices(const _SurfaceCell& cell, uint32_t edge_code, double level);\n\n\t\tvoid _process_verteces(ArrayOfSharedPoints3d verteces, const int32_t tri_codes[]);\n\n\t\tstatic inline Point3d _linear_interp3d(double lvl,\n\t\t\t\tconst Point3d& p, const Point3d& q, double v1, double v2) {\n\t\t\tdouble k = (lvl - v1) / (v2 - v1);\n\t\t\treturn p + k * (q - p);\n\t\t}\n\tpublic:\n\t\t_SurfaceEngine(const arma::vec& x, const arma::vec& y, const arma::vec& z,\n\t\t\t\tconst arma::cube& values, const double level, const int32_t negative);\n\t\tSharedSurface3d surface(void) const;\n\t};\n\n\tclass _SurfaceCell {\n\tpublic:\n\t\tstd::vector<Point3d> points;\n\t\tstd::vector<double> values;\n\n\t\tinline void _get_level(const _SurfaceEngine* se, Point3d& p, double& v, uint32_t r, uint32_t c, uint32_t s) {\n\t\t\tif (r >= se->_y.n_elem || c >= se->_x.n_elem || s >= se->_z.n_elem) {\n\t\t\t\tp = Point3d();\n\t\t\t\tv = -1.0;\n\t\t\t} else {\n\t\t\t\tp = Point3d(se->_x(c), se->_y(r), se->_z(s));\n\t\t\t\tv = se->_values(r, c, s);\n\t\t\t}\n\t\t}\n\n\t\t_SurfaceCell(const _SurfaceEngine* se, uint32_t r, uint32_t c, uint32_t s) {\n\t\t\tthis->points.resize(8);\n\t\t\tthis->values.resize(8);\n\n\t\t\t_get_level(se, this->points[0], this->values[0], r  , c  , s);\n\t\t\t_get_level(se, this->points[1], this->values[1], r+1, c  , s);\n\t\t\t_get_level(se, this->points[2], this->values[2], r+1, c+1, s);\n\t\t\t_get_level(se, this->points[3], this->values[3], r  , c+1, s);\n\t\t\t_get_level(se, this->points[4], this->values[4], r  , c  , s+1);\n\t\t\t_get_level(se, this->points[5], this->values[5], r+1, c  , s+1);\n\t\t\t_get_level(se, this->points[6], this->values[6], r+1, c+1, s+1);\n\t\t\t_get_level(se, this->points[7], this->values[7], r  , c+1, s+1);\n\t\t}\n\n\t\tstd::string str(void) const {\n\t\t\tstd::ostringstream result;\n\t\t\tresult << \"{\\n\";\n\t\t\tfor (uint32_t k = 0; k < 8; k++) {\n\t\t\t\tresult << \"\\t\" << this->points[k].str() << \" -> \" << this->values[k] << \"\\n\";\n\t\t\t}\n\t\t\tresult << \"}\";\n\t\t\treturn result.str();\n\t\t}\n\t};\n\n\n\tArrayOfSharedPolygons contours(const arma::vec& x, const arma::vec& y,\n\t\t\tconst arma::mat& values, double level, bool negative=false);\n\n\tSharedSurface3d isosurface(const arma::vec& x, const arma::vec& y, const arma::vec& z,\n\t\t\t\tconst arma::cube& values, double level, bool negative);\n}\n\n#endif /* OPL_CONTOURS_H_ */\n"
  },
  {
    "path": "OptolithiumC/include/opl_conv.h",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for non-commercial usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#ifndef OPL_CONV_H_\n#define OPL_CONV_H_\n\n\n#if !defined( SWIG )\n    // SWIG should not see #include <armadillo> as it can not handle it\n\t#include <armadillo>\n#endif\n\n\nnamespace conv {\n\n\ttypedef enum {\n\t\tSYMMETRIC = 0,\n\t\tCIRCULAR = 1\n\t} conv1d_type_t;\n\n\n\ttemplate <typename _ArrayType>\n\tinline void _symmetric_conv1d(_ArrayType& result, const _ArrayType& array, const arma::vec& kernel) {\n\t\t// Symmetric convolution help\n\t\t//\t                  |     |\n\t\t//        0  1  2  1  0  1  2  1  0\n\t\t//\t      0  1  2  3  4  3  2  1  0\n\t\t//\t     -4 -3 -2 -1  0  1  2  3  4\n\t\tif (array.n_elem > 1) {\n\t\t\tconst double n_elem = static_cast<double>(kernel.n_elem);\n\t\t\tconst int32_t kmin = -static_cast<int32_t>(std::floor(n_elem/2.0));\n//\t\t\tLOG(INFO) << \"Array size = \" << array.n_elem << \" Centered kernel min index = \" << kmin;\n\n\t\t\t// Make symmetric convolution. Indexes reflected from boundary\n\t\t\tfor (int32_t i = 0; i < static_cast<int32_t>(array.n_elem); i++) {\n\t\t\t\tdouble sum = 0;\n\t\t\t\tfor (int32_t s = kmin, k = 0; k < static_cast<int32_t>(kernel.n_elem); s++, k++) {\n\t\t\t\t\tuint32_t v;\n\t\t\t\t\tconst int32_t w = abs(i + s), c = array.n_elem;\n\t\t\t\t\tif (w >= c) {\n\t\t\t\t\t\tconst uint8_t is_fall = (w/(c-1))%2;\n\t\t\t\t\t\tif (is_fall) {\n\t\t\t\t\t\t\tv = (c-1) - w % (c-1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tv = w % (c-1);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tv = w;\n\t\t\t\t\t}\n//\t\t\t\t\tLOG(INFO) << \"i = \" << i << \" s = \" << s <<\n//\t\t\t\t\t\t\t\" array(\" << v << \") = \" << array(v) <<\n//\t\t\t\t\t\t\t\" kernel(\" << k << \") = \" << kernel(k);\n\t\t\t\t\tsum += array(v) * kernel(k);\n\t\t\t\t}\n\t\t\t\tresult(i) = sum;\n\t\t\t}\n\t\t} else if (array.n_elem == 1) {\n\t\t\tresult(0) = array(0);\n//\t\t\tLOG(INFO) << \"Array size = 1 -> input: \" << array(0) << \" result: \" << result(0);\n\t\t}\n\t}\n\n\n\ttemplate <typename _ArrayType>\n\tinline void _circular_conv1d(_ArrayType& result, const _ArrayType& array, const arma::vec& kernel) {\n\t\t// Circular convolution help for vertical stage\n\t\t//\t                  |     |\n\t\t//\t0  1  2  0  1  2  0  1  2  0  1  2  0  1  2\n\t\t//\t      0  1  2  3  4  3  2  1  0\n\t\t//\t     -4 -3 -2 -1  0  1  2  3  4\n\t\tif (array.n_elem > 1) {\n\t\t\tconst double n_elem = static_cast<double>(kernel.n_elem);\n\t\t\tconst int32_t kmin = -static_cast<int32_t>(std::floor(n_elem/2.0));\n//\t\t\tLOG(INFO) << \"Array size = \" << array.n_elem << \" Centered kernel min index = \" << kmin;\n\n\t\t\t// Make circular convolution\n\t\t\tfor (int32_t i = 0; i < static_cast<int32_t>(array.n_elem); i++) {\n\t\t\t\tdouble sum = 0;\n\t\t\t\tfor (int32_t s = kmin, k = 0; k < static_cast<int32_t>(kernel.n_elem); s++, k++) {\n\t\t\t\t\tconst uint32_t v = (array.n_elem + i + s) % array.n_elem;\n//\t\t\t\t\tLOG(INFO) << \"i = \" << i << \" s = \" << s <<\n//\t\t\t\t\t\t\t\" array(\" << v << \") = \" << array(v) <<\n//\t\t\t\t\t\t\t\" kernel(\" << k << \") = \" << kernel(k);\n\t\t\t\t\tsum += array(v) * kernel(k);\n\t\t\t\t}\n\t\t\t\tresult(i) = sum;\n\t\t\t}\n\t\t} else if (array.n_elem == 1) {\n\t\t\tresult(0) = array(0);\n//\t\t\tLOG(INFO) << \"Array size = 1 -> input: \" << array(0) << \" result: \" << result(0);\n\t\t}\n\t}\n\n\n\tinline arma::rowvec conv1d(const arma::rowvec& array, const arma::vec& kernel, conv1d_type_t type) {\n\t\tarma::rowvec result = arma::rowvec(array.n_elem);\n\t\tif (type == CIRCULAR) {\n\t\t\t_circular_conv1d(result, array, kernel);\n\t\t} else if (type == SYMMETRIC) {\n\t\t\t_symmetric_conv1d(result, array, kernel);\n\t\t} else {\n\t\t\tthrow std::invalid_argument(\"Convolution type can be only SYMMETRIC or CIRCULAR\");\n\t\t}\n\t\treturn result;\n\t}\n\n\n\tinline arma::colvec conv1d(const arma::colvec& array, const arma::vec& kernel, conv1d_type_t type) {\n\t\tarma::colvec result = arma::colvec(array.n_elem);\n\t\tif (type == CIRCULAR) {\n\t\t\t_circular_conv1d(result, array, kernel);\n\t\t} else if (type == SYMMETRIC) {\n\t\t\t_symmetric_conv1d(result, array, kernel);\n\t\t} else {\n\t\t\tthrow std::invalid_argument(\"Convolution type can be only SYMMETRIC or CIRCULAR\");\n\t\t}\n\t\treturn result;\n\t}\n\n\n\tinline arma::cube conv1d(const arma::cube& array, const arma::vec& kernel, conv1d_type_t type) {\n\t\tif ((array.n_rows == 1 && array.n_cols == 1) ||\n\t\t\t(array.n_rows == 1 && array.n_slices == 1) ||\n\t\t\t(array.n_cols == 1 && array.n_slices == 1))\n\t\t{\n\t\t\tarma::cube result = arma::cube(array.n_rows, array.n_cols, array.n_slices);\n\t\t\tif (type == CIRCULAR) {\n\t\t\t\t_circular_conv1d(result, array, kernel);\n\t\t\t} else if (type == SYMMETRIC) {\n\t\t\t\t_symmetric_conv1d(result, array, kernel);\n\t\t\t} else {\n\t\t\t\tthrow std::invalid_argument(\"Convolution type can be only SYMMETRIC or CIRCULAR\");\n\t\t\t}\n\t\t\treturn result;\n\t\t} else {\n\t\t\tthrow std::invalid_argument(\"One dimension circular convolution can be performed only on vectors\");\n\t\t}\n\t}\n\n}\n\n#endif /* OPL_CONV_H_ */\n"
  },
  {
    "path": "OptolithiumC/include/opl_eikonal.h",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#ifndef OPL_EIKONAL_H_\n#define OPL_EIKONAL_H_\n\n\n#if !defined( SWIG )\n    // SWIG should not see #include <armadillo> as it can not handle it\n\t#include <armadillo>\n\t#include <FMM_API.h>\n#endif\n\nnamespace eikonal {\n\n\tvoid _chk_eikonal_status(int status) {\n\t\tif (status != LSM_FMM_ERR_SUCCESS) {\n\t\t\tstd::string error_string;\n\t\t\tif (status == LSM_FMM_ERR_FMM_DATA_CREATION_ERROR) {\n\t\t\t\terror_string = \"Data creation error\";\n\t\t\t} else if (status == LSM_FMM_ERR_INVALID_SPATIAL_DISCRETIZATION_ORDER) {\n\t\t\t\terror_string = \"Invalid spatial discretization order\";\n\t\t\t} else {\n\t\t\t\terror_string = \"General error\";\n\t\t\t}\n\t\t\tthrow std::runtime_error(\"Solving eikonal failed: \" + error_string);\n\t\t}\n\t}\n\n\t// result must contain initial state\n\tvoid solve2d(arma::mat& result, const arma::mat& rates, double row_step, double col_step) {\n\t\tconst int sizes[2] = { static_cast<int>(rates.n_rows), static_cast<int>(rates.n_cols) };\n\t\tconst double grid[2] = { col_step, row_step };\n\n\t\tconst int derivative_order = 2;\n\n\t\tdouble *mask = nullptr;\n\t\tdouble *phi = reinterpret_cast<LSMLIB_REAL*>(&result(0, 0));\n\t\tconst double *speed = reinterpret_cast<const LSMLIB_REAL*>(&rates(0, 0));\n\n\t\tint status = solveEikonalEquation2d(phi, speed, mask, derivative_order, sizes, grid);\n\n\t\t_chk_eikonal_status(status);\n\t}\n\n\t// result must contain initial state\n\tvoid solve3d(arma::cube& result, const arma::cube& rates, double row_step, double col_step, double slice_step) {\n\t\tint sizes[3] = { static_cast<int>(rates.n_rows),\n\t\t\t\tstatic_cast<int>(rates.n_cols), static_cast<int>(rates.n_slices) };\n\t\tdouble grid[3] = { row_step, col_step, slice_step };\n\n\t\tint derivative_order = 2;\n\n\t\tdouble *mask = nullptr;\n\t\tdouble *phi = reinterpret_cast<LSMLIB_REAL*>(&result(0, 0, 0));\n\t\tconst double *speed = reinterpret_cast<const LSMLIB_REAL*>(&rates(0, 0, 0));\n\n\t\tint status = solveEikonalEquation3d(phi, speed, mask, derivative_order, sizes, grid);\n\n\t\t_chk_eikonal_status(status);\n\t}\n\n}\n\n\n#endif /* OPL_EIKONAL_H_ */\n"
  },
  {
    "path": "OptolithiumC/include/opl_fft.h",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#include \"opl_log.h\"\n#include <stdint.h>\n\n#if !defined(SWIG)\n// SWIG should not see #include <armadillo> as it can not handle it\n    #include <armadillo>\n#endif\n\n\n#if defined(OPTOLITHIUMC_USE_FFTW_LIBRARY)\n#include <fftw3.h>\n#elif defined(OPTOLITHIUMC_USE_KISSFFT_LIBRARY)\n#include <kiss_fftnd.h>\n#include <kiss_fft.h>\n#elif defined(OPTOLITHIUMC_USE_FOURIER_LIBRARY)\n#include <fourier.h>\n#else\n#error \"OPTOLITHIUMC_USE_KISSFFT_LIBRARY or OPTOLITHIUMC_USE_FFTW_LIBRARY must be set!\"\n#endif\n\n\nnamespace fft {\n\n    enum direction_t {FFT_BACKWARD, FFT_FORWARD};\n\n    class TransformInterface2d {\n    public:\n        // TransformInterface2d(arma::cx_mat &array, direction_t dir, int32_t n_times=-1) { }\n        virtual void execute(void) = 0;\n        virtual ~TransformInterface2d() { };\n    };\n\n#if defined(OPTOLITHIUMC_USE_FFTW_LIBRARY)\n    #define FFTW_METHOD_THRESHOLD 100\n\n    typedef fftw_plan fft_plan_t;\n\n    class FFTW2d {\n    private:\n        fft_plan_t _plan;\n        fftw_complex *_raw_ptr;\n    public:\n        FFTW2d(arma::cx_mat &array, direction_t dir, int32_t n_times = -1) {\n            int fftw_dir = (dir == FFT_FORWARD) ? FFTW_FORWARD : FFTW_BACKWARD;\n            this->_raw_ptr = reinterpret_cast<fftw_complex *>(&array(0, 0));\n\n            {TIMED_SCOPE(aerial_image_fftw_plan, \"Create fftw transform plan\");\n                const uint32_t method = (uint32_t) (n_times > FFTW_METHOD_THRESHOLD ? FFTW_MEASURE : FFTW_ESTIMATE);\n                this->_plan = fftw_plan_dft_2d(array.n_cols, array.n_rows, this->_raw_ptr, this->_raw_ptr, fftw_dir, method);\n            }\n        }\n\n        ~FFTW2d() {\n            fftw_destroy_plan(this->_plan);\n        }\n\n        void execute(void) {\n            {TIMED_SCOPE(aerial_image_timer_fftw, \"FFTW calculation done\");\n\t\t\t\tfftw_execute(this->_plan);\n\t\t\t}\n        }\n    };\n\n    typedef FFTW2d FFT2d;\n#elif defined(OPTOLITHIUMC_USE_KISSFFT_LIBRARY)\n    class KissFFT2d : public TransformInterface2d {\n    private:\n        kiss_fftnd_cfg _cfg;\n        kiss_fft_cpx *_out_buf;\n        kiss_fft_cpx *_raw_ptr;\n        uint32_t _buf_size;\n        uint32_t _n_elem;\n    public:\n        KissFFT2d(arma::cx_mat &array, direction_t dir, int32_t n_times = -1) {\n            printf(\"n_cols = %d, n_rows = %d\\n\", array.n_cols, array.n_rows);\n            const int ndims = 2;\n            const int dims[2] = {static_cast<int>(array.n_cols), static_cast<int>(array.n_rows)};\n//            const int dims[2] = {static_cast<int>(array.n_rows), static_cast<int>(array.n_cols)};\n            int is_inverse = (dir == FFT_BACKWARD) ? 1 : 0;\n            this->_raw_ptr = reinterpret_cast<kiss_fft_cpx*>(&array(0, 0));\n//            this->_n_elem = array.n_cols * array.n_rows;\n//            this->_buf_size = static_cast<uint32_t>(this->_n_elem*sizeof(kiss_fft_cpx));\n//            this->_out_buf = static_cast<kiss_fft_cpx*>(malloc(this->_buf_size));\n            this->_cfg = kiss_fftnd_alloc(dims, ndims, is_inverse, NULL, NULL);\n        }\n\n        ~KissFFT2d() {\n            kiss_fft_free(this->_cfg);\n            free(this->_out_buf);\n        }\n\n        void execute(void) {\n            {TIMED_SCOPE(aerial_image_timer_fftw, \"KissFFT calculation done\");\n//                printf(\"================================================================\\n\");\n\n//                kiss_fft_cpx zero;\n//                zero.r = 0.0;\n//                zero.i = 0.0;\n//                kiss_fft_cpx tmp = this->_raw_ptr[0];\n//                this->_raw_ptr[0] = this->_raw_ptr[159];\n//                this->_raw_ptr[1] = tmp;\n//                this->_raw_ptr[159] = tmp;\n//                this->_raw_ptr[158] = zero;\n\n//                memcpy(this->_out_buf, this->_raw_ptr, this->_buf_size);\n//                for (uint32_t k = 0; k < this->_n_elem; k++) {\n//                    printf(\"v[%d] = %.5f %.5fi\\n\", k, this->_out_buf[k].r, this->_out_buf[k].i);\n//                }\n//                memset(this->_out_buf, 0, this->_buf_size);\n\n                kiss_fftnd(this->_cfg, this->_raw_ptr, this->_raw_ptr);\n\n//                for (uint32_t k = 0; k < this->_n_elem; k++) {\n//                    this->_out_buf[k].r /= this->_n_elem;\n//                    this->_out_buf[k].i /= this->_n_elem;\n//                }\n\n//                printf(\"--------------------------------------------------------------\\n\");\n//\n//                for (uint32_t k = 0; k < this->_n_elem; k++) {\n//                    printf(\"v[%d] = %.5f %.5fi\\n\", k, this->_out_buf[k].r, this->_out_buf[k].i);\n//                }\n//                memcpy(this->_raw_ptr, this->_out_buf, this->_buf_size);\n            }\n        }\n    };\n\n    typedef KissFFT2d FFT2d;\n#elif defined(OPTOLITHIUMC_USE_FOURIER_LIBRARY)\n    class Fourier2d {\n    private:\n        fft_plan_t* _plan;\n        fft_complex_t * _raw_ptr;\n    public:\n        Fourier2d(arma::cx_mat &array, direction_t dir, int32_t n_times = -1) {\n            int fft_dir = (dir == FFT_FORWARD) ? FFT_LITHO_FORWARD : FFT_LITHO_BACKWARD;\n            this->_raw_ptr = reinterpret_cast<fft_complex_t *>(&array(0, 0));\n            this->_plan = fft_plan_create_2d(\n                    array.n_rows, array.n_cols, this->_raw_ptr, this->_raw_ptr,\n                    fft_dir, FFT_USE_CACHE | FFT_USE_RADIX2_TABLE);\n        }\n\n        ~Fourier2d() {\n            fft_plan_destroy(this->_plan);\n        }\n\n        void execute(void) {\n            {TIMED_SCOPE(aerial_image_timer_fftw, \"FFT calculation done\");\n                fft_execute_2d(this->_plan);\n            }\n        }\n    };\n\n    typedef Fourier2d FFT2d;\n#endif\n\n}\n"
  },
  {
    "path": "OptolithiumC/include/opl_geometry.h",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#ifndef OPL_GEOMETRY_H_\n#define OPL_GEOMETRY_H_\n\n#include <stdlib.h>\n#include <cmath>\n#include <vector>\n#include <list>\n#include <memory>\n\n#include \"opl_log.h\"\n#include \"opl_iter.h\"\n\n\n#if !defined( SWIG )\n    // SWIG should not see #include <armadillo> as it can not handle it\n\t#include <armadillo>\n#endif\n\n\n#if !defined(M_PI) && !defined(SWIG)\n\t// Shit C++11 standard where not defined in math but this constant defined\n\t#define M_E\t\t\t2.7182818284590452354\n\t#define M_LOG2E\t\t1.4426950408889634074\n\t#define M_LOG10E\t0.43429448190325182765\n\t#define M_LN2\t\t0.69314718055994530942\n\t#define M_LN10\t\t2.30258509299404568402\n\t#define M_PI\t\t3.14159265358979323846\n\t#define M_PI_2\t\t1.57079632679489661923\n\t#define M_PI_4\t\t0.78539816339744830962\n\t#define M_1_PI\t\t0.31830988618379067154\n\t#define M_2_PI\t\t0.63661977236758134308\n\t#define M_2_SQRTPI\t1.12837916709551257390\n\t#define M_SQRT2\t\t1.41421356237309504880\n\t#define M_SQRT1_2\t0.70710678118654752440\n#endif\n\n\nnamespace geometry {\n\n\ttypedef enum {\n\t\tLEFT = 0,\n\t\tRIGHT = 1,\n\t\tBEYOND = 2,\n\t\tBEHIND = 3,\n\t\tBETWEEN = 4,\n\t\tORIGIN = 5,\n\t\tDESTINATION = 6,\n\t} classify_type_t;\n\n\n\ttypedef enum {\n\t\tCOLLINEAR = 0,\n\t\tPARALLEL = 1,\n\t\tSKEW = 2,\n\t\tSKEW_NO_CROSS = 3,\n\t\tSKEW_CROSS =4,\n\t} cross_type_t;\n\n\n\ttypedef enum {\n\t\tCW = 1,\n\t\tCCW = -1,\n\t} rotation_type_t;\n\n\n\ttypedef enum {\n\t\tDIM_1D_X = 0,\n\t\tDIM_1D_Y = 1,\n\t\tDIM_2D = 2\n\t} dimension_t;\n\n\n\ttypedef enum {\n\t\tGEOMETRY_POLYGON = 0,\n\t\tGEOMETRY_BOX = 1\n\t} geometry_t;\n\n\n\t#define DEFAULT_CLASSIFY_PRECISION 1e-2\n\n\n\tclass Edge2d;\n\n\n\tclass Point2d {\n\tpublic:\n\t\tdouble x;\n\t\tdouble y;\n\n\t\tPoint2d(double x=0.0, double y=0.0) : x(x), y(y) { }\n\n\t\tPoint2d(const Point2d& other) : x(other.x), y(other.y) { }\n\n\t\tPoint2d operator+(const Point2d& p) const;\n\t\tPoint2d operator+(double s) const;\n\t\tPoint2d operator-(const Point2d& p) const;\n\t\tPoint2d operator-(double s) const;\n\n\t\tdouble& operator[](uint32_t i);\n\t\tdouble operator[](uint32_t i) const;\n\t\tbool operator==(const Point2d& p) const;\n\t\tbool operator!=(const Point2d& p) const;\n\t\tbool operator<(const Point2d& p) const;\n\t\tbool operator>(const Point2d& p) const;\n\n\t\tPoint2d& operator+=(const Point2d& rhs);\n\t\tPoint2d& operator-=(const Point2d& rhs);\n\t\tPoint2d& abs(void);\n\t\tclassify_type_t classify(const Point2d& p0, const Point2d& p1,\n\t\t\t\tdouble precision=DEFAULT_CLASSIFY_PRECISION) const;\n\t\tclassify_type_t classify(const Edge2d&, double precision=DEFAULT_CLASSIFY_PRECISION) const;\n\t\tdouble polar_angle(void) const;\n\t\tdouble length(void) const;\n\t\tPoint2d normal_intersect(const Edge2d&) const;\n\t\tdouble distance(const Edge2d&) const;\n\t\tvoid transform(int32_t sign, double mag, double angle);\n\t\tstd::string str(void) const;\n\t};\n\n\tPoint2d operator* (double s, const Point2d& p);\n\tPoint2d operator/ (const Point2d& p, double s);\n\tdouble dot(const Point2d& p, const Point2d& q);\n\n\n\ttypedef Point2d Sizes;\n\n\n\tclass Edge2d {\n\tpublic:\n\t\tPoint2d org;\n\t\tPoint2d dst;\n\n\t\tEdge2d(double org_x, double org_y, double dst_x, double dst_y) :\n\t\t\torg(Point2d(org_x, org_y)), dst(Point2d(dst_x, dst_y)) { }\n\n\t\tEdge2d(const Point2d& org, const Point2d& dst) : org(org), dst(dst) { }\n\n\t\tEdge2d& rot(rotation_type_t dir=CCW);\n\t\tEdge2d& flip(void);\n\t\tcross_type_t intersect(const Edge2d& e, double &t) const;\n\n\t\t// Return intersection point between 'this' edge and edge represented as 't' value (line direction)\n\t\tPoint2d point(double t) const;\n\n\t\t// Return intersection point between 'this' edge and given edge 'e'\n\t\tPoint2d point(const Edge2d& e) const;\n\n\t\tcross_type_t cross_type(const Edge2d& e) const;\n\t\tbool is_vertical(void) const;\n\t\tbool is_horizontal(void) const;\n\t\tdouble dx(void) const;\n\t\tdouble dy(void) const;\n\t\tSizes sizes(void) const;\n\t\tdouble length(void) const;\n\t\tdouble slope(void) const;\n\t\tdouble y(double x) const;\n\n\t\t// Calculate the area of trapezoid between this edge, y-axis and two horizontal lines.\n\t\tdouble area(void) const;\n\n\t\tstd::string str(void) const;\n\t\tbool operator==(const Edge2d& other) const;\n\t};\n\n\n\ttypedef std::shared_ptr<Point2d> SharedPoint2d;\n\ttypedef std::vector<SharedPoint2d> ArrayOfSharedPoints2d;\n\n\ttypedef std::shared_ptr<Edge2d> SharedEdge2d;\n\ttypedef std::shared_ptr<const Edge2d> ConstSharedEdge2d;\n\ttypedef std::vector<SharedEdge2d> ArrayOfSharedEdges2d;\n\n\n\tclass AbstractGeometry : public Iterable::Interface<SharedEdge2d> {\n\tprotected:\n\t\tArrayOfSharedEdges2d _edges;\n\t\tdimension_t _axis;\n\tpublic:\n\t\tvirtual geometry_t type(void) const = 0;\n\t\tvirtual bool operator==(const AbstractGeometry &other) const = 0;\n\t\tvirtual std::string str(void) const = 0;\n\n\t\tvirtual bool is_mask(void) const {\n\t\t\treturn false;\n\t\t}\n\n\t\tSharedEdge2d at(uint32_t index) const;\n\t\tuint32_t length(void) const;\n\n\t\tdouble signed_area(void) const;\n\t\tvirtual bool set_bypass(rotation_type_t direction);\n\t\tdimension_t axis(void) const;\n\t};\n\n\n\ttypedef std::shared_ptr<AbstractGeometry> SharedAbstractGeomtery;\n\ttypedef std::vector<SharedAbstractGeomtery> ArrayOfSharedAbstractGeomtery;\n\n\n\tclass PolygonGeometry : public virtual AbstractGeometry {\n\tpublic:\n\t\t// Check whether input points represent one dimensional polygon\n\t\tstatic bool is_1d_possible(const ArrayOfSharedPoints2d &points);\n\t\tstatic bool is_2d_possible(const ArrayOfSharedPoints2d &points);\n\n\t\tPolygonGeometry(const ArrayOfSharedPoints2d &points);\n\t\tPolygonGeometry(const PolygonGeometry& other);\n\n\t\tbool clean(void);\n\n\t\tgeometry_t type(void) const;\n\t\tbool operator==(const AbstractGeometry &other) const;\n\t\tstd::string str(void) const;\n\t};\n\n\n\ttypedef std::shared_ptr<PolygonGeometry> SharedPolygon;\n\ttypedef std::vector<SharedPolygon> ArrayOfSharedPolygons;\n\n\n\tclass RectangleGeometry : public virtual AbstractGeometry {\n\tprivate:\n\t\tEdge2d _diag;\n\t\tSizes _sizes;\n\tpublic:\n\t\tRectangleGeometry(const Point2d& lb, const Point2d& rt);\n\t\tRectangleGeometry(ArrayOfSharedPoints2d points);\n\t\tRectangleGeometry(const RectangleGeometry& other);\n\n\t\tPoint2d left_bottom(void) const;\n\t\tPoint2d right_top(void) const;\n\t\tEdge2d diag(void) const;\n\t\tSizes sizes(void) const;\n\t\tbool set_bypass(rotation_type_t direction);\n\n\t\tgeometry_t type(void) const;\n\t\tbool operator==(const AbstractGeometry& other) const;\n\t\tstd::string str(void) const;\n\t};\n\n\n\tclass Point3d {\n\tpublic:\n\t\tdouble x;\n\t\tdouble y;\n\t\tdouble z;\n\n\t\tPoint3d(double x=0.0, double y=0.0, double z=0.0) : x(x), y(y), z(z) { }\n\n\t\tPoint3d(const Point3d& other) : x(other.x), y(other.y), z(other.z) { }\n\n\t\tPoint3d operator+(const Point3d& p) const;\n\t\tPoint3d operator+(double s) const;\n\t\tPoint3d operator-(const Point3d& p) const;\n\t\tPoint3d operator-(double s) const;\n\n\t\tdouble& operator[](uint32_t i);\n\t\tdouble operator[](uint32_t i) const;\n\t\tbool operator==(const Point3d& p) const;\n\t\tbool operator!=(const Point3d& p) const;\n\t\tbool operator<(const Point3d& p) const;\n\t\tbool operator>(const Point3d& p) const;\n\n\t\tPoint3d& operator+=(const Point3d& rhs);\n\t\tPoint3d& operator-=(const Point3d& rhs);\n\t\tPoint3d& abs(void);\n\n\t\tdouble length(void) const;\n\n\t\tstd::string str(void) const;\n\t};\n\n\tPoint3d operator* (double s, const Point3d& p);\n\tPoint3d operator/ (const Point3d& p, double s);\n\tdouble dot(const Point3d& p, const Point3d& q);\n\n\n\ttypedef std::shared_ptr<Point3d> SharedPoint3d;\n\ttypedef std::shared_ptr<const Point3d> ConstSharedPoint3d;\n\ttypedef std::vector<SharedPoint3d> ArrayOfSharedPoints3d;\n\n\n\tclass Edge3d {\n\tpublic:\n\t\tPoint3d org;\n\t\tPoint3d dst;\n\n\t\tEdge3d(double org_x, double org_y, double org_z, double dst_x, double dst_y, double dst_z) :\n\t\t\torg(Point3d(org_x, org_y, org_z)), dst(Point3d(dst_x, dst_y, dst_z)) { }\n\n\t\tEdge3d(const Point3d& org, const Point3d& dst) : org(org), dst(dst) { }\n\n\t\tdouble length(void) const;\n\n\t\tstd::string str(void) const;\n\t\tbool operator==(const Edge3d& other) const;\n\t};\n\n\tdouble dot(const Edge3d& p, const Edge3d& q);\n\tPoint3d cross(const Edge3d& p, const Edge3d& q);\n\n\ttypedef std::shared_ptr<Edge3d> SharedEdge3d;\n\ttypedef std::vector<SharedEdge3d> ArrayOfSharedEdges3d;\n\n\n\tclass Triangle3d : public Iterable::Interface<SharedPoint3d> {\n\tprivate:\n\t\tSharedPoint3d _a, _b, _c;\n\tpublic:\n\t\tTriangle3d(SharedPoint3d a, SharedPoint3d b, SharedPoint3d c) : _a(a), _b(b), _c(c) { }\n\t\tTriangle3d(const Point3d& a, const Point3d& b, const Point3d& c);\n\n\t\tuint32_t length(void) const {\n\t\t\treturn 3;\n\t\t}\n\n\t\tbool operator==(const Triangle3d &other) const;\n\t\tstd::string str(void) const;\n\n\t\tSharedPoint3d at(uint32_t index) const;\n\t\tPoint3d& operator[](uint32_t i);\n\t\tPoint3d operator[](uint32_t i) const;\n\n\t\tSharedPoint3d normal(void) const;\n\n\t\tSharedPoint3d a(void) const {\n\t\t\treturn this->_a;\n\t\t}\n\n\t\tSharedPoint3d b(void) const {\n\t\t\treturn this->_b;\n\t\t}\n\n\t\tSharedPoint3d c(void) const {\n\t\t\treturn this->_c;\n\t\t}\n\t};\n\n\n\ttypedef std::shared_ptr<Triangle3d> SharedTriangle3d;\n\ttypedef std::vector<SharedTriangle3d> ArrayOfSharedTriangles3d;\n\n\n\tclass Surface3d {\n\tprivate:\n\t\tbool _is_finalized;\n\n\t\tArrayOfSharedPoints3d _points;\n\t\tArrayOfSharedTriangles3d _triangles;\n\n\t\tstd::shared_ptr<arma::vec> _x;\n\t\tstd::shared_ptr<arma::vec> _y;\n\t\tstd::shared_ptr<arma::vec> _z;\n\tpublic:\n\t\tSurface3d() {\n\t\t\tthis->_is_finalized = false;\n\t\t};\n\n\t\tSurface3d(ArrayOfSharedPoints3d points, ArrayOfSharedTriangles3d triangles);\n\n\t\tbool add_point(SharedPoint3d point) {\n\t\t\tif (!this->_is_finalized) {\n\t\t\t\tthis->_points.push_back(point);\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tbool add_triangle(SharedTriangle3d triangle) {\n\t\t\tif (!this->_is_finalized) {\n\t\t\t\tthis->_triangles.push_back(triangle);\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tvoid generate_xyz(void);\n\n\t\tArrayOfSharedPoints3d points(void) const;\n\t\tArrayOfSharedTriangles3d triangles(void) const;\n\t\tstd::shared_ptr<arma::vec> x(void) const;\n\t\tstd::shared_ptr<arma::vec> y(void) const;\n\t\tstd::shared_ptr<arma::vec> z(void) const;\n\t};\n\n\ttypedef std::shared_ptr<Surface3d> SharedSurface3d;\n}\n\n#endif /* OPL_GEOMETRY_H_ */\n"
  },
  {
    "path": "OptolithiumC/include/opl_interp.h",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#ifndef OPL_INTERP_H_\n#define OPL_INTERP_H_\n\n\n#include <memory>\n\n#if !defined( SWIG )\n    // SWIG should not see #include <armadillo> as it can not handle it\n\t#include <armadillo>\n#endif\n\n\nnamespace interp {\n\n\ttypedef std::shared_ptr<const arma::vec> ConstVector;\n\ttypedef std::shared_ptr<const arma::mat> ConstMatrix;\n\ttypedef std::shared_ptr<arma::vec> Vector;\n\n\n\tclass LinearInterpolation1d {\n\tprivate:\n\t\tConstVector _px;  // Input array x\n\t\tConstVector _py;  // Input array y - values\n\n\t\tVector _b;  // Additive coefficient of line\n\t\tVector _s;  // Slope of line\n\n\t\tdouble _fill;\n\tpublic:\n\t\tLinearInterpolation1d(void) : _fill(0.0) { };\n\t\tLinearInterpolation1d(ConstVector px, ConstVector py, double fill=0.0);\n\t\tdouble interpolate(double xi) const;\n\t\tstd::shared_ptr<arma::vec> interpolate(const arma::vec& xi) const;\n\n\t\tstd::shared_ptr<const arma::vec> x(void) const {\n\t\t\treturn this->_px;\n\t\t}\n\n\t\tstd::shared_ptr<const arma::vec> y(void) const {\n\t\t\treturn this->_py;\n\t\t}\n\n\t\tbool operator==(const LinearInterpolation1d& other) const;\n\t};\n\n\ttypedef std::shared_ptr<LinearInterpolation1d> SharedLinearInterpolation1d;\n\n\tclass LinearInterpolation2d {\n\tprivate:\n\t\tConstVector _px;\n\t\tConstVector _py;\n\t\tConstMatrix _values;\n\t\tdouble _fill;\n\n\t\tSharedLinearInterpolation1d _xlastinterp1;\n\t\tstd::vector<SharedLinearInterpolation1d> _yinterp1;\n\tpublic:\n\t\tLinearInterpolation2d(void) : _fill(0.0) { };\n\t\tLinearInterpolation2d(ConstVector px, ConstVector py, ConstMatrix values, double fill=0.0);\n\t\tdouble interpolate(double xi, double yi) const;\n\t\tstd::shared_ptr<arma::mat> interpolate(const arma::vec& xi, const arma::vec& yi) const;\n\n\t\tstd::shared_ptr<const arma::vec> x(void) const {\n\t\t\treturn this->_px;\n\t\t}\n\n\t\tstd::shared_ptr<const arma::vec> y(void) const {\n\t\t\treturn this->_py;\n\t\t}\n\n\t\tstd::shared_ptr<const arma::mat> values(void) const {\n\t\t\treturn this->_values;\n\t\t}\n\n\t\tbool operator==(const LinearInterpolation2d& other) const;\n\t};\n\n\ttypedef std::shared_ptr<LinearInterpolation2d> SharedLinearInterpolation2d;\n}\n\n#endif /* OPL_INTERP_H_ */\n"
  },
  {
    "path": "OptolithiumC/include/opl_iter.h",
    "content": "/*\r\n *\r\n * This file is part of Optolithium lithography modelling software.\r\n *\r\n * Copyright (C) 2015 Alexei Gladkikh\r\n *\r\n * This software is dual-licensed: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 2 of the License, or\r\n * (at your option) any later version only for NON-COMMERCIAL usage.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program; if not, write to the Free Software\r\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n *\r\n * If you are interested in other licensing models, including a commercial-\r\n * license, please contact the author at gladkikhalexei@gmail.com\r\n *\r\n */\r\n\r\n#ifndef ITERABLE_H_\r\n#define ITERABLE_H_\r\n\r\n#include <stdint.h>\r\n#include <opl_log.h>\r\n\r\nnamespace Iterable\r\n{\r\n\tinline uint32_t indx(int32_t k, int32_t len) {\r\n        return static_cast<uint32_t>((k < 0) ? (len + k) % len : k % len);\r\n\t}\r\n\r\n\ttemplate <class object_t>\r\n\tclass Interface;\r\n\r\n\ttemplate <class object_t>\r\n\tclass Iterator\r\n\t{\r\n\tprivate:\r\n\t\tuint32_t _pos;\r\n\t\tconst Interface<object_t> *_container;\r\n\r\n\tpublic:\r\n\t\tIterator(const Interface<object_t>* p_vec, uint32_t pos): _pos(pos), _container(p_vec){ }\r\n\r\n\t\tuint32_t pos(void) const {\r\n\t\t\treturn this->_pos;\r\n\t\t}\r\n\r\n\t\t// these three methods form the basis of an iterator for use with a range-based for loop\r\n\t\tbool operator!= (const Iterator& other) const {\r\n\t\t\treturn this->_pos != other._pos;\r\n\t\t}\r\n\r\n\t\tobject_t operator*(void) const {\r\n\t\t\treturn this->_container->at(indx(this->_pos, this->_container->length()));\r\n\t\t}\r\n\r\n\t\tconst Iterator& operator++ () {\r\n\t\t\t++_pos;\r\n\t\t\t// although not strictly necessary for a range-based for loop\r\n\t\t\t// following the normal convention of returning a value from\r\n\t\t\t// operator++ is a good idea.\r\n\t\t\treturn *this;\r\n\t\t}\r\n\r\n\t\tIterator begin(void) const {\r\n\t\t\treturn this->_container->begin();\r\n\t\t}\r\n\r\n\t\tIterator end(void) const {\r\n\t\t\treturn this->_container->end();\r\n\t\t}\r\n\r\n\t\tIterator next(void) const {\r\n\t\t\treturn Iterator(this->_container, indx(this->_pos+1, this->_container->length()));\r\n\t\t}\r\n\r\n\t\tIterator prev(void) const {\r\n\t\t\treturn Iterator(this->_container, indx(this->_pos-1, this->_container->length()));\r\n\t\t}\r\n\t};\r\n\r\n\ttemplate <class object_t>\r\n\tclass Interface\r\n\t{\r\n\tpublic:\r\n\t\tvirtual ~Interface() {};\r\n\r\n\t\tvirtual Iterator<object_t> begin(void) const {\r\n\t\t\treturn Iterator<object_t>(this, 0);\r\n\t\t}\r\n\r\n\t\tvirtual Iterator<object_t> end(void) const {\r\n\t\t\treturn Iterator<object_t>(this, this->length());\r\n\t\t}\r\n\r\n\t\tvirtual object_t front(void) const {\r\n\t\t\treturn this->at(0);\r\n\t\t}\r\n\r\n\t\tvirtual object_t back(void) const {\r\n\t\t\treturn this->at(this->length()-1);\r\n\t\t}\r\n\r\n\t\tvirtual object_t at(uint32_t index) const = 0;\r\n\t\tvirtual uint32_t length(void) const = 0;\r\n\t};\r\n}\r\n\r\n#endif /* ITERABLE_H_ */\r\n"
  },
  {
    "path": "OptolithiumC/include/opl_log.h",
    "content": "/*\n * opl_log.h\n *\n *  Created on: Jul 22, 2014\n *      Author: batman\n */\n\n#ifndef OPL_LOG_H_\n#define OPL_LOG_H_\n\n#include <easylogging++.h>\n\nclass OptolithiumCoreLog {\npublic:\n\tOptolithiumCoreLog(void);\n\tvirtual ~OptolithiumCoreLog(void);\n\tvoid set_verbose_level(int level);\n\tvoid log(const std::string &message);\n\tvoid vlog(const std::string &message, int level=4);\n};\n\n\n#endif /* OPL_LOG_H_ */\n"
  },
  {
    "path": "OptolithiumC/include/opl_misc.h",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#ifndef OPL_MISC_H_\n#define OPL_MISC_H_\n\n#if !defined(SWIG)\nnamespace misc {\n\tinline void swap(double& a, double& b) {\n\t\tdouble tmp = b;\n\t\tb = a;\n\t\ta = tmp;\n\t}\n\n\tinline double round_to(double value, double precision) {\n\t\treturn round(value / precision) * precision;\n\t}\n\n\ttemplate <class cls>\n\tinline bool safe_vector_equal(\n\t\t\tconst std::vector<std::shared_ptr<cls>>& v1,\n\t\t\tconst std::vector<std::shared_ptr<cls>>& v2) {\n\t\treturn v1.size() == v2.size() && std::equal(v1.begin(), v1.end(), v2.begin(),\n\t\t\t[] (const std::shared_ptr<cls>& a, const std::shared_ptr<cls>& b) -> bool {return *a == *b;});\n\t}\n\n\t// Rotate arma::mat counter-clockwise\n\ttemplate <class cls>\n\tinline cls rot90(cls array) {\n\t\tcls result = cls(array.n_cols, array.n_rows);\n\t\tfor (uint32_t r = 0; r < array.n_rows; r++) {\n\t\t\tfor (uint32_t c = 0; c < array.n_cols; c++) {\n\t\t\t\tresult(array.n_cols - c - 1, r) = array(r, c);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n}\n#endif\n\n\n\n#endif /* OPL_MISC_H_ */\n"
  },
  {
    "path": "OptolithiumC/include/opl_physc.h",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#ifndef OPL_PHYSC_H_\n#define OPL_PHYSC_H_\n\n#include <complex>\n\nnamespace physc {\n\n\t// Ideal gas constant (kcal/K/mol)\n\tconstexpr double R = 1.987204118e-3;\n\n\t// Absolute zero temperature (C)\n\tconstexpr double T0 = -273.15;\n\n\t// Refractive index in air\n\tconstexpr std::complex<double> air_nk = std::complex<double>(1.0002926, 0.0);\n\n\t// Speed of Light (m/s)\n\tconstexpr double c = 299792458;\n}\n\n\n#endif /* OPL_PHYSC_H_ */\n"
  },
  {
    "path": "OptolithiumC/include/opl_sim.h",
    "content": "/*\r\n *\r\n * This file is part of Optolithium lithography modelling software.\r\n *\r\n * Copyright (C) 2015 Alexei Gladkikh\r\n *\r\n * This software is dual-licensed: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 2 of the License, or\r\n * (at your option) any later version only for NON-COMMERCIAL usage.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program; if not, write to the Free Software\r\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n *\r\n * If you are interested in other licensing models, including a commercial-\r\n * license, please contact the author at gladkikhalexei@gmail.com\r\n *\r\n */\r\n\r\n#ifndef OPL_SIM_H_\r\n#define OPL_SIM_H_\r\n\r\n#include \"opl_capi.h\"\r\n\r\nusing namespace oplc;\r\n\r\nSharedDiffraction diffraction(SharedImagingTool imaging_tools, SharedMask mask);\r\nSharedResistVolume aerial_image(SharedDiffraction diffraction, SharedOpticalTransferFunction otf, double stepxy);\r\nSharedResistVolume image_in_resist(SharedDiffraction diffraction,\r\n\t\tSharedOpticalTransferFunction otf, double stepxy, double stepz);\r\nSharedResistVolume latent_image(SharedResistVolume image_in_resist,\r\n\t\tSharedResistWaferLayer resist, SharedExposure exposure);\r\nSharedResistVolume peb_latent_image(SharedResistVolume latent_image,\r\n\t\tSharedResistWaferLayer resist, SharedPostExposureBake peb);\r\nSharedResistVolume develop_time_contours(SharedResistVolume peb_latent_image, SharedResistWaferLayer resist);\r\nSharedResistProfile resist_profile(SharedResistVolume develop_times, SharedDevelopment development);\r\n\r\n#endif /* OPL_SIM_H_ */\r\n"
  },
  {
    "path": "OptolithiumC/include/optolithium.h",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#ifndef OPTOLITHIUM_SDK_H_\n#define OPTOLITHIUM_SDK_H_\n\n#include <stdlib.h>\n#include <math.h>\n#include <float.h>\n#include <complex.h>\n\n\n#if defined _WIN32 || defined __CYGWIN__\n    #ifdef __GNUC__\n        #define DLL_PUBLIC __attribute__ ((dllexport))\n    #else\n        #define DLL_PUBLIC __declspec(dllexport) // Note: actually gcc seems to also supports this syntax.\n    #endif\n    #define DLL_LOCAL\n#else\n    #if __GNUC__ >= 4\n        #define DLL_PUBLIC __attribute__ ((visibility (\"default\")))\n        #define DLL_LOCAL  __attribute__ ((visibility (\"hidden\")))\n    #else\n        #define DLL_PUBLIC\n        #define DLL_LOCAL\n    #endif\n#endif\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n// Plugin type description\ntypedef enum {\n    PLUGIN_MASK = 0,\n    PLUGIN_DEVELOPMENT_MODEL = 1,\n    PLUGIN_SOURCE_SHAPE = 2,\n    PLUGIN_ILLUMINATION = 3,\n    PLUGIN_MATERIAL = 4,\n    PLUGIN_PUPIL_FILTER = 5,\n} plugin_type_t;\n\n\n// Plugin entry point type: this structure must export each shared library to being plugin\ntypedef struct {\n    plugin_type_t plugin_type;\n    const void* plugin_entry;\n} plugin_descriptor_t;\n\n\n#define INT(value) (int[]){value}\n#define DBL(value) (double[]){value}\n\n\ntypedef struct {\n    const char *name;\n    double defv;\n    double *min;\n    double *max;\n} standard_plugin_arg_t;\n\n\n// ====================================================================================================================\n// Development model plugin descriptions types\n// ====================================================================================================================\ntypedef double (*rate_model_expr_t)(double pac, double depth, const void *args);\n\ntypedef standard_plugin_arg_t dev_model_arg_t;\n\ntypedef struct {\n    const int *prolith_id;\n    const char *name;\n    const char *desc;\n    rate_model_expr_t expression;\n    const int args_count;\n    const dev_model_arg_t (*args)[];\n} dev_model_t;\n\n// ====================================================================================================================\n// Mask plugin descriptions types\n// ====================================================================================================================\ntypedef enum {\n    MASK_TYPE_1D = 1,\n    MASK_TYPE_2D = 2\n} mask_type_t;\n\ntypedef struct {\n    double x;\n    double y;\n} mask_point_t;\n\ntypedef struct {\n    double transmittance;\n    double phase;\n    int length;\n    mask_point_t *points;\n} mask_region_t;\n\ntypedef struct {\n    mask_region_t boundary;\n    int regions_count;\n    mask_region_t *regions;\n} mask_t;\n\ntypedef int (*mask_create_t)(mask_t *mask, void *parameters);\n\ntypedef standard_plugin_arg_t mask_parameter_t;\n\ntypedef struct {\n    const char *name;\n    const char *desc;\n    \n    const mask_type_t type;\n    \n    mask_create_t create;\n    \n    const int parameters_count;\n    const mask_parameter_t (*parameters)[];\n} mask_plugin_t;\n\n\n// ====================================================================================================================\n// Source shape plugin interface\n// ====================================================================================================================\ntypedef double (*source_shape_expr_t)(double sx, double sy, const void *args);\n\ntypedef standard_plugin_arg_t source_shape_arg_t;\n\ntypedef struct {\n    const char *name;\n    const char *desc;\n    source_shape_expr_t expression;\n    const int args_count;\n    const source_shape_arg_t (*args)[];\n} source_shape_plugin_t;\n\n// ====================================================================================================================\n// Pupil filter plugin interface\n// ====================================================================================================================\ntypedef double _Complex (*pupil_filter_expr_t)(double cx, double cy, const void *args);\n\ntypedef standard_plugin_arg_t pupil_filter_arg_t;\n\ntypedef struct {\n    const char *name;\n    const char *desc;\n    pupil_filter_expr_t expression;\n    const int args_count;\n    const pupil_filter_arg_t (*args)[];\n} pupil_filter_plugin_t;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /*OPTOLITHIUM_SDK_H_*/\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n#ifndef ARMA_INCLUDES\n#define ARMA_INCLUDES\n\n\n#include <cstdlib>\n#include <cstring>\n#include <climits>\n#include <cmath>\n#include <ctime>\n#include <cstdio>\n\n#include <iostream>\n#include <fstream>\n#include <sstream>\n#include <stdexcept>\n#include <new>\n#include <limits>\n#include <algorithm>\n#include <complex>\n#include <vector>\n\n\n#if ( defined(__unix__) || defined(__unix) || defined(_POSIX_C_SOURCE) || (defined(__APPLE__) && defined(__MACH__)) ) && !defined(_WIN32)\n  #include <unistd.h>\n#endif\n\n\n#if (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L))\n  #include <sys/time.h>\n#endif\n\n\n#if (__cplusplus >= 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X__)\n  #undef  ARMA_USE_CXX11\n  #define ARMA_USE_CXX11\n#endif\n\n\n#include \"armadillo_bits/config.hpp\"\n#include \"armadillo_bits/compiler_setup.hpp\"\n\n\n#if defined(ARMA_USE_CXX11)\n  #include <initializer_list>\n  #include <cstdint>\n  #include <random>\n  #if !defined(ARMA_DONT_USE_CXX11_CHRONO)\n    #include <chrono>\n  #endif\n#endif\n\n\n#if defined(ARMA_USE_TBB_ALLOC)\n  #include <tbb/scalable_allocator.h>\n#endif\n\n\n#if defined(ARMA_USE_MKL_ALLOC)\n  #include <mkl_service.h>\n#endif\n\n\n#if !defined(ARMA_USE_CXX11)\n  #if defined(ARMA_HAVE_TR1)\n    #include <tr1/cmath>\n    #include <tr1/complex>\n  #endif\n#endif\n\n\n#include \"armadillo_bits/include_atlas.hpp\"\n#include \"armadillo_bits/include_hdf5.hpp\"\n#include \"armadillo_bits/include_superlu.hpp\"\n\n\n#if defined(_OPENMP)\n  #include <omp.h>\n#endif\n\n\n\n//! \\namespace arma namespace for Armadillo classes and functions\nnamespace arma\n  {\n  \n  // preliminaries\n  \n  #include \"armadillo_bits/forward_bones.hpp\"\n  #include \"armadillo_bits/arma_static_check.hpp\"\n  #include \"armadillo_bits/typedef_elem.hpp\"\n  #include \"armadillo_bits/typedef_elem_check.hpp\"\n  #include \"armadillo_bits/typedef_mat.hpp\"\n  #include \"armadillo_bits/arma_boost.hpp\"\n  #include \"armadillo_bits/arma_version.hpp\"\n  #include \"armadillo_bits/arma_config.hpp\"\n  #include \"armadillo_bits/traits.hpp\"\n  #include \"armadillo_bits/promote_type.hpp\"\n  #include \"armadillo_bits/upgrade_val.hpp\"\n  #include \"armadillo_bits/restrictors.hpp\"\n  #include \"armadillo_bits/access.hpp\"\n  #include \"armadillo_bits/span.hpp\"\n  #include \"armadillo_bits/distr_param.hpp\"\n  #include \"armadillo_bits/constants.hpp\"\n  #include \"armadillo_bits/constants_compat.hpp\"\n  \n  #ifdef ARMA_RNG_ALT\n    #include ARMA_INCFILE_WRAP(ARMA_RNG_ALT)\n  #else\n    #include \"armadillo_bits/arma_rng_cxx98.hpp\"\n  #endif\n  \n  #include \"armadillo_bits/arma_rng_cxx11.hpp\"\n  #include \"armadillo_bits/arma_rng.hpp\"\n  \n  \n  //\n  // class prototypes\n  \n  #include \"armadillo_bits/Base_bones.hpp\"\n  #include \"armadillo_bits/BaseCube_bones.hpp\"\n  #include \"armadillo_bits/SpBase_bones.hpp\"\n  \n  #include \"armadillo_bits/blas_bones.hpp\"\n  #include \"armadillo_bits/lapack_bones.hpp\"\n  #include \"armadillo_bits/atlas_bones.hpp\"\n  #include \"armadillo_bits/arpack_bones.hpp\"\n  #include \"armadillo_bits/superlu_bones.hpp\"\n  #include \"armadillo_bits/hdf5_bones.hpp\"\n  \n  #include \"armadillo_bits/blas_wrapper.hpp\"\n  #include \"armadillo_bits/lapack_wrapper.hpp\"\n  #include \"armadillo_bits/atlas_wrapper.hpp\"\n  #include \"armadillo_bits/arpack_wrapper.hpp\"\n  #include \"armadillo_bits/superlu_wrapper.hpp\"\n  \n  #include \"armadillo_bits/cond_rel_bones.hpp\"\n  #include \"armadillo_bits/arrayops_bones.hpp\"\n  #include \"armadillo_bits/podarray_bones.hpp\"\n  #include \"armadillo_bits/auxlib_bones.hpp\"\n  #include \"armadillo_bits/sp_auxlib_bones.hpp\"\n  \n  #include \"armadillo_bits/injector_bones.hpp\"\n  \n  #include \"armadillo_bits/Mat_bones.hpp\"\n  #include \"armadillo_bits/Col_bones.hpp\"\n  #include \"armadillo_bits/Row_bones.hpp\"\n  #include \"armadillo_bits/Cube_bones.hpp\"\n  #include \"armadillo_bits/xvec_htrans_bones.hpp\"\n  #include \"armadillo_bits/xtrans_mat_bones.hpp\"\n  #include \"armadillo_bits/SizeMat_bones.hpp\"\n  #include \"armadillo_bits/SizeCube_bones.hpp\"\n    \n  #include \"armadillo_bits/SpValProxy_bones.hpp\"\n  #include \"armadillo_bits/SpMat_bones.hpp\"\n  #include \"armadillo_bits/SpCol_bones.hpp\"\n  #include \"armadillo_bits/SpRow_bones.hpp\"\n  #include \"armadillo_bits/SpSubview_bones.hpp\"\n  #include \"armadillo_bits/spdiagview_bones.hpp\"\n  \n  #include \"armadillo_bits/typedef_mat_fixed.hpp\"\n  \n  #include \"armadillo_bits/field_bones.hpp\"\n  #include \"armadillo_bits/subview_bones.hpp\"\n  #include \"armadillo_bits/subview_elem1_bones.hpp\"\n  #include \"armadillo_bits/subview_elem2_bones.hpp\"\n  #include \"armadillo_bits/subview_field_bones.hpp\"\n  #include \"armadillo_bits/subview_cube_bones.hpp\"\n  #include \"armadillo_bits/diagview_bones.hpp\"\n  #include \"armadillo_bits/subview_each_bones.hpp\"\n  \n  \n  #include \"armadillo_bits/diskio_bones.hpp\"\n  #include \"armadillo_bits/wall_clock_bones.hpp\"\n  #include \"armadillo_bits/running_stat_bones.hpp\"\n  #include \"armadillo_bits/running_stat_vec_bones.hpp\"\n  \n  #include \"armadillo_bits/Op_bones.hpp\"\n  #include \"armadillo_bits/OpCube_bones.hpp\"\n  #include \"armadillo_bits/SpOp_bones.hpp\"\n  \n  #include \"armadillo_bits/eOp_bones.hpp\"\n  #include \"armadillo_bits/eOpCube_bones.hpp\"\n  \n  #include \"armadillo_bits/mtOp_bones.hpp\"\n  #include \"armadillo_bits/mtOpCube_bones.hpp\"\n  #include \"armadillo_bits/mtSpOp_bones.hpp\"\n  \n  #include \"armadillo_bits/Glue_bones.hpp\"\n  #include \"armadillo_bits/eGlue_bones.hpp\"\n  #include \"armadillo_bits/mtGlue_bones.hpp\"\n  #include \"armadillo_bits/SpGlue_bones.hpp\"\n  \n  #include \"armadillo_bits/GlueCube_bones.hpp\"\n  #include \"armadillo_bits/eGlueCube_bones.hpp\"\n  #include \"armadillo_bits/mtGlueCube_bones.hpp\"\n  \n  #include \"armadillo_bits/eop_core_bones.hpp\"\n  #include \"armadillo_bits/eglue_core_bones.hpp\"\n  \n  #include \"armadillo_bits/Gen_bones.hpp\"\n  #include \"armadillo_bits/GenCube_bones.hpp\"\n  \n  #include \"armadillo_bits/op_diagmat_bones.hpp\"\n  #include \"armadillo_bits/op_diagvec_bones.hpp\"\n  #include \"armadillo_bits/op_dot_bones.hpp\"\n  #include \"armadillo_bits/op_inv_bones.hpp\"\n  #include \"armadillo_bits/op_htrans_bones.hpp\"\n  #include \"armadillo_bits/op_max_bones.hpp\"\n  #include \"armadillo_bits/op_min_bones.hpp\"\n  #include \"armadillo_bits/op_mean_bones.hpp\"\n  #include \"armadillo_bits/op_median_bones.hpp\"\n  #include \"armadillo_bits/op_sort_bones.hpp\"\n  #include \"armadillo_bits/op_sort_index_bones.hpp\"\n  #include \"armadillo_bits/op_sum_bones.hpp\"\n  #include \"armadillo_bits/op_stddev_bones.hpp\"\n  #include \"armadillo_bits/op_strans_bones.hpp\"\n  #include \"armadillo_bits/op_var_bones.hpp\"\n  #include \"armadillo_bits/op_repmat_bones.hpp\"\n  #include \"armadillo_bits/op_reshape_bones.hpp\"\n  #include \"armadillo_bits/op_vectorise_bones.hpp\"\n  #include \"armadillo_bits/op_resize_bones.hpp\"\n  #include \"armadillo_bits/op_cov_bones.hpp\"\n  #include \"armadillo_bits/op_cor_bones.hpp\"\n  #include \"armadillo_bits/op_shuffle_bones.hpp\"\n  #include \"armadillo_bits/op_prod_bones.hpp\"\n  #include \"armadillo_bits/op_pinv_bones.hpp\"\n  #include \"armadillo_bits/op_dotext_bones.hpp\"\n  #include \"armadillo_bits/op_flip_bones.hpp\"\n  #include \"armadillo_bits/op_princomp_bones.hpp\"\n  #include \"armadillo_bits/op_misc_bones.hpp\"\n  #include \"armadillo_bits/op_relational_bones.hpp\"\n  #include \"armadillo_bits/op_find_bones.hpp\"\n  #include \"armadillo_bits/op_chol_bones.hpp\"\n  #include \"armadillo_bits/op_cx_scalar_bones.hpp\"\n  #include \"armadillo_bits/op_trimat_bones.hpp\"\n  #include \"armadillo_bits/op_cumsum_bones.hpp\"\n  #include \"armadillo_bits/op_symmat_bones.hpp\"\n  #include \"armadillo_bits/op_hist_bones.hpp\"\n  #include \"armadillo_bits/op_unique_bones.hpp\"\n  #include \"armadillo_bits/op_toeplitz_bones.hpp\"\n  #include \"armadillo_bits/op_fft_bones.hpp\"\n  #include \"armadillo_bits/op_any_bones.hpp\"\n  #include \"armadillo_bits/op_all_bones.hpp\"\n  #include \"armadillo_bits/op_normalise_bones.hpp\"\n  #include \"armadillo_bits/op_clamp_bones.hpp\"\n  #include \"armadillo_bits/op_expmat_bones.hpp\"\n  #include \"armadillo_bits/op_nonzeros_bones.hpp\"\n  \n  #include \"armadillo_bits/glue_times_bones.hpp\"\n  #include \"armadillo_bits/glue_mixed_bones.hpp\"\n  #include \"armadillo_bits/glue_cov_bones.hpp\"\n  #include \"armadillo_bits/glue_cor_bones.hpp\"\n  #include \"armadillo_bits/glue_kron_bones.hpp\"\n  #include \"armadillo_bits/glue_cross_bones.hpp\"\n  #include \"armadillo_bits/glue_join_bones.hpp\"\n  #include \"armadillo_bits/glue_relational_bones.hpp\"\n  #include \"armadillo_bits/glue_solve_bones.hpp\"\n  #include \"armadillo_bits/glue_conv_bones.hpp\"\n  #include \"armadillo_bits/glue_toeplitz_bones.hpp\"\n  #include \"armadillo_bits/glue_hist_bones.hpp\"\n  #include \"armadillo_bits/glue_histc_bones.hpp\"\n  #include \"armadillo_bits/glue_max_bones.hpp\"\n  #include \"armadillo_bits/glue_min_bones.hpp\"\n  \n  #include \"armadillo_bits/spop_max_bones.hpp\"\n  #include \"armadillo_bits/spop_min_bones.hpp\"\n  #include \"armadillo_bits/spop_sum_bones.hpp\"\n  #include \"armadillo_bits/spop_strans_bones.hpp\"\n  #include \"armadillo_bits/spop_htrans_bones.hpp\"\n  #include \"armadillo_bits/spop_misc_bones.hpp\"\n  #include \"armadillo_bits/spop_mean_bones.hpp\"\n  #include \"armadillo_bits/spop_var_bones.hpp\"\n  \n  #include \"armadillo_bits/spglue_plus_bones.hpp\"\n  #include \"armadillo_bits/spglue_minus_bones.hpp\"\n  #include \"armadillo_bits/spglue_times_bones.hpp\"\n  #include \"armadillo_bits/spglue_join_bones.hpp\"\n  \n  //\n  // low-level debugging and memory handling functions\n  \n  #include \"armadillo_bits/debug.hpp\"\n  #include \"armadillo_bits/memory.hpp\"\n  \n  //\n  // wrappers for various cmath functions\n  \n  #include \"armadillo_bits/arma_cmath.hpp\"\n  \n  //\n  // classes that underlay metaprogramming \n  \n  #include \"armadillo_bits/unwrap.hpp\"\n  #include \"armadillo_bits/unwrap_cube.hpp\"\n  #include \"armadillo_bits/unwrap_spmat.hpp\"\n  \n  #include \"armadillo_bits/Proxy.hpp\"\n  #include \"armadillo_bits/ProxyCube.hpp\"\n  #include \"armadillo_bits/SpProxy.hpp\"\n  \n  #include \"armadillo_bits/diagmat_proxy.hpp\"\n\n  #include \"armadillo_bits/strip.hpp\"\n  \n  #include \"armadillo_bits/Op_meat.hpp\"\n  #include \"armadillo_bits/OpCube_meat.hpp\"\n  #include \"armadillo_bits/SpOp_meat.hpp\"\n  \n  #include \"armadillo_bits/mtOp_meat.hpp\"\n  #include \"armadillo_bits/mtOpCube_meat.hpp\"\n  #include \"armadillo_bits/mtSpOp_meat.hpp\"\n  \n  #include \"armadillo_bits/Glue_meat.hpp\"\n  #include \"armadillo_bits/GlueCube_meat.hpp\"\n  #include \"armadillo_bits/SpGlue_meat.hpp\"\n  \n  #include \"armadillo_bits/eop_aux.hpp\"\n  \n  #include \"armadillo_bits/eOp_meat.hpp\"\n  #include \"armadillo_bits/eOpCube_meat.hpp\"\n  \n  #include \"armadillo_bits/eGlue_meat.hpp\"\n  #include \"armadillo_bits/eGlueCube_meat.hpp\"\n\n  #include \"armadillo_bits/mtGlue_meat.hpp\"\n  #include \"armadillo_bits/mtGlueCube_meat.hpp\"\n  \n  #include \"armadillo_bits/Base_meat.hpp\"\n  #include \"armadillo_bits/BaseCube_meat.hpp\"\n  #include \"armadillo_bits/SpBase_meat.hpp\"\n  \n  #include \"armadillo_bits/Gen_meat.hpp\"\n  #include \"armadillo_bits/GenCube_meat.hpp\"\n  \n  //\n  // ostream\n  \n  #include \"armadillo_bits/arma_ostream_bones.hpp\"\n  #include \"armadillo_bits/arma_ostream_meat.hpp\"\n  \n  //\n  // n_unique, which is used by some sparse operators\n\n  #include \"armadillo_bits/fn_n_unique.hpp\"\n  \n  //\n  // operators\n  \n  #include \"armadillo_bits/operator_plus.hpp\"\n  #include \"armadillo_bits/operator_minus.hpp\"\n  #include \"armadillo_bits/operator_times.hpp\"\n  #include \"armadillo_bits/operator_schur.hpp\"\n  #include \"armadillo_bits/operator_div.hpp\"\n  #include \"armadillo_bits/operator_relational.hpp\"\n  \n  #include \"armadillo_bits/operator_cube_plus.hpp\"\n  #include \"armadillo_bits/operator_cube_minus.hpp\"\n  #include \"armadillo_bits/operator_cube_times.hpp\"\n  #include \"armadillo_bits/operator_cube_schur.hpp\"\n  #include \"armadillo_bits/operator_cube_div.hpp\"\n  #include \"armadillo_bits/operator_cube_relational.hpp\"\n  \n  #include \"armadillo_bits/operator_ostream.hpp\"\n  \n  //\n  // user accessible functions\n  \n  // the order of the fn_*.hpp include files matters,\n  // as some files require functionality given in preceding files\n  \n  #include \"armadillo_bits/fn_conv_to.hpp\"\n  #include \"armadillo_bits/fn_min.hpp\"\n  #include \"armadillo_bits/fn_max.hpp\"\n  #include \"armadillo_bits/fn_accu.hpp\"\n  #include \"armadillo_bits/fn_sum.hpp\"\n  #include \"armadillo_bits/fn_diagmat.hpp\"\n  #include \"armadillo_bits/fn_diagvec.hpp\"\n  #include \"armadillo_bits/fn_inv.hpp\"\n  #include \"armadillo_bits/fn_trace.hpp\"\n  #include \"armadillo_bits/fn_trans.hpp\"\n  #include \"armadillo_bits/fn_det.hpp\"\n  #include \"armadillo_bits/fn_log_det.hpp\"\n  #include \"armadillo_bits/fn_eig_sym.hpp\"\n  #include \"armadillo_bits/fn_eig_gen.hpp\"\n  #include \"armadillo_bits/fn_eig_pair.hpp\"\n  #include \"armadillo_bits/fn_lu.hpp\"\n  #include \"armadillo_bits/fn_zeros.hpp\"\n  #include \"armadillo_bits/fn_ones.hpp\"\n  #include \"armadillo_bits/fn_eye.hpp\"\n  #include \"armadillo_bits/fn_misc.hpp\"\n  #include \"armadillo_bits/fn_find.hpp\"\n  #include \"armadillo_bits/fn_elem.hpp\"\n  #include \"armadillo_bits/fn_norm.hpp\"\n  #include \"armadillo_bits/fn_dot.hpp\"\n  #include \"armadillo_bits/fn_randu.hpp\"\n  #include \"armadillo_bits/fn_randn.hpp\"\n  #include \"armadillo_bits/fn_trig.hpp\"\n  #include \"armadillo_bits/fn_mean.hpp\"\n  #include \"armadillo_bits/fn_median.hpp\"\n  #include \"armadillo_bits/fn_stddev.hpp\"\n  #include \"armadillo_bits/fn_var.hpp\"\n  #include \"armadillo_bits/fn_sort.hpp\"\n  #include \"armadillo_bits/fn_sort_index.hpp\"\n  #include \"armadillo_bits/fn_strans.hpp\"\n  #include \"armadillo_bits/fn_chol.hpp\"\n  #include \"armadillo_bits/fn_qr.hpp\"\n  #include \"armadillo_bits/fn_svd.hpp\"\n  #include \"armadillo_bits/fn_solve.hpp\"\n  #include \"armadillo_bits/fn_repmat.hpp\"\n  #include \"armadillo_bits/fn_reshape.hpp\"\n  #include \"armadillo_bits/fn_vectorise.hpp\"\n  #include \"armadillo_bits/fn_resize.hpp\"\n  #include \"armadillo_bits/fn_cov.hpp\"\n  #include \"armadillo_bits/fn_cor.hpp\"\n  #include \"armadillo_bits/fn_shuffle.hpp\"\n  #include \"armadillo_bits/fn_prod.hpp\"\n  #include \"armadillo_bits/fn_eps.hpp\"\n  #include \"armadillo_bits/fn_pinv.hpp\"\n  #include \"armadillo_bits/fn_rank.hpp\"\n  #include \"armadillo_bits/fn_kron.hpp\"\n  #include \"armadillo_bits/fn_flip.hpp\"\n  #include \"armadillo_bits/fn_as_scalar.hpp\"\n  #include \"armadillo_bits/fn_princomp.hpp\"\n  #include \"armadillo_bits/fn_cross.hpp\"\n  #include \"armadillo_bits/fn_join.hpp\"\n  #include \"armadillo_bits/fn_conv.hpp\"\n  #include \"armadillo_bits/fn_trunc_exp.hpp\"\n  #include \"armadillo_bits/fn_trunc_log.hpp\"\n  #include \"armadillo_bits/fn_toeplitz.hpp\"\n  #include \"armadillo_bits/fn_trimat.hpp\"\n  #include \"armadillo_bits/fn_cumsum.hpp\"\n  #include \"armadillo_bits/fn_symmat.hpp\"\n  #include \"armadillo_bits/fn_syl_lyap.hpp\"\n  #include \"armadillo_bits/fn_hist.hpp\"\n  #include \"armadillo_bits/fn_histc.hpp\"\n  #include \"armadillo_bits/fn_unique.hpp\"\n  #include \"armadillo_bits/fn_fft.hpp\"\n  #include \"armadillo_bits/fn_fft2.hpp\"\n  #include \"armadillo_bits/fn_any.hpp\"\n  #include \"armadillo_bits/fn_all.hpp\"\n  #include \"armadillo_bits/fn_size.hpp\"\n  #include \"armadillo_bits/fn_numel.hpp\"\n  #include \"armadillo_bits/fn_inplace_strans.hpp\"\n  #include \"armadillo_bits/fn_inplace_trans.hpp\"\n  #include \"armadillo_bits/fn_randi.hpp\"\n  #include \"armadillo_bits/fn_randg.hpp\"\n  #include \"armadillo_bits/fn_cond.hpp\"\n  #include \"armadillo_bits/fn_normalise.hpp\"\n  #include \"armadillo_bits/fn_clamp.hpp\"\n  #include \"armadillo_bits/fn_expmat.hpp\"\n  #include \"armadillo_bits/fn_nonzeros.hpp\"\n  #include \"armadillo_bits/fn_interp1.hpp\"\n  #include \"armadillo_bits/fn_qz.hpp\"\n  \n  #include \"armadillo_bits/fn_speye.hpp\"\n  #include \"armadillo_bits/fn_spones.hpp\"\n  #include \"armadillo_bits/fn_sprandn.hpp\"\n  #include \"armadillo_bits/fn_sprandu.hpp\"\n  #include \"armadillo_bits/fn_eigs_sym.hpp\"\n  #include \"armadillo_bits/fn_eigs_gen.hpp\"\n  #include \"armadillo_bits/fn_norm_sparse.hpp\"\n  #include \"armadillo_bits/fn_spsolve.hpp\"\n  #include \"armadillo_bits/fn_svds.hpp\"\n  \n  //\n  // misc stuff\n  \n  #include \"armadillo_bits/hdf5_misc.hpp\"\n  #include \"armadillo_bits/fft_engine.hpp\"\n  \n  #if !defined(ARMA_BAD_COMPILER)\n    #include \"armadillo_bits/gmm_misc_bones.hpp\"\n    #include \"armadillo_bits/gmm_misc_meat.hpp\"\n    #include \"armadillo_bits/gmm_diag_bones.hpp\"\n    #include \"armadillo_bits/gmm_diag_meat.hpp\"\n  #endif\n  \n  //\n  // classes implementing various forms of dense matrix multiplication\n  \n  #include \"armadillo_bits/mul_gemv.hpp\"\n  #include \"armadillo_bits/mul_gemm.hpp\"\n  #include \"armadillo_bits/mul_gemm_mixed.hpp\"\n  #include \"armadillo_bits/mul_syrk.hpp\"\n  #include \"armadillo_bits/mul_herk.hpp\"\n  \n  //\n  // class meat\n  \n  #include \"armadillo_bits/eop_core_meat.hpp\"\n  #include \"armadillo_bits/eglue_core_meat.hpp\"\n  \n  #include \"armadillo_bits/cond_rel_meat.hpp\"\n  #include \"armadillo_bits/arrayops_meat.hpp\"\n  #include \"armadillo_bits/podarray_meat.hpp\"\n  #include \"armadillo_bits/auxlib_meat.hpp\"\n  #include \"armadillo_bits/sp_auxlib_meat.hpp\"\n  \n  #include \"armadillo_bits/injector_meat.hpp\"\n  \n  #include \"armadillo_bits/Mat_meat.hpp\"\n  #include \"armadillo_bits/Col_meat.hpp\"\n  #include \"armadillo_bits/Row_meat.hpp\"\n  #include \"armadillo_bits/Cube_meat.hpp\"\n  #include \"armadillo_bits/xvec_htrans_meat.hpp\"\n  #include \"armadillo_bits/xtrans_mat_meat.hpp\"\n  #include \"armadillo_bits/SizeMat_meat.hpp\"\n  #include \"armadillo_bits/SizeCube_meat.hpp\"\n  \n  #include \"armadillo_bits/field_meat.hpp\"\n  #include \"armadillo_bits/subview_meat.hpp\"\n  #include \"armadillo_bits/subview_elem1_meat.hpp\"\n  #include \"armadillo_bits/subview_elem2_meat.hpp\"\n  #include \"armadillo_bits/subview_field_meat.hpp\"\n  #include \"armadillo_bits/subview_cube_meat.hpp\"\n  #include \"armadillo_bits/diagview_meat.hpp\"\n  #include \"armadillo_bits/subview_each_meat.hpp\"\n\n  #include \"armadillo_bits/SpValProxy_meat.hpp\"\n  #include \"armadillo_bits/SpMat_meat.hpp\"\n  #include \"armadillo_bits/SpMat_iterators_meat.hpp\"\n  #include \"armadillo_bits/SpCol_meat.hpp\"\n  #include \"armadillo_bits/SpRow_meat.hpp\"\n  #include \"armadillo_bits/SpSubview_meat.hpp\"\n  #include \"armadillo_bits/SpSubview_iterators_meat.hpp\"\n  #include \"armadillo_bits/spdiagview_meat.hpp\"\n  \n  #include \"armadillo_bits/diskio_meat.hpp\"\n  #include \"armadillo_bits/wall_clock_meat.hpp\"\n  #include \"armadillo_bits/running_stat_meat.hpp\"\n  #include \"armadillo_bits/running_stat_vec_meat.hpp\"\n  \n  #include \"armadillo_bits/op_diagmat_meat.hpp\"\n  #include \"armadillo_bits/op_diagvec_meat.hpp\"\n  #include \"armadillo_bits/op_dot_meat.hpp\"\n  #include \"armadillo_bits/op_inv_meat.hpp\"\n  #include \"armadillo_bits/op_htrans_meat.hpp\"\n  #include \"armadillo_bits/op_max_meat.hpp\"\n  #include \"armadillo_bits/op_min_meat.hpp\"\n  #include \"armadillo_bits/op_mean_meat.hpp\"\n  #include \"armadillo_bits/op_median_meat.hpp\"\n  #include \"armadillo_bits/op_sort_meat.hpp\"\n  #include \"armadillo_bits/op_sort_index_meat.hpp\"\n  #include \"armadillo_bits/op_sum_meat.hpp\"\n  #include \"armadillo_bits/op_stddev_meat.hpp\"\n  #include \"armadillo_bits/op_strans_meat.hpp\"\n  #include \"armadillo_bits/op_var_meat.hpp\"\n  #include \"armadillo_bits/op_repmat_meat.hpp\"\n  #include \"armadillo_bits/op_reshape_meat.hpp\"\n  #include \"armadillo_bits/op_vectorise_meat.hpp\"\n  #include \"armadillo_bits/op_resize_meat.hpp\"\n  #include \"armadillo_bits/op_cov_meat.hpp\"\n  #include \"armadillo_bits/op_cor_meat.hpp\"\n  #include \"armadillo_bits/op_shuffle_meat.hpp\"\n  #include \"armadillo_bits/op_prod_meat.hpp\"\n  #include \"armadillo_bits/op_pinv_meat.hpp\"\n  #include \"armadillo_bits/op_dotext_meat.hpp\"\n  #include \"armadillo_bits/op_flip_meat.hpp\"\n  #include \"armadillo_bits/op_princomp_meat.hpp\"\n  #include \"armadillo_bits/op_misc_meat.hpp\"\n  #include \"armadillo_bits/op_relational_meat.hpp\"\n  #include \"armadillo_bits/op_find_meat.hpp\"\n  #include \"armadillo_bits/op_chol_meat.hpp\"\n  #include \"armadillo_bits/op_cx_scalar_meat.hpp\"\n  #include \"armadillo_bits/op_trimat_meat.hpp\"\n  #include \"armadillo_bits/op_cumsum_meat.hpp\"\n  #include \"armadillo_bits/op_symmat_meat.hpp\"\n  #include \"armadillo_bits/op_hist_meat.hpp\"\n  #include \"armadillo_bits/op_unique_meat.hpp\"\n  #include \"armadillo_bits/op_toeplitz_meat.hpp\"\n  #include \"armadillo_bits/op_fft_meat.hpp\"\n  #include \"armadillo_bits/op_any_meat.hpp\"\n  #include \"armadillo_bits/op_all_meat.hpp\"\n  #include \"armadillo_bits/op_normalise_meat.hpp\"\n  #include \"armadillo_bits/op_clamp_meat.hpp\"\n  #include \"armadillo_bits/op_expmat_meat.hpp\"\n  #include \"armadillo_bits/op_nonzeros_meat.hpp\"\n  \n  #include \"armadillo_bits/glue_times_meat.hpp\"\n  #include \"armadillo_bits/glue_mixed_meat.hpp\"\n  #include \"armadillo_bits/glue_cov_meat.hpp\"\n  #include \"armadillo_bits/glue_cor_meat.hpp\"\n  #include \"armadillo_bits/glue_kron_meat.hpp\"\n  #include \"armadillo_bits/glue_cross_meat.hpp\"\n  #include \"armadillo_bits/glue_join_meat.hpp\"\n  #include \"armadillo_bits/glue_relational_meat.hpp\"\n  #include \"armadillo_bits/glue_solve_meat.hpp\"\n  #include \"armadillo_bits/glue_conv_meat.hpp\"\n  #include \"armadillo_bits/glue_toeplitz_meat.hpp\"\n  #include \"armadillo_bits/glue_hist_meat.hpp\"\n  #include \"armadillo_bits/glue_histc_meat.hpp\"\n  #include \"armadillo_bits/glue_max_meat.hpp\"\n  #include \"armadillo_bits/glue_min_meat.hpp\"\n  \n  #include \"armadillo_bits/spop_max_meat.hpp\"\n  #include \"armadillo_bits/spop_min_meat.hpp\"\n  #include \"armadillo_bits/spop_sum_meat.hpp\"\n  #include \"armadillo_bits/spop_strans_meat.hpp\"\n  #include \"armadillo_bits/spop_htrans_meat.hpp\"\n  #include \"armadillo_bits/spop_misc_meat.hpp\"\n  #include \"armadillo_bits/spop_mean_meat.hpp\"\n  #include \"armadillo_bits/spop_var_meat.hpp\"\n  \n  #include \"armadillo_bits/spglue_plus_meat.hpp\"\n  #include \"armadillo_bits/spglue_minus_meat.hpp\"\n  #include \"armadillo_bits/spglue_times_meat.hpp\"\n  #include \"armadillo_bits/spglue_join_meat.hpp\"\n  }\n\n\n\n#include \"armadillo_bits/compiler_setup_post.hpp\"\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/BaseCube_bones.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup BaseCube\n//! @{\n\n\n\ntemplate<typename elem_type, typename derived>\nstruct BaseCube_eval_Cube\n  {\n  arma_inline const derived& eval() const;\n  };\n\n\ntemplate<typename elem_type, typename derived>\nstruct BaseCube_eval_expr\n  {\n  arma_inline Cube<elem_type> eval() const;   //!< force the immediate evaluation of a delayed expression\n  };\n\n\ntemplate<typename elem_type, typename derived, bool condition>\nstruct BaseCube_eval {};\n\ntemplate<typename elem_type, typename derived>\nstruct BaseCube_eval<elem_type, derived, true>  { typedef BaseCube_eval_Cube<elem_type, derived>  result; };\n\ntemplate<typename elem_type, typename derived>\nstruct BaseCube_eval<elem_type, derived, false> { typedef BaseCube_eval_expr<elem_type, derived> result; };\n\n\n\n//! Analog of the Base class, intended for cubes\ntemplate<typename elem_type, typename derived>\nstruct BaseCube\n  : public BaseCube_eval<elem_type, derived, is_Cube<derived>::value>::result\n  {\n  arma_inline const derived& get_ref() const;\n  \n  inline void print(const std::string extra_text = \"\") const;\n  inline void print(std::ostream& user_stream, const std::string extra_text = \"\") const;\n  \n  inline void raw_print(const std::string extra_text = \"\") const;\n  inline void raw_print(std::ostream& user_stream, const std::string extra_text = \"\") const;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/BaseCube_meat.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup BaseCube\n//! @{\n\n\n\ntemplate<typename elem_type, typename derived>\narma_inline\nconst derived&\nBaseCube<elem_type,derived>::get_ref() const\n  {\n  return static_cast<const derived&>(*this);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nvoid\nBaseCube<elem_type,derived>::print(const std::string extra_text) const\n  {\n  const unwrap_cube<derived> tmp( (*this).get_ref() );\n  \n  tmp.M.impl_print(extra_text);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nvoid\nBaseCube<elem_type,derived>::print(std::ostream& user_stream, const std::string extra_text) const\n  {\n  const unwrap_cube<derived> tmp( (*this).get_ref() );\n  \n  tmp.M.impl_print(user_stream, extra_text);\n  }\n  \n\n\ntemplate<typename elem_type, typename derived>\ninline\nvoid\nBaseCube<elem_type,derived>::raw_print(const std::string extra_text) const\n  {\n  const unwrap_cube<derived> tmp( (*this).get_ref() );\n  \n  tmp.M.impl_raw_print(extra_text);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nvoid\nBaseCube<elem_type,derived>::raw_print(std::ostream& user_stream, const std::string extra_text) const\n  {\n  const unwrap_cube<derived> tmp( (*this).get_ref() );\n  \n  tmp.M.impl_raw_print(user_stream, extra_text);\n  }\n  \n\n\n//\n// extra functions defined in BaseCube_eval_Cube\n\ntemplate<typename elem_type, typename derived>\narma_inline\nconst derived&\nBaseCube_eval_Cube<elem_type, derived>::eval() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return static_cast<const derived&>(*this);\n  }\n\n\n\n//\n// extra functions defined in BaseCube_eval_expr\n\ntemplate<typename elem_type, typename derived>\narma_inline\nCube<elem_type>\nBaseCube_eval_expr<elem_type, derived>::eval() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return Cube<elem_type>( static_cast<const derived&>(*this) );\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Base_bones.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Base\n//! @{\n\n\n\ntemplate<typename derived>\nstruct Base_inv_yes\n  {\n  arma_inline const Op<derived,op_inv> i(const bool  slow   = false) const;   //!< matrix inverse\n  arma_inline const Op<derived,op_inv> i(const char* method        ) const;   //!< matrix inverse\n  };\n\n\ntemplate<typename derived>\nstruct Base_inv_no\n  {\n  };\n\n\ntemplate<typename derived, bool condition>\nstruct Base_inv {};\n\ntemplate<typename derived>\nstruct Base_inv<derived, true>  { typedef Base_inv_yes<derived> result; };\n\ntemplate<typename derived>\nstruct Base_inv<derived, false> { typedef Base_inv_no<derived>  result; };\n\n\n\ntemplate<typename elem_type, typename derived>\nstruct Base_eval_Mat\n  {\n  arma_inline const derived& eval() const;\n  };\n\n\ntemplate<typename elem_type, typename derived>\nstruct Base_eval_expr\n  {\n  arma_inline Mat<elem_type> eval() const;   //!< force the immediate evaluation of a delayed expression\n  };\n\n\ntemplate<typename elem_type, typename derived, bool condition>\nstruct Base_eval {};\n\ntemplate<typename elem_type, typename derived>\nstruct Base_eval<elem_type, derived, true>  { typedef Base_eval_Mat<elem_type, derived>  result; };\n\ntemplate<typename elem_type, typename derived>\nstruct Base_eval<elem_type, derived, false> { typedef Base_eval_expr<elem_type, derived> result; };\n\n\n\ntemplate<typename derived>\nstruct Base_trans_cx\n  {\n  arma_inline const Op<derived,op_htrans>  t() const;\n  arma_inline const Op<derived,op_htrans> ht() const;\n  arma_inline const Op<derived,op_strans> st() const;  // simple transpose: no complex conjugates\n  };\n\n\ntemplate<typename derived>\nstruct Base_trans_default\n  {\n  arma_inline const Op<derived,op_htrans>  t() const;\n  arma_inline const Op<derived,op_htrans> ht() const;\n  arma_inline const Op<derived,op_htrans> st() const;  // return op_htrans instead of op_strans, as it's handled better by matrix multiplication code\n  };\n\n\ntemplate<typename derived, bool condition>\nstruct Base_trans {};\n\ntemplate<typename derived>\nstruct Base_trans<derived, true>  { typedef Base_trans_cx<derived>      result; };\n\ntemplate<typename derived>\nstruct Base_trans<derived, false> { typedef Base_trans_default<derived> result; };\n\n\n\n//! Class for static polymorphism, modelled after the \"Curiously Recurring Template Pattern\" (CRTP).\n//! Used for type-safe downcasting in functions that restrict their input(s) to be classes that are\n//! derived from Base (e.g. Mat, Op, Glue, diagview, subview).\n//! A Base object can be converted to a Mat object by the unwrap class.\n\ntemplate<typename elem_type, typename derived>\nstruct Base\n  : public Base_inv<derived, is_supported_blas_type<elem_type>::value>::result\n  , public Base_eval<elem_type, derived, is_Mat<derived>::value>::result\n  , public Base_trans<derived, is_cx<elem_type>::value>::result\n  {\n  arma_inline const derived& get_ref() const;\n  \n  inline void print(const std::string extra_text = \"\") const;\n  inline void print(std::ostream& user_stream, const std::string extra_text = \"\") const;\n  \n  inline void raw_print(const std::string extra_text = \"\") const;\n  inline void raw_print(std::ostream& user_stream, const std::string extra_text = \"\") const;\n  \n  inline arma_warn_unused elem_type min() const;\n  inline arma_warn_unused elem_type max() const;\n  \n  inline elem_type min(uword& index_of_min_val) const;\n  inline elem_type max(uword& index_of_max_val) const;\n  \n  inline elem_type min(uword& row_of_min_val, uword& col_of_min_val) const;\n  inline elem_type max(uword& row_of_max_val, uword& col_of_max_val) const;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Base_meat.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Base\n//! @{\n\n\n\ntemplate<typename elem_type, typename derived>\narma_inline\nconst derived&\nBase<elem_type,derived>::get_ref() const\n  {\n  return static_cast<const derived&>(*this);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nvoid\nBase<elem_type,derived>::print(const std::string extra_text) const\n  {\n  const Proxy<derived> P( (*this).get_ref() );\n  \n  const quasi_unwrap< typename Proxy<derived>::stored_type > tmp(P.Q);\n  \n  tmp.M.impl_print(extra_text);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nvoid\nBase<elem_type,derived>::print(std::ostream& user_stream, const std::string extra_text) const\n  {\n  const Proxy<derived> P( (*this).get_ref() );\n  \n  const quasi_unwrap< typename Proxy<derived>::stored_type > tmp(P.Q);\n  \n  tmp.M.impl_print(user_stream, extra_text);\n  }\n  \n\n\ntemplate<typename elem_type, typename derived>\ninline\nvoid\nBase<elem_type,derived>::raw_print(const std::string extra_text) const\n  {\n  const Proxy<derived> P( (*this).get_ref() );\n  \n  const quasi_unwrap< typename Proxy<derived>::stored_type > tmp(P.Q);\n  \n  tmp.M.impl_raw_print(extra_text);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nvoid\nBase<elem_type,derived>::raw_print(std::ostream& user_stream, const std::string extra_text) const\n  {\n  const Proxy<derived> P( (*this).get_ref() );\n  \n  const quasi_unwrap< typename Proxy<derived>::stored_type > tmp(P.Q);\n  \n  tmp.M.impl_raw_print(user_stream, extra_text);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\narma_warn_unused\nelem_type\nBase<elem_type,derived>::min() const\n  {\n  return op_min::min( (*this).get_ref() );\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\narma_warn_unused\nelem_type\nBase<elem_type,derived>::max() const\n  {\n  return op_max::max( (*this).get_ref() );\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nelem_type\nBase<elem_type,derived>::min(uword& index_of_min_val) const\n  {\n  const Proxy<derived> P( (*this).get_ref() );\n  \n  return op_min::min_with_index(P, index_of_min_val);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nelem_type\nBase<elem_type,derived>::max(uword& index_of_max_val) const\n  {\n  const Proxy<derived> P( (*this).get_ref() );\n  \n  return op_max::max_with_index(P, index_of_max_val);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nelem_type\nBase<elem_type,derived>::min(uword& row_of_min_val, uword& col_of_min_val) const\n  {\n  const Proxy<derived> P( (*this).get_ref() );\n  \n  uword index;\n  \n  const elem_type val = op_min::min_with_index(P, index);\n  \n  const uword local_n_rows = P.get_n_rows();\n  \n  row_of_min_val = index % local_n_rows;\n  col_of_min_val = index / local_n_rows;\n  \n  return val;\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nelem_type\nBase<elem_type,derived>::max(uword& row_of_max_val, uword& col_of_max_val) const\n  {\n  const Proxy<derived> P( (*this).get_ref() );\n  \n  uword index;\n  \n  const elem_type val = op_max::max_with_index(P, index);\n  \n  const uword local_n_rows = P.get_n_rows();\n  \n  row_of_max_val = index % local_n_rows;\n  col_of_max_val = index / local_n_rows;\n  \n  return val;\n  }\n\n\n\n//\n// extra functions defined in Base_inv_yes\n\ntemplate<typename derived>\narma_inline\nconst Op<derived,op_inv>\nBase_inv_yes<derived>::i(const bool slow) const\n  {\n  return Op<derived,op_inv>( static_cast<const derived&>(*this), ((slow == false) ? 0 : 1), 0 );\n  }\n\n\n\ntemplate<typename derived>\narma_inline\nconst Op<derived,op_inv>\nBase_inv_yes<derived>::i(const char* method) const\n  {\n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'f')), \"Base::i(): unknown method specified\" );\n  \n  return Op<derived,op_inv>( static_cast<const derived&>(*this), ((sig == 'f') ? 0 : 1), 0 );\n  }\n\n\n\n//\n// extra functions defined in Base_eval_Mat\n\ntemplate<typename elem_type, typename derived>\narma_inline\nconst derived&\nBase_eval_Mat<elem_type, derived>::eval() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return static_cast<const derived&>(*this);\n  }\n\n\n\n//\n// extra functions defined in Base_eval_expr\n\ntemplate<typename elem_type, typename derived>\narma_inline\nMat<elem_type>\nBase_eval_expr<elem_type, derived>::eval() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return Mat<elem_type>( static_cast<const derived&>(*this) );\n  }\n\n\n\n//\n// extra functions defined in Base_trans_cx\n\ntemplate<typename derived>\narma_inline\nconst Op<derived,op_htrans>\nBase_trans_cx<derived>::t() const\n  {\n  return Op<derived,op_htrans>( static_cast<const derived&>(*this) );\n  }\n\n\n\ntemplate<typename derived>\narma_inline\nconst Op<derived,op_htrans>\nBase_trans_cx<derived>::ht() const\n  {\n  return Op<derived,op_htrans>( static_cast<const derived&>(*this) );\n  }\n\n\n\ntemplate<typename derived>\narma_inline\nconst Op<derived,op_strans>\nBase_trans_cx<derived>::st() const\n  {\n  return Op<derived,op_strans>( static_cast<const derived&>(*this) );\n  }\n\n\n\n//\n// extra functions defined in Base_trans_default\n\ntemplate<typename derived>\narma_inline\nconst Op<derived,op_htrans>\nBase_trans_default<derived>::t() const\n  {\n  return Op<derived,op_htrans>( static_cast<const derived&>(*this) );\n  }\n\n\n\ntemplate<typename derived>\narma_inline\nconst Op<derived,op_htrans>\nBase_trans_default<derived>::ht() const\n  {\n  return Op<derived,op_htrans>( static_cast<const derived&>(*this) );\n  }\n\n\n\ntemplate<typename derived>\narma_inline\nconst Op<derived,op_htrans>\nBase_trans_default<derived>::st() const\n  {\n  return Op<derived,op_htrans>( static_cast<const derived&>(*this) );\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Col_bones.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Col\n//! @{\n\n//! Class for column vectors (matrices with only one column)\n\ntemplate<typename eT>\nclass Col : public Mat<eT>\n  {\n  public:\n  \n  typedef eT                                elem_type;\n  typedef typename get_pod_type<eT>::result pod_type;\n  \n  static const bool is_col = true;\n  static const bool is_row = false;\n  \n  inline          Col();\n  inline          Col(const Col<eT>& X);\n  inline explicit Col(const uword n_elem);\n  inline          Col(const uword in_rows, const uword in_cols);\n  \n  template<typename fill_type> inline Col(const uword n_elem,                       const fill::fill_class<fill_type>& f);\n  template<typename fill_type> inline Col(const uword in_rows, const uword in_cols, const fill::fill_class<fill_type>& f);\n  \n  inline                  Col(const char*        text);\n  inline const Col& operator=(const char*        text);\n  \n  inline                  Col(const std::string& text);\n  inline const Col& operator=(const std::string& text);\n  \n  inline                  Col(const std::vector<eT>& x);\n  inline const Col& operator=(const std::vector<eT>& x);\n  \n  #if defined(ARMA_USE_CXX11)\n  inline                  Col(const std::initializer_list<eT>& list);\n  inline const Col& operator=(const std::initializer_list<eT>& list);\n  \n  inline                  Col(Col&& m);\n  inline const Col& operator=(Col&& m);\n  #endif\n  \n  inline explicit Col(const SpCol<eT>& X);\n  \n  inline const Col& operator=(const eT val);\n  inline const Col& operator=(const Col& m);\n  \n  template<typename T1> inline                   Col(const Base<eT,T1>& X);\n  template<typename T1> inline const Col&  operator=(const Base<eT,T1>& X);\n  \n  inline Col(      eT* aux_mem, const uword aux_length, const bool copy_aux_mem = true, const bool strict = true);\n  inline Col(const eT* aux_mem, const uword aux_length);\n  \n  template<typename T1, typename T2>\n  inline explicit Col(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B);\n  \n  template<typename T1> inline                  Col(const BaseCube<eT,T1>& X);\n  template<typename T1> inline const Col& operator=(const BaseCube<eT,T1>& X);\n  \n  inline                  Col(const subview_cube<eT>& X);\n  inline const Col& operator=(const subview_cube<eT>& X);\n  \n  inline mat_injector<Col> operator<<(const eT val);\n  \n  arma_inline const Op<Col<eT>,op_htrans>  t() const;\n  arma_inline const Op<Col<eT>,op_htrans> ht() const;\n  arma_inline const Op<Col<eT>,op_strans> st() const;\n  \n  arma_inline       subview_col<eT> row(const uword row_num);\n  arma_inline const subview_col<eT> row(const uword row_num) const;\n  \n  using Mat<eT>::rows;\n  using Mat<eT>::operator();\n  \n  arma_inline       subview_col<eT> rows(const uword in_row1, const uword in_row2);\n  arma_inline const subview_col<eT> rows(const uword in_row1, const uword in_row2) const;\n  \n  arma_inline       subview_col<eT> subvec(const uword in_row1, const uword in_row2);\n  arma_inline const subview_col<eT> subvec(const uword in_row1, const uword in_row2) const;\n  \n  arma_inline       subview_col<eT> rows(const span& row_span);\n  arma_inline const subview_col<eT> rows(const span& row_span) const;\n  \n  arma_inline       subview_col<eT> subvec(const span& row_span);\n  arma_inline const subview_col<eT> subvec(const span& row_span) const;\n  \n  arma_inline       subview_col<eT> operator()(const span& row_span);\n  arma_inline const subview_col<eT> operator()(const span& row_span) const;\n  \n  arma_inline       subview_col<eT> head(const uword N);\n  arma_inline const subview_col<eT> head(const uword N) const;\n  \n  arma_inline       subview_col<eT> tail(const uword N);\n  arma_inline const subview_col<eT> tail(const uword N) const;\n  \n  arma_inline       subview_col<eT> head_rows(const uword N);\n  arma_inline const subview_col<eT> head_rows(const uword N) const;\n  \n  arma_inline       subview_col<eT> tail_rows(const uword N);\n  arma_inline const subview_col<eT> tail_rows(const uword N) const;\n  \n  \n  inline void shed_row (const uword row_num);\n  inline void shed_rows(const uword in_row1, const uword in_row2);\n  \n                        inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero = true);\n  template<typename T1> inline void insert_rows(const uword row_num, const Base<eT,T1>& X);\n  \n  \n  arma_inline arma_warn_unused       eT& at(const uword i);\n  arma_inline arma_warn_unused const eT& at(const uword i) const;\n  \n  arma_inline arma_warn_unused       eT& at(const uword in_row, const uword in_col);\n  arma_inline arma_warn_unused const eT& at(const uword in_row, const uword in_col) const;\n  \n  \n  typedef       eT*       row_iterator;\n  typedef const eT* const_row_iterator;\n  \n  inline       row_iterator begin_row(const uword row_num);\n  inline const_row_iterator begin_row(const uword row_num) const;\n  \n  inline       row_iterator end_row  (const uword row_num);\n  inline const_row_iterator end_row  (const uword row_num) const;\n  \n  \n  template<uword fixed_n_elem> class fixed;\n  \n  \n  protected:\n  \n  inline Col(const arma_fixed_indicator&, const uword in_n_elem, const eT* in_mem);\n  \n  \n  public:\n  \n  #ifdef ARMA_EXTRA_COL_PROTO\n    #include ARMA_INCFILE_WRAP(ARMA_EXTRA_COL_PROTO)\n  #endif\n  };\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\nclass Col<eT>::fixed : public Col<eT>\n  {\n  private:\n  \n  static const bool use_extra = (fixed_n_elem > arma_config::mat_prealloc);\n  \n  arma_align_mem eT mem_local_extra[ (use_extra) ? fixed_n_elem : 1 ];\n  \n  arma_inline void change_to_row();\n  \n  \n  public:\n  \n  typedef fixed<fixed_n_elem>               Col_fixed_type;\n  \n  typedef eT                                elem_type;\n  typedef typename get_pod_type<eT>::result pod_type;\n  \n  static const bool is_col = true;\n  static const bool is_row = false;\n  \n  static const uword n_rows = fixed_n_elem;\n  static const uword n_cols = 1;\n  static const uword n_elem = fixed_n_elem;\n  \n  arma_inline fixed();\n  arma_inline fixed(const fixed<fixed_n_elem>& X);\n       inline fixed(const subview_cube<eT>& X);\n  \n  template<typename fill_type>       inline fixed(const fill::fill_class<fill_type>& f);\n  template<typename T1>              inline fixed(const Base<eT,T1>& A);\n  template<typename T1, typename T2> inline fixed(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B);\n  \n  inline fixed(const eT* aux_mem);\n  \n  inline fixed(const char*        text);\n  inline fixed(const std::string& text);\n  \n  template<typename T1> inline const Col& operator=(const Base<eT,T1>& A);\n  \n  inline const Col& operator=(const eT val);\n  inline const Col& operator=(const char*        text);\n  inline const Col& operator=(const std::string& text);\n  inline const Col& operator=(const subview_cube<eT>& X);\n  \n  using Col<eT>::operator();\n  \n  #if defined(ARMA_USE_CXX11)\n    inline                fixed(const std::initializer_list<eT>& list);\n    inline const Col& operator=(const std::initializer_list<eT>& list);\n  #endif\n  \n  arma_inline const Col& operator=(const fixed<fixed_n_elem>& X);\n  \n  #if defined(ARMA_GOOD_COMPILER)\n    template<typename T1,              typename   eop_type> inline const Col& operator=(const   eOp<T1,       eop_type>& X);\n    template<typename T1, typename T2, typename eglue_type> inline const Col& operator=(const eGlue<T1, T2, eglue_type>& X);\n  #endif\n  \n  arma_inline const Op< Col_fixed_type, op_htrans >  t() const;\n  arma_inline const Op< Col_fixed_type, op_htrans > ht() const;\n  arma_inline const Op< Col_fixed_type, op_strans > st() const;\n  \n  arma_inline arma_warn_unused const eT& at_alt     (const uword i) const;\n  \n  arma_inline arma_warn_unused       eT& operator[] (const uword i);\n  arma_inline arma_warn_unused const eT& operator[] (const uword i) const;\n  arma_inline arma_warn_unused       eT& at         (const uword i);\n  arma_inline arma_warn_unused const eT& at         (const uword i) const;\n  arma_inline arma_warn_unused       eT& operator() (const uword i);\n  arma_inline arma_warn_unused const eT& operator() (const uword i) const;\n  \n  arma_inline arma_warn_unused       eT& at         (const uword in_row, const uword in_col);\n  arma_inline arma_warn_unused const eT& at         (const uword in_row, const uword in_col) const;\n  arma_inline arma_warn_unused       eT& operator() (const uword in_row, const uword in_col);\n  arma_inline arma_warn_unused const eT& operator() (const uword in_row, const uword in_col) const;\n  \n  arma_inline arma_warn_unused       eT* memptr();\n  arma_inline arma_warn_unused const eT* memptr() const;\n  \n  arma_hot inline const Col<eT>& fill(const eT val);\n  arma_hot inline const Col<eT>& zeros();\n  arma_hot inline const Col<eT>& ones();\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Col_meat.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Col\n//! @{\n\n\n//! construct an empty column vector\ntemplate<typename eT>\ninline\nCol<eT>::Col()\n  : Mat<eT>(arma_vec_indicator(), 1)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nCol<eT>::Col(const Col<eT>& X)\n  : Mat<eT>(arma_vec_indicator(), X.n_elem, 1, 1)\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::copy((*this).memptr(), X.memptr(), X.n_elem);\n  }\n\n\n\n//! construct a column vector with the specified number of n_elem\ntemplate<typename eT>\ninline\nCol<eT>::Col(const uword in_n_elem)\n  : Mat<eT>(arma_vec_indicator(), in_n_elem, 1, 1)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nCol<eT>::Col(const uword in_n_rows, const uword in_n_cols)\n  : Mat<eT>(arma_vec_indicator(), 0, 0, 1)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::init_warm(in_n_rows, in_n_cols);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename fill_type>\ninline\nCol<eT>::Col(const uword in_n_elem, const fill::fill_class<fill_type>& f)\n  : Mat<eT>(arma_vec_indicator(), in_n_elem, 1, 1)\n  {\n  arma_extra_debug_sigprint();\n  \n  (*this).fill(f);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename fill_type>\ninline\nCol<eT>::Col(const uword in_n_rows, const uword in_n_cols, const fill::fill_class<fill_type>& f)\n  : Mat<eT>(arma_vec_indicator(), 0, 0, 1)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::init_warm(in_n_rows, in_n_cols);\n  \n  (*this).fill(f);\n  }\n\n\n\n//! construct a column vector from specified text\ntemplate<typename eT>\ninline\nCol<eT>::Col(const char* text)\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::vec_state) = 2;\n  \n  Mat<eT>::operator=(text);\n  \n  std::swap( access::rw(Mat<eT>::n_rows), access::rw(Mat<eT>::n_cols) );\n  \n  access::rw(Mat<eT>::vec_state) = 1;\n  }\n\n\n\n//! construct a column vector from specified text\ntemplate<typename eT>\ninline\nconst Col<eT>&\nCol<eT>::operator=(const char* text)\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::vec_state) = 2;\n  \n  Mat<eT>::operator=(text);\n  \n  std::swap( access::rw(Mat<eT>::n_rows), access::rw(Mat<eT>::n_cols) );\n  \n  access::rw(Mat<eT>::vec_state) = 1;\n  \n  return *this;\n  }\n\n\n\n//! construct a column vector from specified text\ntemplate<typename eT>\ninline\nCol<eT>::Col(const std::string& text)\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::vec_state) = 2;\n  \n  Mat<eT>::operator=(text);\n  \n  std::swap( access::rw(Mat<eT>::n_rows), access::rw(Mat<eT>::n_cols) );\n  \n  access::rw(Mat<eT>::vec_state) = 1;\n  }\n\n\n\n//! construct a column vector from specified text\ntemplate<typename eT>\ninline\nconst Col<eT>&\nCol<eT>::operator=(const std::string& text)\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::vec_state) = 2;\n  \n  Mat<eT>::operator=(text);\n  \n  std::swap( access::rw(Mat<eT>::n_rows), access::rw(Mat<eT>::n_cols) );\n  \n  access::rw(Mat<eT>::vec_state) = 1;\n  \n  return *this;\n  }\n\n\n\n//! create a column vector from std::vector\ntemplate<typename eT>\ninline\nCol<eT>::Col(const std::vector<eT>& x)\n  : Mat<eT>(arma_vec_indicator(), uword(x.size()), 1, 1)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  if(x.size() > 0)\n    {\n    arrayops::copy( Mat<eT>::memptr(), &(x[0]), uword(x.size()) );\n    }\n  }\n  \n  \n  \n//! create a column vector from std::vector\ntemplate<typename eT>\ninline\nconst Col<eT>&\nCol<eT>::operator=(const std::vector<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::init_warm(uword(x.size()), 1);\n  \n  if(x.size() > 0)\n    {\n    arrayops::copy( Mat<eT>::memptr(), &(x[0]), uword(x.size()) );\n    }\n  \n  return *this;\n  }\n\n\n\n#if defined(ARMA_USE_CXX11)\n  \n  template<typename eT>\n  inline\n  Col<eT>::Col(const std::initializer_list<eT>& list)\n    {\n    arma_extra_debug_sigprint();\n    \n    access::rw(Mat<eT>::vec_state) = 2;\n    \n    Mat<eT>::operator=(list);\n    \n    std::swap( access::rw(Mat<eT>::n_rows), access::rw(Mat<eT>::n_cols) );\n    \n    access::rw(Mat<eT>::vec_state) = 1;\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  const Col<eT>&\n  Col<eT>::operator=(const std::initializer_list<eT>& list)\n    {\n    arma_extra_debug_sigprint();\n    \n    access::rw(Mat<eT>::vec_state) = 2;\n    \n    Mat<eT>::operator=(list);\n    \n    std::swap( access::rw(Mat<eT>::n_rows), access::rw(Mat<eT>::n_cols) );\n    \n    access::rw(Mat<eT>::vec_state) = 1;\n    \n    return *this;\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  Col<eT>::Col(Col<eT>&& X)\n    : Mat<eT>(arma_vec_indicator(), 1)\n    {\n    arma_extra_debug_sigprint(arma_boost::format(\"this = %x   X = %x\") % this % &X);\n    \n    access::rw(Mat<eT>::n_rows) = X.n_rows;\n    access::rw(Mat<eT>::n_cols) = 1;\n    access::rw(Mat<eT>::n_elem) = X.n_elem;\n    \n    if( ((X.mem_state == 0) && (X.n_elem > arma_config::mat_prealloc)) || (X.mem_state == 1) || (X.mem_state == 2) )\n      {\n      access::rw(Mat<eT>::mem_state) = X.mem_state;\n      access::rw(Mat<eT>::mem)       = X.mem;\n      \n      access::rw(X.n_rows)    = 0;\n      access::rw(X.n_cols)    = 1;\n      access::rw(X.n_elem)    = 0;\n      access::rw(X.mem_state) = 0;\n      access::rw(X.mem)       = 0;\n      }\n    else\n      {\n      (*this).init_cold();\n      \n      arrayops::copy( (*this).memptr(), X.mem, X.n_elem );\n      \n      if( (X.mem_state == 0) && (X.n_elem <= arma_config::mat_prealloc) )\n        {\n        access::rw(X.n_rows) = 0;\n        access::rw(X.n_cols) = 1;\n        access::rw(X.n_elem) = 0;\n        access::rw(X.mem)    = 0;\n        }\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  const Col<eT>&\n  Col<eT>::operator=(Col<eT>&& X)\n    {\n    arma_extra_debug_sigprint(arma_boost::format(\"this = %x   X = %x\") % this % &X);\n    \n    (*this).steal_mem(X);\n    \n    if( (X.mem_state == 0) && (X.n_elem <= arma_config::mat_prealloc) && (this != &X) )\n      {\n      access::rw(X.n_rows) = 0;\n      access::rw(X.n_cols) = 1;\n      access::rw(X.n_elem) = 0;\n      access::rw(X.mem)    = 0;\n      }\n    \n    return *this;\n    }\n  \n#endif\n\n\n\ntemplate<typename eT>\ninline\nCol<eT>::Col(const SpCol<eT>& X)\n  : Mat<eT>(arma_vec_indicator(), X.n_elem, 1, 1)\n  {\n  arma_extra_debug_sigprint_this(this);\n\n  arrayops::inplace_set(Mat<eT>::memptr(), eT(0), X.n_elem);\n\n  for(typename SpCol<eT>::const_iterator it = X.begin(); it != X.end(); ++it)\n    {\n    at(it.row()) = (*it);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Col<eT>&\nCol<eT>::operator=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::operator=(val);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Col<eT>&\nCol<eT>::operator=(const Col<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::operator=(X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nCol<eT>::Col(const Base<eT,T1>& X)\n  : Mat<eT>(arma_vec_indicator(), 1)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::operator=(X.get_ref());\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Col<eT>&\nCol<eT>::operator=(const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::operator=(X.get_ref());\n  \n  return *this;\n  }\n\n\n\n//! construct a column vector from a given auxiliary array of eTs\ntemplate<typename eT>\ninline\nCol<eT>::Col(eT* aux_mem, const uword aux_length, const bool copy_aux_mem, const bool strict)\n  : Mat<eT>(aux_mem, aux_length, 1, copy_aux_mem, strict)\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::vec_state) = 1;\n  }\n\n\n\n//! construct a column vector from a given auxiliary array of eTs\ntemplate<typename eT>\ninline\nCol<eT>::Col(const eT* aux_mem, const uword aux_length)\n  : Mat<eT>(aux_mem, aux_length, 1)\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::vec_state) = 1;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nCol<eT>::Col\n  (\n  const Base<typename Col<eT>::pod_type, T1>& A,\n  const Base<typename Col<eT>::pod_type, T2>& B\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::vec_state) = 1;\n  \n  Mat<eT>::init(A,B);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nCol<eT>::Col(const BaseCube<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::vec_state) = 1;\n  \n  Mat<eT>::operator=(X);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Col<eT>&\nCol<eT>::operator=(const BaseCube<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::operator=(X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nCol<eT>::Col(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::vec_state) = 1;\n  \n  Mat<eT>::operator=(X);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Col<eT>&\nCol<eT>::operator=(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::operator=(X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nmat_injector< Col<eT> >\nCol<eT>::operator<<(const eT val)\n  {\n  return mat_injector< Col<eT> >(*this, val);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst Op<Col<eT>,op_htrans>\nCol<eT>::t() const\n  {\n  return Op<Col<eT>,op_htrans>(*this);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst Op<Col<eT>,op_htrans>\nCol<eT>::ht() const\n  {\n  return Op<Col<eT>,op_htrans>(*this);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst Op<Col<eT>,op_strans>\nCol<eT>::st() const\n  {\n  return Op<Col<eT>,op_strans>(*this);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_col<eT>\nCol<eT>::row(const uword in_row1)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (in_row1 >= Mat<eT>::n_rows), \"Col::row(): indices out of bounds or incorrectly used\");\n  \n  return subview_col<eT>(*this, 0, in_row1, 1);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_col<eT>\nCol<eT>::row(const uword in_row1) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (in_row1 >= Mat<eT>::n_rows), \"Col::row(): indices out of bounds or incorrectly used\");\n  \n  return subview_col<eT>(*this, 0, in_row1, 1);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_col<eT>\nCol<eT>::rows(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= Mat<eT>::n_rows) ), \"Col::rows(): indices out of bounds or incorrectly used\");\n  \n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  \n  return subview_col<eT>(*this, 0, in_row1, subview_n_rows);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_col<eT>\nCol<eT>::rows(const uword in_row1, const uword in_row2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= Mat<eT>::n_rows) ), \"Col::rows(): indices out of bounds or incorrectly used\");\n  \n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  \n  return subview_col<eT>(*this, 0, in_row1, subview_n_rows);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_col<eT>\nCol<eT>::subvec(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= Mat<eT>::n_rows) ), \"Col::subvec(): indices out of bounds or incorrectly used\");\n  \n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  \n  return subview_col<eT>(*this, 0, in_row1, subview_n_rows);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_col<eT>\nCol<eT>::subvec(const uword in_row1, const uword in_row2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= Mat<eT>::n_rows) ), \"Col::subvec(): indices out of bounds or incorrectly used\");\n  \n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  \n  return subview_col<eT>(*this, 0, in_row1, subview_n_rows);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_col<eT>\nCol<eT>::rows(const span& row_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subvec(row_span);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_col<eT>\nCol<eT>::rows(const span& row_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return subvec(row_span);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_col<eT>\nCol<eT>::subvec(const span& row_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all = row_span.whole;\n\n  const uword local_n_rows = Mat<eT>::n_rows;\n  \n  const uword in_row1       = row_all ? 0            : row_span.a;\n  const uword in_row2       =                          row_span.b;\n  const uword subvec_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n\n  arma_debug_check( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ), \"Col::subvec(): indices out of bounds or incorrectly used\");\n  \n  return subview_col<eT>(*this, 0, in_row1, subvec_n_rows);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_col<eT>\nCol<eT>::subvec(const span& row_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all = row_span.whole;\n\n  const uword local_n_rows = Mat<eT>::n_rows;\n  \n  const uword in_row1       = row_all ? 0            : row_span.a;\n  const uword in_row2       =                          row_span.b;\n  const uword subvec_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n\n  arma_debug_check( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ), \"Col::subvec(): indices out of bounds or incorrectly used\");\n  \n  return subview_col<eT>(*this, 0, in_row1, subvec_n_rows);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_col<eT>\nCol<eT>::operator()(const span& row_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subvec(row_span);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_col<eT>\nCol<eT>::operator()(const span& row_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return subvec(row_span);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_col<eT>\nCol<eT>::head(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > Mat<eT>::n_rows), \"Col::head(): size out of bounds\");\n  \n  return subview_col<eT>(*this, 0, 0, N);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_col<eT>\nCol<eT>::head(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > Mat<eT>::n_rows), \"Col::head(): size out of bounds\");\n  \n  return subview_col<eT>(*this, 0, 0, N);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_col<eT>\nCol<eT>::tail(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > Mat<eT>::n_rows), \"Col::tail(): size out of bounds\");\n  \n  const uword start_row = Mat<eT>::n_rows - N;\n  \n  return subview_col<eT>(*this, 0, start_row, N);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_col<eT>\nCol<eT>::tail(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > Mat<eT>::n_rows), \"Col::tail(): size out of bounds\");\n  \n  const uword start_row = Mat<eT>::n_rows - N;\n  \n  return subview_col<eT>(*this, 0, start_row, N);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_col<eT>\nCol<eT>::head_rows(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).head(N);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_col<eT>\nCol<eT>::head_rows(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).head(N);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_col<eT>\nCol<eT>::tail_rows(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).tail(N);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_col<eT>\nCol<eT>::tail_rows(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).tail(N);\n  }\n\n\n\n//! remove specified row\ntemplate<typename eT>\ninline\nvoid\nCol<eT>::shed_row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( row_num >= Mat<eT>::n_rows, \"Col::shed_row(): index out of bounds\");\n  \n  shed_rows(row_num, row_num);\n  }\n\n\n\n//! remove specified rows\ntemplate<typename eT>\ninline\nvoid\nCol<eT>::shed_rows(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_row2 >= Mat<eT>::n_rows),\n    \"Col::shed_rows(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword n_keep_front = in_row1;\n  const uword n_keep_back  = Mat<eT>::n_rows - (in_row2 + 1);\n  \n  Col<eT> X(n_keep_front + n_keep_back);\n  \n        eT* X_mem = X.memptr();\n  const eT* t_mem = (*this).memptr();\n  \n  if(n_keep_front > 0)\n    {\n    arrayops::copy( X_mem, t_mem, n_keep_front );\n    }\n  \n  if(n_keep_back > 0)\n    {\n    arrayops::copy( &(X_mem[n_keep_front]), &(t_mem[in_row2+1]), n_keep_back);\n    }\n  \n  Mat<eT>::steal_mem(X);\n  }\n\n\n\n//! insert N rows at the specified row position,\n//! optionally setting the elements of the inserted rows to zero\ntemplate<typename eT>\ninline\nvoid\nCol<eT>::insert_rows(const uword row_num, const uword N, const bool set_to_zero)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword t_n_rows = Mat<eT>::n_rows;\n  \n  const uword A_n_rows = row_num;\n  const uword B_n_rows = t_n_rows - row_num;\n  \n  // insertion at row_num == n_rows is in effect an append operation\n  arma_debug_check( (row_num > t_n_rows), \"Col::insert_rows(): index out of bounds\");\n  \n  if(N > 0)\n    {\n    Col<eT> out(t_n_rows + N);\n    \n          eT* out_mem = out.memptr();\n    const eT*   t_mem = (*this).memptr();\n    \n    if(A_n_rows > 0)\n      {\n      arrayops::copy( out_mem, t_mem, A_n_rows );\n      }\n    \n    if(B_n_rows > 0)\n      {\n      arrayops::copy( &(out_mem[row_num + N]), &(t_mem[row_num]), B_n_rows );\n      }\n    \n    if(set_to_zero == true)\n      {\n      arrayops::inplace_set( &(out_mem[row_num]), eT(0), N );\n      }\n    \n    Mat<eT>::steal_mem(out);\n    }\n  }\n\n\n\n//! insert the given object at the specified row position; \n//! the given object must have one column\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nCol<eT>::insert_rows(const uword row_num, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::insert_rows(row_num, X);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT&\nCol<eT>::at(const uword i)\n  {\n  return access::rw(Mat<eT>::mem[i]);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT&\nCol<eT>::at(const uword i) const\n  {\n  return Mat<eT>::mem[i];\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT&\nCol<eT>::at(const uword in_row, const uword)\n  {\n  return access::rw( Mat<eT>::mem[in_row] );\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT&\nCol<eT>::at(const uword in_row, const uword) const\n  {\n  return Mat<eT>::mem[in_row];\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Col<eT>::row_iterator\nCol<eT>::begin_row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (row_num >= Mat<eT>::n_rows), \"Col::begin_row(): index out of bounds\");\n  \n  return Mat<eT>::memptr() + row_num;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Col<eT>::const_row_iterator\nCol<eT>::begin_row(const uword row_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (row_num >= Mat<eT>::n_rows), \"Col::begin_row(): index out of bounds\");\n  \n  return Mat<eT>::memptr() + row_num;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Col<eT>::row_iterator\nCol<eT>::end_row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (row_num >= Mat<eT>::n_rows), \"Col::end_row(): index out of bounds\");\n  \n  return Mat<eT>::memptr() + row_num + 1;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Col<eT>::const_row_iterator\nCol<eT>::end_row(const uword row_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (row_num >= Mat<eT>::n_rows), \"Col::end_row(): index out of bounds\");\n  \n  return Mat<eT>::memptr() + row_num + 1;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\nvoid\nCol<eT>::fixed<fixed_n_elem>::change_to_row()\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::n_cols) = fixed_n_elem;\n  access::rw(Mat<eT>::n_rows) = 1;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\nCol<eT>::fixed<fixed_n_elem>::fixed()\n  : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\nCol<eT>::fixed<fixed_n_elem>::fixed(const fixed<fixed_n_elem>& X)\n  : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n        eT* dest = (use_extra) ?   mem_local_extra : Mat<eT>::mem_local;\n  const eT* src  = (use_extra) ? X.mem_local_extra :        X.mem_local;\n  \n  arrayops::copy( dest, src, fixed_n_elem );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\ninline\nCol<eT>::fixed<fixed_n_elem>::fixed(const subview_cube<eT>& X)\n  : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  Col<eT>::operator=(X);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\ntemplate<typename fill_type>\ninline\nCol<eT>::fixed<fixed_n_elem>::fixed(const fill::fill_class<fill_type>&)\n  : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  if(is_same_type<fill_type, fill::fill_zeros>::yes)  (*this).zeros();\n  if(is_same_type<fill_type, fill::fill_ones >::yes)  (*this).ones();\n  if(is_same_type<fill_type, fill::fill_eye  >::yes)  (*this).eye();\n  if(is_same_type<fill_type, fill::fill_randu>::yes)  (*this).randu();\n  if(is_same_type<fill_type, fill::fill_randn>::yes)  (*this).randn();\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\ntemplate<typename T1>\ninline\nCol<eT>::fixed<fixed_n_elem>::fixed(const Base<eT,T1>& A)\n  : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  Col<eT>::operator=(A.get_ref());\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\ntemplate<typename T1, typename T2>\ninline\nCol<eT>::fixed<fixed_n_elem>::fixed(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B)\n  : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  Col<eT>::init(A,B);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\ninline\nCol<eT>::fixed<fixed_n_elem>::fixed(const eT* aux_mem)\n  : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  eT* dest = (use_extra) ? mem_local_extra : Mat<eT>::mem_local;\n  \n  arrayops::copy( dest, aux_mem, fixed_n_elem );\n  }\n\n\n\n//! NOTE: this function relies on\n//! Col::operator=(text), to change vec_state as well as swapping n_rows and n_cols,\n//! and Mat::init(), to check that the given vector will not have a different size than fixed_n_elem.\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\ninline\nCol<eT>::fixed<fixed_n_elem>::fixed(const char* text)\n  : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  change_to_row();\n  \n  Col<eT>::operator=(text);\n  }\n\n\n\n//! NOTE: this function relies on\n//! Col::operator=(text), to change vec_state as well as swapping n_rows and n_cols,\n//! and Mat::init(), to check that the given vector will not have a different size than fixed_n_elem.\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\ninline\nCol<eT>::fixed<fixed_n_elem>::fixed(const std::string& text)\n  : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  change_to_row();\n  \n  Col<eT>::operator=(text);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\ntemplate<typename T1>\nconst Col<eT>&\nCol<eT>::fixed<fixed_n_elem>::operator=(const Base<eT,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  Col<eT>::operator=(A.get_ref());\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\nconst Col<eT>&\nCol<eT>::fixed<fixed_n_elem>::operator=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  Col<eT>::operator=(val);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\nconst Col<eT>&\nCol<eT>::fixed<fixed_n_elem>::operator=(const char* text)\n  {\n  arma_extra_debug_sigprint();\n  \n  change_to_row();\n  \n  Col<eT>::operator=(text);\n  \n  return *this; \n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\nconst Col<eT>&\nCol<eT>::fixed<fixed_n_elem>::operator=(const std::string& text)\n  {\n  arma_extra_debug_sigprint();\n  \n  change_to_row();\n  \n  Col<eT>::operator=(text);\n  \n  return *this; \n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\nconst Col<eT>&\nCol<eT>::fixed<fixed_n_elem>::operator=(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Col<eT>::operator=(X);\n  \n  return *this; \n  }\n\n\n\n#if defined(ARMA_USE_CXX11)\n  \n  template<typename eT>\n  template<uword fixed_n_elem>\n  inline\n  Col<eT>::fixed<fixed_n_elem>::fixed(const std::initializer_list<eT>& list)\n    : Col<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n    {\n    arma_extra_debug_sigprint_this(this);\n    \n    (*this).operator=(list);\n    }\n  \n  \n  \n  template<typename eT>\n  template<uword fixed_n_elem>\n  inline\n  const Col<eT>&\n  Col<eT>::fixed<fixed_n_elem>::operator=(const std::initializer_list<eT>& list)\n    {\n    arma_extra_debug_sigprint();\n    \n    const uword N = uword(list.size());\n    \n    arma_debug_check( (N > fixed_n_elem), \"Col::fixed: initialiser list is too long\" );\n    \n    eT* this_mem = (*this).memptr();\n    \n    arrayops::copy( this_mem, list.begin(), N );\n    \n    for(uword iq=N; iq < fixed_n_elem; ++iq) { this_mem[iq] = eT(0); }\n    \n    return *this;\n    }\n  \n#endif\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\nconst Col<eT>&\nCol<eT>::fixed<fixed_n_elem>::operator=(const fixed<fixed_n_elem>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(this != &X)\n    {\n          eT* dest = (use_extra) ?   mem_local_extra : Mat<eT>::mem_local;\n    const eT* src  = (use_extra) ? X.mem_local_extra :        X.mem_local;\n    \n    arrayops::copy( dest, src, fixed_n_elem );\n    }\n  \n  return *this;\n  }\n\n\n\n#if defined(ARMA_GOOD_COMPILER)\n  \n  template<typename eT>\n  template<uword fixed_n_elem>\n  template<typename T1, typename eop_type>\n  inline\n  const Col<eT>&\n  Col<eT>::fixed<fixed_n_elem>::operator=(const eOp<T1, eop_type>& X)\n    {\n    arma_extra_debug_sigprint();\n    \n    arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n    \n    const bool bad_alias = (eOp<T1, eop_type>::proxy_type::has_subview  &&  X.P.is_alias(*this));\n    \n    if(bad_alias == false)\n      {\n      arma_debug_assert_same_size(fixed_n_elem, uword(1), X.get_n_rows(), X.get_n_cols(), \"Col::fixed::operator=\");\n      \n      eop_type::apply(*this, X);\n      }\n    else\n      {\n      arma_extra_debug_print(\"bad_alias = true\");\n      \n      Col<eT> tmp(X);\n      \n      (*this) = tmp;\n      }\n    \n    return *this;\n    }\n  \n  \n  \n  template<typename eT>\n  template<uword fixed_n_elem>\n  template<typename T1, typename T2, typename eglue_type>\n  inline\n  const Col<eT>&\n  Col<eT>::fixed<fixed_n_elem>::operator=(const eGlue<T1, T2, eglue_type>& X)\n    {\n    arma_extra_debug_sigprint();\n    \n    arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n    arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n    \n    const bool bad_alias =\n      (\n      (eGlue<T1, T2, eglue_type>::proxy1_type::has_subview  &&  X.P1.is_alias(*this))\n      ||\n      (eGlue<T1, T2, eglue_type>::proxy2_type::has_subview  &&  X.P2.is_alias(*this))\n      );\n    \n    if(bad_alias == false)\n      {\n      arma_debug_assert_same_size(fixed_n_elem, uword(1), X.get_n_rows(), X.get_n_cols(), \"Col::fixed::operator=\");\n      \n      eglue_type::apply(*this, X);\n      }\n    else\n      {\n      arma_extra_debug_print(\"bad_alias = true\");\n      \n      Col<eT> tmp(X);\n      \n      (*this) = tmp;\n      }\n    \n    return *this;\n    }\n  \n#endif\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\nconst Op< typename Col<eT>::template fixed<fixed_n_elem>::Col_fixed_type, op_htrans >\nCol<eT>::fixed<fixed_n_elem>::t() const\n  {\n  return Op< typename Col<eT>::template fixed<fixed_n_elem>::Col_fixed_type, op_htrans >(*this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\nconst Op< typename Col<eT>::template fixed<fixed_n_elem>::Col_fixed_type, op_htrans >\nCol<eT>::fixed<fixed_n_elem>::ht() const\n  {\n  return Op< typename Col<eT>::template fixed<fixed_n_elem>::Col_fixed_type, op_htrans >(*this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\nconst Op< typename Col<eT>::template fixed<fixed_n_elem>::Col_fixed_type, op_strans >\nCol<eT>::fixed<fixed_n_elem>::st() const\n  {\n  return Op< typename Col<eT>::template fixed<fixed_n_elem>::Col_fixed_type, op_strans >(*this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\nconst eT&\nCol<eT>::fixed<fixed_n_elem>::at_alt(const uword ii) const\n  {\n  #if defined(ARMA_HAVE_ALIGNED_ATTRIBUTE)\n  \n    return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];\n    \n  #else\n    const eT* mem_aligned = (use_extra) ? mem_local_extra : Mat<eT>::mem_local;\n    \n    memory::mark_as_aligned(mem_aligned);\n    \n    return mem_aligned[ii];\n  #endif\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\neT&\nCol<eT>::fixed<fixed_n_elem>::operator[] (const uword ii)\n  {\n  return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\nconst eT&\nCol<eT>::fixed<fixed_n_elem>::operator[] (const uword ii) const\n  {\n  return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\neT&\nCol<eT>::fixed<fixed_n_elem>::at(const uword ii)\n  {\n  return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\nconst eT&\nCol<eT>::fixed<fixed_n_elem>::at(const uword ii) const\n  {\n  return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\neT&\nCol<eT>::fixed<fixed_n_elem>::operator() (const uword ii)\n  {\n  arma_debug_check( (ii >= fixed_n_elem), \"Col::operator(): index out of bounds\");\n  \n  return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\nconst eT&\nCol<eT>::fixed<fixed_n_elem>::operator() (const uword ii) const\n  {\n  arma_debug_check( (ii >= fixed_n_elem), \"Col::operator(): index out of bounds\");\n  \n  return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\neT&\nCol<eT>::fixed<fixed_n_elem>::at(const uword in_row, const uword)\n  {\n  return (use_extra) ? mem_local_extra[in_row] : Mat<eT>::mem_local[in_row];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\nconst eT&\nCol<eT>::fixed<fixed_n_elem>::at(const uword in_row, const uword) const\n  {\n  return (use_extra) ? mem_local_extra[in_row] : Mat<eT>::mem_local[in_row];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\neT&\nCol<eT>::fixed<fixed_n_elem>::operator() (const uword in_row, const uword in_col)\n  {\n  arma_debug_check( ((in_row >= fixed_n_elem) || (in_col > 0)), \"Col::operator(): index out of bounds\" );\n  \n  return (use_extra) ? mem_local_extra[in_row] : Mat<eT>::mem_local[in_row];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\nconst eT&\nCol<eT>::fixed<fixed_n_elem>::operator() (const uword in_row, const uword in_col) const\n  {\n  arma_debug_check( ((in_row >= fixed_n_elem) || (in_col > 0)), \"Col::operator(): index out of bounds\" );\n  \n  return (use_extra) ? mem_local_extra[in_row] : Mat<eT>::mem_local[in_row];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\neT*\nCol<eT>::fixed<fixed_n_elem>::memptr()\n  {\n  return (use_extra) ? mem_local_extra : Mat<eT>::mem_local;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\nconst eT*\nCol<eT>::fixed<fixed_n_elem>::memptr() const\n  {\n  return (use_extra) ? mem_local_extra : Mat<eT>::mem_local;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_hot\ninline\nconst Col<eT>&\nCol<eT>::fixed<fixed_n_elem>::fill(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat<eT>::mem_local[0]);\n  \n  arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, val );\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_hot\ninline\nconst Col<eT>&\nCol<eT>::fixed<fixed_n_elem>::zeros()\n  {\n  arma_extra_debug_sigprint();\n  \n  eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat<eT>::mem_local[0]);\n  \n  arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, eT(0) );\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_hot\ninline\nconst Col<eT>&\nCol<eT>::fixed<fixed_n_elem>::ones()\n  {\n  arma_extra_debug_sigprint();\n  \n  eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat<eT>::mem_local[0]);\n  \n  arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, eT(1) );\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nCol<eT>::Col(const arma_fixed_indicator&, const uword in_n_elem, const eT* in_mem)\n  : Mat<eT>(arma_fixed_indicator(), in_n_elem, 1, 1, in_mem)\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\n#ifdef ARMA_EXTRA_COL_MEAT\n  #include ARMA_INCFILE_WRAP(ARMA_EXTRA_COL_MEAT)\n#endif\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Cube_bones.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Cube\n//! @{\n\n\n\nstruct Cube_prealloc\n  {\n  static const uword mat_ptrs_size = 4;\n  static const uword mem_n_elem    = 64;\n  };\n\n\n\n//! Dense cube class\n\ntemplate<typename eT>\nclass Cube : public BaseCube< eT, Cube<eT> >\n  {\n  public:\n  \n  typedef eT                                elem_type; //!< the type of elements stored in the cube\n  typedef typename get_pod_type<eT>::result pod_type;  //!< if eT is non-complex, pod_type is same as eT. otherwise, pod_type is the underlying type used by std::complex\n  \n  const uword  n_rows;       //!< number of rows in each slice (read-only)\n  const uword  n_cols;       //!< number of columns in each slice (read-only)\n  const uword  n_elem_slice; //!< number of elements in each slice (read-only)\n  const uword  n_slices;     //!< number of slices in the cube (read-only)\n  const uword  n_elem;       //!< number of elements in the cube (read-only)\n  const uword  mem_state;\n  \n  // mem_state = 0: normal cube that can be resized; \n  // mem_state = 1: use auxiliary memory until change in the number of elements is requested;  \n  // mem_state = 2: use auxiliary memory and don't allow the number of elements to be changed; \n  // mem_state = 3: fixed size (e.g. via template based size specification).\n  \n  \n  arma_aligned const Mat<eT>** const mat_ptrs; //!< WARNING: DO NOT USE! mat_ptrs will be private in version 6.0\n  arma_aligned const eT*       const mem;      //!< pointer to the memory used by the cube (memory is read-only)\n  \n  protected:\n  arma_align_mem Mat<eT>* mat_ptrs_local[ Cube_prealloc::mat_ptrs_size ];\n  arma_align_mem eT            mem_local[ Cube_prealloc::mem_n_elem    ];\n  \n  \n  public:\n  \n  inline ~Cube();\n  inline  Cube();\n  \n  inline Cube(const uword in_rows, const uword in_cols, const uword in_slices);\n  \n  template<typename fill_type>\n  inline Cube(const uword in_rows, const uword in_cols, const uword in_slices, const fill::fill_class<fill_type>& f);\n  \n  #if defined(ARMA_USE_CXX11)\n  inline                  Cube(Cube&& m);\n  inline const Cube& operator=(Cube&& m);\n  #endif\n  \n  inline Cube(      eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const uword aux_n_slices, const bool copy_aux_mem = true, const bool strict = true, const bool prealloc_mat = true);\n  inline Cube(const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const uword aux_n_slices);\n  \n  arma_inline const Cube&  operator=(const eT val);\n  arma_inline const Cube& operator+=(const eT val);\n  arma_inline const Cube& operator-=(const eT val);\n  arma_inline const Cube& operator*=(const eT val);\n  arma_inline const Cube& operator/=(const eT val);\n  \n  inline                   Cube(const Cube& m);\n  inline const Cube&  operator=(const Cube& m);\n  inline const Cube& operator+=(const Cube& m);\n  inline const Cube& operator-=(const Cube& m);\n  inline const Cube& operator%=(const Cube& m);\n  inline const Cube& operator/=(const Cube& m);\n  \n  template<typename T1, typename T2>\n  inline explicit Cube(const BaseCube<pod_type,T1>& A, const BaseCube<pod_type,T2>& B);\n  \n  inline                   Cube(const subview_cube<eT>& X);\n  inline const Cube&  operator=(const subview_cube<eT>& X);\n  inline const Cube& operator+=(const subview_cube<eT>& X);\n  inline const Cube& operator-=(const subview_cube<eT>& X);\n  inline const Cube& operator%=(const subview_cube<eT>& X);\n  inline const Cube& operator/=(const subview_cube<eT>& X);\n  \n  arma_inline       Mat<eT>& slice(const uword in_slice);\n  arma_inline const Mat<eT>& slice(const uword in_slice) const;\n  \n  arma_inline       subview_cube<eT> slices(const uword in_slice1, const uword in_slice2);\n  arma_inline const subview_cube<eT> slices(const uword in_slice1, const uword in_slice2) const;\n  \n  arma_inline       subview_cube<eT> subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2);\n  arma_inline const subview_cube<eT> subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2) const;\n  \n  inline            subview_cube<eT> subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s);\n  inline      const subview_cube<eT> subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const;\n  \n  inline            subview_cube<eT> subcube(const span& row_span, const span& col_span, const span& slice_span);\n  inline      const subview_cube<eT> subcube(const span& row_span, const span& col_span, const span& slice_span) const;\n  \n  inline            subview_cube<eT> operator()(const span& row_span, const span& col_span, const span& slice_span);\n  inline      const subview_cube<eT> operator()(const span& row_span, const span& col_span, const span& slice_span) const;\n  \n  inline            subview_cube<eT> operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s);\n  inline      const subview_cube<eT> operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const;\n  \n  arma_inline       subview_cube<eT> tube(const uword in_row1, const uword in_col1);\n  arma_inline const subview_cube<eT> tube(const uword in_row1, const uword in_col1) const;\n  \n  arma_inline       subview_cube<eT> tube(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2);\n  arma_inline const subview_cube<eT> tube(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const;\n  \n  arma_inline       subview_cube<eT> tube(const uword in_row1, const uword in_col1, const SizeMat& s);\n  arma_inline const subview_cube<eT> tube(const uword in_row1, const uword in_col1, const SizeMat& s) const;\n  \n  inline            subview_cube<eT> tube(const span& row_span, const span& col_span);\n  inline      const subview_cube<eT> tube(const span& row_span, const span& col_span) const;\n  \n  template<typename T1> arma_inline       subview_elem1<eT,T1> elem(const Base<uword,T1>& a);\n  template<typename T1> arma_inline const subview_elem1<eT,T1> elem(const Base<uword,T1>& a) const;\n  \n  template<typename T1> arma_inline       subview_elem1<eT,T1> operator()(const Base<uword,T1>& a);\n  template<typename T1> arma_inline const subview_elem1<eT,T1> operator()(const Base<uword,T1>& a) const;\n  \n  \n  inline void shed_slice(const uword slice_num);\n  \n  inline void shed_slices(const uword in_slice1, const uword in_slice2);\n  \n  inline void insert_slices(const uword slice_num, const uword N, const bool set_to_zero = true);\n  \n  template<typename T1>\n  inline void insert_slices(const uword row_num, const BaseCube<eT,T1>& X);\n  \n  \n  template<typename gen_type> inline                   Cube(const GenCube<eT, gen_type>& X);\n  template<typename gen_type> inline const Cube&  operator=(const GenCube<eT, gen_type>& X);\n  template<typename gen_type> inline const Cube& operator+=(const GenCube<eT, gen_type>& X);\n  template<typename gen_type> inline const Cube& operator-=(const GenCube<eT, gen_type>& X);\n  template<typename gen_type> inline const Cube& operator%=(const GenCube<eT, gen_type>& X);\n  template<typename gen_type> inline const Cube& operator/=(const GenCube<eT, gen_type>& X);\n  \n  template<typename T1, typename op_type> inline                   Cube(const OpCube<T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Cube&  operator=(const OpCube<T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Cube& operator+=(const OpCube<T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Cube& operator-=(const OpCube<T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Cube& operator%=(const OpCube<T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Cube& operator/=(const OpCube<T1, op_type>& X);\n  \n  template<typename T1, typename eop_type> inline                   Cube(const eOpCube<T1, eop_type>& X);\n  template<typename T1, typename eop_type> inline const Cube&  operator=(const eOpCube<T1, eop_type>& X);\n  template<typename T1, typename eop_type> inline const Cube& operator+=(const eOpCube<T1, eop_type>& X);\n  template<typename T1, typename eop_type> inline const Cube& operator-=(const eOpCube<T1, eop_type>& X);\n  template<typename T1, typename eop_type> inline const Cube& operator%=(const eOpCube<T1, eop_type>& X);\n  template<typename T1, typename eop_type> inline const Cube& operator/=(const eOpCube<T1, eop_type>& X);\n  \n  template<typename T1, typename op_type> inline                   Cube(const mtOpCube<eT, T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Cube&  operator=(const mtOpCube<eT, T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Cube& operator+=(const mtOpCube<eT, T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Cube& operator-=(const mtOpCube<eT, T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Cube& operator%=(const mtOpCube<eT, T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Cube& operator/=(const mtOpCube<eT, T1, op_type>& X);\n  \n  template<typename T1, typename T2, typename glue_type> inline                   Cube(const GlueCube<T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Cube&  operator=(const GlueCube<T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Cube& operator+=(const GlueCube<T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Cube& operator-=(const GlueCube<T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Cube& operator%=(const GlueCube<T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Cube& operator/=(const GlueCube<T1, T2, glue_type>& X);\n  \n  template<typename T1, typename T2, typename eglue_type> inline                   Cube(const eGlueCube<T1, T2, eglue_type>& X);\n  template<typename T1, typename T2, typename eglue_type> inline const Cube&  operator=(const eGlueCube<T1, T2, eglue_type>& X);\n  template<typename T1, typename T2, typename eglue_type> inline const Cube& operator+=(const eGlueCube<T1, T2, eglue_type>& X);\n  template<typename T1, typename T2, typename eglue_type> inline const Cube& operator-=(const eGlueCube<T1, T2, eglue_type>& X);\n  template<typename T1, typename T2, typename eglue_type> inline const Cube& operator%=(const eGlueCube<T1, T2, eglue_type>& X);\n  template<typename T1, typename T2, typename eglue_type> inline const Cube& operator/=(const eGlueCube<T1, T2, eglue_type>& X);\n  \n  template<typename T1, typename T2, typename glue_type> inline                   Cube(const mtGlueCube<eT, T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Cube&  operator=(const mtGlueCube<eT, T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Cube& operator+=(const mtGlueCube<eT, T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Cube& operator-=(const mtGlueCube<eT, T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Cube& operator%=(const mtGlueCube<eT, T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Cube& operator/=(const mtGlueCube<eT, T1, T2, glue_type>& X);\n  \n  \n  arma_inline arma_warn_unused const eT& at_alt     (const uword i) const;\n  \n  arma_inline arma_warn_unused       eT& operator[] (const uword i);\n  arma_inline arma_warn_unused const eT& operator[] (const uword i) const;\n  \n  arma_inline arma_warn_unused       eT& at(const uword i);\n  arma_inline arma_warn_unused const eT& at(const uword i) const;\n  \n  arma_inline arma_warn_unused       eT& operator() (const uword i);\n  arma_inline arma_warn_unused const eT& operator() (const uword i) const;\n  \n  arma_inline arma_warn_unused       eT& at         (const uword in_row, const uword in_col, const uword in_slice);\n  arma_inline arma_warn_unused const eT& at         (const uword in_row, const uword in_col, const uword in_slice) const;\n  \n  arma_inline arma_warn_unused       eT& operator() (const uword in_row, const uword in_col, const uword in_slice);\n  arma_inline arma_warn_unused const eT& operator() (const uword in_row, const uword in_col, const uword in_slice) const;\n  \n  arma_inline const Cube& operator++();\n  arma_inline void        operator++(int);\n  \n  arma_inline const Cube& operator--();\n  arma_inline void        operator--(int);\n  \n  arma_inline arma_warn_unused bool is_finite() const;\n  arma_inline arma_warn_unused bool is_empty()  const;\n  \n  inline arma_warn_unused bool has_inf() const;\n  inline arma_warn_unused bool has_nan() const;\n  \n  arma_inline arma_warn_unused bool in_range(const uword i) const;\n  arma_inline arma_warn_unused bool in_range(const span& x) const;\n  \n  arma_inline arma_warn_unused bool in_range(const uword   in_row, const uword   in_col, const uword   in_slice) const;\n       inline arma_warn_unused bool in_range(const span& row_span, const span& col_span, const span& slice_span) const;\n  \n       inline arma_warn_unused bool in_range(const uword   in_row, const uword   in_col, const uword   in_slice, const SizeCube& s) const;\n  \n  arma_inline arma_warn_unused       eT* memptr();\n  arma_inline arma_warn_unused const eT* memptr() const;\n  \n  arma_inline arma_warn_unused       eT* slice_memptr(const uword slice);\n  arma_inline arma_warn_unused const eT* slice_memptr(const uword slice) const;\n  \n  arma_inline arma_warn_unused       eT* slice_colptr(const uword in_slice, const uword in_col);\n  arma_inline arma_warn_unused const eT* slice_colptr(const uword in_slice, const uword in_col) const;\n  \n  inline void impl_print(const std::string& extra_text) const;\n  inline void impl_print(std::ostream& user_stream, const std::string& extra_text) const;\n  \n  inline void impl_raw_print(const std::string& extra_text) const;\n  inline void impl_raw_print(std::ostream& user_stream, const std::string& extra_text) const;\n  \n  inline void  set_size(const uword in_rows, const uword in_cols, const uword in_slices);\n  inline void   reshape(const uword in_rows, const uword in_cols, const uword in_slices, const uword dim = 0);\n  inline void    resize(const uword in_rows, const uword in_cols, const uword in_slices);\n  \n  template<typename eT2> inline void copy_size(const Cube<eT2>& m);\n  \n  \n  template<typename functor>\n  inline const Cube& transform(functor F);\n  \n  template<typename functor>\n  inline const Cube& imbue(functor F);\n  \n  \n  inline const Cube& fill(const eT val);\n  \n  inline const Cube& zeros();\n  inline const Cube& zeros(const uword in_rows, const uword in_cols, const uword in_slices);\n  \n  inline const Cube& ones();\n  inline const Cube& ones(const uword in_rows, const uword in_cols, const uword in_slices);\n  \n  inline const Cube& randu();\n  inline const Cube& randu(const uword in_rows, const uword in_cols, const uword in_slices);\n  \n  inline const Cube& randn();\n  inline const Cube& randn(const uword in_rows, const uword in_cols, const uword in_slices);\n  \n  inline void reset();\n  \n  \n  template<typename T1> inline void set_real(const BaseCube<pod_type,T1>& X);\n  template<typename T1> inline void set_imag(const BaseCube<pod_type,T1>& X);\n  \n  \n  inline arma_warn_unused eT min() const;\n  inline arma_warn_unused eT max() const;\n  \n  inline eT min(uword& index_of_min_val) const;\n  inline eT max(uword& index_of_max_val) const;\n  \n  inline eT min(uword& row_of_min_val, uword& col_of_min_val, uword& slice_of_min_val) const;\n  inline eT max(uword& row_of_max_val, uword& col_of_max_val, uword& slice_of_max_val) const;\n  \n  \n  inline bool save(const std::string   name, const file_type type = arma_binary, const bool print_status = true) const;\n  inline bool save(      std::ostream& os,   const file_type type = arma_binary, const bool print_status = true) const;\n  \n  inline bool load(const std::string   name, const file_type type = auto_detect, const bool print_status = true);\n  inline bool load(      std::istream& is,   const file_type type = auto_detect, const bool print_status = true);\n  \n  inline bool quiet_save(const std::string   name, const file_type type = arma_binary) const;\n  inline bool quiet_save(      std::ostream& os,   const file_type type = arma_binary) const;\n  \n  inline bool quiet_load(const std::string   name, const file_type type = auto_detect);\n  inline bool quiet_load(      std::istream& is,   const file_type type = auto_detect);\n  \n  \n  // iterators\n  \n  typedef       eT*       iterator;\n  typedef const eT* const_iterator;\n  \n  typedef       eT*       slice_iterator;\n  typedef const eT* const_slice_iterator;\n  \n  inline       iterator  begin();\n  inline const_iterator  begin() const;\n  inline const_iterator cbegin() const;\n  \n  inline       iterator  end();\n  inline const_iterator  end() const;\n  inline const_iterator cend() const;\n  \n  inline       slice_iterator begin_slice(const uword slice_num);\n  inline const_slice_iterator begin_slice(const uword slice_num) const;\n  \n  inline       slice_iterator end_slice(const uword slice_num);\n  inline const_slice_iterator end_slice(const uword slice_num)   const;\n  \n  inline void  clear();\n  inline bool  empty() const;\n  inline uword size()  const;\n  \n  inline void swap(Cube& B);\n  \n  inline void steal_mem(Cube& X);  //!< don't use this unless you're writing code internal to Armadillo\n  \n  template<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices> class fixed;\n  \n  \n  protected:\n  \n  inline void init_cold(const bool prealloc_mat = true);\n  inline void init_warm(const uword in_rows, const uword in_cols, const uword in_slices);\n  \n  template<typename T1, typename T2>\n  inline void init(const BaseCube<pod_type,T1>& A, const BaseCube<pod_type,T2>& B);\n  \n  inline void delete_mat();\n  inline void create_mat(const bool prealloc_mat = true);\n  \n  friend class glue_join;\n  friend class op_reshape;\n  friend class op_resize;\n  \n  \n  public:\n  \n  #ifdef ARMA_EXTRA_CUBE_PROTO\n    #include ARMA_INCFILE_WRAP(ARMA_EXTRA_CUBE_PROTO)\n  #endif\n  };\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\nclass Cube<eT>::fixed : public Cube<eT>\n  {\n  private:\n  \n  static const uword fixed_n_elem       = fixed_n_rows * fixed_n_cols * fixed_n_slices;\n  static const uword fixed_n_elem_slice = fixed_n_rows * fixed_n_cols;\n  \n  static const bool use_extra = (fixed_n_elem > Cube_prealloc::mem_n_elem);\n  \n  arma_aligned   Mat<eT>* mat_ptrs_local_extra[ (fixed_n_slices > Cube_prealloc::mat_ptrs_size) ? fixed_n_slices : 1 ];\n  arma_align_mem eT       mem_local_extra     [ use_extra                                       ? fixed_n_elem   : 1 ];\n  \n  arma_inline void mem_setup();\n  \n  \n  public:\n  \n  inline fixed();\n  inline fixed(const fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>& X);\n  \n  template<typename fill_type>       inline fixed(const fill::fill_class<fill_type>& f);\n  template<typename T1>              inline fixed(const BaseCube<eT,T1>& A);\n  template<typename T1, typename T2> inline fixed(const BaseCube<pod_type,T1>& A, const BaseCube<pod_type,T2>& B);\n  \n  using Cube<eT>::operator=;\n  using Cube<eT>::operator();\n  \n  inline const Cube& operator=(const fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>& X);\n  \n  \n  arma_inline arma_warn_unused       eT& operator[] (const uword i);\n  arma_inline arma_warn_unused const eT& operator[] (const uword i) const;\n  \n  arma_inline arma_warn_unused       eT& at         (const uword i);\n  arma_inline arma_warn_unused const eT& at         (const uword i) const;\n  \n  arma_inline arma_warn_unused       eT& operator() (const uword i);\n  arma_inline arma_warn_unused const eT& operator() (const uword i) const;\n  \n  arma_inline arma_warn_unused       eT& at         (const uword in_row, const uword in_col, const uword in_slice);\n  arma_inline arma_warn_unused const eT& at         (const uword in_row, const uword in_col, const uword in_slice) const;\n  \n  arma_inline arma_warn_unused       eT& operator() (const uword in_row, const uword in_col, const uword in_slice);\n  arma_inline arma_warn_unused const eT& operator() (const uword in_row, const uword in_col, const uword in_slice) const;\n  };\n\n\n\nclass Cube_aux\n  {\n  public:\n  \n  template<typename eT> arma_inline static void prefix_pp(Cube<eT>& x);\n  template<typename T>  arma_inline static void prefix_pp(Cube< std::complex<T> >& x);\n  \n  template<typename eT> arma_inline static void postfix_pp(Cube<eT>& x);\n  template<typename T>  arma_inline static void postfix_pp(Cube< std::complex<T> >& x);\n  \n  template<typename eT> arma_inline static void prefix_mm(Cube<eT>& x);\n  template<typename T>  arma_inline static void prefix_mm(Cube< std::complex<T> >& x);\n  \n  template<typename eT> arma_inline static void postfix_mm(Cube<eT>& x);\n  template<typename T>  arma_inline static void postfix_mm(Cube< std::complex<T> >& x);\n  \n  template<typename eT, typename T1> inline static void set_real(Cube<eT>&                out, const BaseCube<eT,T1>& X);\n  template<typename eT, typename T1> inline static void set_imag(Cube<eT>&                out, const BaseCube<eT,T1>& X);\n  \n  template<typename T,  typename T1> inline static void set_real(Cube< std::complex<T> >& out, const BaseCube< T,T1>& X);\n  template<typename T,  typename T1> inline static void set_imag(Cube< std::complex<T> >& out, const BaseCube< T,T1>& X);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Cube_meat.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Cube\n//! @{\n\n\ntemplate<typename eT>\ninline\nCube<eT>::~Cube()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  delete_mat();\n  \n  if(mem_state == 0)\n    {\n    if(n_elem > Cube_prealloc::mem_n_elem)\n      {\n      memory::release( access::rw(mem) );\n      }\n    }\n  \n  if(arma_config::debug == true)\n    {\n    // try to expose buggy user code that accesses deleted objects\n    access::rw(mat_ptrs) = 0;\n    access::rw(mem)      = 0;\n    }\n  \n  arma_type_check(( is_supported_elem_type<eT>::value == false ));\n  }\n\n\n\ntemplate<typename eT>\ninline\nCube<eT>::Cube()\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem_slice(0)\n  , n_slices(0)\n  , n_elem(0)\n  , mem_state(0)\n  , mat_ptrs(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\n//! construct the cube to have user specified dimensions\ntemplate<typename eT>\ninline\nCube<eT>::Cube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices)\n  : n_rows(in_n_rows)\n  , n_cols(in_n_cols)\n  , n_elem_slice(in_n_rows*in_n_cols)\n  , n_slices(in_n_slices)\n  , n_elem(in_n_rows*in_n_cols*in_n_slices)\n  , mem_state(0)\n  , mat_ptrs(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  }\n\n\n\n//! construct the cube to have user specified dimensions and fill with specified pattern\ntemplate<typename eT>\ntemplate<typename fill_type>\ninline\nCube<eT>::Cube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices, const fill::fill_class<fill_type>&)\n  : n_rows(in_n_rows)\n  , n_cols(in_n_cols)\n  , n_elem_slice(in_n_rows*in_n_cols)\n  , n_slices(in_n_slices)\n  , n_elem(in_n_rows*in_n_cols*in_n_slices)\n  , mem_state(0)\n  , mat_ptrs(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  \n  if(is_same_type<fill_type, fill::fill_zeros>::yes)  (*this).zeros();\n  if(is_same_type<fill_type, fill::fill_ones >::yes)  (*this).ones();\n  if(is_same_type<fill_type, fill::fill_randu>::yes)  (*this).randu();\n  if(is_same_type<fill_type, fill::fill_randn>::yes)  (*this).randn();\n  \n  if(is_same_type<fill_type, fill::fill_eye  >::yes)  { arma_debug_check(true, \"Cube::Cube(): unsupported fill type\"); }\n  }\n\n\n\n#if defined(ARMA_USE_CXX11)\n  \n  template<typename eT>\n  inline\n  Cube<eT>::Cube(Cube<eT>&& in_cube)\n    : n_rows(0)\n    , n_cols(0)\n    , n_elem_slice(0)\n    , n_slices(0)\n    , n_elem(0)\n    , mem_state(0)\n    , mat_ptrs(0)\n    , mem()\n    {\n    arma_extra_debug_sigprint_this(this);\n    arma_extra_debug_sigprint(arma_boost::format(\"this = %x   in_cube = %x\") % this % &in_cube);\n    \n    (*this).steal_mem(in_cube);\n    }\n    \n  \n  \n  template<typename eT>\n  inline\n  const Cube<eT>&\n  Cube<eT>::operator=(Cube<eT>&& in_cube)\n    {\n    arma_extra_debug_sigprint(arma_boost::format(\"this = %x   in_cube = %x\") % this % &in_cube);\n    \n    (*this).steal_mem(in_cube);\n    \n    return *this;\n    }\n  \n#endif\n\n\n\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::init_cold(const bool prealloc_mat)\n  {\n  arma_extra_debug_sigprint( arma_boost::format(\"n_rows = %d, n_cols = %d, n_slices = %d\") % n_rows % n_cols % n_slices );\n  \n  #if (defined(ARMA_USE_CXX11) || defined(ARMA_64BIT_WORD))\n    const char* error_message = \"Cube::init(): requested size is too large\";\n  #else\n    const char* error_message = \"Cube::init(): requested size is too large; suggest to compile in C++11 mode or enable ARMA_64BIT_WORD\";\n  #endif\n  \n  arma_debug_check\n    (\n      (\n      ( (n_rows > 0x0FFF) || (n_cols > 0x0FFF) || (n_slices > 0xFF) )\n        ? ( (double(n_rows) * double(n_cols) * double(n_slices)) > double(ARMA_MAX_UWORD) )\n        : false\n      ),\n    error_message\n    );\n  \n  if(n_elem <= Cube_prealloc::mem_n_elem)\n    {\n    arma_extra_debug_print(\"Cube::init(): using local memory\");\n    \n    access::rw(mem) = mem_local;\n    }\n  else\n    {\n    arma_extra_debug_print(\"Cube::init(): allocating memory\");\n    \n    access::rw(mem) = memory::acquire<eT>(n_elem);\n    }\n  \n  \n  if(n_elem == 0)\n    {\n    access::rw(n_rows)       = 0;\n    access::rw(n_cols)       = 0;\n    access::rw(n_elem_slice) = 0;\n    access::rw(n_slices)     = 0;\n    }\n  else\n    {\n    create_mat(prealloc_mat);\n    }\n  }\n\n\n\n//! internal cube construction; if the requested size is small enough, memory from the stack is used.\n//! otherwise memory is allocated via 'new'\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::init_warm(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices)\n  {\n  arma_extra_debug_sigprint( arma_boost::format(\"in_n_rows = %d, in_n_cols = %d, in_n_slices = %d\") % in_n_rows % in_n_cols % in_n_slices );\n  \n  if( (n_rows == in_n_rows) && (n_cols == in_n_cols) && (n_slices == in_n_slices) )\n    {\n    return;\n    }\n  \n  const uword t_mem_state = mem_state;\n  \n  bool  err_state = false;\n  char* err_msg   = 0;\n  \n  arma_debug_set_error\n    (\n    err_state,\n    err_msg,\n    (t_mem_state == 3),\n    \"Cube::init(): size is fixed and hence cannot be changed\"\n    );\n  \n  #if (defined(ARMA_USE_CXX11) || defined(ARMA_64BIT_WORD))\n    const char* error_message = \"Cube::init(): requested size is too large\";\n  #else\n    const char* error_message = \"Cube::init(): requested size is too large; suggest to compile in C++11 mode or enable ARMA_64BIT_WORD\";\n  #endif\n  \n  arma_debug_set_error\n    (\n    err_state,\n    err_msg,\n      (\n      ( (in_n_rows > 0x0FFF) || (in_n_cols > 0x0FFF) || (in_n_slices > 0xFF) )\n        ? ( (double(in_n_rows) * double(in_n_cols) * double(in_n_slices)) > double(ARMA_MAX_UWORD) )\n        : false\n      ),\n    error_message\n    );\n  \n  arma_debug_check(err_state, err_msg);\n  \n  const uword old_n_elem = n_elem;\n  const uword new_n_elem = in_n_rows * in_n_cols * in_n_slices;\n  \n  if(old_n_elem == new_n_elem)\n    {\n    delete_mat();\n    \n    if(new_n_elem > 0)\n      {\n      access::rw(n_rows)       = in_n_rows;\n      access::rw(n_cols)       = in_n_cols;\n      access::rw(n_elem_slice) = in_n_rows*in_n_cols;\n      access::rw(n_slices)     = in_n_slices;\n      \n      create_mat();\n      }\n    }\n  else\n    {\n    arma_debug_check( (t_mem_state == 2), \"Cube::init(): requested size is not compatible with the size of auxiliary memory\" );\n    \n    delete_mat();\n    \n    if(t_mem_state == 0)\n      {\n      if(n_elem > Cube_prealloc::mem_n_elem )\n        {\n        arma_extra_debug_print(\"Cube::init(): freeing memory\");\n        \n        memory::release( access::rw(mem) );\n        }\n      }\n    \n    access::rw(mem_state) = 0;\n    \n    if(new_n_elem <= Cube_prealloc::mem_n_elem)\n      {\n      arma_extra_debug_print(\"Cube::init(): using local memory\");\n      \n      access::rw(mem) = mem_local;\n      }\n    else\n      {\n      arma_extra_debug_print(\"Cube::init(): allocating memory\");\n      \n      access::rw(mem) = memory::acquire<eT>(new_n_elem);\n      }\n    \n    if(new_n_elem > 0)\n      {\n      access::rw(n_rows)       = in_n_rows;\n      access::rw(n_cols)       = in_n_cols;\n      access::rw(n_elem_slice) = in_n_rows*in_n_cols;\n      access::rw(n_slices)     = in_n_slices;\n      access::rw(n_elem)       = new_n_elem;\n      \n      create_mat();\n      }\n    }\n  \n  \n  if(new_n_elem == 0)\n    {\n    access::rw(n_rows)       = 0;\n    access::rw(n_cols)       = 0;\n    access::rw(n_elem_slice) = 0;\n    access::rw(n_slices)     = 0;\n    access::rw(n_elem)       = 0;\n    }\n  }\n\n\n\n//! for constructing a complex cube out of two non-complex cubes\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nvoid\nCube<eT>::init\n  (\n  const BaseCube<typename Cube<eT>::pod_type,T1>& X,\n  const BaseCube<typename Cube<eT>::pod_type,T2>& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type T;\n  \n  arma_type_check(( is_complex<eT>::value == false ));   //!< compile-time abort if eT is not std::complex\n  arma_type_check(( is_complex< T>::value == true  ));   //!< compile-time abort if  T is     std::complex\n  \n  arma_type_check(( is_same_type< std::complex<T>, eT >::no ));   //!< compile-time abort if types are not compatible\n  \n  const ProxyCube<T1> PX(X.get_ref());\n  const ProxyCube<T2> PY(Y.get_ref());\n  \n  arma_debug_assert_same_size(PX, PY, \"Cube()\");\n  \n  const uword local_n_rows   = PX.get_n_rows();\n  const uword local_n_cols   = PX.get_n_cols();\n  const uword local_n_slices = PX.get_n_slices();\n  \n  init_warm(local_n_rows, local_n_cols, local_n_slices);\n  \n  eT* out_mem = (*this).memptr();\n  \n  const bool prefer_at_accessor = ( ProxyCube<T1>::prefer_at_accessor || ProxyCube<T2>::prefer_at_accessor );\n  \n  if(prefer_at_accessor == false)\n    {\n    typedef typename ProxyCube<T1>::ea_type ea_type1;\n    typedef typename ProxyCube<T2>::ea_type ea_type2;\n    \n    const uword N = n_elem;\n    \n    ea_type1 A = PX.get_ea();\n    ea_type2 B = PY.get_ea();\n        \n    for(uword i=0; i<N; ++i)\n      {\n      out_mem[i] = std::complex<T>(A[i], B[i]);\n      }\n    }\n  else\n    {\n    for(uword uslice = 0; uslice < local_n_slices; ++uslice)\n    for(uword ucol   = 0;   ucol < local_n_cols;   ++ucol  )\n    for(uword urow   = 0;   urow < local_n_rows;   ++urow  )\n      {\n      *out_mem = std::complex<T>( PX.at(urow,ucol,uslice), PY.at(urow,ucol,uslice) );\n      out_mem++;\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::delete_mat()\n  {\n  arma_extra_debug_sigprint();\n  \n  if(mat_ptrs != NULL)\n    {\n    for(uword uslice = 0; uslice < n_slices; ++uslice)\n      {\n      if(mat_ptrs[uslice] != NULL)  { delete access::rw(mat_ptrs[uslice]); }\n      }\n    \n    if(mem_state <= 2)\n      {\n      if(n_slices > Cube_prealloc::mat_ptrs_size)\n        {\n        delete [] mat_ptrs;\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::create_mat(const bool prealloc_mat)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(mem_state <= 2)\n    {\n    if(n_slices <= Cube_prealloc::mat_ptrs_size)\n      {\n      access::rw(mat_ptrs) = const_cast< const Mat<eT>** >(mat_ptrs_local);\n      }\n    else\n      {\n      access::rw(mat_ptrs) = new(std::nothrow) const Mat<eT>*[n_slices];\n      \n      arma_check_bad_alloc( (mat_ptrs == 0), \"Cube::create_mat(): out of memory\" );\n      }\n    }\n  \n  for(uword uslice = 0; uslice < n_slices; ++uslice)\n    {\n    mat_ptrs[uslice] = prealloc_mat ? new Mat<eT>('j', slice_memptr(uslice), n_rows, n_cols) : NULL;\n    }\n  }\n\n\n\n//! Set the cube to be equal to the specified scalar.\n//! NOTE: the size of the cube will be 1x1x1\ntemplate<typename eT>\narma_inline\nconst Cube<eT>&\nCube<eT>::operator=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  init_warm(1,1,1);\n  access::rw(mem[0]) = val;\n  return *this;\n  }\n\n\n\n//! In-place addition of a scalar to all elements of the cube\ntemplate<typename eT>\narma_inline\nconst Cube<eT>&\nCube<eT>::operator+=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::inplace_plus( memptr(), val, n_elem );\n  \n  return *this;\n  }\n\n\n\n//! In-place subtraction of a scalar from all elements of the cube\ntemplate<typename eT>\narma_inline\nconst Cube<eT>&\nCube<eT>::operator-=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::inplace_minus( memptr(), val, n_elem );\n  \n  return *this;\n  }\n\n\n\n//! In-place multiplication of all elements of the cube with a scalar\ntemplate<typename eT>\narma_inline\nconst Cube<eT>&\nCube<eT>::operator*=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::inplace_mul( memptr(), val, n_elem );\n  \n  return *this;\n  }\n\n\n\n//! In-place division of all elements of the cube with a scalar\ntemplate<typename eT>\narma_inline\nconst Cube<eT>&\nCube<eT>::operator/=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::inplace_div( memptr(), val, n_elem );\n  \n  return *this;\n  }\n\n\n\n//! construct a cube from a given cube\ntemplate<typename eT>\ninline\nCube<eT>::Cube(const Cube<eT>& x)\n  : n_rows(x.n_rows)\n  , n_cols(x.n_cols)\n  , n_elem_slice(x.n_elem_slice)\n  , n_slices(x.n_slices)\n  , n_elem(x.n_elem)\n  , mem_state(0)\n  , mat_ptrs(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  arma_extra_debug_sigprint(arma_boost::format(\"this = %x   in_cube = %x\") % this % &x);\n  \n  init_cold();\n  \n  arrayops::copy( memptr(), x.mem, n_elem );\n  }\n\n\n\n//! construct a cube from a given cube\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::operator=(const Cube<eT>& x)\n  {\n  arma_extra_debug_sigprint(arma_boost::format(\"this = %x   in_cube = %x\") % this % &x);\n  \n  if(this != &x)\n    {\n    init_warm(x.n_rows, x.n_cols, x.n_slices);\n    \n    arrayops::copy( memptr(), x.mem, n_elem );\n    }\n  \n  return *this;\n  }\n\n\n\n//! construct a cube from a given auxiliary array of eTs.\n//! if copy_aux_mem is true, new memory is allocated and the array is copied.\n//! if copy_aux_mem is false, the auxiliary array is used directly (without allocating memory and copying).\n//! note that in the latter case \n//! the default is to copy the array.\n\ntemplate<typename eT>\ninline\nCube<eT>::Cube(eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const uword aux_n_slices, const bool copy_aux_mem, const bool strict, const bool prealloc_mat)\n  : n_rows      ( aux_n_rows                          )\n  , n_cols      ( aux_n_cols                          )\n  , n_elem_slice( aux_n_rows*aux_n_cols               )\n  , n_slices    ( aux_n_slices                        )\n  , n_elem      ( aux_n_rows*aux_n_cols*aux_n_slices  )\n  , mem_state   ( copy_aux_mem ? 0 : (strict ? 2 : 1) )\n  , mat_ptrs    ( 0                                   )\n  , mem         ( copy_aux_mem ? 0 : aux_mem          )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  if(copy_aux_mem == true)\n    {\n    init_cold(prealloc_mat);\n    \n    arrayops::copy( memptr(), aux_mem, n_elem );\n    }\n  else\n    {\n    create_mat(prealloc_mat);\n    }\n  }\n\n\n\n//! construct a cube from a given auxiliary read-only array of eTs.\n//! the array is copied.\ntemplate<typename eT>\ninline\nCube<eT>::Cube(const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const uword aux_n_slices)\n  : n_rows(aux_n_rows)\n  , n_cols(aux_n_cols)\n  , n_elem_slice(aux_n_rows*aux_n_cols)\n  , n_slices(aux_n_slices)\n  , n_elem(aux_n_rows*aux_n_cols*aux_n_slices)\n  , mem_state(0)\n  , mat_ptrs(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  \n  arrayops::copy( memptr(), aux_mem, n_elem );\n  }\n\n\n\n//! in-place cube addition\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::operator+=(const Cube<eT>& m)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(*this, m, \"addition\");\n  \n  arrayops::inplace_plus( memptr(), m.memptr(), n_elem );\n  \n  return *this;\n  }\n\n\n\n//! in-place cube subtraction\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::operator-=(const Cube<eT>& m)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(*this, m, \"subtraction\");\n  \n  arrayops::inplace_minus( memptr(), m.memptr(), n_elem );\n  \n  return *this;\n  }\n\n\n\n//! in-place element-wise cube multiplication\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::operator%=(const Cube<eT>& m)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(*this, m, \"element-wise multiplication\");\n  \n  arrayops::inplace_mul( memptr(), m.memptr(), n_elem );\n  \n  return *this;\n  }\n\n\n\n//! in-place element-wise cube division\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::operator/=(const Cube<eT>& m)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(*this, m, \"element-wise division\");\n  \n  arrayops::inplace_div( memptr(), m.memptr(), n_elem );\n  \n  return *this;\n  }\n\n\n\n//! for constructing a complex cube out of two non-complex cubes\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nCube<eT>::Cube\n  (\n  const BaseCube<typename Cube<eT>::pod_type,T1>& A,\n  const BaseCube<typename Cube<eT>::pod_type,T2>& B\n  )\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem_slice(0)\n  , n_slices(0)\n  , n_elem(0)\n  , mem_state(0)\n  , mat_ptrs(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init(A,B);\n  }\n\n\n\n//! construct a cube from a subview_cube instance (e.g. construct a cube from a delayed subcube operation)\ntemplate<typename eT>\ninline\nCube<eT>::Cube(const subview_cube<eT>& X)\n  : n_rows(X.n_rows)\n  , n_cols(X.n_cols)\n  , n_elem_slice(X.n_elem_slice)\n  , n_slices(X.n_slices)\n  , n_elem(X.n_elem)\n  , mem_state(0)\n  , mat_ptrs(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  \n  subview_cube<eT>::extract(*this, X);\n  }\n\n\n\n//! construct a cube from a subview_cube instance (e.g. construct a cube from a delayed subcube operation)\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::operator=(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool alias = (this == &(X.m));\n  \n  if(alias == false)\n    {\n    init_warm(X.n_rows, X.n_cols, X.n_slices);\n    \n    subview_cube<eT>::extract(*this, X);\n    }\n  else\n    {\n    Cube<eT> tmp(X);\n    \n    steal_mem(tmp);\n    }\n  \n  return *this;\n  }\n\n\n\n//! in-place cube addition (using a subcube on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::operator+=(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_cube<eT>::plus_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place cube subtraction (using a subcube on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::operator-=(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_cube<eT>::minus_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place element-wise cube mutiplication (using a subcube on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::operator%=(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_cube<eT>::schur_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place element-wise cube division (using a subcube on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::operator/=(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_cube<eT>::div_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! provide the reference to the matrix representing a single slice\ntemplate<typename eT>\narma_inline\nMat<eT>&\nCube<eT>::slice(const uword in_slice)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (in_slice >= n_slices), \"Cube::slice(): index out of bounds\" );\n  \n  if(mat_ptrs[in_slice] == NULL)\n    {\n    mat_ptrs[in_slice] = new Mat<eT>('j', slice_memptr(in_slice), n_rows, n_cols);\n    }\n  \n  return const_cast< Mat<eT>& >( *(mat_ptrs[in_slice]) );\n  }\n\n\n\n//! provide the reference to the matrix representing a single slice\ntemplate<typename eT>\narma_inline\nconst Mat<eT>&\nCube<eT>::slice(const uword in_slice) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (in_slice >= n_slices), \"Cube::slice(): index out of bounds\" );\n  \n  if(mat_ptrs[in_slice] == NULL)\n    {\n    mat_ptrs[in_slice] = new Mat<eT>('j', slice_memptr(in_slice), n_rows, n_cols);\n    }\n  \n  return *(mat_ptrs[in_slice]);\n  }\n\n\n\n//! creation of subview_cube (subcube comprised of specified slices)\ntemplate<typename eT>\narma_inline\nsubview_cube<eT>\nCube<eT>::slices(const uword in_slice1, const uword in_slice2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_slice1 > in_slice2) || (in_slice2 >= n_slices),\n    \"Cube::slices(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword subcube_n_slices = in_slice2 - in_slice1 + 1;\n  \n  return subview_cube<eT>(*this, 0, 0, in_slice1, n_rows, n_cols, subcube_n_slices);\n  }\n\n\n\n//! creation of subview_cube (subcube comprised of specified slices)\ntemplate<typename eT>\narma_inline\nconst subview_cube<eT>\nCube<eT>::slices(const uword in_slice1, const uword in_slice2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_slice1 > in_slice2) || (in_slice2 >= n_slices),\n    \"Cube::rows(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword subcube_n_slices = in_slice2 - in_slice1 + 1;\n  \n  return subview_cube<eT>(*this, 0, 0, in_slice1, n_rows, n_cols, subcube_n_slices);\n  }\n\n\n\n//! creation of subview_cube (generic subcube)\ntemplate<typename eT>\narma_inline\nsubview_cube<eT>\nCube<eT>::subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 >  in_row2) || (in_col1 >  in_col2) || (in_slice1 >  in_slice2) ||\n    (in_row2 >= n_rows)  || (in_col2 >= n_cols)  || (in_slice2 >= n_slices),\n    \"Cube::subcube(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword subcube_n_rows   = in_row2   - in_row1   + 1;\n  const uword subcube_n_cols   = in_col2   - in_col1   + 1;\n  const uword subcube_n_slices = in_slice2 - in_slice1 + 1;\n  \n  return subview_cube<eT>(*this, in_row1, in_col1, in_slice1, subcube_n_rows, subcube_n_cols, subcube_n_slices);\n  }\n\n\n\n//! creation of subview_cube (generic subcube)\ntemplate<typename eT>\narma_inline\nconst subview_cube<eT>\nCube<eT>::subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 >  in_row2) || (in_col1 >  in_col2) || (in_slice1 >  in_slice2) ||\n    (in_row2 >= n_rows)  || (in_col2 >= n_cols)  || (in_slice2 >= n_slices),\n    \"Cube::subcube(): indices out of bounds or incorrectly used\"\n    );\n    \n  const uword subcube_n_rows   = in_row2   - in_row1   + 1;\n  const uword subcube_n_cols   = in_col2   - in_col1   + 1;\n  const uword subcube_n_slices = in_slice2 - in_slice1 + 1;\n  \n  return subview_cube<eT>(*this, in_row1, in_col1, in_slice1, subcube_n_rows, subcube_n_cols, subcube_n_slices);\n  }\n\n\n\n//! creation of subview_cube (generic subcube)\ntemplate<typename eT>\ninline\nsubview_cube<eT>\nCube<eT>::subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword l_n_rows   = n_rows;\n  const uword l_n_cols   = n_cols;\n  const uword l_n_slices = n_slices;\n  \n  const uword s_n_rows   = s.n_rows;\n  const uword s_n_cols   = s.n_cols;\n  const uword s_n_slices = s.n_slices;\n  \n  arma_debug_check\n    (\n       ( in_row1             >= l_n_rows) || ( in_col1             >= l_n_cols) || ( in_slice1               >= l_n_slices)\n    || ((in_row1 + s_n_rows) >  l_n_rows) || ((in_col1 + s_n_cols) >  l_n_cols) || ((in_slice1 + s_n_slices) >  l_n_slices),\n    \"Cube::subcube(): indices or size out of bounds\"\n    );\n  \n  return subview_cube<eT>(*this, in_row1, in_col1, in_slice1, s_n_rows, s_n_cols, s_n_slices);\n  }\n\n\n\n//! creation of subview_cube (generic subcube)\ntemplate<typename eT>\ninline\nconst subview_cube<eT>\nCube<eT>::subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword l_n_rows   = n_rows;\n  const uword l_n_cols   = n_cols;\n  const uword l_n_slices = n_slices;\n  \n  const uword s_n_rows   = s.n_rows;\n  const uword s_n_cols   = s.n_cols;\n  const uword s_n_slices = s.n_slices;\n  \n  arma_debug_check\n    (\n       ( in_row1             >= l_n_rows) || ( in_col1             >= l_n_cols) || ( in_slice1               >= l_n_slices)\n    || ((in_row1 + s_n_rows) >  l_n_rows) || ((in_col1 + s_n_cols) >  l_n_cols) || ((in_slice1 + s_n_slices) >  l_n_slices),\n    \"Cube::subcube(): indices or size out of bounds\"\n    );\n  \n  return subview_cube<eT>(*this, in_row1, in_col1, in_slice1, s_n_rows, s_n_cols, s_n_slices);\n  }\n\n\n\n//! creation of subview_cube (generic subcube)\ntemplate<typename eT>\ninline\nsubview_cube<eT>\nCube<eT>::subcube(const span& row_span, const span& col_span, const span& slice_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all   = row_span.whole;\n  const bool col_all   = col_span.whole;\n  const bool slice_all = slice_span.whole;\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  const uword in_row1          = row_all   ? 0              : row_span.a;\n  const uword in_row2          =                              row_span.b;\n  const uword subcube_n_rows   = row_all   ? local_n_rows   : in_row2 - in_row1 + 1;\n  \n  const uword in_col1          = col_all   ? 0              : col_span.a;\n  const uword in_col2          =                              col_span.b;\n  const uword subcube_n_cols   = col_all   ? local_n_cols   : in_col2 - in_col1 + 1;\n  \n  const uword in_slice1        = slice_all ? 0              : slice_span.a;\n  const uword in_slice2        =                              slice_span.b;\n  const uword subcube_n_slices = slice_all ? local_n_slices : in_slice2 - in_slice1 + 1;\n  \n  arma_debug_check\n    (\n    ( row_all   ? false : ((in_row1   >  in_row2)   || (in_row2   >= local_n_rows))   )\n    ||\n    ( col_all   ? false : ((in_col1   >  in_col2)   || (in_col2   >= local_n_cols))   )\n    ||\n    ( slice_all ? false : ((in_slice1 >  in_slice2) || (in_slice2 >= local_n_slices)) )\n    ,\n    \"Cube::subcube(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview_cube<eT>(*this, in_row1, in_col1, in_slice1, subcube_n_rows, subcube_n_cols, subcube_n_slices);\n  }\n\n\n\n//! creation of subview_cube (generic subcube)\ntemplate<typename eT>\ninline\nconst subview_cube<eT>\nCube<eT>::subcube(const span& row_span, const span& col_span, const span& slice_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all   = row_span.whole;\n  const bool col_all   = col_span.whole;\n  const bool slice_all = slice_span.whole;\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  const uword in_row1          = row_all   ? 0              : row_span.a;\n  const uword in_row2          =                              row_span.b;\n  const uword subcube_n_rows   = row_all   ? local_n_rows   : in_row2 - in_row1 + 1;\n  \n  const uword in_col1          = col_all   ? 0              : col_span.a;\n  const uword in_col2          =                              col_span.b;\n  const uword subcube_n_cols   = col_all   ? local_n_cols   : in_col2 - in_col1 + 1;\n  \n  const uword in_slice1        = slice_all ? 0              : slice_span.a;\n  const uword in_slice2        =                              slice_span.b;\n  const uword subcube_n_slices = slice_all ? local_n_slices : in_slice2 - in_slice1 + 1;\n  \n  arma_debug_check\n    (\n    ( row_all   ? false : ((in_row1   >  in_row2)   || (in_row2   >= local_n_rows))   )\n    ||\n    ( col_all   ? false : ((in_col1   >  in_col2)   || (in_col2   >= local_n_cols))   )\n    ||\n    ( slice_all ? false : ((in_slice1 >  in_slice2) || (in_slice2 >= local_n_slices)) )\n    ,\n    \"Cube::subcube(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview_cube<eT>(*this, in_row1, in_col1, in_slice1, subcube_n_rows, subcube_n_cols, subcube_n_slices);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_cube<eT>\nCube<eT>::operator()(const span& row_span, const span& col_span, const span& slice_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).subcube(row_span, col_span, slice_span);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview_cube<eT>\nCube<eT>::operator()(const span& row_span, const span& col_span, const span& slice_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).subcube(row_span, col_span, slice_span);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_cube<eT>\nCube<eT>::operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).subcube(in_row1, in_col1, in_slice1, s);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview_cube<eT>\nCube<eT>::operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).subcube(in_row1, in_col1, in_slice1, s);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_cube<eT>\nCube<eT>::tube(const uword in_row1, const uword in_col1)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    ((in_row1 >= n_rows) || (in_col1 >= n_cols)),\n    \"Cube::tube(): indices out of bounds\"\n    );\n  \n  return subview_cube<eT>(*this, in_row1, in_col1, 0, 1, 1, n_slices);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_cube<eT>\nCube<eT>::tube(const uword in_row1, const uword in_col1) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    ((in_row1 >= n_rows) || (in_col1 >= n_cols)),\n    \"Cube::tube(): indices out of bounds\"\n    );\n  \n  return subview_cube<eT>(*this, in_row1, in_col1, 0, 1, 1, n_slices);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_cube<eT>\nCube<eT>::tube(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 >  in_row2) || (in_col1 >  in_col2) ||\n    (in_row2 >= n_rows)  || (in_col2 >= n_cols),\n    \"Cube::tube(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword subcube_n_rows = in_row2 - in_row1 + 1;\n  const uword subcube_n_cols = in_col2 - in_col1 + 1;\n  \n  return subview_cube<eT>(*this, in_row1, in_col1, 0, subcube_n_rows, subcube_n_cols, n_slices);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_cube<eT>\nCube<eT>::tube(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 >  in_row2) || (in_col1 >  in_col2) ||\n    (in_row2 >= n_rows)  || (in_col2 >= n_cols),\n    \"Cube::tube(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword subcube_n_rows = in_row2 - in_row1 + 1;\n  const uword subcube_n_cols = in_col2 - in_col1 + 1;\n  \n  return subview_cube<eT>(*this, in_row1, in_col1, 0, subcube_n_rows, subcube_n_cols, n_slices);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_cube<eT>\nCube<eT>::tube(const uword in_row1, const uword in_col1, const SizeMat& s)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword l_n_rows = n_rows;\n  const uword l_n_cols = n_cols;\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  \n  arma_debug_check\n    (\n    ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols)),\n    \"Cube::tube(): indices or size out of bounds\"\n    );\n  \n  return subview_cube<eT>(*this, in_row1, in_col1, 0, s_n_rows, s_n_cols, n_slices);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_cube<eT>\nCube<eT>::tube(const uword in_row1, const uword in_col1, const SizeMat& s) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword l_n_rows = n_rows;\n  const uword l_n_cols = n_cols;\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  \n  arma_debug_check\n    (\n    ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols)),\n    \"Cube::tube(): indices or size out of bounds\"\n    );\n  \n  return subview_cube<eT>(*this, in_row1, in_col1, 0, s_n_rows, s_n_cols, n_slices);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_cube<eT>\nCube<eT>::tube(const span& row_span, const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all = row_span.whole;\n  const bool col_all = col_span.whole;\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  \n  const uword in_row1        = row_all   ? 0            : row_span.a;\n  const uword in_row2        =                            row_span.b;\n  const uword subcube_n_rows = row_all   ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  const uword in_col1        = col_all   ? 0            : col_span.a;\n  const uword in_col2        =                            col_span.b;\n  const uword subcube_n_cols = col_all   ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  arma_debug_check\n    (\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,\n    \"Cube::tube(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview_cube<eT>(*this, in_row1, in_col1, 0, subcube_n_rows, subcube_n_cols, n_slices);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview_cube<eT>\nCube<eT>::tube(const span& row_span, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all = row_span.whole;\n  const bool col_all = col_span.whole;\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  \n  const uword in_row1        = row_all   ? 0            : row_span.a;\n  const uword in_row2        =                            row_span.b;\n  const uword subcube_n_rows = row_all   ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  const uword in_col1        = col_all   ? 0            : col_span.a;\n  const uword in_col2        =                            col_span.b;\n  const uword subcube_n_cols = col_all   ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  arma_debug_check\n    (\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,\n    \"Cube::tube(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview_cube<eT>(*this, in_row1, in_col1, 0, subcube_n_rows, subcube_n_cols, n_slices);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\narma_inline\nsubview_elem1<eT,T1>\nCube<eT>::elem(const Base<uword,T1>& a)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem1<eT,T1>(*this, a);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\narma_inline\nconst subview_elem1<eT,T1>\nCube<eT>::elem(const Base<uword,T1>& a) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem1<eT,T1>(*this, a);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\narma_inline\nsubview_elem1<eT,T1>\nCube<eT>::operator()(const Base<uword,T1>& a)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem1<eT,T1>(*this, a);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\narma_inline\nconst subview_elem1<eT,T1>\nCube<eT>::operator()(const Base<uword,T1>& a) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem1<eT,T1>(*this, a);\n  }\n\n\n\n//! remove specified slice\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::shed_slice(const uword slice_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( slice_num >= n_slices, \"Cube::shed_slice(): index out of bounds\");\n  \n  shed_slices(slice_num, slice_num);\n  }\n\n\n\n//! remove specified slices\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::shed_slices(const uword in_slice1, const uword in_slice2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_slice1 > in_slice2) || (in_slice2 >= n_slices),\n    \"Cube::shed_slices(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword n_keep_front = in_slice1;\n  const uword n_keep_back  = n_slices - (in_slice2 + 1);\n  \n  Cube<eT> X(n_rows, n_cols, n_keep_front + n_keep_back);\n  \n  if(n_keep_front > 0)\n    {\n    X.slices( 0, (n_keep_front-1) ) = slices( 0, (in_slice1-1) );\n    }\n  \n  if(n_keep_back > 0)\n    {\n    X.slices( n_keep_front,  (n_keep_front+n_keep_back-1) ) = slices( (in_slice2+1), (n_slices-1) );\n    }\n  \n  steal_mem(X);\n  }\n\n\n\n//! insert N slices at the specified slice position,\n//! optionally setting the elements of the inserted slices to zero\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::insert_slices(const uword slice_num, const uword N, const bool set_to_zero)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword t_n_slices = n_slices;\n  \n  const uword A_n_slices = slice_num;\n  const uword B_n_slices = t_n_slices - slice_num;\n  \n  // insertion at slice_num == n_slices is in effect an append operation\n  arma_debug_check( (slice_num > t_n_slices), \"Cube::insert_slices(): index out of bounds\");\n  \n  if(N > 0)\n    {\n    Cube<eT> out(n_rows, n_cols, t_n_slices + N);\n    \n    if(A_n_slices > 0)\n      {\n      out.slices(0, A_n_slices-1) = slices(0, A_n_slices-1);\n      }\n    \n    if(B_n_slices > 0)\n      {\n      out.slices(slice_num + N, t_n_slices + N - 1) = slices(slice_num, t_n_slices-1);\n      }\n    \n    if(set_to_zero == true)\n      {\n      //out.slices(slice_num, slice_num + N - 1).zeros();\n      \n      for(uword i=slice_num; i < (slice_num + N); ++i)\n        {\n        out.slice(i).zeros();\n        }\n      }\n    \n    steal_mem(out);\n    }\n  }\n\n\n\n//! insert the given object at the specified slice position; \n//! the given object must have the same number of rows and columns as the cube\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nCube<eT>::insert_slices(const uword slice_num, const BaseCube<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap_cube<T1> tmp(X.get_ref());\n  const Cube<eT>& C   = tmp.M;\n  \n  const uword N = C.n_slices;\n  \n  const uword t_n_slices = n_slices;\n  \n  const uword A_n_slices = slice_num;\n  const uword B_n_slices = t_n_slices - slice_num;\n  \n  // insertion at slice_num == n_slices is in effect an append operation\n  arma_debug_check( (slice_num  >  t_n_slices), \"Cube::insert_slices(): index out of bounds\");\n  \n  arma_debug_check\n    (\n    ( (C.n_rows != n_rows) || (C.n_cols != n_cols) ),\n    \"Cube::insert_slices(): given object has incompatible dimensions\"\n    );\n  \n  if(N > 0)\n    {\n    Cube<eT> out(n_rows, n_cols, t_n_slices + N);\n    \n    if(A_n_slices > 0)\n      {\n      out.slices(0, A_n_slices-1) = slices(0, A_n_slices-1);\n      }\n    \n    if(B_n_slices > 0)\n      {\n      out.slices(slice_num + N, t_n_slices + N - 1) = slices(slice_num, t_n_slices - 1);\n      }\n    \n    out.slices(slice_num, slice_num + N - 1) = C;\n    \n    steal_mem(out);\n    }\n  }\n\n\n\n//! create a cube from OpCube, i.e. run the previously delayed unary operations\ntemplate<typename eT>\ntemplate<typename gen_type>\ninline\nCube<eT>::Cube(const GenCube<eT, gen_type>& X)\n  : n_rows(X.n_rows)\n  , n_cols(X.n_cols)\n  , n_elem_slice(X.n_rows*X.n_cols)\n  , n_slices(X.n_slices)\n  , n_elem(X.n_rows*X.n_cols*X.n_slices)\n  , mem_state(0)\n  , mat_ptrs(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  \n  X.apply(*this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename gen_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator=(const GenCube<eT, gen_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  init_warm(X.n_rows, X.n_cols, X.n_slices);\n  \n  X.apply(*this);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename gen_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator+=(const GenCube<eT, gen_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  X.apply_inplace_plus(*this);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename gen_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator-=(const GenCube<eT, gen_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  X.apply_inplace_minus(*this);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename gen_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator%=(const GenCube<eT, gen_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  X.apply_inplace_schur(*this);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename gen_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator/=(const GenCube<eT, gen_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  X.apply_inplace_div(*this);\n  \n  return *this;\n  }\n\n\n\n//! create a cube from OpCube, i.e. run the previously delayed unary operations\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nCube<eT>::Cube(const OpCube<T1, op_type>& X)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem_slice(0)\n  , n_slices(0)\n  , n_elem(0)\n  , mem_state(0)\n  , mat_ptrs(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n\n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  op_type::apply(*this, X);\n  }\n\n\n\n//! create a cube from OpCube, i.e. run the previously delayed unary operations\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator=(const OpCube<T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  op_type::apply(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place cube addition, with the right-hand-side operand having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator+=(const OpCube<T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const Cube<eT> m(X);\n  \n  return (*this).operator+=(m);\n  }\n\n\n\n//! in-place cube subtraction, with the right-hand-side operand having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator-=(const OpCube<T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const Cube<eT> m(X);\n  \n  return (*this).operator-=(m);\n  }\n\n\n\n//! in-place cube element-wise multiplication, with the right-hand-side operand having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator%=(const OpCube<T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const Cube<eT> m(X);\n  \n  return (*this).operator%=(m);\n  }\n\n\n\n//! in-place cube element-wise division, with the right-hand-side operand having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator/=(const OpCube<T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const Cube<eT> m(X);\n  \n  return (*this).operator/=(m);\n  }\n\n\n\n//! create a cube from eOpCube, i.e. run the previously delayed unary operations\ntemplate<typename eT>\ntemplate<typename T1, typename eop_type>\ninline\nCube<eT>::Cube(const eOpCube<T1, eop_type>& X)\n  : n_rows(X.get_n_rows())\n  , n_cols(X.get_n_cols())\n  , n_elem_slice(X.get_n_elem_slice())\n  , n_slices(X.get_n_slices())\n  , n_elem(X.get_n_elem())\n  , mem_state(0)\n  , mat_ptrs(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  init_cold();\n  \n  eop_type::apply(*this, X);\n  }\n\n\n\n//! create a cube from eOpCube, i.e. run the previously delayed unary operations\ntemplate<typename eT>\ntemplate<typename T1, typename eop_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator=(const eOpCube<T1, eop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const bool bad_alias = ( X.P.has_subview  &&  X.P.is_alias(*this) );\n  \n  if(bad_alias == false)\n    {\n    init_warm(X.get_n_rows(), X.get_n_cols(), X.get_n_slices());\n    \n    eop_type::apply(*this, X);\n    }\n  else\n    {\n    Cube<eT> tmp(X);\n    \n    steal_mem(tmp);\n    }\n  \n  return *this;\n  }\n\n\n\n//! in-place cube addition, with the right-hand-side operand having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename eop_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator+=(const eOpCube<T1, eop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  eop_type::apply_inplace_plus(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place cube subtraction, with the right-hand-side operand having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename eop_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator-=(const eOpCube<T1, eop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  eop_type::apply_inplace_minus(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place cube element-wise multiplication, with the right-hand-side operand having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename eop_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator%=(const eOpCube<T1, eop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n\n  eop_type::apply_inplace_schur(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place cube element-wise division, with the right-hand-side operand having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename eop_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator/=(const eOpCube<T1, eop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n\n  eop_type::apply_inplace_div(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nCube<eT>::Cube(const mtOpCube<eT, T1, op_type>& X)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem_slice(0)\n  , n_slices(0)\n  , n_elem(0)\n  , mem_state(0)\n  , mat_ptrs(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  op_type::apply(*this, X);\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator=(const mtOpCube<eT, T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  op_type::apply(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator+=(const mtOpCube<eT, T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Cube<eT> m(X);\n  \n  return (*this).operator+=(m);\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator-=(const mtOpCube<eT, T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Cube<eT> m(X);\n  \n  return (*this).operator-=(m);\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator%=(const mtOpCube<eT, T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Cube<eT> m(X);\n  \n  return (*this).operator%=(m);\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator/=(const mtOpCube<eT, T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Cube<eT> m(X);\n  \n  return (*this).operator/=(m);\n  }\n\n\n\n//! create a cube from Glue, i.e. run the previously delayed binary operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nCube<eT>::Cube(const GlueCube<T1, T2, glue_type>& X)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem_slice(0)\n  , n_slices(0)\n  , n_elem(0)\n  , mem_state(0)\n  , mat_ptrs(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  this->operator=(X);\n  }\n\n\n\n//! create a cube from Glue, i.e. run the previously delayed binary operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator=(const GlueCube<T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  glue_type::apply(*this, X);\n  \n  return *this;\n  }\n\n\n//! in-place cube addition, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator+=(const GlueCube<T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  const Cube<eT> m(X);\n  \n  return (*this).operator+=(m);\n  }\n\n\n\n//! in-place cube subtraction, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator-=(const GlueCube<T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  const Cube<eT> m(X);\n  \n  return (*this).operator-=(m);\n  }\n\n\n\n//! in-place cube element-wise multiplication, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator%=(const GlueCube<T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  const Cube<eT> m(X);\n  \n  return (*this).operator%=(m);\n  }\n\n\n\n//! in-place cube element-wise division, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator/=(const GlueCube<T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  const Cube<eT> m(X);\n  \n  return (*this).operator/=(m);\n  }\n\n\n\n//! create a cube from eGlue, i.e. run the previously delayed binary operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename eglue_type>\ninline\nCube<eT>::Cube(const eGlueCube<T1, T2, eglue_type>& X)\n  : n_rows(X.get_n_rows())\n  , n_cols(X.get_n_cols())\n  , n_elem_slice(X.get_n_elem_slice())\n  , n_slices(X.get_n_slices())\n  , n_elem(X.get_n_elem())\n  , mem_state(0)\n  , mat_ptrs(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  init_cold();\n  \n  eglue_type::apply(*this, X);\n  }\n\n\n\n//! create a cube from Glue, i.e. run the previously delayed binary operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename eglue_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator=(const eGlueCube<T1, T2, eglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  const bool bad_alias = ( (X.P1.has_subview  &&  X.P1.is_alias(*this))  ||  (X.P2.has_subview  &&  X.P2.is_alias(*this)) );\n  \n  if(bad_alias == false)\n    {\n    init_warm(X.get_n_rows(), X.get_n_cols(), X.get_n_slices());\n    \n    eglue_type::apply(*this, X);\n    }\n  else\n    {\n    Cube<eT> tmp(X);\n    \n    steal_mem(tmp);\n    }\n  \n  return *this;\n  }\n\n\n\n//! in-place cube addition, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename eglue_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator+=(const eGlueCube<T1, T2, eglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  eglue_type::apply_inplace_plus(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place cube subtraction, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename eglue_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator-=(const eGlueCube<T1, T2, eglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  eglue_type::apply_inplace_minus(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place cube element-wise multiplication, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename eglue_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator%=(const eGlueCube<T1, T2, eglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  eglue_type::apply_inplace_schur(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place cube element-wise division, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename eglue_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator/=(const eGlueCube<T1, T2, eglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  eglue_type::apply_inplace_div(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nCube<eT>::Cube(const mtGlueCube<eT, T1, T2, glue_type>& X)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem_slice(0)\n  , n_slices(0)\n  , n_elem(0)\n  , mem_state(0)\n  , mat_ptrs(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  glue_type::apply(*this, X);\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator=(const mtGlueCube<eT, T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  glue_type::apply(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator+=(const mtGlueCube<eT, T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Cube<eT> m(X);\n  \n  return (*this).operator+=(m);\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator-=(const mtGlueCube<eT, T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Cube<eT> m(X);\n  \n  return (*this).operator-=(m);\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator%=(const mtGlueCube<eT, T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Cube<eT> m(X);\n  \n  return (*this).operator%=(m);\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Cube<eT>&\nCube<eT>::operator/=(const mtGlueCube<eT, T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Cube<eT> m(X);\n  \n  return (*this).operator/=(m);\n  }\n\n\n\n//! linear element accessor (treats the cube as a vector); no bounds check; assumes memory is aligned\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT&\nCube<eT>::at_alt(const uword i) const\n  {\n  const eT* mem_aligned = mem;\n  memory::mark_as_aligned(mem_aligned);\n  \n  return mem_aligned[i];\n  }\n\n\n\n//! linear element accessor (treats the cube as a vector); bounds checking not done when ARMA_NO_DEBUG is defined\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT&\nCube<eT>::operator() (const uword i)\n  {\n  arma_debug_check( (i >= n_elem), \"Cube::operator(): index out of bounds\");\n  return access::rw(mem[i]);\n  }\n\n\n\n//! linear element accessor (treats the cube as a vector); bounds checking not done when ARMA_NO_DEBUG is defined\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT&\nCube<eT>::operator() (const uword i) const\n  {\n  arma_debug_check( (i >= n_elem), \"Cube::operator(): index out of bounds\");\n  return mem[i];\n  }\n\n\n//! linear element accessor (treats the cube as a vector); no bounds check.  \ntemplate<typename eT>\narma_inline\narma_warn_unused\neT&\nCube<eT>::operator[] (const uword i)\n  {\n  return access::rw(mem[i]);\n  }\n\n\n\n//! linear element accessor (treats the cube as a vector); no bounds check\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT&\nCube<eT>::operator[] (const uword i) const\n  {\n  return mem[i];\n  }\n\n\n\n//! linear element accessor (treats the cube as a vector); no bounds check.  \ntemplate<typename eT>\narma_inline\narma_warn_unused\neT&\nCube<eT>::at(const uword i)\n  {\n  return access::rw(mem[i]);\n  }\n\n\n\n//! linear element accessor (treats the cube as a vector); no bounds check\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT&\nCube<eT>::at(const uword i) const\n  {\n  return mem[i];\n  }\n\n\n\n//! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT&\nCube<eT>::operator() (const uword in_row, const uword in_col, const uword in_slice)\n  {\n  arma_debug_check\n    (\n    (in_row >= n_rows) ||\n    (in_col >= n_cols) ||\n    (in_slice >= n_slices)\n    ,\n    \"Cube::operator(): index out of bounds\"\n    );\n\n  return access::rw(mem[in_slice*n_elem_slice + in_col*n_rows + in_row]);\n  }\n\n\n\n//! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT&\nCube<eT>::operator() (const uword in_row, const uword in_col, const uword in_slice) const\n  {\n  arma_debug_check\n    (\n    (in_row >= n_rows) ||\n    (in_col >= n_cols) ||\n    (in_slice >= n_slices)\n    ,\n    \"Cube::operator(): index out of bounds\"\n    );\n\n  return mem[in_slice*n_elem_slice + in_col*n_rows + in_row];\n  }\n\n\n\n//! element accessor; no bounds check\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT&\nCube<eT>::at(const uword in_row, const uword in_col, const uword in_slice)\n  {\n  return access::rw( mem[in_slice*n_elem_slice + in_col*n_rows + in_row] );\n  }\n\n\n\n//! element accessor; no bounds check\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT&\nCube<eT>::at(const uword in_row, const uword in_col, const uword in_slice) const\n  {\n  return mem[in_slice*n_elem_slice + in_col*n_rows + in_row];\n  }\n\n\n\n//! prefix ++\ntemplate<typename eT>\narma_inline\nconst Cube<eT>&\nCube<eT>::operator++()\n  {\n  Cube_aux::prefix_pp(*this);\n  return *this;\n  }\n\n\n\n//! postfix ++  (must not return the object by reference)\ntemplate<typename eT>\narma_inline\nvoid\nCube<eT>::operator++(int)\n  {\n  Cube_aux::postfix_pp(*this);\n  }\n\n\n\n//! prefix --\ntemplate<typename eT>\narma_inline\nconst Cube<eT>&\nCube<eT>::operator--()\n  {\n  Cube_aux::prefix_mm(*this);\n  return *this;\n  }\n\n\n\n//! postfix --  (must not return the object by reference)\ntemplate<typename eT>\narma_inline\nvoid\nCube<eT>::operator--(int)\n  {\n  Cube_aux::postfix_mm(*this);\n  }\n\n\n\n//! returns true if all of the elements are finite\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nCube<eT>::is_finite() const\n  {\n  return arrayops::is_finite( memptr(), n_elem );\n  }\n\n\n\n//! returns true if the cube has no elements\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nCube<eT>::is_empty() const\n  {\n  return (n_elem == 0);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nCube<eT>::has_inf() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return arrayops::has_inf( memptr(), n_elem );\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nCube<eT>::has_nan() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return arrayops::has_nan( memptr(), n_elem );\n  }\n\n\n\n//! returns true if the given index is currently in range\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nCube<eT>::in_range(const uword i) const\n  {\n  return (i < n_elem);\n  }\n\n\n\n//! returns true if the given start and end indices are currently in range\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nCube<eT>::in_range(const span& x) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(x.whole == true)\n    {\n    return true;\n    }\n  else\n    {\n    const uword a = x.a;\n    const uword b = x.b;\n    \n    return ( (a <= b) && (b < n_elem) );\n    }\n  }\n\n\n\n//! returns true if the given location is currently in range\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nCube<eT>::in_range(const uword in_row, const uword in_col, const uword in_slice) const\n  {\n  return ( (in_row < n_rows) && (in_col < n_cols) && (in_slice < n_slices) );\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nCube<eT>::in_range(const span& row_span, const span& col_span, const span& slice_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword in_row1   = row_span.a;\n  const uword in_row2   = row_span.b;\n  \n  const uword in_col1   = col_span.a;\n  const uword in_col2   = col_span.b;\n  \n  const uword in_slice1 = slice_span.a;\n  const uword in_slice2 = slice_span.b;\n  \n  \n  const bool rows_ok   = row_span.whole   ? true : ( (in_row1   <= in_row2)   && (in_row2   < n_rows)   );\n  const bool cols_ok   = col_span.whole   ? true : ( (in_col1   <= in_col2)   && (in_col2   < n_cols)   );\n  const bool slices_ok = slice_span.whole ? true : ( (in_slice1 <= in_slice2) && (in_slice2 < n_slices) );\n  \n  \n  return ( (rows_ok == true) && (cols_ok == true) && (slices_ok == true) );\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nCube<eT>::in_range(const uword in_row, const uword in_col, const uword in_slice, const SizeCube& s) const\n  {\n  const uword l_n_rows   = n_rows;\n  const uword l_n_cols   = n_cols;\n  const uword l_n_slices = n_slices;\n  \n  if(\n       ( in_row             >= l_n_rows) || ( in_col             >= l_n_cols) || ( in_slice               >= l_n_slices)\n    || ((in_row + s.n_rows) >  l_n_rows) || ((in_col + s.n_cols) >  l_n_cols) || ((in_slice + s.n_slices) >  l_n_slices)\n    )\n    {\n    return false;\n    }\n  else\n    {\n    return true;\n    }\n  }\n\n\n\n//! returns a pointer to array of eTs used by the cube\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT*\nCube<eT>::memptr()\n  {\n  return const_cast<eT*>(mem);\n  }\n\n\n\n//! returns a pointer to array of eTs used by the cube\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT*\nCube<eT>::memptr() const\n  {\n  return mem;\n  }\n\n\n\n//! returns a pointer to array of eTs used by the specified slice in the cube\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT*\nCube<eT>::slice_memptr(const uword uslice)\n  {\n  return const_cast<eT*>( &mem[ uslice*n_elem_slice ] );\n  }\n\n\n\n//! returns a pointer to array of eTs used by the specified slice in the cube\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT*\nCube<eT>::slice_memptr(const uword uslice) const\n  {\n  return &mem[ uslice*n_elem_slice ];\n  }\n\n\n\n//! returns a pointer to array of eTs used by the specified slice in the cube\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT*\nCube<eT>::slice_colptr(const uword uslice, const uword col)\n  {\n  return const_cast<eT*>( &mem[ uslice*n_elem_slice + col*n_rows] );\n  }\n\n\n\n//! returns a pointer to array of eTs used by the specified slice in the cube\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT*\nCube<eT>::slice_colptr(const uword uslice, const uword col) const\n  {\n  return &mem[ uslice*n_elem_slice + col*n_rows ];\n  }\n\n\n\n//! print contents of the cube (to the cout stream),\n//! optionally preceding with a user specified line of text.\n//! the precision and cell width are modified.\n//! on return, the stream's state are restored to their original values.\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::impl_print(const std::string& extra_text) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(extra_text.length() != 0)\n    {\n    ARMA_DEFAULT_OSTREAM << extra_text << '\\n';\n    }\n  \n  arma_ostream::print(ARMA_DEFAULT_OSTREAM, *this, true);\n  }\n\n\n//! print contents of the cube to a user specified stream,\n//! optionally preceding with a user specified line of text.\n//! the precision and cell width are modified.\n//! on return, the stream's state are restored to their original values.\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::impl_print(std::ostream& user_stream, const std::string& extra_text) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(extra_text.length() != 0)\n    {\n    user_stream << extra_text << '\\n';\n    }\n  \n  arma_ostream::print(user_stream, *this, true);\n  }\n\n\n\n//! print contents of the cube (to the cout stream),\n//! optionally preceding with a user specified line of text.\n//! the stream's state are used as is and are not modified\n//! (i.e. the precision and cell width are not modified).\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::impl_raw_print(const std::string& extra_text) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(extra_text.length() != 0)\n    {\n    ARMA_DEFAULT_OSTREAM << extra_text << '\\n';\n    }\n  \n  arma_ostream::print(ARMA_DEFAULT_OSTREAM, *this, false);\n  }\n\n\n\n//! print contents of the cube to a user specified stream,\n//! optionally preceding with a user specified line of text.\n//! the stream's state are used as is and are not modified.\n//! (i.e. the precision and cell width are not modified).\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::impl_raw_print(std::ostream& user_stream, const std::string& extra_text) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(extra_text.length() != 0)\n    {\n    user_stream << extra_text << '\\n';\n    }\n  \n  arma_ostream::print(user_stream, *this, false);\n  }\n\n\n\n//! change the cube to have user specified dimensions (data is not preserved)\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::set_size(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices)\n  {\n  arma_extra_debug_sigprint();\n  \n  init_warm(in_n_rows, in_n_cols, in_n_slices);\n  }\n\n\n\n//! change the cube to have user specified dimensions (data is preserved)\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::reshape(const uword in_rows, const uword in_cols, const uword in_slices, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  *this = arma::reshape(*this, in_rows, in_cols, in_slices, dim);\n  }\n\n\n\n//! change the cube to have user specified dimensions (data is preserved)\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::resize(const uword in_rows, const uword in_cols, const uword in_slices)\n  {\n  arma_extra_debug_sigprint();\n  \n  *this = arma::resize(*this, in_rows, in_cols, in_slices);\n  }\n\n\n\n//! change the cube (without preserving data) to have the same dimensions as the given cube \ntemplate<typename eT>\ntemplate<typename eT2>\ninline\nvoid\nCube<eT>::copy_size(const Cube<eT2>& m)\n  {\n  arma_extra_debug_sigprint();\n  \n  init_warm(m.n_rows, m.n_cols, m.n_slices);\n  }\n\n\n\n//! transform each element in the cube using a functor\ntemplate<typename eT>\ntemplate<typename functor>\ninline\nconst Cube<eT>&\nCube<eT>::transform(functor F)\n  {\n  arma_extra_debug_sigprint();\n  \n  eT* out_mem = memptr();\n  \n  const uword N = n_elem;\n  \n  uword ii, jj;\n  \n  for(ii=0, jj=1; jj < N; ii+=2, jj+=2)\n    {\n    eT tmp_ii = out_mem[ii];\n    eT tmp_jj = out_mem[jj];\n    \n    tmp_ii = eT( F(tmp_ii) );\n    tmp_jj = eT( F(tmp_jj) );\n    \n    out_mem[ii] = tmp_ii;\n    out_mem[jj] = tmp_jj;\n    }\n  \n  if(ii < N)\n    {\n    out_mem[ii] = eT( F(out_mem[ii]) );\n    }\n  \n  return *this;\n  }\n\n\n\n//! imbue (fill) the cube with values provided by a functor\ntemplate<typename eT>\ntemplate<typename functor>\ninline\nconst Cube<eT>&\nCube<eT>::imbue(functor F)\n  {\n  arma_extra_debug_sigprint();\n  \n  eT* out_mem = memptr();\n  \n  const uword N = n_elem;\n  \n  uword ii, jj;\n  \n  for(ii=0, jj=1; jj < N; ii+=2, jj+=2)\n    {\n    const eT tmp_ii = eT( F() );\n    const eT tmp_jj = eT( F() );\n    \n    out_mem[ii] = tmp_ii;\n    out_mem[jj] = tmp_jj;\n    }\n  \n  if(ii < N)\n    {\n    out_mem[ii] = eT( F() );\n    }\n  \n  return *this;\n  }\n\n\n\n//! fill the cube with the specified value\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::fill(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::inplace_set( memptr(), val, n_elem );\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::zeros()\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::fill_zeros(memptr(), n_elem);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::zeros(const uword in_rows, const uword in_cols, const uword in_slices)\n  {\n  arma_extra_debug_sigprint();\n  \n  set_size(in_rows, in_cols, in_slices);\n  \n  return (*this).zeros();\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::ones()\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).fill(eT(1));\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::ones(const uword in_rows, const uword in_cols, const uword in_slices)\n  {\n  arma_extra_debug_sigprint();\n  \n  set_size(in_rows, in_cols, in_slices);\n  \n  return (*this).fill(eT(1));\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::randu()\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_rng::randu<eT>::fill( memptr(), n_elem );\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::randu(const uword in_rows, const uword in_cols, const uword in_slices)\n  {\n  arma_extra_debug_sigprint();\n  \n  set_size(in_rows, in_cols, in_slices);\n  \n  return (*this).randu();\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::randn()\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_rng::randn<eT>::fill( memptr(), n_elem );\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Cube<eT>&\nCube<eT>::randn(const uword in_rows, const uword in_cols, const uword in_slices)\n  {\n  arma_extra_debug_sigprint();\n  \n  set_size(in_rows, in_cols, in_slices);\n  \n  return (*this).randn();\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::reset()\n  {\n  arma_extra_debug_sigprint();\n  \n  init_warm(0,0,0);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nCube<eT>::set_real(const BaseCube<typename Cube<eT>::pod_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Cube_aux::set_real(*this, X);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nCube<eT>::set_imag(const BaseCube<typename Cube<eT>::pod_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Cube_aux::set_imag(*this, X);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\neT\nCube<eT>::min() const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"Cube::min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  return op_min::direct_min(memptr(), n_elem);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\neT\nCube<eT>::max() const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"Cube::max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  return op_max::direct_max(memptr(), n_elem);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nCube<eT>::min(uword& index_of_min_val) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"Cube::min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  return op_min::direct_min(memptr(), n_elem, index_of_min_val);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nCube<eT>::max(uword& index_of_max_val) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"Cube::max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  return op_max::direct_max(memptr(), n_elem, index_of_max_val);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nCube<eT>::min(uword& row_of_min_val, uword& col_of_min_val, uword& slice_of_min_val) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"Cube::min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  uword i;\n  \n  eT val = op_min::direct_min(memptr(), n_elem, i);\n  \n  const uword in_slice = i / n_elem_slice;\n  const uword offset   = in_slice * n_elem_slice;\n  const uword j        = i - offset;\n  \n    row_of_min_val = j % n_rows;\n    col_of_min_val = j / n_rows;\n  slice_of_min_val = in_slice;\n  \n  return val;\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nCube<eT>::max(uword& row_of_max_val, uword& col_of_max_val, uword& slice_of_max_val) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"Cube::max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  uword i;\n  \n  eT val = op_max::direct_max(memptr(), n_elem, i);\n  \n  const uword in_slice = i / n_elem_slice;\n  const uword offset   = in_slice * n_elem_slice;\n  const uword j        = i - offset;\n  \n    row_of_max_val = j % n_rows;\n    col_of_max_val = j / n_rows;\n  slice_of_max_val = in_slice;\n  \n  return val;\n  }\n\n\n\n//! save the cube to a file\ntemplate<typename eT>\ninline\nbool\nCube<eT>::save(const std::string name, const file_type type, const bool print_status) const\n  {\n  arma_extra_debug_sigprint();\n  \n  bool save_okay;\n  \n  switch(type)\n    {\n    case raw_ascii:\n      save_okay = diskio::save_raw_ascii(*this, name);\n      break;\n    \n    case arma_ascii:\n      save_okay = diskio::save_arma_ascii(*this, name);\n      break;\n    \n    case raw_binary:\n      save_okay = diskio::save_raw_binary(*this, name);\n      break;\n    \n    case arma_binary:\n      save_okay = diskio::save_arma_binary(*this, name);\n      break;\n    \n    case ppm_binary:\n      save_okay = diskio::save_ppm_binary(*this, name);\n      break;\n\n    case hdf5_binary:\n      save_okay = diskio::save_hdf5_binary(*this, name);\n      break;\n    \n    default:\n      arma_warn(print_status, \"Cube::save(): unsupported file type\");\n      save_okay = false;\n    }\n  \n  arma_warn( (print_status && (save_okay == false)), \"Cube::save(): couldn't write to \", name);\n  \n  return save_okay;\n  }\n\n\n\n//! save the cube to a stream\ntemplate<typename eT>\ninline\nbool\nCube<eT>::save(std::ostream& os, const file_type type, const bool print_status) const\n  {\n  arma_extra_debug_sigprint();\n  \n  bool save_okay;\n  \n  switch(type)\n    {\n    case raw_ascii:\n      save_okay = diskio::save_raw_ascii(*this, os);\n      break;\n    \n    case arma_ascii:\n      save_okay = diskio::save_arma_ascii(*this, os);\n      break;\n    \n    case raw_binary:\n      save_okay = diskio::save_raw_binary(*this, os);\n      break;\n    \n    case arma_binary:\n      save_okay = diskio::save_arma_binary(*this, os);\n      break;\n    \n    case ppm_binary:\n      save_okay = diskio::save_ppm_binary(*this, os);\n      break;\n    \n    default:\n      arma_warn(print_status, \"Cube::save(): unsupported file type\");\n      save_okay = false;\n    }\n  \n  arma_warn( (print_status && (save_okay == false)), \"Cube::save(): couldn't write to given stream\");\n  \n  return save_okay;\n  }\n\n\n\n//! load a cube from a file\ntemplate<typename eT>\ninline\nbool\nCube<eT>::load(const std::string name, const file_type type, const bool print_status)\n  {\n  arma_extra_debug_sigprint();\n  \n  bool load_okay;\n  std::string err_msg;\n  \n  switch(type)\n    {\n    case auto_detect:\n      load_okay = diskio::load_auto_detect(*this, name, err_msg);\n      break;\n    \n    case raw_ascii:\n      load_okay = diskio::load_raw_ascii(*this, name, err_msg);\n      break;\n    \n    case arma_ascii:\n      load_okay = diskio::load_arma_ascii(*this, name, err_msg);\n      break;\n    \n    case raw_binary:\n      load_okay = diskio::load_raw_binary(*this, name, err_msg);\n      break;\n    \n    case arma_binary:\n      load_okay = diskio::load_arma_binary(*this, name, err_msg);\n      break;\n    \n    case ppm_binary:\n      load_okay = diskio::load_ppm_binary(*this, name, err_msg);\n      break;\n\n    case hdf5_binary:\n      load_okay = diskio::load_hdf5_binary(*this, name, err_msg);\n      break;\n    \n    default:\n      arma_warn(print_status, \"Cube::load(): unsupported file type\");\n      load_okay = false;\n    }\n  \n  if( (print_status == true) && (load_okay == false) )\n    {\n    if(err_msg.length() > 0)\n      {\n      arma_warn(true, \"Cube::load(): \", err_msg, name);\n      }\n    else\n      {\n      arma_warn(true, \"Cube::load(): couldn't read \", name);\n      }\n    }\n  \n  if(load_okay == false)\n    {\n    (*this).reset();\n    }\n    \n  return load_okay;\n  }\n\n\n\n//! load a cube from a stream\ntemplate<typename eT>\ninline\nbool\nCube<eT>::load(std::istream& is, const file_type type, const bool print_status)\n  {\n  arma_extra_debug_sigprint();\n  \n  bool load_okay;\n  std::string err_msg;\n  \n  switch(type)\n    {\n    case auto_detect:\n      load_okay = diskio::load_auto_detect(*this, is, err_msg);\n      break;\n    \n    case raw_ascii:\n      load_okay = diskio::load_raw_ascii(*this, is, err_msg);\n      break;\n    \n    case arma_ascii:\n      load_okay = diskio::load_arma_ascii(*this, is, err_msg);\n      break;\n    \n    case raw_binary:\n      load_okay = diskio::load_raw_binary(*this, is, err_msg);\n      break;\n    \n    case arma_binary:\n      load_okay = diskio::load_arma_binary(*this, is, err_msg);\n      break;\n    \n    case ppm_binary:\n      load_okay = diskio::load_ppm_binary(*this, is, err_msg);\n      break;\n    \n    default:\n      arma_warn(print_status, \"Cube::load(): unsupported file type\");\n      load_okay = false;\n    }\n  \n  \n  if( (print_status == true) && (load_okay == false) )\n    {\n    if(err_msg.length() > 0)\n      {\n      arma_warn(true, \"Cube::load(): \", err_msg, \"the given stream\");\n      }\n    else\n      {\n      arma_warn(true, \"Cube::load(): couldn't load from the given stream\");\n      }\n    }\n  \n  if(load_okay == false)\n    {\n    (*this).reset();\n    }\n    \n  return load_okay;\n  }\n\n\n\n//! save the cube to a file, without printing any error messages\ntemplate<typename eT>\ninline\nbool\nCube<eT>::quiet_save(const std::string name, const file_type type) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).save(name, type, false);\n  }\n\n\n\n//! save the cube to a stream, without printing any error messages\ntemplate<typename eT>\ninline\nbool\nCube<eT>::quiet_save(std::ostream& os, const file_type type) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).save(os, type, false);\n  }\n\n\n\n//! load a cube from a file, without printing any error messages\ntemplate<typename eT>\ninline\nbool\nCube<eT>::quiet_load(const std::string name, const file_type type)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).load(name, type, false);\n  }\n\n\n\n//! load a cube from a stream, without printing any error messages\ntemplate<typename eT>\ninline\nbool\nCube<eT>::quiet_load(std::istream& is, const file_type type)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).load(is, type, false);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Cube<eT>::iterator\nCube<eT>::begin()\n  {\n  arma_extra_debug_sigprint();\n  \n  return memptr();\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Cube<eT>::const_iterator\nCube<eT>::begin() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return memptr();\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Cube<eT>::const_iterator\nCube<eT>::cbegin() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return memptr();\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Cube<eT>::iterator\nCube<eT>::end()\n  {\n  arma_extra_debug_sigprint();\n  \n  return memptr() + n_elem;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Cube<eT>::const_iterator\nCube<eT>::end() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return memptr() + n_elem;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Cube<eT>::const_iterator\nCube<eT>::cend() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return memptr() + n_elem;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Cube<eT>::slice_iterator\nCube<eT>::begin_slice(const uword slice_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (slice_num >= n_slices), \"begin_slice(): index out of bounds\");\n  \n  return slice_memptr(slice_num);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Cube<eT>::const_slice_iterator\nCube<eT>::begin_slice(const uword slice_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (slice_num >= n_slices), \"begin_slice(): index out of bounds\");\n  \n  return slice_memptr(slice_num);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Cube<eT>::slice_iterator\nCube<eT>::end_slice(const uword slice_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (slice_num >= n_slices), \"end_slice(): index out of bounds\");\n  \n  return slice_memptr(slice_num) + n_elem_slice;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Cube<eT>::const_slice_iterator\nCube<eT>::end_slice(const uword slice_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (slice_num >= n_slices), \"end_slice(): index out of bounds\");\n  \n  return slice_memptr(slice_num) + n_elem_slice;\n  }\n\n\n\n//! resets this cube to an empty matrix\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::clear()\n  {\n  reset();\n  }\n\n\n\n//! returns true if the cube has no elements\ntemplate<typename eT>\ninline\nbool\nCube<eT>::empty() const\n  {\n  return (n_elem == 0);\n  }\n\n\n\n//! returns the number of elements in this cube\ntemplate<typename eT>\ninline\nuword\nCube<eT>::size() const\n  {\n  return n_elem;\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::swap(Cube<eT>& B)\n  {\n  Cube<eT>& A = (*this);\n  \n  arma_extra_debug_sigprint(arma_boost::format(\"A = %x   B = %x\") % &A % &B);\n  \n  if( (A.mem_state == 0) && (B.mem_state == 0) && (A.n_elem > Cube_prealloc::mem_n_elem) && (B.n_elem > Cube_prealloc::mem_n_elem) )\n    {\n    A.delete_mat();\n    B.delete_mat();\n    \n    std::swap( access::rw(A.n_rows),       access::rw(B.n_rows)       );\n    std::swap( access::rw(A.n_cols),       access::rw(B.n_cols)       );\n    std::swap( access::rw(A.n_elem_slice), access::rw(B.n_elem_slice) );\n    std::swap( access::rw(A.n_slices),     access::rw(B.n_slices)     );\n    std::swap( access::rw(A.n_elem),       access::rw(B.n_elem)       );\n    std::swap( access::rw(A.mem),          access::rw(B.mem)          );\n    \n    A.create_mat();\n    B.create_mat();\n    }\n  else\n  if( (A.mem_state == 0) && (B.mem_state == 0) && (A.n_elem <= Cube_prealloc::mem_n_elem) && (B.n_elem <= Cube_prealloc::mem_n_elem) )\n    {\n    A.delete_mat();\n    B.delete_mat();\n    \n    std::swap( access::rw(A.n_rows),       access::rw(B.n_rows)       );\n    std::swap( access::rw(A.n_cols),       access::rw(B.n_cols)       );\n    std::swap( access::rw(A.n_elem_slice), access::rw(B.n_elem_slice) );\n    std::swap( access::rw(A.n_slices),     access::rw(B.n_slices)     );\n    std::swap( access::rw(A.n_elem),       access::rw(B.n_elem)       );\n    \n    const uword N = (std::max)(A.n_elem, B.n_elem);\n    \n    eT* A_mem = A.memptr();\n    eT* B_mem = B.memptr();\n    \n    for(uword i=0; i<N; ++i)  { std::swap( A_mem[i], B_mem[i] ); }\n    \n    A.create_mat();\n    B.create_mat();\n    }\n  else\n    {\n    // generic swap\n    \n    if(A.n_elem <= B.n_elem)\n      {\n      Cube<eT> C = A;\n      \n      A.steal_mem(B);\n      B.steal_mem(C);\n      }\n    else\n      {\n      Cube<eT> C = B;\n      \n      B.steal_mem(A);\n      A.steal_mem(C);\n      }\n    }\n  }\n\n\n\n//! try to steal the memory from a given cube; \n//! if memory can't be stolen, copy the given cube\ntemplate<typename eT>\ninline\nvoid\nCube<eT>::steal_mem(Cube<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(this != &x)\n    {\n    if( (mem_state <= 1) && ( ((x.mem_state == 0) && (x.n_elem > Cube_prealloc::mem_n_elem)) || (x.mem_state == 1) ) )\n      {\n      reset();\n      \n      const uword x_n_slices = x.n_slices;\n      \n      access::rw(n_rows)       = x.n_rows;\n      access::rw(n_cols)       = x.n_cols;\n      access::rw(n_elem_slice) = x.n_elem_slice;\n      access::rw(n_slices)     = x_n_slices;\n      access::rw(n_elem)       = x.n_elem;\n      access::rw(mem_state)    = x.mem_state;\n      access::rw(mem)          = x.mem;\n      \n      if(x_n_slices > Cube_prealloc::mat_ptrs_size)\n        {\n        access::rw(  mat_ptrs) = x.mat_ptrs;\n        access::rw(x.mat_ptrs) = 0;\n        }\n      else\n        {\n        access::rw(mat_ptrs) = const_cast< const Mat<eT>** >(mat_ptrs_local);\n        \n        for(uword i=0; i < x_n_slices; ++i)\n          {\n            mat_ptrs[i] = x.mat_ptrs[i];\n          x.mat_ptrs[i] = 0;\n          }\n        }\n      \n      access::rw(x.n_rows)       = 0;\n      access::rw(x.n_cols)       = 0;\n      access::rw(x.n_elem_slice) = 0;\n      access::rw(x.n_slices)     = 0;\n      access::rw(x.n_elem)       = 0;\n      access::rw(x.mem_state)    = 0;\n      access::rw(x.mem)          = 0;\n      }\n    else\n      {\n      (*this).operator=(x);\n      }\n    }\n  }\n\n\n\n//\n//  Cube::fixed\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\narma_inline\nvoid\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::mem_setup()\n  {\n  arma_extra_debug_sigprint();\n  \n  if(fixed_n_elem > 0)\n    {\n    access::rw(Cube<eT>::n_rows)       = fixed_n_rows;\n    access::rw(Cube<eT>::n_cols)       = fixed_n_cols;\n    access::rw(Cube<eT>::n_elem_slice) = fixed_n_rows * fixed_n_cols;\n    access::rw(Cube<eT>::n_slices)     = fixed_n_slices;\n    access::rw(Cube<eT>::n_elem)       = fixed_n_elem;\n    access::rw(Cube<eT>::mem_state)    = 3;\n    access::rw(Cube<eT>::mat_ptrs)     = const_cast< const Mat<eT>** >( \\\n                                         (fixed_n_slices > Cube_prealloc::mat_ptrs_size) ? mat_ptrs_local_extra : mat_ptrs_local );\n    access::rw(Cube<eT>::mem)          = (fixed_n_elem   > Cube_prealloc::mem_n_elem)    ? mem_local_extra      : mem_local;\n    \n    create_mat();\n    }\n  else\n    {\n    access::rw(Cube<eT>::n_rows)       = 0;\n    access::rw(Cube<eT>::n_cols)       = 0;\n    access::rw(Cube<eT>::n_elem_slice) = 0;\n    access::rw(Cube<eT>::n_slices)     = 0;\n    access::rw(Cube<eT>::n_elem)       = 0;\n    access::rw(Cube<eT>::mem_state)    = 3;\n    access::rw(Cube<eT>::mat_ptrs)     = 0;\n    access::rw(Cube<eT>::mem)          = 0;\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\ninline\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::fixed()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  mem_setup();\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\ninline\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::fixed(const fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>& X)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  mem_setup();\n  \n        eT* dest = (use_extra) ?   mem_local_extra :   mem_local;\n  const eT* src  = (use_extra) ? X.mem_local_extra : X.mem_local;\n  \n  arrayops::copy( dest, src, fixed_n_elem );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\ntemplate<typename fill_type>\ninline\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::fixed(const fill::fill_class<fill_type>&)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  mem_setup();\n  \n  if(is_same_type<fill_type, fill::fill_zeros>::yes)  (*this).zeros();\n  if(is_same_type<fill_type, fill::fill_ones >::yes)  (*this).ones();\n  if(is_same_type<fill_type, fill::fill_randu>::yes)  (*this).randu();\n  if(is_same_type<fill_type, fill::fill_randn>::yes)  (*this).randn();\n  \n  if(is_same_type<fill_type, fill::fill_eye  >::yes)  { arma_debug_check(true, \"Cube::fixed::fixed(): unsupported fill type\"); }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\ntemplate<typename T1>\ninline\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::fixed(const BaseCube<eT,T1>& A)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  mem_setup();\n  \n  Cube<eT>::operator=(A.get_ref()); \n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\ntemplate<typename T1, typename T2>\ninline\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::fixed(const BaseCube<pod_type,T1>& A, const BaseCube<pod_type,T2>& B)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  mem_setup();\n  \n  Cube<eT>::init(A,B);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\ninline\nconst Cube<eT>&\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::operator=(const fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n        eT* dest = (use_extra) ?   mem_local_extra :   mem_local;\n  const eT* src  = (use_extra) ? X.mem_local_extra : X.mem_local;\n  \n  arrayops::copy( dest, src, fixed_n_elem );\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\narma_inline\narma_warn_unused\neT&\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::operator[] (const uword i)\n  {\n  return (use_extra) ? mem_local_extra[i] : mem_local[i];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\narma_inline\narma_warn_unused\nconst eT&\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::operator[] (const uword i) const\n  {\n  return (use_extra) ? mem_local_extra[i] : mem_local[i];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\narma_inline\narma_warn_unused\neT&\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::at(const uword i)\n  {\n  return (use_extra) ? mem_local_extra[i] : mem_local[i];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\narma_inline\narma_warn_unused\nconst eT&\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::at(const uword i) const\n  {\n  return (use_extra) ? mem_local_extra[i] : mem_local[i];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\narma_inline\narma_warn_unused\neT&\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::operator() (const uword i)\n  {\n  arma_debug_check( (i >= fixed_n_elem), \"Cube::operator(): index out of bounds\");\n  \n  return (use_extra) ? mem_local_extra[i] : mem_local[i];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\narma_inline\narma_warn_unused\nconst eT&\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::operator() (const uword i) const\n  {\n  arma_debug_check( (i >= fixed_n_elem), \"Cube::operator(): index out of bounds\");\n  \n  return (use_extra) ? mem_local_extra[i] : mem_local[i];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\narma_inline\narma_warn_unused\neT&\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::at(const uword in_row, const uword in_col, const uword in_slice)\n  {\n  const uword i = in_slice*fixed_n_elem_slice + in_col*fixed_n_rows + in_row;\n  \n  return (use_extra) ? mem_local_extra[i] : mem_local[i];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\narma_inline\narma_warn_unused\nconst eT&\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::at(const uword in_row, const uword in_col, const uword in_slice) const\n  {\n  const uword i = in_slice*fixed_n_elem_slice + in_col*fixed_n_rows + in_row;\n  \n  return (use_extra) ? mem_local_extra[i] : mem_local[i];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\narma_inline\narma_warn_unused\neT&\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::operator() (const uword in_row, const uword in_col, const uword in_slice)\n  {\n  arma_debug_check\n    (\n    (in_row   >= fixed_n_rows  ) ||\n    (in_col   >= fixed_n_cols  ) ||\n    (in_slice >= fixed_n_slices)\n    ,\n    \"operator(): index out of bounds\"\n    );\n  \n  const uword i = in_slice*fixed_n_elem_slice + in_col*fixed_n_rows + in_row;\n  \n  return (use_extra) ? mem_local_extra[i] : mem_local[i];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>\narma_inline\narma_warn_unused\nconst eT&\nCube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::operator() (const uword in_row, const uword in_col, const uword in_slice) const\n  {\n  arma_debug_check\n    (\n    (in_row   >= fixed_n_rows  ) ||\n    (in_col   >= fixed_n_cols  ) ||\n    (in_slice >= fixed_n_slices)\n    ,\n    \"Cube::operator(): index out of bounds\"\n    );\n  \n  const uword i = in_slice*fixed_n_elem_slice + in_col*fixed_n_rows + in_row;\n  \n  return (use_extra) ? mem_local_extra[i] : mem_local[i];\n  }\n\n\n\n//\n// Cube_aux\n\n\n\n//! prefix ++\ntemplate<typename eT>\narma_inline\nvoid\nCube_aux::prefix_pp(Cube<eT>& x)\n  {\n        eT*   memptr = x.memptr();\n  const uword n_elem = x.n_elem;\n  \n  uword i,j;\n\n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    ++(memptr[i]);\n    ++(memptr[j]);\n    }\n  \n  if(i < n_elem)\n    {\n    ++(memptr[i]);\n    }\n  }\n\n\n\n//! prefix ++ for complex numbers (work around for limitations of the std::complex class)\ntemplate<typename T>\narma_inline\nvoid\nCube_aux::prefix_pp(Cube< std::complex<T> >& x)\n  {\n  x += T(1);\n  }\n\n\n\n//! postfix ++\ntemplate<typename eT>\narma_inline\nvoid\nCube_aux::postfix_pp(Cube<eT>& x)\n  {\n        eT* memptr = x.memptr();\n  const uword n_elem = x.n_elem;\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    (memptr[i])++;\n    (memptr[j])++;\n    }\n  \n  if(i < n_elem)\n    {\n    (memptr[i])++;\n    }\n  }\n\n\n\n//! postfix ++ for complex numbers (work around for limitations of the std::complex class)\ntemplate<typename T>\narma_inline\nvoid\nCube_aux::postfix_pp(Cube< std::complex<T> >& x)\n  {\n  x += T(1);\n  }\n\n\n\n//! prefix --\ntemplate<typename eT>\narma_inline\nvoid\nCube_aux::prefix_mm(Cube<eT>& x)\n  {\n        eT* memptr = x.memptr();\n  const uword n_elem = x.n_elem;\n\n  uword i,j;\n\n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    --(memptr[i]);\n    --(memptr[j]);\n    }\n  \n  if(i < n_elem)\n    {\n    --(memptr[i]);\n    }\n  }\n\n\n\n//! prefix -- for complex numbers (work around for limitations of the std::complex class)\ntemplate<typename T>\narma_inline\nvoid\nCube_aux::prefix_mm(Cube< std::complex<T> >& x)\n  {\n  x -= T(1);\n  }\n\n\n\n//! postfix --\ntemplate<typename eT>\narma_inline\nvoid\nCube_aux::postfix_mm(Cube<eT>& x)\n  {\n        eT* memptr = x.memptr();\n  const uword n_elem = x.n_elem;\n\n  uword i,j;\n\n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    (memptr[i])--;\n    (memptr[j])--;\n    }\n  \n  if(i < n_elem)\n    {\n    (memptr[i])--;\n    }\n  }\n\n\n\n//! postfix ++ for complex numbers (work around for limitations of the std::complex class)\ntemplate<typename T>\narma_inline\nvoid\nCube_aux::postfix_mm(Cube< std::complex<T> >& x)\n  {\n  x -= T(1);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nCube_aux::set_real(Cube<eT>& out, const BaseCube<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap_cube<T1> tmp(X.get_ref());\n  const Cube<eT>& A   = tmp.M;\n  \n  arma_debug_assert_same_size( out, A, \"Cube::set_real()\" );\n  \n  out = A;\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nCube_aux::set_imag(Cube<eT>&, const BaseCube<eT,T1>&)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T, typename T1>\ninline\nvoid\nCube_aux::set_real(Cube< std::complex<T> >& out, const BaseCube<T,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<T> eT;\n  \n  const ProxyCube<T1> P(X.get_ref());\n  \n  const uword local_n_rows   = P.get_n_rows();\n  const uword local_n_cols   = P.get_n_cols();\n  const uword local_n_slices = P.get_n_slices();\n  \n  arma_debug_assert_same_size\n    (\n    out.n_rows,   out.n_cols,   out.n_slices,\n    local_n_rows, local_n_cols, local_n_slices,\n    \"Cube::set_real()\"\n    );\n  \n  eT* out_mem = out.memptr();\n  \n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n    typedef typename ProxyCube<T1>::ea_type ea_type;\n    \n    ea_type A = P.get_ea();\n    \n    const uword N = out.n_elem;\n    \n    for(uword i=0; i<N; ++i)\n      {\n      //out_mem[i].real() = PA[i];\n      out_mem[i] = std::complex<T>( A[i], out_mem[i].imag() );\n      }\n    }\n  else\n    {\n    for(uword slice = 0; slice < local_n_slices; ++slice)\n    for(uword col   = 0; col   < local_n_cols;   ++col  )\n    for(uword row   = 0; row   < local_n_rows;   ++row  )\n      {\n      (*out_mem) = std::complex<T>( P.at(row,col,slice), (*out_mem).imag() );\n      out_mem++;\n      }\n    }\n  }\n\n\n\ntemplate<typename T, typename T1>\ninline\nvoid\nCube_aux::set_imag(Cube< std::complex<T> >& out, const BaseCube<T,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<T> eT;\n  \n  const ProxyCube<T1> P(X.get_ref());\n  \n  const uword local_n_rows   = P.get_n_rows();\n  const uword local_n_cols   = P.get_n_cols();\n  const uword local_n_slices = P.get_n_slices();\n  \n  arma_debug_assert_same_size\n    (\n    out.n_rows,   out.n_cols,   out.n_slices,\n    local_n_rows, local_n_cols, local_n_slices,\n    \"Cube::set_imag()\"\n    );\n  \n  eT* out_mem = out.memptr();\n  \n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n    typedef typename ProxyCube<T1>::ea_type ea_type;\n    \n    ea_type A = P.get_ea();\n    \n    const uword N = out.n_elem;\n    \n    for(uword i=0; i<N; ++i)\n      {\n      //out_mem[i].imag() = PA[i];\n      out_mem[i] = std::complex<T>( out_mem[i].real(), A[i] );\n      }\n    }\n  else\n    {\n    for(uword slice = 0; slice < local_n_slices; ++slice)\n    for(uword col   = 0; col   < local_n_cols;   ++col  )\n    for(uword row   = 0; row   < local_n_rows;   ++row  )\n      {\n      (*out_mem) = std::complex<T>( (*out_mem).real(), P.at(row,col,slice) );\n      out_mem++;\n      }\n    }\n  }\n\n\n\n#ifdef ARMA_EXTRA_CUBE_MEAT\n  #include ARMA_INCFILE_WRAP(ARMA_EXTRA_CUBE_MEAT)\n#endif\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/GenCube_bones.hpp",
    "content": "// Copyright (C) 2011-2013 Conrad Sanderson\n// Copyright (C) 2011-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup GenCube\n//! @{\n\n\n//! support class for generator functions (eg. zeros, randu, randn, ...)\ntemplate<typename eT, typename gen_type>\nclass GenCube : public BaseCube<eT, GenCube<eT, gen_type> >\n  {\n  public:\n  \n  typedef          eT                              elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool is_simple          = (is_same_type<gen_type, gen_ones_full>::value) || (is_same_type<gen_type, gen_zeros>::value); \n  \n  arma_aligned const uword n_rows;\n  arma_aligned const uword n_cols;\n  arma_aligned const uword n_slices;\n  \n  arma_inline  GenCube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices);\n  arma_inline ~GenCube();\n  \n  arma_inline static eT generate();\n  \n  arma_inline eT operator[] (const uword i)                                       const;\n  arma_inline eT at         (const uword row, const uword col, const uword slice) const;\n  arma_inline eT at_alt     (const uword i)                                       const;\n  \n  inline void apply              (Cube<eT>& out) const;\n  inline void apply_inplace_plus (Cube<eT>& out) const;\n  inline void apply_inplace_minus(Cube<eT>& out) const;\n  inline void apply_inplace_schur(Cube<eT>& out) const;\n  inline void apply_inplace_div  (Cube<eT>& out) const;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/GenCube_meat.hpp",
    "content": "// Copyright (C) 2011-2013 Conrad Sanderson\n// Copyright (C) 2011-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Gen\n//! @{\n\n\n\ntemplate<typename eT, typename gen_type>\narma_inline\nGenCube<eT, gen_type>::GenCube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices)\n  : n_rows  (in_n_rows  )\n  , n_cols  (in_n_cols  )\n  , n_slices(in_n_slices)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT, typename gen_type>\narma_inline\nGenCube<eT, gen_type>::~GenCube()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT, typename gen_type>\narma_inline\neT\nGenCube<eT, gen_type>::generate()\n  {\n       if(is_same_type<gen_type, gen_ones_full>::yes) { return eT(1);                     }\n  else if(is_same_type<gen_type, gen_zeros    >::yes) { return eT(0);                     }\n  else if(is_same_type<gen_type, gen_randu    >::yes) { return eT(arma_rng::randu<eT>()); }\n  else if(is_same_type<gen_type, gen_randn    >::yes) { return eT(arma_rng::randn<eT>()); }\n  else                                                { return eT();                      }\n  }\n\n\n\ntemplate<typename eT, typename gen_type>\narma_inline\neT\nGenCube<eT, gen_type>::operator[](const uword) const\n  {\n  return GenCube<eT, gen_type>::generate();\n  }\n\n\n\ntemplate<typename eT, typename gen_type>\narma_inline\neT\nGenCube<eT, gen_type>::at(const uword, const uword, const uword) const\n  {\n  return GenCube<eT, gen_type>::generate();\n  }\n\n\n\ntemplate<typename eT, typename gen_type>\narma_inline\neT\nGenCube<eT, gen_type>::at_alt(const uword) const\n  {\n  return GenCube<eT, gen_type>::generate();\n  }\n\n\n\ntemplate<typename eT, typename gen_type>\ninline\nvoid\nGenCube<eT, gen_type>::apply(Cube<eT>& out) const\n  {\n  arma_extra_debug_sigprint();\n  \n  // NOTE: we're assuming that the cube has already been set to the correct size;\n  // this is done by either the Cube contructor or operator=()\n  \n       if(is_same_type<gen_type, gen_ones_full>::yes) { out.ones();  }\n  else if(is_same_type<gen_type, gen_zeros    >::yes) { out.zeros(); }\n  else if(is_same_type<gen_type, gen_randu    >::yes) { out.randu(); }\n  else if(is_same_type<gen_type, gen_randn    >::yes) { out.randn(); }\n  }\n\n\n\ntemplate<typename eT, typename gen_type>\ninline\nvoid\nGenCube<eT, gen_type>::apply_inplace_plus(Cube<eT>& out) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, \"addition\");\n  \n  \n        eT*   out_mem = out.memptr();\n  const uword n_elem  = out.n_elem;\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    const eT tmp_i = GenCube<eT, gen_type>::generate();\n    const eT tmp_j = GenCube<eT, gen_type>::generate();\n    \n    out_mem[i] += tmp_i;\n    out_mem[j] += tmp_j;\n    }\n  \n  if(i < n_elem)\n    {\n    out_mem[i] += GenCube<eT, gen_type>::generate();\n    }\n  }\n\n\n\n\ntemplate<typename eT, typename gen_type>\ninline\nvoid\nGenCube<eT, gen_type>::apply_inplace_minus(Cube<eT>& out) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, \"subtraction\");\n  \n  \n        eT*   out_mem = out.memptr();\n  const uword n_elem  = out.n_elem;\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    const eT tmp_i = GenCube<eT, gen_type>::generate();\n    const eT tmp_j = GenCube<eT, gen_type>::generate();\n    \n    out_mem[i] -= tmp_i;\n    out_mem[j] -= tmp_j;\n    }\n  \n  if(i < n_elem)\n    {\n    out_mem[i] -= GenCube<eT, gen_type>::generate();\n    }\n  }\n\n\n\n\ntemplate<typename eT, typename gen_type>\ninline\nvoid\nGenCube<eT, gen_type>::apply_inplace_schur(Cube<eT>& out) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, \"element-wise multiplication\");\n  \n  \n        eT*   out_mem = out.memptr();\n  const uword n_elem  = out.n_elem;\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    const eT tmp_i = GenCube<eT, gen_type>::generate();\n    const eT tmp_j = GenCube<eT, gen_type>::generate();\n    \n    out_mem[i] *= tmp_i;\n    out_mem[j] *= tmp_j;\n    }\n  \n  if(i < n_elem)\n    {\n    out_mem[i] *= GenCube<eT, gen_type>::generate();\n    }\n  }\n\n\n\n\ntemplate<typename eT, typename gen_type>\ninline\nvoid\nGenCube<eT, gen_type>::apply_inplace_div(Cube<eT>& out) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, \"element-wise division\");\n  \n  \n        eT*   out_mem = out.memptr();\n  const uword n_elem  = out.n_elem;\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    const eT tmp_i = GenCube<eT, gen_type>::generate();\n    const eT tmp_j = GenCube<eT, gen_type>::generate();\n    \n    out_mem[i] /= tmp_i;\n    out_mem[j] /= tmp_j;\n    }\n  \n  if(i < n_elem)\n    {\n    out_mem[i] /= GenCube<eT, gen_type>::generate();\n    }\n  }\n\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Gen_bones.hpp",
    "content": "// Copyright (C) 2011-2014 Conrad Sanderson\n// Copyright (C) 2011-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Gen\n//! @{\n\n\n//! support class for generator functions (eg. zeros, randu, randn, ...)\ntemplate<typename T1, typename gen_type>\nclass Gen : public Base<typename T1::elem_type, Gen<T1, gen_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool prefer_at_accessor = (is_same_type<gen_type, gen_ones_diag>::value) ? true : false;\n  static const bool is_simple          = (is_same_type<gen_type, gen_ones_full>::value) || (is_same_type<gen_type, gen_zeros>::value); \n  \n  static const bool is_row = T1::is_row;\n  static const bool is_col = T1::is_col;\n  \n  arma_aligned const uword n_rows;\n  arma_aligned const uword n_cols;\n  \n  arma_inline  Gen(const uword in_n_rows, const uword in_n_cols);\n  arma_inline ~Gen();\n  \n  arma_inline static elem_type generate();\n  \n  arma_inline elem_type operator[] (const uword ii)                   const;\n  arma_inline elem_type at         (const uword row, const uword col) const;\n  arma_inline elem_type at_alt     (const uword ii)                   const;\n  \n  inline void apply              (Mat<elem_type>& out) const;\n  inline void apply_inplace_plus (Mat<elem_type>& out) const;\n  inline void apply_inplace_minus(Mat<elem_type>& out) const;\n  inline void apply_inplace_schur(Mat<elem_type>& out) const;\n  inline void apply_inplace_div  (Mat<elem_type>& out) const;\n  \n  inline void apply(subview<elem_type>& out) const;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Gen_meat.hpp",
    "content": "// Copyright (C) 2011-2014 Conrad Sanderson\n// Copyright (C) 2011-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Gen\n//! @{\n\n\n\ntemplate<typename T1, typename gen_type>\narma_inline\nGen<T1, gen_type>::Gen(const uword in_n_rows, const uword in_n_cols)\n  : n_rows(in_n_rows)\n  , n_cols(in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename gen_type>\narma_inline\nGen<T1, gen_type>::~Gen()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename gen_type>\narma_inline\ntypename T1::elem_type\nGen<T1, gen_type>::generate()\n  {\n  typedef typename T1::elem_type eT;\n  \n       if(is_same_type<gen_type, gen_ones_full>::yes) { return eT(1);                     }\n  else if(is_same_type<gen_type, gen_zeros    >::yes) { return eT(0);                     }\n  else if(is_same_type<gen_type, gen_randu    >::yes) { return eT(arma_rng::randu<eT>()); }\n  else if(is_same_type<gen_type, gen_randn    >::yes) { return eT(arma_rng::randn<eT>()); }\n  else                                                { return eT();                      }\n  }\n\n\n\ntemplate<typename T1, typename gen_type>\narma_inline\ntypename T1::elem_type\nGen<T1, gen_type>::operator[](const uword ii) const\n  {\n  typedef typename T1::elem_type eT;\n  \n  if(is_same_type<gen_type, gen_ones_diag>::yes)\n    {\n    return ((ii % n_rows) == (ii / n_rows)) ? eT(1) : eT(0);\n    }\n  else\n    {\n    return Gen<T1, gen_type>::generate();\n    }\n  }\n\n\n\ntemplate<typename T1, typename gen_type>\narma_inline\ntypename T1::elem_type\nGen<T1, gen_type>::at(const uword row, const uword col) const\n  {\n  typedef typename T1::elem_type eT;\n  \n  if(is_same_type<gen_type, gen_ones_diag>::yes)\n    {\n    return (row == col) ? eT(1) : eT(0);\n    }\n  else\n    {\n    return Gen<T1, gen_type>::generate();\n    }\n  }\n\n\n\ntemplate<typename T1, typename gen_type>\narma_inline\ntypename T1::elem_type\nGen<T1, gen_type>::at_alt(const uword ii) const\n  {\n  return operator[](ii);\n  }\n\n\n\ntemplate<typename T1, typename gen_type>\ninline\nvoid\nGen<T1, gen_type>::apply(Mat<typename T1::elem_type>& out) const\n  {\n  arma_extra_debug_sigprint();\n  \n  // NOTE: we're assuming that the matrix has already been set to the correct size;\n  // this is done by either the Mat contructor or operator=()\n  \n       if(is_same_type<gen_type, gen_ones_diag>::yes) { out.eye();   }\n  else if(is_same_type<gen_type, gen_ones_full>::yes) { out.ones();  }\n  else if(is_same_type<gen_type, gen_zeros    >::yes) { out.zeros(); }\n  else if(is_same_type<gen_type, gen_randu    >::yes) { out.randu(); }\n  else if(is_same_type<gen_type, gen_randn    >::yes) { out.randn(); }\n  }\n\n\n\ntemplate<typename T1, typename gen_type>\ninline\nvoid\nGen<T1, gen_type>::apply_inplace_plus(Mat<typename T1::elem_type>& out) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, \"addition\");\n  \n  typedef typename T1::elem_type eT;\n  \n  \n  if(is_same_type<gen_type, gen_ones_diag>::yes)\n    {\n    const uword N = (std::min)(n_rows, n_cols);\n    \n    for(uword iq=0; iq < N; ++iq)\n      {\n      out.at(iq,iq) += eT(1);\n      }\n    }\n  else\n    {\n          eT*   out_mem = out.memptr();\n    const uword n_elem  = out.n_elem;\n    \n    uword iq,jq;\n    for(iq=0, jq=1; jq < n_elem; iq+=2, jq+=2)\n      {\n      const eT tmp_i = Gen<T1, gen_type>::generate();\n      const eT tmp_j = Gen<T1, gen_type>::generate();\n      \n      out_mem[iq] += tmp_i;\n      out_mem[jq] += tmp_j;\n      }\n    \n    if(iq < n_elem)\n      {\n      out_mem[iq] += Gen<T1, gen_type>::generate();\n      }\n    }\n  \n  }\n\n\n\n\ntemplate<typename T1, typename gen_type>\ninline\nvoid\nGen<T1, gen_type>::apply_inplace_minus(Mat<typename T1::elem_type>& out) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, \"subtraction\");\n  \n  typedef typename T1::elem_type eT;\n  \n  \n  if(is_same_type<gen_type, gen_ones_diag>::yes)\n    {\n    const uword N = (std::min)(n_rows, n_cols);\n    \n    for(uword iq=0; iq < N; ++iq)\n      {\n      out.at(iq,iq) -= eT(1);\n      }\n    }\n  else\n    {\n          eT*   out_mem = out.memptr();\n    const uword n_elem  = out.n_elem;\n    \n    uword iq,jq;\n    for(iq=0, jq=1; jq < n_elem; iq+=2, jq+=2)\n      {\n      const eT tmp_i = Gen<T1, gen_type>::generate();\n      const eT tmp_j = Gen<T1, gen_type>::generate();\n      \n      out_mem[iq] -= tmp_i;\n      out_mem[jq] -= tmp_j;\n      }\n    \n    if(iq < n_elem)\n      {\n      out_mem[iq] -= Gen<T1, gen_type>::generate();\n      }\n    }\n  \n  }\n\n\n\n\ntemplate<typename T1, typename gen_type>\ninline\nvoid\nGen<T1, gen_type>::apply_inplace_schur(Mat<typename T1::elem_type>& out) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, \"element-wise multiplication\");\n  \n  typedef typename T1::elem_type eT;\n  \n  \n  if(is_same_type<gen_type, gen_ones_diag>::yes)\n    {\n    const uword N = (std::min)(n_rows, n_cols);\n    \n    for(uword iq=0; iq < N; ++iq)\n      {\n      for(uword row=0;    row < iq;     ++row) { out.at(row,iq) = eT(0); }\n      for(uword row=iq+1; row < n_rows; ++row) { out.at(row,iq) = eT(0); }\n      }\n    }\n  else\n    {\n          eT*   out_mem = out.memptr();\n    const uword n_elem  = out.n_elem;\n    \n    uword iq,jq;\n    for(iq=0, jq=1; jq < n_elem; iq+=2, jq+=2)\n      {\n      const eT tmp_i = Gen<T1, gen_type>::generate();\n      const eT tmp_j = Gen<T1, gen_type>::generate();\n      \n      out_mem[iq] *= tmp_i;\n      out_mem[jq] *= tmp_j;\n      }\n    \n    if(iq < n_elem)\n      {\n      out_mem[iq] *= Gen<T1, gen_type>::generate();\n      }\n    }\n  \n  }\n\n\n\n\ntemplate<typename T1, typename gen_type>\ninline\nvoid\nGen<T1, gen_type>::apply_inplace_div(Mat<typename T1::elem_type>& out) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, \"element-wise division\");\n  \n  typedef typename T1::elem_type eT;\n  \n  \n  if(is_same_type<gen_type, gen_ones_diag>::yes)\n    {\n    const uword N = (std::min)(n_rows, n_cols);\n    \n    for(uword iq=0; iq < N; ++iq)\n      {\n      const eT zero = eT(0);\n      \n      for(uword row=0;    row < iq;     ++row) { out.at(row,iq) /= zero; }\n      for(uword row=iq+1; row < n_rows; ++row) { out.at(row,iq) /= zero; }\n      }\n    }\n  else\n    {\n          eT*   out_mem = out.memptr();\n    const uword n_elem  = out.n_elem;\n    \n    uword iq,jq;\n    for(iq=0, jq=1; jq < n_elem; iq+=2, jq+=2)\n      {\n      const eT tmp_i = Gen<T1, gen_type>::generate();\n      const eT tmp_j = Gen<T1, gen_type>::generate();\n      \n      out_mem[iq] /= tmp_i;\n      out_mem[jq] /= tmp_j;\n      }\n    \n    if(iq < n_elem)\n      {\n      out_mem[iq] /= Gen<T1, gen_type>::generate();\n      }\n    }\n  \n  }\n\n\n\n\ntemplate<typename T1, typename gen_type>\ninline\nvoid\nGen<T1, gen_type>::apply(subview<typename T1::elem_type>& out) const\n  {\n  arma_extra_debug_sigprint();\n  \n  // NOTE: we're assuming that the submatrix has the same dimensions as the Gen object\n  // this is checked by subview::operator=()\n  \n       if(is_same_type<gen_type, gen_ones_diag>::yes) { out.eye();   }\n  else if(is_same_type<gen_type, gen_ones_full>::yes) { out.ones();  }\n  else if(is_same_type<gen_type, gen_zeros    >::yes) { out.zeros(); }\n  else if(is_same_type<gen_type, gen_randu    >::yes) { out.randu(); }\n  else if(is_same_type<gen_type, gen_randn    >::yes) { out.randn(); }\n  }\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/GlueCube_bones.hpp",
    "content": "// Copyright (C) 2008-2010 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup GlueCube\n//! @{\n\n\n\n//! analog of the Glue class, intended for Cube objects\ntemplate<typename T1, typename T2, typename glue_type>\nclass GlueCube : public BaseCube<typename T1::elem_type, GlueCube<T1, T2, glue_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n\n  arma_inline  GlueCube(const BaseCube<typename T1::elem_type, T1>& in_A, const BaseCube<typename T1::elem_type, T2>& in_B);\n  arma_inline ~GlueCube();\n  \n  const T1& A;  //!< first operand\n  const T2& B;  //!< second operand\n  \n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/GlueCube_meat.hpp",
    "content": "// Copyright (C) 2008-2010 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup GlueCube\n//! @{\n\n\n\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nGlueCube<T1,T2,glue_type>::GlueCube(const BaseCube<typename T1::elem_type, T1>& in_A, const BaseCube<typename T1::elem_type, T2>& in_B)\n  : A(in_A.get_ref())\n  , B(in_B.get_ref())\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nGlueCube<T1,T2,glue_type>::~GlueCube()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Glue_bones.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Glue\n//! @{\n\n\n\n//! Class for storing data required for delayed binary operations,\n//! such as the operands (e.g. two matrices) and the binary operator (e.g. addition).\n//! The operands are stored as references (which can be optimised away),\n//! while the operator is \"stored\" through the template definition (glue_type).\n//! The operands can be 'Mat', 'Row', 'Col', 'Op', and 'Glue'.\n//! Note that as 'Glue' can be one of the operands, more than two matrices can be stored.\n//!\n//! For example, we could have: Glue<Mat, Mat, glue_times>\n//! \n//! Another example is: Glue< Op<Mat, op_htrans>, Op<Mat, op_inv>, glue_times >\n\n\n\ntemplate<typename T1, typename T2, typename glue_type>\nclass Glue : public Base<typename T1::elem_type, Glue<T1, T2, glue_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool is_row = (is_same_type<glue_type, glue_times>::value) ? T1::is_row : false;\n  static const bool is_col = (is_same_type<glue_type, glue_times>::value) ? T2::is_col : false;\n  \n  arma_inline  Glue(const T1& in_A, const T2& in_B);\n  arma_inline  Glue(const T1& in_A, const T2& in_B, const uword in_aux_uword);\n  arma_inline ~Glue();\n  \n  const T1&   A;          //!< first operand\n  const T2&   B;          //!< second operand\n        uword aux_uword;  //!< storage of auxiliary data, uword format\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Glue_meat.hpp",
    "content": "// Copyright (C) 2008-2010 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Glue\n//! @{\n\n\n\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nGlue<T1,T2,glue_type>::Glue(const T1& in_A, const T2& in_B)\n  : A(in_A)\n  , B(in_B)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nGlue<T1,T2,glue_type>::Glue(const T1& in_A, const T2& in_B, const uword in_aux_uword)\n  : A(in_A)\n  , B(in_B)\n  , aux_uword(in_aux_uword)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nGlue<T1,T2,glue_type>::~Glue()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Mat_bones.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// Copyright (C) 2012-2014 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Mat\n//! @{\n\n\n\n//! Dense matrix class\n\ntemplate<typename eT>\nclass Mat : public Base< eT, Mat<eT> >\n  {\n  public:\n  \n  typedef eT                                elem_type;  //!< the type of elements stored in the matrix\n  typedef typename get_pod_type<eT>::result pod_type;   //!< if eT is non-complex, pod_type is same as eT. otherwise, pod_type is the underlying type used by std::complex\n  \n  const uword  n_rows;    //!< number of rows in the matrix (read-only)\n  const uword  n_cols;    //!< number of columns in the matrix (read-only)\n  const uword  n_elem;    //!< number of elements in the matrix (read-only)\n  const uhword vec_state; //!< 0: matrix layout; 1: column vector layout; 2: row vector layout\n  const uhword mem_state;\n  \n  // mem_state = 0: normal matrix that can be resized; \n  // mem_state = 1: use auxiliary memory until change in the number of elements is requested;  \n  // mem_state = 2: use auxiliary memory and don't allow the number of elements to be changed; \n  // mem_state = 3: fixed size (e.g. via template based size specification).\n  \n  arma_aligned const eT* const mem;  //!< pointer to the memory used by the matrix (memory is read-only)\n  \n  protected:\n  arma_align_mem eT mem_local[ arma_config::mat_prealloc ];\n  \n  \n  public:\n  \n  static const bool is_col = false;\n  static const bool is_row = false;\n  \n  inline ~Mat();\n  inline  Mat();\n  \n  inline Mat(const uword in_rows, const uword in_cols);\n  \n  template<typename fill_type>\n  inline Mat(const uword in_rows, const uword in_cols, const fill::fill_class<fill_type>& f);\n  \n  inline                  Mat(const char*        text);\n  inline const Mat& operator=(const char*        text);\n  \n  inline                  Mat(const std::string& text);\n  inline const Mat& operator=(const std::string& text);\n  \n  inline                  Mat(const std::vector<eT>& x);\n  inline const Mat& operator=(const std::vector<eT>& x);\n  \n  #if defined(ARMA_USE_CXX11)\n  inline                  Mat(const std::initializer_list<eT>& list);\n  inline const Mat& operator=(const std::initializer_list<eT>& list);\n  \n  inline                  Mat(const std::initializer_list< std::initializer_list<eT> >& list);\n  inline const Mat& operator=(const std::initializer_list< std::initializer_list<eT> >& list);\n  \n  inline                  Mat(Mat&& m);\n  inline const Mat& operator=(Mat&& m);\n  #endif\n  \n  inline Mat(      eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const bool copy_aux_mem = true, const bool strict = true);\n  inline Mat(const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols);\n  \n  arma_inline const Mat&  operator=(const eT val);\n  arma_inline const Mat& operator+=(const eT val);\n  arma_inline const Mat& operator-=(const eT val);\n  arma_inline const Mat& operator*=(const eT val);\n  arma_inline const Mat& operator/=(const eT val);\n  \n  inline                   Mat(const Mat& m);\n  inline const Mat&  operator=(const Mat& m);\n  inline const Mat& operator+=(const Mat& m);\n  inline const Mat& operator-=(const Mat& m);\n  inline const Mat& operator*=(const Mat& m);\n  inline const Mat& operator%=(const Mat& m);\n  inline const Mat& operator/=(const Mat& m);\n  \n  template<typename T1> inline                   Mat(const BaseCube<eT,T1>& X);\n  template<typename T1> inline const Mat&  operator=(const BaseCube<eT,T1>& X);\n  template<typename T1> inline const Mat& operator+=(const BaseCube<eT,T1>& X);\n  template<typename T1> inline const Mat& operator-=(const BaseCube<eT,T1>& X);\n  template<typename T1> inline const Mat& operator*=(const BaseCube<eT,T1>& X);\n  template<typename T1> inline const Mat& operator%=(const BaseCube<eT,T1>& X);\n  template<typename T1> inline const Mat& operator/=(const BaseCube<eT,T1>& X);\n  \n  template<typename T1, typename T2>\n  inline explicit Mat(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B);\n\n  inline                   Mat(const subview<eT>& X);\n  inline const Mat&  operator=(const subview<eT>& X);\n  inline const Mat& operator+=(const subview<eT>& X);\n  inline const Mat& operator-=(const subview<eT>& X);\n  inline const Mat& operator*=(const subview<eT>& X);\n  inline const Mat& operator%=(const subview<eT>& X);\n  inline const Mat& operator/=(const subview<eT>& X);\n  \n  inline Mat(const subview_row_strans<eT>& X);  // subview_row_strans can only be generated by the Proxy class\n  inline Mat(const subview_row_htrans<eT>& X);  // subview_row_htrans can only be generated by the Proxy class\n  inline Mat(const        xvec_htrans<eT>& X);  //        xvec_htrans can only be generated by the Proxy class\n  \n  template<bool do_conj>\n  inline Mat(const xtrans_mat<eT,do_conj>& X);  //        xtrans_mat can only be generated by the Proxy class\n  \n  inline                   Mat(const subview_cube<eT>& X);\n  inline const Mat&  operator=(const subview_cube<eT>& X);\n  inline const Mat& operator+=(const subview_cube<eT>& X);\n  inline const Mat& operator-=(const subview_cube<eT>& X);\n  inline const Mat& operator*=(const subview_cube<eT>& X);\n  inline const Mat& operator%=(const subview_cube<eT>& X);\n  inline const Mat& operator/=(const subview_cube<eT>& X);\n  \n  inline                   Mat(const diagview<eT>& X);\n  inline const Mat&  operator=(const diagview<eT>& X);\n  inline const Mat& operator+=(const diagview<eT>& X);\n  inline const Mat& operator-=(const diagview<eT>& X);\n  inline const Mat& operator*=(const diagview<eT>& X);\n  inline const Mat& operator%=(const diagview<eT>& X);\n  inline const Mat& operator/=(const diagview<eT>& X);\n  \n  inline                   Mat(const spdiagview<eT>& X);\n  inline const Mat&  operator=(const spdiagview<eT>& X);\n  inline const Mat& operator+=(const spdiagview<eT>& X);\n  inline const Mat& operator-=(const spdiagview<eT>& X);\n  inline const Mat& operator*=(const spdiagview<eT>& X);\n  inline const Mat& operator%=(const spdiagview<eT>& X);\n  inline const Mat& operator/=(const spdiagview<eT>& X);\n  \n  template<typename T1> inline                   Mat(const subview_elem1<eT,T1>& X);\n  template<typename T1> inline const Mat& operator= (const subview_elem1<eT,T1>& X);\n  template<typename T1> inline const Mat& operator+=(const subview_elem1<eT,T1>& X);\n  template<typename T1> inline const Mat& operator-=(const subview_elem1<eT,T1>& X);\n  template<typename T1> inline const Mat& operator*=(const subview_elem1<eT,T1>& X);\n  template<typename T1> inline const Mat& operator%=(const subview_elem1<eT,T1>& X);\n  template<typename T1> inline const Mat& operator/=(const subview_elem1<eT,T1>& X);\n  \n  template<typename T1, typename T2> inline                   Mat(const subview_elem2<eT,T1,T2>& X);\n  template<typename T1, typename T2> inline const Mat& operator= (const subview_elem2<eT,T1,T2>& X);\n  template<typename T1, typename T2> inline const Mat& operator+=(const subview_elem2<eT,T1,T2>& X);\n  template<typename T1, typename T2> inline const Mat& operator-=(const subview_elem2<eT,T1,T2>& X);\n  template<typename T1, typename T2> inline const Mat& operator*=(const subview_elem2<eT,T1,T2>& X);\n  template<typename T1, typename T2> inline const Mat& operator%=(const subview_elem2<eT,T1,T2>& X);\n  template<typename T1, typename T2> inline const Mat& operator/=(const subview_elem2<eT,T1,T2>& X);\n  \n  // Operators on sparse matrices (and subviews)\n  template<typename T1> inline explicit          Mat(const SpBase<eT, T1>& m);\n  template<typename T1> inline const Mat&  operator=(const SpBase<eT, T1>& m);\n  template<typename T1> inline const Mat& operator+=(const SpBase<eT, T1>& m);\n  template<typename T1> inline const Mat& operator-=(const SpBase<eT, T1>& m);\n  template<typename T1> inline const Mat& operator*=(const SpBase<eT, T1>& m);\n  template<typename T1> inline const Mat& operator%=(const SpBase<eT, T1>& m);\n  template<typename T1> inline const Mat& operator/=(const SpBase<eT, T1>& m);\n  \n  inline mat_injector<Mat> operator<<(const eT val);\n  inline mat_injector<Mat> operator<<(const injector_end_of_row<>& x);\n  \n  \n  arma_inline       subview_row<eT> row(const uword row_num);\n  arma_inline const subview_row<eT> row(const uword row_num) const;\n  \n  inline            subview_row<eT> operator()(const uword row_num, const span& col_span);\n  inline      const subview_row<eT> operator()(const uword row_num, const span& col_span) const;\n  \n  \n  arma_inline       subview_col<eT> col(const uword col_num);\n  arma_inline const subview_col<eT> col(const uword col_num) const;\n  \n  inline            subview_col<eT> operator()(const span& row_span, const uword col_num);\n  inline      const subview_col<eT> operator()(const span& row_span, const uword col_num) const;\n  \n  inline            Col<eT>  unsafe_col(const uword col_num);\n  inline      const Col<eT>  unsafe_col(const uword col_num) const;\n  \n  \n  arma_inline       subview<eT> rows(const uword in_row1, const uword in_row2);\n  arma_inline const subview<eT> rows(const uword in_row1, const uword in_row2) const;\n  \n  arma_inline       subview<eT> cols(const uword in_col1, const uword in_col2);\n  arma_inline const subview<eT> cols(const uword in_col1, const uword in_col2) const;\n  \n  inline            subview<eT> rows(const span& row_span);\n  inline      const subview<eT> rows(const span& row_span) const;\n  \n  arma_inline       subview<eT> cols(const span& col_span);\n  arma_inline const subview<eT> cols(const span& col_span) const;\n  \n  \n  arma_inline       subview<eT> submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2);\n  arma_inline const subview<eT> submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const;\n  \n  arma_inline       subview<eT> submat(const uword in_row1, const uword in_col1, const SizeMat& s);\n  arma_inline const subview<eT> submat(const uword in_row1, const uword in_col1, const SizeMat& s) const;\n  \n  inline            subview<eT> submat    (const span& row_span, const span& col_span);\n  inline      const subview<eT> submat    (const span& row_span, const span& col_span) const;\n  \n  inline            subview<eT> operator()(const span& row_span, const span& col_span);\n  inline      const subview<eT> operator()(const span& row_span, const span& col_span) const;\n  \n  inline            subview<eT> operator()(const uword in_row1, const uword in_col1, const SizeMat& s);\n  inline      const subview<eT> operator()(const uword in_row1, const uword in_col1, const SizeMat& s) const;\n  \n  inline       subview<eT> head_rows(const uword N);\n  inline const subview<eT> head_rows(const uword N) const;\n  \n  inline       subview<eT> tail_rows(const uword N);\n  inline const subview<eT> tail_rows(const uword N) const;\n  \n  inline       subview<eT> head_cols(const uword N);\n  inline const subview<eT> head_cols(const uword N) const;\n  \n  inline       subview<eT> tail_cols(const uword N);\n  inline const subview<eT> tail_cols(const uword N) const;\n  \n  template<typename T1> arma_inline       subview_elem1<eT,T1> elem(const Base<uword,T1>& a);\n  template<typename T1> arma_inline const subview_elem1<eT,T1> elem(const Base<uword,T1>& a) const;\n  \n  template<typename T1> arma_inline       subview_elem1<eT,T1> operator()(const Base<uword,T1>& a);\n  template<typename T1> arma_inline const subview_elem1<eT,T1> operator()(const Base<uword,T1>& a) const;\n  \n  \n  template<typename T1, typename T2> arma_inline       subview_elem2<eT,T1,T2> elem(const Base<uword,T1>& ri, const Base<uword,T2>& ci);\n  template<typename T1, typename T2> arma_inline const subview_elem2<eT,T1,T2> elem(const Base<uword,T1>& ri, const Base<uword,T2>& ci) const;\n  \n  template<typename T1, typename T2> arma_inline       subview_elem2<eT,T1,T2> submat(const Base<uword,T1>& ri, const Base<uword,T2>& ci);\n  template<typename T1, typename T2> arma_inline const subview_elem2<eT,T1,T2> submat(const Base<uword,T1>& ri, const Base<uword,T2>& ci) const;\n  \n  template<typename T1, typename T2> arma_inline       subview_elem2<eT,T1,T2> operator()(const Base<uword,T1>& ri, const Base<uword,T2>& ci);\n  template<typename T1, typename T2> arma_inline const subview_elem2<eT,T1,T2> operator()(const Base<uword,T1>& ri, const Base<uword,T2>& ci) const;\n  \n  \n  template<typename T1> arma_inline       subview_elem2<eT,T1,T1> rows(const Base<uword,T1>& ri);\n  template<typename T1> arma_inline const subview_elem2<eT,T1,T1> rows(const Base<uword,T1>& ri) const;\n  \n  template<typename T2> arma_inline       subview_elem2<eT,T2,T2> cols(const Base<uword,T2>& ci);\n  template<typename T2> arma_inline const subview_elem2<eT,T2,T2> cols(const Base<uword,T2>& ci) const;\n  \n  \n  arma_inline subview_each1< Mat<eT>, 0 > each_col();\n  arma_inline subview_each1< Mat<eT>, 1 > each_row();\n  \n  template<typename T1> inline subview_each2< Mat<eT>, 0, T1 > each_col(const Base<uword, T1>& indices);\n  template<typename T1> inline subview_each2< Mat<eT>, 1, T1 > each_row(const Base<uword, T1>& indices);\n  \n  arma_inline       diagview<eT> diag(const sword in_id = 0);\n  arma_inline const diagview<eT> diag(const sword in_id = 0) const;\n  \n  \n  inline void swap_rows(const uword in_row1, const uword in_row2);\n  inline void swap_cols(const uword in_col1, const uword in_col2);\n  \n  inline void shed_row(const uword row_num);\n  inline void shed_col(const uword col_num);\n  \n  inline void shed_rows(const uword in_row1, const uword in_row2);\n  inline void shed_cols(const uword in_col1, const uword in_col2);\n  \n  inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero = true);\n  inline void insert_cols(const uword col_num, const uword N, const bool set_to_zero = true);\n  \n  template<typename T1> inline void insert_rows(const uword row_num, const Base<eT,T1>& X);\n  template<typename T1> inline void insert_cols(const uword col_num, const Base<eT,T1>& X);\n  \n  \n  template<typename T1, typename gen_type> inline                   Mat(const Gen<T1, gen_type>& X);\n  template<typename T1, typename gen_type> inline const Mat&  operator=(const Gen<T1, gen_type>& X);\n  template<typename T1, typename gen_type> inline const Mat& operator+=(const Gen<T1, gen_type>& X);\n  template<typename T1, typename gen_type> inline const Mat& operator-=(const Gen<T1, gen_type>& X);\n  template<typename T1, typename gen_type> inline const Mat& operator*=(const Gen<T1, gen_type>& X);\n  template<typename T1, typename gen_type> inline const Mat& operator%=(const Gen<T1, gen_type>& X);\n  template<typename T1, typename gen_type> inline const Mat& operator/=(const Gen<T1, gen_type>& X);\n  \n  template<typename T1, typename op_type> inline                   Mat(const Op<T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Mat&  operator=(const Op<T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Mat& operator+=(const Op<T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Mat& operator-=(const Op<T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Mat& operator*=(const Op<T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Mat& operator%=(const Op<T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Mat& operator/=(const Op<T1, op_type>& X);\n  \n  template<typename T1, typename eop_type> inline                   Mat(const eOp<T1, eop_type>& X);\n  template<typename T1, typename eop_type> inline const Mat&  operator=(const eOp<T1, eop_type>& X);\n  template<typename T1, typename eop_type> inline const Mat& operator+=(const eOp<T1, eop_type>& X);\n  template<typename T1, typename eop_type> inline const Mat& operator-=(const eOp<T1, eop_type>& X);\n  template<typename T1, typename eop_type> inline const Mat& operator*=(const eOp<T1, eop_type>& X);\n  template<typename T1, typename eop_type> inline const Mat& operator%=(const eOp<T1, eop_type>& X);\n  template<typename T1, typename eop_type> inline const Mat& operator/=(const eOp<T1, eop_type>& X);\n  \n  template<typename T1, typename op_type> inline                   Mat(const mtOp<eT, T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Mat&  operator=(const mtOp<eT, T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Mat& operator+=(const mtOp<eT, T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Mat& operator-=(const mtOp<eT, T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Mat& operator*=(const mtOp<eT, T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Mat& operator%=(const mtOp<eT, T1, op_type>& X);\n  template<typename T1, typename op_type> inline const Mat& operator/=(const mtOp<eT, T1, op_type>& X);\n  \n  template<typename T1, typename T2, typename glue_type> inline                   Mat(const Glue<T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Mat&  operator=(const Glue<T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Mat& operator+=(const Glue<T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Mat& operator-=(const Glue<T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Mat& operator*=(const Glue<T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Mat& operator%=(const Glue<T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Mat& operator/=(const Glue<T1, T2, glue_type>& X);\n  \n  template<typename T1, typename T2>                     inline const Mat& operator+=(const Glue<T1, T2, glue_times>& X);\n  template<typename T1, typename T2>                     inline const Mat& operator-=(const Glue<T1, T2, glue_times>& X);\n  \n  template<typename T1, typename T2, typename eglue_type> inline                   Mat(const eGlue<T1, T2, eglue_type>& X);\n  template<typename T1, typename T2, typename eglue_type> inline const Mat&  operator=(const eGlue<T1, T2, eglue_type>& X);\n  template<typename T1, typename T2, typename eglue_type> inline const Mat& operator+=(const eGlue<T1, T2, eglue_type>& X);\n  template<typename T1, typename T2, typename eglue_type> inline const Mat& operator-=(const eGlue<T1, T2, eglue_type>& X);\n  template<typename T1, typename T2, typename eglue_type> inline const Mat& operator*=(const eGlue<T1, T2, eglue_type>& X);\n  template<typename T1, typename T2, typename eglue_type> inline const Mat& operator%=(const eGlue<T1, T2, eglue_type>& X);\n  template<typename T1, typename T2, typename eglue_type> inline const Mat& operator/=(const eGlue<T1, T2, eglue_type>& X);\n  \n  template<typename T1, typename T2, typename glue_type> inline                   Mat(const mtGlue<eT, T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Mat&  operator=(const mtGlue<eT, T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Mat& operator+=(const mtGlue<eT, T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Mat& operator-=(const mtGlue<eT, T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Mat& operator*=(const mtGlue<eT, T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Mat& operator%=(const mtGlue<eT, T1, T2, glue_type>& X);\n  template<typename T1, typename T2, typename glue_type> inline const Mat& operator/=(const mtGlue<eT, T1, T2, glue_type>& X);\n  \n  \n  arma_inline arma_warn_unused const eT& at_alt     (const uword ii) const;\n  \n  arma_inline arma_warn_unused       eT& operator[] (const uword ii);\n  arma_inline arma_warn_unused const eT& operator[] (const uword ii) const;\n  arma_inline arma_warn_unused       eT& at         (const uword ii);\n  arma_inline arma_warn_unused const eT& at         (const uword ii) const;\n  arma_inline arma_warn_unused       eT& operator() (const uword ii);\n  arma_inline arma_warn_unused const eT& operator() (const uword ii) const;\n  \n  arma_inline arma_warn_unused       eT& at         (const uword in_row, const uword in_col);\n  arma_inline arma_warn_unused const eT& at         (const uword in_row, const uword in_col) const;\n  arma_inline arma_warn_unused       eT& operator() (const uword in_row, const uword in_col);\n  arma_inline arma_warn_unused const eT& operator() (const uword in_row, const uword in_col) const;\n  \n  arma_inline const Mat& operator++();\n  arma_inline void       operator++(int);\n  \n  arma_inline const Mat& operator--();\n  arma_inline void       operator--(int);\n  \n  arma_inline arma_warn_unused bool is_empty()  const;\n  arma_inline arma_warn_unused bool is_vec()    const;\n  arma_inline arma_warn_unused bool is_rowvec() const;\n  arma_inline arma_warn_unused bool is_colvec() const;\n  arma_inline arma_warn_unused bool is_square() const;\n       inline arma_warn_unused bool is_finite() const;\n  \n  inline arma_warn_unused bool has_inf() const;\n  inline arma_warn_unused bool has_nan() const;\n  \n  inline arma_warn_unused bool is_sorted(const char* direction = \"ascend\")       const;\n  inline arma_warn_unused bool is_sorted(const char* direction, const uword dim) const;\n  \n  arma_inline arma_warn_unused bool in_range(const uword ii) const;\n  arma_inline arma_warn_unused bool in_range(const span& x ) const;\n  \n  arma_inline arma_warn_unused bool in_range(const uword   in_row, const uword   in_col) const;\n  arma_inline arma_warn_unused bool in_range(const span& row_span, const uword   in_col) const;\n  arma_inline arma_warn_unused bool in_range(const uword   in_row, const span& col_span) const;\n  arma_inline arma_warn_unused bool in_range(const span& row_span, const span& col_span) const;\n  \n  arma_inline arma_warn_unused bool in_range(const uword in_row, const uword in_col, const SizeMat& s) const;\n  \n  arma_inline arma_warn_unused       eT* colptr(const uword in_col);\n  arma_inline arma_warn_unused const eT* colptr(const uword in_col) const;\n  \n  arma_inline arma_warn_unused       eT* memptr();\n  arma_inline arma_warn_unused const eT* memptr() const;\n  \n  \n  inline void impl_print(const std::string& extra_text) const;\n  inline void impl_print(std::ostream& user_stream, const std::string& extra_text) const;\n  \n  inline void impl_raw_print(const std::string& extra_text) const;\n  inline void impl_raw_print(std::ostream& user_stream, const std::string& extra_text) const;\n  \n  \n  template<typename eT2, typename expr>\n  inline void copy_size(const Base<eT2,expr>& X);\n  \n  inline void set_size(const uword in_elem);\n  inline void set_size(const uword in_rows, const uword in_cols);\n  \n  inline void   resize(const uword in_elem);\n  inline void   resize(const uword in_rows, const uword in_cols);\n  \n  inline void  reshape(const uword in_rows, const uword in_cols);\n  inline void  reshape(const uword in_rows, const uword in_cols, const uword dim);\n  \n  \n  template<typename functor>\n  inline const Mat& transform(functor F);\n  \n  template<typename functor>\n  inline const Mat& imbue(functor F);\n  \n  \n  arma_hot inline const Mat& fill(const eT val);\n  \n  template<typename fill_type>\n  arma_hot inline const Mat& fill(const fill::fill_class<fill_type>& f);\n  \n  inline const Mat& zeros();\n  inline const Mat& zeros(const uword in_elem);\n  inline const Mat& zeros(const uword in_rows, const uword in_cols);\n  \n  inline const Mat& ones();\n  inline const Mat& ones(const uword in_elem);\n  inline const Mat& ones(const uword in_rows, const uword in_cols);\n  \n  inline const Mat& randu();\n  inline const Mat& randu(const uword in_elem);\n  inline const Mat& randu(const uword in_rows, const uword in_cols);\n  \n  inline const Mat& randn();\n  inline const Mat& randn(const uword in_elem);\n  inline const Mat& randn(const uword in_rows, const uword in_cols);\n  \n  inline const Mat& eye();\n  inline const Mat& eye(const uword in_rows, const uword in_cols);\n  \n  inline void reset();\n  \n  \n  template<typename T1> inline void set_real(const Base<pod_type,T1>& X);\n  template<typename T1> inline void set_imag(const Base<pod_type,T1>& X);\n  \n  \n  inline arma_warn_unused eT min() const;\n  inline arma_warn_unused eT max() const;\n  \n  inline eT min(uword& index_of_min_val) const;\n  inline eT max(uword& index_of_max_val) const;\n  \n  inline eT min(uword& row_of_min_val, uword& col_of_min_val) const;\n  inline eT max(uword& row_of_max_val, uword& col_of_max_val) const;\n  \n  \n  inline bool save(const std::string   name, const file_type type = arma_binary, const bool print_status = true) const;\n  inline bool save(      std::ostream& os,   const file_type type = arma_binary, const bool print_status = true) const;\n  \n  inline bool load(const std::string   name, const file_type type = auto_detect, const bool print_status = true);\n  inline bool load(      std::istream& is,   const file_type type = auto_detect, const bool print_status = true);\n  \n  inline bool quiet_save(const std::string   name, const file_type type = arma_binary) const;\n  inline bool quiet_save(      std::ostream& os,   const file_type type = arma_binary) const;\n  \n  inline bool quiet_load(const std::string   name, const file_type type = auto_detect);\n  inline bool quiet_load(      std::istream& is,   const file_type type = auto_detect);\n  \n  \n  // for container-like functionality\n  \n  typedef eT    value_type;\n  typedef uword size_type;\n  \n  typedef       eT*       iterator;\n  typedef const eT* const_iterator;\n  \n  typedef       eT*       col_iterator;\n  typedef const eT* const_col_iterator;\n  \n  class row_iterator\n    {\n    public:\n    \n    inline row_iterator(Mat<eT>& in_M, const uword in_row);\n    \n    inline eT& operator* ();\n    \n    inline row_iterator& operator++();\n    inline void          operator++(int);\n    \n    inline row_iterator& operator--();\n    inline void          operator--(int);\n    \n    inline bool operator!=(const row_iterator& X) const;\n    inline bool operator==(const row_iterator& X) const;\n    \n    arma_aligned Mat<eT>& M;\n    arma_aligned uword    row;\n    arma_aligned uword    col;\n    };\n  \n  \n  class const_row_iterator\n    {\n    public:\n    \n    const_row_iterator(const Mat<eT>& in_M, const uword in_row);\n    const_row_iterator(const row_iterator& X);\n    \n    inline eT operator*() const;\n    \n    inline const_row_iterator& operator++();\n    inline void                operator++(int);\n    \n    inline const_row_iterator& operator--();\n    inline void                operator--(int);\n    \n    inline bool operator!=(const const_row_iterator& X) const;\n    inline bool operator==(const const_row_iterator& X) const;\n    \n    arma_aligned const Mat<eT>& M;\n    arma_aligned       uword    row;\n    arma_aligned       uword    col;\n    };\n  \n  \n  class const_row_col_iterator;\n\n  class row_col_iterator\n    {\n    public:\n    \n    inline row_col_iterator();\n    inline row_col_iterator(const row_col_iterator& in_it);\n    inline row_col_iterator(Mat<eT>& in_M, const uword row = 0, const uword col = 0);\n    \n    inline arma_hot eT& operator*();\n    \n    inline arma_hot row_col_iterator& operator++();\n    inline arma_hot row_col_iterator  operator++(int);\n    inline arma_hot row_col_iterator& operator--();\n    inline arma_hot row_col_iterator  operator--(int);\n    \n    inline uword row() const;\n    inline uword col() const;\n    \n    inline arma_hot bool operator==(const       row_col_iterator& rhs) const;\n    inline arma_hot bool operator!=(const       row_col_iterator& rhs) const;\n    inline arma_hot bool operator==(const const_row_col_iterator& rhs) const;\n    inline arma_hot bool operator!=(const const_row_col_iterator& rhs) const;\n    \n    // So that we satisfy the STL iterator types.\n    typedef std::bidirectional_iterator_tag iterator_category;\n    typedef eT                              value_type;\n    typedef uword                           difference_type; // not certain on this one\n    typedef const eT*                       pointer;\n    typedef const eT&                       reference;\n    \n    arma_aligned Mat<eT>* M;\n    \n    arma_aligned eT*    current_pos;\n    arma_aligned uword  internal_col;\n    arma_aligned uword  internal_row;\n    };\n  \n  \n  class const_row_col_iterator\n    {\n    public:\n    \n    inline const_row_col_iterator();\n    inline const_row_col_iterator(const       row_col_iterator& in_it);\n    inline const_row_col_iterator(const const_row_col_iterator& in_it);\n    inline const_row_col_iterator(const Mat<eT>& in_M, const uword row = 0, const uword col = 0);\n    \n    inline arma_hot const eT& operator*() const;\n    \n    inline arma_hot const_row_col_iterator& operator++();\n    inline arma_hot const_row_col_iterator  operator++(int);\n    inline arma_hot const_row_col_iterator& operator--();\n    inline arma_hot const_row_col_iterator  operator--(int);\n    \n    inline uword row() const;\n    inline uword col() const;\n    \n    inline arma_hot bool operator==(const const_row_col_iterator& rhs) const;\n    inline arma_hot bool operator!=(const const_row_col_iterator& rhs) const;\n    inline arma_hot bool operator==(const       row_col_iterator& rhs) const;\n    inline arma_hot bool operator!=(const       row_col_iterator& rhs) const;\n    \n    // So that we satisfy the STL iterator types.\n    typedef std::bidirectional_iterator_tag iterator_category;\n    typedef eT                              value_type;\n    typedef uword                           difference_type; // not certain on this one\n    typedef const eT*                       pointer;\n    typedef const eT&                       reference;\n    \n    arma_aligned const Mat<eT>* M;\n    \n    arma_aligned const eT*    current_pos;\n    arma_aligned       uword  internal_col;\n    arma_aligned       uword  internal_row;\n    };\n  \n  \n  inline       iterator  begin();\n  inline const_iterator  begin() const;\n  inline const_iterator cbegin() const;\n  \n  inline       iterator  end();\n  inline const_iterator  end() const;\n  inline const_iterator cend() const;\n  \n  inline       col_iterator begin_col(const uword col_num);\n  inline const_col_iterator begin_col(const uword col_num) const;\n  \n  inline       col_iterator end_col  (const uword col_num);\n  inline const_col_iterator end_col  (const uword col_num) const;\n  \n  inline       row_iterator begin_row(const uword row_num);\n  inline const_row_iterator begin_row(const uword row_num) const;\n  \n  inline       row_iterator end_row  (const uword row_num);\n  inline const_row_iterator end_row  (const uword row_num) const;\n  \n  inline       row_col_iterator begin_row_col();\n  inline const_row_col_iterator begin_row_col() const;\n  \n  inline       row_col_iterator end_row_col();\n  inline const_row_col_iterator end_row_col() const;\n  \n  \n  inline void  clear();\n  inline bool  empty() const;\n  inline uword size()  const;\n  \n  inline void swap(Mat& B);\n  \n  inline void steal_mem(Mat& X);  //!< don't use this unless you're writing code internal to Armadillo\n  \n  inline void steal_mem_col(Mat& X, const uword max_n_rows);\n  \n  \n  template<uword fixed_n_rows, uword fixed_n_cols> class fixed;\n  \n  \n  protected:\n  \n  inline void init_cold();\n  inline void init_warm(uword in_rows, uword in_cols);\n  \n  inline void init(const std::string& text);\n  \n  #if defined(ARMA_USE_CXX11)\n    inline void init(const std::initializer_list<eT>& list);\n    inline void init(const std::initializer_list< std::initializer_list<eT> >& list);\n  #endif\n  \n  template<typename T1, typename T2>\n  inline void init(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B);\n  \n  inline Mat(const char junk, const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols);\n  \n  inline Mat(const arma_vec_indicator&, const uhword in_vec_state);\n  inline Mat(const arma_vec_indicator&, const uword in_n_rows, const uword in_n_cols, const uhword in_vec_state);\n  \n  inline Mat(const arma_fixed_indicator&, const uword in_n_rows, const uword in_n_cols, const uhword in_vec_state, const eT* in_mem);\n  \n  \n  friend class Cube<eT>;\n  friend class glue_join;\n  friend class op_strans;\n  friend class op_htrans;\n  friend class op_resize;\n  \n  public:\n  \n  #ifdef ARMA_EXTRA_MAT_PROTO\n    #include ARMA_INCFILE_WRAP(ARMA_EXTRA_MAT_PROTO)\n  #endif\n  };\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols> \nclass Mat<eT>::fixed : public Mat<eT>\n  {\n  private:\n  \n  static const uword fixed_n_elem = fixed_n_rows * fixed_n_cols;\n  static const bool  use_extra    = (fixed_n_elem > arma_config::mat_prealloc);\n  \n  arma_align_mem eT mem_local_extra[ (use_extra) ? fixed_n_elem : 1 ];\n  \n  \n  public:\n  \n  typedef fixed<fixed_n_rows, fixed_n_cols> Mat_fixed_type;\n  \n  typedef eT                                elem_type;\n  typedef typename get_pod_type<eT>::result pod_type;\n  \n  static const bool is_col = (fixed_n_cols == 1) ? true : false;\n  static const bool is_row = (fixed_n_rows == 1) ? true : false;\n  \n  static const uword n_rows = fixed_n_rows;\n  static const uword n_cols = fixed_n_cols;\n  static const uword n_elem = fixed_n_elem;\n  \n  arma_inline fixed();\n  arma_inline fixed(const fixed<fixed_n_rows, fixed_n_cols>& X);\n  \n  template<typename fill_type>       inline fixed(const fill::fill_class<fill_type>& f);\n  template<typename T1>              inline fixed(const Base<eT,T1>& A);\n  template<typename T1, typename T2> inline fixed(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B);\n  \n  inline fixed(const eT* aux_mem);\n  \n  inline fixed(const char*        text);\n  inline fixed(const std::string& text);\n  \n  using Mat<eT>::operator=;\n  using Mat<eT>::operator();\n  \n  #if defined(ARMA_USE_CXX11)\n    inline                fixed(const std::initializer_list<eT>& list);\n    inline const Mat& operator=(const std::initializer_list<eT>& list);\n    \n    inline                fixed(const std::initializer_list< std::initializer_list<eT> >& list);\n    inline const Mat& operator=(const std::initializer_list< std::initializer_list<eT> >& list);\n  #endif\n  \n  arma_inline const Mat& operator=(const fixed<fixed_n_rows, fixed_n_cols>& X);\n  \n  #if defined(ARMA_GOOD_COMPILER)\n    template<typename T1,              typename   eop_type> inline const Mat& operator=(const   eOp<T1,       eop_type>& X);\n    template<typename T1, typename T2, typename eglue_type> inline const Mat& operator=(const eGlue<T1, T2, eglue_type>& X);\n  #endif\n  \n  arma_inline const Op< Mat_fixed_type, op_htrans >  t() const;\n  arma_inline const Op< Mat_fixed_type, op_htrans > ht() const;\n  arma_inline const Op< Mat_fixed_type, op_strans > st() const;\n  \n  arma_inline arma_warn_unused const eT& at_alt     (const uword i) const;\n  \n  arma_inline arma_warn_unused       eT& operator[] (const uword i);\n  arma_inline arma_warn_unused const eT& operator[] (const uword i) const;\n  arma_inline arma_warn_unused       eT& at         (const uword i);\n  arma_inline arma_warn_unused const eT& at         (const uword i) const;\n  arma_inline arma_warn_unused       eT& operator() (const uword i);\n  arma_inline arma_warn_unused const eT& operator() (const uword i) const;\n  \n  arma_inline arma_warn_unused       eT& at         (const uword in_row, const uword in_col);\n  arma_inline arma_warn_unused const eT& at         (const uword in_row, const uword in_col) const;\n  arma_inline arma_warn_unused       eT& operator() (const uword in_row, const uword in_col);\n  arma_inline arma_warn_unused const eT& operator() (const uword in_row, const uword in_col) const;\n  \n  arma_inline arma_warn_unused       eT* colptr(const uword in_col);\n  arma_inline arma_warn_unused const eT* colptr(const uword in_col) const;\n  \n  arma_inline arma_warn_unused       eT* memptr();\n  arma_inline arma_warn_unused const eT* memptr() const;\n  \n  arma_inline arma_warn_unused bool is_vec() const;\n  \n  arma_hot inline const Mat<eT>& fill(const eT val);\n  arma_hot inline const Mat<eT>& zeros();\n  arma_hot inline const Mat<eT>& ones();\n  };\n\n\n\nclass Mat_aux\n  {\n  public:\n\n  template<typename eT> arma_inline static void prefix_pp(Mat<eT>& x);\n  template<typename T>  arma_inline static void prefix_pp(Mat< std::complex<T> >& x);\n  \n  template<typename eT> arma_inline static void postfix_pp(Mat<eT>& x);\n  template<typename T>  arma_inline static void postfix_pp(Mat< std::complex<T> >& x);\n  \n  template<typename eT> arma_inline static void prefix_mm(Mat<eT>& x);\n  template<typename T>  arma_inline static void prefix_mm(Mat< std::complex<T> >& x);\n  \n  template<typename eT> arma_inline static void postfix_mm(Mat<eT>& x);\n  template<typename T>  arma_inline static void postfix_mm(Mat< std::complex<T> >& x);\n  \n  template<typename eT, typename T1> inline static void set_real(Mat<eT>&                out, const Base<eT,T1>& X);\n  template<typename T,  typename T1> inline static void set_real(Mat< std::complex<T> >& out, const Base< T,T1>& X);\n  \n  template<typename eT, typename T1> inline static void set_imag(Mat<eT>&                out, const Base<eT,T1>& X);\n  template<typename T,  typename T1> inline static void set_imag(Mat< std::complex<T> >& out, const Base< T,T1>& X);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Mat_meat.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// Copyright (C) 2012-2014 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Mat\n//! @{\n\n\ntemplate<typename eT>\ninline\nMat<eT>::~Mat()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  if(mem_state == 0)\n    {\n    if(n_elem > arma_config::mat_prealloc)\n      {\n      memory::release( access::rw(mem) );\n      }\n    }\n    \n  if(arma_config::debug == true)\n    {\n    // try to expose buggy user code that accesses deleted objects\n    access::rw(mem) = 0;\n    }\n  \n  arma_type_check(( is_supported_elem_type<eT>::value == false ));\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>::Mat()\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\n//! construct the matrix to have user specified dimensions\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const uword in_n_rows, const uword in_n_cols)\n  : n_rows(in_n_rows)\n  , n_cols(in_n_cols)\n  , n_elem(in_n_rows*in_n_cols)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  }\n\n\n\n//! construct the matrix to have user specified dimensions and fill with specified pattern\ntemplate<typename eT>\ntemplate<typename fill_type>\ninline\nMat<eT>::Mat(const uword in_n_rows, const uword in_n_cols, const fill::fill_class<fill_type>& f)\n  : n_rows(in_n_rows)\n  , n_cols(in_n_cols)\n  , n_elem(in_n_rows*in_n_cols)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  \n  (*this).fill(f);\n  }\n\n\n\n//! constructor used by Row and Col classes\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const arma_vec_indicator&, const uhword in_vec_state)\n  : n_rows( (in_vec_state == 2) ? 1 : 0 )\n  , n_cols( (in_vec_state == 1) ? 1 : 0 )\n  , n_elem(0)\n  , vec_state(in_vec_state)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\n//! constructor used by Row and Col classes\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const arma_vec_indicator&, const uword in_n_rows, const uword in_n_cols, const uhword in_vec_state)\n  : n_rows(in_n_rows)\n  , n_cols(in_n_cols)\n  , n_elem(in_n_rows*in_n_cols)\n  , vec_state(in_vec_state)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const arma_fixed_indicator&, const uword in_n_rows, const uword in_n_cols, const uhword in_vec_state, const eT* in_mem)\n  : n_rows    (in_n_rows)\n  , n_cols    (in_n_cols)\n  , n_elem    (in_n_rows*in_n_cols)\n  , vec_state (in_vec_state)\n  , mem_state (3)\n  , mem       (in_mem)\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::init_cold()\n  {\n  arma_extra_debug_sigprint( arma_boost::format(\"n_rows = %d, n_cols = %d\") % n_rows % n_cols );\n  \n  // ensure that n_elem can hold the result of (n_rows * n_cols)\n  \n  #if (defined(ARMA_USE_CXX11) || defined(ARMA_64BIT_WORD))\n    const char* error_message = \"Mat::init(): requested size is too large\";\n  #else\n    const char* error_message = \"Mat::init(): requested size is too large; suggest to compile in C++11 mode or enable ARMA_64BIT_WORD\";\n  #endif\n  \n  arma_debug_check\n    (\n      (\n      ( (n_rows > ARMA_MAX_UHWORD) || (n_cols > ARMA_MAX_UHWORD) )\n        ? ( (double(n_rows) * double(n_cols)) > double(ARMA_MAX_UWORD) )\n        : false\n      ),\n    error_message\n    );\n  \n  if(n_elem <= arma_config::mat_prealloc)\n    {\n    arma_extra_debug_print(\"Mat::init(): using local memory\");\n    \n    access::rw(mem) = mem_local;\n    }\n  else\n    {\n    arma_extra_debug_print(\"Mat::init(): allocating memory\");\n    \n    access::rw(mem) = memory::acquire<eT>(n_elem);\n    }\n  }\n\n\n\n//! internal matrix construction; if the requested size is small enough, memory from the stack is used. otherwise memory is allocated via 'new'\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::init_warm(uword in_n_rows, uword in_n_cols)\n  {\n  arma_extra_debug_sigprint( arma_boost::format(\"in_n_rows = %d, in_n_cols = %d\") % in_n_rows % in_n_cols );\n  \n  if( (n_rows == in_n_rows) && (n_cols == in_n_cols) )\n    {\n    return;\n    }\n  \n  bool  err_state = false;\n  char* err_msg   = 0;\n  \n  const uhword t_vec_state = vec_state;\n  const uhword t_mem_state = mem_state;\n  \n  arma_debug_set_error\n    (\n    err_state,\n    err_msg,\n    (t_mem_state == 3),\n    \"Mat::init(): size is fixed and hence cannot be changed\"\n    );\n  \n  if(t_vec_state > 0)\n    {\n    if( (in_n_rows == 0) && (in_n_cols == 0) )\n      {\n      if(t_vec_state == 1)\n        {\n        in_n_cols = 1;\n        }\n      else\n      if(t_vec_state == 2)\n        {\n        in_n_rows = 1;\n        }\n      }\n    else\n      {\n      if(t_vec_state == 1)\n        {\n        arma_debug_set_error\n          (\n          err_state,\n          err_msg,\n          (in_n_cols != 1),\n          \"Mat::init(): requested size is not compatible with column vector layout\"\n          );\n        }\n      else\n      if(t_vec_state == 2)\n        {\n        arma_debug_set_error\n          (\n          err_state,\n          err_msg,\n          (in_n_rows != 1),\n          \"Mat::init(): requested size is not compatible with row vector layout\"\n          );\n        }\n      }\n    }\n  \n  // ensure that n_elem can hold the result of (n_rows * n_cols)\n  \n  #if (defined(ARMA_USE_CXX11) || defined(ARMA_64BIT_WORD))\n    const char* error_message = \"Mat::init(): requested size is too large\";\n  #else\n    const char* error_message = \"Mat::init(): requested size is too large; suggest to compile in C++11 mode or enable ARMA_64BIT_WORD\";\n  #endif\n  \n  arma_debug_set_error\n    (\n    err_state,\n    err_msg,\n      (\n      ( (in_n_rows > ARMA_MAX_UHWORD) || (in_n_cols > ARMA_MAX_UHWORD) )\n        ? ( (double(in_n_rows) * double(in_n_cols)) > double(ARMA_MAX_UWORD) )\n        : false\n      ),\n    error_message\n    );\n  \n  arma_debug_check(err_state, err_msg);\n  \n  const uword old_n_elem = n_elem;\n  const uword new_n_elem = in_n_rows * in_n_cols;\n  \n  if(old_n_elem == new_n_elem)\n    {\n    arma_extra_debug_print(\"Mat::init(): reusing memory\");\n    \n    access::rw(n_rows) = in_n_rows;\n    access::rw(n_cols) = in_n_cols;\n    }\n  else\n    {\n    arma_debug_check\n      (\n      (t_mem_state == 2),\n      \"Mat::init(): mismatch between size of auxiliary memory and requested size\"\n      );\n    \n    if(t_mem_state == 0)\n      {\n      if(old_n_elem > arma_config::mat_prealloc)\n        {\n        arma_extra_debug_print(\"Mat::init(): freeing memory\");\n        \n        memory::release( access::rw(mem) );\n        }\n      }\n    \n    \n    if(new_n_elem <= arma_config::mat_prealloc)\n      {\n      arma_extra_debug_print(\"Mat::init(): using local memory\");\n      \n      access::rw(mem) = mem_local;\n      }\n    else\n      {\n      arma_extra_debug_print(\"Mat::init(): allocating memory\");\n      \n      access::rw(mem) = memory::acquire<eT>(new_n_elem);\n      }\n    \n    access::rw(n_rows)    = in_n_rows;\n    access::rw(n_cols)    = in_n_cols;\n    access::rw(n_elem)    = new_n_elem;\n    access::rw(mem_state) = 0;\n    }\n  }\n\n\n\n//! create the matrix from a textual description\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const char* text)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init( std::string(text) );\n  }\n  \n  \n  \n//! create the matrix from a textual description\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const char* text)\n  {\n  arma_extra_debug_sigprint();\n  \n  init( std::string(text) );\n  return *this;\n  }\n  \n  \n\n//! create the matrix from a textual description\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const std::string& text)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init(text);\n  }\n  \n  \n  \n//! create the matrix from a textual description\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const std::string& text)\n  {\n  arma_extra_debug_sigprint();\n  \n  init(text);\n  return *this;\n  }\n\n\n\n//! internal function to create the matrix from a textual description\ntemplate<typename eT>\ninline \nvoid\nMat<eT>::init(const std::string& text_orig)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool replace_commas = (is_cx<eT>::yes) ? false : ( text_orig.find(',') != std::string::npos );\n  \n  std::string text_mod;\n  \n  if(replace_commas)  { text_mod = text_orig;  std::replace(text_mod.begin(), text_mod.end(), ',', ' '); }\n  \n  const std::string& text = (replace_commas) ? text_mod : text_orig;\n  \n  //\n  // work out the size\n  \n  uword t_n_rows = 0;\n  uword t_n_cols = 0;\n  \n  bool t_n_cols_found = false;\n  \n  std::string token;\n  \n  std::string::size_type line_start = 0;\n  std::string::size_type   line_end = 0;\n  \n  std::stringstream line_stream;\n  \n  while( line_start < text.length() )\n    {\n    line_end = text.find(';', line_start);\n    \n    if(line_end == std::string::npos)\n      {\n      line_end = text.length()-1;\n      }\n    \n    std::string::size_type line_len = line_end - line_start + 1;\n    \n    line_stream.clear();\n    line_stream.str( text.substr(line_start,line_len) );\n    \n    uword line_n_cols = 0;\n    while(line_stream >> token)\n      {\n      ++line_n_cols;\n      }\n    \n    if(line_n_cols > 0)\n      {\n      if(t_n_cols_found == false)\n        {\n        t_n_cols       = line_n_cols;\n        t_n_cols_found = true;\n        }\n      else\n        {\n        arma_check( (line_n_cols != t_n_cols), \"Mat::init(): inconsistent number of columns in given string\");\n        }\n      \n      ++t_n_rows;\n      }\n      \n    line_start = line_end+1;\n    }\n  \n  \n  Mat<eT>& x = *this;\n  x.set_size(t_n_rows, t_n_cols);\n  \n  line_start = 0;\n  line_end   = 0;\n  \n  uword urow = 0;\n  \n  while( line_start < text.length() )\n    {\n    line_end = text.find(';', line_start);\n    \n    if(line_end == std::string::npos)\n      {\n      line_end = text.length()-1;\n      }\n    \n    std::string::size_type line_len = line_end - line_start + 1;\n    \n    line_stream.clear();\n    line_stream.str( text.substr(line_start,line_len) );\n    \n//     uword ucol = 0;\n//     while(line_stream >> token)\n//       {\n//       x.at(urow,ucol) = strtod(token.c_str(), 0);\n//       ++ucol;\n//       }\n    \n    uword ucol = 0;\n    eT val;\n    while(line_stream >> val)\n      {\n      x(urow,ucol) = val;\n      ++ucol;\n      }\n    \n    ++urow;\n    line_start = line_end+1;\n    }\n  }\n\n\n\n//! create the matrix from std::vector\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const std::vector<eT>& x)\n  : n_rows(uword(x.size()))\n  , n_cols(1)\n  , n_elem(uword(x.size()))\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  \n  if(n_elem > 0)\n    {\n    arrayops::copy( memptr(), &(x[0]), n_elem );\n    }\n  }\n  \n  \n  \n//! create the matrix from std::vector\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const std::vector<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  init_warm(uword(x.size()), 1);\n  \n  if(x.size() > 0)\n    {\n    arrayops::copy( memptr(), &(x[0]), uword(x.size()) );\n    }\n  \n  return *this;\n  }\n\n\n\n#if defined(ARMA_USE_CXX11)\n  \n  template<typename eT>\n  inline\n  Mat<eT>::Mat(const std::initializer_list<eT>& list)\n    : n_rows(0)\n    , n_cols(0)\n    , n_elem(0)\n    , vec_state(0)\n    , mem_state(0)\n    , mem()\n    {\n    arma_extra_debug_sigprint_this(this);\n    \n    init(list);\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  const Mat<eT>&\n  Mat<eT>::operator=(const std::initializer_list<eT>& list)\n    {\n    arma_extra_debug_sigprint();\n    \n    init(list);\n    \n    return *this;\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  Mat<eT>::Mat(const std::initializer_list< std::initializer_list<eT> >& list)\n    : n_rows(0)\n    , n_cols(0)\n    , n_elem(0)\n    , vec_state(0)\n    , mem_state(0)\n    , mem()\n    {\n    arma_extra_debug_sigprint_this(this);\n    \n    init(list);\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  const Mat<eT>&\n  Mat<eT>::operator=(const std::initializer_list< std::initializer_list<eT> >& list)\n    {\n    arma_extra_debug_sigprint();\n    \n    init(list);\n    \n    return *this;\n    }\n\n\n\n  template<typename eT>\n  inline\n  Mat<eT>::Mat(Mat<eT>&& X)\n    : n_rows   (X.n_rows)\n    , n_cols   (X.n_cols)\n    , n_elem   (X.n_elem)\n    , vec_state(0       )\n    , mem_state(0       )\n    , mem      (        )\n    {\n    arma_extra_debug_sigprint(arma_boost::format(\"this = %x   X = %x\") % this % &X);\n    \n    if( ((X.mem_state == 0) && (X.n_elem > arma_config::mat_prealloc)) || (X.mem_state == 1) || (X.mem_state == 2) )\n      {\n      access::rw(mem_state) = X.mem_state;\n      access::rw(mem)       = X.mem;\n      \n      access::rw(X.n_rows)    = 0;\n      access::rw(X.n_cols)    = 0;\n      access::rw(X.n_elem)    = 0;\n      access::rw(X.mem_state) = 0;\n      access::rw(X.mem)       = 0;\n      }\n    else\n      {\n      init_cold();\n      \n      arrayops::copy( memptr(), X.mem, X.n_elem );\n      \n      if( (X.mem_state == 0) && (X.n_elem <= arma_config::mat_prealloc) )\n        {\n        access::rw(X.n_rows) = 0;\n        access::rw(X.n_cols) = 0;\n        access::rw(X.n_elem) = 0;\n        access::rw(X.mem)    = 0;\n        }\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  const Mat<eT>&\n  Mat<eT>::operator=(Mat<eT>&& X)\n    {\n    arma_extra_debug_sigprint(arma_boost::format(\"this = %x   X = %x\") % this % &X);\n    \n    (*this).steal_mem(X);\n    \n    if( (X.mem_state == 0) && (X.n_elem <= arma_config::mat_prealloc) && (this != &X) )\n      {\n      access::rw(X.n_rows) = 0;\n      access::rw(X.n_cols) = 0;\n      access::rw(X.n_elem) = 0;\n      access::rw(X.mem)    = 0;\n      }\n    \n    return *this;\n    }\n  \n#endif\n  \n\n\n//! Set the matrix to be equal to the specified scalar.\n//! NOTE: the size of the matrix will be 1x1\ntemplate<typename eT>\narma_inline\nconst Mat<eT>&\nMat<eT>::operator=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  init_warm(1,1);\n  access::rw(mem[0]) = val;\n  return *this;\n  }\n\n\n\n//! In-place addition of a scalar to all elements of the matrix\ntemplate<typename eT>\narma_inline\nconst Mat<eT>&\nMat<eT>::operator+=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::inplace_plus( memptr(), val, n_elem );\n  \n  return *this;\n  }\n\n\n\n//! In-place subtraction of a scalar from all elements of the matrix\ntemplate<typename eT>\narma_inline\nconst Mat<eT>&\nMat<eT>::operator-=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::inplace_minus( memptr(), val, n_elem );\n  \n  return *this;\n  }\n\n\n\n//! In-place multiplication of all elements of the matrix with a scalar\ntemplate<typename eT>\narma_inline\nconst Mat<eT>&\nMat<eT>::operator*=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::inplace_mul( memptr(), val, n_elem );\n  \n  return *this;\n  }\n\n\n\n//! In-place division of all elements of the matrix with a scalar\ntemplate<typename eT>\narma_inline\nconst Mat<eT>&\nMat<eT>::operator/=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::inplace_div( memptr(), val, n_elem );\n  \n  return *this;\n  }\n\n\n\n//! construct a matrix from a given matrix\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const Mat<eT>& in_mat)\n  : n_rows(in_mat.n_rows)\n  , n_cols(in_mat.n_cols)\n  , n_elem(in_mat.n_elem)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint(arma_boost::format(\"this = %x   in_mat = %x\") % this % &in_mat);\n  \n  init_cold();\n  \n  arrayops::copy( memptr(), in_mat.mem, in_mat.n_elem );\n  }\n\n\n\n//! construct a matrix from a given matrix\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const Mat<eT>& in_mat)\n  {\n  arma_extra_debug_sigprint(arma_boost::format(\"this = %x   in_mat = %x\") % this % &in_mat);\n  \n  if(this != &in_mat)\n    {\n    init_warm(in_mat.n_rows, in_mat.n_cols);\n    \n    arrayops::copy( memptr(), in_mat.mem, in_mat.n_elem );\n    }\n  \n  return *this;\n  }\n\n\n\n#if defined(ARMA_USE_CXX11)\n  \n  template<typename eT>\n  inline\n  void\n  Mat<eT>::init(const std::initializer_list<eT>& list)\n    {\n    arma_extra_debug_sigprint();\n    \n    const uword N = uword(list.size());\n    \n    set_size(1, N);\n    \n    arrayops::copy( memptr(), list.begin(), N );\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  Mat<eT>::init(const std::initializer_list< std::initializer_list<eT> >& list)\n    {\n    arma_extra_debug_sigprint();\n    \n    uword x_n_rows = uword(list.size());\n    uword x_n_cols = 0;\n    \n    bool x_n_cols_found = false;\n    \n    auto it     = list.begin();\n    auto it_end = list.end();\n    \n    for(; it != it_end; ++it)\n      {\n      if(x_n_cols_found == false)\n        {\n        x_n_cols       = (*it).size();\n        x_n_cols_found = true;\n        }\n      else\n        {\n        arma_check( ((*it).size() != x_n_cols), \"Mat::init(): inconsistent number of columns in initialiser list\" );\n        }\n      }\n    \n    Mat<eT>& t = (*this);\n    \n    if(t.mem_state == 3)\n      {\n      arma_debug_check( ((x_n_rows != t.n_rows) || (x_n_cols != t.n_cols)), \"Mat::init(): size mismatch between fixed size matrix and initialiser list\" );\n      }\n    else\n      {\n      t.set_size(x_n_rows, x_n_cols);\n      }\n    \n    uword row_num = 0;\n    \n    auto row_it     = list.begin();\n    auto row_it_end = list.end();\n    \n    for(; row_it != row_it_end; ++row_it)\n      {\n      uword col_num = 0;\n      \n      auto col_it     = (*row_it).begin();\n      auto col_it_end = (*row_it).end();\n      \n      for(; col_it != col_it_end; ++col_it)\n        {\n        t.at(row_num, col_num) = (*col_it);\n        ++col_num;\n        }\n      \n      ++row_num;\n      }\n    }\n  \n#endif\n\n\n\n//! for constructing a complex matrix out of two non-complex matrices\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nvoid\nMat<eT>::init\n  (\n  const Base<typename Mat<eT>::pod_type, T1>& X,\n  const Base<typename Mat<eT>::pod_type, T2>& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type T;\n  \n  arma_type_check(( is_complex<eT>::value == false ));   //!< compile-time abort if eT is not std::complex\n  arma_type_check(( is_complex< T>::value == true  ));   //!< compile-time abort if  T is     std::complex\n  \n  arma_type_check(( is_same_type< std::complex<T>, eT >::no ));   //!< compile-time abort if types are not compatible\n  \n  const Proxy<T1> PX(X.get_ref());\n  const Proxy<T2> PY(Y.get_ref());\n  \n  arma_debug_assert_same_size(PX, PY, \"Mat()\");\n  \n  const uword local_n_rows = PX.get_n_rows();\n  const uword local_n_cols = PX.get_n_cols();\n  \n  init_warm(local_n_rows, local_n_cols);\n  \n  eT* out_mem = (*this).memptr();\n  \n  const bool prefer_at_accessor = ( Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor );\n  \n  if(prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type1;\n    typedef typename Proxy<T2>::ea_type ea_type2;\n  \n    const uword N = n_elem;\n    \n    ea_type1 A = PX.get_ea();\n    ea_type2 B = PY.get_ea();\n    \n    for(uword ii=0; ii < N; ++ii)\n      {\n      out_mem[ii] = std::complex<T>(A[ii], B[ii]);\n      }\n    }\n  else\n    {\n    for(uword ucol=0; ucol < local_n_cols; ++ucol)\n    for(uword urow=0; urow < local_n_rows; ++urow)\n      {\n      *out_mem = std::complex<T>(PX.at(urow,ucol), PY.at(urow,ucol));\n      out_mem++;\n      }\n    }\n  }\n\n\n\n//! swap the contents of this matrix, denoted as matrix A, with given matrix B\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::swap(Mat<eT>& B)\n  {\n  Mat<eT>& A = (*this);\n  \n  arma_extra_debug_sigprint(arma_boost::format(\"A = %x   B = %x\") % &A % &B);\n\n  bool layout_ok = false;\n  \n  if(A.vec_state == B.vec_state)\n    {\n    layout_ok = true;\n    }\n  else\n    {\n    const uhword A_vec_state = A.vec_state;\n    const uhword B_vec_state = B.vec_state;\n    \n    const bool A_absorbs_B = (A_vec_state == 0) || ( (A_vec_state == 1) && (B.n_cols == 1) ) || ( (A_vec_state == 2) && (B.n_rows == 1) );\n    const bool B_absorbs_A = (B_vec_state == 0) || ( (B_vec_state == 1) && (A.n_cols == 1) ) || ( (B_vec_state == 2) && (A.n_rows == 1) );\n    \n    layout_ok = A_absorbs_B && B_absorbs_A;\n    }\n  \n  const uhword A_mem_state = A.mem_state;\n  const uhword B_mem_state = B.mem_state;\n  \n  if( (A_mem_state == 0) && (B_mem_state == 0) && layout_ok )\n    {\n    const uword A_n_elem = A.n_elem;\n    const uword B_n_elem = B.n_elem;\n    \n    const bool A_use_local_mem = (A_n_elem <= arma_config::mat_prealloc);\n    const bool B_use_local_mem = (B_n_elem <= arma_config::mat_prealloc);\n    \n    if( (A_use_local_mem == false) && (B_use_local_mem == false) )\n      {\n      std::swap( access::rw(A.mem), access::rw(B.mem) );\n      }\n    else\n    if( (A_use_local_mem == true) && (B_use_local_mem == true) )\n      {\n      eT* A_mem_local = &(A.mem_local[0]);\n      eT* B_mem_local = &(B.mem_local[0]);\n      \n      access::rw(A.mem) = A_mem_local;\n      access::rw(B.mem) = B_mem_local;\n      \n      const uword N = (std::max)(A_n_elem, B_n_elem);\n      \n      for(uword ii=0; ii < N; ++ii)  { std::swap( A_mem_local[ii], B_mem_local[ii] ); }\n      }\n    else\n    if( (A_use_local_mem == true) && (B_use_local_mem == false) )\n      {\n      eT* A_mem_local = &(A.mem_local[0]);\n      eT* B_mem_local = &(B.mem_local[0]);\n      \n      arrayops::copy(B_mem_local, A_mem_local, A_n_elem);\n      \n      access::rw(A.mem) = B.mem;\n      access::rw(B.mem) = B_mem_local;\n      }\n    else\n    if( (A_use_local_mem == false) && (B_use_local_mem == true) )\n      {\n      eT* A_mem_local = &(A.mem_local[0]);\n      eT* B_mem_local = &(B.mem_local[0]);\n      \n      arrayops::copy(A_mem_local, B_mem_local, B_n_elem);\n      \n      access::rw(B.mem) = A.mem;\n      access::rw(A.mem) = A_mem_local;\n      }\n    \n    std::swap( access::rw(A.n_rows), access::rw(B.n_rows) );\n    std::swap( access::rw(A.n_cols), access::rw(B.n_cols) );\n    std::swap( access::rw(A.n_elem), access::rw(B.n_elem) );\n    }\n  else\n  if( (A_mem_state <= 2) && (B_mem_state <= 2) && (A.n_elem == B.n_elem) && layout_ok )\n    {\n    std::swap( access::rw(A.n_rows), access::rw(B.n_rows) );\n    std::swap( access::rw(A.n_cols), access::rw(B.n_cols) );\n    \n    const uword N = A.n_elem;\n    \n    eT* A_mem = A.memptr();\n    eT* B_mem = B.memptr();\n    \n    for(uword ii=0; ii < N; ++ii)  { std::swap(A_mem[ii], B_mem[ii]); }\n    }\n  else\n  if( (A.n_rows == B.n_rows) && (A.n_cols == B.n_cols) )\n    {\n    const uword N = A.n_elem;\n    \n    eT* A_mem = A.memptr();\n    eT* B_mem = B.memptr();\n    \n    for(uword ii=0; ii < N; ++ii)  { std::swap(A_mem[ii], B_mem[ii]); }\n    }\n  else\n    {\n    // generic swap to handle remaining cases\n    \n    if(A.n_elem <= B.n_elem)\n      {\n      Mat<eT> C = A;\n      \n      A.steal_mem(B);\n      B.steal_mem(C);\n      }\n    else\n      {\n      Mat<eT> C = B;\n      \n      B.steal_mem(A);\n      A.steal_mem(C);\n      }\n    }\n  }\n\n\n\n//! try to steal the memory from a given matrix; \n//! if memory can't be stolen, copy the given matrix\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::steal_mem(Mat<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(this != &x)\n    {\n    const uword  x_n_rows    = x.n_rows;\n    const uword  x_n_cols    = x.n_cols;\n    const uword  x_n_elem    = x.n_elem;\n    const uhword x_vec_state = x.vec_state;\n    const uhword x_mem_state = x.mem_state;\n    \n    const uhword t_vec_state = vec_state;\n    const uhword t_mem_state = mem_state;\n    \n    bool layout_ok = false;\n    \n    if(t_vec_state == x_vec_state)\n      {\n      layout_ok = true;\n      }\n    else\n      {\n      if( (t_vec_state == 1) && (x_n_cols == 1) )  { layout_ok = true; }\n      if( (t_vec_state == 2) && (x_n_rows == 1) )  { layout_ok = true; }\n      }\n    \n    \n    if( (t_mem_state <= 1) && ( ((x_mem_state == 0) && (x_n_elem > arma_config::mat_prealloc)) || (x_mem_state == 1) ) && layout_ok )\n      {\n      reset();\n      \n      access::rw(n_rows)    = x_n_rows;\n      access::rw(n_cols)    = x_n_cols;\n      access::rw(n_elem)    = x_n_elem;\n      access::rw(mem_state) = x_mem_state;\n      access::rw(mem)       = x.mem;\n      \n      access::rw(x.n_rows)    = 0;\n      access::rw(x.n_cols)    = 0;\n      access::rw(x.n_elem)    = 0;\n      access::rw(x.mem_state) = 0;\n      access::rw(x.mem)       = 0;\n      }\n    else\n      {\n      (*this).operator=(x);\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::steal_mem_col(Mat<eT>& x, const uword max_n_rows)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword  x_n_elem    = x.n_elem;\n  const uhword x_mem_state = x.mem_state;\n  \n  const uhword t_vec_state = vec_state;\n  const uhword t_mem_state = mem_state;\n  \n  const uword alt_n_rows = (std::min)(x.n_rows, max_n_rows);\n  \n  if((x_n_elem == 0) || (alt_n_rows == 0))\n    {\n    (*this).set_size(0,1);\n    \n    return;\n    }\n  \n  if( (this != &x) && (t_vec_state <= 1) && (t_mem_state <= 1) && (x_mem_state <= 1) )\n    {\n    if( (x_mem_state == 0) && ((x_n_elem <= arma_config::mat_prealloc) || (alt_n_rows <= arma_config::mat_prealloc)) )\n      {\n      (*this).set_size(alt_n_rows, uword(1));\n      \n      arrayops::copy( (*this).memptr(), x.memptr(), alt_n_rows );\n      }\n    else\n      {\n      reset();\n      \n      access::rw(n_rows)    = alt_n_rows;\n      access::rw(n_cols)    = 1;\n      access::rw(n_elem)    = alt_n_rows;\n      access::rw(mem_state) = x_mem_state;\n      access::rw(mem)       = x.mem;\n      \n      access::rw(x.n_rows)    = 0;\n      access::rw(x.n_cols)    = 0;\n      access::rw(x.n_elem)    = 0;\n      access::rw(x.mem_state) = 0;\n      access::rw(x.mem)       = 0;\n      }\n    }\n  else\n    {\n    Mat<eT> tmp(alt_n_rows, 1);\n    \n    arrayops::copy( tmp.memptr(), x.memptr(), alt_n_rows );\n    \n    steal_mem(tmp);\n    }\n  }\n\n\n\n//! construct a matrix from a given auxiliary array of eTs.\n//! if copy_aux_mem is true, new memory is allocated and the array is copied.\n//! if copy_aux_mem is false, the auxiliary array is used directly (without allocating memory and copying).\n//! the default is to copy the array.\n\ntemplate<typename eT>\ninline\nMat<eT>::Mat(eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const bool copy_aux_mem, const bool strict)\n  : n_rows   ( aux_n_rows                            )\n  , n_cols   ( aux_n_cols                            )\n  , n_elem   ( aux_n_rows*aux_n_cols                 )\n  , vec_state( 0                                     )\n  , mem_state( copy_aux_mem ? 0 : ( strict ? 2 : 1 ) )\n  , mem      ( copy_aux_mem ? 0 : aux_mem            )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  if(copy_aux_mem == true)\n    {\n    init_cold();\n    \n    arrayops::copy( memptr(), aux_mem, n_elem );\n    }\n  }\n\n\n\n//! construct a matrix from a given auxiliary read-only array of eTs.\n//! the array is copied.\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols)\n  : n_rows(aux_n_rows)\n  , n_cols(aux_n_cols)\n  , n_elem(aux_n_rows*aux_n_cols)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  \n  arrayops::copy( memptr(), aux_mem, n_elem );\n  }\n\n\n\n//! DANGEROUS! Construct a temporary matrix, using auxiliary memory.\n//! This constructor is NOT intended for usage by user code.\n//! Its sole purpose is to be used by the Cube class.\n\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const char junk, const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols)\n  : n_rows   (aux_n_rows           )\n  , n_cols   (aux_n_cols           )\n  , n_elem   (aux_n_rows*aux_n_cols)\n  , vec_state(0                    )\n  , mem_state(3                    )\n  , mem      (aux_mem              )\n  {\n  arma_extra_debug_sigprint_this(this);\n  arma_ignore(junk);\n  }\n\n\n\n//! in-place matrix addition\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const Mat<eT>& m)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(*this, m, \"addition\");\n  \n  arrayops::inplace_plus( memptr(), m.memptr(), n_elem );\n  \n  return *this;\n  }\n\n\n\n//! in-place matrix subtraction\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const Mat<eT>& m)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(*this, m, \"subtraction\");\n  \n  arrayops::inplace_minus( memptr(), m.memptr(), n_elem );\n  \n  return *this;\n  }\n\n\n\n//! in-place matrix multiplication\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator*=(const Mat<eT>& m)\n  {\n  arma_extra_debug_sigprint();\n  \n  glue_times::apply_inplace(*this, m);\n  \n  return *this;\n  }\n\n\n\n//! in-place element-wise matrix multiplication\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator%=(const Mat<eT>& m)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(*this, m, \"element-wise multiplication\");\n  \n  arrayops::inplace_mul( memptr(), m.memptr(), n_elem );\n  \n  return *this;\n  }\n\n\n\n//! in-place element-wise matrix division\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator/=(const Mat<eT>& m)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(*this, m, \"element-wise division\");\n  \n  arrayops::inplace_div( memptr(), m.memptr(), n_elem );\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nMat<eT>::Mat(const BaseCube<eT,T1>& X)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  (*this).operator=(X);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const BaseCube<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& out = *this;\n  \n  const unwrap_cube<T1> tmp(X.get_ref());\n  const Cube<eT>& in  = tmp.M;\n  \n  arma_debug_assert_cube_as_mat(out, in, \"copy into matrix\", false);\n  \n  const uword in_n_rows   = in.n_rows;\n  const uword in_n_cols   = in.n_cols;\n  const uword in_n_slices = in.n_slices;\n  \n  const uword out_vec_state = out.vec_state;\n  \n  if(in_n_slices == 1)\n    {\n    out.set_size(in_n_rows, in_n_cols);\n    \n    for(uword ucol=0; ucol < in_n_cols; ++ucol)\n      {\n      arrayops::copy( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows );\n      }\n    }\n  else\n    {\n    if(out_vec_state == 0)\n      {\n      if(in_n_cols == 1)\n        {\n        out.set_size(in_n_rows, in_n_slices);\n        \n        for(uword i=0; i < in_n_slices; ++i)\n          {\n          arrayops::copy( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );\n          }\n        }\n      else\n      if(in_n_rows == 1)\n        {\n        out.set_size(in_n_cols, in_n_slices);\n        \n        for(uword slice=0; slice < in_n_slices; ++slice)\n          {\n          eT* out_colptr = out.colptr(slice);\n          \n          uword i,j;\n          for(i=0, j=1; j < in_n_cols; i+=2, j+=2)\n            {\n            const eT tmp_i = in.at(0, i, slice);\n            const eT tmp_j = in.at(0, j, slice);\n            \n            out_colptr[i] = tmp_i;\n            out_colptr[j] = tmp_j;\n            }\n          \n          if(i < in_n_cols)\n            {\n            out_colptr[i] = in.at(0, i, slice);\n            }\n          }\n        }\n      }\n    else\n      {\n      out.set_size(in_n_slices);\n      \n      eT* out_mem = out.memptr();\n      \n      for(uword i=0; i<in_n_slices; ++i)\n        {\n        out_mem[i] = in.at(0, 0, i);\n        }\n      }\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const BaseCube<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& out = *this;\n  \n  const unwrap_cube<T1> tmp(X.get_ref());\n  const Cube<eT>& in  = tmp.M;\n  \n  arma_debug_assert_cube_as_mat(out, in, \"addition\", true);\n  \n  const uword in_n_rows   = in.n_rows;\n  const uword in_n_cols   = in.n_cols;\n  const uword in_n_slices = in.n_slices;\n  \n  const uword out_n_rows    = out.n_rows;\n  const uword out_n_cols    = out.n_cols;\n  const uword out_vec_state = out.vec_state;\n  \n  if(in_n_slices == 1)\n    {\n    for(uword ucol=0; ucol < in_n_cols; ++ucol)\n      {\n      arrayops::inplace_plus( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows );\n      }\n    }\n  else\n    {\n    if(out_vec_state == 0)\n      {\n      if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )\n        {\n        for(uword i=0; i < in_n_slices; ++i)\n          {\n          arrayops::inplace_plus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );\n          }\n        }\n      else\n      if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )\n        {\n        for(uword slice=0; slice < in_n_slices; ++slice)\n          {\n          eT* out_colptr = out.colptr(slice);\n          \n          uword i,j;\n          for(i=0, j=1; j < in_n_cols; i+=2, j+=2)\n            {\n            const eT tmp_i = in.at(0, i, slice);\n            const eT tmp_j = in.at(0, j, slice);\n            \n            out_colptr[i] += tmp_i;\n            out_colptr[j] += tmp_j;\n            }\n          \n          if(i < in_n_cols)\n            {\n            out_colptr[i] += in.at(0, i, slice);\n            }\n          }\n        }\n      }\n    else\n      {\n      eT* out_mem = out.memptr();\n      \n      for(uword i=0; i<in_n_slices; ++i)\n        {\n        out_mem[i] += in.at(0, 0, i);\n        }\n      }\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const BaseCube<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& out = *this;\n  \n  const unwrap_cube<T1> tmp(X.get_ref());\n  const Cube<eT>& in  = tmp.M;\n  \n  arma_debug_assert_cube_as_mat(out, in, \"subtraction\", true);\n  \n  const uword in_n_rows   = in.n_rows;\n  const uword in_n_cols   = in.n_cols;\n  const uword in_n_slices = in.n_slices;\n  \n  const uword out_n_rows    = out.n_rows;\n  const uword out_n_cols    = out.n_cols;\n  const uword out_vec_state = out.vec_state;\n  \n  if(in_n_slices == 1)\n    {\n    for(uword ucol=0; ucol < in_n_cols; ++ucol)\n      {\n      arrayops::inplace_minus( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows );\n      }\n    }\n  else\n    {\n    if(out_vec_state == 0)\n      {\n      if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )\n        {\n        for(uword i=0; i < in_n_slices; ++i)\n          {\n          arrayops::inplace_minus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );\n          }\n        }\n      else\n      if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )\n        {\n        for(uword slice=0; slice < in_n_slices; ++slice)\n          {\n          eT* out_colptr = out.colptr(slice);\n          \n          uword i,j;\n          for(i=0, j=1; j < in_n_cols; i+=2, j+=2)\n            {\n            const eT tmp_i = in.at(0, i, slice);\n            const eT tmp_j = in.at(0, j, slice);\n            \n            out_colptr[i] -= tmp_i;\n            out_colptr[j] -= tmp_j;\n            }\n          \n          if(i < in_n_cols)\n            {\n            out_colptr[i] -= in.at(0, i, slice);\n            }\n          }\n        }\n      }\n    else\n      {\n      eT* out_mem = out.memptr();\n      \n      for(uword i=0; i<in_n_slices; ++i)\n        {\n        out_mem[i] -= in.at(0, 0, i);\n        }\n      }\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator*=(const BaseCube<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> B(X);\n  \n  (*this).operator*=(B);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator%=(const BaseCube<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& out = *this;\n  \n  const unwrap_cube<T1> tmp(X.get_ref());\n  const Cube<eT>& in  = tmp.M;\n  \n  arma_debug_assert_cube_as_mat(out, in, \"element-wise multiplication\", true);\n  \n  const uword in_n_rows   = in.n_rows;\n  const uword in_n_cols   = in.n_cols;\n  const uword in_n_slices = in.n_slices;\n  \n  const uword out_n_rows    = out.n_rows;\n  const uword out_n_cols    = out.n_cols;\n  const uword out_vec_state = out.vec_state;\n  \n  if(in_n_slices == 1)\n    {\n    for(uword ucol=0; ucol < in_n_cols; ++ucol)\n      {\n      arrayops::inplace_mul( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows );\n      }\n    }\n  else\n    {\n    if(out_vec_state == 0)\n      {\n      if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )\n        {\n        for(uword i=0; i < in_n_slices; ++i)\n          {\n          arrayops::inplace_mul( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );\n          }\n        }\n      else\n      if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )\n        {\n        for(uword slice=0; slice < in_n_slices; ++slice)\n          {\n          eT* out_colptr = out.colptr(slice);\n          \n          uword i,j;\n          for(i=0, j=1; j < in_n_cols; i+=2, j+=2)\n            {\n            const eT tmp_i = in.at(0, i, slice);\n            const eT tmp_j = in.at(0, j, slice);\n            \n            out_colptr[i] *= tmp_i;\n            out_colptr[j] *= tmp_j;\n            }\n          \n          if(i < in_n_cols)\n            {\n            out_colptr[i] *= in.at(0, i, slice);\n            }\n          }\n        }\n      }\n    else\n      {\n      eT* out_mem = out.memptr();\n      \n      for(uword i=0; i<in_n_slices; ++i)\n        {\n        out_mem[i] *= in.at(0, 0, i);\n        }\n      }\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator/=(const BaseCube<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& out = *this;\n  \n  const unwrap_cube<T1> tmp(X.get_ref());\n  const Cube<eT>& in  = tmp.M;\n  \n  arma_debug_assert_cube_as_mat(out, in, \"element-wise division\", true);\n  \n  const uword in_n_rows   = in.n_rows;\n  const uword in_n_cols   = in.n_cols;\n  const uword in_n_slices = in.n_slices;\n  \n  const uword out_n_rows    = out.n_rows;\n  const uword out_n_cols    = out.n_cols;\n  const uword out_vec_state = out.vec_state;\n  \n  if(in_n_slices == 1)\n    {\n    for(uword ucol=0; ucol < in_n_cols; ++ucol)\n      {\n      arrayops::inplace_div( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows );\n      }\n    }\n  else\n    {\n    if(out_vec_state == 0)\n      {\n      if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )\n        {\n        for(uword i=0; i < in_n_slices; ++i)\n          {\n          arrayops::inplace_div( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );\n          }\n        }\n      else\n      if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )\n        {\n        for(uword slice=0; slice < in_n_slices; ++slice)\n          {\n          eT* out_colptr = out.colptr(slice);\n          \n          uword i,j;\n          for(i=0, j=1; j < in_n_cols; i+=2, j+=2)\n            {\n            const eT tmp_i = in.at(0, i, slice);\n            const eT tmp_j = in.at(0, j, slice);\n            \n            out_colptr[i] /= tmp_i;\n            out_colptr[j] /= tmp_j;\n            }\n          \n          if(i < in_n_cols)\n            {\n            out_colptr[i] /= in.at(0, i, slice);\n            }\n          }\n        }\n      }\n    else\n      {\n      eT* out_mem = out.memptr();\n      \n      for(uword i=0; i<in_n_slices; ++i)\n        {\n        out_mem[i] /= in.at(0, 0, i);\n        }\n      }\n    }\n  \n  return *this;\n  }\n\n\n\n//! for constructing a complex matrix out of two non-complex matrices\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nMat<eT>::Mat\n  (\n  const Base<typename Mat<eT>::pod_type,T1>& A,\n  const Base<typename Mat<eT>::pod_type,T2>& B\n  )\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init(A,B);\n  }\n\n\n\n//! construct a matrix from subview (e.g. construct a matrix from a delayed submatrix operation)\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const subview<eT>& X)\n  : n_rows(X.n_rows)\n  , n_cols(X.n_cols)\n  , n_elem(X.n_elem)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  \n  subview<eT>::extract(*this, X);\n  }\n\n\n\n//! construct a matrix from subview (e.g. construct a matrix from a delayed submatrix operation)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const subview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool alias = (this == &(X.m));\n  \n  if(alias == false)\n    {\n    init_warm(X.n_rows, X.n_cols);\n    \n    subview<eT>::extract(*this, X);\n    }\n  else\n    {\n    Mat<eT> tmp(X);\n    \n    steal_mem(tmp);\n    }\n  \n  return *this;\n  }\n\n\n//! in-place matrix addition (using a submatrix on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const subview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview<eT>::plus_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n//! in-place matrix subtraction (using a submatrix on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const subview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview<eT>::minus_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place matrix mutiplication (using a submatrix on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator*=(const subview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  glue_times::apply_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place element-wise matrix mutiplication (using a submatrix on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator%=(const subview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview<eT>::schur_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place element-wise matrix division (using a submatrix on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator/=(const subview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview<eT>::div_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const subview_row_strans<eT>& X)\n  : n_rows(X.n_rows)\n  , n_cols(X.n_cols)\n  , n_elem(X.n_elem)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  \n  X.extract(*this);\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const subview_row_htrans<eT>& X)\n  : n_rows(X.n_rows)\n  , n_cols(X.n_cols)\n  , n_elem(X.n_elem)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  \n  X.extract(*this);\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const xvec_htrans<eT>& X)\n  : n_rows(X.n_rows)\n  , n_cols(X.n_cols)\n  , n_elem(X.n_elem)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  \n  X.extract(*this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<bool do_conj>\ninline\nMat<eT>::Mat(const xtrans_mat<eT,do_conj>& X)\n  : n_rows(X.n_rows)\n  , n_cols(X.n_cols)\n  , n_elem(X.n_elem)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  \n  X.extract(*this);\n  }\n\n\n\n//! construct a matrix from a subview_cube instance\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const subview_cube<eT>& x)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  this->operator=(x);\n  }\n\n\n\n//! construct a matrix from a subview_cube instance\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_cube<eT>::extract(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place matrix addition (using a single-slice subcube on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  subview_cube<eT>::plus_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place matrix subtraction (using a single-slice subcube on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_cube<eT>::minus_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place matrix mutiplication (using a single-slice subcube on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator*=(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  const Mat<eT> tmp(X);\n  glue_times::apply_inplace(*this, tmp);\n  \n  return *this;\n  }\n\n\n\n//! in-place element-wise matrix mutiplication (using a single-slice subcube on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator%=(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_cube<eT>::schur_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place element-wise matrix division (using a single-slice subcube on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator/=(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_cube<eT>::div_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! construct a matrix from diagview (e.g. construct a matrix from a delayed diag operation)\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const diagview<eT>& X)\n  : n_rows(X.n_rows)\n  , n_cols(X.n_cols)\n  , n_elem(X.n_elem)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  \n  diagview<eT>::extract(*this, X);\n  }\n\n\n\n//! construct a matrix from diagview (e.g. construct a matrix from a delayed diag operation)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const diagview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool alias = (this == &(X.m));\n  \n  if(alias == false)\n    {\n    init_warm(X.n_rows, X.n_cols);\n    \n    diagview<eT>::extract(*this, X);\n    }\n  else\n    {\n    Mat<eT> tmp(X);\n    \n    steal_mem(tmp);\n    }\n  \n  return *this;\n  }\n\n\n\n//! in-place matrix addition (using a diagview on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const diagview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  diagview<eT>::plus_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place matrix subtraction (using a diagview on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const diagview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  diagview<eT>::minus_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place matrix mutiplication (using a diagview on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator*=(const diagview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  glue_times::apply_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place element-wise matrix mutiplication (using a diagview on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator%=(const diagview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  diagview<eT>::schur_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place element-wise matrix division (using a diagview on the right-hand-side)\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator/=(const diagview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  diagview<eT>::div_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>::Mat(const spdiagview<eT>& X)\n  : n_rows(X.n_rows)\n  , n_cols(X.n_cols)\n  , n_elem(X.n_elem)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold();\n  \n  spdiagview<eT>::extract(*this, X);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const spdiagview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  init_warm(X.n_rows, X.n_cols);\n  \n  spdiagview<eT>::extract(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const spdiagview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> tmp(X);\n  \n  (*this).operator+=(tmp);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const spdiagview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> tmp(X);\n  \n  (*this).operator-=(tmp);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator*=(const spdiagview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> tmp(X);\n  \n  (*this).operator*=(tmp);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator%=(const spdiagview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> tmp(X);\n  \n  (*this).operator%=(tmp);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::operator/=(const spdiagview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> tmp(X);\n  \n  (*this).operator/=(tmp);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nMat<eT>::Mat(const subview_elem1<eT,T1>& X)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  this->operator=(X);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const subview_elem1<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_elem1<eT,T1>::extract(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const subview_elem1<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_elem1<eT,T1>::plus_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const subview_elem1<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_elem1<eT,T1>::minus_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator*=(const subview_elem1<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  glue_times::apply_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator%=(const subview_elem1<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_elem1<eT,T1>::schur_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator/=(const subview_elem1<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_elem1<eT,T1>::div_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nMat<eT>::Mat(const subview_elem2<eT,T1,T2>& X)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  this->operator=(X);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const subview_elem2<eT,T1,T2>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_elem2<eT,T1,T2>::extract(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const subview_elem2<eT,T1,T2>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_elem2<eT,T1,T2>::plus_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const subview_elem2<eT,T1,T2>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_elem2<eT,T1,T2>::minus_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nconst Mat<eT>&\nMat<eT>::operator*=(const subview_elem2<eT,T1,T2>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  glue_times::apply_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nconst Mat<eT>&\nMat<eT>::operator%=(const subview_elem2<eT,T1,T2>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_elem2<eT,T1,T2>::schur_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nconst Mat<eT>&\nMat<eT>::operator/=(const subview_elem2<eT,T1,T2>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_elem2<eT,T1,T2>::div_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nMat<eT>::Mat(const SpBase<eT, T1>& m)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  const SpProxy<T1> p(m.get_ref());\n  \n  access::rw(n_rows) = p.get_n_rows();\n  access::rw(n_cols) = p.get_n_cols();\n  access::rw(n_elem) = p.get_n_elem();\n  \n  init_cold();\n  \n  zeros();\n  \n  typename SpProxy<T1>::const_iterator_type it     = p.begin();\n  typename SpProxy<T1>::const_iterator_type it_end = p.end();\n  \n  while(it != it_end)\n    {\n    at(it.row(), it.col()) = (*it);\n    ++it;\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const SpBase<eT, T1>& m)\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> p(m.get_ref());\n  \n  init_warm(p.get_n_rows(), p.get_n_cols());\n  \n  zeros();\n  \n  typename SpProxy<T1>::const_iterator_type it     = p.begin();\n  typename SpProxy<T1>::const_iterator_type it_end = p.end();\n  \n  while(it != it_end)\n    {\n    at(it.row(), it.col()) = (*it);\n    ++it;\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const SpBase<eT, T1>& m)\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> p(m.get_ref());\n  \n  arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), \"addition\");\n  \n  typename SpProxy<T1>::const_iterator_type it     = p.begin();\n  typename SpProxy<T1>::const_iterator_type it_end = p.end();\n  \n  while(it != it_end)\n    {\n    at(it.row(), it.col()) += (*it);\n    ++it;\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const SpBase<eT, T1>& m)\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> p(m.get_ref());\n  \n  arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), \"subtraction\");\n  \n  typename SpProxy<T1>::const_iterator_type it     = p.begin();\n  typename SpProxy<T1>::const_iterator_type it_end = p.end();\n  \n  while(it != it_end)\n    {\n    at(it.row(), it.col()) -= (*it);\n    ++it;\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator*=(const SpBase<eT, T1>& m)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT> z = (*this) * m.get_ref();\n  \n  steal_mem(z);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator%=(const SpBase<eT, T1>& m)\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> p(m.get_ref());\n  \n  arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), \"element-wise multiplication\");\n  \n  typename SpProxy<T1>::const_iterator_type it     = p.begin();\n  typename SpProxy<T1>::const_iterator_type it_end = p.end();\n  \n  // We have to zero everything that isn't being used.\n  arrayops::inplace_set(memptr(), eT(0), (it.col() * n_rows) + it.row());\n  \n  while(it != it_end)\n    {\n    const uword cur_loc = (it.col() * n_rows) + it.row();\n    \n    access::rw(mem[cur_loc]) *= (*it);\n    \n    ++it;\n    \n    const uword next_loc = (it == it_end)\n      ? (p.get_n_cols() * n_rows)\n      : (it.col() * n_rows) + it.row();\n    \n    arrayops::inplace_set(memptr() + cur_loc + 1, eT(0), (next_loc - cur_loc - 1));\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Mat<eT>&\nMat<eT>::operator/=(const SpBase<eT, T1>& m)\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> p(m.get_ref());\n  \n  arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), \"element-wise division\");\n  \n  // If you use this method, you are probably stupid or misguided, but for completeness it is implemented.\n  // Unfortunately the best way to do this is loop over every element.\n  for(uword c = 0; c < n_cols; ++c)\n  for(uword r = 0; r < n_rows; ++r)\n    {\n    at(r, c) /= p.at(r, c);\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nmat_injector< Mat<eT> >\nMat<eT>::operator<<(const eT val)\n  {\n  return mat_injector< Mat<eT> >(*this, val);\n  }\n\n\n\ntemplate<typename eT>\ninline\nmat_injector< Mat<eT> >\nMat<eT>::operator<<(const injector_end_of_row<>& x)\n  {\n  return mat_injector< Mat<eT> >(*this, x);\n  }\n\n\n\n//! creation of subview (row vector)\ntemplate<typename eT>\narma_inline\nsubview_row<eT>\nMat<eT>::row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( row_num >= n_rows, \"Mat::row(): index out of bounds\" );\n  \n  return subview_row<eT>(*this, row_num);\n  }\n\n\n\n//! creation of subview (row vector)\ntemplate<typename eT>\narma_inline\nconst subview_row<eT>\nMat<eT>::row(const uword row_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( row_num >= n_rows, \"Mat::row(): index out of bounds\" );\n  \n  return subview_row<eT>(*this, row_num);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_row<eT>\nMat<eT>::operator()(const uword row_num, const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool col_all = col_span.whole;\n  \n  const uword local_n_cols = n_cols;\n  \n  const uword in_col1       = col_all ? 0            : col_span.a;\n  const uword in_col2       =                          col_span.b;\n  const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  arma_debug_check\n    (\n    (row_num >= n_rows)\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,\n    \"Mat::operator(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview_row<eT>(*this, row_num, in_col1, submat_n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview_row<eT>\nMat<eT>::operator()(const uword row_num, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool col_all = col_span.whole;\n  \n  const uword local_n_cols = n_cols;\n  \n  const uword in_col1       = col_all ? 0            : col_span.a;\n  const uword in_col2       =                          col_span.b;\n  const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  arma_debug_check\n    (\n    (row_num >= n_rows)\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,\n    \"Mat::operator(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview_row<eT>(*this, row_num, in_col1, submat_n_cols);\n  }\n\n\n\n//! creation of subview (column vector)\ntemplate<typename eT>\narma_inline\nsubview_col<eT>\nMat<eT>::col(const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( col_num >= n_cols, \"Mat::col(): index out of bounds\");\n  \n  return subview_col<eT>(*this, col_num);\n  }\n\n\n\n//! creation of subview (column vector)\ntemplate<typename eT>\narma_inline\nconst subview_col<eT>\nMat<eT>::col(const uword col_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( col_num >= n_cols, \"Mat::col(): index out of bounds\");\n  \n  return subview_col<eT>(*this, col_num);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_col<eT>\nMat<eT>::operator()(const span& row_span, const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all = row_span.whole;\n  \n  const uword local_n_rows = n_rows;\n  \n  const uword in_row1       = row_all ? 0            : row_span.a;\n  const uword in_row2       =                          row_span.b;\n  const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  arma_debug_check\n    (\n    (col_num >= n_cols)\n    ||\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ,\n    \"Mat::operator(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview_col<eT>(*this, col_num, in_row1, submat_n_rows);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview_col<eT>\nMat<eT>::operator()(const span& row_span, const uword col_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all = row_span.whole;\n  \n  const uword local_n_rows = n_rows;\n  \n  const uword in_row1       = row_all ? 0            : row_span.a;\n  const uword in_row2       =                          row_span.b;\n  const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  arma_debug_check\n    (\n    (col_num >= n_cols)\n    ||\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ,\n    \"Mat::operator(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview_col<eT>(*this, col_num, in_row1, submat_n_rows);\n  }\n\n\n\n//! create a Col object which uses memory from an existing matrix object.\n//! this approach is currently not alias safe\n//! and does not take into account that the parent matrix object could be deleted.\n//! if deleted memory is accessed by the created Col object,\n//! it will cause memory corruption and/or a crash\ntemplate<typename eT>\ninline\nCol<eT>\nMat<eT>::unsafe_col(const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( col_num >= n_cols, \"Mat::unsafe_col(): index out of bounds\");\n  \n  return Col<eT>(colptr(col_num), n_rows, false, true);\n  }\n\n\n\n//! create a Col object which uses memory from an existing matrix object.\n//! this approach is currently not alias safe\n//! and does not take into account that the parent matrix object could be deleted.\n//! if deleted memory is accessed by the created Col object,\n//! it will cause memory corruption and/or a crash\ntemplate<typename eT>\ninline\nconst Col<eT>\nMat<eT>::unsafe_col(const uword col_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( col_num >= n_cols, \"Mat::unsafe_col(): index out of bounds\");\n  \n  typedef const Col<eT> out_type;\n  \n  return out_type(const_cast<eT*>(colptr(col_num)), n_rows, false, true);\n  }\n\n\n\n//! creation of subview (submatrix comprised of specified row vectors)\ntemplate<typename eT>\narma_inline\nsubview<eT>\nMat<eT>::rows(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_row2 >= n_rows),\n    \"Mat::rows(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  \n  return subview<eT>(*this, in_row1, 0, subview_n_rows, n_cols );\n  }\n\n\n\n//! creation of subview (submatrix comprised of specified row vectors)\ntemplate<typename eT>\narma_inline\nconst subview<eT>\nMat<eT>::rows(const uword in_row1, const uword in_row2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_row2 >= n_rows),\n    \"Mat::rows(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  \n  return subview<eT>(*this, in_row1, 0, subview_n_rows, n_cols );\n  }\n\n\n\n//! creation of subview (submatrix comprised of specified column vectors)\ntemplate<typename eT>\narma_inline\nsubview<eT>\nMat<eT>::cols(const uword in_col1, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_col1 > in_col2) || (in_col2 >= n_cols),\n    \"Mat::cols(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n  \n  return subview<eT>(*this, 0, in_col1, n_rows, subview_n_cols);\n  }\n\n\n\n//! creation of subview (submatrix comprised of specified column vectors)\ntemplate<typename eT>\narma_inline\nconst subview<eT>\nMat<eT>::cols(const uword in_col1, const uword in_col2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_col1 > in_col2) || (in_col2 >= n_cols),\n    \"Mat::cols(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n  \n  return subview<eT>(*this, 0, in_col1, n_rows, subview_n_cols);\n  }\n\n\n\n//! creation of subview (submatrix comprised of specified row vectors)\ntemplate<typename eT>\ninline\nsubview<eT>\nMat<eT>::rows(const span& row_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all = row_span.whole;\n  \n  const uword local_n_rows = n_rows;\n  \n  const uword in_row1       = row_all ? 0            : row_span.a;\n  const uword in_row2       =                          row_span.b;\n  const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  arma_debug_check\n    (\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ,\n    \"Mat::rows(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview<eT>(*this, in_row1, 0, submat_n_rows, n_cols);\n  }\n\n\n\n//! creation of subview (submatrix comprised of specified row vectors)\ntemplate<typename eT>\ninline\nconst subview<eT>\nMat<eT>::rows(const span& row_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all = row_span.whole;\n  \n  const uword local_n_rows = n_rows;\n  \n  const uword in_row1       = row_all ? 0            : row_span.a;\n  const uword in_row2       =                          row_span.b;\n  const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  arma_debug_check\n    (\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ,\n    \"Mat::rows(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview<eT>(*this, in_row1, 0, submat_n_rows, n_cols);\n  }\n\n\n\n//! creation of subview (submatrix comprised of specified column vectors)\ntemplate<typename eT>\narma_inline\nsubview<eT>\nMat<eT>::cols(const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool col_all = col_span.whole;\n  \n  const uword local_n_cols = n_cols;\n  \n  const uword in_col1       = col_all ? 0            : col_span.a;\n  const uword in_col2       =                          col_span.b;\n  const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  arma_debug_check\n    (\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,\n    \"Mat::cols(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview<eT>(*this, 0, in_col1, n_rows, submat_n_cols);\n  }\n\n\n\n//! creation of subview (submatrix comprised of specified column vectors)\ntemplate<typename eT>\narma_inline\nconst subview<eT>\nMat<eT>::cols(const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool col_all = col_span.whole;\n  \n  const uword local_n_cols = n_cols;\n  \n  const uword in_col1       = col_all ? 0            : col_span.a;\n  const uword in_col2       =                          col_span.b;\n  const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  arma_debug_check\n    (\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,\n    \"Mat::cols(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview<eT>(*this, 0, in_col1, n_rows, submat_n_cols);\n  }\n\n\n\n//! creation of subview (submatrix)\ntemplate<typename eT>\narma_inline\nsubview<eT>\nMat<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_col1 >  in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),\n    \"Mat::submat(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n  \n  return subview<eT>(*this, in_row1, in_col1, subview_n_rows, subview_n_cols);\n  }\n\n\n\n//! creation of subview (generic submatrix)\ntemplate<typename eT>\narma_inline\nconst subview<eT>\nMat<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_col1 >  in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),\n    \"Mat::submat(): indices out of bounds or incorrectly used\"\n    );\n    \n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n  \n  return subview<eT>(*this, in_row1, in_col1, subview_n_rows, subview_n_cols);\n  }\n\n\n\n//! creation of subview (submatrix)\ntemplate<typename eT>\narma_inline\nsubview<eT>\nMat<eT>::submat(const uword in_row1, const uword in_col1, const SizeMat& s)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword l_n_rows = n_rows;\n  const uword l_n_cols = n_cols;\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  \n  arma_debug_check\n    (\n    ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols)),\n    \"Mat::submat(): indices or size out of bounds\"\n    );\n  \n  return subview<eT>(*this, in_row1, in_col1, s_n_rows, s_n_cols);\n  }\n\n\n\n//! creation of subview (submatrix)\ntemplate<typename eT>\narma_inline\nconst subview<eT>\nMat<eT>::submat(const uword in_row1, const uword in_col1, const SizeMat& s) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword l_n_rows = n_rows;\n  const uword l_n_cols = n_cols;\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  \n  arma_debug_check\n    (\n    ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols)),\n    \"Mat::submat(): indices or size out of bounds\"\n    );\n  \n  return subview<eT>(*this, in_row1, in_col1, s_n_rows, s_n_cols);\n  }\n\n\n\n//! creation of subview (submatrix)\ntemplate<typename eT>\ninline\nsubview<eT>\nMat<eT>::submat(const span& row_span, const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all = row_span.whole;\n  const bool col_all = col_span.whole;\n  \n  const uword local_n_rows = n_rows;\n  const uword local_n_cols = n_cols;\n  \n  const uword in_row1       = row_all ? 0            : row_span.a;\n  const uword in_row2       =                          row_span.b;\n  const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  const uword in_col1       = col_all ? 0            : col_span.a;\n  const uword in_col2       =                          col_span.b;\n  const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  arma_debug_check\n    (\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,\n    \"Mat::submat(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview<eT>(*this, in_row1, in_col1, submat_n_rows, submat_n_cols);\n  }\n\n\n\n//! creation of subview (generic submatrix)\ntemplate<typename eT>\ninline\nconst subview<eT>\nMat<eT>::submat(const span& row_span, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all = row_span.whole;\n  const bool col_all = col_span.whole;\n  \n  const uword local_n_rows = n_rows;\n  const uword local_n_cols = n_cols;\n  \n  const uword in_row1       = row_all ? 0            : row_span.a;\n  const uword in_row2       =                          row_span.b;\n  const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  const uword in_col1       = col_all ? 0            : col_span.a;\n  const uword in_col2       =                          col_span.b;\n  const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  arma_debug_check\n    (\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,\n    \"Mat::submat(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview<eT>(*this, in_row1, in_col1, submat_n_rows, submat_n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview<eT>\nMat<eT>::operator()(const span& row_span, const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).submat(row_span, col_span);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview<eT>\nMat<eT>::operator()(const span& row_span, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).submat(row_span, col_span);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview<eT>\nMat<eT>::operator()(const uword in_row1, const uword in_col1, const SizeMat& s)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).submat(in_row1, in_col1, s);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview<eT>\nMat<eT>::operator()(const uword in_row1, const uword in_col1, const SizeMat& s) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).submat(in_row1, in_col1, s);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview<eT>\nMat<eT>::head_rows(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > n_rows), \"Mat::head_rows(): size out of bounds\");\n  \n  return subview<eT>(*this, 0, 0, N, n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview<eT>\nMat<eT>::head_rows(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > n_rows), \"Mat::head_rows(): size out of bounds\");\n  \n  return subview<eT>(*this, 0, 0, N, n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview<eT>\nMat<eT>::tail_rows(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > n_rows), \"Mat::tail_rows(): size out of bounds\");\n  \n  const uword start_row = n_rows - N;\n  \n  return subview<eT>(*this, start_row, 0, N, n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview<eT>\nMat<eT>::tail_rows(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > n_rows), \"Mat::tail_rows(): size out of bounds\");\n  \n  const uword start_row = n_rows - N;\n  \n  return subview<eT>(*this, start_row, 0, N, n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview<eT>\nMat<eT>::head_cols(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > n_cols), \"Mat::head_cols(): size out of bounds\");\n  \n  return subview<eT>(*this, 0, 0, n_rows, N);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview<eT>\nMat<eT>::head_cols(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > n_cols), \"Mat::head_cols(): size out of bounds\");\n  \n  return subview<eT>(*this, 0, 0, n_rows, N);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview<eT>\nMat<eT>::tail_cols(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > n_cols), \"Mat::tail_cols(): size out of bounds\");\n  \n  const uword start_col = n_cols - N;\n  \n  return subview<eT>(*this, 0, start_col, n_rows, N);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview<eT>\nMat<eT>::tail_cols(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > n_cols), \"Mat::tail_cols(): size out of bounds\");\n  \n  const uword start_col = n_cols - N;\n  \n  return subview<eT>(*this, 0, start_col, n_rows, N);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\narma_inline\nsubview_elem1<eT,T1>\nMat<eT>::elem(const Base<uword,T1>& a)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem1<eT,T1>(*this, a);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\narma_inline\nconst subview_elem1<eT,T1>\nMat<eT>::elem(const Base<uword,T1>& a) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem1<eT,T1>(*this, a);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\narma_inline\nsubview_elem1<eT,T1>\nMat<eT>::operator()(const Base<uword,T1>& a)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem1<eT,T1>(*this, a);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\narma_inline\nconst subview_elem1<eT,T1>\nMat<eT>::operator()(const Base<uword,T1>& a) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem1<eT,T1>(*this, a);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\narma_inline\nsubview_elem2<eT,T1,T2>\nMat<eT>::elem(const Base<uword,T1>& ri, const Base<uword,T2>& ci)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\narma_inline\nconst subview_elem2<eT,T1,T2>\nMat<eT>::elem(const Base<uword,T1>& ri, const Base<uword,T2>& ci) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\narma_inline\nsubview_elem2<eT,T1,T2>\nMat<eT>::submat(const Base<uword,T1>& ri, const Base<uword,T2>& ci)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\narma_inline\nconst subview_elem2<eT,T1,T2>\nMat<eT>::submat(const Base<uword,T1>& ri, const Base<uword,T2>& ci) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\narma_inline\nsubview_elem2<eT,T1,T2>\nMat<eT>::operator()(const Base<uword,T1>& ri, const Base<uword,T2>& ci)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\narma_inline\nconst subview_elem2<eT,T1,T2>\nMat<eT>::operator()(const Base<uword,T1>& ri, const Base<uword,T2>& ci) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem2<eT,T1,T2>(*this, ri, ci, false, false);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\narma_inline\nsubview_elem2<eT,T1,T1>\nMat<eT>::rows(const Base<uword,T1>& ri)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem2<eT,T1,T1>(*this, ri, ri, false, true);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\narma_inline\nconst subview_elem2<eT,T1,T1>\nMat<eT>::rows(const Base<uword,T1>& ri) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem2<eT,T1,T1>(*this, ri, ri, false, true);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T2>\narma_inline\nsubview_elem2<eT,T2,T2>\nMat<eT>::cols(const Base<uword,T2>& ci)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem2<eT,T2,T2>(*this, ci, ci, true, false);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T2>\narma_inline\nconst subview_elem2<eT,T2,T2>\nMat<eT>::cols(const Base<uword,T2>& ci) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_elem2<eT,T2,T2>(*this, ci, ci, true, false);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_each1< Mat<eT>, 0 >\nMat<eT>::each_col()\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_each1< Mat<eT>, 0>(*this);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_each1< Mat<eT>, 1 >\nMat<eT>::each_row()\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_each1< Mat<eT>, 1>(*this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nsubview_each2< Mat<eT>, 0, T1 >\nMat<eT>::each_col(const Base<uword, T1>& indices)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_each2< Mat<eT>, 0, T1 >(*this, indices);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nsubview_each2< Mat<eT>, 1, T1 >\nMat<eT>::each_row(const Base<uword, T1>& indices)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_each2< Mat<eT>, 1, T1 >(*this, indices);\n  }\n\n\n\n//! creation of diagview (diagonal)\ntemplate<typename eT>\narma_inline\ndiagview<eT>\nMat<eT>::diag(const sword in_id)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword row_offset = (in_id < 0) ? uword(-in_id) : 0;\n  const uword col_offset = (in_id > 0) ? uword( in_id) : 0;\n  \n  arma_debug_check\n    (\n    ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),\n    \"Mat::diag(): requested diagonal out of bounds\"\n    );\n  \n  const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);\n  \n  return diagview<eT>(*this, row_offset, col_offset, len);\n  }\n\n\n\n//! creation of diagview (diagonal)\ntemplate<typename eT>\narma_inline\nconst diagview<eT>\nMat<eT>::diag(const sword in_id) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword row_offset = (in_id < 0) ? -in_id : 0;\n  const uword col_offset = (in_id > 0) ?  in_id : 0;\n  \n  arma_debug_check\n    (\n    ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),\n    \"Mat::diag(): requested diagonal out of bounds\"\n    );\n  \n  const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);\n  \n  return diagview<eT>(*this, row_offset, col_offset, len);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::swap_rows(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows = n_rows;\n  const uword local_n_cols = n_cols;\n  \n  arma_debug_check\n    (\n    (in_row1 >= local_n_rows) || (in_row2 >= local_n_rows),\n    \"Mat::swap_rows(): index out of bounds\"\n    );\n  \n  if(n_elem > 0)\n    {\n    for(uword ucol=0; ucol < local_n_cols; ++ucol)\n      {\n      const uword offset = ucol * local_n_rows;\n      const uword pos1   = in_row1 + offset;\n      const uword pos2   = in_row2 + offset;\n      \n      std::swap( access::rw(mem[pos1]), access::rw(mem[pos2]) );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::swap_cols(const uword in_colA, const uword in_colB)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows = n_rows;\n  const uword local_n_cols = n_cols;\n  \n  arma_debug_check\n    (\n    (in_colA >= local_n_cols) || (in_colB >= local_n_cols),\n    \"Mat::swap_cols(): index out of bounds\"\n    );\n  \n  if(n_elem > 0)\n    {\n    eT* ptrA = colptr(in_colA);\n    eT* ptrB = colptr(in_colB);\n    \n    eT tmp_i;\n    eT tmp_j;\n    \n    uword iq,jq;\n    for(iq=0, jq=1; jq < local_n_rows; iq+=2, jq+=2)\n      {\n      tmp_i = ptrA[iq];\n      tmp_j = ptrA[jq];\n      \n      ptrA[iq] = ptrB[iq];\n      ptrA[jq] = ptrB[jq];\n      \n      ptrB[iq] = tmp_i;\n      ptrB[jq] = tmp_j;\n      }\n    \n    if(iq < local_n_rows)\n      {\n      std::swap( ptrA[iq], ptrB[iq] );\n      }\n    }\n  }\n\n\n\n//! remove specified row\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::shed_row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( row_num >= n_rows, \"Mat::shed_row(): index out of bounds\");\n  \n  shed_rows(row_num, row_num);\n  }\n\n\n\n//! remove specified column\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::shed_col(const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( col_num >= n_cols, \"Mat::shed_col(): index out of bounds\");\n  \n  shed_cols(col_num, col_num);\n  }\n\n\n\n//! remove specified rows\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::shed_rows(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_row2 >= n_rows),\n    \"Mat::shed_rows(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword n_keep_front = in_row1;\n  const uword n_keep_back  = n_rows - (in_row2 + 1);\n  \n  Mat<eT> X(n_keep_front + n_keep_back, n_cols);\n  \n  if(n_keep_front > 0)\n    {\n    X.rows( 0, (n_keep_front-1) ) = rows( 0, (in_row1-1) );\n    }\n  \n  if(n_keep_back > 0)\n    {\n    X.rows( n_keep_front,  (n_keep_front+n_keep_back-1) ) = rows( (in_row2+1), (n_rows-1) );\n    }\n  \n  steal_mem(X);\n  }\n\n\n\n//! remove specified columns\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::shed_cols(const uword in_col1, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_col1 > in_col2) || (in_col2 >= n_cols),\n    \"Mat::shed_cols(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword n_keep_front = in_col1;\n  const uword n_keep_back  = n_cols - (in_col2 + 1);\n  \n  Mat<eT> X(n_rows, n_keep_front + n_keep_back);\n  \n  if(n_keep_front > 0)\n    {\n    X.cols( 0, (n_keep_front-1) ) = cols( 0, (in_col1-1) );\n    }\n  \n  if(n_keep_back > 0)\n    {\n    X.cols( n_keep_front,  (n_keep_front+n_keep_back-1) ) = cols( (in_col2+1), (n_cols-1) );\n    }\n  \n  steal_mem(X);\n  }\n\n\n\n//! insert N rows at the specified row position,\n//! optionally setting the elements of the inserted rows to zero\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::insert_rows(const uword row_num, const uword N, const bool set_to_zero)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword t_n_rows = n_rows;\n  const uword t_n_cols = n_cols;\n  \n  const uword A_n_rows = row_num;\n  const uword B_n_rows = t_n_rows - row_num;\n  \n  // insertion at row_num == n_rows is in effect an append operation\n  arma_debug_check( (row_num > t_n_rows), \"Mat::insert_rows(): index out of bounds\");\n  \n  if(N > 0)\n    {\n    Mat<eT> out(t_n_rows + N, t_n_cols);\n    \n    if(A_n_rows > 0)\n      {\n      out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1);\n      }\n    \n    if(B_n_rows > 0)\n      {\n      out.rows(row_num + N, t_n_rows + N - 1) = rows(row_num, t_n_rows-1);\n      }\n    \n    if(set_to_zero == true)\n      {\n      out.rows(row_num, row_num + N - 1).zeros();\n      }\n    \n    steal_mem(out);\n    }\n  }\n\n\n\n//! insert N columns at the specified column position,\n//! optionally setting the elements of the inserted columns to zero\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::insert_cols(const uword col_num, const uword N, const bool set_to_zero)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword t_n_rows = n_rows;\n  const uword t_n_cols = n_cols;\n  \n  const uword A_n_cols = col_num;\n  const uword B_n_cols = t_n_cols - col_num;\n  \n  // insertion at col_num == n_cols is in effect an append operation\n  arma_debug_check( (col_num > t_n_cols), \"Mat::insert_cols(): index out of bounds\");\n  \n  if(N > 0)\n    {\n    Mat<eT> out(t_n_rows, t_n_cols + N);\n    \n    if(A_n_cols > 0)\n      {\n      out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1);\n      }\n    \n    if(B_n_cols > 0)\n      {\n      out.cols(col_num + N, t_n_cols + N - 1) = cols(col_num, t_n_cols-1);\n      }\n    \n    if(set_to_zero == true)\n      {\n      out.cols(col_num, col_num + N - 1).zeros();\n      }\n    \n    steal_mem(out);\n    }\n  }\n\n\n\n//! insert the given object at the specified row position; \n//! the given object must have the same number of columns as the matrix\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nMat<eT>::insert_rows(const uword row_num, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1>   tmp(X.get_ref());\n  const Mat<eT>& C = tmp.M;\n  \n  const uword C_n_rows = C.n_rows;\n  const uword C_n_cols = C.n_cols;\n  \n  const uword t_n_rows = n_rows;\n  const uword t_n_cols = n_cols;\n  \n  const uword A_n_rows = row_num;\n  const uword B_n_rows = t_n_rows - row_num;\n  \n  bool  err_state = false;\n  char* err_msg   = 0;\n  \n  // insertion at row_num == n_rows is in effect an append operation\n  \n  arma_debug_set_error\n    (\n    err_state,\n    err_msg,\n    (row_num > t_n_rows),\n    \"Mat::insert_rows(): index out of bounds\"\n    );\n  \n  arma_debug_set_error\n    (\n    err_state,\n    err_msg,\n    ( (C_n_cols != t_n_cols) && ( (t_n_rows > 0) || (t_n_cols > 0) ) && ( (C_n_rows > 0) || (C_n_cols > 0) ) ),\n    \"Mat::insert_rows(): given object has an incompatible number of columns\"\n    );\n  \n  arma_debug_check(err_state, err_msg);\n  \n  if(C_n_rows > 0)\n    {\n    Mat<eT> out( t_n_rows + C_n_rows, (std::max)(t_n_cols, C_n_cols) );\n    \n    if(t_n_cols > 0)\n      {\n      if(A_n_rows > 0)\n        {\n        out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1);\n        }\n      \n      if( (t_n_cols > 0) && (B_n_rows > 0) )\n        {\n        out.rows(row_num + C_n_rows, t_n_rows + C_n_rows - 1) = rows(row_num, t_n_rows - 1);\n        }\n      }\n    \n    if(C_n_cols > 0)\n      {\n      out.rows(row_num, row_num + C_n_rows - 1) = C;\n      }\n    \n    steal_mem(out);\n    }\n  }\n\n\n\n//! insert the given object at the specified column position; \n//! the given object must have the same number of rows as the matrix\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nMat<eT>::insert_cols(const uword col_num, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1>   tmp(X.get_ref());\n  const Mat<eT>& C = tmp.M;\n  \n  const uword C_n_rows = C.n_rows;\n  const uword C_n_cols = C.n_cols;\n  \n  const uword t_n_rows = n_rows;\n  const uword t_n_cols = n_cols;\n  \n  const uword A_n_cols = col_num;\n  const uword B_n_cols = t_n_cols - col_num;\n  \n  bool  err_state = false;\n  char* err_msg   = 0;\n  \n  // insertion at col_num == n_cols is in effect an append operation\n  \n  arma_debug_set_error\n    (\n    err_state,\n    err_msg,\n    (col_num > t_n_cols),\n    \"Mat::insert_cols(): index out of bounds\"\n    );\n  \n  arma_debug_set_error\n    (\n    err_state,\n    err_msg,\n    ( (C_n_rows != t_n_rows) && ( (t_n_rows > 0) || (t_n_cols > 0) ) && ( (C_n_rows > 0) || (C_n_cols > 0) ) ),\n    \"Mat::insert_cols(): given object has an incompatible number of rows\"\n    );\n  \n  arma_debug_check(err_state, err_msg);\n  \n  if(C_n_cols > 0)\n    {\n    Mat<eT> out( (std::max)(t_n_rows, C_n_rows), t_n_cols + C_n_cols );\n    \n    if(t_n_rows > 0)\n      {\n      if(A_n_cols > 0)\n        {\n        out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1);\n        }\n      \n      if(B_n_cols > 0)\n        {\n        out.cols(col_num + C_n_cols, t_n_cols + C_n_cols - 1) = cols(col_num, t_n_cols - 1);\n        }\n      }\n    \n    if(C_n_rows > 0)\n      {\n      out.cols(col_num, col_num + C_n_cols - 1) = C;\n      }\n    \n    steal_mem(out);\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename gen_type>\ninline\nMat<eT>::Mat(const Gen<T1, gen_type>& X)\n  : n_rows(X.n_rows)\n  , n_cols(X.n_cols)\n  , n_elem(n_rows*n_cols)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  init_cold();\n  \n  X.apply(*this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename gen_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const Gen<T1, gen_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  init_warm(X.n_rows, X.n_cols);\n  \n  X.apply(*this);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename gen_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const Gen<T1, gen_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  X.apply_inplace_plus(*this);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename gen_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const Gen<T1, gen_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  X.apply_inplace_minus(*this);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename gen_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator*=(const Gen<T1, gen_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const Mat<eT> tmp(X);\n  \n  return (*this).operator*=(tmp);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename gen_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator%=(const Gen<T1, gen_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  X.apply_inplace_schur(*this);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename gen_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator/=(const Gen<T1, gen_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  X.apply_inplace_div(*this);\n  \n  return *this;\n  }\n\n\n\n//! create a matrix from Op, i.e. run the previously delayed unary operations\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nMat<eT>::Mat(const Op<T1, op_type>& X)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n\n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  op_type::apply(*this, X);\n  }\n\n\n\n//! create a matrix from Op, i.e. run the previously delayed unary operations\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const Op<T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  op_type::apply(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place matrix addition, with the right-hand-side operand having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const Op<T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator+=(m);\n  }\n\n\n\n//! in-place matrix subtraction, with the right-hand-side operand having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const Op<T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator-=(m);\n  }\n\n\n\n//! in-place matrix multiplication, with the right-hand-side operand having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator*=(const Op<T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  glue_times::apply_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place matrix element-wise multiplication, with the right-hand-side operand having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator%=(const Op<T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator%=(m);\n  }\n\n\n\n//! in-place matrix element-wise division, with the right-hand-side operand having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator/=(const Op<T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator/=(m);\n  }\n\n\n\n//! create a matrix from eOp, i.e. run the previously delayed unary operations\ntemplate<typename eT>\ntemplate<typename T1, typename eop_type>\ninline\nMat<eT>::Mat(const eOp<T1, eop_type>& X)\n  : n_rows(X.get_n_rows())\n  , n_cols(X.get_n_cols())\n  , n_elem(X.get_n_elem())\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  init_cold();\n  \n  eop_type::apply(*this, X);\n  }\n\n\n\n//! create a matrix from eOp, i.e. run the previously delayed unary operations\ntemplate<typename eT>\ntemplate<typename T1, typename eop_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const eOp<T1, eop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const bool bad_alias = (eOp<T1, eop_type>::proxy_type::has_subview  &&  X.P.is_alias(*this));\n  \n  if(bad_alias == false)\n    {\n    init_warm(X.get_n_rows(), X.get_n_cols());\n    \n    eop_type::apply(*this, X);\n    }\n  else\n    {\n    arma_extra_debug_print(\"bad_alias = true\");\n    \n    Mat<eT> tmp(X);\n    \n    steal_mem(tmp);\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename eop_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const eOp<T1, eop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  eop_type::apply_inplace_plus(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename eop_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const eOp<T1, eop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  eop_type::apply_inplace_minus(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename eop_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator*=(const eOp<T1, eop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  glue_times::apply_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename eop_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator%=(const eOp<T1, eop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  eop_type::apply_inplace_schur(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename eop_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator/=(const eOp<T1, eop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  eop_type::apply_inplace_div(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nMat<eT>::Mat(const mtOp<eT, T1, op_type>& X)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  op_type::apply(*this, X);\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const mtOp<eT, T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  op_type::apply(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const mtOp<eT, T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator+=(m);\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const mtOp<eT, T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator-=(m);\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator*=(const mtOp<eT, T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator*=(m);\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator%=(const mtOp<eT, T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator%=(m);\n  }\n\n\n\n//! EXPERIMENTAL\ntemplate<typename eT>\ntemplate<typename T1, typename op_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator/=(const mtOp<eT, T1, op_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator/=(m);\n  }\n\n\n\n//! create a matrix from Glue, i.e. run the previously delayed binary operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nMat<eT>::Mat(const Glue<T1, T2, glue_type>& X)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  glue_type::apply(*this, X);\n  }\n\n\n\n//! create a matrix from Glue, i.e. run the previously delayed binary operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const Glue<T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  glue_type::apply(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place matrix addition, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const Glue<T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator+=(m);\n  }\n\n\n\n//! in-place matrix subtraction, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const Glue<T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator-=(m);\n  }\n\n\n\n//! in-place matrix multiplications, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator*=(const Glue<T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  glue_times::apply_inplace(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place matrix element-wise multiplication, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator%=(const Glue<T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator%=(m);\n  }\n\n\n\n//! in-place matrix element-wise division, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator/=(const Glue<T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator/=(m);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const Glue<T1, T2, glue_times>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  glue_times::apply_inplace_plus(*this, X, sword(+1));\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const Glue<T1, T2, glue_times>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  glue_times::apply_inplace_plus(*this, X, sword(-1));\n  \n  return *this;\n  }\n\n\n\n//! create a matrix from eGlue, i.e. run the previously delayed binary operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename eglue_type>\ninline\nMat<eT>::Mat(const eGlue<T1, T2, eglue_type>& X)\n  : n_rows(X.get_n_rows())\n  , n_cols(X.get_n_cols())\n  , n_elem(X.get_n_elem())\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  init_cold();\n  \n  eglue_type::apply(*this, X);\n  }\n\n\n\n//! create a matrix from eGlue, i.e. run the previously delayed binary operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename eglue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const eGlue<T1, T2, eglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  const bool bad_alias =\n    (\n    (eGlue<T1, T2, eglue_type>::proxy1_type::has_subview  &&  X.P1.is_alias(*this))\n    ||\n    (eGlue<T1, T2, eglue_type>::proxy2_type::has_subview  &&  X.P2.is_alias(*this))\n    );\n  \n  if(bad_alias == false)\n    {\n    init_warm(X.get_n_rows(), X.get_n_cols());\n    \n    eglue_type::apply(*this, X);\n    }\n  else\n    {\n    arma_extra_debug_print(\"bad_alias = true\");\n    \n    Mat<eT> tmp(X);\n    \n    steal_mem(tmp);\n    }\n  \n  return *this;\n  }\n\n\n\n//! in-place matrix addition, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename eglue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const eGlue<T1, T2, eglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  eglue_type::apply_inplace_plus(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! in-place matrix subtraction, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename eglue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const eGlue<T1, T2, eglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  eglue_type::apply_inplace_minus(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename eglue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator*=(const eGlue<T1, T2, eglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  glue_times::apply_inplace(*this, X);\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename eglue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator%=(const eGlue<T1, T2, eglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  eglue_type::apply_inplace_schur(*this, X);\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename eglue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator/=(const eGlue<T1, T2, eglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n  \n  eglue_type::apply_inplace_div(*this, X);\n  return *this;\n  }\n\n\n\n//! EXPERIMENTAL: create a matrix from mtGlue, i.e. run the previously delayed binary operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nMat<eT>::Mat(const mtGlue<eT, T1, T2, glue_type>& X)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , vec_state(0)\n  , mem_state(0)\n  , mem()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  glue_type::apply(*this, X);\n  }\n\n\n\n//! EXPERIMENTAL: create a matrix from Glue, i.e. run the previously delayed binary operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator=(const mtGlue<eT, T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  glue_type::apply(*this, X);\n  \n  return *this;\n  }\n\n\n\n//! EXPERIMENTAL: in-place matrix addition, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator+=(const mtGlue<eT, T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator+=(m);\n  }\n\n\n\n//! EXPERIMENTAL: in-place matrix subtraction, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator-=(const mtGlue<eT, T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator-=(m);\n  }\n\n\n\n//! EXPERIMENTAL: in-place matrix multiplications, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator*=(const mtGlue<eT, T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> m(X);\n  \n  glue_times::apply_inplace(*this, m);\n  \n  return *this;\n  }\n\n\n\n//! EXPERIMENTAL: in-place matrix element-wise multiplication, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator%=(const mtGlue<eT, T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator%=(m);\n  }\n\n\n\n//! EXPERIMENTAL: in-place matrix element-wise division, with the right-hand-side operands having delayed operations\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nconst Mat<eT>&\nMat<eT>::operator/=(const mtGlue<eT, T1, T2, glue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> m(X);\n  \n  return (*this).operator/=(m);\n  }\n\n\n\n//! linear element accessor (treats the matrix as a vector); no bounds check; assumes memory is aligned\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT&\nMat<eT>::at_alt(const uword ii) const\n  {\n  const eT* mem_aligned = mem;\n  memory::mark_as_aligned(mem_aligned);\n  \n  return mem_aligned[ii];\n  }\n\n\n\n//! linear element accessor (treats the matrix as a vector); bounds checking not done when ARMA_NO_DEBUG is defined\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT&\nMat<eT>::operator() (const uword ii)\n  {\n  arma_debug_check( (ii >= n_elem), \"Mat::operator(): index out of bounds\");\n  return access::rw(mem[ii]);\n  }\n\n\n\n//! linear element accessor (treats the matrix as a vector); bounds checking not done when ARMA_NO_DEBUG is defined\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT&\nMat<eT>::operator() (const uword ii) const\n  {\n  arma_debug_check( (ii >= n_elem), \"Mat::operator(): index out of bounds\");\n  return mem[ii];\n  }\n\n\n//! linear element accessor (treats the matrix as a vector); no bounds check.  \ntemplate<typename eT>\narma_inline\narma_warn_unused\neT&\nMat<eT>::operator[] (const uword ii)\n  {\n  return access::rw(mem[ii]);\n  }\n\n\n\n//! linear element accessor (treats the matrix as a vector); no bounds check\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT&\nMat<eT>::operator[] (const uword ii) const\n  {\n  return mem[ii];\n  }\n\n\n\n//! linear element accessor (treats the matrix as a vector); no bounds check.  \ntemplate<typename eT>\narma_inline\narma_warn_unused\neT&\nMat<eT>::at(const uword ii)\n  {\n  return access::rw(mem[ii]);\n  }\n\n\n\n//! linear element accessor (treats the matrix as a vector); no bounds check\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT&\nMat<eT>::at(const uword ii) const\n  {\n  return mem[ii];\n  }\n\n\n\n//! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT&\nMat<eT>::operator() (const uword in_row, const uword in_col)\n  {\n  arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), \"Mat::operator(): index out of bounds\");\n  return access::rw(mem[in_row + in_col*n_rows]);\n  }\n\n\n\n//! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT&\nMat<eT>::operator() (const uword in_row, const uword in_col) const\n  {\n  arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), \"Mat::operator(): index out of bounds\");\n  return mem[in_row + in_col*n_rows];\n  }\n\n\n\n//! element accessor; no bounds check\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT&\nMat<eT>::at(const uword in_row, const uword in_col)\n  {\n  return access::rw( mem[in_row + in_col*n_rows] );\n  }\n\n\n\n//! element accessor; no bounds check\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT&\nMat<eT>::at(const uword in_row, const uword in_col) const\n  {\n  return mem[in_row + in_col*n_rows];\n  }\n\n\n\n//! prefix ++\ntemplate<typename eT>\narma_inline\nconst Mat<eT>&\nMat<eT>::operator++()\n  {\n  Mat_aux::prefix_pp(*this);\n  return *this;\n  }\n\n\n\n//! postfix ++  (must not return the object by reference)\ntemplate<typename eT>\narma_inline\nvoid\nMat<eT>::operator++(int)\n  {\n  Mat_aux::postfix_pp(*this);\n  }\n\n\n\n//! prefix --\ntemplate<typename eT>\narma_inline\nconst Mat<eT>&\nMat<eT>::operator--()\n  {\n  Mat_aux::prefix_mm(*this);\n  return *this;\n  }\n\n\n\n//! postfix --  (must not return the object by reference)\ntemplate<typename eT>\narma_inline\nvoid\nMat<eT>::operator--(int)\n  {\n  Mat_aux::postfix_mm(*this);\n  }\n\n\n\n//! returns true if the matrix has no elements\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nMat<eT>::is_empty() const\n  {\n  return (n_elem == 0);\n  }\n\n\n\n//! returns true if the object can be interpreted as a column or row vector\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nMat<eT>::is_vec() const\n  {\n  return ( (n_rows == 1) || (n_cols == 1) );\n  }\n\n\n\n//! returns true if the object can be interpreted as a row vector\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nMat<eT>::is_rowvec() const\n  {\n  return (n_rows == 1);\n  }\n\n\n\n//! returns true if the object can be interpreted as a column vector\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nMat<eT>::is_colvec() const\n  {\n  return (n_cols == 1);\n  }\n\n\n\n//! returns true if the object has the same number of non-zero rows and columnns\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nMat<eT>::is_square() const\n  {\n  return (n_rows == n_cols);\n  }\n\n\n\n//! returns true if all of the elements are finite\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nMat<eT>::is_finite() const\n  {\n  return arrayops::is_finite( memptr(), n_elem );\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nMat<eT>::has_inf() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return arrayops::has_inf(memptr(), n_elem);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nMat<eT>::has_nan() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return arrayops::has_nan(memptr(), n_elem);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nMat<eT>::is_sorted(const char* direction) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).is_sorted(direction, (((vec_state == 2) || (n_rows == 1)) ? uword(1) : uword(0)));\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nMat<eT>::is_sorted(const char* direction, const uword dim) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const char sig = (direction != NULL) ? direction[0] : char(0);\n  \n  arma_debug_check( ((sig != 'a') && (sig != 'd')), \"Mat::is_sorted(): unknown sort direction\" );\n  \n  arma_debug_check( (dim > 1), \"Mat::is_sorted(): parameter 'dim' must be 0 or 1\" );\n  \n  if(n_elem <= 1)  { return true; }\n  \n  const uword local_n_cols = n_cols;\n  const uword local_n_rows = n_rows;\n  \n  if(sig == 'a')\n    {\n    // deliberately using the opposite direction comparator,\n    // as we need to handle the case of two elements being equal\n    \n    arma_descend_sort_helper<eT> comparator;\n    \n    if(dim == 0)\n      {\n      if(local_n_rows <= 1u)  { return true; }\n      \n      const uword local_n_rows_m1 = local_n_rows - 1;\n      \n      for(uword c=0; c < local_n_cols; ++c)\n        {\n        const eT* coldata = colptr(c);\n        \n        for(uword r=0; r < local_n_rows_m1; ++r)\n          {\n          const eT val1 = (*coldata); coldata++;\n          const eT val2 = (*coldata);\n          \n          if(comparator(val1,val2))  { return false; }\n          }\n        }\n      }\n    else  // dim == 1\n      {\n      if(local_n_cols <= 1u)  { return true; }\n      \n      const uword local_n_cols_m1 = local_n_cols - 1;\n      \n      if(local_n_rows == 1)\n        {\n        const eT* rowdata = memptr();\n        \n        for(uword c=0; c < local_n_cols_m1; ++c)\n          {\n          const eT val1 = (*rowdata);  rowdata++;\n          const eT val2 = (*rowdata);\n          \n          if(comparator(val1,val2))  { return false; }\n          }\n        }\n      else\n        {\n        for(uword r=0; r < local_n_rows;    ++r)\n        for(uword c=0; c < local_n_cols_m1; ++c)\n          {\n          const eT val1 = at(r,c  );\n          const eT val2 = at(r,c+1);\n          \n          if(comparator(val1,val2))  { return false; }\n          }\n        }\n      }\n    }\n  else\n  if(sig == 'd')\n    {\n    // deliberately using the opposite direction comparator,\n    // as we need to handle the case of two elements being equal\n    \n    arma_ascend_sort_helper<eT> comparator;\n    \n    if(dim == 0)\n      {\n      if(local_n_rows <= 1u)  { return true; }\n      \n      const uword local_n_rows_m1 = local_n_rows - 1;\n      \n      for(uword c=0; c < local_n_cols; ++c)\n        {\n        const eT* coldata = colptr(c);\n        \n        for(uword r=0; r < local_n_rows_m1; ++r)\n          {\n          const eT val1 = (*coldata); coldata++;\n          const eT val2 = (*coldata);\n          \n          if(comparator(val1,val2))  { return false; }\n          }\n        }\n      }\n    else  // dim == 1\n      {\n      if(local_n_cols <= 1u)  { return true; }\n      \n      const uword local_n_cols_m1 = local_n_cols - 1;\n      \n      if(local_n_rows == 1)\n        {\n        const eT* rowdata = memptr();\n        \n        for(uword c=0; c < local_n_cols_m1; ++c)\n          {\n          const eT val1 = (*rowdata);  rowdata++;\n          const eT val2 = (*rowdata);\n          \n          if(comparator(val1,val2))  { return false; }\n          }\n        }\n      else\n        {\n        for(uword r=0; r < local_n_rows;    ++r)\n        for(uword c=0; c < local_n_cols_m1; ++c)\n          {\n          const eT val1 = at(r,c  );\n          const eT val2 = at(r,c+1);\n          \n          if(comparator(val1,val2))  { return false; }\n          }\n        }\n      }\n    }\n  \n  return true;\n  }\n\n\n\n//! returns true if the given index is currently in range\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nMat<eT>::in_range(const uword ii) const\n  {\n  return (ii < n_elem);\n  }\n\n\n\n//! returns true if the given start and end indices are currently in range\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nMat<eT>::in_range(const span& x) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(x.whole == true)\n    {\n    return true;\n    }\n  else\n    {\n    const uword a = x.a;\n    const uword b = x.b;\n    \n    return ( (a <= b) && (b < n_elem) );\n    }\n  }\n\n\n\n//! returns true if the given location is currently in range\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nMat<eT>::in_range(const uword in_row, const uword in_col) const\n  {\n  return ( (in_row < n_rows) && (in_col < n_cols) );\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nMat<eT>::in_range(const span& row_span, const uword in_col) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(row_span.whole == true)\n    {\n    return (in_col < n_cols);\n    }\n  else\n    {\n    const uword in_row1 = row_span.a;\n    const uword in_row2 = row_span.b;\n    \n    return ( (in_row1 <= in_row2) && (in_row2 < n_rows) && (in_col < n_cols) );\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nMat<eT>::in_range(const uword in_row, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(col_span.whole == true)\n    {\n    return (in_row < n_rows);\n    }\n  else\n    {\n    const uword in_col1 = col_span.a;\n    const uword in_col2 = col_span.b;\n  \n    return ( (in_row < n_rows) && (in_col1 <= in_col2) && (in_col2 < n_cols) );\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nMat<eT>::in_range(const span& row_span, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword in_row1 = row_span.a;\n  const uword in_row2 = row_span.b;\n  \n  const uword in_col1 = col_span.a;\n  const uword in_col2 = col_span.b;\n  \n  const bool rows_ok = row_span.whole ? true : ( (in_row1 <= in_row2) && (in_row2 < n_rows) );\n  const bool cols_ok = col_span.whole ? true : ( (in_col1 <= in_col2) && (in_col2 < n_cols) );\n  \n  return ( (rows_ok == true) && (cols_ok == true) );\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nMat<eT>::in_range(const uword in_row, const uword in_col, const SizeMat& s) const\n  {\n  const uword l_n_rows = n_rows;\n  const uword l_n_cols = n_cols;\n  \n  if( (in_row >= l_n_rows) || (in_col >= l_n_cols) || ((in_row + s.n_rows) > l_n_rows) || ((in_col + s.n_cols) > l_n_cols) )\n    {\n    return false;\n    }\n  else\n    {\n    return true;\n    }\n  }\n\n\n\n//! returns a pointer to array of eTs for a specified column; no bounds check\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT*\nMat<eT>::colptr(const uword in_col)\n  {\n  return & access::rw(mem[in_col*n_rows]);\n  }\n\n\n\n//! returns a pointer to array of eTs for a specified column; no bounds check\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT*\nMat<eT>::colptr(const uword in_col) const\n  {\n  return & mem[in_col*n_rows];\n  }\n\n\n\n//! returns a pointer to array of eTs used by the matrix\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT*\nMat<eT>::memptr()\n  {\n  return const_cast<eT*>(mem);\n  }\n\n\n\n//! returns a pointer to array of eTs used by the matrix\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT*\nMat<eT>::memptr() const\n  {\n  return mem;\n  }\n\n\n\n//! print contents of the matrix (to the cout stream),\n//! optionally preceding with a user specified line of text.\n//! the precision and cell width are modified.\n//! on return, the stream's state are restored to their original values.\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::impl_print(const std::string& extra_text) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = ARMA_DEFAULT_OSTREAM.width();\n    \n    ARMA_DEFAULT_OSTREAM << extra_text << '\\n';\n  \n    ARMA_DEFAULT_OSTREAM.width(orig_width);\n    }\n  \n  arma_ostream::print(ARMA_DEFAULT_OSTREAM, *this, true);\n  }\n\n\n\n//! print contents of the matrix to a user specified stream,\n//! optionally preceding with a user specified line of text.\n//! the precision and cell width are modified.\n//! on return, the stream's state are restored to their original values.\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::impl_print(std::ostream& user_stream, const std::string& extra_text) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = user_stream.width();\n    \n    user_stream << extra_text << '\\n';\n    \n    user_stream.width(orig_width);\n    }\n  \n  arma_ostream::print(user_stream, *this, true);\n  }\n\n\n\n//! print contents of the matrix (to the cout stream),\n//! optionally preceding with a user specified line of text.\n//! the stream's state are used as is and are not modified\n//! (i.e. the precision and cell width are not modified).\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::impl_raw_print(const std::string& extra_text) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = ARMA_DEFAULT_OSTREAM.width();\n    \n    ARMA_DEFAULT_OSTREAM << extra_text << '\\n';\n  \n    ARMA_DEFAULT_OSTREAM.width(orig_width);\n    }\n  \n  arma_ostream::print(ARMA_DEFAULT_OSTREAM, *this, false);\n  }\n\n\n\n//! print contents of the matrix to a user specified stream,\n//! optionally preceding with a user specified line of text.\n//! the stream's state are used as is and are not modified.\n//! (i.e. the precision and cell width are not modified).\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::impl_raw_print(std::ostream& user_stream, const std::string& extra_text) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = user_stream.width();\n  \n    user_stream << extra_text << '\\n';\n  \n    user_stream.width(orig_width);\n    }\n  \n  arma_ostream::print(user_stream, *this, false);\n  }\n\n\n\n//! change the matrix to have user specified dimensions (data is not preserved)\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::set_size(const uword in_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(vec_state)\n    {\n    case 0:\n    case 1:\n      init_warm(in_elem, 1);\n      break;\n    \n    case 2:\n      init_warm(1, in_elem);\n      break;\n      \n    default:\n      ;\n    }\n  }\n\n\n\n//! change the matrix to have user specified dimensions (data is not preserved)\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::set_size(const uword in_rows, const uword in_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  init_warm(in_rows, in_cols);\n  }\n\n\n\n//! change the matrix to have user specified dimensions (data is preserved)\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::resize(const uword in_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(vec_state)\n    {\n    case 0:\n    case 1:\n      (*this).resize(in_elem, 1);\n      break;\n    \n    case 2:\n      (*this).resize(1, in_elem);\n      break;\n      \n    default:\n      ;\n    }\n  }\n\n\n\n//! change the matrix to have user specified dimensions (data is preserved)\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::resize(const uword in_rows, const uword in_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  *this = arma::resize(*this, in_rows, in_cols);\n  }\n\n\n\n//! change the matrix to have user specified dimensions (data is preserved)\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::reshape(const uword in_rows, const uword in_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  *this = arma::reshape(*this, in_rows, in_cols);\n  }\n\n\n\n//!< don't use this in new code; kept only for compatibility with old code\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::reshape(const uword in_rows, const uword in_cols, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  *this = arma::reshape(*this, in_rows, in_cols, dim);\n  }\n\n\n\n//! change the matrix (without preserving data) to have the same dimensions as the given expression \ntemplate<typename eT>\ntemplate<typename eT2, typename expr>\ninline\nvoid\nMat<eT>::copy_size(const Base<eT2, expr>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<expr> P(X.get_ref());\n  \n  const uword X_n_rows = P.get_n_rows();\n  const uword X_n_cols = P.get_n_cols();\n  \n  init_warm(X_n_rows, X_n_cols);\n  }\n\n\n\n//! transform each element in the matrix using a functor\ntemplate<typename eT>\ntemplate<typename functor>\ninline\nconst Mat<eT>&\nMat<eT>::transform(functor F)\n  {\n  arma_extra_debug_sigprint();\n  \n  eT* out_mem = memptr();\n  \n  const uword N = n_elem;\n  \n  uword ii, jj;\n  \n  for(ii=0, jj=1; jj < N; ii+=2, jj+=2)\n    {\n    eT tmp_ii = out_mem[ii];\n    eT tmp_jj = out_mem[jj];\n    \n    tmp_ii = eT( F(tmp_ii) );\n    tmp_jj = eT( F(tmp_jj) );\n    \n    out_mem[ii] = tmp_ii;\n    out_mem[jj] = tmp_jj;\n    }\n  \n  if(ii < N)\n    {\n    out_mem[ii] = eT( F(out_mem[ii]) );\n    }\n  \n  return *this;\n  }\n\n\n\n//! imbue (fill) the matrix with values provided by a functor\ntemplate<typename eT>\ntemplate<typename functor>\ninline\nconst Mat<eT>&\nMat<eT>::imbue(functor F)\n  {\n  arma_extra_debug_sigprint();\n  \n  eT* out_mem = memptr();\n  \n  const uword N = n_elem;\n  \n  uword ii, jj;\n  \n  for(ii=0, jj=1; jj < N; ii+=2, jj+=2)\n    {\n    const eT tmp_ii = eT( F() );\n    const eT tmp_jj = eT( F() );\n    \n    out_mem[ii] = tmp_ii;\n    out_mem[jj] = tmp_jj;\n    }\n  \n  if(ii < N)\n    {\n    out_mem[ii] = eT( F() );\n    }\n  \n  return *this;\n  }\n\n\n\n//! fill the matrix with the specified value\ntemplate<typename eT>\narma_hot\ninline\nconst Mat<eT>&\nMat<eT>::fill(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::inplace_set( memptr(), val, n_elem );\n  \n  return *this;\n  }\n\n\n\n//! fill the matrix with the specified value\ntemplate<typename eT>\ntemplate<typename fill_type>\narma_hot\ninline\nconst Mat<eT>&\nMat<eT>::fill(const fill::fill_class<fill_type>&)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(is_same_type<fill_type, fill::fill_zeros>::yes)  (*this).zeros();\n  if(is_same_type<fill_type, fill::fill_ones >::yes)  (*this).ones();\n  if(is_same_type<fill_type, fill::fill_eye  >::yes)  (*this).eye();\n  if(is_same_type<fill_type, fill::fill_randu>::yes)  (*this).randu();\n  if(is_same_type<fill_type, fill::fill_randn>::yes)  (*this).randn();\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::zeros()\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::fill_zeros(memptr(), n_elem);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::zeros(const uword in_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  set_size(in_elem);\n  \n  return (*this).zeros();\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::zeros(const uword in_n_rows, const uword in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  set_size(in_n_rows, in_n_cols);\n  \n  return (*this).zeros();\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::ones()\n  {\n  arma_extra_debug_sigprint();\n  \n  return fill(eT(1));\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::ones(const uword in_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  set_size(in_elem);\n  \n  return fill(eT(1));\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::ones(const uword in_rows, const uword in_cols)\n  {\n  arma_extra_debug_sigprint();\n\n  set_size(in_rows, in_cols);\n  \n  return fill(eT(1));\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::randu()\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_rng::randu<eT>::fill( memptr(), n_elem );\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::randu(const uword in_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  set_size(in_elem);\n  \n  return (*this).randu();\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::randu(const uword in_rows, const uword in_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  set_size(in_rows, in_cols);\n  \n  return (*this).randu();\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::randn()\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_rng::randn<eT>::fill( memptr(), n_elem );\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::randn(const uword in_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  set_size(in_elem);\n  \n  return (*this).randn();\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::randn(const uword in_rows, const uword in_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  set_size(in_rows, in_cols);\n  \n  return (*this).randn();\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::eye()\n  {\n  arma_extra_debug_sigprint();\n  \n  (*this).zeros();\n  \n  const uword N = (std::min)(n_rows, n_cols);\n  \n  for(uword ii=0; ii<N; ++ii)\n    {\n    at(ii,ii) = eT(1);\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Mat<eT>&\nMat<eT>::eye(const uword in_rows, const uword in_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  set_size(in_rows, in_cols);\n  \n  return (*this).eye();\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::reset()\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(vec_state)\n    {\n    default:\n      init_warm(0, 0);\n      break;\n      \n    case 1:\n      init_warm(0, 1);\n      break;\n    \n    case 2:\n      init_warm(1, 0);\n      break;\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nMat<eT>::set_real(const Base<typename Mat<eT>::pod_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat_aux::set_real(*this, X);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nMat<eT>::set_imag(const Base<typename Mat<eT>::pod_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat_aux::set_imag(*this, X);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\neT\nMat<eT>::min() const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"Mat::min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  return op_min::direct_min(memptr(), n_elem);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\neT\nMat<eT>::max() const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"Mat::max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  return op_max::direct_max(memptr(), n_elem);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nMat<eT>::min(uword& index_of_min_val) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"Mat::min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  return op_min::direct_min(memptr(), n_elem, index_of_min_val);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nMat<eT>::max(uword& index_of_max_val) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"Mat::max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  return op_max::direct_max(memptr(), n_elem, index_of_max_val);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nMat<eT>::min(uword& row_of_min_val, uword& col_of_min_val) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"Mat::min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  uword iq;\n  \n  eT val = op_min::direct_min(memptr(), n_elem, iq);\n  \n  row_of_min_val = iq % n_rows;\n  col_of_min_val = iq / n_rows;\n  \n  return val;\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nMat<eT>::max(uword& row_of_max_val, uword& col_of_max_val) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"Mat::max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  uword iq;\n  \n  eT val = op_max::direct_max(memptr(), n_elem, iq);\n  \n  row_of_max_val = iq % n_rows;\n  col_of_max_val = iq / n_rows;\n  \n  return val;\n  }\n\n\n\n//! save the matrix to a file\ntemplate<typename eT>\ninline\nbool\nMat<eT>::save(const std::string name, const file_type type, const bool print_status) const\n  {\n  arma_extra_debug_sigprint();\n  \n  bool save_okay;\n  \n  switch(type)\n    {\n    case raw_ascii:\n      save_okay = diskio::save_raw_ascii(*this, name);\n      break;\n    \n    case arma_ascii:\n      save_okay = diskio::save_arma_ascii(*this, name);\n      break;\n    \n    case csv_ascii:\n      save_okay = diskio::save_csv_ascii(*this, name);\n      break;\n    \n    case raw_binary:\n      save_okay = diskio::save_raw_binary(*this, name);\n      break;\n    \n    case arma_binary:\n      save_okay = diskio::save_arma_binary(*this, name);\n      break;\n      \n    case pgm_binary:\n      save_okay = diskio::save_pgm_binary(*this, name);\n      break;\n    \n    case hdf5_binary:\n      save_okay = diskio::save_hdf5_binary(*this, name);\n      break;\n    \n    default:\n      arma_warn(print_status, \"Mat::save(): unsupported file type\");\n      save_okay = false;\n    }\n  \n  arma_warn( (print_status && (save_okay == false)), \"Mat::save(): couldn't write to \", name);\n  \n  return save_okay;\n  }\n\n\n\n//! save the matrix to a stream\ntemplate<typename eT>\ninline\nbool\nMat<eT>::save(std::ostream& os, const file_type type, const bool print_status) const\n  {\n  arma_extra_debug_sigprint();\n  \n  bool save_okay;\n  \n  switch(type)\n    {\n    case raw_ascii:\n      save_okay = diskio::save_raw_ascii(*this, os);\n      break;\n    \n    case arma_ascii:\n      save_okay = diskio::save_arma_ascii(*this, os);\n      break;\n    \n    case csv_ascii:\n      save_okay = diskio::save_csv_ascii(*this, os);\n      break;\n    \n    case raw_binary:\n      save_okay = diskio::save_raw_binary(*this, os);\n      break;\n    \n    case arma_binary:\n      save_okay = diskio::save_arma_binary(*this, os);\n      break;\n      \n    case pgm_binary:\n      save_okay = diskio::save_pgm_binary(*this, os);\n      break;\n    \n    default:\n      arma_warn(print_status, \"Mat::save(): unsupported file type\");\n      save_okay = false;\n    }\n  \n  arma_warn( (print_status && (save_okay == false)), \"Mat::save(): couldn't write to the given stream\");\n  \n  return save_okay;\n  }\n\n\n\n//! load a matrix from a file\ntemplate<typename eT>\ninline\nbool\nMat<eT>::load(const std::string name, const file_type type, const bool print_status)\n  {\n  arma_extra_debug_sigprint();\n  \n  bool load_okay;\n  std::string err_msg;\n  \n  switch(type)\n    {\n    case auto_detect:\n      load_okay = diskio::load_auto_detect(*this, name, err_msg);\n      break;\n    \n    case raw_ascii:\n      load_okay = diskio::load_raw_ascii(*this, name, err_msg);\n      break;\n    \n    case arma_ascii:\n      load_okay = diskio::load_arma_ascii(*this, name, err_msg);\n      break;\n    \n    case csv_ascii:\n      load_okay = diskio::load_csv_ascii(*this, name, err_msg);\n      break;\n    \n    case raw_binary:\n      load_okay = diskio::load_raw_binary(*this, name, err_msg);\n      break;\n    \n    case arma_binary:\n      load_okay = diskio::load_arma_binary(*this, name, err_msg);\n      break;\n      \n    case pgm_binary:\n      load_okay = diskio::load_pgm_binary(*this, name, err_msg);\n      break;\n    \n    case hdf5_binary:\n      load_okay = diskio::load_hdf5_binary(*this, name, err_msg);\n      break;\n\n    default:\n      arma_warn(print_status, \"Mat::load(): unsupported file type\");\n      load_okay = false;\n    }\n  \n  if( (print_status == true) && (load_okay == false) )\n    {\n    if(err_msg.length() > 0)\n      {\n      arma_warn(true, \"Mat::load(): \", err_msg, name);\n      }\n    else\n      {\n      arma_warn(true, \"Mat::load(): couldn't read \", name);\n      }\n    }\n  \n  if(load_okay == false)\n    {\n    (*this).reset();\n    }\n    \n  return load_okay;\n  }\n\n\n\n//! load a matrix from a stream\ntemplate<typename eT>\ninline\nbool\nMat<eT>::load(std::istream& is, const file_type type, const bool print_status)\n  {\n  arma_extra_debug_sigprint();\n  \n  bool load_okay;\n  std::string err_msg;\n  \n  switch(type)\n    {\n    case auto_detect:\n      load_okay = diskio::load_auto_detect(*this, is, err_msg);\n      break;\n    \n    case raw_ascii:\n      load_okay = diskio::load_raw_ascii(*this, is, err_msg);\n      break;\n    \n    case arma_ascii:\n      load_okay = diskio::load_arma_ascii(*this, is, err_msg);\n      break;\n    \n    case csv_ascii:\n      load_okay = diskio::load_csv_ascii(*this, is, err_msg);\n      break;\n    \n    case raw_binary:\n      load_okay = diskio::load_raw_binary(*this, is, err_msg);\n      break;\n    \n    case arma_binary:\n      load_okay = diskio::load_arma_binary(*this, is, err_msg);\n      break;\n      \n    case pgm_binary:\n      load_okay = diskio::load_pgm_binary(*this, is, err_msg);\n      break;\n    \n    default:\n      arma_warn(print_status, \"Mat::load(): unsupported file type\");\n      load_okay = false;\n    }\n  \n  \n  if( (print_status == true) && (load_okay == false) )\n    {\n    if(err_msg.length() > 0)\n      {\n      arma_warn(true, \"Mat::load(): \", err_msg, \"the given stream\");\n      }\n    else\n      {\n      arma_warn(true, \"Mat::load(): couldn't load from the given stream\");\n      }\n    }\n  \n  if(load_okay == false)\n    {\n    (*this).reset();\n    }\n    \n  return load_okay;\n  }\n\n\n\n//! save the matrix to a file, without printing any error messages\ntemplate<typename eT>\ninline\nbool\nMat<eT>::quiet_save(const std::string name, const file_type type) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).save(name, type, false);\n  }\n\n\n\n//! save the matrix to a stream, without printing any error messages\ntemplate<typename eT>\ninline\nbool\nMat<eT>::quiet_save(std::ostream& os, const file_type type) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).save(os, type, false);\n  }\n\n\n\n//! load a matrix from a file, without printing any error messages\ntemplate<typename eT>\ninline\nbool\nMat<eT>::quiet_load(const std::string name, const file_type type)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).load(name, type, false);\n  }\n\n\n\n//! load a matrix from a stream, without printing any error messages\ntemplate<typename eT>\ninline\nbool\nMat<eT>::quiet_load(std::istream& is, const file_type type)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).load(is, type, false);\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>::row_iterator::row_iterator(Mat<eT>& in_M, const uword in_row)\n  : M  (in_M  )\n  , row(in_row)\n  , col(0     )\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\neT&\nMat<eT>::row_iterator::operator*()\n  {\n  return M.at(row,col);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::row_iterator&\nMat<eT>::row_iterator::operator++()\n  {\n  ++col;\n  \n  if(col >= M.n_cols)\n    {\n    col = 0;\n    ++row;\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::row_iterator::operator++(int)\n  {\n  operator++();\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::row_iterator&\nMat<eT>::row_iterator::operator--()\n  {\n  if(col > 0)\n    {\n    --col;\n    }\n  else\n    {\n    if(row > 0)\n      {\n      col = M.n_cols - 1;\n      --row;\n      }\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::row_iterator::operator--(int)\n  {\n  operator--();\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nMat<eT>::row_iterator::operator!=(const typename Mat<eT>::row_iterator& X) const\n  {\n  return ( (row != X.row) || (col != X.col) ) ? true : false;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nMat<eT>::row_iterator::operator==(const typename Mat<eT>::row_iterator& X) const\n  {\n  return ( (row == X.row) && (col == X.col) ) ? true : false;\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>::const_row_iterator::const_row_iterator(const Mat<eT>& in_M, const uword in_row)\n  : M  (in_M  )\n  , row(in_row)\n  , col(0     )\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>::const_row_iterator::const_row_iterator(const typename Mat<eT>::row_iterator& X)\n  : M  (X.M)\n  , row(X.row)\n  , col(X.col)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nMat<eT>::const_row_iterator::operator*() const\n  {\n  return M.at(row,col);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::const_row_iterator&\nMat<eT>::const_row_iterator::operator++()\n  {\n  ++col;\n  \n  if(col >= M.n_cols)\n    {\n    col = 0;\n    ++row;\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::const_row_iterator::operator++(int)\n  {\n  operator++();\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::const_row_iterator&\nMat<eT>::const_row_iterator::operator--()\n  {\n  if(col > 0)\n    {\n    --col;\n    }\n  else\n    {\n    if(row > 0)\n      {\n      col = M.n_cols - 1;\n      --row;\n      }\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::const_row_iterator::operator--(int)\n  {\n  operator--();\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nMat<eT>::const_row_iterator::operator!=(const typename Mat<eT>::const_row_iterator& X) const\n  {\n  return ( (row != X.row) || (col != X.col) ) ? true : false;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nMat<eT>::const_row_iterator::operator==(const typename Mat<eT>::const_row_iterator& X) const\n  {\n  return ( (row == X.row) && (col == X.col) ) ? true : false;\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>::row_col_iterator::row_col_iterator()\n  : M           (NULL)\n  , current_pos (NULL)\n  , internal_col(0   )\n  , internal_row(0   )\n  {\n  arma_extra_debug_sigprint();\n  // Technically this iterator is invalid (it does not point to a real element)\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>::row_col_iterator::row_col_iterator(const row_col_iterator& in_it)\n  : M           (in_it.M           )\n  , current_pos (in_it.current_pos )\n  , internal_col(in_it.internal_col)\n  , internal_row(in_it.internal_row)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>::row_col_iterator::row_col_iterator(Mat<eT>& in_M, const uword in_row, const uword in_col)\n  : M           (&in_M                  )\n  , current_pos (&in_M.at(in_row,in_col))\n  , internal_col(in_col                 )\n  , internal_row(in_row                 )\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\neT&\nMat<eT>::row_col_iterator::operator*()\n  {\n  return *current_pos;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::row_col_iterator&\nMat<eT>::row_col_iterator::operator++()\n  {\n  current_pos++;\n  internal_row++;\n  \n  // Check to see if we moved a column.\n  if(internal_row == M->n_rows)\n    {\n    internal_col++;\n    internal_row = 0;\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::row_col_iterator\nMat<eT>::row_col_iterator::operator++(int)\n  {\n  typename Mat<eT>::row_col_iterator temp(*this);\n  \n  ++(*this);\n  \n  return temp;\n  }\n\n\n\ntemplate<typename eT>\ninline typename Mat<eT>::row_col_iterator&\nMat<eT>::row_col_iterator::operator--()\n  {\n  if(internal_row > 0)\n    {\n    current_pos--;\n    internal_row--;\n    }\n  else\n  if(internal_col > 0)\n    {\n    current_pos--;\n    internal_col--;\n    internal_row = M->n_rows - 1;\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::row_col_iterator\nMat<eT>::row_col_iterator::operator--(int)\n  {\n  typename Mat<eT>::row_col_iterator temp(*this);\n  \n  --(*this);\n  \n  return temp;\n  }\n\n\n\ntemplate<typename eT>\ninline\nuword\nMat<eT>::row_col_iterator::row() const\n  {\n  return internal_row;\n  }\n\n\n\ntemplate<typename eT>\ninline\nuword\nMat<eT>::row_col_iterator::col() const\n  {\n  return internal_col;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nMat<eT>::row_col_iterator::operator==(const row_col_iterator& rhs) const\n  {\n  return (current_pos == rhs.current_pos);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nMat<eT>::row_col_iterator::operator!=(const row_col_iterator& rhs) const\n  {\n  return (current_pos != rhs.current_pos);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nMat<eT>::row_col_iterator::operator==(const const_row_col_iterator& rhs) const\n  {\n  return (current_pos == rhs.current_pos);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nMat<eT>::row_col_iterator::operator!=(const const_row_col_iterator& rhs) const\n  {\n  return (current_pos != rhs.current_pos);\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>::const_row_col_iterator::const_row_col_iterator()\n  : M           (NULL)\n  , current_pos (NULL)\n  , internal_col(0   )\n  , internal_row(0   )\n  {\n  arma_extra_debug_sigprint();\n  // Technically this iterator is invalid (it does not point to a real element)\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>::const_row_col_iterator::const_row_col_iterator(const row_col_iterator& in_it)\n  : M           (in_it.M          )\n  , current_pos (in_it.current_pos)\n  , internal_col(in_it.col()      )\n  , internal_row(in_it.row()      )\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>::const_row_col_iterator::const_row_col_iterator(const const_row_col_iterator& in_it)\n  : M           (in_it.M          )\n  , current_pos (in_it.current_pos)\n  , internal_col(in_it.col()      )\n  , internal_row(in_it.row()      )\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>::const_row_col_iterator::const_row_col_iterator(const Mat<eT>& in_M, const uword in_row, const uword in_col)\n  : M           (&in_M                  )\n  , current_pos (&in_M.at(in_row,in_col))\n  , internal_col(in_col                 )\n  , internal_row(in_row                 )\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst eT&\nMat<eT>::const_row_col_iterator::operator*() const\n  {\n  return *current_pos;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::const_row_col_iterator&\nMat<eT>::const_row_col_iterator::operator++()\n  {\n  current_pos++;\n  internal_row++;\n  \n  // Check to see if we moved a column.\n  if(internal_row == M->n_rows)\n    {\n    internal_col++;\n    internal_row = 0;\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::const_row_col_iterator\nMat<eT>::const_row_col_iterator::operator++(int)\n  {\n  typename Mat<eT>::const_row_col_iterator temp(*this);\n  \n  ++(*this);\n  \n  return temp;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::const_row_col_iterator&\nMat<eT>::const_row_col_iterator::operator--()\n  {\n  if(internal_row > 0)\n    {\n    current_pos--;\n    internal_row--;\n    }\n  else\n  if(internal_col > 0)\n    {\n    current_pos--;\n    internal_col--;\n    internal_row = M->n_rows - 1;\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::const_row_col_iterator\nMat<eT>::const_row_col_iterator::operator--(int)\n  {\n  typename Mat<eT>::const_row_col_iterator temp(*this);\n  \n  --(*this);\n  \n  return temp;\n  }\n\n\n\ntemplate<typename eT>\ninline\nuword\nMat<eT>::const_row_col_iterator::row() const\n  {\n  return internal_row;\n  }\n\n\n\ntemplate<typename eT>\ninline\nuword\nMat<eT>::const_row_col_iterator::col() const\n  {\n  return internal_col;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nMat<eT>::const_row_col_iterator::operator==(const const_row_col_iterator& rhs) const\n  {\n  return (current_pos == rhs.current_pos);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nMat<eT>::const_row_col_iterator::operator!=(const const_row_col_iterator& rhs) const\n  {\n  return (current_pos != rhs.current_pos);\n  }\n\n\n  \ntemplate<typename eT>\ninline\nbool\nMat<eT>::const_row_col_iterator::operator==(const row_col_iterator& rhs) const\n  {\n  return (current_pos == rhs.current_pos);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nMat<eT>::const_row_col_iterator::operator!=(const row_col_iterator& rhs) const\n  {\n  return (current_pos != rhs.current_pos);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::iterator\nMat<eT>::begin()\n  {\n  arma_extra_debug_sigprint();\n  \n  return memptr();\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::const_iterator\nMat<eT>::begin() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return memptr();\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::const_iterator\nMat<eT>::cbegin() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return memptr();\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::iterator\nMat<eT>::end()\n  {\n  arma_extra_debug_sigprint();\n  \n  return memptr() + n_elem;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::const_iterator\nMat<eT>::end() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return memptr() + n_elem;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::const_iterator\nMat<eT>::cend() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return memptr() + n_elem;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::col_iterator\nMat<eT>::begin_col(const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (col_num >= n_cols), \"Mat::begin_col(): index out of bounds\");\n  \n  return colptr(col_num);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::const_col_iterator\nMat<eT>::begin_col(const uword col_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (col_num >= n_cols), \"Mat::begin_col(): index out of bounds\");\n  \n  return colptr(col_num);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::col_iterator\nMat<eT>::end_col(const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (col_num >= n_cols), \"Mat::end_col(): index out of bounds\");\n  \n  return colptr(col_num) + n_rows;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::const_col_iterator\nMat<eT>::end_col(const uword col_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (col_num >= n_cols), \"Mat::end_col(): index out of bounds\");\n  \n  return colptr(col_num) + n_rows;\n  }\n  \n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::row_iterator\nMat<eT>::begin_row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (row_num >= n_rows), \"Mat::begin_row(): index out of bounds\" );\n  \n  return typename Mat<eT>::row_iterator(*this, row_num);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::const_row_iterator\nMat<eT>::begin_row(const uword row_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (row_num >= n_rows), \"Mat::begin_row(): index out of bounds\" );\n  \n  return typename Mat<eT>::const_row_iterator(*this, row_num);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::row_iterator\nMat<eT>::end_row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (row_num >= n_rows), \"Mat::end_row(): index out of bounds\" );\n  \n  return typename Mat<eT>::row_iterator(*this, row_num + 1);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::const_row_iterator\nMat<eT>::end_row(const uword row_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (row_num >= n_rows), \"Mat::end_row(): index out of bounds\" );\n  \n  return typename Mat<eT>::const_row_iterator(*this, row_num + 1);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::row_col_iterator\nMat<eT>::begin_row_col()\n  {\n  return row_col_iterator(*this);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Mat<eT>::const_row_col_iterator\nMat<eT>::begin_row_col() const\n  {\n  return const_row_col_iterator(*this);\n  }\n\n\n\ntemplate<typename eT>\ninline typename Mat<eT>::row_col_iterator\nMat<eT>::end_row_col()\n  {\n  return row_col_iterator(*this, 0, n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline typename Mat<eT>::const_row_col_iterator\nMat<eT>::end_row_col() const\n  {\n  return const_row_col_iterator(*this, 0, n_cols);\n  }\n\n\n\n//! resets this matrix to an empty matrix\ntemplate<typename eT>\ninline\nvoid\nMat<eT>::clear()\n  {\n  reset();\n  }\n\n\n\n//! returns true if the matrix has no elements\ntemplate<typename eT>\ninline\nbool\nMat<eT>::empty() const\n  {\n  return (n_elem == 0);\n  }\n\n\n\n//! returns the number of elements in this matrix\ntemplate<typename eT>\ninline\nuword\nMat<eT>::size() const\n  {\n  return n_elem;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed()\n  : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const fixed<fixed_n_rows, fixed_n_cols>& X)\n  : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n        eT* dest = (use_extra) ?   mem_local_extra :   mem_local;\n  const eT* src  = (use_extra) ? X.mem_local_extra : X.mem_local;\n  \n  arrayops::copy( dest, src, fixed_n_elem );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\ntemplate<typename fill_type>\ninline\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const fill::fill_class<fill_type>&)\n  : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  if(is_same_type<fill_type, fill::fill_zeros>::yes)  (*this).zeros();\n  if(is_same_type<fill_type, fill::fill_ones >::yes)  (*this).ones();\n  if(is_same_type<fill_type, fill::fill_eye  >::yes)  (*this).eye();\n  if(is_same_type<fill_type, fill::fill_randu>::yes)  (*this).randu();\n  if(is_same_type<fill_type, fill::fill_randn>::yes)  (*this).randn();\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\ntemplate<typename T1>\ninline\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const Base<eT,T1>& A)\n  : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  Mat<eT>::operator=(A.get_ref()); \n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\ntemplate<typename T1, typename T2>\ninline\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B)\n  : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  Mat<eT>::init(A,B);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\ninline\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const eT* aux_mem)\n  : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  eT* dest = (use_extra) ? mem_local_extra : mem_local;\n  \n  arrayops::copy( dest, aux_mem, fixed_n_elem );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\ninline\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const char* text)\n  : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  Mat<eT>::operator=(text);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\ninline\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const std::string& text)\n  : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  Mat<eT>::operator=(text);\n  }\n\n\n\n#if defined(ARMA_USE_CXX11)\n  \n  template<typename eT>\n  template<uword fixed_n_rows, uword fixed_n_cols>\n  inline\n  Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const std::initializer_list<eT>& list)\n    : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )\n    {\n    arma_extra_debug_sigprint_this(this);\n    \n    (*this).operator=(list);\n    }\n  \n  \n  \n  template<typename eT>\n  template<uword fixed_n_rows, uword fixed_n_cols>\n  inline\n  const Mat<eT>&\n  Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator=(const std::initializer_list<eT>& list)\n    {\n    arma_extra_debug_sigprint();\n    \n    const uword N = uword(list.size());\n    \n    arma_debug_check( (N > fixed_n_elem), \"Mat::fixed: initialiser list is too long\" );\n    \n    eT* this_mem = (*this).memptr();\n    \n    arrayops::copy( this_mem, list.begin(), N );\n    \n    for(uword iq=N; iq < fixed_n_elem; ++iq) { this_mem[iq] = eT(0); }\n    \n    return *this;\n    }\n  \n  \n  \n  template<typename eT>\n  template<uword fixed_n_rows, uword fixed_n_cols>\n  inline\n  Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fixed(const std::initializer_list< std::initializer_list<eT> >& list)\n    : Mat<eT>( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : mem_local) )\n    {\n    arma_extra_debug_sigprint_this(this);\n    \n    Mat<eT>::init(list);\n    }\n  \n  \n  \n  template<typename eT>\n  template<uword fixed_n_rows, uword fixed_n_cols>\n  inline\n  const Mat<eT>&\n  Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator=(const std::initializer_list< std::initializer_list<eT> >& list)\n    {\n    arma_extra_debug_sigprint();\n    \n    Mat<eT>::init(list);\n    \n    return *this;\n    }\n  \n#endif\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\nconst Mat<eT>&\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator=(const fixed<fixed_n_rows, fixed_n_cols>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(this != &X)\n    {\n          eT* dest = (use_extra) ?   mem_local_extra :   mem_local;\n    const eT* src  = (use_extra) ? X.mem_local_extra : X.mem_local;\n    \n    arrayops::copy( dest, src, fixed_n_elem );\n    }\n  \n  return *this;\n  }\n\n\n\n#if defined(ARMA_GOOD_COMPILER)\n  \n  template<typename eT>\n  template<uword fixed_n_rows, uword fixed_n_cols>\n  template<typename T1, typename eop_type>\n  inline\n  const Mat<eT>&\n  Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator=(const eOp<T1, eop_type>& X)\n    {\n    arma_extra_debug_sigprint();\n    \n    arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n    \n    const bool bad_alias = (eOp<T1, eop_type>::proxy_type::has_subview  &&  X.P.is_alias(*this));\n    \n    if(bad_alias == false)\n      {\n      arma_debug_assert_same_size(fixed_n_rows, fixed_n_cols, X.get_n_rows(), X.get_n_cols(), \"Mat::fixed::operator=\");\n      \n      eop_type::apply(*this, X);\n      }\n    else\n      {\n      arma_extra_debug_print(\"bad_alias = true\");\n      \n      Mat<eT> tmp(X);\n      \n      (*this) = tmp;\n      }\n    \n    return *this;\n    }\n  \n  \n  \n  template<typename eT>\n  template<uword fixed_n_rows, uword fixed_n_cols>\n  template<typename T1, typename T2, typename eglue_type>\n  inline\n  const Mat<eT>&\n  Mat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator=(const eGlue<T1, T2, eglue_type>& X)\n    {\n    arma_extra_debug_sigprint();\n    \n    arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n    arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n    \n    const bool bad_alias =\n      (\n      (eGlue<T1, T2, eglue_type>::proxy1_type::has_subview  &&  X.P1.is_alias(*this))\n      ||\n      (eGlue<T1, T2, eglue_type>::proxy2_type::has_subview  &&  X.P2.is_alias(*this))\n      );\n    \n    if(bad_alias == false)\n      {\n      arma_debug_assert_same_size(fixed_n_rows, fixed_n_cols, X.get_n_rows(), X.get_n_cols(), \"Mat::fixed::operator=\");\n      \n      eglue_type::apply(*this, X);\n      }\n    else\n      {\n      arma_extra_debug_print(\"bad_alias = true\");\n      \n      Mat<eT> tmp(X);\n      \n      (*this) = tmp;\n      }\n    \n    return *this;\n    }\n  \n#endif\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\nconst Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_htrans >\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::t() const\n  {\n  return Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_htrans >(*this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\nconst Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_htrans >\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::ht() const\n  {\n  return Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_htrans >(*this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\nconst Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_strans >\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::st() const\n  {\n  return Op< typename Mat<eT>::template fixed<fixed_n_rows, fixed_n_cols>::Mat_fixed_type, op_strans >(*this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\narma_warn_unused\nconst eT&\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at_alt(const uword ii) const\n  {\n  #if defined(ARMA_HAVE_ALIGNED_ATTRIBUTE)\n    \n    return (use_extra) ? mem_local_extra[ii] : mem_local[ii];\n    \n  #else\n    const eT* mem_aligned = (use_extra) ? mem_local_extra : mem_local;\n    \n    memory::mark_as_aligned(mem_aligned);\n    \n    return mem_aligned[ii];\n  #endif\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\narma_warn_unused\neT&\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator[] (const uword ii)\n  {\n  return (use_extra) ? mem_local_extra[ii] : mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\narma_warn_unused\nconst eT&\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator[] (const uword ii) const\n  {\n  return (use_extra) ? mem_local_extra[ii] : mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\narma_warn_unused\neT&\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at(const uword ii)\n  {\n  return (use_extra) ? mem_local_extra[ii] : mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\narma_warn_unused\nconst eT&\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at(const uword ii) const\n  {\n  return (use_extra) ? mem_local_extra[ii] : mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\narma_warn_unused\neT&\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator() (const uword ii)\n  {\n  arma_debug_check( (ii >= fixed_n_elem), \"Mat::operator(): index out of bounds\");\n  \n  return (use_extra) ? mem_local_extra[ii] : mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\narma_warn_unused\nconst eT&\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator() (const uword ii) const\n  {\n  arma_debug_check( (ii >= fixed_n_elem), \"Mat::operator(): index out of bounds\");\n  \n  return (use_extra) ? mem_local_extra[ii] : mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\narma_warn_unused\neT&\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at(const uword in_row, const uword in_col)\n  {\n  const uword iq = in_row + in_col*fixed_n_rows;\n  \n  return (use_extra) ? mem_local_extra[iq] : mem_local[iq];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\narma_warn_unused\nconst eT&\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::at(const uword in_row, const uword in_col) const\n  {\n  const uword iq = in_row + in_col*fixed_n_rows;\n  \n  return (use_extra) ? mem_local_extra[iq] : mem_local[iq];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\narma_warn_unused\neT&\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator() (const uword in_row, const uword in_col)\n  {\n  arma_debug_check( ((in_row >= fixed_n_rows) || (in_col >= fixed_n_cols)), \"Mat::operator(): index out of bounds\");\n  \n  const uword iq = in_row + in_col*fixed_n_rows;\n  \n  return (use_extra) ? mem_local_extra[iq] : mem_local[iq];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\narma_warn_unused\nconst eT&\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::operator() (const uword in_row, const uword in_col) const\n  {\n  arma_debug_check( ((in_row >= fixed_n_rows) || (in_col >= fixed_n_cols)), \"Mat::operator(): index out of bounds\");\n  \n  const uword iq = in_row + in_col*fixed_n_rows;\n  \n  return (use_extra) ? mem_local_extra[iq] : mem_local[iq];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\narma_warn_unused\neT*\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::colptr(const uword in_col)\n  {\n  eT* mem_actual = (use_extra) ? mem_local_extra : mem_local;\n  \n  return & access::rw(mem_actual[in_col*fixed_n_rows]);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\narma_warn_unused\nconst eT*\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::colptr(const uword in_col) const\n  {\n  const eT* mem_actual = (use_extra) ? mem_local_extra : mem_local;\n  \n  return & mem_actual[in_col*fixed_n_rows];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\narma_warn_unused\neT*\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::memptr()\n  {\n  return (use_extra) ? mem_local_extra : mem_local;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\narma_warn_unused\nconst eT*\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::memptr() const\n  {\n  return (use_extra) ? mem_local_extra : mem_local;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_inline\narma_warn_unused\nbool\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::is_vec() const\n  {\n  return ( (fixed_n_rows == 1) || (fixed_n_cols == 1) );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_hot\ninline\nconst Mat<eT>&\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::fill(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(mem_local[0]);\n  \n  arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, val );\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_hot\ninline\nconst Mat<eT>&\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::zeros()\n  {\n  arma_extra_debug_sigprint();\n  \n  eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(mem_local[0]);\n  \n  arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, eT(0) );\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_rows, uword fixed_n_cols>\narma_hot\ninline\nconst Mat<eT>&\nMat<eT>::fixed<fixed_n_rows, fixed_n_cols>::ones()\n  {\n  arma_extra_debug_sigprint();\n  \n  eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(mem_local[0]);\n  \n  arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, eT(1) );\n  \n  return *this;\n  }\n\n\n\n//! prefix ++\ntemplate<typename eT>\narma_inline\nvoid\nMat_aux::prefix_pp(Mat<eT>& x)\n  {\n        eT*   memptr = x.memptr();\n  const uword n_elem = x.n_elem;\n  \n  uword i,j;\n\n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    ++(memptr[i]);\n    ++(memptr[j]);\n    }\n  \n  if(i < n_elem)\n    {\n    ++(memptr[i]);\n    }\n  }\n\n\n\n//! prefix ++ for complex numbers (work around for limitations of the std::complex class)\ntemplate<typename T>\narma_inline\nvoid\nMat_aux::prefix_pp(Mat< std::complex<T> >& x)\n  {\n  x += T(1);\n  }\n\n\n\n//! postfix ++\ntemplate<typename eT>\narma_inline\nvoid\nMat_aux::postfix_pp(Mat<eT>& x)\n  {\n        eT*   memptr = x.memptr();\n  const uword n_elem = x.n_elem;\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    (memptr[i])++;\n    (memptr[j])++;\n    }\n  \n  if(i < n_elem)\n    {\n    (memptr[i])++;\n    }\n  }\n\n\n\n//! postfix ++ for complex numbers (work around for limitations of the std::complex class)\ntemplate<typename T>\narma_inline\nvoid\nMat_aux::postfix_pp(Mat< std::complex<T> >& x)\n  {\n  x += T(1);\n  }\n\n\n\n//! prefix --\ntemplate<typename eT>\narma_inline\nvoid\nMat_aux::prefix_mm(Mat<eT>& x)\n  {\n        eT*   memptr = x.memptr();\n  const uword n_elem = x.n_elem;\n\n  uword i,j;\n\n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    --(memptr[i]);\n    --(memptr[j]);\n    }\n  \n  if(i < n_elem)\n    {\n    --(memptr[i]);\n    }\n  }\n\n\n\n//! prefix -- for complex numbers (work around for limitations of the std::complex class)\ntemplate<typename T>\narma_inline\nvoid\nMat_aux::prefix_mm(Mat< std::complex<T> >& x)\n  {\n  x -= T(1);\n  }\n\n\n\n//! postfix --\ntemplate<typename eT>\narma_inline\nvoid\nMat_aux::postfix_mm(Mat<eT>& x)\n  {\n        eT*   memptr = x.memptr();\n  const uword n_elem = x.n_elem;\n\n  uword i,j;\n\n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    (memptr[i])--;\n    (memptr[j])--;\n    }\n  \n  if(i < n_elem)\n    {\n    (memptr[i])--;\n    }\n  }\n\n\n\n//! postfix ++ for complex numbers (work around for limitations of the std::complex class)\ntemplate<typename T>\narma_inline\nvoid\nMat_aux::postfix_mm(Mat< std::complex<T> >& x)\n  {\n  x -= T(1);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nMat_aux::set_real(Mat<eT>& out, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1>   tmp(X.get_ref());\n  const Mat<eT>& A = tmp.M;\n  \n  arma_debug_assert_same_size( out, A, \"Mat::set_real()\" );\n  \n  out = A;\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nMat_aux::set_imag(Mat<eT>&, const Base<eT,T1>&)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T, typename T1>\ninline\nvoid\nMat_aux::set_real(Mat< std::complex<T> >& out, const Base<T,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<T> eT;\n  \n  const Proxy<T1> P(X.get_ref());\n  \n  const uword local_n_rows = P.get_n_rows();\n  const uword local_n_cols = P.get_n_cols();\n  \n  arma_debug_assert_same_size( out.n_rows, out.n_cols, local_n_rows, local_n_cols, \"Mat::set_real()\" );\n  \n  eT* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n    ea_type A = P.get_ea();\n    \n    const uword N = out.n_elem;\n    \n    for(uword i=0; i<N; ++i)\n      {\n      out_mem[i] = std::complex<T>( A[i], out_mem[i].imag() );\n      }\n    }\n  else\n    {\n    for(uword col=0; col < local_n_cols; ++col)\n    for(uword row=0; row < local_n_rows; ++row)\n      {\n      (*out_mem) = std::complex<T>( P.at(row,col), (*out_mem).imag() );\n      out_mem++;\n      }\n    }\n  }\n\n\n\ntemplate<typename T, typename T1>\ninline\nvoid\nMat_aux::set_imag(Mat< std::complex<T> >& out, const Base<T,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<T> eT;\n  \n  const Proxy<T1> P(X.get_ref());\n  \n  const uword local_n_rows = P.get_n_rows();\n  const uword local_n_cols = P.get_n_cols();\n  \n  arma_debug_assert_same_size( out.n_rows, out.n_cols, local_n_rows, local_n_cols, \"Mat::set_imag()\" );\n  \n  eT* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n    ea_type A = P.get_ea();\n    \n    const uword N = out.n_elem;\n    \n    for(uword i=0; i<N; ++i)\n      {\n      out_mem[i] = std::complex<T>( out_mem[i].real(), A[i] );\n      }\n    }\n  else\n    {\n    for(uword col=0; col < local_n_cols; ++col)\n    for(uword row=0; row < local_n_rows; ++row)\n      {\n      (*out_mem) = std::complex<T>( (*out_mem).real(), P.at(row,col) );\n      out_mem++;\n      }\n    }\n  }\n\n\n\n#ifdef ARMA_EXTRA_MAT_MEAT\n  #include ARMA_INCFILE_WRAP(ARMA_EXTRA_MAT_MEAT)\n#endif\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/OpCube_bones.hpp",
    "content": "// Copyright (C) 2008-2011 Conrad Sanderson\n// Copyright (C) 2008-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup OpCube\n//! @{\n\n\n//! Analog of the Op class, intended for cubes\n\ntemplate<typename T1, typename op_type>\nclass OpCube : public BaseCube<typename T1::elem_type, OpCube<T1, op_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  \n  inline explicit OpCube(const BaseCube<typename T1::elem_type, T1>& in_m);\n  inline          OpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const elem_type in_aux);\n  inline          OpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c);\n  inline          OpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b);\n  inline          OpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c);\n  inline          OpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c, const uword in_aux_uword_d, const char junk);\n  inline         ~OpCube();\n  \n  arma_aligned const T1&       m;            //!< storage of reference to the operand (e.g. a cube)\n  arma_aligned       elem_type aux;          //!< storage of auxiliary data, user defined format\n  arma_aligned       uword     aux_uword_a;  //!< storage of auxiliary data, uword format\n  arma_aligned       uword     aux_uword_b;  //!< storage of auxiliary data, uword format\n  arma_aligned       uword     aux_uword_c;  //!< storage of auxiliary data, uword format\n  arma_aligned       uword     aux_uword_d;  //!< storage of auxiliary data, uword format\n  \n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/OpCube_meat.hpp",
    "content": "// Copyright (C) 2008-2011 Conrad Sanderson\n// Copyright (C) 2008-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup OpCube\n//! @{\n\n\n\ntemplate<typename T1, typename op_type>\nOpCube<T1, op_type>::OpCube(const BaseCube<typename T1::elem_type, T1>& in_m)\n  : m(in_m.get_ref())\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename op_type>\nOpCube<T1, op_type>::OpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const typename T1::elem_type in_aux)\n  : m(in_m.get_ref())\n  , aux(in_aux)\n  {\n  arma_extra_debug_sigprint();\n  }\n  \n\ntemplate<typename T1, typename op_type>\nOpCube<T1, op_type>::OpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const typename T1::elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c)\n  : m(in_m.get_ref())\n  , aux(in_aux)\n  , aux_uword_a(in_aux_uword_a)\n  , aux_uword_b(in_aux_uword_b)\n  , aux_uword_c(in_aux_uword_c)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\n\ntemplate<typename T1, typename op_type>\nOpCube<T1, op_type>::OpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b)\n  : m(in_m.get_ref())\n  , aux_uword_a(in_aux_uword_a)\n  , aux_uword_b(in_aux_uword_b)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename op_type>\nOpCube<T1, op_type>::OpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c)\n  : m(in_m.get_ref())\n  , aux_uword_a(in_aux_uword_a)\n  , aux_uword_b(in_aux_uword_b)\n  , aux_uword_c(in_aux_uword_c)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename op_type>\nOpCube<T1, op_type>::OpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c, const uword in_aux_uword_d, const char)\n  : m(in_m.get_ref())\n  , aux_uword_a(in_aux_uword_a)\n  , aux_uword_b(in_aux_uword_b)\n  , aux_uword_c(in_aux_uword_c)\n  , aux_uword_d(in_aux_uword_d)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename op_type>\nOpCube<T1, op_type>::~OpCube()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Op_bones.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Op\n//! @{\n\n\n\n//! Class for storing data required for delayed unary operations,\n//! such as the operand (e.g. the matrix to which the operation is to be applied) and the unary operator (e.g. inverse).\n//! The operand is stored as a reference (which can be optimised away),\n//! while the operator is \"stored\" through the template definition (op_type).\n//! The operands can be 'Mat', 'Row', 'Col', 'Op', and 'Glue'.\n//! Note that as 'Glue' can be one of the operands, more than one matrix can be stored.\n//!\n//! For example, we could have:\n//! Op< Glue< Mat, Mat, glue_times >, op_htrans >\n\ntemplate<typename T1, typename op_type>\nclass Op : public Base<typename T1::elem_type, Op<T1, op_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool is_row = \\\n     (T1::is_col && (is_same_type<op_type, op_strans>::yes || is_same_type<op_type, op_htrans>::yes || is_same_type<op_type, op_htrans2>::yes))\n  || (T1::is_row && (is_same_type<op_type, op_sort>::yes || is_same_type<op_type, op_shuffle>::yes || is_same_type<op_type, op_cumsum_vec>::yes || is_same_type<op_type, op_flipud>::yes || is_same_type<op_type, op_fliplr>::yes))\n  || (is_same_type<op_type, op_normalise_rowvec>::yes);\n  \n  static const bool is_col = \\\n     (T1::is_row && (is_same_type<op_type, op_strans>::yes || is_same_type<op_type, op_htrans>::yes || is_same_type<op_type, op_htrans2>::yes))\n  || (T1::is_col && (is_same_type<op_type, op_sort>::yes || is_same_type<op_type, op_shuffle>::yes || is_same_type<op_type, op_cumsum_vec>::yes || is_same_type<op_type, op_flipud>::yes || is_same_type<op_type, op_fliplr>::yes))\n  || (is_same_type<op_type, op_normalise_colvec>::yes)\n  || (is_same_type<op_type, op_diagvec>::yes)\n  || (is_same_type<op_type, op_vectorise_col>::yes)\n  || (is_same_type<op_type, op_nonzeros>::yes);\n  \n  inline explicit Op(const T1& in_m);\n  inline          Op(const T1& in_m, const elem_type in_aux);\n  inline          Op(const T1& in_m, const elem_type in_aux,         const uword in_aux_uword_a, const uword in_aux_uword_b);\n  inline          Op(const T1& in_m, const uword     in_aux_uword_a, const uword in_aux_uword_b);\n  inline          Op(const T1& in_m, const uword     in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c, const char junk);\n  inline         ~Op();\n    \n  \n  arma_aligned const T1&       m;            //!< storage of reference to the operand (eg. a matrix)\n  arma_aligned       elem_type aux;          //!< storage of auxiliary data, user defined format\n  arma_aligned       uword     aux_uword_a;  //!< storage of auxiliary data, uword format\n  arma_aligned       uword     aux_uword_b;  //!< storage of auxiliary data, uword format\n  arma_aligned       uword     aux_uword_c;  //!< storage of auxiliary data, uword format\n  \n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Op_meat.hpp",
    "content": "// Copyright (C) 2008-2011 Conrad Sanderson\n// Copyright (C) 2008-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Op\n//! @{\n\n\n\ntemplate<typename T1, typename op_type>\ninline\nOp<T1, op_type>::Op(const T1& in_m)\n  : m(in_m)\n  {\n  arma_extra_debug_sigprint();\n  }\n  \n\n\ntemplate<typename T1, typename op_type>\ninline\nOp<T1, op_type>::Op(const T1& in_m, const typename T1::elem_type in_aux)\n  : m(in_m)\n  , aux(in_aux)\n  {\n  arma_extra_debug_sigprint();\n  }\n  \n\n\ntemplate<typename T1, typename op_type>\ninline\nOp<T1, op_type>::Op(const T1& in_m, const typename T1::elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b)\n  : m(in_m)\n  , aux(in_aux)\n  , aux_uword_a(in_aux_uword_a)\n  , aux_uword_b(in_aux_uword_b)\n  {\n  arma_extra_debug_sigprint();\n  }\n  \n\n\ntemplate<typename T1, typename op_type>\ninline\nOp<T1, op_type>::Op(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b)\n  : m(in_m)\n  , aux_uword_a(in_aux_uword_a)\n  , aux_uword_b(in_aux_uword_b)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename op_type>\ninline\nOp<T1, op_type>::Op(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c, const char)\n  : m(in_m)\n  , aux_uword_a(in_aux_uword_a)\n  , aux_uword_b(in_aux_uword_b)\n  , aux_uword_c(in_aux_uword_c)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename op_type>\ninline\nOp<T1, op_type>::~Op()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Proxy.hpp",
    "content": "// Copyright (C) 2010-2014 Conrad Sanderson\n// Copyright (C) 2010-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Proxy\n//! @{\n\n\n// ea_type is the \"element accessor\" type,\n// which can provide access to elements via operator[]\n\n\n\ntemplate<typename T1>\nstruct Proxy_default\n  {\n  inline Proxy_default(const T1&)\n    {\n    arma_type_check(( is_arma_type<T1>::value == false ));\n    }\n  };\n\n\n\ntemplate<typename T1>\nstruct Proxy_fixed\n  {\n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef T1                                       stored_type;\n  typedef const elem_type*                         ea_type;\n  typedef const T1&                                aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = T1::is_row;\n  static const bool is_col = T1::is_col;\n  \n  arma_aligned const T1& Q;\n  \n  inline explicit Proxy_fixed(const T1& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline static uword get_n_rows() { return T1::n_rows; }\n  arma_inline static uword get_n_cols() { return T1::n_cols; }\n  arma_inline static uword get_n_elem() { return T1::n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at         (const uword row, const uword col) const { return Q.at(row, col); }\n  arma_inline elem_type at_alt     (const uword i)                    const { return Q.at_alt(i);    }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&Q) == void_ptr(&X)); }\n  \n  arma_inline bool is_aligned() const\n    {\n    #if defined(ARMA_HAVE_ALIGNED_ATTRIBUTE)\n      return true;\n    #else\n      return memory::is_aligned(Q.memptr());\n    #endif\n    }\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct Proxy_redirect {};\n\ntemplate<typename T1>\nstruct Proxy_redirect<T1, false> { typedef Proxy_default<T1> result; };\n\ntemplate<typename T1>\nstruct Proxy_redirect<T1, true>  { typedef Proxy_fixed<T1>   result; };\n\n\n\ntemplate<typename T1>\nclass Proxy : public Proxy_redirect<T1, is_Mat_fixed<T1>::value >::result\n  {\n  public:\n  inline Proxy(const T1& A)\n    : Proxy_redirect< T1, is_Mat_fixed<T1>::value >::result(A)\n    {\n    }\n  };\n\n\n\ntemplate<typename eT>\nclass Proxy< Mat<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Mat<eT>                                  stored_type;\n  typedef const eT*                                ea_type;\n  typedef const Mat<eT>&                           aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = false;\n  \n  arma_aligned const Mat<eT>& Q;\n  \n  inline explicit Proxy(const Mat<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return Q.n_cols; }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at         (const uword row, const uword col) const { return Q.at(row, col); }\n  arma_inline elem_type at_alt     (const uword i)                    const { return Q.at_alt(i);    }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&Q) == void_ptr(&X)); }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename eT>\nclass Proxy< Col<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Col<eT>                                  stored_type;\n  typedef const eT*                                ea_type;\n  typedef const Col<eT>&                           aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const Col<eT>& Q;\n  \n  inline explicit Proxy(const Col<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return 1;        }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];        }\n  arma_inline elem_type at         (const uword row, const uword) const { return Q[row];      }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q.at_alt(i); }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&Q) == void_ptr(&X)); }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename eT>\nclass Proxy< Row<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Row<eT>                                  stored_type;\n  typedef const eT*                                ea_type;\n  typedef const Row<eT>&                           aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = true;\n  static const bool is_col = false;\n  \n  arma_aligned const Row<eT>& Q;\n  \n  inline explicit Proxy(const Row<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return 1;        }\n  arma_inline uword get_n_cols() const { return Q.n_cols; }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];        }\n  arma_inline elem_type at         (const uword, const uword col) const { return Q[col];      }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q.at_alt(i); }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&Q) == void_ptr(&X)); }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename T1, typename gen_type>\nclass Proxy< Gen<T1, gen_type > >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Gen<T1, gen_type>                        stored_type;\n  typedef const Gen<T1, gen_type>&                 ea_type;\n  typedef const Gen<T1, gen_type>&                 aligned_ea_type;\n  \n  static const bool prefer_at_accessor = Gen<T1, gen_type>::prefer_at_accessor;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = Gen<T1, gen_type>::is_row;\n  static const bool is_col = Gen<T1, gen_type>::is_col;\n  \n  arma_aligned const Gen<T1, gen_type>& Q;\n  \n  inline explicit Proxy(const Gen<T1, gen_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return (is_row ? 1 : Q.n_rows);                           }\n  arma_inline uword get_n_cols() const { return (is_col ? 1 : Q.n_cols);                           }\n  arma_inline uword get_n_elem() const { return (is_row ? 1 : Q.n_rows) * (is_col ? 1 : Q.n_cols); }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at         (const uword row, const uword col) const { return Q.at(row, col); }\n  arma_inline elem_type at_alt     (const uword i)                    const { return Q[i];           }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>&) const { return false; }\n  \n  arma_inline bool is_aligned() const { return Gen<T1, gen_type>::is_simple; }\n  };\n\n\n\ntemplate<typename T1, typename op_type>\nclass Proxy< Op<T1, op_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Mat<elem_type>                           stored_type;\n  typedef const elem_type*                         ea_type;\n  typedef const Mat<elem_type>&                    aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = Op<T1, op_type>::is_row;\n  static const bool is_col = Op<T1, op_type>::is_col;\n  \n  arma_aligned const Mat<elem_type> Q;\n  \n  inline explicit Proxy(const Op<T1, op_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; }\n  arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; }\n  arma_inline uword get_n_elem() const { return Q.n_elem;              }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at         (const uword row, const uword col) const { return Q.at(row, col); }\n  arma_inline elem_type at_alt     (const uword i)                    const { return Q.at_alt(i);    }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>&) const { return false; }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename T1>\nclass Proxy_diagvec_mat\n  {\n  inline Proxy_diagvec_mat(const T1&) {}\n  };\n\n\n\ntemplate<typename T1>\nclass Proxy_diagvec_mat< Op<T1, op_diagvec> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef diagview<elem_type>                      stored_type;\n  typedef const diagview<elem_type>&               ea_type;\n  typedef const diagview<elem_type>&               aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = true;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const Mat<elem_type>&     R;\n  arma_aligned const diagview<elem_type> Q;\n  \n  inline explicit Proxy_diagvec_mat(const Op<T1, op_diagvec>& A)\n    : R(A.m), Q( R.diag( (A.aux_uword_b > 0) ? -sword(A.aux_uword_a) : sword(A.aux_uword_a) ) )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return 1;        }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];         }\n  arma_inline elem_type at         (const uword row, const uword) const { return Q.at(row, 0); }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q[i];         }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&R) == void_ptr(&X)); }\n  \n  arma_inline bool is_aligned() const { return false; }\n  };\n\n\n\ntemplate<typename T1>\nclass Proxy_diagvec_expr\n  {\n  inline Proxy_diagvec_expr(const T1&) {}\n  };\n\n\n\ntemplate<typename T1>\nclass Proxy_diagvec_expr< Op<T1, op_diagvec> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Mat<elem_type>                           stored_type;\n  typedef const elem_type*                         ea_type;\n  typedef const Mat<elem_type>&                    aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const Mat<elem_type> Q;\n  \n  inline explicit Proxy_diagvec_expr(const Op<T1, op_diagvec>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return 1;        }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];         }\n  arma_inline elem_type at         (const uword row, const uword) const { return Q.at(row, 0); }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q.at_alt(i);  }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>&) const { return false; }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct Proxy_diagvec_redirect {};\n\ntemplate<typename T1>\nstruct Proxy_diagvec_redirect< Op<T1, op_diagvec>, true > { typedef Proxy_diagvec_mat < Op<T1, op_diagvec> > result; };\n\ntemplate<typename T1>\nstruct Proxy_diagvec_redirect< Op<T1, op_diagvec>, false> { typedef Proxy_diagvec_expr< Op<T1, op_diagvec> > result; };\n\n\n\ntemplate<typename T1>\nclass Proxy< Op<T1, op_diagvec> >\n  : public Proxy_diagvec_redirect< Op<T1, op_diagvec>, is_Mat<T1>::value >::result\n  {\n  public:\n  \n  typedef typename Proxy_diagvec_redirect< Op<T1, op_diagvec>, is_Mat<T1>::value >::result Proxy_diagvec;\n  \n  inline explicit Proxy(const Op<T1, op_diagvec>& A)\n    : Proxy_diagvec(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  };\n\n\n\ntemplate<typename T1>\nstruct Proxy_xtrans_default\n  {\n  inline Proxy_xtrans_default(const T1&) {}\n  };\n\n\n\ntemplate<typename T1>\nstruct Proxy_xtrans_default< Op<T1, op_htrans> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef xtrans_mat<elem_type,true>               stored_type;\n  typedef const xtrans_mat<elem_type,true>&        ea_type;\n  typedef const xtrans_mat<elem_type,true>&        aligned_ea_type;\n  \n  static const bool prefer_at_accessor = true;\n  static const bool has_subview        = true;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = false;\n  \n  const unwrap<T1>                 U;\n  const xtrans_mat<elem_type,true> Q;\n  \n  inline explicit Proxy_xtrans_default(const Op<T1, op_htrans>& A)\n    : U(A.m)\n    , Q(U.M)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return void_ptr(&(U.M)) == void_ptr(&X); }\n  \n  arma_inline bool is_aligned() const { return false; }\n  };\n\n\n\ntemplate<typename T1>\nstruct Proxy_xtrans_default< Op<T1, op_strans> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef xtrans_mat<elem_type,false>              stored_type;\n  typedef const xtrans_mat<elem_type,false>&       ea_type;\n  typedef const xtrans_mat<elem_type,false>&       aligned_ea_type;\n  \n  static const bool prefer_at_accessor = true;\n  static const bool has_subview        = true;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = false;\n  \n  const unwrap<T1>                  U;\n  const xtrans_mat<elem_type,false> Q;\n  \n  inline explicit Proxy_xtrans_default(const Op<T1, op_strans>& A)\n    : U(A.m)\n    , Q(U.M)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return void_ptr(&(U.M)) == void_ptr(&X); }\n  \n  arma_inline bool is_aligned() const { return false; }\n  };\n\n\n\ntemplate<typename T1>\nstruct Proxy_xtrans_vector\n  {\n  inline Proxy_xtrans_vector(const T1&) {}\n  };\n\n\n\ntemplate<typename T1>\nstruct Proxy_xtrans_vector< Op<T1, op_htrans> >\n  {\n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Mat<elem_type>                           stored_type;\n  typedef const elem_type*                         ea_type;\n  typedef const Mat<elem_type>&                    aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = quasi_unwrap<T1>::has_subview;\n  static const bool fake_mat           = true;\n  \n  // NOTE: the Op class takes care of swapping row and col for op_htrans\n  static const bool is_row = Op<T1, op_htrans>::is_row;\n  static const bool is_col = Op<T1, op_htrans>::is_col;\n  \n  arma_aligned const quasi_unwrap<T1> U; // avoid copy if T1 is a Row, Col or subview_col\n  arma_aligned const Mat<elem_type>   Q;\n  \n  inline Proxy_xtrans_vector(const Op<T1, op_htrans>& A)\n    : U(A.m)\n    , Q(const_cast<elem_type*>(U.M.memptr()), U.M.n_cols, U.M.n_rows, false, false)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return U.is_alias(X); }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename T1>\nstruct Proxy_xtrans_vector< Op<T1, op_strans> >\n  {\n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Mat<elem_type>                           stored_type;\n  typedef const elem_type*                         ea_type;\n  typedef const Mat<elem_type>&                    aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = quasi_unwrap<T1>::has_subview;\n  static const bool fake_mat           = true;\n  \n  // NOTE: the Op class takes care of swapping row and col for op_htrans\n  static const bool is_row = Op<T1, op_htrans>::is_row;\n  static const bool is_col = Op<T1, op_htrans>::is_col;\n  \n  arma_aligned const quasi_unwrap<T1> U; // avoid copy if T1 is a Row, Col or subview_col\n  arma_aligned const Mat<elem_type>   Q;\n  \n  inline Proxy_xtrans_vector(const Op<T1, op_strans>& A)\n    : U(A.m)\n    , Q(const_cast<elem_type*>(U.M.memptr()), U.M.n_cols, U.M.n_rows, false, false)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return U.is_alias(X); }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct Proxy_xtrans_redirect {};\n\ntemplate<typename T1>\nstruct Proxy_xtrans_redirect<T1, false> { typedef Proxy_xtrans_default<T1> result; };\n\ntemplate<typename T1>\nstruct Proxy_xtrans_redirect<T1, true>  { typedef Proxy_xtrans_vector<T1>  result; };\n\n\n\ntemplate<typename T1>\nclass Proxy< Op<T1, op_htrans> >\n  : public\n    Proxy_xtrans_redirect\n      <\n      Op<T1, op_htrans>,\n      ((is_complex<typename T1::elem_type>::value == false) && ((Op<T1, op_htrans>::is_row) || (Op<T1, op_htrans>::is_col)) )\n      >::result\n  {\n  public:\n  \n  typedef\n  typename\n  Proxy_xtrans_redirect\n    <\n    Op<T1, op_htrans>,\n    ((is_complex<typename T1::elem_type>::value == false) && ((Op<T1, op_htrans>::is_row) || (Op<T1, op_htrans>::is_col)) )\n    >::result\n  Proxy_xtrans;\n  \n  typedef typename Proxy_xtrans::elem_type       elem_type;\n  typedef typename Proxy_xtrans::pod_type        pod_type;\n  typedef typename Proxy_xtrans::stored_type     stored_type;\n  typedef typename Proxy_xtrans::ea_type         ea_type;\n  typedef typename Proxy_xtrans::aligned_ea_type aligned_ea_type;\n  \n  static const bool prefer_at_accessor = Proxy_xtrans::prefer_at_accessor;\n  static const bool has_subview        = Proxy_xtrans::has_subview;\n  static const bool fake_mat           = Proxy_xtrans::fake_mat;\n  \n  static const bool is_row = Proxy_xtrans::is_row;\n  static const bool is_col = Proxy_xtrans::is_col;\n  \n  using Proxy_xtrans::Q;\n  \n  inline explicit Proxy(const Op<T1, op_htrans>& A)\n    : Proxy_xtrans(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; }\n  arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; }\n  arma_inline uword get_n_elem() const { return Q.n_elem;              }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at         (const uword row, const uword col) const { return Q.at(row, col); }\n  arma_inline elem_type at_alt     (const uword i)                    const { return Q.at_alt(i);    }\n  \n  arma_inline         ea_type         get_ea() const { return Proxy_xtrans::get_ea();         }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Proxy_xtrans::get_aligned_ea(); }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return Proxy_xtrans::is_alias(X); }\n  \n  arma_inline bool is_aligned() const { return Proxy_xtrans::is_aligned(); }\n  };\n\n\n\ntemplate<typename T1>\nclass Proxy< Op<T1, op_strans> >\n  : public\n    Proxy_xtrans_redirect\n      <\n      Op<T1, op_strans>,\n      ( (Op<T1, op_strans>::is_row) || (Op<T1, op_strans>::is_col) )\n      >::result\n  {\n  public:\n  \n  typedef\n  typename\n  Proxy_xtrans_redirect\n    <\n    Op<T1, op_strans>,\n    ( (Op<T1, op_strans>::is_row) || (Op<T1, op_strans>::is_col) )\n    >::result\n  Proxy_xtrans;\n  \n  typedef typename Proxy_xtrans::elem_type       elem_type;\n  typedef typename Proxy_xtrans::pod_type        pod_type;\n  typedef typename Proxy_xtrans::stored_type     stored_type;\n  typedef typename Proxy_xtrans::ea_type         ea_type;\n  typedef typename Proxy_xtrans::aligned_ea_type aligned_ea_type;\n  \n  static const bool prefer_at_accessor = Proxy_xtrans::prefer_at_accessor;\n  static const bool has_subview        = Proxy_xtrans::has_subview;\n  static const bool fake_mat           = Proxy_xtrans::fake_mat;\n  \n  static const bool is_row = Proxy_xtrans::is_row;\n  static const bool is_col = Proxy_xtrans::is_col;\n  \n  using Proxy_xtrans::Q;\n  \n  inline explicit Proxy(const Op<T1, op_strans>& A)\n    : Proxy_xtrans(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; }\n  arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; }\n  arma_inline uword get_n_elem() const { return Q.n_elem;              }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at         (const uword row, const uword col) const { return Q.at(row, col); }\n  arma_inline elem_type at_alt     (const uword i)                    const { return Q.at_alt(i);    }\n  \n  arma_inline         ea_type         get_ea() const { return Proxy_xtrans::get_ea();         }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Proxy_xtrans::get_aligned_ea(); }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return Proxy_xtrans::is_alias(X); }\n  \n  arma_inline bool is_aligned() const { return Proxy_xtrans::is_aligned(); }\n  };\n\n\n\ntemplate<typename eT>\nstruct Proxy_subview_row_htrans_cx\n  {\n  typedef eT                                elem_type;\n  typedef typename get_pod_type<eT>::result pod_type;\n  typedef subview_row_htrans<eT>            stored_type;\n  typedef const subview_row_htrans<eT>&     ea_type;\n  typedef const subview_row_htrans<eT>&     aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = true;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const subview_row_htrans<eT> Q;\n  \n  inline explicit Proxy_subview_row_htrans_cx(const Op<subview_row<eT>, op_htrans>& A)\n    : Q(A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&(Q.sv_row.m)) == void_ptr(&X)); }\n  };\n\n\n\ntemplate<typename eT>\nstruct Proxy_subview_row_htrans_non_cx\n  {\n  typedef eT                                elem_type;\n  typedef typename get_pod_type<eT>::result pod_type;\n  typedef subview_row_strans<eT>            stored_type;\n  typedef const subview_row_strans<eT>&     ea_type;\n  typedef const subview_row_strans<eT>&     aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = true;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const subview_row_strans<eT> Q;\n  \n  inline explicit Proxy_subview_row_htrans_non_cx(const Op<subview_row<eT>, op_htrans>& A)\n    : Q(A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&(Q.sv_row.m)) == void_ptr(&X)); }\n  };\n\n\n\ntemplate<typename eT, bool condition>\nstruct Proxy_subview_row_htrans_redirect {};\n\ntemplate<typename eT>\nstruct Proxy_subview_row_htrans_redirect<eT, true>  { typedef Proxy_subview_row_htrans_cx<eT>      result; };\n\ntemplate<typename eT>\nstruct Proxy_subview_row_htrans_redirect<eT, false> { typedef Proxy_subview_row_htrans_non_cx<eT>  result; };\n\n\n\ntemplate<typename eT>\nclass Proxy< Op<subview_row<eT>, op_htrans> >\n  : public\n    Proxy_subview_row_htrans_redirect\n      <\n      eT,\n      is_complex<eT>::value\n      >::result\n  {\n  public:\n  \n  typedef\n  typename\n  Proxy_subview_row_htrans_redirect\n      <\n      eT,\n      is_complex<eT>::value\n      >::result\n  Proxy_sv_row_ht;\n  \n  typedef typename Proxy_sv_row_ht::elem_type   elem_type;\n  typedef typename Proxy_sv_row_ht::pod_type    pod_type;\n  typedef typename Proxy_sv_row_ht::stored_type stored_type;\n  typedef typename Proxy_sv_row_ht::ea_type     ea_type;\n  typedef typename Proxy_sv_row_ht::ea_type     aligned_ea_type;\n  \n  static const bool prefer_at_accessor = Proxy_sv_row_ht::prefer_at_accessor;\n  static const bool has_subview        = Proxy_sv_row_ht::has_subview;\n  static const bool fake_mat           = Proxy_sv_row_ht::fake_mat;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  using Proxy_sv_row_ht::Q;\n  \n  inline explicit Proxy(const Op<subview_row<eT>, op_htrans>& A)\n    : Proxy_sv_row_ht(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return 1;        }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];   }\n  arma_inline elem_type at         (const uword row, const uword) const { return Q[row]; }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q[i];   }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return Proxy_sv_row_ht::is_alias(X); }\n  \n  arma_inline bool is_aligned() const { return false; }\n  };\n\n\n\ntemplate<typename eT>\nclass Proxy< Op<subview_row<eT>, op_strans> >\n  {\n  public:\n  \n  typedef eT                                elem_type;\n  typedef typename get_pod_type<eT>::result pod_type;\n  typedef subview_row_strans<eT>            stored_type;\n  typedef const subview_row_strans<eT>&     ea_type;\n  typedef const subview_row_strans<eT>&     aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = true;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const subview_row_strans<eT> Q;\n  \n  inline explicit Proxy(const Op<subview_row<eT>, op_strans>& A)\n    : Q(A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return 1;        }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];   }\n  arma_inline elem_type at         (const uword row, const uword) const { return Q[row]; }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q[i];   }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&(Q.sv_row.m)) == void_ptr(&X)); }\n  \n  arma_inline bool is_aligned() const { return false; }\n  };\n\n\n\ntemplate<typename T>\nclass Proxy< Op< Row< std::complex<T> >, op_htrans> >\n  {\n  public:\n  \n  typedef typename std::complex<T>  eT;\n  \n  typedef typename std::complex<T>  elem_type;\n  typedef T                         pod_type;\n  typedef xvec_htrans<eT>           stored_type;\n  typedef const xvec_htrans<eT>&    ea_type;\n  typedef const xvec_htrans<eT>&    aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  const xvec_htrans<eT> Q;\n  const Row<eT>&        src;\n  \n  inline explicit Proxy(const Op< Row< std::complex<T> >, op_htrans>& A)\n    : Q  (A.m.memptr(), A.m.n_rows, A.m.n_cols)\n    , src(A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return 1;        }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];   }\n  arma_inline elem_type at         (const uword row, const uword) const { return Q[row]; }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q[i];   }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return void_ptr(&src) == void_ptr(&X); }\n  \n  arma_inline bool is_aligned() const { return false; }\n  };\n\n\n\ntemplate<typename T>\nclass Proxy< Op< Col< std::complex<T> >, op_htrans> >\n  {\n  public:\n  \n  typedef typename std::complex<T>  eT;\n\n  typedef typename std::complex<T>  elem_type;\n  typedef T                         pod_type;\n  typedef xvec_htrans<eT>           stored_type;\n  typedef const xvec_htrans<eT>&    ea_type;\n  typedef const xvec_htrans<eT>&    aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = true;\n  static const bool is_col = false;\n  \n  const xvec_htrans<eT> Q;\n  const Col<eT>&        src;\n  \n  inline explicit Proxy(const Op< Col< std::complex<T> >, op_htrans>& A)\n    : Q  (A.m.memptr(), A.m.n_rows, A.m.n_cols)\n    , src(A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return 1;        }\n  arma_inline uword get_n_cols() const { return Q.n_cols; }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];   }\n  arma_inline elem_type at         (const uword, const uword col) const { return Q[col]; }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q[i];   }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return void_ptr(&src) == void_ptr(&X); }\n  \n  arma_inline bool is_aligned() const { return false; }\n  };\n\n\n\ntemplate<typename T>\nclass Proxy< Op< subview_col< std::complex<T> >, op_htrans> >\n  {\n  public:\n  \n  typedef typename std::complex<T>  eT;\n  \n  typedef typename std::complex<T>  elem_type;\n  typedef T                         pod_type;\n  typedef xvec_htrans<eT>           stored_type;\n  typedef const xvec_htrans<eT>&    ea_type;\n  typedef const xvec_htrans<eT>&    aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = true;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = true;\n  static const bool is_col = false;\n  \n  const xvec_htrans<eT>  Q;\n  const subview_col<eT>& src;\n  \n  inline explicit Proxy(const Op< subview_col< std::complex<T> >, op_htrans>& A)\n    : Q  (A.m.colptr(0), A.m.n_rows, A.m.n_cols)\n    , src(A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return 1;        }\n  arma_inline uword get_n_cols() const { return Q.n_cols; }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];   }\n  arma_inline elem_type at         (const uword, const uword col) const { return Q[col]; }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q[i];   }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return void_ptr(&src.m) == void_ptr(&X); }\n  \n  arma_inline bool is_aligned() const { return false; }\n  };\n\n\n\ntemplate<typename T1>\nclass Proxy< Op<T1, op_htrans2> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                           elem_type;\n  typedef typename get_pod_type<elem_type>::result         pod_type;\n  typedef       eOp< Op<T1, op_htrans>, eop_scalar_times>  stored_type;\n  typedef const eOp< Op<T1, op_htrans>, eop_scalar_times>& ea_type;\n  typedef const eOp< Op<T1, op_htrans>, eop_scalar_times>& aligned_ea_type;\n  \n  static const bool prefer_at_accessor = eOp< Op<T1, op_htrans>, eop_scalar_times>::prefer_at_accessor;\n  static const bool has_subview        = eOp< Op<T1, op_htrans>, eop_scalar_times>::has_subview;\n  static const bool fake_mat           = eOp< Op<T1, op_htrans>, eop_scalar_times>::fake_mat;\n  \n  // NOTE: the Op class takes care of swapping row and col for op_htrans\n  static const bool is_row = eOp< Op<T1, op_htrans>, eop_scalar_times>::is_row;\n  static const bool is_col = eOp< Op<T1, op_htrans>, eop_scalar_times>::is_col;\n  \n  arma_aligned const      Op<T1, op_htrans>                     R;\n  arma_aligned const eOp< Op<T1, op_htrans>, eop_scalar_times > Q;\n  \n  inline explicit Proxy(const Op<T1, op_htrans2>& A)\n    : R(A.m)\n    , Q(R, A.aux)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return is_row ? 1 : Q.get_n_rows(); }\n  arma_inline uword get_n_cols() const { return is_col ? 1 : Q.get_n_cols(); }\n  arma_inline uword get_n_elem() const { return Q.get_n_elem();              }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at         (const uword row, const uword col) const { return Q.at(row, col); }\n  arma_inline elem_type at_alt     (const uword i)                    const { return Q.at_alt(i);    }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return Q.P.is_alias(X); }\n  \n  arma_inline bool is_aligned() const { return Q.P.is_aligned(); }\n  };\n\n\n\ntemplate<typename T1>\nclass Proxy< Op<T1, op_vectorise_col> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Mat<elem_type>                           stored_type;\n  typedef const elem_type*                         ea_type;\n  typedef const Mat<elem_type>&                    aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = true;\n  static const bool fake_mat           = true;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const unwrap<T1>     U;\n  arma_aligned const Mat<elem_type> Q;\n  \n  inline explicit Proxy(const Op<T1, op_vectorise_col>& A)\n    : U(A.m)\n    , Q(const_cast<elem_type*>(U.M.memptr()), U.M.n_elem, 1, false, false)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return 1;        }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];           }\n  arma_inline elem_type at         (const uword row, const uword) const { return Q[row];         }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q.at_alt(i);    }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return ( void_ptr(&X) == void_ptr(&(U.M)) ); }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename T1, typename T2, typename glue_type>\nclass Proxy< Glue<T1, T2, glue_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Mat<elem_type>                           stored_type;\n  typedef const elem_type*                         ea_type;\n  typedef const Mat<elem_type>&                    aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = Glue<T1, T2, glue_type>::is_row;\n  static const bool is_col = Glue<T1, T2, glue_type>::is_col;\n  \n  arma_aligned const Mat<elem_type> Q;\n  \n  inline explicit Proxy(const Glue<T1, T2, glue_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n\n  arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; }\n  arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; }\n  arma_inline uword get_n_elem() const { return Q.n_elem;              }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at         (const uword row, const uword col) const { return Q.at(row, col); }\n  arma_inline elem_type at_alt     (const uword i)                    const { return Q.at_alt(i);    }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>&) const { return false; }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename eT>\nclass Proxy< subview<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef subview<eT>                              stored_type;\n  typedef const subview<eT>&                       ea_type;\n  typedef const subview<eT>&                       aligned_ea_type;\n  \n  static const bool prefer_at_accessor = true;\n  static const bool has_subview        = true;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = false;\n  \n  arma_aligned const subview<eT>& Q;\n  \n  inline explicit Proxy(const subview<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return Q.n_cols; }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at         (const uword row, const uword col) const { return Q.at(row, col); }\n  arma_inline elem_type at_alt     (const uword i)                    const { return Q[i];           }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&(Q.m)) == void_ptr(&X)); }\n  \n  arma_inline bool is_aligned() const { return false; }\n  };\n\n\n\ntemplate<typename eT>\nclass Proxy< subview_col<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef subview_col<eT>                          stored_type;\n  typedef const eT*                                ea_type;\n  typedef const subview_col<eT>&                   aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = true;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const subview_col<eT>& Q;\n  \n  inline explicit Proxy(const subview_col<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return 1;        }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];        }\n  arma_inline elem_type at         (const uword row, const uword) const { return Q[row];      }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q.at_alt(i); }\n  \n  arma_inline         ea_type         get_ea() const { return Q.colmem; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;        }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&(Q.m)) == void_ptr(&X)); }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.colmem); }\n  };\n\n\n\ntemplate<typename eT>\nclass Proxy< subview_row<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef subview_row<eT>                          stored_type;\n  typedef const subview_row<eT>&                   ea_type;\n  typedef const subview_row<eT>&                   aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = true;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = true;\n  static const bool is_col = false;\n  \n  arma_aligned const subview_row<eT>& Q;\n  \n  inline explicit Proxy(const subview_row<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return 1;        }\n  arma_inline uword get_n_cols() const { return Q.n_cols; }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];   }\n  arma_inline elem_type at         (const uword, const uword col) const { return Q[col]; }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q[i];   }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&(Q.m)) == void_ptr(&X)); }\n  \n  arma_inline bool is_aligned() const { return false; }\n  };\n\n\n\ntemplate<typename eT>\nclass Proxy< subview_row_strans<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef subview_row_strans<eT>                   stored_type;\n  typedef const subview_row_strans<eT>&            ea_type;\n  typedef const subview_row_strans<eT>&            aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = true;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const subview_row_strans<eT>& Q;\n  \n  inline explicit Proxy(const subview_row_strans<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return 1;        }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];   }\n  arma_inline elem_type at         (const uword row, const uword) const { return Q[row]; }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q[i];   }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&(Q.sv_row.m)) == void_ptr(&X)); }\n  \n  arma_inline bool is_aligned() const { return false; }\n  };\n\n\n\ntemplate<typename eT>\nclass Proxy< subview_row_htrans<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef subview_row_htrans<eT>                   stored_type;\n  typedef const subview_row_htrans<eT>&            ea_type;\n  typedef const subview_row_htrans<eT>&            aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = true;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const subview_row_htrans<eT>& Q;\n  \n  inline explicit Proxy(const subview_row_htrans<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return 1;        }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];   }\n  arma_inline elem_type at         (const uword row, const uword) const { return Q[row]; }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q[i];   }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&(Q.sv_row.m)) == void_ptr(&X)); }\n  \n  arma_inline bool is_aligned() const { return false; }\n  };\n\n\n\ntemplate<typename eT, bool do_conj>\nclass Proxy< xtrans_mat<eT, do_conj> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Mat<eT>                                  stored_type;\n  typedef const eT*                                ea_type;\n  typedef const Mat<eT>&                           aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = false;\n  \n  arma_aligned const Mat<eT> Q;\n  \n  inline explicit Proxy(const xtrans_mat<eT, do_conj>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return Q.n_cols; }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return Q[i];          }\n  arma_inline elem_type at         (const uword row, const uword col) const { return Q.at(row,col); }\n  arma_inline elem_type at_alt     (const uword i)                    const { return Q.at_alt(i);   }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>&) const { return false; }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename eT>\nclass Proxy< xvec_htrans<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Mat<eT>                                  stored_type;\n  typedef const eT*                                ea_type;\n  typedef const Mat<eT>&                           aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = false;\n  \n  arma_aligned const Mat<eT> Q;\n  \n  inline explicit Proxy(const xvec_htrans<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return Q.n_cols; }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return Q[i];          }\n  arma_inline elem_type at         (const uword row, const uword col) const { return Q.at(row,col); }\n  arma_inline elem_type at_alt     (const uword i)                    const { return Q.at_alt(i);   }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>&) const { return false; }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename eT, typename T1>\nclass Proxy< subview_elem1<eT,T1> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Mat<eT>                                  stored_type;\n  typedef const eT*                                ea_type;\n  typedef const Mat<eT>&                           aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const Mat<eT> Q;\n  \n  inline explicit Proxy(const subview_elem1<eT,T1>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return 1;        }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];        }\n  arma_inline elem_type at         (const uword row, const uword) const { return Q[row];      }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q.at_alt(i); }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>&) const { return false; }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename eT, typename T1, typename T2>\nclass Proxy< subview_elem2<eT,T1,T2> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Mat<eT>                                  stored_type;\n  typedef const eT*                                ea_type;\n  typedef const Mat<eT>&                           aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = false;\n  \n  arma_aligned const Mat<eT> Q;\n  \n  inline explicit Proxy(const subview_elem2<eT,T1,T2>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return Q.n_cols; }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at         (const uword row, const uword col) const { return Q.at(row, col); }\n  arma_inline elem_type at_alt     (const uword i)                    const { return Q.at_alt(i);    }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>&) const { return false; }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename eT>\nclass Proxy< diagview<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef diagview<eT>                             stored_type;\n  typedef const diagview<eT>&                      ea_type;\n  typedef const diagview<eT>&                      aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = true;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const diagview<eT>& Q;\n  \n  inline explicit Proxy(const diagview<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return 1;        }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];         }\n  arma_inline elem_type at         (const uword row, const uword) const { return Q.at(row, 0); }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q[i];         }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&(Q.m)) == void_ptr(&X)); }\n  \n  arma_inline bool is_aligned() const { return false; }\n  };\n\n\n\ntemplate<typename eT>\nclass Proxy< spdiagview<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef spdiagview<eT>                           stored_type;\n  typedef const spdiagview<eT>&                    ea_type;\n  typedef const spdiagview<eT>&                    aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const spdiagview<eT>& Q;\n  \n  inline explicit Proxy(const spdiagview<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return Q.n_rows; }\n  arma_inline uword get_n_cols() const { return 1;        }\n  arma_inline uword get_n_elem() const { return Q.n_elem; }\n  \n  arma_inline elem_type operator[] (const uword i)                const { return Q[i];         }\n  arma_inline elem_type at         (const uword row, const uword) const { return Q.at(row, 0); }\n  arma_inline elem_type at_alt     (const uword i)                const { return Q[i];         }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>&) const { return false; }\n  \n  arma_inline bool is_aligned() const { return false; }\n  };\n\n\n\ntemplate<typename T1, typename eop_type>\nclass Proxy< eOp<T1, eop_type > >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef eOp<T1, eop_type>                        stored_type;\n  typedef const eOp<T1, eop_type>&                 ea_type;\n  typedef const eOp<T1, eop_type>&                 aligned_ea_type;\n  \n  static const bool prefer_at_accessor = eOp<T1, eop_type>::prefer_at_accessor;\n  static const bool has_subview        = eOp<T1, eop_type>::has_subview;\n  static const bool fake_mat           = eOp<T1, eop_type>::fake_mat;\n  \n  static const bool is_row = eOp<T1, eop_type>::is_row;\n  static const bool is_col = eOp<T1, eop_type>::is_col;\n  \n  arma_aligned const eOp<T1, eop_type>& Q;\n  \n  inline explicit Proxy(const eOp<T1, eop_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return is_row ? 1 : Q.get_n_rows(); }\n  arma_inline uword get_n_cols() const { return is_col ? 1 : Q.get_n_cols(); }\n  arma_inline uword get_n_elem() const { return Q.get_n_elem();              }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at         (const uword row, const uword col) const { return Q.at(row, col); }\n  arma_inline elem_type at_alt     (const uword i)                    const { return Q.at_alt(i);    }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return Q.P.is_alias(X); }\n  \n  arma_inline bool is_aligned() const { return Q.P.is_aligned(); }\n  };\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\nclass Proxy< eGlue<T1, T2, eglue_type > >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef eGlue<T1, T2, eglue_type>                stored_type;\n  typedef const eGlue<T1, T2, eglue_type>&         ea_type;\n  typedef const eGlue<T1, T2, eglue_type>&         aligned_ea_type;\n  \n  static const bool prefer_at_accessor = eGlue<T1, T2, eglue_type>::prefer_at_accessor;\n  static const bool has_subview        = eGlue<T1, T2, eglue_type>::has_subview;\n  static const bool fake_mat           = eGlue<T1, T2, eglue_type>::fake_mat;\n  \n  static const bool is_row = eGlue<T1, T2, eglue_type>::is_row;\n  static const bool is_col = eGlue<T1, T2, eglue_type>::is_col;\n  \n  arma_aligned const eGlue<T1, T2, eglue_type>& Q;\n  \n  inline explicit Proxy(const eGlue<T1, T2, eglue_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return is_row ? 1 : Q.get_n_rows(); }\n  arma_inline uword get_n_cols() const { return is_col ? 1 : Q.get_n_cols(); }\n  arma_inline uword get_n_elem() const { return Q.get_n_elem();              }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at         (const uword row, const uword col) const { return Q.at(row, col); }\n  arma_inline elem_type at_alt     (const uword i)                    const { return Q.at_alt(i);    }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (Q.P1.is_alias(X) || Q.P2.is_alias(X)); }\n  \n  arma_inline bool is_aligned() const { return (Q.P1.is_aligned() && Q.P2.is_aligned()); }\n  };\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\nclass Proxy< mtOp<out_eT, T1, op_type> >\n  {\n  public:\n  \n  typedef          out_eT                       elem_type;\n  typedef typename get_pod_type<out_eT>::result pod_type;\n  typedef          Mat<out_eT>                  stored_type;\n  typedef          const elem_type*             ea_type;\n  typedef          const Mat<out_eT>&           aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = mtOp<out_eT, T1, op_type>::is_row;\n  static const bool is_col = mtOp<out_eT, T1, op_type>::is_col;\n  \n  arma_aligned const Mat<out_eT> Q;\n  \n  inline explicit Proxy(const mtOp<out_eT, T1, op_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; }\n  arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; }\n  arma_inline uword get_n_elem() const { return Q.n_elem;              }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return Q[i];          }\n  arma_inline elem_type at         (const uword row, const uword col) const { return Q.at(row,col); }\n  arma_inline elem_type at_alt     (const uword i)                    const { return Q.at_alt(i);   }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>&) const { return false; }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename out_eT, typename T1, typename T2, typename glue_type>\nclass Proxy< mtGlue<out_eT, T1, T2, glue_type > >\n  {\n  public:\n  \n  typedef          out_eT                       elem_type;\n  typedef typename get_pod_type<out_eT>::result pod_type;\n  typedef          Mat<out_eT>                  stored_type;\n  typedef          const elem_type*             ea_type;\n  typedef          const Mat<out_eT>&           aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  static const bool fake_mat           = false;\n  \n  static const bool is_row = mtGlue<out_eT, T1, T2, glue_type>::is_row;\n  static const bool is_col = mtGlue<out_eT, T1, T2, glue_type>::is_col;\n  \n  arma_aligned const Mat<out_eT> Q;\n  \n  inline explicit Proxy(const mtGlue<out_eT, T1, T2, glue_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; }\n  arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; }\n  arma_inline uword get_n_elem() const { return Q.n_elem;              }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return Q[i];          }\n  arma_inline elem_type at         (const uword row, const uword col) const { return Q.at(row,col); }\n  arma_inline elem_type at_alt     (const uword i)                    const { return Q.at_alt(i);   }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>&) const { return false; }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/ProxyCube.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup ProxyCube\n//! @{\n\n\n\ntemplate<typename T1>\nclass ProxyCube\n  {\n  public:\n  inline ProxyCube(const T1&)\n    {\n    arma_type_check(( is_arma_cube_type<T1>::value == false ));\n    }\n  };\n\n\n\n// ea_type is the \"element accessor\" type,\n// which can provide access to elements via operator[]\n\ntemplate<typename eT>\nclass ProxyCube< Cube<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Cube<eT>                                 stored_type;\n  typedef const eT*                                ea_type;\n  typedef const Cube<eT>&                          aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  \n  arma_aligned const Cube<eT>& Q;\n  \n  inline explicit ProxyCube(const Cube<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows()       const { return Q.n_rows;       }\n  arma_inline uword get_n_cols()       const { return Q.n_cols;       }\n  arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; }\n  arma_inline uword get_n_slices()     const { return Q.n_slices;     }\n  arma_inline uword get_n_elem()       const { return Q.n_elem;       }\n  \n  arma_inline elem_type operator[] (const uword i)                                       const { return Q[i];                  }\n  arma_inline elem_type at         (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); }\n  arma_inline elem_type at_alt     (const uword i)                                       const { return Q.at_alt(i);           }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Cube<eT2>& X) const { return (void_ptr(&Q) == void_ptr(&X)); }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename eT, typename gen_type>\nclass ProxyCube< GenCube<eT, gen_type > >\n  {\n  public:\n  \n  typedef          eT                              elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef GenCube<eT, gen_type>                    stored_type;\n  typedef const GenCube<eT, gen_type>&             ea_type;\n  typedef const GenCube<eT, gen_type>&             aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  \n  arma_aligned const GenCube<eT, gen_type>& Q;\n  \n  inline explicit ProxyCube(const GenCube<eT, gen_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows()       const { return Q.n_rows;                     }\n  arma_inline uword get_n_cols()       const { return Q.n_cols;                     }\n  arma_inline uword get_n_elem_slice() const { return Q.n_rows*Q.n_cols;            }\n  arma_inline uword get_n_slices()     const { return Q.n_slices;                   }\n  arma_inline uword get_n_elem()       const { return Q.n_rows*Q.n_cols*Q.n_slices; }\n  \n  arma_inline elem_type operator[] (const uword i)                                       const { return Q[i];                  }\n  arma_inline elem_type at         (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); }\n  arma_inline elem_type at_alt     (const uword i)                                       const { return Q[i];                  }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Cube<eT2>&) const { return false; }\n  \n  arma_inline bool is_aligned() const { return GenCube<eT, gen_type>::is_simple; }\n  };\n\n\n\ntemplate<typename T1, typename op_type>\nclass ProxyCube< OpCube<T1, op_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Cube<elem_type>                          stored_type;\n  typedef const elem_type*                         ea_type;\n  typedef const Cube<elem_type>&                   aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  \n  arma_aligned const Cube<elem_type> Q;\n  \n  inline explicit ProxyCube(const OpCube<T1, op_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows()       const { return Q.n_rows;       }\n  arma_inline uword get_n_cols()       const { return Q.n_cols;       }\n  arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; }\n  arma_inline uword get_n_slices()     const { return Q.n_slices;     }\n  arma_inline uword get_n_elem()       const { return Q.n_elem;       }\n  \n  arma_inline elem_type operator[] (const uword i)                                       const { return Q[i];                  }\n  arma_inline elem_type at         (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); }\n  arma_inline elem_type at_alt     (const uword i)                                       const { return Q.at_alt(i);           }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Cube<eT2>&) const { return false; }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename T1, typename T2, typename glue_type>\nclass ProxyCube< GlueCube<T1, T2, glue_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef Cube<elem_type>                          stored_type;\n  typedef const elem_type*                         ea_type;\n  typedef const Cube<elem_type>&                   aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  \n  arma_aligned const Cube<elem_type> Q;\n  \n  inline explicit ProxyCube(const GlueCube<T1, T2, glue_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n\n  arma_inline uword get_n_rows()       const { return Q.n_rows;       }\n  arma_inline uword get_n_cols()       const { return Q.n_cols;       }\n  arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; }\n  arma_inline uword get_n_slices()     const { return Q.n_slices;     }\n  arma_inline uword get_n_elem()       const { return Q.n_elem;       }\n  \n  arma_inline elem_type operator[] (const uword i)                                       const { return Q[i];                  }\n  arma_inline elem_type at         (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); }\n  arma_inline elem_type at_alt     (const uword i)                                       const { return Q.at_alt(i);           }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Cube<eT2>&) const { return false; }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename eT>\nclass ProxyCube< subview_cube<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef subview_cube<eT>                         stored_type;\n  typedef const subview_cube<eT>&                  ea_type;\n  typedef const subview_cube<eT>&                  aligned_ea_type;\n  \n  static const bool prefer_at_accessor = true;\n  static const bool has_subview        = true;\n  \n  arma_aligned const subview_cube<eT>& Q;\n  \n  inline explicit ProxyCube(const subview_cube<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows()       const { return Q.n_rows;       }\n  arma_inline uword get_n_cols()       const { return Q.n_cols;       }\n  arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; }\n  arma_inline uword get_n_slices()     const { return Q.n_slices;     }\n  arma_inline uword get_n_elem()       const { return Q.n_elem;       }\n  \n  arma_inline elem_type operator[] (const uword i)                                       const { return Q[i];                  }\n  arma_inline elem_type at         (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); }\n  arma_inline elem_type at_alt     (const uword i)                                       const { return Q.at_alt(i);           }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Cube<eT2>& X) const { return (void_ptr(&(Q.m)) == void_ptr(&X)); }\n  \n  arma_inline bool is_aligned() const { return false; }\n  };\n\n\n\ntemplate<typename T1, typename eop_type>\nclass ProxyCube< eOpCube<T1, eop_type > >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef eOpCube<T1, eop_type>                    stored_type;\n  typedef const eOpCube<T1, eop_type>&             ea_type;\n  typedef const eOpCube<T1, eop_type>&             aligned_ea_type;\n  \n  static const bool prefer_at_accessor = eOpCube<T1, eop_type>::prefer_at_accessor;\n  static const bool has_subview        = eOpCube<T1, eop_type>::has_subview;\n  \n  arma_aligned const eOpCube<T1, eop_type>& Q;\n  \n  inline explicit ProxyCube(const eOpCube<T1, eop_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows()       const { return Q.get_n_rows();       }\n  arma_inline uword get_n_cols()       const { return Q.get_n_cols();       }\n  arma_inline uword get_n_elem_slice() const { return Q.get_n_elem_slice(); }\n  arma_inline uword get_n_slices()     const { return Q.get_n_slices();     }\n  arma_inline uword get_n_elem()       const { return Q.get_n_elem();       }\n  \n  arma_inline elem_type operator[] (const uword i)                                       const { return Q[i];                  }\n  arma_inline elem_type at         (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); }\n  arma_inline elem_type at_alt     (const uword i)                                       const { return Q.at_alt(i);           }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Cube<eT2>& X) const { return Q.P.is_alias(X); }\n  \n  arma_inline bool is_aligned() const { return Q.P.is_aligned(); }\n  };\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\nclass ProxyCube< eGlueCube<T1, T2, eglue_type > >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef eGlueCube<T1, T2, eglue_type>            stored_type;\n  typedef const eGlueCube<T1, T2, eglue_type>&     ea_type;\n  typedef const eGlueCube<T1, T2, eglue_type>&     aligned_ea_type;\n  \n  static const bool prefer_at_accessor = eGlueCube<T1, T2, eglue_type>::prefer_at_accessor;\n  static const bool has_subview        = eGlueCube<T1, T2, eglue_type>::has_subview;\n  \n  arma_aligned const eGlueCube<T1, T2, eglue_type>& Q;\n  \n  inline explicit ProxyCube(const eGlueCube<T1, T2, eglue_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows()       const { return Q.get_n_rows();       }\n  arma_inline uword get_n_cols()       const { return Q.get_n_cols();       }\n  arma_inline uword get_n_elem_slice() const { return Q.get_n_elem_slice(); }\n  arma_inline uword get_n_slices()     const { return Q.get_n_slices();     }\n  arma_inline uword get_n_elem()       const { return Q.get_n_elem();       }\n  \n  arma_inline elem_type operator[] (const uword i)                                       const { return Q[i];                  }\n  arma_inline elem_type at         (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); }\n  arma_inline elem_type at_alt     (const uword i)                                       const { return Q.at_alt(i);           }\n  \n  arma_inline         ea_type         get_ea() const { return Q; }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q; }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Cube<eT2>& X) const { return (Q.P1.is_alias(X) || Q.P2.is_alias(X)); }\n  \n  arma_inline bool is_aligned() const { return Q.P1.is_aligned() && Q.P2.is_aligned(); }\n  };\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\nclass ProxyCube< mtOpCube<out_eT, T1, op_type> >\n  {\n  public:\n  \n  typedef          out_eT                       elem_type;\n  typedef typename get_pod_type<out_eT>::result pod_type;\n  typedef          Cube<out_eT>                 stored_type;\n  typedef          const elem_type*             ea_type;\n  typedef          const Cube<out_eT>&          aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  \n  arma_aligned const Cube<out_eT> Q;\n  \n  inline explicit ProxyCube(const mtOpCube<out_eT, T1, op_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows()       const { return Q.n_rows;       }\n  arma_inline uword get_n_cols()       const { return Q.n_cols;       }\n  arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; }\n  arma_inline uword get_n_slices()     const { return Q.n_slices;     }\n  arma_inline uword get_n_elem()       const { return Q.n_elem;       }\n  \n  arma_inline elem_type operator[] (const uword i)                                       const { return Q[i];                  }\n  arma_inline elem_type at         (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); }\n  arma_inline elem_type at_alt     (const uword i)                                       const { return Q.at_alt(i);           }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Cube<eT2>&) const { return false; }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\ntemplate<typename out_eT, typename T1, typename T2, typename glue_type>\nclass ProxyCube< mtGlueCube<out_eT, T1, T2, glue_type > >\n  {\n  public:\n  \n  typedef          out_eT                       elem_type;\n  typedef typename get_pod_type<out_eT>::result pod_type;\n  typedef          Cube<out_eT>                 stored_type;\n  typedef          const elem_type*             ea_type;\n  typedef          const Cube<out_eT>&          aligned_ea_type;\n  \n  static const bool prefer_at_accessor = false;\n  static const bool has_subview        = false;\n  \n  arma_aligned const Cube<out_eT> Q;\n  \n  inline explicit ProxyCube(const mtGlueCube<out_eT, T1, T2, glue_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows()       const { return Q.n_rows;       }\n  arma_inline uword get_n_cols()       const { return Q.n_cols;       }\n  arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; }\n  arma_inline uword get_n_slices()     const { return Q.n_slices;     }\n  arma_inline uword get_n_elem()       const { return Q.n_elem;       }\n  \n  arma_inline elem_type operator[] (const uword i)                                       const { return Q[i];                  }\n  arma_inline elem_type at         (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); }\n  arma_inline elem_type at_alt     (const uword i)                                       const { return Q.at_alt(i);           }\n  \n  arma_inline         ea_type         get_ea() const { return Q.memptr(); }\n  arma_inline aligned_ea_type get_aligned_ea() const { return Q;          }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Cube<eT2>&) const { return false; }\n  \n  arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); }\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Row_bones.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Row\n//! @{\n\n//! Class for row vectors (matrices with only one row)\n\ntemplate<typename eT>\nclass Row : public Mat<eT>\n  {\n  public:\n  \n  typedef eT                                elem_type;\n  typedef typename get_pod_type<eT>::result pod_type;\n  \n  static const bool is_col = false;\n  static const bool is_row = true;\n  \n  inline          Row();\n  inline          Row(const Row<eT>& X);\n  inline explicit Row(const uword N);\n  inline          Row(const uword in_rows, const uword in_cols);\n  \n  template<typename fill_type> inline Row(const uword n_elem,                       const fill::fill_class<fill_type>& f);\n  template<typename fill_type> inline Row(const uword in_rows, const uword in_cols, const fill::fill_class<fill_type>& f);\n  \n  inline                  Row(const char*        text);\n  inline const Row& operator=(const char*        text);\n  \n  inline                  Row(const std::string& text);\n  inline const Row& operator=(const std::string& text);\n  \n  inline                  Row(const std::vector<eT>& x);\n  inline const Row& operator=(const std::vector<eT>& x);\n  \n  #if defined(ARMA_USE_CXX11)\n  inline                  Row(const std::initializer_list<eT>& list);\n  inline const Row& operator=(const std::initializer_list<eT>& list);\n  \n  inline                  Row(Row&& m);\n  inline const Row& operator=(Row&& m);\n  #endif\n  \n  inline explicit Row(const SpRow<eT>& X);\n  \n  inline const Row& operator=(const eT val);\n  inline const Row& operator=(const Row& X);\n  \n  template<typename T1> inline                   Row(const Base<eT,T1>& X);\n  template<typename T1> inline const Row&  operator=(const Base<eT,T1>& X);\n  \n  inline Row(      eT* aux_mem, const uword aux_length, const bool copy_aux_mem = true, const bool strict = true);\n  inline Row(const eT* aux_mem, const uword aux_length);\n  \n  template<typename T1, typename T2>\n  inline explicit Row(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B);\n  \n  template<typename T1> inline                  Row(const BaseCube<eT,T1>& X);\n  template<typename T1> inline const Row& operator=(const BaseCube<eT,T1>& X);\n  \n  inline                  Row(const subview_cube<eT>& X);\n  inline const Row& operator=(const subview_cube<eT>& X);\n  \n  inline mat_injector<Row> operator<<(const eT val);\n  \n  arma_inline const Op<Row<eT>,op_htrans>  t() const;\n  arma_inline const Op<Row<eT>,op_htrans> ht() const;\n  arma_inline const Op<Row<eT>,op_strans> st() const;\n  \n  arma_inline       subview_row<eT> col(const uword col_num);\n  arma_inline const subview_row<eT> col(const uword col_num) const;\n  \n  using Mat<eT>::cols;\n  using Mat<eT>::operator();\n  \n  arma_inline       subview_row<eT> cols(const uword in_col1, const uword in_col2);\n  arma_inline const subview_row<eT> cols(const uword in_col1, const uword in_col2) const;\n  \n  arma_inline       subview_row<eT> subvec(const uword in_col1, const uword in_col2);\n  arma_inline const subview_row<eT> subvec(const uword in_col1, const uword in_col2) const;\n  \n  arma_inline       subview_row<eT> cols(const span& col_span);\n  arma_inline const subview_row<eT> cols(const span& col_span) const;\n  \n  arma_inline       subview_row<eT> subvec(const span& col_span);\n  arma_inline const subview_row<eT> subvec(const span& col_span) const;\n  \n  arma_inline       subview_row<eT> operator()(const span& col_span);\n  arma_inline const subview_row<eT> operator()(const span& col_span) const;\n  \n  arma_inline       subview_row<eT> head(const uword N);\n  arma_inline const subview_row<eT> head(const uword N) const;\n  \n  arma_inline       subview_row<eT> tail(const uword N);\n  arma_inline const subview_row<eT> tail(const uword N) const;\n  \n  arma_inline       subview_row<eT> head_cols(const uword N);\n  arma_inline const subview_row<eT> head_cols(const uword N) const;\n  \n  arma_inline       subview_row<eT> tail_cols(const uword N);\n  arma_inline const subview_row<eT> tail_cols(const uword N) const;\n  \n  \n  inline void shed_col (const uword col_num);\n  inline void shed_cols(const uword in_col1, const uword in_col2);\n  \n                        inline void insert_cols(const uword col_num, const uword N, const bool set_to_zero = true);\n  template<typename T1> inline void insert_cols(const uword col_num, const Base<eT,T1>& X);\n  \n  \n  arma_inline arma_warn_unused       eT& at(const uword i);\n  arma_inline arma_warn_unused const eT& at(const uword i) const;\n  \n  arma_inline arma_warn_unused       eT& at(const uword in_row, const uword in_col);\n  arma_inline arma_warn_unused const eT& at(const uword in_row, const uword in_col) const;\n  \n  \n  typedef       eT*       row_iterator;\n  typedef const eT* const_row_iterator;\n  \n  inline       row_iterator begin_row(const uword row_num);\n  inline const_row_iterator begin_row(const uword row_num) const;\n  \n  inline       row_iterator end_row  (const uword row_num);\n  inline const_row_iterator end_row  (const uword row_num) const;\n  \n  \n  template<uword fixed_n_elem> class fixed;\n  \n  \n  protected:\n  \n  inline Row(const arma_fixed_indicator&, const uword in_n_elem, const eT* in_mem);\n  \n  \n  public:\n  \n  #ifdef ARMA_EXTRA_ROW_PROTO\n    #include ARMA_INCFILE_WRAP(ARMA_EXTRA_ROW_PROTO)\n  #endif\n  };\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\nclass Row<eT>::fixed : public Row<eT>\n  {\n  private:\n  \n  static const bool use_extra = (fixed_n_elem > arma_config::mat_prealloc);\n  \n  arma_align_mem eT mem_local_extra[ (use_extra) ? fixed_n_elem : 1 ];\n  \n  \n  public:\n  \n  typedef fixed<fixed_n_elem>               Row_fixed_type;\n  \n  typedef eT                                elem_type;\n  typedef typename get_pod_type<eT>::result pod_type;\n  \n  static const bool is_col = false;\n  static const bool is_row = true;\n  \n  static const uword n_rows = 1;\n  static const uword n_cols = fixed_n_elem;\n  static const uword n_elem = fixed_n_elem;\n  \n  arma_inline fixed();\n  arma_inline fixed(const fixed<fixed_n_elem>& X);\n       inline fixed(const subview_cube<eT>& X);\n  \n  template<typename fill_type>       inline fixed(const fill::fill_class<fill_type>& f);\n  template<typename T1>              inline fixed(const Base<eT,T1>& A);\n  template<typename T1, typename T2> inline fixed(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B);\n  \n  inline fixed(const eT* aux_mem);\n  \n  inline fixed(const char*        text);\n  inline fixed(const std::string& text);\n  \n  template<typename T1> inline const Row& operator=(const Base<eT,T1>& A);\n  \n  inline const Row& operator=(const eT val);\n  inline const Row& operator=(const char*        text);\n  inline const Row& operator=(const std::string& text);\n  inline const Row& operator=(const subview_cube<eT>& X);\n  \n  using Row<eT>::operator();\n  \n  #if defined(ARMA_USE_CXX11)\n    inline                fixed(const std::initializer_list<eT>& list);\n    inline const Row& operator=(const std::initializer_list<eT>& list);\n  #endif\n  \n  arma_inline const Row& operator=(const fixed<fixed_n_elem>& X);\n  \n  #if defined(ARMA_GOOD_COMPILER)\n    template<typename T1,              typename   eop_type> inline const Row& operator=(const   eOp<T1,       eop_type>& X);\n    template<typename T1, typename T2, typename eglue_type> inline const Row& operator=(const eGlue<T1, T2, eglue_type>& X);\n  #endif\n  \n  arma_inline const Op< Row_fixed_type, op_htrans >  t() const;\n  arma_inline const Op< Row_fixed_type, op_htrans > ht() const;\n  arma_inline const Op< Row_fixed_type, op_strans > st() const;\n  \n  arma_inline arma_warn_unused const eT& at_alt     (const uword i) const;\n  \n  arma_inline arma_warn_unused       eT& operator[] (const uword i);\n  arma_inline arma_warn_unused const eT& operator[] (const uword i) const;\n  arma_inline arma_warn_unused       eT& at         (const uword i);\n  arma_inline arma_warn_unused const eT& at         (const uword i) const;\n  arma_inline arma_warn_unused       eT& operator() (const uword i);\n  arma_inline arma_warn_unused const eT& operator() (const uword i) const;\n  \n  arma_inline arma_warn_unused       eT& at         (const uword in_row, const uword in_col);\n  arma_inline arma_warn_unused const eT& at         (const uword in_row, const uword in_col) const;\n  arma_inline arma_warn_unused       eT& operator() (const uword in_row, const uword in_col);\n  arma_inline arma_warn_unused const eT& operator() (const uword in_row, const uword in_col) const;\n  \n  arma_inline arma_warn_unused       eT* memptr();\n  arma_inline arma_warn_unused const eT* memptr() const;\n  \n  arma_hot inline const Row<eT>& fill(const eT val);\n  arma_hot inline const Row<eT>& zeros();\n  arma_hot inline const Row<eT>& ones();\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/Row_meat.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup Row\n//! @{\n\n\n//! construct an empty row vector\ntemplate<typename eT>\ninline\nRow<eT>::Row()\n  : Mat<eT>(arma_vec_indicator(), 2)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nRow<eT>::Row(const Row<eT>& X)\n  : Mat<eT>(arma_vec_indicator(), 1, X.n_elem, 2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::copy((*this).memptr(), X.memptr(), X.n_elem);\n  }\n\n\n\n//! construct a row vector with the specified number of n_elem\ntemplate<typename eT>\ninline\nRow<eT>::Row(const uword in_n_elem)\n  : Mat<eT>(arma_vec_indicator(), 1, in_n_elem, 2)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nRow<eT>::Row(const uword in_n_rows, const uword in_n_cols)\n  : Mat<eT>(arma_vec_indicator(), 2)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::init_warm(in_n_rows, in_n_cols);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename fill_type>\ninline\nRow<eT>::Row(const uword in_n_elem, const fill::fill_class<fill_type>& f)\n  : Mat<eT>(arma_vec_indicator(), 1, in_n_elem, 2)\n  {\n  arma_extra_debug_sigprint();\n  \n  (*this).fill(f);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename fill_type>\ninline\nRow<eT>::Row(const uword in_n_rows, const uword in_n_cols, const fill::fill_class<fill_type>& f)\n  : Mat<eT>(arma_vec_indicator(), 2)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::init_warm(in_n_rows, in_n_cols);\n  \n  (*this).fill(f);\n  }\n\n\n\ntemplate<typename eT>\ninline\nRow<eT>::Row(const char* text)\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::vec_state) = 2;\n  \n  Mat<eT>::operator=(text);\n  }\n  \n\n\ntemplate<typename eT>\ninline\nconst Row<eT>&\nRow<eT>::operator=(const char* text)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::operator=(text);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nRow<eT>::Row(const std::string& text)\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::vec_state) = 2;\n  \n  Mat<eT>::operator=(text);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Row<eT>&\nRow<eT>::operator=(const std::string& text)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::operator=(text);\n  \n  return *this;\n  }\n\n\n\n//! create a row vector from std::vector\ntemplate<typename eT>\ninline\nRow<eT>::Row(const std::vector<eT>& x)\n  : Mat<eT>(arma_vec_indicator(), 1, uword(x.size()), 2)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  if(x.size() > 0)\n    {\n    arrayops::copy( Mat<eT>::memptr(), &(x[0]), uword(x.size()) );\n    }\n  }\n  \n  \n  \n//! create a row vector from std::vector\ntemplate<typename eT>\ninline\nconst Row<eT>&\nRow<eT>::operator=(const std::vector<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::init_warm(1, uword(x.size()));\n  \n  if(x.size() > 0)\n    {\n    arrayops::copy( Mat<eT>::memptr(), &(x[0]), uword(x.size()) );\n    }\n  \n  return *this;\n  }\n\n\n\n#if defined(ARMA_USE_CXX11)\n  \n  template<typename eT>\n  inline\n  Row<eT>::Row(const std::initializer_list<eT>& list)\n    {\n    arma_extra_debug_sigprint();\n    \n    access::rw(Mat<eT>::vec_state) = 2;\n    \n    Mat<eT>::operator=(list);\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  const Row<eT>&\n  Row<eT>::operator=(const std::initializer_list<eT>& list)\n    {\n    arma_extra_debug_sigprint();\n    \n    Mat<eT>::operator=(list);\n    \n    return *this;\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  Row<eT>::Row(Row<eT>&& X)\n    : Mat<eT>(arma_vec_indicator(), 2)\n    {\n    arma_extra_debug_sigprint(arma_boost::format(\"this = %x   X = %x\") % this % &X);\n    \n    access::rw(Mat<eT>::n_rows) = 1;\n    access::rw(Mat<eT>::n_cols) = X.n_cols;\n    access::rw(Mat<eT>::n_elem) = X.n_elem;\n    \n    if( ((X.mem_state == 0) && (X.n_elem > arma_config::mat_prealloc)) || (X.mem_state == 1) || (X.mem_state == 2) )\n      {\n      access::rw(Mat<eT>::mem_state) = X.mem_state;\n      access::rw(Mat<eT>::mem)       = X.mem;\n      \n      access::rw(X.n_rows)    = 1;\n      access::rw(X.n_cols)    = 0;\n      access::rw(X.n_elem)    = 0;\n      access::rw(X.mem_state) = 0;\n      access::rw(X.mem)       = 0;\n      }\n    else\n      {\n      (*this).init_cold();\n      \n      arrayops::copy( (*this).memptr(), X.mem, X.n_elem );\n      \n      if( (X.mem_state == 0) && (X.n_elem <= arma_config::mat_prealloc) )\n        {\n        access::rw(X.n_rows) = 1;\n        access::rw(X.n_cols) = 0;\n        access::rw(X.n_elem) = 0;\n        access::rw(X.mem)    = 0;\n        }\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  const Row<eT>&\n  Row<eT>::operator=(Row<eT>&& X)\n    {\n    arma_extra_debug_sigprint(arma_boost::format(\"this = %x   X = %x\") % this % &X);\n    \n    (*this).steal_mem(X);\n    \n    if( (X.mem_state == 0) && (X.n_elem <= arma_config::mat_prealloc) && (this != &X) )\n      {\n      access::rw(X.n_rows) = 1;\n      access::rw(X.n_cols) = 0;\n      access::rw(X.n_elem) = 0;\n      access::rw(X.mem)    = 0;\n      }\n    \n    return *this;\n    }\n  \n#endif\n\n\n\ntemplate<typename eT>\ninline\nRow<eT>::Row(const SpRow<eT>& X)\n  : Mat<eT>(arma_vec_indicator(), 1, X.n_elem, 1)\n  {\n  arma_extra_debug_sigprint_this(this);\n\n  arrayops::inplace_set(Mat<eT>::memptr(), eT(0), X.n_elem);\n\n  for(typename SpRow<eT>::const_iterator it = X.begin(); it != X.end(); ++it)\n    {\n    at(it.col()) = (*it);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Row<eT>&\nRow<eT>::operator=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::operator=(val);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Row<eT>&\nRow<eT>::operator=(const Row<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::operator=(X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nRow<eT>::Row(const Base<eT,T1>& X)\n  : Mat<eT>(arma_vec_indicator(), 2)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::operator=(X.get_ref());\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Row<eT>&\nRow<eT>::operator=(const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::operator=(X.get_ref());\n  \n  return *this;\n  }\n\n\n\n//! construct a row vector from a given auxiliary array\ntemplate<typename eT>\ninline\nRow<eT>::Row(eT* aux_mem, const uword aux_length, const bool copy_aux_mem, const bool strict)\n  : Mat<eT>(aux_mem, 1, aux_length, copy_aux_mem, strict)\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::vec_state) = 2;\n  }\n\n\n\n//! construct a row vector from a given auxiliary array\ntemplate<typename eT>\ninline\nRow<eT>::Row(const eT* aux_mem, const uword aux_length)\n  : Mat<eT>(aux_mem, 1, aux_length)\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::vec_state) = 2;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nRow<eT>::Row\n  (\n  const Base<typename Row<eT>::pod_type, T1>& A,\n  const Base<typename Row<eT>::pod_type, T2>& B\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::vec_state) = 2;\n  \n  Mat<eT>::init(A,B);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nRow<eT>::Row(const BaseCube<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::vec_state) = 2;\n  \n  Mat<eT>::operator=(X);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst Row<eT>&\nRow<eT>::operator=(const BaseCube<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::operator=(X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nRow<eT>::Row(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(Mat<eT>::vec_state) = 2;\n  \n  Mat<eT>::operator=(X);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Row<eT>&\nRow<eT>::operator=(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::operator=(X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nmat_injector< Row<eT> >\nRow<eT>::operator<<(const eT val)\n  {\n  return mat_injector< Row<eT> >(*this, val);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst Op<Row<eT>,op_htrans>\nRow<eT>::t() const\n  {\n  return Op<Row<eT>,op_htrans>(*this);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst Op<Row<eT>,op_htrans>\nRow<eT>::ht() const\n  {\n  return Op<Row<eT>,op_htrans>(*this);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst Op<Row<eT>,op_strans>\nRow<eT>::st() const\n  {\n  return Op<Row<eT>,op_strans>(*this);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_row<eT>\nRow<eT>::col(const uword in_col1)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (in_col1 >= Mat<eT>::n_cols), \"Row::col(): indices out of bounds or incorrectly used\");\n  \n  return subview_row<eT>(*this, 0, in_col1, 1);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_row<eT>\nRow<eT>::col(const uword in_col1) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (in_col1 >= Mat<eT>::n_cols), \"Row::col(): indices out of bounds or incorrectly used\");\n  \n  return subview_row<eT>(*this, 0, in_col1, 1);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_row<eT>\nRow<eT>::cols(const uword in_col1, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= Mat<eT>::n_cols) ), \"Row::cols(): indices out of bounds or incorrectly used\");\n  \n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n  \n  return subview_row<eT>(*this, 0, in_col1, subview_n_cols);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_row<eT>\nRow<eT>::cols(const uword in_col1, const uword in_col2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= Mat<eT>::n_cols) ), \"Row::cols(): indices out of bounds or incorrectly used\");\n  \n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n  \n  return subview_row<eT>(*this, 0, in_col1, subview_n_cols);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_row<eT>\nRow<eT>::subvec(const uword in_col1, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= Mat<eT>::n_cols) ), \"Row::subvec(): indices out of bounds or incorrectly used\");\n  \n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n  \n  return subview_row<eT>(*this, 0, in_col1, subview_n_cols);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_row<eT>\nRow<eT>::subvec(const uword in_col1, const uword in_col2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= Mat<eT>::n_cols) ), \"Row::subvec(): indices out of bounds or incorrectly used\");\n  \n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n  \n  return subview_row<eT>(*this, 0, in_col1, subview_n_cols);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_row<eT>\nRow<eT>::cols(const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subvec(col_span);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_row<eT>\nRow<eT>::cols(const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return subvec(col_span);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_row<eT>\nRow<eT>::subvec(const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool col_all = col_span.whole;\n\n  const uword local_n_cols = Mat<eT>::n_cols;\n  \n  const uword in_col1       = col_all ? 0            : col_span.a;\n  const uword in_col2       =                          col_span.b;\n  const uword subvec_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n\n  arma_debug_check( ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ), \"Row::subvec(): indices out of bounds or incorrectly used\");\n  \n  return subview_row<eT>(*this, 0, in_col1, subvec_n_cols);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_row<eT>\nRow<eT>::subvec(const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool col_all = col_span.whole;\n\n  const uword local_n_cols = Mat<eT>::n_cols;\n  \n  const uword in_col1       = col_all ? 0            : col_span.a;\n  const uword in_col2       =                          col_span.b;\n  const uword subvec_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n\n  arma_debug_check( ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ), \"Row::subvec(): indices out of bounds or incorrectly used\");\n  \n  return subview_row<eT>(*this, 0, in_col1, subvec_n_cols);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_row<eT>\nRow<eT>::operator()(const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subvec(col_span);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_row<eT>\nRow<eT>::operator()(const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return subvec(col_span);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_row<eT>\nRow<eT>::head(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > Mat<eT>::n_cols), \"Row::head(): size out of bounds\");\n  \n  return subview_row<eT>(*this, 0, 0, N);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_row<eT>\nRow<eT>::head(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > Mat<eT>::n_cols), \"Row::head(): size out of bounds\");\n  \n  return subview_row<eT>(*this, 0, 0, N);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_row<eT>\nRow<eT>::tail(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > Mat<eT>::n_cols), \"Row::tail(): size out of bounds\");\n  \n  const uword start_col = Mat<eT>::n_cols - N;\n  \n  return subview_row<eT>(*this, 0, start_col, N);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_row<eT>\nRow<eT>::tail(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > Mat<eT>::n_cols), \"Row::tail(): size out of bounds\");\n  \n  const uword start_col = Mat<eT>::n_cols - N;\n  \n  return subview_row<eT>(*this, 0, start_col, N);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_row<eT>\nRow<eT>::head_cols(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).head(N);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_row<eT>\nRow<eT>::head_cols(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).head(N);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_row<eT>\nRow<eT>::tail_cols(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).tail(N);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst subview_row<eT>\nRow<eT>::tail_cols(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).tail(N);\n  }\n\n\n\n//! remove specified columns\ntemplate<typename eT>\ninline\nvoid\nRow<eT>::shed_col(const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( col_num >= Mat<eT>::n_cols, \"Row::shed_col(): index out of bounds\");\n  \n  shed_cols(col_num, col_num);\n  }\n\n\n\n//! remove specified columns\ntemplate<typename eT>\ninline\nvoid\nRow<eT>::shed_cols(const uword in_col1, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_col1 > in_col2) || (in_col2 >= Mat<eT>::n_cols),\n    \"Row::shed_cols(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword n_keep_front = in_col1;\n  const uword n_keep_back  = Mat<eT>::n_cols - (in_col2 + 1);\n  \n  Row<eT> X(n_keep_front + n_keep_back);\n  \n        eT* X_mem = X.memptr();\n  const eT* t_mem = (*this).memptr();\n  \n  if(n_keep_front > 0)\n    {\n    arrayops::copy( X_mem, t_mem, n_keep_front );\n    }\n  \n  if(n_keep_back > 0)\n    {\n    arrayops::copy( &(X_mem[n_keep_front]), &(t_mem[in_col2+1]), n_keep_back);\n    }\n  \n  Mat<eT>::steal_mem(X);\n  }\n\n\n\n//! insert N cols at the specified col position,\n//! optionally setting the elements of the inserted cols to zero\ntemplate<typename eT>\ninline\nvoid\nRow<eT>::insert_cols(const uword col_num, const uword N, const bool set_to_zero)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword t_n_cols = Mat<eT>::n_cols;\n  \n  const uword A_n_cols = col_num;\n  const uword B_n_cols = t_n_cols - col_num;\n  \n  // insertion at col_num == n_cols is in effect an append operation\n  arma_debug_check( (col_num > t_n_cols), \"Row::insert_cols(): index out of bounds\");\n  \n  if(N > 0)\n    {\n    Row<eT> out(t_n_cols + N);\n    \n          eT* out_mem = out.memptr();\n    const eT*   t_mem = (*this).memptr();\n    \n    if(A_n_cols > 0)\n      {\n      arrayops::copy( out_mem, t_mem, A_n_cols );\n      }\n    \n    if(B_n_cols > 0)\n      {\n      arrayops::copy( &(out_mem[col_num + N]), &(t_mem[col_num]), B_n_cols );\n      }\n    \n    if(set_to_zero == true)\n      {\n      arrayops::inplace_set( &(out_mem[col_num]), eT(0), N );\n      }\n    \n    Mat<eT>::steal_mem(out);\n    }\n  }\n\n\n\n//! insert the given object at the specified col position; \n//! the given object must have one row\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nRow<eT>::insert_cols(const uword col_num, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>::insert_cols(col_num, X);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT&\nRow<eT>::at(const uword i)\n  {\n  return access::rw(Mat<eT>::mem[i]);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT&\nRow<eT>::at(const uword i) const\n  {\n  return Mat<eT>::mem[i];\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT&\nRow<eT>::at(const uword, const uword in_col)\n  {\n  return access::rw( Mat<eT>::mem[in_col] );\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nconst eT&\nRow<eT>::at(const uword, const uword in_col) const\n  {\n  return Mat<eT>::mem[in_col];\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Row<eT>::row_iterator\nRow<eT>::begin_row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (row_num >= Mat<eT>::n_rows), \"Row::begin_row(): index out of bounds\");\n  \n  return Mat<eT>::memptr();\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Row<eT>::const_row_iterator\nRow<eT>::begin_row(const uword row_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (row_num >= Mat<eT>::n_rows), \"Row::begin_row(): index out of bounds\");\n  \n  return Mat<eT>::memptr();\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Row<eT>::row_iterator\nRow<eT>::end_row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (row_num >= Mat<eT>::n_rows), \"Row::end_row(): index out of bounds\");\n  \n  return Mat<eT>::memptr() + Mat<eT>::n_cols;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename Row<eT>::const_row_iterator\nRow<eT>::end_row(const uword row_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (row_num >= Mat<eT>::n_rows), \"Row::end_row(): index out of bounds\");\n  \n  return Mat<eT>::memptr() + Mat<eT>::n_cols;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\ninline\nRow<eT>::fixed<fixed_n_elem>::fixed()\n  : Row<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\nRow<eT>::fixed<fixed_n_elem>::fixed(const fixed<fixed_n_elem>& X)\n  : Row<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n        eT* dest = (use_extra) ?   mem_local_extra : Mat<eT>::mem_local;\n  const eT* src  = (use_extra) ? X.mem_local_extra :        X.mem_local;\n  \n  arrayops::copy( dest, src, fixed_n_elem );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\nRow<eT>::fixed<fixed_n_elem>::fixed(const subview_cube<eT>& X)\n  : Row<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  Row<eT>::operator=(X);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\ntemplate<typename fill_type>\ninline\nRow<eT>::fixed<fixed_n_elem>::fixed(const fill::fill_class<fill_type>&)\n  : Row<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  if(is_same_type<fill_type, fill::fill_zeros>::yes)  (*this).zeros();\n  if(is_same_type<fill_type, fill::fill_ones >::yes)  (*this).ones();\n  if(is_same_type<fill_type, fill::fill_eye  >::yes)  (*this).eye();\n  if(is_same_type<fill_type, fill::fill_randu>::yes)  (*this).randu();\n  if(is_same_type<fill_type, fill::fill_randn>::yes)  (*this).randn();\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\ntemplate<typename T1>\narma_inline\nRow<eT>::fixed<fixed_n_elem>::fixed(const Base<eT,T1>& A)\n  : Row<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  Row<eT>::operator=(A.get_ref());\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\ntemplate<typename T1, typename T2>\narma_inline\nRow<eT>::fixed<fixed_n_elem>::fixed(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B)\n  : Row<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  Row<eT>::init(A,B);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\ninline\nRow<eT>::fixed<fixed_n_elem>::fixed(const eT* aux_mem)\n  : Row<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  eT* dest = (use_extra) ? mem_local_extra : Mat<eT>::mem_local;\n  \n  arrayops::copy( dest, aux_mem, fixed_n_elem );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\ninline\nRow<eT>::fixed<fixed_n_elem>::fixed(const char* text)\n  : Row<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  Row<eT>::operator=(text);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\ninline\nRow<eT>::fixed<fixed_n_elem>::fixed(const std::string& text)\n  : Row<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  Row<eT>::operator=(text);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\ntemplate<typename T1>\nconst Row<eT>&\nRow<eT>::fixed<fixed_n_elem>::operator=(const Base<eT,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  Row<eT>::operator=(A.get_ref());\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\nconst Row<eT>&\nRow<eT>::fixed<fixed_n_elem>::operator=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  Row<eT>::operator=(val);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\nconst Row<eT>&\nRow<eT>::fixed<fixed_n_elem>::operator=(const char* text)\n  {\n  arma_extra_debug_sigprint();\n  \n  Row<eT>::operator=(text);\n  \n  return *this; \n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\nconst Row<eT>&\nRow<eT>::fixed<fixed_n_elem>::operator=(const std::string& text)\n  {\n  arma_extra_debug_sigprint();\n  \n  Row<eT>::operator=(text);\n  \n  return *this; \n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\nconst Row<eT>&\nRow<eT>::fixed<fixed_n_elem>::operator=(const subview_cube<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Row<eT>::operator=(X);\n  \n  return *this; \n  }\n\n\n\n#if defined(ARMA_USE_CXX11)\n  \n  template<typename eT>\n  template<uword fixed_n_elem>\n  inline\n  Row<eT>::fixed<fixed_n_elem>::fixed(const std::initializer_list<eT>& list)\n    : Row<eT>( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat<eT>::mem_local) )\n    {\n    arma_extra_debug_sigprint_this(this);\n    \n    (*this).operator=(list);\n    }\n  \n  \n  \n  template<typename eT>\n  template<uword fixed_n_elem>\n  inline\n  const Row<eT>&\n  Row<eT>::fixed<fixed_n_elem>::operator=(const std::initializer_list<eT>& list)\n    {\n    arma_extra_debug_sigprint();\n    \n    const uword N = uword(list.size());\n    \n    arma_debug_check( (N > fixed_n_elem), \"Row::fixed: initialiser list is too long\" );\n    \n    eT* this_mem = (*this).memptr();\n    \n    arrayops::copy( this_mem, list.begin(), N );\n    \n    for(uword iq=N; iq < fixed_n_elem; ++iq) { this_mem[iq] = eT(0); }\n    \n    return *this;\n    }\n  \n#endif\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\nconst Row<eT>&\nRow<eT>::fixed<fixed_n_elem>::operator=(const fixed<fixed_n_elem>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(this != &X)\n    {\n          eT* dest = (use_extra) ?   mem_local_extra : Mat<eT>::mem_local;\n    const eT* src  = (use_extra) ? X.mem_local_extra :        X.mem_local;\n    \n    arrayops::copy( dest, src, fixed_n_elem );\n    }\n  \n  return *this;\n  }\n\n\n\n#if defined(ARMA_GOOD_COMPILER)\n  \n  template<typename eT>\n  template<uword fixed_n_elem>\n  template<typename T1, typename eop_type>\n  inline\n  const Row<eT>&\n  Row<eT>::fixed<fixed_n_elem>::operator=(const eOp<T1, eop_type>& X)\n    {\n    arma_extra_debug_sigprint();\n    \n    arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n    \n    const bool bad_alias = (eOp<T1, eop_type>::proxy_type::has_subview  &&  X.P.is_alias(*this));\n    \n    if(bad_alias == false)\n      {\n      arma_debug_assert_same_size(uword(1), fixed_n_elem, X.get_n_rows(), X.get_n_cols(), \"Row::fixed::operator=\");\n      \n      eop_type::apply(*this, X);\n      }\n    else\n      {\n      arma_extra_debug_print(\"bad_alias = true\");\n      \n      Row<eT> tmp(X);\n      \n      (*this) = tmp;\n      }\n    \n    return *this;\n    }\n  \n  \n  \n  template<typename eT>\n  template<uword fixed_n_elem>\n  template<typename T1, typename T2, typename eglue_type>\n  inline\n  const Row<eT>&\n  Row<eT>::fixed<fixed_n_elem>::operator=(const eGlue<T1, T2, eglue_type>& X)\n    {\n    arma_extra_debug_sigprint();\n    \n    arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n    arma_type_check(( is_same_type< eT, typename T2::elem_type >::no ));\n    \n    const bool bad_alias =\n      (\n      (eGlue<T1, T2, eglue_type>::proxy1_type::has_subview  &&  X.P1.is_alias(*this))\n      ||\n      (eGlue<T1, T2, eglue_type>::proxy2_type::has_subview  &&  X.P2.is_alias(*this))\n      );\n    \n    if(bad_alias == false)\n      {\n      arma_debug_assert_same_size(uword(1), fixed_n_elem, X.get_n_rows(), X.get_n_cols(), \"Row::fixed::operator=\");\n      \n      eglue_type::apply(*this, X);\n      }\n    else\n      {\n      arma_extra_debug_print(\"bad_alias = true\");\n      \n      Row<eT> tmp(X);\n      \n      (*this) = tmp;\n      }\n    \n    return *this;\n    }\n  \n#endif\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\nconst Op< typename Row<eT>::template fixed<fixed_n_elem>::Row_fixed_type, op_htrans >\nRow<eT>::fixed<fixed_n_elem>::t() const\n  {\n  return Op< typename Row<eT>::template fixed<fixed_n_elem>::Row_fixed_type, op_htrans >(*this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\nconst Op< typename Row<eT>::template fixed<fixed_n_elem>::Row_fixed_type, op_htrans >\nRow<eT>::fixed<fixed_n_elem>::ht() const\n  {\n  return Op< typename Row<eT>::template fixed<fixed_n_elem>::Row_fixed_type, op_htrans >(*this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\nconst Op< typename Row<eT>::template fixed<fixed_n_elem>::Row_fixed_type, op_strans >\nRow<eT>::fixed<fixed_n_elem>::st() const\n  {\n  return Op< typename Row<eT>::template fixed<fixed_n_elem>::Row_fixed_type, op_strans >(*this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\nconst eT&\nRow<eT>::fixed<fixed_n_elem>::at_alt(const uword ii) const\n  {\n  #if defined(ARMA_HAVE_ALIGNED_ATTRIBUTE)\n  \n    return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];\n    \n  #else\n    const eT* mem_aligned = (use_extra) ? mem_local_extra : Mat<eT>::mem_local;\n    \n    memory::mark_as_aligned(mem_aligned);\n    \n    return mem_aligned[ii];\n  #endif\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\neT&\nRow<eT>::fixed<fixed_n_elem>::operator[] (const uword ii)\n  {\n  return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\nconst eT&\nRow<eT>::fixed<fixed_n_elem>::operator[] (const uword ii) const\n  {\n  return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\neT&\nRow<eT>::fixed<fixed_n_elem>::at(const uword ii)\n  {\n  return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\nconst eT&\nRow<eT>::fixed<fixed_n_elem>::at(const uword ii) const\n  {\n  return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\neT&\nRow<eT>::fixed<fixed_n_elem>::operator() (const uword ii)\n  {\n  arma_debug_check( (ii >= fixed_n_elem), \"Row::operator(): index out of bounds\");\n  \n  return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\nconst eT&\nRow<eT>::fixed<fixed_n_elem>::operator() (const uword ii) const\n  {\n  arma_debug_check( (ii >= fixed_n_elem), \"Row::operator(): index out of bounds\");\n  \n  return (use_extra) ? mem_local_extra[ii] : Mat<eT>::mem_local[ii];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\neT&\nRow<eT>::fixed<fixed_n_elem>::at(const uword, const uword in_col)\n  {\n  return (use_extra) ? mem_local_extra[in_col] : Mat<eT>::mem_local[in_col];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\nconst eT&\nRow<eT>::fixed<fixed_n_elem>::at(const uword, const uword in_col) const\n  {\n  return (use_extra) ? mem_local_extra[in_col] : Mat<eT>::mem_local[in_col];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\neT&\nRow<eT>::fixed<fixed_n_elem>::operator() (const uword in_row, const uword in_col)\n  {\n  arma_debug_check( ((in_row > 0) || (in_col >= fixed_n_elem)), \"Row::operator(): index out of bounds\" );\n  \n  return (use_extra) ? mem_local_extra[in_col] : Mat<eT>::mem_local[in_col];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\nconst eT&\nRow<eT>::fixed<fixed_n_elem>::operator() (const uword in_row, const uword in_col) const\n  {\n  arma_debug_check( ((in_row > 0) || (in_col >= fixed_n_elem)), \"Row::operator(): index out of bounds\" );\n  \n  return (use_extra) ? mem_local_extra[in_col] : Mat<eT>::mem_local[in_col];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\neT*\nRow<eT>::fixed<fixed_n_elem>::memptr()\n  {\n  return (use_extra) ? mem_local_extra : Mat<eT>::mem_local;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_inline\narma_warn_unused\nconst eT*\nRow<eT>::fixed<fixed_n_elem>::memptr() const\n  {\n  return (use_extra) ? mem_local_extra : Mat<eT>::mem_local;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_hot\ninline\nconst Row<eT>&\nRow<eT>::fixed<fixed_n_elem>::fill(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat<eT>::mem_local[0]);\n  \n  arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, val );\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_hot\ninline\nconst Row<eT>&\nRow<eT>::fixed<fixed_n_elem>::zeros()\n  {\n  arma_extra_debug_sigprint();\n  \n  eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat<eT>::mem_local[0]);\n  \n  arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, eT(0) );\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword fixed_n_elem>\narma_hot\ninline\nconst Row<eT>&\nRow<eT>::fixed<fixed_n_elem>::ones()\n  {\n  arma_extra_debug_sigprint();\n  \n  eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat<eT>::mem_local[0]);\n  \n  arrayops::inplace_set_fixed<eT,fixed_n_elem>( mem_use, eT(1) );\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nRow<eT>::Row(const arma_fixed_indicator&, const uword in_n_elem, const eT* in_mem)\n  : Mat<eT>(arma_fixed_indicator(), 1, in_n_elem, 2, in_mem)\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\n#ifdef ARMA_EXTRA_ROW_MEAT\n  #include ARMA_INCFILE_WRAP(ARMA_EXTRA_ROW_MEAT)\n#endif\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SizeCube_bones.hpp",
    "content": "// Copyright (C) 2013-2014 Conrad Sanderson\n// Copyright (C) 2013-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup SizeCube\n//! @{\n\n\n\nclass SizeCube\n  {\n  public:\n  \n  const uword n_rows;\n  const uword n_cols;\n  const uword n_slices;\n  \n  inline SizeCube(const uword in_n_rows = 0, const uword in_n_cols = 0, const uword in_n_slices = 0);\n  \n  // inline operator SizeMat () const;\n  \n  inline bool operator==(const SizeCube& s) const;\n  inline bool operator!=(const SizeCube& s) const;\n  \n  inline bool operator==(const SizeMat& s) const;\n  inline bool operator!=(const SizeMat& s) const;\n  \n  inline void print(const std::string extra_text = \"\") const;\n  inline void print(std::ostream& user_stream, const std::string extra_text = \"\") const;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SizeCube_meat.hpp",
    "content": "// Copyright (C) 2013-2014 Conrad Sanderson\n// Copyright (C) 2013-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup SizeCube\n//! @{\n\n\n\ninline\nSizeCube::SizeCube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices)\n  : n_rows  (in_n_rows  )\n  , n_cols  (in_n_cols  )\n  , n_slices(in_n_slices)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\n// inline\n// SizeCube::operator SizeMat () const \n//   {\n//   arma_debug_check( (n_slices != 1), \"SizeCube: n_slices != 1, hence cube size cannot be interpreted as matrix size\" );\n//   \n//   return SizeMat(n_rows, n_cols);\n//   }\n\n\n\ninline\nbool\nSizeCube::operator==(const SizeCube& s) const\n  {\n  if(n_rows   != s.n_rows  )  { return false; }\n  \n  if(n_cols   != s.n_cols  )  { return false; }\n  \n  if(n_slices != s.n_slices)  { return false; }\n  \n  return true;\n  }\n\n\n\ninline\nbool\nSizeCube::operator!=(const SizeCube& s) const\n  {\n  if(n_rows   != s.n_rows  )  { return true; }\n  \n  if(n_cols   != s.n_cols  )  { return true; }\n  \n  if(n_slices != s.n_slices)  { return true; }\n  \n  return false;\n  }\n\n\n\ninline\nbool\nSizeCube::operator==(const SizeMat& s) const\n  {\n  if(n_rows   != s.n_rows)  { return false; }\n  \n  if(n_cols   != s.n_cols)  { return false; }\n  \n  if(n_slices != uword(1))  { return false; }\n  \n  return true;\n  }\n\n\n\ninline\nbool\nSizeCube::operator!=(const SizeMat& s) const\n  {\n  if(n_rows   != s.n_rows)  { return true; }\n  \n  if(n_cols   != s.n_cols)  { return true; }\n  \n  if(n_slices != uword(1))  { return true; }\n  \n  return false;\n  }\n\n\n\ninline\nvoid\nSizeCube::print(const std::string extra_text) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = ARMA_DEFAULT_OSTREAM.width();\n    \n    ARMA_DEFAULT_OSTREAM << extra_text << ' ';\n  \n    ARMA_DEFAULT_OSTREAM.width(orig_width);\n    }\n  \n  arma_ostream::print(ARMA_DEFAULT_OSTREAM, *this);\n  }\n\n\n\ninline\nvoid\nSizeCube::print(std::ostream& user_stream, const std::string extra_text) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = user_stream.width();\n    \n    user_stream << extra_text << ' ';\n    \n    user_stream.width(orig_width);\n    }\n  \n  arma_ostream::print(user_stream, *this);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SizeMat_bones.hpp",
    "content": "// Copyright (C) 2013-2014 Conrad Sanderson\n// Copyright (C) 2013-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup SizeMat\n//! @{\n\n\n\nclass SizeMat\n  {\n  public:\n  \n  const uword n_rows;\n  const uword n_cols;\n  \n  inline SizeMat(const uword in_n_rows = 0, const uword in_n_cols = 0);\n  \n  // inline operator SizeCube () const;\n  \n  inline bool operator==(const SizeMat& s) const;\n  inline bool operator!=(const SizeMat& s) const;\n  \n  inline bool operator==(const SizeCube& s) const;\n  inline bool operator!=(const SizeCube& s) const;\n  \n  inline void print(const std::string extra_text = \"\") const;\n  inline void print(std::ostream& user_stream, const std::string extra_text = \"\") const;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SizeMat_meat.hpp",
    "content": "// Copyright (C) 2013-2014 Conrad Sanderson\n// Copyright (C) 2013-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup SizeMat\n//! @{\n\n\n\ninline\nSizeMat::SizeMat(const uword in_n_rows, const uword in_n_cols)\n  : n_rows(in_n_rows)\n  , n_cols(in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\n// inline\n// SizeMat::operator SizeCube () const \n//   {\n//   return SizeCube(n_rows, n_cols, 1);\n//   }\n\n\n\ninline\nbool\nSizeMat::operator==(const SizeMat& s) const\n  {\n  if(n_rows != s.n_rows)  { return false; }\n  \n  if(n_cols != s.n_cols)  { return false; }\n  \n  return true;\n  }\n\n\n\ninline\nbool\nSizeMat::operator!=(const SizeMat& s) const\n  {\n  if(n_rows != s.n_rows)  { return true; }\n  \n  if(n_cols != s.n_cols)  { return true; }\n  \n  return false;\n  }\n\n\n\ninline\nbool\nSizeMat::operator==(const SizeCube& s) const\n  {\n  if(n_rows   != s.n_rows  )  { return false; }\n  \n  if(n_cols   != s.n_cols  )  { return false; }\n  \n  if(uword(1) != s.n_slices)  { return false; }\n  \n  return true;\n  }\n\n\n\ninline\nbool\nSizeMat::operator!=(const SizeCube& s) const\n  {\n  if(n_rows   != s.n_rows  )  { return true; }\n  \n  if(n_cols   != s.n_cols  )  { return true; }\n  \n  if(uword(1) != s.n_slices)  { return true; }\n  \n  return false;\n  }\n\n\n\ninline\nvoid\nSizeMat::print(const std::string extra_text) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = ARMA_DEFAULT_OSTREAM.width();\n    \n    ARMA_DEFAULT_OSTREAM << extra_text << ' ';\n  \n    ARMA_DEFAULT_OSTREAM.width(orig_width);\n    }\n  \n  arma_ostream::print(ARMA_DEFAULT_OSTREAM, *this);\n  }\n\n\n\ninline\nvoid\nSizeMat::print(std::ostream& user_stream, const std::string extra_text) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = user_stream.width();\n    \n    user_stream << extra_text << ' ';\n    \n    user_stream.width(orig_width);\n    }\n  \n  arma_ostream::print(user_stream, *this);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpBase_bones.hpp",
    "content": "// Copyright (C) 2012-2014 Conrad Sanderson\n// Copyright (C) 2012-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup SpBase\n//! @{\n\n\n\ntemplate<typename elem_type, typename derived>\nstruct SpBase_eval_SpMat\n  {\n  inline const derived& eval() const;\n  };\n\n\ntemplate<typename elem_type, typename derived>\nstruct SpBase_eval_expr\n  {\n  inline SpMat<elem_type> eval() const;   //!< force the immediate evaluation of a delayed expression\n  };\n\n\ntemplate<typename elem_type, typename derived, bool condition>\nstruct SpBase_eval {};\n\ntemplate<typename elem_type, typename derived>\nstruct SpBase_eval<elem_type, derived, true>  { typedef SpBase_eval_SpMat<elem_type, derived> result; };\n\ntemplate<typename elem_type, typename derived>\nstruct SpBase_eval<elem_type, derived, false> { typedef SpBase_eval_expr<elem_type, derived>  result; };\n\n\n\ntemplate<typename elem_type, typename derived>\nstruct SpBase\n  : public SpBase_eval<elem_type, derived, is_SpMat<derived>::value>::result\n  {\n  arma_inline const derived& get_ref() const;\n  \n  inline const SpOp<derived,spop_htrans>  t() const;  //!< Hermitian transpose\n  inline const SpOp<derived,spop_htrans> ht() const;  //!< Hermitian transpose\n  inline const SpOp<derived,spop_strans> st() const;  //!< simple transpose\n  \n  inline void print(const std::string extra_text = \"\") const;\n  inline void print(std::ostream& user_stream, const std::string extra_text = \"\") const;\n  \n  inline void raw_print(const std::string extra_text = \"\") const;\n  inline void raw_print(std::ostream& user_stream, const std::string extra_text = \"\") const;\n  \n  inline void print_dense(const std::string extra_text = \"\") const;\n  inline void print_dense(std::ostream& user_stream, const std::string extra_text = \"\") const;\n  \n  inline void raw_print_dense(const std::string extra_text = \"\") const;\n  inline void raw_print_dense(std::ostream& user_stream, const std::string extra_text = \"\") const;\n  \n  inline arma_warn_unused elem_type min() const;\n  inline arma_warn_unused elem_type max() const;\n  \n  inline elem_type min(uword& index_of_min_val) const;\n  inline elem_type max(uword& index_of_max_val) const;\n  \n  inline elem_type min(uword& row_of_min_val, uword& col_of_min_val) const;\n  inline elem_type max(uword& row_of_max_val, uword& col_of_max_val) const;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpBase_meat.hpp",
    "content": "// Copyright (C) 2012-2014 Conrad Sanderson\n// Copyright (C) 2012-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup SpBase\n//! @{\n\n\n\ntemplate<typename elem_type, typename derived>\narma_inline\nconst derived&\nSpBase<elem_type,derived>::get_ref() const\n  {\n  return static_cast<const derived&>(*this);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nconst SpOp<derived, spop_htrans>\nSpBase<elem_type,derived>::t() const\n  {\n  return SpOp<derived,spop_htrans>( (*this).get_ref() );\n  }\n\n\ntemplate<typename elem_type, typename derived>\ninline\nconst SpOp<derived, spop_htrans>\nSpBase<elem_type,derived>::ht() const\n  {\n  return SpOp<derived, spop_htrans>( (*this).get_ref() );\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nconst SpOp<derived, spop_strans>\nSpBase<elem_type,derived>::st() const\n  {\n  return SpOp<derived, spop_strans>( (*this).get_ref() );\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nvoid\nSpBase<elem_type,derived>::print(const std::string extra_text) const\n  {\n  const unwrap_spmat<derived> tmp( (*this).get_ref() );\n  \n  tmp.M.impl_print(extra_text);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nvoid\nSpBase<elem_type,derived>::print(std::ostream& user_stream, const std::string extra_text) const\n  {\n  const unwrap_spmat<derived> tmp( (*this).get_ref() );\n  \n  tmp.M.impl_print(user_stream, extra_text);\n  }\n  \n\n\ntemplate<typename elem_type, typename derived>\ninline\nvoid\nSpBase<elem_type,derived>::raw_print(const std::string extra_text) const\n  {\n  const unwrap_spmat<derived> tmp( (*this).get_ref() );\n  \n  tmp.M.impl_raw_print(extra_text);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nvoid\nSpBase<elem_type,derived>::raw_print(std::ostream& user_stream, const std::string extra_text) const\n  {\n  const unwrap_spmat<derived> tmp( (*this).get_ref() );\n  \n  tmp.M.impl_raw_print(user_stream, extra_text);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nvoid\nSpBase<elem_type, derived>::print_dense(const std::string extra_text) const\n  {\n  const unwrap_spmat<derived> tmp( (*this).get_ref() );\n\n  tmp.M.impl_print_dense(extra_text);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nvoid\nSpBase<elem_type, derived>::print_dense(std::ostream& user_stream, const std::string extra_text) const\n  {\n  const unwrap_spmat<derived> tmp( (*this).get_ref() );\n\n  tmp.M.impl_print_dense(user_stream, extra_text);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nvoid\nSpBase<elem_type, derived>::raw_print_dense(const std::string extra_text) const\n  {\n  const unwrap_spmat<derived> tmp( (*this).get_ref() );\n\n  tmp.M.impl_raw_print_dense(extra_text);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nvoid\nSpBase<elem_type, derived>::raw_print_dense(std::ostream& user_stream, const std::string extra_text) const\n  {\n  const unwrap_spmat<derived> tmp( (*this).get_ref() );\n\n  tmp.M.impl_raw_print_dense(user_stream, extra_text);\n  }\n\n\n\n//\n// extra functions defined in SpBase_eval_SpMat\n\ntemplate<typename elem_type, typename derived>\ninline\nconst derived&\nSpBase_eval_SpMat<elem_type, derived>::eval() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return static_cast<const derived&>(*this);\n  }\n\n\n\n//\n// extra functions defined in SpBase_eval_expr\n\ntemplate<typename elem_type, typename derived>\ninline\nSpMat<elem_type>\nSpBase_eval_expr<elem_type, derived>::eval() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpMat<elem_type>( static_cast<const derived&>(*this) );\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\narma_warn_unused\nelem_type\nSpBase<elem_type, derived>::min() const\n  {\n  return spop_min::min( (*this).get_ref() );\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\narma_warn_unused\nelem_type\nSpBase<elem_type, derived>::max() const\n  {\n  return spop_max::max( (*this).get_ref() );\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nelem_type\nSpBase<elem_type, derived>::min(uword& index_of_min_val) const\n  {\n  const SpProxy<derived> P( (*this).get_ref() );\n  \n  return spop_min::min_with_index(P, index_of_min_val);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nelem_type\nSpBase<elem_type, derived>::max(uword& index_of_max_val) const\n  {\n  const SpProxy<derived> P( (*this).get_ref() );\n  \n  return spop_max::max_with_index(P, index_of_max_val);\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nelem_type\nSpBase<elem_type, derived>::min(uword& row_of_min_val, uword& col_of_min_val) const\n  {\n  const SpProxy<derived> P( (*this).get_ref() );\n  \n  uword index;\n  \n  const elem_type val = spop_min::min_with_index(P, index);\n  \n  const uword local_n_rows = P.get_n_rows();\n  \n  row_of_min_val = index % local_n_rows;\n  col_of_min_val = index / local_n_rows;\n  \n  return val;\n  }\n\n\n\ntemplate<typename elem_type, typename derived>\ninline\nelem_type\nSpBase<elem_type, derived>::max(uword& row_of_max_val, uword& col_of_max_val) const\n  {\n  const SpProxy<derived> P( (*this).get_ref() );\n  \n  uword index;\n  \n  const elem_type val = spop_max::max_with_index(P, index);\n  \n  const uword local_n_rows = P.get_n_rows();\n  \n  row_of_max_val = index % local_n_rows;\n  col_of_max_val = index / local_n_rows;\n  \n  return val;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpCol_bones.hpp",
    "content": "// Copyright (C) 2011-2012 Ryan Curtin\n// Copyright (C) 2011 Matthew Amidon\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup SpCol\n//! @{\n\n//! Class for sparse column vectors (matrices with only one column)\n\ntemplate<typename eT>\nclass SpCol : public SpMat<eT>\n  {\n  public:\n  \n  typedef eT                                elem_type;\n  typedef typename get_pod_type<eT>::result pod_type;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  \n  inline          SpCol();\n  inline explicit SpCol(const uword n_elem);\n  inline          SpCol(const uword in_rows, const uword in_cols);\n  \n  inline                  SpCol(const char*        text);\n  inline const SpCol& operator=(const char*        text);\n  \n  inline                  SpCol(const std::string& text);\n  inline const SpCol& operator=(const std::string& text);\n  \n  inline const SpCol& operator=(const eT val);\n  \n  template<typename T1> inline                  SpCol(const Base<eT,T1>& X);\n  template<typename T1> inline const SpCol& operator=(const Base<eT,T1>& X);\n  \n  template<typename T1> inline                  SpCol(const SpBase<eT,T1>& X);\n  template<typename T1> inline const SpCol& operator=(const SpBase<eT,T1>& X);\n  \n  template<typename T1, typename T2>\n  inline explicit SpCol(const SpBase<pod_type,T1>& A, const SpBase<pod_type,T2>& B);\n  \n  inline void shed_row (const uword row_num);\n  inline void shed_rows(const uword in_row1, const uword in_row2);\n  \n  // inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero = true);\n  \n  \n  typedef typename SpMat<eT>::iterator       row_iterator;\n  typedef typename SpMat<eT>::const_iterator const_row_iterator;\n  \n  inline       row_iterator begin_row(const uword row_num = 0);\n  inline const_row_iterator begin_row(const uword row_num = 0) const;\n  \n  inline       row_iterator end_row  (const uword row_num = 0);\n  inline const_row_iterator end_row  (const uword row_num = 0) const;\n  \n  \n  #ifdef ARMA_EXTRA_SPCOL_PROTO\n    #include ARMA_INCFILE_WRAP(ARMA_EXTRA_SPCOL_PROTO)\n  #endif\n  };\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpCol_meat.hpp",
    "content": "// Copyright (C) 2011-2012 Ryan Curtin\n// Copyright (C) 2015 Conrad Sanderson\n// Copyright (C) 2011 Matthew Amidon\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup SpCol\n//! @{\n\n\n//! construct an empty column vector\ntemplate<typename eT>\ninline\nSpCol<eT>::SpCol()\n  : SpMat<eT>(0, 1)\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 1;\n  }\n\n\n\n//! construct a column vector with the specified number of elements\ntemplate<typename eT>\ninline\nSpCol<eT>::SpCol(const uword in_n_elem)\n  : SpMat<eT>(in_n_elem, 1)\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 1;\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpCol<eT>::SpCol(const uword in_n_rows, const uword in_n_cols)\n  : SpMat<eT>(in_n_rows, in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check((in_n_cols != 1), \"SpCol::SpCol(): must have only one column\");\n\n  access::rw(SpMat<eT>::vec_state) = 1;\n  }\n\n\n\n//! construct a column vector from specified text\ntemplate<typename eT>\ninline\nSpCol<eT>::SpCol(const char* text)\n  : SpMat<eT>(text)\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 1;\n\n  arma_debug_check((SpMat<eT>::n_cols != 1), \"SpCol::SpCol(): must have only one column\");\n  }\n\n\n\n//! construct a column vector from specified text\ntemplate<typename eT>\ninline\nconst SpCol<eT>&\nSpCol<eT>::operator=(const char* text)\n  {\n  arma_extra_debug_sigprint();\n\n  SpMat<eT>::init(std::string(text));\n\n  access::rw(SpMat<eT>::vec_state) = 1;\n\n  return *this;\n  }\n\n\n\n//! construct a column vector from specified text\ntemplate<typename eT>\ninline\nSpCol<eT>::SpCol(const std::string& text)\n  : SpMat<eT>(text)\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 1;\n\n  arma_debug_check((SpMat<eT>::n_cols != 1), \"SpCol::SpCol(): must have only one column\");\n  }\n\n\n\n//! construct a column vector from specified text\ntemplate<typename eT>\ninline\nconst SpCol<eT>&\nSpCol<eT>::operator=(const std::string& text)\n  {\n  arma_extra_debug_sigprint();\n\n  SpMat<eT>::init(std::string(text));\n\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpCol<eT>&\nSpCol<eT>::operator=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n\n  SpMat<eT>::operator=(val);\n\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nSpCol<eT>::SpCol(const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 1;\n\n  SpMat<eT>::operator=(X.get_ref());\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpCol<eT>&\nSpCol<eT>::operator=(const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 1;\n\n  SpMat<eT>::operator=(X.get_ref());\n\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nSpCol<eT>::SpCol(const SpBase<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 1;\n\n  SpMat<eT>::operator=(X.get_ref());\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpCol<eT>&\nSpCol<eT>::operator=(const SpBase<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 1;\n\n  SpMat<eT>::operator=(X.get_ref());\n\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nSpCol<eT>::SpCol\n  (\n  const SpBase<typename SpCol<eT>::pod_type, T1>& A,\n  const SpBase<typename SpCol<eT>::pod_type, T2>& B\n  )\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 1;\n\n  SpMat<eT>::init(A,B);\n  }\n\n\n\n//! remove specified row\ntemplate<typename eT>\ninline\nvoid\nSpCol<eT>::shed_row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check( row_num >= SpMat<eT>::n_rows, \"SpCol::shed_row(): out of bounds\");\n  \n  shed_rows(row_num, row_num);\n  }\n\n\n\n//! remove specified rows\ntemplate<typename eT>\ninline\nvoid\nSpCol<eT>::shed_rows(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_row2 >= SpMat<eT>::n_rows),\n    \"SpCol::shed_rows(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword diff = (in_row2 - in_row1 + 1);\n\n  // This is easy because everything is in one column.\n  uword start = 0, end = 0;\n  bool start_found = false, end_found = false;\n  for(uword i = 0; i < SpMat<eT>::n_nonzero; ++i)\n    {\n    // Start position found?\n    if (SpMat<eT>::row_indices[i] >= in_row1 && !start_found)\n      {\n      start = i;\n      start_found = true;\n      }\n\n    // End position found?\n    if (SpMat<eT>::row_indices[i] > in_row2)\n      {\n      end = i;\n      end_found = true;\n      break;\n      }\n    }\n\n  if (!end_found)\n    {\n    end = SpMat<eT>::n_nonzero;\n    }\n\n  // Now we can make the copy.\n  if (start != end)\n    {\n    const uword elem_diff = end - start;\n\n    eT*    new_values      = memory::acquire_chunked<eT>   (SpMat<eT>::n_nonzero - elem_diff);\n    uword* new_row_indices = memory::acquire_chunked<uword>(SpMat<eT>::n_nonzero - elem_diff);\n\n    // Copy before the section we are dropping (if it exists).\n    if (start > 0)\n      {\n      arrayops::copy(new_values, SpMat<eT>::values, start);\n      arrayops::copy(new_row_indices, SpMat<eT>::row_indices, start);\n      }\n\n    // Copy after the section we are dropping (if it exists).\n    if (end != SpMat<eT>::n_nonzero)\n      {\n      arrayops::copy(new_values + start, SpMat<eT>::values + end, (SpMat<eT>::n_nonzero - end));\n      arrayops::copy(new_row_indices + start, SpMat<eT>::row_indices + end, (SpMat<eT>::n_nonzero - end));\n      arrayops::inplace_minus(new_row_indices + start, diff, (SpMat<eT>::n_nonzero - end));\n      }\n\n    memory::release(SpMat<eT>::values);\n    memory::release(SpMat<eT>::row_indices);\n\n    access::rw(SpMat<eT>::values) = new_values;\n    access::rw(SpMat<eT>::row_indices) = new_row_indices;\n\n    access::rw(SpMat<eT>::n_nonzero) -= elem_diff;\n    access::rw(SpMat<eT>::col_ptrs[1]) -= elem_diff;\n    }\n\n  access::rw(SpMat<eT>::n_rows) -= diff;\n  access::rw(SpMat<eT>::n_elem) -= diff;\n  }\n\n\n\n// //! insert N rows at the specified row position,\n// //! optionally setting the elements of the inserted rows to zero\n// template<typename eT>\n// inline\n// void\n// SpCol<eT>::insert_rows(const uword row_num, const uword N, const bool set_to_zero)\n//   {\n//   arma_extra_debug_sigprint();\n// \n//   arma_debug_check(set_to_zero == false, \"SpCol::insert_rows(): cannot set nonzero values\");\n// \n//   arma_debug_check((row_num > SpMat<eT>::n_rows), \"SpCol::insert_rows(): out of bounds\");\n// \n//   for(uword row = 0; row < SpMat<eT>::n_rows; ++row)\n//     {\n//     if (SpMat<eT>::row_indices[row] >= row_num)\n//       {\n//       access::rw(SpMat<eT>::row_indices[row]) += N;\n//       }\n//     }\n// \n//   access::rw(SpMat<eT>::n_rows) += N;\n//   access::rw(SpMat<eT>::n_elem) += N;\n//   }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpCol<eT>::row_iterator\nSpCol<eT>::begin_row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (row_num >= SpMat<eT>::n_rows), \"SpCol::begin_row(): index out of bounds\");\n  \n  return row_iterator(*this, row_num, 0);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpCol<eT>::const_row_iterator\nSpCol<eT>::begin_row(const uword row_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (row_num >= SpMat<eT>::n_rows), \"SpCol::begin_row(): index out of bounds\");\n  \n  return const_row_iterator(*this, row_num, 0);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpCol<eT>::row_iterator\nSpCol<eT>::end_row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (row_num >= SpMat<eT>::n_rows), \"SpCol::end_row(): index out of bounds\");\n  \n  return row_iterator(*this, row_num + 1, 0);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpCol<eT>::const_row_iterator\nSpCol<eT>::end_row(const uword row_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (row_num >= SpMat<eT>::n_rows), \"SpCol::end_row(): index out of bounds\");\n  \n  return const_row_iterator(*this, row_num + 1, 0);\n  }\n\n\n\n#ifdef ARMA_EXTRA_SPCOL_MEAT\n  #include ARMA_INCFILE_WRAP(ARMA_EXTRA_SPCOL_MEAT)\n#endif\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpGlue_bones.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup SpGlue\n//! @{\n\n\n\ntemplate<typename T1, typename T2, typename spglue_type>\nclass SpGlue : public SpBase<typename T1::elem_type, SpGlue<T1, T2, spglue_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool is_row = ( (T1::is_row || T2::is_row) && is_spglue_elem<spglue_type>::value ) || ( (is_spglue_times<spglue_type>::value || is_spglue_times2<spglue_type>::value) ? T1::is_row : false );\n  static const bool is_col = ( (T1::is_col || T2::is_col) && is_spglue_elem<spglue_type>::value ) || ( (is_spglue_times<spglue_type>::value || is_spglue_times2<spglue_type>::value) ? T2::is_col : false );\n  \n  arma_inline  SpGlue(const T1& in_A, const T2& in_B);\n  arma_inline  SpGlue(const T1& in_A, const T2& in_B, const elem_type in_aux);\n  arma_inline ~SpGlue();\n  \n  const T1&       A;    //!< first operand\n  const T2&       B;    //!< second operand\n        elem_type aux;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpGlue_meat.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup SpGlue\n//! @{\n\n\n\ntemplate<typename T1, typename T2, typename spglue_type>\ninline\nSpGlue<T1,T2,spglue_type>::SpGlue(const T1& in_A, const T2& in_B)\n  : A(in_A)\n  , B(in_B)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename T2, typename spglue_type>\ninline\nSpGlue<T1,T2,spglue_type>::SpGlue(const T1& in_A, const T2& in_B, const typename T1::elem_type in_aux)\n  : A(in_A)\n  , B(in_B)\n  , aux(in_aux)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename T2, typename spglue_type>\ninline\nSpGlue<T1,T2,spglue_type>::~SpGlue()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpMat_bones.hpp",
    "content": "// Copyright (C) 2011-2014 Ryan Curtin\n// Copyright (C) 2012-2015 Conrad Sanderson\n// Copyright (C) 2011 Matthew Amidon\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n//! \\addtogroup SpMat\n//! @{\n\n//! Sparse matrix class, with data stored in compressed sparse column (CSC) format\n\ntemplate<typename eT>\nclass SpMat : public SpBase< eT, SpMat<eT> >\n  {\n  public:\n  \n  typedef eT                                elem_type;  //!< the type of elements stored in the matrix\n  typedef typename get_pod_type<eT>::result pod_type;   //!< if eT is non-complex, pod_type is the same as eT; otherwise, pod_type is the underlying type used by std::complex\n  \n  static const bool is_row = false;\n  static const bool is_col = false;\n  \n  const uword n_rows;    //!< number of rows in the matrix (read-only)\n  const uword n_cols;    //!< number of columns in the matrix (read-only)\n  const uword n_elem;    //!< number of elements in the matrix (read-only)\n  const uword n_nonzero; //!< number of nonzero elements in the matrix (read-only)\n  const uword vec_state; //!< 0: matrix; 1: column vector; 2: row vector\n  \n  // So that SpValProxy can call add_element() and delete_element().\n  friend class SpValProxy<SpMat<eT> >;\n  friend class SpSubview<eT>;\n  \n  /**\n   * The memory used to store the values of the matrix.\n   * In accordance with the CSC format, this stores only the actual values.\n   * The correct locations of the values are assembled from the row indices\n   * and the column pointers.\n   * \n   * The length of this array is (n_nonzero + 1); the final value ensures\n   * the integrity of iterators.  If you are planning on resizing this vector,\n   * it's probably best to use mem_resize() instead, which automatically sets\n   * the length to (n_nonzero + 1).  If you need to allocate the memory yourself\n   * for some reason, be sure to set values[n_nonzero] to 0.\n   */\n  arma_aligned const eT* const values;\n  \n  /**\n   * The row indices of each value.  row_indices[i] is the row of values[i].\n   * \n   * The length of this array is (n_nonzero + 1); the final value ensures\n   * the integrity of iterators.  If you are planning on resizing this vector,\n   * it's probably best to use mem_resize() instead.  If you need to allocate\n   * the memory yourself for some reason, be sure to set row_indices[n_nonzero] to 0.\n   */\n  arma_aligned const uword* const row_indices;\n  \n  /**\n   * The column pointers.  This stores the index of the first item in column i.\n   * That is, values[col_ptrs[i]] is the first value in column i, and it is in\n   * the row indicated by row_indices[col_ptrs[i]].\n   * \n   * This array is of length (n_cols + 2); the element col_ptrs[n_cols] should\n   * be equal to n_nonzero, and the element col_ptrs[n_cols + 1] is an invalid\n   * very large value that ensures the integrity of iterators.\n   * \n   * The col_ptrs array is set by the init() function (which is called by the\n   * constructors and set_size() and other functions that set the size of the\n   * matrix), so allocating col_ptrs by hand should not be necessary.\n   */\n  arma_aligned const uword* const col_ptrs;\n  \n  inline  SpMat();  //! Size will be 0x0 (empty).\n  inline ~SpMat();\n  \n  inline  SpMat(const uword in_rows, const uword in_cols);\n  \n  inline                  SpMat(const char*        text);\n  inline const SpMat& operator=(const char*        text);\n  inline                  SpMat(const std::string& text);\n  inline const SpMat& operator=(const std::string& text);\n  inline                  SpMat(const SpMat<eT>&   x);\n\n  \n  #if defined(ARMA_USE_CXX11)\n  inline                  SpMat(SpMat&& m);\n  inline const SpMat& operator=(SpMat&& m);\n  #endif\n  \n  template<typename T1, typename T2, typename T3>\n  inline SpMat(const Base<uword,T1>& rowind, const Base<uword,T2>& colptr, const Base<eT,T3>& values, const uword n_rows, const uword n_cols);\n  \n  template<typename T1, typename T2>\n  inline SpMat(const Base<uword,T1>& locations, const Base<eT,T2>& values, const bool sort_locations = true);\n  \n  template<typename T1, typename T2>\n  inline SpMat(const Base<uword,T1>& locations, const Base<eT,T2>& values, const uword n_rows, const uword n_cols, const bool sort_locations = true, const bool check_for_zeros = true);\n  \n  template<typename T1, typename T2>\n  inline SpMat(const bool add_values, const Base<uword,T1>& locations, const Base<eT,T2>& values, const uword n_rows, const uword n_cols, const bool sort_locations = true, const bool check_for_zeros = true);\n  \n  inline const SpMat&  operator=(const eT val); //! Sets size to 1x1.\n  inline const SpMat& operator*=(const eT val);\n  inline const SpMat& operator/=(const eT val);\n  // operator+=(val) and operator-=(val) are not defined as they don't make sense for sparse matrices\n  \n  /**\n   * Operators on other sparse matrices.  These work as though you would expect.\n   */\n  inline const SpMat&  operator=(const SpMat& m);\n  inline const SpMat& operator+=(const SpMat& m);\n  inline const SpMat& operator-=(const SpMat& m);\n  inline const SpMat& operator*=(const SpMat& m);\n  inline const SpMat& operator%=(const SpMat& m);\n  inline const SpMat& operator/=(const SpMat& m);\n  \n  /**\n   * Operators on other regular matrices.  These work as though you would expect.\n   */\n  template<typename T1> inline explicit          SpMat(const Base<eT, T1>& m);\n  template<typename T1> inline const SpMat&  operator=(const Base<eT, T1>& m);\n  template<typename T1> inline const SpMat& operator+=(const Base<eT, T1>& m);\n  template<typename T1> inline const SpMat& operator-=(const Base<eT, T1>& m);\n  template<typename T1> inline const SpMat& operator*=(const Base<eT, T1>& m);\n  template<typename T1> inline const SpMat& operator/=(const Base<eT, T1>& m);\n  template<typename T1> inline const SpMat& operator%=(const Base<eT, T1>& m);\n  \n  \n  //! construction of complex matrix out of two non-complex matrices;\n  template<typename T1, typename T2>\n  inline explicit SpMat(const SpBase<pod_type, T1>& A, const SpBase<pod_type, T2>& B);\n  \n  /**\n   * Operations on sparse subviews.\n   */\n  inline                   SpMat(const SpSubview<eT>& X);\n  inline const SpMat&  operator=(const SpSubview<eT>& X);\n  inline const SpMat& operator+=(const SpSubview<eT>& X);\n  inline const SpMat& operator-=(const SpSubview<eT>& X);\n  inline const SpMat& operator*=(const SpSubview<eT>& X);\n  inline const SpMat& operator%=(const SpSubview<eT>& X);\n  inline const SpMat& operator/=(const SpSubview<eT>& X);\n  \n  // delayed unary ops\n  template<typename T1, typename spop_type> inline                   SpMat(const SpOp<T1, spop_type>& X);\n  template<typename T1, typename spop_type> inline const SpMat&  operator=(const SpOp<T1, spop_type>& X);\n  template<typename T1, typename spop_type> inline const SpMat& operator+=(const SpOp<T1, spop_type>& X);\n  template<typename T1, typename spop_type> inline const SpMat& operator-=(const SpOp<T1, spop_type>& X);\n  template<typename T1, typename spop_type> inline const SpMat& operator*=(const SpOp<T1, spop_type>& X);\n  template<typename T1, typename spop_type> inline const SpMat& operator%=(const SpOp<T1, spop_type>& X);\n  template<typename T1, typename spop_type> inline const SpMat& operator/=(const SpOp<T1, spop_type>& X);\n  \n  // delayed binary ops\n  template<typename T1, typename T2, typename spglue_type> inline                   SpMat(const SpGlue<T1, T2, spglue_type>& X);\n  template<typename T1, typename T2, typename spglue_type> inline const SpMat&  operator=(const SpGlue<T1, T2, spglue_type>& X);\n  template<typename T1, typename T2, typename spglue_type> inline const SpMat& operator+=(const SpGlue<T1, T2, spglue_type>& X);\n  template<typename T1, typename T2, typename spglue_type> inline const SpMat& operator-=(const SpGlue<T1, T2, spglue_type>& X);\n  template<typename T1, typename T2, typename spglue_type> inline const SpMat& operator*=(const SpGlue<T1, T2, spglue_type>& X);\n  template<typename T1, typename T2, typename spglue_type> inline const SpMat& operator%=(const SpGlue<T1, T2, spglue_type>& X);\n  template<typename T1, typename T2, typename spglue_type> inline const SpMat& operator/=(const SpGlue<T1, T2, spglue_type>& X);\n\n  // delayed mixted-type unary ops\n  template<typename T1, typename spop_type> inline                   SpMat(const mtSpOp<eT, T1, spop_type>& X);\n  template<typename T1, typename spop_type> inline const SpMat&  operator=(const mtSpOp<eT, T1, spop_type>& X);\n  template<typename T1, typename spop_type> inline const SpMat& operator+=(const mtSpOp<eT, T1, spop_type>& X);\n  template<typename T1, typename spop_type> inline const SpMat& operator-=(const mtSpOp<eT, T1, spop_type>& X);\n  template<typename T1, typename spop_type> inline const SpMat& operator*=(const mtSpOp<eT, T1, spop_type>& X);\n  template<typename T1, typename spop_type> inline const SpMat& operator%=(const mtSpOp<eT, T1, spop_type>& X);\n  template<typename T1, typename spop_type> inline const SpMat& operator/=(const mtSpOp<eT, T1, spop_type>& X);\n  \n  /**\n   * Submatrix methods.\n   */\n  arma_inline       SpSubview<eT> row(const uword row_num);\n  arma_inline const SpSubview<eT> row(const uword row_num) const;\n  \n  inline            SpSubview<eT> operator()(const uword row_num, const span& col_span);\n  inline      const SpSubview<eT> operator()(const uword row_num, const span& col_span) const;\n  \n  arma_inline       SpSubview<eT> col(const uword col_num);\n  arma_inline const SpSubview<eT> col(const uword col_num) const;\n  \n  inline            SpSubview<eT> operator()(const span& row_span, const uword col_num);\n  inline      const SpSubview<eT> operator()(const span& row_span, const uword col_num) const;\n  \n  arma_inline       SpSubview<eT> rows(const uword in_row1, const uword in_row2);\n  arma_inline const SpSubview<eT> rows(const uword in_row1, const uword in_row2) const;\n  \n  arma_inline       SpSubview<eT> cols(const uword in_col1, const uword in_col2);\n  arma_inline const SpSubview<eT> cols(const uword in_col1, const uword in_col2) const;\n  \n  arma_inline       SpSubview<eT> submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2);\n  arma_inline const SpSubview<eT> submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const;\n  \n  arma_inline       SpSubview<eT> submat(const uword in_row1, const uword in_col1, const SizeMat& s);\n  arma_inline const SpSubview<eT> submat(const uword in_row1, const uword in_col1, const SizeMat& s) const;\n  \n  inline            SpSubview<eT> submat    (const span& row_span, const span& col_span);\n  inline      const SpSubview<eT> submat    (const span& row_span, const span& col_span) const;\n  \n  inline            SpSubview<eT> operator()(const span& row_span, const span& col_span);\n  inline      const SpSubview<eT> operator()(const span& row_span, const span& col_span) const;\n  \n  arma_inline       SpSubview<eT> operator()(const uword in_row1, const uword in_col1, const SizeMat& s);\n  arma_inline const SpSubview<eT> operator()(const uword in_row1, const uword in_col1, const SizeMat& s) const;\n  \n  \n  inline       SpSubview<eT> head_rows(const uword N);\n  inline const SpSubview<eT> head_rows(const uword N) const;\n  \n  inline       SpSubview<eT> tail_rows(const uword N);\n  inline const SpSubview<eT> tail_rows(const uword N) const;\n  \n  inline       SpSubview<eT> head_cols(const uword N);\n  inline const SpSubview<eT> head_cols(const uword N) const;\n  \n  inline       SpSubview<eT> tail_cols(const uword N);\n  inline const SpSubview<eT> tail_cols(const uword N) const;\n\n\n  inline       spdiagview<eT> diag(const sword in_id = 0);\n  inline const spdiagview<eT> diag(const sword in_id = 0) const;\n  \n  \n  inline void swap_rows(const uword in_row1, const uword in_row2);\n  inline void swap_cols(const uword in_col1, const uword in_col2);\n  \n  inline void shed_row(const uword row_num);\n  inline void shed_col(const uword col_num);\n  \n  inline void shed_rows(const uword in_row1, const uword in_row2);\n  inline void shed_cols(const uword in_col1, const uword in_col2);\n  \n  \n  /**\n   * Element access; access the i'th element (works identically to the Mat accessors).\n   * If there is nothing at element i, 0 is returned.\n   */\n  arma_inline arma_warn_unused SpValProxy<SpMat<eT> > operator[] (const uword i);\n  arma_inline arma_warn_unused eT                     operator[] (const uword i) const;\n  arma_inline arma_warn_unused SpValProxy<SpMat<eT> > at         (const uword i);\n  arma_inline arma_warn_unused eT                     at         (const uword i) const;\n  arma_inline arma_warn_unused SpValProxy<SpMat<eT> > operator() (const uword i);\n  arma_inline arma_warn_unused eT                     operator() (const uword i) const;\n  \n  /**\n   * Element access; access the element at row in_row and column in_col.\n   * If there is nothing at that position, 0 is returned.\n   */\n  arma_inline arma_warn_unused SpValProxy<SpMat<eT> > at         (const uword in_row, const uword in_col);\n  arma_inline arma_warn_unused eT                     at         (const uword in_row, const uword in_col) const;\n  arma_inline arma_warn_unused SpValProxy<SpMat<eT> > operator() (const uword in_row, const uword in_col);\n  arma_inline arma_warn_unused eT                     operator() (const uword in_row, const uword in_col) const;\n  \n  \n  /**\n   * Information boolean checks on matrices.\n   */\n  arma_inline arma_warn_unused bool is_empty()  const;\n  arma_inline arma_warn_unused bool is_vec()    const;\n  arma_inline arma_warn_unused bool is_rowvec() const;\n  arma_inline arma_warn_unused bool is_colvec() const;\n  arma_inline arma_warn_unused bool is_square() const;\n       inline arma_warn_unused bool is_finite() const;\n  \n  inline arma_warn_unused bool has_inf() const;\n  inline arma_warn_unused bool has_nan() const;\n  \n  arma_inline arma_warn_unused bool in_range(const uword i) const;\n  arma_inline arma_warn_unused bool in_range(const span& x) const;\n  \n  arma_inline arma_warn_unused bool in_range(const uword   in_row, const uword   in_col) const;\n  arma_inline arma_warn_unused bool in_range(const span& row_span, const uword   in_col) const;\n  arma_inline arma_warn_unused bool in_range(const uword   in_row, const span& col_span) const;\n  arma_inline arma_warn_unused bool in_range(const span& row_span, const span& col_span) const;\n  \n  arma_inline arma_warn_unused bool in_range(const uword in_row, const uword in_col, const SizeMat& s) const;\n  \n  inline void impl_print(const std::string& extra_text) const;\n  inline void impl_print(std::ostream& user_stream, const std::string& extra_text) const;\n\n  inline void impl_raw_print(const std::string& extra_text) const;\n  inline void impl_raw_print(std::ostream& user_stream, const std::string& extra_text) const;\n\n  inline void impl_print_dense(const std::string& extra_text) const;\n  inline void impl_print_dense(std::ostream& user_stream, const std::string& extra_text) const;\n  \n  inline void impl_raw_print_dense(const std::string& extra_text) const;\n  inline void impl_raw_print_dense(std::ostream& user_stream, const std::string& extra_text) const;\n  \n  //! Copy the size of another matrix.\n  template<typename eT2> inline void copy_size(const SpMat<eT2>& m);\n  template<typename eT2> inline void copy_size(const   Mat<eT2>& m);\n  \n  inline void set_size(const uword in_elem);\n  inline void set_size(const uword in_rows, const uword in_cols);\n  \n  inline void   resize(const uword in_rows, const uword in_cols);\n  inline void  reshape(const uword in_rows, const uword in_cols);\n  inline void  reshape(const uword in_rows, const uword in_cols, const uword dim);  // this form is deprecated: don't use it\n  \n  inline const SpMat& zeros();\n  inline const SpMat& zeros(const uword in_elem);\n  inline const SpMat& zeros(const uword in_rows, const uword in_cols);\n  \n  inline const SpMat& eye();\n  inline const SpMat& eye(const uword in_rows, const uword in_cols);\n  \n  inline const SpMat& speye();\n  inline const SpMat& speye(const uword in_rows, const uword in_cols);\n  \n  inline const SpMat& sprandu(const uword in_rows, const uword in_cols, const double density);\n  \n  inline const SpMat& sprandn(const uword in_rows, const uword in_cols, const double density);\n  \n  inline void reset();\n  \n  \n  template<typename T1> inline void set_real(const SpBase<pod_type,T1>& X);\n  template<typename T1> inline void set_imag(const SpBase<pod_type,T1>& X);\n  \n  \n  // saving and loading\n  \n  inline bool save(const std::string   name, const file_type type = arma_binary, const bool print_status = true) const;\n  inline bool save(      std::ostream& os,   const file_type type = arma_binary, const bool print_status = true) const;\n  \n  inline bool load(const std::string   name, const file_type type = arma_binary, const bool print_status = true);\n  inline bool load(      std::istream& is,   const file_type type = arma_binary, const bool print_status = true);\n  \n  inline bool quiet_save(const std::string   name, const file_type type = arma_binary) const;\n  inline bool quiet_save(      std::ostream& os,   const file_type type = arma_binary) const;\n  \n  inline bool quiet_load(const std::string   name, const file_type type = arma_binary);\n  inline bool quiet_load(      std::istream& is,   const file_type type = arma_binary);\n  \n  // TODO: speed up loading of sparse matrices stored as text files (ie. raw_ascii and coord_ascii)\n  // TODO: implement auto_detect for sparse matrices\n  // TODO: modify docs to specify which formats are not applicable to sparse matrices\n  \n  \n  // These forward declarations are necessary.\n  class iterator_base;\n  class iterator;\n  class const_iterator;\n  class row_iterator;\n  class const_row_iterator;\n\n  // Iterator base provides basic operators but not how to compare or how to\n  // iterate.\n  class iterator_base\n    {\n    public:\n\n    inline iterator_base();\n    inline iterator_base(const SpMat& in_M);\n    inline iterator_base(const SpMat& in_M, const uword col, const uword pos);\n\n    inline arma_hot eT operator*() const;\n    \n    // Don't hold location internally; call \"dummy\" methods to get that information.\n    arma_inline uword row() const { return M->row_indices[internal_pos]; }\n    arma_inline uword col() const { return internal_col;                 }\n    arma_inline uword pos() const { return internal_pos;                 }\n\n    arma_aligned const SpMat* M;\n    arma_aligned       uword  internal_col;\n    arma_aligned       uword  internal_pos;\n\n    // So that we satisfy the STL iterator types.\n    typedef std::bidirectional_iterator_tag iterator_category;\n    typedef eT                              value_type;\n    typedef uword                           difference_type; // not certain on this one\n    typedef const eT*                       pointer;\n    typedef const eT&                       reference;\n    };\n\n  class const_iterator : public iterator_base\n    {\n    public:\n    \n    inline const_iterator();\n    inline const_iterator(const SpMat& in_M, uword initial_pos = 0); // Assumes initial_pos is valid.\n    //! Once initialized, will be at the first nonzero value after the given position (using forward columnwise traversal).\n    inline const_iterator(const SpMat& in_M, uword in_row, uword in_col);\n    //! If you know the exact position of the iterator.  in_row is a dummy argument.\n    inline const_iterator(const SpMat& in_M, uword in_row, uword in_col, uword in_pos);\n    inline const_iterator(const const_iterator& other);\n\n    inline arma_hot const_iterator& operator++();\n    inline arma_hot const_iterator  operator++(int);\n    \n    inline arma_hot const_iterator& operator--();\n    inline arma_hot const_iterator  operator--(int);\n\n    inline arma_hot bool operator==(const const_iterator& rhs) const;\n    inline arma_hot bool operator!=(const const_iterator& rhs) const;\n\n    inline arma_hot bool operator==(const typename SpSubview<eT>::const_iterator& rhs) const;\n    inline arma_hot bool operator!=(const typename SpSubview<eT>::const_iterator& rhs) const;\n\n    inline arma_hot bool operator==(const const_row_iterator& rhs) const;\n    inline arma_hot bool operator!=(const const_row_iterator& rhs) const;\n\n    inline arma_hot bool operator==(const typename SpSubview<eT>::const_row_iterator& rhs) const;\n    inline arma_hot bool operator!=(const typename SpSubview<eT>::const_row_iterator& rhs) const;\n    };\n\n  /**\n   * So that we can iterate over nonzero values, we need an iterator\n   * implementation.  This can't be as simple as Mat's, which is just a pointer\n   * to an eT.  If a value is set to 0 using this iterator, the iterator is no\n   * longer valid!\n   */\n  class iterator : public const_iterator\n    {\n    public:\n\n    inline iterator() : const_iterator() { }\n    inline iterator(SpMat& in_M, uword initial_pos = 0) : const_iterator(in_M, initial_pos) { }\n    inline iterator(SpMat& in_M, uword in_row, uword in_col) : const_iterator(in_M, in_row, in_col) { }\n    inline iterator(SpMat& in_M, uword in_row, uword in_col, uword in_pos) : const_iterator(in_M, in_row, in_col, in_pos) { }\n    inline iterator(const const_iterator& other) : const_iterator(other) { }\n\n    inline arma_hot SpValProxy<SpMat<eT> > operator*();\n\n    // overloads needed for return type correctness\n    inline arma_hot iterator& operator++();\n    inline arma_hot iterator  operator++(int);\n\n    inline arma_hot iterator& operator--();\n    inline arma_hot iterator  operator--(int);\n\n    // This has a different value_type than iterator_base.\n    typedef SpValProxy<SpMat<eT> >         value_type;\n    typedef const SpValProxy<SpMat<eT> >*  pointer;\n    typedef const SpValProxy<SpMat<eT> >&  reference;\n    };\n\n  class const_row_iterator : public iterator_base\n    {\n    public:\n    \n    inline const_row_iterator();\n    inline const_row_iterator(const SpMat& in_M, uword initial_pos = 0);\n    //! Once initialized, will be at the first nonzero value after the given position (using forward row-wise traversal).\n    inline const_row_iterator(const SpMat& in_M, uword in_row, uword in_col);\n    inline const_row_iterator(const const_row_iterator& other);\n\n    inline arma_hot const_row_iterator& operator++();\n    inline arma_hot const_row_iterator  operator++(int);\n    \n    inline arma_hot const_row_iterator& operator--();\n    inline arma_hot const_row_iterator  operator--(int);\n\n    uword internal_row; // Hold row internally because we use internal_pos differently.\n    uword actual_pos; // Actual position in matrix.\n\n    arma_inline eT operator*() const { return iterator_base::M->values[actual_pos]; }\n\n    arma_inline uword row() const { return internal_row; }\n\n    inline arma_hot bool operator==(const const_iterator& rhs) const;\n    inline arma_hot bool operator!=(const const_iterator& rhs) const;\n\n    inline arma_hot bool operator==(const typename SpSubview<eT>::const_iterator& rhs) const;\n    inline arma_hot bool operator!=(const typename SpSubview<eT>::const_iterator& rhs) const;\n\n    inline arma_hot bool operator==(const const_row_iterator& rhs) const;\n    inline arma_hot bool operator!=(const const_row_iterator& rhs) const;\n\n    inline arma_hot bool operator==(const typename SpSubview<eT>::const_row_iterator& rhs) const;\n    inline arma_hot bool operator!=(const typename SpSubview<eT>::const_row_iterator& rhs) const;\n    };\n\n  class row_iterator : public const_row_iterator\n    {\n    public:\n    \n    inline row_iterator() : const_row_iterator() {}\n    inline row_iterator(SpMat& in_M, uword initial_pos = 0) : const_row_iterator(in_M, initial_pos) { }\n    //! Once initialized, will be at the first nonzero value after the given position (using forward row-wise traversal).\n    inline row_iterator(SpMat& in_M, uword in_row, uword in_col) : const_row_iterator(in_M, in_row, in_col) { }\n    inline row_iterator(const row_iterator& other) : const_row_iterator(other) { }\n    \n    inline arma_hot SpValProxy<SpMat<eT> > operator*();\n\n    // overloads required for return type correctness\n    inline arma_hot row_iterator& operator++();\n    inline arma_hot row_iterator  operator++(int);\n\n    inline arma_hot row_iterator& operator--();\n    inline arma_hot row_iterator  operator--(int);\n    \n    // This has a different value_type than iterator_base.\n    typedef SpValProxy<SpMat<eT> >         value_type;\n    typedef const SpValProxy<SpMat<eT> >*  pointer;\n    typedef const SpValProxy<SpMat<eT> >&  reference;\n    };\n  \n  \n  typedef       iterator       row_col_iterator;\n  typedef const_iterator const_row_col_iterator;\n  \n  \n  inline       iterator     begin();\n  inline const_iterator     begin() const;\n  \n  inline       iterator     end();\n  inline const_iterator     end() const;\n  \n  inline       iterator     begin_col(const uword col_num);\n  inline const_iterator     begin_col(const uword col_num) const;\n  \n  inline       iterator     end_col(const uword col_num);\n  inline const_iterator     end_col(const uword col_num) const;\n  \n  inline       row_iterator begin_row(const uword row_num = 0);\n  inline const_row_iterator begin_row(const uword row_num = 0) const;\n  \n  inline       row_iterator end_row();\n  inline const_row_iterator end_row() const;\n  \n  inline       row_iterator end_row(const uword row_num);\n  inline const_row_iterator end_row(const uword row_num) const;\n  \n  inline       row_col_iterator begin_row_col();\n  inline const_row_col_iterator begin_row_col() const;\n  \n  inline       row_col_iterator end_row_col();\n  inline const_row_col_iterator end_row_col() const;\n  \n  \n  inline void  clear();\n  inline bool  empty() const;\n  inline uword size()  const;\n  \n  /**\n   * Resize memory.  You are responsible for updating the column pointers and\n   * filling the new memory (if the new size is larger).  If the new size is\n   * smaller, the first new_n_nonzero elements will be copied.  n_nonzero is\n   * updated.\n   */\n  inline void mem_resize(const uword new_n_nonzero);\n  \n  //! don't use this unless you're writing internal Armadillo code\n  inline void remove_zeros();\n  \n  //! don't use this unless you're writing internal Armadillo code\n  inline void steal_mem(SpMat& X);\n  \n  //! don't use this unless you're writing internal Armadillo code\n  template<              typename T1, typename Functor> arma_hot inline void init_xform   (const SpBase<eT, T1>& x, const Functor& func);\n  template<typename eT2, typename T1, typename Functor> arma_hot inline void init_xform_mt(const SpBase<eT2,T1>& x, const Functor& func);\n  \n  \n  protected:\n\n  /**\n   * Initialize the matrix to the specified size.  Data is not preserved, so the matrix is assumed to be entirely sparse (empty).\n   */\n  inline void init(uword in_rows, uword in_cols);\n\n  /**\n   * Initialize the matrix from text.  Data is (of course) not preserved, and\n   * the size will be reset.\n   */\n  inline void init(const std::string& text);\n\n  /**\n   * Initialize from another matrix (copy).\n   */\n  inline void init(const SpMat& x);\n  \n  \n  inline void init_batch_std(const Mat<uword>& locations, const Mat<eT>& values, const bool sort_locations);\n  inline void init_batch_add(const Mat<uword>& locations, const Mat<eT>& values, const bool sort_locations);\n  \n  \n  \n  private:\n  \n  /**\n   * Return the given element.\n   */\n  inline arma_hot arma_warn_unused SpValProxy<SpMat<eT> > get_value(const uword i);\n  inline arma_hot arma_warn_unused eT                     get_value(const uword i) const;\n  \n  inline arma_hot arma_warn_unused SpValProxy<SpMat<eT> > get_value(const uword in_row, const uword in_col);\n  inline arma_hot arma_warn_unused eT                     get_value(const uword in_row, const uword in_col) const;\n  \n  /**\n   * Given the index representing which of the nonzero values this is, return\n   * its actual location, either in row/col or just the index.\n   */\n  arma_inline arma_hot arma_warn_unused uword get_position(const uword i) const;\n  arma_inline arma_hot                  void  get_position(const uword i, uword& row_of_i, uword& col_of_i) const;\n  \n  /**\n   * Add an element at the given position, and return a reference to it.  The\n   * element will be set to 0 (unless otherwise specified).  If the element\n   * already exists, its value will be overwritten.\n   *\n   * @param in_row Row of new element.\n   * @param in_col Column of new element.\n   * @param in_val Value to set new element to (default 0.0).\n   */\n  inline arma_hot arma_warn_unused eT& add_element(const uword in_row, const uword in_col, const eT in_val = 0.0);\n  \n  /**\n   * Delete an element at the given position.\n   *\n   * @param in_row Row of element to be deleted.\n   * @param in_col Column of element to be deleted.\n   */\n  inline arma_hot void delete_element(const uword in_row, const uword in_col);\n  \n  \n  public:\n    \n  #ifdef ARMA_EXTRA_SPMAT_PROTO\n    #include ARMA_INCFILE_WRAP(ARMA_EXTRA_SPMAT_PROTO)\n  #endif\n  };\n\n\n\nclass SpMat_aux\n  {\n  public:\n  \n  template<typename eT, typename T1> inline static void set_real(SpMat<eT>&                out, const SpBase<eT,T1>& X);\n  template<typename T,  typename T1> inline static void set_real(SpMat< std::complex<T> >& out, const SpBase< T,T1>& X);\n  \n  template<typename eT, typename T1> inline static void set_imag(SpMat<eT>&                out, const SpBase<eT,T1>& X);\n  template<typename T,  typename T1> inline static void set_imag(SpMat< std::complex<T> >& out, const SpBase< T,T1>& X);\n  };\n\n\n\n#define ARMA_HAS_SPMAT\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpMat_iterators_meat.hpp",
    "content": "// Copyright (C) 2011-2014 Ryan Curtin\n// Copyright (C) 2012-2014 Conrad Sanderson\n// Copyright (C) 2011 Matthew Amidon\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n//! \\addtogroup SpMat\n//! @{\n\n///////////////////////////////////////////////////////////////////////////////\n// SpMat::iterator_base implementation                                       //\n///////////////////////////////////////////////////////////////////////////////\n\n\ntemplate<typename eT>\ninline\nSpMat<eT>::iterator_base::iterator_base()\n  : M(NULL)\n  , internal_col(0)\n  , internal_pos(0)\n  {\n  // Technically this iterator is invalid (it may not point to a real element)\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpMat<eT>::iterator_base::iterator_base(const SpMat<eT>& in_M)\n  : M(&in_M)\n  , internal_col(0)\n  , internal_pos(0)\n  {\n  // Technically this iterator is invalid (it may not point to a real element)\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpMat<eT>::iterator_base::iterator_base(const SpMat<eT>& in_M, const uword in_col, const uword in_pos)\n  : M(&in_M)\n  , internal_col(in_col)\n  , internal_pos(in_pos)\n  {\n  // Nothing to do.\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\neT\nSpMat<eT>::iterator_base::operator*() const\n  {\n  return M->values[internal_pos];\n  }\n\n\n\n///////////////////////////////////////////////////////////////////////////////\n// SpMat::const_iterator implementation                                      //\n///////////////////////////////////////////////////////////////////////////////\n\ntemplate<typename eT>\ninline\nSpMat<eT>::const_iterator::const_iterator()\n  : iterator_base()\n  {\n  }\n\ntemplate<typename eT>\ninline\nSpMat<eT>::const_iterator::const_iterator(const SpMat<eT>& in_M, uword initial_pos)\n  : iterator_base(in_M, 0, initial_pos)\n  {\n  // Corner case for empty matrices.\n  if(in_M.n_nonzero == 0)\n    {\n    iterator_base::internal_col = in_M.n_cols;\n    return;\n    }\n\n  // Determine which column we should be in.\n  while(iterator_base::M->col_ptrs[iterator_base::internal_col + 1] <= iterator_base::internal_pos)\n    {\n    iterator_base::internal_col++;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpMat<eT>::const_iterator::const_iterator(const SpMat<eT>& in_M, uword in_row, uword in_col)\n  : iterator_base(in_M, in_col, 0)\n  {\n  // So we have a position we want to be right after.  Skip to the column.\n  iterator_base::internal_pos = iterator_base::M->col_ptrs[iterator_base::internal_col];\n\n  // Now we have to make sure that is the right column.\n  while(iterator_base::M->col_ptrs[iterator_base::internal_col + 1] <= iterator_base::internal_pos)\n    {\n    iterator_base::internal_col++;\n    }\n\n  // Now we have to get to the right row.\n  while((iterator_base::M->row_indices[iterator_base::internal_pos] < in_row) && (iterator_base::internal_col == in_col))\n    {\n    ++(*this); // Increment iterator.\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpMat<eT>::const_iterator::const_iterator(const SpMat<eT>& in_M, const uword /* in_row */, const uword in_col, const uword in_pos)\n  : iterator_base(in_M, in_col, in_pos)\n  {\n  // Nothing to do.\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpMat<eT>::const_iterator::const_iterator(const typename SpMat<eT>::const_iterator& other)\n  : iterator_base(*other.M, other.internal_col, other.internal_pos)\n  {\n  // Nothing to do.\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\ntypename SpMat<eT>::const_iterator&\nSpMat<eT>::const_iterator::operator++()\n  {\n  ++iterator_base::internal_pos;\n\n  if (iterator_base::internal_pos == iterator_base::M->n_nonzero)\n    {\n    iterator_base::internal_col = iterator_base::M->n_cols;\n    return *this;\n    }\n\n  // Check to see if we moved a column.\n  while (iterator_base::M->col_ptrs[iterator_base::internal_col + 1] <= iterator_base::internal_pos)\n    {\n    ++iterator_base::internal_col;\n    }\n\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\ntypename SpMat<eT>::const_iterator\nSpMat<eT>::const_iterator::operator++(int)\n  {\n  typename SpMat<eT>::const_iterator tmp(*this);\n\n  ++(*this);\n\n  return tmp;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\ntypename SpMat<eT>::const_iterator&\nSpMat<eT>::const_iterator::operator--()\n  {\n  //iterator_base::M.print(\"M\");\n  \n  // printf(\"decrement from %d, %d, %d\\n\", iterator_base::internal_pos, iterator_base::internal_col, iterator_base::row());\n  \n  --iterator_base::internal_pos;\n  \n  // printf(\"now pos %d\\n\", iterator_base::internal_pos);\n\n  // First, see if we moved back a column.\n  while (iterator_base::internal_pos < iterator_base::M->col_ptrs[iterator_base::internal_col])\n    {\n    // printf(\"colptr %d (col %d)\\n\", iterator_base::M.col_ptrs[iterator_base::internal_col], iterator_base::internal_col);\n    \n    --iterator_base::internal_col;\n    }\n\n\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\ntypename SpMat<eT>::const_iterator\nSpMat<eT>::const_iterator::operator--(int)\n  {\n  typename SpMat<eT>::const_iterator tmp(*this);\n\n  --(*this);\n\n  return tmp;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\nbool\nSpMat<eT>::const_iterator::operator==(const const_iterator& rhs) const\n  {\n  return (rhs.row() == (*this).row()) && (rhs.col() == iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\nbool\nSpMat<eT>::const_iterator::operator!=(const const_iterator& rhs) const\n  {\n  return (rhs.row() != (*this).row()) || (rhs.col() != iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\nbool\nSpMat<eT>::const_iterator::operator==(const typename SpSubview<eT>::const_iterator& rhs) const\n  {\n  return (rhs.row() == (*this).row()) && (rhs.col() == iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\nbool\nSpMat<eT>::const_iterator::operator!=(const typename SpSubview<eT>::const_iterator& rhs) const\n  {\n  return (rhs.row() != (*this).row()) || (rhs.col() != iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\nbool\nSpMat<eT>::const_iterator::operator==(const const_row_iterator& rhs) const\n  {\n  return (rhs.row() == (*this).row()) && (rhs.col() == iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\nbool\nSpMat<eT>::const_iterator::operator!=(const const_row_iterator& rhs) const\n  {\n  return (rhs.row() != (*this).row()) || (rhs.col() != iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\nbool\nSpMat<eT>::const_iterator::operator==(const typename SpSubview<eT>::const_row_iterator& rhs) const\n  {\n  return (rhs.row() == (*this).row()) && (rhs.col() == iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\nbool\nSpMat<eT>::const_iterator::operator!=(const typename SpSubview<eT>::const_row_iterator& rhs) const\n  {\n  return (rhs.row() != (*this).row()) || (rhs.col() != iterator_base::internal_col);\n  }\n\n\n\n///////////////////////////////////////////////////////////////////////////////\n// SpMat::iterator implementation                                            //\n///////////////////////////////////////////////////////////////////////////////\n\ntemplate<typename eT>\ninline\narma_hot\nSpValProxy<SpMat<eT> >\nSpMat<eT>::iterator::operator*()\n  {\n  return SpValProxy<SpMat<eT> >(\n    iterator_base::M->row_indices[iterator_base::internal_pos],\n    iterator_base::internal_col,\n    access::rw(*iterator_base::M),\n    &access::rw(iterator_base::M->values[iterator_base::internal_pos]));\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\ntypename SpMat<eT>::iterator&\nSpMat<eT>::iterator::operator++()\n  {\n  const_iterator::operator++();\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\ntypename SpMat<eT>::iterator\nSpMat<eT>::iterator::operator++(int)\n  {\n  typename SpMat<eT>::iterator tmp(*this);\n\n  const_iterator::operator++();\n\n  return tmp;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\ntypename SpMat<eT>::iterator&\nSpMat<eT>::iterator::operator--()\n  {\n  const_iterator::operator--();\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\ntypename SpMat<eT>::iterator\nSpMat<eT>::iterator::operator--(int)\n  {\n  typename SpMat<eT>::iterator tmp(*this);\n\n  const_iterator::operator--();\n\n  return tmp;\n  }\n\n\n\n///////////////////////////////////////////////////////////////////////////////\n// SpMat::const_row_iterator implementation                                  //\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Initialize the const_row_iterator.\n */\n\ntemplate<typename eT>\ninline\nSpMat<eT>::const_row_iterator::const_row_iterator()\n  : iterator_base()\n  , internal_row(0)\n  , actual_pos(0)\n  {\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpMat<eT>::const_row_iterator::const_row_iterator(const SpMat<eT>& in_M, uword initial_pos)\n  : iterator_base(in_M, 0, initial_pos)\n  , internal_row(0)\n  , actual_pos(0)\n  {\n  // Corner case for empty matrix.\n  if(in_M.n_nonzero == 0)\n    {\n    iterator_base::internal_col = 0;\n    internal_row = in_M.n_rows;\n    return;\n    }\n\n  // We don't count zeros in our position count, so we have to find the nonzero\n  // value corresponding to the given initial position.  We assume initial_pos\n  // is valid.\n\n  // This is irritating because we don't know where the elements are in each\n  // row.  What we will do is loop across all columns looking for elements in\n  // row 0 (and add to our sum), then in row 1, and so forth, until we get to\n  // the desired position.\n  uword cur_pos = std::numeric_limits<uword>::max(); // Invalid value.\n  uword cur_row = 0;\n  uword cur_col = 0;\n\n  while(true) // This loop is terminated from the inside.\n    {\n    // Is there anything in the column we are looking at?\n    for (uword ind = 0; ((iterator_base::M->col_ptrs[cur_col] + ind < iterator_base::M->col_ptrs[cur_col + 1]) && (iterator_base::M->row_indices[iterator_base::M->col_ptrs[cur_col] + ind] <= cur_row)); ind++)\n      {\n      // There is something in this column.  Is it in the row we are looking at?\n      const uword row_index = iterator_base::M->row_indices[iterator_base::M->col_ptrs[cur_col] + ind];\n      if (row_index == cur_row)\n        {\n        // Yes, it is what we are looking for.  Increment our current position.\n        if (++cur_pos == iterator_base::internal_pos)   // TODO: HACK: if cur_pos is std::numeric_limits<uword>::max(), ++cur_pos relies on a wraparound/overflow, which is not portable\n          {\n          actual_pos = iterator_base::M->col_ptrs[cur_col] + ind;\n          internal_row = cur_row;\n          iterator_base::internal_col = cur_col;\n\n          return;\n          }\n\n        // We are done with this column.  Break to the column incrementing code (directly below).\n        break;\n        }\n      else if(row_index > cur_row)\n        {\n        break; // Can't be in this column.\n        }\n      }\n\n    cur_col++; // Done with the column.  Move on.\n    if (cur_col == iterator_base::M->n_cols)\n      {\n      // We are out of columns.  Loop back to the beginning and look on the\n      // next row.\n      cur_col = 0;\n      cur_row++;\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpMat<eT>::const_row_iterator::const_row_iterator(const SpMat<eT>& in_M, uword in_row, uword in_col)\n  : iterator_base(in_M, in_col, 0)\n  , internal_row(0)\n  , actual_pos(0)\n  {\n  // This is slow.  It needs to be rewritten.\n  // So we have a destination we want to be just after, but don't know what position that is.  Make another iterator to find out...\n  const_row_iterator it(in_M, 0);\n  while((it.row() < in_row) || ((it.row() == in_row) && (it.col() < in_col)))\n    {\n    it++;\n    }\n\n  // Now that it is at the right place, take its position.\n  iterator_base::internal_col = it.internal_col;\n  iterator_base::internal_pos = it.internal_pos;\n  internal_row = it.internal_row;\n  actual_pos = it.actual_pos;\n  }\n\n\n\n/**\n * Initialize the const_row_iterator from another const_row_iterator.\n */\ntemplate<typename eT>\ninline\nSpMat<eT>::const_row_iterator::const_row_iterator(const typename SpMat<eT>::const_row_iterator& other)\n  : iterator_base(*other.M, other.internal_col, other.internal_pos)\n  , internal_row(other.internal_row)\n  , actual_pos(other.actual_pos)\n  {\n  // Nothing to do.\n  }\n\n\n\n/**\n * Increment the row_iterator.\n */\ntemplate<typename eT>\ninline\narma_hot\ntypename SpMat<eT>::const_row_iterator&\nSpMat<eT>::const_row_iterator::operator++()\n  {\n  // We just need to find the next nonzero element.\n  iterator_base::internal_pos++;\n\n  if(iterator_base::internal_pos == iterator_base::M->n_nonzero)\n    {\n    internal_row = iterator_base::M->n_rows;\n    iterator_base::internal_col = 0;\n    actual_pos = iterator_base::M->n_nonzero;\n\n    return *this;\n    }\n\n  // Otherwise, we need to search.\n  uword cur_col = iterator_base::internal_col;\n  uword cur_row = internal_row;\n\n  while (true) // This loop is terminated from the inside.\n    {\n    // Increment the current column and see if we are now on a new row.\n    if (++cur_col == iterator_base::M->n_cols)\n      {\n      cur_col = 0;\n      cur_row++;\n      }\n\n    // Is there anything in this new column?\n    for (uword ind = 0; ((iterator_base::M->col_ptrs[cur_col] + ind < iterator_base::M->col_ptrs[cur_col + 1]) && (iterator_base::M->row_indices[iterator_base::M->col_ptrs[cur_col] + ind] <= cur_row)); ind++)\n      {\n      if (iterator_base::M->row_indices[iterator_base::M->col_ptrs[cur_col] + ind] == cur_row)\n        {\n        // We have successfully incremented.\n        internal_row = cur_row;\n        iterator_base::internal_col = cur_col;\n        actual_pos = iterator_base::M->col_ptrs[cur_col] + ind;\n\n        return *this; // Now we are done.\n        }\n      }\n    }\n  }\n\n\n\n/**\n * Increment the row_iterator (but do not return anything.\n */\ntemplate<typename eT>\ninline\narma_hot\ntypename SpMat<eT>::const_row_iterator\nSpMat<eT>::const_row_iterator::operator++(int)\n  {\n  typename SpMat<eT>::const_row_iterator tmp(*this);\n\n  ++(*this);\n\n  return tmp;\n  }\n\n\n\n/**\n * Decrement the row_iterator.\n */\ntemplate<typename eT>\ninline\narma_hot\ntypename SpMat<eT>::const_row_iterator&\nSpMat<eT>::const_row_iterator::operator--()\n  {\n  iterator_base::internal_pos--;\n\n  // We have to search backwards.\n  uword cur_col = iterator_base::internal_col;\n  uword cur_row = internal_row;\n\n  while (true) // This loop is terminated from the inside.\n    {\n    // Decrement the current column and see if we are now on a new row.  This is a uword so a negativity check won't work.\n    if (--cur_col > iterator_base::M->n_cols /* this means it underflew */)\n      {\n      cur_col = iterator_base::M->n_cols - 1;\n      cur_row--;\n      }\n\n    // Is there anything in this new column?\n    for (uword ind = 0; ((iterator_base::M->col_ptrs[cur_col] + ind < iterator_base::M->col_ptrs[cur_col + 1]) && (iterator_base::M->row_indices[iterator_base::M->col_ptrs[cur_col] + ind] <= cur_row)); ind++)\n      {\n      if (iterator_base::M->row_indices[iterator_base::M->col_ptrs[cur_col] + ind] == cur_row)\n        {\n        // We have successfully decremented.\n        iterator_base::internal_col = cur_col;\n        internal_row = cur_row;\n        actual_pos = iterator_base::M->col_ptrs[cur_col] + ind;\n\n        return *this; // Now we are done.\n        }\n      }\n    }\n  }\n\n\n\n/**\n * Decrement the row_iterator.\n */\ntemplate<typename eT>\ninline\narma_hot\ntypename SpMat<eT>::const_row_iterator\nSpMat<eT>::const_row_iterator::operator--(int)\n  {\n  typename SpMat<eT>::const_row_iterator tmp(*this);\n\n  --(*this);\n\n  return tmp;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\nbool\nSpMat<eT>::const_row_iterator::operator==(const const_iterator& rhs) const\n  {\n  return (rhs.row() == row()) && (rhs.col() == iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\nbool\nSpMat<eT>::const_row_iterator::operator!=(const const_iterator& rhs) const\n  {\n  return (rhs.row() != row()) || (rhs.col() != iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\nbool\nSpMat<eT>::const_row_iterator::operator==(const typename SpSubview<eT>::const_iterator& rhs) const\n  {\n  return (rhs.row() == row()) && (rhs.col() == iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\nbool\nSpMat<eT>::const_row_iterator::operator!=(const typename SpSubview<eT>::const_iterator& rhs) const\n  {\n  return (rhs.row() != row()) || (rhs.col() != iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\nbool\nSpMat<eT>::const_row_iterator::operator==(const const_row_iterator& rhs) const\n  {\n  return (rhs.row() == row()) && (rhs.col() == iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\nbool\nSpMat<eT>::const_row_iterator::operator!=(const const_row_iterator& rhs) const\n  {\n  return (rhs.row() != row()) || (rhs.col() != iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\nbool\nSpMat<eT>::const_row_iterator::operator==(const typename SpSubview<eT>::const_row_iterator& rhs) const\n  {\n  return (rhs.row() == row()) && (rhs.col() == iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\nbool\nSpMat<eT>::const_row_iterator::operator!=(const typename SpSubview<eT>::const_row_iterator& rhs) const\n  {\n  return (rhs.row() != row()) || (rhs.col() != iterator_base::internal_col);\n  }\n\n\n\n///////////////////////////////////////////////////////////////////////////////\n// SpMat::row_iterator implementation                                        //\n///////////////////////////////////////////////////////////////////////////////\n\ntemplate<typename eT>\ninline\narma_hot\nSpValProxy<SpMat<eT> >\nSpMat<eT>::row_iterator::operator*()\n  {\n  return SpValProxy<SpMat<eT> >(\n    const_row_iterator::internal_row,\n    iterator_base::internal_col,\n    access::rw(*iterator_base::M),\n    &access::rw(iterator_base::M->values[const_row_iterator::actual_pos]));\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\ntypename SpMat<eT>::row_iterator&\nSpMat<eT>::row_iterator::operator++()\n  {\n  const_row_iterator::operator++();\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\ntypename SpMat<eT>::row_iterator\nSpMat<eT>::row_iterator::operator++(int)\n  {\n  typename SpMat<eT>::row_iterator tmp(*this);\n\n  const_row_iterator::operator++();\n\n  return tmp;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\ntypename SpMat<eT>::row_iterator&\nSpMat<eT>::row_iterator::operator--()\n  {\n  const_row_iterator::operator--();\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\ntypename SpMat<eT>::row_iterator\nSpMat<eT>::row_iterator::operator--(int)\n  {\n  typename SpMat<eT>::row_iterator tmp(*this);\n\n  const_row_iterator::operator--();\n\n  return tmp;\n  }\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpMat_meat.hpp",
    "content": "// Copyright (C) 2011-2015 Ryan Curtin\n// Copyright (C) 2012-2015 Conrad Sanderson\n// Copyright (C) 2011 Matthew Amidon\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n//! \\addtogroup SpMat\n//! @{\n\n/**\n * Initialize a sparse matrix with size 0x0 (empty).\n */\ntemplate<typename eT>\ninline\nSpMat<eT>::SpMat()\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , n_nonzero(0)\n  , vec_state(0)\n  , values(memory::acquire_chunked<eT>(1))\n  , row_indices(memory::acquire_chunked<uword>(1))\n  , col_ptrs(memory::acquire<uword>(2))\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  access::rw(values[0]) = 0;\n  access::rw(row_indices[0]) = 0;\n  \n  access::rw(col_ptrs[0]) = 0; // No elements.\n  access::rw(col_ptrs[1]) = std::numeric_limits<uword>::max();\n  }\n\n\n\n/**\n * Clean up the memory of a sparse matrix and destruct it.\n */\ntemplate<typename eT>\ninline\nSpMat<eT>::~SpMat()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  if(values     )  { memory::release(access::rw(values));      }\n  if(row_indices)  { memory::release(access::rw(row_indices)); }\n  if(col_ptrs   )  { memory::release(access::rw(col_ptrs));    }\n  }\n\n\n\n/**\n * Constructor with size given.\n */\ntemplate<typename eT>\ninline\nSpMat<eT>::SpMat(const uword in_rows, const uword in_cols)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , n_nonzero(0)\n  , vec_state(0)\n  , values(NULL)\n  , row_indices(NULL)\n  , col_ptrs(NULL)\n  {\n  arma_extra_debug_sigprint_this(this);\n\n  init(in_rows, in_cols);\n  }\n\n\n\n/**\n * Assemble from text.\n */\ntemplate<typename eT>\ninline\nSpMat<eT>::SpMat(const char* text)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , n_nonzero(0)\n  , vec_state(0)\n  , values(NULL)\n  , row_indices(NULL)\n  , col_ptrs(NULL)\n  {\n  arma_extra_debug_sigprint_this(this);\n\n  init(std::string(text));\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator=(const char* text)\n  {\n  arma_extra_debug_sigprint();\n\n  init(std::string(text));\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpMat<eT>::SpMat(const std::string& text)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , n_nonzero(0)\n  , vec_state(0)\n  , values(NULL)\n  , row_indices(NULL)\n  , col_ptrs(NULL)\n  {\n  arma_extra_debug_sigprint();\n\n  init(text);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator=(const std::string& text)\n  {\n  arma_extra_debug_sigprint();\n  \n  init(text);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpMat<eT>::SpMat(const SpMat<eT>& x)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , n_nonzero(0)\n  , vec_state(0)\n  , values(NULL)\n  , row_indices(NULL)\n  , col_ptrs(NULL)\n  {\n  arma_extra_debug_sigprint_this(this);\n\n  init(x);\n  }\n\n\n\n#if defined(ARMA_USE_CXX11)\n  \n  template<typename eT>\n  inline\n  SpMat<eT>::SpMat(SpMat<eT>&& in_mat)\n    : n_rows(0)\n    , n_cols(0)\n    , n_elem(0)\n    , n_nonzero(0)\n    , vec_state(0)\n    , values(NULL)\n    , row_indices(NULL)\n    , col_ptrs(NULL)\n    {\n    arma_extra_debug_sigprint_this(this);\n    arma_extra_debug_sigprint(arma_boost::format(\"this = %x   in_mat = %x\") % this % &in_mat);\n    \n    (*this).steal_mem(in_mat);\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  const SpMat<eT>&\n  SpMat<eT>::operator=(SpMat<eT>&& in_mat)\n    {\n    arma_extra_debug_sigprint(arma_boost::format(\"this = %x   in_mat = %x\") % this % &in_mat);\n    \n    (*this).steal_mem(in_mat);\n    \n    return *this;\n    }\n  \n#endif\n\n\n\n//! Insert a large number of values at once.\n//! locations.row[0] should be row indices, locations.row[1] should be column indices,\n//! and values should be the corresponding values.\n//! If sort_locations is false, then it is assumed that the locations and values\n//! are already sorted in column-major ordering.\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nSpMat<eT>::SpMat(const Base<uword,T1>& locations_expr, const Base<eT,T2>& vals_expr, const bool sort_locations)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , n_nonzero(0)\n  , vec_state(0)\n  , values(NULL)\n  , row_indices(NULL)\n  , col_ptrs(NULL)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  const unwrap<T1> locs_tmp( locations_expr.get_ref() );\n  const unwrap<T2> vals_tmp(      vals_expr.get_ref() );\n  \n  const Mat<uword>& locs = locs_tmp.M;\n  const Mat<eT>&    vals = vals_tmp.M;\n  \n  arma_debug_check( (vals.is_vec() == false),     \"SpMat::SpMat(): given 'values' object is not a vector\"                  );\n  arma_debug_check( (locs.n_rows != 2),           \"SpMat::SpMat(): locations matrix must have two rows\"                    );\n  arma_debug_check( (locs.n_cols != vals.n_elem), \"SpMat::SpMat(): number of locations is different than number of values\" );\n\n  // If there are no elements in the list, max() will fail.\n  if(locs.n_cols == 0)  { init(0, 0); return; }\n  \n  // Automatically determine size before pruning zeros.\n  uvec bounds = arma::max(locs, 1);\n  init(bounds[0] + 1, bounds[1] + 1);\n  \n  // Ensure that there are no zeros\n  const uword N_old = vals.n_elem;\n        uword N_new = 0;\n  \n  for(uword i = 0; i < N_old; ++i)\n    {\n    if(vals[i] != eT(0))  { ++N_new; }\n    }\n  \n  if(N_new != N_old)\n    {\n    Col<eT>    filtered_vals(N_new);\n    Mat<uword> filtered_locs(2, N_new);\n    \n    uword index = 0;\n    for(uword i = 0; i < N_old; ++i)\n      {\n      if(vals[i] != eT(0))\n        {\n        filtered_vals[index] = vals[i];\n        \n        filtered_locs.at(0, index) = locs.at(0, i);\n        filtered_locs.at(1, index) = locs.at(1, i);\n        \n        ++index;\n        }\n      }\n    \n    init_batch_std(filtered_locs, filtered_vals, sort_locations);\n    }\n  else\n    {\n    init_batch_std(locs, vals, sort_locations);\n    }\n  }\n\n\n\n//! Insert a large number of values at once.\n//! locations.row[0] should be row indices, locations.row[1] should be column indices,\n//! and values should be the corresponding values.\n//! If sort_locations is false, then it is assumed that the locations and values\n//! are already sorted in column-major ordering.\n//! In this constructor the size is explicitly given.\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nSpMat<eT>::SpMat(const Base<uword,T1>& locations_expr, const Base<eT,T2>& vals_expr, const uword in_n_rows, const uword in_n_cols, const bool sort_locations, const bool check_for_zeros)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , n_nonzero(0)\n  , vec_state(0)\n  , values(NULL)\n  , row_indices(NULL)\n  , col_ptrs(NULL)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  const unwrap<T1> locs_tmp( locations_expr.get_ref() );\n  const unwrap<T2> vals_tmp(      vals_expr.get_ref() );\n  \n  const Mat<uword>& locs = locs_tmp.M;\n  const Mat<eT>&    vals = vals_tmp.M;\n  \n  arma_debug_check( (vals.is_vec() == false),     \"SpMat::SpMat(): given 'values' object is not a vector\"                  );\n  arma_debug_check( (locs.n_rows != 2),           \"SpMat::SpMat(): locations matrix must have two rows\"                    );\n  arma_debug_check( (locs.n_cols != vals.n_elem), \"SpMat::SpMat(): number of locations is different than number of values\" );\n  \n  init(in_n_rows, in_n_cols);\n\n  // Ensure that there are no zeros, unless the user asked not to.\n  if(check_for_zeros)\n    {\n    const uword N_old = vals.n_elem;\n          uword N_new = 0;\n    \n    for(uword i = 0; i < N_old; ++i)\n      {\n      if(vals[i] != eT(0))  { ++N_new; }\n      }\n    \n    if(N_new != N_old)\n      {\n      Col<eT>    filtered_vals(N_new);\n      Mat<uword> filtered_locs(2, N_new);\n      \n      uword index = 0;\n      for(uword i = 0; i < N_old; ++i)\n        {\n        if(vals[i] != eT(0))\n          {\n          filtered_vals[index] = vals[i];\n          \n          filtered_locs.at(0, index) = locs.at(0, i);\n          filtered_locs.at(1, index) = locs.at(1, i);\n          \n          ++index;\n          }\n        }\n      \n      init_batch_std(filtered_locs, filtered_vals, sort_locations);\n      }\n    else\n      {\n      init_batch_std(locs, vals, sort_locations);\n      }\n    }\n  else\n    {\n    init_batch_std(locs, vals, sort_locations);\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nSpMat<eT>::SpMat(const bool add_values, const Base<uword,T1>& locations_expr, const Base<eT,T2>& vals_expr, const uword in_n_rows, const uword in_n_cols, const bool sort_locations, const bool check_for_zeros)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , n_nonzero(0)\n  , vec_state(0)\n  , values(NULL)\n  , row_indices(NULL)\n  , col_ptrs(NULL)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  const unwrap<T1> locs_tmp( locations_expr.get_ref() );\n  const unwrap<T2> vals_tmp(      vals_expr.get_ref() );\n  \n  const Mat<uword>& locs = locs_tmp.M;\n  const Mat<eT>&    vals = vals_tmp.M;\n  \n  arma_debug_check( (vals.is_vec() == false),     \"SpMat::SpMat(): given 'values' object is not a vector\"                  );\n  arma_debug_check( (locs.n_rows != 2),           \"SpMat::SpMat(): locations matrix must have two rows\"                    );\n  arma_debug_check( (locs.n_cols != vals.n_elem), \"SpMat::SpMat(): number of locations is different than number of values\" );\n  \n  init(in_n_rows, in_n_cols);\n\n  // Ensure that there are no zeros, unless the user asked not to.\n  if(check_for_zeros)\n    {\n    const uword N_old = vals.n_elem;\n          uword N_new = 0;\n    \n    for(uword i = 0; i < N_old; ++i)\n      {\n      if(vals[i] != eT(0))  { ++N_new; }\n      }\n    \n    if(N_new != N_old)\n      {\n      Col<eT>    filtered_vals(N_new);\n      Mat<uword> filtered_locs(2, N_new);\n      \n      uword index = 0;\n      for(uword i = 0; i < N_old; ++i)\n        {\n        if(vals[i] != eT(0))\n          {\n          filtered_vals[index] = vals[i];\n          \n          filtered_locs.at(0, index) = locs.at(0, i);\n          filtered_locs.at(1, index) = locs.at(1, i);\n          \n          ++index;\n          }\n        }\n      \n      add_values ? init_batch_add(filtered_locs, filtered_vals, sort_locations) : init_batch_std(filtered_locs, filtered_vals, sort_locations);\n      }\n    else\n      {\n      add_values ? init_batch_add(locs, vals, sort_locations) : init_batch_std(locs, vals, sort_locations);\n      }\n    }\n  else\n    {\n    add_values ? init_batch_add(locs, vals, sort_locations) : init_batch_std(locs, vals, sort_locations);\n    }\n  }\n\n\n\n//! Insert a large number of values at once.\n//! Per CSC format, rowind_expr should be row indices, \n//! colptr_expr should column ptr indices locations,\n//! and values should be the corresponding values.\n//! In this constructor the size is explicitly given.\n//! Values are assumed to be sorted, and the size \n//! information is trusted\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename T3>\ninline\nSpMat<eT>::SpMat\n  (\n  const Base<uword,T1>& rowind_expr, \n  const Base<uword,T2>& colptr_expr, \n  const Base<eT,   T3>& values_expr, \n  const uword           in_n_rows, \n  const uword           in_n_cols\n  )\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , n_nonzero(0)\n  , vec_state(0)\n  , values(NULL)\n  , row_indices(NULL)\n  , col_ptrs(NULL)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init(in_n_rows, in_n_cols);\n  \n  const unwrap<T1> rowind_tmp( rowind_expr.get_ref() );\n  const unwrap<T2> colptr_tmp( colptr_expr.get_ref() );\n  const unwrap<T3>   vals_tmp( values_expr.get_ref() );\n  \n  const Mat<uword>& rowind = rowind_tmp.M;\n  const Mat<uword>& colptr = colptr_tmp.M;\n  const Mat<eT>&      vals = vals_tmp.M;\n  \n  arma_debug_check( (rowind.is_vec() == false), \"SpMat::SpMat(): given 'rowind' object is not a vector\" );\n  arma_debug_check( (colptr.is_vec() == false), \"SpMat::SpMat(): given 'colptr' object is not a vector\" );\n  arma_debug_check( (vals.is_vec()   == false), \"SpMat::SpMat(): given 'values' object is not a vector\" );\n  \n  arma_debug_check( (rowind.n_elem != vals.n_elem), \"SpMat::SpMat(): number of row indices is not equal to number of values\" );\n  arma_debug_check( (colptr.n_elem != (n_cols+1) ), \"SpMat::SpMat(): number of column pointers is not equal to n_cols+1\" );\n  \n  // Resize to correct number of elements (this also sets n_nonzero)\n  mem_resize(vals.n_elem);\n  \n  // copy supplied values into sparse matrix -- not checked for consistency\n  arrayops::copy(access::rwp(row_indices), rowind.memptr(), rowind.n_elem );\n  arrayops::copy(access::rwp(col_ptrs),    colptr.memptr(), colptr.n_elem );\n  arrayops::copy(access::rwp(values),      vals.memptr(),   vals.n_elem   );\n  \n  // important: set the sentinel as well\n  access::rw(col_ptrs[n_cols + 1]) = std::numeric_limits<uword>::max();\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(val != eT(0))\n    {\n    // Resize to 1x1 then set that to the right value.\n    init(1, 1); // Sets col_ptrs to 0.\n    mem_resize(1); // One element.\n    \n    // Manually set element.\n    access::rw(values[0]) = val;\n    access::rw(row_indices[0]) = 0;\n    access::rw(col_ptrs[1]) = 1;\n    }\n  else\n    {\n    init(0, 0);\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator*=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(val != eT(0))\n    {\n    arrayops::inplace_mul( access::rwp(values), val, n_nonzero );\n    \n    remove_zeros();\n    }\n  else\n    {\n    // Everything will be zero.\n    init(n_rows, n_cols);\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator/=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (val == eT(0)), \"element-wise division: division by zero\" );\n  \n  arrayops::inplace_div( access::rwp(values), val, n_nonzero );\n  \n  remove_zeros();\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator=(const SpMat<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  init(x);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator+=(const SpMat<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT> out = (*this) + x;\n  \n  steal_mem(out);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator-=(const SpMat<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT> out = (*this) - x;\n  \n  steal_mem(out);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator*=(const SpMat<eT>& y)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT> z = (*this) * y;\n  \n  steal_mem(z);\n  \n  return *this;\n  }\n\n\n\n// This is in-place element-wise matrix multiplication.\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator%=(const SpMat<eT>& y)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT> z = (*this) % y;\n  \n  steal_mem(z);\n  \n  return *this;\n  }\n\n\n\n// Construct a complex matrix out of two non-complex matrices\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nSpMat<eT>::SpMat\n  (\n  const SpBase<typename SpMat<eT>::pod_type, T1>& A,\n  const SpBase<typename SpMat<eT>::pod_type, T2>& B\n  )\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , n_nonzero(0)\n  , vec_state(0)\n  , values(NULL) // extra element is set when mem_resize is called\n  , row_indices(NULL)\n  , col_ptrs(NULL)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type T;\n  \n  // Make sure eT is complex and T is not (compile-time check).\n  arma_type_check(( is_complex<eT>::value == false ));\n  arma_type_check(( is_complex< T>::value == true  ));\n  \n  // Compile-time abort if types are not compatible.\n  arma_type_check(( is_same_type< std::complex<T>, eT >::no ));\n  \n  const unwrap_spmat<T1> tmp1(A.get_ref());\n  const unwrap_spmat<T2> tmp2(B.get_ref());\n  \n  const SpMat<T>& X = tmp1.M;\n  const SpMat<T>& Y = tmp2.M;\n  \n  arma_debug_assert_same_size(X.n_rows, X.n_cols, Y.n_rows, Y.n_cols, \"SpMat()\");\n  \n  const uword l_n_rows = X.n_rows;\n  const uword l_n_cols = X.n_cols;\n  \n  // Set size of matrix correctly.\n  init(l_n_rows, l_n_cols);\n  mem_resize(n_unique(X, Y, op_n_unique_count()));\n  \n  // Now on a second iteration, fill it.\n  typename SpMat<T>::const_iterator x_it  = X.begin();\n  typename SpMat<T>::const_iterator x_end = X.end();\n  \n  typename SpMat<T>::const_iterator y_it  = Y.begin();\n  typename SpMat<T>::const_iterator y_end = Y.end();\n  \n  uword cur_pos = 0;\n  \n  while ((x_it != x_end) || (y_it != y_end))\n    {\n    if(x_it == y_it) // if we are at the same place\n      {\n      access::rw(values[cur_pos]) = std::complex<T>((T) *x_it, (T) *y_it);\n      access::rw(row_indices[cur_pos]) = x_it.row();\n      ++access::rw(col_ptrs[x_it.col() + 1]);\n      \n      ++x_it;\n      ++y_it;\n      }\n    else\n      {\n      if((x_it.col() < y_it.col()) || ((x_it.col() == y_it.col()) && (x_it.row() < y_it.row()))) // if y is closer to the end\n        {\n        access::rw(values[cur_pos]) = std::complex<T>((T) *x_it, T(0));\n        access::rw(row_indices[cur_pos]) = x_it.row();\n        ++access::rw(col_ptrs[x_it.col() + 1]);\n        \n        ++x_it;\n        }\n      else // x is closer to the end\n        {\n        access::rw(values[cur_pos]) = std::complex<T>(T(0), (T) *y_it);\n        access::rw(row_indices[cur_pos]) = y_it.row();\n        ++access::rw(col_ptrs[y_it.col() + 1]);\n        \n        ++y_it;\n        }\n      }\n    \n    ++cur_pos;\n    }\n  \n  // Now fix the column pointers; they are supposed to be a sum.\n  for (uword c = 1; c <= n_cols; ++c)\n    {\n    access::rw(col_ptrs[c]) += col_ptrs[c - 1];\n    }\n  \n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator/=(const SpMat<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(n_rows, n_cols, x.n_rows, x.n_cols, \"element-wise division\");\n  \n  // If you use this method, you are probably stupid or misguided, but for compatibility with Mat, we have implemented it anyway.\n  // We have to loop over every element, which is not good.  In fact, it makes me physically sad to write this.\n  for(uword c = 0; c < n_cols; ++c)\n    {\n    for(uword r = 0; r < n_rows; ++r)\n      {\n      at(r, c) /= x.at(r, c);\n      }\n    }\n\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nSpMat<eT>::SpMat(const Base<eT, T1>& x)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , n_nonzero(0)\n  , vec_state(0)\n  , values(NULL) // extra element is set when mem_resize is called in operator=()\n  , row_indices(NULL)\n  , col_ptrs(NULL)\n  {\n  arma_extra_debug_sigprint_this(this);\n\n  (*this).operator=(x);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator=(const Base<eT, T1>& expr)\n  {\n  arma_extra_debug_sigprint();\n  \n  const quasi_unwrap<T1> tmp(expr.get_ref());\n  const Mat<eT>& x     = tmp.M;\n  \n  const uword x_n_rows = x.n_rows;\n  const uword x_n_cols = x.n_cols;\n  const uword x_n_elem = x.n_elem;\n  \n  init(x_n_rows, x_n_cols);\n  \n  // Count number of nonzero elements in base object.\n  uword n = 0;\n  \n  const eT* x_mem = x.memptr();\n  \n  for(uword i = 0; i < x_n_elem; ++i)\n    {\n    n += (x_mem[i] != eT(0)) ? uword(1) : uword(0);\n    }\n  \n  mem_resize(n);\n  \n  // Now the memory is resized correctly; add nonzero elements.\n  n = 0;\n  for(uword j = 0; j < x_n_cols; ++j)\n  for(uword i = 0; i < x_n_rows; ++i)\n    {\n    const eT val = (*x_mem);  x_mem++;\n    \n    if(val != eT(0))\n      {\n      access::rw(values[n])      = val;\n      access::rw(row_indices[n]) = i;\n      access::rw(col_ptrs[j + 1])++;\n      ++n;\n      }\n    }\n  \n  // Sum column counts to be column pointers.\n  for(uword c = 1; c <= n_cols; ++c)\n    {\n    access::rw(col_ptrs[c]) += col_ptrs[c - 1];\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator+=(const Base<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).operator=( (*this) + x.get_ref() );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator-=(const Base<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).operator=( (*this) - x.get_ref() );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator*=(const Base<eT, T1>& y)\n  {\n  arma_extra_debug_sigprint();\n\n  const Proxy<T1> p(y.get_ref());\n\n  arma_debug_assert_mul_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), \"matrix multiplication\");\n\n  // We assume the matrix structure is such that we will end up with a sparse\n  // matrix.  Assuming that every entry in the dense matrix is nonzero (which is\n  // a fairly valid assumption), each row with any nonzero elements in it (in this\n  // matrix) implies an entire nonzero column.  Therefore, we iterate over all\n  // the row_indices and count the number of rows with any elements in them\n  // (using the quasi-linked-list idea from SYMBMM -- see operator_times.hpp).\n  podarray<uword> index(n_rows);\n  index.fill(n_rows); // Fill with invalid links.\n\n  uword last_index = n_rows + 1;\n  for(uword i = 0; i < n_nonzero; ++i)\n    {\n    if(index[row_indices[i]] == n_rows)\n      {\n      index[row_indices[i]] = last_index;\n      last_index = row_indices[i];\n      }\n    }\n\n  // Now count the number of rows which have nonzero elements.\n  uword nonzero_rows = 0;\n  while(last_index != n_rows + 1)\n    {\n    ++nonzero_rows;\n    last_index = index[last_index];\n    }\n\n  SpMat<eT> z(n_rows, p.get_n_cols());\n\n  z.mem_resize(nonzero_rows * p.get_n_cols()); // upper bound on size\n\n  // Now we have to fill all the elements using a modification of the NUMBMM algorithm.\n  uword cur_pos = 0;\n\n  podarray<eT> partial_sums(n_rows);\n  partial_sums.zeros();\n\n  for(uword lcol = 0; lcol < n_cols; ++lcol)\n    {\n    const_iterator it = begin();\n\n    while(it != end())\n      {\n      const eT value = (*it);\n\n      partial_sums[it.row()] += (value * p.at(it.col(), lcol));\n\n      ++it;\n      }\n\n    // Now add all partial sums to the matrix.\n    for(uword i = 0; i < n_rows; ++i)\n      {\n      if(partial_sums[i] != eT(0))\n        {\n        access::rw(z.values[cur_pos]) = partial_sums[i];\n        access::rw(z.row_indices[cur_pos]) = i;\n        ++access::rw(z.col_ptrs[lcol + 1]);\n        //printf(\"colptr %d now %d\\n\", lcol + 1, z.col_ptrs[lcol + 1]);\n        ++cur_pos;\n        partial_sums[i] = 0; // Would it be faster to do this in batch later?\n        }\n      }\n    }\n\n  // Now fix the column pointers.\n  for(uword c = 1; c <= z.n_cols; ++c)\n    {\n    access::rw(z.col_ptrs[c]) += z.col_ptrs[c - 1];\n    }\n\n  // Resize to final correct size.\n  z.mem_resize(z.col_ptrs[z.n_cols]);\n  \n  // Now take the memory of the temporary matrix.\n  steal_mem(z);\n  \n  return *this;\n  }\n\n\n\n/**\n * Don't use this function.  It's not mathematically well-defined and wastes\n * cycles to trash all your data.  This is dumb.\n */\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator/=(const Base<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n\n  SpMat<eT> tmp = (*this) / x.get_ref();\n  \n  steal_mem(tmp);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator%=(const Base<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n\n  const Proxy<T1> p(x.get_ref());\n  \n  arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), \"element-wise multiplication\");\n  \n  // Count the number of elements we will need.\n  SpMat<eT> tmp(n_rows, n_cols);\n  const_iterator it = begin();\n  uword new_n_nonzero = 0;\n\n  while(it != end())\n    {\n    // prefer_at_accessor == false can't save us any work here\n    if(((*it) * p.at(it.row(), it.col())) != eT(0))\n      {\n      ++new_n_nonzero;\n      }\n    ++it;\n    }\n\n  // Resize.\n  tmp.mem_resize(new_n_nonzero);\n\n  const_iterator c_it = begin();\n  uword cur_pos = 0;\n  while(c_it != end())\n    {\n    // prefer_at_accessor == false can't save us any work here\n    const eT val = (*c_it) * p.at(c_it.row(), c_it.col());\n    if(val != eT(0))\n      {\n      access::rw(tmp.values[cur_pos]) = val;\n      access::rw(tmp.row_indices[cur_pos]) = c_it.row();\n      ++access::rw(tmp.col_ptrs[c_it.col() + 1]);\n      ++cur_pos;\n      }\n\n    ++c_it;\n    }\n\n  // Fix column pointers.\n  for(uword c = 1; c <= n_cols; ++c)\n    {\n    access::rw(tmp.col_ptrs[c]) += tmp.col_ptrs[c - 1];\n    }\n\n  steal_mem(tmp);\n\n  return *this;\n  }\n\n\n\n/**\n * Functions on subviews.\n */\ntemplate<typename eT>\ninline\nSpMat<eT>::SpMat(const SpSubview<eT>& X)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , n_nonzero(0)\n  , vec_state(0)\n  , values(NULL) // extra element added when mem_resize is called\n  , row_indices(NULL)\n  , col_ptrs(NULL)\n  {\n  arma_extra_debug_sigprint_this(this);\n\n  (*this).operator=(X);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator=(const SpSubview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword in_n_cols = X.n_cols;\n  const uword in_n_rows = X.n_rows;\n  \n  const bool alias = (this == &(X.m));\n\n  if(alias == false)\n    {\n    init(in_n_rows, in_n_cols);\n\n    const uword x_n_nonzero = X.n_nonzero;\n\n    mem_resize(x_n_nonzero);\n\n    typename SpSubview<eT>::const_iterator it     = X.begin();\n    typename SpSubview<eT>::const_iterator it_end = X.end();\n\n    while(it != it_end)\n      {\n      access::rw(row_indices[it.pos()]) = it.row();\n      access::rw(values[it.pos()]) = (*it);\n      ++access::rw(col_ptrs[it.col() + 1]);\n      ++it;\n      }\n\n    // Now sum column pointers.\n    for(uword c = 1; c <= n_cols; ++c)\n      {\n      access::rw(col_ptrs[c]) += col_ptrs[c - 1];\n      }\n    }\n  else\n    {\n    // Create it in a temporary.\n    SpMat<eT> tmp(X);\n\n    steal_mem(tmp);\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator+=(const SpSubview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT> tmp = (*this) + X;\n  \n  steal_mem(tmp);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator-=(const SpSubview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT> tmp = (*this) - X;\n  \n  steal_mem(tmp);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator*=(const SpSubview<eT>& y)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT> z = (*this) * y;\n  \n  steal_mem(z);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator%=(const SpSubview<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT> tmp = (*this) % x;\n  \n  steal_mem(tmp);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator/=(const SpSubview<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(n_rows, n_cols, x.n_rows, x.n_cols, \"element-wise division\");\n  \n  // There is no pretty way to do this.\n  for(uword elem = 0; elem < n_elem; elem++)\n    {\n    at(elem) /= x(elem);\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename spop_type>\ninline\nSpMat<eT>::SpMat(const SpOp<T1, spop_type>& X)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , n_nonzero(0)\n  , vec_state(0)\n  , values(NULL) // set in application of sparse operation\n  , row_indices(NULL)\n  , col_ptrs(NULL)\n  {\n  arma_extra_debug_sigprint_this(this);\n\n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  spop_type::apply(*this, X);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename spop_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator=(const SpOp<T1, spop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  spop_type::apply(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename spop_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator+=(const SpOp<T1, spop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const SpMat<eT> m(X);\n  \n  return (*this).operator+=(m);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename spop_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator-=(const SpOp<T1, spop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const SpMat<eT> m(X);\n  \n  return (*this).operator-=(m);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename spop_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator*=(const SpOp<T1, spop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const SpMat<eT> m(X);\n  \n  return (*this).operator*=(m);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename spop_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator%=(const SpOp<T1, spop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const SpMat<eT> m(X);\n  \n  return (*this).operator%=(m);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename spop_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator/=(const SpOp<T1, spop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const SpMat<eT> m(X);\n  \n  return (*this).operator/=(m);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename spglue_type>\ninline\nSpMat<eT>::SpMat(const SpGlue<T1, T2, spglue_type>& X)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , n_nonzero(0)\n  , vec_state(0)\n  , values(NULL) // extra element set in application of sparse glue\n  , row_indices(NULL)\n  , col_ptrs(NULL)\n  {\n  arma_extra_debug_sigprint_this(this);\n\n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  spglue_type::apply(*this, X);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename spop_type>\ninline\nSpMat<eT>::SpMat(const mtSpOp<eT, T1, spop_type>& X)\n  : n_rows(0)\n  , n_cols(0)\n  , n_elem(0)\n  , n_nonzero(0)\n  , vec_state(0)\n  , values(NULL) // extra element set in application of sparse glue\n  , row_indices(NULL)\n  , col_ptrs(NULL)\n  {\n  arma_extra_debug_sigprint_this(this);\n\n  spop_type::apply(*this, X);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename spop_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator=(const mtSpOp<eT, T1, spop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  spop_type::apply(*this, X);\n\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename spop_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator+=(const mtSpOp<eT, T1, spop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  const SpMat<eT> m(X);\n\n  return (*this).operator+=(m);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename spop_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator-=(const mtSpOp<eT, T1, spop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  const SpMat<eT> m(X);\n\n  return (*this).operator-=(m);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename spop_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator*=(const mtSpOp<eT, T1, spop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  const SpMat<eT> m(X);\n\n  return (*this).operator*=(m);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename spop_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator%=(const mtSpOp<eT, T1, spop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  const SpMat<eT> m(X);\n\n  return (*this).operator%=(m);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename spop_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator/=(const mtSpOp<eT, T1, spop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  const SpMat<eT> m(X);\n\n  return (*this).operator/=(m);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename spglue_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator=(const SpGlue<T1, T2, spglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  spglue_type::apply(*this, X);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename spglue_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator+=(const SpGlue<T1, T2, spglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const SpMat<eT> m(X);\n  \n  return (*this).operator+=(m);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename spglue_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator-=(const SpGlue<T1, T2, spglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const SpMat<eT> m(X);\n  \n  return (*this).operator-=(m);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename spglue_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator*=(const SpGlue<T1, T2, spglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const SpMat<eT> m(X);\n  \n  return (*this).operator*=(m);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename spglue_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator%=(const SpGlue<T1, T2, spglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const SpMat<eT> m(X);\n  \n  return (*this).operator%=(m);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename spglue_type>\ninline\nconst SpMat<eT>&\nSpMat<eT>::operator/=(const SpGlue<T1, T2, spglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));\n  \n  const SpMat<eT> m(X);\n  \n  return (*this).operator/=(m);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nSpSubview<eT>\nSpMat<eT>::row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check(row_num >= n_rows, \"SpMat::row(): out of bounds\");\n\n  return SpSubview<eT>(*this, row_num, 0, 1, n_cols);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst SpSubview<eT>\nSpMat<eT>::row(const uword row_num) const\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check(row_num >= n_rows, \"SpMat::row(): out of bounds\");\n\n  return SpSubview<eT>(*this, row_num, 0, 1, n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpMat<eT>::operator()(const uword row_num, const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool col_all = col_span.whole;\n  \n  const uword local_n_cols = n_cols;\n  \n  const uword in_col1       = col_all ? 0            : col_span.a;\n  const uword in_col2       =                          col_span.b;\n  const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  arma_debug_check\n    (\n    (row_num >= n_rows)\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,\n    \"SpMat::operator(): indices out of bounds or incorrectly used\"\n    );\n  \n  return SpSubview<eT>(*this, row_num, in_col1, 1, submat_n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpMat<eT>::operator()(const uword row_num, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool col_all = col_span.whole;\n  \n  const uword local_n_cols = n_cols;\n  \n  const uword in_col1       = col_all ? 0            : col_span.a;\n  const uword in_col2       =                          col_span.b;\n  const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  arma_debug_check\n    (\n    (row_num >= n_rows)\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,\n    \"SpMat::operator(): indices out of bounds or incorrectly used\"\n    );\n  \n  return SpSubview<eT>(*this, row_num, in_col1, 1, submat_n_cols);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nSpSubview<eT>\nSpMat<eT>::col(const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check(col_num >= n_cols, \"SpMat::col(): out of bounds\");\n\n  return SpSubview<eT>(*this, 0, col_num, n_rows, 1);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst SpSubview<eT>\nSpMat<eT>::col(const uword col_num) const\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check(col_num >= n_cols, \"SpMat::col(): out of bounds\");\n\n  return SpSubview<eT>(*this, 0, col_num, n_rows, 1);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpMat<eT>::operator()(const span& row_span, const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all = row_span.whole;\n  \n  const uword local_n_rows = n_rows;\n  \n  const uword in_row1       = row_all ? 0            : row_span.a;\n  const uword in_row2       =                          row_span.b;\n  const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  arma_debug_check\n    (\n    (col_num >= n_cols)\n    ||\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ,\n    \"SpMat::operator(): indices out of bounds or incorrectly used\"\n    );\n  \n  return SpSubview<eT>(*this, in_row1, col_num, submat_n_rows, 1);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpMat<eT>::operator()(const span& row_span, const uword col_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all = row_span.whole;\n  \n  const uword local_n_rows = n_rows;\n  \n  const uword in_row1       = row_all ? 0            : row_span.a;\n  const uword in_row2       =                          row_span.b;\n  const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  arma_debug_check\n    (\n    (col_num >= n_cols)\n    ||\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ,\n    \"SpMat::operator(): indices out of bounds or incorrectly used\"\n    );\n  \n  return SpSubview<eT>(*this, in_row1, col_num, submat_n_rows, 1);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nSpSubview<eT>\nSpMat<eT>::rows(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_row2 >= n_rows),\n    \"SpMat::rows(): indices out of bounds or incorrectly used\"\n    );\n\n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n\n  return SpSubview<eT>(*this, in_row1, 0, subview_n_rows, n_cols);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst SpSubview<eT>\nSpMat<eT>::rows(const uword in_row1, const uword in_row2) const\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_row2 >= n_rows),\n    \"SpMat::rows(): indices out of bounds or incorrectly used\"\n    );\n\n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n\n  return SpSubview<eT>(*this, in_row1, 0, subview_n_rows, n_cols);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nSpSubview<eT>\nSpMat<eT>::cols(const uword in_col1, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check\n    (\n    (in_col1 > in_col2) || (in_col2 >= n_cols),\n    \"SpMat::cols(): indices out of bounds or incorrectly used\"\n    );\n\n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n\n  return SpSubview<eT>(*this, 0, in_col1, n_rows, subview_n_cols);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst SpSubview<eT>\nSpMat<eT>::cols(const uword in_col1, const uword in_col2) const\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check\n    (\n    (in_col1 > in_col2) || (in_col2 >= n_cols),\n    \"SpMat::cols(): indices out of bounds or incorrectly used\"\n    );\n\n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n\n  return SpSubview<eT>(*this, 0, in_col1, n_rows, subview_n_cols);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nSpSubview<eT>\nSpMat<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_col1 >  in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),\n    \"SpMat::submat(): indices out of bounds or incorrectly used\"\n    );\n\n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n\n  return SpSubview<eT>(*this, in_row1, in_col1, subview_n_rows, subview_n_cols);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst SpSubview<eT>\nSpMat<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_col1 >  in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),\n    \"SpMat::submat(): indices out of bounds or incorrectly used\"\n    );\n\n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n\n  return SpSubview<eT>(*this, in_row1, in_col1, subview_n_rows, subview_n_cols);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nSpSubview<eT>\nSpMat<eT>::submat(const uword in_row1, const uword in_col1, const SizeMat& s)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword l_n_rows = n_rows;\n  const uword l_n_cols = n_cols;\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  \n  arma_debug_check\n    (\n    ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols)),\n    \"SpMat::submat(): indices or size out of bounds\"\n    );\n  \n  return SpSubview<eT>(*this, in_row1, in_col1, s_n_rows, s_n_cols);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst SpSubview<eT>\nSpMat<eT>::submat(const uword in_row1, const uword in_col1, const SizeMat& s) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword l_n_rows = n_rows;\n  const uword l_n_cols = n_cols;\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  \n  arma_debug_check\n    (\n    ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols)),\n    \"SpMat::submat(): indices or size out of bounds\"\n    );\n  \n  return SpSubview<eT>(*this, in_row1, in_col1, s_n_rows, s_n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpMat<eT>::submat(const span& row_span, const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n\n  const bool row_all = row_span.whole;\n  const bool col_all = col_span.whole;\n  \n  const uword local_n_rows = n_rows;\n  const uword local_n_cols = n_cols;\n  \n  const uword in_row1       = row_all ? 0            : row_span.a;\n  const uword in_row2       =                          row_span.b;\n  const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; \n  \n  const uword in_col1       = col_all ? 0            : col_span.a;\n  const uword in_col2       =                          col_span.b;\n  const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; \n  \n  arma_debug_check\n    (    \n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ||   \n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,    \n    \"SpMat::submat(): indices out of bounds or incorrectly used\"\n    );   \n  \n  return SpSubview<eT>(*this, in_row1, in_col1, submat_n_rows, submat_n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpMat<eT>::submat(const span& row_span, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n\n  const bool row_all = row_span.whole;\n  const bool col_all = col_span.whole;\n  \n  const uword local_n_rows = n_rows;\n  const uword local_n_cols = n_cols;\n  \n  const uword in_row1       = row_all ? 0            : row_span.a;\n  const uword in_row2       =                          row_span.b;\n  const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; \n  \n  const uword in_col1       = col_all ? 0            : col_span.a;\n  const uword in_col2       =                          col_span.b;\n  const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; \n  \n  arma_debug_check\n    (    \n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ||   \n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,    \n    \"SpMat::submat(): indices out of bounds or incorrectly used\"\n    );   \n  \n  return SpSubview<eT>(*this, in_row1, in_col1, submat_n_rows, submat_n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpMat<eT>::operator()(const span& row_span, const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n\n  return submat(row_span, col_span);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpMat<eT>::operator()(const span& row_span, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n\n  return submat(row_span, col_span);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nSpSubview<eT>\nSpMat<eT>::operator()(const uword in_row1, const uword in_col1, const SizeMat& s)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).submat(in_row1, in_col1, s);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst SpSubview<eT>\nSpMat<eT>::operator()(const uword in_row1, const uword in_col1, const SizeMat& s) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).submat(in_row1, in_col1, s);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpMat<eT>::head_rows(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > n_rows), \"SpMat::head_rows(): size out of bounds\");\n  \n  return SpSubview<eT>(*this, 0, 0, N, n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpMat<eT>::head_rows(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > n_rows), \"SpMat::head_rows(): size out of bounds\");\n  \n  return SpSubview<eT>(*this, 0, 0, N, n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpMat<eT>::tail_rows(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > n_rows), \"SpMat::tail_rows(): size out of bounds\");\n  \n  const uword start_row = n_rows - N;\n  \n  return SpSubview<eT>(*this, start_row, 0, N, n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpMat<eT>::tail_rows(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > n_rows), \"SpMat::tail_rows(): size out of bounds\");\n  \n  const uword start_row = n_rows - N;\n  \n  return SpSubview<eT>(*this, start_row, 0, N, n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpMat<eT>::head_cols(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > n_cols), \"SpMat::head_cols(): size out of bounds\");\n  \n  return SpSubview<eT>(*this, 0, 0, n_rows, N);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpMat<eT>::head_cols(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > n_cols), \"SpMat::head_cols(): size out of bounds\");\n  \n  return SpSubview<eT>(*this, 0, 0, n_rows, N);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpMat<eT>::tail_cols(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > n_cols), \"SpMat::tail_cols(): size out of bounds\");\n  \n  const uword start_col = n_cols - N;\n  \n  return SpSubview<eT>(*this, 0, start_col, n_rows, N);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpMat<eT>::tail_cols(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > n_cols), \"SpMat::tail_cols(): size out of bounds\");\n  \n  const uword start_col = n_cols - N;\n  \n  return SpSubview<eT>(*this, 0, start_col, n_rows, N);\n  }\n\n\n\n//! creation of spdiagview (diagonal)\ntemplate<typename eT>\ninline\nspdiagview<eT>\nSpMat<eT>::diag(const sword in_id)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword row_offset = (in_id < 0) ? uword(-in_id) : 0;\n  const uword col_offset = (in_id > 0) ? uword( in_id) : 0;\n  \n  arma_debug_check\n    (\n    ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),\n    \"SpMat::diag(): requested diagonal out of bounds\"\n    );\n  \n  const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);\n  \n  return spdiagview<eT>(*this, row_offset, col_offset, len);\n  }\n\n\n\n//! creation of spdiagview (diagonal)\ntemplate<typename eT>\ninline\nconst spdiagview<eT>\nSpMat<eT>::diag(const sword in_id) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword row_offset = (in_id < 0) ? -in_id : 0;\n  const uword col_offset = (in_id > 0) ?  in_id : 0;\n  \n  arma_debug_check\n    (\n    ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),\n    \"SpMat::diag(): requested diagonal out of bounds\"\n    );\n  \n  const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);\n  \n  return spdiagview<eT>(*this, row_offset, col_offset, len);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::swap_rows(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check\n    (\n    (in_row1 >= n_rows) || (in_row2 >= n_rows),\n    \"SpMat::swap_rows(): out of bounds\"\n    );\n\n  // Sanity check.\n  if (in_row1 == in_row2)\n    {\n    return;\n    }\n\n  // The easier way to do this, instead of collecting all the elements in one row and then swapping with the other, will be\n  // to iterate over each column of the matrix (since we store in column-major format) and then swap the two elements in the two rows at that time.\n  // We will try to avoid using the at() call since it is expensive, instead preferring to use an iterator to track our position.\n  uword col1 = (in_row1 < in_row2) ? in_row1 : in_row2;\n  uword col2 = (in_row1 < in_row2) ? in_row2 : in_row1;\n\n  for (uword lcol = 0; lcol < n_cols; lcol++)\n    {\n    // If there is nothing in this column we can ignore it.\n    if (col_ptrs[lcol] == col_ptrs[lcol + 1])\n      {\n      continue;\n      }\n\n    // These will represent the positions of the items themselves.\n    uword loc1 = n_nonzero + 1;\n    uword loc2 = n_nonzero + 1;\n\n    for (uword search_pos = col_ptrs[lcol]; search_pos < col_ptrs[lcol + 1]; search_pos++)\n      {\n      if (row_indices[search_pos] == col1)\n        {\n        loc1 = search_pos;\n        }\n\n      if (row_indices[search_pos] == col2)\n        {\n        loc2 = search_pos;\n        break; // No need to look any further.\n        }\n      }\n\n    // There are four cases: we found both elements; we found one element (loc1); we found one element (loc2); we found zero elements.\n    // If we found zero elements no work needs to be done and we can continue to the next column.\n    if ((loc1 != (n_nonzero + 1)) && (loc2 != (n_nonzero + 1)))\n      {\n      // This is an easy case: just swap the values.  No index modifying necessary.\n      eT tmp = values[loc1];\n      access::rw(values[loc1]) = values[loc2];\n      access::rw(values[loc2]) = tmp;\n      }\n    else if (loc1 != (n_nonzero + 1)) // We only found loc1 and not loc2.\n      {\n      // We need to find the correct place to move our value to.  It will be forward (not backwards) because in_row2 > in_row1.\n      // Each iteration of the loop swaps the current value (loc1) with (loc1 + 1); in this manner we move our value down to where it should be.\n      while (((loc1 + 1) < col_ptrs[lcol + 1]) && (row_indices[loc1 + 1] < in_row2))\n        {\n        // Swap both the values and the indices.  The column should not change.\n        eT tmp = values[loc1];\n        access::rw(values[loc1]) = values[loc1 + 1];\n        access::rw(values[loc1 + 1]) = tmp;\n\n        uword tmp_index = row_indices[loc1];\n        access::rw(row_indices[loc1]) = row_indices[loc1 + 1];\n        access::rw(row_indices[loc1 + 1]) = tmp_index;\n\n        loc1++; // And increment the counter.\n        }\n\n      // Now set the row index correctly.\n      access::rw(row_indices[loc1]) = in_row2;\n\n      }\n    else if (loc2 != (n_nonzero + 1))\n      {\n      // We need to find the correct place to move our value to.  It will be backwards (not forwards) because in_row1 < in_row2.\n      // Each iteration of the loop swaps the current value (loc2) with (loc2 - 1); in this manner we move our value up to where it should be.\n      while (((loc2 - 1) >= col_ptrs[lcol]) && (row_indices[loc2 - 1] > in_row1))\n        {\n        // Swap both the values and the indices.  The column should not change.\n        eT tmp = values[loc2];\n        access::rw(values[loc2]) = values[loc2 - 1];\n        access::rw(values[loc2 - 1]) = tmp;\n\n        uword tmp_index = row_indices[loc2];\n        access::rw(row_indices[loc2]) = row_indices[loc2 - 1];\n        access::rw(row_indices[loc2 - 1]) = tmp_index;\n\n        loc2--; // And decrement the counter.\n        }\n\n      // Now set the row index correctly.\n      access::rw(row_indices[loc2]) = in_row1;\n\n      }\n    /* else: no need to swap anything; both values are zero */\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::swap_cols(const uword in_col1, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n\n  // slow but works\n  for(uword lrow = 0; lrow < n_rows; ++lrow)\n    {\n    eT tmp = at(lrow, in_col1);\n    at(lrow, in_col1) = at(lrow, in_col2);\n    at(lrow, in_col2) = tmp;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::shed_row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n  arma_debug_check (row_num >= n_rows, \"SpMat::shed_row(): out of bounds\");\n\n  shed_rows (row_num, row_num);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::shed_col(const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n  arma_debug_check (col_num >= n_cols, \"SpMat::shed_col(): out of bounds\");\n\n  shed_cols(col_num, col_num);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::shed_rows(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_row2 >= n_rows),\n    \"SpMat::shed_rows(): indices out of bounds or incorectly used\"\n    );\n  \n  SpMat<eT> newmat(n_rows - (in_row2 - in_row1 + 1), n_cols);\n  \n  // First, count the number of elements we will be removing.\n  uword removing = 0;\n  for (uword i = 0; i < n_nonzero; ++i)\n    {\n    const uword lrow = row_indices[i];\n    if (lrow >= in_row1 && lrow <= in_row2)\n      {\n      ++removing;\n      }\n    }\n  \n  // Obtain counts of the number of points in each column and store them as the\n  // (invalid) column pointers of the new matrix.\n  for (uword i = 1; i < n_cols + 1; ++i)\n    {\n    access::rw(newmat.col_ptrs[i]) = col_ptrs[i] - col_ptrs[i - 1];\n    }\n  \n  // Now initialize memory for the new matrix.\n  newmat.mem_resize(n_nonzero - removing);\n  \n  // Now, copy over the elements.\n  // i is the index in the old matrix; j is the index in the new matrix.\n  const_iterator it     = begin();\n  const_iterator it_end = end();\n  \n  uword j = 0; // The index in the new matrix.\n  while (it != it_end)\n    {\n    const uword lrow = it.row();\n    const uword lcol = it.col();\n    \n    if (lrow >= in_row1 && lrow <= in_row2)\n      {\n      // This element is being removed.  Subtract it from the column counts.\n      --access::rw(newmat.col_ptrs[lcol + 1]);\n      }\n    else\n      {\n      // This element is being kept.  We may need to map the row index,\n      // if it is past the section of rows we are removing.\n      if (lrow > in_row2)\n        {\n        access::rw(newmat.row_indices[j]) = lrow - (in_row2 - in_row1 + 1);\n        }\n      else\n        {\n        access::rw(newmat.row_indices[j]) = lrow;\n        }\n\n      access::rw(newmat.values[j]) = (*it);\n      ++j; // Increment index in new matrix.\n      }\n    \n    ++it;\n    }\n  \n  // Finally, sum the column counts so they are correct column pointers.\n  for (uword i = 1; i < n_cols + 1; ++i)\n    {\n    access::rw(newmat.col_ptrs[i]) += newmat.col_ptrs[i - 1];\n    }\n  \n  // Now steal the memory of the new matrix.\n  steal_mem(newmat);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::shed_cols(const uword in_col1, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check\n    (\n    (in_col1 > in_col2) || (in_col2 >= n_cols),\n    \"SpMat::shed_cols(): indices out of bounds or incorrectly used\"\n    );\n\n  // First we find the locations in values and row_indices for the column entries.\n  uword col_beg = col_ptrs[in_col1];\n  uword col_end = col_ptrs[in_col2 + 1];\n\n  // Then we find the number of entries in the column.\n  uword diff = col_end - col_beg;\n\n  if (diff > 0)\n    {\n    eT*    new_values      = memory::acquire_chunked<eT>   (n_nonzero - diff);\n    uword* new_row_indices = memory::acquire_chunked<uword>(n_nonzero - diff);\n\n    // Copy first part.\n    if (col_beg != 0)\n      {\n      arrayops::copy(new_values, values, col_beg);\n      arrayops::copy(new_row_indices, row_indices, col_beg);\n      }\n\n    // Copy second part.\n    if (col_end != n_nonzero)\n      {\n      arrayops::copy(new_values + col_beg, values + col_end, n_nonzero - col_end);\n      arrayops::copy(new_row_indices + col_beg, row_indices + col_end, n_nonzero - col_end);\n      }\n\n    memory::release(values);\n    memory::release(row_indices);\n\n    access::rw(values)      = new_values;\n    access::rw(row_indices) = new_row_indices;\n\n    // Update counts and such.\n    access::rw(n_nonzero) -= diff;\n    }\n  \n  // Update column pointers.\n  const uword new_n_cols = n_cols - ((in_col2 - in_col1) + 1);\n  \n  uword* new_col_ptrs = memory::acquire<uword>(new_n_cols + 2);\n  new_col_ptrs[new_n_cols + 1] = std::numeric_limits<uword>::max();\n  \n  // Copy first set of columns (no manipulation required).\n  if (in_col1 != 0)\n    {\n    arrayops::copy(new_col_ptrs, col_ptrs, in_col1);\n    }\n  \n  // Copy second set of columns (manipulation required).\n  uword cur_col = in_col1;\n  for (uword i = in_col2 + 1; i <= n_cols; ++i, ++cur_col)\n    {\n    new_col_ptrs[cur_col] = col_ptrs[i] - diff;\n    }\n  \n  memory::release(col_ptrs);\n  access::rw(col_ptrs) = new_col_ptrs;\n  \n  // We update the element and column counts, and we're done.\n  access::rw(n_cols) = new_n_cols;\n  access::rw(n_elem) = n_cols * n_rows;\n  }\n\n\n\n/**\n * Element access; acces the i'th element (works identically to the Mat accessors).\n * If there is nothing at element i, 0 is returned.\n */\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nSpValProxy<SpMat<eT> >\nSpMat<eT>::operator[](const uword i)\n  {\n  return get_value(i);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT\nSpMat<eT>::operator[](const uword i) const\n  {\n  return get_value(i);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nSpValProxy<SpMat<eT> >\nSpMat<eT>::at(const uword i)\n  {\n  return get_value(i);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT\nSpMat<eT>::at(const uword i) const\n  {\n  return get_value(i);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nSpValProxy<SpMat<eT> >\nSpMat<eT>::operator()(const uword i)\n  {\n  arma_debug_check( (i >= n_elem), \"SpMat::operator(): out of bounds\");\n  return get_value(i);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT\nSpMat<eT>::operator()(const uword i) const\n  {\n  arma_debug_check( (i >= n_elem), \"SpMat::operator(): out of bounds\");\n  return get_value(i);\n  }\n\n\n\n/**\n * Element access; access the element at row in_rows and column in_col.\n * If there is nothing at that position, 0 is returned.\n */\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nSpValProxy<SpMat<eT> >\nSpMat<eT>::at(const uword in_row, const uword in_col)\n  {\n  return get_value(in_row, in_col);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT\nSpMat<eT>::at(const uword in_row, const uword in_col) const\n  {\n  return get_value(in_row, in_col);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nSpValProxy<SpMat<eT> >\nSpMat<eT>::operator()(const uword in_row, const uword in_col)\n  {\n  arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), \"SpMat::operator(): out of bounds\");\n  return get_value(in_row, in_col);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\neT\nSpMat<eT>::operator()(const uword in_row, const uword in_col) const\n  {\n  arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), \"SpMat::operator(): out of bounds\");\n  return get_value(in_row, in_col);\n  }\n\n\n\n/**\n * Check if matrix is empty (no size, no values).\n */\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nSpMat<eT>::is_empty() const\n  {\n  return(n_elem == 0);\n  }\n\n\n\n//! returns true if the object can be interpreted as a column or row vector\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nSpMat<eT>::is_vec() const\n  {\n  return ( (n_rows == 1) || (n_cols == 1) );\n  }\n\n\n\n//! returns true if the object can be interpreted as a row vector\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nSpMat<eT>::is_rowvec() const\n  {\n  return (n_rows == 1);\n  }\n\n\n\n//! returns true if the object can be interpreted as a column vector\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nSpMat<eT>::is_colvec() const\n  {\n  return (n_cols == 1);\n  }\n\n\n\n//! returns true if the object has the same number of non-zero rows and columnns\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nSpMat<eT>::is_square() const\n  {\n  return (n_rows == n_cols);\n  }\n\n\n\n//! returns true if all of the elements are finite\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nSpMat<eT>::is_finite() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return arrayops::is_finite(values, n_nonzero);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nSpMat<eT>::has_inf() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return arrayops::has_inf(values, n_nonzero);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nSpMat<eT>::has_nan() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return arrayops::has_nan(values, n_nonzero);\n  }\n\n\n\n//! returns true if the given index is currently in range\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nSpMat<eT>::in_range(const uword i) const\n  {\n  return (i < n_elem);\n  }\n\n\n//! returns true if the given start and end indices are currently in range\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nSpMat<eT>::in_range(const span& x) const\n  {\n  arma_extra_debug_sigprint();\n\n  if(x.whole == true)\n    {\n    return true;\n    }\n  else\n    {\n    const uword a = x.a;\n    const uword b = x.b;\n\n    return ( (a <= b) && (b < n_elem) );\n    }\n  }\n\n\n\n//! returns true if the given location is currently in range\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nSpMat<eT>::in_range(const uword in_row, const uword in_col) const\n  {\n  return ( (in_row < n_rows) && (in_col < n_cols) );\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nSpMat<eT>::in_range(const span& row_span, const uword in_col) const\n  {\n  arma_extra_debug_sigprint();\n\n  if(row_span.whole == true)\n    {\n    return (in_col < n_cols);\n    }\n  else\n    {\n    const uword in_row1 = row_span.a;\n    const uword in_row2 = row_span.b;\n\n    return ( (in_row1 <= in_row2) && (in_row2 < n_rows) && (in_col < n_cols) );\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nSpMat<eT>::in_range(const uword in_row, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n\n  if(col_span.whole == true)\n    {\n    return (in_row < n_rows);\n    }\n  else\n    {\n    const uword in_col1 = col_span.a;\n    const uword in_col2 = col_span.b;\n\n    return ( (in_row < n_rows) && (in_col1 <= in_col2) && (in_col2 < n_cols) );\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nSpMat<eT>::in_range(const span& row_span, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n\n  const uword in_row1 = row_span.a;\n  const uword in_row2 = row_span.b;\n\n  const uword in_col1 = col_span.a;\n  const uword in_col2 = col_span.b;\n\n  const bool rows_ok = row_span.whole ? true : ( (in_row1 <= in_row2) && (in_row2 < n_rows) );\n  const bool cols_ok = col_span.whole ? true : ( (in_col1 <= in_col2) && (in_col2 < n_cols) );\n\n  return ( (rows_ok == true) && (cols_ok == true) );\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nSpMat<eT>::in_range(const uword in_row, const uword in_col, const SizeMat& s) const\n  {\n  const uword l_n_rows = n_rows;\n  const uword l_n_cols = n_cols;\n  \n  if( (in_row >= l_n_rows) || (in_col >= l_n_cols) || ((in_row + s.n_rows) > l_n_rows) || ((in_col + s.n_cols) > l_n_cols) )\n    {\n    return false;\n    }\n  else\n    {\n    return true;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::impl_print(const std::string& extra_text) const\n  {\n  arma_extra_debug_sigprint();\n\n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = ARMA_DEFAULT_OSTREAM.width();\n\n    ARMA_DEFAULT_OSTREAM << extra_text << '\\n';\n\n    ARMA_DEFAULT_OSTREAM.width(orig_width);\n    }\n\n  arma_ostream::print(ARMA_DEFAULT_OSTREAM, *this, true);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::impl_print(std::ostream& user_stream, const std::string& extra_text) const\n  {\n  arma_extra_debug_sigprint();\n\n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = user_stream.width();\n\n    user_stream << extra_text << '\\n';\n\n    user_stream.width(orig_width);\n    }\n\n  arma_ostream::print(user_stream, *this, true);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::impl_raw_print(const std::string& extra_text) const\n  {\n  arma_extra_debug_sigprint();\n\n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = ARMA_DEFAULT_OSTREAM.width();\n\n    ARMA_DEFAULT_OSTREAM << extra_text << '\\n';\n\n    ARMA_DEFAULT_OSTREAM.width(orig_width);\n    }\n\n  arma_ostream::print(ARMA_DEFAULT_OSTREAM, *this, false);\n  }\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::impl_raw_print(std::ostream& user_stream, const std::string& extra_text) const\n  {\n  arma_extra_debug_sigprint();\n\n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = user_stream.width();\n\n    user_stream << extra_text << '\\n';\n\n    user_stream.width(orig_width);\n    }\n\n  arma_ostream::print(user_stream, *this, false);\n  }\n\n\n\n/**\n * Matrix printing, prepends supplied text.\n * Prints 0 wherever no element exists.\n */\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::impl_print_dense(const std::string& extra_text) const\n  {\n  arma_extra_debug_sigprint();\n\n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = ARMA_DEFAULT_OSTREAM.width();\n\n    ARMA_DEFAULT_OSTREAM << extra_text << '\\n';\n\n    ARMA_DEFAULT_OSTREAM.width(orig_width);\n    }\n\n  arma_ostream::print_dense(ARMA_DEFAULT_OSTREAM, *this, true);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::impl_print_dense(std::ostream& user_stream, const std::string& extra_text) const\n  {\n  arma_extra_debug_sigprint();\n\n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = user_stream.width();\n\n    user_stream << extra_text << '\\n';\n\n    user_stream.width(orig_width);\n    }\n\n  arma_ostream::print_dense(user_stream, *this, true);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::impl_raw_print_dense(const std::string& extra_text) const\n  {\n  arma_extra_debug_sigprint();\n\n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = ARMA_DEFAULT_OSTREAM.width();\n\n    ARMA_DEFAULT_OSTREAM << extra_text << '\\n';\n\n    ARMA_DEFAULT_OSTREAM.width(orig_width);\n    }\n\n  arma_ostream::print_dense(ARMA_DEFAULT_OSTREAM, *this, false);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::impl_raw_print_dense(std::ostream& user_stream, const std::string& extra_text) const\n  {\n  arma_extra_debug_sigprint();\n\n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = user_stream.width();\n\n    user_stream << extra_text << '\\n';\n\n    user_stream.width(orig_width);\n    }\n\n  arma_ostream::print_dense(user_stream, *this, false);\n  }\n\n\n\n//! Set the size to the size of another matrix.\ntemplate<typename eT>\ntemplate<typename eT2>\ninline\nvoid\nSpMat<eT>::copy_size(const SpMat<eT2>& m)\n  {\n  arma_extra_debug_sigprint();\n\n  set_size(m.n_rows, m.n_cols);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename eT2>\ninline\nvoid\nSpMat<eT>::copy_size(const Mat<eT2>& m)\n  {\n  arma_extra_debug_sigprint();\n\n  set_size(m.n_rows, m.n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::set_size(const uword in_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  // If this is a row vector, we resize to a row vector.\n  if(vec_state == 2)\n    {\n    set_size(1, in_elem);\n    }\n  else\n    {\n    set_size(in_elem, 1);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::set_size(const uword in_rows, const uword in_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  if( (n_rows == in_rows) && (n_cols == in_cols) )\n    {\n    return;\n    }\n  else\n    {\n    init(in_rows, in_cols);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::resize(const uword in_rows, const uword in_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  if( (n_rows == in_rows) || (n_cols == in_cols) )\n    {\n    return;\n    }\n  \n  if( (n_elem == 0) || (n_nonzero == 0) )\n    {\n    set_size(in_rows, in_cols);\n    return;\n    }\n  \n  SpMat<eT> tmp(in_rows, in_cols);\n  \n  if(tmp.n_elem > 0)\n    {\n    const uword end_row = (std::min)(in_rows, n_rows) - 1;\n    const uword end_col = (std::min)(in_cols, n_cols) - 1;\n    \n    tmp.submat(0, 0, end_row, end_col) = (*this).submat(0, 0, end_row, end_col);\n    }\n  \n  steal_mem(tmp);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::reshape(const uword in_rows, const uword in_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_check( ((in_rows*in_cols) != n_elem), \"SpMat::reshape(): changing the number of elements in a sparse matrix is currently not supported\" );\n  \n  if( (n_rows == in_rows) && (n_cols == in_cols) )  { return; }\n  \n  // We have to modify all of the relevant row indices and the relevant column pointers.\n  // Iterate over all the points to do this.  We won't be deleting any points, but we will be modifying\n  // columns and rows. We'll have to store a new set of column vectors.\n  uword* new_col_ptrs    = memory::acquire<uword>(in_cols + 2);\n  new_col_ptrs[in_cols + 1] = std::numeric_limits<uword>::max();\n  \n  uword* new_row_indices = memory::acquire_chunked<uword>(n_nonzero + 1);\n  access::rw(new_row_indices[n_nonzero]) = 0;\n  \n  arrayops::inplace_set(new_col_ptrs, uword(0), in_cols + 1);\n  \n  for(const_iterator it = begin(); it != end(); it++)\n    {\n    uword vector_position = (it.col() * n_rows) + it.row();\n    new_row_indices[it.pos()] = vector_position % in_rows;\n    ++new_col_ptrs[vector_position / in_rows + 1];\n    }\n  \n  // Now sum the column counts to get the new column pointers.\n  for(uword i = 1; i <= in_cols; i++)\n    {\n    access::rw(new_col_ptrs[i]) += new_col_ptrs[i - 1];\n    }\n  \n  // Copy the new row indices.\n  memory::release(row_indices);\n  access::rw(row_indices) = new_row_indices;\n  \n  memory::release(col_ptrs);\n  access::rw(col_ptrs) = new_col_ptrs;\n  \n  // Now set the size.\n  access::rw(n_rows) = in_rows;\n  access::rw(n_cols) = in_cols;\n  }\n\n\n\n// this form is deprecated: don't use it\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::reshape(const uword in_rows, const uword in_cols, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (dim > 1), \"SpMat::reshape(): paramter 'dim' must be 0 or 1\" );\n  \n  if(dim == 0)\n    {\n    (*this).reshape(in_rows, in_cols);\n    }\n  else\n  if(dim == 1)\n    {\n    arma_check( ((in_rows*in_cols) != n_elem), \"SpMat::reshape(): changing the number of elements in a sparse matrix is currently not supported\" );\n    \n    // Row-wise reshaping.  This is more tedious and we will use a separate sparse matrix to do it.\n    SpMat<eT> tmp(in_rows, in_cols);\n    \n    for(const_row_iterator it = begin_row(); it.pos() < n_nonzero; it++)\n      {\n      uword vector_position = (it.row() * n_cols) + it.col();\n      \n      tmp((vector_position / in_cols), (vector_position % in_cols)) = (*it);\n      }\n    \n    steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::zeros()\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_nonzero != 0)\n    {\n    init(n_rows, n_cols);\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::zeros(const uword in_elem)\n  {\n  arma_extra_debug_sigprint();\n\n  if(vec_state == 2)\n    {\n    zeros(1, in_elem); // Row vector\n    }\n  else\n    {\n    zeros(in_elem, 1);\n    }\n\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::zeros(const uword in_rows, const uword in_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool already_done = ( (n_nonzero == 0) && (n_rows == in_rows) && (n_cols == in_cols) );\n  \n  if(already_done == false)\n    {\n    init(in_rows, in_cols);\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::eye()\n  {\n  arma_extra_debug_sigprint();\n\n  return (*this).eye(n_rows, n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::eye(const uword in_rows, const uword in_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword N = (std::min)(in_rows, in_cols);\n  \n  zeros(in_rows, in_cols);\n  \n  mem_resize(N);\n  \n  arrayops::inplace_set(access::rwp(values), eT(1), N);\n  \n  for(uword i = 0; i <  N; ++i) { access::rw(row_indices[i]) = i; }\n  \n  for(uword i = 0; i <= N; ++i) { access::rw(col_ptrs[i])    = i; }\n  \n  access::rw(n_nonzero) = N;\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::speye()\n  {\n  arma_extra_debug_sigprint();\n\n  return (*this).eye(n_rows, n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::speye(const uword in_n_rows, const uword in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).eye(in_n_rows, in_n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::sprandu(const uword in_rows, const uword in_cols, const double density)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (density < double(0)) || (density > double(1)) ), \"sprandu(): density must be in the [0,1] interval\" );\n  \n  zeros(in_rows, in_cols);\n  \n  mem_resize( uword(density * double(in_rows) * double(in_cols) + 0.5) );\n  \n  if(n_nonzero == 0)\n    {\n    return *this;\n    }\n  \n  arma_rng::randu<eT>::fill( access::rwp(values), n_nonzero );\n  \n  uvec indices = linspace<uvec>( 0u, in_rows*in_cols-1, n_nonzero );\n  \n  // perturb the indices\n  for(uword i=1; i < n_nonzero-1; ++i)\n    {\n    const uword index_left  = indices[i-1];\n    const uword index_right = indices[i+1];\n    \n    const uword center = (index_left + index_right) / 2;\n    \n    const uword delta1 = center      - index_left - 1;\n    const uword delta2 = index_right - center     - 1;\n    \n    const uword min_delta = (std::min)(delta1, delta2);\n    \n    uword index_new = uword( double(center) + double(min_delta) * (2.0*randu()-1.0) );\n    \n    // paranoia, but better be safe than sorry\n    if( (index_left < index_new) && (index_new < index_right) )\n      {\n      indices[i] = index_new;\n      }\n    }\n  \n  uword cur_index = 0;\n  uword count     = 0;  \n  \n  for(uword lcol = 0; lcol < in_cols; ++lcol)\n  for(uword lrow = 0; lrow < in_rows; ++lrow)\n    {\n    if(count == indices[cur_index])\n      {\n      access::rw(row_indices[cur_index]) = lrow;\n      access::rw(col_ptrs[lcol + 1])++;\n      ++cur_index;\n      }\n    \n    ++count;\n    }\n  \n  if(cur_index != n_nonzero)\n    {\n    // Fix size to correct size.\n    mem_resize(cur_index);\n    }\n  \n  // Sum column pointers.\n  for(uword lcol = 1; lcol <= in_cols; ++lcol)\n    {\n    access::rw(col_ptrs[lcol]) += col_ptrs[lcol - 1];\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpMat<eT>&\nSpMat<eT>::sprandn(const uword in_rows, const uword in_cols, const double density)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (density < double(0)) || (density > double(1)) ), \"sprandn(): density must be in the [0,1] interval\" );\n  \n  zeros(in_rows, in_cols);\n  \n  mem_resize( uword(density * double(in_rows) * double(in_cols) + 0.5) );\n  \n  if(n_nonzero == 0)\n    {\n    return *this;\n    }\n  \n  arma_rng::randn<eT>::fill( access::rwp(values), n_nonzero );\n  \n  uvec indices = linspace<uvec>( 0u, in_rows*in_cols-1, n_nonzero );\n  \n  // perturb the indices\n  for(uword i=1; i < n_nonzero-1; ++i)\n    {\n    const uword index_left  = indices[i-1];\n    const uword index_right = indices[i+1];\n    \n    const uword center = (index_left + index_right) / 2;\n    \n    const uword delta1 = center      - index_left - 1;\n    const uword delta2 = index_right - center     - 1;\n    \n    const uword min_delta = (std::min)(delta1, delta2);\n    \n    uword index_new = uword( double(center) + double(min_delta) * (2.0*randu()-1.0) );\n    \n    // paranoia, but better be safe than sorry\n    if( (index_left < index_new) && (index_new < index_right) )\n      {\n      indices[i] = index_new;\n      }\n    }\n  \n  uword cur_index = 0;\n  uword count     = 0;  \n  \n  for(uword lcol = 0; lcol < in_cols; ++lcol)\n  for(uword lrow = 0; lrow < in_rows; ++lrow)\n    {\n    if(count == indices[cur_index])\n      {\n      access::rw(row_indices[cur_index]) = lrow;\n      access::rw(col_ptrs[lcol + 1])++;\n      ++cur_index;\n      }\n    \n    ++count;\n    }\n  \n  if(cur_index != n_nonzero)\n    {\n    // Fix size to correct size.\n    mem_resize(cur_index);\n    }\n  \n  // Sum column pointers.\n  for(uword lcol = 1; lcol <= in_cols; ++lcol)\n    {\n    access::rw(col_ptrs[lcol]) += col_ptrs[lcol - 1];\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::reset()\n  {\n  arma_extra_debug_sigprint();\n\n  switch(vec_state)\n    {\n    default:\n      init(0, 0);\n      break;\n      \n    case 1:\n      init(0, 1);\n      break;\n    \n    case 2:\n      init(1, 0);\n      break;\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nSpMat<eT>::set_real(const SpBase<typename SpMat<eT>::pod_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat_aux::set_real(*this, X);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nSpMat<eT>::set_imag(const SpBase<typename SpMat<eT>::pod_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat_aux::set_imag(*this, X);\n  }\n\n\n\n//! save the matrix to a file\ntemplate<typename eT>\ninline\nbool\nSpMat<eT>::save(const std::string name, const file_type type, const bool print_status) const\n  {\n  arma_extra_debug_sigprint();\n  \n  bool save_okay;\n  \n  switch(type)\n    {\n    // case raw_ascii:\n    //   save_okay = diskio::save_raw_ascii(*this, name);\n    //   break;\n    \n    // case csv_ascii:\n    //   save_okay = diskio::save_csv_ascii(*this, name);\n    //   break;\n    \n    case arma_binary:\n      save_okay = diskio::save_arma_binary(*this, name);\n      break;\n    \n    case coord_ascii:\n      save_okay = diskio::save_coord_ascii(*this, name);\n      break;\n    \n    default:\n      arma_warn(print_status, \"SpMat::save(): unsupported file type\");\n      save_okay = false;\n    }\n  \n  arma_warn( print_status && (save_okay == false), \"SpMat::save(): couldn't write to \", name);\n  \n  return save_okay;\n  }\n\n\n\n//! save the matrix to a stream\ntemplate<typename eT>\ninline\nbool\nSpMat<eT>::save(std::ostream& os, const file_type type, const bool print_status) const\n  {\n  arma_extra_debug_sigprint();\n  \n  bool save_okay;\n  \n  switch(type)\n    {\n    // case raw_ascii:\n    //   save_okay = diskio::save_raw_ascii(*this, os);\n    //   break;\n    \n    // case csv_ascii:\n    //   save_okay = diskio::save_csv_ascii(*this, os);\n    //   break;\n    \n    case arma_binary:\n      save_okay = diskio::save_arma_binary(*this, os);\n      break;\n    \n    case coord_ascii:\n      save_okay = diskio::save_coord_ascii(*this, os);\n      break;\n    \n    default:\n      arma_warn(print_status, \"SpMat::save(): unsupported file type\");\n      save_okay = false;\n    }\n  \n  arma_warn( print_status && (save_okay == false), \"SpMat::save(): couldn't write to the given stream\");\n  \n  return save_okay;\n  }\n\n\n\n//! load a matrix from a file\ntemplate<typename eT>\ninline\nbool\nSpMat<eT>::load(const std::string name, const file_type type, const bool print_status)\n  {\n  arma_extra_debug_sigprint();\n  \n  bool load_okay;\n  std::string err_msg;\n  \n  switch(type)\n    {\n    // case auto_detect:\n    //   load_okay = diskio::load_auto_detect(*this, name, err_msg);\n    //   break;\n    \n    // case raw_ascii:\n    //   load_okay = diskio::load_raw_ascii(*this, name, err_msg);\n    //   break;\n    \n    // case csv_ascii:\n    //   load_okay = diskio::load_csv_ascii(*this, name, err_msg);\n    //   break;\n    \n    case arma_binary:\n      load_okay = diskio::load_arma_binary(*this, name, err_msg);\n      break;\n    \n    case coord_ascii:\n      load_okay = diskio::load_coord_ascii(*this, name, err_msg);\n      break;\n    \n    default:\n      arma_warn(print_status, \"SpMat::load(): unsupported file type\");\n      load_okay = false;\n    }\n  \n  if(load_okay == false)\n    {\n    if(err_msg.length() > 0)\n      {\n      arma_warn(print_status, \"SpMat::load(): \", err_msg, name);\n      }\n    else\n      {\n      arma_warn(print_status, \"SpMat::load(): couldn't read \", name);\n      }\n    }\n  \n  if(load_okay == false)\n    {\n    (*this).reset();\n    }\n    \n  return load_okay;\n  }\n\n\n\n//! load a matrix from a stream\ntemplate<typename eT>\ninline\nbool\nSpMat<eT>::load(std::istream& is, const file_type type, const bool print_status)\n  {\n  arma_extra_debug_sigprint();\n  \n  bool load_okay;\n  std::string err_msg;\n  \n  switch(type)\n    {\n    // case auto_detect:\n    //   load_okay = diskio::load_auto_detect(*this, is, err_msg);\n    //   break;\n    \n    // case raw_ascii:\n    //   load_okay = diskio::load_raw_ascii(*this, is, err_msg);\n    //   break;\n    \n    // case csv_ascii:\n    //   load_okay = diskio::load_csv_ascii(*this, is, err_msg);\n    //   break;\n    \n    case arma_binary:\n      load_okay = diskio::load_arma_binary(*this, is, err_msg);\n      break;\n    \n    case coord_ascii:\n      load_okay = diskio::load_coord_ascii(*this, is, err_msg);\n      break;\n    \n    default:\n      arma_warn(print_status, \"SpMat::load(): unsupported file type\");\n      load_okay = false;\n    }\n  \n  \n  if(load_okay == false)\n    {\n    if(err_msg.length() > 0)\n      {\n      arma_warn(print_status, \"SpMat::load(): \", err_msg, \"the given stream\");\n      }\n    else\n      {\n      arma_warn(print_status, \"SpMat::load(): couldn't load from the given stream\");\n      }\n    }\n  \n  if(load_okay == false)\n    {\n    (*this).reset();\n    }\n    \n  return load_okay;\n  }\n\n\n\n//! save the matrix to a file, without printing any error messages\ntemplate<typename eT>\ninline\nbool\nSpMat<eT>::quiet_save(const std::string name, const file_type type) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).save(name, type, false);\n  }\n\n\n\n//! save the matrix to a stream, without printing any error messages\ntemplate<typename eT>\ninline\nbool\nSpMat<eT>::quiet_save(std::ostream& os, const file_type type) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).save(os, type, false);\n  }\n\n\n\n//! load a matrix from a file, without printing any error messages\ntemplate<typename eT>\ninline\nbool\nSpMat<eT>::quiet_load(const std::string name, const file_type type)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).load(name, type, false);\n  }\n\n\n\n//! load a matrix from a stream, without printing any error messages\ntemplate<typename eT>\ninline\nbool\nSpMat<eT>::quiet_load(std::istream& is, const file_type type)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).load(is, type, false);\n  }\n\n\n\n/**\n * Initialize the matrix to the specified size.  Data is not preserved, so the matrix is assumed to be entirely sparse (empty).\n */\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::init(uword in_rows, uword in_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  // Verify that we are allowed to do this.\n  if(vec_state > 0)\n    {\n    if((in_rows == 0) && (in_cols == 0))\n      {\n      if(vec_state == 1)\n        {\n        in_cols = 1;\n        }\n      else\n      if(vec_state == 2)\n        {\n        in_rows = 1;\n        }\n      }\n    else\n      {\n      arma_debug_check\n        (\n        ( ((vec_state == 1) && (in_cols != 1)) || ((vec_state == 2) && (in_rows != 1)) ),\n        \"SpMat::init(): object is a row or column vector; requested size is not compatible\"\n        );\n      }\n    }\n  \n  #if (defined(ARMA_USE_CXX11) || defined(ARMA_64BIT_WORD))\n    const char* error_message = \"SpMat::init(): requested size is too large\";\n  #else\n    const char* error_message = \"SpMat::init(): requested size is too large; suggest to compile in C++11 mode or enable ARMA_64BIT_WORD\";\n  #endif\n  \n  // Ensure that n_elem can hold the result of (n_rows * n_cols)\n  arma_debug_check\n    (\n      (\n      ( (in_rows > ARMA_MAX_UHWORD) || (in_cols > ARMA_MAX_UHWORD) )\n        ? ( (double(in_rows) * double(in_cols)) > double(ARMA_MAX_UWORD) )\n        : false\n      ),\n      error_message\n    );\n  \n  // Clean out the existing memory.\n  if (values)\n    {\n    memory::release(values);\n    memory::release(row_indices);\n    }\n  \n  access::rw(values)      = memory::acquire_chunked<eT>   (1);\n  access::rw(row_indices) = memory::acquire_chunked<uword>(1);\n  \n  access::rw(values[0])      = 0;\n  access::rw(row_indices[0]) = 0;\n  \n  memory::release(col_ptrs);\n  \n  // Set the new size accordingly.\n  access::rw(n_rows)    = in_rows;\n  access::rw(n_cols)    = in_cols;\n  access::rw(n_elem)    = (in_rows * in_cols);\n  access::rw(n_nonzero) = 0;\n  \n  // Try to allocate the column pointers, filling them with 0,\n  // except for the last element which contains the maximum possible element\n  // (so iterators terminate correctly).\n  access::rw(col_ptrs) = memory::acquire<uword>(in_cols + 2);\n  \n  arrayops::inplace_set(access::rwp(col_ptrs), uword(0), in_cols + 1);\n  \n  access::rw(col_ptrs[in_cols + 1]) = std::numeric_limits<uword>::max();\n  }\n\n\n\n/**\n * Initialize the matrix from a string.\n */\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::init(const std::string& text)\n  {\n  arma_extra_debug_sigprint();\n\n  // Figure out the size first.\n  uword t_n_rows = 0;\n  uword t_n_cols = 0;\n\n  bool t_n_cols_found = false;\n\n  std::string token;\n\n  std::string::size_type line_start = 0;\n  std::string::size_type   line_end = 0;\n\n  while (line_start < text.length())\n    {\n\n    line_end = text.find(';', line_start);\n\n    if (line_end == std::string::npos)\n      line_end = text.length() - 1;\n\n    std::string::size_type line_len = line_end - line_start + 1;\n    std::stringstream line_stream(text.substr(line_start, line_len));\n\n    // Step through each column.\n    uword line_n_cols = 0;\n\n    while (line_stream >> token)\n      {\n      ++line_n_cols;\n      }\n\n    if (line_n_cols > 0)\n      {\n      if (t_n_cols_found == false)\n        {\n        t_n_cols = line_n_cols;\n        t_n_cols_found = true;\n        }\n      else // Check it each time through, just to make sure.\n        arma_check((line_n_cols != t_n_cols), \"SpMat::init(): inconsistent number of columns in given string\");\n\n      ++t_n_rows;\n      }\n\n    line_start = line_end + 1;\n\n    }\n\n  zeros(t_n_rows, t_n_cols);\n\n  // Second time through will pick up all the values.\n  line_start = 0;\n  line_end = 0;\n\n  uword lrow = 0;\n\n  while (line_start < text.length())\n    {\n\n    line_end = text.find(';', line_start);\n\n    if (line_end == std::string::npos)\n      line_end = text.length() - 1;\n\n    std::string::size_type line_len = line_end - line_start + 1;\n    std::stringstream line_stream(text.substr(line_start, line_len));\n\n    uword lcol = 0;\n    eT val;\n\n    while (line_stream >> val)\n      {\n      // Only add nonzero elements.\n      if (val != eT(0))\n        {\n        get_value(lrow, lcol) = val;\n        }\n\n      ++lcol;\n      }\n\n    ++lrow;\n    line_start = line_end + 1;\n\n    }\n\n  }\n\n/**\n * Copy from another matrix.\n */\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::init(const SpMat<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  // Ensure we are not initializing to ourselves.\n  if (this != &x)\n    {\n    init(x.n_rows, x.n_cols);\n\n    // values and row_indices may not be null.\n    if (values != NULL)\n      {\n      memory::release(values);\n      memory::release(row_indices);\n      }\n\n    access::rw(values)      = memory::acquire_chunked<eT>   (x.n_nonzero + 1);\n    access::rw(row_indices) = memory::acquire_chunked<uword>(x.n_nonzero + 1);\n\n    // Now copy over the elements.\n    arrayops::copy(access::rwp(values),      x.values,      x.n_nonzero + 1);\n    arrayops::copy(access::rwp(row_indices), x.row_indices, x.n_nonzero + 1);\n    arrayops::copy(access::rwp(col_ptrs),    x.col_ptrs,    x.n_cols + 1);\n    \n    access::rw(n_nonzero) = x.n_nonzero;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::init_batch_std(const Mat<uword>& locs, const Mat<eT>& vals, const bool sort_locations)\n  {\n  arma_extra_debug_sigprint();\n  \n  // Resize to correct number of elements.\n  mem_resize(vals.n_elem);\n  \n  // Reset column pointers to zero.\n  arrayops::inplace_set(access::rwp(col_ptrs), uword(0), n_cols + 1);\n  \n  bool actually_sorted = true;\n  \n  if(sort_locations == true)\n    {\n    // sort_index() uses std::sort() which may use quicksort... so we better\n    // make sure it's not already sorted before taking an O(N^2) sort penalty.\n    for (uword i = 1; i < locs.n_cols; ++i)\n      {\n      const uword* locs_i   = locs.colptr(i  );\n      const uword* locs_im1 = locs.colptr(i-1);\n      \n      if( (locs_i[1] < locs_im1[1]) || (locs_i[1] == locs_im1[1]  &&  locs_i[0] <= locs_im1[0]) )\n        {\n        actually_sorted = false;\n        break;\n        }\n      }\n    \n    if(actually_sorted == false)\n      {\n      // This may not be the fastest possible implementation but it maximizes code reuse.\n      Col<uword> abslocs(locs.n_cols);\n      \n      for (uword i = 0; i < locs.n_cols; ++i)\n        {\n        const uword* locs_i = locs.colptr(i);\n        \n        abslocs[i] = locs_i[1] * n_rows + locs_i[0];\n        }\n      \n      uvec sorted_indices = sort_index(abslocs); // Ascending sort.\n      \n      // Now we add the elements in this sorted order.\n      for (uword i = 0; i < sorted_indices.n_elem; ++i)\n        {\n        const uword* locs_i = locs.colptr( sorted_indices[i] );\n        \n        arma_debug_check( ( (locs_i[0] >= n_rows) || (locs_i[1] >= n_cols) ), \"SpMat::SpMat(): invalid row or column index\" );\n        \n        if(i > 0)\n          {\n          const uword* locs_im1 = locs.colptr( sorted_indices[i-1] );\n          \n          arma_debug_check( ( (locs_i[1] == locs_im1[1]) && (locs_i[0] == locs_im1[0]) ), \"SpMat::SpMat(): detected identical locations\" );\n          }\n        \n        access::rw(values[i])      = vals[ sorted_indices[i] ];\n        access::rw(row_indices[i]) = locs_i[0];\n        \n        access::rw(col_ptrs[ locs_i[1] + 1 ])++;\n        }\n      }\n    }\n  \n  if( (sort_locations == false) || (actually_sorted == true) )\n    {\n    // Now set the values and row indices correctly.\n    // Increment the column pointers in each column (so they are column \"counts\").\n    for(uword i = 0; i < vals.n_elem; ++i)\n      {\n      const uword* locs_i = locs.colptr(i);\n      \n      arma_debug_check( ( (locs_i[0] >= n_rows) || (locs_i[1] >= n_cols) ), \"SpMat::SpMat(): invalid row or column index\" );\n      \n      if(i > 0)\n        {\n        const uword* locs_im1 = locs.colptr(i-1);\n        \n        arma_debug_check\n          (\n          ( (locs_i[1] < locs_im1[1]) || (locs_i[1] == locs_im1[1]  &&  locs_i[0] < locs_im1[0]) ),\n          \"SpMat::SpMat(): out of order points; either pass sort_locations = true, or sort points in column-major ordering\"\n          );\n        \n        arma_debug_check( ( (locs_i[1] == locs_im1[1]) && (locs_i[0] == locs_im1[0]) ), \"SpMat::SpMat(): detected identical locations\" );\n        }\n      \n      access::rw(values[i])      = vals[i];\n      access::rw(row_indices[i]) = locs_i[0];\n      \n      access::rw(col_ptrs[ locs_i[1] + 1 ])++;\n      }\n    }\n  \n  // Now fix the column pointers.\n  for (uword i = 0; i < n_cols; ++i)\n    {\n    access::rw(col_ptrs[i + 1]) += col_ptrs[i];\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::init_batch_add(const Mat<uword>& locs, const Mat<eT>& vals, const bool sort_locations)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(locs.n_cols < 2)\n    {\n    init_batch_std(locs, vals, false);\n    return;\n    }\n  \n  // Reset column pointers to zero.\n  arrayops::inplace_set(access::rwp(col_ptrs), uword(0), n_cols + 1);\n  \n  bool actually_sorted = true;\n  \n  if(sort_locations == true)\n    {\n    // sort_index() uses std::sort() which may use quicksort... so we better\n    // make sure it's not already sorted before taking an O(N^2) sort penalty.\n    for (uword i = 1; i < locs.n_cols; ++i)\n      {\n      const uword* locs_i   = locs.colptr(i  );\n      const uword* locs_im1 = locs.colptr(i-1);\n      \n      if( (locs_i[1] < locs_im1[1]) || (locs_i[1] == locs_im1[1]  &&  locs_i[0] <= locs_im1[0]) )\n        {\n        actually_sorted = false;\n        break;\n        }\n      }\n    \n    if(actually_sorted == false)\n      {\n      // This may not be the fastest possible implementation but it maximizes code reuse.\n      Col<uword> abslocs(locs.n_cols);\n      \n      for (uword i = 0; i < locs.n_cols; ++i)\n        {\n        const uword* locs_i = locs.colptr(i);\n        \n        abslocs[i] = locs_i[1] * n_rows + locs_i[0];\n        }\n      \n      uvec sorted_indices = sort_index(abslocs); // Ascending sort.\n      \n      // work out the number of unique elments \n      uword n_unique = 1;  // first element is unique\n      \n      for(uword i=1; i < sorted_indices.n_elem; ++i)\n        {\n        const uword* locs_i   = locs.colptr( sorted_indices[i  ] );\n        const uword* locs_im1 = locs.colptr( sorted_indices[i-1] );\n        \n        if( (locs_i[1] != locs_im1[1]) || (locs_i[0] != locs_im1[0]) )  { ++n_unique; }\n        }\n      \n      // resize to correct number of elements\n      mem_resize(n_unique);\n      \n      // Now we add the elements in this sorted order.\n      uword count = 0;\n      \n      // first element\n        {\n        const uword  i      = 0;\n        const uword* locs_i = locs.colptr( sorted_indices[i] );\n        \n        arma_debug_check( ( (locs_i[0] >= n_rows) || (locs_i[1] >= n_cols) ), \"SpMat::SpMat(): invalid row or column index\" );\n        \n        access::rw(values[count])      = vals[ sorted_indices[i] ];\n        access::rw(row_indices[count]) = locs_i[0];\n        \n        access::rw(col_ptrs[ locs_i[1] + 1 ])++;\n        }\n      \n      for(uword i=1; i < sorted_indices.n_elem; ++i)\n        {\n        const uword* locs_i   = locs.colptr( sorted_indices[i  ] );\n        const uword* locs_im1 = locs.colptr( sorted_indices[i-1] );\n        \n        arma_debug_check( ( (locs_i[0] >= n_rows) || (locs_i[1] >= n_cols) ), \"SpMat::SpMat(): invalid row or column index\" );\n        \n        if( (locs_i[1] == locs_im1[1]) && (locs_i[0] == locs_im1[0]) )\n          {\n          access::rw(values[count]) += vals[ sorted_indices[i] ];\n          }\n        else\n          {\n          count++;\n          access::rw(values[count])      = vals[ sorted_indices[i] ];\n          access::rw(row_indices[count]) = locs_i[0];\n          \n          access::rw(col_ptrs[ locs_i[1] + 1 ])++;\n          }\n        }\n      }\n    }\n  \n  if( (sort_locations == false) || (actually_sorted == true) )\n    {\n    // work out the number of unique elments \n    uword n_unique = 1;  // first element is unique\n    \n    for(uword i=1; i < locs.n_cols; ++i)\n      {\n      const uword* locs_i   = locs.colptr(i  );\n      const uword* locs_im1 = locs.colptr(i-1);\n      \n      if( (locs_i[1] != locs_im1[1]) || (locs_i[0] != locs_im1[0]) )  { ++n_unique; }\n      }\n    \n    // resize to correct number of elements\n    mem_resize(n_unique);\n    \n    // Now set the values and row indices correctly.\n    // Increment the column pointers in each column (so they are column \"counts\").\n    \n    uword count = 0;\n    \n    // first element\n      {\n      const uword  i      = 0;\n      const uword* locs_i = locs.colptr(i);\n      \n      arma_debug_check( ( (locs_i[0] >= n_rows) || (locs_i[1] >= n_cols) ), \"SpMat::SpMat(): invalid row or column index\" );\n      \n      access::rw(values[count])      = vals[i];\n      access::rw(row_indices[count]) = locs_i[0];\n      \n      access::rw(col_ptrs[ locs_i[1] + 1 ])++;\n      }\n    \n    for(uword i=1; i < locs.n_cols; ++i)\n      {\n      const uword* locs_i   = locs.colptr(i  );\n      const uword* locs_im1 = locs.colptr(i-1);\n      \n      arma_debug_check( ( (locs_i[0] >= n_rows) || (locs_i[1] >= n_cols) ), \"SpMat::SpMat(): invalid row or column index\" );\n      \n      arma_debug_check\n        (\n        ( (locs_i[1] < locs_im1[1]) || (locs_i[1] == locs_im1[1]  &&  locs_i[0] < locs_im1[0]) ),\n        \"SpMat::SpMat(): out of order points; either pass sort_locations = true, or sort points in column-major ordering\"\n        );\n      \n      if( (locs_i[1] == locs_im1[1]) && (locs_i[0] == locs_im1[0]) )\n        {\n        access::rw(values[count]) += vals[i];\n        }\n      else\n        {\n        count++;\n        \n        access::rw(values[count])      = vals[i];\n        access::rw(row_indices[count]) = locs_i[0];\n        \n        access::rw(col_ptrs[ locs_i[1] + 1 ])++;\n        }\n      }\n    }\n  \n  // Now fix the column pointers.\n  for (uword i = 0; i < n_cols; ++i)\n    {\n    access::rw(col_ptrs[i + 1]) += col_ptrs[i];\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::mem_resize(const uword new_n_nonzero)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_nonzero != new_n_nonzero)\n    {\n    if(new_n_nonzero == 0)\n      {\n      memory::release(values);\n      memory::release(row_indices);\n      \n      access::rw(values)      = memory::acquire_chunked<eT>   (1);\n      access::rw(row_indices) = memory::acquire_chunked<uword>(1);\n\n      access::rw(     values[0]) = 0;\n      access::rw(row_indices[0]) = 0;\n      }\n    else\n      {\n      // Figure out the actual amount of memory currently allocated\n      // NOTE: this relies on memory::acquire_chunked() being used for the 'values' and 'row_indices' arrays\n      const uword n_alloc = memory::enlarge_to_mult_of_chunksize(n_nonzero);\n      \n      if(n_alloc < new_n_nonzero)\n        {\n        eT*    new_values      = memory::acquire_chunked<eT>   (new_n_nonzero + 1);\n        uword* new_row_indices = memory::acquire_chunked<uword>(new_n_nonzero + 1);\n        \n        if(n_nonzero > 0)\n          {\n          // Copy old elements.\n          uword copy_len = std::min(n_nonzero, new_n_nonzero);\n          \n          arrayops::copy(new_values,      values,      copy_len);\n          arrayops::copy(new_row_indices, row_indices, copy_len);\n          }\n        \n        memory::release(values);\n        memory::release(row_indices);\n        \n        access::rw(values)      = new_values;\n        access::rw(row_indices) = new_row_indices;\n        }\n        \n      // Set the \"fake end\" of the matrix by setting the last value and row\n      // index to 0.  This helps the iterators work correctly.\n      access::rw(     values[new_n_nonzero]) = 0;\n      access::rw(row_indices[new_n_nonzero]) = 0;\n      }\n    \n    access::rw(n_nonzero) = new_n_nonzero;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::remove_zeros()\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword old_n_nonzero = n_nonzero;\n        uword new_n_nonzero = 0;\n  \n  const eT* old_values = values;\n  \n  for(uword i=0; i < old_n_nonzero; ++i)\n    {\n    new_n_nonzero += (old_values[i] != eT(0)) ? uword(1) : uword(0);\n    }\n  \n  if(new_n_nonzero != old_n_nonzero)\n    {\n    if(new_n_nonzero == 0)  { init(n_rows, n_cols); return; }\n    \n    SpMat<eT> tmp(n_rows, n_cols);\n    \n    tmp.mem_resize(new_n_nonzero);\n    \n    uword new_index = 0;\n    \n    const_iterator it     = begin();\n    const_iterator it_end = end();\n    \n    for(; it != it_end; ++it)\n      {\n      const eT val = eT(*it);\n      \n      if(val != eT(0))\n        {\n        access::rw(tmp.values[new_index])      = val;\n        access::rw(tmp.row_indices[new_index]) = it.row();\n        access::rw(tmp.col_ptrs[it.col() + 1])++;\n        ++new_index;\n        }\n      }\n    \n    for(uword i=0; i < n_cols; ++i)\n      {\n      access::rw(tmp.col_ptrs[i + 1]) += tmp.col_ptrs[i];\n      }\n    \n    steal_mem(tmp);\n    }\n  }\n\n\n\n// Steal memory from another matrix.\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::steal_mem(SpMat<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(this != &x)\n    {\n    if(values     )  { memory::release(access::rw(values));      }\n    if(row_indices)  { memory::release(access::rw(row_indices)); }\n    if(col_ptrs   )  { memory::release(access::rw(col_ptrs));    }\n    \n    access::rw(n_rows)    = x.n_rows;\n    access::rw(n_cols)    = x.n_cols;\n    access::rw(n_elem)    = x.n_elem;\n    access::rw(n_nonzero) = x.n_nonzero;\n    \n    access::rw(values)      = x.values;\n    access::rw(row_indices) = x.row_indices;\n    access::rw(col_ptrs)    = x.col_ptrs;\n    \n    // Set other matrix to empty.\n    access::rw(x.n_rows)    = 0;\n    access::rw(x.n_cols)    = 0;\n    access::rw(x.n_elem)    = 0;\n    access::rw(x.n_nonzero) = 0;\n    \n    access::rw(x.values)      = NULL;\n    access::rw(x.row_indices) = NULL;\n    access::rw(x.col_ptrs)    = NULL;\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename Functor>\narma_hot\ninline\nvoid\nSpMat<eT>::init_xform(const SpBase<eT,T1>& A, const Functor& func)\n  {\n  arma_extra_debug_sigprint();\n  \n  // if possible, avoid doing a copy and instead apply func to the generated elements\n  if(SpProxy<T1>::Q_created_by_proxy)\n    {\n    (*this) = A.get_ref();\n    \n    const uword nnz = n_nonzero;\n    \n    eT* t_values = access::rwp(values);\n    \n    for(uword i=0; i < nnz; ++i)\n      {\n      t_values[i] = func(t_values[i]);\n      }\n    \n    remove_zeros();\n    }\n  else\n    {\n    init_xform_mt(A.get_ref(), func);\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename eT2, typename T1, typename Functor>\narma_hot\ninline\nvoid\nSpMat<eT>::init_xform_mt(const SpBase<eT2,T1>& A, const Functor& func)\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> P(A.get_ref());\n  \n  if( (P.is_alias(*this) == true) || (is_SpMat<typename SpProxy<T1>::stored_type>::value == true) )\n    {\n    // NOTE: unwrap_spmat will convert a submatrix to a matrix, which in effect takes care of aliasing with submatrices;\n    // NOTE: however, when more delayed ops are implemented, more elaborate handling of aliasing will be necessary\n    const unwrap_spmat<typename SpProxy<T1>::stored_type> tmp(P.Q);\n    \n    const SpMat<eT2>& x = tmp.M;\n    \n    if(void_ptr(this) != void_ptr(&x))\n      {\n      init(x.n_rows, x.n_cols);\n      \n      // values and row_indices may not be null.\n      if(values != NULL)\n        {\n        memory::release(values);\n        memory::release(row_indices);\n        }\n      \n      access::rw(values)      = memory::acquire_chunked<eT>   (x.n_nonzero + 1);\n      access::rw(row_indices) = memory::acquire_chunked<uword>(x.n_nonzero + 1);\n      \n      arrayops::copy(access::rwp(row_indices), x.row_indices, x.n_nonzero + 1);\n      arrayops::copy(access::rwp(col_ptrs),    x.col_ptrs,    x.n_cols    + 1);\n      \n      access::rw(n_nonzero) = x.n_nonzero;\n      }\n    \n    \n    // initialise the elements array with a transformed version of the elements from x\n    \n    const uword nnz = n_nonzero;\n    \n    const eT2* x_values = x.values;\n          eT*  t_values = access::rwp(values);\n    \n    for(uword i=0; i < nnz; ++i)\n      {\n      t_values[i] = func(x_values[i]);   // NOTE: func() must produce a value of type eT (ie. act as a convertor between eT2 and eT)\n      }\n    }\n  else\n    {\n    init(P.get_n_rows(), P.get_n_cols());\n    \n    mem_resize(P.get_n_nonzero());\n    \n    typename SpProxy<T1>::const_iterator_type it     = P.begin();\n    typename SpProxy<T1>::const_iterator_type it_end = P.end();\n    \n    while(it != it_end)\n      {\n      access::rw(row_indices[it.pos()]) = it.row();\n      access::rw(values[it.pos()]) = func(*it);   // NOTE: func() must produce a value of type eT (ie. act as a convertor between eT2 and eT)\n      ++access::rw(col_ptrs[it.col() + 1]);\n      ++it;\n      }\n    \n    // Now sum column pointers.\n    for(uword c = 1; c <= n_cols; ++c)\n      {\n      access::rw(col_ptrs[c]) += col_ptrs[c - 1];\n      }\n    }\n  \n  remove_zeros();\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::iterator\nSpMat<eT>::begin()\n  {\n  return iterator(*this);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::const_iterator\nSpMat<eT>::begin() const\n  {\n  return const_iterator(*this);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::iterator\nSpMat<eT>::end()\n  {\n  return iterator(*this, 0, n_cols, n_nonzero);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::const_iterator\nSpMat<eT>::end() const\n  {\n  return const_iterator(*this, 0, n_cols, n_nonzero);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::iterator\nSpMat<eT>::begin_col(const uword col_num)\n  {\n  return iterator(*this, 0, col_num);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::const_iterator\nSpMat<eT>::begin_col(const uword col_num) const\n  {\n  return const_iterator(*this, 0, col_num);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::iterator\nSpMat<eT>::end_col(const uword col_num)\n  {\n  return iterator(*this, 0, col_num + 1);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::const_iterator\nSpMat<eT>::end_col(const uword col_num) const\n  {\n  return const_iterator(*this, 0, col_num + 1);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::row_iterator\nSpMat<eT>::begin_row(const uword row_num)\n  {\n  return row_iterator(*this, row_num, 0);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::const_row_iterator\nSpMat<eT>::begin_row(const uword row_num) const\n  {\n  return const_row_iterator(*this, row_num, 0);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::row_iterator\nSpMat<eT>::end_row()\n  {\n  return row_iterator(*this, n_nonzero);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::const_row_iterator\nSpMat<eT>::end_row() const\n  {\n  return const_row_iterator(*this, n_nonzero);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::row_iterator\nSpMat<eT>::end_row(const uword row_num)\n  {\n  return row_iterator(*this, row_num + 1, 0);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::const_row_iterator\nSpMat<eT>::end_row(const uword row_num) const\n  {\n  return const_row_iterator(*this, row_num + 1, 0);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::row_col_iterator\nSpMat<eT>::begin_row_col()\n  {\n  return begin();\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::const_row_col_iterator\nSpMat<eT>::begin_row_col() const\n  {\n  return begin();\n  }\n\n\n\ntemplate<typename eT>\ninline typename SpMat<eT>::row_col_iterator\nSpMat<eT>::end_row_col()\n  {\n  return end();\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpMat<eT>::const_row_col_iterator\nSpMat<eT>::end_row_col() const\n  {\n  return end();\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpMat<eT>::clear()\n  {\n  (*this).reset();\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpMat<eT>::empty() const\n  {\n  return (n_elem == 0);\n  }\n\n\n\ntemplate<typename eT>\ninline\nuword\nSpMat<eT>::size() const\n  {\n  return n_elem;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\narma_warn_unused\nSpValProxy<SpMat<eT> >\nSpMat<eT>::get_value(const uword i)\n  {\n  // First convert to the actual location.\n  uword lcol = i / n_rows; // Integer division.\n  uword lrow = i % n_rows;\n\n  return get_value(lrow, lcol);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\narma_warn_unused\neT\nSpMat<eT>::get_value(const uword i) const\n  {\n  // First convert to the actual location.\n  uword lcol = i / n_rows; // Integer division.\n  uword lrow = i % n_rows;\n\n  return get_value(lrow, lcol);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\narma_warn_unused\nSpValProxy<SpMat<eT> >\nSpMat<eT>::get_value(const uword in_row, const uword in_col)\n  {\n  const uword colptr      = col_ptrs[in_col];\n  const uword next_colptr = col_ptrs[in_col + 1];\n\n  // Step through the row indices to see if our element exists.\n  for (uword i = colptr; i < next_colptr; ++i)\n    {\n    const uword row_index = row_indices[i];\n    \n    // First check that we have not stepped past it.\n    if (in_row < row_index) // If we have, then it doesn't exist: return 0.\n      {\n      return SpValProxy<SpMat<eT> >(in_row, in_col, *this); // Proxy for a zero value.\n      }\n\n    // Now check if we are at the correct place.\n    if (in_row == row_index) // If we are, return a reference to the value.\n      {\n      return SpValProxy<SpMat<eT> >(in_row, in_col, *this, &access::rw(values[i]));\n      }\n\n    }\n\n  // We did not find it, so it does not exist: return 0.\n  return SpValProxy<SpMat<eT> >(in_row, in_col, *this);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\narma_warn_unused\neT\nSpMat<eT>::get_value(const uword in_row, const uword in_col) const\n  {\n  const uword colptr      = col_ptrs[in_col];\n  const uword next_colptr = col_ptrs[in_col + 1];\n  \n  // Step through the row indices to see if our element exists.\n  for (uword i = colptr; i < next_colptr; ++i)\n    {\n    const uword row_index = row_indices[i];\n    \n    // First check that we have not stepped past it.\n    if (in_row < row_index) // If we have, then it doesn't exist: return 0.\n      {\n      return eT(0);\n      }\n    \n    // Now check if we are at the correct place.\n    if (in_row == row_index) // If we are, return the value.\n      {\n      return values[i];\n      }\n    }\n  \n  // We did not find it, so it does not exist: return 0.\n  return eT(0);\n  }\n\n\n\n/**\n * Given the index representing which of the nonzero values this is, return its\n * actual location, either in row/col or just the index.\n */\ntemplate<typename eT>\narma_hot\narma_inline\narma_warn_unused\nuword\nSpMat<eT>::get_position(const uword i) const\n  {\n  uword lrow, lcol;\n  \n  get_position(i, lrow, lcol);\n  \n  // Assemble the row/col into the element's location in the matrix.\n  return (lrow + n_rows * lcol);\n  }\n\n\n\ntemplate<typename eT>\narma_hot\narma_inline\nvoid\nSpMat<eT>::get_position(const uword i, uword& row_of_i, uword& col_of_i) const\n  {\n  arma_debug_check((i >= n_nonzero), \"SpMat::get_position(): index out of bounds\");\n  \n  col_of_i = 0;\n  while (col_ptrs[col_of_i + 1] <= i)\n    {\n    col_of_i++;\n    }\n  \n  row_of_i = row_indices[i];\n  \n  return;\n  }\n\n\n\n/**\n * Add an element at the given position, and return a reference to it.  The\n * element will be set to 0 (unless otherwise specified).  If the element\n * already exists, its value will be overwritten.\n *\n * @param in_row Row of new element.\n * @param in_col Column of new element.\n * @param in_val Value to set new element to (default 0.0).\n */\ntemplate<typename eT>\ninline\narma_hot\narma_warn_unused\neT&\nSpMat<eT>::add_element(const uword in_row, const uword in_col, const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  // We will assume the new element does not exist and begin the search for\n  // where to insert it.  If we find that it already exists, we will then\n  // overwrite it.\n  uword colptr      = col_ptrs[in_col    ];\n  uword next_colptr = col_ptrs[in_col + 1];\n  \n  uword pos = colptr; // The position in the matrix of this value.\n  \n  if (colptr != next_colptr)\n    {\n    // There are other elements in this column, so we must find where this\n    // element will fit as compared to those.\n    while (pos < next_colptr && in_row > row_indices[pos])\n      {\n      pos++;\n      }\n    \n    // We aren't inserting into the last position, so it is still possible\n    // that the element may exist.\n    if (pos != next_colptr && row_indices[pos] == in_row)\n      {\n      // It already exists.  Then, just overwrite it.\n      access::rw(values[pos]) = val;\n      \n      return access::rw(values[pos]);\n      }\n    }\n  \n  \n  // \n  // Element doesn't exist, so we have to insert it\n  // \n  \n  // We have to update the rest of the column pointers.\n  for (uword i = in_col + 1; i < n_cols + 1; i++)\n    {\n    access::rw(col_ptrs[i])++; // We are only inserting one new element.\n    }\n  \n  \n  // Figure out the actual amount of memory currently allocated\n  // NOTE: this relies on memory::acquire_chunked() being used for the 'values' and 'row_indices' arrays\n  const uword n_alloc = memory::enlarge_to_mult_of_chunksize(n_nonzero + 1);\n  \n  // If possible, avoid time-consuming memory allocation \n  if(n_alloc > (n_nonzero + 1))\n    {\n    arrayops::copy_backwards(access::rwp(values)      + pos + 1, values      + pos, (n_nonzero - pos) + 1);\n    arrayops::copy_backwards(access::rwp(row_indices) + pos + 1, row_indices + pos, (n_nonzero - pos) + 1);\n    \n    // Insert the new element.\n    access::rw(values[pos])      = val;\n    access::rw(row_indices[pos]) = in_row;\n    \n    access::rw(n_nonzero)++;\n    }\n  else\n    {\n    const uword old_n_nonzero = n_nonzero;\n    \n    access::rw(n_nonzero)++; // Add to count of nonzero elements.\n    \n    // Allocate larger memory.\n    eT*    new_values      = memory::acquire_chunked<eT>   (n_nonzero + 1);\n    uword* new_row_indices = memory::acquire_chunked<uword>(n_nonzero + 1);\n    \n    // Copy things over, before the new element.\n    if (pos > 0)\n      {\n      arrayops::copy(new_values,      values,      pos);\n      arrayops::copy(new_row_indices, row_indices, pos);\n      }\n    \n    // Insert the new element.\n    new_values[pos]      = val;\n    new_row_indices[pos] = in_row;\n    \n    // Copy the rest of things over (including the extra element at the end).\n    arrayops::copy(new_values      + pos + 1, values      + pos, (old_n_nonzero - pos) + 1);\n    arrayops::copy(new_row_indices + pos + 1, row_indices + pos, (old_n_nonzero - pos) + 1);\n    \n    // Assign new pointers.\n    memory::release(values);\n    memory::release(row_indices);\n\n    access::rw(values)      = new_values;\n    access::rw(row_indices) = new_row_indices;\n    }\n  \n  return access::rw(values[pos]);\n  }\n\n\n\n/**\n * Delete an element at the given position.\n *\n * @param in_row Row of element to be deleted.\n * @param in_col Column of element to be deleted.\n */\ntemplate<typename eT>\ninline\narma_hot\nvoid\nSpMat<eT>::delete_element(const uword in_row, const uword in_col)\n  {\n  arma_extra_debug_sigprint();\n  \n  // We assume the element exists (although... it may not) and look for its\n  // exact position.  If it doesn't exist... well, we don't need to do anything.\n  uword colptr      = col_ptrs[in_col];\n  uword next_colptr = col_ptrs[in_col + 1];\n  \n  if (colptr != next_colptr)\n    {\n    // There's at least one element in this column.\n    // Let's see if we are one of them.\n    for (uword pos = colptr; pos < next_colptr; pos++)\n      {\n      if (in_row == row_indices[pos])\n        {\n        const uword old_n_nonzero = n_nonzero;\n        \n        --access::rw(n_nonzero); // Remove one from the count of nonzero elements.\n        \n        // Found it.  Now remove it.\n        \n        // Figure out the actual amount of memory currently allocated and the actual amount that will be required\n        // NOTE: this relies on memory::acquire_chunked() being used for the 'values' and 'row_indices' arrays\n        \n        const uword n_alloc     = memory::enlarge_to_mult_of_chunksize(old_n_nonzero + 1);\n        const uword n_alloc_mod = memory::enlarge_to_mult_of_chunksize(n_nonzero     + 1);\n        \n        // If possible, avoid time-consuming memory allocation\n        if(n_alloc_mod == n_alloc)\n          {\n          if (pos < n_nonzero)  // remember, we decremented n_nonzero\n            {\n            arrayops::copy_forwards(access::rwp(values)      + pos, values      + pos + 1, (n_nonzero - pos) + 1);\n            arrayops::copy_forwards(access::rwp(row_indices) + pos, row_indices + pos + 1, (n_nonzero - pos) + 1);\n            }\n          }\n        else\n          {\n          // Make new arrays.\n          eT*    new_values      = memory::acquire_chunked<eT>   (n_nonzero + 1);\n          uword* new_row_indices = memory::acquire_chunked<uword>(n_nonzero + 1);\n          \n          if (pos > 0)\n            {\n            arrayops::copy(new_values,      values,      pos);\n            arrayops::copy(new_row_indices, row_indices, pos);\n            }\n          \n          arrayops::copy(new_values      + pos, values      + pos + 1, (n_nonzero - pos) + 1);\n          arrayops::copy(new_row_indices + pos, row_indices + pos + 1, (n_nonzero - pos) + 1);\n          \n          memory::release(values);\n          memory::release(row_indices);\n          \n          access::rw(values)      = new_values;\n          access::rw(row_indices) = new_row_indices;\n          }\n        \n        // And lastly, update all the column pointers (decrement by one).\n        for (uword i = in_col + 1; i < n_cols + 1; i++)\n          {\n          --access::rw(col_ptrs[i]); // We only removed one element.\n          }\n        \n        return; // There is nothing left to do.\n        }\n      }\n    }\n  \n  return; // The element does not exist, so there's nothing for us to do.\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nSpMat_aux::set_real(SpMat<eT>& out, const SpBase<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap_spmat<T1> tmp(X.get_ref());\n  const SpMat<eT>&   A = tmp.M;\n  \n  arma_debug_assert_same_size( out, A, \"SpMat::set_real()\" );\n  \n  out = A;\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nSpMat_aux::set_imag(SpMat<eT>&, const SpBase<eT,T1>&)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T, typename T1>\ninline\nvoid\nSpMat_aux::set_real(SpMat< std::complex<T> >& out, const SpBase<T,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<T> eT;\n  \n  const unwrap_spmat<T1> U(X.get_ref());\n  const SpMat<T>&    Y = U.M;\n  \n  arma_debug_assert_same_size(out, Y, \"SpMat::set_real()\");\n  \n  SpMat<eT> tmp(Y,arma::imag(out));  // arma:: prefix required due to bugs in GCC 4.4 - 4.6\n  \n  out.steal_mem(tmp);\n  }\n\n\n\ntemplate<typename T, typename T1>\ninline\nvoid\nSpMat_aux::set_imag(SpMat< std::complex<T> >& out, const SpBase<T,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<T> eT;\n  \n  const unwrap_spmat<T1> U(X.get_ref());\n  const SpMat<T>&    Y = U.M;\n  \n  arma_debug_assert_same_size(out, Y, \"SpMat::set_imag()\");\n  \n  SpMat<eT> tmp(arma::real(out),Y);  // arma:: prefix required due to bugs in GCC 4.4 - 4.6\n  \n  out.steal_mem(tmp);\n  }\n\n\n\n#ifdef ARMA_EXTRA_SPMAT_MEAT\n  #include ARMA_INCFILE_WRAP(ARMA_EXTRA_SPMAT_MEAT)\n#endif\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpOp_bones.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup SpOp\n//! @{\n\n\n\ntemplate<typename T1, typename op_type>\nclass SpOp : public SpBase<typename T1::elem_type, SpOp<T1, op_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool is_row = (T1::is_row && is_spop_elem<op_type>::value) || ( T1::is_col && (is_same_type<op_type, spop_strans>::value || is_same_type<op_type, spop_htrans>::value) );\n  static const bool is_col = (T1::is_col && is_spop_elem<op_type>::value) || ( T1::is_row && (is_same_type<op_type, spop_strans>::value || is_same_type<op_type, spop_htrans>::value) );\n  \n  inline explicit SpOp(const T1& in_m);\n  inline          SpOp(const T1& in_m, const elem_type in_aux);\n  inline          SpOp(const T1& in_m, const uword     in_aux_uword_a, const uword in_aux_uword_b);\n  inline         ~SpOp();\n  \n  \n  arma_aligned const T1&       m;            //!< storage of reference to the operand (eg. a matrix)\n  arma_aligned       elem_type aux;          //!< storage of auxiliary data, user defined format\n  arma_aligned       uword     aux_uword_a;  //!< storage of auxiliary data, uword format\n  arma_aligned       uword     aux_uword_b;  //!< storage of auxiliary data, uword format\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpOp_meat.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup SpOp\n//! @{\n\n\n\ntemplate<typename T1, typename op_type>\ninline\nSpOp<T1, op_type>::SpOp(const T1& in_m)\n  : m(in_m)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename op_type>\ninline\nSpOp<T1, op_type>::SpOp(const T1& in_m, const typename T1::elem_type in_aux)\n  : m(in_m)\n  , aux(in_aux)\n  {\n  arma_extra_debug_sigprint();\n  }\n  \n\n\ntemplate<typename T1, typename op_type>\ninline\nSpOp<T1, op_type>::SpOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b)\n  : m(in_m)\n  , aux_uword_a(in_aux_uword_a)\n  , aux_uword_b(in_aux_uword_b)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename op_type>\ninline\nSpOp<T1, op_type>::~SpOp()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpProxy.hpp",
    "content": "// Copyright (C) 2012 Ryan Curtin\n// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n//! \\addtogroup SpProxy\n//! @{\n\n\n\ntemplate<typename eT>\nclass SpProxy< SpMat<eT> >\n  {\n  public:\n\n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef SpMat<eT>                                stored_type;\n\n  typedef typename SpMat<eT>::const_iterator       const_iterator_type;\n  typedef typename SpMat<eT>::const_row_iterator   const_row_iterator_type;\n\n  static const bool must_use_iterator  = false;\n  static const bool Q_created_by_proxy = false;\n\n  static const bool is_row = false;\n  static const bool is_col = false;\n\n  arma_aligned const SpMat<eT>& Q;\n\n  inline explicit SpProxy(const SpMat<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n\n  arma_inline uword get_n_rows()    const { return Q.n_rows;    }\n  arma_inline uword get_n_cols()    const { return Q.n_cols;    }\n  arma_inline uword get_n_elem()    const { return Q.n_elem;    }\n  arma_inline uword get_n_nonzero() const { return Q.n_nonzero; }\n\n  arma_inline elem_type operator[](const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at        (const uword row, const uword col) const { return Q.at(row, col); }\n\n  arma_inline const eT*    get_values()      const { return Q.values;      }\n  arma_inline const uword* get_row_indices() const { return Q.row_indices; }\n  arma_inline const uword* get_col_ptrs()    const { return Q.col_ptrs;    }\n\n  arma_inline const_iterator_type     begin()                            const { return Q.begin();            }\n  arma_inline const_iterator_type     begin_col(const uword col_num)     const { return Q.begin_col(col_num); }\n  arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); }\n\n  arma_inline const_iterator_type     end()                        const { return Q.end();            }\n  arma_inline const_row_iterator_type end_row()                    const { return Q.end_row();        }\n  arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const SpMat<eT2>& X) const { return (void_ptr(&Q) == void_ptr(&X)); }\n  };\n\n\n\ntemplate<typename eT>\nclass SpProxy< SpCol<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef SpCol<eT>                                stored_type;\n  \n  typedef typename SpCol<eT>::const_iterator       const_iterator_type;\n  typedef typename SpCol<eT>::const_row_iterator   const_row_iterator_type;\n  \n  static const bool must_use_iterator  = false;\n  static const bool Q_created_by_proxy = false;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const SpCol<eT>& Q;\n  \n  inline explicit SpProxy(const SpCol<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows()    const { return Q.n_rows;    }\n  arma_inline uword get_n_cols()    const { return 1;           }\n  arma_inline uword get_n_elem()    const { return Q.n_elem;    }\n  arma_inline uword get_n_nonzero() const { return Q.n_nonzero; }\n  \n  arma_inline elem_type operator[](const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at        (const uword row, const uword col) const { return Q.at(row, col); }\n  \n  arma_inline const eT*    get_values()      const { return Q.values;      }\n  arma_inline const uword* get_row_indices() const { return Q.row_indices; }\n  arma_inline const uword* get_col_ptrs()    const { return Q.col_ptrs;    }\n  \n  arma_inline const_iterator_type     begin()                            const { return Q.begin();            }\n  arma_inline const_iterator_type     begin_col(const uword)             const { return Q.begin();            }\n  arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); }\n  \n  arma_inline const_iterator_type     end()                        const { return Q.end();            }\n  arma_inline const_row_iterator_type end_row()                    const { return Q.end_row();        }\n  arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const SpMat<eT2>& X) const { return (void_ptr(&Q) == void_ptr(&X)); }\n  };\n\n\n\ntemplate<typename eT>\nclass SpProxy< SpRow<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef SpRow<eT>                                stored_type;\n  \n  typedef typename SpRow<eT>::const_iterator       const_iterator_type;\n  typedef typename SpRow<eT>::const_row_iterator   const_row_iterator_type;\n  \n  static const bool must_use_iterator  = false;\n  static const bool Q_created_by_proxy = false;\n  \n  static const bool is_row = true;\n  static const bool is_col = false;\n  \n  arma_aligned const SpRow<eT>& Q;\n  \n  inline explicit SpProxy(const SpRow<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows()    const { return 1;           }\n  arma_inline uword get_n_cols()    const { return Q.n_cols;    }\n  arma_inline uword get_n_elem()    const { return Q.n_elem;    }\n  arma_inline uword get_n_nonzero() const { return Q.n_nonzero; }\n  \n  arma_inline elem_type operator[](const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at        (const uword row, const uword col) const { return Q.at(row, col); }\n  \n  arma_inline const eT*    get_values()      const { return Q.values;      }\n  arma_inline const uword* get_row_indices() const { return Q.row_indices; }\n  arma_inline const uword* get_col_ptrs()    const { return Q.col_ptrs;    }\n  \n  arma_inline const_iterator_type     begin()                            const { return Q.begin();            }\n  arma_inline const_iterator_type     begin_col(const uword col_num)     const { return Q.begin_col(col_num); }\n  arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); }\n  \n  arma_inline const_iterator_type     end()                        const { return Q.end();            }\n  arma_inline const_row_iterator_type end_row()                    const { return Q.end_row();        }\n  arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const SpMat<eT2>& X) const { return (void_ptr(&Q) == void_ptr(&X)); }\n  };\n\n\n\ntemplate<typename eT>\nclass SpProxy< SpSubview<eT> >\n  {\n  public:\n\n  typedef eT                                           elem_type;\n  typedef typename get_pod_type<elem_type>::result     pod_type;\n  typedef SpSubview<eT>                                stored_type;\n\n  typedef typename SpSubview<eT>::const_iterator       const_iterator_type;\n  typedef typename SpSubview<eT>::const_row_iterator   const_row_iterator_type;\n\n  static const bool must_use_iterator  = true;\n  static const bool Q_created_by_proxy = false;\n\n  static const bool is_row = false;\n  static const bool is_col = false;\n\n  arma_aligned const SpSubview<eT>& Q;\n\n  inline explicit SpProxy(const SpSubview<eT>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n\n  arma_inline uword get_n_rows()    const { return Q.n_rows;    }\n  arma_inline uword get_n_cols()    const { return Q.n_cols;    }\n  arma_inline uword get_n_elem()    const { return Q.n_elem;    }\n  arma_inline uword get_n_nonzero() const { return Q.n_nonzero; }\n\n  arma_inline elem_type operator[](const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at        (const uword row, const uword col) const { return Q.at(row, col); }\n\n  arma_inline const eT*    get_values()      const { return Q.m.values;      }\n  arma_inline const uword* get_row_indices() const { return Q.m.row_indices; }\n  arma_inline const uword* get_col_ptrs()    const { return Q.m.col_ptrs;    }\n\n  arma_inline const_iterator_type     begin()                            const { return Q.begin();            }\n  arma_inline const_iterator_type     begin_col(const uword col_num)     const { return Q.begin_col(col_num); }\n  arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); }\n\n  arma_inline const_iterator_type     end()                        const { return Q.end();            }\n  arma_inline const_row_iterator_type end_row()                    const { return Q.end_row();        }\n  arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const SpMat<eT2>& X) const { return (void_ptr(&Q.m) == void_ptr(&X)); }\n  };\n\n\n\ntemplate<typename T1, typename spop_type>\nclass SpProxy< SpOp<T1, spop_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename T1::elem_type                   eT;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef SpMat<eT>                                stored_type;\n  \n  typedef typename SpMat<eT>::const_iterator       const_iterator_type;\n  typedef typename SpMat<eT>::const_row_iterator   const_row_iterator_type;\n  \n  static const bool must_use_iterator  = false;\n  static const bool Q_created_by_proxy = true;\n  \n  static const bool is_row = SpOp<T1, spop_type>::is_row;\n  static const bool is_col = SpOp<T1, spop_type>::is_col;\n  \n  arma_aligned const SpMat<eT> Q;\n  \n  inline explicit SpProxy(const SpOp<T1, spop_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows()    const { return is_row ? 1 : Q.n_rows; }\n  arma_inline uword get_n_cols()    const { return is_col ? 1 : Q.n_cols; }\n  arma_inline uword get_n_elem()    const { return Q.n_elem;              }\n  arma_inline uword get_n_nonzero() const { return Q.n_nonzero;           }\n  \n  arma_inline elem_type operator[](const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at        (const uword row, const uword col) const { return Q.at(row, col); }\n  \n  arma_inline const eT*    get_values()      const { return Q.values;      }\n  arma_inline const uword* get_row_indices() const { return Q.row_indices; }\n  arma_inline const uword* get_col_ptrs()    const { return Q.col_ptrs;    }\n  \n  arma_inline const_iterator_type     begin()                            const { return Q.begin();            }\n  arma_inline const_iterator_type     begin_col(const uword col_num)     const { return Q.begin_col(col_num); }\n  arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); }\n  \n  arma_inline const_iterator_type     end()                        const { return Q.end();            }\n  arma_inline const_row_iterator_type end_row()                    const { return Q.end_row();        }\n  arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const SpMat<eT2>&) const { return false; }\n  };\n\n\n\ntemplate<typename T1, typename T2, typename spglue_type>\nclass SpProxy< SpGlue<T1, T2, spglue_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename T1::elem_type                   eT;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef SpMat<eT>                                stored_type;\n  \n  typedef typename SpMat<eT>::const_iterator       const_iterator_type;\n  typedef typename SpMat<eT>::const_row_iterator   const_row_iterator_type;\n  \n  static const bool must_use_iterator  = false;\n  static const bool Q_created_by_proxy = true;\n  \n  static const bool is_row = SpGlue<T1, T2, spglue_type>::is_row;\n  static const bool is_col = SpGlue<T1, T2, spglue_type>::is_col;\n  \n  arma_aligned const SpMat<eT> Q;\n  \n  inline explicit SpProxy(const SpGlue<T1, T2, spglue_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows()    const { return is_row ? 1 : Q.n_rows; }\n  arma_inline uword get_n_cols()    const { return is_col ? 1 : Q.n_cols; }\n  arma_inline uword get_n_elem()    const { return Q.n_elem;              }\n  arma_inline uword get_n_nonzero() const { return Q.n_nonzero;           }\n  \n  arma_inline elem_type operator[](const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at        (const uword row, const uword col) const { return Q.at(row, col); }\n  \n  arma_inline const eT*    get_values()      const { return Q.values;      }\n  arma_inline const uword* get_row_indices() const { return Q.row_indices; }\n  arma_inline const uword* get_col_ptrs()    const { return Q.col_ptrs;    }\n  \n  arma_inline const_iterator_type     begin()                            const { return Q.begin();            }\n  arma_inline const_iterator_type     begin_col(const uword col_num)     const { return Q.begin_col(col_num); }\n  arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); }\n  \n  arma_inline const_iterator_type     end()                        const { return Q.end();            }\n  arma_inline const_row_iterator_type end_row()                    const { return Q.end_row();        }\n  arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const SpMat<eT2>&) const { return false; }\n  };\n\n\n\ntemplate<typename out_eT, typename T1, typename spop_type>\nclass SpProxy< mtSpOp<out_eT, T1, spop_type> >\n  {\n  public:\n  \n  typedef          out_eT                          elem_type;\n  typedef typename T1::elem_type                   eT;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef SpMat<out_eT>                            stored_type;\n  \n  typedef typename SpMat<out_eT>::const_iterator       const_iterator_type;\n  typedef typename SpMat<out_eT>::const_row_iterator   const_row_iterator_type;\n  \n  static const bool must_use_iterator  = false;\n  static const bool Q_created_by_proxy = true;\n  \n  static const bool is_row = mtSpOp<out_eT, T1, spop_type>::is_row;\n  static const bool is_col = mtSpOp<out_eT, T1, spop_type>::is_col;\n  \n  arma_aligned const SpMat<out_eT> Q;\n  \n  inline explicit SpProxy(const mtSpOp<out_eT, T1, spop_type>& A)\n    : Q(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline uword get_n_rows()    const { return is_row ? 1 : Q.n_rows; }\n  arma_inline uword get_n_cols()    const { return is_col ? 1 : Q.n_cols; }\n  arma_inline uword get_n_elem()    const { return Q.n_elem;              }\n  arma_inline uword get_n_nonzero() const { return Q.n_nonzero;           }\n  \n  arma_inline elem_type operator[](const uword i)                    const { return Q[i];           }\n  arma_inline elem_type at        (const uword row, const uword col) const { return Q.at(row, col); }\n  \n  arma_inline const eT*    get_values()      const { return Q.values;      }\n  arma_inline const uword* get_row_indices() const { return Q.row_indices; }\n  arma_inline const uword* get_col_ptrs()    const { return Q.col_ptrs;    }\n  \n  arma_inline const_iterator_type     begin()                            const { return Q.begin();            }\n  arma_inline const_iterator_type     begin_col(const uword col_num)     const { return Q.begin_col(col_num); }\n  arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); }\n  \n  arma_inline const_iterator_type     end()                        const { return Q.end();            }\n  arma_inline const_row_iterator_type end_row()                    const { return Q.end_row();        }\n  arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); }\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const SpMat<eT2>&) const { return false; }\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpRow_bones.hpp",
    "content": "// Copyright (C) 2011-2012 Ryan Curtin\n// Copyright (C) 2011 Matthew Amidon\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup SpRow\n//! @{\n\n//! Class for sparse row vectors (sparse matrices with only one row)\n\ntemplate<typename eT>\nclass SpRow : public SpMat<eT>\n  {\n  public:\n\n  typedef eT                                elem_type;\n  typedef typename get_pod_type<eT>::result pod_type;\n  \n  static const bool is_row = true;\n  static const bool is_col = false;\n  \n  \n  inline          SpRow();\n  inline explicit SpRow(const uword N);\n  inline          SpRow(const uword in_rows, const uword in_cols);\n  \n  inline                  SpRow(const char*        text);\n  inline const SpRow& operator=(const char*        text);\n  \n  inline                  SpRow(const std::string& text);\n  inline const SpRow& operator=(const std::string& text);\n  \n  inline const SpRow& operator=(const eT val);\n  \n  template<typename T1> inline                  SpRow(const Base<eT,T1>& X);\n  template<typename T1> inline const SpRow& operator=(const Base<eT,T1>& X);\n  \n  template<typename T1> inline                  SpRow(const SpBase<eT,T1>& X);\n  template<typename T1> inline const SpRow& operator=(const SpBase<eT,T1>& X);\n  \n  template<typename T1, typename T2>\n  inline explicit SpRow(const SpBase<pod_type,T1>& A, const SpBase<pod_type,T2>& B);\n  \n  inline void shed_col (const uword col_num);\n  inline void shed_cols(const uword in_col1, const uword in_col2);\n  \n  // inline void insert_cols(const uword col_num, const uword N, const bool set_to_zero = true);\n  \n  \n  typedef typename SpMat<eT>::iterator       row_iterator;\n  typedef typename SpMat<eT>::const_iterator const_row_iterator;\n  \n  inline       row_iterator begin_row(const uword row_num = 0);\n  inline const_row_iterator begin_row(const uword row_num = 0) const;\n  \n  inline       row_iterator end_row(const uword row_num = 0);\n  inline const_row_iterator end_row(const uword row_num = 0) const;\n  \n  #ifdef ARMA_EXTRA_SPROW_PROTO\n    #include ARMA_INCFILE_WRAP(ARMA_EXTRA_SPROW_PROTO)\n  #endif\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpRow_meat.hpp",
    "content": "// Copyright (C) 2011-2012 Ryan Curtin\n// Copyright (C) 2015 Conrad Sanderson\n// Copyright (C) 2011 Matthew Amidon\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup SpRow\n//! @{\n\n\n\ntemplate<typename eT>\ninline\nSpRow<eT>::SpRow()\n  : SpMat<eT>(1, 0)\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 2;\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpRow<eT>::SpRow(const uword in_n_elem)\n  : SpMat<eT>(1, in_n_elem)\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 2;\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpRow<eT>::SpRow(const uword in_n_rows, const uword in_n_cols)\n  : SpMat<eT>(in_n_rows, in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check((in_n_rows != 1), \"SpRow::SpRow(): must have only one row\");\n\n  access::rw(SpMat<eT>::vec_state) = 2;\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpRow<eT>::SpRow(const char* text)\n  : SpMat<eT>(text)\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 2;\n\n  arma_debug_check((SpMat<eT>::n_rows != 1), \"SpRow::SpRow(): must have only one row\");\n  }\n  \n\n\ntemplate<typename eT>\ninline\nconst SpRow<eT>&\nSpRow<eT>::operator=(const char* text)\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 2;\n  \n  SpMat<eT>::operator=(text);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpRow<eT>::SpRow(const std::string& text)\n  : SpMat<eT>(text)\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 2;\n  \n  arma_debug_check((SpMat<eT>::n_rows != 1), \"SpRow::SpRow(): must have only one row\");\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpRow<eT>&\nSpRow<eT>::operator=(const std::string& text)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT>::operator=(text);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpRow<eT>&\nSpRow<eT>::operator=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT>::operator=(val);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nSpRow<eT>::SpRow(const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 2;\n  \n  SpMat<eT>::operator=(X.get_ref());\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpRow<eT>&\nSpRow<eT>::operator=(const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT>::operator=(X.get_ref());\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nSpRow<eT>::SpRow(const SpBase<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 2;\n  \n  SpMat<eT>::operator=(X.get_ref());\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpRow<eT>&\nSpRow<eT>::operator=(const SpBase<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT>::operator=(X.get_ref());\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2>\ninline\nSpRow<eT>::SpRow\n  (\n  const SpBase<typename SpRow<eT>::pod_type, T1>& A,\n  const SpBase<typename SpRow<eT>::pod_type, T2>& B\n  )\n  {\n  arma_extra_debug_sigprint();\n\n  access::rw(SpMat<eT>::vec_state) = 2;\n  \n  SpMat<eT>::init(A,B);\n  }\n\n\n\n//! remove specified columns\ntemplate<typename eT>\ninline\nvoid\nSpRow<eT>::shed_col(const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( col_num >= SpMat<eT>::n_cols, \"SpRow::shed_col(): out of bounds\");\n  \n  shed_cols(col_num, col_num);\n  }\n\n\n\n//! remove specified columns\ntemplate<typename eT>\ninline\nvoid\nSpRow<eT>::shed_cols(const uword in_col1, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_col1 > in_col2) || (in_col2 >= SpMat<eT>::n_cols),\n    \"SpRow::shed_cols(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword diff = (in_col2 - in_col1 + 1);\n\n  // This is doubleplus easy because we have all the column pointers stored.\n  const uword start = SpMat<eT>::col_ptrs[in_col1];\n  const uword end   = SpMat<eT>::col_ptrs[in_col2 + 1];\n\n  if (start != end)\n    {\n    const uword elem_diff = end - start;\n\n    eT*    new_values      = memory::acquire_chunked<eT>   (SpMat<eT>::n_nonzero - elem_diff);\n    uword* new_row_indices = memory::acquire_chunked<uword>(SpMat<eT>::n_nonzero - elem_diff);\n\n    // Copy first set of elements, if necessary.\n    if (start > 0)\n      {\n      arrayops::copy(new_values, SpMat<eT>::values, start);\n      arrayops::copy(new_row_indices, SpMat<eT>::row_indices, start);\n      }\n\n    // Copy last set of elements, if necessary.\n    if (end != SpMat<eT>::n_nonzero)\n      {\n      arrayops::copy(new_values + start, SpMat<eT>::values + end, (SpMat<eT>::n_nonzero - end));\n      arrayops::copy(new_row_indices + start, SpMat<eT>::row_indices + end, (SpMat<eT>::n_nonzero - end));\n      }\n\n    memory::release(SpMat<eT>::values);\n    memory::release(SpMat<eT>::row_indices);\n\n    access::rw(SpMat<eT>::values) = new_values;\n    access::rw(SpMat<eT>::row_indices) = new_row_indices;\n\n    access::rw(SpMat<eT>::n_nonzero) -= elem_diff;\n    }\n\n  // Update column pointers.\n  uword* new_col_ptrs = memory::acquire<uword>(SpMat<eT>::n_cols - diff + 1);\n\n  // Copy first part of column pointers.\n  if (in_col1 > 0)\n    {\n    arrayops::copy(new_col_ptrs, SpMat<eT>::col_ptrs, in_col1);\n    }\n\n  // Copy last part of column pointers (and adjust their values as necessary).\n  if (in_col2 < SpMat<eT>::n_cols - 1)\n    {\n    arrayops::copy(new_col_ptrs + in_col1, SpMat<eT>::col_ptrs + in_col2 + 1, SpMat<eT>::n_cols - in_col2);\n    // Modify their values.\n    arrayops::inplace_minus(new_col_ptrs + in_col1, (end - start), SpMat<eT>::n_cols - in_col2);\n    }\n\n  memory::release(SpMat<eT>::col_ptrs);\n\n  access::rw(SpMat<eT>::col_ptrs) = new_col_ptrs;\n\n  access::rw(SpMat<eT>::n_cols) -= diff;\n  access::rw(SpMat<eT>::n_elem) -= diff;\n  }\n\n\n\n// //! insert N cols at the specified col position,\n// //! optionally setting the elements of the inserted cols to zero\n// template<typename eT>\n// inline\n// void\n// SpRow<eT>::insert_cols(const uword col_num, const uword N, const bool set_to_zero)\n//   {\n//   arma_extra_debug_sigprint();\n// \n//   // insertion at col_num == n_cols is in effect an append operation\n//   arma_debug_check( (col_num > SpMat<eT>::n_cols), \"SpRow::insert_cols(): out of bounds\");\n// \n//   arma_debug_check( (set_to_zero == false), \"SpRow::insert_cols(): cannot set elements to nonzero values\");\n// \n//   uword newVal = (col_num == 0) ? 0 : SpMat<eT>::col_ptrs[col_num];\n//   SpMat<eT>::col_ptrs.insert(col_num, N, newVal);\n//   uword* new_col_ptrs = memory::acquire<uword>(SpMat<eT>::n_cols + N);\n// \n//   arrayops::copy(new_col_ptrs, SpMat<eT>::col_ptrs, col_num);\n// \n//   uword fill_value = (col_num == 0) ? 0 : SpMat<eT>::col_ptrs[col_num - 1];\n//   arrayops::inplace_set(new_col_ptrs + col_num, fill_value, N);\n// \n//   arrayops::copy(new_col_ptrs + col_num + N, SpMat<eT>::col_ptrs + col_num, SpMat<eT>::n_cols - col_num);\n// \n//   access::rw(SpMat<eT>::n_cols) += N;\n//   access::rw(SpMat<eT>::n_elem) += N;\n//   }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpRow<eT>::row_iterator\nSpRow<eT>::begin_row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n\n  // Since this is a row, row_num can only be 0.  But the option is provided for\n  // compatibility.\n  arma_debug_check((row_num >= 1), \"SpRow::begin_row(): index out of bounds\");\n  \n  return SpMat<eT>::begin();\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpRow<eT>::const_row_iterator\nSpRow<eT>::begin_row(const uword row_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  // Since this is a row, row_num can only be 0.  But the option is provided for\n  // compatibility.\n  arma_debug_check((row_num >= 1), \"SpRow::begin_row(): index out of bounds\");\n  \n  return SpMat<eT>::begin();\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpRow<eT>::row_iterator\nSpRow<eT>::end_row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  // Since this is a row, row_num can only be 0.  But the option is provided for\n  // compatibility.\n  arma_debug_check((row_num >= 1), \"SpRow::end_row(): index out of bounds\");\n  \n  return SpMat<eT>::end();\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpRow<eT>::const_row_iterator\nSpRow<eT>::end_row(const uword row_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  // Since this is a row, row_num can only be 0.  But the option is provided for\n  // compatibility.\n  arma_debug_check((row_num >= 1), \"SpRow::end_row(): index out of bounds\");\n  \n  return SpMat<eT>::end();\n  }\n\n\n\n  \n#ifdef ARMA_EXTRA_SPROW_MEAT\n  #include ARMA_INCFILE_WRAP(ARMA_EXTRA_SPROW_MEAT)\n#endif\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpSubview_bones.hpp",
    "content": "// Copyright (C) 2011-2012 Ryan Curtin\n// Copyright (C) 2011 Matthew Amidon\n// Copyright (C) 2012 Conrad Sanderson\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n//! \\addtogroup SpSubview\n//! @{\n\ntemplate<typename eT>\nclass SpSubview : public SpBase<eT, SpSubview<eT> >\n  {\n  public:\n  \n  const SpMat<eT>& m;\n  \n  typedef eT elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool is_row = false;\n  static const bool is_col = false;\n  \n  const uword aux_row1;\n  const uword aux_col1;\n  const uword n_rows;\n  const uword n_cols;\n  const uword n_elem;\n  const uword n_nonzero;\n\n  // So that SpValProxy can call add_element() and delete_element().\n  friend class SpValProxy<SpSubview<eT> >;\n\n  protected:\n\n  arma_inline SpSubview(const SpMat<eT>& in_m, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols);\n  arma_inline SpSubview(      SpMat<eT>& in_m, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols);\n\n  public:\n\n  inline ~SpSubview();\n\n  inline const SpSubview& operator+= (const eT val);\n  inline const SpSubview& operator-= (const eT val);\n  inline const SpSubview& operator*= (const eT val);\n  inline const SpSubview& operator/= (const eT val);\n\n  inline const SpSubview& operator=(const SpSubview& x);\n\n  template<typename T1> inline const SpSubview& operator= (const Base<eT, T1>& x);\n  template<typename T1> inline const SpSubview& operator+=(const Base<eT, T1>& x);\n  template<typename T1> inline const SpSubview& operator-=(const Base<eT, T1>& x);\n  template<typename T1> inline const SpSubview& operator*=(const Base<eT, T1>& x);\n  template<typename T1> inline const SpSubview& operator%=(const Base<eT, T1>& x);\n  template<typename T1> inline const SpSubview& operator/=(const Base<eT, T1>& x);\n\n  template<typename T1> inline const SpSubview& operator_equ_common(const SpBase<eT, T1>& x);\n  \n  template<typename T1> inline const SpSubview& operator= (const SpBase<eT, T1>& x);\n  template<typename T1> inline const SpSubview& operator+=(const SpBase<eT, T1>& x);\n  template<typename T1> inline const SpSubview& operator-=(const SpBase<eT, T1>& x);\n  template<typename T1> inline const SpSubview& operator*=(const SpBase<eT, T1>& x);\n  template<typename T1> inline const SpSubview& operator%=(const SpBase<eT, T1>& x);\n  template<typename T1> inline const SpSubview& operator/=(const SpBase<eT, T1>& x);\n\n  /*\n  inline static void extract(SpMat<eT>& out, const SpSubview& in);\n\n  inline static void  plus_inplace(Mat<eT>& out, const subview& in);\n  inline static void minus_inplace(Mat<eT>& out, const subview& in);\n  inline static void schur_inplace(Mat<eT>& out, const subview& in);\n  inline static void   div_inplace(Mat<eT>& out, const subview& in);\n  */\n\n  inline void fill(const eT val);\n  inline void zeros();\n  inline void ones();\n  inline void eye();\n\n  arma_hot inline SpValProxy<SpSubview<eT> > operator[](const uword i);\n  arma_hot inline eT                         operator[](const uword i) const;\n\n  arma_hot inline SpValProxy<SpSubview<eT> > operator()(const uword i);\n  arma_hot inline eT                         operator()(const uword i) const;\n\n  arma_hot inline SpValProxy<SpSubview<eT> > operator()(const uword in_row, const uword in_col);\n  arma_hot inline eT                         operator()(const uword in_row, const uword in_col) const;\n\n  arma_hot inline SpValProxy<SpSubview<eT> > at(const uword i);\n  arma_hot inline eT                         at(const uword i) const;\n\n  arma_hot inline SpValProxy<SpSubview<eT> > at(const uword in_row, const uword in_col);\n  arma_hot inline eT                         at(const uword in_row, const uword in_col) const;\n\n  inline bool check_overlap(const SpSubview& x) const;\n\n  inline bool is_vec() const;\n\n  inline       SpSubview row(const uword row_num);\n  inline const SpSubview row(const uword row_num) const;\n\n  inline       SpSubview col(const uword col_num);\n  inline const SpSubview col(const uword col_num) const;\n\n  inline       SpSubview rows(const uword in_row1, const uword in_row2);\n  inline const SpSubview rows(const uword in_row1, const uword in_row2) const;\n\n  inline       SpSubview cols(const uword in_col1, const uword in_col2);\n  inline const SpSubview cols(const uword in_col1, const uword in_col2) const;\n\n  inline       SpSubview submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2);\n  inline const SpSubview submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const;\n\n  inline       SpSubview submat(const span& row_span, const span& col_span);\n  inline const SpSubview submat(const span& row_span, const span& col_span) const;\n\n  inline       SpSubview operator()(const uword row_num, const span& col_span);\n  inline const SpSubview operator()(const uword row_num, const span& col_span) const;\n\n  inline       SpSubview operator()(const span& row_span, const uword col_num);\n  inline const SpSubview operator()(const span& row_span, const uword col_num) const;\n\n  inline       SpSubview operator()(const span& row_span, const span& col_span);\n  inline const SpSubview operator()(const span& row_span, const span& col_span) const;\n  \n  \n  inline void swap_rows(const uword in_row1, const uword in_row2);\n  inline void swap_cols(const uword in_col1, const uword in_col2);\n\n  // Forward declarations.\n  class iterator_base;\n  class const_iterator;\n  class iterator;\n  class const_row_iterator;\n  class row_iterator;\n\n  // Similar to SpMat iterators but automatically iterates past and ignores values not in the subview.\n  class iterator_base\n    {\n    public:\n\n    inline iterator_base(const SpSubview& in_M);\n    inline iterator_base(const SpSubview& in_M, const uword col, const uword pos, const uword skip_pos);\n\n    inline eT operator*() const;\n\n    // Don't hold location internally; call \"dummy\" methods to get that information.\n    arma_inline uword row() const { return M.m.row_indices[internal_pos + skip_pos] - M.aux_row1; }\n    arma_inline uword col() const { return internal_col;                                          }\n    arma_inline uword pos() const { return internal_pos;                                          }\n\n    arma_aligned const SpSubview& M;\n    arma_aligned       uword      internal_col;\n    arma_aligned       uword      internal_pos;\n    arma_aligned       uword      skip_pos; // not used in row_iterator or const_row_iterator\n\n    // So that we satisfy the STL iterator types.\n    typedef std::bidirectional_iterator_tag iterator_category;\n    typedef eT                              value_type;\n    typedef uword                           difference_type; // not certain on this one\n    typedef const eT*                       pointer;\n    typedef const eT&                       reference;\n    };\n\n  class const_iterator : public iterator_base\n    {\n    public:\n\n    inline const_iterator(const SpSubview& in_M, uword initial_pos = 0);\n    inline const_iterator(const SpSubview& in_M, uword in_row, uword in_col);\n    inline const_iterator(const SpSubview& in_M, uword in_row, uword in_col, uword in_pos, uword skip_pos);\n    inline const_iterator(const const_iterator& other);\n\n    inline const_iterator& operator++();\n    inline const_iterator  operator++(int);\n\n    inline const_iterator& operator--();\n    inline const_iterator  operator--(int);\n\n    inline bool operator!=(const const_iterator& rhs) const;\n    inline bool operator==(const const_iterator& rhs) const;\n\n    inline bool operator!=(const typename SpMat<eT>::const_iterator& rhs) const;\n    inline bool operator==(const typename SpMat<eT>::const_iterator& rhs) const;\n\n    inline bool operator!=(const const_row_iterator& rhs) const;\n    inline bool operator==(const const_row_iterator& rhs) const;\n\n    inline bool operator!=(const typename SpMat<eT>::const_row_iterator& rhs) const;\n    inline bool operator==(const typename SpMat<eT>::const_row_iterator& rhs) const;\n    };\n\n  class iterator : public const_iterator\n    {\n    public:\n\n    inline iterator(SpSubview& in_M, const uword initial_pos = 0) : const_iterator(in_M, initial_pos) { }\n    inline iterator(SpSubview& in_M, const uword in_row, const uword in_col) : const_iterator(in_M, in_row, in_col) { }\n    inline iterator(SpSubview& in_M, const uword in_row, const uword in_col, const uword in_pos, const uword in_skip_pos) : const_iterator(in_M, in_row, in_col, in_pos, in_skip_pos) { }\n    inline iterator(const iterator& other) : const_iterator(other) { }\n\n    inline SpValProxy<SpSubview<eT> > operator*();\n\n    // overloads needed for return type correctness\n    inline iterator& operator++();\n    inline iterator  operator++(int);\n\n    inline iterator& operator--();\n    inline iterator  operator--(int);\n\n    // This has a different value_type than iterator_base.\n    typedef SpValProxy<SpSubview<eT> >        value_type;\n    typedef const SpValProxy<SpSubview<eT> >* pointer;\n    typedef const SpValProxy<SpSubview<eT> >& reference;\n    };\n\n  class const_row_iterator : public iterator_base\n    {\n    public:\n\n    inline const_row_iterator(const SpSubview& in_M, uword initial_pos = 0);\n    inline const_row_iterator(const SpSubview& in_M, uword in_row, uword in_col);\n    inline const_row_iterator(const const_row_iterator& other);\n\n    inline const_row_iterator& operator++();\n    inline const_row_iterator  operator++(int);\n\n    inline const_row_iterator& operator--();\n    inline const_row_iterator  operator--(int);\n\n    uword internal_row; // Hold row internally because we use internal_pos differently.\n    uword actual_pos; // Actual position in subview's parent matrix.\n\n    arma_inline eT operator*() const { return iterator_base::M.m.values[actual_pos]; }\n\n    arma_inline uword row() const { return internal_row; }\n\n    inline bool operator!=(const const_iterator& rhs) const;\n    inline bool operator==(const const_iterator& rhs) const;\n\n    inline bool operator!=(const typename SpMat<eT>::const_iterator& rhs) const;\n    inline bool operator==(const typename SpMat<eT>::const_iterator& rhs) const;\n\n    inline bool operator!=(const const_row_iterator& rhs) const;\n    inline bool operator==(const const_row_iterator& rhs) const;\n\n    inline bool operator!=(const typename SpMat<eT>::const_row_iterator& rhs) const;\n    inline bool operator==(const typename SpMat<eT>::const_row_iterator& rhs) const;\n    };\n\n  class row_iterator : public const_row_iterator\n    {\n    public:\n\n    inline row_iterator(SpSubview& in_M, uword initial_pos = 0) : const_row_iterator(in_M, initial_pos) { }\n    inline row_iterator(SpSubview& in_M, uword in_row, uword in_col) : const_row_iterator(in_M, in_row, in_col) { }\n    inline row_iterator(const row_iterator& other) : const_row_iterator(other) { }\n\n    inline SpValProxy<SpSubview<eT> > operator*();\n\n    // overloads needed for return type correctness\n    inline row_iterator& operator++();\n    inline row_iterator  operator++(int);\n\n    inline row_iterator& operator--();\n    inline row_iterator  operator--(int);\n\n    // This has a different value_type than iterator_base.\n    typedef SpValProxy<SpSubview<eT> >        value_type;\n    typedef const SpValProxy<SpSubview<eT> >* pointer;\n    typedef const SpValProxy<SpSubview<eT> >& reference;\n    };\n\n  inline iterator           begin();\n  inline const_iterator     begin() const;\n\n  inline iterator           begin_col(const uword col_num);\n  inline const_iterator     begin_col(const uword col_num) const;\n\n  inline row_iterator       begin_row(const uword row_num = 0);\n  inline const_row_iterator begin_row(const uword row_num = 0) const;\n\n  inline iterator           end();\n  inline const_iterator     end() const;\n\n  inline row_iterator       end_row();\n  inline const_row_iterator end_row() const;\n\n  inline row_iterator       end_row(const uword row_num = 0);\n  inline const_row_iterator end_row(const uword row_num = 0) const;\n\n\n  private:\n  friend class SpMat<eT>;\n  SpSubview();\n\n  // For use by SpValProxy.  We just update n_nonzero and pass the call on to the matrix.\n  inline arma_hot arma_warn_unused eT&  add_element(const uword in_row, const uword in_col, const eT in_val = 0.0);\n  inline arma_hot                  void delete_element(const uword in_row, const uword in_col);\n\n  };\n\n/*\ntemplate<typename eT>\nclass SpSubview_col : public SpSubview<eT>\n  {\n  public:\n\n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n\n  inline void operator= (const SpSubview<eT>& x);\n  inline void operator= (const SpSubview_col& x);\n\n  template<typename T1>\n  inline void operator= (const Base<eT,T1>& x);\n\n  inline       SpSubview_col<eT> rows(const uword in_row1, const uword in_row2);\n  inline const SpSubview_col<eT> rows(const uword in_row1, const uword in_row2) const;\n\n  inline       SpSubview_col<eT> subvec(const uword in_row1, const uword in_row2);\n  inline const SpSubview_col<eT> subvec(const uword in_row1, const uword in_row2) const;\n\n\n  protected:\n\n  inline SpSubview_col(const Mat<eT>& in_m, const uword in_col);\n  inline SpSubview_col(      Mat<eT>& in_m, const uword in_col);\n\n  inline SpSubview_col(const Mat<eT>& in_m, const uword in_col, const uword in_row1, const uword in_n_rows);\n  inline SpSubview_col(      Mat<eT>& in_m, const uword in_col, const uword in_row1, const uword in_n_rows);\n\n\n  private:\n\n  friend class Mat<eT>;\n  friend class Col<eT>;\n  friend class SpSubview<eT>;\n\n  SpSubview_col();\n  };\n\ntemplate<typename eT>\nclass SpSubview_row : public SpSubview<eT>\n  {\n  public:\n\n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n\n  inline void operator= (const SpSubview<eT>& x);\n  inline void operator= (const SpSubview_row& x);\n\n  template<typename T1>\n  inline void operator= (const Base<eT,T1>& x);\n\n  inline       SpSubview_row<eT> cols(const uword in_col1, const uword in_col2);\n  inline const SpSubview_row<eT> cols(const uword in_col1, const uword in_col2) const;\n\n  inline       SpSubview_row<eT> subvec(const uword in_col1, const uword in_col2);\n  inline const SpSubview_row<eT> subvec(const uword in_col1, const uword in_col2) const;\n\n\n  protected:\n\n  inline SpSubview_row(const Mat<eT>& in_m, const uword in_row);\n  inline SpSubview_row(      Mat<eT>& in_m, const uword in_row);\n\n  inline SpSubview_row(const Mat<eT>& in_m, const uword in_row, const uword in_col1, const uword in_n_cols);\n  inline SpSubview_row(      Mat<eT>& in_m, const uword in_row, const uword in_col1, const uword in_n_cols);\n\n\n  private:\n\n  friend class Mat<eT>;\n  friend class Row<eT>;\n  friend class SpSubview<eT>;\n\n  SpSubview_row();\n  };\n*/\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpSubview_iterators_meat.hpp",
    "content": "// Copyright (C) 2012 Ryan Curtin\n// Copyright (C) 2012 Conrad Sanderson\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n//! \\addtogroup SpSubview\n//! @{\n\n///////////////////////////////////////////////////////////////////////////////\n// SpSubview::iterator_base implementation                                   //\n///////////////////////////////////////////////////////////////////////////////\n\ntemplate<typename eT>\ninline\nSpSubview<eT>::iterator_base::iterator_base(const SpSubview<eT>& in_M)\n  : M(in_M)\n  , internal_col(0)\n  , internal_pos(0)\n  , skip_pos(0)\n  {\n  // Technically this iterator is invalid (it may not point to a real element).\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>::iterator_base::iterator_base(const SpSubview<eT>& in_M, const uword in_col, const uword in_pos, const uword in_skip_pos)\n  : M(in_M)\n  , internal_col(in_col)\n  , internal_pos(in_pos)\n  , skip_pos    (in_skip_pos)\n  {\n  // Nothing to do.\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nSpSubview<eT>::iterator_base::operator*() const\n  {\n  return M.m.values[internal_pos + skip_pos];\n  }\n\n\n\n///////////////////////////////////////////////////////////////////////////////\n// SpSubview::const_iterator implementation                                  //\n///////////////////////////////////////////////////////////////////////////////\n\ntemplate<typename eT>\ninline\nSpSubview<eT>::const_iterator::const_iterator(const SpSubview<eT>& in_M, const uword initial_pos)\n  : iterator_base(in_M, 0, initial_pos, 0)\n  {\n  // Corner case for empty subviews.\n  if(in_M.n_nonzero == 0)\n    {\n    iterator_base::internal_col = in_M.n_cols;\n    iterator_base::skip_pos     = in_M.m.n_nonzero;\n    return;\n    }\n\n  // Figure out the row and column of the position.\n  // lskip_pos holds the number of values which aren't part of this subview.\n  const uword aux_col = iterator_base::M.aux_col1;\n  const uword aux_row = iterator_base::M.aux_row1;\n  const uword ln_rows = iterator_base::M.n_rows;\n  const uword ln_cols = iterator_base::M.n_cols;\n\n  uword cur_pos   = 0; // off by one because we might be searching for pos 0\n  uword lskip_pos = iterator_base::M.m.col_ptrs[aux_col];\n  uword cur_col   = 0;\n\n  while(cur_pos < (iterator_base::internal_pos + 1))\n    {\n    // Have we stepped forward a column (or multiple columns)?\n    while(((lskip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + aux_col + 1]) && (cur_col < ln_cols))\n      {\n      ++cur_col;\n      }\n\n    // See if the current position is in the subview.\n    const uword row_index = iterator_base::M.m.row_indices[cur_pos + lskip_pos];\n    if(row_index < aux_row)\n      {\n      ++lskip_pos; // not valid\n      }\n    else if(row_index < (aux_row + ln_rows))\n      {\n      ++cur_pos; // valid, in the subview\n      }\n    else\n      {\n      // skip to end of column\n      const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col + 1];\n      lskip_pos += (next_colptr - (cur_pos + lskip_pos));\n      }\n    }\n\n  iterator_base::internal_col = cur_col;\n  iterator_base::skip_pos     = lskip_pos;\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>::const_iterator::const_iterator(const SpSubview<eT>& in_M, const uword in_row, const uword in_col)\n  : iterator_base(in_M, in_col, 0, 0)\n  {\n  // Corner case for empty subviews.\n  if(in_M.n_nonzero == 0)\n    {\n    // We must be at the last position.\n    iterator_base::internal_col = in_M.n_cols;\n    iterator_base::skip_pos = in_M.m.n_nonzero;\n    return;\n    }\n\n  // We have a destination we want to be just after, but don't know what position that is.\n  // Because we have to count the points in this subview and not in this subview, this becomes a little difficult and slow.\n  const uword aux_col = iterator_base::M.aux_col1;\n  const uword aux_row = iterator_base::M.aux_row1;\n  const uword ln_rows = iterator_base::M.n_rows;\n  const uword ln_cols = iterator_base::M.n_cols;\n\n  uword cur_pos = 0;\n  uword skip_pos = iterator_base::M.m.col_ptrs[aux_col];\n  uword cur_col = 0;\n\n  // Skip any empty columns.\n  while(((skip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + aux_col + 1]) && (cur_col < ln_cols))\n    {\n    ++cur_col;\n    }\n\n  while(cur_col < in_col)\n    {\n    // See if the current position is in the subview.\n    const uword row_index = iterator_base::M.m.row_indices[cur_pos + skip_pos];\n    if(row_index < aux_row)\n      {\n      ++skip_pos;\n      }\n    else if(row_index < (aux_row + ln_rows))\n      {\n      ++cur_pos;\n      }\n    else\n      {\n      // skip to end of column\n      const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col + 1];\n      skip_pos += (next_colptr - (cur_pos + skip_pos));\n      }\n\n    // Have we stepped forward a column (or multiple columns)?\n    while(((skip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + aux_col + 1]) && (cur_col < ln_cols))\n      {\n      ++cur_col;\n      }\n    }\n\n  // Now we are either on the right column or ahead of it.\n  if(cur_col == in_col)\n    {\n    // We have to find the right row index.\n    uword row_index = iterator_base::M.m.row_indices[cur_pos + skip_pos];\n    while((row_index < (in_row + aux_row)))\n      {\n      if(row_index < aux_row)\n        {\n        ++skip_pos;\n        }\n      else\n        {\n        ++cur_pos;\n        }\n\n      // Ensure we didn't step forward a column; if we did, we need to stop.\n      while(((skip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + aux_col + 1]) && (cur_col < ln_cols))\n        {\n        ++cur_col;\n        }\n\n      if(cur_col != in_col)\n        {\n        break;\n        }\n\n      row_index = iterator_base::M.m.row_indices[cur_pos + skip_pos];\n      }\n    }\n\n  // Now we need to find the next valid position in the subview.\n  uword row_index;\n  while(true)\n    {\n    const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col + 1];\n    row_index = iterator_base::M.m.row_indices[cur_pos + skip_pos];\n\n    // Are we at the last position?\n    if(cur_col >= ln_cols)\n      {\n      cur_col = ln_cols;\n      // Make sure we will be pointing at the last element in the parent matrix.\n      skip_pos = iterator_base::M.m.n_nonzero - iterator_base::M.n_nonzero;\n      break;\n      }\n\n    if(row_index < aux_row)\n      {\n      ++skip_pos;\n      }\n    else if(row_index < (aux_row + ln_rows))\n      {\n      break; // found\n      }\n    else\n      {\n      skip_pos += (next_colptr - (cur_pos + skip_pos));\n      }\n\n    // Did we move any columns?\n    while(((skip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + aux_col + 1]) && (cur_col < ln_cols))\n      {\n      ++cur_col;\n      }\n    }\n\n  // It is possible we have moved another column.\n  while(((skip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + aux_col + 1]) && (cur_col < ln_cols))\n    {\n    ++cur_col;\n    }\n\n  iterator_base::internal_pos = cur_pos;\n  iterator_base::skip_pos     = skip_pos;\n  iterator_base::internal_col = cur_col;\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>::const_iterator::const_iterator(const SpSubview<eT>& in_M, uword in_row, uword in_col, uword in_pos, uword in_skip_pos)\n  : iterator_base(in_M, in_col, in_pos, in_skip_pos)\n  {\n  arma_ignore(in_row);\n  \n  // Nothing to do.\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>::const_iterator::const_iterator(const const_iterator& other)\n  : iterator_base(other.M, other.internal_col, other.internal_pos, other.skip_pos)\n  {\n  // Nothing to do.\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::const_iterator&\nSpSubview<eT>::const_iterator::operator++()\n  {\n  const uword aux_col = iterator_base::M.aux_col1;\n  const uword aux_row = iterator_base::M.aux_row1;\n  const uword ln_rows = iterator_base::M.n_rows;\n  const uword ln_cols = iterator_base::M.n_cols;\n\n  uword cur_col   = iterator_base::internal_col;\n  uword cur_pos   = iterator_base::internal_pos + 1;\n  uword lskip_pos = iterator_base::skip_pos;\n  uword row_index;\n\n  while(true)\n    {\n    const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col + 1];\n    row_index = iterator_base::M.m.row_indices[cur_pos + lskip_pos];\n\n    // Did we move any columns?\n    while((cur_col < ln_cols) && ((lskip_pos + cur_pos) >= iterator_base::M.m.col_ptrs[cur_col + aux_col + 1]))\n      {\n      ++cur_col;\n      }\n\n    // Are we at the last position?\n    if(cur_col >= ln_cols)\n      {\n      cur_col = ln_cols;\n      // Make sure we will be pointing at the last element in the parent matrix.\n      lskip_pos = iterator_base::M.m.n_nonzero - iterator_base::M.n_nonzero;\n      break;\n      }\n\n    if(row_index < aux_row)\n      {\n      ++lskip_pos;\n      }\n    else if(row_index < (aux_row + ln_rows))\n      {\n      break; // found\n      }\n    else\n      {\n      lskip_pos += (next_colptr - (cur_pos + lskip_pos));\n      }\n    }\n\n  iterator_base::internal_pos = cur_pos;\n  iterator_base::internal_col = cur_col;\n  iterator_base::skip_pos     = lskip_pos;\n\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::const_iterator\nSpSubview<eT>::const_iterator::operator++(int)\n  {\n  typename SpSubview<eT>::const_iterator tmp(*this);\n\n  ++(*this);\n\n  return tmp;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::const_iterator&\nSpSubview<eT>::const_iterator::operator--()\n  {\n  const uword aux_col = iterator_base::M.aux_col1;\n  const uword aux_row = iterator_base::M.aux_row1;\n  const uword ln_rows = iterator_base::M.n_rows;\n\n  uword cur_col  = iterator_base::internal_col;\n  uword cur_pos  = iterator_base::internal_pos - 1;\n  uword skip_pos = iterator_base::skip_pos;\n\n  // Special condition for end of iterator.\n  if((skip_pos + cur_pos + 1) == iterator_base::M.m.n_nonzero)\n    {\n    // We are at the last element.  So we need to set skip_pos back to what it\n    // would be if we didn't manually modify it back in operator++().\n    skip_pos = iterator_base::M.m.col_ptrs[cur_col + aux_col] - iterator_base::internal_pos;\n    }\n\n  uword row_index;\n\n  while(true)\n    {\n    const uword colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col];\n    row_index = iterator_base::M.m.row_indices[cur_pos + skip_pos];\n\n    // Did we move back any columns?\n    while((skip_pos + cur_pos) < iterator_base::M.m.col_ptrs[cur_col + aux_col])\n      {\n      --cur_col;\n      }\n\n    if(row_index < aux_row)\n      {\n      skip_pos -= (colptr - (cur_pos + skip_pos) + 1);\n      }\n    else if(row_index < (aux_row + ln_rows))\n      {\n      break; // found\n      }\n    else\n      {\n      --skip_pos;\n      }\n    }\n\n  iterator_base::internal_pos = cur_pos;\n  iterator_base::skip_pos     = skip_pos;\n  iterator_base::internal_col = cur_col;\n\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::const_iterator\nSpSubview<eT>::const_iterator::operator--(int)\n  {\n  typename SpSubview<eT>::const_iterator tmp(*this);\n\n  --(*this);\n\n  return tmp;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::const_iterator::operator==(const const_iterator& rhs) const\n  {\n  return (rhs.row() == (*this).row()) && (rhs.col() == iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::const_iterator::operator!=(const const_iterator& rhs) const\n  {\n  return (rhs.row() != (*this).row()) || (rhs.col() != iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::const_iterator::operator==(const typename SpMat<eT>::const_iterator& rhs) const\n  {\n  return (rhs.row() == (*this).row()) && (rhs.col() == iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::const_iterator::operator!=(const typename SpMat<eT>::const_iterator& rhs) const\n  {\n  return (rhs.row() != (*this).row()) || (rhs.col() != iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::const_iterator::operator==(const const_row_iterator& rhs) const\n  {\n  return (rhs.row() == (*this).row()) && (rhs.col() == iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::const_iterator::operator!=(const const_row_iterator& rhs) const\n  {\n  return (rhs.row() != (*this).row()) || (rhs.col() != iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::const_iterator::operator==(const typename SpMat<eT>::const_row_iterator& rhs) const\n  {\n  return (rhs.row() == (*this).row()) && (rhs.col() == iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::const_iterator::operator!=(const typename SpMat<eT>::const_row_iterator& rhs) const\n  {\n  return (rhs.row() != (*this).row()) || (rhs.col() != iterator_base::internal_col);\n  }\n\n\n\n///////////////////////////////////////////////////////////////////////////////\n// SpSubview<eT>::iterator implementation                                    //\n///////////////////////////////////////////////////////////////////////////////\n\ntemplate<typename eT>\ninline\nSpValProxy<SpSubview<eT> >\nSpSubview<eT>::iterator::operator*()\n  {\n  return SpValProxy<SpSubview<eT> >(\n    iterator_base::row(),\n    iterator_base::col(),\n    access::rw(iterator_base::M),\n    &(access::rw(iterator_base::M.m.values[iterator_base::internal_pos + iterator_base::skip_pos])));\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::iterator&\nSpSubview<eT>::iterator::operator++()\n  {\n  const_iterator::operator++();\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::iterator\nSpSubview<eT>::iterator::operator++(int)\n  {\n  typename SpSubview<eT>::iterator tmp(*this);\n\n  const_iterator::operator++();\n\n  return tmp;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::iterator&\nSpSubview<eT>::iterator::operator--()\n  {\n  const_iterator::operator--();\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::iterator\nSpSubview<eT>::iterator::operator--(int)\n  {\n  typename SpSubview<eT>::iterator tmp(*this);\n\n  const_iterator::operator--();\n\n  return tmp;\n  }\n\n\n\n///////////////////////////////////////////////////////////////////////////////\n// SpSubview<eT>::const_row_iterator implementation                          //\n///////////////////////////////////////////////////////////////////////////////\n\ntemplate<typename eT>\ninline\nSpSubview<eT>::const_row_iterator::const_row_iterator(const SpSubview<eT>& in_M, uword initial_pos)\n  : iterator_base(in_M, 0, initial_pos, 0)\n  , internal_row(0)\n  , actual_pos(0)\n  {\n  // Corner case for empty subviews.\n  if(in_M.n_nonzero == 0)\n    {\n    iterator_base::internal_col = 0;\n    internal_row = in_M.n_rows;\n    iterator_base::skip_pos = in_M.m.n_nonzero;\n    return;\n    }\n\n  const uword aux_col = iterator_base::M.aux_col1;\n  const uword aux_row = iterator_base::M.aux_row1;\n  const uword ln_cols = iterator_base::M.n_cols;\n\n  // We don't know where the elements are in each row.  What we will do is\n  // loop across all valid columns looking for elements in row 0 (and add to\n  // our sum), then in row 1, and so forth, until we get to the desired\n  // position.\n  uword cur_pos = -1;  // TODO: HACK: -1 is not a valid unsigned integer; using -1 is relying on wraparound/overflow, which is not portable\n  uword cur_row = 0;\n  uword cur_col = 0;\n\n  while(true)\n    {\n    // Is there anything in the column we are looking at?\n    const uword colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col];\n    const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col + 1];\n\n    for(uword ind = colptr; (ind < next_colptr) && (iterator_base::M.m.row_indices[ind] <= (cur_row + aux_row)); ++ind)\n      {\n      // There is something in this column.  Is it in the row we are looking at?\n      const uword row_index = iterator_base::M.m.row_indices[ind];\n      if(row_index == (cur_row + aux_row))\n        {\n        // Yes, it is in the right row.\n        if(++cur_pos == iterator_base::internal_pos)   // TODO: HACK: if cur_pos is std::numeric_limits<uword>::max(), ++cur_pos relies on a wraparound/overflow, which is not portable\n          {\n          iterator_base::internal_col = cur_col;\n          internal_row = cur_row;\n          actual_pos = ind;\n\n          return;\n          }\n\n        // We are done with this column.  Break to the column incrementing code (directly below).\n        break;\n        }\n      else if(row_index > (cur_row + aux_row))\n        {\n        break; // Can't be in this column.\n        }\n      }\n\n    cur_col++; // Done with the column.  Move on.\n    if(cur_col == ln_cols)\n      {\n      // Out of columns.  Loop back to the beginning and look on the next row.\n      cur_col = 0;\n      cur_row++;\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>::const_row_iterator::const_row_iterator(const SpSubview<eT>& in_M, uword in_row, uword in_col)\n  : iterator_base(in_M, in_col, 0, 0)\n  , internal_row(0)\n  , actual_pos(0)\n  {\n  // We have a destination we want to be just after, but don't know what that\n  // position is.  Because we will have to loop over everything anyway, create\n  // another iterator and loop it until it is at the right place, then take its\n  // information.\n  const_row_iterator it(in_M, 0);\n  while((it.row() < in_row) || ((it.row() == in_row) && (it.col() < in_col)))\n    {\n    ++it;\n    }\n\n  iterator_base::internal_col = it.col();\n  iterator_base::internal_pos = it.pos();\n  iterator_base::skip_pos = it.skip_pos;\n  internal_row = it.internal_row;\n  actual_pos = it.actual_pos;\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>::const_row_iterator::const_row_iterator(const const_row_iterator& other)\n  : iterator_base(other.M, other.internal_col, other.internal_pos, other.skip_pos)\n  , internal_row(other.internal_row)\n  , actual_pos(other.actual_pos)\n  {\n  // Nothing to do.\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::const_row_iterator&\nSpSubview<eT>::const_row_iterator::operator++()\n  {\n  // We just need to find the next nonzero element.\n  ++iterator_base::internal_pos;\n\n  // If we have exceeded the bounds, update accordingly.\n  if(iterator_base::internal_pos >= iterator_base::M.n_nonzero)\n    {\n    internal_row = iterator_base::M.n_rows;\n    iterator_base::internal_col = 0;\n    actual_pos = iterator_base::M.m.n_nonzero;\n\n    return *this;\n    }\n\n  // Otherwise, we need to search.\n  uword cur_col = iterator_base::internal_col;\n  uword cur_row = internal_row;\n\n  const uword aux_col = iterator_base::M.aux_col1;\n  const uword aux_row = iterator_base::M.aux_row1;\n  const uword ln_cols = iterator_base::M.n_cols;\n\n  while(true)\n    {\n    // Increment the current column and see if we are on a new row.\n    if(++cur_col == ln_cols)\n      {\n      cur_col = 0;\n      ++cur_row;\n      }\n\n    // Is there anything in this new column?\n    const uword colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col];\n    const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col + 1];\n\n    for(uword ind = colptr; (ind < next_colptr) && (iterator_base::M.m.row_indices[ind] <= (cur_row + aux_row)); ++ind)\n      {\n      const uword row_index = iterator_base::M.m.row_indices[ind];\n\n      if((row_index - aux_row) == cur_row)\n        {\n        // We have successfully incremented.\n        internal_row = cur_row;\n        actual_pos = ind;\n        iterator_base::internal_col = cur_col;\n\n        return *this;\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::const_row_iterator\nSpSubview<eT>::const_row_iterator::operator++(int)\n  {\n  typename SpSubview<eT>::const_row_iterator tmp(*this);\n\n  ++(*this);\n\n  return tmp;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::const_row_iterator&\nSpSubview<eT>::const_row_iterator::operator--()\n  {\n  // We just need to find the previous element.\n//  if(iterator_base::pos == 0)\n//    {\n//    // We cannot decrement.\n//    return *this;\n//    }\n//  else if(iterator_base::pos == iterator_base::M.n_nonzero)\n//    {\n//    // We will be coming off the last element.  We need to reset the row correctly, because we set row = 0 in the last matrix position.\n//    iterator_base::row = iterator_base::M.n_rows - 1;\n//    }\n//  else if(iterator_base::pos > iterator_base::M.n_nonzero)\n//    {\n//    // This shouldn't happen...\n//    iterator_base::pos--;\n//    return *this;\n//    }\n\n  iterator_base::internal_pos--;\n\n  // We have to search backwards.\n  uword cur_col = iterator_base::internal_col;\n  uword cur_row = internal_row;\n\n  const uword aux_col = iterator_base::M.aux_col1;\n  const uword aux_row = iterator_base::M.aux_row1;\n  const uword ln_cols = iterator_base::M.n_cols;\n\n  while(true)\n    {\n    // Decrement the current column and see if we are on a new row.\n    if(--cur_col > ln_cols)\n      {\n      cur_col = ln_cols - 1;\n      cur_row--;\n      }\n\n    // Is there anything in this new column?\n    const uword colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col];\n    const uword next_colptr = iterator_base::M.m.col_ptrs[cur_col + aux_col + 1];\n\n    for(uword ind = colptr; (ind < next_colptr) && (iterator_base::M.m.row_indices[ind] <= (cur_row + aux_row)); ++ind)\n      {\n      const uword row_index = iterator_base::M.m.row_indices[ind];\n\n      if((row_index - aux_row) == cur_row)\n        {\n        iterator_base::internal_col = cur_col;\n        internal_row = cur_row;\n        actual_pos = ind;\n\n        return *this;\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::const_row_iterator\nSpSubview<eT>::const_row_iterator::operator--(int)\n  {\n  typename SpSubview<eT>::const_row_iterator tmp(*this);\n\n  --(*this);\n\n  return tmp;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::const_row_iterator::operator==(const const_iterator& rhs) const\n  {\n  return (rhs.row() == row()) && (rhs.col() == iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::const_row_iterator::operator!=(const const_iterator& rhs) const\n  {\n  return (rhs.row() != row()) || (rhs.col() != iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::const_row_iterator::operator==(const typename SpMat<eT>::const_iterator& rhs) const\n  {\n  return (rhs.row() == row()) && (rhs.col() == iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::const_row_iterator::operator!=(const typename SpMat<eT>::const_iterator& rhs) const\n  {\n  return (rhs.row() != row()) || (rhs.col() != iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::const_row_iterator::operator==(const const_row_iterator& rhs) const\n  {\n  return (rhs.row() == row()) && (rhs.col() == iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::const_row_iterator::operator!=(const const_row_iterator& rhs) const\n  {\n  return (rhs.row() != row()) || (rhs.col() != iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::const_row_iterator::operator==(const typename SpMat<eT>::const_row_iterator& rhs) const\n  {\n  return (rhs.row() == row()) && (rhs.col() == iterator_base::internal_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::const_row_iterator::operator!=(const typename SpMat<eT>::const_row_iterator& rhs) const\n  {\n  return (rhs.row() != row()) || (rhs.col() != iterator_base::internal_col);\n  }\n\n\n\n///////////////////////////////////////////////////////////////////////////////\n// SpSubview<eT>::row_iterator implementation                                //\n///////////////////////////////////////////////////////////////////////////////\n\ntemplate<typename eT>\ninline\nSpValProxy<SpSubview<eT> >\nSpSubview<eT>::row_iterator::operator*()\n  {\n  return SpValProxy<SpSubview<eT> >(\n    const_row_iterator::internal_row,\n    iterator_base::internal_col,\n    access::rw(iterator_base::M),\n    &access::rw(iterator_base::M.m.values[const_row_iterator::actual_pos]));\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::row_iterator&\nSpSubview<eT>::row_iterator::operator++()\n  {\n  const_row_iterator::operator++();\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::row_iterator\nSpSubview<eT>::row_iterator::operator++(int)\n  {\n  typename SpSubview<eT>::row_iterator tmp(*this);\n\n  ++(*this);\n\n  return tmp;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::row_iterator&\nSpSubview<eT>::row_iterator::operator--()\n  {\n  const_row_iterator::operator--();\n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::row_iterator\nSpSubview<eT>::row_iterator::operator--(int)\n  {\n  typename SpSubview<eT>::row_iterator tmp(*this);\n\n  --(*this);\n\n  return tmp;\n  }\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpSubview_meat.hpp",
    "content": "// Copyright (C) 2011-2015 Ryan Curtin\n// Copyright (C) 2012-2015 Conrad Sanderson\n// Copyright (C) 2011 Matthew Amidon\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup SpSubview\n//! @{\n\ntemplate<typename eT>\narma_inline\nSpSubview<eT>::SpSubview(const SpMat<eT>& in_m, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols)\n  : m(in_m)\n  , aux_row1(in_row1)\n  , aux_col1(in_col1)\n  , n_rows(in_n_rows)\n  , n_cols(in_n_cols)\n  , n_elem(in_n_rows * in_n_cols)\n  , n_nonzero(0)\n  {\n  arma_extra_debug_sigprint();\n  \n  // There must be a O(1) way to do this\n  uword lend     = m.col_ptrs[in_col1 + in_n_cols];\n  uword lend_row = in_row1 + in_n_rows;\n  uword count   = 0;\n  \n  for(uword i = m.col_ptrs[in_col1]; i < lend; ++i)\n    {\n    const uword m_row_indices_i = m.row_indices[i];\n    \n    const bool condition = (m_row_indices_i >= in_row1) && (m_row_indices_i < lend_row);\n    \n    count += condition ? uword(1) : uword(0);\n    }\n  \n  access::rw(n_nonzero) = count;\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nSpSubview<eT>::SpSubview(SpMat<eT>& in_m, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols)\n  : m(in_m)\n  , aux_row1(in_row1)\n  , aux_col1(in_col1)\n  , n_rows(in_n_rows)\n  , n_cols(in_n_cols)\n  , n_elem(in_n_rows * in_n_cols)\n  , n_nonzero(0)\n  {\n  arma_extra_debug_sigprint();\n  \n  // There must be a O(1) way to do this\n  uword lend     = m.col_ptrs[in_col1 + in_n_cols];\n  uword lend_row = in_row1 + in_n_rows;\n  uword count    = 0;\n  \n  for(uword i = m.col_ptrs[in_col1]; i < lend; ++i)\n    {\n    const uword m_row_indices_i = m.row_indices[i];\n    \n    const bool condition = (m_row_indices_i >= in_row1) && (m_row_indices_i < lend_row);\n    \n    count += condition ? uword(1) : uword(0);\n    }\n  \n  access::rw(n_nonzero) = count;\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>::~SpSubview()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator+=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(val == eT(0))\n    {\n    return *this;\n    }\n  \n  Mat<eT> tmp( (*this).n_rows, (*this).n_cols );\n  \n  tmp.fill(val);\n  \n  return (*this).operator=( (*this) + tmp );\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator-=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n\n  if(val == eT(0))\n    {\n    return *this;\n    }\n\n  Mat<eT> tmp( (*this).n_rows, (*this).n_cols );\n  \n  tmp.fill(val);\n  \n  return (*this).operator=( (*this) - tmp );\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator*=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword lstart_row = aux_row1;\n  const uword lend_row   = aux_row1 + n_rows;\n  \n  const uword lstart_col = aux_col1;\n  const uword lend_col   = aux_col1 + n_cols;\n  \n  const uword* m_row_indices = m.row_indices;\n        eT*    m_values      = access::rwp(m.values);\n  \n  for(uword c = lstart_col; c < lend_col; ++c)\n    {\n    const uword r_start = m.col_ptrs[c    ];\n    const uword r_end   = m.col_ptrs[c + 1];\n    \n    for(uword r = r_start; r < r_end; ++r)\n      {\n      const uword m_row_indices_r = m_row_indices[r];\n      \n      if( (m_row_indices_r >= lstart_row) && (m_row_indices_r < lend_row) )\n        {\n        m_values[r] *= val;\n        }\n      }\n    }\n  \n  const uword old_m_n_nonzero = m.n_nonzero;\n  \n  access::rw(m).remove_zeros();\n  \n  if(m.n_nonzero != old_m_n_nonzero)\n    {\n    access::rw(n_nonzero) = n_nonzero - (old_m_n_nonzero - m.n_nonzero); \n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator/=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (val == eT(0)), \"element-wise division: division by zero\" );\n  \n  const uword lstart_row = aux_row1;\n  const uword lend_row   = aux_row1 + n_rows;\n  \n  const uword lstart_col = aux_col1;\n  const uword lend_col   = aux_col1 + n_cols;\n  \n  const uword* m_row_indices = m.row_indices;\n        eT*    m_values      = access::rwp(m.values);\n  \n  for(uword c = lstart_col; c < lend_col; ++c)\n    {\n    const uword r_start = m.col_ptrs[c    ];\n    const uword r_end   = m.col_ptrs[c + 1];\n    \n    for(uword r = r_start; r < r_end; ++r)\n      {\n      const uword m_row_indices_r = m_row_indices[r];\n      \n      if( (m_row_indices_r >= lstart_row) && (m_row_indices_r < lend_row) )\n        {\n        m_values[r] /= val;\n        }\n      }\n    }\n  \n  const uword old_m_n_nonzero = m.n_nonzero;\n  \n  access::rw(m).remove_zeros();\n  \n  if(m.n_nonzero != old_m_n_nonzero)\n    {\n    access::rw(n_nonzero) = n_nonzero - (old_m_n_nonzero - m.n_nonzero); \n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator=(const Base<eT, T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  // this is a modified version of SpSubview::operator_equ_common(const SpBase)\n  \n  const SpProxy< SpMat<eT> > pa((*this).m);\n  \n  const unwrap<T1>     b_tmp(in.get_ref());\n  const Mat<eT>&   b = b_tmp.M;\n  \n  arma_debug_assert_same_size(n_rows, n_cols, b.n_rows, b.n_cols, \"insertion into sparse submatrix\");\n  \n  const uword pa_start_row = (*this).aux_row1;\n  const uword pa_start_col = (*this).aux_col1;\n  \n  const uword pa_end_row = pa_start_row + (*this).n_rows - 1;\n  const uword pa_end_col = pa_start_col + (*this).n_cols - 1;\n  \n  const uword pa_n_rows = pa.get_n_rows();\n  \n  const uword b_n_elem = b.n_elem;\n  const eT*   b_mem    = b.memptr();\n  \n  uword box_count = 0;\n  \n  for(uword i=0; i<b_n_elem; ++i)\n    {\n    box_count += (b_mem[i] != eT(0)) ? uword(1) : uword(0);\n    }\n  \n  SpMat<eT> out(pa.get_n_rows(), pa.get_n_cols());\n  \n  const uword alt_count = pa.get_n_nonzero() - (*this).n_nonzero + box_count;\n  \n  // Resize memory to correct size.\n  out.mem_resize(alt_count);\n  \n  typename SpProxy< SpMat<eT> >::const_iterator_type x_it  = pa.begin();\n  typename SpProxy< SpMat<eT> >::const_iterator_type x_end = pa.end();\n  \n  uword b_row = 0;\n  uword b_col = 0;\n    \n  bool x_it_ok = (x_it != x_end);\n  bool y_it_ok = ( (b_row < b.n_rows) && (b_col < b.n_cols) );\n  \n  uword x_it_row = (x_it_ok) ? x_it.row() : 0;\n  uword x_it_col = (x_it_ok) ? x_it.col() : 0;\n  \n  uword y_it_row = (y_it_ok) ? b_row + pa_start_row : 0;\n  uword y_it_col = (y_it_ok) ? b_col + pa_start_col : 0;\n    \n  uword cur_val = 0;\n  while(x_it_ok || y_it_ok)\n    {\n    const bool x_inside_box = (x_it_row >= pa_start_row) && (x_it_row <= pa_end_row) && (x_it_col >= pa_start_col) && (x_it_col <= pa_end_col);\n    const bool y_inside_box = (y_it_row >= pa_start_row) && (y_it_row <= pa_end_row) && (y_it_col >= pa_start_col) && (y_it_col <= pa_end_col);\n    \n    const eT x_val = x_inside_box ? eT(0) : ( x_it_ok ? (*x_it) : eT(0) );\n    \n    const eT y_val = y_inside_box ? ( y_it_ok ? b.at(b_row,b_col) : eT(0) ) : eT(0);\n    \n    if( (x_it_row == y_it_row) && (x_it_col == y_it_col) )\n      {\n      if( (x_val != eT(0)) || (y_val != eT(0)) )  \n        {\n        access::rw(out.values[cur_val]) = (x_val != eT(0)) ? x_val : y_val;\n        access::rw(out.row_indices[cur_val]) = x_it_row;\n        ++access::rw(out.col_ptrs[x_it_col + 1]);\n        ++cur_val;\n        }\n      \n      if(x_it_ok)\n        {\n        ++x_it;\n        \n        if(x_it == x_end)  { x_it_ok = false; }\n        }\n      \n      if(x_it_ok)\n        {\n        x_it_row = x_it.row();\n        x_it_col = x_it.col();\n        }\n      else\n        {\n        x_it_row++;\n        \n        if(x_it_row >= pa_n_rows)  { x_it_row = 0; x_it_col++; }\n        }\n      \n      if(y_it_ok)\n        {\n        b_row++;\n        \n        if(b_row >= b.n_rows)  { b_row = 0; b_col++; }\n        \n        if( (b_row > b.n_rows) || (b_col > b.n_cols) )  { y_it_ok = false; }\n        }\n      \n      if(y_it_ok)\n        {\n        y_it_row = b_row + pa_start_row;\n        y_it_col = b_col + pa_start_col;\n        }\n      else\n        {\n        y_it_row++;\n        \n        if(y_it_row >= pa_n_rows)  { y_it_row = 0; y_it_col++; }\n        }\n      }\n    else\n      {\n      if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end\n        {\n        if(x_val != eT(0))\n          {\n          access::rw(out.values[cur_val]) = x_val;\n          access::rw(out.row_indices[cur_val]) = x_it_row;\n          ++access::rw(out.col_ptrs[x_it_col + 1]);\n          ++cur_val;\n          }\n        \n        if(x_it_ok)\n          {\n          ++x_it;\n          \n          if(x_it == x_end)  { x_it_ok = false; }\n          }\n        \n        if(x_it_ok)\n          {\n          x_it_row = x_it.row();\n          x_it_col = x_it.col();\n          }\n        else\n          {\n          x_it_row++;\n          \n          if(x_it_row >= pa_n_rows)  { x_it_row = 0; x_it_col++; }\n          }\n        }\n      else\n        {\n        if(y_val != eT(0))\n          {\n          access::rw(out.values[cur_val]) = y_val;\n          access::rw(out.row_indices[cur_val]) = y_it_row;\n          ++access::rw(out.col_ptrs[y_it_col + 1]);\n          ++cur_val;\n          }\n        \n        if(y_it_ok)\n          {\n          b_row++;\n          \n          if(b_row >= b.n_rows)  { b_row = 0; b_col++; }\n          \n          if( (b_row > b.n_rows) || (b_col > b.n_cols) )  { y_it_ok = false; }\n          }\n        \n        if(y_it_ok)\n          {\n          y_it_row = b_row + pa_start_row;\n          y_it_col = b_col + pa_start_col;\n          }\n        else\n          {\n          y_it_row++;\n          \n          if(y_it_row >= pa_n_rows)  { y_it_row = 0; y_it_col++; }\n          }\n        }\n      }\n    }\n  \n  const uword out_n_cols = out.n_cols;\n  \n  uword* col_ptrs = access::rwp(out.col_ptrs);\n  \n  // Fix column pointers to be cumulative.\n  for(uword c = 1; c <= out_n_cols; ++c)\n    {\n    col_ptrs[c] += col_ptrs[c - 1];\n    }\n  \n  access::rw((*this).m).steal_mem(out);\n  \n  access::rw(n_nonzero) = box_count;\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator+=(const Base<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).operator=( (*this) + x.get_ref() );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator-=(const Base<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n\n  return (*this).operator=( (*this) - x.get_ref() );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator*=(const Base<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT> tmp(*this);\n  \n  tmp *= x.get_ref();\n  \n  return (*this).operator=(tmp);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator%=(const Base<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n\n  return (*this).operator=( (*this) % x.get_ref() );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator/=(const Base<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n\n  return (*this).operator=( (*this) / x.get_ref() );\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator=(const SpSubview<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).operator_equ_common(x);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator=(const SpBase<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).operator_equ_common( x.get_ref() );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator_equ_common(const SpBase<eT, T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  // algorithm:\n  // instead of directly inserting values into the matrix underlying the subview,\n  // create a new matrix by merging the underlying matrix with the input object,\n  // and then replacing the underlying matrix with the created matrix.\n  // \n  // the merging process requires pretending that the input object\n  // has the same size as the underlying matrix.\n  // while iterating through the elements of the input object,\n  // this requires adjusting the row and column locations of each element,\n  // as well as providing fake zero elements.\n  // in effect there is a proxy for a proxy.\n  \n  \n  const SpProxy< SpMat<eT> > pa((*this).m   );\n  const SpProxy< T1        > pb(in.get_ref());\n  \n  arma_debug_assert_same_size(n_rows, n_cols, pb.get_n_rows(), pb.get_n_cols(), \"insertion into sparse submatrix\");\n  \n  const uword pa_start_row = (*this).aux_row1;\n  const uword pa_start_col = (*this).aux_col1;\n  \n  const uword pa_end_row = pa_start_row + (*this).n_rows - 1;\n  const uword pa_end_col = pa_start_col + (*this).n_cols - 1;\n  \n  const uword pa_n_rows = pa.get_n_rows();\n  \n  SpMat<eT> out(pa.get_n_rows(), pa.get_n_cols());\n  \n  const uword alt_count = pa.get_n_nonzero() - (*this).n_nonzero + pb.get_n_nonzero();\n  \n  // Resize memory to correct size.\n  out.mem_resize(alt_count);\n  \n  typename SpProxy< SpMat<eT> >::const_iterator_type x_it  = pa.begin();\n  typename SpProxy< SpMat<eT> >::const_iterator_type x_end = pa.end();\n  \n  typename SpProxy<T1>::const_iterator_type y_it  = pb.begin();\n  typename SpProxy<T1>::const_iterator_type y_end = pb.end();\n  \n  bool x_it_ok = (x_it != x_end);\n  bool y_it_ok = (y_it != y_end);\n  \n  uword x_it_row = (x_it_ok) ? x_it.row() : 0;\n  uword x_it_col = (x_it_ok) ? x_it.col() : 0;\n  \n  uword y_it_row = (y_it_ok) ? y_it.row() + pa_start_row : 0;\n  uword y_it_col = (y_it_ok) ? y_it.col() + pa_start_col : 0;\n    \n  uword cur_val = 0;\n  while(x_it_ok || y_it_ok)\n    {\n    const bool x_inside_box = (x_it_row >= pa_start_row) && (x_it_row <= pa_end_row) && (x_it_col >= pa_start_col) && (x_it_col <= pa_end_col);\n    const bool y_inside_box = (y_it_row >= pa_start_row) && (y_it_row <= pa_end_row) && (y_it_col >= pa_start_col) && (y_it_col <= pa_end_col);\n    \n    const eT x_val = x_inside_box ? eT(0) : ( x_it_ok ? (*x_it) : eT(0) );\n    \n    const eT y_val = y_inside_box ? ( y_it_ok ? (*y_it) : eT(0) ) : eT(0);\n    \n    if( (x_it_row == y_it_row) && (x_it_col == y_it_col) )\n      {\n      if( (x_val != eT(0)) || (y_val != eT(0)) )  \n        {\n        access::rw(out.values[cur_val]) = (x_val != eT(0)) ? x_val : y_val;\n        access::rw(out.row_indices[cur_val]) = x_it_row;\n        ++access::rw(out.col_ptrs[x_it_col + 1]);\n        ++cur_val;\n        }\n      \n      if(x_it_ok)\n        {\n        ++x_it;\n        \n        if(x_it == x_end)  { x_it_ok = false; }\n        }\n      \n      if(x_it_ok)\n        {\n        x_it_row = x_it.row();\n        x_it_col = x_it.col();\n        }\n      else\n        {\n        x_it_row++;\n        \n        if(x_it_row >= pa_n_rows)  { x_it_row = 0; x_it_col++; }\n        }\n      \n      if(y_it_ok)\n        {\n        ++y_it;\n        \n        if(y_it == y_end)  { y_it_ok = false; }\n        }\n      \n      if(y_it_ok)\n        {\n        y_it_row = y_it.row() + pa_start_row;\n        y_it_col = y_it.col() + pa_start_col;\n        }\n      else\n        {\n        y_it_row++;\n        \n        if(y_it_row >= pa_n_rows)  { y_it_row = 0; y_it_col++; }\n        }\n      }\n    else\n      {\n      if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end\n        {\n        if(x_val != eT(0))\n          {\n          access::rw(out.values[cur_val]) = x_val;\n          access::rw(out.row_indices[cur_val]) = x_it_row;\n          ++access::rw(out.col_ptrs[x_it_col + 1]);\n          ++cur_val;\n          }\n        \n        if(x_it_ok)\n          {\n          ++x_it;\n          \n          if(x_it == x_end)  { x_it_ok = false; }\n          }\n        \n        if(x_it_ok)\n          {\n          x_it_row = x_it.row();\n          x_it_col = x_it.col();\n          }\n        else\n          {\n          x_it_row++;\n          \n          if(x_it_row >= pa_n_rows)  { x_it_row = 0; x_it_col++; }\n          }\n        }\n      else\n        {\n        if(y_val != eT(0))\n          {\n          access::rw(out.values[cur_val]) = y_val;\n          access::rw(out.row_indices[cur_val]) = y_it_row;\n          ++access::rw(out.col_ptrs[y_it_col + 1]);\n          ++cur_val;\n          }\n        \n        if(y_it_ok)\n          {\n          ++y_it;\n          \n          if(y_it == y_end)  { y_it_ok = false; }\n          }\n        \n        if(y_it_ok)\n          {\n          y_it_row = y_it.row() + pa_start_row;\n          y_it_col = y_it.col() + pa_start_col;\n          }\n        else\n          {\n          y_it_row++;\n          \n          if(y_it_row >= pa_n_rows)  { y_it_row = 0; y_it_col++; }\n          }\n        }\n      }\n    }\n  \n  const uword out_n_cols = out.n_cols;\n  \n  uword* col_ptrs = access::rwp(out.col_ptrs);\n  \n  // Fix column pointers to be cumulative.\n  for(uword c = 1; c <= out_n_cols; ++c)\n    {\n    col_ptrs[c] += col_ptrs[c - 1];\n    }\n  \n  access::rw((*this).m).steal_mem(out);\n  \n  access::rw(n_nonzero) = pb.get_n_nonzero();\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator+=(const SpBase<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  // TODO: implement dedicated machinery\n  return (*this).operator=( (*this) + x.get_ref() );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator-=(const SpBase<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  // TODO: implement dedicated machinery\n  return (*this).operator=( (*this) - x.get_ref() );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator*=(const SpBase<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n\n  return (*this).operator=( (*this) * x.get_ref() );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator%=(const SpBase<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  // TODO: implement dedicated machinery\n  return (*this).operator=( (*this) % x.get_ref() );\n  }\n\n\n\n//! If you are using this function, you are probably misguided.\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nconst SpSubview<eT>&\nSpSubview<eT>::operator/=(const SpBase<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpProxy<T1> p(x.get_ref());\n  \n  arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), \"element-wise division\");\n  \n  if(p.is_alias(m) == false)\n    {\n    for(uword lcol = 0; lcol < n_cols; ++lcol)\n    for(uword lrow = 0; lrow < n_rows; ++lrow)\n      {\n      at(lrow,lcol) /= p.at(lrow,lcol);\n      }\n    }\n  else\n    {\n    const SpMat<eT> tmp(p.Q);\n    \n    (*this).operator/=(tmp);\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpSubview<eT>::fill(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(val != eT(0))\n    {\n    Mat<eT> tmp( (*this).n_rows, (*this).n_cols );\n    \n    tmp.fill(val);\n    \n    (*this).operator=(tmp);\n    }\n  else\n    {\n    (*this).zeros();\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpSubview<eT>::zeros()\n  {\n  arma_extra_debug_sigprint();\n  \n  (*this).operator*=(eT(0));\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpSubview<eT>::ones()\n  {\n  arma_extra_debug_sigprint();\n\n  (*this).fill(eT(1));\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpSubview<eT>::eye()\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT> tmp;\n  \n  tmp.eye( (*this).n_rows, (*this).n_cols );\n  \n  (*this).operator=(tmp);\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nSpValProxy<SpSubview<eT> >\nSpSubview<eT>::operator[](const uword i)\n  {\n  const uword lrow = i % n_rows;\n  const uword lcol = i / n_rows;\n\n  return (*this).at(lrow, lcol);\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\neT\nSpSubview<eT>::operator[](const uword i) const\n  {\n  const uword lrow = i % n_rows;\n  const uword lcol = i / n_rows;\n\n  return (*this).at(lrow, lcol);\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nSpValProxy< SpSubview<eT> >\nSpSubview<eT>::operator()(const uword i)\n  {\n  arma_debug_check( (i >= n_elem), \"SpSubview::operator(): index out of bounds\");\n\n  const uword lrow = i % n_rows;\n  const uword lcol = i / n_rows;\n\n  return (*this).at(lrow, lcol);\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\neT\nSpSubview<eT>::operator()(const uword i) const\n  {\n  arma_debug_check( (i >= n_elem), \"SpSubview::operator(): index out of bounds\");\n\n  const uword lrow = i % n_rows;\n  const uword lcol = i / n_rows;\n\n  return (*this).at(lrow, lcol);\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nSpValProxy< SpSubview<eT> >\nSpSubview<eT>::operator()(const uword in_row, const uword in_col)\n  {\n  arma_debug_check( (in_row >= n_rows) || (in_col >= n_cols), \"SpSubview::operator(): index out of bounds\");\n\n  return (*this).at(in_row, in_col);\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\neT\nSpSubview<eT>::operator()(const uword in_row, const uword in_col) const\n  {\n  arma_debug_check( (in_row >= n_rows) || (in_col >= n_cols), \"SpSubview::operator(): index out of bounds\");\n\n  return (*this).at(in_row, in_col);\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nSpValProxy< SpSubview<eT> >\nSpSubview<eT>::at(const uword i)\n  {\n  const uword lrow = i % n_rows;\n  const uword lcol = i / n_cols;\n\n  return (*this).at(lrow, lcol);\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\neT\nSpSubview<eT>::at(const uword i) const\n  {\n  const uword lrow = i % n_rows;\n  const uword lcol = i / n_cols;\n\n  return (*this).at(lrow, lcol);\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nSpValProxy< SpSubview<eT> >\nSpSubview<eT>::at(const uword in_row, const uword in_col)\n  {\n  const uword colptr      = m.col_ptrs[in_col + aux_col1];\n  const uword next_colptr = m.col_ptrs[in_col + aux_col1 + 1];\n\n  // Step through the row indices to see if our element exists.\n  for(uword i = colptr; i < next_colptr; ++i)\n    {\n    // First check that we have not stepped past it.\n    if((in_row + aux_row1) < m.row_indices[i])\n      {\n      return SpValProxy<SpSubview<eT> >(in_row, in_col, *this); // Proxy for a zero value.\n      }\n\n    // Now check if we are at the correct place.\n    if((in_row + aux_row1) == m.row_indices[i]) // If we are, return a reference to the value.\n      {\n      return SpValProxy<SpSubview<eT> >(in_row, in_col, *this, &access::rw(m.values[i]));\n      }\n    }\n\n  // We did not find it, so it does not exist.\n  return SpValProxy<SpSubview<eT> >(in_row, in_col, *this);\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\neT\nSpSubview<eT>::at(const uword in_row, const uword in_col) const\n  {\n  return m.at(aux_row1 + in_row, aux_col1 + in_col);\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::check_overlap(const SpSubview<eT>& x) const\n  {\n  const subview<eT>& t = *this;\n\n  if(&t.m != &x.m)\n    {\n    return false;\n    }\n  else\n    {\n    if( (t.n_elem == 0) || (x.n_elem == 0) )\n      {\n      return false;\n      }\n    else\n      {\n      const uword t_row_start  = t.aux_row1;\n      const uword t_row_end_p1 = t_row_start + t.n_rows;\n\n      const uword t_col_start  = t.aux_col1;\n      const uword t_col_end_p1 = t_col_start + t.n_cols;\n\n      const uword x_row_start  = x.aux_row1;\n      const uword x_row_end_p1 = x_row_start + x.n_rows;\n\n      const uword x_col_start  = x.aux_col1;\n      const uword x_col_end_p1 = x_col_start + x.n_cols;\n\n      const bool outside_rows = ( (x_row_start >= t_row_end_p1) || (t_row_start >= x_row_end_p1) );\n      const bool outside_cols = ( (x_col_start >= t_col_end_p1) || (t_col_start >= x_col_end_p1) );\n\n      return ( (outside_rows == false) && (outside_cols == false) );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nSpSubview<eT>::is_vec() const\n  {\n  return ( (n_rows == 1) || (n_cols == 1) );\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpSubview<eT>::row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check(row_num >= n_rows, \"SpSubview::row(): out of bounds\");\n\n  return submat(row_num, 0, row_num, n_cols - 1);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpSubview<eT>::row(const uword row_num) const\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check(row_num >= n_rows, \"SpSubview::row(): out of bounds\");\n\n  return submat(row_num, 0, row_num, n_cols - 1);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpSubview<eT>::col(const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check(col_num >= n_cols, \"SpSubview::col(): out of bounds\");\n\n  return submat(0, col_num, n_rows - 1, col_num);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpSubview<eT>::col(const uword col_num) const\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check(col_num >= n_cols, \"SpSubview::col(): out of bounds\");\n\n  return submat(0, col_num, n_rows - 1, col_num);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpSubview<eT>::rows(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_row2 >= n_rows),\n    \"SpSubview::rows(): indices out of bounds or incorrectly used\"\n    );\n\n  return submat(in_row1, 0, in_row2, n_cols - 1);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpSubview<eT>::rows(const uword in_row1, const uword in_row2) const\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_row2 >= n_rows),\n    \"SpSubview::rows(): indices out of bounds or incorrectly used\"\n    );\n\n  return submat(in_row1, 0, in_row2, n_cols - 1);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpSubview<eT>::cols(const uword in_col1, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check\n    (\n    (in_col1 > in_col2) || (in_col2 >= n_cols),\n    \"SpSubview::cols(): indices out of bounds or incorrectly used\"\n    );\n\n  return submat(0, in_col1, n_rows - 1, in_col2);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpSubview<eT>::cols(const uword in_col1, const uword in_col2) const\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check\n    (\n    (in_col1 > in_col2) || (in_col2 >= n_cols),\n    \"SpSubview::cols(): indices out of bounds or incorrectly used\"\n    );\n\n  return submat(0, in_col1, n_rows - 1, in_col2);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpSubview<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),\n    \"SpSubview::submat(): indices out of bounds or incorrectly used\"\n    );\n\n  return access::rw(m).submat(in_row1 + aux_row1, in_col1 + aux_col1, in_row2 + aux_row1, in_col2 + aux_col1);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpSubview<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),\n    \"SpSubview::submat(): indices out of bounds or incorrectly used\"\n    );\n\n  return m.submat(in_row1 + aux_row1, in_col1 + aux_col1, in_row2 + aux_row1, in_col2 + aux_col1);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpSubview<eT>::submat(const span& row_span, const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n\n  const bool row_all = row_span.whole;\n  const bool col_all = row_span.whole;\n\n  const uword in_row1 = row_all ? 0      : row_span.a;\n  const uword in_row2 = row_all ? n_rows : row_span.b;\n\n  const uword in_col1 = col_all ? 0      : col_span.a;\n  const uword in_col2 = col_all ? n_cols : col_span.b;\n\n  arma_debug_check\n    (\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= n_rows)))\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= n_cols))),\n    \"SpSubview::submat(): indices out of bounds or incorrectly used\"\n    );\n\n  return submat(in_row1, in_col1, in_row2, in_col2);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpSubview<eT>::submat(const span& row_span, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n\n  const bool row_all = row_span.whole;\n  const bool col_all = row_span.whole;\n\n  const uword in_row1 = row_all ? 0          : row_span.a;\n  const uword in_row2 = row_all ? n_rows - 1 : row_span.b;\n\n  const uword in_col1 = col_all ? 0          : col_span.a;\n  const uword in_col2 = col_all ? n_cols - 1 : col_span.b;\n\n  arma_debug_check\n    (\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= n_rows)))\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= n_cols))),\n    \"SpSubview::submat(): indices out of bounds or incorrectly used\"\n    );\n\n  return submat(in_row1, in_col1, in_row2, in_col2);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpSubview<eT>::operator()(const uword row_num, const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n\n  return submat(span(row_num, row_num), col_span);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpSubview<eT>::operator()(const uword row_num, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n\n  return submat(span(row_num, row_num), col_span);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpSubview<eT>::operator()(const span& row_span, const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n\n  return submat(row_span, span(col_num, col_num));\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpSubview<eT>::operator()(const span& row_span, const uword col_num) const\n  {\n  arma_extra_debug_sigprint();\n\n  return submat(row_span, span(col_num, col_num));\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpSubview<eT>\nSpSubview<eT>::operator()(const span& row_span, const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n\n  return submat(row_span, col_span);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst SpSubview<eT>\nSpSubview<eT>::operator()(const span& row_span, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n\n  return submat(row_span, col_span);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpSubview<eT>::swap_rows(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check((in_row1 >= n_rows) || (in_row2 >= n_rows), \"SpSubview::swap_rows(): invalid row index\");\n\n  const uword lstart_col = aux_col1;\n  const uword lend_col   = aux_col1 + n_cols;\n\n  for(uword c = lstart_col; c < lend_col; ++c)\n    {\n    eT val = m.at(in_row1 + aux_row1, c);\n    access::rw(m).at(in_row2 + aux_row1, c) = m.at(in_row1 + aux_row1, c);\n    access::rw(m).at(in_row1 + aux_row1, c) = val;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpSubview<eT>::swap_cols(const uword in_col1, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n\n  arma_debug_check((in_col1 >= n_cols) || (in_col2 >= n_cols), \"SpSubview::swap_cols(): invalid column index\");\n\n  const uword lstart_row = aux_row1;\n  const uword lend_row   = aux_row1 + n_rows;\n\n  for(uword r = lstart_row; r < lend_row; ++r)\n    {\n    eT val = m.at(r, in_col1 + aux_col1);\n    access::rw(m).at(r, in_col1 + aux_col1) = m.at(r, in_col2 + aux_col1);\n    access::rw(m).at(r, in_col2 + aux_col1) = val;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::iterator\nSpSubview<eT>::begin()\n  {\n  return iterator(*this);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::const_iterator\nSpSubview<eT>::begin() const\n  {\n  return const_iterator(*this);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::iterator\nSpSubview<eT>::begin_col(const uword col_num)\n  {\n  return iterator(*this, 0, col_num);\n  }\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::const_iterator\nSpSubview<eT>::begin_col(const uword col_num) const\n  {\n  return const_iterator(*this, 0, col_num);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::row_iterator\nSpSubview<eT>::begin_row(const uword row_num)\n  {\n  return row_iterator(*this, row_num, 0);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::const_row_iterator\nSpSubview<eT>::begin_row(const uword row_num) const\n  {\n  return const_row_iterator(*this, row_num, 0);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::iterator\nSpSubview<eT>::end()\n  {\n  return iterator(*this, 0, n_cols, n_nonzero, m.n_nonzero - n_nonzero);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::const_iterator\nSpSubview<eT>::end() const\n  {\n  return const_iterator(*this, 0, n_cols, n_nonzero, m.n_nonzero - n_nonzero);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::row_iterator\nSpSubview<eT>::end_row()\n  {\n  return row_iterator(*this, n_nonzero);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::const_row_iterator\nSpSubview<eT>::end_row() const\n  {\n  return const_row_iterator(*this, n_nonzero);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::row_iterator\nSpSubview<eT>::end_row(const uword row_num)\n  {\n  return row_iterator(*this, row_num + 1, 0);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename SpSubview<eT>::const_row_iterator\nSpSubview<eT>::end_row(const uword row_num) const\n  {\n  return const_row_iterator(*this, row_num + 1, 0);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_hot\narma_warn_unused\neT&\nSpSubview<eT>::add_element(const uword in_row, const uword in_col, const eT in_val)\n  {\n  arma_extra_debug_sigprint();\n\n  // This may not actually add an element.\n  const uword old_n_nonzero = m.n_nonzero;\n  eT& retval = access::rw(m).add_element(in_row + aux_row1, in_col + aux_col1, in_val);\n  // Update n_nonzero (if necessary).\n  access::rw(n_nonzero) += (m.n_nonzero - old_n_nonzero);\n\n  return retval;\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nSpSubview<eT>::delete_element(const uword in_row, const uword in_col)\n  {\n  arma_extra_debug_sigprint();\n\n  // This may not actually delete an element.\n  const uword old_n_nonzero = m.n_nonzero;\n  access::rw(m).delete_element(in_row + aux_row1, in_col + aux_col1);\n  access::rw(n_nonzero) -= (old_n_nonzero - m.n_nonzero);\n  }\n\n\n\n/**\n * Sparse subview col\n *\ntemplate<typename eT>\ninline\nSpSubview_col<eT>::SpSubview_col(const Mat<eT>& in_m, const uword in_col)\n  {\n  arma_extra_debug_sigprint();\n  }\n\ntemplate<typename eT>\ninline\nSpSubview_col<eT>::SpSubview_col(Mat<eT>& in_m, const uword in_col)\n  {\n  arma_extra_debug_sigprint();\n  }\n\ntemplate<typename eT>\ninline\nSpSubview_col<eT>::SpSubview_col(const Mat<eT>& in_m, const uword in_col, const uword in_row1, const uword in_n_rows)\n  {\n  arma_extra_debug_sigprint();\n  }\n\ntemplate<typename eT>\ninline\nSpSubview_col<eT>::SpSubview_col(Mat<eT>& in_m, const uword in_col, const uword in_row1, const uword in_n_rows)\n  {\n  arma_extra_debug_sigprint();\n  }\n*/\n\n/**\n * Sparse subview row\n *\ntemplate<typename eT>\ninline\nSpSubview_row<eT>::SpSubview_row(const Mat<eT>& in_m, const uword in_row)\n  {\n  arma_extra_debug_sigprint();\n  }\n\ntemplate<typename eT>\ninline\nSpSubview_row<eT>::SpSubview_row(Mat<eT>& in_m, const uword in_row)\n  {\n  arma_extra_debug_sigprint();\n  }\n\ntemplate<typename eT>\ninline\nSpSubview_row<eT>::SpSubview_row(const Mat<eT>& in_m, const uword in_row, const uword in_col1, const uword in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  }\n\ntemplate<typename eT>\ninline\nSpSubview_row<eT>::SpSubview_row(Mat<eT>& in_m, const uword in_row, const uword in_col1, const uword in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  }\n*/\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpValProxy_bones.hpp",
    "content": "// Copyright (C) 2011-2012 Ryan Curtin\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n//! \\addtogroup SpValProxy\n//! @{\n\n/**\n * Sparse value proxy class, meant to prevent 0s from being added to sparse\n * matrices.  T1 should be either SpMat or SpSubview, and if it's not, bad news\n * is probably coming.  This class only uses T1::add_element() and\n * T1::delete_element().\n */\ntemplate<typename T1>\nclass SpValProxy\n  {\n  public:\n\n  typedef typename T1::elem_type eT; // Convenience typedef\n\n  friend class SpMat<eT>;\n  friend class SpSubview<eT>;\n  \n  /**\n   * Create the sparse value proxy.\n   * Otherwise, pass a pointer to a reference of the value.\n   */\n  arma_inline SpValProxy(uword row, uword col, T1& in_parent, eT* in_val_ptr = NULL);\n  \n  //! For swapping operations.\n  arma_inline SpValProxy& operator=(const SpValProxy& rhs);\n  template<typename T2>\n  arma_inline SpValProxy& operator=(const SpValProxy<T2>& rhs);\n  \n  //! Overload all of the potential operators.\n  \n  //! First, the ones that could modify a value.\n  arma_inline SpValProxy& operator=(const eT rhs);\n  arma_inline SpValProxy& operator+=(const eT rhs);\n  arma_inline SpValProxy& operator-=(const eT rhs);\n  arma_inline SpValProxy& operator*=(const eT rhs);\n  arma_inline SpValProxy& operator/=(const eT rhs);\n  \n  arma_inline SpValProxy& operator++();\n  arma_inline SpValProxy& operator--();\n  arma_inline eT operator++(const int);\n  arma_inline eT operator--(const int);\n  \n  //! This will work for any other operations that do not modify a value.\n  arma_inline operator eT() const;\n  \n  \n  private:\n  \n  // Deletes the element if it is zero.  Does not check if val_ptr == NULL!\n  arma_inline arma_hot void check_zero();\n  \n  uword row;\n  uword col;\n  \n  eT* val_ptr;\n  \n  T1& parent; // We will call this object if we need to insert or delete an element.\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/SpValProxy_meat.hpp",
    "content": "// Copyright (C) 2011-2012 Ryan Curtin\n// Copyright (C) 2012 Conrad Sanderson\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n//! \\addtogroup SpValProxy\n//! @{\n\n//! SpValProxy implementation.\ntemplate<typename T1>\narma_inline\nSpValProxy<T1>::SpValProxy(uword in_row, uword in_col, T1& in_parent, eT* in_val_ptr)\n  : row(in_row)\n  , col(in_col)\n  , val_ptr(in_val_ptr)\n  , parent(in_parent)\n  {\n  // Nothing to do.\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nSpValProxy<T1>&\nSpValProxy<T1>::operator=(const SpValProxy<T1>& rhs)\n  {\n  return (*this).operator=(eT(rhs));\n  }\n\n\n\ntemplate<typename T1>\ntemplate<typename T2>\narma_inline\nSpValProxy<T1>&\nSpValProxy<T1>::operator=(const SpValProxy<T2>& rhs)\n  {\n  return (*this).operator=(eT(rhs));\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nSpValProxy<T1>&\nSpValProxy<T1>::operator=(const eT rhs)\n  {\n  if (rhs != eT(0)) // A nonzero element is being assigned.\n    {\n\n    if (val_ptr)\n      {\n      // The value exists and merely needs to be updated.\n      *val_ptr = rhs;\n      }\n\n    else\n      {\n      // The value is nonzero and must be added.\n      val_ptr = &parent.add_element(row, col, rhs);\n      }\n\n    }\n  else // A zero is being assigned.~\n    {\n\n    if (val_ptr)\n      {\n      // The element exists, but we need to remove it, because it is being set to 0.\n      parent.delete_element(row, col);\n      val_ptr = NULL;\n      }\n\n    // If the element does not exist, we do not need to do anything at all.\n\n    }\n\n  return *this;\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nSpValProxy<T1>&\nSpValProxy<T1>::operator+=(const eT rhs)\n  {\n  if (val_ptr)\n    {\n    // The value already exists and merely needs to be updated.\n    *val_ptr += rhs;\n    check_zero();\n    }\n  else\n    {\n    if (rhs != eT(0))\n      {\n      // The value does not exist and must be added.\n      val_ptr = &parent.add_element(row, col, rhs);\n      }\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nSpValProxy<T1>&\nSpValProxy<T1>::operator-=(const eT rhs)\n  {\n  if (val_ptr)\n    {\n    // The value already exists and merely needs to be updated.\n    *val_ptr -= rhs;\n    check_zero();\n    }\n  else\n    {\n    if (rhs != eT(0))\n      {\n      // The value does not exist and must be added.\n      val_ptr = &parent.add_element(row, col, -rhs);\n      }\n    }\n\n  return *this;\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nSpValProxy<T1>&\nSpValProxy<T1>::operator*=(const eT rhs)\n  {\n  if (rhs != eT(0))\n    {\n\n    if (val_ptr)\n      {\n      // The value already exists and merely needs to be updated.\n      *val_ptr *= rhs;\n      check_zero();\n      }\n\n    }\n  else\n    {\n\n    if (val_ptr)\n      {\n      // Since we are multiplying by zero, the value can be deleted.\n      parent.delete_element(row, col);\n      val_ptr = NULL;\n      }\n\n    }\n\n  return *this;\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nSpValProxy<T1>&\nSpValProxy<T1>::operator/=(const eT rhs)\n  {\n  if (rhs != eT(0)) // I hope this is true!\n    {\n\n    if (val_ptr)\n      {\n      *val_ptr /= rhs;\n      check_zero();\n      }\n\n    }\n  else\n    {\n\n    if (val_ptr)\n      {\n      *val_ptr /= rhs; // That is where it gets ugly.\n      // Now check if it's 0.\n      if (*val_ptr == eT(0))\n        {\n        parent.delete_element(row, col);\n        val_ptr = NULL;\n        }\n      }\n\n    else\n      {\n      eT val = eT(0) / rhs; // This may vary depending on type and implementation.\n\n      if (val != eT(0))\n        {\n        // Ok, now we have to add it.\n        val_ptr = &parent.add_element(row, col, val);\n        }\n\n      }\n    }\n\n  return *this;\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nSpValProxy<T1>&\nSpValProxy<T1>::operator++()\n  {\n  if (val_ptr)\n    {\n    (*val_ptr) += eT(1);\n    check_zero();\n    }\n\n  else\n    {\n    val_ptr = &parent.add_element(row, col, eT(1));\n    }\n\n  return *this;\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nSpValProxy<T1>&\nSpValProxy<T1>::operator--()\n  {\n  if (val_ptr)\n    {\n    (*val_ptr) -= eT(1);\n    check_zero();\n    }\n\n  else\n    {\n    val_ptr = &parent.add_element(row, col, eT(-1));\n    }\n\n  return *this;\n  }\n\n\n\ntemplate<typename T1>\narma_inline\ntypename T1::elem_type\nSpValProxy<T1>::operator++(const int)\n  {\n  if (val_ptr)\n    {\n    (*val_ptr) += eT(1);\n    check_zero();\n    }\n\n  else\n    {\n    val_ptr = &parent.add_element(row, col, eT(1));\n    }\n\n  if (val_ptr) // It may have changed to now be 0.\n    {\n    return *(val_ptr) - eT(1);\n    }\n  else\n    {\n    return eT(0);\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_inline\ntypename T1::elem_type\nSpValProxy<T1>::operator--(const int)\n  {\n  if (val_ptr)\n    {\n    (*val_ptr) -= eT(1);\n    check_zero();\n    }\n\n  else\n    {\n    val_ptr = &parent.add_element(row, col, eT(-1));\n    }\n\n  if (val_ptr) // It may have changed to now be 0.\n    {\n    return *(val_ptr) + eT(1);\n    }\n  else\n    {\n    return eT(0);\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nSpValProxy<T1>::operator eT() const\n  {\n  if (val_ptr)\n    {\n    return *val_ptr;\n    }\n  else\n    {\n    return eT(0);\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_inline\narma_hot\nvoid\nSpValProxy<T1>::check_zero()\n  {\n  if (*val_ptr == eT(0))\n    {\n    parent.delete_element(row, col);\n    val_ptr = NULL;\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/access.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup access\n//! @{\n\n\nclass access\n  {\n  public:\n  \n  //! internal function to allow modification of data declared as read-only (use with caution)\n  template<typename T1> arma_inline static T1&  rw (const T1& x)        { return const_cast<T1& >(x); }\n  template<typename T1> arma_inline static T1*& rwp(const T1* const& x) { return const_cast<T1*&>(x); }\n  \n  //! internal function to obtain the real part of either a plain number or a complex number\n  template<typename eT> arma_inline static const eT& tmp_real(const eT&              X) { return X;        }\n  template<typename  T> arma_inline static const   T tmp_real(const std::complex<T>& X) { return X.real(); }\n  \n  //! internal function to work around braindead compilers\n  template<typename eT> arma_inline static const typename enable_if2<is_not_complex<eT>::value, const eT&>::result alt_conj(const eT& X) { return X;            }\n  template<typename eT> arma_inline static const typename enable_if2<    is_complex<eT>::value, const eT >::result alt_conj(const eT& X) { return std::conj(X); }\n  };\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/arma_boost.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup arma_boost\n//! @{\n\n\nnamespace arma_boost\n  {\n  \n  #if defined(ARMA_HAVE_SNPRINTF)\n    \n    #define arma_snprintf snprintf\n    \n  #else\n    \n    // better-than-nothing emulation of C99 snprintf(),\n    // with correct return value and null-terminated output string.\n    // note that _snprintf() provided by MS is not a good substitute for snprintf()\n    \n    inline\n    int\n    arma_snprintf(char* out, size_t size, const char* fmt, ...)\n      {\n      size_t i;\n      \n      for(i=0; i<size; ++i)\n        {\n        out[i] = fmt[i];\n        if(fmt[i] == char(0))\n          break;\n        }\n      \n      if(size > 0)\n        out[size-1] = char(0);\n      \n      return int(i);\n      }\n    \n  #endif\n  \n  class format\n    {\n    public:\n    \n    format(const char* in_fmt)\n      : A(in_fmt)\n      {\n      }\n    \n    format(const std::string& in_fmt)\n      : A(in_fmt)\n      {\n      }\n    \n    \n    const std::string A;\n    \n    private:\n    format();\n    };\n  \n  \n  \n  template<typename T1, typename T2>\n  class basic_format\n    {\n    public:\n    \n    basic_format(const T1& in_A, const T2& in_B)\n      : A(in_A)\n      , B(in_B)\n      {\n      }\n    \n    const T1& A;\n    const T2& B;\n    \n    private:\n    basic_format();\n    };\n  \n  \n  \n  template<typename T2>\n  inline\n  basic_format< format, T2 >\n  operator% (const format& X, const T2& arg)\n    {\n    return basic_format< format, T2 >(X, arg);\n    }\n  \n  \n  \n  template<typename T1, typename T2, typename T3>\n  inline\n  basic_format< basic_format<T1,T2>, T3 >\n  operator% (const basic_format<T1,T2>& X, const T3& arg)\n    {\n    return basic_format< basic_format<T1,T2>, T3 >(X, arg);\n    }\n  \n  \n  \n  template<typename T2>\n  inline\n  std::string\n  str(const basic_format< format, T2>& X)\n    {\n    char  local_buffer[1024];\n    char* buffer = local_buffer;\n    \n    int buffer_size   = 1024;\n    int required_size = buffer_size;\n    \n    bool using_local_buffer = true;\n    \n    std::string out;\n    \n    do\n      {\n      if(using_local_buffer == false)\n        {\n        buffer = new char[buffer_size];\n        }\n      \n      required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.c_str(), X.B);\n      \n      if(required_size < buffer_size)\n        {\n        if(required_size > 0)\n          {\n          out = buffer;\n          }\n        }\n      else\n        {\n        buffer_size *= 2;\n        }\n      \n      if(using_local_buffer)\n        {\n        using_local_buffer = false;\n        }\n      else\n        {\n        delete[] buffer;\n        }\n      \n      } while( (required_size >= buffer_size) );\n    \n    return out;\n    }\n  \n  \n  \n  template<typename T2, typename T3>\n  inline\n  std::string\n  str(const basic_format< basic_format< format, T2>, T3>& X)\n    {\n    char  local_buffer[1024];\n    char* buffer = local_buffer;\n    \n    int buffer_size   = 1024;\n    int required_size = buffer_size;\n    \n    bool using_local_buffer = true;\n    \n    std::string out;\n    \n    do\n      {\n      if(using_local_buffer == false)\n        {\n        buffer = new char[buffer_size];\n        }\n      \n      required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.c_str(), X.A.B, X.B);\n      \n      if(required_size < buffer_size)\n        {\n        if(required_size > 0)\n          {\n          out = buffer;\n          }\n        }\n      else\n        {\n        buffer_size *= 2;\n        }\n      \n      if(using_local_buffer)\n        {\n        using_local_buffer = false;\n        }\n      else\n        {\n        delete[] buffer;\n        }\n      \n      } while( (required_size >= buffer_size) );\n    \n    return out;\n    }\n  \n  \n  \n  template<typename T2, typename T3, typename T4>\n  inline\n  std::string\n  str(const basic_format< basic_format< basic_format< format, T2>, T3>, T4>& X)\n    {\n    char  local_buffer[1024];\n    char* buffer = local_buffer;\n    \n    int buffer_size   = 1024;\n    int required_size = buffer_size;\n    \n    bool using_local_buffer = true;\n    \n    std::string out;\n    \n    do\n      {\n      if(using_local_buffer == false)\n        {\n        buffer = new char[buffer_size];\n        }\n      \n      required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.A.c_str(), X.A.A.B, X.A.B, X.B);\n      \n      if(required_size < buffer_size)\n        {\n        if(required_size > 0)\n          {\n          out = buffer;\n          }\n        }\n      else\n        {\n        buffer_size *= 2;\n        }\n      \n      if(using_local_buffer)\n        {\n        using_local_buffer = false;\n        }\n      else\n        {\n        delete[] buffer;\n        }\n      \n      } while( (required_size >= buffer_size) );\n    \n    return out;\n    }\n  \n  \n  \n  template<typename T2, typename T3, typename T4, typename T5>\n  inline\n  std::string\n  str(const basic_format< basic_format< basic_format< basic_format< format, T2>, T3>, T4>, T5>& X)\n    {\n    char  local_buffer[1024];\n    char* buffer = local_buffer;\n    \n    int buffer_size   = 1024;\n    int required_size = buffer_size;\n    \n    bool using_local_buffer = true;\n    \n    std::string out;\n    \n    do\n      {\n      if(using_local_buffer == false)\n        {\n        buffer = new char[buffer_size];\n        }\n      \n      required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.A.A.c_str(), X.A.A.A.B, X.A.A.B, X.A.B, X.B);\n      \n      if(required_size < buffer_size)\n        {\n        if(required_size > 0)\n          {\n          out = buffer;\n          }\n        }\n      else\n        {\n        buffer_size *= 2;\n        }\n      \n      if(using_local_buffer)\n        {\n        using_local_buffer = false;\n        }\n      else\n        {\n        delete[] buffer;\n        }\n      \n      } while( (required_size >= buffer_size) );\n    \n    return out;\n    }\n  \n  \n  \n  template<typename T2, typename T3, typename T4, typename T5, typename T6>\n  inline\n  std::string\n  str(const basic_format< basic_format< basic_format< basic_format< basic_format< format, T2>, T3>, T4>, T5>, T6>& X)\n    {\n    char  local_buffer[1024];\n    char* buffer = local_buffer;\n    \n    int buffer_size   = 1024;\n    int required_size = buffer_size;\n    \n    bool using_local_buffer = true;\n    \n    std::string out;\n    \n    do\n      {\n      if(using_local_buffer == false)\n        {\n        buffer = new char[buffer_size];\n        }\n      \n      required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.A.A.A.c_str(), X.A.A.A.A.B, X.A.A.A.B, X.A.A.B, X.A.B, X.B);\n      \n      if(required_size < buffer_size)\n        {\n        if(required_size > 0)\n          {\n          out = buffer;\n          }\n        }\n      else\n        {\n        buffer_size *= 2;\n        }\n      \n      if(using_local_buffer)\n        {\n        using_local_buffer = false;\n        }\n      else\n        {\n        delete[] buffer;\n        }\n      \n      } while( (required_size >= buffer_size) );\n    \n    return out;\n    }\n  \n  \n  \n  template<typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>\n  inline\n  std::string\n  str(const basic_format< basic_format< basic_format< basic_format< basic_format< basic_format< format, T2>, T3>, T4>, T5>, T6>, T7>& X)\n    {\n    char  local_buffer[1024];\n    char* buffer = local_buffer;\n    \n    int buffer_size   = 1024;\n    int required_size = buffer_size;\n    \n    bool using_local_buffer = true;\n    \n    std::string out;\n    \n    do\n      {\n      if(using_local_buffer == false)\n        {\n        buffer = new char[buffer_size];\n        }\n      \n      required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.A.A.A.A.c_str(), X.A.A.A.A.A.B, X.A.A.A.A.B, X.A.A.A.B, X.A.A.B, X.A.B, X.B);\n      \n      if(required_size < buffer_size)\n        {\n        if(required_size > 0)\n          {\n          out = buffer;\n          }\n        }\n      else\n        {\n        buffer_size *= 2;\n        }\n      \n      if(using_local_buffer)\n        {\n        using_local_buffer = false;\n        }\n      else\n        {\n        delete[] buffer;\n        }\n      \n      } while( (required_size >= buffer_size) );\n    \n    return out;\n    }\n  \n  \n  \n  template<typename T1>\n  struct format_metaprog\n    {\n    static const uword depth = 0;\n    \n    inline\n    static  \n    const std::string&\n    get_fmt(const T1& X)\n      {\n      return X.A;\n      }\n    };\n  \n  \n  \n  //template<>\n  template<typename T1, typename T2>\n  struct format_metaprog< basic_format<T1,T2> >\n    {\n    static const uword depth = 1 + format_metaprog<T1>::depth;\n    \n    inline\n    static\n    const std::string&\n    get_fmt(const T1& X)\n      {\n      return format_metaprog<T1>::get_fmt(X.A);\n      }\n    \n    };\n  \n  \n  \n  template<typename T1, typename T2>\n  inline\n  std::string\n  str(const basic_format<T1,T2>& X)\n    {\n    return format_metaprog< basic_format<T1,T2> >::get_fmt(X.A);\n    }\n  \n  \n  \n  template<typename T1, typename T2>\n  inline\n  std::ostream&\n  operator<< (std::ostream& o, const basic_format<T1,T2>& X)\n    {\n    o << str(X);\n    return o;\n    }\n   \n  \n  template<typename T> struct string_only              { };\n  template<>           struct string_only<std::string> { typedef std::string result; };\n  \n  template<typename T> struct char_only                { };\n  template<>           struct char_only<char         > { typedef char        result; };\n  \n  template<typename T>\n  struct basic_format_only { };\n  \n  template<typename T1, typename T2>\n  struct basic_format_only< basic_format<T1, T2> > { typedef basic_format<T1,T2> result; };\n  \n  \n  \n  template<typename T1>\n  inline\n  static\n  const T1&\n  str_wrapper(const T1& x, const typename string_only<T1>::result* junk = 0)\n    {\n    arma_ignore(junk);\n    \n    return x;\n    }\n  \n  \n  \n  template<typename T1>\n  inline\n  static\n  const T1*\n  str_wrapper(const T1* x, const typename char_only<T1>::result* junk = 0)\n    {\n    arma_ignore(junk);\n    \n    return x;\n    }\n  \n  \n  \n  template<typename T1>\n  inline\n  static\n  std::string\n  str_wrapper(const T1& x, const typename basic_format_only<T1>::result* junk = 0)\n    {\n    arma_ignore(junk);\n    \n    return str(x);\n    }\n  \n  }\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/arma_cmath.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup arma_cmath\n//! @{\n\n\n\n//\n// wrappers for isfinite\n\n\ntemplate<typename eT>\narma_inline\nbool\narma_isfinite(eT val)\n  {\n  arma_ignore(val);\n    \n  return true;\n  }\n\n\n\ntemplate<>\narma_inline\nbool\narma_isfinite(float x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::isfinite(x);\n    }\n  #elif defined(ARMA_HAVE_TR1)\n    {\n    return std::tr1::isfinite(x);\n    }\n  #elif defined(ARMA_HAVE_ISFINITE)\n    {\n    return (std::isfinite(x) != 0);\n    }\n  #else\n    {\n    const float y = (std::numeric_limits<float>::max)();\n    \n    const volatile float xx = x;\n    \n    return (xx == xx) && (x >= -y) && (x <= y);\n    }\n  #endif\n  }\n\n\n\ntemplate<>\narma_inline\nbool\narma_isfinite(double x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::isfinite(x);\n    }\n  #elif defined(ARMA_HAVE_TR1)\n    {\n    return std::tr1::isfinite(x);\n    }\n  #elif defined(ARMA_HAVE_ISFINITE)\n    {\n    return (std::isfinite(x) != 0);\n    }\n  #else\n    {\n    const double y = (std::numeric_limits<double>::max)();\n    \n    const volatile double xx = x;\n    \n    return (xx == xx) && (x >= -y) && (x <= y);\n    }\n  #endif\n  }\n\n\n\ntemplate<typename T>\narma_inline\nbool\narma_isfinite(const std::complex<T>& x)\n  {\n  if( (arma_isfinite(x.real()) == false) || (arma_isfinite(x.imag()) == false) )\n    {\n    return false;\n    }\n  else\n    {\n    return true;\n    }\n  }\n\n\n\n//\n// wrappers for isinf\n\n\ntemplate<typename eT>\narma_inline\nbool\narma_isinf(eT val)\n  {\n  arma_ignore(val);\n    \n  return false;\n  }\n\n\n\ntemplate<>\narma_inline\nbool\narma_isinf(float x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::isinf(x);\n    }\n  #elif defined(ARMA_HAVE_ISINF)\n    {\n    return (std::isinf(x) != 0);\n    }\n  #else\n    {\n    const float y = (std::numeric_limits<float>::max)();\n    \n    const volatile float xx = x;\n    \n    return (xx == xx) && ((x < -y) || (x > y));\n    }\n  #endif\n  }\n\n\n\ntemplate<>\narma_inline\nbool\narma_isinf(double x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::isinf(x);\n    }\n  #elif defined(ARMA_HAVE_ISINF)\n    {\n    return (std::isinf(x) != 0);\n    }\n  #else\n    {\n    const double y = (std::numeric_limits<double>::max)();\n    \n    const volatile double xx = x;\n    \n    return (xx == xx) && ((x < -y) || (x > y));\n    }\n  #endif\n  }\n\n\n\ntemplate<typename T>\narma_inline\nbool\narma_isinf(const std::complex<T>& x)\n  {\n  return ( arma_isinf(x.real()) || arma_isinf(x.imag()) );\n  }\n\n\n\n//\n// wrappers for isnan\n\n\ntemplate<typename eT>\narma_inline\nbool\narma_isnan(eT val)\n  {\n  arma_ignore(val);\n    \n  return false;\n  }\n\n\n\ntemplate<>\narma_inline\nbool\narma_isnan(float x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::isnan(x);\n    }\n  #elif defined(ARMA_HAVE_ISNAN)\n    {\n    return (std::isnan(x) != 0);\n    }\n  #else\n    {\n    const volatile float xx = x;\n    \n    return (xx != xx);\n    }\n  #endif\n  }\n\n\n\ntemplate<>\narma_inline\nbool\narma_isnan(double x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::isnan(x);\n    }\n  #elif defined(ARMA_HAVE_ISNAN)\n    {\n    return (std::isnan(x) != 0);\n    }\n  #else\n    {\n    const volatile double xx = x;\n    \n    return (xx != xx);\n    }\n  #endif\n  }\n\n\n\ntemplate<typename T>\narma_inline\nbool\narma_isnan(const std::complex<T>& x)\n  {\n  return ( arma_isnan(x.real()) || arma_isnan(x.imag()) );\n  }\n\n\n\n// rudimentary wrappers for log1p()\n\narma_inline\nfloat\narma_log1p(const float x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::log1p(x);\n    }\n  #else\n    {\n    if((x >= float(0)) && (x < std::numeric_limits<float>::epsilon()))\n      {\n      return x;\n      }\n    else\n    if((x < float(0)) && (-x < std::numeric_limits<float>::epsilon()))\n      {\n      return x;\n      }\n    else\n      {\n      return std::log(float(1) + x);\n      }\n    }\n  #endif\n  }\n\n\n\narma_inline\ndouble\narma_log1p(const double x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::log1p(x);\n    }\n  #elif defined(ARMA_HAVE_LOG1P)\n    {\n    return log1p(x);\n    }\n  #else\n    {\n    if((x >= double(0)) && (x < std::numeric_limits<double>::epsilon()))\n      {\n      return x;\n      }\n    else\n    if((x < double(0)) && (-x < std::numeric_limits<double>::epsilon()))\n      {\n      return x;\n      }\n    else\n      {\n      return std::log(double(1) + x);\n      }\n    }\n  #endif\n  }\n\n\n\n\n\n//\n// wrappers for trigonometric functions\n// \n// wherever possible, try to use C++11 or TR1 versions of the following functions:\n// \n// complex acos\n// complex asin\n// complex atan\n//\n// real    acosh\n// real    asinh\n// real    atanh\n//\n// complex acosh\n// complex asinh\n// complex atanh\n// \n// \n// if C++11 or TR1 are not available, we have rudimentary versions of:\n// \n// real    acosh\n// real    asinh\n// real    atanh\n\n\n\ntemplate<typename T>\narma_inline\nstd::complex<T>\narma_acos(const std::complex<T>& x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::acos(x);\n    }\n  #elif defined(ARMA_HAVE_TR1)\n    {\n    return std::tr1::acos(x);\n    }\n  #else\n    {\n    arma_ignore(x);\n    arma_stop(\"acos(): need C++11 compiler\");\n    \n    return std::complex<T>(0);\n    }\n  #endif\n  }\n\n\n\ntemplate<typename T>\narma_inline\nstd::complex<T>\narma_asin(const std::complex<T>& x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::asin(x);\n    }\n  #elif defined(ARMA_HAVE_TR1)\n    {\n    return std::tr1::asin(x);\n    }\n  #else\n    {\n    arma_ignore(x);\n    arma_stop(\"asin(): need C++11 compiler\");\n    \n    return std::complex<T>(0);\n    }\n  #endif\n  }\n\n\n\ntemplate<typename T>\narma_inline\nstd::complex<T>\narma_atan(const std::complex<T>& x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::atan(x);\n    }\n  #elif defined(ARMA_HAVE_TR1)\n    {\n    return std::tr1::atan(x);\n    }\n  #else\n    {\n    arma_ignore(x);\n    arma_stop(\"atan(): need C++11 compiler\");\n    \n    return std::complex<T>(0);\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT\narma_acosh(const eT x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::acosh(x);\n    }\n  #elif defined(ARMA_HAVE_TR1)\n    {\n    return std::tr1::acosh(x);\n    }\n  #else\n    {\n    if(x >= eT(1))\n      {\n      // http://functions.wolfram.com/ElementaryFunctions/ArcCosh/02/\n      return std::log( x + std::sqrt(x*x - eT(1)) );\n      }\n    else\n      {\n      if(std::numeric_limits<eT>::has_quiet_NaN)\n        {\n        return -(std::numeric_limits<eT>::quiet_NaN());\n        }\n      else\n        {\n        return eT(0);\n        }\n      }\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT\narma_asinh(const eT x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::asinh(x);\n    }\n  #elif defined(ARMA_HAVE_TR1)\n    {\n    return std::tr1::asinh(x);\n    }\n  #else\n    {\n    // http://functions.wolfram.com/ElementaryFunctions/ArcSinh/02/\n    return std::log( x + std::sqrt(x*x + eT(1)) );\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT\narma_atanh(const eT x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::atanh(x);\n    }\n  #elif defined(ARMA_HAVE_TR1)\n    {\n    return std::tr1::atanh(x);\n    }\n  #else\n    {\n    if( (x >= eT(-1)) && (x <= eT(+1)) )\n      {\n      // http://functions.wolfram.com/ElementaryFunctions/ArcTanh/02/\n      return std::log( ( eT(1)+x ) / ( eT(1)-x ) ) / eT(2);\n      }\n    else\n      {\n      if(std::numeric_limits<eT>::has_quiet_NaN)\n        {\n        return -(std::numeric_limits<eT>::quiet_NaN());\n        }\n      else\n        {\n        return eT(0);\n        }\n      }\n    }\n  #endif\n  }\n\n\n\ntemplate<typename T>\narma_inline\nstd::complex<T>\narma_acosh(const std::complex<T>& x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::acosh(x);\n    }\n  #elif defined(ARMA_HAVE_TR1)\n    {\n    return std::tr1::acosh(x);\n    }\n  #else\n    {\n    arma_ignore(x);\n    arma_stop(\"acosh(): need C++11 compiler\");\n    \n    return std::complex<T>(0);\n    }\n  #endif\n  }\n\n\n\ntemplate<typename T>\narma_inline\nstd::complex<T>\narma_asinh(const std::complex<T>& x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::asinh(x);\n    }\n  #elif defined(ARMA_HAVE_TR1)\n    {\n    return std::tr1::asinh(x);\n    }\n  #else\n    {\n    arma_ignore(x);\n    arma_stop(\"asinh(): need C++11 compiler\");\n    \n    return std::complex<T>(0);\n    }\n  #endif\n  }\n\n\n\ntemplate<typename T>\narma_inline\nstd::complex<T>\narma_atanh(const std::complex<T>& x)\n  {\n  #if defined(ARMA_USE_CXX11)\n    {\n    return std::atanh(x);\n    }\n  #elif defined(ARMA_HAVE_TR1)\n    {\n    return std::tr1::atanh(x);\n    }\n  #else\n    {\n    arma_ignore(x);\n    arma_stop(\"atanh(): need C++11 compiler\");\n    \n    return std::complex<T>(0);\n    }\n  #endif\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/arma_config.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup arma_config\n//! @{\n\n\n\nstruct arma_config\n  {\n  #if defined(ARMA_MAT_PREALLOC)\n    static const uword mat_prealloc = (sword(ARMA_MAT_PREALLOC) > 0) ? uword(ARMA_MAT_PREALLOC) : 1;\n  #else\n    static const uword mat_prealloc = 16;\n  #endif\n  \n  \n  #if defined(ARMA_SPMAT_CHUNKSIZE)\n    static const uword spmat_chunksize = (sword(ARMA_SPMAT_CHUNKSIZE) > 0) ? uword(ARMA_SPMAT_CHUNKSIZE) : 256;\n  #else\n    static const uword spmat_chunksize = 256;\n  #endif\n  \n  \n  #if defined(ARMA_USE_ATLAS)\n    static const bool atlas = true;\n  #else\n    static const bool atlas = false;\n  #endif\n  \n  \n  #if defined(ARMA_USE_LAPACK)\n    static const bool lapack = true;\n  #else\n    static const bool lapack = false;\n  #endif\n  \n  \n  #if defined(ARMA_USE_BLAS)\n    static const bool blas = true;\n  #else\n    static const bool blas = false;\n  #endif\n  \n  \n  #if defined(ARMA_USE_ARPACK)\n    static const bool arpack = true;\n  #else\n    static const bool arpack = false;\n  #endif\n  \n  \n  #if defined(ARMA_USE_SUPERLU)\n    static const bool superlu = true;\n  #else\n    static const bool superlu = false;\n  #endif\n  \n  \n  #if defined(ARMA_USE_HDF5)\n    static const bool hdf5 = true;\n  #else\n    static const bool hdf5 = false;\n  #endif\n  \n  \n  #if defined(ARMA_NO_DEBUG)\n    static const bool debug = false;\n  #else\n    static const bool debug = true;\n  #endif\n  \n  \n  #if defined(ARMA_EXTRA_DEBUG)\n    static const bool extra_debug = true;\n  #else\n    static const bool extra_debug = false;\n  #endif\n  \n  \n  #if defined(ARMA_GOOD_COMPILER)\n    static const bool good_comp = true;\n  #else\n    static const bool good_comp = false;\n  #endif\n  \n  \n  #if (  \\\n         defined(ARMA_EXTRA_MAT_PROTO)   || defined(ARMA_EXTRA_MAT_MEAT)   \\\n      || defined(ARMA_EXTRA_COL_PROTO)   || defined(ARMA_EXTRA_COL_MEAT)   \\\n      || defined(ARMA_EXTRA_ROW_PROTO)   || defined(ARMA_EXTRA_ROW_MEAT)   \\\n      || defined(ARMA_EXTRA_CUBE_PROTO)  || defined(ARMA_EXTRA_CUBE_MEAT)  \\\n      || defined(ARMA_EXTRA_FIELD_PROTO) || defined(ARMA_EXTRA_FIELD_MEAT) \\\n      || defined(ARMA_EXTRA_SPMAT_PROTO) || defined(ARMA_EXTRA_SPMAT_MEAT) \\\n      || defined(ARMA_EXTRA_SPCOL_PROTO) || defined(ARMA_EXTRA_SPCOL_MEAT) \\\n      || defined(ARMA_EXTRA_SPROW_PROTO) || defined(ARMA_EXTRA_SPROW_MEAT) \\\n      )\n    static const bool extra_code = true;\n  #else\n    static const bool extra_code = false;\n  #endif\n  \n  \n  #if defined(ARMA_USE_CXX11)\n    static const bool use_cxx11 = true;\n  #else\n    static const bool use_cxx11 = false;\n  #endif\n  \n  \n  #if defined(ARMA_USE_WRAPPER)\n    static const bool use_wrapper = true;\n  #else\n    static const bool use_wrapper = false;\n  #endif\n  \n  \n  #if defined(_OPENMP)\n    static const bool openmp = true;\n  #else\n    static const bool openmp = false;\n  #endif\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/arma_ostream_bones.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup arma_ostream\n//! @{\n\n\n\nclass arma_ostream_state\n  {\n  private:\n\n  const ios::fmtflags   orig_flags;\n  const std::streamsize orig_precision;\n  const std::streamsize orig_width;\n  const char            orig_fill;\n\n\n  public:\n\n  inline arma_ostream_state(const std::ostream& o);\n  \n  inline void restore(std::ostream& o) const;\n  };\n\n\n\nclass arma_ostream\n  {\n  public:\n  \n  template<typename eT> inline static std::streamsize modify_stream(std::ostream& o, const eT*              data, const uword n_elem);\n  template<typename  T> inline static std::streamsize modify_stream(std::ostream& o, const std::complex<T>* data, const uword n_elem);\n  template<typename eT> inline static std::streamsize modify_stream(std::ostream& o, typename SpMat<eT>::const_iterator begin, const uword n_elem, const typename arma_not_cx<eT>::result* junk = 0);\n  template<typename  T> inline static std::streamsize modify_stream(std::ostream& o, typename SpMat<T>::const_iterator begin, const uword n_elem, const typename arma_cx_only<T>::result* junk = 0);\n  \n  template<typename eT> inline static void print_elem_zero(std::ostream& o, const bool modify);\n  \n  template<typename eT> arma_inline static void print_elem(std::ostream& o, const eT&              x, const bool modify);\n  template<typename  T>      inline static void print_elem(std::ostream& o, const std::complex<T>& x, const bool modify);\n\n  template<typename eT> inline static void print(std::ostream& o, const  Mat<eT>& m, const bool modify);\n  template<typename eT> inline static void print(std::ostream& o, const Cube<eT>& m, const bool modify);\n  \n  template<typename oT> inline static void print(std::ostream& o, const field<oT>&         m);\n  template<typename oT> inline static void print(std::ostream& o, const subview_field<oT>& m);\n\n\n  template<typename eT> inline static void print_dense(std::ostream& o, const SpMat<eT>& m, const bool modify);\n  template<typename eT> inline static void       print(std::ostream& o, const SpMat<eT>& m, const bool modify);\n  \n  inline static void print(std::ostream& o, const SizeMat&  S);\n  inline static void print(std::ostream& o, const SizeCube& S);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/arma_ostream_meat.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// Copyright (C) 2012 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup arma_ostream\n//! @{\n\n\n\ninline\narma_ostream_state::arma_ostream_state(const std::ostream& o)\n  : orig_flags    (o.flags())\n  , orig_precision(o.precision())\n  , orig_width    (o.width())\n  , orig_fill     (o.fill())\n  {\n  }\n\n\n\ninline\nvoid\narma_ostream_state::restore(std::ostream& o) const\n  {\n  o.flags    (orig_flags);\n  o.precision(orig_precision);\n  o.width    (orig_width);\n  o.fill     (orig_fill);\n  }\n\n\n\n//\n//\n\n\n\ntemplate<typename eT>\ninline\nstd::streamsize\narma_ostream::modify_stream(std::ostream& o, const eT* data, const uword n_elem)\n  {\n  o.unsetf(ios::showbase);\n  o.unsetf(ios::uppercase);\n  o.unsetf(ios::showpos);\n  \n  o.fill(' ');\n  \n  std::streamsize cell_width;\n  \n  bool use_layout_B = false;\n  bool use_layout_C = false;\n  bool use_layout_D = false;\n  \n  for(uword i=0; i<n_elem; ++i)\n    {\n    const eT val = data[i];\n    \n    if(\n      ( cond_rel< (sizeof(eT) > 4) && (is_same_type<uword,eT>::yes || is_same_type<sword,eT>::yes) >::geq(val, eT(+10000000000)) )\n      ||\n      ( cond_rel< (sizeof(eT) > 4) &&  is_same_type<sword,eT>::yes                                 >::leq(val, eT(-10000000000)) )\n      )\n      {\n      use_layout_D = true;\n      break;\n      }\n    \n    if(\n      ( val >= eT(+100) )\n      ||\n      //( (is_signed<eT>::value == true) && (val <= eT(-100)) ) ||\n      //( (is_non_integral<eT>::value == true) && (val > eT(0)) && (val <= eT(+1e-4)) ) ||\n      //( (is_non_integral<eT>::value == true) && (is_signed<eT>::value == true) && (val < eT(0)) && (val >= eT(-1e-4)) ) \n        (\n        cond_rel< is_signed<eT>::value >::leq(val, eT(-100))\n        )\n      ||\n        (\n        cond_rel< is_non_integral<eT>::value >::gt(val,  eT(0))\n        &&\n        cond_rel< is_non_integral<eT>::value >::leq(val, eT(+1e-4))\n        )\n      ||\n        (\n        cond_rel< is_non_integral<eT>::value && is_signed<eT>::value >::lt(val, eT(0))\n        &&\n        cond_rel< is_non_integral<eT>::value && is_signed<eT>::value >::geq(val, eT(-1e-4))\n        )\n      )\n      {\n      use_layout_C = true;\n      break;\n      }\n      \n    if(\n      // (val >= eT(+10)) || ( (is_signed<eT>::value == true) && (val <= eT(-10)) )\n      (val >= eT(+10)) || ( cond_rel< is_signed<eT>::value >::leq(val, eT(-10)) )\n      )\n      {\n      use_layout_B = true;\n      }\n    }\n  \n  if(use_layout_D)\n    {\n    o.setf(ios::scientific);\n    o.setf(ios::right);\n    o.unsetf(ios::fixed);\n    o.precision(4);\n    cell_width = 21;\n    }\n  else\n  if(use_layout_C)\n    {\n    o.setf(ios::scientific);\n    o.setf(ios::right);\n    o.unsetf(ios::fixed);\n    o.precision(4);\n    cell_width = 13;\n    }\n  else\n  if(use_layout_B)\n    {\n    o.unsetf(ios::scientific);\n    o.setf(ios::right);\n    o.setf(ios::fixed);\n    o.precision(4);\n    cell_width = 10;\n    }\n  else\n    {\n    o.unsetf(ios::scientific);\n    o.setf(ios::right);\n    o.setf(ios::fixed);\n    o.precision(4);\n    cell_width = 9;\n    }\n  \n  return cell_width;\n  }\n\n\n\n//! \"better than nothing\" settings for complex numbers\ntemplate<typename T>\ninline\nstd::streamsize\narma_ostream::modify_stream(std::ostream& o, const std::complex<T>* data, const uword n_elem)\n  {\n  arma_ignore(data);\n  arma_ignore(n_elem);\n  \n  o.unsetf(ios::showbase);\n  o.unsetf(ios::uppercase);\n  o.fill(' ');\n  \n  o.setf(ios::scientific);\n  o.setf(ios::showpos);\n  o.setf(ios::right);\n  o.unsetf(ios::fixed);\n  \n  std::streamsize cell_width;\n  \n  o.precision(3);\n  cell_width = 2 + 2*(1 + 3 + o.precision() + 5) + 1;\n  \n  return cell_width;\n  }\n\n\ntemplate<typename eT>\ninline\nstd::streamsize\narma_ostream::modify_stream(std::ostream& o, typename SpMat<eT>::const_iterator begin, const uword n_elem, const typename arma_not_cx<eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n\n  o.unsetf(ios::showbase);\n  o.unsetf(ios::uppercase);\n  o.unsetf(ios::showpos);\n\n  o.fill(' ');\n\n  std::streamsize cell_width;\n\n  bool use_layout_B  = false;\n  bool use_layout_C  = false;\n\n  for(typename SpMat<eT>::const_iterator it = begin; it.pos() < n_elem; ++it)\n    {\n    const eT val = *it;\n\n    if(\n      val >= eT(+100) ||\n      ( (is_signed<eT>::value == true) && (val <= eT(-100)) ) ||\n      ( (is_non_integral<eT>::value == true) && (val > eT(0)) && (val <= eT(+1e-4)) ) ||\n      ( (is_non_integral<eT>::value == true) && (is_signed<eT>::value == true) && (val < eT(0)) && (val >= eT(-1e-4)) )\n      )\n      {\n      use_layout_C = true;\n      break;\n      }\n\n    if(\n      (val >= eT(+10)) || ( (is_signed<eT>::value == true) && (val <= eT(-10)) )\n      )\n      {\n      use_layout_B = true;\n      }\n    }\n\n  if(use_layout_C)\n    {\n    o.setf(ios::scientific);\n    o.setf(ios::right);\n    o.unsetf(ios::fixed);\n    o.precision(4);\n    cell_width = 13;\n    }\n  else\n  if(use_layout_B)\n    {\n    o.unsetf(ios::scientific);\n    o.setf(ios::right);\n    o.setf(ios::fixed);\n    o.precision(4);\n    cell_width = 10;\n    }\n  else\n    {\n    o.unsetf(ios::scientific);\n    o.setf(ios::right);\n    o.setf(ios::fixed);\n    o.precision(4);\n    cell_width = 9;\n    }\n  \n  return cell_width;\n  }\n\n\n\n//! \"better than nothing\" settings for complex numbers\ntemplate<typename T>\ninline\nstd::streamsize\narma_ostream::modify_stream(std::ostream& o, typename SpMat<T>::const_iterator begin, const uword n_elem, const typename arma_cx_only<T>::result* junk)\n  {\n  arma_ignore(begin);\n  arma_ignore(n_elem);\n  arma_ignore(junk);\n  \n  o.unsetf(ios::showbase);\n  o.unsetf(ios::uppercase);\n  o.fill(' ');\n  \n  o.setf(ios::scientific);\n  o.setf(ios::showpos);\n  o.setf(ios::right);\n  o.unsetf(ios::fixed);\n  \n  std::streamsize cell_width;\n  \n  o.precision(3);\n  cell_width = 2 + 2*(1 + 3 + o.precision() + 5) + 1;\n  \n  return cell_width;\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\narma_ostream::print_elem_zero(std::ostream& o, const bool modify)\n  {\n  if(modify == true)\n    {\n    const std::streamsize orig_precision = o.precision();\n    \n    o.precision(0);\n    \n    o << eT(0);\n    \n    o.precision(orig_precision);\n    }\n  else\n    {\n    o << eT(0);\n    }\n  }\n\n\n\n//! Print an element to the specified stream\ntemplate<typename eT>\narma_inline\nvoid\narma_ostream::print_elem(std::ostream& o, const eT& x, const bool modify)\n  {\n  if(is_signed<eT>::value)\n    {\n    typedef typename promote_type<eT, s16>::result promoted_eT;\n    \n    if(x != eT(0))\n      {\n      if(arma_isfinite(x))\n        {\n        o << promoted_eT(x);\n        }\n      else\n        {\n        o << ( arma_isinf(x) ? ((x <= eT(0)) ? \"-inf\" : \"inf\") : \"nan\" );\n        }\n      }\n    else\n      {\n      arma_ostream::print_elem_zero<promoted_eT>(o, modify);\n      }\n    }\n  else\n    {\n    typedef typename promote_type<eT, u16>::result promoted_eT;\n    \n    if(x != eT(0))\n      {\n      o << promoted_eT(x);\n      }\n    else\n      {\n      arma_ostream::print_elem_zero<promoted_eT>(o, modify);\n      }\n    }\n  }\n\n\n\n//! Print a complex element to the specified stream\ntemplate<typename T>\ninline\nvoid\narma_ostream::print_elem(std::ostream& o, const std::complex<T>& x, const bool modify)\n  {\n  if( (x.real() != T(0)) || (x.imag() != T(0)) || (modify == false) )\n    {\n    std::ostringstream ss;\n    ss.flags(o.flags());\n    //ss.imbue(o.getloc());\n    ss.precision(o.precision());\n    \n    ss << '(';\n    \n    const T a = x.real();\n    \n    if(arma_isfinite(a))\n      {\n      ss << a;\n      }\n    else\n      {\n      ss << ( arma_isinf(a) ? ((a <= T(0)) ? \"-inf\" : \"+inf\") : \"nan\" );\n      }\n    \n    ss << ',';\n    \n    const T b = x.imag();\n    \n    if(arma_isfinite(b))\n      {\n      ss << b;\n      }\n    else\n      {\n      ss << ( arma_isinf(b) ? ((b <= T(0)) ? \"-inf\" : \"+inf\") : \"nan\" );\n      }\n    \n    ss << ')';\n    \n    o << ss.str();\n    }\n  else\n    {\n    o << \"(0,0)\";\n    }\n  }\n\n\n\n//! Print a matrix to the specified stream\ntemplate<typename eT>\ninline\nvoid\narma_ostream::print(std::ostream& o, const Mat<eT>& m, const bool modify)\n  {\n  arma_extra_debug_sigprint();\n  \n  const arma_ostream_state stream_state(o);\n  \n  const std::streamsize cell_width = modify ? arma_ostream::modify_stream(o, m.memptr(), m.n_elem) : o.width();\n  \n  const uword m_n_rows = m.n_rows;\n  const uword m_n_cols = m.n_cols;\n  \n  if(m.is_empty() == false)\n    {\n    if(m_n_cols > 0)\n      {\n      if(cell_width > 0)\n        {\n        for(uword row=0; row < m_n_rows; ++row)\n          {\n          for(uword col=0; col < m_n_cols; ++col)\n            {\n            // the cell width appears to be reset after each element is printed,\n            // hence we need to restore it\n            o.width(cell_width);\n            arma_ostream::print_elem(o, m.at(row,col), modify);\n            }\n        \n          o << '\\n';\n          }\n        }\n      else\n        {\n        for(uword row=0; row < m_n_rows; ++row)\n          {\n          for(uword col=0; col < m_n_cols-1; ++col)\n            {\n            arma_ostream::print_elem(o, m.at(row,col), modify);\n            o << ' ';\n            }\n        \n          arma_ostream::print_elem(o, m.at(row, m_n_cols-1), modify);\n          o << '\\n';\n          }\n        }\n      }\n    }\n  else\n    {\n    o << \"[matrix size: \" << m_n_rows << 'x' << m_n_cols << \"]\\n\";\n    }\n  \n  o.flush();\n  stream_state.restore(o);\n  }\n\n\n\n//! Print a cube to the specified stream\ntemplate<typename eT>\ninline\nvoid\narma_ostream::print(std::ostream& o, const Cube<eT>& x, const bool modify)\n  {\n  arma_extra_debug_sigprint();\n  \n  const arma_ostream_state stream_state(o);\n  \n  const std::streamsize cell_width = modify ? arma_ostream::modify_stream(o, x.memptr(), x.n_elem) : o.width();\n  \n  if(x.is_empty() == false)\n    {\n    for(uword slice=0; slice < x.n_slices; ++slice)\n      {\n      o << \"[cube slice \" << slice << ']' << '\\n';\n      o.width(cell_width);\n      arma_ostream::print(o, x.slice(slice), false);\n      o << '\\n';\n      }\n    }\n  else\n    {\n    o << \"[cube size: \" << x.n_rows << 'x' << x.n_cols << 'x' << x.n_slices <<  \"]\\n\";\n    }\n\n  stream_state.restore(o);\n  }\n\n\n\n\n//! Print a field to the specified stream\n//! Assumes type oT can be printed, i.e. oT has std::ostream& operator<< (std::ostream&, const oT&) \ntemplate<typename oT>\ninline\nvoid\narma_ostream::print(std::ostream& o, const field<oT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  const arma_ostream_state stream_state(o);\n  \n  const std::streamsize cell_width = o.width();\n  \n  const uword x_n_rows   = x.n_rows;\n  const uword x_n_cols   = x.n_cols;\n  const uword x_n_slices = x.n_slices;\n  \n  if(x.is_empty() == false)\n    {\n    if(x_n_slices == 1)\n      {\n      for(uword col=0; col<x_n_cols; ++col)\n        {\n        o << \"[field column \" << col << ']' << '\\n'; \n        \n        for(uword row=0; row<x_n_rows; ++row)\n          {\n          o.width(cell_width);\n          o << x.at(row,col) << '\\n';\n          }\n        \n        o << '\\n';\n        }\n      }\n    else\n      {\n      for(uword slice=0; slice<x_n_slices; ++slice)\n        {\n        o << \"[field slice \" << slice << ']' << '\\n';\n        \n        for(uword col=0; col<x_n_cols; ++col)\n          {\n          o << \"[field column \" << col << ']' << '\\n';\n          \n          for(uword row=0; row<x_n_rows; ++row)\n            {\n            o.width(cell_width);\n            o << x.at(row,col,slice) << '\\n';\n            }\n          \n          o << '\\n';\n          }\n        \n        o << '\\n';\n        }\n      }\n    }\n  else\n    {\n    o << \"[field size: \" << x_n_rows << 'x' << x_n_cols << 'x' << x_n_slices << \"]\\n\";\n    }\n  \n  o.flush();\n  stream_state.restore(o);\n  }\n\n\n\n//! Print a subfield to the specified stream\n//! Assumes type oT can be printed, i.e. oT has std::ostream& operator<< (std::ostream&, const oT&) \ntemplate<typename oT>\ninline\nvoid\narma_ostream::print(std::ostream& o, const subview_field<oT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  const arma_ostream_state stream_state(o);\n  \n  const std::streamsize cell_width = o.width();\n  \n  const uword x_n_rows   = x.n_rows;\n  const uword x_n_cols   = x.n_cols;\n  const uword x_n_slices = x.n_slices;\n  \n  if(x_n_slices == 1)\n    {\n    for(uword col=0; col<x_n_cols; ++col)\n      {\n      o << \"[field column \" << col << ']' << '\\n'; \n      for(uword row=0; row<x_n_rows; ++row)\n        {\n        o.width(cell_width);\n        o << x.at(row,col) << '\\n';\n        }\n      \n      o << '\\n';\n      }\n    }\n  else\n    {\n    for(uword slice=0; slice<x_n_slices; ++slice)\n      {\n      o << \"[field slice \" << slice << ']' << '\\n';\n      \n      for(uword col=0; col<x_n_cols; ++col)\n        {\n        o << \"[field column \" << col << ']' << '\\n';\n        \n        for(uword row=0; row<x_n_rows; ++row)\n          {\n          o.width(cell_width);\n          o << x.at(row,col,slice) << '\\n';\n          }\n        \n        o << '\\n';\n        }\n      \n      o << '\\n';\n      }\n    }\n  \n  o.flush();\n  stream_state.restore(o);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\narma_ostream::print_dense(std::ostream& o, const SpMat<eT>& m, const bool modify)\n  {\n  arma_extra_debug_sigprint();\n  \n  const arma_ostream_state stream_state(o);\n  \n  const uword m_n_rows = m.n_rows;\n  const uword m_n_cols = m.n_cols;\n    \n  if(m.n_nonzero > 0)\n    {\n    const std::streamsize cell_width = modify ? modify_stream<eT>(o, m.begin(), m.n_nonzero) : o.width();\n    \n    typename SpMat<eT>::const_iterator begin = m.begin();\n    \n    if(m_n_cols > 0)\n      {\n      if(cell_width > 0)\n        {\n        // An efficient row_iterator would make this simpler and faster\n        for(uword row=0; row < m_n_rows; ++row)\n          {\n          for(uword col=0; col < m_n_cols; ++col)\n            {\n            // the cell width appears to be reset after each element is printed,\n            // hence we need to restore it\n            o.width(cell_width);\n            eT val = eT(0);\n            for(typename SpMat<eT>::const_iterator it = begin; it.pos() < m.n_nonzero; ++it)\n              {\n              if(it.row() == row && it.col() == col)\n                {\n                val = *it;\n                break;\n                }\n              }\n            arma_ostream::print_elem(o,eT(val), modify);\n            }\n\n          o << '\\n';\n          }\n        }\n      else\n        {\n        // An efficient row_iterator would make this simpler and faster\n        for(uword row=0; row < m_n_rows; ++row)\n          {\n          for(uword col=0; col < m_n_cols; ++col)\n            {\n            eT val = eT(0);\n            for(typename SpMat<eT>::const_iterator it = begin; it.pos() < m.n_nonzero; ++it)\n              {\n              if(it.row() == row && it.col() == col)\n                {\n                val = *it;\n                break;\n                }\n              }\n            arma_ostream::print_elem(o,eT(val), modify);\n            o << ' ';\n            }\n\n          o << '\\n';\n          }\n        }\n      }\n    }\n  else\n    {\n    if(m.n_elem == 0)\n      {\n      o << \"[matrix size: \" << m_n_rows << 'x' << m_n_cols << \"]\\n\";\n      }\n    else\n      {\n      eT tmp[1];\n      tmp[0] = eT(0);\n      \n      const std::streamsize cell_width = modify ? arma_ostream::modify_stream(o, &tmp[0], 1) : o.width();\n      \n      for(uword row=0; row < m_n_rows; ++row)\n        {\n        for(uword col=0; col < m_n_cols; ++col)\n          {\n          o.width(cell_width);\n          \n          arma_ostream::print_elem_zero<eT>(o, modify);\n          \n          o << ' ';\n          }\n        \n        o << '\\n';\n        }\n      }\n    }\n  \n  o.flush();\n  stream_state.restore(o);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\narma_ostream::print(std::ostream& o, const SpMat<eT>& m, const bool modify)\n  {\n  arma_extra_debug_sigprint();\n  \n  const arma_ostream_state stream_state(o);\n  \n  o.unsetf(ios::showbase);\n  o.unsetf(ios::uppercase);\n  o.unsetf(ios::showpos);\n  o.unsetf(ios::scientific);\n  o.setf(ios::right);\n  o.setf(ios::fixed);\n  o.precision(2);\n  \n  const uword m_n_nonzero = m.n_nonzero;\n  \n  o << \"[matrix size: \" << m.n_rows << 'x' << m.n_cols << \"; n_nonzero: \" << m_n_nonzero\n    << \"; density: \" << ((m.n_elem > 0) ? (double(m_n_nonzero) / double(m.n_elem) * double(100)) : double(0))\n    << \"%]\\n\\n\";\n  \n  if(modify == false) { stream_state.restore(o); }\n  \n  if(m_n_nonzero > 0)\n    {\n    const std::streamsize cell_width = modify ? modify_stream<eT>(o, m.begin(), m_n_nonzero) : o.width();\n    \n    typename SpMat<eT>::const_iterator begin = m.begin();\n    typename SpMat<eT>::const_iterator m_end = m.end();\n    \n    while(begin != m_end)\n      {\n      const uword row = begin.row();\n      \n      // TODO: change the maximum number of spaces before and after each location to be dependent on n_rows and n_cols\n      \n           if(row < 10)      { o << \"     \"; }\n      else if(row < 100)     { o << \"    \";  }\n      else if(row < 1000)    { o << \"   \";   }\n      else if(row < 10000)   { o << \"  \";    }\n      else if(row < 100000)  { o << ' ';     }\n      \n      const uword col = begin.col();\n      \n      o << '(' << row << \", \" << col << \") \";\n      \n           if(col < 10)      { o << \"     \"; }\n      else if(col < 100)     { o << \"    \";  }\n      else if(col < 1000)    { o << \"   \";   }\n      else if(col < 10000)   { o << \"  \";    }\n      else if(col < 100000)  { o << ' ';     }\n      \n      if(cell_width > 0) { o.width(cell_width); }\n        \n      arma_ostream::print_elem(o, eT(*begin), modify);\n      o << '\\n';\n      \n      ++begin;\n      }\n    \n    o << '\\n';\n    }\n  \n  o.flush();\n  stream_state.restore(o);\n  }\n\n\n\ninline\nvoid\narma_ostream::print(std::ostream& o, const SizeMat& S)\n  {\n  arma_extra_debug_sigprint();\n  \n  const arma_ostream_state stream_state(o);\n  \n  o.unsetf(ios::showbase);\n  o.unsetf(ios::uppercase);\n  o.unsetf(ios::showpos);\n  \n  o.setf(ios::fixed);\n  \n  o << S.n_rows << 'x' << S.n_cols;\n  \n  stream_state.restore(o);\n  }\n\n\n\ninline\nvoid\narma_ostream::print(std::ostream& o, const SizeCube& S)\n  {\n  arma_extra_debug_sigprint();\n  \n  const arma_ostream_state stream_state(o);\n  \n  o.unsetf(ios::showbase);\n  o.unsetf(ios::uppercase);\n  o.unsetf(ios::showpos);\n  \n  o.setf(ios::fixed);\n    \n  o << S.n_rows << 'x' << S.n_cols << 'x' << S.n_slices;\n  \n  stream_state.restore(o);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/arma_rng.hpp",
    "content": "// Copyright (C) 2013-2015 Conrad Sanderson\n// Copyright (C) 2013-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup arma_rng\n//! @{\n\n\n#if defined(ARMA_RNG_ALT)\n  #undef ARMA_USE_EXTERN_CXX11_RNG\n#endif\n\n\n#if !defined(ARMA_USE_CXX11)\n  #undef ARMA_USE_EXTERN_CXX11_RNG\n#endif\n\n\n#if defined(ARMA_USE_EXTERN_CXX11_RNG)\n  extern thread_local arma_rng_cxx11 arma_rng_cxx11_instance;\n  // namespace { thread_local arma_rng_cxx11 arma_rng_cxx11_instance; }\n#endif\n\n\nclass arma_rng\n  {\n  public:\n  \n  #if   defined(ARMA_RNG_ALT)\n    typedef arma_rng_alt::seed_type   seed_type;\n  #elif defined(ARMA_USE_EXTERN_CXX11_RNG)\n    typedef arma_rng_cxx11::seed_type seed_type;\n  #else\n    typedef arma_rng_cxx98::seed_type seed_type;\n  #endif\n  \n  #if   defined(ARMA_RNG_ALT)\n    static const int rng_method = 2;\n  #elif defined(ARMA_USE_EXTERN_CXX11_RNG)\n    static const int rng_method = 1;\n  #else\n    static const int rng_method = 0;\n  #endif\n  \n  inline static void set_seed(const seed_type val);\n  inline static void set_seed_random();\n  \n  template<typename eT> struct randi;\n  template<typename eT> struct randu;\n  template<typename eT> struct randn;\n  };\n\n\n\ninline\nvoid\narma_rng::set_seed(const arma_rng::seed_type val)\n  {\n  #if   defined(ARMA_RNG_ALT)\n    {\n    arma_rng_alt::set_seed(val);\n    }\n  #elif defined(ARMA_USE_EXTERN_CXX11_RNG)\n    {\n    arma_rng_cxx11_instance.set_seed(val);\n    }\n  #else\n    {\n    arma_rng_cxx98::set_seed(val);\n    }\n  #endif\n  }\n\n\n\ninline\nvoid\narma_rng::set_seed_random()\n  {\n  seed_type seed1 = seed_type(0);\n  seed_type seed2 = seed_type(0);\n  seed_type seed3 = seed_type(0);\n  seed_type seed4 = seed_type(0);\n  seed_type seed5 = seed_type(0);\n  \n  bool have_seed = false;\n  \n  #if defined(ARMA_USE_CXX11)\n    {\n    try\n      {\n      std::random_device rd;\n      \n      if(rd.entropy() > double(0))  { seed1 = static_cast<seed_type>( rd() ); }\n      \n      if(seed1 != seed_type(0))  { have_seed = true; }\n      }\n    catch(...) {}\n    }\n  #endif\n  \n  \n  if(have_seed == false)\n    {\n    try\n      {\n      union\n        {\n        seed_type     a;\n        unsigned char b[sizeof(seed_type)];\n        } tmp;\n      \n      tmp.a = seed_type(0);\n      \n      std::ifstream f(\"/dev/urandom\", std::ifstream::binary);\n      \n      if(f.good())  { f.read((char*)(&(tmp.b[0])), sizeof(seed_type)); }\n      \n      if(f.good())\n        {\n        seed2 = tmp.a;\n        \n        if(seed2 != seed_type(0))  { have_seed = true; }\n        }\n      }\n    catch(...) {}\n    }\n  \n  \n  if(have_seed == false)\n    {\n    // get better-than-nothing seeds in case reading /dev/urandom failed \n    \n    #if defined(ARMA_HAVE_GETTIMEOFDAY)\n      {\n      struct timeval posix_time;\n      \n      gettimeofday(&posix_time, 0);\n      \n      seed3 = static_cast<seed_type>(posix_time.tv_usec);\n      }\n    #endif\n    \n    seed4 = static_cast<seed_type>( std::time(NULL) & 0xFFFF );\n    \n    union\n      {\n      uword*        a;\n      unsigned char b[sizeof(uword*)];\n      } tmp;\n    \n    tmp.a = (uword*)malloc(sizeof(uword));\n    \n    if(tmp.a != NULL)\n      {\n      for(size_t i=0; i<sizeof(uword*); ++i)  { seed5 += seed_type(tmp.b[i]); }\n      \n      free(tmp.a);\n      }\n    }\n  \n  arma_rng::set_seed( seed1 + seed2 + seed3 + seed4 + seed5 );\n  }\n\n\n\ntemplate<typename eT>\nstruct arma_rng::randi\n  {\n  arma_inline\n  operator eT ()\n    {\n    #if   defined(ARMA_RNG_ALT)\n      {\n      return eT( arma_rng_alt::randi_val() );\n      }\n    #elif defined(ARMA_USE_EXTERN_CXX11_RNG)\n      {\n      return eT( arma_rng_cxx11_instance.randi_val() );\n      }\n    #else\n      {\n      return eT( arma_rng_cxx98::randi_val() );\n      }\n    #endif\n    }\n  \n  \n  inline\n  static\n  int\n  max_val()\n    {\n    #if   defined(ARMA_RNG_ALT)\n      {\n      return arma_rng_alt::randi_max_val();\n      }\n    #elif defined(ARMA_USE_EXTERN_CXX11_RNG)\n      {\n      return arma_rng_cxx11::randi_max_val();\n      }\n    #else\n      {\n      return arma_rng_cxx98::randi_max_val();\n      }\n    #endif\n    }\n  \n  \n  inline\n  static\n  void\n  fill(eT* mem, const uword N, const int a, const int b)\n    {\n    #if   defined(ARMA_RNG_ALT)\n      {\n      return arma_rng_alt::randi_fill(mem, N, a, b);\n      }\n    #elif defined(ARMA_USE_EXTERN_CXX11_RNG)\n      {\n      return arma_rng_cxx11_instance.randi_fill(mem, N, a, b);\n      }\n    #else\n      {\n      return arma_rng_cxx98::randi_fill(mem, N, a, b);\n      }\n    #endif\n    }\n  };\n\n\n\ntemplate<typename eT>\nstruct arma_rng::randu\n  {\n  arma_inline\n  operator eT ()\n    {\n    #if   defined(ARMA_RNG_ALT)\n      {\n      return eT( arma_rng_alt::randu_val() );\n      }\n    #elif defined(ARMA_USE_EXTERN_CXX11_RNG)\n      {\n      return eT( arma_rng_cxx11_instance.randu_val() );\n      }\n    #else\n      {\n      return eT( arma_rng_cxx98::randu_val() );\n      }\n    #endif\n    }\n  \n  \n  inline\n  static\n  void\n  fill(eT* mem, const uword N)\n    {\n    uword i,j;\n    \n    for(i=0, j=1; j < N; i+=2, j+=2)\n      {\n      const eT tmp_i = eT( arma_rng::randu<eT>() );\n      const eT tmp_j = eT( arma_rng::randu<eT>() );\n      \n      mem[i] = tmp_i;\n      mem[j] = tmp_j;\n      }\n    \n    if(i < N)\n      {\n      mem[i] = eT( arma_rng::randu<eT>() );\n      }\n    }\n  };\n\n\n\ntemplate<typename T>\nstruct arma_rng::randu< std::complex<T> >\n  {\n  arma_inline\n  operator std::complex<T> ()\n    {\n    const T a = T( arma_rng::randu<T>() );\n    const T b = T( arma_rng::randu<T>() );\n    \n    return std::complex<T>(a, b);\n    }\n  \n  \n  inline\n  static\n  void\n  fill(std::complex<T>* mem, const uword N)\n    {\n    for(uword i=0; i < N; ++i)\n      {\n      const T a = T( arma_rng::randu<T>() );\n      const T b = T( arma_rng::randu<T>() );\n      \n      mem[i] = std::complex<T>(a, b);\n      }\n    }\n  };\n\n\n\ntemplate<typename eT>\nstruct arma_rng::randn\n  {\n  inline\n  operator eT () const\n    {\n    #if   defined(ARMA_RNG_ALT)\n      {\n      return eT( arma_rng_alt::randn_val() );\n      }\n    #elif defined(ARMA_USE_EXTERN_CXX11_RNG)\n      {\n      return eT( arma_rng_cxx11_instance.randn_val() );\n      }\n    #else\n      {\n      return eT( arma_rng_cxx98::randn_val() );\n      }\n    #endif\n    }\n  \n  \n  arma_inline\n  static\n  void\n  dual_val(eT& out1, eT& out2)\n    {\n    #if   defined(ARMA_RNG_ALT)\n      {\n      arma_rng_alt::randn_dual_val(out1, out2);\n      }\n    #elif defined(ARMA_USE_EXTERN_CXX11_RNG)\n      {\n      arma_rng_cxx11_instance.randn_dual_val(out1, out2);\n      }\n    #else\n      {\n      arma_rng_cxx98::randn_dual_val(out1, out2);\n      }\n    #endif\n    }\n  \n  \n  inline\n  static\n  void\n  fill(eT* mem, const uword N)\n    {\n    uword i, j;\n    \n    for(i=0, j=1; j < N; i+=2, j+=2)\n      {\n      arma_rng::randn<eT>::dual_val( mem[i], mem[j] );\n      }\n    \n    if(i < N)\n      {\n      mem[i] = eT( arma_rng::randn<eT>() );\n      }\n    }\n  \n  };\n\n\n\ntemplate<typename T>\nstruct arma_rng::randn< std::complex<T> >\n  {\n  inline\n  operator std::complex<T> () const\n    {\n    T a, b;\n    \n    arma_rng::randn<T>::dual_val(a, b);\n    \n    return std::complex<T>(a, b);\n    }\n  \n  \n  inline\n  static\n  void\n  fill(std::complex<T>* mem, const uword N)\n    {\n    for(uword i=0; i < N; ++i)\n      {\n      mem[i] = std::complex<T>( arma_rng::randn< std::complex<T> >() );\n      }\n    }\n  \n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/arma_rng_cxx11.hpp",
    "content": "// Copyright (C) 2013-2015 Conrad Sanderson\n// Copyright (C) 2013-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup arma_rng_cxx11\n//! @{\n\n\n#if defined(ARMA_USE_CXX11)\n\n\nclass arma_rng_cxx11\n  {\n  public:\n  \n  typedef std::mt19937_64::result_type seed_type;\n  \n  inline void set_seed(const seed_type val);\n  \n  arma_inline int    randi_val();\n  arma_inline double randu_val();\n  arma_inline double randn_val();\n  \n  template<typename eT>\n  arma_inline void randn_dual_val(eT& out1, eT& out2);\n  \n  template<typename eT>\n  inline void randi_fill(eT* mem, const uword N, const int a, const int b);\n  \n  inline static int randi_max_val();\n  \n  template<typename eT>\n  inline void randg_fill(eT* mem, const uword N, const double a, const double b);\n  \n  \n  private:\n  \n  arma_aligned std::mt19937_64 engine;                           // typedef for std::mersenne_twister_engine with preset parameters\n  \n  arma_aligned std::uniform_int_distribution<int>     i_distr;   // by default uses a=0, b=std::numeric_limits<int>::max()\n  \n  arma_aligned std::uniform_real_distribution<double> u_distr;   // by default uses [0,1) interval\n  \n  arma_aligned std::normal_distribution<double>       n_distr;   // by default uses mean=0.0 and stddev=1.0\n  };\n\n\n\ninline\nvoid\narma_rng_cxx11::set_seed(const arma_rng_cxx11::seed_type val)\n  {\n  engine.seed(val);\n  }\n\n\n\narma_inline\nint\narma_rng_cxx11::randi_val()\n  {\n  return i_distr(engine);\n  }\n\n\n\narma_inline\ndouble\narma_rng_cxx11::randu_val()\n  {\n  return u_distr(engine);\n  }\n\n\n\narma_inline\ndouble\narma_rng_cxx11::randn_val()\n  {\n  return n_distr(engine);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nvoid\narma_rng_cxx11::randn_dual_val(eT& out1, eT& out2)\n  {\n  out1 = eT( n_distr(engine) );\n  out2 = eT( n_distr(engine) );\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\narma_rng_cxx11::randi_fill(eT* mem, const uword N, const int a, const int b)\n  {\n  std::uniform_int_distribution<int> i_distr(a, b);\n  \n  for(uword i=0; i<N; ++i)\n    {\n    mem[i] = eT(i_distr(engine));\n    }\n  }\n\n\n\ninline\nint\narma_rng_cxx11::randi_max_val()\n  {\n  return std::numeric_limits<int>::max();\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\narma_rng_cxx11::randg_fill(eT* mem, const uword N, const double a, const double b)\n  {\n  std::gamma_distribution<double> g_distr(a,b);\n  \n  for(uword i=0; i<N; ++i)\n    {\n    mem[i] = eT(g_distr(engine));\n    }\n  }\n\n\n#endif\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/arma_rng_cxx98.hpp",
    "content": "// Copyright (C) 2013-2014 Conrad Sanderson\n// Copyright (C) 2013-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup arma_rng_cxx98\n//! @{\n\n\n\nclass arma_rng_cxx98\n  {\n  public:\n  \n  typedef unsigned int seed_type;\n  \n  inline static void set_seed(const seed_type val);\n  \n  arma_inline static int    randi_val();\n  arma_inline static double randu_val();\n       inline static double randn_val();\n  \n  template<typename eT>\n  inline static void randn_dual_val(eT& out1, eT& out2);\n  \n  template<typename eT>\n  inline static void randi_fill(eT* mem, const uword N, const int a, const int b);\n  \n  inline static int randi_max_val();\n  };\n\n\n\ninline\nvoid\narma_rng_cxx98::set_seed(const arma_rng_cxx98::seed_type val)\n  {\n  std::srand(val);\n  }\n\n\n\narma_inline\nint\narma_rng_cxx98::randi_val()\n  {\n  #if (RAND_MAX == 32767)\n    {\n    u32 val1 = u32(std::rand());\n    u32 val2 = u32(std::rand());\n    \n    val1 <<= 15;\n    \n    return (val1 | val2);\n    }\n  #else\n    {\n    return std::rand();\n    }\n  #endif\n  }\n\n\n\narma_inline\ndouble\narma_rng_cxx98::randu_val()\n  {\n  return double( double(randi_val()) * ( double(1) / double(randi_max_val()) ) );\n  }\n\n\n\ninline\ndouble\narma_rng_cxx98::randn_val()\n  {\n  // polar form of the Box-Muller transformation:\n  // http://en.wikipedia.org/wiki/Box-Muller_transformation\n  // http://en.wikipedia.org/wiki/Marsaglia_polar_method\n  \n  double tmp1;\n  double tmp2;\n  double w;\n  \n  do\n    {\n    tmp1 = double(2) * double(randi_val()) * (double(1) / double(randi_max_val())) - double(1);\n    tmp2 = double(2) * double(randi_val()) * (double(1) / double(randi_max_val())) - double(1);\n    \n    w = tmp1*tmp1 + tmp2*tmp2;\n    }\n  while ( w >= double(1) );\n  \n  return double( tmp1 * std::sqrt( (double(-2) * std::log(w)) / w) );\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\narma_rng_cxx98::randn_dual_val(eT& out1, eT& out2)\n  {\n  // make sure we are internally using at least floats\n  typedef typename promote_type<eT,float>::result eTp;\n  \n  eTp tmp1;\n  eTp tmp2;\n  eTp w;\n  \n  do\n    {\n    tmp1 = eTp(2) * eTp(randi_val()) * (eTp(1) / eTp(randi_max_val())) - eTp(1);\n    tmp2 = eTp(2) * eTp(randi_val()) * (eTp(1) / eTp(randi_max_val())) - eTp(1);\n    \n    w = tmp1*tmp1 + tmp2*tmp2;\n    }\n  while ( w >= eTp(1) );\n  \n  const eTp k = std::sqrt( (eTp(-2) * std::log(w)) / w);\n  \n  out1 = eT(tmp1*k);\n  out2 = eT(tmp2*k);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\narma_rng_cxx98::randi_fill(eT* mem, const uword N, const int a, const int b)\n  {\n  if( (a == 0) && (b == RAND_MAX) )\n    {\n    for(uword i=0; i<N; ++i)\n      {\n      mem[i] = std::rand();\n      }\n    }\n  else\n    {\n    const uword length = b - a + 1;\n    \n    const double scale = double(length) / double(randi_max_val());\n    \n    for(uword i=0; i<N; ++i)\n      {\n      mem[i] = (std::min)( b, (int( double(randi_val()) * scale ) + a) );\n      }\n    }\n  }\n\n\n\ninline\nint\narma_rng_cxx98::randi_max_val()\n  {\n  #if (RAND_MAX == 32767)\n    return ( (32767 << 15) + 32767);\n  #else\n    return RAND_MAX;\n  #endif\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/arma_static_check.hpp",
    "content": "// Copyright (C) 2008-2011 Conrad Sanderson\n// Copyright (C) 2008-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup arma_static_check\n//! @{\n\n\n\ntemplate<bool ERROR___INCORRECT_OR_UNSUPPORTED_TYPE>\nstruct arma_type_check_cxx1998\n  {\n  arma_inline\n  static\n  void\n  apply()\n    {\n    static const char\n    junk[ ERROR___INCORRECT_OR_UNSUPPORTED_TYPE ? -1 : +1 ];\n    }\n  };\n\n\n\ntemplate<>\nstruct arma_type_check_cxx1998<false>\n  {\n  arma_inline\n  static\n  void\n  apply()\n    {\n    }\n  };\n\n\n\n#if defined(ARMA_USE_CXX11)\n  \n  #define arma_static_check(condition, message)  static_assert( !(condition), #message )\n  \n  #define arma_type_check(condition)  static_assert( !(condition), \"error: incorrect or unsupported type\" )\n  \n#else\n\n  #define arma_static_check(condition, message)  static const char message[ (condition) ? -1 : +1 ]\n  \n  #define arma_type_check(condition)  arma_type_check_cxx1998<condition>::apply()\n\n#endif\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/arma_version.hpp",
    "content": "// Copyright (C) 2009-2015 Conrad Sanderson\n// Copyright (C) 2009-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup arma_version\n//! @{\n\n\n\n#define ARMA_VERSION_MAJOR 5\n#define ARMA_VERSION_MINOR 300\n#define ARMA_VERSION_PATCH 4\n#define ARMA_VERSION_NAME  \"Plutocracy Incorporated\"\n\n\n\nstruct arma_version\n  {\n  static const unsigned int major = ARMA_VERSION_MAJOR;\n  static const unsigned int minor = ARMA_VERSION_MINOR;\n  static const unsigned int patch = ARMA_VERSION_PATCH;\n  \n  static\n  inline\n  std::string\n  as_string()\n    {\n    const char* nickname = ARMA_VERSION_NAME;\n    \n    std::stringstream ss;\n    ss << arma_version::major\n       << '.'\n       << arma_version::minor\n       << '.'\n       << arma_version::patch\n       << \" (\"\n       << nickname\n       << ')';\n    \n    return ss.str();\n    }\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/arpack_bones.hpp",
    "content": "// Copyright (C) 2013 Ryan Curtin\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n#ifdef ARMA_USE_ARPACK\n\n// I'm not sure this is necessary.\n#if !defined(ARMA_BLAS_CAPITALS)\n\n  #define arma_snaupd snaupd\n  #define arma_dnaupd dnaupd\n  #define arma_cnaupd cnaupd\n  #define arma_znaupd znaupd\n\n  #define arma_sneupd sneupd\n  #define arma_dneupd dneupd\n  #define arma_cneupd cneupd\n  #define arma_zneupd zneupd\n\n  #define arma_ssaupd ssaupd\n  #define arma_dsaupd dsaupd\n\n  #define arma_sseupd sseupd\n  #define arma_dseupd dseupd\n\n#else\n\n  #define arma_snaupd SNAUPD\n  #define arma_dnaupd DNAUPD\n  #define arma_cnaupd CNAUPD\n  #define arma_znaupd ZNAUPD\n\n  #define arma_sneupd SNEUPD\n  #define arma_dneupd DNEUPD\n  #define arma_cneupd CNEUPD\n  #define arma_zneupd ZNEUPD\n\n  #define arma_ssaupd SSAUPD\n  #define arma_dsaupd DSAUPD\n\n  #define arma_sseupd SSEUPD\n  #define arma_dseupd DSEUPD\n\n#endif\n\nextern \"C\"\n  {\n  // eigendecomposition of non-symmetric positive semi-definite matrices\n  void arma_fortran(arma_snaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev,  float* tol,  float* resid, blas_int* ncv,  float* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr,  float* workd,  float* workl, blas_int* lworkl, blas_int* info);\n  void arma_fortran(arma_dnaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, double* resid, blas_int* ncv, double* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, double* workd, double* workl, blas_int* lworkl, blas_int* info);\n  void arma_fortran(arma_cnaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev,  float* tol,   void* resid, blas_int* ncv,   void* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr,   void* workd,   void* workl, blas_int* lworkl, float* rwork, blas_int* info);\n  void arma_fortran(arma_znaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol,   void* resid, blas_int* ncv,   void* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr,   void* workd,   void* workl, blas_int* lworkl, double* rwork, blas_int* info);\n\n  // eigendecomposition of symmetric positive semi-definite matrices\n  void arma_fortran(arma_ssaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev,  float* tol,  float* resid, blas_int* ncv,  float* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr,  float* workd,  float* workl, blas_int* lworkl, blas_int* info);\n  void arma_fortran(arma_dsaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, double* resid, blas_int* ncv, double* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, double* workd, double* workl, blas_int* lworkl, blas_int* info);\n\n  // recovery of eigenvectors after naupd(); uses blas_int for LOGICAL types\n  void arma_fortran(arma_sneupd)(blas_int* rvec, char* howmny, blas_int* select,  float* dr,  float* di,  float* z, blas_int* ldz,  float* sigmar,  float* sigmai,  float* workev, char* bmat, blas_int* n, char* which, blas_int* nev,  float* tol,  float* resid, blas_int* ncv,  float* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr,  float* workd,  float* workl, blas_int* lworkl, blas_int* info);\n  void arma_fortran(arma_dneupd)(blas_int* rvec, char* howmny, blas_int* select, double* dr, double* di, double* z, blas_int* ldz, double* sigmar, double* sigmai, double* workev, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, double* resid, blas_int* ncv, double* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, double* workd, double* workl, blas_int* lworkl, blas_int* info);\n  void arma_fortran(arma_cneupd)(blas_int* rvec, char* howmny, blas_int* select, void* d,   void* z, blas_int* ldz,   void* sigma,   void* workev, char* bmat, blas_int* n, char* which, blas_int* nev,  float* tol,   void* resid, blas_int* ncv,   void* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr,   void* workd, void* workl, blas_int* lworkl,  float* rwork, blas_int* info);\n  void arma_fortran(arma_zneupd)(blas_int* rvec, char* howmny, blas_int* select, void* d,   void* z, blas_int* ldz,   void* sigma,   void* workev, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol,   void* resid, blas_int* ncv,   void* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr,   void* workd, void* workl, blas_int* lworkl, double* rwork, blas_int* info);\n\n  // recovery of eigenvectors after saupd(); uses blas_int for LOGICAL types\n  void arma_fortran(arma_sseupd)(blas_int* rvec, char* howmny, blas_int* select,  float* d,  float* z, blas_int* ldz,  float* sigma, char* bmat, blas_int* n, char* which, blas_int* nev,  float* tol,  float* resid, blas_int* ncv,  float* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr,  float* workd,  float* workl, blas_int* lworkl, blas_int* info);\n  void arma_fortran(arma_dseupd)(blas_int* rvec, char* howmny, blas_int* select, double* d, double* z, blas_int* ldz, double* sigma, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, double* resid, blas_int* ncv, double* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, double* workd, double* workl, blas_int* lworkl, blas_int* info);\n  }\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/arpack_wrapper.hpp",
    "content": "// Copyright (C) 2013 Ryan Curtin\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n#ifdef ARMA_USE_ARPACK\n\n//! \\namespace arpack namespace for ARPACK functions\nnamespace arpack\n  {\n\n  // If real, then eT == eeT; otherwise, eT == std::complex<eeT>.\n  // For real calls, rwork is ignored; it's only necessary in the complex case.\n  template<typename eT, typename eeT>\n  inline\n  void\n  naupd(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, eeT* tol, eT* resid, blas_int* ncv, eT* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, eT* workd, eT* workl, blas_int* lworkl, eeT* rwork, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n\n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_snaupd)(ido, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dnaupd)(ido, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      typedef float xT;\n      arma_fortran(arma_cnaupd)(ido, bmat, n, which, nev, (xT*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, (xT*) rwork, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      typedef double xT;\n      arma_fortran(arma_znaupd)(ido, bmat, n, which, nev, (xT*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, (xT*) rwork, info);\n      }\n    }\n\n\n  //! The use of two template types is necessary here because the compiler will\n  //! instantiate this method for complex types (where eT != eeT) but that in\n  //! practice that is never actually used.\n  template<typename eT, typename eeT>\n  inline\n  void\n  saupd(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, eeT* tol, eT* resid, blas_int* ncv, eT* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, eT* workd, eT* workl, blas_int* lworkl, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n\n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_ssaupd)(ido, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dsaupd)(ido, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info);\n      }\n    }\n\n\n\n  template<typename eT>\n  inline\n  void\n  seupd(blas_int* rvec, char* howmny, blas_int* select, eT* d, eT* z, blas_int* ldz, eT* sigma, char* bmat, blas_int* n, char* which, blas_int* nev, eT* tol, eT* resid, blas_int* ncv, eT* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, eT* workd, eT* workl, blas_int* lworkl, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n\n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_sseupd)(rvec, howmny, select, (T*) d, (T*) z, ldz, (T*) sigma, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dseupd)(rvec, howmny, select, (T*) d, (T*) z, ldz, (T*) sigma, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info);\n      }\n    }\n\n\n\n  // for complex versions, pass d for dr, and null for di; pass sigma for\n  // sigmar, and null for sigmai; rwork isn't used for non-complex versions\n  template<typename eT, typename eeT>\n  inline\n  void\n  neupd(blas_int* rvec, char* howmny, blas_int* select, eT* dr, eT* di, eT* z, blas_int* ldz, eT* sigmar, eT* sigmai, eT* workev, char* bmat, blas_int* n, char* which, blas_int* nev, eeT* tol, eT* resid, blas_int* ncv, eT* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, eT* workd, eT* workl, blas_int* lworkl, eeT* rwork, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n\n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_sneupd)(rvec, howmny, select, (T*) dr, (T*) di, (T*) z, ldz, (T*) sigmar, (T*) sigmai, (T*) workev, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dneupd)(rvec, howmny, select, (T*) dr, (T*) di, (T*) z, ldz, (T*) sigmar, (T*) sigmai, (T*) workev, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef float xT; // eT is taken\n      typedef std::complex<float> T;\n      arma_fortran(arma_cneupd)(rvec, howmny, select, (T*) dr, (T*) z, ldz, (T*) sigmar, (T*) workev, bmat, n, which, nev, (xT*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, (xT*) rwork, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef double xT; // eT is taken\n      typedef std::complex<double> T;\n      arma_fortran(arma_zneupd)(rvec, howmny, select, (T*) dr, (T*) z, ldz, (T*) sigmar, (T*) workev, bmat, n, which, nev, (xT*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, (xT*) rwork, info);\n      }\n    }\n\n\n  } // namespace arpack\n\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/arrayops_bones.hpp",
    "content": "// Copyright (C) 2011-2015 Conrad Sanderson\n// Copyright (C) 2011-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup arrayops\n//! @{\n\n\nclass arrayops\n  {\n  public:\n  \n  template<typename eT>\n  arma_hot arma_inline static void\n  copy(eT* dest, const eT* src, const uword n_elem);\n  \n  \n  template<typename eT>\n  arma_hot inline static void\n  copy_small(eT* dest, const eT* src, const uword n_elem);\n  \n  \n  template<typename eT>\n  arma_hot inline static void\n  copy_forwards(eT* dest, const eT* src, const uword n_elem);\n  \n  \n  template<typename eT>\n  arma_hot inline static void\n  copy_backwards(eT* dest, const eT* src, const uword n_elem);\n  \n  \n  template<typename eT>\n  arma_hot inline static void\n  fill_zeros(eT* dest, const uword n_elem);\n  \n  \n  // \n  // array = convert(array)\n  \n  template<typename out_eT, typename in_eT>\n  arma_hot arma_inline static void\n  convert_cx_scalar(out_eT& out, const in_eT&  in, const typename arma_not_cx<out_eT>::result* junk1 = 0, const typename arma_not_cx< in_eT>::result* junk2 = 0);\n  \n  template<typename out_eT, typename in_T>\n  arma_hot arma_inline static void\n  convert_cx_scalar(out_eT& out, const std::complex<in_T>& in, const typename arma_not_cx<out_eT>::result* junk = 0);\n  \n  template<typename out_T, typename in_T>\n  arma_hot arma_inline static void\n  convert_cx_scalar(std::complex<out_T>& out, const std::complex< in_T>& in);\n  \n  template<typename out_eT, typename in_eT>\n  arma_hot inline static void\n  convert(out_eT* dest, const in_eT* src, const uword n_elem);\n  \n  template<typename out_eT, typename in_eT>\n  arma_hot inline static void\n  convert_cx(out_eT* dest, const in_eT* src, const uword n_elem);\n  \n  \n  // \n  // array op= array\n  \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_plus(eT* dest, const eT* src, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_minus(eT* dest, const eT* src, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_mul(eT* dest, const eT* src, const uword n_elem);\n   \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_div(eT* dest, const eT* src, const uword n_elem);\n  \n  \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_plus_base(eT* dest, const eT* src, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_minus_base(eT* dest, const eT* src, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_mul_base(eT* dest, const eT* src, const uword n_elem);\n   \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_div_base(eT* dest, const eT* src, const uword n_elem);\n  \n  \n  // \n  // array op= scalar\n  \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_set(eT* dest, const eT val, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_set_base(eT* dest, const eT val, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_set_small(eT* dest, const eT val, const uword n_elem);\n  \n  template<typename eT, const uword n_elem>\n  arma_hot inline static\n  void\n  inplace_set_fixed(eT* dest, const eT val);\n  \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_plus(eT* dest, const eT val, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_minus(eT* dest, const eT val, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot inline static void\n  inplace_mul(eT* dest, const eT val, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_div(eT* dest, const eT val, const uword n_elem);\n  \n  \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_plus_base(eT* dest, const eT val, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_minus_base(eT* dest, const eT val, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot inline static void\n  inplace_mul_base(eT* dest, const eT val, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot inline static\n  void\n  inplace_div_base(eT* dest, const eT val, const uword n_elem);\n  \n  \n  // \n  // scalar = op(array)\n  \n  template<typename eT>\n  arma_hot arma_pure inline static\n  eT\n  accumulate(const eT* src, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot arma_pure inline static\n  eT\n  product(const eT* src, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot arma_pure inline static\n  bool\n  is_finite(const eT* src, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot arma_pure inline static\n  bool\n  has_inf(const eT* src, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot arma_pure inline static\n  bool\n  has_nan(const eT* src, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot arma_pure inline static\n  typename get_pod_type<eT>::result\n  norm_1(const eT* src, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot arma_pure inline static\n  eT\n  norm_2(const eT* src, const uword n_elem, const typename arma_not_cx<eT>::result* junk = 0);\n  \n  template<typename T>\n  arma_hot arma_pure inline static\n  T\n  norm_2(const std::complex<T>* src, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot arma_pure inline static\n  typename get_pod_type<eT>::result\n  norm_k(const eT* src, const uword n_elem, const int k);\n  \n  template<typename eT>\n  arma_hot arma_pure inline static\n  typename get_pod_type<eT>::result\n  norm_max(const eT* src, const uword n_elem);\n  \n  template<typename eT>\n  arma_hot arma_pure inline static\n  typename get_pod_type<eT>::result\n  norm_min(const eT* src, const uword n_elem);\n  \n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/arrayops_meat.hpp",
    "content": "// Copyright (C) 2011-2015 Conrad Sanderson\n// Copyright (C) 2011-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup arrayops\n//! @{\n\n\n\ntemplate<typename eT>\narma_hot\narma_inline\nvoid\narrayops::copy(eT* dest, const eT* src, const uword n_elem)\n  {\n  if( (n_elem <= 16) && (is_cx<eT>::no) )\n    {\n    arrayops::copy_small(dest, src, n_elem);\n    }\n  else\n    {\n    std::memcpy(dest, src, n_elem*sizeof(eT));\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::copy_small(eT* dest, const eT* src, const uword n_elem)\n  {\n  switch(n_elem)\n    {\n    case 16:  dest[15] = src[15];\n    case 15:  dest[14] = src[14];\n    case 14:  dest[13] = src[13];\n    case 13:  dest[12] = src[12];\n    case 12:  dest[11] = src[11];\n    case 11:  dest[10] = src[10];\n    case 10:  dest[ 9] = src[ 9];\n    case  9:  dest[ 8] = src[ 8];\n    case  8:  dest[ 7] = src[ 7];\n    case  7:  dest[ 6] = src[ 6];\n    case  6:  dest[ 5] = src[ 5];\n    case  5:  dest[ 4] = src[ 4];\n    case  4:  dest[ 3] = src[ 3];\n    case  3:  dest[ 2] = src[ 2];\n    case  2:  dest[ 1] = src[ 1];\n    case  1:  dest[ 0] = src[ 0];\n    default:  ;\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::copy_forwards(eT* dest, const eT* src, const uword n_elem)\n  {\n  // can't use std::memcpy(), as we don't know how it copies data\n  uword j;\n  \n  for(j=1; j < n_elem; j+=2)\n    {\n    const eT tmp_i = (*src);  src++;\n    const eT tmp_j = (*src);  src++;\n    \n    (*dest) = tmp_i;  dest++;\n    (*dest) = tmp_j;  dest++;\n    }\n  \n  if((j-1) < n_elem)\n    {\n    (*dest) = (*src);\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::copy_backwards(eT* dest, const eT* src, const uword n_elem)\n  {\n  // can't use std::memcpy(), as we don't know how it copies data\n  \n  // for(uword i=0; i < n_elem; ++i) \n  //   {\n  //   const uword j = n_elem-i-1;\n  //   \n  //   dest[j] = src[j];\n  //   }\n  \n  if(n_elem > 0)\n    {\n          eT* dest_it = &(dest[n_elem-1]);\n    const eT*  src_it = &( src[n_elem-1]);\n    \n    uword j;\n    for(j=1; j < n_elem; j+=2) \n      {\n      const eT tmp_i = (*src_it);  src_it--;\n      const eT tmp_j = (*src_it);  src_it--;\n      \n      (*dest_it) = tmp_i;  dest_it--;\n      (*dest_it) = tmp_j;  dest_it--;\n      }\n    \n    if((j-1) < n_elem)\n      {\n      (*dest_it) = (*src_it);\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::fill_zeros(eT* dest, const uword n_elem)\n  {\n  arrayops::inplace_set(dest, eT(0), n_elem);\n  }\n\n\n\ntemplate<typename out_eT, typename in_eT>\narma_hot\narma_inline\nvoid\narrayops::convert_cx_scalar\n  (\n        out_eT& out,\n  const in_eT&  in,\n  const typename arma_not_cx<out_eT>::result* junk1,\n  const typename arma_not_cx< in_eT>::result* junk2\n  )\n  {\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  out = out_eT(in);\n  }\n\n\n\ntemplate<typename out_eT, typename in_T>\narma_hot\narma_inline\nvoid\narrayops::convert_cx_scalar\n  (\n        out_eT&             out,\n  const std::complex<in_T>& in,\n  const typename arma_not_cx<out_eT>::result* junk\n  )\n  {\n  arma_ignore(junk);\n  \n  out = out_eT( in.real() );\n  }\n\n\n\ntemplate<typename out_T, typename in_T>\narma_hot\narma_inline\nvoid\narrayops::convert_cx_scalar\n  (\n        std::complex<out_T>& out,\n  const std::complex< in_T>& in\n  )\n  {\n  typedef std::complex<out_T> out_eT;\n  \n  out = out_eT(in);\n  }\n\n\n\ntemplate<typename out_eT, typename in_eT>\narma_hot\ninline\nvoid\narrayops::convert(out_eT* dest, const in_eT* src, const uword n_elem)\n  {\n  if(is_same_type<out_eT,in_eT>::value)\n    {\n    const out_eT* src2 = (const out_eT*)src;\n    \n    if(dest != src2)  { arrayops::copy(dest, src2, n_elem); }\n    \n    return;\n    }\n  \n  \n  uword j;\n  \n  for(j=1; j<n_elem; j+=2)\n    {\n    const in_eT tmp_i = (*src);  src++;\n    const in_eT tmp_j = (*src);  src++;\n    \n    // dest[i] = out_eT( tmp_i );\n    // dest[j] = out_eT( tmp_j );\n    \n    (*dest) = (is_signed<out_eT>::value)\n              ? out_eT( tmp_i )\n              : ( cond_rel< is_signed<in_eT>::value >::lt(tmp_i, in_eT(0)) ? out_eT(0) : out_eT(tmp_i) );\n    \n    dest++;\n    \n    (*dest) = (is_signed<out_eT>::value)\n              ? out_eT( tmp_j )\n              : ( cond_rel< is_signed<in_eT>::value >::lt(tmp_j, in_eT(0)) ? out_eT(0) : out_eT(tmp_j) );\n    dest++;\n    }\n  \n  if((j-1) < n_elem)\n    {\n    const in_eT tmp_i = (*src);\n    \n    // dest[i] = out_eT( tmp_i );\n    \n    (*dest) = (is_signed<out_eT>::value)\n              ? out_eT( tmp_i )\n              : ( cond_rel< is_signed<in_eT>::value >::lt(tmp_i, in_eT(0)) ? out_eT(0) : out_eT(tmp_i) );\n    }\n  }\n\n\n\ntemplate<typename out_eT, typename in_eT>\narma_hot\ninline\nvoid\narrayops::convert_cx(out_eT* dest, const in_eT* src, const uword n_elem)\n  {\n  uword j;\n  \n  for(j=1; j<n_elem; j+=2)\n    {\n    arrayops::convert_cx_scalar( (*dest), (*src) );  dest++; src++;\n    arrayops::convert_cx_scalar( (*dest), (*src) );  dest++; src++;\n    }\n  \n  if((j-1) < n_elem)\n    {\n    arrayops::convert_cx_scalar( (*dest), (*src) );\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_plus(eT* dest, const eT* src, const uword n_elem)\n  {\n  if(memory::is_aligned(dest))\n    {\n    memory::mark_as_aligned(dest);\n    \n    if(memory::is_aligned(src))\n      {\n      memory::mark_as_aligned(src);\n      \n      arrayops::inplace_plus_base(dest, src, n_elem);\n      }\n    else\n      {\n      arrayops::inplace_plus_base(dest, src, n_elem);\n      }\n    }\n  else\n    {\n    if(memory::is_aligned(src))\n      {\n      memory::mark_as_aligned(src);\n      \n      arrayops::inplace_plus_base(dest, src, n_elem);\n      }\n    else\n      {\n      arrayops::inplace_plus_base(dest, src, n_elem);\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_minus(eT* dest, const eT* src, const uword n_elem)\n  {\n  if(memory::is_aligned(dest))\n    {\n    memory::mark_as_aligned(dest);\n    \n    if(memory::is_aligned(src))\n      {\n      memory::mark_as_aligned(src);\n      \n      arrayops::inplace_minus_base(dest, src, n_elem);\n      }\n    else\n      {\n      arrayops::inplace_minus_base(dest, src, n_elem);\n      }\n    }\n  else\n    {\n    if(memory::is_aligned(src))\n      {\n      memory::mark_as_aligned(src);\n      \n      arrayops::inplace_minus_base(dest, src, n_elem);\n      }\n    else\n      {\n      arrayops::inplace_minus_base(dest, src, n_elem);\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_mul(eT* dest, const eT* src, const uword n_elem)\n  {\n  if(memory::is_aligned(dest))\n    {\n    memory::mark_as_aligned(dest);\n    \n    if(memory::is_aligned(src))\n      {\n      memory::mark_as_aligned(src);\n      \n      arrayops::inplace_mul_base(dest, src, n_elem);\n      }\n    else\n      {\n      arrayops::inplace_mul_base(dest, src, n_elem);\n      }\n    }\n  else\n    {\n    if(memory::is_aligned(src))\n      {\n      memory::mark_as_aligned(src);\n      \n      arrayops::inplace_mul_base(dest, src, n_elem);\n      }\n    else\n      {\n      arrayops::inplace_mul_base(dest, src, n_elem);\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_div(eT* dest, const eT* src, const uword n_elem)\n  {\n  if(memory::is_aligned(dest))\n    {\n    memory::mark_as_aligned(dest);\n    \n    if(memory::is_aligned(src))\n      {\n      memory::mark_as_aligned(src);\n      \n      arrayops::inplace_div_base(dest, src, n_elem);\n      }\n    else\n      {\n      arrayops::inplace_div_base(dest, src, n_elem);\n      }\n    }\n  else\n    {\n    if(memory::is_aligned(src))\n      {\n      memory::mark_as_aligned(src);\n      \n      arrayops::inplace_div_base(dest, src, n_elem);\n      }\n    else\n      {\n      arrayops::inplace_div_base(dest, src, n_elem);\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_plus_base(eT* dest, const eT* src, const uword n_elem)\n  {\n  #if defined(ARMA_SIMPLE_LOOPS)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      dest[i] += src[i];\n      }\n    }\n  #else\n    {\n    uword i,j;\n    \n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\n      {\n      const eT tmp_i = src[i];\n      const eT tmp_j = src[j];\n      \n      dest[i] += tmp_i;\n      dest[j] += tmp_j;\n      }\n    \n    if(i < n_elem)\n      {\n      dest[i] += src[i];\n      }\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_minus_base(eT* dest, const eT* src, const uword n_elem)\n  {\n  #if defined(ARMA_SIMPLE_LOOPS)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      dest[i] -= src[i];\n      }\n    }\n  #else\n    {\n    uword i,j;\n    \n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\n      {\n      const eT tmp_i = src[i];\n      const eT tmp_j = src[j];\n      \n      dest[i] -= tmp_i;\n      dest[j] -= tmp_j;\n      }\n    \n    if(i < n_elem)\n      {\n      dest[i] -= src[i];\n      }\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_mul_base(eT* dest, const eT* src, const uword n_elem)\n  {\n  #if defined(ARMA_SIMPLE_LOOPS)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      dest[i] *= src[i];\n      }\n    }\n  #else\n    {\n    uword i,j;\n    \n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\n      {\n      const eT tmp_i = src[i];\n      const eT tmp_j = src[j];\n      \n      dest[i] *= tmp_i;\n      dest[j] *= tmp_j;\n      }\n    \n    if(i < n_elem)\n      {\n      dest[i] *= src[i];\n      }\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_div_base(eT* dest, const eT* src, const uword n_elem)\n  {\n  #if defined(ARMA_SIMPLE_LOOPS)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      dest[i] /= src[i];\n      }\n    }\n  #else\n    {\n    uword i,j;\n    \n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\n      {\n      const eT tmp_i = src[i];\n      const eT tmp_j = src[j];\n      \n      dest[i] /= tmp_i;\n      dest[j] /= tmp_j;\n      }\n    \n    if(i < n_elem)\n      {\n      dest[i] /= src[i];\n      }\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_set(eT* dest, const eT val, const uword n_elem)\n  {\n  typedef typename get_pod_type<eT>::result pod_type;\n  \n  if( (n_elem <= 16) && (is_cx<eT>::no) )\n    {\n    arrayops::inplace_set_small(dest, val, n_elem);\n    }\n  else\n    {\n    if( (val == eT(0)) && (std::numeric_limits<eT>::is_integer || (std::numeric_limits<pod_type>::is_iec559 && is_real<pod_type>::value)) )\n      {\n      std::memset(dest, 0, sizeof(eT)*n_elem);\n      }\n    else\n      {\n      if(memory::is_aligned(dest))\n        {\n        memory::mark_as_aligned(dest);\n        \n        arrayops::inplace_set_base(dest, val, n_elem);\n        }\n      else\n        {\n        arrayops::inplace_set_base(dest, val, n_elem);\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_set_base(eT* dest, const eT val, const uword n_elem)\n  {\n  #if defined(ARMA_SIMPLE_LOOPS)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      dest[i] = val;\n      }\n    }\n  #else\n    {\n    uword i,j;\n    \n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\n      {\n      dest[i] = val;\n      dest[j] = val;\n      }\n    \n    if(i < n_elem)\n      {\n      dest[i] = val;\n      }\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_set_small(eT* dest, const eT val, const uword n_elem)\n  {\n  switch(n_elem)\n    {\n    case 16: dest[15] = val;\n    case 15: dest[14] = val;\n    case 14: dest[13] = val;\n    case 13: dest[12] = val;\n    case 12: dest[11] = val;\n    case 11: dest[10] = val;\n    case 10: dest[ 9] = val;\n    case  9: dest[ 8] = val;\n    case  8: dest[ 7] = val;\n    case  7: dest[ 6] = val;\n    case  6: dest[ 5] = val;\n    case  5: dest[ 4] = val;\n    case  4: dest[ 3] = val;\n    case  3: dest[ 2] = val;\n    case  2: dest[ 1] = val;\n    case  1: dest[ 0] = val;\n    default:;\n    }\n  }\n\n\n\ntemplate<typename eT, const uword n_elem>\narma_hot\ninline\nvoid\narrayops::inplace_set_fixed(eT* dest, const eT val)\n  {\n  for(uword i=0; i<n_elem; ++i)\n    {\n    dest[i] = val;\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_plus(eT* dest, const eT val, const uword n_elem)\n  {\n  if(memory::is_aligned(dest))\n    {\n    memory::mark_as_aligned(dest);\n    \n    arrayops::inplace_plus_base(dest, val, n_elem);\n    }\n  else\n    {\n    arrayops::inplace_plus_base(dest, val, n_elem);\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_minus(eT* dest, const eT val, const uword n_elem)\n  {\n  if(memory::is_aligned(dest))\n    {\n    memory::mark_as_aligned(dest);\n    \n    arrayops::inplace_minus_base(dest, val, n_elem);\n    }\n  else\n    {\n    arrayops::inplace_minus_base(dest, val, n_elem);\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_mul(eT* dest, const eT val, const uword n_elem)\n  {\n  if(memory::is_aligned(dest))\n    {\n    memory::mark_as_aligned(dest);\n    \n    arrayops::inplace_mul_base(dest, val, n_elem);\n    }\n  else\n    {\n    arrayops::inplace_mul_base(dest, val, n_elem);\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_div(eT* dest, const eT val, const uword n_elem)\n  {\n  if(memory::is_aligned(dest))\n    {\n    memory::mark_as_aligned(dest);\n    \n    arrayops::inplace_div_base(dest, val, n_elem);\n    }\n  else\n    {\n    arrayops::inplace_div_base(dest, val, n_elem);\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_plus_base(eT* dest, const eT val, const uword n_elem)\n  {\n  #if defined(ARMA_SIMPLE_LOOPS)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      dest[i] += val;\n      }\n    }\n  #else\n    {\n    uword i,j;\n    \n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\n      {\n      dest[i] += val;\n      dest[j] += val;\n      }\n    \n    if(i < n_elem)\n      {\n      dest[i] += val;\n      }\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_minus_base(eT* dest, const eT val, const uword n_elem)\n  {\n  #if defined(ARMA_SIMPLE_LOOPS)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      dest[i] -= val;\n      }\n    }\n  #else\n    {\n    uword i,j;\n    \n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\n      {\n      dest[i] -= val;\n      dest[j] -= val;\n      }\n    \n    if(i < n_elem)\n      {\n      dest[i] -= val;\n      }\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_mul_base(eT* dest, const eT val, const uword n_elem)\n  {\n  #if defined(ARMA_SIMPLE_LOOPS)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      dest[i] *= val;\n      }\n    }\n  #else\n    {\n    uword i,j;\n    \n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\n      {\n      dest[i] *= val;\n      dest[j] *= val;\n      }\n    \n    if(i < n_elem)\n      {\n      dest[i] *= val;\n      }\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\narrayops::inplace_div_base(eT* dest, const eT val, const uword n_elem)\n  {\n  #if defined(ARMA_SIMPLE_LOOPS)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      dest[i] /= val;\n      }\n    }\n  #else\n    {\n    uword i,j;\n    \n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\n      {\n      dest[i] /= val;\n      dest[j] /= val;\n      }\n    \n    if(i < n_elem)\n      {\n      dest[i] /= val;\n      }\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT>\narma_hot\narma_pure\ninline\neT\narrayops::accumulate(const eT* src, const uword n_elem)\n  {\n  #if defined(__FINITE_MATH_ONLY__) && (__FINITE_MATH_ONLY__ > 0)\n    {\n    eT acc = eT(0);\n    \n    if(memory::is_aligned(src))\n      {\n      memory::mark_as_aligned(src);\n      for(uword i=0; i<n_elem; ++i)  { acc += src[i]; }\n      }\n    else\n      {\n      for(uword i=0; i<n_elem; ++i)  { acc += src[i]; }\n      }\n    \n    return acc;\n    }\n  #else\n    {\n    eT acc1 = eT(0);\n    eT acc2 = eT(0);\n    \n    uword j;\n    \n    for(j=1; j<n_elem; j+=2)\n      {\n      acc1 += (*src);  src++;\n      acc2 += (*src);  src++;\n      }\n    \n    if((j-1) < n_elem)\n      {\n      acc1 += (*src);\n      }\n    \n    return acc1 + acc2;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT>\narma_hot\narma_pure\ninline\neT\narrayops::product(const eT* src, const uword n_elem)\n  {\n  eT val1 = eT(1);\n  eT val2 = eT(1);\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    val1 *= src[i];\n    val2 *= src[j];\n    }\n  \n  if(i < n_elem)\n    {\n    val1 *= src[i];\n    }\n  \n  return val1 * val2;\n  }\n\n\n\ntemplate<typename eT>\narma_hot\narma_pure\ninline\nbool\narrayops::is_finite(const eT* src, const uword n_elem)\n  {\n  uword j;\n  \n  for(j=1; j<n_elem; j+=2)\n    {\n    const eT val_i = (*src);  src++;\n    const eT val_j = (*src);  src++;\n    \n    if( (arma_isfinite(val_i) == false) || (arma_isfinite(val_j) == false) )\n      {\n      return false;\n      }\n    }\n  \n  if((j-1) < n_elem)\n    {\n    if(arma_isfinite(*src) == false)\n      {\n      return false;\n      }\n    }\n  \n  return true;\n  }\n\n\n\ntemplate<typename eT>\narma_hot\narma_pure\ninline\nbool\narrayops::has_inf(const eT* src, const uword n_elem)\n  {\n  uword j;\n  \n  for(j=1; j<n_elem; j+=2)\n    {\n    const eT val_i = (*src);  src++;\n    const eT val_j = (*src);  src++;\n    \n    if( arma_isinf(val_i) || arma_isinf(val_j) )  { return true; }\n    }\n  \n  if((j-1) < n_elem)\n    {\n    if(arma_isinf(*src))  { return true; }\n    }\n  \n  return false;\n  }\n\n\n\ntemplate<typename eT>\narma_hot\narma_pure\ninline\nbool\narrayops::has_nan(const eT* src, const uword n_elem)\n  {\n  uword j;\n  \n  for(j=1; j<n_elem; j+=2)\n    {\n    const eT val_i = (*src);  src++;\n    const eT val_j = (*src);  src++;\n    \n    if( arma_isnan(val_i) || arma_isnan(val_j) )  { return true; }\n    }\n  \n  if((j-1) < n_elem)\n    {\n    if(arma_isnan(*src))  { return true; }\n    }\n  \n  return false;\n  }\n\n\n\n// TODO: this function is currently not used\ntemplate<typename eT>\narma_hot\narma_pure\ninline\ntypename get_pod_type<eT>::result\narrayops::norm_1(const eT* src, const uword n_elem)\n  {\n  typedef typename get_pod_type<eT>::result T;\n  \n  T acc = T(0);\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    acc += std::abs(src[i]);\n    acc += std::abs(src[j]);\n    }\n  \n  if(i < n_elem)\n    {\n    acc += std::abs(src[i]);\n    }\n  \n  return acc;\n  }\n\n\n\n// TODO: this function is currently not used\ntemplate<typename eT>\narma_hot\narma_pure\ninline\neT\narrayops::norm_2(const eT* src, const uword n_elem, const typename arma_not_cx<eT>::result* junk)\n  {\n  arma_ignore(junk);\n  \n  eT acc = eT(0);\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    const eT tmp_i = src[i];\n    const eT tmp_j = src[j];\n    \n    acc += tmp_i * tmp_i;\n    acc += tmp_j * tmp_j;\n    }\n  \n  if(i < n_elem)\n    {\n    const eT tmp_i = src[i];\n    \n    acc += tmp_i * tmp_i;\n    }\n  \n  return std::sqrt(acc);\n  }\n\n\n\n// TODO: this function is currently not used\ntemplate<typename T>\narma_hot\narma_pure\ninline\nT\narrayops::norm_2(const std::complex<T>* src, const uword n_elem)\n  {\n  T acc = T(0);\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    const T tmp_i = std::abs(src[i]);\n    const T tmp_j = std::abs(src[j]);\n    \n    acc += tmp_i * tmp_i;\n    acc += tmp_j * tmp_j;\n    }\n  \n  if(i < n_elem)\n    {\n    const T tmp_i = std::abs(src[i]);\n    \n    acc += tmp_i * tmp_i;\n    }\n  \n  return std::sqrt(acc);\n  }\n\n\n\n// TODO: this function is currently not used\ntemplate<typename eT>\narma_hot\narma_pure\ninline\ntypename get_pod_type<eT>::result\narrayops::norm_k(const eT* src, const uword n_elem, const int k)\n  {\n  typedef typename get_pod_type<eT>::result T;\n  \n  T acc = T(0);\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    acc += std::pow(std::abs(src[i]), k);\n    acc += std::pow(std::abs(src[j]), k);\n    }\n  \n  if(i < n_elem)\n    {\n    acc += std::pow(std::abs(src[i]), k);\n    }\n  \n  return std::pow(acc, T(1)/T(k));\n  }\n\n\n\n// TODO: this function is currently not used\ntemplate<typename eT>\narma_hot\narma_pure\ninline\ntypename get_pod_type<eT>::result\narrayops::norm_max(const eT* src, const uword n_elem)\n  {\n  typedef typename get_pod_type<eT>::result T;\n  \n  T max_val = std::abs(src[0]);\n  \n  uword i,j;\n  \n  for(i=1, j=2; j<n_elem; i+=2, j+=2)\n    {\n    const T tmp_i = std::abs(src[i]);\n    const T tmp_j = std::abs(src[j]);\n    \n    if(max_val < tmp_i) { max_val = tmp_i; }\n    if(max_val < tmp_j) { max_val = tmp_j; }\n    }\n  \n  if(i < n_elem)\n    {\n    const T tmp_i = std::abs(src[i]);\n    \n    if(max_val < tmp_i) { max_val = tmp_i; }\n    }\n  \n  return max_val;\n  }\n\n\n\n// TODO: this function is currently not used\ntemplate<typename eT>\narma_hot\narma_pure\ninline\ntypename get_pod_type<eT>::result\narrayops::norm_min(const eT* src, const uword n_elem)\n  {\n  typedef typename get_pod_type<eT>::result T;\n  \n  T min_val = std::abs(src[0]);\n  \n  uword i,j;\n  \n  for(i=1, j=2; j<n_elem; i+=2, j+=2)\n    {\n    const T tmp_i = std::abs(src[i]);\n    const T tmp_j = std::abs(src[j]);\n    \n    if(min_val > tmp_i) { min_val = tmp_i; }\n    if(min_val > tmp_j) { min_val = tmp_j; }\n    }\n  \n  if(i < n_elem)\n    {\n    const T tmp_i = std::abs(src[i]);\n    \n    if(min_val > tmp_i) { min_val = tmp_i; }\n    }\n  \n  return min_val;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/atlas_bones.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n#ifdef ARMA_USE_ATLAS\n\n\n//! \\namespace atlas namespace for ATLAS functions (imported from the global namespace)\nnamespace atlas\n  {\n  \n  using ::CblasColMajor;\n  using ::CblasNoTrans;\n  using ::CblasTrans;\n  using ::CblasConjTrans;\n  using ::CblasLower;\n  using ::CblasUpper;\n  \n  #if defined(ARMA_USE_WRAPPER)\n  extern \"C\"\n    {\n    \n    float  wrapper_cblas_sdot(const int N, const float  *X, const int incX, const float  *Y, const int incY);\n    double wrapper_cblas_ddot(const int N, const double *X, const int incX, const double *Y, const int incY);\n    \n    void wrapper_cblas_cdotu_sub(const int N, const void *X, const int incX, const void *Y, const int incY, void *dotu);\n    void wrapper_cblas_zdotu_sub(const int N, const void *X, const int incX, const void *Y, const int incY, void *dotu);\n    \n    \n    void wrapper_cblas_sgemv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const float alpha,\n                             const float *A, const int lda, const float *X, const int incX, const float beta, float *Y, const int incY);\n    \n    void wrapper_cblas_dgemv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const double alpha,\n                             const double *A, const int lda, const double *X, const int incX, const double beta, double *Y, const int incY);\n    \n    void wrapper_cblas_cgemv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const void *alpha,\n                             const void *A, const int lda, const void *X, const int incX, const void *beta, void *Y, const int incY);\n    \n    void wrapper_cblas_zgemv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const void *alpha,\n                             const void *A, const int lda, const void *X, const int incX, const void *beta, void *Y, const int incY);\n    \n    \n    \n    void wrapper_cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB,\n                             const int M, const int N, const int K, const float alpha,\n                             const float *A, const int lda, const float *B, const int ldb, const float beta, float *C, const int ldc);\n    \n    void wrapper_cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB,\n                             const int M, const int N, const int K, const double alpha,\n                             const double *A, const int lda, const double *B, const int ldb, const double beta, double *C, const int ldc);\n    \n    void wrapper_cblas_cgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB,\n                             const int M, const int N, const int K, const void *alpha,\n                             const void *A, const int lda, const void *B, const int ldb, const void *beta, void *C, const int ldc);\n    \n    void wrapper_cblas_zgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB,\n                             const int M, const int N, const int K, const void *alpha,\n                             const void *A, const int lda, const void *B, const int ldb, const void *beta, void *C, const int ldc);\n    \n    \n    \n    void wrapper_cblas_ssyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans,\n                             const int N, const int K, const float alpha,\n                             const float *A, const int lda, const float beta, float *C, const int ldc);\n    \n    void wrapper_cblas_dsyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans,\n                             const int N, const int K, const double alpha,\n                             const double *A, const int lda, const double beta, double *C, const int ldc);\n    \n    \n    \n    void wrapper_cblas_cherk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans,\n                             const int N, const int K, const float alpha,\n                             const void *A, const int lda, const float beta, void *C, const int ldc);\n    \n    void wrapper_cblas_zherk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans,\n                             const int N, const int K, const double alpha,\n                             const void *A, const int lda, const double beta, void *C, const int ldc);\n    \n    \n    \n    int wrapper_clapack_sgetrf(const enum CBLAS_ORDER Order, const int M, const int N, float  *A, const int lda, int *ipiv);\n    int wrapper_clapack_dgetrf(const enum CBLAS_ORDER Order, const int M, const int N, double *A, const int lda, int *ipiv);\n    int wrapper_clapack_cgetrf(const enum CBLAS_ORDER Order, const int M, const int N, void   *A, const int lda, int *ipiv);\n    int wrapper_clapack_zgetrf(const enum CBLAS_ORDER Order, const int M, const int N, void   *A, const int lda, int *ipiv);\n    \n    int wrapper_clapack_sgetri(const enum CBLAS_ORDER Order, const int N, float  *A, const int lda, const int *ipiv);\n    int wrapper_clapack_dgetri(const enum CBLAS_ORDER Order, const int N, double *A, const int lda, const int *ipiv);\n    int wrapper_clapack_cgetri(const enum CBLAS_ORDER Order, const int N, void   *A, const int lda, const int *ipiv);\n    int wrapper_clapack_zgetri(const enum CBLAS_ORDER Order, const int N, void   *A, const int lda, const int *ipiv);\n\n    int wrapper_clapack_sgesv(const enum CBLAS_ORDER Order, const int N, const int NRHS, float  *A, const int lda, int *ipiv, float  *B, const int ldb);\n    int wrapper_clapack_dgesv(const enum CBLAS_ORDER Order, const int N, const int NRHS, double *A, const int lda, int *ipiv, double *B, const int ldb);\n    int wrapper_clapack_cgesv(const enum CBLAS_ORDER Order, const int N, const int NRHS, void   *A, const int lda, int *ipiv, void   *B, const int ldb);\n    int wrapper_clapack_zgesv(const enum CBLAS_ORDER Order, const int N, const int NRHS, void   *A, const int lda, int *ipiv, void   *B, const int ldb);\n    \n    }\n  #endif\n  \n  }\n\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/atlas_wrapper.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n#ifdef ARMA_USE_ATLAS\n\n\n//! \\namespace atlas namespace for ATLAS functions (imported from the global namespace)\nnamespace atlas\n  {\n  \n  template<typename eT>\n  inline static const eT& tmp_real(const eT& X)              { return X; }\n  \n  template<typename T>\n  inline static const  T  tmp_real(const std::complex<T>& X) { return X.real(); }\n  \n  \n  \n  template<typename eT>\n  arma_inline\n  eT\n  cblas_dot(const int N, const eT* X, const eT* Y)\n    {\n    arma_type_check((is_supported_blas_type<eT>::value == false));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      return eT( arma_wrapper(cblas_sdot)(N, (const T*)X, 1, (const T*)Y, 1) );\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      return eT( arma_wrapper(cblas_ddot)(N, (const T*)X, 1, (const T*)Y, 1) );\n      }\n    else\n      {\n      return eT(0);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  arma_inline\n  eT\n  cx_cblas_dot(const int N, const eT* X, const eT* Y)\n    {\n    arma_type_check((is_supported_blas_type<eT>::value == false));\n    \n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef typename std::complex<float> T;\n      \n      T out;    \n      arma_wrapper(cblas_cdotu_sub)(N, (const T*)X, 1, (const T*)Y, 1, &out);\n      \n      return eT(out);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef typename std::complex<double> T;\n      \n      T out;\n      arma_wrapper(cblas_zdotu_sub)(N, (const T*)X, 1, (const T*)Y, 1, &out);\n      \n      return eT(out);\n      }\n    else\n      {\n      return eT(0);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  cblas_gemv\n    (\n    const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,\n    const int M, const int N,\n    const eT alpha,\n    const eT *A, const int lda,\n    const eT *X, const int incX,\n    const eT beta,\n    eT *Y, const int incY\n    )\n    {\n    arma_type_check((is_supported_blas_type<eT>::value == false));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_wrapper(cblas_sgemv)(Order, TransA, M, N, (const T)tmp_real(alpha), (const T*)A, lda, (const T*)X, incX, (const T)tmp_real(beta), (T*)Y, incY);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_wrapper(cblas_dgemv)(Order, TransA, M, N, (const T)tmp_real(alpha), (const T*)A, lda, (const T*)X, incX, (const T)tmp_real(beta), (T*)Y, incY);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      arma_wrapper(cblas_cgemv)(Order, TransA, M, N, (const T*)&alpha, (const T*)A, lda, (const T*)X, incX, (const T*)&beta, (T*)Y, incY);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      arma_wrapper(cblas_zgemv)(Order, TransA, M, N, (const T*)&alpha, (const T*)A, lda, (const T*)X, incX, (const T*)&beta, (T*)Y, incY);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  cblas_gemm\n    (\n    const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,\n    const enum CBLAS_TRANSPOSE TransB, const int M, const int N,\n    const int K, const eT alpha, const eT *A,\n    const int lda, const eT *B, const int ldb,\n    const eT beta, eT *C, const int ldc\n    )\n    {\n    arma_type_check((is_supported_blas_type<eT>::value == false));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_wrapper(cblas_sgemm)(Order, TransA, TransB, M, N, K, (const T)tmp_real(alpha), (const T*)A, lda, (const T*)B, ldb, (const T)tmp_real(beta), (T*)C, ldc);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_wrapper(cblas_dgemm)(Order, TransA, TransB, M, N, K, (const T)tmp_real(alpha), (const T*)A, lda, (const T*)B, ldb, (const T)tmp_real(beta), (T*)C, ldc);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      arma_wrapper(cblas_cgemm)(Order, TransA, TransB, M, N, K, (const T*)&alpha, (const T*)A, lda, (const T*)B, ldb, (const T*)&beta, (T*)C, ldc);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      arma_wrapper(cblas_zgemm)(Order, TransA, TransB, M, N, K, (const T*)&alpha, (const T*)A, lda, (const T*)B, ldb, (const T*)&beta, (T*)C, ldc);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  cblas_syrk\n    (\n    const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans,\n    const int N, const int K, const eT alpha,\n    const eT* A, const int lda, const eT beta, eT* C, const int ldc\n    )\n    {\n    arma_type_check((is_supported_blas_type<eT>::value == false));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_wrapper(cblas_ssyrk)(Order, Uplo, Trans, N, K, (const T)alpha, (const T*)A, lda, (const T)beta, (T*)C, ldc);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_wrapper(cblas_dsyrk)(Order, Uplo, Trans, N, K, (const T)alpha, (const T*)A, lda, (const T)beta, (T*)C, ldc);\n      }\n    }\n  \n  \n  \n  template<typename T>\n  inline\n  void\n  cblas_herk\n    (\n    const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans,\n    const int N, const int K, const T alpha,\n    const std::complex<T>* A, const int lda, const T beta, std::complex<T>* C, const int ldc\n    )\n    {\n    arma_type_check((is_supported_blas_type<T>::value == false));\n    \n    if(is_float<T>::value)\n      {\n      typedef float                  TT;\n      typedef std::complex<float> cx_TT;\n      \n      arma_wrapper(cblas_cherk)(Order, Uplo, Trans, N, K, (const TT)alpha, (const cx_TT*)A, lda, (const TT)beta, (cx_TT*)C, ldc);\n      }\n    else\n    if(is_double<T>::value)\n      {\n      typedef double                  TT;\n      typedef std::complex<double> cx_TT;\n      \n      arma_wrapper(cblas_zherk)(Order, Uplo, Trans, N, K, (const TT)alpha, (const cx_TT*)A, lda, (const TT)beta, (cx_TT*)C, ldc);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  int\n  clapack_getrf\n    (\n    const enum CBLAS_ORDER Order, const int M, const int N,\n    eT *A, const int lda, int *ipiv\n    )\n    {\n    arma_type_check((is_supported_blas_type<eT>::value == false));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      return arma_wrapper(clapack_sgetrf)(Order, M, N, (T*)A, lda, ipiv);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      return arma_wrapper(clapack_dgetrf)(Order, M, N, (T*)A, lda, ipiv);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      return arma_wrapper(clapack_cgetrf)(Order, M, N, (T*)A, lda, ipiv);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      return arma_wrapper(clapack_zgetrf)(Order, M, N, (T*)A, lda, ipiv);\n      }\n    else\n      {\n      return -1;\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  int\n  clapack_getri\n    (\n    const enum CBLAS_ORDER Order, const int N, eT *A,\n    const int lda, const int *ipiv\n    )\n    {\n    arma_type_check((is_supported_blas_type<eT>::value == false));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      return arma_wrapper(clapack_sgetri)(Order, N, (T*)A, lda, ipiv);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      return arma_wrapper(clapack_dgetri)(Order, N, (T*)A, lda, ipiv);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      return arma_wrapper(clapack_cgetri)(Order, N, (T*)A, lda, ipiv);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      return arma_wrapper(clapack_zgetri)(Order, N, (T*)A, lda, ipiv);\n      }\n    else\n      {\n      return -1;\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  int\n  clapack_gesv\n    (\n    const enum CBLAS_ORDER Order,\n    const int N, const int NRHS,\n    eT* A, const int lda, int* ipiv,\n    eT* B, const int ldb\n    )\n    {\n    arma_type_check((is_supported_blas_type<eT>::value == false));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      return arma_wrapper(clapack_sgesv)(Order, N, NRHS, (T*)A, lda, ipiv, (T*)B, ldb);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      return arma_wrapper(clapack_dgesv)(Order, N, NRHS, (T*)A, lda, ipiv, (T*)B, ldb);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      return arma_wrapper(clapack_cgesv)(Order, N, NRHS, (T*)A, lda, ipiv, (T*)B, ldb);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      return arma_wrapper(clapack_zgesv)(Order, N, NRHS, (T*)A, lda, ipiv, (T*)B, ldb);\n      }\n    else\n      {\n      return -1;\n      }\n    }\n\n\n\n  }\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/auxlib_bones.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// Copyright (C) 2009 Edmund Highcock\n// Copyright (C) 2011 James Sanders\n// Copyright (C) 2012 Eric Jon Sundstrom\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup auxlib\n//! @{\n\n\n//! wrapper for accessing external functions defined in ATLAS, LAPACK or BLAS libraries\nclass auxlib\n  {\n  public:\n  \n  \n  template<const uword row, const uword col>\n  struct pos\n    {\n    static const uword n2 = row + col*2;\n    static const uword n3 = row + col*3;\n    static const uword n4 = row + col*4;\n    };\n  \n  \n  //\n  // inv\n  \n  template<typename eT, typename T1>\n  inline static bool inv(Mat<eT>& out, const Base<eT,T1>& X, const bool slow = false);\n  \n  template<typename eT>\n  inline static bool inv(Mat<eT>& out, const Mat<eT>& A, const bool slow = false);\n  \n  template<typename eT>\n  inline static bool inv_noalias_tinymat(Mat<eT>& out, const Mat<eT>& X, const uword N);\n  \n  template<typename eT>\n  inline static bool inv_inplace_lapack(Mat<eT>& out);\n  \n  \n  //\n  // inv_tr\n  \n  template<typename eT, typename T1>\n  inline static bool inv_tr(Mat<eT>& out, const Base<eT,T1>& X, const uword layout);\n  \n  \n  //\n  // inv_sym\n  \n  template<typename eT, typename T1>\n  inline static bool inv_sym(Mat<eT>& out, const Base<eT,T1>& X, const uword layout);\n  \n  \n  //\n  // inv_sympd\n  \n  template<typename eT, typename T1>\n  inline static bool inv_sympd(Mat<eT>& out, const Base<eT,T1>& X, const uword layout);\n  \n  \n  //\n  // det\n  \n  template<typename eT, typename T1>\n  inline static eT det(const Base<eT,T1>& X, const bool slow = false);\n  \n  template<typename eT>\n  inline static eT det_tinymat(const Mat<eT>& X, const uword N);\n  \n  template<typename eT>\n  inline static eT det_lapack(const Mat<eT>& X, const bool make_copy);\n  \n  \n  //\n  // log_det\n  \n  template<typename eT, typename T1>\n  inline static bool log_det(eT& out_val, typename get_pod_type<eT>::result& out_sign, const Base<eT,T1>& X);\n  \n  \n  //\n  // lu\n  \n  template<typename eT, typename T1>\n  inline static bool lu(Mat<eT>& L, Mat<eT>& U, podarray<blas_int>& ipiv, const Base<eT,T1>& X);\n  \n  template<typename eT, typename T1>\n  inline static bool lu(Mat<eT>& L, Mat<eT>& U, Mat<eT>& P, const Base<eT,T1>& X);\n  \n  template<typename eT, typename T1>\n  inline static bool lu(Mat<eT>& L, Mat<eT>& U, const Base<eT,T1>& X);\n  \n  \n  //\n  // eig_sym\n  \n  template<typename eT, typename T1> \n  inline static bool eig_sym(Col<eT>& eigval, const Base<eT,T1>& X);\n  \n  template<typename T, typename T1> \n  inline static bool eig_sym(Col<T>& eigval, const Base<std::complex<T>,T1>& X);\n  \n  template<typename eT, typename T1>\n  inline static bool eig_sym(Col<eT>& eigval, Mat<eT>& eigvec, const Base<eT,T1>& X);\n  \n  template<typename T, typename T1>\n  inline static bool eig_sym(Col<T>& eigval, Mat< std::complex<T> >& eigvec, const Base<std::complex<T>,T1>& X);\n  \n  template<typename eT, typename T1>\n  inline static bool eig_sym_dc(Col<eT>& eigval, Mat<eT>& eigvec, const Base<eT,T1>& X);\n  \n  template<typename T, typename T1>\n  inline static bool eig_sym_dc(Col<T>& eigval, Mat< std::complex<T> >& eigvec, const Base<std::complex<T>,T1>& X);\n  \n  \n  //\n  // eig_gen\n  \n  template<typename T, typename T1>\n  inline static bool eig_gen(Col< std::complex<T> >& eigval, Mat<T>& l_eigvec, Mat<T>& r_eigvec, const Base<T,T1>& X, const char side);\n  \n  template<typename T, typename T1>\n  inline static bool eig_gen(Col< std::complex<T> >& eigval, Mat< std::complex<T> >& l_eigvec, Mat< std::complex<T> >& r_eigvec, const Base< std::complex<T>, T1 >& X, const char side);\n  \n  \n  //\n  // eig_pair\n  \n  template<typename T, typename T1, typename T2>\n  inline static bool eig_pair(Col< std::complex<T> >& eigval, Mat<T>& l_eigvec, Mat<T>& r_eigvec, const Base<T,T1>& X, const Base<T,T2>& Y, const char side);\n  \n  template<typename T, typename T1, typename T2>\n  inline static bool eig_pair(Col< std::complex<T> >& eigval, Mat< std::complex<T> >& l_eigvec, Mat< std::complex<T> >& r_eigvec, const Base< std::complex<T>, T1 >& X, const Base< std::complex<T>, T2 >& Y, const char side);\n  \n  \n  //\n  // chol\n  \n  template<typename eT, typename T1>\n  inline static bool chol(Mat<eT>& out, const Base<eT,T1>& X, const uword layout);\n  \n  \n  //\n  // qr\n  \n  template<typename eT, typename T1>\n  inline static bool qr(Mat<eT>& Q, Mat<eT>& R, const Base<eT,T1>& X);\n  \n  template<typename eT, typename T1>\n  inline static bool qr_econ(Mat<eT>& Q, Mat<eT>& R, const Base<eT,T1>& X);\n  \n  \n  //\n  // svd\n  \n  template<typename eT, typename T1>\n  inline static bool svd(Col<eT>& S, const Base<eT,T1>& X, uword& n_rows, uword& n_cols);\n  \n  template<typename T, typename T1>\n  inline static bool svd(Col<T>& S, const Base<std::complex<T>, T1>& X, uword& n_rows, uword& n_cols);\n  \n  template<typename eT, typename T1>\n  inline static bool svd(Col<eT>& S, const Base<eT,T1>& X);\n  \n  template<typename T, typename T1>\n  inline static bool svd(Col<T>& S, const Base<std::complex<T>, T1>& X);\n  \n  template<typename eT, typename T1>\n  inline static bool svd(Mat<eT>& U, Col<eT>& S, Mat<eT>& V, const Base<eT,T1>& X);\n  \n  template<typename T, typename T1>\n  inline static bool svd(Mat< std::complex<T> >& U, Col<T>& S, Mat< std::complex<T> >& V, const Base< std::complex<T>, T1>& X);\n  \n  template<typename eT, typename T1>\n  inline static bool svd_econ(Mat<eT>& U, Col<eT>& S, Mat<eT>& V, const Base<eT,T1>& X, const char mode);\n  \n  template<typename T, typename T1>\n  inline static bool svd_econ(Mat< std::complex<T> >& U, Col<T>& S, Mat< std::complex<T> >& V, const Base< std::complex<T>, T1>& X, const char mode);\n  \n  \n  // EXPERIMENTAL\n  template<typename eT, typename T1>\n  inline static bool svd_dc(Col<eT>& S, const Base<eT,T1>& X, uword& n_rows, uword& n_cols);\n  \n  // EXPERIMENTAL\n  template<typename T, typename T1>\n  inline static bool svd_dc(Col<T>& S, const Base<std::complex<T>, T1>& X, uword& n_rows, uword& n_cols);\n  \n  // EXPERIMENTAL\n  template<typename eT, typename T1>\n  inline static bool svd_dc(Col<eT>& S, const Base<eT,T1>& X);\n  \n  // EXPERIMENTAL\n  template<typename T, typename T1>\n  inline static bool svd_dc(Col<T>& S, const Base<std::complex<T>, T1>& X);\n  \n  \n  template<typename eT, typename T1>\n  inline static bool svd_dc(Mat<eT>& U, Col<eT>& S, Mat<eT>& V, const Base<eT,T1>& X);\n  \n  template<typename T, typename T1>\n  inline static bool svd_dc(Mat< std::complex<T> >& U, Col<T>& S, Mat< std::complex<T> >& V, const Base< std::complex<T>, T1>& X);\n  \n  template<typename eT, typename T1>\n  inline static bool svd_dc_econ(Mat<eT>& U, Col<eT>& S, Mat<eT>& V, const Base<eT,T1>& X);\n  \n  template<typename T, typename T1>\n  inline static bool svd_dc_econ(Mat< std::complex<T> >& U, Col<T>& S, Mat< std::complex<T> >& V, const Base< std::complex<T>, T1>& X);\n  \n  \n  //\n  // solve\n  \n  template<typename eT, typename T1>\n  inline static bool solve   (Mat<eT>& out, Mat<eT>& A, const Base<eT,T1>& X, const bool slow = false);\n  \n  template<typename eT, typename T1>\n  inline static bool solve_od(Mat<eT>& out, Mat<eT>& A, const Base<eT,T1>& X);\n  \n  template<typename eT, typename T1>\n  inline static bool solve_ud(Mat<eT>& out, Mat<eT>& A, const Base<eT,T1>& X);\n  \n  \n  //\n  // solve_tr\n  \n  template<typename eT>\n  inline static bool solve_tr(Mat<eT>& out, const Mat<eT>& A, const Mat<eT>& B, const uword layout);\n\n\n  //\n  // Schur decomposition\n  \n  template<typename eT>\n  inline static bool schur_dec(Mat<eT>& Z, Mat<eT>& T, const Mat<eT>& A);\n  \n  template<typename cT>\n  inline static bool schur_dec(Mat<std::complex<cT> >& Z, Mat<std::complex<cT> >& T, const Mat<std::complex<cT> >& A);\n  \n  \n  //\n  // syl (solution of the Sylvester equation AX + XB = C)\n  \n  template<typename eT>\n  inline static bool syl(Mat<eT>& X, const Mat<eT>& A, const Mat<eT>& B, const Mat<eT>& C);\n  \n  \n  //\n  // lyap (solution of the continuous Lyapunov equation AX + XA^H + Q = 0)\n  \n  template<typename eT>\n  inline static bool lyap(Mat<eT>& X, const Mat<eT>& A, const Mat<eT>& Q);\n  \n  \n  //\n  // dlyap (solution of the discrete Lyapunov equation AXA^H - X + Q = 0)\n  \n  template<typename eT>\n  inline static bool dlyap(Mat<eT>& X, const Mat<eT>& A, const Mat<eT>& Q);\n  \n  \n  //\n  // QZ decomposition\n  \n  template<typename T, typename T1, typename T2>\n  inline static bool qz(Mat<T>& A, Mat<T>& B, Mat<T>& vsl, Mat<T>& vsr, const Base<T,T1>& X, const Base<T,T2>& Y, const char side);\n  \n  template<typename T, typename T1, typename T2>\n  inline static bool qz(Mat< std::complex<T> >& A, Mat< std::complex<T> >& B, Mat< std::complex<T> >& vsl, Mat< std::complex<T> >& vsr, const Base< std::complex<T>, T1 >& X, const Base< std::complex<T>, T2 >& Y, const char side);\n  \n  \n  };\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/auxlib_meat.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// Copyright (C) 2009 Edmund Highcock\n// Copyright (C) 2011 James Sanders\n// Copyright (C) 2011 Stanislav Funiak\n// Copyright (C) 2012 Eric Jon Sundstrom\n// Copyright (C) 2012 Michael McNeil Forbes\n// Copyright (C) 2015 Keith O'Hara\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup auxlib\n//! @{\n\n\n\n//! immediate matrix inverse\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::inv(Mat<eT>& out, const Base<eT,T1>& X, const bool slow)\n  {\n  arma_extra_debug_sigprint();\n  \n  out = X.get_ref();\n  \n  arma_debug_check( (out.is_square() == false), \"inv(): given matrix is not square\" );\n  \n  bool status = false;\n  \n  const uword N = out.n_rows;\n  \n  if( (N <= 4) && (slow == false) )\n    {\n    Mat<eT> tmp(N,N);\n    \n    status = auxlib::inv_noalias_tinymat(tmp, out, N);\n    \n    if(status == true)\n      {\n      arrayops::copy( out.memptr(), tmp.memptr(), tmp.n_elem );\n      }\n    }\n  \n  if( (N > 4) || (status == false) )\n    {\n    status = auxlib::inv_inplace_lapack(out);\n    }\n  \n  return status;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nauxlib::inv(Mat<eT>& out, const Mat<eT>& X, const bool slow)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (X.is_square() == false), \"inv(): given matrix is not square\" );\n  \n  bool status = false;\n  \n  const uword N = X.n_rows;\n  \n  if( (N <= 4) && (slow == false) )\n    {\n    if(&out != &X)\n      {\n      out.set_size(N,N);\n      \n      status = auxlib::inv_noalias_tinymat(out, X, N);\n      }\n    else\n      {\n      Mat<eT> tmp(N,N);\n      \n      status = auxlib::inv_noalias_tinymat(tmp, X, N);\n      \n      if(status == true)\n        {\n        arrayops::copy( out.memptr(), tmp.memptr(), tmp.n_elem );\n        }\n      }\n    }\n  \n  if( (N > 4) || (status == false) )\n    {\n    out = X;\n    status = auxlib::inv_inplace_lapack(out);\n    }\n  \n  return status;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nauxlib::inv_noalias_tinymat(Mat<eT>& out, const Mat<eT>& X, const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  const T det_min = (is_float<T>::value) ? T(1e-19) : T(1e-154);\n  \n  bool calc_ok = true;\n  \n  const eT* Xm   =   X.memptr();\n        eT* outm = out.memptr();  // NOTE: the output matrix is assumed to have the correct size\n        \n  switch(N)\n    {\n    case 1:\n      {\n      outm[0] = eT(1) / Xm[0];\n      };\n      break;\n      \n    case 2:\n      {\n      const eT a = Xm[pos<0,0>::n2];\n      const eT b = Xm[pos<0,1>::n2];\n      const eT c = Xm[pos<1,0>::n2];\n      const eT d = Xm[pos<1,1>::n2];\n      \n      const eT det_val = (a*d - b*c);\n      \n      if(std::abs(det_val) >= det_min)\n        {\n        outm[pos<0,0>::n2] =  d / det_val;\n        outm[pos<0,1>::n2] = -b / det_val;\n        outm[pos<1,0>::n2] = -c / det_val;\n        outm[pos<1,1>::n2] =  a / det_val;\n        }\n      else\n        {\n        calc_ok = false;\n        }\n      };\n      break;\n    \n    case 3:\n      {\n      const eT det_val = auxlib::det_tinymat(X,3);\n      \n      if(std::abs(det_val) >= det_min)\n        {\n        outm[pos<0,0>::n3] =  (Xm[pos<2,2>::n3]*Xm[pos<1,1>::n3] - Xm[pos<2,1>::n3]*Xm[pos<1,2>::n3]) / det_val;\n        outm[pos<1,0>::n3] = -(Xm[pos<2,2>::n3]*Xm[pos<1,0>::n3] - Xm[pos<2,0>::n3]*Xm[pos<1,2>::n3]) / det_val;\n        outm[pos<2,0>::n3] =  (Xm[pos<2,1>::n3]*Xm[pos<1,0>::n3] - Xm[pos<2,0>::n3]*Xm[pos<1,1>::n3]) / det_val;\n        \n        outm[pos<0,1>::n3] = -(Xm[pos<2,2>::n3]*Xm[pos<0,1>::n3] - Xm[pos<2,1>::n3]*Xm[pos<0,2>::n3]) / det_val;\n        outm[pos<1,1>::n3] =  (Xm[pos<2,2>::n3]*Xm[pos<0,0>::n3] - Xm[pos<2,0>::n3]*Xm[pos<0,2>::n3]) / det_val;\n        outm[pos<2,1>::n3] = -(Xm[pos<2,1>::n3]*Xm[pos<0,0>::n3] - Xm[pos<2,0>::n3]*Xm[pos<0,1>::n3]) / det_val;\n        \n        outm[pos<0,2>::n3] =  (Xm[pos<1,2>::n3]*Xm[pos<0,1>::n3] - Xm[pos<1,1>::n3]*Xm[pos<0,2>::n3]) / det_val;\n        outm[pos<1,2>::n3] = -(Xm[pos<1,2>::n3]*Xm[pos<0,0>::n3] - Xm[pos<1,0>::n3]*Xm[pos<0,2>::n3]) / det_val;\n        outm[pos<2,2>::n3] =  (Xm[pos<1,1>::n3]*Xm[pos<0,0>::n3] - Xm[pos<1,0>::n3]*Xm[pos<0,1>::n3]) / det_val;\n        \n        const eT check_val = Xm[pos<0,0>::n3]*outm[pos<0,0>::n3] + Xm[pos<0,1>::n3]*outm[pos<1,0>::n3] + Xm[pos<0,2>::n3]*outm[pos<2,0>::n3];\n        \n        const  T max_diff  = (is_float<T>::value) ? T(1e-4) : T(1e-10);\n        \n        if(std::abs(T(1) - check_val) > max_diff)\n          {\n          calc_ok = false;\n          }\n        }\n      else\n        {\n        calc_ok = false;\n        }\n      };\n      break;\n    \n    case 4:\n      {\n      const eT det_val = auxlib::det_tinymat(X,4);\n      \n      if(std::abs(det_val) >= det_min)\n        {\n        outm[pos<0,0>::n4] = ( Xm[pos<1,2>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,1>::n4] - Xm[pos<1,3>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,1>::n4] + Xm[pos<1,3>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,2>::n4] - Xm[pos<1,1>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,2>::n4] - Xm[pos<1,2>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,3>::n4] + Xm[pos<1,1>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,3>::n4] ) / det_val;\n        outm[pos<1,0>::n4] = ( Xm[pos<1,3>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,0>::n4] - Xm[pos<1,2>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,0>::n4] - Xm[pos<1,3>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,2>::n4] + Xm[pos<1,0>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,2>::n4] + Xm[pos<1,2>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,3>::n4] - Xm[pos<1,0>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,3>::n4] ) / det_val;\n        outm[pos<2,0>::n4] = ( Xm[pos<1,1>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,0>::n4] - Xm[pos<1,3>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,0>::n4] + Xm[pos<1,3>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,1>::n4] - Xm[pos<1,0>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,1>::n4] - Xm[pos<1,1>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,3>::n4] + Xm[pos<1,0>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,3>::n4] ) / det_val;\n        outm[pos<3,0>::n4] = ( Xm[pos<1,2>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,0>::n4] - Xm[pos<1,1>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,0>::n4] - Xm[pos<1,2>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,1>::n4] + Xm[pos<1,0>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,1>::n4] + Xm[pos<1,1>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,2>::n4] - Xm[pos<1,0>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,2>::n4] ) / det_val;\n        \n        outm[pos<0,1>::n4] = ( Xm[pos<0,3>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,1>::n4] - Xm[pos<0,2>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,1>::n4] - Xm[pos<0,3>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,2>::n4] + Xm[pos<0,1>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,2>::n4] + Xm[pos<0,2>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,3>::n4] - Xm[pos<0,1>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,3>::n4] ) / det_val;\n        outm[pos<1,1>::n4] = ( Xm[pos<0,2>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,3>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,0>::n4] + Xm[pos<0,3>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,2>::n4] - Xm[pos<0,0>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,2>::n4] - Xm[pos<0,2>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,3>::n4] + Xm[pos<0,0>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,3>::n4] ) / det_val;\n        outm[pos<2,1>::n4] = ( Xm[pos<0,3>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,1>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,3>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,1>::n4] + Xm[pos<0,0>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,1>::n4] + Xm[pos<0,1>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,3>::n4] - Xm[pos<0,0>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,3>::n4] ) / det_val;\n        outm[pos<3,1>::n4] = ( Xm[pos<0,1>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,2>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,0>::n4] + Xm[pos<0,2>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,1>::n4] - Xm[pos<0,0>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,1>::n4] - Xm[pos<0,1>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,2>::n4] + Xm[pos<0,0>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,2>::n4] ) / det_val;\n        \n        outm[pos<0,2>::n4] = ( Xm[pos<0,2>::n4]*Xm[pos<1,3>::n4]*Xm[pos<3,1>::n4] - Xm[pos<0,3>::n4]*Xm[pos<1,2>::n4]*Xm[pos<3,1>::n4] + Xm[pos<0,3>::n4]*Xm[pos<1,1>::n4]*Xm[pos<3,2>::n4] - Xm[pos<0,1>::n4]*Xm[pos<1,3>::n4]*Xm[pos<3,2>::n4] - Xm[pos<0,2>::n4]*Xm[pos<1,1>::n4]*Xm[pos<3,3>::n4] + Xm[pos<0,1>::n4]*Xm[pos<1,2>::n4]*Xm[pos<3,3>::n4] ) / det_val;\n        outm[pos<1,2>::n4] = ( Xm[pos<0,3>::n4]*Xm[pos<1,2>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,2>::n4]*Xm[pos<1,3>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,3>::n4]*Xm[pos<1,0>::n4]*Xm[pos<3,2>::n4] + Xm[pos<0,0>::n4]*Xm[pos<1,3>::n4]*Xm[pos<3,2>::n4] + Xm[pos<0,2>::n4]*Xm[pos<1,0>::n4]*Xm[pos<3,3>::n4] - Xm[pos<0,0>::n4]*Xm[pos<1,2>::n4]*Xm[pos<3,3>::n4] ) / det_val;\n        outm[pos<2,2>::n4] = ( Xm[pos<0,1>::n4]*Xm[pos<1,3>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,3>::n4]*Xm[pos<1,1>::n4]*Xm[pos<3,0>::n4] + Xm[pos<0,3>::n4]*Xm[pos<1,0>::n4]*Xm[pos<3,1>::n4] - Xm[pos<0,0>::n4]*Xm[pos<1,3>::n4]*Xm[pos<3,1>::n4] - Xm[pos<0,1>::n4]*Xm[pos<1,0>::n4]*Xm[pos<3,3>::n4] + Xm[pos<0,0>::n4]*Xm[pos<1,1>::n4]*Xm[pos<3,3>::n4] ) / det_val;\n        outm[pos<3,2>::n4] = ( Xm[pos<0,2>::n4]*Xm[pos<1,1>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,1>::n4]*Xm[pos<1,2>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,2>::n4]*Xm[pos<1,0>::n4]*Xm[pos<3,1>::n4] + Xm[pos<0,0>::n4]*Xm[pos<1,2>::n4]*Xm[pos<3,1>::n4] + Xm[pos<0,1>::n4]*Xm[pos<1,0>::n4]*Xm[pos<3,2>::n4] - Xm[pos<0,0>::n4]*Xm[pos<1,1>::n4]*Xm[pos<3,2>::n4] ) / det_val;\n        \n        outm[pos<0,3>::n4] = ( Xm[pos<0,3>::n4]*Xm[pos<1,2>::n4]*Xm[pos<2,1>::n4] - Xm[pos<0,2>::n4]*Xm[pos<1,3>::n4]*Xm[pos<2,1>::n4] - Xm[pos<0,3>::n4]*Xm[pos<1,1>::n4]*Xm[pos<2,2>::n4] + Xm[pos<0,1>::n4]*Xm[pos<1,3>::n4]*Xm[pos<2,2>::n4] + Xm[pos<0,2>::n4]*Xm[pos<1,1>::n4]*Xm[pos<2,3>::n4] - Xm[pos<0,1>::n4]*Xm[pos<1,2>::n4]*Xm[pos<2,3>::n4] ) / det_val;\n        outm[pos<1,3>::n4] = ( Xm[pos<0,2>::n4]*Xm[pos<1,3>::n4]*Xm[pos<2,0>::n4] - Xm[pos<0,3>::n4]*Xm[pos<1,2>::n4]*Xm[pos<2,0>::n4] + Xm[pos<0,3>::n4]*Xm[pos<1,0>::n4]*Xm[pos<2,2>::n4] - Xm[pos<0,0>::n4]*Xm[pos<1,3>::n4]*Xm[pos<2,2>::n4] - Xm[pos<0,2>::n4]*Xm[pos<1,0>::n4]*Xm[pos<2,3>::n4] + Xm[pos<0,0>::n4]*Xm[pos<1,2>::n4]*Xm[pos<2,3>::n4] ) / det_val;\n        outm[pos<2,3>::n4] = ( Xm[pos<0,3>::n4]*Xm[pos<1,1>::n4]*Xm[pos<2,0>::n4] - Xm[pos<0,1>::n4]*Xm[pos<1,3>::n4]*Xm[pos<2,0>::n4] - Xm[pos<0,3>::n4]*Xm[pos<1,0>::n4]*Xm[pos<2,1>::n4] + Xm[pos<0,0>::n4]*Xm[pos<1,3>::n4]*Xm[pos<2,1>::n4] + Xm[pos<0,1>::n4]*Xm[pos<1,0>::n4]*Xm[pos<2,3>::n4] - Xm[pos<0,0>::n4]*Xm[pos<1,1>::n4]*Xm[pos<2,3>::n4] ) / det_val;\n        outm[pos<3,3>::n4] = ( Xm[pos<0,1>::n4]*Xm[pos<1,2>::n4]*Xm[pos<2,0>::n4] - Xm[pos<0,2>::n4]*Xm[pos<1,1>::n4]*Xm[pos<2,0>::n4] + Xm[pos<0,2>::n4]*Xm[pos<1,0>::n4]*Xm[pos<2,1>::n4] - Xm[pos<0,0>::n4]*Xm[pos<1,2>::n4]*Xm[pos<2,1>::n4] - Xm[pos<0,1>::n4]*Xm[pos<1,0>::n4]*Xm[pos<2,2>::n4] + Xm[pos<0,0>::n4]*Xm[pos<1,1>::n4]*Xm[pos<2,2>::n4] ) / det_val;\n        \n        const eT check_val = Xm[pos<0,0>::n4]*outm[pos<0,0>::n4] + Xm[pos<0,1>::n4]*outm[pos<1,0>::n4] + Xm[pos<0,2>::n4]*outm[pos<2,0>::n4] + Xm[pos<0,3>::n4]*outm[pos<3,0>::n4];\n        \n        const  T max_diff  = (is_float<T>::value) ? T(1e-4) : T(1e-10);\n        \n        if(std::abs(T(1) - check_val) > max_diff)\n          {\n          calc_ok = false;\n          }\n        }\n      else\n        {\n        calc_ok = false;\n        }\n      };\n      break;\n    \n    default:\n      ;\n    }\n  \n  return calc_ok;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nauxlib::inv_inplace_lapack(Mat<eT>& out)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(out.is_empty())\n    {\n    return true;\n    }\n  \n  #if defined(ARMA_USE_ATLAS)\n    {\n    arma_debug_assert_atlas_size(out);\n    \n    podarray<int> ipiv(out.n_rows);\n    \n    int info = atlas::clapack_getrf(atlas::CblasColMajor, out.n_rows, out.n_cols, out.memptr(), out.n_rows, ipiv.memptr());\n    \n    if(info == 0)\n      {\n      info = atlas::clapack_getri(atlas::CblasColMajor, out.n_rows, out.memptr(), out.n_rows, ipiv.memptr());\n      }\n    \n    return (info == 0);\n    }\n  #elif defined(ARMA_USE_LAPACK)\n    {\n    arma_debug_assert_blas_size(out);\n    \n    blas_int n_rows = out.n_rows;\n    blas_int lwork  = (std::max)(blas_int(podarray_prealloc_n_elem::val), n_rows);\n    blas_int info   = 0;\n    \n    podarray<blas_int> ipiv(out.n_rows);\n    \n    if(n_rows > 16)\n      {\n      eT        work_query[2];\n      blas_int lwork_query = -1;\n      \n      lapack::getri(&n_rows, out.memptr(), &n_rows, ipiv.memptr(), &work_query[0], &lwork_query, &info);\n      \n      if(info == 0)\n        {\n        const blas_int lwork_proposed = static_cast<blas_int>( access::tmp_real(work_query[0]) );\n        \n        if(lwork_proposed > lwork)\n          {\n          lwork = lwork_proposed;\n          }\n        }\n      else\n        {\n        return false;\n        }\n      }\n    \n    podarray<eT> work( static_cast<uword>(lwork) );\n    \n    lapack::getrf(&n_rows, &n_rows, out.memptr(), &n_rows, ipiv.memptr(), &info);\n    \n    if(info == 0)\n      {\n      lapack::getri(&n_rows, out.memptr(), &n_rows, ipiv.memptr(), work.memptr(), &lwork, &info);\n      }\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_stop(\"inv(): use of ATLAS or LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::inv_tr(Mat<eT>& out, const Base<eT,T1>& X, const uword layout)\n  {\n  arma_extra_debug_sigprint();\n  \n  out = X.get_ref();\n  \n  arma_debug_check( (out.is_square() == false), \"inv(): given matrix is not square\" );\n  \n  if(out.is_empty())\n    {\n    return true;\n    }\n  \n  bool status;\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    arma_debug_assert_blas_size(out);\n    \n    char     uplo = (layout == 0) ? 'U' : 'L';\n    char     diag = 'N';\n    blas_int n    = blas_int(out.n_rows);\n    blas_int info = 0;\n    \n    lapack::trtri(&uplo, &diag, &n, out.memptr(), &n, &info);\n    \n    status = (info == 0);\n    }\n  #else\n    {\n    arma_ignore(layout);\n    arma_stop(\"inv(): use of LAPACK needs to be enabled\");\n    status = false;\n    }\n  #endif\n  \n  \n  if(status == true)\n    {\n    if(layout == 0)\n      {\n      // upper triangular\n      out = trimatu(out);\n      }\n    else\n      {\n      // lower triangular      \n      out = trimatl(out);\n      }\n    }\n  \n  return status;\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::inv_sym(Mat<eT>& out, const Base<eT,T1>& X, const uword layout)\n  {\n  arma_extra_debug_sigprint();\n  \n  out = X.get_ref();\n  \n  arma_debug_check( (out.is_square() == false), \"inv(): given matrix is not square\" );\n  \n  if(out.is_empty())\n    {\n    return true;\n    }\n  \n  bool status;\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    arma_debug_assert_blas_size(out);\n    \n    char     uplo  = (layout == 0) ? 'U' : 'L';\n    blas_int n     = blas_int(out.n_rows);\n    blas_int lwork = (std::max)(blas_int(podarray_prealloc_n_elem::val), 2*n);\n    blas_int info  = 0;\n    \n    podarray<blas_int> ipiv;\n    ipiv.set_size(out.n_rows);\n    \n    podarray<eT> work;\n    work.set_size( uword(lwork) );\n    \n    lapack::sytrf(&uplo, &n, out.memptr(), &n, ipiv.memptr(), work.memptr(), &lwork, &info);\n    \n    status = (info == 0);\n    \n    if(status == true)\n      {\n      lapack::sytri(&uplo, &n, out.memptr(), &n, ipiv.memptr(), work.memptr(), &info);\n      \n      out = (layout == 0) ? symmatu(out) : symmatl(out);\n      \n      status = (info == 0);\n      }\n    }\n  #else\n    {\n    arma_ignore(layout);\n    arma_stop(\"inv(): use of LAPACK needs to be enabled\");\n    status = false;\n    }\n  #endif\n  \n  return status;\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::inv_sympd(Mat<eT>& out, const Base<eT,T1>& X, const uword layout)\n  {\n  arma_extra_debug_sigprint();\n  \n  out = X.get_ref();\n  \n  arma_debug_check( (out.is_square() == false), \"inv_sympd(): given matrix is not square\" );\n  \n  if(out.is_empty())\n    {\n    return true;\n    }\n  \n  bool status;\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    arma_debug_assert_blas_size(out);\n    \n    char     uplo = (layout == 0) ? 'U' : 'L';\n    blas_int n    = blas_int(out.n_rows);\n    blas_int info = 0;\n    \n    lapack::potrf(&uplo, &n, out.memptr(), &n, &info);\n    \n    status = (info == 0);\n    \n    if(status == true)\n      {\n      lapack::potri(&uplo, &n, out.memptr(), &n, &info);\n    \n      out = (layout == 0) ? symmatu(out) : symmatl(out);\n    \n      status = (info == 0);\n      }\n    }\n  #else\n    {\n    arma_ignore(layout);\n    arma_stop(\"inv_sympd(): use of LAPACK needs to be enabled\");\n    status = false;\n    }\n  #endif\n  \n  return status;\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\neT\nauxlib::det(const Base<eT,T1>& X, const bool slow)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  const bool make_copy = (is_Mat<T1>::value) ? true : false;\n  \n  const unwrap<T1>   tmp(X.get_ref());\n  const Mat<eT>& A = tmp.M;\n  \n  arma_debug_check( (A.is_square() == false), \"det(): matrix is not square\" );\n  \n  const uword N = A.n_rows;\n  \n  if( (N <= 4) && (slow == false) )\n    {\n    const  T det_min = (is_float<T>::value) ? T(1e-19) : T(1e-154);\n    const eT det_val = auxlib::det_tinymat(A, N);\n    \n    return (std::abs(det_val) >= det_min) ? det_val : auxlib::det_lapack(A, make_copy);\n    }\n  else\n    {\n    return auxlib::det_lapack(A, make_copy);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nauxlib::det_tinymat(const Mat<eT>& X, const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(N)\n    {\n    case 0:\n      return eT(1);\n      break;\n    \n    case 1:\n      return X[0];\n      break;\n    \n    case 2:\n      {\n      const eT* Xm = X.memptr();\n      \n      return ( Xm[pos<0,0>::n2]*Xm[pos<1,1>::n2] - Xm[pos<0,1>::n2]*Xm[pos<1,0>::n2] );\n      }\n      break;\n    \n    case 3:\n      {\n      // const double tmp1 = X.at(0,0) * X.at(1,1) * X.at(2,2);\n      // const double tmp2 = X.at(0,1) * X.at(1,2) * X.at(2,0);\n      // const double tmp3 = X.at(0,2) * X.at(1,0) * X.at(2,1);\n      // const double tmp4 = X.at(2,0) * X.at(1,1) * X.at(0,2);\n      // const double tmp5 = X.at(2,1) * X.at(1,2) * X.at(0,0);\n      // const double tmp6 = X.at(2,2) * X.at(1,0) * X.at(0,1);\n      // return (tmp1+tmp2+tmp3) - (tmp4+tmp5+tmp6);\n      \n      const eT* Xm = X.memptr();\n      \n      const eT val1 = Xm[pos<0,0>::n3]*(Xm[pos<2,2>::n3]*Xm[pos<1,1>::n3] - Xm[pos<2,1>::n3]*Xm[pos<1,2>::n3]);\n      const eT val2 = Xm[pos<1,0>::n3]*(Xm[pos<2,2>::n3]*Xm[pos<0,1>::n3] - Xm[pos<2,1>::n3]*Xm[pos<0,2>::n3]);\n      const eT val3 = Xm[pos<2,0>::n3]*(Xm[pos<1,2>::n3]*Xm[pos<0,1>::n3] - Xm[pos<1,1>::n3]*Xm[pos<0,2>::n3]);\n      \n      return ( val1 - val2 + val3 );\n      }\n      break;\n    \n    case 4:\n      {\n      const eT* Xm = X.memptr();\n      \n      const eT val = \\\n          Xm[pos<0,3>::n4] * Xm[pos<1,2>::n4] * Xm[pos<2,1>::n4] * Xm[pos<3,0>::n4] \\\n        - Xm[pos<0,2>::n4] * Xm[pos<1,3>::n4] * Xm[pos<2,1>::n4] * Xm[pos<3,0>::n4] \\\n        - Xm[pos<0,3>::n4] * Xm[pos<1,1>::n4] * Xm[pos<2,2>::n4] * Xm[pos<3,0>::n4] \\\n        + Xm[pos<0,1>::n4] * Xm[pos<1,3>::n4] * Xm[pos<2,2>::n4] * Xm[pos<3,0>::n4] \\\n        + Xm[pos<0,2>::n4] * Xm[pos<1,1>::n4] * Xm[pos<2,3>::n4] * Xm[pos<3,0>::n4] \\\n        - Xm[pos<0,1>::n4] * Xm[pos<1,2>::n4] * Xm[pos<2,3>::n4] * Xm[pos<3,0>::n4] \\\n        - Xm[pos<0,3>::n4] * Xm[pos<1,2>::n4] * Xm[pos<2,0>::n4] * Xm[pos<3,1>::n4] \\\n        + Xm[pos<0,2>::n4] * Xm[pos<1,3>::n4] * Xm[pos<2,0>::n4] * Xm[pos<3,1>::n4] \\\n        + Xm[pos<0,3>::n4] * Xm[pos<1,0>::n4] * Xm[pos<2,2>::n4] * Xm[pos<3,1>::n4] \\\n        - Xm[pos<0,0>::n4] * Xm[pos<1,3>::n4] * Xm[pos<2,2>::n4] * Xm[pos<3,1>::n4] \\\n        - Xm[pos<0,2>::n4] * Xm[pos<1,0>::n4] * Xm[pos<2,3>::n4] * Xm[pos<3,1>::n4] \\\n        + Xm[pos<0,0>::n4] * Xm[pos<1,2>::n4] * Xm[pos<2,3>::n4] * Xm[pos<3,1>::n4] \\\n        + Xm[pos<0,3>::n4] * Xm[pos<1,1>::n4] * Xm[pos<2,0>::n4] * Xm[pos<3,2>::n4] \\\n        - Xm[pos<0,1>::n4] * Xm[pos<1,3>::n4] * Xm[pos<2,0>::n4] * Xm[pos<3,2>::n4] \\\n        - Xm[pos<0,3>::n4] * Xm[pos<1,0>::n4] * Xm[pos<2,1>::n4] * Xm[pos<3,2>::n4] \\\n        + Xm[pos<0,0>::n4] * Xm[pos<1,3>::n4] * Xm[pos<2,1>::n4] * Xm[pos<3,2>::n4] \\\n        + Xm[pos<0,1>::n4] * Xm[pos<1,0>::n4] * Xm[pos<2,3>::n4] * Xm[pos<3,2>::n4] \\\n        - Xm[pos<0,0>::n4] * Xm[pos<1,1>::n4] * Xm[pos<2,3>::n4] * Xm[pos<3,2>::n4] \\\n        - Xm[pos<0,2>::n4] * Xm[pos<1,1>::n4] * Xm[pos<2,0>::n4] * Xm[pos<3,3>::n4] \\\n        + Xm[pos<0,1>::n4] * Xm[pos<1,2>::n4] * Xm[pos<2,0>::n4] * Xm[pos<3,3>::n4] \\\n        + Xm[pos<0,2>::n4] * Xm[pos<1,0>::n4] * Xm[pos<2,1>::n4] * Xm[pos<3,3>::n4] \\\n        - Xm[pos<0,0>::n4] * Xm[pos<1,2>::n4] * Xm[pos<2,1>::n4] * Xm[pos<3,3>::n4] \\\n        - Xm[pos<0,1>::n4] * Xm[pos<1,0>::n4] * Xm[pos<2,2>::n4] * Xm[pos<3,3>::n4] \\\n        + Xm[pos<0,0>::n4] * Xm[pos<1,1>::n4] * Xm[pos<2,2>::n4] * Xm[pos<3,3>::n4] \\\n        ;\n      \n      return val;\n      }\n      break;\n    \n    default:\n      return eT(0);\n      ;\n    }\n  }\n\n\n\n//! immediate determinant of a matrix using ATLAS or LAPACK\ntemplate<typename eT>\ninline\neT\nauxlib::det_lapack(const Mat<eT>& X, const bool make_copy)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT> X_copy;\n  \n  if(make_copy == true)\n    {\n    X_copy = X;\n    }\n  \n  Mat<eT>& tmp = (make_copy == true) ? X_copy : const_cast< Mat<eT>& >(X);\n  \n  if(tmp.is_empty())\n    {\n    return eT(1);\n    }\n  \n  \n  #if defined(ARMA_USE_ATLAS)\n    {\n    arma_debug_assert_atlas_size(tmp);\n    \n    podarray<int> ipiv(tmp.n_rows);\n    \n    //const int info =\n    atlas::clapack_getrf(atlas::CblasColMajor, tmp.n_rows, tmp.n_cols, tmp.memptr(), tmp.n_rows, ipiv.memptr());\n    \n    // on output tmp appears to be L+U_alt, where U_alt is U with the main diagonal set to zero\n    eT val = tmp.at(0,0);\n    for(uword i=1; i < tmp.n_rows; ++i)\n      {\n      val *= tmp.at(i,i);\n      }\n    \n    int sign = +1;\n    for(uword i=0; i < tmp.n_rows; ++i)\n      {\n      if( int(i) != ipiv.mem[i] )  // NOTE: no adjustment required, as the clapack version of getrf() assumes counting from 0\n        {\n        sign *= -1;\n        }\n      }\n    \n    return ( (sign < 0) ? -val : val );\n    }\n  #elif defined(ARMA_USE_LAPACK)\n    {\n    arma_debug_assert_blas_size(tmp);\n    \n    podarray<blas_int> ipiv(tmp.n_rows);\n    \n    blas_int info   = 0;\n    blas_int n_rows = blas_int(tmp.n_rows);\n    blas_int n_cols = blas_int(tmp.n_cols);\n    \n    lapack::getrf(&n_rows, &n_cols, tmp.memptr(), &n_rows, ipiv.memptr(), &info);\n    \n    // on output tmp appears to be L+U_alt, where U_alt is U with the main diagonal set to zero\n    eT val = tmp.at(0,0);\n    for(uword i=1; i < tmp.n_rows; ++i)\n      {\n      val *= tmp.at(i,i);\n      }\n    \n    blas_int sign = +1;\n    for(uword i=0; i < tmp.n_rows; ++i)\n      {\n      if( blas_int(i) != (ipiv.mem[i] - 1) )  // NOTE: adjustment of -1 is required as Fortran counts from 1\n        {\n        sign *= -1;\n        }\n      }\n    \n    return ( (sign < 0) ? -val : val );\n    }\n  #else\n    {\n    arma_ignore(X);\n    arma_ignore(make_copy);\n    arma_ignore(tmp);\n    arma_stop(\"det(): use of ATLAS or LAPACK needs to be enabled\");\n    return eT(0);\n    }\n  #endif\n  }\n\n\n\n//! immediate log determinant of a matrix using ATLAS or LAPACK\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::log_det(eT& out_val, typename get_pod_type<eT>::result& out_sign, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  #if defined(ARMA_USE_ATLAS)\n    {\n    Mat<eT> tmp(X.get_ref());\n    arma_debug_check( (tmp.is_square() == false), \"log_det(): given matrix is not square\" );\n    \n    if(tmp.is_empty())\n      {\n      out_val  = eT(0);\n      out_sign =  T(1);\n      return true;\n      }\n    \n    arma_debug_assert_atlas_size(tmp);\n    \n    podarray<int> ipiv(tmp.n_rows);\n    \n    const int info = atlas::clapack_getrf(atlas::CblasColMajor, tmp.n_rows, tmp.n_cols, tmp.memptr(), tmp.n_rows, ipiv.memptr());\n    \n    // on output tmp appears to be L+U_alt, where U_alt is U with the main diagonal set to zero\n    \n    sword sign = (is_complex<eT>::value == false) ? ( (access::tmp_real( tmp.at(0,0) ) < T(0)) ? -1 : +1 ) : +1;\n    eT   val = (is_complex<eT>::value == false) ? std::log( (access::tmp_real( tmp.at(0,0) ) < T(0)) ? tmp.at(0,0)*T(-1) : tmp.at(0,0) ) : std::log( tmp.at(0,0) );\n    \n    for(uword i=1; i < tmp.n_rows; ++i)\n      {\n      const eT x = tmp.at(i,i);\n      \n      sign *= (is_complex<eT>::value == false) ? ( (access::tmp_real(x) < T(0)) ? -1 : +1 ) : +1;\n      val  += (is_complex<eT>::value == false) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x);\n      }\n    \n    for(uword i=0; i < tmp.n_rows; ++i)\n      {\n      if( int(i) != ipiv.mem[i] )  // NOTE: no adjustment required, as the clapack version of getrf() assumes counting from 0\n        {\n        sign *= -1;\n        }\n      }\n    \n    out_val  = val;\n    out_sign = T(sign);\n    \n    return (info == 0);\n    }\n  #elif defined(ARMA_USE_LAPACK)\n    {\n    Mat<eT> tmp(X.get_ref());\n    arma_debug_check( (tmp.is_square() == false), \"log_det(): given matrix is not square\" );\n    \n    if(tmp.is_empty())\n      {\n      out_val  = eT(0);\n      out_sign =  T(1);\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(tmp);\n    \n    podarray<blas_int> ipiv(tmp.n_rows);\n    \n    blas_int info   = 0;\n    blas_int n_rows = blas_int(tmp.n_rows);\n    blas_int n_cols = blas_int(tmp.n_cols);\n    \n    lapack::getrf(&n_rows, &n_cols, tmp.memptr(), &n_rows, ipiv.memptr(), &info);\n    \n    // on output tmp appears to be L+U_alt, where U_alt is U with the main diagonal set to zero\n    \n    sword sign = (is_complex<eT>::value == false) ? ( (access::tmp_real( tmp.at(0,0) ) < T(0)) ? -1 : +1 ) : +1;\n    eT   val = (is_complex<eT>::value == false) ? std::log( (access::tmp_real( tmp.at(0,0) ) < T(0)) ? tmp.at(0,0)*T(-1) : tmp.at(0,0) ) : std::log( tmp.at(0,0) );\n    \n    for(uword i=1; i < tmp.n_rows; ++i)\n      {\n      const eT x = tmp.at(i,i);\n      \n      sign *= (is_complex<eT>::value == false) ? ( (access::tmp_real(x) < T(0)) ? -1 : +1 ) : +1;\n      val  += (is_complex<eT>::value == false) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x);\n      }\n    \n    for(uword i=0; i < tmp.n_rows; ++i)\n      {\n      if( blas_int(i) != (ipiv.mem[i] - 1) )  // NOTE: adjustment of -1 is required as Fortran counts from 1\n        {\n        sign *= -1;\n        }\n      }\n    \n    out_val  = val;\n    out_sign = T(sign);\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(X);\n    \n    out_val  = eT(0);\n    out_sign =  T(0);\n    \n    arma_stop(\"log_det(): use of ATLAS or LAPACK needs to be enabled\");\n    \n    return false;\n    }\n  #endif\n  }\n\n\n\n//! immediate LU decomposition of a matrix using ATLAS or LAPACK\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::lu(Mat<eT>& L, Mat<eT>& U, podarray<blas_int>& ipiv, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  U = X.get_ref();\n  \n  const uword U_n_rows = U.n_rows;\n  const uword U_n_cols = U.n_cols;\n  \n  if(U.is_empty())\n    {\n    L.set_size(U_n_rows, 0);\n    U.set_size(0, U_n_cols);\n    ipiv.reset();\n    return true;\n    }\n  \n  #if defined(ARMA_USE_ATLAS) || defined(ARMA_USE_LAPACK)\n    {\n    bool status;\n    \n    #if defined(ARMA_USE_ATLAS)\n      {\n      arma_debug_assert_atlas_size(U);\n      \n      ipiv.set_size( (std::min)(U_n_rows, U_n_cols) );\n      \n      int info = atlas::clapack_getrf(atlas::CblasColMajor, U_n_rows, U_n_cols, U.memptr(), U_n_rows, ipiv.memptr());\n      \n      status = (info == 0);\n      }\n    #elif defined(ARMA_USE_LAPACK)\n      {\n      arma_debug_assert_blas_size(U);\n      \n      ipiv.set_size( (std::min)(U_n_rows, U_n_cols) );\n      \n      blas_int info = 0;\n      \n      blas_int n_rows = U_n_rows;\n      blas_int n_cols = U_n_cols;\n      \n      \n      lapack::getrf(&n_rows, &n_cols, U.memptr(), &n_rows, ipiv.memptr(), &info);\n      \n      // take into account that Fortran counts from 1\n      arrayops::inplace_minus(ipiv.memptr(), blas_int(1), ipiv.n_elem);\n      \n      status = (info == 0);\n      }\n    #endif\n    \n    L.copy_size(U);\n    \n    for(uword col=0; col < U_n_cols; ++col)\n      {\n      for(uword row=0; (row < col) && (row < U_n_rows); ++row)\n        {\n        L.at(row,col) = eT(0);\n        }\n      \n      if( L.in_range(col,col) == true )\n        {\n        L.at(col,col) = eT(1);\n        }\n      \n      for(uword row = (col+1); row < U_n_rows; ++row)\n        {\n        L.at(row,col) = U.at(row,col);\n        U.at(row,col) = eT(0);\n        }\n      }\n    \n    return status;\n    }\n  #else\n    {\n    arma_stop(\"lu(): use of ATLAS or LAPACK needs to be enabled\");\n    \n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::lu(Mat<eT>& L, Mat<eT>& U, Mat<eT>& P, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  podarray<blas_int> ipiv1;\n  const bool status = auxlib::lu(L, U, ipiv1, X);\n  \n  if(status == true)\n    {\n    if(U.is_empty())\n      {\n      // L and U have been already set to the correct empty matrices\n      P.eye(L.n_rows, L.n_rows);\n      return true;\n      }\n    \n    const uword n      = ipiv1.n_elem;\n    const uword P_rows = U.n_rows;\n    \n    podarray<blas_int> ipiv2(P_rows);\n    \n    const blas_int* ipiv1_mem = ipiv1.memptr();\n          blas_int* ipiv2_mem = ipiv2.memptr();\n    \n    for(uword i=0; i<P_rows; ++i)\n      {\n      ipiv2_mem[i] = blas_int(i);\n      }\n    \n    for(uword i=0; i<n; ++i)\n      {\n      const uword k = static_cast<uword>(ipiv1_mem[i]);\n      \n      if( ipiv2_mem[i] != ipiv2_mem[k] )\n        {\n        std::swap( ipiv2_mem[i], ipiv2_mem[k] );\n        }\n      }\n    \n    P.zeros(P_rows, P_rows);\n    \n    for(uword row=0; row<P_rows; ++row)\n      {\n      P.at(row, static_cast<uword>(ipiv2_mem[row])) = eT(1);\n      }\n    \n    if(L.n_cols > U.n_rows)\n      {\n      L.shed_cols(U.n_rows, L.n_cols-1);\n      }\n      \n    if(U.n_rows > L.n_cols)\n      {\n      U.shed_rows(L.n_cols, U.n_rows-1);\n      }\n    }\n  \n  return status;\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::lu(Mat<eT>& L, Mat<eT>& U, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  podarray<blas_int> ipiv1;\n  const bool status = auxlib::lu(L, U, ipiv1, X);\n  \n  if(status == true)\n    {\n    if(U.is_empty())\n      {\n      // L and U have been already set to the correct empty matrices\n      return true;\n      }\n    \n    const uword n      = ipiv1.n_elem;\n    const uword P_rows = U.n_rows;\n    \n    podarray<blas_int> ipiv2(P_rows);\n    \n    const blas_int* ipiv1_mem = ipiv1.memptr();\n          blas_int* ipiv2_mem = ipiv2.memptr();\n    \n    for(uword i=0; i<P_rows; ++i)\n      {\n      ipiv2_mem[i] = blas_int(i);\n      }\n    \n    for(uword i=0; i<n; ++i)\n      {\n      const uword k = static_cast<uword>(ipiv1_mem[i]);\n      \n      if( ipiv2_mem[i] != ipiv2_mem[k] )\n        {\n        std::swap( ipiv2_mem[i], ipiv2_mem[k] );\n        L.swap_rows( static_cast<uword>(ipiv2_mem[i]), static_cast<uword>(ipiv2_mem[k]) );\n        }\n      }\n    \n    if(L.n_cols > U.n_rows)\n      {\n      L.shed_cols(U.n_rows, L.n_cols-1);\n      }\n      \n    if(U.n_rows > L.n_cols)\n      {\n      U.shed_rows(L.n_cols, U.n_rows-1);\n      }\n    }\n  \n  return status;\n  }\n\n\n\n//! immediate eigenvalues of a symmetric real matrix using LAPACK\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::eig_sym(Col<eT>& eigval, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    Mat<eT> A(X.get_ref());\n    \n    arma_debug_check( (A.is_square() == false), \"eig_sym(): given matrix is not square\");\n    \n    if(A.is_empty())\n      {\n      eigval.reset();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A);\n    \n    eigval.set_size(A.n_rows);\n    \n    char jobz  = 'N';\n    char uplo  = 'U';\n    \n    blas_int N     = blas_int(A.n_rows);\n    blas_int lwork = 3 * ( (std::max)(blas_int(1), 3*N-1) );\n    blas_int info  = 0;\n    \n    podarray<eT> work( static_cast<uword>(lwork) );\n    \n    lapack::syev(&jobz, &uplo, &N, A.memptr(), &N, eigval.memptr(), work.memptr(), &lwork, &info);\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(eigval);\n    arma_ignore(X);\n    arma_stop(\"eig_sym(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n//! immediate eigenvalues of a hermitian complex matrix using LAPACK\ntemplate<typename T, typename T1>\ninline\nbool\nauxlib::eig_sym(Col<T>& eigval, const Base<std::complex<T>,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    typedef typename std::complex<T> eT;\n    \n    Mat<eT> A(X.get_ref());\n    \n    arma_debug_check( (A.is_square() == false), \"eig_sym(): given matrix is not square\");\n    \n    if(A.is_empty())\n      {\n      eigval.reset();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A);\n    \n    eigval.set_size(A.n_rows);\n    \n    char jobz  = 'N'; \n    char uplo  = 'U';\n    \n    blas_int N     = blas_int(A.n_rows);\n    blas_int lwork = 3 * ( (std::max)(blas_int(1), 2*N-1) );\n    blas_int info  = 0;\n    \n    podarray<eT>  work( static_cast<uword>(lwork) );\n    podarray<T>  rwork( static_cast<uword>( (std::max)(blas_int(1), 3*N-2) ) );\n    \n    arma_extra_debug_print(\"lapack::heev()\");\n    lapack::heev(&jobz, &uplo, &N, A.memptr(), &N, eigval.memptr(), work.memptr(), &lwork, rwork.memptr(), &info);\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(eigval);\n    arma_ignore(X);\n    arma_stop(\"eig_sym(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n//! immediate eigenvalues and eigenvectors of a symmetric real matrix using LAPACK\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::eig_sym(Col<eT>& eigval, Mat<eT>& eigvec, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    eigvec = X.get_ref();\n    \n    arma_debug_check( (eigvec.is_square() == false), \"eig_sym(): given matrix is not square\" );\n    \n    if(eigvec.is_empty())\n      {\n      eigval.reset();\n      eigvec.reset();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(eigvec);\n    \n    eigval.set_size(eigvec.n_rows);\n    \n    char jobz  = 'V';\n    char uplo  = 'U';\n    \n    blas_int N     = blas_int(eigvec.n_rows);\n    blas_int lwork = 3 * ( (std::max)(blas_int(1), 3*N-1) );\n    blas_int info  = 0;\n    \n    podarray<eT> work( static_cast<uword>(lwork) );\n    \n    lapack::syev(&jobz, &uplo, &N, eigvec.memptr(), &N, eigval.memptr(), work.memptr(), &lwork, &info);\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(eigval);\n    arma_ignore(eigvec);\n    arma_ignore(X);\n    arma_stop(\"eig_sym(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n//! immediate eigenvalues and eigenvectors of a hermitian complex matrix using LAPACK\ntemplate<typename T, typename T1>\ninline\nbool\nauxlib::eig_sym(Col<T>& eigval, Mat< std::complex<T> >& eigvec, const Base<std::complex<T>,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    typedef typename std::complex<T> eT;\n    \n    eigvec = X.get_ref();\n    \n    arma_debug_check( (eigvec.is_square() == false), \"eig_sym(): given matrix is not square\" );\n    \n    if(eigvec.is_empty())\n      {\n      eigval.reset();\n      eigvec.reset();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(eigvec);\n    \n    eigval.set_size(eigvec.n_rows);\n    \n    char jobz  = 'V';\n    char uplo  = 'U';\n    \n    blas_int N     = blas_int(eigvec.n_rows);\n    blas_int lwork = 3 * ( (std::max)(blas_int(1), 2*N-1) );\n    blas_int info  = 0;\n    \n    podarray<eT>  work( static_cast<uword>(lwork) );\n    podarray<T>  rwork( static_cast<uword>((std::max)(blas_int(1), 3*N-2)) );\n    \n    arma_extra_debug_print(\"lapack::heev()\");\n    lapack::heev(&jobz, &uplo, &N, eigvec.memptr(), &N, eigval.memptr(), work.memptr(), &lwork, rwork.memptr(), &info);\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(eigval);\n    arma_ignore(eigvec);\n    arma_ignore(X);\n    arma_stop(\"eig_sym(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n//! immediate eigenvalues and eigenvectors of a symmetric real matrix using LAPACK (divide and conquer algorithm)\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::eig_sym_dc(Col<eT>& eigval, Mat<eT>& eigvec, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    eigvec = X.get_ref();\n    \n    arma_debug_check( (eigvec.is_square() == false), \"eig_sym(): given matrix is not square\" );\n    \n    if(eigvec.is_empty())\n      {\n      eigval.reset();\n      eigvec.reset();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(eigvec);\n    \n    eigval.set_size(eigvec.n_rows);\n    \n    char jobz = 'V';\n    char uplo = 'U';\n    \n    blas_int N      = blas_int(eigvec.n_rows);\n    blas_int lwork  = 2 * (1 + 6*N + 2*(N*N));\n    blas_int liwork = 3 * (3 + 5*N);\n    blas_int info   = 0;\n    \n    podarray<eT>        work( static_cast<uword>( lwork) );\n    podarray<blas_int> iwork( static_cast<uword>(liwork) ); \n    \n    arma_extra_debug_print(\"lapack::syevd()\");\n    lapack::syevd(&jobz, &uplo, &N, eigvec.memptr(), &N, eigval.memptr(), work.memptr(), &lwork, iwork.memptr(), &liwork, &info);\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(eigval);\n    arma_ignore(eigvec);\n    arma_ignore(X);\n    arma_stop(\"eig_sym(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n//! immediate eigenvalues and eigenvectors of a hermitian complex matrix using LAPACK (divide and conquer algorithm)\ntemplate<typename T, typename T1>\ninline\nbool\nauxlib::eig_sym_dc(Col<T>& eigval, Mat< std::complex<T> >& eigvec, const Base<std::complex<T>,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    typedef typename std::complex<T> eT;\n    \n    eigvec = X.get_ref();\n    \n    arma_debug_check( (eigvec.is_square() == false), \"eig_sym(): given matrix is not square\" );\n    \n    if(eigvec.is_empty())\n      {\n      eigval.reset();\n      eigvec.reset();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(eigvec);\n    \n    eigval.set_size(eigvec.n_rows);\n    \n    char jobz  = 'V';\n    char uplo  = 'U';\n    \n    blas_int N      = blas_int(eigvec.n_rows);\n    blas_int lwork  = 2 * (2*N + N*N);\n    blas_int lrwork = 2 * (1 + 5*N + 2*(N*N));\n    blas_int liwork = 3 * (3 + 5*N);\n    blas_int info   = 0;\n    \n    podarray<eT>        work( static_cast<uword>(lwork)  );\n    podarray<T>        rwork( static_cast<uword>(lrwork) );\n    podarray<blas_int> iwork( static_cast<uword>(liwork) ); \n    \n    arma_extra_debug_print(\"lapack::heevd()\");\n    lapack::heevd(&jobz, &uplo, &N, eigvec.memptr(), &N, eigval.memptr(), work.memptr(), &lwork, rwork.memptr(), &lrwork, iwork.memptr(), &liwork, &info);\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(eigval);\n    arma_ignore(eigvec);\n    arma_ignore(X);\n    arma_stop(\"eig_sym(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n//! Eigenvalues and eigenvectors of a general square real matrix using LAPACK.\n//! The argument 'side' specifies which eigenvectors should be calculated\n//! (see code for mode details).\ntemplate<typename T, typename T1>\ninline\nbool\nauxlib::eig_gen\n  (\n  Col< std::complex<T> >&   eigval,\n  Mat<T>&                 l_eigvec,\n  Mat<T>&                 r_eigvec,\n  const Base<T,T1>&       X,\n  const char              side\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    char jobvl;\n    char jobvr;\n    \n    switch(side)\n      {\n      case 'l':  // left\n        jobvl = 'V';\n        jobvr = 'N';\n        break;\n        \n      case 'r':  // right\n        jobvl = 'N';\n        jobvr = 'V';\n        break;\n        \n      case 'b':  // both\n        jobvl = 'V';\n        jobvr = 'V';\n        break;\n        \n      case 'n':  // neither\n        jobvl = 'N';\n        jobvr = 'N';\n        break;\n      \n      default:\n        arma_stop(\"eig_gen(): parameter 'side' is invalid\");\n        return false;\n      }\n    \n    Mat<T> A(X.get_ref());\n    arma_debug_check( (A.is_square() == false), \"eig_gen(): given matrix is not square\" );\n    \n    if(A.is_empty())\n      {\n      eigval.reset();\n      l_eigvec.reset();\n      r_eigvec.reset();\n      return true;\n      }\n    \n    if(A.is_finite() == false)  { return false; }  // workaround for a bug in LAPACK 3.5\n    \n    arma_debug_assert_blas_size(A);\n    \n    const uword A_n_rows = A.n_rows;\n    \n    eigval.set_size(A_n_rows);\n    \n    l_eigvec.set_size( ((jobvl == 'V') ? A_n_rows : 1), A_n_rows );\n    r_eigvec.set_size( ((jobvr == 'V') ? A_n_rows : 1), A_n_rows );\n    \n    blas_int N     = blas_int(A_n_rows);\n    blas_int ldvl  = blas_int(l_eigvec.n_rows);\n    blas_int ldvr  = blas_int(r_eigvec.n_rows);\n    blas_int lwork = 3 * ( (std::max)(blas_int(1), 4*N) );\n    blas_int info  = 0;\n    \n    podarray<T> work( static_cast<uword>(lwork) );\n    \n    podarray<T> wr(A_n_rows);\n    podarray<T> wi(A_n_rows);\n    \n    arma_extra_debug_print(\"lapack::geev()\");\n    lapack::geev(&jobvl, &jobvr, &N, A.memptr(), &N, wr.memptr(), wi.memptr(), l_eigvec.memptr(), &ldvl, r_eigvec.memptr(), &ldvr, work.memptr(), &lwork, &info);\n    \n    eigval.set_size(A_n_rows);\n    for(uword i=0; i<A_n_rows; ++i)\n      {\n      eigval[i] = std::complex<T>(wr[i], wi[i]);\n      }\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(eigval);\n    arma_ignore(l_eigvec);\n    arma_ignore(r_eigvec);\n    arma_ignore(X);\n    arma_ignore(side);\n    arma_stop(\"eig_gen(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n\n\n//! Eigenvalues and eigenvectors of a general square complex matrix using LAPACK\n//! The argument 'side' specifies which eigenvectors should be calculated\n//! (see code for mode details).\ntemplate<typename T, typename T1>\ninline\nbool\nauxlib::eig_gen\n  (\n  Col< std::complex<T> >&              eigval,\n  Mat< std::complex<T> >&            l_eigvec, \n  Mat< std::complex<T> >&            r_eigvec, \n  const Base< std::complex<T>, T1 >& X, \n  const char                         side\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    typedef typename std::complex<T> eT;\n    \n    char jobvl;\n    char jobvr;\n    \n    switch(side)\n      {\n      case 'l':  // left\n        jobvl = 'V';\n        jobvr = 'N';\n        break;\n        \n      case 'r':  // right\n        jobvl = 'N';\n        jobvr = 'V';\n        break;\n        \n      case 'b':  // both\n        jobvl = 'V';\n        jobvr = 'V';\n        break;\n        \n      case 'n':  // neither\n        jobvl = 'N';\n        jobvr = 'N';\n        break;\n      \n      default:\n        arma_stop(\"eig_gen(): parameter 'side' is invalid\");\n        return false;\n      }\n    \n    Mat<eT> A(X.get_ref());\n    arma_debug_check( (A.is_square() == false), \"eig_gen(): given matrix is not square\" );\n    \n    if(A.is_empty())\n      {\n      eigval.reset();\n      l_eigvec.reset();\n      r_eigvec.reset();\n      return true;\n      }\n    \n    if(A.is_finite() == false)  { return false; }  // workaround for a bug in LAPACK 3.5\n    \n    arma_debug_assert_blas_size(A);\n    \n    const uword A_n_rows = A.n_rows;\n    \n    eigval.set_size(A_n_rows);\n    \n    l_eigvec.set_size( ((jobvl == 'V') ? A_n_rows : 1), A_n_rows );\n    r_eigvec.set_size( ((jobvr == 'V') ? A_n_rows : 1), A_n_rows );\n    \n    blas_int N     = blas_int(A_n_rows);\n    blas_int ldvl  = blas_int(l_eigvec.n_rows);\n    blas_int ldvr  = blas_int(r_eigvec.n_rows);\n    blas_int lwork = 3 * ( (std::max)(blas_int(1), 2*N) );\n    blas_int info  = 0;\n    \n    podarray<eT>  work( static_cast<uword>(lwork) );\n    podarray<T>  rwork( static_cast<uword>(2*N)   );\n    \n    arma_extra_debug_print(\"lapack::cx_geev()\");\n    lapack::cx_geev(&jobvl, &jobvr, &N, A.memptr(), &N, eigval.memptr(), l_eigvec.memptr(), &ldvl, r_eigvec.memptr(), &ldvr, work.memptr(), &lwork, rwork.memptr(), &info);\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(eigval);\n    arma_ignore(l_eigvec);\n    arma_ignore(r_eigvec);\n    arma_ignore(X);\n    arma_ignore(side);\n    arma_stop(\"eig_gen(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n//! Eigenvalues and eigenvectors of general square real matrix pair.\n//! The argument 'side' specifies which eigenvectors should be calculated.\ntemplate<typename T, typename T1, typename T2>\ninline\nbool\nauxlib::eig_pair\n  (\n  Col< std::complex<T> >&   eigval,\n  Mat<T>&                 l_eigvec,\n  Mat<T>&                 r_eigvec,\n  const Base<T,T1>&       X,\n  const Base<T,T2>&       Y,\n  const char              side\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    char jobvl;\n    char jobvr;\n    \n    switch(side)\n      {\n      case 'l':  // left\n        jobvl = 'V';\n        jobvr = 'N';\n        break;\n        \n      case 'r':  // right\n        jobvl = 'N';\n        jobvr = 'V';\n        break;\n        \n      case 'b':  // both\n        jobvl = 'V';\n        jobvr = 'V';\n        break;\n        \n      case 'n':  // neither\n        jobvl = 'N';\n        jobvr = 'N';\n        break;\n      \n      default:\n        arma_stop(\"eig_pair(): parameter 'side' is invalid\");\n        return false;\n      }\n    \n    Mat<T> A(X.get_ref());\n    Mat<T> B(Y.get_ref());\n    \n    arma_debug_check( ((A.is_square() == false) || (B.is_square() == false)), \"eig_pair(): given matrix is not square\" );\n    \n    arma_debug_check( (A.n_rows != B.n_rows), \"eig_pair(): given matrices must have the same size\" );\n    \n    if(A.is_empty())\n      {\n      eigval.reset();\n      l_eigvec.reset();\n      r_eigvec.reset();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A);\n    \n    const uword A_n_rows = A.n_rows;\n    \n    eigval.set_size(A_n_rows);\n    \n    l_eigvec.set_size( ((jobvl == 'V') ? A_n_rows : 1), A_n_rows );\n    r_eigvec.set_size( ((jobvr == 'V') ? A_n_rows : 1), A_n_rows );\n    \n    blas_int N     = blas_int(A_n_rows);\n    blas_int ldvl  = blas_int(l_eigvec.n_rows);\n    blas_int ldvr  = blas_int(r_eigvec.n_rows);\n    blas_int lwork = 3 * ( (std::max)(blas_int(1), 8*N) );\n    blas_int info  = 0;\n    \n    podarray<T> work( static_cast<uword>(lwork) );\n    \n    podarray<T> alphar(A_n_rows);\n    podarray<T> alphai(A_n_rows);\n    podarray<T>   beta(A_n_rows);\n    \n    arma_extra_debug_print(\"lapack::ggev()\");\n    lapack::ggev\n      (\n      &jobvl, &jobvr, &N,\n      A.memptr(), &N,  B.memptr(), &N,\n      alphar.memptr(), alphai.memptr(), beta.memptr(),\n      l_eigvec.memptr(), &ldvl, r_eigvec.memptr(), &ldvr,\n      work.memptr(), &lwork,\n      &info\n      );\n    \n    if(info == 0)\n      {\n      // from LAPACK docs:\n      // If ALPHAI(j) is zero, then the j-th eigenvalue is real;\n      // if positive, then the j-th and (j+1)-st eigenvalues are a complex conjugate pair,\n      // with ALPHAI(j+1) negative.\n      \n      eigval.set_size(A_n_rows);\n      \n      const T* alphar_mem = alphar.memptr();\n      const T* alphai_mem = alphai.memptr();\n      const T*   beta_mem =   beta.memptr();\n      \n      bool beta_has_zero = false;\n      \n      for(uword j=0; j<A_n_rows; ++j)\n        {\n        const T alphai_val = alphai_mem[j];\n        const T   beta_val =   beta_mem[j];\n        \n        if(beta_val == T(0))  { beta_has_zero = true; }\n        \n        const T re = alphar_mem[j] / beta_val;\n        const T im = alphai_val    / beta_val;\n        \n        eigval[j] = std::complex<T>(re, im);\n        \n        if( (alphai_val > T(0)) && (j < (A_n_rows-1)) )\n          {\n          // ensure we have exact conjugate\n          ++j;\n          eigval[j] = std::complex<T>(re,-im);\n          }\n        }\n      \n      arma_debug_warn(beta_has_zero, \"eig_pair(): warning: given matrix appears ill-conditioned\");\n      \n      return true;\n      }\n    else\n      {\n      return false;\n      }\n    }\n  #else\n    {\n    arma_ignore(eigval);\n    arma_ignore(l_eigvec);\n    arma_ignore(r_eigvec);\n    arma_ignore(X);\n    arma_ignore(Y);\n    arma_ignore(side);\n    arma_stop(\"eig_pair(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n\n\n//! Eigenvalues and eigenvectors of general square complex matrix pair.\n//! The argument 'side' specifies which eigenvectors should be calculated\ntemplate<typename T, typename T1, typename T2>\ninline\nbool\nauxlib::eig_pair\n  (\n  Col< std::complex<T> >&              eigval,\n  Mat< std::complex<T> >&            l_eigvec, \n  Mat< std::complex<T> >&            r_eigvec, \n  const Base< std::complex<T>, T1 >& X, \n  const Base< std::complex<T>, T2 >& Y, \n  const char                         side\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    typedef typename std::complex<T> eT;\n    \n    char jobvl;\n    char jobvr;\n    \n    switch(side)\n      {\n      case 'l':  // left\n        jobvl = 'V';\n        jobvr = 'N';\n        break;\n        \n      case 'r':  // right\n        jobvl = 'N';\n        jobvr = 'V';\n        break;\n        \n      case 'b':  // both\n        jobvl = 'V';\n        jobvr = 'V';\n        break;\n        \n      case 'n':  // neither\n        jobvl = 'N';\n        jobvr = 'N';\n        break;\n      \n      default:\n        arma_stop(\"eig_pair(): parameter 'side' is invalid\");\n        return false;\n      }\n    \n    Mat<eT> A(X.get_ref());\n    Mat<eT> B(Y.get_ref());\n    \n    arma_debug_check( ((A.is_square() == false) || (B.is_square() == false)), \"eig_pair(): given matrix is not square\" );\n    \n    arma_debug_check( (A.n_rows != B.n_rows), \"eig_pair(): given matrices must have the same size\" );\n    \n    if(A.is_empty())\n      {\n      eigval.reset();\n      l_eigvec.reset();\n      r_eigvec.reset();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A);\n    \n    const uword A_n_rows = A.n_rows;\n    \n    podarray<eT> alpha(A_n_rows);\n    podarray<eT>  beta(A_n_rows);\n    \n    l_eigvec.set_size( ((jobvl == 'V') ? A_n_rows : 1), A_n_rows );\n    r_eigvec.set_size( ((jobvr == 'V') ? A_n_rows : 1), A_n_rows );\n    \n    blas_int N     = blas_int(A_n_rows);\n    blas_int ldvl  = blas_int(l_eigvec.n_rows);\n    blas_int ldvr  = blas_int(r_eigvec.n_rows);\n    blas_int lwork = 3 * ((std::max)(blas_int(1),2*N));\n    blas_int info  = 0;\n    \n    podarray<eT>  work( static_cast<uword>(lwork) );\n    podarray<T>  rwork( static_cast<uword>(8*N)   );\n    \n    arma_extra_debug_print(\"lapack::cx_ggev()\");\n    lapack::cx_ggev\n      (\n      &jobvl, &jobvr, &N,\n      A.memptr(), &N, B.memptr(), &N,\n      alpha.memptr(), beta.memptr(),\n      l_eigvec.memptr(), &ldvl, r_eigvec.memptr(), &ldvr,\n      work.memptr(), &lwork, rwork.memptr(),\n      &info\n      );\n    \n    if(info == 0)\n      {\n      // TODO: figure out a more robust way to create the eigen values;\n      // TODO: from LAPACK docs: the quotients ALPHA(j)/BETA(j) may easily over- or underflow, and BETA(j) may even be zero\n      \n      eigval.set_size(A_n_rows);\n      \n            eT* eigval_mem = eigval.memptr();\n      const eT*  alpha_mem = alpha.memptr();\n      const eT*   beta_mem =  beta.memptr();\n      \n      const std::complex<T> cx_zero( T(0), T(0) );\n      \n      bool beta_has_zero = false;\n      \n      for(uword i=0; i<A_n_rows; ++i)\n        {\n        eigval_mem[i] = alpha_mem[i] / beta_mem[i];\n        \n        if(beta_mem[i] == cx_zero)  { beta_has_zero = true; }\n        \n        // // TODO: not sure if this is the right approach\n        // eigval_mem[i] = (beta_mem[i] != cx_zero) ? (alpha_mem[i] / beta_mem[i]) : cx_zero;\n        }\n      \n      arma_debug_warn(beta_has_zero, \"eig_pair(): warning: given matrix appears ill-conditioned\");\n      \n      return true;\n      }\n    else\n      {\n      return false;\n      }\n    }\n  #else\n    {\n    arma_ignore(eigval);\n    arma_ignore(l_eigvec);\n    arma_ignore(r_eigvec);\n    arma_ignore(X);\n    arma_ignore(Y);\n    arma_ignore(side);\n    arma_stop(\"eig_pair(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::chol(Mat<eT>& out, const Base<eT,T1>& X, const uword layout)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    out = X.get_ref();\n    \n    arma_debug_check( (out.is_square() == false), \"chol(): given matrix is not square\" );\n    \n    if(out.is_empty())  { return true; }\n    \n    arma_debug_assert_blas_size(out);\n    \n    const uword out_n_rows = out.n_rows;\n    \n    char      uplo = (layout == 0) ? 'U' : 'L';\n    blas_int  n    = out_n_rows;\n    blas_int  info = 0;\n    \n    lapack::potrf(&uplo, &n, out.memptr(), &n, &info);\n    \n    if(layout == 0)\n      {\n      for(uword col=0; col < out_n_rows; ++col)\n        {\n        eT* colptr = out.colptr(col);\n        \n        for(uword row=(col+1); row < out_n_rows; ++row)  { colptr[row] = eT(0); }\n        }\n      }\n    else\n      {\n      for(uword col=1; col < out_n_rows; ++col)\n        {\n        eT* colptr = out.colptr(col);\n        \n        for(uword row=0; row < col; ++row)  { colptr[row] = eT(0); }\n        }\n      }\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(out);\n    arma_ignore(X);\n    arma_ignore(layout);\n    \n    arma_stop(\"chol(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::qr(Mat<eT>& Q, Mat<eT>& R, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    R = X.get_ref();\n    \n    const uword R_n_rows = R.n_rows;\n    const uword R_n_cols = R.n_cols;\n    \n    if(R.is_empty())\n      {\n      Q.eye(R_n_rows, R_n_rows);\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(R);\n    \n    blas_int m         = static_cast<blas_int>(R_n_rows);\n    blas_int n         = static_cast<blas_int>(R_n_cols);\n    blas_int lwork     = 0;\n    blas_int lwork_min = (std::max)(blas_int(1), (std::max)(m,n));  // take into account requirements of geqrf() _and_ orgqr()/ungqr()\n    blas_int k         = (std::min)(m,n);\n    blas_int info      = 0;\n    \n    podarray<eT> tau( static_cast<uword>(k) );\n    \n    eT        work_query[2];\n    blas_int lwork_query = -1;\n    \n    lapack::geqrf(&m, &n, R.memptr(), &m, tau.memptr(), &work_query[0], &lwork_query, &info);\n    \n    if(info == 0)\n      {\n      const blas_int lwork_proposed = static_cast<blas_int>( access::tmp_real(work_query[0]) );\n      \n      lwork = (lwork_proposed > lwork_min) ? lwork_proposed : lwork_min;\n      }\n    else\n      {\n      return false;\n      }\n    \n    podarray<eT> work( static_cast<uword>(lwork) );\n    \n    lapack::geqrf(&m, &n, R.memptr(), &m, tau.memptr(), work.memptr(), &lwork, &info);\n    \n    Q.set_size(R_n_rows, R_n_rows);\n    \n    arrayops::copy( Q.memptr(), R.memptr(), (std::min)(Q.n_elem, R.n_elem) );\n    \n    //\n    // construct R\n    \n    for(uword col=0; col < R_n_cols; ++col)\n      {\n      for(uword row=(col+1); row < R_n_rows; ++row)\n        {\n        R.at(row,col) = eT(0);\n        }\n      }\n    \n    \n    if( (is_float<eT>::value) || (is_double<eT>::value) )\n      {\n      lapack::orgqr(&m, &m, &k, Q.memptr(), &m, tau.memptr(), work.memptr(), &lwork, &info);\n      }\n    else\n    if( (is_supported_complex_float<eT>::value) || (is_supported_complex_double<eT>::value) )\n      {\n      lapack::ungqr(&m, &m, &k, Q.memptr(), &m, tau.memptr(), work.memptr(), &lwork, &info);\n      }\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(Q);\n    arma_ignore(R);\n    arma_ignore(X);\n    arma_stop(\"qr(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nbool \nauxlib::qr_econ(Mat<eT>& Q, Mat<eT>& R, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  // This function implements a memory-efficient QR for a non-square X that has dimensions m x n.\n  // This basically discards the basis for the null-space.\n  // \n  // if m <= n: (use standard routine)\n  //     Q[m,m]*R[m,n] = X[m,n]\n  //     geqrf Needs A[m,n]: Uses R\n  //     orgqr Needs A[m,m]: Uses Q\n  // otherwise: (memory-efficient routine)\n  //     Q[m,n]*R[n,n] = X[m,n]\n  //     geqrf Needs A[m,n]: Uses Q\n  //     geqrf Needs A[m,n]: Uses Q\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    if(is_Mat<T1>::value)\n      {\n      const unwrap<T1>   tmp(X.get_ref());\n      const Mat<eT>& M = tmp.M;\n      \n      if(M.n_rows < M.n_cols)\n        {\n        return auxlib::qr(Q, R, X);\n        }\n      }\n    \n    Q = X.get_ref();\n    \n    const uword Q_n_rows = Q.n_rows;\n    const uword Q_n_cols = Q.n_cols;\n    \n    if( Q_n_rows <= Q_n_cols )\n      {\n      return auxlib::qr(Q, R, Q);\n      }\n    \n    if(Q.is_empty())\n      {\n      Q.set_size(Q_n_rows, 0       );\n      R.set_size(0,        Q_n_cols);\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(Q);\n    \n    blas_int m         = static_cast<blas_int>(Q_n_rows);\n    blas_int n         = static_cast<blas_int>(Q_n_cols);\n    blas_int lwork     = 0;\n    blas_int lwork_min = (std::max)(blas_int(1), (std::max)(m,n));  // take into account requirements of geqrf() _and_ orgqr()/ungqr()\n    blas_int k         = (std::min)(m,n);\n    blas_int info      = 0;\n    \n    podarray<eT> tau( static_cast<uword>(k) );\n    \n    eT        work_query[2];\n    blas_int lwork_query = -1;\n    \n    lapack::geqrf(&m, &n, Q.memptr(), &m, tau.memptr(), &work_query[0], &lwork_query, &info);\n    \n    if(info == 0)\n      {\n      const blas_int lwork_proposed = static_cast<blas_int>( access::tmp_real(work_query[0]) );\n      \n      lwork = (lwork_proposed > lwork_min) ? lwork_proposed : lwork_min;\n      }\n    else\n      {\n      return false;\n      }\n    \n    podarray<eT> work( static_cast<uword>(lwork) );\n    \n    lapack::geqrf(&m, &n, Q.memptr(), &m, tau.memptr(), work.memptr(), &lwork, &info);\n    \n    // Q now has the elements on and above the diagonal of the array\n    // contain the min(M,N)-by-N upper trapezoidal matrix Q\n    // (Q is upper triangular if m >= n);\n    // the elements below the diagonal, with the array TAU,\n    // represent the orthogonal matrix Q as a product of min(m,n) elementary reflectors.\n    \n    R.set_size(Q_n_cols, Q_n_cols);\n    \n    //\n    // construct R\n    \n    for(uword col=0; col < Q_n_cols; ++col)\n      {\n      for(uword row=0; row <= col; ++row)\n        {\n        R.at(row,col) = Q.at(row,col);\n        }\n      \n      for(uword row=(col+1); row < Q_n_cols; ++row)\n        {\n        R.at(row,col) = eT(0);\n        }\n      }\n    \n    if( (is_float<eT>::value) || (is_double<eT>::value) )\n      {\n      lapack::orgqr(&m, &n, &k, Q.memptr(), &m, tau.memptr(), work.memptr(), &lwork, &info);\n      }\n    else\n    if( (is_supported_complex_float<eT>::value) || (is_supported_complex_double<eT>::value) )\n      {\n      lapack::ungqr(&m, &n, &k, Q.memptr(), &m, tau.memptr(), work.memptr(), &lwork, &info);\n      }\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(Q);\n    arma_ignore(R);\n    arma_ignore(X);\n    arma_stop(\"qr_econ(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::svd(Col<eT>& S, const Base<eT,T1>& X, uword& X_n_rows, uword& X_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    Mat<eT> A(X.get_ref());\n    \n    X_n_rows = A.n_rows;\n    X_n_cols = A.n_cols;\n    \n    if(A.is_empty())\n      {\n      S.reset();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A);\n    \n    Mat<eT> U(1, 1);\n    Mat<eT> V(1, A.n_cols);\n    \n    char jobu  = 'N';\n    char jobvt = 'N';\n    \n    blas_int m          = A.n_rows;\n    blas_int n          = A.n_cols;\n    blas_int min_mn     = (std::min)(m,n);\n    blas_int lda        = A.n_rows;\n    blas_int ldu        = U.n_rows;\n    blas_int ldvt       = V.n_rows;\n    blas_int lwork      = 0;\n    blas_int lwork_min  = (std::max)( blas_int(1), (std::max)( (3*min_mn + (std::max)(m,n)), 5*min_mn ) );\n    blas_int info   = 0;\n    \n    S.set_size( static_cast<uword>(min_mn) );\n    \n    eT        work_query[2];\n    blas_int lwork_query = -1;\n    \n    lapack::gesvd<eT>\n      (\n      &jobu, &jobvt, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, &work_query[0], &lwork_query, &info\n      );\n    \n    if(info == 0)\n      {\n      const blas_int lwork_proposed = static_cast<blas_int>( work_query[0] );\n      \n      lwork = (lwork_proposed > lwork_min) ? lwork_proposed : lwork_min;\n      \n      podarray<eT> work( static_cast<uword>(lwork) );\n      \n      lapack::gesvd<eT>\n        (\n        &jobu, &jobvt, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, work.memptr(), &lwork, &info\n        );\n      }\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(S);\n    arma_ignore(X);\n    arma_ignore(X_n_rows);\n    arma_ignore(X_n_cols);\n    arma_stop(\"svd(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename T, typename T1>\ninline\nbool\nauxlib::svd(Col<T>& S, const Base<std::complex<T>, T1>& X, uword& X_n_rows, uword& X_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    typedef std::complex<T> eT;\n    \n    Mat<eT> A(X.get_ref());\n    \n    X_n_rows = A.n_rows;\n    X_n_cols = A.n_cols;\n    \n    if(A.is_empty())\n      {\n      S.reset();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A);\n    \n    Mat<eT> U(1, 1);\n    Mat<eT> V(1, A.n_cols);\n    \n    char jobu  = 'N';\n    char jobvt = 'N';\n    \n    blas_int  m      = A.n_rows;\n    blas_int  n      = A.n_cols;\n    blas_int  min_mn = (std::min)(m,n);\n    blas_int  lda    = A.n_rows;\n    blas_int  ldu    = U.n_rows;\n    blas_int  ldvt   = V.n_rows;\n    blas_int  lwork  = 3 * ( (std::max)(blas_int(1), 2*min_mn+(std::max)(m,n) ) );\n    blas_int  info   = 0;\n    \n    S.set_size( static_cast<uword>(min_mn) );\n    \n    podarray<eT>   work( static_cast<uword>(lwork   ) );\n    podarray< T>  rwork( static_cast<uword>(5*min_mn) );\n    \n    // let gesvd_() calculate the optimum size of the workspace\n    blas_int lwork_tmp = -1;\n    \n    lapack::cx_gesvd<T>\n      (\n      &jobu, &jobvt,\n      &m, &n,\n      A.memptr(), &lda,\n      S.memptr(),\n      U.memptr(), &ldu,\n      V.memptr(), &ldvt,\n      work.memptr(), &lwork_tmp,\n      rwork.memptr(),\n      &info\n      );\n    \n    if(info == 0)\n      {\n      blas_int proposed_lwork = static_cast<blas_int>(real(work[0]));\n      if(proposed_lwork > lwork)\n        {\n        lwork = proposed_lwork;\n        work.set_size( static_cast<uword>(lwork) );\n        }\n      \n      lapack::cx_gesvd<T>\n        (\n        &jobu, &jobvt,\n        &m, &n,\n        A.memptr(), &lda,\n        S.memptr(),\n        U.memptr(), &ldu,\n        V.memptr(), &ldvt,\n        work.memptr(), &lwork,\n        rwork.memptr(),\n        &info\n        );\n      }\n        \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(S);\n    arma_ignore(X);\n    arma_ignore(X_n_rows);\n    arma_ignore(X_n_cols);\n\n    arma_stop(\"svd(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::svd(Col<eT>& S, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  uword junk;\n  return auxlib::svd(S, X, junk, junk);\n  }\n\n\n\ntemplate<typename T, typename T1>\ninline\nbool\nauxlib::svd(Col<T>& S, const Base<std::complex<T>, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  uword junk;\n  return auxlib::svd(S, X, junk, junk);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::svd(Mat<eT>& U, Col<eT>& S, Mat<eT>& V, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    Mat<eT> A(X.get_ref());\n    \n    if(A.is_empty())\n      {\n      U.eye(A.n_rows, A.n_rows);\n      S.reset();\n      V.eye(A.n_cols, A.n_cols);\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A);\n    \n    U.set_size(A.n_rows, A.n_rows);\n    V.set_size(A.n_cols, A.n_cols);\n    \n    char jobu  = 'A';\n    char jobvt = 'A';\n    \n    blas_int  m          = blas_int(A.n_rows);\n    blas_int  n          = blas_int(A.n_cols);\n    blas_int  min_mn     = (std::min)(m,n);\n    blas_int  lda        = blas_int(A.n_rows);\n    blas_int  ldu        = blas_int(U.n_rows);\n    blas_int  ldvt       = blas_int(V.n_rows);\n    blas_int  lwork_min  = (std::max)( blas_int(1), (std::max)( (3*min_mn + (std::max)(m,n)), 5*min_mn ) );\n    blas_int  lwork      = 0;\n    blas_int  info       = 0;\n    \n    S.set_size( static_cast<uword>(min_mn) );\n    \n    // let gesvd_() calculate the optimum size of the workspace\n    eT        work_query[2];\n    blas_int lwork_query = -1;\n    \n    lapack::gesvd<eT>\n      (\n      &jobu, &jobvt, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, &work_query[0], &lwork_query, &info\n      );\n    \n    if(info == 0)\n      {\n      const blas_int lwork_proposed = static_cast<blas_int>( work_query[0] );\n      \n      lwork = (lwork_proposed > lwork_min) ? lwork_proposed : lwork_min;\n      \n      podarray<eT> work( static_cast<uword>(lwork) );\n      \n      lapack::gesvd<eT>\n        (\n        &jobu, &jobvt, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, work.memptr(), &lwork, &info\n        );\n      \n      op_strans::apply_mat_inplace(V);\n      }\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(U);\n    arma_ignore(S);\n    arma_ignore(V);\n    arma_ignore(X);\n    arma_stop(\"svd(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename T, typename T1>\ninline\nbool\nauxlib::svd(Mat< std::complex<T> >& U, Col<T>& S, Mat< std::complex<T> >& V, const Base< std::complex<T>, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    typedef std::complex<T> eT;\n    \n    Mat<eT> A(X.get_ref());\n    \n    if(A.is_empty())\n      {\n      U.eye(A.n_rows, A.n_rows);\n      S.reset();\n      V.eye(A.n_cols, A.n_cols);\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A);\n    \n    U.set_size(A.n_rows, A.n_rows);\n    V.set_size(A.n_cols, A.n_cols);\n    \n    char jobu  = 'A';\n    char jobvt = 'A';\n    \n    blas_int  m      = blas_int(A.n_rows);\n    blas_int  n      = blas_int(A.n_cols);\n    blas_int  min_mn = (std::min)(m,n);\n    blas_int  lda    = blas_int(A.n_rows);\n    blas_int  ldu    = blas_int(U.n_rows);\n    blas_int  ldvt   = blas_int(V.n_rows);\n    blas_int  lwork  = 3 * ( (std::max)(blas_int(1), 2*min_mn + (std::max)(m,n) ) );\n    blas_int  info   = 0;\n    \n    S.set_size( static_cast<uword>(min_mn) );\n    \n    podarray<eT>  work( static_cast<uword>(lwork   ) );\n    podarray<T>  rwork( static_cast<uword>(5*min_mn) );\n    \n    // let gesvd_() calculate the optimum size of the workspace\n    blas_int lwork_tmp = -1;\n    lapack::cx_gesvd<T>\n     (\n     &jobu, &jobvt,\n     &m, &n,\n     A.memptr(), &lda,\n     S.memptr(),\n     U.memptr(), &ldu,\n     V.memptr(), &ldvt,\n     work.memptr(), &lwork_tmp,\n     rwork.memptr(),\n     &info\n     );\n    \n    if(info == 0)\n      {\n      blas_int proposed_lwork = static_cast<blas_int>(real(work[0]));\n      \n      if(proposed_lwork > lwork)\n        {\n        lwork = proposed_lwork;\n        work.set_size( static_cast<uword>(lwork) );\n        }\n      \n      lapack::cx_gesvd<T>\n        (\n        &jobu, &jobvt,\n        &m, &n,\n        A.memptr(), &lda,\n        S.memptr(),\n        U.memptr(), &ldu,\n        V.memptr(), &ldvt,\n        work.memptr(), &lwork,\n        rwork.memptr(),\n        &info\n        );\n      \n      op_htrans::apply_mat_inplace(V);\n      }\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(U);\n    arma_ignore(S);\n    arma_ignore(V);\n    arma_ignore(X);\n    arma_stop(\"svd(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::svd_econ(Mat<eT>& U, Col<eT>& S, Mat<eT>& V, const Base<eT,T1>& X, const char mode)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    Mat<eT> A(X.get_ref());\n    \n    arma_debug_assert_blas_size(A);\n    \n    blas_int m      = blas_int(A.n_rows);\n    blas_int n      = blas_int(A.n_cols);\n    blas_int min_mn = (std::min)(m,n);\n    blas_int lda    = blas_int(A.n_rows);\n    \n    S.set_size( static_cast<uword>(min_mn) );\n    \n    blas_int ldu  = 0;\n    blas_int ldvt = 0;\n    \n    char jobu;\n    char jobvt;\n    \n    switch(mode)\n      {\n      case 'l':\n        jobu  = 'S';\n        jobvt = 'N';\n        \n        ldu  = m;\n        ldvt = 1;\n        \n        U.set_size( static_cast<uword>(ldu), static_cast<uword>(min_mn) );\n        V.reset();\n        \n        break;\n      \n      \n      case 'r':\n        jobu  = 'N';\n        jobvt = 'S';\n        \n        ldu = 1;\n        ldvt = (std::min)(m,n);\n        \n        U.reset();\n        V.set_size( static_cast<uword>(ldvt), static_cast<uword>(n) );\n        \n        break;\n      \n      \n      case 'b':\n        jobu  = 'S';\n        jobvt = 'S';\n        \n        ldu  = m;\n        ldvt = (std::min)(m,n);\n        \n        U.set_size( static_cast<uword>(ldu),  static_cast<uword>(min_mn) );\n        V.set_size( static_cast<uword>(ldvt), static_cast<uword>(n     ) );\n        \n        break;\n      \n      \n      default:\n        U.reset();\n        S.reset();\n        V.reset();\n        return false;\n      }\n    \n    \n    if(A.is_empty())\n      {\n      U.eye();\n      S.reset();\n      V.eye();\n      return true;\n      }\n    \n    \n    blas_int lwork = 3 * ( (std::max)(blas_int(1), (std::max)( (3*min_mn + (std::max)(m,n)), 5*min_mn ) ) );\n    blas_int info  = 0;\n    \n    \n    podarray<eT> work( static_cast<uword>(lwork) );\n    \n    // let gesvd_() calculate the optimum size of the workspace\n    blas_int lwork_tmp = -1;\n    \n    lapack::gesvd<eT>\n      (\n      &jobu, &jobvt,\n      &m, &n,\n      A.memptr(), &lda,\n      S.memptr(),\n      U.memptr(), &ldu,\n      V.memptr(), &ldvt,\n      work.memptr(), &lwork_tmp,\n      &info\n      );\n    \n    if(info == 0)\n      {\n      blas_int proposed_lwork = static_cast<blas_int>(work[0]);\n      if(proposed_lwork > lwork)\n        {\n        lwork = proposed_lwork;\n        work.set_size( static_cast<uword>(lwork) );\n        }\n      \n      lapack::gesvd<eT>\n        (\n        &jobu, &jobvt,\n        &m, &n,\n        A.memptr(), &lda,\n        S.memptr(),\n        U.memptr(), &ldu,\n        V.memptr(), &ldvt,\n        work.memptr(), &lwork,\n        &info\n        );\n      \n      op_strans::apply_mat_inplace(V);\n      }\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(U);\n    arma_ignore(S);\n    arma_ignore(V);\n    arma_ignore(X);\n    arma_ignore(mode);\n    arma_stop(\"svd(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename T, typename T1>\ninline\nbool\nauxlib::svd_econ(Mat< std::complex<T> >& U, Col<T>& S, Mat< std::complex<T> >& V, const Base< std::complex<T>, T1>& X, const char mode)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    typedef std::complex<T> eT;\n    \n    Mat<eT> A(X.get_ref());\n    \n    arma_debug_assert_blas_size(A);\n    \n    blas_int m      = blas_int(A.n_rows);\n    blas_int n      = blas_int(A.n_cols);\n    blas_int min_mn = (std::min)(m,n);\n    blas_int lda    = blas_int(A.n_rows);\n    \n    S.set_size( static_cast<uword>(min_mn) );\n    \n    blas_int ldu  = 0;\n    blas_int ldvt = 0;\n    \n    char jobu;\n    char jobvt;\n    \n    switch(mode)\n      {\n      case 'l':\n        jobu  = 'S';\n        jobvt = 'N';\n        \n        ldu  = m;\n        ldvt = 1;\n        \n        U.set_size( static_cast<uword>(ldu), static_cast<uword>(min_mn) );\n        V.reset();\n        \n        break;\n      \n      \n      case 'r':\n        jobu  = 'N';\n        jobvt = 'S';\n        \n        ldu  = 1;\n        ldvt = (std::min)(m,n);\n        \n        U.reset();\n        V.set_size( static_cast<uword>(ldvt), static_cast<uword>(n) );\n        \n        break;\n      \n      \n      case 'b':\n        jobu  = 'S';\n        jobvt = 'S';\n        \n        ldu  = m;\n        ldvt = (std::min)(m,n);\n        \n        U.set_size( static_cast<uword>(ldu),  static_cast<uword>(min_mn) );\n        V.set_size( static_cast<uword>(ldvt), static_cast<uword>(n)      );\n        \n        break;\n      \n      \n      default:\n        U.reset();\n        S.reset();\n        V.reset();\n        return false;\n      }\n    \n    \n    if(A.is_empty())\n      {\n      U.eye();\n      S.reset();\n      V.eye();\n      return true;\n      }\n    \n    \n    blas_int lwork = 3 * ( (std::max)(blas_int(1), (std::max)( (3*min_mn + (std::max)(m,n)), 5*min_mn ) ) );\n    blas_int info  = 0;\n    \n    \n    podarray<eT>  work( static_cast<uword>(lwork   ) );\n    podarray<T>  rwork( static_cast<uword>(5*min_mn) );\n    \n    // let gesvd_() calculate the optimum size of the workspace\n    blas_int lwork_tmp = -1;\n    \n    lapack::cx_gesvd<T>\n      (\n      &jobu, &jobvt,\n      &m, &n,\n      A.memptr(), &lda,\n      S.memptr(),\n      U.memptr(), &ldu,\n      V.memptr(), &ldvt,\n      work.memptr(), &lwork_tmp,\n      rwork.memptr(),\n      &info\n      );\n    \n    if(info == 0)\n      {\n      blas_int proposed_lwork = static_cast<blas_int>(real(work[0]));\n      if(proposed_lwork > lwork)\n        {\n        lwork = proposed_lwork;\n        work.set_size( static_cast<uword>(lwork) );\n        }\n      \n      lapack::cx_gesvd<T>\n        (\n        &jobu, &jobvt,\n        &m, &n,\n        A.memptr(), &lda,\n        S.memptr(),\n        U.memptr(), &ldu,\n        V.memptr(), &ldvt,\n        work.memptr(), &lwork,\n        rwork.memptr(),\n        &info\n        );\n      \n      op_htrans::apply_mat_inplace(V);\n      }\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(U);\n    arma_ignore(S);\n    arma_ignore(V);\n    arma_ignore(X);\n    arma_ignore(mode);\n    arma_stop(\"svd(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n// EXPERIMENTAL\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::svd_dc(Col<eT>& S, const Base<eT,T1>& X, uword& X_n_rows, uword& X_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    Mat<eT> A(X.get_ref());\n    \n    X_n_rows = A.n_rows;\n    X_n_cols = A.n_cols;\n    \n    if(A.is_empty())\n      {\n      S.reset();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A);\n    \n    Mat<eT> U(1, 1);\n    Mat<eT> V(1, 1);\n    \n    char jobz = 'N';\n    \n    blas_int  m      = blas_int(A.n_rows);\n    blas_int  n      = blas_int(A.n_cols);\n    blas_int  min_mn = (std::min)(m,n);\n    blas_int  lda    = blas_int(A.n_rows);\n    blas_int  ldu    = blas_int(U.n_rows);\n    blas_int  ldvt   = blas_int(V.n_rows);\n    blas_int  lwork  = 3 * ( 3*min_mn + std::max( std::max(m,n), 7*min_mn ) );\n    blas_int  info   = 0;\n    \n    S.set_size( static_cast<uword>(min_mn) );\n    \n    podarray<eT>        work( static_cast<uword>(lwork   ) );\n    podarray<blas_int> iwork( static_cast<uword>(8*min_mn) );\n    \n    lapack::gesdd<eT>\n      (\n      &jobz, &m, &n,\n      A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt,\n      work.memptr(), &lwork, iwork.memptr(), &info\n      );\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(S);\n    arma_ignore(X);\n    arma_ignore(X_n_rows);\n    arma_ignore(X_n_cols);\n    arma_stop(\"svd(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n// EXPERIMENTAL\ntemplate<typename T, typename T1>\ninline\nbool\nauxlib::svd_dc(Col<T>& S, const Base<std::complex<T>, T1>& X, uword& X_n_rows, uword& X_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if (defined(ARMA_USE_LAPACK) && defined(ARMA_DONT_USE_CX_GESDD))\n    {\n    arma_extra_debug_print(\"auxlib::svd_dc(): redirecting to auxlib::svd(), as use of lapack::cx_gesdd() is disabled\");\n    \n    return auxlib::svd(S, X, X_n_rows, X_n_cols);\n    }\n  #elif defined(ARMA_USE_LAPACK)\n    {\n    typedef std::complex<T> eT;\n    \n    Mat<eT> A(X.get_ref());\n    \n    X_n_rows = A.n_rows;\n    X_n_cols = A.n_cols;\n    \n    if(A.is_empty())\n      {\n      S.reset();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A);\n    \n    Mat<eT> U(1, 1);\n    Mat<eT> V(1, 1);\n    \n    char jobz = 'N';\n    \n    blas_int  m      = blas_int(A.n_rows);\n    blas_int  n      = blas_int(A.n_cols);\n    blas_int  min_mn = (std::min)(m,n);\n    blas_int  lda    = blas_int(A.n_rows);\n    blas_int  ldu    = blas_int(U.n_rows);\n    blas_int  ldvt   = blas_int(V.n_rows);\n    blas_int  lwork  = 3 * (2*min_mn + std::max(m,n));  \n    blas_int  info   = 0;\n    \n    S.set_size( static_cast<uword>(min_mn) );\n    \n    podarray<eT>        work( static_cast<uword>(lwork   ) );\n    podarray<T>        rwork( static_cast<uword>(7*min_mn) );  // LAPACK 3.4.2 docs state 5*min(m,n), while zgesdd() seems to write past the end \n    podarray<blas_int> iwork( static_cast<uword>(8*min_mn) );\n    \n    lapack::cx_gesdd<T>\n      (\n      &jobz, &m, &n,\n      A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt,\n      work.memptr(), &lwork, rwork.memptr(), iwork.memptr(), &info\n      );\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(S);\n    arma_ignore(X);\n    arma_ignore(X_n_rows);\n    arma_ignore(X_n_cols);\n    arma_stop(\"svd(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n// EXPERIMENTAL\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::svd_dc(Col<eT>& S, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  uword junk;\n  return auxlib::svd_dc(S, X, junk, junk);\n  }\n\n\n\n// EXPERIMENTAL\ntemplate<typename T, typename T1>\ninline\nbool\nauxlib::svd_dc(Col<T>& S, const Base<std::complex<T>, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  uword junk;\n  return auxlib::svd_dc(S, X, junk, junk);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::svd_dc(Mat<eT>& U, Col<eT>& S, Mat<eT>& V, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    Mat<eT> A(X.get_ref());\n    \n    if(A.is_empty())\n      {\n      U.eye(A.n_rows, A.n_rows);\n      S.reset();\n      V.eye(A.n_cols, A.n_cols);\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A);\n    \n    U.set_size(A.n_rows, A.n_rows);\n    V.set_size(A.n_cols, A.n_cols);\n    \n    char jobz = 'A';\n    \n    blas_int  m      = blas_int(A.n_rows);\n    blas_int  n      = blas_int(A.n_cols);\n    blas_int  min_mn = (std::min)(m,n);\n    blas_int  max_mn = (std::max)(m,n);\n    blas_int  lda    = blas_int(A.n_rows);\n    blas_int  ldu    = blas_int(U.n_rows);\n    blas_int  ldvt   = blas_int(V.n_rows);\n    blas_int  lwork1 = 3*min_mn*min_mn + (std::max)( max_mn, 4*min_mn*min_mn + 4*min_mn          );\n    blas_int  lwork2 = 3*min_mn        + (std::max)( max_mn, 4*min_mn*min_mn + 3*min_mn + max_mn );\n    blas_int  lwork  = 2 * ((std::max)(lwork1, lwork2));  // due to differences between lapack 3.1 and 3.4\n    blas_int  info   = 0;\n    \n    S.set_size( static_cast<uword>(min_mn) );\n    \n    podarray<eT>        work( static_cast<uword>(lwork   ) );\n    podarray<blas_int> iwork( static_cast<uword>(8*min_mn) );\n    \n    lapack::gesdd<eT>\n      (\n      &jobz, &m, &n,\n      A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt,\n      work.memptr(), &lwork, iwork.memptr(), &info\n      );\n    \n    op_strans::apply_mat_inplace(V);\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(U);\n    arma_ignore(S);\n    arma_ignore(V);\n    arma_ignore(X);\n    arma_stop(\"svd(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename T, typename T1>\ninline\nbool\nauxlib::svd_dc(Mat< std::complex<T> >& U, Col<T>& S, Mat< std::complex<T> >& V, const Base< std::complex<T>, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if (defined(ARMA_USE_LAPACK) && defined(ARMA_DONT_USE_CX_GESDD))\n    {\n    arma_extra_debug_print(\"auxlib::svd_dc(): redirecting to auxlib::svd(), as use of lapack::cx_gesdd() is disabled\");\n    \n    return auxlib::svd(U, S, V, X);\n    }\n  #elif defined(ARMA_USE_LAPACK)\n    {\n    typedef std::complex<T> eT;\n    \n    Mat<eT> A(X.get_ref());\n    \n    if(A.is_empty())\n      {\n      U.eye(A.n_rows, A.n_rows);\n      S.reset();\n      V.eye(A.n_cols, A.n_cols);\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A);\n    \n    U.set_size(A.n_rows, A.n_rows);\n    V.set_size(A.n_cols, A.n_cols);\n    \n    char jobz = 'A';\n    \n    blas_int m       = blas_int(A.n_rows);\n    blas_int n       = blas_int(A.n_cols);\n    blas_int min_mn  = (std::min)(m,n);\n    blas_int max_mn  = (std::max)(m,n);\n    blas_int lda     = blas_int(A.n_rows);\n    blas_int ldu     = blas_int(U.n_rows);\n    blas_int ldvt    = blas_int(V.n_rows);\n    blas_int lwork   = 2 * (min_mn*min_mn + 2*min_mn + max_mn);\n    blas_int lrwork1 = 5*min_mn*min_mn + 7*min_mn;\n    blas_int lrwork2 = min_mn * ((std::max)(5*min_mn+7, 2*max_mn + 2*min_mn+1));\n    blas_int lrwork  = (std::max)(lrwork1, lrwork2);  // due to differences between lapack 3.1 and 3.4\n    blas_int info    = 0;\n    \n    S.set_size( static_cast<uword>(min_mn) );\n    \n    podarray<eT>        work( static_cast<uword>(lwork   ) );\n    podarray<T>        rwork( static_cast<uword>(lrwork  ) );\n    podarray<blas_int> iwork( static_cast<uword>(8*min_mn) );\n    \n    lapack::cx_gesdd<T>\n      (\n      &jobz, &m, &n,\n      A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt,\n      work.memptr(), &lwork, rwork.memptr(), iwork.memptr(), &info\n      );\n    \n    op_htrans::apply_mat_inplace(V);\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(U);\n    arma_ignore(S);\n    arma_ignore(V);\n    arma_ignore(X);\n    arma_stop(\"svd(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::svd_dc_econ(Mat<eT>& U, Col<eT>& S, Mat<eT>& V, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    Mat<eT> A(X.get_ref());\n    \n    arma_debug_assert_blas_size(A);\n    \n    char jobz = 'S';\n    \n    blas_int m      = blas_int(A.n_rows);\n    blas_int n      = blas_int(A.n_cols);\n    blas_int min_mn = (std::min)(m,n);\n    blas_int max_mn = (std::max)(m,n);\n    blas_int lda    = blas_int(A.n_rows);\n    blas_int ldu    = m;\n    blas_int ldvt   = min_mn;\n    blas_int lwork1 = 3*min_mn*min_mn + (std::max)( max_mn, 4*min_mn*min_mn + 4*min_mn          );\n    blas_int lwork2 = 3*min_mn        + (std::max)( max_mn, 4*min_mn*min_mn + 3*min_mn + max_mn );\n    blas_int lwork  = 2 * ((std::max)(lwork1, lwork2));  // due to differences between lapack 3.1 and 3.4\n    blas_int info   = 0;\n    \n    if(A.is_empty())\n      {\n      U.eye();\n      S.reset();\n      V.eye( static_cast<uword>(n), static_cast<uword>(min_mn) );\n      return true;\n      }\n    \n    S.set_size( static_cast<uword>(min_mn) );\n    \n    U.set_size( static_cast<uword>(m), static_cast<uword>(min_mn) );\n    \n    V.set_size( static_cast<uword>(min_mn), static_cast<uword>(n) );\n    \n    podarray<eT>        work( static_cast<uword>(lwork   ) );\n    podarray<blas_int> iwork( static_cast<uword>(8*min_mn) );\n    \n    lapack::gesdd<eT>\n      (\n      &jobz, &m, &n,\n      A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt,\n      work.memptr(), &lwork, iwork.memptr(), &info\n      );\n    \n    op_strans::apply_mat_inplace(V);\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(U);\n    arma_ignore(S);\n    arma_ignore(V);\n    arma_ignore(X);\n    arma_stop(\"svd(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename T, typename T1>\ninline\nbool\nauxlib::svd_dc_econ(Mat< std::complex<T> >& U, Col<T>& S, Mat< std::complex<T> >& V, const Base< std::complex<T>, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if (defined(ARMA_USE_LAPACK) && defined(ARMA_DONT_USE_CX_GESDD))\n    {\n    arma_extra_debug_print(\"auxlib::svd_dc_econ(): redirecting to auxlib::svd_econ(), as use of lapack::cx_gesdd() is disabled\");\n    \n    return auxlib::svd_econ(U, S, V, X, 'b');\n    }\n  #elif defined(ARMA_USE_LAPACK)\n    {\n    typedef std::complex<T> eT;\n    \n    Mat<eT> A(X.get_ref());\n    \n    arma_debug_assert_blas_size(A);\n    \n    char jobz = 'S';\n    \n    blas_int m       = blas_int(A.n_rows);\n    blas_int n       = blas_int(A.n_cols);\n    blas_int min_mn  = (std::min)(m,n);\n    blas_int max_mn  = (std::max)(m,n);\n    blas_int lda     = blas_int(A.n_rows);\n    blas_int ldu     = m;\n    blas_int ldvt    = min_mn;\n    blas_int lwork   = 2 * (min_mn*min_mn + 2*min_mn + max_mn);\n    blas_int lrwork1 = 5*min_mn*min_mn + 7*min_mn;\n    blas_int lrwork2 = min_mn * ((std::max)(5*min_mn+7, 2*max_mn + 2*min_mn+1));\n    blas_int lrwork  = (std::max)(lrwork1, lrwork2);  // due to differences between lapack 3.1 and 3.4\n    blas_int info    = 0;\n    \n    if(A.is_empty())\n      {\n      U.eye();\n      S.reset();\n      V.eye( static_cast<uword>(n), static_cast<uword>(min_mn) );\n      return true;\n      }\n    \n    S.set_size( static_cast<uword>(min_mn) );\n    \n    U.set_size( static_cast<uword>(m), static_cast<uword>(min_mn) );\n    \n    V.set_size( static_cast<uword>(min_mn), static_cast<uword>(n) );\n    \n    podarray<eT>        work( static_cast<uword>(lwork   ) );\n    podarray<T>        rwork( static_cast<uword>(lrwork  ) );\n    podarray<blas_int> iwork( static_cast<uword>(8*min_mn) );\n    \n    lapack::cx_gesdd<T>\n      (\n      &jobz, &m, &n,\n      A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt,\n      work.memptr(), &lwork, rwork.memptr(), iwork.memptr(), &info\n      );\n    \n    op_htrans::apply_mat_inplace(V);\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(U);\n    arma_ignore(S);\n    arma_ignore(V);\n    arma_ignore(X);\n    arma_stop(\"svd(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n//! Solve a system of linear equations.\n//! Assumes that A.n_rows = A.n_cols and B.n_rows = A.n_rows\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::solve(Mat<eT>& out, Mat<eT>& A, const Base<eT,T1>& X, const bool slow)\n  {\n  arma_extra_debug_sigprint();\n  \n  bool status = false;\n  \n  const uword A_n_rows = A.n_rows;\n  \n  if( (A_n_rows <= 4) && (slow == false) )\n    {\n    Mat<eT> A_inv(A_n_rows, A_n_rows);\n    \n    status = auxlib::inv_noalias_tinymat(A_inv, A, A_n_rows);\n    \n    if(status == true)\n      {\n      const unwrap_check<T1> Y( X.get_ref(), out );\n      const Mat<eT>& B     = Y.M;\n      \n      const uword B_n_rows = B.n_rows;\n      const uword B_n_cols = B.n_cols;\n      \n      arma_debug_check( (A_n_rows != B_n_rows), \"solve(): number of rows in the given objects must be the same\" );\n      \n      if(A.is_empty() || B.is_empty())\n        {\n        out.zeros(A.n_cols, B_n_cols);\n        return true;\n        }\n      \n      out.set_size(A_n_rows, B_n_cols);\n      \n      gemm_emul<false,false,false,false>::apply(out, A_inv, B);\n      \n      return true;\n      }\n    }\n  \n  if( (A_n_rows > 4) || (status == false) )\n    {\n    out = X.get_ref();\n    \n    const uword B_n_rows = out.n_rows;\n    const uword B_n_cols = out.n_cols;\n      \n    arma_debug_check( (A_n_rows != B_n_rows), \"solve(): number of rows in the given objects must be the same\" );\n      \n    if(A.is_empty() || out.is_empty())\n      {\n      out.zeros(A.n_cols, B_n_cols);\n      return true;\n      }\n    \n    #if defined(ARMA_USE_ATLAS)\n      {\n      arma_debug_assert_atlas_size(A);\n      \n      podarray<int> ipiv(A_n_rows + 2);  // +2 for paranoia: old versions of Atlas might be trashing memory\n      \n      int info = atlas::clapack_gesv<eT>(atlas::CblasColMajor, A_n_rows, B_n_cols, A.memptr(), A_n_rows, ipiv.memptr(), out.memptr(), A_n_rows);\n      \n      return (info == 0);\n      }\n    #elif defined(ARMA_USE_LAPACK)\n      {\n      arma_debug_assert_blas_size(A);\n      \n      blas_int n    = blas_int(A_n_rows);  // assuming A is square\n      blas_int lda  = blas_int(A_n_rows);\n      blas_int ldb  = blas_int(A_n_rows);\n      blas_int nrhs = blas_int(B_n_cols);\n      blas_int info = 0;\n      \n      podarray<blas_int> ipiv(A_n_rows + 2);  // +2 for paranoia: some versions of Lapack might be trashing memory\n      \n      arma_extra_debug_print(\"lapack::gesv()\");\n      lapack::gesv<eT>(&n, &nrhs, A.memptr(), &lda, ipiv.memptr(), out.memptr(), &ldb, &info);\n      \n      arma_extra_debug_print(\"lapack::gesv() -- finished\");\n      \n      return (info == 0);\n      }\n    #else\n      {\n      arma_stop(\"solve(): use of ATLAS or LAPACK needs to be enabled\");\n      return false;\n      }\n    #endif\n    }\n  \n  return true;\n  }\n\n\n\n//! Solve an over-determined system.\n//! Assumes that A.n_rows > A.n_cols and B.n_rows = A.n_rows\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::solve_od(Mat<eT>& out, Mat<eT>& A, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    Mat<eT> tmp = X.get_ref();\n    \n    const uword A_n_rows = A.n_rows;\n    const uword A_n_cols = A.n_cols;\n    \n    const uword B_n_rows = tmp.n_rows;\n    const uword B_n_cols = tmp.n_cols;\n      \n    arma_debug_check( (A_n_rows != B_n_rows), \"solve(): number of rows in the given objects must be the same\" );\n    \n    out.set_size(A_n_cols, B_n_cols);\n    \n    if(A.is_empty() || tmp.is_empty())\n      {\n      out.zeros();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A,tmp);\n    \n    char trans = 'N';\n    \n    blas_int  m     = blas_int(A_n_rows);\n    blas_int  n     = blas_int(A_n_cols);\n    blas_int  lda   = blas_int(A_n_rows);\n    blas_int  ldb   = blas_int(A_n_rows);\n    blas_int  nrhs  = blas_int(B_n_cols);\n    blas_int  lwork = 3 * ( (std::max)(blas_int(1), n + (std::max)(n, nrhs)) );\n    blas_int  info  = 0;\n    \n    podarray<eT> work( static_cast<uword>(lwork) );\n    \n    // NOTE: the dgels() function in the lapack library supplied by ATLAS 3.6 seems to have problems\n    arma_extra_debug_print(\"lapack::gels()\");\n    lapack::gels<eT>( &trans, &m, &n, &nrhs, A.memptr(), &lda, tmp.memptr(), &ldb, work.memptr(), &lwork, &info );\n    \n    arma_extra_debug_print(\"lapack::gels() -- finished\");\n    \n    for(uword col=0; col<B_n_cols; ++col)\n      {\n      arrayops::copy( out.colptr(col), tmp.colptr(col), A_n_cols );\n      }\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(out);\n    arma_ignore(A);\n    arma_ignore(X);\n    arma_stop(\"solve(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n//! Solve an under-determined system.\n//! Assumes that A.n_rows < A.n_cols and B.n_rows = A.n_rows\ntemplate<typename eT, typename T1>\ninline\nbool\nauxlib::solve_ud(Mat<eT>& out, Mat<eT>& A, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  // TODO: this function provides the same results as Octave 3.4.2.\n  // TODO: however, these results are different than Matlab 7.12.0.635.\n  // TODO: figure out whether both Octave and Matlab are correct, or only one of them\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    const unwrap<T1>   Y( X.get_ref() );\n    const Mat<eT>& B = Y.M;\n    \n    const uword A_n_rows = A.n_rows;\n    const uword A_n_cols = A.n_cols;\n    \n    const uword B_n_rows = B.n_rows;\n    const uword B_n_cols = B.n_cols;\n    \n    arma_debug_check( (A_n_rows != B_n_rows), \"solve(): number of rows in the given objects must be the same\" );\n    \n    // B could be an alias of \"out\", hence we need to check whether B is empty before setting the size of \"out\"\n    if(A.is_empty() || B.is_empty())\n      {\n      out.zeros(A_n_cols, B_n_cols);\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A,B);\n    \n    char trans = 'N';\n    \n    blas_int  m     = blas_int(A_n_rows);\n    blas_int  n     = blas_int(A_n_cols);\n    blas_int  lda   = blas_int(A_n_rows);\n    blas_int  ldb   = blas_int(A_n_cols);\n    blas_int  nrhs  = blas_int(B_n_cols);\n    blas_int  lwork = 3 * ( (std::max)(blas_int(1), m + (std::max)(m,nrhs)) );\n    blas_int  info  = 0;\n    \n    Mat<eT> tmp(A_n_cols, B_n_cols);\n    tmp.zeros();\n    \n    for(uword col=0; col<B_n_cols; ++col)\n      {\n      eT* tmp_colmem = tmp.colptr(col);\n      \n      arrayops::copy( tmp_colmem, B.colptr(col), B_n_rows );\n      \n      for(uword row=B_n_rows; row<A_n_cols; ++row)\n        {\n        tmp_colmem[row] = eT(0);\n        }\n      }\n    \n    podarray<eT> work( static_cast<uword>(lwork) );\n    \n    // NOTE: the dgels() function in the lapack library supplied by ATLAS 3.6 seems to have problems\n    arma_extra_debug_print(\"lapack::gels()\");\n    lapack::gels<eT>( &trans, &m, &n, &nrhs, A.memptr(), &lda, tmp.memptr(), &ldb, work.memptr(), &lwork, &info );\n    \n    arma_extra_debug_print(\"lapack::gels() -- finished\");\n    \n    out.set_size(A_n_cols, B_n_cols);\n    \n    for(uword col=0; col<B_n_cols; ++col)\n      {\n      arrayops::copy( out.colptr(col), tmp.colptr(col), A_n_cols );\n      }\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(out);\n    arma_ignore(A);\n    arma_ignore(X);\n    arma_stop(\"solve(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n//\n// solve_tr\n\ntemplate<typename eT>\ninline\nbool\nauxlib::solve_tr(Mat<eT>& out, const Mat<eT>& A, const Mat<eT>& B, const uword layout)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    if(A.is_empty() || B.is_empty())\n      {\n      out.zeros(A.n_cols, B.n_cols);\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A,B);\n    \n    out = B;\n    \n    char     uplo  = (layout == 0) ? 'U' : 'L';\n    char     trans = 'N';\n    char     diag  = 'N';\n    blas_int n     = blas_int(A.n_rows);\n    blas_int nrhs  = blas_int(B.n_cols);\n    blas_int info  = 0;\n    \n    lapack::trtrs<eT>(&uplo, &trans, &diag, &n, &nrhs, A.memptr(), &n, out.memptr(), &n, &info);\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(out);\n    arma_ignore(A);\n    arma_ignore(B);\n    arma_ignore(layout);\n    arma_stop(\"solve(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n//\n// Schur decomposition\n\ntemplate<typename eT>\ninline\nbool\nauxlib::schur_dec(Mat<eT>& Z, Mat<eT>& T, const Mat<eT>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    arma_debug_check( (A.is_square() == false), \"schur_dec(): given matrix is not square\" );\n    \n    if(A.is_empty())\n      {\n      Z.reset();\n      T.reset();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A);\n    \n    const uword A_n_rows = A.n_rows;\n    \n    Z.set_size(A_n_rows, A_n_rows);\n    T = A;\n    \n    char    jobvs    = 'V';                // get Schur vectors (Z)\n    char     sort    = 'N';                // do not sort eigenvalues/vectors\n    blas_int* select = 0;                  // pointer to sorting function\n    blas_int    n    = blas_int(A_n_rows);\n    blas_int sdim    = 0;                  // output for sorting\n    blas_int lwork   = 3 * ( (std::max)(blas_int(1), 3*n) );\n    blas_int info    = 0;\n    \n    podarray<eT>       work( static_cast<uword>(lwork) );\n    podarray<blas_int> bwork(A_n_rows);\n    \n    podarray<eT> wr(A_n_rows);             // output for eigenvalues\n    podarray<eT> wi(A_n_rows);             // output for eigenvalues\n    \n    lapack::gees(&jobvs, &sort, select, &n, T.memptr(), &n, &sdim, wr.memptr(), wi.memptr(), Z.memptr(), &n, work.memptr(), &lwork, bwork.memptr(), &info);\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(Z);\n    arma_ignore(T);\n    arma_ignore(A);\n    \n    arma_stop(\"schur_dec(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename cT>\ninline\nbool\nauxlib::schur_dec(Mat<std::complex<cT> >& Z, Mat<std::complex<cT> >& T, const Mat<std::complex<cT> >& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    arma_debug_check( (A.is_square() == false), \"schur_dec(): matrix A is not square\" );\n    \n    if(A.is_empty())\n      {\n      Z.reset();\n      T.reset();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A);\n    \n    typedef std::complex<cT> eT;\n    \n    const uword A_n_rows = A.n_rows;\n    \n    Z.set_size(A_n_rows, A_n_rows);\n    T = A;\n    \n    char        jobvs = 'V';                // get Schur vectors (Z)\n    char         sort = 'N';                // do not sort eigenvalues/vectors\n    blas_int*  select = 0;                  // pointer to sorting function\n    blas_int        n = blas_int(A_n_rows);\n    blas_int     sdim = 0;                  // output for sorting\n    blas_int lwork    = 3 * ( (std::max)(blas_int(1), 2*n) );\n    blas_int info     = 0;\n    \n    podarray<eT>       work( static_cast<uword>(lwork) );\n    podarray<blas_int> bwork(A_n_rows);\n    \n    podarray<eT>     w(A_n_rows);           // output for eigenvalues\n    podarray<cT> rwork(A_n_rows);\n    \n    lapack::cx_gees(&jobvs, &sort, select, &n, T.memptr(), &n, &sdim, w.memptr(), Z.memptr(), &n, work.memptr(), &lwork, rwork.memptr(), bwork.memptr(), &info);\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(Z);\n    arma_ignore(T);\n    arma_ignore(A);\n    \n    arma_stop(\"schur_dec(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n//\n// syl (solution of the Sylvester equation AX + XB = C)\n\ntemplate<typename eT>\ninline\nbool\nauxlib::syl(Mat<eT>& X, const Mat<eT>& A, const Mat<eT>& B, const Mat<eT>& C)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (A.is_square() == false) || (B.is_square() == false),\n    \"syl(): given matrix is not square\"\n    );\n    \n  arma_debug_check\n    (\n    (C.n_rows != A.n_rows) || (C.n_cols != B.n_cols),\n    \"syl(): matrices are not conformant\"\n    );\n  \n  if(A.is_empty() || B.is_empty() || C.is_empty())\n    {\n    X.reset();\n    return true;\n    }\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    Mat<eT> Z1, Z2, T1, T2;\n    \n    const bool status_sd1 = auxlib::schur_dec(Z1, T1, A);\n    const bool status_sd2 = auxlib::schur_dec(Z2, T2, B);\n    \n    if( (status_sd1 == false) || (status_sd2 == false) )\n      {\n      return false;\n      }\n    \n    char     trana = 'N';\n    char     tranb = 'N';\n    blas_int  isgn = +1;\n    blas_int     m = blas_int(T1.n_rows);\n    blas_int     n = blas_int(T2.n_cols);\n    \n    eT       scale = eT(0);\n    blas_int  info = 0;\n    \n    Mat<eT> Y = trans(Z1) * C * Z2;\n    \n    lapack::trsyl<eT>(&trana, &tranb, &isgn, &m, &n, T1.memptr(), &m, T2.memptr(), &n, Y.memptr(), &m, &scale, &info);\n    \n    //Y /= scale;\n    Y /= (-scale);\n    \n    X = Z1 * Y * trans(Z2);\n    \n    return (info >= 0);\n    }\n  #else\n    {\n    arma_stop(\"syl(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n  \n  \n  \n//\n// lyap (solution of the continuous Lyapunov equation AX + XA^H + Q = 0)\n\ntemplate<typename eT>\ninline\nbool\nauxlib::lyap(Mat<eT>& X, const Mat<eT>& A, const Mat<eT>& Q)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (A.is_square() == false), \"lyap(): matrix A is not square\");\n  arma_debug_check( (Q.is_square() == false), \"lyap(): matrix Q is not square\");\n  arma_debug_check( (A.n_rows != Q.n_rows),   \"lyap(): matrices A and Q have different dimensions\");\n  \n  Mat<eT> htransA;\n  op_htrans::apply_mat_noalias(htransA, A);\n  \n  const Mat<eT> mQ = -Q;\n  \n  return auxlib::syl(X, A, htransA, mQ);\n  }\n\n\n\n//\n// dlyap (solution of the discrete Lyapunov equation AXA^H - X + Q = 0)\n\ntemplate<typename eT>\ninline\nbool\nauxlib::dlyap(Mat<eT>& X, const Mat<eT>& A, const Mat<eT>& Q)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (A.is_square() == false), \"dlyap(): matrix A is not square\");\n  arma_debug_check( (Q.is_square() == false), \"dlyap(): matrix Q is not square\");\n  arma_debug_check( (A.n_rows != Q.n_rows),   \"dlyap(): matrices A and Q have different dimensions\");\n  \n  const Col<eT> vecQ = reshape(Q, Q.n_elem, 1);\n  \n  const Mat<eT> M = eye< Mat<eT> >(Q.n_elem, Q.n_elem) - kron(conj(A), A);\n  \n  Col<eT> vecX;\n  \n  const bool status = solve(vecX, M, vecQ);\n  \n  if(status == true)\n    {\n    X = reshape(vecX, Q.n_rows, Q.n_cols);\n    return true;\n    }\n  else\n    {\n    X.reset();\n    return false;\n    }\n  }\n\n\n\n//\n// QZ decomposition of general square real matrix pair\n\ntemplate<typename T, typename T1, typename T2>\ninline\nbool\nauxlib::qz(Mat<T>& A, Mat<T>& B, Mat<T>& vsl, Mat<T>& vsr, const Base<T,T1>& X, const Base<T,T2>& Y, const char side)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    char jobvsl;\n    char jobvsr;\n    \n    switch(side)\n      {\n      case 'l':  // left\n        jobvsl = 'V';\n        jobvsr = 'N';\n        break;\n      \n      case 'r':  // right\n        jobvsl = 'N';\n        jobvsr = 'V';\n        break;\n      \n      case 'b':  // both\n        jobvsl = 'V';\n        jobvsr = 'V';\n        break;\n      \n      case 'n':  // neither\n        jobvsl = 'N';\n        jobvsr = 'N';\n        break;\n      \n      default:\n        arma_stop(\"qz(): parameter 'side' is invalid\");\n        return false;\n      }\n    \n    char     eigsort = 'N';\n    char     kdum    = 'N';  // just a dummy\n    blas_int sdim    = 0;\n    \n    A = X.get_ref();\n    B = Y.get_ref();\n    \n    arma_debug_check( ((A.is_square() == false) || (B.is_square() == false)), \"qz(): given matrix is not square\" );\n    \n    arma_debug_check( (A.n_rows != B.n_rows), \"qz(): given matrices must have the same size\" );\n    \n    if(A.is_empty())\n      {\n      A.reset();\n      B.reset();\n      vsl.reset();\n      vsr.reset();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A);\n    \n    const uword A_n_rows = A.n_rows;\n    \n    podarray<T> alphar(A_n_rows);\n    podarray<T> alphai(A_n_rows);\n    podarray<T>   beta(A_n_rows);\n    \n    vsl.set_size( ((jobvsl == 'V') ? A_n_rows : 1), A_n_rows );\n    vsr.set_size( ((jobvsr == 'V') ? A_n_rows : 1), A_n_rows );\n    \n    blas_int N     = blas_int(A_n_rows);\n    blas_int lwork = 3 * ((std::max)(blas_int(1),8*N+16));\n    blas_int info  = 0;\n    \n    podarray<T>   work( static_cast<uword>(lwork) );\n    podarray<T>  bwork( static_cast<uword>(N)     );\n    \n    arma_extra_debug_print(\"lapack::gges()\");\n    \n    lapack::gges\n      (\n      &jobvsl, &jobvsr, &eigsort, &kdum, &N,\n      A.memptr(), &N, B.memptr(), &N, &sdim,\n      alphar.memptr(), alphai.memptr(), beta.memptr(),\n      vsl.memptr(), &N, vsr.memptr(), &N,\n      work.memptr(), &lwork, bwork.memptr(),\n      &info\n      );\n    \n    op_strans::apply_mat_inplace(vsl); // transpose Q\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(A);\n    arma_ignore(B);\n    arma_ignore(vsl);\n    arma_ignore(vsr);\n    arma_ignore(X);\n    arma_ignore(Y);\n    arma_ignore(side);\n    arma_stop(\"qz(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n//\n// QZ decomposition of general square complex matrix pair\n\ntemplate<typename T, typename T1, typename T2>\ninline\nbool\nauxlib::qz(Mat< std::complex<T> >& A, Mat< std::complex<T> >& B, Mat< std::complex<T> >& vsl, Mat< std::complex<T> >& vsr, const Base< std::complex<T>, T1 >& X, const Base< std::complex<T>, T2 >& Y, const char side)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_LAPACK)\n    {\n    typedef typename std::complex<T> eT;\n    \n    char jobvsl;\n    char jobvsr;\n    \n    switch(side)\n      {\n      case 'l':  // left\n        jobvsl = 'V';\n        jobvsr = 'N';\n        break;\n      \n      case 'r':  // right\n        jobvsl = 'N';\n        jobvsr = 'V';\n        break;\n      \n      case 'b':  // both\n        jobvsl = 'V';\n        jobvsr = 'V';\n        break;\n      \n      case 'n':  // neither\n        jobvsl = 'N';\n        jobvsr = 'N';\n        break;\n      \n      default:\n        arma_stop(\"qz(): parameter 'side' is invalid\");\n        return false;\n      }\n    \n    char     eigsort = 'N';\n    char     kdum    = 'N';  // just a dummy\n    blas_int sdim    = 0;\n    \n    A = X.get_ref();\n    B = Y.get_ref();\n    \n    arma_debug_check( ((A.is_square() == false) || (B.is_square() == false)), \"qz(): given matrix is not square\" );\n    \n    arma_debug_check( (A.n_rows != B.n_rows), \"qz(): given matrices must have the same size\" );\n    \n    if(A.is_empty())\n      {\n      A.reset();\n      B.reset();\n      vsl.reset();\n      vsr.reset();\n      return true;\n      }\n    \n    arma_debug_assert_blas_size(A);\n    \n    const uword A_n_rows = A.n_rows;\n    \n    podarray<eT> alpha(A_n_rows);\n    podarray<eT>  beta(A_n_rows);\n    \n    vsl.set_size( ((jobvsl == 'V') ? A_n_rows : 1), A_n_rows );\n    vsr.set_size( ((jobvsr == 'V') ? A_n_rows : 1), A_n_rows );\n    \n    blas_int N     = blas_int(A_n_rows);\n    blas_int lwork = 3 * ((std::max)(blas_int(1),2*N));\n    blas_int info  = 0;\n    \n    podarray<eT>  work( static_cast<uword>(lwork) );\n    podarray<T>  bwork( static_cast<uword>(N)     );\n    podarray<T>  rwork( static_cast<uword>(8*N)   );\n    \n    arma_extra_debug_print(\"lapack::cx_gges()\");\n    \n    lapack::cx_gges\n      (\n      &jobvsl, &jobvsr, &eigsort, &kdum, &N,\n      A.memptr(), &N, B.memptr(), &N, &sdim,\n      alpha.memptr(), beta.memptr(),\n      vsl.memptr(), &N, vsr.memptr(), &N,\n      work.memptr(), &lwork, rwork.memptr(), bwork.memptr(),\n      &info\n      );\n    \n    op_htrans::apply_mat_inplace(vsl); // transpose Q\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(A);\n    arma_ignore(B);\n    arma_ignore(vsl);\n    arma_ignore(vsr);\n    arma_ignore(X);\n    arma_ignore(Y);\n    arma_ignore(side);\n    arma_stop(\"qz(): use of LAPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/blas_bones.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n#ifdef ARMA_USE_BLAS\n\n\n#if !defined(ARMA_BLAS_CAPITALS)\n  \n  #define arma_sdot  sdot\n  #define arma_ddot  ddot\n  \n  #define arma_sgemv sgemv\n  #define arma_dgemv dgemv\n  #define arma_cgemv cgemv\n  #define arma_zgemv zgemv\n  \n  #define arma_sgemm sgemm\n  #define arma_dgemm dgemm\n  #define arma_cgemm cgemm\n  #define arma_zgemm zgemm\n  \n  #define arma_ssyrk ssyrk\n  #define arma_dsyrk dsyrk\n  \n  #define arma_cherk cherk\n  #define arma_zherk zherk\n  \n#else\n  \n  #define arma_sdot  SDOT\n  #define arma_ddot  DDOT\n  \n  #define arma_sgemv SGEMV\n  #define arma_dgemv DGEMV\n  #define arma_cgemv CGEMV\n  #define arma_zgemv ZGEMV\n  \n  #define arma_sgemm SGEMM\n  #define arma_dgemm DGEMM\n  #define arma_cgemm CGEMM\n  #define arma_zgemm ZGEMM\n  \n  #define arma_ssyrk SSYRK\n  #define arma_dsyrk DSYRK\n  \n  #define arma_cherk CHERK\n  #define arma_zherk ZHERK\n  \n#endif\n\n\n\nextern \"C\"\n  {\n  float  arma_fortran(arma_sdot)(blas_int* n, const float*  x, blas_int* incx, const float*  y, blas_int* incy);\n  double arma_fortran(arma_ddot)(blas_int* n, const double* x, blas_int* incx, const double* y, blas_int* incy);\n  \n  void arma_fortran(arma_sgemv)(const char* transA, const blas_int* m, const blas_int* n, const float*  alpha, const float*  A, const blas_int* ldA, const float*  x, const blas_int* incx, const float*  beta, float*  y, const blas_int* incy);\n  void arma_fortran(arma_dgemv)(const char* transA, const blas_int* m, const blas_int* n, const double* alpha, const double* A, const blas_int* ldA, const double* x, const blas_int* incx, const double* beta, double* y, const blas_int* incy);\n  void arma_fortran(arma_cgemv)(const char* transA, const blas_int* m, const blas_int* n, const void*   alpha, const void*   A, const blas_int* ldA, const void*   x, const blas_int* incx, const void*   beta, void*   y, const blas_int* incy);\n  void arma_fortran(arma_zgemv)(const char* transA, const blas_int* m, const blas_int* n, const void*   alpha, const void*   A, const blas_int* ldA, const void*   x, const blas_int* incx, const void*   beta, void*   y, const blas_int* incy);\n  \n  void arma_fortran(arma_sgemm)(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const float*  alpha, const float*  A, const blas_int* ldA, const float*  B, const blas_int* ldB, const float*  beta, float*  C, const blas_int* ldC);\n  void arma_fortran(arma_dgemm)(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const double* alpha, const double* A, const blas_int* ldA, const double* B, const blas_int* ldB, const double* beta, double* C, const blas_int* ldC);\n  void arma_fortran(arma_cgemm)(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const void*   alpha, const void*   A, const blas_int* ldA, const void*   B, const blas_int* ldB, const void*   beta, void*   C, const blas_int* ldC);\n  void arma_fortran(arma_zgemm)(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const void*   alpha, const void*   A, const blas_int* ldA, const void*   B, const blas_int* ldB, const void*   beta, void*   C, const blas_int* ldC);\n  \n  void arma_fortran(arma_ssyrk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const  float* alpha, const  float* A, const blas_int* ldA, const  float* beta,  float* C, const blas_int* ldC);\n  void arma_fortran(arma_dsyrk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const double* alpha, const double* A, const blas_int* ldA, const double* beta, double* C, const blas_int* ldC);\n  \n  void arma_fortran(arma_cherk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const  float* alpha, const   void* A, const blas_int* ldA, const  float* beta,   void* C, const blas_int* ldC);\n  void arma_fortran(arma_zherk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const double* alpha, const   void* A, const blas_int* ldA, const double* beta,   void* C, const blas_int* ldC);\n  \n  // void   arma_fortran(arma_dswap)(const blas_int* n, double* x, const blas_int* incx, double* y, const blas_int* incy);\n  // void   arma_fortran(arma_dscal)(const blas_int* n, const double* alpha, double* x, const blas_int* incx);\n  // void   arma_fortran(arma_dcopy)(const blas_int* n, const double* x, const blas_int* incx, double* y, const blas_int* incy);\n  // void   arma_fortran(arma_daxpy)(const blas_int* n, const double* alpha, const double* x, const blas_int* incx, double* y, const blas_int* incy);\n  // void   arma_fortran(arma_dger )(const blas_int* m, const blas_int* n, const double* alpha, const double* x, const blas_int* incx, const double* y, const blas_int* incy, double* A, const blas_int* ldA);\n  }\n\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/blas_wrapper.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n#ifdef ARMA_USE_BLAS\n\n\n//! \\namespace blas namespace for BLAS functions\nnamespace blas\n  {\n  \n  \n  template<typename eT>\n  inline\n  void\n  gemv(const char* transA, const blas_int* m, const blas_int* n, const eT* alpha, const eT* A, const blas_int* ldA, const eT* x, const blas_int* incx, const eT* beta, eT* y, const blas_int* incy)\n    {\n    arma_type_check((is_supported_blas_type<eT>::value == false));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_sgemv)(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dgemv)(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      arma_fortran(arma_cgemv)(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      arma_fortran(arma_zgemv)(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy);\n      }\n    \n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  gemm(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const eT* alpha, const eT* A, const blas_int* ldA, const eT* B, const blas_int* ldB, const eT* beta, eT* C, const blas_int* ldC)\n    {\n    arma_type_check((is_supported_blas_type<eT>::value == false));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_sgemm)(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dgemm)(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      arma_fortran(arma_cgemm)(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      arma_fortran(arma_zgemm)(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC);\n      }\n    \n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  syrk(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const eT* alpha, const eT* A, const blas_int* ldA, const eT* beta, eT* C, const blas_int* ldC)\n    {\n    arma_type_check((is_supported_blas_type<eT>::value == false));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_ssyrk)(uplo, transA, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)beta, (T*)C, ldC);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dsyrk)(uplo, transA, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)beta, (T*)C, ldC);\n      }\n    }\n  \n  \n  \n  template<typename T>\n  inline\n  void\n  herk(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const T* alpha, const std::complex<T>* A, const blas_int* ldA, const T* beta, std::complex<T>* C, const blas_int* ldC)\n    {\n    arma_type_check((is_supported_blas_type<T>::value == false));\n    \n    if(is_float<T>::value)\n      {\n      typedef float                  TT;\n      typedef std::complex<float> cx_TT;\n      \n      arma_fortran(arma_cherk)(uplo, transA, n, k, (const TT*)alpha, (const cx_TT*)A, ldA, (const TT*)beta, (cx_TT*)C, ldC);\n      }\n    else\n    if(is_double<T>::value)\n      {\n      typedef double                  TT;\n      typedef std::complex<double> cx_TT;\n      \n      arma_fortran(arma_zherk)(uplo, transA, n, k, (const TT*)alpha, (const cx_TT*)A, ldA, (const TT*)beta, (cx_TT*)C, ldC);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  eT\n  dot(const uword n_elem, const eT* x, const eT* y)\n    {\n    arma_type_check((is_supported_blas_type<eT>::value == false));\n    \n    if(is_float<eT>::value)\n      {\n      #if defined(ARMA_BLAS_SDOT_BUG)\n        {\n        if(n_elem == 0)  { return eT(0); }\n        \n        const char trans   = 'T';\n        \n        const blas_int m   = blas_int(n_elem);\n        const blas_int n   = 1;\n        //const blas_int lda = (n_elem > 0) ? blas_int(n_elem) : blas_int(1);\n        const blas_int inc = 1;\n        \n        const eT alpha     = eT(1);\n        const eT beta      = eT(0);\n        \n        eT result[2];  // paranoia: using two elements instead of one\n        \n        //blas::gemv(&trans, &m, &n, &alpha, x, &lda, y, &inc, &beta, &result[0], &inc);\n        blas::gemv(&trans, &m, &n, &alpha, x, &m, y, &inc, &beta, &result[0], &inc);\n        \n        return result[0];\n        }\n      #else\n        {\n        blas_int n   = blas_int(n_elem);\n        blas_int inc = 1;\n        \n        typedef float T;\n        return arma_fortran(arma_sdot)(&n, (const T*)x, &inc, (const T*)y, &inc);\n        }\n      #endif\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      blas_int n   = blas_int(n_elem);\n      blas_int inc = 1;\n      \n      typedef double T;\n      return arma_fortran(arma_ddot)(&n, (const T*)x, &inc, (const T*)y, &inc);\n      }\n    else\n    if( (is_supported_complex_float<eT>::value) || (is_supported_complex_double<eT>::value) )\n      {\n      if(n_elem == 0)  { return eT(0); }\n      \n      // using gemv() workaround due to compatibility issues with cdotu() and zdotu()\n      \n      const char trans   = 'T';\n      \n      const blas_int m   = blas_int(n_elem);\n      const blas_int n   = 1;\n      //const blas_int lda = (n_elem > 0) ? blas_int(n_elem) : blas_int(1);\n      const blas_int inc = 1;\n      \n      const eT alpha     = eT(1);\n      const eT beta      = eT(0);\n      \n      eT result[2];  // paranoia: using two elements instead of one\n      \n      //blas::gemv(&trans, &m, &n, &alpha, x, &lda, y, &inc, &beta, &result[0], &inc);\n      blas::gemv(&trans, &m, &n, &alpha, x, &m, y, &inc, &beta, &result[0], &inc);\n      \n      return result[0];\n      }\n    else\n      {\n      return eT(0);\n      }\n    }\n  }\n\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/compiler_setup.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n#undef arma_hot\n#undef arma_cold\n#undef arma_pure\n#undef arma_const\n#undef arma_aligned\n#undef arma_align_mem\n#undef arma_warn_unused\n#undef arma_deprecated\n#undef arma_malloc\n#undef arma_inline\n#undef arma_noinline\n#undef arma_ignore\n\n#define arma_hot\n#define arma_cold\n#define arma_pure\n#define arma_const\n#define arma_aligned\n#define arma_align_mem\n#define arma_warn_unused\n#define arma_deprecated\n#define arma_malloc\n#define arma_inline            inline\n#define arma_noinline\n#define arma_ignore(variable)  ((void)(variable))\n\n\n#undef arma_fortran_noprefix\n#undef arma_fortran_prefix\n\n#undef arma_fortran2_noprefix\n#undef arma_fortran2_prefix\n \n#if defined(ARMA_BLAS_UNDERSCORE)\n  #define arma_fortran2_noprefix(function) function##_\n  #define arma_fortran2_prefix(function)   wrapper_##function##_\n#else\n  #define arma_fortran2_noprefix(function) function\n  #define arma_fortran2_prefix(function)   wrapper_##function\n#endif\n\n#if defined(ARMA_USE_WRAPPER)\n  #define arma_fortran(function) arma_fortran2_prefix(function)\n  #define arma_wrapper(function) wrapper_##function\n#else\n  #define arma_fortran(function) arma_fortran2_noprefix(function)\n  #define arma_wrapper(function) function\n#endif\n\n#define arma_fortran_prefix(function)   arma_fortran2_prefix(function)\n#define arma_fortran_noprefix(function) arma_fortran2_noprefix(function)\n\n#undef  ARMA_INCFILE_WRAP\n#define ARMA_INCFILE_WRAP(x) <x>\n\n\n#if defined(__CYGWIN__)\n  #if defined(ARMA_USE_CXX11)\n    #undef ARMA_USE_CXX11\n    #undef ARMA_USE_EXTERN_CXX11_RNG\n    #pragma message (\"WARNING: disabled use of C++11 features in Armadillo, due to incomplete support for C++11 by Cygwin\")\n  #endif\n#endif\n\n\n#if defined(ARMA_USE_CXX11)\n  \n  #undef  ARMA_USE_U64S64\n  #define ARMA_USE_U64S64\n  \n  #if !defined(ARMA_32BIT_WORD)\n    #undef  ARMA_64BIT_WORD\n    #define ARMA_64BIT_WORD\n  #endif\n  \n  #if defined(ARMA_64BIT_WORD) && defined(SIZE_MAX)\n    #if (SIZE_MAX < 0xFFFFFFFFFFFFFFFFull)\n      #pragma message (\"WARNING: disabled use of 64 bit integers, as std::size_t is smaller than 64 bits\")\n      #undef ARMA_64BIT_WORD\n    #endif\n  #endif\n  \n#endif\n\n\n#if defined(ARMA_64BIT_WORD)\n  #undef  ARMA_USE_U64S64\n  #define ARMA_USE_U64S64\n#endif\n\n\n// most compilers can't vectorise slightly elaborate loops;\n// for example clang: http://llvm.org/bugs/show_bug.cgi?id=16358\n#undef  ARMA_SIMPLE_LOOPS\n#define ARMA_SIMPLE_LOOPS\n\n#undef ARMA_GOOD_COMPILER\n\n#undef ARMA_HAVE_TR1\n#undef ARMA_HAVE_GETTIMEOFDAY\n#undef ARMA_HAVE_SNPRINTF\n#undef ARMA_HAVE_ISFINITE\n#undef ARMA_HAVE_LOG1P\n#undef ARMA_HAVE_ISINF\n#undef ARMA_HAVE_ISNAN\n\n\n#if (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L))\n  #define ARMA_HAVE_GETTIMEOFDAY\n#endif\n\n\n// posix_memalign() is part of IEEE standard 1003.1\n// http://pubs.opengroup.org/onlinepubs/009696899/functions/posix_memalign.html\n// http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html\n// http://sourceforge.net/p/predef/wiki/Standards/\n#if ( defined(_POSIX_ADVISORY_INFO) && (_POSIX_ADVISORY_INFO >= 200112L) )\n  #undef  ARMA_HAVE_POSIX_MEMALIGN\n  #define ARMA_HAVE_POSIX_MEMALIGN\n#endif\n\n\n#if defined(__APPLE__)\n  #undef  ARMA_BLAS_SDOT_BUG\n  #define ARMA_BLAS_SDOT_BUG\n  #undef  ARMA_HAVE_POSIX_MEMALIGN\n#endif\n\n\n#if defined(__MINGW32__)\n  #undef ARMA_HAVE_POSIX_MEMALIGN\n#endif\n\n\n#undef ARMA_FNSIG\n\n#if defined (__GNUG__)\n  #define ARMA_FNSIG  __PRETTY_FUNCTION__\n#elif defined (_MSC_VER)\n  #define ARMA_FNSIG  __FUNCSIG__ \n#elif defined(__INTEL_COMPILER)\n  #define ARMA_FNSIG  __FUNCTION__\n#elif defined(ARMA_USE_CXX11)\n  #define ARMA_FNSIG  __func__\n#else \n  #define ARMA_FNSIG  \"(unknown)\"\n#endif\n\n\n#if (defined(__GNUG__) || defined(__GNUC__)) && (defined(__clang__) || defined(__INTEL_COMPILER) || defined(__NVCC__) || defined(__CUDACC__) || defined(__PGI) || defined(__PATHSCALE__))\n  #undef  ARMA_FAKE_GCC\n  #define ARMA_FAKE_GCC\n#endif\n\n\n#if defined(__GNUG__) && !defined(ARMA_FAKE_GCC)\n  \n  #undef  ARMA_GCC_VERSION\n  #define ARMA_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)\n  \n  #if (ARMA_GCC_VERSION < 40200)\n    #error \"*** Need a newer compiler ***\"\n  #endif\n  \n  #if ( (ARMA_GCC_VERSION >= 40700) && (ARMA_GCC_VERSION <= 40701) )\n    #error \"gcc versions 4.7.0 and 4.7.1 are unsupported; use 4.7.2 or later\"\n    // due to http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53549\n  #endif\n  \n  #define ARMA_GOOD_COMPILER\n  \n  #undef  arma_pure\n  #undef  arma_const\n  #undef  arma_aligned\n  #undef  arma_align_mem\n  #undef  arma_warn_unused\n  #undef  arma_deprecated\n  #undef  arma_malloc\n  #undef  arma_inline\n  #undef  arma_noinline\n  \n  #define arma_pure               __attribute__((__pure__))\n  #define arma_const              __attribute__((__const__))\n  #define arma_aligned            __attribute__((__aligned__))\n  #define arma_align_mem          __attribute__((__aligned__(16)))\n  #define arma_warn_unused        __attribute__((__warn_unused_result__))\n  #define arma_deprecated         __attribute__((__deprecated__))\n  #define arma_malloc             __attribute__((__malloc__))\n  #define arma_inline      inline __attribute__((__always_inline__))\n  #define arma_noinline           __attribute__((__noinline__))\n  \n  #undef  ARMA_HAVE_ALIGNED_ATTRIBUTE\n  #define ARMA_HAVE_ALIGNED_ATTRIBUTE\n  \n  #if defined(ARMA_USE_CXX11)\n    #if (ARMA_GCC_VERSION < 40800)\n      #pragma message (\"WARNING: compiler is in C++11 mode, but it has incomplete support for C++11 features;\")\n      #pragma message (\"WARNING: if something breaks, you get to keep all the pieces\")\n      #pragma message (\"WARNING: To forcefully prevent Armadillo from using C++11 features,\")\n      #pragma message (\"WARNING: #define ARMA_DONT_USE_CXX11 before #include <armadillo>\")\n      #define ARMA_DONT_USE_CXX11_CHRONO\n    #endif\n  #endif\n  \n  #if !defined(ARMA_USE_CXX11)\n    #if defined(_GLIBCXX_USE_C99_MATH_TR1) && defined(_GLIBCXX_USE_C99_COMPLEX_TR1)\n      #define ARMA_HAVE_TR1\n    #endif\n  #endif\n  \n  #if (ARMA_GCC_VERSION >= 40300)\n    #undef  arma_hot\n    #undef  arma_cold\n    \n    #define arma_hot  __attribute__((__hot__))\n    #define arma_cold __attribute__((__cold__))\n  #endif\n  \n  #if (ARMA_GCC_VERSION >= 40700)\n    #define ARMA_HAVE_GCC_ASSUME_ALIGNED\n  #endif\n  \n  // gcc's vectoriser can handle elaborate loops\n  #undef ARMA_SIMPLE_LOOPS\n  \n  #if defined(__OPTIMIZE_SIZE__)\n    #define ARMA_SIMPLE_LOOPS\n  #endif\n  \n  #if (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L))\n    #define ARMA_HAVE_SNPRINTF\n    #define ARMA_HAVE_ISFINITE\n    #define ARMA_HAVE_LOG1P\n    #define ARMA_HAVE_ISINF\n    #define ARMA_HAVE_ISNAN\n  #endif\n  \n  #undef ARMA_GCC_VERSION\n  \n#endif\n\n\n#if defined(__clang__) && (defined(__INTEL_COMPILER) || defined(__NVCC__) || defined(__CUDACC__) || defined(__PGI) || defined(__PATHSCALE__))\n  #undef  ARMA_FAKE_CLANG\n  #define ARMA_FAKE_CLANG\n#endif\n\n\n#if defined(__clang__) && !defined(ARMA_FAKE_CLANG)\n  \n  #define ARMA_GOOD_COMPILER\n  \n  #if !defined(__has_attribute)\n    #define __has_attribute(x) 0\n  #endif\n  \n  #if __has_attribute(__pure__)\n    #undef  arma_pure\n    #define arma_pure __attribute__((__pure__))\n  #endif\n  \n  #if __has_attribute(__const__)\n    #undef  arma_const\n    #define arma_const __attribute__((__const__))\n  #endif\n  \n  #if __has_attribute(__aligned__)\n    #undef  arma_aligned\n    #undef  arma_align_mem\n    \n    #define arma_aligned   __attribute__((__aligned__))\n    #define arma_align_mem __attribute__((__aligned__(16)))\n    \n    #undef  ARMA_HAVE_ALIGNED_ATTRIBUTE\n    #define ARMA_HAVE_ALIGNED_ATTRIBUTE\n  #endif\n  \n  #if __has_attribute(__warn_unused_result__)\n    #undef  arma_warn_unused\n    #define arma_warn_unused __attribute__((__warn_unused_result__))\n  #endif\n  \n  #if __has_attribute(__deprecated__)\n    #undef  arma_deprecated\n    #define arma_deprecated __attribute__((__deprecated__))\n  #endif\n  \n  #if __has_attribute(__malloc__)\n    #undef  arma_malloc\n    #define arma_malloc __attribute__((__malloc__))\n  #endif\n  \n  #if __has_attribute(__always_inline__)\n    #undef  arma_inline\n    #define arma_inline inline __attribute__((__always_inline__))\n  #endif\n  \n  #if __has_attribute(__noinline__)\n    #undef  arma_noinline\n    #define arma_noinline __attribute__((__noinline__))\n  #endif\n  \n  #if __has_attribute(__hot__)\n    #undef  arma_hot\n    #define arma_hot __attribute__((__hot__))\n  #endif\n  \n  #if __has_attribute(__cold__)\n    #undef  arma_cold\n    #define arma_cold __attribute__((__cold__))\n  #endif\n  \n  #if defined(__has_builtin) && __has_builtin(__builtin_assume_aligned)\n    #undef  ARMA_HAVE_GCC_ASSUME_ALIGNED\n    #define ARMA_HAVE_GCC_ASSUME_ALIGNED\n  #endif\n  \n  #if defined(__apple_build_version__)\n    #undef ARMA_USE_EXTERN_CXX11_RNG\n    // because Apple engineers are too lazy to implement thread_local\n  #endif\n  \n  #if (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L))\n    #define ARMA_HAVE_SNPRINTF\n    #define ARMA_HAVE_ISFINITE\n    #define ARMA_HAVE_LOG1P\n    #define ARMA_HAVE_ISINF\n    #define ARMA_HAVE_ISNAN\n  #endif\n  \n#endif\n\n\n#if defined(__INTEL_COMPILER)\n  \n  #if (__INTEL_COMPILER_BUILD_DATE < 20090623)\n    #error \"*** Need a newer compiler ***\"\n  #endif\n  \n  #undef  ARMA_HAVE_GCC_ASSUME_ALIGNED\n  #undef  ARMA_HAVE_ICC_ASSUME_ALIGNED\n  #define ARMA_HAVE_ICC_ASSUME_ALIGNED\n  \n#endif\n\n\n#if defined(_MSC_VER)\n  \n  #if (_MSC_VER < 1600)\n    #error \"*** Need a newer compiler ***\"\n  #endif\n  \n  #if (_MSC_VER < 1700)\n    #pragma message (\"WARNING: this compiler is outdated and has incomplete support for the C++ standard;\")\n    #pragma message (\"WARNING: if something breaks, you get to keep all the pieces\")\n    #define ARMA_BAD_COMPILER\n  #endif\n  \n  #if defined(ARMA_USE_CXX11)\n    #if (_MSC_VER < 1800)\n      #pragma message (\"WARNING: compiler is in C++11 mode, but it has incomplete support for C++11 features;\")\n      #pragma message (\"WARNING: if something breaks, you get to keep all the pieces\")\n    #endif\n  #endif\n  \n  // #undef  arma_inline\n  // #define arma_inline inline __forceinline\n  \n  #pragma warning(push)\n  \n  #pragma warning(disable: 4127)  // conditional expression is constant\n  #pragma warning(disable: 4510)  // default constructor could not be generated\n  #pragma warning(disable: 4511)  // copy constructor can't be generated\n  #pragma warning(disable: 4512)  // assignment operator can't be generated\n  #pragma warning(disable: 4513)  // destructor can't be generated\n  #pragma warning(disable: 4514)  // unreferenced inline function has been removed\n  #pragma warning(disable: 4522)  // multiple assignment operators specified\n  #pragma warning(disable: 4623)  // default constructor can't be generated\n  #pragma warning(disable: 4624)  // destructor can't be generated\n  #pragma warning(disable: 4625)  // copy constructor can't be generated\n  #pragma warning(disable: 4626)  // assignment operator can't be generated\n  #pragma warning(disable: 4710)  // function not inlined\n  #pragma warning(disable: 4711)  // call was inlined\n  #pragma warning(disable: 4714)  // __forceinline can't be inlined\n  \n  // #if (_MANAGED == 1) || (_M_CEE == 1)\n  //   \n  //   // don't do any alignment when compiling in \"managed code\" mode \n  //   \n  //   #undef  arma_aligned\n  //   #define arma_aligned\n  //   \n  //   #undef  arma_align_mem\n  //   #define arma_align_mem\n  //  \n  // #elif (_MSC_VER >= 1700)\n  //   \n  //   #undef  arma_align_mem\n  //   #define arma_align_mem __declspec(align(16))\n  //   \n  //   #define ARMA_HAVE_ALIGNED_ATTRIBUTE\n  //   \n  //   // disable warnings: \"structure was padded due to __declspec(align(16))\"\n  //   #pragma warning(disable: 4324)\n  //   \n  // #endif\n  \n#endif\n\n\n#if defined(__SUNPRO_CC)\n  \n  // http://www.oracle.com/technetwork/server-storage/solarisstudio/training/index-jsp-141991.html\n  // http://www.oracle.com/technetwork/server-storage/solarisstudio/documentation/cplusplus-faq-355066.html\n  \n  #if (__SUNPRO_CC < 0x5100)\n    #error \"*** Need a newer compiler ***\"\n  #endif\n    \n#endif\n\n\n#if defined(log2)\n  #undef log2\n  #pragma message (\"WARNING: detected 'log2' macro and undefined it\")\n#endif\n\n\n\n// \n// whoever defined macros with the names \"min\" and \"max\" should be permanently removed from the gene pool\n\n#if defined(min) || defined(max)\n  #undef min\n  #undef max\n  #pragma message (\"WARNING: detected 'min' and/or 'max' macros and undefined them;\")\n  #pragma message (\"WARNING: you may wish to define NOMINMAX before including any windows header\")\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/compiler_setup_post.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n#if defined(_MSC_VER)\n  \n  #pragma warning(pop)\n  \n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/cond_rel_bones.hpp",
    "content": "// Copyright (C) 2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup cond_rel\n//! @{\n\n\n//\n// for preventing pedantic compiler warnings\n\ntemplate<const bool do_eval>\nclass cond_rel\n  {\n  public:\n  \n  template<typename eT> arma_inline static bool lt(const eT A, const eT B);\n  template<typename eT> arma_inline static bool gt(const eT A, const eT B);\n\n  template<typename eT> arma_inline static bool leq(const eT A, const eT B);\n  template<typename eT> arma_inline static bool geq(const eT A, const eT B);\n  \n  template<typename eT> arma_inline static eT make_neg(const eT val);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/cond_rel_meat.hpp",
    "content": "// Copyright (C) 2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup cond_rel\n//! @{\n\n\n\ntemplate<>\ntemplate<typename eT>\narma_inline\nbool\ncond_rel<true>::lt(const eT A, const eT B)\n  {\n  return (A < B);\n  }\n  \n\n\ntemplate<>\ntemplate<typename eT>\narma_inline\nbool\ncond_rel<false>::lt(const eT, const eT)\n  {\n  return false;\n  }\n  \n\n\ntemplate<>\ntemplate<typename eT>\narma_inline\nbool\ncond_rel<true>::gt(const eT A, const eT B)\n  {\n  return (A > B);\n  }\n  \n\n\ntemplate<>\ntemplate<typename eT>\narma_inline\nbool\ncond_rel<false>::gt(const eT, const eT)\n  {\n  return false;\n  }\n  \n\n\ntemplate<>\ntemplate<typename eT>\narma_inline\nbool\ncond_rel<true>::leq(const eT A, const eT B)\n  {\n  return (A <= B);\n  }\n  \n\n\ntemplate<>\ntemplate<typename eT>\narma_inline\nbool\ncond_rel<false>::leq(const eT, const eT)\n  {\n  return false;\n  }\n  \n\n\ntemplate<>\ntemplate<typename eT>\narma_inline\nbool\ncond_rel<true>::geq(const eT A, const eT B)\n  {\n  return (A >= B);\n  }\n  \n\n\ntemplate<>\ntemplate<typename eT>\narma_inline\nbool\ncond_rel<false>::geq(const eT, const eT)\n  {\n  return false;\n  }\n\n\n\ntemplate<>\ntemplate<typename eT>\narma_inline\neT\ncond_rel<true>::make_neg(const eT val)\n  {\n  return -val;\n  }\n  \n\n\ntemplate<>\ntemplate<typename eT>\narma_inline\neT\ncond_rel<false>::make_neg(const eT)\n  {\n  return eT(0);\n  }\n  \n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/config.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2013-2015 Ryan Curtin\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n#if !defined(ARMA_USE_LAPACK)\n#define ARMA_USE_LAPACK\n//// Comment out the above line if you don't have LAPACK or a high-speed replacement for LAPACK,\n//// such as Intel MKL, AMD ACML, or the Accelerate framework.\n//// LAPACK is required for matrix decompositions (eg. SVD) and matrix inverse.\n#endif\n\n#if !defined(ARMA_USE_BLAS)\n#define ARMA_USE_BLAS\n//// Comment out the above line if you don't have BLAS or a high-speed replacement for BLAS,\n//// such as OpenBLAS, GotoBLAS, Intel MKL, AMD ACML, or the Accelerate framework.\n//// BLAS is used for matrix multiplication.\n//// Without BLAS, matrix multiplication will still work, but might be slower.\n#endif\n\n#if !defined(ARMA_USE_ARPACK)\n// #define ARMA_USE_ARPACK\n//// Uncomment the above line if you have ARPACK or a high-speed replacement for ARPACK.\n//// ARPACK is required for eigendecompositions of sparse matrices, eg. eigs_sym(), svds() \n#endif\n\n#if !defined(ARMA_USE_SUPERLU)\n// #define ARMA_USE_SUPERLU\n//// Uncomment the above line if you have SuperLU.\n//// SuperLU is used for solving sparse linear systems via spsolve()\n//// Caveat: only SuperLU version 4.3 can be used!\n#endif\n\n#if !defined(ARMA_SUPERLU_INCLUDE_DIR)\n// #define ARMA_SUPERLU_INCLUDE_DIR /usr/include/\n//// If you're using SuperLU and want to explicitly include the SuperLU headers,\n//// uncomment the above define and specify the appropriate include directory.\n//// Make sure the directory has a trailing /\n#endif\n\n// #define ARMA_USE_WRAPPER\n//// Comment out the above line if you're getting linking errors when compiling your programs,\n//// or if you prefer to directly link with LAPACK, BLAS + etc instead of the Armadillo runtime library.\n//// You will then need to link your programs directly with -llapack -lblas instead of -larmadillo\n\n// #define ARMA_BLAS_CAPITALS\n//// Uncomment the above line if your BLAS and LAPACK libraries have capitalised function names (eg. ACML on 64-bit Windows)\n\n#define ARMA_BLAS_UNDERSCORE\n//// Uncomment the above line if your BLAS and LAPACK libraries have function names with a trailing underscore.\n//// Conversely, comment it out if the function names don't have a trailing underscore.\n\n// #define ARMA_BLAS_LONG\n//// Uncomment the above line if your BLAS and LAPACK libraries use \"long\" instead of \"int\"\n\n// #define ARMA_BLAS_LONG_LONG\n//// Uncomment the above line if your BLAS and LAPACK libraries use \"long long\" instead of \"int\"\n\n// #define ARMA_USE_TBB_ALLOC\n//// Uncomment the above line if you want to use Intel TBB scalable_malloc() and scalable_free() instead of standard malloc() and free()\n\n// #define ARMA_USE_MKL_ALLOC\n//// Uncomment the above line if you want to use Intel MKL mkl_malloc() and mkl_free() instead of standard malloc() and free()\n\n// #define ARMA_USE_ATLAS\n// #define ARMA_ATLAS_INCLUDE_DIR /usr/include/\n//// If you're using ATLAS and the compiler can't find cblas.h and/or clapack.h\n//// uncomment the above define and specify the appropriate include directory.\n//// Make sure the directory has a trailing /\n\n#if !defined(ARMA_USE_CXX11)\n// #define ARMA_USE_CXX11\n//// Uncomment the above line to forcefully enable use of C++11 features (eg. initialiser lists).\n//// Note that ARMA_USE_CXX11 is automatically enabled when a C++11 compiler is detected.\n#endif\n\n#if !defined(ARMA_64BIT_WORD)\n// #define ARMA_64BIT_WORD\n//// Uncomment the above line if you require matrices/vectors capable of holding more than 4 billion elements.\n//// Your machine and compiler must have support for 64 bit integers (eg. via \"long\" or \"long long\").\n//// Note that ARMA_64BIT_WORD is automatically enabled when a C++11 compiler is detected.\n#endif\n\n#if !defined(ARMA_USE_HDF5)\n// #define ARMA_USE_HDF5\n//// Uncomment the above line to allow the ability to save and load matrices stored in HDF5 format;\n//// the hdf5.h header file must be available on your system,\n//// and you will need to link with the hdf5 library (eg. -lhdf5)\n#endif\n\n// #define ARMA_USE_HDF5_ALT\n#if defined(ARMA_USE_HDF5_ALT) && defined(ARMA_USE_WRAPPER)\n  #undef  ARMA_USE_HDF5\n  #define ARMA_USE_HDF5\n  \n  // #define ARMA_HDF5_INCLUDE_DIR /usr/include/\n#endif\n\n#if !defined(ARMA_MAT_PREALLOC)\n  #define ARMA_MAT_PREALLOC 16\n#endif\n//// This is the number of preallocated elements used by matrices and vectors;\n//// it must be an integer that is at least 1.\n//// If you mainly use lots of very small vectors (eg. <= 4 elements),\n//// change the number to the size of your vectors.\n\n#if !defined(ARMA_SPMAT_CHUNKSIZE)\n  #define ARMA_SPMAT_CHUNKSIZE 256\n#endif\n//// This is the minimum increase in the amount of memory (in terms of elements) allocated by a sparse matrix;\n//// it must be an integer that is at least 1.\n//// The minimum recommended size is 16.\n\n// #define ARMA_NO_DEBUG\n//// Uncomment the above line if you want to disable all run-time checks.\n//// This will result in faster code, but you first need to make sure that your code runs correctly!\n//// We strongly recommend to have the run-time checks enabled during development,\n//// as this greatly aids in finding mistakes in your code, and hence speeds up development.\n//// We recommend that run-time checks be disabled _only_ for the shipped version of your program.\n\n// #define ARMA_EXTRA_DEBUG\n//// Uncomment the above line if you want to see the function traces of how Armadillo evaluates expressions.\n//// This is mainly useful for debugging of the library.\n\n\n#if !defined(ARMA_DEFAULT_OSTREAM)\n  #define ARMA_DEFAULT_OSTREAM std::cout\n#endif\n\n#define ARMA_PRINT_ERRORS\n//#define ARMA_PRINT_HDF5_ERRORS\n\n\n#if defined(ARMA_DONT_PRINT_ERRORS)\n  #undef ARMA_PRINT_ERRORS\n  #undef ARMA_PRINT_HDF5_ERRORS\n#endif\n\n#if defined(ARMA_DONT_USE_LAPACK)\n  #undef ARMA_USE_LAPACK\n#endif\n\n#if defined(ARMA_DONT_USE_BLAS)\n  #undef ARMA_USE_BLAS\n#endif\n\n#if defined(ARMA_DONT_USE_ARPACK)\n  #undef ARMA_USE_ARPACK\n#endif\n\n#if defined(ARMA_DONT_USE_SUPERLU)\n  #undef ARMA_USE_SUPERLU\n  #undef ARMA_SUPERLU_INCLUDE_DIR\n#endif\n\n#if defined(ARMA_DONT_USE_ATLAS)\n  #undef ARMA_USE_ATLAS\n  #undef ARMA_ATLAS_INCLUDE_DIR\n#endif\n\n#if defined(ARMA_DONT_USE_WRAPPER)\n  #undef ARMA_USE_WRAPPER\n  #undef ARMA_USE_HDF5_ALT\n#endif\n\n#if defined(ARMA_DONT_USE_CXX11)\n  #undef ARMA_USE_CXX11\n  #undef ARMA_USE_EXTERN_CXX11_RNG\n#endif\n\n#if defined(ARMA_USE_WRAPPER)\n  #if defined(ARMA_USE_CXX11)\n    #if !defined(ARMA_USE_EXTERN_CXX11_RNG)\n      // #define ARMA_USE_EXTERN_CXX11_RNG\n    #endif\n  #endif\n#endif\n\n#if defined(ARMA_DONT_USE_EXTERN_CXX11_RNG)\n  #undef ARMA_USE_EXTERN_CXX11_RNG\n#endif\n\n#if defined(ARMA_32BIT_WORD)\n  #undef ARMA_64BIT_WORD\n#endif\n\n#if defined(ARMA_DONT_USE_HDF5)\n  #undef ARMA_USE_HDF5\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/config.hpp.cmake",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2013-2015 Ryan Curtin\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n#if !defined(ARMA_USE_LAPACK)\n#cmakedefine ARMA_USE_LAPACK\n//// Comment out the above line if you don't have LAPACK or a high-speed replacement for LAPACK,\n//// such as Intel MKL, AMD ACML, or the Accelerate framework.\n//// LAPACK is required for matrix decompositions (eg. SVD) and matrix inverse.\n#endif\n\n#if !defined(ARMA_USE_BLAS)\n#cmakedefine ARMA_USE_BLAS\n//// Comment out the above line if you don't have BLAS or a high-speed replacement for BLAS,\n//// such as OpenBLAS, GotoBLAS, Intel MKL, AMD ACML, or the Accelerate framework.\n//// BLAS is used for matrix multiplication.\n//// Without BLAS, matrix multiplication will still work, but might be slower.\n#endif\n\n#if !defined(ARMA_USE_ARPACK)\n#cmakedefine ARMA_USE_ARPACK\n//// Uncomment the above line if you have ARPACK or a high-speed replacement for ARPACK.\n//// ARPACK is required for eigendecompositions of sparse matrices, eg. eigs_sym(), svds() \n#endif\n\n#if !defined(ARMA_USE_SUPERLU)\n#cmakedefine ARMA_USE_SUPERLU\n//// Uncomment the above line if you have SuperLU.\n//// SuperLU is used for solving sparse linear systems via spsolve()\n//// Caveat: only SuperLU version 4.3 can be used!\n#endif\n\n#if !defined(ARMA_SUPERLU_INCLUDE_DIR)\n#define ARMA_SUPERLU_INCLUDE_DIR ${ARMA_SUPERLU_INCLUDE_DIR}/\n//// If you're using SuperLU and want to explicitly include the SuperLU headers,\n//// uncomment the above define and specify the appropriate include directory.\n//// Make sure the directory has a trailing /\n#endif\n\n#cmakedefine ARMA_USE_WRAPPER\n//// Comment out the above line if you're getting linking errors when compiling your programs,\n//// or if you prefer to directly link with LAPACK, BLAS + etc instead of the Armadillo runtime library.\n//// You will then need to link your programs directly with -llapack -lblas instead of -larmadillo\n\n// #define ARMA_BLAS_CAPITALS\n//// Uncomment the above line if your BLAS and LAPACK libraries have capitalised function names (eg. ACML on 64-bit Windows)\n\n#define ARMA_BLAS_UNDERSCORE\n//// Uncomment the above line if your BLAS and LAPACK libraries have function names with a trailing underscore.\n//// Conversely, comment it out if the function names don't have a trailing underscore.\n\n// #define ARMA_BLAS_LONG\n//// Uncomment the above line if your BLAS and LAPACK libraries use \"long\" instead of \"int\"\n\n// #define ARMA_BLAS_LONG_LONG\n//// Uncomment the above line if your BLAS and LAPACK libraries use \"long long\" instead of \"int\"\n\n// #define ARMA_USE_TBB_ALLOC\n//// Uncomment the above line if you want to use Intel TBB scalable_malloc() and scalable_free() instead of standard malloc() and free()\n\n// #define ARMA_USE_MKL_ALLOC\n//// Uncomment the above line if you want to use Intel MKL mkl_malloc() and mkl_free() instead of standard malloc() and free()\n\n#cmakedefine ARMA_USE_ATLAS\n#define ARMA_ATLAS_INCLUDE_DIR ${ARMA_ATLAS_INCLUDE_DIR}/\n//// If you're using ATLAS and the compiler can't find cblas.h and/or clapack.h\n//// uncomment the above define and specify the appropriate include directory.\n//// Make sure the directory has a trailing /\n\n#if !defined(ARMA_USE_CXX11)\n// #define ARMA_USE_CXX11\n//// Uncomment the above line to forcefully enable use of C++11 features (eg. initialiser lists).\n//// Note that ARMA_USE_CXX11 is automatically enabled when a C++11 compiler is detected\n#endif\n\n#if !defined(ARMA_64BIT_WORD)\n// #define ARMA_64BIT_WORD\n//// Uncomment the above line if you require matrices/vectors capable of holding more than 4 billion elements.\n//// Your machine and compiler must have support for 64 bit integers (eg. via \"long\" or \"long long\")\n//// Note that ARMA_64BIT_WORD is automatically enabled when a C++11 compiler is detected\n#endif\n\n#if !defined(ARMA_USE_HDF5)\n// #define ARMA_USE_HDF5\n//// Uncomment the above line to allow the ability to save and load matrices stored in HDF5 format;\n//// the hdf5.h header file must be available on your system,\n//// and you will need to link with the hdf5 library (eg. -lhdf5)\n#endif\n\n#cmakedefine ARMA_USE_HDF5_ALT\n#if defined(ARMA_USE_HDF5_ALT) && defined(ARMA_USE_WRAPPER)\n  #undef  ARMA_USE_HDF5\n  #define ARMA_USE_HDF5\n  \n  #define ARMA_HDF5_INCLUDE_DIR ${ARMA_HDF5_INCLUDE_DIR}/\n#endif\n\n#if !defined(ARMA_MAT_PREALLOC)\n  #define ARMA_MAT_PREALLOC 16\n#endif\n//// This is the number of preallocated elements used by matrices and vectors;\n//// it must be an integer that is at least 1.\n//// If you mainly use lots of very small vectors (eg. <= 4 elements),\n//// change the number to the size of your vectors.\n\n#if !defined(ARMA_SPMAT_CHUNKSIZE)\n  #define ARMA_SPMAT_CHUNKSIZE 256\n#endif\n//// This is the minimum increase in the amount of memory (in terms of elements) allocated by a sparse matrix;\n//// it must be an integer that is at least 1.\n//// The minimum recommended size is 16.\n\n// #define ARMA_NO_DEBUG\n//// Uncomment the above line if you want to disable all run-time checks.\n//// This will result in faster code, but you first need to make sure that your code runs correctly!\n//// We strongly recommend to have the run-time checks enabled during development,\n//// as this greatly aids in finding mistakes in your code, and hence speeds up development.\n//// We recommend that run-time checks be disabled _only_ for the shipped version of your program.\n\n// #define ARMA_EXTRA_DEBUG\n//// Uncomment the above line if you want to see the function traces of how Armadillo evaluates expressions.\n//// This is mainly useful for debugging of the library.\n\n\n#if !defined(ARMA_DEFAULT_OSTREAM)\n  #define ARMA_DEFAULT_OSTREAM std::cout\n#endif\n\n#define ARMA_PRINT_ERRORS\n//#define ARMA_PRINT_HDF5_ERRORS\n\n\n#if defined(ARMA_DONT_PRINT_ERRORS)\n  #undef ARMA_PRINT_ERRORS\n  #undef ARMA_PRINT_HDF5_ERRORS\n#endif\n\n#if defined(ARMA_DONT_USE_LAPACK)\n  #undef ARMA_USE_LAPACK\n#endif\n\n#if defined(ARMA_DONT_USE_BLAS)\n  #undef ARMA_USE_BLAS\n#endif\n\n#if defined(ARMA_DONT_USE_ARPACK)\n  #undef ARMA_USE_ARPACK\n#endif\n\n#if defined(ARMA_DONT_USE_SUPERLU)\n  #undef ARMA_USE_SUPERLU\n  #undef ARMA_SUPERLU_INCLUDE_DIR\n#endif\n\n#if defined(ARMA_DONT_USE_ATLAS)\n  #undef ARMA_USE_ATLAS\n  #undef ARMA_ATLAS_INCLUDE_DIR\n#endif\n\n#if defined(ARMA_DONT_USE_WRAPPER)\n  #undef ARMA_USE_WRAPPER\n  #undef ARMA_USE_HDF5_ALT\n#endif\n\n#if defined(ARMA_DONT_USE_CXX11)\n  #undef ARMA_USE_CXX11\n  #undef ARMA_USE_EXTERN_CXX11_RNG\n#endif\n\n#if defined(ARMA_USE_WRAPPER)\n  #if defined(ARMA_USE_CXX11)\n    #if !defined(ARMA_USE_EXTERN_CXX11_RNG)\n      #cmakedefine ARMA_USE_EXTERN_CXX11_RNG\n    #endif\n  #endif\n#endif\n\n#if defined(ARMA_DONT_USE_EXTERN_CXX11_RNG)\n  #undef ARMA_USE_EXTERN_CXX11_RNG\n#endif\n\n#if defined(ARMA_32BIT_WORD)\n  #undef ARMA_64BIT_WORD\n#endif\n\n#if defined(ARMA_DONT_USE_HDF5)\n  #undef ARMA_USE_HDF5\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/constants.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup constants\n//! @{\n\n\nnamespace priv\n  {\n  class Datum_helper\n    {\n    public:\n    \n    template<typename eT>\n    static\n    typename arma_real_only<eT>::result\n    nan(typename arma_real_only<eT>::result* junk = 0)\n      {\n      arma_ignore(junk);\n      \n      if(std::numeric_limits<eT>::has_quiet_NaN)\n        {\n        return std::numeric_limits<eT>::quiet_NaN();\n        }\n      else\n        {\n        return eT(0);\n        }\n      }\n    \n    \n    template<typename eT>\n    static\n    typename arma_cx_only<eT>::result\n    nan(typename arma_cx_only<eT>::result* junk = 0)\n      {\n      arma_ignore(junk);\n      \n      typedef typename get_pod_type<eT>::result T;\n      \n      return eT( Datum_helper::nan<T>(), Datum_helper::nan<T>() );\n      }\n    \n    \n    template<typename eT>\n    static\n    typename arma_integral_only<eT>::result\n    nan(typename arma_integral_only<eT>::result* junk = 0)\n      {\n      arma_ignore(junk);\n      \n      return eT(0);\n      }\n    \n    \n    template<typename eT>\n    static\n    typename arma_real_only<eT>::result\n    inf(typename arma_real_only<eT>::result* junk = 0)\n      {\n      arma_ignore(junk);\n      \n      if(std::numeric_limits<eT>::has_infinity)\n        {\n        return std::numeric_limits<eT>::infinity();\n        }\n      else\n        {\n        return std::numeric_limits<eT>::max();\n        }\n      }\n    \n    \n    template<typename eT>\n    static\n    typename arma_cx_only<eT>::result\n    inf(typename arma_cx_only<eT>::result* junk = 0)\n      {\n      arma_ignore(junk);\n      \n      typedef typename get_pod_type<eT>::result T;\n      \n      return eT( Datum_helper::inf<T>(), Datum_helper::inf<T>() );\n      }\n    \n\n    template<typename eT>\n    static\n    typename arma_integral_only<eT>::result\n    inf(typename arma_integral_only<eT>::result* junk = 0)\n      {\n      arma_ignore(junk);\n      \n      return std::numeric_limits<eT>::max();\n      }\n    \n    };\n  }\n\n\n\n//! various constants.\n//! Physical constants taken from NIST 2010 CODATA values, and some from WolframAlpha (values provided as of 2009-06-23)\n//! http://physics.nist.gov/cuu/Constants\n//! http://www.wolframalpha.com\n//! See also http://en.wikipedia.org/wiki/Physical_constant\n\n\ntemplate<typename eT>\nclass Datum\n  {\n  public:\n  \n  static const eT pi;       //!< ratio of any circle's circumference to its diameter\n  static const eT e;        //!< base of the natural logarithm\n  static const eT euler;    //!< Euler's constant, aka Euler-Mascheroni constant\n  static const eT gratio;   //!< golden ratio\n  static const eT sqrt2;    //!< square root of 2\n  static const eT eps;      //!< the difference between 1 and the least value greater than 1 that is representable\n  static const eT log_min;  //!< log of the minimum representable value\n  static const eT log_max;  //!< log of the maximum representable value\n  static const eT nan;      //!< \"not a number\"\n  static const eT inf;      //!< infinity \n\n  // \n  \n  static const eT m_u;       //!< atomic mass constant (in kg)\n  static const eT N_A;       //!< Avogadro constant\n  static const eT k;         //!< Boltzmann constant (in joules per kelvin)\n  static const eT k_evk;     //!< Boltzmann constant (in eV/K)\n  static const eT a_0;       //!< Bohr radius (in meters)\n  static const eT mu_B;      //!< Bohr magneton\n  static const eT Z_0;       //!< characteristic impedance of vacuum (in ohms)\n  static const eT G_0;       //!< conductance quantum (in siemens)\n  static const eT k_e;       //!< Coulomb's constant (in meters per farad)\n  static const eT eps_0;     //!< electric constant (in farads per meter)\n  static const eT m_e;       //!< electron mass (in kg)\n  static const eT eV;        //!< electron volt (in joules)\n  static const eT ec;        //!< elementary charge (in coulombs)\n  static const eT F;         //!< Faraday constant (in coulombs)\n  static const eT alpha;     //!< fine-structure constant\n  static const eT alpha_inv; //!< inverse fine-structure constant\n  static const eT K_J;       //!< Josephson constant\n  static const eT mu_0;      //!< magnetic constant (in henries per meter)\n  static const eT phi_0;     //!< magnetic flux quantum (in webers)\n  static const eT R;         //!< molar gas constant (in joules per mole kelvin)\n  static const eT G;         //!< Newtonian constant of gravitation (in newton square meters per kilogram squared)\n  static const eT h;         //!< Planck constant (in joule seconds)\n  static const eT h_bar;     //!< Planck constant over 2 pi, aka reduced Planck constant (in joule seconds)\n  static const eT m_p;       //!< proton mass (in kg)\n  static const eT R_inf;     //!< Rydberg constant (in reciprocal meters)\n  static const eT c_0;       //!< speed of light in vacuum (in meters per second)\n  static const eT sigma;     //!< Stefan-Boltzmann constant\n  static const eT R_k;       //!< von Klitzing constant (in ohms)\n  static const eT b;         //!< Wien wavelength displacement law constant\n  };\n\n\n// the long lengths of the constants are for future support of \"long double\"\n// and any smart compiler that does high-precision computation at compile-time\n  \ntemplate<typename eT> const eT Datum<eT>::pi        = eT(3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679);\ntemplate<typename eT> const eT Datum<eT>::e         = eT(2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274);\ntemplate<typename eT> const eT Datum<eT>::euler     = eT(0.5772156649015328606065120900824024310421593359399235988057672348848677267776646709369470632917467495);\ntemplate<typename eT> const eT Datum<eT>::gratio    = eT(1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374);\ntemplate<typename eT> const eT Datum<eT>::sqrt2     = eT(1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727);\ntemplate<typename eT> const eT Datum<eT>::eps       = std::numeric_limits<eT>::epsilon();\ntemplate<typename eT> const eT Datum<eT>::log_min   = std::log(std::numeric_limits<eT>::min());\ntemplate<typename eT> const eT Datum<eT>::log_max   = std::log(std::numeric_limits<eT>::max());\ntemplate<typename eT> const eT Datum<eT>::nan       = priv::Datum_helper::nan<eT>();\ntemplate<typename eT> const eT Datum<eT>::inf       = priv::Datum_helper::inf<eT>();\n\ntemplate<typename eT> const eT Datum<eT>::m_u       = eT(1.660539040e-27);\ntemplate<typename eT> const eT Datum<eT>::N_A       = eT(6.022140857e23);\ntemplate<typename eT> const eT Datum<eT>::k         = eT(1.38064852e-23);\ntemplate<typename eT> const eT Datum<eT>::k_evk     = eT(8.6173303e-5);\ntemplate<typename eT> const eT Datum<eT>::a_0       = eT(0.52917721067e-10);\ntemplate<typename eT> const eT Datum<eT>::mu_B      = eT(927.4009994e-26);\ntemplate<typename eT> const eT Datum<eT>::Z_0       = eT(3.76730313461771e-2);\ntemplate<typename eT> const eT Datum<eT>::G_0       = eT(7.7480917310e-5);\ntemplate<typename eT> const eT Datum<eT>::k_e       = eT(8.9875517873681764e9);\ntemplate<typename eT> const eT Datum<eT>::eps_0     = eT(8.85418781762039e-12);\ntemplate<typename eT> const eT Datum<eT>::m_e       = eT(9.10938356e-31);\ntemplate<typename eT> const eT Datum<eT>::eV        = eT(1.6021766208e-19);\ntemplate<typename eT> const eT Datum<eT>::ec        = eT(1.6021766208e-19);\ntemplate<typename eT> const eT Datum<eT>::F         = eT(96485.33289);\ntemplate<typename eT> const eT Datum<eT>::alpha     = eT(7.2973525664e-3);\ntemplate<typename eT> const eT Datum<eT>::alpha_inv = eT(137.035999139);\ntemplate<typename eT> const eT Datum<eT>::K_J       = eT(483597.8525e9);\ntemplate<typename eT> const eT Datum<eT>::mu_0      = eT(1.25663706143592e-06);\ntemplate<typename eT> const eT Datum<eT>::phi_0     = eT(2.067833667e-15);\ntemplate<typename eT> const eT Datum<eT>::R         = eT(8.3144598);\ntemplate<typename eT> const eT Datum<eT>::G         = eT(6.67408e-11);\ntemplate<typename eT> const eT Datum<eT>::h         = eT(6.626070040e-34);\ntemplate<typename eT> const eT Datum<eT>::h_bar     = eT(1.054571800e-34);\ntemplate<typename eT> const eT Datum<eT>::m_p       = eT(1.672621898e-27);\ntemplate<typename eT> const eT Datum<eT>::R_inf     = eT(10973731.568508);\ntemplate<typename eT> const eT Datum<eT>::c_0       = eT(299792458.0);\ntemplate<typename eT> const eT Datum<eT>::sigma     = eT(5.670367e-8);\ntemplate<typename eT> const eT Datum<eT>::R_k       = eT(25812.8074555);\ntemplate<typename eT> const eT Datum<eT>::b         = eT(2.8977729e-3);\n\n\n\ntypedef Datum<float>  fdatum;\ntypedef Datum<double> datum;\n\n\n\n\nnamespace priv\n  {\n  \n  template<typename eT>\n  static\n  arma_inline\n  arma_hot\n  typename arma_real_only<eT>::result\n  most_neg(typename arma_real_only<eT>::result* junk = 0)\n    {\n    arma_ignore(junk);\n    \n    if(std::numeric_limits<eT>::has_infinity)\n      {\n      return -(std::numeric_limits<eT>::infinity());\n      }\n    else\n      {\n      return -(std::numeric_limits<eT>::max());\n      }\n    }\n  \n  \n  template<typename eT>\n  static\n  arma_inline\n  arma_hot\n  typename arma_integral_only<eT>::result\n  most_neg(typename arma_integral_only<eT>::result* junk = 0)\n    {\n    arma_ignore(junk);\n    \n    return std::numeric_limits<eT>::min();\n    }\n  \n  \n  template<typename eT>\n  static\n  arma_inline\n  arma_hot\n  typename arma_real_only<eT>::result\n  most_pos(typename arma_real_only<eT>::result* junk = 0)\n    {\n    arma_ignore(junk);\n    \n    if(std::numeric_limits<eT>::has_infinity)\n      {\n      return std::numeric_limits<eT>::infinity();\n      }\n    else\n      {\n      return std::numeric_limits<eT>::max();\n      }\n    }\n  \n  \n  template<typename eT>\n  static\n  arma_inline\n  arma_hot\n  typename arma_integral_only<eT>::result\n  most_pos(typename arma_integral_only<eT>::result* junk = 0)\n    {\n    arma_ignore(junk);\n    \n    return std::numeric_limits<eT>::max();\n    }\n\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/constants_compat.hpp",
    "content": "// Copyright (C) 2008-2011 Conrad Sanderson\n// Copyright (C) 2008-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup constants_compat\n//! @{\n\n\n// the Math and Phy classes are kept for compatibility with old code;\n// for new code, use the Datum class instead\n// eg. instead of math::pi(), use datum::pi\n\ntemplate<typename eT>\nclass Math\n  {\n  public:\n  \n  // the long lengths of the constants are for future support of \"long double\"\n  // and any smart compiler that does high-precision computation at compile-time\n  \n  //! ratio of any circle's circumference to its diameter\n  static eT pi()        { return eT(3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679); }\n  \n  //! base of the natural logarithm\n  static eT e()         { return eT(2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274); }\n  \n  //! Euler's constant, aka Euler-Mascheroni constant\n  static eT euler()     { return eT(0.5772156649015328606065120900824024310421593359399235988057672348848677267776646709369470632917467495); }\n  \n  //! golden ratio\n  static eT gratio()    { return eT(1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374); }\n  \n  //! square root of 2\n  static eT sqrt2()     { return eT(1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727); }\n  \n  //! the difference between 1 and the least value greater than 1 that is representable\n  static eT eps()       { return std::numeric_limits<eT>::epsilon(); }\n  \n  //! log of the minimum representable value\n  static eT log_min()   { static const eT out = std::log(std::numeric_limits<eT>::min()); return out; }\n    \n  //! log of the maximum representable value\n  static eT log_max()   { static const eT out = std::log(std::numeric_limits<eT>::max()); return out; }\n  \n  //! \"not a number\"\n  static eT nan()       { return priv::Datum_helper::nan<eT>(); }\n  \n  //! infinity \n  static eT inf()       { return priv::Datum_helper::inf<eT>(); }\n  };\n\n\n\n//! Physical constants taken from NIST 2010 CODATA values, and some from WolframAlpha (values provided as of 2009-06-23)\n//! http://physics.nist.gov/cuu/Constants\n//! http://www.wolframalpha.com\n//! See also http://en.wikipedia.org/wiki/Physical_constant\ntemplate<typename eT>\nclass Phy\n  {\n  public:\n  \n  //! atomic mass constant (in kg)\n  static eT m_u()       {  return eT(1.660539040e-27); }\n  \n  //! Avogadro constant\n  static eT N_A()       {  return eT(6.022140857e23); }\n  \n  //! Boltzmann constant (in joules per kelvin)\n  static eT k()         {  return eT(1.38064852e-23); }\n  \n  //! Boltzmann constant (in eV/K)\n  static eT k_evk()     {  return eT(8.6173303e-5); }\n  \n  //! Bohr radius (in meters)\n  static eT a_0()       { return eT(0.52917721067e-10); }\n  \n  //! Bohr magneton\n  static eT mu_B()      { return eT(927.4009994e-26); }\n  \n  //! characteristic impedance of vacuum (in ohms)\n  static eT Z_0()       { return eT(3.76730313461771e-2); }\n  \n  //! conductance quantum (in siemens)\n  static eT G_0()       { return eT(7.7480917310e-5); }\n  \n  //! Coulomb's constant (in meters per farad)\n  static eT k_e()       { return eT(8.9875517873681764e9); }\n  \n  //! electric constant (in farads per meter)\n  static eT eps_0()     { return eT(8.85418781762039e-12); }\n  \n  //! electron mass (in kg)\n  static eT m_e()       { return eT(9.10938356e-31); }\n  \n  //! electron volt (in joules)\n  static eT eV()        { return eT(1.6021766208e-19); }\n  \n  //! elementary charge (in coulombs)\n  static eT e()         { return eT(1.6021766208e-19); }\n  \n  //! Faraday constant (in coulombs)\n  static eT F()         { return eT(96485.33289); }\n  \n  //! fine-structure constant\n  static eT alpha()     { return eT(7.2973525664e-3); }\n  \n  //! inverse fine-structure constant\n  static eT alpha_inv() { return eT(137.035999139); }\n  \n  //! Josephson constant\n  static eT K_J()       { return eT(483597.8525e9); }\n  \n  //! magnetic constant (in henries per meter)\n  static eT mu_0()      { return eT(1.25663706143592e-06); }\n  \n  //! magnetic flux quantum (in webers)\n  static eT phi_0()     { return eT(2.067833667e-15); }\n  \n  //! molar gas constant (in joules per mole kelvin)\n  static eT R()         { return eT(8.3144598); }\n  \n  //! Newtonian constant of gravitation (in newton square meters per kilogram squared)\n  static eT G()         { return eT(6.67408e-11); }\n  \n  //! Planck constant (in joule seconds)\n  static eT h()         { return eT(6.626070040e-34); }\n  \n  //! Planck constant over 2 pi, aka reduced Planck constant (in joule seconds)\n  static eT h_bar()     { return eT(1.054571800e-34); }\n  \n  //! proton mass (in kg)\n  static eT m_p()       { return eT(1.672621898e-27); }\n  \n  //! Rydberg constant (in reciprocal meters)\n  static eT R_inf()     { return eT(10973731.568508); }\n  \n  //! speed of light in vacuum (in meters per second)\n  static eT c_0()       { return eT(299792458.0); }\n  \n  //! Stefan-Boltzmann constant\n  static eT sigma()     { return eT(5.670367e-8); }\n  \n  //! von Klitzing constant (in ohms)\n  static eT R_k()       { return eT(25812.8074555); }\n  \n  //! Wien wavelength displacement law constant\n  static eT b()         { return eT(2.8977729e-3); }\n  };\n\n\n\ntypedef Math<float>  fmath;\ntypedef Math<double> math;\n\ntypedef Phy<float>   fphy;\ntypedef Phy<double>  phy;\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/debug.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// Copyright (C) 2011 Stanislav Funiak\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup debug\n//! @{\n\n\n\ntemplate<typename T>\ninline\nstd::ostream&\narma_stream_err1(std::ostream* user_stream)\n  {\n  static std::ostream* stream_err1 = &(ARMA_DEFAULT_OSTREAM);\n  \n  if(user_stream != NULL)\n    {\n    stream_err1 = user_stream;\n    }\n  \n  return *stream_err1;\n  }\n\n\n\ntemplate<typename T>\ninline\nstd::ostream&\narma_stream_err2(std::ostream* user_stream)\n  {\n  static std::ostream* stream_err2 = &(ARMA_DEFAULT_OSTREAM);\n  \n  if(user_stream != NULL)\n    {\n    stream_err2 = user_stream;\n    }\n  \n  return *stream_err2;\n  }\n\n\n\ninline\nvoid\nset_stream_err1(std::ostream& user_stream)\n  {\n  arma_stream_err1<char>(&user_stream);\n  }\n\n\n\ninline\nvoid\nset_stream_err2(std::ostream& user_stream)\n  {\n  arma_stream_err2<char>(&user_stream);\n  }\n\n\n\ninline\nstd::ostream&\nget_stream_err1()\n  {\n  return arma_stream_err1<char>(NULL);\n  }\n\n\n\ninline\nstd::ostream&\nget_stream_err2()\n  {\n  return arma_stream_err2<char>(NULL);\n  }\n\n\n\n//\n// arma_stop\n\n//! print a message to get_stream_err1() and/or throw a logic_error exception\ntemplate<typename T1>\narma_cold\narma_noinline\nstatic\nvoid\narma_stop(const T1& x)\n  {\n  #if defined(ARMA_PRINT_ERRORS)\n    {\n    std::ostream& out = get_stream_err1();\n    \n    out << '\\n';\n    out << \"error: \" << x << '\\n';\n    out << '\\n';\n    out.flush();\n    }\n  #else\n    {\n    arma_ignore(x);\n    }\n  #endif\n  \n  throw std::logic_error( std::string(x) );\n  }\n\n\n\ntemplate<typename T1>\narma_cold\narma_noinline\nstatic\nvoid\narma_stop_bad_alloc(const T1& x)\n  {\n  #if defined(ARMA_PRINT_ERRORS)\n    {\n    std::ostream& out = get_stream_err2();\n    \n    out << '\\n';\n    out << \"error: \" << x << '\\n';\n    out << '\\n';\n    out.flush();\n    }\n  #else\n    {\n    arma_ignore(x);\n    }\n  #endif\n  \n  throw std::bad_alloc();\n  }\n\n\n\n//\n// arma_bad\n\n//! print a message to get_stream_err2() and/or throw a run-time error exception\ntemplate<typename T1>\narma_cold\narma_noinline\nstatic\nvoid\narma_bad(const T1& x, const bool hurl = true)\n  {\n  #if defined(ARMA_PRINT_ERRORS)\n    {\n    std::ostream& out = get_stream_err2();\n    \n    out << '\\n';\n    out << \"error: \" << x << '\\n';\n    out << '\\n';\n    out.flush();\n    }\n  #else\n    {\n    arma_ignore(x);\n    }\n  #endif\n  \n  if(hurl == true)\n    {\n    throw std::runtime_error( std::string(x) );\n    }\n  }\n\n\n\n//\n// arma_print\n\n\narma_cold\ninline\nvoid\narma_print()\n  {\n  get_stream_err1() << std::endl;\n  }\n\n\ntemplate<typename T1>\narma_cold\narma_noinline\nstatic\nvoid\narma_print(const T1& x)\n  {\n  get_stream_err1() << x << std::endl;\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_cold\narma_noinline\nstatic\nvoid\narma_print(const T1& x, const T2& y)\n  {\n  get_stream_err1() << x << y << std::endl;\n  }\n\n\n\ntemplate<typename T1, typename T2, typename T3>\narma_cold\narma_noinline\nstatic\nvoid\narma_print(const T1& x, const T2& y, const T3& z)\n  {\n  get_stream_err1() << x << y << z << std::endl;\n  }\n\n\n\n\n\n\n//\n// arma_sigprint\n\n//! print a message the the log stream with a preceding @ character.\n//! by default the log stream is cout.\n//! used for printing the signature of a function\n//! (see the arma_extra_debug_sigprint macro) \ninline\nvoid\narma_sigprint(const char* x)\n  {\n  get_stream_err1() << \"@ \" << x;\n  }\n\n\n\n//\n// arma_bktprint\n\n\ninline\nvoid\narma_bktprint()\n  {\n  get_stream_err1() << std::endl;\n  }\n\n\ntemplate<typename T1>\ninline\nvoid\narma_bktprint(const T1& x)\n  {\n  get_stream_err1() << \" [\" << x << ']' << std::endl;\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\narma_bktprint(const T1& x, const T2& y)\n  {\n  get_stream_err1() << \" [\" << x << y << ']' << std::endl;\n  }\n\n\n\n\n\n\n//\n// arma_thisprint\n\ninline\nvoid\narma_thisprint(const void* this_ptr)\n  {\n  get_stream_err1() << \" [this = \" << this_ptr << ']' << std::endl;\n  }\n\n\n\n//\n// arma_warn\n\n\n//! print a message to the warn stream\ntemplate<typename T1>\narma_cold\narma_noinline\nstatic\nvoid\narma_warn(const bool state, const T1& x)\n  {\n  if(state==true)\n    {\n    get_stream_err2() << x << std::endl;\n    }\n  }\n\n\ntemplate<typename T1, typename T2>\narma_cold\narma_noinline\nstatic\nvoid\narma_warn(const bool state, const T1& x, const T2& y)\n  {\n  if(state==true)\n    {\n    get_stream_err2() << x << y << std::endl;\n    }\n  }\n\n\ntemplate<typename T1, typename T2, typename T3>\narma_cold\narma_noinline\nstatic\nvoid\narma_warn(const bool state, const T1& x, const T2& y, const T3& z)\n  {\n  if(state==true)\n    {\n    get_stream_err2() << x << y << z << std::endl;\n    }\n  }\n\n\n\n//\n// arma_check\n\n//! if state is true, abort program\ntemplate<typename T1>\narma_hot\ninline\nvoid\narma_check(const bool state, const T1& x)\n  {\n  if(state==true)\n    {\n    arma_stop(arma_boost::str_wrapper(x));\n    }\n  }\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\narma_check(const bool state, const T1& x, const T2& y)\n  {\n  if(state==true)\n    {\n    arma_stop( std::string(x) + std::string(y) );\n    }\n  }\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\narma_check_bad_alloc(const bool state, const T1& x)\n  {\n  if(state==true)\n    {\n    arma_stop_bad_alloc(x);\n    }\n  }\n\n\n\n//\n// arma_set_error\n\n\narma_hot\narma_inline\nvoid\narma_set_error(bool& err_state, char*& err_msg, const bool expression, const char* message)\n  {\n  if(expression == true)\n    {\n    err_state = true;\n    err_msg   = const_cast<char*>(message);\n    }\n  }\n\n\n\n\n//\n// functions for generating strings indicating size errors\n\narma_cold\narma_noinline\nstatic\nstd::string\narma_incompat_size_string(const uword A_n_rows, const uword A_n_cols, const uword B_n_rows, const uword B_n_cols, const char* x)\n  {\n  std::stringstream tmp;\n  \n  tmp << x << \": incompatible matrix dimensions: \" << A_n_rows << 'x' << A_n_cols << \" and \" << B_n_rows << 'x' << B_n_cols;\n  \n  return tmp.str();\n  }\n\n\n\narma_cold\narma_noinline\nstatic\nstd::string\narma_incompat_size_string(const uword A_n_rows, const uword A_n_cols, const uword A_n_slices, const uword B_n_rows, const uword B_n_cols, const uword B_n_slices, const char* x)\n  {\n  std::stringstream tmp;\n  \n  tmp << x << \": incompatible cube dimensions: \" << A_n_rows << 'x' << A_n_cols << 'x' << A_n_slices << \" and \" << B_n_rows << 'x' << B_n_cols << 'x' << B_n_slices;\n  \n  return tmp.str();\n  }\n\n\n\ntemplate<typename eT>\narma_cold\narma_noinline\nstatic\nstd::string\narma_incompat_size_string(const subview_cube<eT>& Q, const Mat<eT>& A, const char* x)\n  {\n  std::stringstream tmp;\n  \n  tmp << x\n      << \": interpreting matrix as cube with dimensions: \"\n      << A.n_rows << 'x' << A.n_cols << 'x' << 1\n      << \" or \"\n      << A.n_rows << 'x' << 1        << 'x' << A.n_cols\n      << \" or \"\n      << 1        << 'x' << A.n_rows << 'x' << A.n_cols\n      << \" is incompatible with cube dimensions: \"\n      << Q.n_rows << 'x' << Q.n_cols << 'x' << Q.n_slices;\n      \n  return tmp.str();\n  }\n\n\n\n//\n// functions for checking whether two dense matrices have the same dimensions\n\n\n\narma_inline\narma_hot\nvoid\narma_assert_same_size(const uword A_n_rows, const uword A_n_cols, const uword B_n_rows, const uword B_n_cols, const char* x)\n  {\n  if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) )\n    {\n    arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) );\n    }\n  }\n\n\n\n//! stop if given matrices have different sizes\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const Mat<eT1>& A, const Mat<eT2>& B, const char* x)\n  {\n  const uword A_n_rows = A.n_rows;\n  const uword A_n_cols = A.n_cols;\n  \n  const uword B_n_rows = B.n_rows;\n  const uword B_n_cols = B.n_cols;\n  \n  if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) )\n    {\n    arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) );\n    }\n  }\n\n\n\n//! stop if given proxies have different sizes\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const Proxy<eT1>& A, const Proxy<eT2>& B, const char* x)\n  {\n  const uword A_n_rows = A.get_n_rows();\n  const uword A_n_cols = A.get_n_cols();\n  \n  const uword B_n_rows = B.get_n_rows();\n  const uword B_n_cols = B.get_n_cols();\n  \n  if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) )\n    {\n    arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) );\n    }\n  }\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const subview<eT1>& A, const subview<eT2>& B, const char* x)\n  {\n  const uword A_n_rows = A.n_rows;\n  const uword A_n_cols = A.n_cols;\n  \n  const uword B_n_rows = B.n_rows;\n  const uword B_n_cols = B.n_cols;\n  \n  if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) )\n    {\n    arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) );\n    }\n  }\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const Mat<eT1>& A, const subview<eT2>& B, const char* x)\n  {\n  const uword A_n_rows = A.n_rows;\n  const uword A_n_cols = A.n_cols;\n  \n  const uword B_n_rows = B.n_rows;\n  const uword B_n_cols = B.n_cols;\n  \n  if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) )\n    {\n    arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) );\n    }\n  }\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const subview<eT1>& A, const Mat<eT2>& B, const char* x)\n  {\n  const uword A_n_rows = A.n_rows;\n  const uword A_n_cols = A.n_cols;\n  \n  const uword B_n_rows = B.n_rows;\n  const uword B_n_cols = B.n_cols;\n  \n  if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) )\n    {\n    arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) );\n    }\n  }\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const Mat<eT1>& A, const Proxy<eT2>& B, const char* x)\n  {\n  const uword A_n_rows = A.n_rows;\n  const uword A_n_cols = A.n_cols;\n  \n  const uword B_n_rows = B.get_n_rows();\n  const uword B_n_cols = B.get_n_cols();\n  \n  if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) )\n    {\n    arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) );\n    }\n  }\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const Proxy<eT1>& A, const Mat<eT2>& B, const char* x)\n  {\n  const uword A_n_rows = A.get_n_rows();\n  const uword A_n_cols = A.get_n_cols();\n  \n  const uword B_n_rows = B.n_rows;\n  const uword B_n_cols = B.n_cols;\n  \n  if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) )\n    {\n    arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) );\n    }\n  }\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const Proxy<eT1>& A, const subview<eT2>& B, const char* x)\n  {\n  const uword A_n_rows = A.get_n_rows();\n  const uword A_n_cols = A.get_n_cols();\n  \n  const uword B_n_rows = B.n_rows;\n  const uword B_n_cols = B.n_cols;\n  \n  if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) )\n    {\n    arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) );\n    }\n  }\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const subview<eT1>& A, const Proxy<eT2>& B, const char* x)\n  {\n  const uword A_n_rows = A.n_rows;\n  const uword A_n_cols = A.n_cols;\n  \n  const uword B_n_rows = B.get_n_rows();\n  const uword B_n_cols = B.get_n_cols();\n  \n  if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) )\n    {\n    arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) );\n    }\n  }\n\n\n\n//\n// functions for checking whether two sparse matrices have the same dimensions\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const SpMat<eT1>& A, const SpMat<eT2>& B, const char* x)\n  {\n  const uword A_n_rows = A.n_rows;\n  const uword A_n_cols = A.n_cols;\n  \n  const uword B_n_rows = B.n_rows;\n  const uword B_n_cols = B.n_cols;\n  \n  if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) )\n    {\n    arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) );\n    }\n  }\n\n\n\n//\n// functions for checking whether two cubes have the same dimensions\n\n\n\narma_hot\ninline\nvoid\narma_assert_same_size(const uword A_n_rows, const uword A_n_cols, const uword A_n_slices, const uword B_n_rows, const uword B_n_cols, const uword B_n_slices, const char* x)\n  {\n  if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) || (A_n_slices != B_n_slices) )\n    {\n    arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, A_n_slices, B_n_rows, B_n_cols, B_n_slices, x) );\n    }\n  }\n\n\n\n//! stop if given cubes have different sizes\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const Cube<eT1>& A, const Cube<eT2>& B, const char* x)\n  {\n  if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != B.n_slices) )\n    {\n    arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, B.n_slices, x) );\n    }\n  }\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const Cube<eT1>& A, const subview_cube<eT2>& B, const char* x)\n  {\n  if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != B.n_slices) )\n    {\n    arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, B.n_slices, x) );\n    }\n  }\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const subview_cube<eT1>& A, const Cube<eT2>& B, const char* x)\n  {\n  if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != B.n_slices) )\n    {\n    arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, B.n_slices, x) );\n    }\n  }\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const subview_cube<eT1>& A, const subview_cube<eT2>& B, const char* x)\n  {\n  if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != B.n_slices))\n    {\n    arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, B.n_slices, x) );\n    }\n  }\n\n\n\n//! stop if given cube proxies have different sizes\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const ProxyCube<eT1>& A, const ProxyCube<eT2>& B, const char* x)\n  {\n  const uword A_n_rows   = A.get_n_rows();\n  const uword A_n_cols   = A.get_n_cols();\n  const uword A_n_slices = A.get_n_slices();\n  \n  const uword B_n_rows   = B.get_n_rows();\n  const uword B_n_cols   = B.get_n_cols();\n  const uword B_n_slices = B.get_n_slices();\n  \n  if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) || (A_n_slices != B_n_slices))\n    {\n    arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, A_n_slices, B_n_rows, B_n_cols, B_n_slices, x) );\n    }\n  }\n\n\n\n//\n// functions for checking whether a cube or subcube can be interpreted as a matrix (i.e. single slice)\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const Cube<eT1>& A, const Mat<eT2>& B, const char* x)\n  {\n  if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != 1) )\n    {\n    arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, 1, x) );\n    }\n  }\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const Mat<eT1>& A, const Cube<eT2>& B, const char* x)\n  {\n  if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (1 != B.n_slices) )\n    {\n    arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, 1, B.n_rows, B.n_cols, B.n_slices, x) );\n    }\n  }\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const subview_cube<eT1>& A, const Mat<eT2>& B, const char* x)\n  {\n  if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != 1) )\n    {\n    arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, 1, x) );\n    }\n  }\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_same_size(const Mat<eT1>& A, const subview_cube<eT2>& B, const char* x)\n  {\n  if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (1 != B.n_slices) )\n    {\n    arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, 1, B.n_rows, B.n_cols, B.n_slices, x) );\n    }\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\narma_assert_cube_as_mat(const Mat<eT>& M, const T1& Q, const char* x, const bool check_compat_size)\n  {\n  const uword Q_n_rows   = Q.n_rows;\n  const uword Q_n_cols   = Q.n_cols;\n  const uword Q_n_slices = Q.n_slices;\n  \n  const uword M_vec_state = M.vec_state;\n  \n  if(M_vec_state == 0)\n    {\n    if( ( (Q_n_rows == 1) || (Q_n_cols == 1) || (Q_n_slices == 1) ) == false )\n      {\n      std::stringstream tmp;\n        \n      tmp << x\n          << \": can't interpret cube with dimensions \"\n          << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices \n          << \" as a matrix; one of the dimensions must be 1\";\n      \n      arma_stop( tmp.str() );\n      }\n    }\n  else\n    {\n    if(Q_n_slices == 1)\n      {\n      if( (M_vec_state == 1) && (Q_n_cols != 1) )\n        {\n        std::stringstream tmp;\n        \n        tmp << x\n            << \": can't interpret cube with dimensions \"\n            << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices\n            << \" as a column vector\";\n        \n        arma_stop( tmp.str() );\n        }\n      \n      if( (M_vec_state == 2) && (Q_n_rows != 1) )\n        {\n        std::stringstream tmp;\n        \n        tmp << x\n            << \": can't interpret cube with dimensions \"\n            << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices\n            << \" as a row vector\";\n        \n        arma_stop( tmp.str() );\n        }\n      }\n    else\n      {\n      if( (Q_n_cols != 1) && (Q_n_rows != 1) )\n        {\n        std::stringstream tmp;\n        \n        tmp << x\n            << \": can't interpret cube with dimensions \"\n            << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices\n            << \" as a vector\";\n        \n        arma_stop( tmp.str() );\n        }\n      }\n    }\n  \n  \n  if(check_compat_size == true)\n    {\n    const uword M_n_rows = M.n_rows;\n    const uword M_n_cols = M.n_cols;\n    \n    if(M_vec_state == 0)\n      {\n      if(\n          (\n          ( (Q_n_rows == M_n_rows) && (Q_n_cols   == M_n_cols) )\n          ||\n          ( (Q_n_rows == M_n_rows) && (Q_n_slices == M_n_cols) )\n          ||\n          ( (Q_n_cols == M_n_rows) && (Q_n_slices == M_n_cols) )\n          )\n          == false\n        )\n        {\n        std::stringstream tmp;\n        \n        tmp << x\n            << \": can't interpret cube with dimensions \"\n            << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices\n            << \" as a matrix with dimensions \"\n            << M_n_rows << 'x' << M_n_cols;\n        \n        arma_stop( tmp.str() );\n        }\n      }\n    else\n      {\n      if(Q_n_slices == 1)\n        {\n        if( (M_vec_state == 1) && (Q_n_rows != M_n_rows) )\n          {\n          std::stringstream tmp;\n          \n          tmp << x\n              << \": can't interpret cube with dimensions \"\n              << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices\n              << \" as a column vector with dimensions \"\n              << M_n_rows << 'x' << M_n_cols;\n          \n          arma_stop( tmp.str() );\n          }\n        \n        if( (M_vec_state == 2) && (Q_n_cols != M_n_cols) )\n          {\n          std::stringstream tmp;\n          \n          tmp << x\n              << \": can't interpret cube with dimensions \"\n              << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices\n              << \" as a row vector with dimensions \"\n              << M_n_rows << 'x' << M_n_cols;\n          \n          arma_stop( tmp.str() );\n          }\n        }\n      else\n        {\n        if( ( (M_n_cols == Q_n_slices) || (M_n_rows == Q_n_slices) ) == false )\n          {\n          std::stringstream tmp;\n          \n          tmp << x\n              << \": can't interpret cube with dimensions \"\n              << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices\n              << \" as a vector with dimensions \"\n              << M_n_rows << 'x' << M_n_cols;\n          \n          arma_stop( tmp.str() );\n          }\n        }\n      }\n    }\n  }\n\n\n\n//\n// functions for checking whether two matrices have dimensions that are compatible with the matrix multiply operation\n\n\n\narma_hot\ninline\nvoid\narma_assert_mul_size(const uword A_n_rows, const uword A_n_cols, const uword B_n_rows, const uword B_n_cols, const char* x)\n  {\n  if(A_n_cols != B_n_rows)\n    {\n    arma_stop( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) );\n    }\n  }\n\n\n\n//! stop if given matrices are incompatible for multiplication\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_mul_size(const Mat<eT1>& A, const Mat<eT2>& B, const char* x)\n  {\n  const uword A_n_cols = A.n_cols;\n  const uword B_n_rows = B.n_rows;\n  \n  if(A_n_cols != B_n_rows)\n    {\n    arma_stop( arma_incompat_size_string(A.n_rows, A_n_cols, B_n_rows, B.n_cols, x) );\n    }\n  }\n\n\n\n//! stop if given matrices are incompatible for multiplication\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_mul_size(const Mat<eT1>& A, const Mat<eT2>& B, const bool do_trans_A, const bool do_trans_B, const char* x)\n  {\n  const uword final_A_n_cols = (do_trans_A == false) ? A.n_cols : A.n_rows;\n  const uword final_B_n_rows = (do_trans_B == false) ? B.n_rows : B.n_cols;\n    \n  if(final_A_n_cols != final_B_n_rows)\n    {\n    const uword final_A_n_rows = (do_trans_A == false) ? A.n_rows : A.n_cols;\n    const uword final_B_n_cols = (do_trans_B == false) ? B.n_cols : B.n_rows;\n    \n    arma_stop( arma_incompat_size_string(final_A_n_rows, final_A_n_cols, final_B_n_rows, final_B_n_cols, x) );\n    }\n  }\n\n\n\ntemplate<const bool do_trans_A, const bool do_trans_B>\narma_hot\ninline\nvoid\narma_assert_trans_mul_size(const uword A_n_rows, const uword A_n_cols, const uword B_n_rows, const uword B_n_cols, const char* x)\n  {\n  const uword final_A_n_cols = (do_trans_A == false) ? A_n_cols : A_n_rows;\n  const uword final_B_n_rows = (do_trans_B == false) ? B_n_rows : B_n_cols;\n    \n  if(final_A_n_cols != final_B_n_rows)\n    {\n    const uword final_A_n_rows = (do_trans_A == false) ? A_n_rows : A_n_cols;\n    const uword final_B_n_cols = (do_trans_B == false) ? B_n_cols : B_n_rows;\n    \n    arma_stop( arma_incompat_size_string(final_A_n_rows, final_A_n_cols, final_B_n_rows, final_B_n_cols, x) );\n    }\n  }\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_mul_size(const Mat<eT1>& A, const subview<eT2>& B, const char* x)\n  {\n  if(A.n_cols != B.n_rows)\n    {\n    arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, B.n_rows, B.n_cols, x) );\n    }\n  }\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_mul_size(const subview<eT1>& A, const Mat<eT2>& B, const char* x)\n  {\n  if(A.n_cols != B.n_rows)\n    {\n    arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, B.n_rows, B.n_cols, x) );\n    }\n  }\n\n\n\ntemplate<typename eT1, typename eT2>\narma_hot\ninline\nvoid\narma_assert_mul_size(const subview<eT1>& A, const subview<eT2>& B, const char* x)\n  {\n  if(A.n_cols != B.n_rows)\n    {\n    arma_stop( arma_incompat_size_string(A.n_rows, A.n_cols, B.n_rows, B.n_cols, x) );\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\narma_assert_blas_size(const T1& A)\n  {\n  if(sizeof(uword) >= sizeof(blas_int))\n    {\n    bool overflow;\n    \n    overflow = (A.n_rows > ARMA_MAX_BLAS_INT);\n    overflow = (A.n_cols > ARMA_MAX_BLAS_INT) || overflow;\n    \n    if(overflow)\n      {\n      arma_bad(\"integer overflow: matrix dimensions are too large for integer type used by BLAS and LAPACK\");\n      }\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\narma_assert_blas_size(const T1& A, const T2& B)\n  {\n  if(sizeof(uword) >= sizeof(blas_int))\n    {\n    bool overflow;\n    \n    overflow = (A.n_rows > ARMA_MAX_BLAS_INT);\n    overflow = (A.n_cols > ARMA_MAX_BLAS_INT) || overflow;\n    overflow = (B.n_rows > ARMA_MAX_BLAS_INT) || overflow;\n    overflow = (B.n_cols > ARMA_MAX_BLAS_INT) || overflow;\n    \n    if(overflow)\n      {\n      arma_bad(\"integer overflow: matrix dimensions are too large for integer type used by BLAS and LAPACK\");\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\narma_assert_atlas_size(const T1& A)\n  {\n  if(sizeof(uword) >= sizeof(int))\n    {\n    bool overflow;\n    \n    overflow = (A.n_rows > INT_MAX);\n    overflow = (A.n_cols > INT_MAX) || overflow;\n    \n    if(overflow)\n      {\n      arma_bad(\"integer overflow: matrix dimensions are too large for integer type used by ATLAS\");\n      }\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\narma_assert_atlas_size(const T1& A, const T2& B)\n  {\n  if(sizeof(uword) >= sizeof(int))\n    {\n    bool overflow;\n    \n    overflow = (A.n_rows > INT_MAX);\n    overflow = (A.n_cols > INT_MAX) || overflow;\n    overflow = (B.n_rows > INT_MAX) || overflow;\n    overflow = (B.n_cols > INT_MAX) || overflow;\n    \n    if(overflow)\n      {\n      arma_bad(\"integer overflow: matrix dimensions are too large for integer type used by ATLAS\");\n      }\n    }\n  }\n\n\n\n//\n// macros\n\n\n// #define ARMA_STRING1(x) #x\n// #define ARMA_STRING2(x) ARMA_STRING1(x)\n// #define ARMA_FILELINE  __FILE__ \": \" ARMA_STRING2(__LINE__)\n\n\n#if defined(ARMA_NO_DEBUG)\n  \n  #undef ARMA_EXTRA_DEBUG\n  \n  #define arma_debug_print                   true ? (void)0 : arma_print\n  #define arma_debug_warn                    true ? (void)0 : arma_warn\n  #define arma_debug_check                   true ? (void)0 : arma_check\n  #define arma_debug_set_error               true ? (void)0 : arma_set_error\n  #define arma_debug_assert_same_size        true ? (void)0 : arma_assert_same_size\n  #define arma_debug_assert_mul_size         true ? (void)0 : arma_assert_mul_size\n  #define arma_debug_assert_trans_mul_size   true ? (void)0 : arma_assert_trans_mul_size\n  #define arma_debug_assert_cube_as_mat      true ? (void)0 : arma_assert_cube_as_mat\n  #define arma_debug_assert_blas_size        true ? (void)0 : arma_assert_blas_size\n  #define arma_debug_assert_atlas_size       true ? (void)0 : arma_assert_atlas_size\n  \n#else\n  \n  #define arma_debug_print                 arma_print\n  #define arma_debug_warn                  arma_warn\n  #define arma_debug_check                 arma_check\n  #define arma_debug_set_error             arma_set_error\n  #define arma_debug_assert_same_size      arma_assert_same_size\n  #define arma_debug_assert_mul_size       arma_assert_mul_size\n  #define arma_debug_assert_trans_mul_size arma_assert_trans_mul_size\n  #define arma_debug_assert_cube_as_mat    arma_assert_cube_as_mat\n  #define arma_debug_assert_blas_size      arma_assert_blas_size\n  #define arma_debug_assert_atlas_size     arma_assert_atlas_size\n  \n#endif\n\n\n\n#if defined(ARMA_EXTRA_DEBUG)\n  \n  #define arma_extra_debug_sigprint       arma_sigprint(ARMA_FNSIG); arma_bktprint\n  #define arma_extra_debug_sigprint_this  arma_sigprint(ARMA_FNSIG); arma_thisprint\n  #define arma_extra_debug_print          arma_print\n  #define arma_extra_debug_warn           arma_warn\n  #define arma_extra_debug_check          arma_check\n\n#else\n  \n  #define arma_extra_debug_sigprint        true ? (void)0 : arma_bktprint\n  #define arma_extra_debug_sigprint_this   true ? (void)0 : arma_thisprint\n  #define arma_extra_debug_print           true ? (void)0 : arma_print\n  #define arma_extra_debug_warn            true ? (void)0 : arma_warn\n  #define arma_extra_debug_check           true ? (void)0 : arma_check\n \n#endif\n\n\n\n\n#if defined(ARMA_EXTRA_DEBUG)\n\n  namespace junk\n    {\n    class arma_first_extra_debug_message\n      {\n      public:\n      \n      inline\n      arma_first_extra_debug_message()\n        {\n        union\n          {\n          unsigned short a;\n          unsigned char  b[sizeof(unsigned short)];\n          } endian_test;\n          \n        endian_test.a = 1;\n        \n        const bool  little_endian = (endian_test.b[0] == 1);\n        const char* nickname      = ARMA_VERSION_NAME;\n        \n        std::ostream& out = get_stream_err1();\n        \n        out << \"@ ---\" << '\\n';\n        out << \"@ Armadillo \"\n            << arma_version::major << '.' << arma_version::minor << '.' << arma_version::patch\n            << \" (\" << nickname << \")\\n\";\n        \n        out << \"@ arma_config::use_wrapper  = \" << arma_config::use_wrapper  << '\\n';\n        out << \"@ arma_config::use_cxx11    = \" << arma_config::use_cxx11    << '\\n';\n        out << \"@ arma_config::openmp       = \" << arma_config::openmp       << '\\n';\n        out << \"@ arma_config::lapack       = \" << arma_config::lapack       << '\\n';\n        out << \"@ arma_config::blas         = \" << arma_config::blas         << '\\n';\n        out << \"@ arma_config::arpack       = \" << arma_config::arpack       << '\\n';\n        out << \"@ arma_config::superlu      = \" << arma_config::superlu      << '\\n';\n        out << \"@ arma_config::atlas        = \" << arma_config::atlas        << '\\n';\n        out << \"@ arma_config::hdf5         = \" << arma_config::hdf5         << '\\n';\n        out << \"@ arma_config::good_comp    = \" << arma_config::good_comp    << '\\n';\n        out << \"@ arma_config::extra_code   = \" << arma_config::extra_code   << '\\n';\n        out << \"@ arma_config::mat_prealloc = \" << arma_config::mat_prealloc << '\\n';\n        out << \"@ sizeof(void*)    = \" << sizeof(void*)    << '\\n';\n        out << \"@ sizeof(int)      = \" << sizeof(int)      << '\\n';\n        out << \"@ sizeof(long)     = \" << sizeof(long)     << '\\n';\n        out << \"@ sizeof(uword)    = \" << sizeof(uword)    << '\\n';\n        out << \"@ sizeof(blas_int) = \" << sizeof(blas_int) << '\\n';\n        out << \"@ little_endian    = \" << little_endian    << '\\n';\n        out << \"@ ---\" << std::endl;\n        }\n      \n      };\n    \n    static arma_first_extra_debug_message arma_first_extra_debug_message_run;\n    }\n\n#endif\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/diagmat_proxy.hpp",
    "content": "// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// Copyright (C) 2008-2014 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup diagmat_proxy\n//! @{\n\n\n\ntemplate<typename T1>\nclass diagmat_proxy_default\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  inline\n  diagmat_proxy_default(const T1& X)\n    : P       ( X )\n    , P_is_vec( (resolves_to_vector<T1>::value) || (P.get_n_rows() == 1) || (P.get_n_cols() == 1) )\n    , P_is_col( T1::is_col || (P.get_n_cols() == 1) )\n    , n_elem  ( P_is_vec ? P.get_n_elem() : (std::min)(P.get_n_elem(), P.get_n_rows()) )\n    {\n    arma_extra_debug_sigprint();\n    \n    arma_debug_check\n      (\n      (P_is_vec == false) && (P.get_n_rows() != P.get_n_cols()),\n      \"diagmat(): only vectors and square matrices are accepted\"\n      );\n    }\n  \n  \n  arma_inline\n  elem_type\n  operator[](const uword i) const\n    {\n    if(Proxy<T1>::prefer_at_accessor == false)\n      {\n      return P_is_vec ? P[i] : P.at(i,i);\n      }\n    else\n      {\n      if(P_is_vec)\n        {\n        return (P_is_col) ? P.at(i,0) : P.at(0,i);\n        }\n      else\n        {\n        return P.at(i,i);\n        }\n      }\n    }\n  \n  \n  arma_inline\n  elem_type\n  at(const uword row, const uword col) const\n    {\n    if(row == col)\n      {\n      if(Proxy<T1>::prefer_at_accessor == false)\n        {\n        return (P_is_vec) ? P[row] : P.at(row,row);\n        }\n      else\n        {\n        if(P_is_vec)\n          {\n          return (P_is_col) ? P.at(row,0) : P.at(0,row);\n          }\n        else\n          {\n          return P.at(row,row);\n          }\n        }\n      }\n    else\n      {\n      return elem_type(0);\n      }\n    }\n  \n  \n  arma_inline bool is_alias(const Mat<elem_type>&) const { return false; }\n  \n  const Proxy<T1> P;\n  const bool      P_is_vec;\n  const bool      P_is_col;\n  const uword     n_elem;\n  };\n\n\n\ntemplate<typename T1>\nclass diagmat_proxy_fixed\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  inline\n  diagmat_proxy_fixed(const T1& X)\n    : P(X)\n    {\n    arma_extra_debug_sigprint();\n    \n    arma_debug_check\n      (\n      (P_is_vec == false) && (T1::n_rows != T1::n_cols),\n      \"diagmat(): only vectors and square matrices are accepted\"\n      );\n    }\n  \n  \n  arma_inline\n  elem_type\n  operator[](const uword i) const\n    {\n    return (P_is_vec) ? P[i] : P.at(i,i);\n    }\n  \n  \n  arma_inline\n  elem_type\n  at(const uword row, const uword col) const\n    {\n    if(row == col)\n      {\n      return (P_is_vec) ? P[row] : P.at(row,row);\n      }\n    else\n      {\n      return elem_type(0);\n      }\n    }\n  \n  arma_inline bool is_alias(const Mat<elem_type>& X) const { return (void_ptr(&X) == void_ptr(&P)); }\n  \n  const T1& P;\n  \n  static const bool  P_is_vec = (T1::n_rows == 1) || (T1::n_cols == 1);\n  static const uword n_elem   = P_is_vec ? T1::n_elem : ( (T1::n_elem < T1::n_rows) ? T1::n_elem : T1::n_rows );\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct diagmat_proxy_redirect {};\n\ntemplate<typename T1>\nstruct diagmat_proxy_redirect<T1, false> { typedef diagmat_proxy_default<T1> result; };\n\ntemplate<typename T1>\nstruct diagmat_proxy_redirect<T1, true>  { typedef diagmat_proxy_fixed<T1>   result; };\n\n\ntemplate<typename T1>\nclass diagmat_proxy : public diagmat_proxy_redirect<T1, is_Mat_fixed<T1>::value >::result\n  {\n  public:\n  inline diagmat_proxy(const T1& X)\n    : diagmat_proxy_redirect< T1, is_Mat_fixed<T1>::value >::result(X)\n    {\n    }\n  };\n\n\n\ntemplate<typename eT>\nclass diagmat_proxy< Mat<eT> >\n  {\n  public:\n  \n  typedef          eT                              elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  inline\n  diagmat_proxy(const Mat<eT>& X)\n    : P       ( X )\n    , P_is_vec( (X.n_rows == 1) || (X.n_cols == 1) )\n    , n_elem  ( P_is_vec ? X.n_elem : (std::min)(X.n_elem, X.n_rows) )\n    {\n    arma_extra_debug_sigprint();\n    \n    arma_debug_check\n      (\n      (P_is_vec == false) && (P.n_rows != P.n_cols),\n      \"diagmat(): only vectors and square matrices are accepted\"\n      );\n    }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return P_is_vec ? P[i] : P.at(i,i);                                         }\n  arma_inline elem_type at         (const uword row, const uword col) const { return (row == col) ? ( P_is_vec ? P[row] : P.at(row,row) ) : elem_type(0); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&P)); }\n  \n  const Mat<eT>& P;\n  const bool     P_is_vec;\n  const uword    n_elem;\n  };\n\n\n\ntemplate<typename eT>\nclass diagmat_proxy< Row<eT> >\n  {\n  public:\n  \n  typedef          eT                              elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  \n  inline\n  diagmat_proxy(const Row<eT>& X)\n    : P(X)\n    , n_elem(X.n_elem)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return P[i];                                 }\n  arma_inline elem_type at         (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&P)); }\n  \n  static const bool P_is_vec = true;\n  \n  const Row<eT>& P;\n  const uword    n_elem;\n  };\n\n\n\ntemplate<typename eT>\nclass diagmat_proxy< Col<eT> >\n  {\n  public:\n  \n  typedef          eT                              elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  \n  inline\n  diagmat_proxy(const Col<eT>& X)\n    : P(X)\n    , n_elem(X.n_elem)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return P[i];                                 }\n  arma_inline elem_type at         (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&P)); }\n  \n  static const bool P_is_vec = true;\n  \n  const Col<eT>& P;\n  const uword    n_elem;\n  };\n\n\n\ntemplate<typename eT>\nclass diagmat_proxy< subview_row<eT> >\n  {\n  public:\n  \n  typedef          eT                              elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  \n  inline\n  diagmat_proxy(const subview_row<eT>& X)\n    : P(X)\n    , n_elem(X.n_elem)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return P[i];                                 }\n  arma_inline elem_type at         (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&(P.m))); }\n  \n  static const bool P_is_vec = true;\n  \n  const subview_row<eT>& P;\n  const uword            n_elem;\n  };\n\n\n\ntemplate<typename eT>\nclass diagmat_proxy< subview_col<eT> >\n  {\n  public:\n  \n  typedef          eT                              elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  \n  inline\n  diagmat_proxy(const subview_col<eT>& X)\n    : P(X)\n    , n_elem(X.n_elem)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return P[i];                                 }\n  arma_inline elem_type at         (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&(P.m))); }\n  \n  static const bool P_is_vec = true;\n  \n  const subview_col<eT>& P;\n  const uword            n_elem;\n  };\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename T1>\nclass diagmat_proxy_check_default\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  inline\n  diagmat_proxy_check_default(const T1& X, const Mat<typename T1::elem_type>&)\n    : P(X)\n    , P_is_vec( (resolves_to_vector<T1>::value) || (P.n_rows == 1) || (P.n_cols == 1) )\n    , n_elem( P_is_vec ? P.n_elem : (std::min)(P.n_elem, P.n_rows) )\n    {\n    arma_extra_debug_sigprint();\n    \n    arma_debug_check\n      (\n      (P_is_vec == false) && (P.n_rows != P.n_cols),\n      \"diagmat(): only vectors and square matrices are accepted\"\n      );\n    }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return P_is_vec ? P[i] : P.at(i,i);                                         }\n  arma_inline elem_type at         (const uword row, const uword col) const { return (row == col) ? ( P_is_vec ? P[row] : P.at(row,row) ) : elem_type(0); }\n  \n  const Mat<elem_type> P;\n  const bool           P_is_vec;\n  const uword          n_elem;\n  };\n\n\n\ntemplate<typename T1>\nclass diagmat_proxy_check_fixed\n  {\n  public:\n  \n  typedef typename T1::elem_type                   eT;\n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  inline\n  diagmat_proxy_check_fixed(const T1& X, const Mat<eT>& out)\n    : P( const_cast<eT*>(X.memptr()), T1::n_rows, T1::n_cols, (&X == &out), false )\n    {\n    arma_extra_debug_sigprint();\n    \n    arma_debug_check\n      (\n      (P_is_vec == false) && (T1::n_rows != T1::n_cols),\n      \"diagmat(): only vectors and square matrices are accepted\"\n      );\n    }\n  \n  \n  arma_inline eT operator[] (const uword i)                    const { return P_is_vec ? P[i] : P.at(i,i);                                         }\n  arma_inline eT at         (const uword row, const uword col) const { return (row == col) ? ( P_is_vec ? P[row] : P.at(row,row) ) : elem_type(0); }\n  \n  const Mat<eT> P;  // TODO: why not just store X directly as T1& ?  test with fixed size vectors and matrices\n  \n  static const bool  P_is_vec = (T1::n_rows == 1) || (T1::n_cols == 1);\n  static const uword n_elem   = P_is_vec ? T1::n_elem : ( (T1::n_elem < T1::n_rows) ? T1::n_elem : T1::n_rows );\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct diagmat_proxy_check_redirect {};\n\ntemplate<typename T1>\nstruct diagmat_proxy_check_redirect<T1, false> { typedef diagmat_proxy_check_default<T1> result; };\n\ntemplate<typename T1>\nstruct diagmat_proxy_check_redirect<T1, true>  { typedef diagmat_proxy_check_fixed<T1>   result; };\n\n\ntemplate<typename T1>\nclass diagmat_proxy_check : public diagmat_proxy_check_redirect<T1, is_Mat_fixed<T1>::value >::result\n  {\n  public:\n  inline diagmat_proxy_check(const T1& X, const Mat<typename T1::elem_type>& out)\n    : diagmat_proxy_check_redirect< T1, is_Mat_fixed<T1>::value >::result(X, out)\n    {\n    }\n  };\n\n\n\ntemplate<typename eT>\nclass diagmat_proxy_check< Mat<eT> >\n  {\n  public:\n  \n  typedef          eT                              elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  \n  inline\n  diagmat_proxy_check(const Mat<eT>& X, const Mat<eT>& out)\n    : P_local ( (&X == &out) ? new Mat<eT>(X) : 0  )\n    , P       ( (&X == &out) ? (*P_local)     : X  )\n    , P_is_vec( (P.n_rows == 1) || (P.n_cols == 1) )\n    , n_elem  ( P_is_vec ? P.n_elem : (std::min)(P.n_elem, P.n_rows) )\n    {\n    arma_extra_debug_sigprint();\n    \n    arma_debug_check\n      (\n      (P_is_vec == false) && (P.n_rows != P.n_cols),\n      \"diagmat(): only vectors and square matrices are accepted\"\n      );\n    }\n  \n  inline ~diagmat_proxy_check()\n    {\n    if(P_local) { delete P_local; }\n    }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return P_is_vec ? P[i] : P.at(i,i);                                         }\n  arma_inline elem_type at         (const uword row, const uword col) const { return (row == col) ? ( P_is_vec ? P[row] : P.at(row,row) ) : elem_type(0); }\n  \n  const Mat<eT>* P_local;\n  const Mat<eT>& P;\n  const bool     P_is_vec;\n  const uword    n_elem;\n  };\n\n\n\ntemplate<typename eT>\nclass diagmat_proxy_check< Row<eT> >\n  {\n  public:\n  \n  typedef          eT                              elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  inline\n  diagmat_proxy_check(const Row<eT>& X, const Mat<eT>& out)\n    : P_local ( (&X == reinterpret_cast<const Row<eT>*>(&out)) ? new Row<eT>(X) : 0 )\n    , P       ( (&X == reinterpret_cast<const Row<eT>*>(&out)) ? (*P_local)     : X )\n    , n_elem  (X.n_elem)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline ~diagmat_proxy_check()\n    {\n    if(P_local) { delete P_local; }\n    }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return P[i];                                 }\n  arma_inline elem_type at         (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }\n  \n  static const bool P_is_vec = true;\n  \n  const Row<eT>* P_local;\n  const Row<eT>& P;\n  const uword    n_elem;\n  };\n\n\n\ntemplate<typename eT>\nclass diagmat_proxy_check< Col<eT> >\n  {\n  public:\n  \n  typedef          eT                              elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  inline\n  diagmat_proxy_check(const Col<eT>& X, const Mat<eT>& out)\n    : P_local ( (&X == reinterpret_cast<const Col<eT>*>(&out)) ? new Col<eT>(X) : 0 )\n    , P       ( (&X == reinterpret_cast<const Col<eT>*>(&out)) ? (*P_local)     : X )\n    , n_elem  (X.n_elem)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline ~diagmat_proxy_check()\n    {\n    if(P_local) { delete P_local; }\n    }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return P[i];                                 }\n  arma_inline elem_type at         (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }\n  \n  static const bool P_is_vec = true;\n  \n  const Col<eT>* P_local;\n  const Col<eT>& P;\n  const uword    n_elem;\n  };\n\n\n\ntemplate<typename eT>\nclass diagmat_proxy_check< subview_row<eT> >\n  {\n  public:\n  \n  typedef          eT                              elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  inline\n  diagmat_proxy_check(const subview_row<eT>& X, const Mat<eT>&)\n    : P       ( X )\n    , n_elem  ( X.n_elem )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return P[i];                                 }\n  arma_inline elem_type at         (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }\n  \n  static const bool P_is_vec = true;\n  \n  const Row<eT> P;\n  const uword   n_elem;\n  };\n\n\n\ntemplate<typename eT>\nclass diagmat_proxy_check< subview_col<eT> >\n  {\n  public:\n  \n  typedef          eT                              elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  inline\n  diagmat_proxy_check(const subview_col<eT>& X, const Mat<eT>& out)\n    : P     ( const_cast<eT*>(X.colptr(0)), X.n_rows, (&(X.m) == &out), false )\n    , n_elem( X.n_elem )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline elem_type operator[] (const uword i)                    const { return P[i];                                 }\n  arma_inline elem_type at         (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); }\n  \n  static const bool P_is_vec = true;\n  \n  const Col<eT> P;\n  const uword   n_elem;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/diagview_bones.hpp",
    "content": "// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// Copyright (C) 2008-2013 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup diagview\n//! @{\n\n\n//! Class for storing data required to extract and set the diagonals of a matrix\ntemplate<typename eT>\nclass diagview : public Base<eT, diagview<eT> >\n  {\n  public:\n  \n  typedef eT                                elem_type;\n  typedef typename get_pod_type<eT>::result pod_type;\n  \n  arma_aligned const Mat<eT>& m;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  const uword row_offset;\n  const uword col_offset;\n  \n  const uword n_rows;     // equal to n_elem\n  const uword n_elem;\n  \n  static const uword n_cols = 1;\n  \n  \n  protected:\n  \n  arma_inline diagview(const Mat<eT>& in_m, const uword in_row_offset, const uword in_col_offset, const uword len);\n  \n  \n  public:\n  \n  inline ~diagview();\n  \n  inline void operator=(const diagview& x);\n  \n  inline void operator+=(const eT val);\n  inline void operator-=(const eT val);\n  inline void operator*=(const eT val);\n  inline void operator/=(const eT val);\n  \n  template<typename T1> inline void operator= (const Base<eT,T1>& x);\n  template<typename T1> inline void operator+=(const Base<eT,T1>& x);\n  template<typename T1> inline void operator-=(const Base<eT,T1>& x);\n  template<typename T1> inline void operator%=(const Base<eT,T1>& x);\n  template<typename T1> inline void operator/=(const Base<eT,T1>& x);\n  \n  \n  arma_inline eT  at_alt    (const uword ii) const;\n  \n  arma_inline eT& operator[](const uword ii);\n  arma_inline eT  operator[](const uword ii) const;\n  \n  arma_inline eT&         at(const uword ii);\n  arma_inline eT          at(const uword ii) const;\n  \n  arma_inline eT& operator()(const uword ii);\n  arma_inline eT  operator()(const uword ii) const;\n  \n  arma_inline eT&         at(const uword in_n_row, const uword);\n  arma_inline eT          at(const uword in_n_row, const uword) const;\n   \n  arma_inline eT& operator()(const uword in_n_row, const uword in_n_col);\n  arma_inline eT  operator()(const uword in_n_row, const uword in_n_col) const;\n  \n  \n  arma_inline const Op<diagview<eT>,op_htrans>  t() const;\n  arma_inline const Op<diagview<eT>,op_htrans> ht() const;\n  arma_inline const Op<diagview<eT>,op_strans> st() const;\n  \n  inline void fill(const eT val);\n  inline void zeros();\n  inline void ones();\n  inline void randu();\n  inline void randn();\n    \n  inline static void extract(Mat<eT>& out, const diagview& in);\n  \n  inline static void  plus_inplace(Mat<eT>& out, const diagview& in);\n  inline static void minus_inplace(Mat<eT>& out, const diagview& in);\n  inline static void schur_inplace(Mat<eT>& out, const diagview& in);\n  inline static void   div_inplace(Mat<eT>& out, const diagview& in);\n  \n  \n  private:\n  \n  friend class Mat<eT>;\n  friend class subview<eT>;\n  \n  diagview();\n  //diagview(const diagview&);  // making this private causes an error under gcc 4.1/4.2, but not 4.3\n  };\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/diagview_meat.hpp",
    "content": "// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// Copyright (C) 2008-2013 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup diagview\n//! @{\n\n\ntemplate<typename eT>\ninline\ndiagview<eT>::~diagview()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\ntemplate<typename eT>\narma_inline\ndiagview<eT>::diagview(const Mat<eT>& in_m, const uword in_row_offset, const uword in_col_offset, const uword in_len)\n  : m(in_m)\n  , row_offset(in_row_offset)\n  , col_offset(in_col_offset)\n  , n_rows(in_len)\n  , n_elem(in_len)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\n//! set a diagonal of our matrix using a diagonal from a foreign matrix\ntemplate<typename eT>\ninline\nvoid\ndiagview<eT>::operator= (const diagview<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  diagview<eT>& d = *this;\n  \n  arma_debug_check( (d.n_elem != x.n_elem), \"diagview: diagonals have incompatible lengths\");\n  \n        Mat<eT>& d_m = const_cast< Mat<eT>& >(d.m);\n  const Mat<eT>& x_m = x.m;\n  \n  if(&d_m != &x_m)\n    {\n    const uword d_n_elem     = d.n_elem;\n    const uword d_row_offset = d.row_offset;\n    const uword d_col_offset = d.col_offset;\n    \n    const uword x_row_offset = x.row_offset;\n    const uword x_col_offset = x.col_offset;\n    \n    uword ii,jj;\n    for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2)\n      {\n      const eT tmp_i = x_m.at(ii + x_row_offset, ii + x_col_offset);\n      const eT tmp_j = x_m.at(jj + x_row_offset, jj + x_col_offset);\n      \n      d_m.at(ii + d_row_offset, ii + d_col_offset) = tmp_i;\n      d_m.at(jj + d_row_offset, jj + d_col_offset) = tmp_j;\n      }\n    \n    if(ii < d_n_elem)\n      {\n      d_m.at(ii + d_row_offset, ii + d_col_offset) = x_m.at(ii + x_row_offset, ii + x_col_offset);\n      }\n    }\n  else\n    {\n    const Mat<eT> tmp = x;\n    \n    (*this).operator=(tmp);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ndiagview<eT>::operator+=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& t_m = const_cast< Mat<eT>& >(m);\n  \n  const uword t_n_elem     = n_elem;\n  const uword t_row_offset = row_offset;\n  const uword t_col_offset = col_offset;\n  \n  for(uword ii=0; ii < t_n_elem; ++ii)\n    {\n    t_m.at( ii + t_row_offset,  ii + t_col_offset) += val;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ndiagview<eT>::operator-=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& t_m = const_cast< Mat<eT>& >(m);\n  \n  const uword t_n_elem     = n_elem;\n  const uword t_row_offset = row_offset;\n  const uword t_col_offset = col_offset;\n  \n  for(uword ii=0; ii < t_n_elem; ++ii)\n    {\n    t_m.at( ii + t_row_offset,  ii + t_col_offset) -= val;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ndiagview<eT>::operator*=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& t_m = const_cast< Mat<eT>& >(m);\n  \n  const uword t_n_elem     = n_elem;\n  const uword t_row_offset = row_offset;\n  const uword t_col_offset = col_offset;\n  \n  for(uword ii=0; ii < t_n_elem; ++ii)\n    {\n    t_m.at( ii + t_row_offset,  ii + t_col_offset) *= val;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ndiagview<eT>::operator/=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& t_m = const_cast< Mat<eT>& >(m);\n  \n  const uword t_n_elem     = n_elem;\n  const uword t_row_offset = row_offset;\n  const uword t_col_offset = col_offset;\n  \n  for(uword ii=0; ii < t_n_elem; ++ii)\n    {\n    t_m.at( ii + t_row_offset,  ii + t_col_offset) /= val;\n    }\n  }\n\n\n\n//! set a diagonal of our matrix using data from a foreign object\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\ndiagview<eT>::operator= (const Base<eT,T1>& o)\n  {\n  arma_extra_debug_sigprint();\n  \n  diagview<eT>& d = *this;\n  \n  Mat<eT>& d_m = const_cast< Mat<eT>& >(d.m);\n  \n  const uword d_n_elem     = d.n_elem;\n  const uword d_row_offset = d.row_offset;\n  const uword d_col_offset = d.col_offset;\n    \n  const Proxy<T1> P( o.get_ref() );\n  \n  arma_debug_check\n    (\n    ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ),\n    \"diagview: given object has incompatible size\"\n    );\n  \n  const bool is_alias = P.is_alias(d_m);\n  \n  arma_extra_debug_warn(is_alias, \"aliasing detected\");\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value) || (Proxy<T1>::prefer_at_accessor) || (is_alias) )\n    {\n    const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);\n    const Mat<eT>& x = tmp.M;\n    \n    const eT* x_mem = x.memptr();\n    \n    uword ii,jj;\n    for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2)\n      {\n      const eT tmp_i = x_mem[ii];\n      const eT tmp_j = x_mem[jj];\n      \n      d_m.at( ii + d_row_offset,  ii + d_col_offset) = tmp_i;\n      d_m.at( jj + d_row_offset,  jj + d_col_offset) = tmp_j;\n      }\n    \n    if(ii < d_n_elem)\n      {\n      d_m.at( ii + d_row_offset,  ii + d_col_offset) = x_mem[ii];\n      }\n    }\n  else\n    {\n    typename Proxy<T1>::ea_type Pea = P.get_ea();\n      \n    uword ii,jj;\n    for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2)\n      {\n      const eT tmp_i = Pea[ii];\n      const eT tmp_j = Pea[jj];\n      \n      d_m.at( ii + d_row_offset,  ii + d_col_offset) = tmp_i;\n      d_m.at( jj + d_row_offset,  jj + d_col_offset) = tmp_j;\n      }\n    \n    if(ii < d_n_elem)\n      {\n      d_m.at( ii + d_row_offset,  ii + d_col_offset) = Pea[ii];\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\ndiagview<eT>::operator+=(const Base<eT,T1>& o)\n  {\n  arma_extra_debug_sigprint();\n  \n  diagview<eT>& d = *this;\n  \n  Mat<eT>& d_m = const_cast< Mat<eT>& >(d.m);\n  \n  const uword d_n_elem     = d.n_elem;\n  const uword d_row_offset = d.row_offset;\n  const uword d_col_offset = d.col_offset;\n    \n  const Proxy<T1> P( o.get_ref() );\n  \n  arma_debug_check\n    (\n    ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ),\n    \"diagview: given object has incompatible size\"\n    );\n  \n  const bool is_alias = P.is_alias(d_m);\n  \n  arma_extra_debug_warn(is_alias, \"aliasing detected\");\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value) || (Proxy<T1>::prefer_at_accessor) || (is_alias) )\n    {\n    const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);\n    const Mat<eT>& x = tmp.M;\n    \n    const eT* x_mem = x.memptr();\n    \n    uword ii,jj;\n    for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2)\n      {\n      const eT tmp_i = x_mem[ii];\n      const eT tmp_j = x_mem[jj];\n      \n      d_m.at( ii + d_row_offset,  ii + d_col_offset) += tmp_i;\n      d_m.at( jj + d_row_offset,  jj + d_col_offset) += tmp_j;\n      }\n    \n    if(ii < d_n_elem)\n      {\n      d_m.at( ii + d_row_offset,  ii + d_col_offset) += x_mem[ii];\n      }\n    }\n  else\n    {\n    typename Proxy<T1>::ea_type Pea = P.get_ea();\n      \n    uword ii,jj;\n    for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2)\n      {\n      const eT tmp_i = Pea[ii];\n      const eT tmp_j = Pea[jj];\n      \n      d_m.at( ii + d_row_offset,  ii + d_col_offset) += tmp_i;\n      d_m.at( jj + d_row_offset,  jj + d_col_offset) += tmp_j;\n      }\n    \n    if(ii < d_n_elem)\n      {\n      d_m.at( ii + d_row_offset,  ii + d_col_offset) += Pea[ii];\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\ndiagview<eT>::operator-=(const Base<eT,T1>& o)\n  {\n  arma_extra_debug_sigprint();\n  \n  diagview<eT>& d = *this;\n  \n  Mat<eT>& d_m = const_cast< Mat<eT>& >(d.m);\n  \n  const uword d_n_elem     = d.n_elem;\n  const uword d_row_offset = d.row_offset;\n  const uword d_col_offset = d.col_offset;\n    \n  const Proxy<T1> P( o.get_ref() );\n  \n  arma_debug_check\n    (\n    ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ),\n    \"diagview: given object has incompatible size\"\n    );\n  \n  const bool is_alias = P.is_alias(d_m);\n  \n  arma_extra_debug_warn(is_alias, \"aliasing detected\");\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value) || (Proxy<T1>::prefer_at_accessor) || (is_alias) )\n    {\n    const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);\n    const Mat<eT>& x = tmp.M;\n    \n    const eT* x_mem = x.memptr();\n    \n    uword ii,jj;\n    for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2)\n      {\n      const eT tmp_i = x_mem[ii];\n      const eT tmp_j = x_mem[jj];\n      \n      d_m.at( ii + d_row_offset,  ii + d_col_offset) -= tmp_i;\n      d_m.at( jj + d_row_offset,  jj + d_col_offset) -= tmp_j;\n      }\n    \n    if(ii < d_n_elem)\n      {\n      d_m.at( ii + d_row_offset,  ii + d_col_offset) -= x_mem[ii];\n      }\n    }\n  else\n    {\n    typename Proxy<T1>::ea_type Pea = P.get_ea();\n      \n    uword ii,jj;\n    for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2)\n      {\n      const eT tmp_i = Pea[ii];\n      const eT tmp_j = Pea[jj];\n      \n      d_m.at( ii + d_row_offset,  ii + d_col_offset) -= tmp_i;\n      d_m.at( jj + d_row_offset,  jj + d_col_offset) -= tmp_j;\n      }\n    \n    if(ii < d_n_elem)\n      {\n      d_m.at( ii + d_row_offset,  ii + d_col_offset) -= Pea[ii];\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\ndiagview<eT>::operator%=(const Base<eT,T1>& o)\n  {\n  arma_extra_debug_sigprint();\n  \n  diagview<eT>& d = *this;\n  \n  Mat<eT>& d_m = const_cast< Mat<eT>& >(d.m);\n  \n  const uword d_n_elem     = d.n_elem;\n  const uword d_row_offset = d.row_offset;\n  const uword d_col_offset = d.col_offset;\n    \n  const Proxy<T1> P( o.get_ref() );\n  \n  arma_debug_check\n    (\n    ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ),\n    \"diagview: given object has incompatible size\"\n    );\n  \n  const bool is_alias = P.is_alias(d_m);\n  \n  arma_extra_debug_warn(is_alias, \"aliasing detected\");\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value) || (Proxy<T1>::prefer_at_accessor) || (is_alias) )\n    {\n    const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);\n    const Mat<eT>& x = tmp.M;\n    \n    const eT* x_mem = x.memptr();\n    \n    uword ii,jj;\n    for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2)\n      {\n      const eT tmp_i = x_mem[ii];\n      const eT tmp_j = x_mem[jj];\n      \n      d_m.at( ii + d_row_offset,  ii + d_col_offset) *= tmp_i;\n      d_m.at( jj + d_row_offset,  jj + d_col_offset) *= tmp_j;\n      }\n    \n    if(ii < d_n_elem)\n      {\n      d_m.at( ii + d_row_offset,  ii + d_col_offset) *= x_mem[ii];\n      }\n    }\n  else\n    {\n    typename Proxy<T1>::ea_type Pea = P.get_ea();\n      \n    uword ii,jj;\n    for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2)\n      {\n      const eT tmp_i = Pea[ii];\n      const eT tmp_j = Pea[jj];\n      \n      d_m.at( ii + d_row_offset,  ii + d_col_offset) *= tmp_i;\n      d_m.at( jj + d_row_offset,  jj + d_col_offset) *= tmp_j;\n      }\n    \n    if(ii < d_n_elem)\n      {\n      d_m.at( ii + d_row_offset,  ii + d_col_offset) *= Pea[ii];\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\ndiagview<eT>::operator/=(const Base<eT,T1>& o)\n  {\n  arma_extra_debug_sigprint();\n  \n  diagview<eT>& d = *this;\n  \n  Mat<eT>& d_m = const_cast< Mat<eT>& >(d.m);\n  \n  const uword d_n_elem     = d.n_elem;\n  const uword d_row_offset = d.row_offset;\n  const uword d_col_offset = d.col_offset;\n    \n  const Proxy<T1> P( o.get_ref() );\n  \n  arma_debug_check\n    (\n    ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ),\n    \"diagview: given object has incompatible size\"\n    );\n  \n  const bool is_alias = P.is_alias(d_m);\n  \n  arma_extra_debug_warn(is_alias, \"aliasing detected\");\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value) || (Proxy<T1>::prefer_at_accessor) || (is_alias) )\n    {\n    const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);\n    const Mat<eT>& x = tmp.M;\n    \n    const eT* x_mem = x.memptr();\n    \n    uword ii,jj;\n    for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2)\n      {\n      const eT tmp_i = x_mem[ii];\n      const eT tmp_j = x_mem[jj];\n      \n      d_m.at( ii + d_row_offset,  ii + d_col_offset) /= tmp_i;\n      d_m.at( jj + d_row_offset,  jj + d_col_offset) /= tmp_j;\n      }\n    \n    if(ii < d_n_elem)\n      {\n      d_m.at( ii + d_row_offset,  ii + d_col_offset) /= x_mem[ii];\n      }\n    }\n  else\n    {\n    typename Proxy<T1>::ea_type Pea = P.get_ea();\n      \n    uword ii,jj;\n    for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2)\n      {\n      const eT tmp_i = Pea[ii];\n      const eT tmp_j = Pea[jj];\n      \n      d_m.at( ii + d_row_offset,  ii + d_col_offset) /= tmp_i;\n      d_m.at( jj + d_row_offset,  jj + d_col_offset) /= tmp_j;\n      }\n    \n    if(ii < d_n_elem)\n      {\n      d_m.at( ii + d_row_offset,  ii + d_col_offset) /= Pea[ii];\n      }\n    }\n  }\n\n\n\n//! extract a diagonal and store it as a column vector\ntemplate<typename eT>\ninline\nvoid\ndiagview<eT>::extract(Mat<eT>& out, const diagview<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing;\n  // size setting and alias checking is done by either the Mat contructor or operator=()\n  \n  const Mat<eT>& in_m = in.m;\n  \n  const uword in_n_elem     = in.n_elem;\n  const uword in_row_offset = in.row_offset;\n  const uword in_col_offset = in.col_offset;\n  \n  eT* out_mem = out.memptr();\n  \n  uword i,j;\n  for(i=0, j=1; j < in_n_elem; i+=2, j+=2)\n    {\n    const eT tmp_i = in_m.at( i + in_row_offset, i + in_col_offset );\n    const eT tmp_j = in_m.at( j + in_row_offset, j + in_col_offset );\n    \n    out_mem[i] = tmp_i;\n    out_mem[j] = tmp_j;\n    }\n  \n  if(i < in_n_elem)\n    {\n    out_mem[i] = in_m.at( i + in_row_offset, i + in_col_offset );\n    }\n  }\n\n\n\n//! X += Y.diag()\ntemplate<typename eT>\ninline\nvoid\ndiagview<eT>::plus_inplace(Mat<eT>& out, const diagview<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, in.n_rows, in.n_cols, \"addition\");\n  \n  const Mat<eT>& in_m = in.m;\n  \n  const uword in_n_elem     = in.n_elem;\n  const uword in_row_offset = in.row_offset;\n  const uword in_col_offset = in.col_offset;\n  \n  eT* out_mem = out.memptr();\n  \n  uword i,j;\n  for(i=0, j=1; j < in_n_elem; i+=2, j+=2)\n    {\n    const eT tmp_i = in_m.at( i + in_row_offset, i + in_col_offset );\n    const eT tmp_j = in_m.at( j + in_row_offset, j + in_col_offset );\n    \n    out_mem[i] += tmp_i;\n    out_mem[j] += tmp_j;\n    }\n  \n  if(i < in_n_elem)\n    {\n    out_mem[i] += in_m.at( i + in_row_offset, i + in_col_offset );\n    }\n  }\n\n\n\n//! X -= Y.diag()\ntemplate<typename eT>\ninline\nvoid\ndiagview<eT>::minus_inplace(Mat<eT>& out, const diagview<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, in.n_rows, in.n_cols, \"subtraction\");\n  \n  const Mat<eT>& in_m = in.m;\n  \n  const uword in_n_elem     = in.n_elem;\n  const uword in_row_offset = in.row_offset;\n  const uword in_col_offset = in.col_offset;\n  \n  eT* out_mem = out.memptr();\n  \n  uword i,j;\n  for(i=0, j=1; j < in_n_elem; i+=2, j+=2)\n    {\n    const eT tmp_i = in_m.at( i + in_row_offset, i + in_col_offset );\n    const eT tmp_j = in_m.at( j + in_row_offset, j + in_col_offset );\n    \n    out_mem[i] -= tmp_i;\n    out_mem[j] -= tmp_j;\n    }\n  \n  if(i < in_n_elem)\n    {\n    out_mem[i] -= in_m.at( i + in_row_offset, i + in_col_offset );\n    }\n  }\n\n\n\n//! X %= Y.diag()\ntemplate<typename eT>\ninline\nvoid\ndiagview<eT>::schur_inplace(Mat<eT>& out, const diagview<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, in.n_rows, in.n_cols, \"element-wise multiplication\");\n  \n  const Mat<eT>& in_m = in.m;\n  \n  const uword in_n_elem     = in.n_elem;\n  const uword in_row_offset = in.row_offset;\n  const uword in_col_offset = in.col_offset;\n  \n  eT* out_mem = out.memptr();\n  \n  uword i,j;\n  for(i=0, j=1; j < in_n_elem; i+=2, j+=2)\n    {\n    const eT tmp_i = in_m.at( i + in_row_offset, i + in_col_offset );\n    const eT tmp_j = in_m.at( j + in_row_offset, j + in_col_offset );\n    \n    out_mem[i] *= tmp_i;\n    out_mem[j] *= tmp_j;\n    }\n  \n  if(i < in_n_elem)\n    {\n    out_mem[i] *= in_m.at( i + in_row_offset, i + in_col_offset );\n    }\n  }\n\n\n\n//! X /= Y.diag()\ntemplate<typename eT>\ninline\nvoid\ndiagview<eT>::div_inplace(Mat<eT>& out, const diagview<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, in.n_rows, in.n_cols, \"element-wise division\");\n  \n  const Mat<eT>& in_m = in.m;\n  \n  const uword in_n_elem     = in.n_elem;\n  const uword in_row_offset = in.row_offset;\n  const uword in_col_offset = in.col_offset;\n  \n  eT* out_mem = out.memptr();\n  \n  uword i,j;\n  for(i=0, j=1; j < in_n_elem; i+=2, j+=2)\n    {\n    const eT tmp_i = in_m.at( i + in_row_offset, i + in_col_offset );\n    const eT tmp_j = in_m.at( j + in_row_offset, j + in_col_offset );\n    \n    out_mem[i] /= tmp_i;\n    out_mem[j] /= tmp_j;\n    }\n  \n  if(i < in_n_elem)\n    {\n    out_mem[i] /= in_m.at( i + in_row_offset, i + in_col_offset );\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT\ndiagview<eT>::at_alt(const uword ii) const\n  {\n  return m.at(ii+row_offset, ii+col_offset);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT&\ndiagview<eT>::operator[](const uword ii)\n  {\n  return (const_cast< Mat<eT>& >(m)).at(ii+row_offset, ii+col_offset);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT\ndiagview<eT>::operator[](const uword ii) const\n  {\n  return m.at(ii+row_offset, ii+col_offset);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT&\ndiagview<eT>::at(const uword ii)\n  {\n  return (const_cast< Mat<eT>& >(m)).at(ii+row_offset, ii+col_offset);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT\ndiagview<eT>::at(const uword ii) const\n  {\n  return m.at(ii+row_offset, ii+col_offset);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT&\ndiagview<eT>::operator()(const uword ii)\n  {\n  arma_debug_check( (ii >= n_elem), \"diagview::operator(): out of bounds\" );\n  \n  return (const_cast< Mat<eT>& >(m)).at(ii+row_offset, ii+col_offset);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT\ndiagview<eT>::operator()(const uword ii) const\n  {\n  arma_debug_check( (ii >= n_elem), \"diagview::operator(): out of bounds\" );\n  \n  return m.at(ii+row_offset, ii+col_offset);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT&\ndiagview<eT>::at(const uword row, const uword)\n  {\n  return (const_cast< Mat<eT>& >(m)).at(row+row_offset, row+col_offset);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT\ndiagview<eT>::at(const uword row, const uword) const\n  {\n  return m.at(row+row_offset, row+col_offset);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT&\ndiagview<eT>::operator()(const uword row, const uword col)\n  {\n  arma_debug_check( ((row >= n_elem) || (col > 0)), \"diagview::operator(): out of bounds\" );\n  \n  return (const_cast< Mat<eT>& >(m)).at(row+row_offset, row+col_offset);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT\ndiagview<eT>::operator()(const uword row, const uword col) const\n  {\n  arma_debug_check( ((row >= n_elem) || (col > 0)), \"diagview::operator(): out of bounds\" );\n  \n  return m.at(row+row_offset, row+col_offset);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst Op<diagview<eT>,op_htrans>\ndiagview<eT>::t() const\n  {\n  return Op<diagview<eT>,op_htrans>(*this);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst Op<diagview<eT>,op_htrans>\ndiagview<eT>::ht() const\n  {\n  return Op<diagview<eT>,op_htrans>(*this);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst Op<diagview<eT>,op_strans>\ndiagview<eT>::st() const\n  {\n  return Op<diagview<eT>,op_strans>(*this);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ndiagview<eT>::fill(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& x = const_cast< Mat<eT>& >(m);\n  \n  const uword local_n_elem = n_elem;\n  \n  for(uword ii=0; ii < local_n_elem; ++ii)\n    {\n    x.at(ii+row_offset, ii+col_offset) = val;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ndiagview<eT>::zeros()\n  {\n  arma_extra_debug_sigprint();\n  \n  (*this).fill(eT(0));\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ndiagview<eT>::ones()\n  {\n  arma_extra_debug_sigprint();\n  \n  (*this).fill(eT(1));\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ndiagview<eT>::randu()\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& x = const_cast< Mat<eT>& >(m);\n  \n  const uword local_n_elem = n_elem;\n  \n  for(uword ii=0; ii < local_n_elem; ++ii)\n    {\n    x.at(ii+row_offset, ii+col_offset) = eT(arma_rng::randu<eT>());\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ndiagview<eT>::randn()\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& x = const_cast< Mat<eT>& >(m);\n  \n  const uword local_n_elem = n_elem;\n  \n  for(uword ii=0; ii < local_n_elem; ++ii)\n    {\n    x.at(ii+row_offset, ii+col_offset) = eT(arma_rng::randn<eT>());\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/diskio_bones.hpp",
    "content": "// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2009-2010 Ian Cullinan\n// Copyright (C) 2012 Ryan Curtin\n// Copyright (C) 2013 Szabolcs Horvat\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup diskio\n//! @{\n\n\n//! class for saving and loading matrices and fields\nclass diskio\n  {\n  public:\n  \n  template<typename eT> inline static std::string gen_txt_header(const Mat<eT>& x);\n  template<typename eT> inline static std::string gen_bin_header(const Mat<eT>& x);\n  \n  template<typename eT> inline static std::string gen_bin_header(const SpMat<eT>& x);\n\n  template<typename eT> inline static std::string gen_txt_header(const Cube<eT>& x);\n  template<typename eT> inline static std::string gen_bin_header(const Cube<eT>& x);\n  \n  inline static file_type guess_file_type(std::istream& f);\n  \n  inline static char conv_to_hex_char(const u8 x);\n  inline static void conv_to_hex(char* out, const u8 x);\n  \n  inline static std::string gen_tmp_name(const std::string& x);\n  \n  inline static bool safe_rename(const std::string& old_name, const std::string& new_name);\n  \n  template<typename eT> inline static bool convert_naninf(eT&              val, const std::string& token);\n  template<typename  T> inline static bool convert_naninf(std::complex<T>& val, const std::string& token);\n  \n  //\n  // matrix saving\n  \n  template<typename eT> inline static bool save_raw_ascii  (const Mat<eT>&                x, const std::string& final_name);\n  template<typename eT> inline static bool save_raw_binary (const Mat<eT>&                x, const std::string& final_name);\n  template<typename eT> inline static bool save_arma_ascii (const Mat<eT>&                x, const std::string& final_name);\n  template<typename eT> inline static bool save_csv_ascii  (const Mat<eT>&                x, const std::string& final_name);\n  template<typename eT> inline static bool save_arma_binary(const Mat<eT>&                x, const std::string& final_name);\n  template<typename eT> inline static bool save_pgm_binary (const Mat<eT>&                x, const std::string& final_name);\n  template<typename  T> inline static bool save_pgm_binary (const Mat< std::complex<T> >& x, const std::string& final_name);\n  template<typename eT> inline static bool save_hdf5_binary(const Mat<eT>&                x, const std::string& final_name);\n  \n  template<typename eT> inline static bool save_raw_ascii  (const Mat<eT>&                x, std::ostream& f);\n  template<typename eT> inline static bool save_raw_binary (const Mat<eT>&                x, std::ostream& f);\n  template<typename eT> inline static bool save_arma_ascii (const Mat<eT>&                x, std::ostream& f);\n  template<typename eT> inline static bool save_csv_ascii  (const Mat<eT>&                x, std::ostream& f);\n  template<typename eT> inline static bool save_arma_binary(const Mat<eT>&                x, std::ostream& f);\n  template<typename eT> inline static bool save_pgm_binary (const Mat<eT>&                x, std::ostream& f);\n  template<typename  T> inline static bool save_pgm_binary (const Mat< std::complex<T> >& x, std::ostream& f);\n  \n  \n  //\n  // matrix loading\n  \n  template<typename eT> inline static bool load_raw_ascii  (Mat<eT>&                x, const std::string& name, std::string& err_msg);\n  template<typename eT> inline static bool load_raw_binary (Mat<eT>&                x, const std::string& name, std::string& err_msg);\n  template<typename eT> inline static bool load_arma_ascii (Mat<eT>&                x, const std::string& name, std::string& err_msg);\n  template<typename eT> inline static bool load_csv_ascii  (Mat<eT>&                x, const std::string& name, std::string& err_msg);\n  template<typename eT> inline static bool load_arma_binary(Mat<eT>&                x, const std::string& name, std::string& err_msg);\n  template<typename eT> inline static bool load_pgm_binary (Mat<eT>&                x, const std::string& name, std::string& err_msg);\n  template<typename  T> inline static bool load_pgm_binary (Mat< std::complex<T> >& x, const std::string& name, std::string& err_msg);\n  template<typename eT> inline static bool load_hdf5_binary(Mat<eT>&                x, const std::string& name, std::string& err_msg);\n  template<typename eT> inline static bool load_auto_detect(Mat<eT>&                x, const std::string& name, std::string& err_msg);\n  \n  template<typename eT> inline static bool load_raw_ascii  (Mat<eT>&                x, std::istream& f,  std::string& err_msg);\n  template<typename eT> inline static bool load_raw_binary (Mat<eT>&                x, std::istream& f,  std::string& err_msg);\n  template<typename eT> inline static bool load_arma_ascii (Mat<eT>&                x, std::istream& f,  std::string& err_msg);\n  template<typename eT> inline static bool load_csv_ascii  (Mat<eT>&                x, std::istream& f,  std::string& err_msg);\n  template<typename eT> inline static bool load_arma_binary(Mat<eT>&                x, std::istream& f,  std::string& err_msg);\n  template<typename eT> inline static bool load_pgm_binary (Mat<eT>&                x, std::istream& is, std::string& err_msg);\n  template<typename  T> inline static bool load_pgm_binary (Mat< std::complex<T> >& x, std::istream& is, std::string& err_msg);\n  template<typename eT> inline static bool load_auto_detect(Mat<eT>&                x, std::istream& f,  std::string& err_msg);\n  \n  inline static void pnm_skip_comments(std::istream& f);\n  \n  \n  //\n  // sparse matrix saving\n  \n  template<typename eT> inline static bool save_coord_ascii(const SpMat<eT>& x, const std::string& final_name);\n  template<typename eT> inline static bool save_arma_binary(const SpMat<eT>& x, const std::string& final_name);\n  \n  template<typename eT> inline static bool save_coord_ascii(const SpMat<eT>& x,                std::ostream& f);\n  template<typename  T> inline static bool save_coord_ascii(const SpMat< std::complex<T> >& x, std::ostream& f);\n  template<typename eT> inline static bool save_arma_binary(const SpMat<eT>& x,                std::ostream& f);\n  \n  \n  //\n  // sparse matrix loading\n  \n  template<typename eT> inline static bool load_coord_ascii(SpMat<eT>& x, const std::string& name, std::string& err_msg);\n  template<typename eT> inline static bool load_arma_binary(SpMat<eT>& x, const std::string& name, std::string& err_msg);\n  \n  template<typename eT> inline static bool load_coord_ascii(SpMat<eT>& x,                std::istream& f, std::string& err_msg);\n  template<typename  T> inline static bool load_coord_ascii(SpMat< std::complex<T> >& x, std::istream& f, std::string& err_msg);\n  template<typename eT> inline static bool load_arma_binary(SpMat<eT>& x,                std::istream& f, std::string& err_msg);\n  \n  \n  \n  //\n  // cube saving\n  \n  template<typename eT> inline static bool save_raw_ascii  (const Cube<eT>& x, const std::string& name);\n  template<typename eT> inline static bool save_raw_binary (const Cube<eT>& x, const std::string& name);\n  template<typename eT> inline static bool save_arma_ascii (const Cube<eT>& x, const std::string& name);\n  template<typename eT> inline static bool save_arma_binary(const Cube<eT>& x, const std::string& name);\n  template<typename eT> inline static bool save_hdf5_binary(const Cube<eT>& x, const std::string& name);\n  \n  template<typename eT> inline static bool save_raw_ascii  (const Cube<eT>& x, std::ostream& f);\n  template<typename eT> inline static bool save_raw_binary (const Cube<eT>& x, std::ostream& f);\n  template<typename eT> inline static bool save_arma_ascii (const Cube<eT>& x, std::ostream& f);\n  template<typename eT> inline static bool save_arma_binary(const Cube<eT>& x, std::ostream& f);\n  \n  \n  //\n  // cube loading\n  \n  template<typename eT> inline static bool load_raw_ascii  (Cube<eT>& x, const std::string& name, std::string& err_msg);\n  template<typename eT> inline static bool load_raw_binary (Cube<eT>& x, const std::string& name, std::string& err_msg);\n  template<typename eT> inline static bool load_arma_ascii (Cube<eT>& x, const std::string& name, std::string& err_msg);\n  template<typename eT> inline static bool load_arma_binary(Cube<eT>& x, const std::string& name, std::string& err_msg);\n  template<typename eT> inline static bool load_hdf5_binary(Cube<eT>& x, const std::string& name, std::string& err_msg);\n  template<typename eT> inline static bool load_auto_detect(Cube<eT>& x, const std::string& name, std::string& err_msg);\n  \n  template<typename eT> inline static bool load_raw_ascii  (Cube<eT>& x, std::istream& f, std::string& err_msg);\n  template<typename eT> inline static bool load_raw_binary (Cube<eT>& x, std::istream& f, std::string& err_msg);\n  template<typename eT> inline static bool load_arma_ascii (Cube<eT>& x, std::istream& f, std::string& err_msg);\n  template<typename eT> inline static bool load_arma_binary(Cube<eT>& x, std::istream& f, std::string& err_msg);\n  template<typename eT> inline static bool load_auto_detect(Cube<eT>& x, std::istream& f, std::string& err_msg);\n  \n  \n  //\n  // field saving and loading\n  \n  template<typename T1> inline static bool save_arma_binary(const field<T1>& x, const std::string&  name);\n  template<typename T1> inline static bool save_arma_binary(const field<T1>& x,       std::ostream& f);\n  \n  template<typename T1> inline static bool load_arma_binary(      field<T1>& x, const std::string&  name, std::string& err_msg);\n  template<typename T1> inline static bool load_arma_binary(      field<T1>& x,       std::istream& f,    std::string& err_msg);\n  \n  template<typename T1> inline static bool load_auto_detect(      field<T1>& x, const std::string&  name, std::string& err_msg);\n  template<typename T1> inline static bool load_auto_detect(      field<T1>& x,       std::istream& f,    std::string& err_msg);\n  \n  inline static bool save_std_string(const field<std::string>& x, const std::string&  name);\n  inline static bool save_std_string(const field<std::string>& x,       std::ostream& f);\n  \n  inline static bool load_std_string(      field<std::string>& x, const std::string&  name, std::string& err_msg);\n  inline static bool load_std_string(      field<std::string>& x,       std::istream& f,    std::string& err_msg);\n  \n\n\n  //\n  // handling of PPM images by cubes\n\n  template<typename T1> inline static bool save_ppm_binary(const Cube<T1>& x, const std::string&  final_name);\n  template<typename T1> inline static bool save_ppm_binary(const Cube<T1>& x,       std::ostream& f);\n  \n  template<typename T1> inline static bool load_ppm_binary(      Cube<T1>& x, const std::string&  final_name, std::string& err_msg);\n  template<typename T1> inline static bool load_ppm_binary(      Cube<T1>& x,       std::istream& f,          std::string& err_msg);\n\n\n  //\n  // handling of PPM images by fields\n\n  template<typename T1> inline static bool save_ppm_binary(const field<T1>& x, const std::string&  final_name);\n  template<typename T1> inline static bool save_ppm_binary(const field<T1>& x,       std::ostream& f);\n  \n  template<typename T1> inline static bool load_ppm_binary(      field<T1>& x, const std::string&  final_name, std::string& err_msg);\n  template<typename T1> inline static bool load_ppm_binary(      field<T1>& x,       std::istream& f,          std::string& err_msg);\n  \n\n\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/diskio_meat.hpp",
    "content": "// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2009-2010 Ian Cullinan\n// Copyright (C) 2012 Ryan Curtin\n// Copyright (C) 2013 Szabolcs Horvat\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup diskio\n//! @{\n\n\n//! Generate the first line of the header used for saving matrices in text format.\n//! Format: \"ARMA_MAT_TXT_ABXYZ\".\n//! A is one of: I (for integral types) or F (for floating point types).\n//! B is one of: U (for unsigned types), S (for signed types), N (for not applicable) or C (for complex types).\n//! XYZ specifies the width of each element in terms of bytes, e.g. \"008\" indicates eight bytes.\ntemplate<typename eT>\ninline\nstd::string\ndiskio::gen_txt_header(const Mat<eT>& x)\n  {\n  arma_type_check(( is_supported_elem_type<eT>::value == false ));\n\n  arma_ignore(x);\n  \n  if(is_u8<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_TXT_IU001\");\n    }\n  else\n  if(is_s8<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_TXT_IS001\");\n    }\n  else\n  if(is_u16<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_TXT_IU002\");\n    }\n  else\n  if(is_s16<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_TXT_IS002\");\n    }\n  else\n  if(is_u32<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_TXT_IU004\");\n    }\n  else\n  if(is_s32<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_TXT_IS004\");\n    }\n#if defined(ARMA_USE_U64S64)\n  else\n  if(is_u64<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_TXT_IU008\");\n    }\n  else\n  if(is_s64<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_TXT_IS008\");\n    }\n#endif\n#if defined(ARMA_ALLOW_LONG)\n  else\n  if(is_ulng_t_32<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_TXT_IU004\");\n    }\n  else\n  if(is_slng_t_32<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_TXT_IS004\");\n    }\n  else\n  if(is_ulng_t_64<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_TXT_IU008\");\n    }\n  else\n  if(is_slng_t_64<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_TXT_IS008\");\n    }\n#endif\n  else\n  if(is_float<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_TXT_FN004\");\n    }\n  else\n  if(is_double<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_TXT_FN008\");\n    }\n  else\n  if(is_complex_float<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_TXT_FC008\");\n    }\n  else\n  if(is_complex_double<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_TXT_FC016\");\n    }\n  else\n    {\n    return std::string();\n    }\n  \n  }\n\n\n\n//! Generate the first line of the header used for saving matrices in binary format.\n//! Format: \"ARMA_MAT_BIN_ABXYZ\".\n//! A is one of: I (for integral types) or F (for floating point types).\n//! B is one of: U (for unsigned types), S (for signed types), N (for not applicable) or C (for complex types).\n//! XYZ specifies the width of each element in terms of bytes, e.g. \"008\" indicates eight bytes.\ntemplate<typename eT>\ninline\nstd::string\ndiskio::gen_bin_header(const Mat<eT>& x)\n  {\n  arma_type_check(( is_supported_elem_type<eT>::value == false ));\n  \n  arma_ignore(x);\n  \n  if(is_u8<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_BIN_IU001\");\n    }\n  else\n  if(is_s8<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_BIN_IS001\");\n    }\n  else\n  if(is_u16<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_BIN_IU002\");\n    }\n  else\n  if(is_s16<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_BIN_IS002\");\n    }\n  else\n  if(is_u32<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_BIN_IU004\");\n    }\n  else\n  if(is_s32<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_BIN_IS004\");\n    }\n#if defined(ARMA_USE_U64S64)\n  else\n  if(is_u64<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_BIN_IU008\");\n    }\n  else\n  if(is_s64<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_BIN_IS008\");\n    }\n#endif\n#if defined(ARMA_ALLOW_LONG)\n  else\n  if(is_ulng_t_32<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_BIN_IU004\");\n    }\n  else\n  if(is_slng_t_32<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_BIN_IS004\");\n    }\n  else\n  if(is_ulng_t_64<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_BIN_IU008\");\n    }\n  else\n  if(is_slng_t_64<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_BIN_IS008\");\n    }\n#endif\n  else\n  if(is_float<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_BIN_FN004\");\n    }\n  else\n  if(is_double<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_BIN_FN008\");\n    }\n  else\n  if(is_complex_float<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_BIN_FC008\");\n    }\n  else\n  if(is_complex_double<eT>::value)\n    {\n    return std::string(\"ARMA_MAT_BIN_FC016\");\n    }\n  else\n    {\n    return std::string();\n    }\n  \n  }\n\n\n\n//! Generate the first line of the header used for saving matrices in binary format.\n//! Format: \"ARMA_SPM_BIN_ABXYZ\".\n//! A is one of: I (for integral types) or F (for floating point types).\n//! B is one of: U (for unsigned types), S (for signed types), N (for not applicable) or C (for complex types).\n//! XYZ specifies the width of each element in terms of bytes, e.g. \"008\" indicates eight bytes.\ntemplate<typename eT>\ninline\nstd::string\ndiskio::gen_bin_header(const SpMat<eT>& x)\n  {\n  arma_type_check(( is_supported_elem_type<eT>::value == false ));\n\n  arma_ignore(x);\n\n  if(is_u8<eT>::value)\n    {\n    return std::string(\"ARMA_SPM_BIN_IU001\");\n    }\n  else\n  if(is_s8<eT>::value)\n    {\n    return std::string(\"ARMA_SPM_BIN_IS001\");\n    }\n  else\n  if(is_u16<eT>::value)\n    {\n    return std::string(\"ARMA_SPM_BIN_IU002\");\n    }\n  else\n  if(is_s16<eT>::value)\n    {\n    return std::string(\"ARMA_SPM_BIN_IS002\");\n    }\n  else\n  if(is_u32<eT>::value)\n    {\n    return std::string(\"ARMA_SPM_BIN_IU004\");\n    }\n  else\n  if(is_s32<eT>::value)\n    {\n    return std::string(\"ARMA_SPM_BIN_IS004\");\n    }\n#if defined(ARMA_USE_U64S64)\n  else\n  if(is_u64<eT>::value)\n    {\n    return std::string(\"ARMA_SPM_BIN_IU008\");\n    }\n  else\n  if(is_s64<eT>::value)\n    {\n    return std::string(\"ARMA_SPM_BIN_IS008\");\n    }\n#endif\n#if defined(ARMA_ALLOW_LONG)\n  else\n  if(is_ulng_t_32<eT>::value)\n    {\n    return std::string(\"ARMA_SPM_BIN_IU004\");\n    }\n  else\n  if(is_slng_t_32<eT>::value)\n    {\n    return std::string(\"ARMA_SPM_BIN_IS004\");\n    }\n  else\n  if(is_ulng_t_64<eT>::value)\n    {\n    return std::string(\"ARMA_SPM_BIN_IU008\");\n    }\n  else\n  if(is_slng_t_64<eT>::value)\n    {\n    return std::string(\"ARMA_SPM_BIN_IS008\");\n    }\n#endif\n  else\n  if(is_float<eT>::value)\n    {\n    return std::string(\"ARMA_SPM_BIN_FN004\");\n    }\n  else\n  if(is_double<eT>::value)\n    {\n    return std::string(\"ARMA_SPM_BIN_FN008\");\n    }\n  else\n  if(is_complex_float<eT>::value)\n    {\n    return std::string(\"ARMA_SPM_BIN_FC008\");\n    }\n  else\n  if(is_complex_double<eT>::value)\n    {\n    return std::string(\"ARMA_SPM_BIN_FC016\");\n    }\n  else\n    {\n    return std::string();\n    }\n\n  }\n\n\n//! Generate the first line of the header used for saving cubes in text format.\n//! Format: \"ARMA_CUB_TXT_ABXYZ\".\n//! A is one of: I (for integral types) or F (for floating point types).\n//! B is one of: U (for unsigned types), S (for signed types), N (for not applicable) or C (for complex types).\n//! XYZ specifies the width of each element in terms of bytes, e.g. \"008\" indicates eight bytes.\ntemplate<typename eT>\ninline\nstd::string\ndiskio::gen_txt_header(const Cube<eT>& x)\n  {\n  arma_type_check(( is_supported_elem_type<eT>::value == false ));\n  \n  arma_ignore(x);\n\n  if(is_u8<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_TXT_IU001\");\n    }\n  else\n  if(is_s8<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_TXT_IS001\");\n    }\n  else\n  if(is_u16<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_TXT_IU002\");\n    }\n  else\n  if(is_s16<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_TXT_IS002\");\n    }\n  else\n  if(is_u32<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_TXT_IU004\");\n    }\n  else\n  if(is_s32<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_TXT_IS004\");\n    }\n#if defined(ARMA_USE_U64S64)\n  else\n  if(is_u64<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_TXT_IU008\");\n    }\n  else\n  if(is_s64<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_TXT_IS008\");\n    }\n#endif\n#if defined(ARMA_ALLOW_LONG)\n  else\n  if(is_ulng_t_32<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_TXT_IU004\");\n    }\n  else\n  if(is_slng_t_32<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_TXT_IS004\");\n    }\n  else\n  if(is_ulng_t_64<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_TXT_IU008\");\n    }\n  else\n  if(is_slng_t_64<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_TXT_IS008\");\n    }\n#endif\n  else\n  if(is_float<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_TXT_FN004\");\n    }\n  else\n  if(is_double<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_TXT_FN008\");\n    }\n  else\n  if(is_complex_float<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_TXT_FC008\");\n    }\n  else\n  if(is_complex_double<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_TXT_FC016\");\n    }\n  else\n    {\n    return std::string();\n    }\n  \n  }\n\n\n\n//! Generate the first line of the header used for saving cubes in binary format.\n//! Format: \"ARMA_CUB_BIN_ABXYZ\".\n//! A is one of: I (for integral types) or F (for floating point types).\n//! B is one of: U (for unsigned types), S (for signed types), N (for not applicable) or C (for complex types).\n//! XYZ specifies the width of each element in terms of bytes, e.g. \"008\" indicates eight bytes.\ntemplate<typename eT>\ninline\nstd::string\ndiskio::gen_bin_header(const Cube<eT>& x)\n  {\n  arma_type_check(( is_supported_elem_type<eT>::value == false ));\n  \n  arma_ignore(x);\n  \n  if(is_u8<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_BIN_IU001\");\n    }\n  else\n  if(is_s8<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_BIN_IS001\");\n    }\n  else\n  if(is_u16<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_BIN_IU002\");\n    }\n  else\n  if(is_s16<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_BIN_IS002\");\n    }\n  else\n  if(is_u32<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_BIN_IU004\");\n    }\n  else\n  if(is_s32<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_BIN_IS004\");\n    }\n#if defined(ARMA_USE_U64S64)\n  else\n  if(is_u64<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_BIN_IU008\");\n    }\n  else\n  if(is_s64<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_BIN_IS008\");\n    }\n#endif\n#if defined(ARMA_ALLOW_LONG)\n  else\n  if(is_ulng_t_32<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_BIN_IU004\");\n    }\n  else\n  if(is_slng_t_32<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_BIN_IS004\");\n    }\n  else\n  if(is_ulng_t_64<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_BIN_IU008\");\n    }\n  else\n  if(is_slng_t_64<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_BIN_IS008\");\n    }\n#endif\n  else\n  if(is_float<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_BIN_FN004\");\n    }\n  else\n  if(is_double<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_BIN_FN008\");\n    }\n  else\n  if(is_complex_float<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_BIN_FC008\");\n    }\n  else\n  if(is_complex_double<eT>::value)\n    {\n    return std::string(\"ARMA_CUB_BIN_FC016\");\n    }\n  else\n    {\n    return std::string();\n    }\n  \n  }\n\n\n\ninline\nfile_type\ndiskio::guess_file_type(std::istream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  f.clear();\n  const std::fstream::pos_type pos1 = f.tellg();\n  \n  f.clear();\n  f.seekg(0, ios::end);\n  \n  f.clear();\n  const std::fstream::pos_type pos2 = f.tellg();\n  \n  const uword N = ( (pos1 >= 0) && (pos2 >= 0) ) ? uword(pos2 - pos1) : 0;\n  \n  f.clear();\n  f.seekg(pos1);\n  \n  podarray<unsigned char> data(N);\n  \n  unsigned char* ptr = data.memptr();\n  \n  f.clear();\n  f.read( reinterpret_cast<char*>(ptr), std::streamsize(N) );\n  \n  const bool load_okay = f.good();\n  \n  f.clear();\n  f.seekg(pos1);\n  \n  bool has_binary  = false;\n  bool has_comma   = false;\n  bool has_bracket = false;\n  \n  if(load_okay == true)\n    {\n    uword i = 0;\n    uword j = (N >= 2) ? 1 : 0;\n    \n    for(; j<N; i+=2, j+=2)\n      {\n      const unsigned char val_i = ptr[i];\n      const unsigned char val_j = ptr[j];\n      \n      // the range checking can be made more elaborate\n      if( ((val_i <= 8) || (val_i >= 123)) || ((val_j <= 8) || (val_j >= 123)) )\n        {\n        has_binary = true;\n        break;\n        }\n      \n      if( (val_i == ',') || (val_j == ',') )\n        {\n        has_comma = true;\n        }\n      \n      if( (val_i == '(') || (val_j == '(') || (val_i == ')') || (val_j == ')') )\n        {\n        has_bracket = true;\n        }\n      }\n    }\n  else\n    {\n    return file_type_unknown;\n    }\n  \n  if(has_binary)\n    {\n    return raw_binary;\n    }\n  \n  if(has_comma && (has_bracket == false))\n    {\n    return csv_ascii;\n    }\n  \n  return raw_ascii;\n  }\n\n\n\ninline\nchar\ndiskio::conv_to_hex_char(const u8 x)\n  {\n  char out;\n\n  switch(x)\n    {\n    case  0: out = '0'; break;\n    case  1: out = '1'; break;\n    case  2: out = '2'; break;\n    case  3: out = '3'; break;\n    case  4: out = '4'; break;\n    case  5: out = '5'; break;\n    case  6: out = '6'; break;\n    case  7: out = '7'; break;\n    case  8: out = '8'; break;\n    case  9: out = '9'; break;\n    case 10: out = 'a'; break;\n    case 11: out = 'b'; break;\n    case 12: out = 'c'; break;\n    case 13: out = 'd'; break;\n    case 14: out = 'e'; break;\n    case 15: out = 'f'; break;\n    default: out = '-'; break;\n    }\n\n  return out;  \n  }\n\n\n\ninline\nvoid\ndiskio::conv_to_hex(char* out, const u8 x)\n  {\n  const u8 a = x / 16;\n  const u8 b = x - 16*a;\n\n  out[0] = conv_to_hex_char(a);\n  out[1] = conv_to_hex_char(b);\n  }\n\n\n\n//! Append a quasi-random string to the given filename.\n//! The rand() function is deliberately not used,\n//! as rand() has an internal state that changes\n//! from call to call. Such states should not be\n//! modified in scientific applications, where the\n//! results should be reproducable and not affected \n//! by saving data.\ninline\nstd::string\ndiskio::gen_tmp_name(const std::string& x)\n  {\n  const std::string* ptr_x     = &x;\n  const u8*          ptr_ptr_x = reinterpret_cast<const u8*>(&ptr_x);\n  \n  const char* extra      = \".tmp_\";\n  const uword extra_size = 5;\n  \n  const uword tmp_size   = 2*sizeof(u8*) + 2*2;\n        char  tmp[tmp_size];\n  \n  uword char_count = 0;\n  \n  for(uword i=0; i<sizeof(u8*); ++i)\n    {\n    conv_to_hex(&tmp[char_count], ptr_ptr_x[i]);\n    char_count += 2;\n    }\n  \n  const uword x_size = static_cast<uword>(x.size());\n  u8 sum = 0;\n  \n  for(uword i=0; i<x_size; ++i)\n    {\n    sum = (sum + u8(x[i])) & 0xff;\n    }\n  \n  conv_to_hex(&tmp[char_count], sum);\n  char_count += 2;\n  \n  conv_to_hex(&tmp[char_count], u8(x_size));\n  \n  \n  std::string out;\n  out.resize(x_size + extra_size + tmp_size);\n  \n  \n  for(uword i=0; i<x_size; ++i)\n    {\n    out[i] = x[i];\n    }\n  \n  for(uword i=0; i<extra_size; ++i)\n    {\n    out[x_size + i] = extra[i];\n    }\n  \n  for(uword i=0; i<tmp_size; ++i)\n    {\n    out[x_size + extra_size + i] = tmp[i];\n    }\n  \n  return out;\n  }\n\n\n\n//! Safely rename a file.\n//! Before renaming, test if we can write to the final file.\n//! This should prevent:\n//! (i)  overwriting files that are write protected,\n//! (ii) overwriting directories.\ninline\nbool\ndiskio::safe_rename(const std::string& old_name, const std::string& new_name)\n  {\n  std::fstream f(new_name.c_str(), std::fstream::out | std::fstream::app);\n  f.put(' ');\n  \n  bool save_okay = f.good();\n  f.close();\n  \n  if(save_okay == true)\n    {\n    std::remove(new_name.c_str());\n    \n    const int mv_result = std::rename(old_name.c_str(), new_name.c_str());\n    \n    save_okay = (mv_result == 0);\n    }\n  \n  return save_okay;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\ndiskio::convert_naninf(eT& val, const std::string& token)\n  {\n  // see if the token represents a NaN or Inf\n  \n  if( (token.length() == 3) || (token.length() == 4) )\n    {\n    const bool neg = (token[0] == '-');\n    const bool pos = (token[0] == '+');\n    \n    const size_t offset = ( (neg || pos) && (token.length() == 4) ) ? 1 : 0;\n    \n    const std::string token2 = token.substr(offset, 3);\n    \n    if( (token2 == \"inf\") || (token2 == \"Inf\") || (token2 == \"INF\") )\n      {\n      val = neg ? cond_rel< is_signed<eT>::value >::make_neg(Datum<eT>::inf) : Datum<eT>::inf;\n      \n      return true;\n      }\n    else\n    if( (token2 == \"nan\") || (token2 == \"Nan\") || (token2 == \"NaN\") || (token2 == \"NAN\") )\n      {\n      val = Datum<eT>::nan;\n      \n      return true;\n      }\n    }\n    \n  return false;\n  }\n\n\n\ntemplate<typename T>\ninline\nbool\ndiskio::convert_naninf(std::complex<T>& val, const std::string& token)\n  {\n  if( token.length() >= 5 )\n    {\n    std::stringstream ss( token.substr(1, token.length()-2) );  // strip '(' at the start and ')' at the end\n    \n    std::string token_real;\n    std::string token_imag;\n    \n    std::getline(ss, token_real, ',');\n    std::getline(ss, token_imag);\n    \n    std::stringstream ss_real(token_real);\n    std::stringstream ss_imag(token_imag);\n    \n    T val_real = T(0);\n    T val_imag = T(0);\n    \n    ss_real >> val_real;\n    ss_imag >> val_imag;\n    \n    bool success_real = true;\n    bool success_imag = true;\n    \n    if(ss_real.fail() == true)\n      {\n      success_real = diskio::convert_naninf( val_real, token_real );\n      }\n    \n    if(ss_imag.fail() == true)\n      {\n      success_imag = diskio::convert_naninf( val_imag, token_imag );\n      }\n    \n    val = std::complex<T>(val_real, val_imag);\n    \n    return (success_real && success_imag);\n    }\n  \n  return false;\n  }\n\n\n\n//! Save a matrix as raw text (no header, human readable).\n//! Matrices can be loaded in Matlab and Octave, as long as they don't have complex elements.\ntemplate<typename eT>\ninline\nbool\ndiskio::save_raw_ascii(const Mat<eT>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n  \n  const std::string tmp_name = diskio::gen_tmp_name(final_name);\n  \n  std::fstream f(tmp_name.c_str(), std::fstream::out);\n  \n  bool save_okay = f.is_open();\n  \n  if(save_okay == true)\n    {\n    save_okay = diskio::save_raw_ascii(x, f);\n    \n    f.flush();\n    f.close();\n    \n    if(save_okay == true)\n      {\n      save_okay = diskio::safe_rename(tmp_name, final_name);\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\n//! Save a matrix as raw text (no header, human readable).\n//! Matrices can be loaded in Matlab and Octave, as long as they don't have complex elements.\ntemplate<typename eT>\ninline\nbool\ndiskio::save_raw_ascii(const Mat<eT>& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  uword cell_width;\n  \n  // TODO: need sane values for complex numbers\n  \n  if( (is_float<eT>::value) || (is_double<eT>::value) )\n    {\n    f.setf(ios::scientific);\n    f.precision(12);\n    cell_width = 20;\n    }\n  \n  for(uword row=0; row < x.n_rows; ++row)\n    {\n    for(uword col=0; col < x.n_cols; ++col)\n      {\n      f.put(' ');\n      \n      if( (is_float<eT>::value) || (is_double<eT>::value) )\n        {\n        f.width(cell_width);\n        }\n      \n      arma_ostream::print_elem(f, x.at(row,col), false);\n      }\n      \n    f.put('\\n');\n    }\n  \n  return f.good();\n  }\n\n\n\n//! Save a matrix as raw binary (no header)\ntemplate<typename eT>\ninline\nbool\ndiskio::save_raw_binary(const Mat<eT>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n  \n  const std::string tmp_name = diskio::gen_tmp_name(final_name);\n  \n  std::ofstream f(tmp_name.c_str(), std::fstream::binary);\n  \n  bool save_okay = f.is_open();\n  \n  if(save_okay == true)\n    {\n    save_okay = diskio::save_raw_binary(x, f);\n    \n    f.flush();\n    f.close();\n    \n    if(save_okay == true)\n      {\n      save_okay = diskio::safe_rename(tmp_name, final_name);\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\ndiskio::save_raw_binary(const Mat<eT>& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  f.write( reinterpret_cast<const char*>(x.mem), std::streamsize(x.n_elem*sizeof(eT)) );\n  \n  return f.good();\n  }\n\n\n\n//! Save a matrix in text format (human readable),\n//! with a header that indicates the matrix type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::save_arma_ascii(const Mat<eT>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n  \n  const std::string tmp_name = diskio::gen_tmp_name(final_name);\n  \n  std::ofstream f(tmp_name.c_str());\n  \n  bool save_okay = f.is_open();\n\n  if(save_okay == true)  \n    {\n    save_okay = diskio::save_arma_ascii(x, f);\n    \n    f.flush();\n    f.close();\n    \n    if(save_okay == true)\n      {\n      save_okay = diskio::safe_rename(tmp_name, final_name);\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\n//! Save a matrix in text format (human readable),\n//! with a header that indicates the matrix type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::save_arma_ascii(const Mat<eT>& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  const ios::fmtflags orig_flags = f.flags();\n  \n  f << diskio::gen_txt_header(x) << '\\n';\n  f << x.n_rows << ' ' << x.n_cols << '\\n';\n  \n  uword cell_width;\n  \n  // TODO: need sane values for complex numbers\n  \n  if( (is_float<eT>::value) || (is_double<eT>::value) )\n    {\n    f.setf(ios::scientific);\n    f.precision(12);\n    cell_width = 20;\n    }\n    \n  for(uword row=0; row < x.n_rows; ++row)\n    {\n    for(uword col=0; col < x.n_cols; ++col)\n      {\n      f.put(' ');\n      \n      if( (is_float<eT>::value) || (is_double<eT>::value) )        \n        {\n        f.width(cell_width);\n        }\n      \n      arma_ostream::print_elem(f, x.at(row,col), false);\n      }\n    \n    f.put('\\n');\n    }\n  \n  const bool save_okay = f.good();\n  \n  f.flags(orig_flags);\n  \n  return save_okay;\n  }\n\n\n\n//! Save a matrix in CSV text format (human readable)\ntemplate<typename eT>\ninline\nbool\ndiskio::save_csv_ascii(const Mat<eT>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n  \n  const std::string tmp_name = diskio::gen_tmp_name(final_name);\n  \n  std::ofstream f(tmp_name.c_str());\n  \n  bool save_okay = f.is_open();\n  \n  if(save_okay == true)  \n    {\n    save_okay = diskio::save_csv_ascii(x, f);\n    \n    f.flush();\n    f.close();\n    \n    if(save_okay == true)\n      {\n      save_okay = diskio::safe_rename(tmp_name, final_name);\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\n//! Save a matrix in CSV text format (human readable)\ntemplate<typename eT>\ninline\nbool\ndiskio::save_csv_ascii(const Mat<eT>& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  const ios::fmtflags orig_flags = f.flags();\n  \n  // TODO: need sane values for complex numbers\n  \n  if( (is_float<eT>::value) || (is_double<eT>::value) )\n    {\n    f.setf(ios::scientific);\n    f.precision(12);\n    }\n  \n  uword x_n_rows = x.n_rows;\n  uword x_n_cols = x.n_cols;\n  \n  for(uword row=0; row < x_n_rows; ++row)\n    {\n    for(uword col=0; col < x_n_cols; ++col)\n      {\n      arma_ostream::print_elem(f, x.at(row,col), false);\n      \n      if( col < (x_n_cols-1) )\n        {\n        f.put(',');\n        }\n      }\n    \n    f.put('\\n');\n    }\n  \n  const bool save_okay = f.good();\n  \n  f.flags(orig_flags);\n  \n  return save_okay;\n  }\n\n\n\n//! Save a matrix in binary format,\n//! with a header that stores the matrix type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::save_arma_binary(const Mat<eT>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n  \n  const std::string tmp_name = diskio::gen_tmp_name(final_name);\n  \n  std::ofstream f(tmp_name.c_str(), std::fstream::binary);\n  \n  bool save_okay = f.is_open();\n  \n  if(save_okay == true)\n    {\n    save_okay = diskio::save_arma_binary(x, f);\n    \n    f.flush();\n    f.close();\n    \n    if(save_okay == true)\n      {\n      save_okay = diskio::safe_rename(tmp_name, final_name);\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\n//! Save a matrix in binary format,\n//! with a header that stores the matrix type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::save_arma_binary(const Mat<eT>& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n\n  f << diskio::gen_bin_header(x) << '\\n';\n  f << x.n_rows << ' ' << x.n_cols << '\\n';\n  \n  f.write( reinterpret_cast<const char*>(x.mem), std::streamsize(x.n_elem*sizeof(eT)) );\n  \n  return f.good();\n  }\n\n\n\n//! Save a matrix as a PGM greyscale image\ntemplate<typename eT>\ninline\nbool\ndiskio::save_pgm_binary(const Mat<eT>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n  \n  const std::string tmp_name = diskio::gen_tmp_name(final_name);\n  \n  std::fstream f(tmp_name.c_str(), std::fstream::out | std::fstream::binary);\n  \n  bool save_okay = f.is_open();\n  \n  if(save_okay == true)\n    {\n    save_okay = diskio::save_pgm_binary(x, f);\n    \n    f.flush();\n    f.close();\n    \n    if(save_okay == true)\n      {\n      save_okay = diskio::safe_rename(tmp_name, final_name);\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\n//\n// TODO:\n// add functionality to save the image in a normalised format,\n// i.e. scaled so that every value falls in the [0,255] range.\n\n//! Save a matrix as a PGM greyscale image\ntemplate<typename eT>\ninline\nbool\ndiskio::save_pgm_binary(const Mat<eT>& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  f << \"P5\" << '\\n';\n  f << x.n_cols << ' ' << x.n_rows << '\\n';\n  f << 255 << '\\n';\n  \n  const uword n_elem = x.n_rows * x.n_cols;\n  podarray<u8> tmp(n_elem);\n  \n  uword i = 0;\n  \n  for(uword row=0; row < x.n_rows; ++row)\n    {\n    for(uword col=0; col < x.n_cols; ++col)\n      {\n      tmp[i] = u8( x.at(row,col) );  // TODO: add round() ?\n      ++i;\n      }\n    }\n  \n  f.write(reinterpret_cast<const char*>(tmp.mem), std::streamsize(n_elem) );\n  \n  return f.good();\n  }\n\n\n\n//! Save a matrix as a PGM greyscale image\ntemplate<typename T>\ninline\nbool\ndiskio::save_pgm_binary(const Mat< std::complex<T> >& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uchar_mat tmp = conv_to<uchar_mat>::from(x);\n  \n  return diskio::save_pgm_binary(tmp, final_name);\n  }\n\n\n\n//! Save a matrix as a PGM greyscale image\ntemplate<typename T>\ninline\nbool\ndiskio::save_pgm_binary(const Mat< std::complex<T> >& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uchar_mat tmp = conv_to<uchar_mat>::from(x);\n  \n  return diskio::save_pgm_binary(tmp, f);\n  }\n\n\n\n//! Save a matrix as part of a HDF5 file\ntemplate<typename eT>\ninline \nbool \ndiskio::save_hdf5_binary(const Mat<eT>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_HDF5)\n    {\n    #if !defined(ARMA_PRINT_HDF5_ERRORS)\n      {\n      // Disable annoying HDF5 error messages.\n      arma_H5Eset_auto(H5E_DEFAULT, NULL, NULL);\n      }\n    #endif\n    \n    bool save_okay = false;\n    \n    const std::string tmp_name = diskio::gen_tmp_name(final_name);\n    \n    // Set up the file according to HDF5's preferences  \n    hid_t file = arma_H5Fcreate(tmp_name.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);\n    \n    // We need to create a dataset, datatype, and dataspace\n    hsize_t dims[2];\n    dims[1] = x.n_rows;\n    dims[0] = x.n_cols;\n    \n    hid_t dataspace = arma_H5Screate_simple(2, dims, NULL);   // treat the matrix as a 2d array dataspace\n    hid_t datatype  = hdf5_misc::get_hdf5_type<eT>();\n    \n    // If this returned something invalid, well, it's time to crash.\n    arma_check(datatype == -1, \"Mat::save(): unknown datatype for HDF5\");\n    \n    // MATLAB forces the users to specify a name at save time for HDF5; Octave\n    // will use the default of 'dataset' unless otherwise specified, so we will\n    // use that.\n    hid_t dataset = arma_H5Dcreate(file, \"dataset\", datatype, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);\n    \n    // H5Dwrite does not make a distinction between row-major and column-major;\n    // it just writes the memory.  MATLAB and Octave store HDF5 matrices as\n    // column-major, though, so we can save ours like that too and not need to\n    // transpose.\n    herr_t status = arma_H5Dwrite(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, x.mem);\n    save_okay = (status >= 0);\n    \n    arma_H5Dclose(dataset);\n    arma_H5Tclose(datatype);\n    arma_H5Sclose(dataspace);\n    arma_H5Fclose(file);\n    \n    if(save_okay == true) { save_okay = diskio::safe_rename(tmp_name, final_name); }\n    \n    return save_okay;\n    }\n  #else\n    {\n    arma_ignore(x);\n    arma_ignore(final_name);\n    \n    arma_stop(\"Mat::save(): use of HDF5 needs to be enabled\");\n    \n    return false;\n    }\n  #endif\n  }\n\n\n\n//! Load a matrix as raw text (no header, human readable).\n//! Can read matrices saved as text in Matlab and Octave.\n//! NOTE: this is much slower than reading a file with a header.\ntemplate<typename eT>\ninline\nbool\ndiskio::load_raw_ascii(Mat<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n\n  std::fstream f;\n  f.open(name.c_str(), std::fstream::in);\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_raw_ascii(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n\n\n\n//! Load a matrix as raw text (no header, human readable).\n//! Can read matrices saved as text in Matlab and Octave.\n//! NOTE: this is much slower than reading a file with a header.\ntemplate<typename eT>\ninline\nbool\ndiskio::load_raw_ascii(Mat<eT>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  bool load_okay = f.good();\n  \n  f.clear();\n  const std::fstream::pos_type pos1 = f.tellg();\n  \n  //\n  // work out the size\n  \n  uword f_n_rows = 0;\n  uword f_n_cols = 0;\n  \n  bool f_n_cols_found = false;\n  \n  std::string line_string;\n  std::string token;\n  \n  std::stringstream line_stream;\n  \n  while( (f.good() == true) && (load_okay == true) )\n    {\n    std::getline(f, line_string);\n    \n    if(line_string.size() == 0)\n      {\n      break;\n      }\n    \n    line_stream.clear();\n    line_stream.str(line_string);\n    \n    uword line_n_cols = 0;\n    \n    while (line_stream >> token)\n      {\n      ++line_n_cols;\n      }\n    \n    if(f_n_cols_found == false)\n      {\n      f_n_cols = line_n_cols;\n      f_n_cols_found = true;\n      }\n    else\n      {\n      if(line_n_cols != f_n_cols)\n        {\n        err_msg = \"inconsistent number of columns in \";\n        load_okay = false;\n        }\n      }\n    \n    ++f_n_rows;\n    }\n    \n  if(load_okay == true)\n    {\n    f.clear();\n    f.seekg(pos1);\n    \n    x.set_size(f_n_rows, f_n_cols);\n    \n    std::stringstream ss;\n    \n    for(uword row=0; (row < x.n_rows) && (load_okay == true); ++row)\n      {\n      for(uword col=0; (col < x.n_cols) && (load_okay == true); ++col)\n        {\n        f >> token;\n        \n        if( (is_signed<eT>::value == false) && (token.length() > 0) && (token[0] == '-') )\n          {\n          x.at(row,col) = eT(0);\n          }\n        else\n          {\n          ss.clear();\n          ss.str(token);\n          \n          eT val = eT(0);\n          ss >> val;\n          \n          if(ss.fail() == false)\n            {\n            x.at(row,col) = val;\n            }\n          else\n            {\n            const bool success = diskio::convert_naninf( x.at(row,col), token );\n            \n            if(success == false)\n              {\n              load_okay = false;\n              err_msg = \"couldn't interpret data in \";\n              }\n            }\n          }\n        }\n      }\n    }\n  \n  \n  // an empty file indicates an empty matrix\n  if( (f_n_cols_found == false) && (load_okay == true) )\n    {\n    x.reset();\n    }\n  \n  \n  return load_okay;\n  }\n\n\n\n//! Load a matrix in binary format (no header);\n//! the matrix is assumed to have one column\ntemplate<typename eT>\ninline\nbool\ndiskio::load_raw_binary(Mat<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::ifstream f;\n  f.open(name.c_str(), std::fstream::binary);\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_raw_binary(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\ndiskio::load_raw_binary(Mat<eT>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(err_msg);\n  \n  f.clear();\n  const std::streampos pos1 = f.tellg();\n  \n  f.clear();\n  f.seekg(0, ios::end);\n\n  f.clear();\n  const std::streampos pos2 = f.tellg();\n  \n  const uword N = ( (pos1 >= 0) && (pos2 >= 0) ) ? uword(pos2 - pos1) : 0;\n  \n  f.clear();\n  //f.seekg(0, ios::beg);\n  f.seekg(pos1);\n  \n  x.set_size(N / sizeof(eT), 1);\n  \n  f.clear();\n  f.read( reinterpret_cast<char *>(x.memptr()), std::streamsize(N) );\n  \n  return f.good();\n  }\n\n\n\n//! Load a matrix in text format (human readable),\n//! with a header that indicates the matrix type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::load_arma_ascii(Mat<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::ifstream f(name.c_str());\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_arma_ascii(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n\n\n\n//! Load a matrix in text format (human readable),\n//! with a header that indicates the matrix type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::load_arma_ascii(Mat<eT>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::streampos pos = f.tellg();\n    \n  bool load_okay = true;\n  \n  std::string f_header;\n  uword f_n_rows;\n  uword f_n_cols;\n  \n  f >> f_header;\n  f >> f_n_rows;\n  f >> f_n_cols;\n  \n  if(f_header == diskio::gen_txt_header(x))\n    {\n    x.zeros(f_n_rows, f_n_cols);\n    \n    std::string       token;\n    std::stringstream ss;\n    \n    for(uword row=0; row < x.n_rows; ++row)\n      {\n      for(uword col=0; col < x.n_cols; ++col)\n        {\n        f >> token;\n        \n        ss.clear();\n        ss.str(token);\n        \n        eT val = eT(0);\n        ss >> val;\n        \n        if(ss.fail() == false)\n          {\n          x.at(row,col) = val;\n          }\n        else\n          {\n          diskio::convert_naninf( x.at(row,col), token );\n          }\n        }\n      }\n    \n    load_okay = f.good();\n    }\n  else\n    {\n    load_okay = false;\n    err_msg = \"incorrect header in \";\n    }\n  \n  \n  // allow automatic conversion of u32/s32 matrices into u64/s64 matrices\n  \n  if(load_okay == false)\n    {\n    if( (sizeof(eT) == 8) && is_same_type<uword,eT>::yes )\n      {\n      Mat<u32>    tmp;\n      std::string junk;\n      \n      f.clear();\n      f.seekg(pos);\n      \n      load_okay = diskio::load_arma_ascii(tmp, f, junk);\n      \n      if(load_okay)  { x = conv_to< Mat<eT> >::from(tmp); }\n      }\n    else\n    if( (sizeof(eT) == 8) && is_same_type<sword,eT>::yes )\n      {\n      Mat<s32>    tmp;\n      std::string junk;\n      \n      f.clear();\n      f.seekg(pos);\n      \n      load_okay = diskio::load_arma_ascii(tmp, f, junk);\n      \n      if(load_okay)  { x = conv_to< Mat<eT> >::from(tmp); }\n      }\n    }\n  \n  return load_okay;\n  }\n\n\n\n//! Load a matrix in CSV text format (human readable)\ntemplate<typename eT>\ninline\nbool\ndiskio::load_csv_ascii(Mat<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::fstream f;\n  f.open(name.c_str(), std::fstream::in);\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_csv_ascii(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n\n\n\n//! Load a matrix in CSV text format (human readable)\ntemplate<typename eT>\ninline\nbool\ndiskio::load_csv_ascii(Mat<eT>& x, std::istream& f, std::string&)\n  {\n  arma_extra_debug_sigprint();\n  \n  bool load_okay = f.good();\n  \n  f.clear();\n  const std::fstream::pos_type pos1 = f.tellg();\n  \n  //\n  // work out the size\n  \n  uword f_n_rows = 0;\n  uword f_n_cols = 0;\n  \n  std::string line_string;\n  std::string token;\n  \n  std::stringstream line_stream;\n  \n  while( (f.good() == true) && (load_okay == true) )\n    {\n    std::getline(f, line_string);\n    \n    if(line_string.size() == 0)\n      {\n      break;\n      }\n    \n    line_stream.clear();\n    line_stream.str(line_string);\n    \n    uword line_n_cols = 0;\n    \n    while(line_stream.good() == true)\n      {\n      std::getline(line_stream, token, ',');\n      ++line_n_cols;\n      }\n    \n    if(f_n_cols < line_n_cols)\n      {\n      f_n_cols = line_n_cols;\n      }\n    \n    ++f_n_rows;\n    }\n  \n  f.clear();\n  f.seekg(pos1);\n  \n  x.zeros(f_n_rows, f_n_cols);\n  \n  uword row = 0;\n  \n  std::stringstream ss;\n  \n  while(f.good() == true)\n    {\n    std::getline(f, line_string);\n    \n    if(line_string.size() == 0)\n      {\n      break;\n      }\n    \n    line_stream.clear();\n    line_stream.str(line_string);\n    \n    uword col = 0;\n    \n    while(line_stream.good() == true)\n      {\n      std::getline(line_stream, token, ',');\n      \n      if( (is_signed<eT>::value == false) && (token.length() > 0) && (token[0] == '-') )\n        {\n        x.at(row,col) = eT(0);\n        }\n      else\n        {\n        ss.clear();\n        ss.str(token);\n        \n        eT val = eT(0);\n        ss >> val;\n        \n        if(ss.fail() == false)\n          {\n          x.at(row,col) = val;\n          }\n        else\n          {\n          diskio::convert_naninf( x.at(row,col), token );\n          }\n        }\n      \n      ++col;\n      }\n    \n    ++row;\n    }\n  \n  return load_okay;\n  }\n\n\n\n//! Load a matrix in binary format,\n//! with a header that indicates the matrix type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::load_arma_binary(Mat<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::ifstream f;\n  f.open(name.c_str(), std::fstream::binary);\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_arma_binary(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\ndiskio::load_arma_binary(Mat<eT>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::streampos pos = f.tellg();\n    \n  bool load_okay = true;\n  \n  std::string f_header;\n  uword f_n_rows;\n  uword f_n_cols;\n  \n  f >> f_header;\n  f >> f_n_rows;\n  f >> f_n_cols;\n  \n  if(f_header == diskio::gen_bin_header(x))\n    {\n    //f.seekg(1, ios::cur);  // NOTE: this may not be portable, as on a Windows machine a newline could be two characters\n    f.get();\n    \n    x.set_size(f_n_rows,f_n_cols);\n    f.read( reinterpret_cast<char *>(x.memptr()), std::streamsize(x.n_elem*sizeof(eT)) );\n    \n    load_okay = f.good();\n    }\n  else\n    {\n    load_okay = false;\n    err_msg = \"incorrect header in \";\n    }\n  \n  \n  // allow automatic conversion of u32/s32 matrices into u64/s64 matrices\n  \n  if(load_okay == false)\n    {\n    if( (sizeof(eT) == 8) && is_same_type<uword,eT>::yes )\n      {\n      Mat<u32>    tmp;\n      std::string junk;\n      \n      f.clear();\n      f.seekg(pos);\n      \n      load_okay = diskio::load_arma_binary(tmp, f, junk);\n      \n      if(load_okay)  { x = conv_to< Mat<eT> >::from(tmp); }\n      }\n    else\n    if( (sizeof(eT) == 8) && is_same_type<sword,eT>::yes )\n      {\n      Mat<s32>    tmp;\n      std::string junk;\n      \n      f.clear();\n      f.seekg(pos);\n      \n      load_okay = diskio::load_arma_binary(tmp, f, junk);\n      \n      if(load_okay)  { x = conv_to< Mat<eT> >::from(tmp); }\n      }\n    }\n  \n  return load_okay;\n  }\n\n\n\ninline\nvoid\ndiskio::pnm_skip_comments(std::istream& f)\n  {\n  while( isspace(f.peek()) )\n    {\n    while( isspace(f.peek()) )\n      {\n      f.get();\n      }\n  \n    if(f.peek() == '#')\n      {\n      while( (f.peek() != '\\r') && (f.peek()!='\\n') )\n        {\n        f.get();\n        }\n      }\n    }\n  }\n\n\n\n//! Load a PGM greyscale image as a matrix\ntemplate<typename eT>\ninline\nbool\ndiskio::load_pgm_binary(Mat<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::fstream f;\n  f.open(name.c_str(), std::fstream::in | std::fstream::binary);\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_pgm_binary(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n\n\n\n//! Load a PGM greyscale image as a matrix\ntemplate<typename eT>\ninline\nbool\ndiskio::load_pgm_binary(Mat<eT>& x, std::istream& f, std::string& err_msg)\n  {\n  bool load_okay = true;\n  \n  std::string f_header;\n  f >> f_header;\n  \n  if(f_header == \"P5\")\n    {\n    uword f_n_rows = 0;\n    uword f_n_cols = 0;\n    int f_maxval = 0;\n  \n    diskio::pnm_skip_comments(f);\n  \n    f >> f_n_cols;\n    diskio::pnm_skip_comments(f);\n  \n    f >> f_n_rows;\n    diskio::pnm_skip_comments(f);\n  \n    f >> f_maxval;\n    f.get();\n    \n    if( (f_maxval > 0) || (f_maxval <= 65535) )\n      {\n      x.set_size(f_n_rows,f_n_cols);\n      \n      if(f_maxval <= 255)\n        {\n        const uword n_elem = f_n_cols*f_n_rows;\n        podarray<u8> tmp(n_elem);\n        \n        f.read( reinterpret_cast<char*>(tmp.memptr()), std::streamsize(n_elem) );\n        \n        uword i = 0;\n        \n        //cout << \"f_n_cols = \" << f_n_cols << endl;\n        //cout << \"f_n_rows = \" << f_n_rows << endl;\n        \n        \n        for(uword row=0; row < f_n_rows; ++row)\n          {\n          for(uword col=0; col < f_n_cols; ++col)\n            {\n            x.at(row,col) = eT(tmp[i]);\n            ++i;\n            }\n          }\n          \n        }\n      else\n        {\n        const uword n_elem = f_n_cols*f_n_rows;\n        podarray<u16> tmp(n_elem);\n        \n        f.read( reinterpret_cast<char *>(tmp.memptr()), std::streamsize(n_elem*2) );\n        \n        uword i = 0;\n        \n        for(uword row=0; row < f_n_rows; ++row)\n          {\n          for(uword col=0; col < f_n_cols; ++col)\n            {\n            x.at(row,col) = eT(tmp[i]);\n            ++i;\n            }\n          }\n        \n        }\n      \n      }\n    else\n      {\n      load_okay = false;\n      err_msg = \"currently no code available to handle loading \";\n      }\n    \n    if(f.good() == false)\n      {\n      load_okay = false;\n      }\n    }\n  else\n    {\n    load_okay = false;\n    err_msg = \"unsupported header in \";\n    }\n  \n  return load_okay;\n  }\n\n\n\n//! Load a PGM greyscale image as a matrix\ntemplate<typename T>\ninline\nbool\ndiskio::load_pgm_binary(Mat< std::complex<T> >& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  uchar_mat tmp;\n  const bool load_okay = diskio::load_pgm_binary(tmp, name, err_msg);\n  \n  x = conv_to< Mat< std::complex<T> > >::from(tmp);\n  \n  return load_okay;\n  }\n\n\n\n//! Load a PGM greyscale image as a matrix\ntemplate<typename T>\ninline\nbool\ndiskio::load_pgm_binary(Mat< std::complex<T> >& x, std::istream& is, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  uchar_mat tmp;\n  const bool load_okay = diskio::load_pgm_binary(tmp, is, err_msg);\n  \n  x = conv_to< Mat< std::complex<T> > >::from(tmp);\n  \n  return load_okay;\n  }\n\n\n\n//! Load a HDF5 file as a matrix\ntemplate<typename eT>\ninline\nbool\ndiskio::load_hdf5_binary(Mat<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_HDF5)\n    {\n\n    // These may be necessary to store the error handler (if we need to).\n    herr_t (*old_func)(hid_t, void*);\n    void *old_client_data;\n\n    #if !defined(ARMA_PRINT_HDF5_ERRORS)\n      {\n      // Save old error handler.\n      arma_H5Eget_auto(H5E_DEFAULT, &old_func, &old_client_data);\n\n      // Disable annoying HDF5 error messages.\n      arma_H5Eset_auto(H5E_DEFAULT, NULL, NULL);\n      }\n    #endif\n\n    bool load_okay = false;\n    \n    hid_t fid = arma_H5Fopen(name.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);\n    \n    if(fid >= 0)\n      {\n      // MATLAB HDF5 dataset names are user-specified;\n      // Octave tends to store the datasets in a group, with the actual dataset being referred to as \"value\".\n      // So we will search for \"dataset\" and \"value\", and if those are not found we will take the first dataset we do find.\n      std::vector<std::string> searchNames;\n      searchNames.push_back(\"dataset\");\n      searchNames.push_back(\"value\");\n      \n      hid_t dataset = hdf5_misc::search_hdf5_file(searchNames, fid, 2, false);\n\n      if(dataset >= 0)\n        {\n        hid_t filespace = arma_H5Dget_space(dataset);\n        \n        // This must be <= 2 due to our search rules.\n        const int ndims = arma_H5Sget_simple_extent_ndims(filespace);\n        \n        hsize_t dims[2];\n        const herr_t query_status = arma_H5Sget_simple_extent_dims(filespace, dims, NULL);\n        \n        // arma_check(query_status < 0, \"Mat::load(): cannot get size of HDF5 dataset\");\n        if(query_status < 0)\n          {\n          err_msg = \"cannot get size of HDF5 dataset in \";\n          \n          arma_H5Sclose(filespace);\n          arma_H5Dclose(dataset);\n          arma_H5Fclose(fid);\n    \n          #if !defined(ARMA_PRINT_HDF5_ERRORS)\n            {\n            // Restore HDF5 error handler.\n            arma_H5Eset_auto(H5E_DEFAULT, old_func, old_client_data);\n            }\n          #endif\n          \n          return false;\n          }\n        \n        if(ndims == 1) { dims[1] = 1; }  // Vector case; fake second dimension (one column).\n        \n        x.set_size(dims[1], dims[0]);\n        \n        // Now we have to see what type is stored to figure out how to load it.\n        hid_t datatype = arma_H5Dget_type(dataset);\n        hid_t mat_type = hdf5_misc::get_hdf5_type<eT>();\n        \n        // If these are the same type, it is simple.\n        if(arma_H5Tequal(datatype, mat_type) > 0)\n          {\n          // Load directly; H5S_ALL used so that we load the entire dataset.\n          hid_t read_status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(x.memptr()));\n          \n          if(read_status >= 0) { load_okay = true; }\n          }\n        else\n          {\n          // Load into another array and convert its type accordingly.\n          hid_t read_status = hdf5_misc::load_and_convert_hdf5(x.memptr(), dataset, datatype, x.n_elem);\n          \n          if(read_status >= 0) { load_okay = true; }\n          }\n        \n        // Now clean up.\n        arma_H5Tclose(datatype);\n        arma_H5Tclose(mat_type);\n        arma_H5Sclose(filespace);\n        }\n      \n      arma_H5Dclose(dataset);\n    \n      arma_H5Fclose(fid);\n\n      if(load_okay == false)\n        {\n        err_msg = \"unsupported or incorrect HDF5 data in \";\n        }\n      }\n    else\n      {\n      err_msg = \"cannot open file \";\n      }\n\n    #if !defined(ARMA_PRINT_HDF5_ERRORS)\n      {\n      // Restore HDF5 error handler.\n      arma_H5Eset_auto(H5E_DEFAULT, old_func, old_client_data);\n      }\n    #endif\n\n    return load_okay;\n    }\n  #else\n    {\n    arma_ignore(x);\n    arma_ignore(name);\n    arma_ignore(err_msg);\n\n    arma_stop(\"Mat::load(): use of HDF5 needs to be enabled\");\n\n    return false;\n    }\n  #endif\n  }\n\n\n\n//! Try to load a matrix by automatically determining its type\ntemplate<typename eT>\ninline\nbool\ndiskio::load_auto_detect(Mat<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_HDF5)\n    // We're currently using the C bindings for the HDF5 library, which don't support C++ streams\n    if( arma_H5Fis_hdf5(name.c_str()) ) { return load_hdf5_binary(x, name, err_msg); }\n  #endif\n\n  std::fstream f;\n  f.open(name.c_str(), std::fstream::in | std::fstream::binary);\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_auto_detect(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n\n\n\n//! Try to load a matrix by automatically determining its type\ntemplate<typename eT>\ninline\nbool\ndiskio::load_auto_detect(Mat<eT>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  static const std::string ARMA_MAT_TXT = \"ARMA_MAT_TXT\";\n  static const std::string ARMA_MAT_BIN = \"ARMA_MAT_BIN\";\n  static const std::string           P5 = \"P5\";\n  \n  podarray<char> raw_header( uword(ARMA_MAT_TXT.length()) + 1);\n  \n  std::streampos pos = f.tellg();\n    \n  f.read( raw_header.memptr(), std::streamsize(ARMA_MAT_TXT.length()) );\n  raw_header[uword(ARMA_MAT_TXT.length())] = '\\0';\n  \n  f.clear();\n  f.seekg(pos);\n  \n  const std::string header = raw_header.mem;\n  \n  if(ARMA_MAT_TXT == header.substr(0,ARMA_MAT_TXT.length()))\n    {\n    return load_arma_ascii(x, f, err_msg);\n    }\n  else\n  if(ARMA_MAT_BIN == header.substr(0,ARMA_MAT_BIN.length()))\n    {\n    return load_arma_binary(x, f, err_msg);\n    }\n  else\n  if(P5 == header.substr(0,P5.length()))\n    {\n    return load_pgm_binary(x, f, err_msg);\n    }\n  else\n    {\n    const file_type ft = guess_file_type(f);\n    \n    switch(ft)\n      {\n      case csv_ascii:\n        return load_csv_ascii(x, f, err_msg);\n        break;\n      \n      case raw_binary:\n        return load_raw_binary(x, f, err_msg);\n        break;\n        \n      case raw_ascii:\n        return load_raw_ascii(x, f, err_msg);\n        break;\n      \n      default:\n        err_msg = \"unknown data in \";\n        return false;\n      }\n    }\n  \n  return false;\n  }\n\n\n\n//\n// sparse matrices\n//\n\n\n\n//! Save a matrix in ASCII coord format\ntemplate<typename eT>\ninline\nbool\ndiskio::save_coord_ascii(const SpMat<eT>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n\n  const std::string tmp_name = diskio::gen_tmp_name(final_name);\n\n  std::ofstream f(tmp_name.c_str());\n\n  bool save_okay = f.is_open();\n\n  if(save_okay == true)\n    {\n    save_okay = diskio::save_coord_ascii(x, f);\n\n    f.flush();\n    f.close();\n\n    if(save_okay == true)\n      {\n      save_okay = diskio::safe_rename(tmp_name, final_name);\n      }\n    }\n\n  return save_okay;\n  }\n\n\n\n//! Save a matrix in ASCII coord format\ntemplate<typename eT>\ninline\nbool\ndiskio::save_coord_ascii(const SpMat<eT>& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  const ios::fmtflags orig_flags = f.flags();\n  \n  typename SpMat<eT>::const_iterator iter     = x.begin();\n  typename SpMat<eT>::const_iterator iter_end = x.end();\n  \n  for(; iter != iter_end; ++iter)\n    {\n    f.setf(ios::fixed);\n    \n    f << iter.row() << ' ' << iter.col() << ' ';\n    \n    if( (is_float<eT>::value) || (is_double<eT>::value) )\n      {\n      f.setf(ios::scientific);\n      f.precision(12);\n      }\n    \n    f << (*iter) << '\\n';\n    }\n  \n  \n  // make sure it's possible to figure out the matrix size later\n  if( (x.n_rows > 0) && (x.n_cols > 0) )\n    {\n    const uword max_row = (x.n_rows > 0) ? x.n_rows-1 : 0;\n    const uword max_col = (x.n_cols > 0) ? x.n_cols-1 : 0;\n    \n    if( x.at(max_row, max_col) == eT(0) )\n      {\n      f.setf(ios::fixed);\n      \n      f << max_row << ' ' << max_col << \" 0\\n\";\n      }\n    }\n  \n  const bool save_okay = f.good();\n  \n  f.flags(orig_flags);\n  \n  return save_okay;\n  }\n\n\n\n//! Save a matrix in ASCII coord format (complex numbers)\ntemplate<typename T>\ninline\nbool\ndiskio::save_coord_ascii(const SpMat< std::complex<T> >& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  const ios::fmtflags orig_flags = f.flags();\n  \n  typedef typename std::complex<T> eT;\n  \n  typename SpMat<eT>::const_iterator iter     = x.begin();\n  typename SpMat<eT>::const_iterator iter_end = x.end();\n  \n  for(; iter != iter_end; ++iter)\n    {\n    f.setf(ios::fixed);\n    \n    f << iter.row() << ' ' << iter.col() << ' ';\n    \n    if( (is_float<T>::value) || (is_double<T>::value) )\n      {\n      f.setf(ios::scientific);\n      f.precision(12);\n      }\n    \n    const eT val = (*iter);\n    \n    f << val.real() << ' ' << val.imag() << '\\n';\n    }\n  \n  // make sure it's possible to figure out the matrix size later\n  if( (x.n_rows > 0) && (x.n_cols > 0) )\n    {\n    const uword max_row = (x.n_rows > 0) ? x.n_rows-1 : 0;\n    const uword max_col = (x.n_cols > 0) ? x.n_cols-1 : 0;\n    \n    if( x.at(max_row, max_col) == eT(0) )\n      {\n      f.setf(ios::fixed);\n      \n      f << max_row << ' ' << max_col << \" 0 0\\n\";\n      }\n    }\n  \n  const bool save_okay = f.good();\n  \n  f.flags(orig_flags);\n  \n  return save_okay;\n  }\n\n\n\n//! Save a matrix in binary format,\n//! with a header that stores the matrix type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::save_arma_binary(const SpMat<eT>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n\n  const std::string tmp_name = diskio::gen_tmp_name(final_name);\n\n  std::ofstream f(tmp_name.c_str(), std::fstream::binary);\n\n  bool save_okay = f.is_open();\n\n  if(save_okay == true)\n    {\n    save_okay = diskio::save_arma_binary(x, f);\n\n    f.flush();\n    f.close();\n\n    if(save_okay == true)\n      {\n      save_okay = diskio::safe_rename(tmp_name, final_name);\n      }\n    }\n\n  return save_okay;\n  }\n\n\n\n//! Save a matrix in binary format,\n//! with a header that stores the matrix type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::save_arma_binary(const SpMat<eT>& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  f << diskio::gen_bin_header(x) << '\\n';\n  f << x.n_rows << ' ' << x.n_cols << ' ' << x.n_nonzero << '\\n';\n  \n  f.write( reinterpret_cast<const char*>(x.values),      std::streamsize(x.n_nonzero*sizeof(eT))     );\n  f.write( reinterpret_cast<const char*>(x.row_indices), std::streamsize(x.n_nonzero*sizeof(uword))  );\n  f.write( reinterpret_cast<const char*>(x.col_ptrs),    std::streamsize((x.n_cols+1)*sizeof(uword)) );\n  \n  return f.good();\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\ndiskio::load_coord_ascii(SpMat<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::fstream f;\n  f.open(name.c_str(), std::fstream::in | std::fstream::binary);\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_coord_ascii(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\ndiskio::load_coord_ascii(SpMat<eT>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(err_msg);\n  \n  bool load_okay = f.good();\n  \n  f.clear();\n  const std::fstream::pos_type pos1 = f.tellg();\n  \n  //\n  // work out the size\n  \n  uword f_n_rows = 0;\n  uword f_n_cols = 0;\n  uword f_n_nz   = 0;\n  \n  bool size_found = false;\n  \n  std::string       line_string;\n  std::string       token;\n  \n  std::stringstream line_stream;\n  std::stringstream ss;\n  \n  uword last_line_row = 0;\n  uword last_line_col = 0;\n  \n  bool first_line   = true;\n  bool weird_format = false;\n  \n  \n  while( (f.good() == true) && (load_okay == true) )\n    {\n    std::getline(f, line_string);\n    \n    if(line_string.size() == 0)\n      {\n      break;\n      }\n    \n    line_stream.clear();\n    line_stream.str(line_string);\n    \n    uword line_row = 0;\n    uword line_col = 0;\n    \n    // a valid line in co-ord format has at least 2 entries\n    \n    line_stream >> line_row;\n    \n    if(line_stream.good() == false)\n      {\n      load_okay = false;\n      break;\n      }\n    \n    line_stream >> line_col;\n    \n    size_found = true;\n    \n    if(f_n_rows < line_row)  f_n_rows = line_row;\n    if(f_n_cols < line_col)  f_n_cols = line_col;\n    \n    if(first_line == true)\n      {\n      first_line = false;\n      }\n    else\n      {\n      if( (line_col < last_line_col) || ((line_row <= last_line_row) && (line_col <= last_line_col)) )\n        {\n        weird_format = true;\n        }\n      }\n    \n    last_line_row = line_row;\n    last_line_col = line_col;\n    \n    \n    if(line_stream.good() == true)\n      {\n      eT final_val = eT(0);\n      \n      line_stream >> token;\n      \n      if(line_stream.fail() == false)\n        {\n        eT val = eT(0);\n        \n        ss.clear();\n        ss.str(token);\n        \n        ss >> val;\n        \n        if(ss.fail() == false)\n          {\n          final_val = val;\n          }\n        else\n          {\n          val = eT(0);\n          \n          const bool success = diskio::convert_naninf( val, token );\n          \n          if(success == true)\n            {\n            final_val = val;\n            }\n          }\n        }\n      \n      if(final_val != eT(0))\n        {\n        ++f_n_nz;\n        }\n      }\n    }\n  \n  \n  if(size_found == true)\n    {\n    // take into account that indices start at 0\n    f_n_rows++;\n    f_n_cols++;\n    }\n  \n  \n  if(load_okay == true)\n    {\n    f.clear();\n    f.seekg(pos1);\n    \n    x.set_size(f_n_rows, f_n_cols);\n    \n    if(weird_format == false)\n      {\n      x.mem_resize(f_n_nz);\n      }\n    \n    uword pos = 0;\n    \n    while(f.good() == true)\n      {\n      std::getline(f, line_string);\n      \n      if(line_string.size() == 0)\n        {\n        break;\n        }\n      \n      line_stream.clear();\n      line_stream.str(line_string);\n      \n      uword line_row = 0;\n      uword line_col = 0;\n      \n      line_stream >> line_row;\n      line_stream >> line_col;\n      \n      eT final_val = eT(0);\n      \n      line_stream >> token;\n      \n      if(line_stream.fail() == false)\n        {\n        eT val = eT(0);\n        \n        ss.clear();\n        ss.str(token);\n        \n        ss >> val;\n        \n        if(ss.fail() == false)\n          {\n          final_val = val;\n          }\n        else\n          {\n          val = eT(0);\n          \n          const bool success = diskio::convert_naninf( val, token );\n          \n          if(success == true)\n            {\n            final_val = val;\n            }\n          }\n        }\n      \n      \n      if(final_val != eT(0))\n        {\n        if(weird_format == false)\n          {\n          access::rw(x.row_indices[pos]) = line_row;\n          access::rw(x.values[pos])      = final_val;\n          ++access::rw(x.col_ptrs[line_col + 1]);\n          \n          ++pos;\n          }\n        else\n          {\n          x.at(line_row,line_col) = final_val;\n          }\n        }\n      }\n    \n    if(weird_format == false)\n      {\n      for(uword c = 1; c <= f_n_cols; ++c)\n        {\n        access::rw(x.col_ptrs[c]) += x.col_ptrs[c - 1];\n        }\n      }\n    }\n  \n  return load_okay;\n  }\n\n\n\ntemplate<typename T>\ninline\nbool\ndiskio::load_coord_ascii(SpMat< std::complex<T> >& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(err_msg);\n  \n  bool load_okay = f.good();\n  \n  f.clear();\n  const std::fstream::pos_type pos1 = f.tellg();\n  \n  //\n  // work out the size\n  \n  uword f_n_rows = 0;\n  uword f_n_cols = 0;\n  uword f_n_nz   = 0;\n  \n  bool size_found = false;\n  \n  std::string line_string;\n  std::string token_real;\n  std::string token_imag;\n  \n  std::stringstream line_stream;\n  std::stringstream ss;\n  \n  uword last_line_row = 0;\n  uword last_line_col = 0;\n  \n  bool first_line   = true;\n  bool weird_format = false;\n  \n  while( (f.good() == true) && (load_okay == true) )\n    {\n    std::getline(f, line_string);\n    \n    if(line_string.size() == 0)\n      {\n      break;\n      }\n    \n    line_stream.clear();\n    line_stream.str(line_string);\n    \n    uword line_row = 0;\n    uword line_col = 0;\n    \n    // a valid line in co-ord format has at least 2 entries\n    \n    line_stream >> line_row;\n    \n    if(line_stream.good() == false)\n      {\n      load_okay = false;\n      break;\n      }\n    \n    line_stream >> line_col;\n    \n    size_found = true;\n    \n    if(f_n_rows < line_row)  f_n_rows = line_row;\n    if(f_n_cols < line_col)  f_n_cols = line_col;\n    \n    \n    if(first_line == true)\n      {\n      first_line = false;\n      }\n    else\n      {\n      if( (line_col < last_line_col) || ((line_row <= last_line_row) && (line_col <= last_line_col)) )\n        {\n        weird_format = true;\n        }\n      }\n    \n    last_line_row = line_row;\n    last_line_col = line_col;\n    \n    \n    if(line_stream.good() == true)\n      {\n      T final_val_real = T(0);\n      T final_val_imag = T(0);\n      \n      \n      line_stream >> token_real;\n      \n      if(line_stream.fail() == false)\n        {\n        T val_real = T(0);\n        \n        ss.clear();\n        ss.str(token_real);\n        \n        ss >> val_real;\n        \n        if(ss.fail() == false)\n          {\n          final_val_real = val_real;\n          }\n        else\n          {\n          val_real = T(0);\n          \n          const bool success = diskio::convert_naninf( val_real, token_real );\n          \n          if(success == true)\n            {\n            final_val_real = val_real;\n            }\n          }\n        }\n      \n      \n      line_stream >> token_imag;\n      \n      if(line_stream.fail() == false)\n        {\n        T val_imag = T(0);\n        \n        ss.clear();\n        ss.str(token_imag);\n        \n        ss >> val_imag;\n        \n        if(ss.fail() == false)\n          {\n          final_val_imag = val_imag;\n          }\n        else\n          {\n          val_imag = T(0);\n          \n          const bool success = diskio::convert_naninf( val_imag, token_imag );\n          \n          if(success == true)\n            {\n            final_val_imag = val_imag;\n            }\n          }\n        }\n      \n      \n      if( (final_val_real != T(0)) || (final_val_imag != T(0)) )\n        {\n        ++f_n_nz;\n        }\n      }\n    }\n  \n  \n  if(size_found == true)\n    {\n    // take into account that indices start at 0\n    f_n_rows++;\n    f_n_cols++;\n    }\n  \n  \n  if(load_okay == true)\n    {\n    f.clear();\n    f.seekg(pos1);\n    \n    x.set_size(f_n_rows, f_n_cols);\n    \n    if(weird_format == false)\n      {\n      x.mem_resize(f_n_nz);\n      }\n    \n    uword pos = 0;\n    \n    while(f.good() == true)\n      {\n      std::getline(f, line_string);\n      \n      if(line_string.size() == 0)\n        {\n        break;\n        }\n      \n      line_stream.clear();\n      line_stream.str(line_string);\n      \n      uword line_row = 0;\n      uword line_col = 0;\n      \n      line_stream >> line_row;\n      line_stream >> line_col;\n      \n      T final_val_real = T(0);\n      T final_val_imag = T(0);\n      \n      \n      line_stream >> token_real;\n      \n      if(line_stream.fail() == false)\n        {\n        T val_real = T(0);\n        \n        ss.clear();\n        ss.str(token_real);\n        \n        ss >> val_real;\n        \n        if(ss.fail() == false)\n          {\n          final_val_real = val_real;\n          }\n        else\n          {\n          val_real = T(0);\n          \n          const bool success = diskio::convert_naninf( val_real, token_real );\n          \n          if(success == true)\n            {\n            final_val_real = val_real;\n            }\n          }\n        }\n      \n      \n      line_stream >> token_imag;\n      \n      if(line_stream.fail() == false)\n        {\n        T val_imag = T(0);\n        \n        ss.clear();\n        ss.str(token_imag);\n        \n        ss >> val_imag;\n        \n        if(ss.fail() == false)\n          {\n          final_val_imag = val_imag;\n          }\n        else\n          {\n          val_imag = T(0);\n          \n          const bool success = diskio::convert_naninf( val_imag, token_imag );\n          \n          if(success == true)\n            {\n            final_val_imag = val_imag;\n            }\n          }\n        }\n      \n      \n      if( (final_val_real != T(0)) || (final_val_imag != T(0)) )\n        {\n        if(weird_format == false)\n          {\n          access::rw(x.row_indices[pos]) = line_row;\n          access::rw(x.values[pos])      = std::complex<T>(final_val_real, final_val_imag);\n          ++access::rw(x.col_ptrs[line_col + 1]);\n          \n          ++pos;\n          }\n        else\n          {\n          x.at(line_row,line_col) = std::complex<T>(final_val_real, final_val_imag);\n          }\n        }\n      }\n    \n    \n    if(weird_format == false)\n      {\n      for(uword c = 1; c <= f_n_cols; ++c)\n        {\n        access::rw(x.col_ptrs[c]) += x.col_ptrs[c - 1];\n        }\n      }\n    }\n  \n  return load_okay;\n  }\n\n\n\n//! Load a matrix in binary format,\n//! with a header that indicates the matrix type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::load_arma_binary(SpMat<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n\n  std::ifstream f;\n  f.open(name.c_str(), std::fstream::binary);\n\n  bool load_okay = f.is_open();\n\n  if(load_okay == true)\n    {\n    load_okay = diskio::load_arma_binary(x, f, err_msg);\n    f.close();\n    }\n\n  return load_okay;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\ndiskio::load_arma_binary(SpMat<eT>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  bool load_okay = true;\n  \n  std::string f_header;\n  \n  f >> f_header;\n  \n  if(f_header == diskio::gen_bin_header(x))\n    {\n    uword f_n_rows;\n    uword f_n_cols;\n    uword f_n_nz;\n    \n    f >> f_n_rows;\n    f >> f_n_cols;\n    f >> f_n_nz;\n    \n    //f.seekg(1, ios::cur);  // NOTE: this may not be portable, as on a Windows machine a newline could be two characters\n    f.get();\n    \n    x.set_size(f_n_rows, f_n_cols);\n    \n    x.mem_resize(f_n_nz);\n    \n    f.read( reinterpret_cast<char*>(access::rwp(x.values)),      std::streamsize(x.n_nonzero*sizeof(eT))     );\n    \n    std::streampos pos = f.tellg();\n    \n    f.read( reinterpret_cast<char*>(access::rwp(x.row_indices)), std::streamsize(x.n_nonzero*sizeof(uword))  );\n    f.read( reinterpret_cast<char*>(access::rwp(x.col_ptrs)),    std::streamsize((x.n_cols+1)*sizeof(uword)) );\n    \n    bool check1 = true;  for(uword i=0; i < x.n_nonzero; ++i)  { if(x.values[i] == eT(0))  { check1 = false; break; } }\n    bool check2 = true;  for(uword i=0; i < x.n_cols;    ++i)  { if(x.col_ptrs[i+1] < x.col_ptrs[i])  { check2 = false; break; } }\n    bool check3 = (x.col_ptrs[x.n_cols] == x.n_nonzero);\n    \n    if((check1 == true) && ((check2 == false) || (check3 == false)))\n      {\n      if(sizeof(uword) == 8)\n        {\n        arma_extra_debug_print(\"detected inconsistent data while loading; re-reading integer parts as u32\");\n        \n        // inconstency could be due to a different uword size used during saving,\n        // so try loading the row_indices and col_ptrs under the assumption of 32 bit unsigned integers\n        \n        f.clear();\n        f.seekg(pos);\n        \n        podarray<u32> tmp_a(x.n_nonzero );  tmp_a.zeros();\n        podarray<u32> tmp_b(x.n_cols + 1);  tmp_b.zeros();\n        \n        f.read( reinterpret_cast<char*>(tmp_a.memptr()), std::streamsize( x.n_nonzero   * sizeof(u32)) );\n        f.read( reinterpret_cast<char*>(tmp_b.memptr()), std::streamsize((x.n_cols + 1) * sizeof(u32)) );\n        \n        check2 = true;  for(uword i=0; i < x.n_cols; ++i)  { if(tmp_b[i+1] < tmp_b[i])  { check2 = false; break; } }\n        check3 = (tmp_b[x.n_cols] == x.n_nonzero);\n        \n        load_okay = f.good();\n        \n        if( load_okay && (check2 == true) && (check3 == true) )\n          {\n          arma_extra_debug_print(\"reading integer parts as u32 succeeded\");\n          \n          arrayops::convert(access::rwp(x.row_indices), tmp_a.memptr(), x.n_nonzero );\n          arrayops::convert(access::rwp(x.col_ptrs),    tmp_b.memptr(), x.n_cols + 1);\n          }\n        else\n          {\n          arma_extra_debug_print(\"reading integer parts as u32 failed\");\n          }\n        }\n      }\n    \n    if((check1 == false) || (check2 == false) || (check3 == false))\n      {\n      load_okay = false;\n      err_msg = \"inconsistent data in \";\n      }\n    else\n      {\n      load_okay = f.good();\n      }\n    }\n  else\n    {\n    load_okay = false;\n    err_msg = \"incorrect header in \";\n    }\n\n  return load_okay;\n  }\n\n\n\n// cubes\n\n\n\n//! Save a cube as raw text (no header, human readable).\ntemplate<typename eT>\ninline\nbool\ndiskio::save_raw_ascii(const Cube<eT>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n  \n  const std::string tmp_name = diskio::gen_tmp_name(final_name);\n  \n  std::fstream f(tmp_name.c_str(), std::fstream::out);\n  \n  bool save_okay = f.is_open();\n  \n  if(save_okay == true)\n    {\n    save_okay = save_raw_ascii(x, f);\n    \n    f.flush();\n    f.close();\n    \n    if(save_okay == true)\n      {\n      save_okay = diskio::safe_rename(tmp_name, final_name);\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\n//! Save a cube as raw text (no header, human readable).\ntemplate<typename eT>\ninline\nbool\ndiskio::save_raw_ascii(const Cube<eT>& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  uword cell_width;\n  \n  // TODO: need sane values for complex numbers\n  \n  if( (is_float<eT>::value) || (is_double<eT>::value) )\n    {\n    f.setf(ios::scientific);\n    f.precision(12);\n    cell_width = 20;\n    }\n  \n  for(uword slice=0; slice < x.n_slices; ++slice)\n    {\n    for(uword row=0; row < x.n_rows; ++row)\n      {\n      for(uword col=0; col < x.n_cols; ++col)\n        {\n        f.put(' ');\n        \n        if( (is_float<eT>::value) || (is_double<eT>::value) )\n          {\n          f.width(cell_width);\n          }\n        \n        arma_ostream::print_elem(f, x.at(row,col,slice), false);\n        }\n        \n      f.put('\\n');\n      }\n    }\n  \n  return f.good();\n  }\n\n\n\n//! Save a cube as raw binary (no header)\ntemplate<typename eT>\ninline\nbool\ndiskio::save_raw_binary(const Cube<eT>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n  \n  const std::string tmp_name = diskio::gen_tmp_name(final_name);\n  \n  std::ofstream f(tmp_name.c_str(), std::fstream::binary);\n  \n  bool save_okay = f.is_open();\n  \n  if(save_okay == true)\n    {\n    save_okay = diskio::save_raw_binary(x, f);\n    \n    f.flush();\n    f.close();\n    \n    if(save_okay == true)\n      {\n      save_okay = diskio::safe_rename(tmp_name, final_name);\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\ndiskio::save_raw_binary(const Cube<eT>& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  f.write( reinterpret_cast<const char*>(x.mem), std::streamsize(x.n_elem*sizeof(eT)) );\n  \n  return f.good();\n  }\n\n\n\n//! Save a cube in text format (human readable),\n//! with a header that indicates the cube type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::save_arma_ascii(const Cube<eT>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n  \n  const std::string tmp_name = diskio::gen_tmp_name(final_name);\n  \n  std::ofstream f(tmp_name.c_str());\n  \n  bool save_okay = f.is_open();\n  \n  if(save_okay == true)\n    {\n    save_okay = diskio::save_arma_ascii(x, f);\n    \n    f.flush();\n    f.close();\n    \n    if(save_okay == true)\n      {\n      save_okay = diskio::safe_rename(tmp_name, final_name);\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\n//! Save a cube in text format (human readable),\n//! with a header that indicates the cube type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::save_arma_ascii(const Cube<eT>& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  const ios::fmtflags orig_flags = f.flags();\n  \n  f << diskio::gen_txt_header(x) << '\\n';\n  f << x.n_rows << ' ' << x.n_cols << ' ' << x.n_slices << '\\n';\n  \n  uword cell_width;\n  \n  // TODO: need sane values for complex numbers\n  \n  if( (is_float<eT>::value) || (is_double<eT>::value) )\n    {\n    f.setf(ios::scientific);\n    f.precision(12);\n    cell_width = 20;\n    }\n    \n  for(uword slice=0; slice < x.n_slices; ++slice)\n    {\n    for(uword row=0; row < x.n_rows; ++row)\n      {\n      for(uword col=0; col < x.n_cols; ++col)\n        {\n        f.put(' ');\n        \n        if( (is_float<eT>::value) || (is_double<eT>::value) )        \n          {\n          f.width(cell_width);\n          }\n        \n        arma_ostream::print_elem(f, x.at(row,col,slice), false);\n        }\n      \n      f.put('\\n');\n      }\n    }\n  \n  const bool save_okay = f.good();\n  \n  f.flags(orig_flags);\n  \n  return save_okay;\n  }\n\n\n\n//! Save a cube in binary format,\n//! with a header that stores the cube type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::save_arma_binary(const Cube<eT>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n  \n  const std::string tmp_name = diskio::gen_tmp_name(final_name);\n  \n  std::ofstream f(tmp_name.c_str(), std::fstream::binary);\n  \n  bool save_okay = f.is_open();\n  \n  if(save_okay == true)\n    {\n    save_okay = diskio::save_arma_binary(x, f);\n    \n    f.flush();\n    f.close();\n    \n    if(save_okay == true)\n      {\n      save_okay = diskio::safe_rename(tmp_name, final_name);\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\n//! Save a cube in binary format,\n//! with a header that stores the cube type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::save_arma_binary(const Cube<eT>& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  f << diskio::gen_bin_header(x) << '\\n';\n  f << x.n_rows << ' ' << x.n_cols << ' ' << x.n_slices << '\\n';\n  \n  f.write( reinterpret_cast<const char*>(x.mem), std::streamsize(x.n_elem*sizeof(eT)) );\n  \n  return f.good();\n  }\n\n\n\n//! Save a cube as part of a HDF5 file\ntemplate<typename eT>\ninline\nbool\ndiskio::save_hdf5_binary(const Cube<eT>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n\n  #if defined(ARMA_USE_HDF5)\n    {\n    #if !defined(ARMA_PRINT_HDF5_ERRORS)\n      {\n      // Disable annoying HDF5 error messages.\n      arma_H5Eset_auto(H5E_DEFAULT, NULL, NULL);\n      }\n    #endif\n\n    bool save_okay = false;\n\n    const std::string tmp_name = diskio::gen_tmp_name(final_name);\n\n    // Set up the file according to HDF5's preferences\n    hid_t file = arma_H5Fcreate(tmp_name.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);\n\n    // We need to create a dataset, datatype, and dataspace\n    hsize_t dims[3];\n    dims[2] = x.n_rows;\n    dims[1] = x.n_cols;\n    dims[0] = x.n_slices;\n\n    hid_t dataspace = arma_H5Screate_simple(3, dims, NULL);   // treat the cube as a 3d array dataspace\n    hid_t datatype  = hdf5_misc::get_hdf5_type<eT>();\n\n    // If this returned something invalid, well, it's time to crash.\n    arma_check(datatype == -1, \"Cube::save(): unknown datatype for HDF5\");\n\n    // MATLAB forces the users to specify a name at save time for HDF5; Octave\n    // will use the default of 'dataset' unless otherwise specified, so we will\n    // use that.\n    hid_t dataset = arma_H5Dcreate(file, \"dataset\", datatype, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);\n\n    herr_t status = arma_H5Dwrite(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, x.mem);\n    save_okay = (status >= 0);\n\n    arma_H5Dclose(dataset);\n    arma_H5Tclose(datatype);\n    arma_H5Sclose(dataspace);\n    arma_H5Fclose(file);\n\n    if(save_okay == true) { save_okay = diskio::safe_rename(tmp_name, final_name); }\n\n    return save_okay;\n    }\n  #else\n    {\n    arma_ignore(x);\n    arma_ignore(final_name);\n\n    arma_stop(\"Cube::save(): use of HDF5 needs to be enabled\");\n\n    return false;\n    }\n  #endif\n  }\n\n\n\n//! Load a cube as raw text (no header, human readable).\n//! NOTE: this is much slower than reading a file with a header.\ntemplate<typename eT>\ninline\nbool\ndiskio::load_raw_ascii(Cube<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT> tmp;\n  const bool load_okay = diskio::load_raw_ascii(tmp, name, err_msg);\n  \n  if(load_okay == true)\n    {\n    if(tmp.is_empty() == false)\n      {\n      x.set_size(tmp.n_rows, tmp.n_cols, 1);\n      \n      x.slice(0) = tmp;\n      }\n    else\n      {\n      x.reset();\n      }\n    }\n  \n  return load_okay;\n  }\n\n\n\n//! Load a cube as raw text (no header, human readable).\n//! NOTE: this is much slower than reading a file with a header.\ntemplate<typename eT>\ninline\nbool\ndiskio::load_raw_ascii(Cube<eT>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT> tmp;\n  const bool load_okay = diskio::load_raw_ascii(tmp, f, err_msg);\n  \n  if(load_okay == true)\n    {\n    if(tmp.is_empty() == false)\n      {\n      x.set_size(tmp.n_rows, tmp.n_cols, 1);\n      \n      x.slice(0) = tmp;\n      }\n    else\n      {\n      x.reset();\n      }\n    }\n  \n  return load_okay;\n  }\n\n\n\n//! Load a cube in binary format (no header);\n//! the cube is assumed to have one slice with one column\ntemplate<typename eT>\ninline\nbool\ndiskio::load_raw_binary(Cube<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::ifstream f;\n  f.open(name.c_str(), std::fstream::binary);\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_raw_binary(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\ndiskio::load_raw_binary(Cube<eT>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(err_msg);\n  \n  f.clear();\n  const std::streampos pos1 = f.tellg();\n  \n  f.clear();\n  f.seekg(0, ios::end);\n  \n  f.clear();\n  const std::streampos pos2 = f.tellg();\n  \n  const uword N = ( (pos1 >= 0) && (pos2 >= 0) ) ? uword(pos2 - pos1) : 0;\n  \n  f.clear();\n  //f.seekg(0, ios::beg);\n  f.seekg(pos1);\n  \n  x.set_size(N / sizeof(eT), 1, 1);\n  \n  f.clear();\n  f.read( reinterpret_cast<char *>(x.memptr()), std::streamsize(N) );\n  \n  return f.good();\n  }\n\n\n\n//! Load a cube in text format (human readable),\n//! with a header that indicates the cube type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::load_arma_ascii(Cube<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::ifstream f(name.c_str());\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_arma_ascii(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n  \n\n\n//! Load a cube in text format (human readable),\n//! with a header that indicates the cube type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::load_arma_ascii(Cube<eT>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::streampos pos = f.tellg();\n    \n  bool load_okay = true;\n  \n  std::string f_header;\n  uword f_n_rows;\n  uword f_n_cols;\n  uword f_n_slices;\n  \n  f >> f_header;\n  f >> f_n_rows;\n  f >> f_n_cols;\n  f >> f_n_slices;\n  \n  if(f_header == diskio::gen_txt_header(x))\n    {\n    x.set_size(f_n_rows, f_n_cols, f_n_slices);\n\n    for(uword slice=0; slice < x.n_slices; ++slice)\n      {\n      for(uword row=0; row < x.n_rows; ++row)\n        {\n        for(uword col=0; col < x.n_cols; ++col)\n          {\n          f >> x.at(row,col,slice);\n          }\n        }\n      }\n    \n    load_okay = f.good();\n    }\n  else\n    {\n    load_okay = false;\n    err_msg = \"incorrect header in \";\n    }\n  \n  \n  // allow automatic conversion of u32/s32 cubes into u64/s64 cubes\n  \n  if(load_okay == false)\n    {\n    if( (sizeof(eT) == 8) && is_same_type<uword,eT>::yes )\n      {\n      Cube<u32>   tmp;\n      std::string junk;\n      \n      f.clear();\n      f.seekg(pos);\n      \n      load_okay = diskio::load_arma_ascii(tmp, f, junk);\n      \n      if(load_okay)  { x = conv_to< Cube<eT> >::from(tmp); }\n      }\n    else\n    if( (sizeof(eT) == 8) && is_same_type<sword,eT>::yes )\n      {\n      Cube<s32>   tmp;\n      std::string junk;\n      \n      f.clear();\n      f.seekg(pos);\n      \n      load_okay = diskio::load_arma_ascii(tmp, f, junk);\n      \n      if(load_okay)  { x = conv_to< Cube<eT> >::from(tmp); }\n      }\n    }\n  \n  return load_okay;\n  }\n\n\n\n//! Load a cube in binary format,\n//! with a header that indicates the cube type as well as its dimensions\ntemplate<typename eT>\ninline\nbool\ndiskio::load_arma_binary(Cube<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::ifstream f;\n  f.open(name.c_str(), std::fstream::binary);\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_arma_binary(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\ndiskio::load_arma_binary(Cube<eT>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::streampos pos = f.tellg();\n    \n  bool load_okay = true;\n  \n  std::string f_header;\n  uword f_n_rows;\n  uword f_n_cols;\n  uword f_n_slices;\n  \n  f >> f_header;\n  f >> f_n_rows;\n  f >> f_n_cols;\n  f >> f_n_slices;\n  \n  if(f_header == diskio::gen_bin_header(x))\n    {\n    //f.seekg(1, ios::cur);  // NOTE: this may not be portable, as on a Windows machine a newline could be two characters\n    f.get();\n    \n    x.set_size(f_n_rows, f_n_cols, f_n_slices);\n    f.read( reinterpret_cast<char *>(x.memptr()), std::streamsize(x.n_elem*sizeof(eT)) );\n    \n    load_okay = f.good();\n    }\n  else\n    {\n    load_okay = false;\n    err_msg = \"incorrect header in \";\n    }\n  \n  \n  // allow automatic conversion of u32/s32 cubes into u64/s64 cubes\n  \n  if(load_okay == false)\n    {\n    if( (sizeof(eT) == 8) && is_same_type<uword,eT>::yes )\n      {\n      Cube<u32>   tmp;\n      std::string junk;\n      \n      f.clear();\n      f.seekg(pos);\n      \n      load_okay = diskio::load_arma_binary(tmp, f, junk);\n      \n      if(load_okay)  { x = conv_to< Cube<eT> >::from(tmp); }\n      }\n    else\n    if( (sizeof(eT) == 8) && is_same_type<sword,eT>::yes )\n      {\n      Cube<s32>   tmp;\n      std::string junk;\n      \n      f.clear();\n      f.seekg(pos);\n      \n      load_okay = diskio::load_arma_binary(tmp, f, junk);\n      \n      if(load_okay)  { x = conv_to< Cube<eT> >::from(tmp); }\n      }\n    }\n  \n  return load_okay;\n  }\n\n\n\n//! Load a HDF5 file as a cube\ntemplate<typename eT>\ninline\nbool\ndiskio::load_hdf5_binary(Cube<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n\n  #if defined(ARMA_USE_HDF5)\n    {\n\n    // These may be necessary to store the error handler (if we need to).\n    herr_t (*old_func)(hid_t, void*);\n    void *old_client_data;\n\n    #if !defined(ARMA_PRINT_HDF5_ERRORS)\n      {\n      // Save old error handler.\n      arma_H5Eget_auto(H5E_DEFAULT, &old_func, &old_client_data);\n\n      // Disable annoying HDF5 error messages.\n      arma_H5Eset_auto(H5E_DEFAULT, NULL, NULL);\n      }\n    #endif\n\n    bool load_okay = false;\n\n    hid_t fid = arma_H5Fopen(name.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);\n\n    if(fid >= 0)\n      {\n      // MATLAB HDF5 dataset names are user-specified;\n      // Octave tends to store the datasets in a group, with the actual dataset being referred to as \"value\".\n      // So we will search for \"dataset\" and \"value\", and if those are not found we will take the first dataset we do find.\n      std::vector<std::string> searchNames;\n      searchNames.push_back(\"dataset\");\n      searchNames.push_back(\"value\");\n\n      hid_t dataset = hdf5_misc::search_hdf5_file(searchNames, fid, 3, false);\n\n      if(dataset >= 0)\n        {\n        hid_t filespace = arma_H5Dget_space(dataset);\n\n        // This must be <= 3 due to our search rules.\n        const int ndims = arma_H5Sget_simple_extent_ndims(filespace);\n\n        hsize_t dims[3];\n        const herr_t query_status = arma_H5Sget_simple_extent_dims(filespace, dims, NULL);\n\n        // arma_check(query_status < 0, \"Cube::load(): cannot get size of HDF5 dataset\");\n        if(query_status < 0)\n          {\n          err_msg = \"cannot get size of HDF5 dataset in \";\n\n          arma_H5Sclose(filespace);\n          arma_H5Dclose(dataset);\n          arma_H5Fclose(fid);\n\n          #if !defined(ARMA_PRINT_HDF5_ERRORS)\n            {\n            // Restore HDF5 error handler.\n            arma_H5Eset_auto(H5E_DEFAULT, old_func, old_client_data);\n            }\n          #endif\n\n          return false;\n          }\n\n        if (ndims == 1) { dims[1] = 1; dims[2] = 1; }  // Vector case; one row/colum, several slices\n        if (ndims == 2) { dims[2] = 1; } // Matrix case; one column, several rows/slices\n\n        x.set_size(dims[2], dims[1], dims[0]);\n\n        // Now we have to see what type is stored to figure out how to load it.\n        hid_t datatype = arma_H5Dget_type(dataset);\n        hid_t mat_type = hdf5_misc::get_hdf5_type<eT>();\n\n        // If these are the same type, it is simple.\n        if(arma_H5Tequal(datatype, mat_type) > 0)\n          {\n          // Load directly; H5S_ALL used so that we load the entire dataset.\n          hid_t read_status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(x.memptr()));\n\n          if(read_status >= 0) { load_okay = true; }\n          }\n        else\n          {\n          // Load into another array and convert its type accordingly.\n          hid_t read_status = hdf5_misc::load_and_convert_hdf5(x.memptr(), dataset, datatype, x.n_elem);\n\n          if(read_status >= 0) { load_okay = true; }\n          }\n\n        // Now clean up.\n        arma_H5Tclose(datatype);\n        arma_H5Tclose(mat_type);\n        arma_H5Sclose(filespace);\n        }\n\n      arma_H5Dclose(dataset);\n\n      arma_H5Fclose(fid);\n\n      if(load_okay == false)\n        {\n        err_msg = \"unsupported or incorrect HDF5 data in \";\n        }\n      }\n    else\n      {\n      err_msg = \"cannot open file \";\n      }\n\n    #if !defined(ARMA_PRINT_HDF5_ERRORS)\n      {\n      // Restore HDF5 error handler.\n      arma_H5Eset_auto(H5E_DEFAULT, old_func, old_client_data);\n      }\n    #endif\n\n    return load_okay;\n    }\n  #else\n    {\n    arma_ignore(x);\n    arma_ignore(name);\n    arma_ignore(err_msg);\n\n    arma_stop(\"Cube::load(): use of HDF5 needs to be enabled\");\n\n    return false;\n    }\n  #endif\n  }\n\n\n\n//! Try to load a cube by automatically determining its type\ntemplate<typename eT>\ninline\nbool\ndiskio::load_auto_detect(Cube<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_HDF5)\n    // We're currently using the C bindings for the HDF5 library, which don't support C++ streams\n    if( arma_H5Fis_hdf5(name.c_str()) ) { return load_hdf5_binary(x, name, err_msg); }\n  #endif\n\n  std::fstream f;\n  f.open(name.c_str(), std::fstream::in | std::fstream::binary);\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_auto_detect(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n\n\n\n//! Try to load a cube by automatically determining its type\ntemplate<typename eT>\ninline\nbool\ndiskio::load_auto_detect(Cube<eT>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  static const std::string ARMA_CUB_TXT = \"ARMA_CUB_TXT\";\n  static const std::string ARMA_CUB_BIN = \"ARMA_CUB_BIN\";\n  static const std::string           P6 = \"P6\";\n  \n  podarray<char> raw_header(uword(ARMA_CUB_TXT.length()) + 1);\n  \n  std::streampos pos = f.tellg();\n  \n  f.read( raw_header.memptr(), std::streamsize(ARMA_CUB_TXT.length()) );\n  raw_header[uword(ARMA_CUB_TXT.length())] = '\\0';\n  \n  f.clear();\n  f.seekg(pos);\n  \n  const std::string header = raw_header.mem;\n  \n  if(ARMA_CUB_TXT == header.substr(0, ARMA_CUB_TXT.length()))\n    {\n    return load_arma_ascii(x, f, err_msg);\n    }\n  else\n  if(ARMA_CUB_BIN == header.substr(0, ARMA_CUB_BIN.length()))\n    {\n    return load_arma_binary(x, f, err_msg);\n    }\n  else\n  if(P6 == header.substr(0, P6.length()))\n    {\n    return load_ppm_binary(x, f, err_msg);\n    }\n  else\n    {\n    const file_type ft = guess_file_type(f);\n    \n    switch(ft)\n      {\n      // case csv_ascii:\n      //   return load_csv_ascii(x, f, err_msg);\n      //   break;\n      \n      case raw_binary:\n        return load_raw_binary(x, f, err_msg);\n        break;\n        \n      case raw_ascii:\n        return load_raw_ascii(x, f, err_msg);\n        break;\n        \n      default:\n        err_msg = \"unknown data in \";\n        return false;\n      }\n    }\n  \n  return false;\n  }\n\n\n\n\n\n// fields\n\n\n\ntemplate<typename T1>\ninline\nbool\ndiskio::save_arma_binary(const field<T1>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n  \n  const std::string tmp_name = diskio::gen_tmp_name(final_name);\n  \n  std::ofstream f( tmp_name.c_str(), std::fstream::binary );\n  \n  bool save_okay = f.is_open();\n  \n  if(save_okay == true)\n    {\n    save_okay = diskio::save_arma_binary(x, f);\n    \n    f.flush();\n    f.close();\n    \n    if(save_okay == true)\n      {\n      save_okay = diskio::safe_rename(tmp_name, final_name);\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\ndiskio::save_arma_binary(const field<T1>& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( (is_Mat<T1>::value == false) && (is_Cube<T1>::value == false) ));\n  \n  if(x.n_slices <= 1)\n    {\n    f << \"ARMA_FLD_BIN\" << '\\n';\n    f << x.n_rows << '\\n';\n    f << x.n_cols << '\\n';\n    }\n  else\n    {\n    f << \"ARMA_FL3_BIN\" << '\\n';\n    f << x.n_rows   << '\\n';\n    f << x.n_cols   << '\\n';\n    f << x.n_slices << '\\n';\n    }\n  \n  bool save_okay = true;\n  \n  for(uword i=0; i<x.n_elem; ++i)\n    {\n    save_okay = diskio::save_arma_binary(x[i], f);\n    \n    if(save_okay == false)\n      {\n      break;\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\ndiskio::load_arma_binary(field<T1>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::ifstream f( name.c_str(), std::fstream::binary );\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_arma_binary(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\ndiskio::load_arma_binary(field<T1>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( (is_Mat<T1>::value == false) && (is_Cube<T1>::value == false) ));\n  \n  bool load_okay = true;\n  \n  std::string f_type;\n  f >> f_type;\n  \n  if(f_type == \"ARMA_FLD_BIN\")\n    {\n    uword f_n_rows;\n    uword f_n_cols;\n  \n    f >> f_n_rows;\n    f >> f_n_cols;\n    \n    x.set_size(f_n_rows, f_n_cols);\n    \n    f.get();      \n    \n    for(uword i=0; i<x.n_elem; ++i)\n      {\n      load_okay = diskio::load_arma_binary(x[i], f, err_msg);\n      \n      if(load_okay == false)\n        {\n        break;\n        }\n      }\n    }\n  else\n  if(f_type == \"ARMA_FL3_BIN\")\n    {\n    uword f_n_rows;\n    uword f_n_cols;\n    uword f_n_slices;\n  \n    f >> f_n_rows;\n    f >> f_n_cols;\n    f >> f_n_slices;\n    \n    x.set_size(f_n_rows, f_n_cols, f_n_slices);\n    \n    f.get();      \n    \n    for(uword i=0; i<x.n_elem; ++i)\n      {\n      load_okay = diskio::load_arma_binary(x[i], f, err_msg);\n      \n      if(load_okay == false)\n        {\n        break;\n        }\n      }\n    }\n  else\n    {\n    load_okay = false;\n    err_msg = \"unsupported field type in \";\n    }\n  \n  return load_okay;\n  }\n\n\n\ninline\nbool\ndiskio::save_std_string(const field<std::string>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n  \n  const std::string tmp_name = diskio::gen_tmp_name(final_name);\n  \n  std::ofstream f( tmp_name.c_str(), std::fstream::binary );\n  \n  bool save_okay = f.is_open();\n  \n  if(save_okay == true)\n    {\n    save_okay = diskio::save_std_string(x, f);\n    \n    f.flush();\n    f.close();\n    \n    if(save_okay == true)\n      {\n      save_okay = diskio::safe_rename(tmp_name, final_name);\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\ninline\nbool\ndiskio::save_std_string(const field<std::string>& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  for(uword row=0; row<x.n_rows; ++row)\n  for(uword col=0; col<x.n_cols; ++col)\n    {\n    f << x.at(row,col);\n    \n    if(col < x.n_cols-1)\n      {\n      f << ' ';\n      }\n    else\n      {\n      f << '\\n';\n      }\n    }\n  \n  return f.good();\n  }\n\n\n\ninline\nbool\ndiskio::load_std_string(field<std::string>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::ifstream f( name.c_str() );\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_std_string(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n\n\n\ninline\nbool\ndiskio::load_std_string(field<std::string>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  bool load_okay = true;\n  \n  //\n  // work out the size\n  \n  uword f_n_rows = 0;\n  uword f_n_cols = 0;\n  \n  bool f_n_cols_found = false;\n  \n  std::string line_string;\n  std::string token;\n  \n  while( (f.good() == true) && (load_okay == true) )\n    {\n    std::getline(f, line_string);\n    if(line_string.size() == 0)\n      break;\n    \n    std::stringstream line_stream(line_string);\n    \n    uword line_n_cols = 0;\n    while (line_stream >> token)\n      line_n_cols++;\n    \n    if(f_n_cols_found == false)\n      {\n      f_n_cols = line_n_cols;\n      f_n_cols_found = true;\n      }\n    else\n      {\n      if(line_n_cols != f_n_cols)\n        {\n        load_okay = false;\n        err_msg = \"inconsistent number of columns in \";\n        }\n      }\n    \n    ++f_n_rows;\n    }\n    \n  if(load_okay == true)\n    {\n    f.clear();\n    f.seekg(0, ios::beg);\n    //f.seekg(start);\n    \n    x.set_size(f_n_rows, f_n_cols);\n  \n    for(uword row=0; row < x.n_rows; ++row)\n      {\n      for(uword col=0; col < x.n_cols; ++col)\n        {\n        f >> x.at(row,col);\n        }\n      }\n    }\n  \n  if(f.good() == false)\n    {\n    load_okay = false; \n    }\n  \n  return load_okay;\n  }\n\n\n\n//! Try to load a field by automatically determining its type\ntemplate<typename T1>\ninline\nbool\ndiskio::load_auto_detect(field<T1>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::fstream f;\n  f.open(name.c_str(), std::fstream::in | std::fstream::binary);\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_auto_detect(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n\n\n\n//! Try to load a field by automatically determining its type\ntemplate<typename T1>\ninline\nbool\ndiskio::load_auto_detect(field<T1>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_Mat<T1>::value == false ));\n  \n  static const std::string ARMA_FLD_BIN = \"ARMA_FLD_BIN\";\n  static const std::string ARMA_FL3_BIN = \"ARMA_FL3_BIN\";\n  static const std::string           P6 = \"P6\";\n  \n  podarray<char> raw_header(uword(ARMA_FLD_BIN.length()) + 1);\n  \n  std::streampos pos = f.tellg();\n  \n  f.read( raw_header.memptr(), std::streamsize(ARMA_FLD_BIN.length()) );\n  \n  f.clear();\n  f.seekg(pos);\n  \n  raw_header[uword(ARMA_FLD_BIN.length())] = '\\0';\n  \n  const std::string header = raw_header.mem;\n  \n  if(ARMA_FLD_BIN == header.substr(0, ARMA_FLD_BIN.length()))\n    {\n    return load_arma_binary(x, f, err_msg);\n    }\n  else\n  if(ARMA_FL3_BIN == header.substr(0, ARMA_FL3_BIN.length()))\n    {\n    return load_arma_binary(x, f, err_msg);\n    }\n  else\n  if(P6 == header.substr(0, P6.length()))\n    {\n    return load_ppm_binary(x, f, err_msg);\n    }\n  else\n    {\n    err_msg = \"unsupported header in \";\n    return false;\n    }\n  }\n\n\n\n//\n// handling of PPM images by cubes\n\n\ntemplate<typename eT>\ninline\nbool\ndiskio::load_ppm_binary(Cube<eT>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::fstream f;\n  f.open(name.c_str(), std::fstream::in | std::fstream::binary);\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_ppm_binary(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\ndiskio::load_ppm_binary(Cube<eT>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  bool load_okay = true;\n  \n  std::string f_header;\n  f >> f_header;\n  \n  if(f_header == \"P6\")\n    {\n    uword f_n_rows = 0;\n    uword f_n_cols = 0;\n    int f_maxval = 0;\n  \n    diskio::pnm_skip_comments(f);\n  \n    f >> f_n_cols;\n    diskio::pnm_skip_comments(f);\n  \n    f >> f_n_rows;\n    diskio::pnm_skip_comments(f);\n  \n    f >> f_maxval;\n    f.get();\n    \n    if( (f_maxval > 0) || (f_maxval <= 65535) )\n      {\n      x.set_size(f_n_rows, f_n_cols, 3);\n      \n      if(f_maxval <= 255)\n        {\n        const uword n_elem = 3*f_n_cols*f_n_rows;\n        podarray<u8> tmp(n_elem);\n        \n        f.read( reinterpret_cast<char*>(tmp.memptr()), std::streamsize(n_elem) );\n        \n        uword i = 0;\n        \n        //cout << \"f_n_cols = \" << f_n_cols << endl;\n        //cout << \"f_n_rows = \" << f_n_rows << endl;\n        \n        \n        for(uword row=0; row < f_n_rows; ++row)\n          {\n          for(uword col=0; col < f_n_cols; ++col)\n            {\n            x.at(row,col,0) = eT(tmp[i+0]);\n            x.at(row,col,1) = eT(tmp[i+1]);\n            x.at(row,col,2) = eT(tmp[i+2]);\n            i+=3;\n            }\n          \n          }\n        }\n      else\n        {\n        const uword n_elem = 3*f_n_cols*f_n_rows;\n        podarray<u16> tmp(n_elem);\n        \n        f.read( reinterpret_cast<char *>(tmp.memptr()), std::streamsize(2*n_elem) );\n        \n        uword i = 0;\n        \n        for(uword row=0; row < f_n_rows; ++row)\n          {\n          for(uword col=0; col < f_n_cols; ++col)\n            {\n            x.at(row,col,0) = eT(tmp[i+0]);\n            x.at(row,col,1) = eT(tmp[i+1]);\n            x.at(row,col,2) = eT(tmp[i+2]);\n            i+=3;\n            }\n          \n          }\n        \n        }\n      \n      }\n    else\n      {\n      load_okay = false;\n      err_msg = \"currently no code available to handle loading \";\n      }\n      \n    if(f.good() == false)\n      {\n      load_okay = false;\n      }\n    \n    }\n  else\n    {\n    load_okay = false;\n    err_msg = \"unsupported header in \";\n    }\n  \n  return load_okay;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\ndiskio::save_ppm_binary(const Cube<eT>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n  \n  const std::string tmp_name = diskio::gen_tmp_name(final_name);\n  \n  std::ofstream f( tmp_name.c_str(), std::fstream::binary );\n  \n  bool save_okay = f.is_open();\n  \n  if(save_okay == true)\n    {\n    save_okay = diskio::save_ppm_binary(x, f);\n    \n    f.flush();\n    f.close();\n    \n    if(save_okay == true)\n      {\n      save_okay = diskio::safe_rename(tmp_name, final_name);\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\ndiskio::save_ppm_binary(const Cube<eT>& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (x.n_slices != 3), \"diskio::save_ppm_binary(): given cube must have exactly 3 slices\" );\n  \n  const uword n_elem = 3 * x.n_rows * x.n_cols;\n  podarray<u8> tmp(n_elem);\n  \n  uword i = 0;\n  for(uword row=0; row < x.n_rows; ++row)\n    {\n    for(uword col=0; col < x.n_cols; ++col)\n      {\n      tmp[i+0] = u8( access::tmp_real( x.at(row,col,0) ) );\n      tmp[i+1] = u8( access::tmp_real( x.at(row,col,1) ) );\n      tmp[i+2] = u8( access::tmp_real( x.at(row,col,2) ) );\n      \n      i+=3;\n      }\n    }\n  \n  f << \"P6\" << '\\n';\n  f << x.n_cols << '\\n';\n  f << x.n_rows << '\\n';\n  f << 255 << '\\n';\n  \n  f.write( reinterpret_cast<const char*>(tmp.mem), std::streamsize(n_elem) );\n  \n  return f.good();\n  }\n\n\n\n//\n// handling of PPM images by fields\n\n\n\ntemplate<typename T1>\ninline\nbool\ndiskio::load_ppm_binary(field<T1>& x, const std::string& name, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::fstream f;\n  f.open(name.c_str(), std::fstream::in | std::fstream::binary);\n  \n  bool load_okay = f.is_open();\n  \n  if(load_okay == true)\n    {\n    load_okay = diskio::load_ppm_binary(x, f, err_msg);\n    f.close();\n    }\n  \n  return load_okay;\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\ndiskio::load_ppm_binary(field<T1>& x, std::istream& f, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_Mat<T1>::value == false ));\n  typedef typename T1::elem_type eT;\n  \n  bool load_okay = true;\n  \n  std::string f_header;\n  f >> f_header;\n  \n  if(f_header == \"P6\")\n    {\n    uword f_n_rows = 0;\n    uword f_n_cols = 0;\n    int f_maxval = 0;\n  \n    diskio::pnm_skip_comments(f);\n  \n    f >> f_n_cols;\n    diskio::pnm_skip_comments(f);\n  \n    f >> f_n_rows;\n    diskio::pnm_skip_comments(f);\n  \n    f >> f_maxval;\n    f.get();\n    \n    if( (f_maxval > 0) || (f_maxval <= 65535) )\n      {\n      x.set_size(3);\n      Mat<eT>& R = x(0);\n      Mat<eT>& G = x(1);\n      Mat<eT>& B = x(2);\n      \n      R.set_size(f_n_rows,f_n_cols);\n      G.set_size(f_n_rows,f_n_cols);\n      B.set_size(f_n_rows,f_n_cols);\n      \n      if(f_maxval <= 255)\n        {\n        const uword n_elem = 3*f_n_cols*f_n_rows;\n        podarray<u8> tmp(n_elem);\n        \n        f.read( reinterpret_cast<char*>(tmp.memptr()), std::streamsize(n_elem) );\n        \n        uword i = 0;\n        \n        //cout << \"f_n_cols = \" << f_n_cols << endl;\n        //cout << \"f_n_rows = \" << f_n_rows << endl;\n        \n        \n        for(uword row=0; row < f_n_rows; ++row)\n          {\n          for(uword col=0; col < f_n_cols; ++col)\n            {\n            R.at(row,col) = eT(tmp[i+0]);\n            G.at(row,col) = eT(tmp[i+1]);\n            B.at(row,col) = eT(tmp[i+2]);\n            i+=3;\n            }\n          \n          }\n        }\n      else\n        {\n        const uword n_elem = 3*f_n_cols*f_n_rows;\n        podarray<u16> tmp(n_elem);\n        \n        f.read( reinterpret_cast<char *>(tmp.memptr()), std::streamsize(2*n_elem) );\n        \n        uword i = 0;\n        \n        for(uword row=0; row < f_n_rows; ++row)\n          {\n          for(uword col=0; col < f_n_cols; ++col)\n            {\n            R.at(row,col) = eT(tmp[i+0]);\n            G.at(row,col) = eT(tmp[i+1]);\n            B.at(row,col) = eT(tmp[i+2]);\n            i+=3;\n            }\n          \n          }\n        \n        }\n      \n      }\n    else\n      {\n      load_okay = false;\n      err_msg = \"currently no code available to handle loading \";\n      }\n    \n    if(f.good() == false)\n      {\n      load_okay = false;\n      }\n    \n    }\n  else\n    {\n    load_okay = false;\n    err_msg = \"unsupported header in \";\n    }\n  \n  return load_okay;\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\ndiskio::save_ppm_binary(const field<T1>& x, const std::string& final_name)\n  {\n  arma_extra_debug_sigprint();\n  \n  const std::string tmp_name = diskio::gen_tmp_name(final_name);\n  std::ofstream f( tmp_name.c_str(), std::fstream::binary );\n  \n  bool save_okay = f.is_open();\n  \n  if(save_okay == true)\n    {\n    save_okay = diskio::save_ppm_binary(x, f);\n    \n    f.flush();\n    f.close();\n    \n    if(save_okay == true)\n      {\n      save_okay = diskio::safe_rename(tmp_name, final_name);\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\ndiskio::save_ppm_binary(const field<T1>& x, std::ostream& f)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_type_check(( is_Mat<T1>::value == false ));\n  \n  typedef typename T1::elem_type eT;\n  \n  arma_debug_check( (x.n_elem != 3), \"diskio::save_ppm_binary(): given field must have exactly 3 matrices of equal size\" );\n  \n  bool same_size = true;\n  for(uword i=1; i<3; ++i)\n    {\n    if( (x(0).n_rows != x(i).n_rows) || (x(0).n_cols != x(i).n_cols) )\n      {\n      same_size = false;\n      break;\n      }\n    }\n  \n  arma_debug_check( (same_size != true), \"diskio::save_ppm_binary(): given field must have exactly 3 matrices of equal size\" );\n  \n  const Mat<eT>& R = x(0);\n  const Mat<eT>& G = x(1);\n  const Mat<eT>& B = x(2);\n  \n  f << \"P6\" << '\\n';\n  f << R.n_cols << '\\n';\n  f << R.n_rows << '\\n';\n  f << 255 << '\\n';\n\n  const uword n_elem = 3 * R.n_rows * R.n_cols;\n  podarray<u8> tmp(n_elem);\n\n  uword i = 0;\n  for(uword row=0; row < R.n_rows; ++row)\n    {\n    for(uword col=0; col < R.n_cols; ++col)\n      {\n      tmp[i+0] = u8( access::tmp_real( R.at(row,col) ) );\n      tmp[i+1] = u8( access::tmp_real( G.at(row,col) ) );\n      tmp[i+2] = u8( access::tmp_real( B.at(row,col) ) );\n      \n      i+=3;\n      }\n    }\n  \n  f.write( reinterpret_cast<const char*>(tmp.mem), std::streamsize(n_elem) );\n  \n  return f.good();\n  }\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/distr_param.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup distr_param\n//! @{\n\n\n\nclass distr_param\n  {\n  public:\n  \n  uword state;\n  \n  union\n    {\n    int    a_int;\n    double a_double;\n    };\n  \n  union\n    {\n    int    b_int;\n    double b_double;\n    };\n  \n  \n  inline distr_param()\n    : state(0)\n    {\n    }\n  \n  \n  inline explicit distr_param(const int a, const int b)\n    : state(1)\n    , a_int(a)\n    , b_int(b)\n    {\n    }\n  \n  \n  inline explicit distr_param(const double a, const double b)\n    : state(2)\n    , a_double(a)\n    , b_double(b)\n    {\n    }\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/eGlueCube_bones.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup eGlueCube\n//! @{\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\nclass eGlueCube : public BaseCube<typename T1::elem_type, eGlueCube<T1, T2, eglue_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool prefer_at_accessor = (ProxyCube<T1>::prefer_at_accessor || ProxyCube<T2>::prefer_at_accessor);\n  static const bool has_subview        = (ProxyCube<T1>::has_subview        || ProxyCube<T2>::has_subview       );\n  \n  arma_aligned const ProxyCube<T1> P1;\n  arma_aligned const ProxyCube<T2> P2;\n  \n  arma_inline ~eGlueCube();\n  arma_inline  eGlueCube(const T1& in_A, const T2& in_B);\n  \n  arma_inline uword get_n_rows()       const;\n  arma_inline uword get_n_cols()       const;\n  arma_inline uword get_n_elem_slice() const;\n  arma_inline uword get_n_slices()     const;\n  arma_inline uword get_n_elem()       const;\n  \n  arma_inline elem_type operator[] (const uword i)                                       const;\n  arma_inline elem_type at         (const uword row, const uword col, const uword slice) const;\n  arma_inline elem_type at_alt     (const uword i)                                       const;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/eGlueCube_meat.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup eGlueCube\n//! @{\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\neGlueCube<T1,T2,eglue_type>::~eGlueCube()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\neGlueCube<T1,T2,eglue_type>::eGlueCube(const T1& in_A, const T2& in_B)\n  : P1(in_A)\n  , P2(in_B)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size\n    (\n    P1.get_n_rows(), P1.get_n_cols(), P1.get_n_slices(),\n    P2.get_n_rows(), P2.get_n_cols(), P2.get_n_slices(), \n    eglue_type::text()\n    );\n  }\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\nuword\neGlueCube<T1,T2,eglue_type>::get_n_rows() const\n  {\n  return P1.get_n_rows();\n  }\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\nuword\neGlueCube<T1,T2,eglue_type>::get_n_cols() const\n  {\n  return P1.get_n_cols();\n  }\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\nuword\neGlueCube<T1,T2,eglue_type>::get_n_slices() const\n  {\n  return P1.get_n_slices();\n  }\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\nuword\neGlueCube<T1,T2,eglue_type>::get_n_elem_slice() const\n  {\n  return P1.get_n_elem_slice();\n  }\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\nuword\neGlueCube<T1,T2,eglue_type>::get_n_elem() const\n  {\n  return P1.get_n_elem();\n  }\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\ntypename T1::elem_type\neGlueCube<T1,T2,eglue_type>::operator[] (const uword i) const\n  {\n  // the optimiser will keep only one return statement\n  \n  typedef typename T1::elem_type eT;\n  \n       if(is_same_type<eglue_type, eglue_plus >::yes) { return P1[i] + P2[i]; }\n  else if(is_same_type<eglue_type, eglue_minus>::yes) { return P1[i] - P2[i]; }\n  else if(is_same_type<eglue_type, eglue_div  >::yes) { return P1[i] / P2[i]; }\n  else if(is_same_type<eglue_type, eglue_schur>::yes) { return P1[i] * P2[i]; }\n  else return eT(0);\n  }\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\ntypename T1::elem_type\neGlueCube<T1,T2,eglue_type>::at(const uword row, const uword col, const uword slice) const\n  {\n  // the optimiser will keep only one return statement\n  \n  typedef typename T1::elem_type eT;\n  \n       if(is_same_type<eglue_type, eglue_plus >::yes) { return P1.at(row,col,slice) + P2.at(row,col,slice); }\n  else if(is_same_type<eglue_type, eglue_minus>::yes) { return P1.at(row,col,slice) - P2.at(row,col,slice); }\n  else if(is_same_type<eglue_type, eglue_div  >::yes) { return P1.at(row,col,slice) / P2.at(row,col,slice); }\n  else if(is_same_type<eglue_type, eglue_schur>::yes) { return P1.at(row,col,slice) * P2.at(row,col,slice); }\n  else return eT(0);\n  }\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\ntypename T1::elem_type\neGlueCube<T1,T2,eglue_type>::at_alt(const uword i) const\n  {\n  // the optimiser will keep only one return statement\n  \n  typedef typename T1::elem_type eT;\n  \n       if(is_same_type<eglue_type, eglue_plus >::yes) { return P1.at_alt(i) + P2.at_alt(i); }\n  else if(is_same_type<eglue_type, eglue_minus>::yes) { return P1.at_alt(i) - P2.at_alt(i); }\n  else if(is_same_type<eglue_type, eglue_div  >::yes) { return P1.at_alt(i) / P2.at_alt(i); }\n  else if(is_same_type<eglue_type, eglue_schur>::yes) { return P1.at_alt(i) * P2.at_alt(i); }\n  else return eT(0);\n  }\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/eGlue_bones.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup eGlue\n//! @{\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\nclass eGlue : public Base<typename T1::elem_type, eGlue<T1, T2, eglue_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef          Proxy<T1>                       proxy1_type;\n  typedef          Proxy<T2>                       proxy2_type;\n  \n  static const bool prefer_at_accessor = (Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor);\n  static const bool has_subview        = (Proxy<T1>::has_subview        || Proxy<T2>::has_subview       );\n  static const bool fake_mat           = (Proxy<T1>::fake_mat           || Proxy<T2>::fake_mat          );\n  \n  static const bool is_col = (Proxy<T1>::is_col || Proxy<T2>::is_col);\n  static const bool is_row = (Proxy<T1>::is_row || Proxy<T2>::is_row);\n  \n  arma_aligned const Proxy<T1> P1;\n  arma_aligned const Proxy<T2> P2;\n  \n  arma_inline ~eGlue();\n  arma_inline  eGlue(const T1& in_A, const T2& in_B);\n  \n  arma_inline uword get_n_rows() const;\n  arma_inline uword get_n_cols() const;\n  arma_inline uword get_n_elem() const;\n  \n  arma_inline elem_type operator[] (const uword ii)                   const;\n  arma_inline elem_type at         (const uword row, const uword col) const;\n  arma_inline elem_type at_alt     (const uword ii)                   const;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/eGlue_meat.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup eGlue\n//! @{\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\neGlue<T1,T2,eglue_type>::~eGlue()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\neGlue<T1,T2,eglue_type>::eGlue(const T1& in_A, const T2& in_B)\n  : P1(in_A)\n  , P2(in_B)\n  {\n  arma_extra_debug_sigprint();\n  \n  // arma_debug_assert_same_size( P1, P2, eglue_type::text() );\n  arma_debug_assert_same_size\n    (\n    P1.get_n_rows(), P1.get_n_cols(),\n    P2.get_n_rows(), P2.get_n_cols(),\n    eglue_type::text()\n    );\n  }\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\nuword\neGlue<T1,T2,eglue_type>::get_n_rows() const\n  {\n  return is_row ? 1 : P1.get_n_rows();\n  }\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\nuword\neGlue<T1,T2,eglue_type>::get_n_cols() const\n  {\n  return is_col ? 1 : P1.get_n_cols();\n  }\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\nuword\neGlue<T1,T2,eglue_type>::get_n_elem() const\n  {\n  return P1.get_n_elem();\n  }\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\ntypename T1::elem_type\neGlue<T1,T2,eglue_type>::operator[] (const uword ii) const\n  {\n  // the optimiser will keep only one return statement\n  \n  typedef typename T1::elem_type eT;\n  \n       if(is_same_type<eglue_type, eglue_plus >::yes) { return P1[ii] + P2[ii]; }\n  else if(is_same_type<eglue_type, eglue_minus>::yes) { return P1[ii] - P2[ii]; }\n  else if(is_same_type<eglue_type, eglue_div  >::yes) { return P1[ii] / P2[ii]; }\n  else if(is_same_type<eglue_type, eglue_schur>::yes) { return P1[ii] * P2[ii]; }\n  else return eT(0);\n  }\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\ntypename T1::elem_type\neGlue<T1,T2,eglue_type>::at(const uword row, const uword col) const\n  {\n  // the optimiser will keep only one return statement\n  \n  typedef typename T1::elem_type eT;\n  \n       if(is_same_type<eglue_type, eglue_plus >::yes) { return P1.at(row,col) + P2.at(row,col); }\n  else if(is_same_type<eglue_type, eglue_minus>::yes) { return P1.at(row,col) - P2.at(row,col); }\n  else if(is_same_type<eglue_type, eglue_div  >::yes) { return P1.at(row,col) / P2.at(row,col); }\n  else if(is_same_type<eglue_type, eglue_schur>::yes) { return P1.at(row,col) * P2.at(row,col); }\n  else return eT(0);\n  }\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\narma_inline\ntypename T1::elem_type\neGlue<T1,T2,eglue_type>::at_alt(const uword ii) const\n  {\n  // the optimiser will keep only one return statement\n  \n  typedef typename T1::elem_type eT;\n  \n       if(is_same_type<eglue_type, eglue_plus >::yes) { return P1.at_alt(ii) + P2.at_alt(ii); }\n  else if(is_same_type<eglue_type, eglue_minus>::yes) { return P1.at_alt(ii) - P2.at_alt(ii); }\n  else if(is_same_type<eglue_type, eglue_div  >::yes) { return P1.at_alt(ii) / P2.at_alt(ii); }\n  else if(is_same_type<eglue_type, eglue_schur>::yes) { return P1.at_alt(ii) * P2.at_alt(ii); }\n  else return eT(0);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/eOpCube_bones.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup eOpCube\n//! @{\n\n\n\ntemplate<typename T1, typename eop_type>\nclass eOpCube : public BaseCube<typename T1::elem_type, eOpCube<T1, eop_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool prefer_at_accessor = ProxyCube<T1>::prefer_at_accessor;\n  static const bool has_subview        = ProxyCube<T1>::has_subview;\n  \n  arma_aligned const ProxyCube<T1> P;\n  arma_aligned       elem_type     aux;          //!< storage of auxiliary data, user defined format\n  arma_aligned       uword         aux_uword_a;  //!< storage of auxiliary data, uword format\n  arma_aligned       uword         aux_uword_b;  //!< storage of auxiliary data, uword format\n  arma_aligned       uword         aux_uword_c;  //!< storage of auxiliary data, uword format\n  \n  inline         ~eOpCube();\n  inline explicit eOpCube(const BaseCube<typename T1::elem_type, T1>& in_m);\n  inline          eOpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const elem_type in_aux);\n  inline          eOpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b);\n  inline          eOpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c);\n  inline          eOpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c);\n  \n  arma_inline uword get_n_rows()       const;\n  arma_inline uword get_n_cols()       const;\n  arma_inline uword get_n_elem_slice() const;\n  arma_inline uword get_n_slices()     const;\n  arma_inline uword get_n_elem()       const;\n  \n  arma_inline elem_type operator[] (const uword i)                                       const;\n  arma_inline elem_type at         (const uword row, const uword col, const uword slice) const;\n  arma_inline elem_type at_alt     (const uword i)                                       const;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/eOpCube_meat.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup eOpCube\n//! @{\n\n\n\ntemplate<typename T1, typename eop_type>\neOpCube<T1, eop_type>::eOpCube(const BaseCube<typename T1::elem_type, T1>& in_m)\n  : P (in_m.get_ref())\n  {\n  arma_extra_debug_sigprint();\n  }\n  \n\n\ntemplate<typename T1, typename eop_type>\neOpCube<T1, eop_type>::eOpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const typename T1::elem_type in_aux)\n  : P   (in_m.get_ref())\n  , aux (in_aux)\n  {\n  arma_extra_debug_sigprint();\n  }\n  \n\n\ntemplate<typename T1, typename eop_type>\neOpCube<T1, eop_type>::eOpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b)\n  : P           (in_m.get_ref())\n  , aux_uword_a (in_aux_uword_a)\n  , aux_uword_b (in_aux_uword_b)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\neOpCube<T1, eop_type>::eOpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c)\n  : P           (in_m.get_ref())\n  , aux_uword_a (in_aux_uword_a)\n  , aux_uword_b (in_aux_uword_b)\n  , aux_uword_c (in_aux_uword_c)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\neOpCube<T1, eop_type>::eOpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const typename T1::elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c)\n  : P           (in_m.get_ref())\n  , aux         (in_aux)\n  , aux_uword_a (in_aux_uword_a)\n  , aux_uword_b (in_aux_uword_b)\n  , aux_uword_c (in_aux_uword_c)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\neOpCube<T1, eop_type>::~eOpCube()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\narma_inline\nuword\neOpCube<T1, eop_type>::get_n_rows() const\n  {\n  return P.get_n_rows();\n  }\n  \n\n\ntemplate<typename T1, typename eop_type>\narma_inline\nuword\neOpCube<T1, eop_type>::get_n_cols() const\n  {\n  return P.get_n_cols();\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\narma_inline\nuword\neOpCube<T1, eop_type>::get_n_elem_slice() const\n  {\n  return P.get_n_elem_slice();\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\narma_inline\nuword\neOpCube<T1, eop_type>::get_n_slices() const\n  {\n  return P.get_n_slices();\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\narma_inline\nuword\neOpCube<T1, eop_type>::get_n_elem() const\n  {\n  return P.get_n_elem();\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\narma_inline\ntypename T1::elem_type\neOpCube<T1, eop_type>::operator[] (const uword i) const\n  {\n  return eop_core<eop_type>::process(P[i], aux);\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\narma_inline\ntypename T1::elem_type\neOpCube<T1, eop_type>::at(const uword row, const uword col, const uword slice) const\n  {\n  return eop_core<eop_type>::process(P.at(row, col, slice), aux);\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\narma_inline\ntypename T1::elem_type\neOpCube<T1, eop_type>::at_alt(const uword i) const\n  {\n  return eop_core<eop_type>::process(P.at_alt(i), aux);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/eOp_bones.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup eOp\n//! @{\n\n\n\ntemplate<typename T1, typename eop_type>\nclass eOp : public Base<typename T1::elem_type, eOp<T1, eop_type> >\n  {\n  public:\n  \n  typedef typename T1::elem_type                   elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  typedef          Proxy<T1>                       proxy_type;\n  \n  static const bool prefer_at_accessor = Proxy<T1>::prefer_at_accessor;\n  static const bool has_subview        = Proxy<T1>::has_subview;\n  static const bool fake_mat           = Proxy<T1>::fake_mat;\n  \n  static const bool is_row = Proxy<T1>::is_row;\n  static const bool is_col = Proxy<T1>::is_col;\n  \n  arma_aligned const Proxy<T1> P;\n  \n  arma_aligned       elem_type aux;          //!< storage of auxiliary data, user defined format\n  arma_aligned       uword     aux_uword_a;  //!< storage of auxiliary data, uword format\n  arma_aligned       uword     aux_uword_b;  //!< storage of auxiliary data, uword format\n  \n  inline         ~eOp();\n  inline explicit eOp(const T1& in_m);\n  inline          eOp(const T1& in_m, const elem_type in_aux);\n  inline          eOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b);\n  inline          eOp(const T1& in_m, const elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b);\n  \n  arma_inline uword get_n_rows() const;\n  arma_inline uword get_n_cols() const;\n  arma_inline uword get_n_elem() const;\n  \n  arma_inline elem_type operator[] (const uword ii)                   const;\n  arma_inline elem_type at         (const uword row, const uword col) const;\n  arma_inline elem_type at_alt     (const uword ii)                   const;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/eOp_meat.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup eOp\n//! @{\n\n\n\ntemplate<typename T1, typename eop_type>\neOp<T1, eop_type>::eOp(const T1& in_m)\n  : P(in_m)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\neOp<T1, eop_type>::eOp(const T1& in_m, const typename T1::elem_type in_aux)\n  : P(in_m)\n  , aux(in_aux)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\neOp<T1, eop_type>::eOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b)\n  : P(in_m)\n  , aux_uword_a(in_aux_uword_a)\n  , aux_uword_b(in_aux_uword_b)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\neOp<T1, eop_type>::eOp(const T1& in_m, const typename T1::elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b)\n  : P(in_m)\n  , aux(in_aux)\n  , aux_uword_a(in_aux_uword_a)\n  , aux_uword_b(in_aux_uword_b)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\neOp<T1, eop_type>::~eOp()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n  \n\ntemplate<typename T1, typename eop_type>\narma_inline\nuword\neOp<T1, eop_type>::get_n_rows() const\n  {\n  return is_row ? 1 : P.get_n_rows();\n  }\n  \n\n\ntemplate<typename T1, typename eop_type>\narma_inline\nuword\neOp<T1, eop_type>::get_n_cols() const\n  {\n  return is_col ? 1 : P.get_n_cols();\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\narma_inline\nuword\neOp<T1, eop_type>::get_n_elem() const\n  {\n  return P.get_n_elem();\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\narma_inline\ntypename T1::elem_type\neOp<T1, eop_type>::operator[] (const uword ii) const\n  {\n  return eop_core<eop_type>::process(P[ii], aux);\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\narma_inline\ntypename T1::elem_type\neOp<T1, eop_type>::at(const uword row, const uword col) const\n  {\n  if(is_row)\n    {\n    return eop_core<eop_type>::process(P.at(0, col), aux);\n    }\n  else\n  if(is_col)\n    {\n    return eop_core<eop_type>::process(P.at(row, 0), aux);\n    }\n  else\n    {\n    return eop_core<eop_type>::process(P.at(row, col), aux);\n    }\n  }\n\n\n\ntemplate<typename T1, typename eop_type>\narma_inline\ntypename T1::elem_type\neOp<T1, eop_type>::at_alt(const uword ii) const\n  {\n  return eop_core<eop_type>::process(P.at_alt(ii), aux);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/eglue_core_bones.hpp",
    "content": "// Copyright (C) 2010-2015 Conrad Sanderson\n// Copyright (C) 2010-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup eglue_core\n//! @{\n\n\n\ntemplate<typename eglue_type>\nstruct eglue_core\n  {\n  \n  // matrices\n  \n  template<typename outT, typename T1, typename T2> arma_hot inline static void apply(outT& out, const eGlue<T1, T2, eglue_type>& x);\n  \n  template<typename T1, typename T2> arma_hot inline static void apply_inplace_plus (Mat<typename T1::elem_type>& out, const eGlue<T1, T2, eglue_type>& x);\n  template<typename T1, typename T2> arma_hot inline static void apply_inplace_minus(Mat<typename T1::elem_type>& out, const eGlue<T1, T2, eglue_type>& x);\n  template<typename T1, typename T2> arma_hot inline static void apply_inplace_schur(Mat<typename T1::elem_type>& out, const eGlue<T1, T2, eglue_type>& x);\n  template<typename T1, typename T2> arma_hot inline static void apply_inplace_div  (Mat<typename T1::elem_type>& out, const eGlue<T1, T2, eglue_type>& x);\n  \n  \n  // cubes\n  \n  template<typename T1, typename T2> arma_hot inline static void apply(Cube<typename T1::elem_type>& out, const eGlueCube<T1, T2, eglue_type>& x);\n  \n  template<typename T1, typename T2> arma_hot inline static void apply_inplace_plus (Cube<typename T1::elem_type>& out, const eGlueCube<T1, T2, eglue_type>& x);\n  template<typename T1, typename T2> arma_hot inline static void apply_inplace_minus(Cube<typename T1::elem_type>& out, const eGlueCube<T1, T2, eglue_type>& x);\n  template<typename T1, typename T2> arma_hot inline static void apply_inplace_schur(Cube<typename T1::elem_type>& out, const eGlueCube<T1, T2, eglue_type>& x);\n  template<typename T1, typename T2> arma_hot inline static void apply_inplace_div  (Cube<typename T1::elem_type>& out, const eGlueCube<T1, T2, eglue_type>& x);\n  };\n\n\n\nclass eglue_plus : public eglue_core<eglue_plus>\n  {\n  public:\n  \n  inline static const char* text() { return \"addition\"; }\n  };\n\n\n\nclass eglue_minus : public eglue_core<eglue_minus>\n  {\n  public:\n  \n  inline static const char* text() { return \"subtraction\"; }\n  };\n\n\n\nclass eglue_div : public eglue_core<eglue_div>\n  {\n  public:\n  \n  inline static const char* text() { return \"element-wise division\"; }\n  };\n\n\n\nclass eglue_schur : public eglue_core<eglue_schur>\n  {\n  public:\n  \n  inline static const char* text() { return \"element-wise multiplication\"; }\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/eglue_core_meat.hpp",
    "content": "// Copyright (C) 2010-2015 Conrad Sanderson\n// Copyright (C) 2010-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup eglue_core\n//! @{\n\n\n\n#undef arma_applier_1u\n#undef arma_applier_1a\n#undef arma_applier_2\n#undef arma_applier_3\n#undef operatorA\n#undef operatorB\n\n\n#if defined(ARMA_SIMPLE_LOOPS)\n  #define arma_applier_1u(operatorA, operatorB) \\\n    {\\\n    for(uword i=0; i<n_elem; ++i)\\\n      {\\\n      out_mem[i] operatorA P1[i] operatorB P2[i];\\\n      }\\\n    }\n#else\n  #define arma_applier_1u(operatorA, operatorB) \\\n    {\\\n    uword i,j;\\\n    \\\n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\\\n      {\\\n      eT tmp_i = P1[i];\\\n      eT tmp_j = P1[j];\\\n      \\\n      tmp_i operatorB##= P2[i];\\\n      tmp_j operatorB##= P2[j];\\\n      \\\n      out_mem[i] operatorA tmp_i;\\\n      out_mem[j] operatorA tmp_j;\\\n      }\\\n    \\\n    if(i < n_elem)\\\n      {\\\n      out_mem[i] operatorA P1[i] operatorB P2[i];\\\n      }\\\n    }\n#endif\n\n\n#if defined(ARMA_SIMPLE_LOOPS)\n  #define arma_applier_1a(operatorA, operatorB) \\\n    {\\\n    for(uword i=0; i<n_elem; ++i)\\\n      {\\\n      out_mem[i] operatorA P1.at_alt(i) operatorB P2.at_alt(i);\\\n      }\\\n    }\n#else\n  #define arma_applier_1a(operatorA, operatorB) \\\n    {\\\n    uword i,j;\\\n    \\\n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\\\n      {\\\n      eT tmp_i = P1.at_alt(i);\\\n      eT tmp_j = P1.at_alt(j);\\\n      \\\n      tmp_i operatorB##= P2.at_alt(i);\\\n      tmp_j operatorB##= P2.at_alt(j);\\\n      \\\n      out_mem[i] operatorA tmp_i;\\\n      out_mem[j] operatorA tmp_j;\\\n      }\\\n    \\\n    if(i < n_elem)\\\n      {\\\n      out_mem[i] operatorA P1.at_alt(i) operatorB P2.at_alt(i);\\\n      }\\\n    }\n#endif\n\n\n#define arma_applier_2(operatorA, operatorB) \\\n  {\\\n  if(n_rows != 1)\\\n    {\\\n    for(uword col=0; col<n_cols; ++col)\\\n      {\\\n      uword i,j;\\\n      \\\n      for(i=0, j=1; j<n_rows; i+=2, j+=2)\\\n        {\\\n        eT tmp_i = P1.at(i,col);\\\n        eT tmp_j = P1.at(j,col);\\\n        \\\n        tmp_i operatorB##= P2.at(i,col);\\\n        tmp_j operatorB##= P2.at(j,col);\\\n        \\\n        *out_mem operatorA tmp_i; out_mem++; \\\n        *out_mem operatorA tmp_j; out_mem++; \\\n        }\\\n      \\\n      if(i < n_rows)\\\n        {\\\n        *out_mem operatorA P1.at(i,col) operatorB P2.at(i,col); out_mem++; \\\n        }\\\n      }\\\n    }\\\n  else\\\n    {\\\n    uword i,j;\\\n    for(i=0, j=1; j < n_cols; i+=2, j+=2)\\\n      {\\\n      eT tmp_i = P1.at(0,i);\\\n      eT tmp_j = P1.at(0,j);\\\n      \\\n      tmp_i operatorB##= P2.at(0,i);\\\n      tmp_j operatorB##= P2.at(0,j);\\\n      \\\n      out_mem[i] operatorA tmp_i;\\\n      out_mem[j] operatorA tmp_j;\\\n      }\\\n    \\\n    if(i < n_cols)\\\n      {\\\n      out_mem[i] operatorA P1.at(0,i) operatorB P2.at(0,i);\\\n      }\\\n    }\\\n  }\n\n\n\n#define arma_applier_3(operatorA, operatorB) \\\n  {\\\n  for(uword slice=0; slice<n_slices; ++slice)\\\n    {\\\n    for(uword col=0; col<n_cols; ++col)\\\n      {\\\n      uword i,j;\\\n      \\\n      for(i=0, j=1; j<n_rows; i+=2, j+=2)\\\n        {\\\n        eT tmp_i = P1.at(i,col,slice);\\\n        eT tmp_j = P1.at(j,col,slice);\\\n        \\\n        tmp_i operatorB##= P2.at(i,col,slice);\\\n        tmp_j operatorB##= P2.at(j,col,slice);\\\n        \\\n        *out_mem operatorA tmp_i; out_mem++; \\\n        *out_mem operatorA tmp_j; out_mem++; \\\n        }\\\n      \\\n      if(i < n_rows)\\\n        {\\\n        *out_mem operatorA P1.at(i,col,slice) operatorB P2.at(i,col,slice); out_mem++; \\\n        }\\\n      }\\\n    }\\\n  }\n\n\n\n//\n// matrices\n\n\n\ntemplate<typename eglue_type>\ntemplate<typename outT, typename T1, typename T2>\narma_hot\ninline\nvoid\neglue_core<eglue_type>::apply(outT& out, const eGlue<T1, T2, eglue_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const bool prefer_at_accessor = (Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor);\n  \n  // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing;\n  // size setting and alias checking is done by either the Mat contructor or operator=()\n  \n  \n  eT* out_mem = out.memptr();\n  \n  if(prefer_at_accessor == false)\n    {\n    const uword n_elem = x.get_n_elem();\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P1.is_aligned() && x.P2.is_aligned())\n        {\n        typename Proxy<T1>::aligned_ea_type P1 = x.P1.get_aligned_ea();\n        typename Proxy<T2>::aligned_ea_type P2 = x.P2.get_aligned_ea();\n        \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1a(=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1a(=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1a(=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1a(=, *); }\n        }\n      else\n        {\n        typename Proxy<T1>::ea_type P1 = x.P1.get_ea();\n        typename Proxy<T2>::ea_type P2 = x.P2.get_ea();\n        \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(=, *); }\n        }\n      }\n    else\n      {\n      typename Proxy<T1>::ea_type P1 = x.P1.get_ea();\n      typename Proxy<T2>::ea_type P2 = x.P2.get_ea();\n    \n           if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(=, +); }\n      else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(=, -); }\n      else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(=, /); }\n      else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(=, *); }\n      }\n    }\n  else\n    {\n    const uword n_rows = x.get_n_rows();\n    const uword n_cols = x.get_n_cols();\n    \n    const Proxy<T1>& P1 = x.P1;\n    const Proxy<T2>& P2 = x.P2;\n    \n         if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_2(=, +); }\n    else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_2(=, -); }\n    else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_2(=, /); }\n    else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_2(=, *); }\n    }\n  }\n\n\n\ntemplate<typename eglue_type>\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\neglue_core<eglue_type>::apply_inplace_plus(Mat<typename T1::elem_type>& out, const eGlue<T1, T2, eglue_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_rows = x.get_n_rows();\n  const uword n_cols = x.get_n_cols();\n    \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, \"addition\");\n  \n  typedef typename T1::elem_type eT;\n  \n  eT* out_mem = out.memptr();\n  \n  const bool prefer_at_accessor = (Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    const uword n_elem = x.get_n_elem();\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P1.is_aligned() && x.P2.is_aligned())\n        {\n        typename Proxy<T1>::aligned_ea_type P1 = x.P1.get_aligned_ea();\n        typename Proxy<T2>::aligned_ea_type P2 = x.P2.get_aligned_ea();\n        \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1a(+=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1a(+=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1a(+=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1a(+=, *); }\n        }\n      else\n        {\n        typename Proxy<T1>::ea_type P1 = x.P1.get_ea();\n        typename Proxy<T2>::ea_type P2 = x.P2.get_ea();\n    \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(+=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(+=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(+=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(+=, *); }\n        }\n      }\n    else\n      {\n      typename Proxy<T1>::ea_type P1 = x.P1.get_ea();\n      typename Proxy<T2>::ea_type P2 = x.P2.get_ea();\n    \n           if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(+=, +); }\n      else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(+=, -); }\n      else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(+=, /); }\n      else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(+=, *); }\n      }\n    }\n  else\n    {\n    const Proxy<T1>& P1 = x.P1;\n    const Proxy<T2>& P2 = x.P2;\n    \n         if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_2(+=, +); }\n    else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_2(+=, -); }\n    else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_2(+=, /); }\n    else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_2(+=, *); }\n    }\n  }\n\n\n\ntemplate<typename eglue_type>\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\neglue_core<eglue_type>::apply_inplace_minus(Mat<typename T1::elem_type>& out, const eGlue<T1, T2, eglue_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_rows = x.get_n_rows();\n  const uword n_cols = x.get_n_cols();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, \"subtraction\");\n  \n  typedef typename T1::elem_type eT;\n  \n  eT* out_mem = out.memptr();\n  \n  const bool prefer_at_accessor = (Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    const uword n_elem = x.get_n_elem();\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P1.is_aligned() && x.P2.is_aligned())\n        {\n        typename Proxy<T1>::aligned_ea_type P1 = x.P1.get_aligned_ea();\n        typename Proxy<T2>::aligned_ea_type P2 = x.P2.get_aligned_ea();\n        \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1a(-=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1a(-=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1a(-=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1a(-=, *); }\n        }\n      else\n        {\n        typename Proxy<T1>::ea_type P1 = x.P1.get_ea();\n        typename Proxy<T2>::ea_type P2 = x.P2.get_ea();\n    \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(-=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(-=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(-=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(-=, *); }\n        }\n      }\n    else\n      {\n      typename Proxy<T1>::ea_type P1 = x.P1.get_ea();\n      typename Proxy<T2>::ea_type P2 = x.P2.get_ea();\n    \n           if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(-=, +); }\n      else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(-=, -); }\n      else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(-=, /); }\n      else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(-=, *); }\n      }\n    }\n  else\n    {\n    const Proxy<T1>& P1 = x.P1;\n    const Proxy<T2>& P2 = x.P2;\n    \n         if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_2(-=, +); }\n    else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_2(-=, -); }\n    else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_2(-=, /); }\n    else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_2(-=, *); }\n    }\n  }\n\n\n\ntemplate<typename eglue_type>\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\neglue_core<eglue_type>::apply_inplace_schur(Mat<typename T1::elem_type>& out, const eGlue<T1, T2, eglue_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_rows = x.get_n_rows();\n  const uword n_cols = x.get_n_cols();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, \"element-wise multiplication\");\n  \n  typedef typename T1::elem_type eT;\n  \n  eT* out_mem = out.memptr();\n  \n  const bool prefer_at_accessor = (Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    const uword n_elem = x.get_n_elem();\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P1.is_aligned() && x.P2.is_aligned())\n        {\n        typename Proxy<T1>::aligned_ea_type P1 = x.P1.get_aligned_ea();\n        typename Proxy<T2>::aligned_ea_type P2 = x.P2.get_aligned_ea();\n        \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1a(*=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1a(*=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1a(*=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1a(*=, *); }\n        }\n      else\n        {\n        typename Proxy<T1>::ea_type P1 = x.P1.get_ea();\n        typename Proxy<T2>::ea_type P2 = x.P2.get_ea();\n    \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(*=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(*=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(*=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(*=, *); }\n        }\n      }\n    else\n      {\n      typename Proxy<T1>::ea_type P1 = x.P1.get_ea();\n      typename Proxy<T2>::ea_type P2 = x.P2.get_ea();\n    \n           if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(*=, +); }\n      else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(*=, -); }\n      else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(*=, /); }\n      else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(*=, *); }\n      }\n    }\n  else\n    {\n    const Proxy<T1>& P1 = x.P1;\n    const Proxy<T2>& P2 = x.P2;\n    \n         if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_2(*=, +); }\n    else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_2(*=, -); }\n    else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_2(*=, /); }\n    else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_2(*=, *); }\n    }\n  }\n\n\n\ntemplate<typename eglue_type>\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\neglue_core<eglue_type>::apply_inplace_div(Mat<typename T1::elem_type>& out, const eGlue<T1, T2, eglue_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_rows = x.get_n_rows();\n  const uword n_cols = x.get_n_cols();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, \"element-wise division\");\n  \n  typedef typename T1::elem_type eT;\n  \n  eT* out_mem = out.memptr();\n  \n  const bool prefer_at_accessor = (Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    const uword n_elem = x.get_n_elem();\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P1.is_aligned() && x.P2.is_aligned())\n        {\n        typename Proxy<T1>::aligned_ea_type P1 = x.P1.get_aligned_ea();\n        typename Proxy<T2>::aligned_ea_type P2 = x.P2.get_aligned_ea();\n        \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1a(/=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1a(/=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1a(/=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1a(/=, *); }\n        }\n      else\n        {\n        typename Proxy<T1>::ea_type P1 = x.P1.get_ea();\n        typename Proxy<T2>::ea_type P2 = x.P2.get_ea();\n    \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(/=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(/=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(/=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(/=, *); }\n        }\n      }\n    else\n      {\n      typename Proxy<T1>::ea_type P1 = x.P1.get_ea();\n      typename Proxy<T2>::ea_type P2 = x.P2.get_ea();\n    \n           if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(/=, +); }\n      else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(/=, -); }\n      else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(/=, /); }\n      else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(/=, *); }\n      }\n    }\n  else\n    {\n    const Proxy<T1>& P1 = x.P1;\n    const Proxy<T2>& P2 = x.P2;\n    \n         if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_2(/=, +); }\n    else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_2(/=, -); }\n    else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_2(/=, /); }\n    else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_2(/=, *); }\n    }\n  }\n\n\n\n//\n// cubes\n\n\n\ntemplate<typename eglue_type>\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\neglue_core<eglue_type>::apply(Cube<typename T1::elem_type>& out, const eGlueCube<T1, T2, eglue_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const bool prefer_at_accessor = (ProxyCube<T1>::prefer_at_accessor || ProxyCube<T2>::prefer_at_accessor);\n  \n  // NOTE: we're assuming that the cube has already been set to the correct size and there is no aliasing;\n  // size setting and alias checking is done by either the Cube contructor or operator=()\n  \n  \n  eT* out_mem = out.memptr();\n  \n  if(prefer_at_accessor == false)\n    {\n    const uword n_elem = out.n_elem;\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P1.is_aligned() && x.P2.is_aligned())\n        {\n        typename ProxyCube<T1>::aligned_ea_type P1 = x.P1.get_aligned_ea();\n        typename ProxyCube<T2>::aligned_ea_type P2 = x.P2.get_aligned_ea();\n        \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1a(=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1a(=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1a(=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1a(=, *); }\n        }\n      else\n        {\n        typename ProxyCube<T1>::ea_type P1 = x.P1.get_ea();\n        typename ProxyCube<T2>::ea_type P2 = x.P2.get_ea();\n        \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(=, *); }\n        }\n      }\n    else\n      {\n      typename ProxyCube<T1>::ea_type P1 = x.P1.get_ea();\n      typename ProxyCube<T2>::ea_type P2 = x.P2.get_ea();\n      \n           if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(=, +); }\n      else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(=, -); }\n      else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(=, /); }\n      else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(=, *); }\n      }\n    }\n  else\n    {\n    const uword n_rows   = x.get_n_rows();\n    const uword n_cols   = x.get_n_cols();\n    const uword n_slices = x.get_n_slices();\n  \n    const ProxyCube<T1>& P1 = x.P1;\n    const ProxyCube<T2>& P2 = x.P2;\n    \n         if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_3(=, +); }\n    else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_3(=, -); }\n    else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_3(=, /); }\n    else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_3(=, *); }\n    }\n  }\n\n\n\ntemplate<typename eglue_type>\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\neglue_core<eglue_type>::apply_inplace_plus(Cube<typename T1::elem_type>& out, const eGlueCube<T1, T2, eglue_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_rows   = x.get_n_rows();\n  const uword n_cols   = x.get_n_cols();\n  const uword n_slices = x.get_n_slices();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, \"addition\");\n  \n  typedef typename T1::elem_type eT;\n  \n  eT* out_mem = out.memptr();\n  \n  const bool prefer_at_accessor = (ProxyCube<T1>::prefer_at_accessor || ProxyCube<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    const uword n_elem = out.n_elem;\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P1.is_aligned() && x.P2.is_aligned())\n        {\n        typename ProxyCube<T1>::aligned_ea_type P1 = x.P1.get_aligned_ea();\n        typename ProxyCube<T2>::aligned_ea_type P2 = x.P2.get_aligned_ea();\n        \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1a(+=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1a(+=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1a(+=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1a(+=, *); }\n        }\n      else\n        {\n        typename ProxyCube<T1>::ea_type P1 = x.P1.get_ea();\n        typename ProxyCube<T2>::ea_type P2 = x.P2.get_ea();\n        \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(+=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(+=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(+=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(+=, *); }\n        }\n      }\n    else\n      {\n      typename ProxyCube<T1>::ea_type P1 = x.P1.get_ea();\n      typename ProxyCube<T2>::ea_type P2 = x.P2.get_ea();\n      \n           if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(+=, +); }\n      else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(+=, -); }\n      else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(+=, /); }\n      else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(+=, *); }\n      }\n    }\n  else\n    {\n    const ProxyCube<T1>& P1 = x.P1;\n    const ProxyCube<T2>& P2 = x.P2;\n    \n         if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_3(+=, +); }\n    else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_3(+=, -); }\n    else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_3(+=, /); }\n    else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_3(+=, *); }\n    }\n  }\n\n\n\ntemplate<typename eglue_type>\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\neglue_core<eglue_type>::apply_inplace_minus(Cube<typename T1::elem_type>& out, const eGlueCube<T1, T2, eglue_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_rows   = x.get_n_rows();\n  const uword n_cols   = x.get_n_cols();\n  const uword n_slices = x.get_n_slices();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, \"subtraction\");\n  \n  typedef typename T1::elem_type eT;\n  \n  eT* out_mem = out.memptr();\n  \n  const bool prefer_at_accessor = (ProxyCube<T1>::prefer_at_accessor || ProxyCube<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    const uword n_elem = out.n_elem;\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P1.is_aligned() && x.P2.is_aligned())\n        {\n        typename ProxyCube<T1>::aligned_ea_type P1 = x.P1.get_aligned_ea();\n        typename ProxyCube<T2>::aligned_ea_type P2 = x.P2.get_aligned_ea();\n        \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1a(-=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1a(-=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1a(-=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1a(-=, *); }\n        }\n      else\n        {\n        typename ProxyCube<T1>::ea_type P1 = x.P1.get_ea();\n        typename ProxyCube<T2>::ea_type P2 = x.P2.get_ea();\n        \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(-=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(-=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(-=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(-=, *); }\n        }\n      }\n    else\n      {\n      typename ProxyCube<T1>::ea_type P1 = x.P1.get_ea();\n      typename ProxyCube<T2>::ea_type P2 = x.P2.get_ea();\n      \n           if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(-=, +); }\n      else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(-=, -); }\n      else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(-=, /); }\n      else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(-=, *); }\n      }\n    }\n  else\n    {\n    const ProxyCube<T1>& P1 = x.P1;\n    const ProxyCube<T2>& P2 = x.P2;\n    \n         if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_3(-=, +); }\n    else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_3(-=, -); }\n    else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_3(-=, /); }\n    else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_3(-=, *); }\n    }\n  }\n\n\n\ntemplate<typename eglue_type>\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\neglue_core<eglue_type>::apply_inplace_schur(Cube<typename T1::elem_type>& out, const eGlueCube<T1, T2, eglue_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_rows   = x.get_n_rows();\n  const uword n_cols   = x.get_n_cols();\n  const uword n_slices = x.get_n_slices();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, \"element-wise multiplication\");\n  \n  typedef typename T1::elem_type eT;\n  \n  eT* out_mem = out.memptr();\n  \n  const bool prefer_at_accessor = (ProxyCube<T1>::prefer_at_accessor || ProxyCube<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    const uword n_elem = out.n_elem;\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P1.is_aligned() && x.P2.is_aligned())\n        {\n        typename ProxyCube<T1>::aligned_ea_type P1 = x.P1.get_aligned_ea();\n        typename ProxyCube<T2>::aligned_ea_type P2 = x.P2.get_aligned_ea();\n        \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1a(*=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1a(*=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1a(*=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1a(*=, *); }\n        }\n      else\n        {\n        typename ProxyCube<T1>::ea_type P1 = x.P1.get_ea();\n        typename ProxyCube<T2>::ea_type P2 = x.P2.get_ea();\n        \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(*=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(*=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(*=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(*=, *); }\n        }\n      }\n    else\n      {\n      typename ProxyCube<T1>::ea_type P1 = x.P1.get_ea();\n      typename ProxyCube<T2>::ea_type P2 = x.P2.get_ea();\n      \n           if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(*=, +); }\n      else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(*=, -); }\n      else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(*=, /); }\n      else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(*=, *); }\n      }\n    }\n  else\n    {\n    const ProxyCube<T1>& P1 = x.P1;\n    const ProxyCube<T2>& P2 = x.P2;\n    \n         if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_3(*=, +); }\n    else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_3(*=, -); }\n    else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_3(*=, /); }\n    else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_3(*=, *); }\n    }\n  }\n\n\n\ntemplate<typename eglue_type>\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\neglue_core<eglue_type>::apply_inplace_div(Cube<typename T1::elem_type>& out, const eGlueCube<T1, T2, eglue_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_rows   = x.get_n_rows();\n  const uword n_cols   = x.get_n_cols();\n  const uword n_slices = x.get_n_slices();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, \"element-wise division\");\n  \n  typedef typename T1::elem_type eT;\n  \n  eT* out_mem = out.memptr();\n  \n  const bool prefer_at_accessor = (ProxyCube<T1>::prefer_at_accessor || ProxyCube<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    const uword n_elem = out.n_elem;\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P1.is_aligned() && x.P2.is_aligned())\n        {\n        typename ProxyCube<T1>::aligned_ea_type P1 = x.P1.get_aligned_ea();\n        typename ProxyCube<T2>::aligned_ea_type P2 = x.P2.get_aligned_ea();\n        \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1a(/=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1a(/=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1a(/=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1a(/=, *); }\n        }\n      else\n        {\n        typename ProxyCube<T1>::ea_type P1 = x.P1.get_ea();\n        typename ProxyCube<T2>::ea_type P2 = x.P2.get_ea();\n        \n             if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(/=, +); }\n        else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(/=, -); }\n        else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(/=, /); }\n        else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(/=, *); }\n        }\n      }\n    else\n      {\n      typename ProxyCube<T1>::ea_type P1 = x.P1.get_ea();\n      typename ProxyCube<T2>::ea_type P2 = x.P2.get_ea();\n      \n           if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_1u(/=, +); }\n      else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_1u(/=, -); }\n      else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_1u(/=, /); }\n      else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_1u(/=, *); }\n      }\n    }\n  else\n    {\n    const ProxyCube<T1>& P1 = x.P1;\n    const ProxyCube<T2>& P2 = x.P2;\n    \n         if(is_same_type<eglue_type, eglue_plus >::yes) { arma_applier_3(/=, +); }\n    else if(is_same_type<eglue_type, eglue_minus>::yes) { arma_applier_3(/=, -); }\n    else if(is_same_type<eglue_type, eglue_div  >::yes) { arma_applier_3(/=, /); }\n    else if(is_same_type<eglue_type, eglue_schur>::yes) { arma_applier_3(/=, *); }\n    }\n  }\n\n\n\n#undef arma_applier_1u\n#undef arma_applier_1a\n#undef arma_applier_2\n#undef arma_applier_3\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/eop_aux.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup eop_aux\n//! @{\n\n\n\n//! use of the SFINAE approach to work around compiler limitations\n//! http://en.wikipedia.org/wiki/SFINAE\n\nclass eop_aux\n  {\n  public:\n  \n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result    acos  (const eT x) { return eT( std::acos(double(x)) ); }\n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result    asin  (const eT x) { return eT( std::asin(double(x)) ); }\n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result    atan  (const eT x) { return eT( std::atan(double(x)) ); }\n  \n  template<typename eT> arma_inline static typename arma_real_only<eT>::result        acos  (const eT x) { return std::acos(x); }\n  template<typename eT> arma_inline static typename arma_real_only<eT>::result        asin  (const eT x) { return std::asin(x); }\n  template<typename eT> arma_inline static typename arma_real_only<eT>::result        atan  (const eT x) { return std::atan(x); }\n  \n  template<typename eT> arma_inline static typename arma_cx_only<eT>::result          acos  (const eT x) { return arma_acos(x); }\n  template<typename eT> arma_inline static typename arma_cx_only<eT>::result          asin  (const eT x) { return arma_asin(x); }\n  template<typename eT> arma_inline static typename arma_cx_only<eT>::result          atan  (const eT x) { return arma_atan(x); }\n  \n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result    acosh (const eT x) { return eT( arma_acosh(double(x)) ); }\n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result    asinh (const eT x) { return eT( arma_asinh(double(x)) ); }\n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result    atanh (const eT x) { return eT( arma_atanh(double(x)) ); }\n  \n  template<typename eT> arma_inline static typename arma_real_or_cx_only<eT>::result acosh (const eT x) { return arma_acosh(x); }\n  template<typename eT> arma_inline static typename arma_real_or_cx_only<eT>::result asinh (const eT x) { return arma_asinh(x); }\n  template<typename eT> arma_inline static typename arma_real_or_cx_only<eT>::result atanh (const eT x) { return arma_atanh(x); }\n  \n  template<typename eT> arma_inline static typename arma_not_cx<eT>::result conj(const eT               x) { return x;            }\n  template<typename  T> arma_inline static          std::complex<T>         conj(const std::complex<T>& x) { return std::conj(x); }\n  \n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result sqrt  (const eT x) { return eT( std::sqrt (double(x)) ); }\n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result log10 (const eT x) { return eT( std::log10(double(x)) ); }\n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result log   (const eT x) { return eT( std::log  (double(x)) ); }\n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result exp   (const eT x) { return eT( std::exp  (double(x)) ); }\n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result cos   (const eT x) { return eT( std::cos  (double(x)) ); }\n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result sin   (const eT x) { return eT( std::sin  (double(x)) ); }\n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result tan   (const eT x) { return eT( std::tan  (double(x)) ); }\n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result cosh  (const eT x) { return eT( std::cosh (double(x)) ); }\n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result sinh  (const eT x) { return eT( std::sinh (double(x)) ); }\n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result tanh  (const eT x) { return eT( std::tanh (double(x)) ); }\n  \n  template<typename eT> arma_inline static typename arma_real_or_cx_only<eT>::result sqrt  (const eT x) { return std::sqrt (x); }\n  template<typename eT> arma_inline static typename arma_real_or_cx_only<eT>::result log10 (const eT x) { return std::log10(x); }\n  template<typename eT> arma_inline static typename arma_real_or_cx_only<eT>::result log   (const eT x) { return std::log  (x); }\n  template<typename eT> arma_inline static typename arma_real_or_cx_only<eT>::result exp   (const eT x) { return std::exp  (x); }\n  template<typename eT> arma_inline static typename arma_real_or_cx_only<eT>::result cos   (const eT x) { return std::cos  (x); }\n  template<typename eT> arma_inline static typename arma_real_or_cx_only<eT>::result sin   (const eT x) { return std::sin  (x); }\n  template<typename eT> arma_inline static typename arma_real_or_cx_only<eT>::result tan   (const eT x) { return std::tan  (x); }\n  template<typename eT> arma_inline static typename arma_real_or_cx_only<eT>::result cosh  (const eT x) { return std::cosh (x); }\n  template<typename eT> arma_inline static typename arma_real_or_cx_only<eT>::result sinh  (const eT x) { return std::sinh (x); }\n  template<typename eT> arma_inline static typename arma_real_or_cx_only<eT>::result tanh  (const eT x) { return std::tanh (x); }\n  \n  template<typename eT> arma_inline static typename arma_unsigned_integral_only<eT>::result neg (const eT x) { return  x; }\n  template<typename eT> arma_inline static typename            arma_signed_only<eT>::result neg (const eT x) { return -x; }\n  \n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result floor (const eT  x) { return x;                                                }\n  template<typename eT> arma_inline static typename     arma_real_only<eT>::result floor (const eT  x) { return std::floor(x);                                    }\n  template<typename eT> arma_inline static typename       arma_cx_only<eT>::result floor (const eT& x) { return eT( std::floor(x.real()), std::floor(x.imag()) ); }\n  \n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result ceil  (const eT  x) { return x;                                                }\n  template<typename eT> arma_inline static typename     arma_real_only<eT>::result ceil  (const eT  x) { return std::ceil(x);                                     }\n  template<typename eT> arma_inline static typename       arma_cx_only<eT>::result ceil  (const eT& x) { return eT( std::ceil(x.real()), std::ceil(x.imag()) );   }\n  \n  \n  #if defined(ARMA_USE_CXX11)\n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result round (const eT  x) { return x;                                                        }\n  template<typename eT> arma_inline static typename     arma_real_only<eT>::result round (const eT  x) { return std::round(x);                                            }\n  template<typename eT> arma_inline static typename       arma_cx_only<eT>::result round (const eT& x) { return eT( std::round(x.real()), std::round(x.imag()) );         }\n  #else\n  template<typename eT> arma_inline static typename arma_integral_only<eT>::result round (const eT  x) { return x;                                                        }\n  template<typename eT> arma_inline static typename     arma_real_only<eT>::result round (const eT  x) { return (x >= eT(0)) ? std::floor(x+0.5) : std::ceil(x-0.5);      }\n  template<typename eT> arma_inline static typename       arma_cx_only<eT>::result round (const eT& x) { return eT( eop_aux::round(x.real()), eop_aux::round(x.imag()) ); }\n  #endif\n  \n  \n  #if defined(ARMA_USE_CXX11)\n  template<typename eT> arma_inline static typename   arma_integral_only<eT>::result log2 (const eT  x) { return eT( std::log(double(x))/ double(0.69314718055994530942) );                            }\n  template<typename eT> arma_inline static typename       arma_real_only<eT>::result log2 (const eT  x) { return std::log2(x);                                                                         }\n  template<typename eT> arma_inline static typename         arma_cx_only<eT>::result log2 (const eT& x) { typedef typename get_pod_type<eT>::result T; return std::log(x) / T(0.69314718055994530942); }\n  #else\n  template<typename eT> arma_inline static typename   arma_integral_only<eT>::result log2 (const eT  x) { return eT( std::log(double(x))/ double(0.69314718055994530942) );                            }\n  template<typename eT> arma_inline static typename arma_real_or_cx_only<eT>::result log2 (const eT  x) { typedef typename get_pod_type<eT>::result T; return std::log(x) / T(0.69314718055994530942); }\n  #endif\n  \n  \n  #if defined(ARMA_USE_CXX11)\n  template<typename eT> arma_inline static typename   arma_integral_only<eT>::result exp2 (const eT  x) { return eT( std::pow(double(2), double(x)) );                            }\n  template<typename eT> arma_inline static typename       arma_real_only<eT>::result exp2 (const eT  x) { return std::exp2(x);                                                    }\n  template<typename eT> arma_inline static typename         arma_cx_only<eT>::result exp2 (const eT& x) { typedef typename get_pod_type<eT>::result T; return std::pow( T(2), x); }\n  #else\n  template<typename eT> arma_inline static typename   arma_integral_only<eT>::result exp2 (const eT  x) { return eT( std::pow(double(2), double(x)) );                            }\n  template<typename eT> arma_inline static typename arma_real_or_cx_only<eT>::result exp2 (const eT  x) { typedef typename get_pod_type<eT>::result T; return std::pow( T(2), x); }\n  #endif\n  \n  \n  template<typename eT> arma_inline static typename   arma_integral_only<eT>::result exp10 (const eT x) { return eT( std::pow(double(10), double(x)) );                            }\n  template<typename eT> arma_inline static typename arma_real_or_cx_only<eT>::result exp10 (const eT x) { typedef typename get_pod_type<eT>::result T; return std::pow( T(10), x); }\n  \n  template<typename eT> arma_inline static typename arma_unsigned_integral_only<eT>::result arma_abs (const eT               x) { return x;           }\n  template<typename eT> arma_inline static typename   arma_signed_integral_only<eT>::result arma_abs (const eT               x) { return std::abs(x); }\n  template<typename eT> arma_inline static typename              arma_real_only<eT>::result arma_abs (const eT               x) { return std::abs(x); }\n  template<typename  T> arma_inline static typename              arma_real_only< T>::result arma_abs (const std::complex<T>& x) { return std::abs(x); }\n  \n  template<typename eT> arma_inline static typename arma_unsigned_integral_only<eT>::result sign (const eT  x) { return (x > eT(0)) ? eT(+1) : eT(0);                                                                      }\n  template<typename eT> arma_inline static typename   arma_signed_integral_only<eT>::result sign (const eT  x) { return (x > eT(0)) ? eT(+1) : ( (x < eT(0)) ? eT(-1) : eT(0) );                                           }\n  template<typename eT> arma_inline static typename              arma_real_only<eT>::result sign (const eT  x) { return (x > eT(0)) ? eT(+1) : ( (x < eT(0)) ? eT(-1) : eT(0) );                                           }\n  template<typename eT> arma_inline static typename                arma_cx_only<eT>::result sign (const eT& x) { typedef typename eT::value_type T; return (x.real() != T(0) && x.imag() != T(0)) ? (x / std::abs(x)) : x; }\n  \n  \n  template<typename T1, typename T2> arma_inline static typename   arma_integral_only<T1>::result pow (const T1 base, const T2 exponent) { return T1( std::pow( double(base), double(exponent) ) ); }\n  template<typename T1, typename T2> arma_inline static typename arma_real_or_cx_only<T1>::result pow (const T1 base, const T2 exponent) { return std::pow(base, exponent);                         }\n  \n  \n  template<typename eT>\n  arma_inline\n  static\n  typename arma_integral_only<eT>::result\n  direct_eps(const eT)\n    {\n    return eT(0);\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  static\n  typename arma_real_only<eT>::result\n  direct_eps(const eT x)\n    {\n    //arma_extra_debug_sigprint();\n    \n    // acording to IEEE Standard for Floating-Point Arithmetic (IEEE 754)\n    // the mantissa length for double is 53 bits = std::numeric_limits<double>::digits\n    // the mantissa length for float  is 24 bits = std::numeric_limits<float >::digits\n    \n    //return std::pow( std::numeric_limits<eT>::radix, (std::floor(std::log10(std::abs(x))/std::log10(std::numeric_limits<eT>::radix))-(std::numeric_limits<eT>::digits-1)) );\n    \n    const eT radix_eT     = eT(std::numeric_limits<eT>::radix);\n    const eT digits_m1_eT = eT(std::numeric_limits<eT>::digits - 1);\n    \n    // return std::pow( radix_eT, eT(std::floor(std::log10(std::abs(x))/std::log10(radix_eT)) - digits_m1_eT) );\n    return eop_aux::pow( radix_eT, eT(std::floor(std::log10(std::abs(x))/std::log10(radix_eT)) - digits_m1_eT) );\n    }\n  \n  \n  \n  template<typename T>\n  inline\n  static\n  typename arma_real_only<T>::result\n  direct_eps(const std::complex<T> x)\n    {\n    //arma_extra_debug_sigprint();\n    \n    //return std::pow( std::numeric_limits<T>::radix, (std::floor(std::log10(std::abs(x))/std::log10(std::numeric_limits<T>::radix))-(std::numeric_limits<T>::digits-1)) );\n    \n    const T radix_T     = T(std::numeric_limits<T>::radix);\n    const T digits_m1_T = T(std::numeric_limits<T>::digits - 1);\n    \n    return std::pow( radix_T, T(std::floor(std::log10(std::abs(x))/std::log10(radix_T)) - digits_m1_T) );\n    }\n  };\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/eop_core_bones.hpp",
    "content": "// Copyright (C) 2010-2015 Conrad Sanderson\n// Copyright (C) 2010-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup eop_core\n//! @{\n\n\n\ntemplate<typename eop_type>\nclass eop_core\n  {\n  public:\n  \n  // matrices\n  \n  template<typename outT, typename T1> arma_hot inline static void apply(outT& out, const eOp<T1, eop_type>& x);\n  \n  template<typename T1> arma_hot inline static void apply_inplace_plus (Mat<typename T1::elem_type>& out, const eOp<T1, eop_type>& x);\n  template<typename T1> arma_hot inline static void apply_inplace_minus(Mat<typename T1::elem_type>& out, const eOp<T1, eop_type>& x);\n  template<typename T1> arma_hot inline static void apply_inplace_schur(Mat<typename T1::elem_type>& out, const eOp<T1, eop_type>& x);\n  template<typename T1> arma_hot inline static void apply_inplace_div  (Mat<typename T1::elem_type>& out, const eOp<T1, eop_type>& x);\n  \n  \n  // cubes\n  \n  template<typename T1> arma_hot inline static void apply(Cube<typename T1::elem_type>& out, const eOpCube<T1, eop_type>& x);\n  \n  template<typename T1> arma_hot inline static void apply_inplace_plus (Cube<typename T1::elem_type>& out, const eOpCube<T1, eop_type>& x);\n  template<typename T1> arma_hot inline static void apply_inplace_minus(Cube<typename T1::elem_type>& out, const eOpCube<T1, eop_type>& x);\n  template<typename T1> arma_hot inline static void apply_inplace_schur(Cube<typename T1::elem_type>& out, const eOpCube<T1, eop_type>& x);\n  template<typename T1> arma_hot inline static void apply_inplace_div  (Cube<typename T1::elem_type>& out, const eOpCube<T1, eop_type>& x);\n  \n  \n  // common\n  \n  template<typename eT> arma_hot arma_pure arma_inline static eT process(const eT val, const eT k);\n  };\n\n\n\nclass eop_neg               : public eop_core<eop_neg>               {};\nclass eop_scalar_plus       : public eop_core<eop_scalar_plus>       {};\nclass eop_scalar_minus_pre  : public eop_core<eop_scalar_minus_pre>  {};\nclass eop_scalar_minus_post : public eop_core<eop_scalar_minus_post> {};\nclass eop_scalar_times      : public eop_core<eop_scalar_times>      {};\nclass eop_scalar_div_pre    : public eop_core<eop_scalar_div_pre>    {};\nclass eop_scalar_div_post   : public eop_core<eop_scalar_div_post>   {};\nclass eop_square            : public eop_core<eop_square>            {};\nclass eop_sqrt              : public eop_core<eop_sqrt>              {};\nclass eop_log               : public eop_core<eop_log>               {};\nclass eop_log2              : public eop_core<eop_log2>              {};\nclass eop_log10             : public eop_core<eop_log10>             {};\nclass eop_trunc_log         : public eop_core<eop_trunc_log>         {};\nclass eop_exp               : public eop_core<eop_exp>               {};\nclass eop_exp2              : public eop_core<eop_exp2>              {};\nclass eop_exp10             : public eop_core<eop_exp10>             {};\nclass eop_trunc_exp         : public eop_core<eop_trunc_exp>         {};\nclass eop_cos               : public eop_core<eop_cos>               {};\nclass eop_sin               : public eop_core<eop_sin>               {};\nclass eop_tan               : public eop_core<eop_tan>               {};\nclass eop_acos              : public eop_core<eop_acos>              {};\nclass eop_asin              : public eop_core<eop_asin>              {};\nclass eop_atan              : public eop_core<eop_atan>              {};\nclass eop_cosh              : public eop_core<eop_cosh>              {};\nclass eop_sinh              : public eop_core<eop_sinh>              {};\nclass eop_tanh              : public eop_core<eop_tanh>              {};\nclass eop_acosh             : public eop_core<eop_acosh>             {};\nclass eop_asinh             : public eop_core<eop_asinh>             {};\nclass eop_atanh             : public eop_core<eop_atanh>             {};\nclass eop_eps               : public eop_core<eop_eps>               {};\nclass eop_abs               : public eop_core<eop_abs>               {};\nclass eop_conj              : public eop_core<eop_conj>              {};\nclass eop_pow               : public eop_core<eop_pow>               {};\nclass eop_floor             : public eop_core<eop_floor>             {};\nclass eop_ceil              : public eop_core<eop_ceil>              {};\nclass eop_round             : public eop_core<eop_round>             {};\nclass eop_sign              : public eop_core<eop_sign>              {};\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/eop_core_meat.hpp",
    "content": "// Copyright (C) 2010-2015 Conrad Sanderson\n// Copyright (C) 2010-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup eop_core\n//! @{\n\n\n#undef arma_applier_1u\n#undef arma_applier_1a\n#undef arma_applier_2\n#undef arma_applier_3\n#undef operatorA\n\n\n#if defined(ARMA_SIMPLE_LOOPS)\n  #define arma_applier_1u(operatorA) \\\n    {\\\n    for(uword i=0; i<n_elem; ++i)\\\n      {\\\n      out_mem[i] operatorA eop_core<eop_type>::process(P[i], k);\\\n      }\\\n    }\n#else\n  #define arma_applier_1u(operatorA) \\\n    {\\\n    uword i,j;\\\n    \\\n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\\\n      {\\\n      eT tmp_i = P[i];\\\n      eT tmp_j = P[j];\\\n      \\\n      tmp_i = eop_core<eop_type>::process(tmp_i, k);\\\n      tmp_j = eop_core<eop_type>::process(tmp_j, k);\\\n      \\\n      out_mem[i] operatorA tmp_i;\\\n      out_mem[j] operatorA tmp_j;\\\n      }\\\n    \\\n    if(i < n_elem)\\\n      {\\\n      out_mem[i] operatorA eop_core<eop_type>::process(P[i], k);\\\n      }\\\n    }\n#endif\n\n\n#if defined(ARMA_SIMPLE_LOOPS)\n  #define arma_applier_1a(operatorA) \\\n    {\\\n    for(uword i=0; i<n_elem; ++i)\\\n      {\\\n      out_mem[i] operatorA eop_core<eop_type>::process(P.at_alt(i), k);\\\n      }\\\n    }\n#else\n  #define arma_applier_1a(operatorA) \\\n    {\\\n    uword i,j;\\\n    \\\n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\\\n      {\\\n      eT tmp_i = P.at_alt(i);\\\n      eT tmp_j = P.at_alt(j);\\\n      \\\n      tmp_i = eop_core<eop_type>::process(tmp_i, k);\\\n      tmp_j = eop_core<eop_type>::process(tmp_j, k);\\\n      \\\n      out_mem[i] operatorA tmp_i;\\\n      out_mem[j] operatorA tmp_j;\\\n      }\\\n    \\\n    if(i < n_elem)\\\n      {\\\n      out_mem[i] operatorA eop_core<eop_type>::process(P.at_alt(i), k);\\\n      }\\\n    }\n#endif\n\n\n#define arma_applier_2(operatorA) \\\n  {\\\n  if(n_rows != 1)\\\n    {\\\n    for(uword col=0; col<n_cols; ++col)\\\n      {\\\n      uword i,j;\\\n      \\\n      for(i=0, j=1; j<n_rows; i+=2, j+=2)\\\n        {\\\n        eT tmp_i = P.at(i,col);\\\n        eT tmp_j = P.at(j,col);\\\n        \\\n        tmp_i = eop_core<eop_type>::process(tmp_i, k);\\\n        tmp_j = eop_core<eop_type>::process(tmp_j, k);\\\n        \\\n        *out_mem operatorA tmp_i;  out_mem++;\\\n        *out_mem operatorA tmp_j;  out_mem++;\\\n        }\\\n      \\\n      if(i < n_rows)\\\n        {\\\n        *out_mem operatorA eop_core<eop_type>::process(P.at(i,col), k);  out_mem++;\\\n        }\\\n      }\\\n    }\\\n  else\\\n    {\\\n    for(uword count=0; count < n_cols; ++count)\\\n      {\\\n      out_mem[count] operatorA eop_core<eop_type>::process(P.at(0,count), k);\\\n      }\\\n    }\\\n  }\n\n\n\n#define arma_applier_3(operatorA) \\\n  {\\\n  for(uword slice=0; slice<n_slices; ++slice)\\\n    {\\\n    for(uword col=0; col<n_cols; ++col)\\\n      {\\\n      uword i,j;\\\n      \\\n      for(i=0, j=1; j<n_rows; i+=2, j+=2)\\\n        {\\\n        eT tmp_i = P.at(i,col,slice);\\\n        eT tmp_j = P.at(j,col,slice);\\\n        \\\n        tmp_i = eop_core<eop_type>::process(tmp_i, k);\\\n        tmp_j = eop_core<eop_type>::process(tmp_j, k);\\\n        \\\n        *out_mem operatorA tmp_i; out_mem++; \\\n        *out_mem operatorA tmp_j; out_mem++; \\\n        }\\\n      \\\n      if(i < n_rows)\\\n        {\\\n        *out_mem operatorA eop_core<eop_type>::process(P.at(i,col,slice), k); out_mem++; \\\n        }\\\n      }\\\n    }\\\n  }\n\n\n\n//\n// matrices\n\n\n\ntemplate<typename eop_type>\ntemplate<typename outT, typename T1>\narma_hot\ninline\nvoid\neop_core<eop_type>::apply(outT& out, const eOp<T1, eop_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing;\n  // size setting and alias checking is done by either the Mat contructor or operator=()\n  \n  const eT  k       = x.aux;\n        eT* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    const uword n_elem = x.get_n_elem();\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P.is_aligned())\n        {\n        typename Proxy<T1>::aligned_ea_type P = x.P.get_aligned_ea();\n        \n        arma_applier_1a(=);\n        }\n      else\n        {\n        typename Proxy<T1>::ea_type P = x.P.get_ea();\n        \n        arma_applier_1u(=);\n        }\n      }\n    else\n      {\n      typename Proxy<T1>::ea_type P = x.P.get_ea();\n      \n      arma_applier_1u(=);\n      }\n    }\n  else\n    {\n    const uword n_rows = x.get_n_rows();\n    const uword n_cols = x.get_n_cols();\n    \n    const Proxy<T1>& P = x.P;\n    \n    arma_applier_2(=);\n    }\n  }\n\n\n\ntemplate<typename eop_type>\ntemplate<typename T1>\narma_hot\ninline\nvoid\neop_core<eop_type>::apply_inplace_plus(Mat<typename T1::elem_type>& out, const eOp<T1, eop_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword n_rows = x.get_n_rows();\n  const uword n_cols = x.get_n_cols();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, \"addition\");\n  \n  const eT  k       = x.aux;\n        eT* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    const uword n_elem = x.get_n_elem();\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P.is_aligned())\n        {\n        typename Proxy<T1>::aligned_ea_type P = x.P.get_aligned_ea();\n        \n        arma_applier_1a(+=);\n        }\n      else\n        {\n        typename Proxy<T1>::ea_type P = x.P.get_ea();\n        \n        arma_applier_1u(+=);\n        }\n      }\n    else\n      {\n      typename Proxy<T1>::ea_type P = x.P.get_ea();\n      \n      arma_applier_1u(+=);\n      }\n    }\n  else\n    {\n    const Proxy<T1>& P = x.P;\n    \n    arma_applier_2(+=);\n    }\n  }\n\n\n\ntemplate<typename eop_type>\ntemplate<typename T1>\narma_hot\ninline\nvoid\neop_core<eop_type>::apply_inplace_minus(Mat<typename T1::elem_type>& out, const eOp<T1, eop_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword n_rows = x.get_n_rows();\n  const uword n_cols = x.get_n_cols();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, \"subtraction\");\n  \n  const eT  k       = x.aux;\n        eT* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    const uword n_elem = x.get_n_elem();\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P.is_aligned())\n        {\n        typename Proxy<T1>::aligned_ea_type P = x.P.get_aligned_ea();\n        \n        arma_applier_1a(-=);\n        }\n      else\n        {\n        typename Proxy<T1>::ea_type P = x.P.get_ea();\n        \n        arma_applier_1u(-=);\n        }\n      }\n    else\n      {\n      typename Proxy<T1>::ea_type P = x.P.get_ea();\n      \n      arma_applier_1u(-=);\n      }\n    }\n  else\n    {\n    const Proxy<T1>& P = x.P;\n    \n    arma_applier_2(-=);\n    }\n  }\n\n\n\ntemplate<typename eop_type>\ntemplate<typename T1>\narma_hot\ninline\nvoid\neop_core<eop_type>::apply_inplace_schur(Mat<typename T1::elem_type>& out, const eOp<T1, eop_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword n_rows = x.get_n_rows();\n  const uword n_cols = x.get_n_cols();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, \"element-wise multiplication\");\n  \n  const eT  k       = x.aux;\n        eT* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    const uword n_elem = x.get_n_elem();\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P.is_aligned())\n        {\n        typename Proxy<T1>::aligned_ea_type P = x.P.get_aligned_ea();\n        \n        arma_applier_1a(*=);\n        }\n      else\n        {\n        typename Proxy<T1>::ea_type P = x.P.get_ea();\n        \n        arma_applier_1u(*=);\n        }\n      }\n    else\n      {\n      typename Proxy<T1>::ea_type P = x.P.get_ea();\n      \n      arma_applier_1u(*=);\n      }\n    }\n  else\n    {\n    const Proxy<T1>& P = x.P;\n    \n    arma_applier_2(*=);\n    }\n  }\n\n\n\ntemplate<typename eop_type>\ntemplate<typename T1>\narma_hot\ninline\nvoid\neop_core<eop_type>::apply_inplace_div(Mat<typename T1::elem_type>& out, const eOp<T1, eop_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword n_rows = x.get_n_rows();\n  const uword n_cols = x.get_n_cols();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, \"element-wise division\");\n  \n  const eT  k       = x.aux;\n        eT* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    const uword n_elem = x.get_n_elem();\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P.is_aligned())\n        {\n        typename Proxy<T1>::aligned_ea_type P = x.P.get_aligned_ea();\n        \n        arma_applier_1a(/=);\n        }\n      else\n        {\n        typename Proxy<T1>::ea_type P = x.P.get_ea();\n        \n        arma_applier_1u(/=);\n        }\n      }\n    else\n      {\n      typename Proxy<T1>::ea_type P = x.P.get_ea();\n      \n      arma_applier_1u(/=);\n      }\n    }\n  else\n    {\n    const Proxy<T1>& P = x.P;\n    \n    arma_applier_2(/=);\n    }\n  }\n\n\n\n//\n// cubes\n\n\n\ntemplate<typename eop_type>\ntemplate<typename T1>\narma_hot\ninline\nvoid\neop_core<eop_type>::apply(Cube<typename T1::elem_type>& out, const eOpCube<T1, eop_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing;\n  // size setting and alias checking is done by either the Mat contructor or operator=()\n  \n  const eT  k       = x.aux;\n        eT* out_mem = out.memptr();\n  \n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n    const uword n_elem = out.n_elem;\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P.is_aligned())\n        {\n        typename ProxyCube<T1>::aligned_ea_type P = x.P.get_aligned_ea();\n        \n        arma_applier_1a(=);\n        }\n      else\n        {\n        typename ProxyCube<T1>::ea_type P = x.P.get_ea();\n        \n        arma_applier_1u(=);\n        }\n      }\n    else\n      {\n      typename ProxyCube<T1>::ea_type P = x.P.get_ea();\n      \n      arma_applier_1u(=);\n      }\n    }\n  else\n    {\n    const uword n_rows   = x.get_n_rows();\n    const uword n_cols   = x.get_n_cols();\n    const uword n_slices = x.get_n_slices();\n    \n    const ProxyCube<T1>& P = x.P;\n    \n    arma_applier_3(=);\n    }\n  }\n\n\n\ntemplate<typename eop_type>\ntemplate<typename T1>\narma_hot\ninline\nvoid\neop_core<eop_type>::apply_inplace_plus(Cube<typename T1::elem_type>& out, const eOpCube<T1, eop_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword n_rows   = x.get_n_rows();\n  const uword n_cols   = x.get_n_cols();\n  const uword n_slices = x.get_n_slices();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, \"addition\");\n  \n  const eT  k       = x.aux;\n        eT* out_mem = out.memptr();\n  \n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n    const uword n_elem = out.n_elem;\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P.is_aligned())\n        {\n        typename ProxyCube<T1>::aligned_ea_type P = x.P.get_aligned_ea();\n        \n        arma_applier_1a(+=);\n        }\n      else\n        {\n        typename ProxyCube<T1>::ea_type P = x.P.get_ea();\n        \n        arma_applier_1u(+=);\n        }\n      }\n    else\n      {\n      typename ProxyCube<T1>::ea_type P = x.P.get_ea();\n      \n      arma_applier_1u(+=);\n      }\n    }\n  else\n    {\n    const ProxyCube<T1>& P = x.P;\n    \n    arma_applier_3(+=);\n    }\n  }\n\n\n\ntemplate<typename eop_type>\ntemplate<typename T1>\narma_hot\ninline\nvoid\neop_core<eop_type>::apply_inplace_minus(Cube<typename T1::elem_type>& out, const eOpCube<T1, eop_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword n_rows   = x.get_n_rows();\n  const uword n_cols   = x.get_n_cols();\n  const uword n_slices = x.get_n_slices();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, \"subtraction\");\n  \n  const eT  k       = x.aux;\n        eT* out_mem = out.memptr();\n  \n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n    const uword n_elem = out.n_elem;\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P.is_aligned())\n        {\n        typename ProxyCube<T1>::aligned_ea_type P = x.P.get_aligned_ea();\n        \n        arma_applier_1a(-=);\n        }\n      else\n        {\n        typename ProxyCube<T1>::ea_type P = x.P.get_ea();\n        \n        arma_applier_1u(-=);\n        }\n      }\n    else\n      {\n      typename ProxyCube<T1>::ea_type P = x.P.get_ea();\n      \n      arma_applier_1u(-=);\n      }\n    }\n  else\n    {\n    const ProxyCube<T1>& P = x.P;\n    \n    arma_applier_3(-=);\n    }\n  }\n\n\n\ntemplate<typename eop_type>\ntemplate<typename T1>\narma_hot\ninline\nvoid\neop_core<eop_type>::apply_inplace_schur(Cube<typename T1::elem_type>& out, const eOpCube<T1, eop_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword n_rows   = x.get_n_rows();\n  const uword n_cols   = x.get_n_cols();\n  const uword n_slices = x.get_n_slices();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, \"element-wise multiplication\");\n  \n  const eT  k       = x.aux;\n        eT* out_mem = out.memptr();\n  \n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n    const uword n_elem = out.n_elem;\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P.is_aligned())\n        {\n        typename ProxyCube<T1>::aligned_ea_type P = x.P.get_aligned_ea();\n        \n        arma_applier_1a(*=);\n        }\n      else\n        {\n        typename ProxyCube<T1>::ea_type P = x.P.get_ea();\n        \n        arma_applier_1u(*=);\n        }\n      }\n    else\n      {\n      typename ProxyCube<T1>::ea_type P = x.P.get_ea();\n      \n      arma_applier_1u(*=);\n      }\n    }\n  else\n    {\n    const ProxyCube<T1>& P = x.P;\n    \n    arma_applier_3(*=);\n    }\n  }\n\n\n\ntemplate<typename eop_type>\ntemplate<typename T1>\narma_hot\ninline\nvoid\neop_core<eop_type>::apply_inplace_div(Cube<typename T1::elem_type>& out, const eOpCube<T1, eop_type>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword n_rows   = x.get_n_rows();\n  const uword n_cols   = x.get_n_cols();\n  const uword n_slices = x.get_n_slices();\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, \"element-wise division\");\n  \n  const eT  k       = x.aux;\n        eT* out_mem = out.memptr();\n  \n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n    const uword n_elem = out.n_elem;\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      if(x.P.is_aligned())\n        {\n        typename ProxyCube<T1>::aligned_ea_type P = x.P.get_aligned_ea();\n        \n        arma_applier_1a(/=);\n        }\n      else\n        {\n        typename ProxyCube<T1>::ea_type P = x.P.get_ea();\n        \n        arma_applier_1u(/=);\n        }\n      }\n    else\n      {\n      typename ProxyCube<T1>::ea_type P = x.P.get_ea();\n      \n      arma_applier_1u(/=);\n      }\n    }\n  else\n    {\n    const ProxyCube<T1>& P = x.P;\n    \n    arma_applier_3(/=);\n    }\n  }\n\n\n\n//\n// common\n\n\n\ntemplate<typename eop_type>\ntemplate<typename eT>\narma_hot\narma_pure\narma_inline\neT\neop_core<eop_type>::process(const eT, const eT)\n  {\n  arma_stop(\"eop_core::process(): unhandled eop_type\");\n  return eT(0);\n  }\n\n\n\ntemplate<> template<typename eT> arma_hot arma_const arma_inline eT\neop_core<eop_scalar_plus      >::process(const eT val, const eT k) { return val + k;                  }\n\ntemplate<> template<typename eT> arma_hot arma_const arma_inline eT\neop_core<eop_scalar_minus_pre >::process(const eT val, const eT k) { return k - val;                  }\n\ntemplate<> template<typename eT> arma_hot arma_const arma_inline eT\neop_core<eop_scalar_minus_post>::process(const eT val, const eT k) { return val - k;                  }\n\ntemplate<> template<typename eT> arma_hot arma_const arma_inline eT\neop_core<eop_scalar_times     >::process(const eT val, const eT k) { return val * k;                  }\n\ntemplate<> template<typename eT> arma_hot arma_const arma_inline eT\neop_core<eop_scalar_div_pre   >::process(const eT val, const eT k) { return k / val;                  }\n\ntemplate<> template<typename eT> arma_hot arma_const arma_inline eT\neop_core<eop_scalar_div_post  >::process(const eT val, const eT k) { return val / k;                  }\n\ntemplate<> template<typename eT> arma_hot arma_const arma_inline eT\neop_core<eop_square           >::process(const eT val, const eT  ) { return val*val;                  }\n\ntemplate<> template<typename eT> arma_hot arma_const arma_inline eT\neop_core<eop_neg              >::process(const eT val, const eT  ) { return eop_aux::neg(val);        }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_sqrt             >::process(const eT val, const eT  ) { return eop_aux::sqrt(val);       }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_log              >::process(const eT val, const eT  ) { return eop_aux::log(val);        }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_log2             >::process(const eT val, const eT  ) { return eop_aux::log2(val);       }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_log10            >::process(const eT val, const eT  ) { return eop_aux::log10(val);      }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_trunc_log        >::process(const eT val, const eT  ) { return    arma::trunc_log(val);  }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_exp              >::process(const eT val, const eT  ) { return eop_aux::exp(val);        }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_exp2             >::process(const eT val, const eT  ) { return eop_aux::exp2(val);       }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_exp10            >::process(const eT val, const eT  ) { return eop_aux::exp10(val);      }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_trunc_exp        >::process(const eT val, const eT  ) { return    arma::trunc_exp(val);  }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_cos              >::process(const eT val, const eT  ) { return eop_aux::cos(val);        }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_sin              >::process(const eT val, const eT  ) { return eop_aux::sin(val);        }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_tan              >::process(const eT val, const eT  ) { return eop_aux::tan(val);        }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_acos             >::process(const eT val, const eT  ) { return eop_aux::acos(val);       }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_asin             >::process(const eT val, const eT  ) { return eop_aux::asin(val);       }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_atan             >::process(const eT val, const eT  ) { return eop_aux::atan(val);       }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_cosh             >::process(const eT val, const eT  ) { return eop_aux::cosh(val);       }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_sinh             >::process(const eT val, const eT  ) { return eop_aux::sinh(val);       }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_tanh             >::process(const eT val, const eT  ) { return eop_aux::tanh(val);       }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_acosh            >::process(const eT val, const eT  ) { return eop_aux::acosh(val);      }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_asinh            >::process(const eT val, const eT  ) { return eop_aux::asinh(val);      }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_atanh            >::process(const eT val, const eT  ) { return eop_aux::atanh(val);      }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_eps              >::process(const eT val, const eT  ) { return eop_aux::direct_eps(val); }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_abs              >::process(const eT val, const eT  ) { return eop_aux::arma_abs(val);   }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_conj             >::process(const eT val, const eT  ) { return eop_aux::conj(val);       }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_pow              >::process(const eT val, const eT k) { return eop_aux::pow(val, k);     }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_floor            >::process(const eT val, const eT  ) { return eop_aux::floor(val);      }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_ceil             >::process(const eT val, const eT  ) { return eop_aux::ceil(val);       }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_round            >::process(const eT val, const eT  ) { return eop_aux::round(val);      }\n\ntemplate<> template<typename eT> arma_hot arma_pure arma_inline eT\neop_core<eop_sign             >::process(const eT val, const eT  ) { return eop_aux::sign(val);       }\n\n\n#undef arma_applier_1u\n#undef arma_applier_1a\n#undef arma_applier_2\n#undef arma_applier_3\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fft_engine.hpp",
    "content": "// This Source Code Form is a compilation of:\n// (1) source code written by Conrad Sanderson, and\n// (2) a modified form of source code referred to as \"kissfft.hh\".\n// \n// This compilation is Copyright (C) 2013 Conrad Sanderson\n// and is subject to the terms of the Mozilla Public License, v. 2.0.\n// \n// The source code that is distinct and separate from \"kissfft.hh\"\n// is Copyright (C) 2013 Conrad Sanderson and is subject to the\n// terms of the Mozilla Public License, v. 2.0.\n// \n// If a copy of the MPL was not distributed with this file,\n// You can obtain one at http://mozilla.org/MPL/2.0/.\n// \n// The original \"kissfft.hh\" source code is licensed under a 3-clause BSD license,\n// as follows:\n// \n// Copyright (c) 2003-2010 Mark Borgerding\n// \n// All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification,\n// are permitted provided that the following conditions are met:\n// \n// * Redistributions of source code must retain the above copyright notice,\n//   this list of conditions and the following disclaimer.\n// \n// * Redistributions in binary form must reproduce the above copyright notice,\n//   this list of conditions and the following disclaimer in the documentation\n//   and/or other materials provided with the distribution.\n// \n// * Neither the author nor the names of any contributors may be used to endorse or promote\n//   products derived from this software without specific prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER\n// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n// OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n\ntemplate<typename cx_type, uword fixed_N, bool> struct store {};\n\ntemplate<typename cx_type, uword fixed_N>\nstruct store<cx_type, fixed_N, true>\n  {\n  static const uword N = fixed_N;\n  \n  arma_aligned cx_type coeffs_array[fixed_N];\n  \n  inline store()      {}\n  inline store(uword) {}\n  \n  arma_inline       cx_type* coeffs_ptr()       { return &coeffs_array[0]; }\n  arma_inline const cx_type* coeffs_ptr() const { return &coeffs_array[0]; }\n  };\n\n\n\ntemplate<typename cx_type, uword fixed_N>\nstruct store<cx_type, fixed_N, false>\n  {\n  const uword N;\n  \n  podarray<cx_type> coeffs_array;\n  \n  inline store()           : N(0)    {}\n  inline store(uword in_N) : N(in_N) { coeffs_array.set_size(N); }\n  \n  arma_inline       cx_type* coeffs_ptr()       { return coeffs_array.memptr(); }\n  arma_inline const cx_type* coeffs_ptr() const { return coeffs_array.memptr(); }\n  };\n\n\n\ntemplate<typename cx_type, bool inverse, uword fixed_N = 0>\nclass fft_engine : public store<cx_type, fixed_N, (fixed_N > 0)>\n  {\n  public:\n  \n  typedef typename get_pod_type<cx_type>::result T;\n  \n  using store<cx_type, fixed_N, (fixed_N > 0)>::N;\n  using store<cx_type, fixed_N, (fixed_N > 0)>::coeffs_ptr;\n  \n  podarray<uword>   residue;\n  podarray<uword>   radix;\n  \n  podarray<cx_type> tmp_array;\n  \n  \n  template<bool fill>\n  inline\n  uword\n  calc_radix()\n    {\n    uword i = 0;\n    \n    for(uword n = N, r=4; n >= 2; ++i)\n      {\n      while( (n % r) > 0 )\n        {\n        switch(r)\n          {\n          case 2:  r  = 3; break;\n          case 4:  r  = 2; break;\n          default: r += 2; break;\n          }\n        \n        if(r*r > n) { r = n; }\n        }\n      \n      n /= r;\n      \n      if(fill)\n        {\n        residue[i] = n;\n          radix[i] = r;\n        }\n      }\n    \n    return i;\n    }\n  \n  \n  \n  inline\n  fft_engine(const uword in_N)\n    : store< cx_type, fixed_N, (fixed_N > 0) >(in_N)\n    {\n    arma_extra_debug_sigprint();\n    \n    const uword len = calc_radix<false>();\n    \n    residue.set_size(len);\n      radix.set_size(len);\n    \n    calc_radix<true>();\n    \n    \n    // calculate the constant coefficients\n    \n    cx_type* coeffs = coeffs_ptr();\n    \n    const T k = T( (inverse) ? +2 : -2 ) * std::acos( T(-1) ) / T(N);\n    \n    for(uword i=0; i < N; ++i)  { coeffs[i] = std::exp( cx_type(T(0), i*k) ); }\n    }\n  \n  \n  \n  arma_hot\n  inline\n  void\n  butterfly_2(cx_type* Y, const uword stride, const uword m)\n    {\n    arma_extra_debug_sigprint();\n    \n    const cx_type* coeffs = coeffs_ptr();\n    \n    for(uword i=0; i < m; ++i)\n      {\n      const cx_type t = Y[i+m] * coeffs[i*stride];\n      \n      Y[i+m] =  Y[i] - t;\n      Y[i  ] += t;\n      }\n    }\n  \n  \n  \n  arma_hot\n  inline\n  void\n  butterfly_3(cx_type* Y, const uword stride, const uword m)\n    {\n    arma_extra_debug_sigprint();\n    \n    arma_aligned cx_type tmp[5];\n    \n    cx_type* coeffs1 = coeffs_ptr();\n    cx_type* coeffs2 = coeffs1;\n    \n    const T coeff_sm_imag = coeffs1[stride*m].imag();\n    \n    const uword n = m*2;\n    \n    // TODO: rearrange the indices within tmp[] into a more sane order\n    \n    for(uword i = m; i > 0; --i)\n      {\n      tmp[1] = Y[m] * (*coeffs1);\n      tmp[2] = Y[n] * (*coeffs2);\n      \n      tmp[0]  = tmp[1] - tmp[2];\n      tmp[0] *= coeff_sm_imag;\n      \n      tmp[3] = tmp[1] + tmp[2];\n      \n      Y[m] = cx_type( (Y[0].real() - (0.5*tmp[3].real())), (Y[0].imag() - (0.5*tmp[3].imag())) );\n      \n      Y[0] += tmp[3];\n      \n      \n      Y[n] = cx_type( (Y[m].real() + tmp[0].imag()), (Y[m].imag() - tmp[0].real()) );\n      \n      Y[m] += cx_type( -tmp[0].imag(), tmp[0].real() );\n      \n      Y++;\n      \n      coeffs1 += stride;\n      coeffs2 += stride*2;\n      }\n    }\n  \n  \n  \n  arma_hot\n  inline\n  void\n  butterfly_4(cx_type* Y, const uword stride, const uword m)\n    {\n    arma_extra_debug_sigprint();\n    \n    arma_aligned cx_type tmp[7];\n    \n    const cx_type* coeffs = coeffs_ptr();\n    \n    const uword m2 = m*2;\n    const uword m3 = m*3;\n    \n    // TODO: rearrange the indices within tmp[] into a more sane order\n    \n    for(uword i=0; i < m; ++i)\n      {\n      tmp[0] = Y[i + m ] * coeffs[i*stride  ];\n      tmp[2] = Y[i + m3] * coeffs[i*stride*3];\n      tmp[3] = tmp[0] + tmp[2];\n      \n      //tmp[4] = tmp[0] - tmp[2];\n      //tmp[4] = (inverse) ? cx_type( -(tmp[4].imag()), tmp[4].real() ) : cx_type( tmp[4].imag(), -tmp[4].real() );\n      \n      tmp[4] = (inverse)\n                 ? cx_type( (tmp[2].imag() - tmp[0].imag()), (tmp[0].real() - tmp[2].real()) )\n                 : cx_type( (tmp[0].imag() - tmp[2].imag()), (tmp[2].real() - tmp[0].real()) );\n      \n      tmp[1] = Y[i + m2] * coeffs[i*stride*2];\n      tmp[5] = Y[i] - tmp[1];\n      \n      \n      Y[i     ] += tmp[1];\n      Y[i + m2]  = Y[i] - tmp[3];\n      Y[i     ] += tmp[3];\n      Y[i + m ]  = tmp[5] + tmp[4];\n      Y[i + m3]  = tmp[5] - tmp[4];\n      }\n    }\n  \n  \n  \n  inline\n  arma_hot\n  void\n  butterfly_5(cx_type* Y, const uword stride, const uword m)\n    {\n    arma_extra_debug_sigprint();\n    \n    arma_aligned cx_type tmp[13];\n    \n    const cx_type* coeffs = coeffs_ptr();\n    \n    const T a_real = coeffs[stride*1*m].real();\n    const T a_imag = coeffs[stride*1*m].imag();\n    \n    const T b_real = coeffs[stride*2*m].real();\n    const T b_imag = coeffs[stride*2*m].imag();\n    \n    cx_type* Y0 = Y;\n    cx_type* Y1 = Y + 1*m;\n    cx_type* Y2 = Y + 2*m;\n    cx_type* Y3 = Y + 3*m;\n    cx_type* Y4 = Y + 4*m;\n    \n    for(uword i=0; i < m; ++i)\n      {\n      tmp[0] = (*Y0);\n      \n      tmp[1] = (*Y1) * coeffs[stride*1*i];\n      tmp[2] = (*Y2) * coeffs[stride*2*i];\n      tmp[3] = (*Y3) * coeffs[stride*3*i];\n      tmp[4] = (*Y4) * coeffs[stride*4*i];\n      \n      tmp[7]  = tmp[1] + tmp[4];\n      tmp[8]  = tmp[2] + tmp[3];\n      tmp[9]  = tmp[2] - tmp[3];\n      tmp[10] = tmp[1] - tmp[4];\n      \n      (*Y0) += tmp[7];\n      (*Y0) += tmp[8];\n      \n      tmp[5] = tmp[0] + cx_type( ( (tmp[7].real() * a_real) + (tmp[8].real() * b_real) ), ( (tmp[7].imag() * a_real) + (tmp[8].imag() * b_real) ) );\n      \n      tmp[6] =  cx_type( ( (tmp[10].imag() * a_imag) + (tmp[9].imag() * b_imag) ), ( -(tmp[10].real() * a_imag) - (tmp[9].real() * b_imag) ) );\n      \n      (*Y1) = tmp[5] - tmp[6];\n      (*Y4) = tmp[5] + tmp[6];\n      \n      tmp[11] = tmp[0] +  cx_type( ( (tmp[7].real() * b_real) + (tmp[8].real() * a_real) ), ( (tmp[7].imag() * b_real) + (tmp[8].imag() * a_real) ) );\n      \n      tmp[12] = cx_type( ( -(tmp[10].imag() * b_imag) + (tmp[9].imag() * a_imag) ), (  (tmp[10].real() * b_imag) - (tmp[9].real() * a_imag) ) );\n      \n      (*Y2) = tmp[11] + tmp[12];\n      (*Y3) = tmp[11] - tmp[12];\n      \n      Y0++;\n      Y1++;\n      Y2++;\n      Y3++;\n      Y4++;\n      }\n    }\n  \n  \n  \n  arma_hot\n  inline\n  void\n  butterfly_N(cx_type* Y, const uword stride, const uword m, const uword r)\n    {\n    arma_extra_debug_sigprint();\n    \n    const cx_type* coeffs = coeffs_ptr();\n    \n    tmp_array.set_min_size(r);\n    cx_type* tmp = tmp_array.memptr();\n    \n    for(uword u=0; u < m; ++u)\n      {\n      uword k = u;\n      \n      for(uword v=0; v < r; ++v)\n        {\n        tmp[v] = Y[k];\n        k += m;\n        }\n      \n      k = u;\n      \n      for(uword v=0; v < r; ++v)\n        {\n        Y[k] = tmp[0];\n        \n        uword j = 0;\n        \n        for(uword w=1; w < r; ++w)\n          {\n          j += stride * k;\n          \n          if(j >= N) { j -= N; }\n          \n          Y[k] += tmp[w] * coeffs[j];\n          }\n        \n        k += m;\n        }\n      }\n    }\n  \n  \n  \n  inline\n  void\n  run(cx_type* Y, const cx_type* X, const uword stage = 0, const uword stride = 1)\n    {\n    arma_extra_debug_sigprint();\n    \n    const uword m = residue[stage];\n    const uword r =   radix[stage];\n    \n    const cx_type *Y_end = Y + r*m;\n    \n    if(m == 1)\n      {\n      for(cx_type* Yi = Y; Yi != Y_end; Yi++, X += stride)  {  (*Yi) = (*X);  }\n      }\n    else\n      {\n      const uword next_stage  = stage + 1;\n      const uword next_stride = stride * r;\n      \n      for(cx_type* Yi = Y; Yi != Y_end; Yi += m, X += stride)  { run(Yi, X, next_stage, next_stride); }\n      }\n    \n    switch(r)\n      {\n      case 2:  butterfly_2(Y, stride, m   );  break;\n      case 3:  butterfly_3(Y, stride, m   );  break;\n      case 4:  butterfly_4(Y, stride, m   );  break;\n      case 5:  butterfly_5(Y, stride, m   );  break;\n      default: butterfly_N(Y, stride, m, r);  break;\n      }\n    }\n\n\n  };\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/field_bones.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Ian Cullinan\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup field\n//! @{\n\n\n\nstruct field_prealloc_n_elem\n  {\n  static const uword val = 16;\n  };\n\n\n\n//! A lightweight 2D container for arbitrary objects\n//! (the objects must have a copy constructor)\n\ntemplate<typename oT>\nclass field\n  {\n  public:\n  \n  typedef oT object_type;\n  \n  const uword n_rows;     //!< number of rows in the field (read-only)\n  const uword n_cols;     //!< number of columns in the field (read-only)\n  const uword n_slices;   //!< number of slices in the field (read-only)\n  const uword n_elem;     //!< number of elements in the field (read-only)\n  \n  \n  private:\n  \n  arma_aligned oT** mem;                                     //!< pointer to memory used by the object\n  arma_aligned oT*  mem_local[ field_prealloc_n_elem::val ]; //!< Internal memory, to avoid calling the 'new' operator for small amounts of memory\n  \n  \n  public:\n  \n  inline ~field();\n  inline  field();\n  \n  inline                  field(const field& x);\n  inline const field& operator=(const field& x);\n  \n  inline                  field(const subview_field<oT>& x);\n  inline const field& operator=(const subview_field<oT>& x);\n  \n  inline explicit field(const uword n_elem_in);\n  inline          field(const uword n_rows_in, const uword n_cols_in);\n  inline          field(const uword n_rows_in, const uword n_cols_in, const uword n_slices_in);\n  \n  inline void  set_size(const uword n_obj_in);\n  inline void  set_size(const uword n_rows_in, const uword n_cols_in);\n  inline void  set_size(const uword n_rows_in, const uword n_cols_in, const uword n_slices_in);\n  \n  template<typename oT2>\n  inline void copy_size(const field<oT2>& x);\n  \n  arma_inline       oT& operator[](const uword i);\n  arma_inline const oT& operator[](const uword i) const;\n  \n  arma_inline       oT&         at(const uword i);\n  arma_inline const oT&         at(const uword i) const;\n  \n  arma_inline       oT& operator()(const uword i);\n  arma_inline const oT& operator()(const uword i) const;\n  \n  arma_inline       oT&         at(const uword row, const uword col);\n  arma_inline const oT&         at(const uword row, const uword col) const;\n\n  arma_inline       oT&         at(const uword row, const uword col, const uword slice);\n  arma_inline const oT&         at(const uword row, const uword col, const uword slice) const;\n  \n  arma_inline       oT& operator()(const uword row, const uword col);\n  arma_inline const oT& operator()(const uword row, const uword col) const;\n\n  arma_inline       oT& operator()(const uword row, const uword col, const uword slice);\n  arma_inline const oT& operator()(const uword row, const uword col, const uword slice) const;\n  \n  inline field_injector<field> operator<<(const oT& val);\n  inline field_injector<field> operator<<(const injector_end_of_row<>& x);\n  \n  \n  inline       subview_field<oT> row(const uword row_num);\n  inline const subview_field<oT> row(const uword row_num) const;\n  \n  inline       subview_field<oT> col(const uword col_num);\n  inline const subview_field<oT> col(const uword col_num) const;\n\n  inline       subview_field<oT> slice(const uword slice_num);\n  inline const subview_field<oT> slice(const uword slice_num) const;\n  \n  inline       subview_field<oT> rows(const uword in_row1, const uword in_row2);\n  inline const subview_field<oT> rows(const uword in_row1, const uword in_row2) const;\n  \n  inline       subview_field<oT> cols(const uword in_col1, const uword in_col2);\n  inline const subview_field<oT> cols(const uword in_col1, const uword in_col2) const;\n  \n  inline       subview_field<oT> slices(const uword in_slice1, const uword in_slice2);\n  inline const subview_field<oT> slices(const uword in_slice1, const uword in_slice2) const;\n  \n  inline       subview_field<oT> subfield(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2);\n  inline const subview_field<oT> subfield(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const;\n  \n  inline       subview_field<oT> subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2);\n  inline const subview_field<oT> subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2) const;\n  \n  inline       subview_field<oT> subfield(const uword in_row1, const uword in_col1, const SizeMat& s);\n  inline const subview_field<oT> subfield(const uword in_row1, const uword in_col1, const SizeMat& s) const;\n  \n  inline       subview_field<oT> subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s);\n  inline const subview_field<oT> subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const;\n  \n  inline       subview_field<oT> subfield(const span& row_span, const span& col_span);\n  inline const subview_field<oT> subfield(const span& row_span, const span& col_span) const;\n  \n  inline       subview_field<oT> subfield(const span& row_span, const span& col_span, const span& slice_span);\n  inline const subview_field<oT> subfield(const span& row_span, const span& col_span, const span& slice_span) const;\n  \n  inline       subview_field<oT> operator()(const span& row_span, const span& col_span);\n  inline const subview_field<oT> operator()(const span& row_span, const span& col_span) const;\n  \n  inline       subview_field<oT> operator()(const span& row_span, const span& col_span, const span& slice_span);\n  inline const subview_field<oT> operator()(const span& row_span, const span& col_span, const span& slice_span) const;\n  \n  inline       subview_field<oT> operator()(const uword in_row1, const uword in_col1, const SizeMat& s);\n  inline const subview_field<oT> operator()(const uword in_row1, const uword in_col1, const SizeMat& s) const;\n  \n  inline       subview_field<oT> operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s);\n  inline const subview_field<oT> operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const;\n  \n  \n  inline void print(const std::string extra_text = \"\") const;\n  inline void print(std::ostream& user_stream, const std::string extra_text = \"\") const;\n  \n  inline void fill(const oT& x);\n  \n  inline void reset();\n  inline void reset_objects();\n  \n  arma_inline bool is_empty() const;\n  \n  \n  arma_inline arma_warn_unused bool in_range(const uword i) const;\n  arma_inline arma_warn_unused bool in_range(const span& x) const;\n  \n  arma_inline arma_warn_unused bool in_range(const uword   in_row, const uword   in_col) const;\n  arma_inline arma_warn_unused bool in_range(const span& row_span, const uword   in_col) const;\n  arma_inline arma_warn_unused bool in_range(const uword   in_row, const span& col_span) const;\n  arma_inline arma_warn_unused bool in_range(const span& row_span, const span& col_span) const;\n  \n  arma_inline arma_warn_unused bool in_range(const uword   in_row, const uword   in_col, const SizeMat& s) const;\n  \n  arma_inline arma_warn_unused bool in_range(const uword   in_row, const uword   in_col, const uword   in_slice) const;\n  arma_inline arma_warn_unused bool in_range(const span& row_span, const span& col_span, const span& slice_span) const;\n  \n  arma_inline arma_warn_unused bool in_range(const uword   in_row, const uword in_col, const uword in_slice, const SizeCube& s) const;\n  \n  \n  inline bool save(const std::string   name, const file_type type = arma_binary, const bool print_status = true) const;\n  inline bool save(      std::ostream& os,   const file_type type = arma_binary, const bool print_status = true) const;\n  \n  inline bool load(const std::string   name, const file_type type = auto_detect, const bool print_status = true);\n  inline bool load(      std::istream& is,   const file_type type = auto_detect, const bool print_status = true);\n  \n  \n  inline bool quiet_save(const std::string   name, const file_type type = arma_binary) const;\n  inline bool quiet_save(      std::ostream& os,   const file_type type = arma_binary) const;\n  \n  inline bool quiet_load(const std::string   name, const file_type type = auto_detect);\n  inline bool quiet_load(      std::istream& is,   const file_type type = auto_detect);\n  \n  \n  // for container-like functionality\n  \n  typedef oT    value_type;\n  typedef uword size_type;\n    \n  \n  class iterator\n    {\n    public:\n    \n    inline iterator(field<oT>& in_M, const bool at_end = false);\n    \n    inline oT& operator* ();\n    \n    inline iterator& operator++();\n    inline void      operator++(int);\n    \n    inline iterator& operator--();\n    inline void      operator--(int);\n    \n    inline bool operator!=(const iterator& X) const;\n    inline bool operator==(const iterator& X) const;\n    \n    arma_aligned field<oT>& M;\n    arma_aligned uword      i;\n    };\n  \n  \n  class const_iterator\n    {\n    public:\n    \n    const_iterator(const field<oT>& in_M, const bool at_end = false);\n    const_iterator(const iterator& X);\n    \n    inline const oT& operator*() const;\n    \n    inline const_iterator& operator++();\n    inline void            operator++(int);\n    \n    inline const_iterator& operator--();\n    inline void            operator--(int);\n    \n    inline bool operator!=(const const_iterator& X) const;\n    inline bool operator==(const const_iterator& X) const;\n    \n    arma_aligned const field<oT>& M;\n    arma_aligned       uword      i;\n    };\n  \n  inline       iterator  begin();\n  inline const_iterator  begin() const;\n  inline const_iterator cbegin() const;\n  \n  inline       iterator  end();\n  inline const_iterator  end() const;\n  inline const_iterator cend() const;\n  \n  inline void  clear();\n  inline bool  empty() const;\n  inline uword size()  const;\n  \n    \n  private:\n  \n  inline void init(const field<oT>& x);\n  inline void init(const uword n_rows_in, const uword n_cols_in);\n  inline void init(const uword n_rows_in, const uword n_cols_in, const uword n_slices_in);\n  \n  inline void delete_objects();\n  inline void create_objects();\n  \n  friend class field_aux;\n  friend class subview_field<oT>;\n  \n  \n  public:\n  \n  #ifdef ARMA_EXTRA_FIELD_PROTO\n    #include ARMA_INCFILE_WRAP(ARMA_EXTRA_FIELD_PROTO)\n  #endif\n  };\n\n\n\nclass field_aux\n  {\n  public:\n  \n  template<typename oT> inline static void reset_objects(field< oT >& x);\n  template<typename eT> inline static void reset_objects(field< Mat<eT> >& x);\n  template<typename eT> inline static void reset_objects(field< Col<eT> >& x);\n  template<typename eT> inline static void reset_objects(field< Row<eT> >& x);\n  template<typename eT> inline static void reset_objects(field< Cube<eT> >& x);\n                        inline static void reset_objects(field< std::string >& x);\n  \n  \n  template<typename oT> inline static bool save(const field< oT >& x,       const std::string&  name, const file_type type, std::string& err_msg);\n  template<typename oT> inline static bool save(const field< oT >& x,             std::ostream& os,   const file_type type, std::string& err_msg);\n  template<typename oT> inline static bool load(      field< oT >& x,       const std::string&  name, const file_type type, std::string& err_msg);\n  template<typename oT> inline static bool load(      field< oT >& x,             std::istream& is,   const file_type type, std::string& err_msg);\n\n  template<typename eT> inline static bool save(const field< Mat<eT> >& x,  const std::string&  name, const file_type type, std::string& err_msg);\n  template<typename eT> inline static bool save(const field< Mat<eT> >& x,        std::ostream& os,   const file_type type, std::string& err_msg);\n  template<typename eT> inline static bool load(      field< Mat<eT> >& x,  const std::string&  name, const file_type type, std::string& err_msg);\n  template<typename eT> inline static bool load(      field< Mat<eT> >& x,        std::istream& is,   const file_type type, std::string& err_msg);\n  \n  template<typename eT> inline static bool save(const field< Col<eT> >& x,  const std::string&  name, const file_type type, std::string& err_msg);\n  template<typename eT> inline static bool save(const field< Col<eT> >& x,        std::ostream& os,   const file_type type, std::string& err_msg);\n  template<typename eT> inline static bool load(      field< Col<eT> >& x,  const std::string&  name, const file_type type, std::string& err_msg);\n  template<typename eT> inline static bool load(      field< Col<eT> >& x,        std::istream& is,   const file_type type, std::string& err_msg);\n  \n  template<typename eT> inline static bool save(const field< Row<eT> >& x,  const std::string&  name, const file_type type, std::string& err_msg);\n  template<typename eT> inline static bool save(const field< Row<eT> >& x,        std::ostream& os,   const file_type type, std::string& err_msg);\n  template<typename eT> inline static bool load(      field< Row<eT> >& x,  const std::string&  name, const file_type type, std::string& err_msg);\n  template<typename eT> inline static bool load(      field< Row<eT> >& x,        std::istream& is,   const file_type type, std::string& err_msg);\n\n  template<typename eT> inline static bool save(const field< Cube<eT> >& x, const std::string&  name, const file_type type, std::string& err_msg);\n  template<typename eT> inline static bool save(const field< Cube<eT> >& x,       std::ostream& os,   const file_type type, std::string& err_msg);\n  template<typename eT> inline static bool load(      field< Cube<eT> >& x, const std::string&  name, const file_type type, std::string& err_msg);\n  template<typename eT> inline static bool load(      field< Cube<eT> >& x,       std::istream& is,   const file_type type, std::string& err_msg);\n  \n  inline static bool save(const field< std::string >& x, const std::string&  name, const file_type type, std::string& err_msg);\n  inline static bool save(const field< std::string >& x,       std::ostream& os,   const file_type type, std::string& err_msg);\n  inline static bool load(      field< std::string >& x, const std::string&  name, const file_type type, std::string& err_msg);\n  inline static bool load(      field< std::string >& x,       std::istream& is,   const file_type type, std::string& err_msg);\n  \n  };\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/field_meat.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Ian Cullinan\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup field\n//! @{\n\n\ntemplate<typename oT>\ninline\nfield<oT>::~field()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  delete_objects();\n  \n  if(n_elem > sizeof(mem_local)/sizeof(oT*) )\n    {\n    delete [] mem;\n    }\n  \n  if(arma_config::debug == true)\n    {\n    // try to expose buggy user code that accesses deleted objects\n    mem = 0;\n    }\n  }\n\n\n\ntemplate<typename oT>\ninline\nfield<oT>::field()\n  : n_rows(0)\n  , n_cols(0)\n  , n_slices(0)\n  , n_elem(0)\n  , mem(0)\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\n//! construct a field from a given field\ntemplate<typename oT>\ninline\nfield<oT>::field(const field& x)\n  : n_rows(0)\n  , n_cols(0)\n  , n_slices(0)\n  , n_elem(0)\n  , mem(0)\n  {\n  arma_extra_debug_sigprint(arma_boost::format(\"this = %x   x = %x\") % this % &x);\n  \n  init(x);\n  }\n\n\n\n//! construct a field from a given field\ntemplate<typename oT>\ninline\nconst field<oT>&\nfield<oT>::operator=(const field& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  init(x);\n  return *this;\n  }\n\n\n\n//! construct a field from subview_field (e.g. construct a field from a delayed subfield operation)\ntemplate<typename oT>\ninline\nfield<oT>::field(const subview_field<oT>& X)\n  : n_rows(0)\n  , n_cols(0)\n  , n_slices(0)\n  , n_elem(0)\n  , mem(0)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  this->operator=(X);\n  }\n\n\n\n//! construct a field from subview_field (e.g. construct a field from a delayed subfield operation)\ntemplate<typename oT>\ninline\nconst field<oT>&\nfield<oT>::operator=(const subview_field<oT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_field<oT>::extract(*this, X);\n  return *this;\n  }\n\n\n\n//! construct the field with the specified number of elements,\n//! assuming a column-major layout\ntemplate<typename oT>\ninline\nfield<oT>::field(const uword n_elem_in)\n  : n_rows(0)\n  , n_cols(0)\n  , n_slices(0)\n  , n_elem(0)\n  , mem(0)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init(n_elem_in, 1);\n  }\n\n\n\n//! construct the field with the specified dimensions\ntemplate<typename oT>\ninline\nfield<oT>::field(const uword n_rows_in, const uword n_cols_in)\n  : n_rows(0)\n  , n_cols(0)\n  , n_slices(0)\n  , n_elem(0)\n  , mem(0)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init(n_rows_in, n_cols_in);\n  }\n\n\n\n//! construct the field with the specified dimensions\ntemplate<typename oT>\ninline\nfield<oT>::field(const uword n_rows_in, const uword n_cols_in, const uword n_slices_in)\n  : n_rows(0)\n  , n_cols(0)\n  , n_slices(0)\n  , n_elem(0)\n  , mem(0)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init(n_rows_in, n_cols_in, n_slices_in);\n  }\n\n\n\n//! change the field to have the specified number of elements,\n//! assuming a column-major layout (data is not preserved)\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::set_size(const uword n_elem_in)\n  {\n  arma_extra_debug_sigprint(arma_boost::format(\"n_elem_in = %d\") % n_elem_in);\n  \n  init(n_elem_in, 1);\n  }\n\n\n\n//! change the field to have the specified dimensions (data is not preserved)\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::set_size(const uword n_rows_in, const uword n_cols_in)\n  {\n  arma_extra_debug_sigprint(arma_boost::format(\"n_rows_in = %d, n_cols_in = %d\") % n_rows_in % n_cols_in);\n  \n  init(n_rows_in, n_cols_in);\n  }\n\n\n\n//! change the field to have the specified dimensions (data is not preserved)\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::set_size(const uword n_rows_in, const uword n_cols_in, const uword n_slices_in)\n  {\n  arma_extra_debug_sigprint(arma_boost::format(\"n_rows_in = %d, n_cols_in = %d, n_slices_in = %d\") % n_rows_in % n_cols_in % n_slices_in);\n  \n  init(n_rows_in, n_cols_in, n_slices_in);\n  }\n\n\n\n//! change the field to have the specified dimensions (data is not preserved)\ntemplate<typename oT>\ntemplate<typename oT2>\ninline\nvoid\nfield<oT>::copy_size(const field<oT2>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  init(x.n_rows, x.n_cols, x.n_slices);\n  }\n\n\n\n//! linear element accessor (treats the field as a vector); no bounds check\ntemplate<typename oT>\narma_inline\noT&\nfield<oT>::operator[] (const uword i)\n  {\n  return (*mem[i]);\n  }\n  \n  \n  \n//! linear element accessor (treats the field as a vector); no bounds check\ntemplate<typename oT>\narma_inline\nconst oT&\nfield<oT>::operator[] (const uword i) const\n  {\n  return (*mem[i]);\n  }\n\n\n\n//! linear element accessor (treats the field as a vector); no bounds check\ntemplate<typename oT>\narma_inline\noT&\nfield<oT>::at(const uword i)\n  {\n  return (*mem[i]);\n  }\n  \n  \n  \n//! linear element accessor (treats the field as a vector); no bounds check\ntemplate<typename oT>\narma_inline\nconst oT&\nfield<oT>::at(const uword i) const\n  {\n  return (*mem[i]);\n  }\n\n\n\n//! linear element accessor (treats the field as a vector); bounds checking not done when ARMA_NO_DEBUG is defined\ntemplate<typename oT>\narma_inline\noT&\nfield<oT>::operator() (const uword i)\n  {\n  arma_debug_check( (i >= n_elem), \"field::operator(): index out of bounds\");\n  return (*mem[i]);\n  }\n  \n  \n  \n//! linear element accessor (treats the field as a vector); bounds checking not done when ARMA_NO_DEBUG is defined\ntemplate<typename oT>\narma_inline\nconst oT&\nfield<oT>::operator() (const uword i) const\n  {\n  arma_debug_check( (i >= n_elem), \"field::operator(): index out of bounds\");\n  return (*mem[i]);\n  }\n\n\n\n//! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined\ntemplate<typename oT>\narma_inline\noT&\nfield<oT>::operator() (const uword in_row, const uword in_col)\n  {\n  arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), \"field::operator(): index out of bounds\");\n  return (*mem[in_row + in_col*n_rows]);\n  }\n\n\n\n//! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined\ntemplate<typename oT>\narma_inline\nconst oT&\nfield<oT>::operator() (const uword in_row, const uword in_col) const\n  {\n  arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), \"field::operator(): index out of bounds\");\n  return (*mem[in_row + in_col*n_rows]);\n  }\n\n\n\n//! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined\ntemplate<typename oT>\narma_inline\noT&\nfield<oT>::operator() (const uword in_row, const uword in_col, const uword in_slice)\n  {\n  arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices)), \"field::operator(): index out of bounds\");\n  return (*mem[in_row + in_col*n_rows + in_slice*(n_rows*n_cols)]);\n  }\n\n\n\n//! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined\ntemplate<typename oT>\narma_inline\nconst oT&\nfield<oT>::operator() (const uword in_row, const uword in_col, const uword in_slice) const\n  {\n  arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices)), \"field::operator(): index out of bounds\");\n  return (*mem[in_row + in_col*n_rows + in_slice*(n_rows*n_cols)]);\n  }\n\n\n\n//! element accessor; no bounds check\ntemplate<typename oT>\narma_inline\noT&\nfield<oT>::at(const uword in_row, const uword in_col)\n  {\n  return (*mem[in_row + in_col*n_rows]);\n  }\n\n\n\n//! element accessor; no bounds check\ntemplate<typename oT>\narma_inline\nconst oT&\nfield<oT>::at(const uword in_row, const uword in_col) const\n  {\n  return (*mem[in_row + in_col*n_rows]);\n  }\n\n\n\n//! element accessor; no bounds check\ntemplate<typename oT>\narma_inline\noT&\nfield<oT>::at(const uword in_row, const uword in_col, const uword in_slice)\n  {\n  return (*mem[in_row + in_col*n_rows + in_slice*(n_rows*n_cols)]);\n  }\n\n\n\n//! element accessor; no bounds check\ntemplate<typename oT>\narma_inline\nconst oT&\nfield<oT>::at(const uword in_row, const uword in_col, const uword in_slice) const\n  {\n  return (*mem[in_row + in_col*n_rows + in_slice*(n_rows*n_cols)]);\n  }\n\n\n\ntemplate<typename oT>\ninline\nfield_injector< field<oT> >\nfield<oT>::operator<<(const oT& val)\n  {\n  return field_injector< field<oT> >(*this, val);\n  }\n\n\n\ntemplate<typename oT>\ninline\nfield_injector< field<oT> >\nfield<oT>::operator<<(const injector_end_of_row<>& x)\n  {\n  return field_injector< field<oT> >(*this, x);\n  }\n\n\n\n//! creation of subview_field (row of a field)\ntemplate<typename oT>\ninline\nsubview_field<oT>\nfield<oT>::row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (n_slices >= 2), \"field::row(): field must be 2D\" );\n\n  arma_debug_check( (row_num >= n_rows), \"field::row(): row out of bounds\" );\n  \n  return subview_field<oT>(*this, row_num, 0, 1, n_cols);\n  }\n\n\n\n//! creation of subview_field (row of a field)\ntemplate<typename oT>\ninline\nconst subview_field<oT>\nfield<oT>::row(const uword row_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (n_slices >= 2), \"field::row(): field must be 2D\" );\n\n  arma_debug_check( (row_num >= n_rows), \"field::row(): row out of bounds\" );\n  \n  return subview_field<oT>(*this, row_num, 0, 1, n_cols);\n  }\n\n\n\n//! creation of subview_field (column of a field)\ntemplate<typename oT>\ninline\nsubview_field<oT>\nfield<oT>::col(const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (n_slices >= 2), \"field::col(): field must be 2D\" );\n\n  arma_debug_check( (col_num >= n_cols), \"field::col(): out of bounds\");\n  \n  return subview_field<oT>(*this, 0, col_num, n_rows, 1);\n  }\n\n\n\n//! creation of subview_field (column of a field)\ntemplate<typename oT>\ninline\nconst subview_field<oT>\nfield<oT>::col(const uword col_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (n_slices >= 2), \"field::col(): field must be 2D\" );\n\n  arma_debug_check( (col_num >= n_cols), \"field::col(): out of bounds\");\n  \n  return subview_field<oT>(*this, 0, col_num, n_rows, 1);\n  }\n\n\n\n//! creation of subview_field (slice of a field)\ntemplate<typename oT>\ninline\nsubview_field<oT>\nfield<oT>::slice(const uword slice_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (slice_num >= n_slices), \"field::slice(): out of bounds\");\n  \n  return subview_field<oT>(*this, 0, 0, slice_num, n_rows, n_cols, 1);\n  }\n\n\n\n//! creation of subview_field (slice of a field)\ntemplate<typename oT>\ninline\nconst subview_field<oT>\nfield<oT>::slice(const uword slice_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (slice_num >= n_slices), \"field::slice(): out of bounds\");\n  \n  return subview_field<oT>(*this, 0, 0, slice_num, n_rows, n_cols, 1);\n  }\n\n\n\n//! creation of subview_field (subfield comprised of specified rows)\ntemplate<typename oT>\ninline\nsubview_field<oT>\nfield<oT>::rows(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (n_slices >= 2), \"field::rows(): field must be 2D\" );\n  \n  arma_debug_check\n    (\n    ( (in_row1 > in_row2) || (in_row2 >= n_rows) ),\n    \"field::rows(): indicies out of bounds or incorrectly used\"\n    );\n  \n  const uword sub_n_rows = in_row2 - in_row1 + 1;\n  \n  return subview_field<oT>(*this, in_row1, 0, sub_n_rows, n_cols);\n  }\n\n\n\n//! creation of subview_field (subfield comprised of specified rows)\ntemplate<typename oT>\ninline\nconst subview_field<oT>\nfield<oT>::rows(const uword in_row1, const uword in_row2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (n_slices >= 2), \"field::rows(): field must be 2D\" );\n  \n  arma_debug_check\n    (\n    ( (in_row1 > in_row2) || (in_row2 >= n_rows) ),\n    \"field::rows(): indicies out of bounds or incorrectly used\"\n    );\n  \n  const uword sub_n_rows = in_row2 - in_row1 + 1;\n  \n  return subview_field<oT>(*this, in_row1, 0, sub_n_rows, n_cols);\n  }\n\n\n\n//! creation of subview_field (subfield comprised of specified columns)\ntemplate<typename oT>\ninline\nsubview_field<oT>\nfield<oT>::cols(const uword in_col1, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (n_slices >= 2), \"field::cols(): field must be 2D\" );\n  \n  arma_debug_check\n    (\n    ( (in_col1 > in_col2) || (in_col2 >= n_cols) ),\n    \"field::cols(): indicies out of bounds or incorrectly used\"\n    );\n  \n  const uword sub_n_cols = in_col2 - in_col1 + 1;\n  \n  return subview_field<oT>(*this, 0, in_col1, n_rows, sub_n_cols);\n  }\n\n\n\n//! creation of subview_field (subfield comprised of specified columns)\ntemplate<typename oT>\ninline\nconst subview_field<oT>\nfield<oT>::cols(const uword in_col1, const uword in_col2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (n_slices >= 2), \"field::cols(): field must be 2D\" );\n  \n  arma_debug_check\n    (\n    ( (in_col1 > in_col2) || (in_col2 >= n_cols) ),\n    \"field::cols(): indicies out of bounds or incorrectly used\"\n    );\n  \n  const uword sub_n_cols = in_col2 - in_col1 + 1;\n  \n  return subview_field<oT>(*this, 0, in_col1, n_rows, sub_n_cols);\n  }\n\n\n\n//! creation of subview_field (subfield comprised of specified slices)\ntemplate<typename oT>\ninline\nsubview_field<oT>\nfield<oT>::slices(const uword in_slice1, const uword in_slice2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    ( (in_slice1 > in_slice2) || (in_slice2 >= n_slices) ),\n    \"field::slices(): indicies out of bounds or incorrectly used\"\n    );\n  \n  const uword sub_n_slices = in_slice2 - in_slice1 + 1;\n  \n  return subview_field<oT>(*this, 0, 0, in_slice1, n_rows, n_cols, sub_n_slices);\n  }\n\n\n\n//! creation of subview_field (subfield comprised of specified slices)\ntemplate<typename oT>\ninline\nconst subview_field<oT>\nfield<oT>::slices(const uword in_slice1, const uword in_slice2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    ( (in_slice1 > in_slice2) || (in_slice2 >= n_slices) ),\n    \"field::slices(): indicies out of bounds or incorrectly used\"\n    );\n  \n  const uword sub_n_slices = in_slice2 - in_slice1 + 1;\n  \n  return subview_field<oT>(*this, 0, 0, in_slice1, n_rows, n_cols, sub_n_slices);\n  }\n\n\n\n//! creation of subview_field (subfield with arbitrary dimensions)\ntemplate<typename oT>\ninline\nsubview_field<oT>\nfield<oT>::subfield(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (n_slices >= 2), \"field::subfield(): field must be 2D\" );\n  \n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),\n    \"field::subfield(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword sub_n_rows = in_row2 - in_row1 + 1;\n  const uword sub_n_cols = in_col2 - in_col1 + 1;\n  \n  return subview_field<oT>(*this, in_row1, in_col1, sub_n_rows, sub_n_cols);\n  }\n\n\n\n//! creation of subview_field (subfield with arbitrary dimensions)\ntemplate<typename oT>\ninline\nconst subview_field<oT>\nfield<oT>::subfield(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (n_slices >= 2), \"field::subfield(): field must be 2D\" );\n  \n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),\n    \"field::subfield(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword sub_n_rows = in_row2 - in_row1 + 1;\n  const uword sub_n_cols = in_col2 - in_col1 + 1;\n  \n  return subview_field<oT>(*this, in_row1, in_col1, sub_n_rows, sub_n_cols);\n  }\n\n\n\n//! creation of subview_field (subfield with arbitrary dimensions)\ntemplate<typename oT>\ninline\nsubview_field<oT>\nfield<oT>::subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_col1 > in_col2) || (in_slice1 > in_slice2) || (in_row2 >= n_rows) || (in_col2 >= n_cols) || (in_slice2 >= n_slices),\n    \"field::subfield(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword sub_n_rows   = in_row2   - in_row1   + 1;\n  const uword sub_n_cols   = in_col2   - in_col1   + 1;\n  const uword sub_n_slices = in_slice2 - in_slice1 + 1;\n  \n  return subview_field<oT>(*this, in_row1, in_col1, in_slice1, sub_n_rows, sub_n_cols, sub_n_slices);\n  }\n\n\n\n//! creation of subview_field (subfield with arbitrary dimensions)\ntemplate<typename oT>\ninline\nconst subview_field<oT>\nfield<oT>::subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_col1 > in_col2) || (in_slice1 > in_slice2) || (in_row2 >= n_rows) || (in_col2 >= n_cols) || (in_slice2 >= n_slices),\n    \"field::subfield(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword sub_n_rows   = in_row2   - in_row1   + 1;\n  const uword sub_n_cols   = in_col2   - in_col1   + 1;\n  const uword sub_n_slices = in_slice2 - in_slice1 + 1;\n  \n  return subview_field<oT>(*this, in_row1, in_col1, in_slice1, sub_n_rows, sub_n_cols, sub_n_slices);\n  }\n\n\n\n//! creation of subview_field (subfield with arbitrary dimensions)\ntemplate<typename oT>\ninline\nsubview_field<oT>\nfield<oT>::subfield(const uword in_row1, const uword in_col1, const SizeMat& s)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (n_slices >= 2), \"field::subfield(): field must be 2D\" );\n  \n  const uword l_n_rows = n_rows;\n  const uword l_n_cols = n_cols;\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  \n  arma_debug_check\n    (\n    ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols)),\n    \"field::subfield(): indices or size out of bounds\"\n    );\n  \n  return subview_field<oT>(*this, in_row1, in_col1, s_n_rows, s_n_cols);\n  }\n\n\n\n//! creation of subview_field (subfield with arbitrary dimensions)\ntemplate<typename oT>\ninline\nconst subview_field<oT>\nfield<oT>::subfield(const uword in_row1, const uword in_col1, const SizeMat& s) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (n_slices >= 2), \"field::subfield(): field must be 2D\" );\n  \n  const uword l_n_rows = n_rows;\n  const uword l_n_cols = n_cols;\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  \n  arma_debug_check\n    (\n    ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols)),\n    \"field::subfield(): indices or size out of bounds\"\n    );\n  \n  return subview_field<oT>(*this, in_row1, in_col1, s_n_rows, s_n_cols);\n  }\n\n\n\n//! creation of subview_field (subfield with arbitrary dimensions)\ntemplate<typename oT>\ninline\nsubview_field<oT>\nfield<oT>::subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword l_n_rows   = n_rows;\n  const uword l_n_cols   = n_cols;\n  const uword l_n_slices = n_slices;\n  \n  const uword s_n_rows     = s.n_rows;\n  const uword s_n_cols     = s.n_cols;\n  const uword sub_n_slices = s.n_slices;\n  \n  arma_debug_check\n    (\n    ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || (in_slice1 >= l_n_slices) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols) || ((in_slice1 + sub_n_slices) > l_n_slices)),\n    \"field::subfield(): indices or size out of bounds\"\n    );\n  \n  return subview_field<oT>(*this, in_row1, in_col1, in_slice1, s_n_rows, s_n_cols, sub_n_slices);\n  }\n\n\n\n//! creation of subview_field (subfield with arbitrary dimensions)\ntemplate<typename oT>\ninline\nconst subview_field<oT>\nfield<oT>::subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword l_n_rows = n_rows;\n  const uword l_n_cols = n_cols;\n  const uword l_n_slices = n_slices;\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  const uword sub_n_slices = s.n_slices;\n  \n  arma_debug_check\n    (\n    ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || (in_slice1 >= l_n_slices) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols) || ((in_slice1 + sub_n_slices) > l_n_slices)),\n    \"field::subfield(): indices or size out of bounds\"\n    );\n  \n  return subview_field<oT>(*this, in_row1, in_col1, in_slice1, s_n_rows, s_n_cols, sub_n_slices);\n  }\n\n\n\n//! creation of subview_field (subfield with arbitrary dimensions)\ntemplate<typename oT>\ninline\nsubview_field<oT>\nfield<oT>::subfield(const span& row_span, const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (n_slices >= 2), \"field::subfield(): field must be 2D\" );\n  \n  const bool row_all = row_span.whole;\n  const bool col_all = col_span.whole;\n  \n  const uword local_n_rows = n_rows;\n  const uword local_n_cols = n_cols;\n  \n  const uword in_row1    = row_all ? 0            : row_span.a;\n  const uword in_row2    =                          row_span.b;\n  const uword sub_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  const uword in_col1    = col_all ? 0            : col_span.a;\n  const uword in_col2    =                          col_span.b;\n  const uword sub_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  arma_debug_check\n    (\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,\n    \"field::subfield(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview_field<oT>(*this, in_row1, in_col1, sub_n_rows, sub_n_cols);\n  }\n\n\n\n//! creation of subview_field (subfield with arbitrary dimensions)\ntemplate<typename oT>\ninline\nconst subview_field<oT>\nfield<oT>::subfield(const span& row_span, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (n_slices >= 2), \"field::subfield(): field must be 2D\" );\n  \n  const bool row_all = row_span.whole;\n  const bool col_all = col_span.whole;\n  \n  const uword local_n_rows = n_rows;\n  const uword local_n_cols = n_cols;\n  \n  const uword in_row1    = row_all ? 0            : row_span.a;\n  const uword in_row2    =                          row_span.b;\n  const uword sub_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  const uword in_col1    = col_all ? 0            : col_span.a;\n  const uword in_col2    =                          col_span.b;\n  const uword sub_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  arma_debug_check\n    (\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,\n    \"field::subfield(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview_field<oT>(*this, in_row1, in_col1, sub_n_rows, sub_n_cols);\n  }\n\n\n\n//! creation of subview_field (subfield with arbitrary dimensions)\ntemplate<typename oT>\ninline\nsubview_field<oT>\nfield<oT>::subfield(const span& row_span, const span& col_span, const span& slice_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all   = row_span.whole;\n  const bool col_all   = col_span.whole;\n  const bool slice_all = slice_span.whole;\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  const uword in_row1    = row_all ? 0            : row_span.a;\n  const uword in_row2    =                          row_span.b;\n  const uword sub_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  const uword in_col1    = col_all ? 0            : col_span.a;\n  const uword in_col2    =                          col_span.b;\n  const uword sub_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  const uword in_slice1    = slice_all ? 0              : slice_span.a;\n  const uword in_slice2    =                              slice_span.b;\n  const uword sub_n_slices = slice_all ? local_n_slices : in_slice2 - in_slice1 + 1;\n\n  arma_debug_check\n    (\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ||\n    ( slice_all ? false : ((in_slice1 > in_slice2) || (in_slice2 >= local_n_slices)) )\n    ,\n    \"field::subfield(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview_field<oT>(*this, in_row1, in_col1, in_slice1, sub_n_rows, sub_n_cols, sub_n_slices);\n  }\n\n\n\n//! creation of subview_field (subfield with arbitrary dimensions)\ntemplate<typename oT>\ninline\nconst subview_field<oT>\nfield<oT>::subfield(const span& row_span, const span& col_span, const span& slice_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all   = row_span.whole;\n  const bool col_all   = col_span.whole;\n  const bool slice_all = slice_span.whole;\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  const uword in_row1    = row_all ? 0            : row_span.a;\n  const uword in_row2    =                          row_span.b;\n  const uword sub_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  const uword in_col1    = col_all ? 0            : col_span.a;\n  const uword in_col2    =                          col_span.b;\n  const uword sub_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  const uword in_slice1    = slice_all ? 0              : slice_span.a;\n  const uword in_slice2    =                              slice_span.b;\n  const uword sub_n_slices = slice_all ? local_n_slices : in_slice2 - in_slice1 + 1;\n\n  arma_debug_check\n    (\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ||\n    ( slice_all ? false : ((in_slice1 > in_slice2) || (in_slice2 >= local_n_slices)) )\n    ,\n    \"field::subfield(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview_field<oT>(*this, in_row1, in_col1, in_slice1, sub_n_rows, sub_n_cols, sub_n_slices);\n  }\n\n\n\ntemplate<typename oT>\ninline\nsubview_field<oT>\nfield<oT>::operator()(const span& row_span, const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).subfield(row_span, col_span);\n  }\n\n\n\ntemplate<typename oT>\ninline\nconst subview_field<oT>\nfield<oT>::operator()(const span& row_span, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).subfield(row_span, col_span);\n  }\n\n\n\ntemplate<typename oT>\ninline\nsubview_field<oT>\nfield<oT>::operator()(const span& row_span, const span& col_span, const span& slice_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).subfield(row_span, col_span, slice_span);\n  }\n\n\n\ntemplate<typename oT>\ninline\nconst subview_field<oT>\nfield<oT>::operator()(const span& row_span, const span& col_span, const span& slice_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).subfield(row_span, col_span, slice_span);\n  }\n\n\n\ntemplate<typename oT>\ninline\nsubview_field<oT>\nfield<oT>::operator()(const uword in_row1, const uword in_col1, const SizeMat& s)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).subfield(in_row1, in_col1, s);\n  }\n\n\n\ntemplate<typename oT>\ninline\nconst subview_field<oT>\nfield<oT>::operator()(const uword in_row1, const uword in_col1, const SizeMat& s) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).subfield(in_row1, in_col1, s);\n  }\n\n\n\ntemplate<typename oT>\ninline\nsubview_field<oT>\nfield<oT>::operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).subfield(in_row1, in_col1, in_slice1, s);\n  }\n\n\n\ntemplate<typename oT>\ninline\nconst subview_field<oT>\nfield<oT>::operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).subfield(in_row1, in_col1, in_slice1, s);\n  }\n\n\n\n//! print contents of the field (to the cout stream),\n//! optionally preceding with a user specified line of text.\n//! the field class preserves the stream's flags\n//! but the associated operator<< function for type oT \n//! may still modify the stream's parameters.\n//! NOTE: this function assumes that type oT can be printed,\n//! i.e. the function \"std::ostream& operator<< (std::ostream&, const oT&)\"\n//! has been defined.\n\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::print(const std::string extra_text) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = ARMA_DEFAULT_OSTREAM.width();\n    \n    ARMA_DEFAULT_OSTREAM << extra_text << '\\n';\n  \n    ARMA_DEFAULT_OSTREAM.width(orig_width);\n    }\n  \n  arma_ostream::print(ARMA_DEFAULT_OSTREAM, *this);\n  }\n\n\n\n//! print contents of the field to a user specified stream,\n//! optionally preceding with a user specified line of text.\n//! the field class preserves the stream's flags\n//! but the associated operator<< function for type oT \n//! may still modify the stream's parameters.\n//! NOTE: this function assumes that type oT can be printed,\n//! i.e. the function \"std::ostream& operator<< (std::ostream&, const oT&)\"\n//! has been defined.\n\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::print(std::ostream& user_stream, const std::string extra_text) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = user_stream.width();\n    \n    user_stream << extra_text << '\\n';\n  \n    user_stream.width(orig_width);\n    }\n  \n  arma_ostream::print(user_stream, *this);\n  }\n\n\n\n//! fill the field with an object\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::fill(const oT& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  field<oT>& t = *this;\n  \n  for(uword i=0; i<n_elem; ++i)\n    {\n    t[i] = x;\n    }\n  }\n\n\n\n//! reset the field to an empty state (i.e. the field will have no objects)\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::reset()\n  {\n  arma_extra_debug_sigprint();\n  \n  init(0,0,0);\n  }\n\n\n\n//! reset each object\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::reset_objects()\n  {\n  arma_extra_debug_sigprint();\n  \n  field_aux::reset_objects(*this);\n  }\n\n\n\n//! returns true if the field has no objects\ntemplate<typename oT>\narma_inline\nbool\nfield<oT>::is_empty() const\n  {\n  return (n_elem == 0);\n  }\n\n\n\n//! returns true if the given index is currently in range\ntemplate<typename oT>\narma_inline\narma_warn_unused\nbool\nfield<oT>::in_range(const uword i) const\n  {\n  return (i < n_elem);\n  }\n\n\n\n//! returns true if the given start and end indices are currently in range\ntemplate<typename oT>\narma_inline\narma_warn_unused\nbool\nfield<oT>::in_range(const span& x) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(x.whole == true)\n    {\n    return true;\n    }\n  else\n    {\n    const uword a = x.a;\n    const uword b = x.b;\n    \n    return ( (a <= b) && (b < n_elem) );\n    }\n  }\n\n\n\n//! returns true if the given location is currently in range\ntemplate<typename oT>\narma_inline\narma_warn_unused\nbool\nfield<oT>::in_range(const uword in_row, const uword in_col) const\n  {\n  return ( (in_row < n_rows) && (in_col < n_cols) );\n  }\n\n\n\ntemplate<typename oT>\narma_inline\narma_warn_unused\nbool\nfield<oT>::in_range(const span& row_span, const uword in_col) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(row_span.whole == true)\n    {\n    return (in_col < n_cols);\n    }\n  else\n    {\n    const uword in_row1 = row_span.a;\n    const uword in_row2 = row_span.b;\n    \n    return ( (in_row1 <= in_row2) && (in_row2 < n_rows) && (in_col < n_cols) );\n    }\n  }\n\n\n\ntemplate<typename oT>\narma_inline\narma_warn_unused\nbool\nfield<oT>::in_range(const uword in_row, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(col_span.whole == true)\n    {\n    return (in_row < n_rows);\n    }\n  else\n    {\n    const uword in_col1 = col_span.a;\n    const uword in_col2 = col_span.b;\n  \n    return ( (in_row < n_rows) && (in_col1 <= in_col2) && (in_col2 < n_cols) );\n    }\n  }\n\n\n\ntemplate<typename oT>\narma_inline\narma_warn_unused\nbool\nfield<oT>::in_range(const span& row_span, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword in_row1 = row_span.a;\n  const uword in_row2 = row_span.b;\n  \n  const uword in_col1 = col_span.a;\n  const uword in_col2 = col_span.b;\n  \n  const bool rows_ok = row_span.whole ? true : ( (in_row1 <= in_row2) && (in_row2 < n_rows) );\n  const bool cols_ok = col_span.whole ? true : ( (in_col1 <= in_col2) && (in_col2 < n_cols) );\n  \n  return ( (rows_ok == true) && (cols_ok == true) );\n  }\n\n\n\ntemplate<typename oT>\narma_inline\narma_warn_unused\nbool\nfield<oT>::in_range(const uword in_row, const uword in_col, const SizeMat& s) const\n  {\n  const uword l_n_rows = n_rows;\n  const uword l_n_cols = n_cols;\n  \n  if( (in_row >= l_n_rows) || (in_col >= l_n_cols) || ((in_row + s.n_rows) > l_n_rows) || ((in_col + s.n_cols) > l_n_cols) )\n    {\n    return false;\n    }\n  else\n    {\n    return true;\n    }\n  }\n\n\n\ntemplate<typename oT>\narma_inline\narma_warn_unused\nbool\nfield<oT>::in_range(const uword in_row, const uword in_col, const uword in_slice) const\n  {\n  return ( (in_row < n_rows) && (in_col < n_cols) && (in_slice < n_slices) );\n  }\n\n\n\ntemplate<typename oT>\narma_inline\narma_warn_unused\nbool\nfield<oT>::in_range(const span& row_span, const span& col_span, const span& slice_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword in_row1 = row_span.a;\n  const uword in_row2 = row_span.b;\n\n  const uword in_col1 = col_span.a;\n  const uword in_col2 = col_span.b;\n  \n  const uword in_slice1 = slice_span.a;\n  const uword in_slice2 = slice_span.b;\n  \n  const bool   rows_ok =   row_span.whole ? true : ( (in_row1   <= in_row2  ) && (in_row2   < n_rows  ) );\n  const bool   cols_ok =   col_span.whole ? true : ( (in_col1   <= in_col2  ) && (in_col2   < n_cols  ) );\n  const bool slices_ok = slice_span.whole ? true : ( (in_slice1 <= in_slice2) && (in_slice2 < n_slices) );\n  \n  return ( (rows_ok == true) && (cols_ok == true) && (slices_ok == true) );\n  }\n\n\n\ntemplate<typename oT>\narma_inline\narma_warn_unused\nbool\nfield<oT>::in_range(const uword in_row, const uword in_col, const uword in_slice, const SizeCube& s) const\n  {\n  const uword l_n_rows = n_rows;\n  const uword l_n_cols = n_cols;\n  const uword l_n_slices = n_slices;\n  \n  if( (in_row >= l_n_rows) || (in_col >= l_n_cols) || (in_slice >= l_n_slices) || ((in_row + s.n_rows) > l_n_rows) || ((in_col + s.n_cols) > l_n_cols) || ((in_slice + s.n_slices) > l_n_slices) )\n    {\n    return false;\n    }\n  else\n    {\n    return true;\n    }\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield<oT>::save(const std::string name, const file_type type, const bool print_status) const\n  {\n  arma_extra_debug_sigprint();\n  \n  std::string err_msg;\n  const bool save_okay = field_aux::save(*this, name, type, err_msg);\n  \n  if( (print_status == true) && (save_okay == false) )\n    {\n    if(err_msg.length() > 0)\n      {\n      arma_warn(true, \"field::save(): \", err_msg, name);\n      }\n    else\n      {\n      arma_warn(true, \"field::save(): couldn't write to \", name);\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield<oT>::save(std::ostream& os, const file_type type, const bool print_status) const\n  {\n  arma_extra_debug_sigprint();\n  \n  std::string err_msg;\n  const bool save_okay = field_aux::save(*this, os, type, err_msg);\n  \n  if( (print_status == true) && (save_okay == false) )\n    {\n    if(err_msg.length() > 0)\n      {\n      arma_warn(true, \"field::save(): \", err_msg, \"[ostream]\");\n      }\n    else\n      {\n      arma_warn(true, \"field::save(): couldn't write to [ostream]\");\n      }\n    }\n  \n  return save_okay;\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield<oT>::load(const std::string name, const file_type type, const bool print_status)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::string err_msg;\n  const bool load_okay = field_aux::load(*this, name, type, err_msg);\n  \n  if( (print_status == true) && (load_okay == false) )\n    {\n    if(err_msg.length() > 0)\n      {\n      arma_warn(true, \"field::load(): \", err_msg, name);\n      }\n    else\n      {\n      arma_warn(true, \"field::load(): couldn't read from \", name);\n      }\n    }\n  \n  if(load_okay == false)\n    {\n    (*this).reset();\n    }\n  \n  return load_okay;\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield<oT>::load(std::istream& is, const file_type type, const bool print_status)\n  {\n  arma_extra_debug_sigprint();\n  \n  std::string err_msg;\n  const bool load_okay = field_aux::load(*this, is, type, err_msg);\n  \n  if( (print_status == true) && (load_okay == false) )\n    {\n    if(err_msg.length() > 0)\n      {\n      arma_warn(true, \"field::load(): \", err_msg, \"[istream]\");\n      }\n    else\n      {\n      arma_warn(true, \"field::load(): couldn't read from [istream]\");\n      }\n    }\n  \n  if(load_okay == false)\n    {\n    (*this).reset();\n    }\n  \n  return load_okay;\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield<oT>::quiet_save(const std::string name, const file_type type) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).save(name, type, false);\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield<oT>::quiet_save(std::ostream& os, const file_type type) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).save(os, type, false);\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield<oT>::quiet_load(const std::string name, const file_type type)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).load(name, type, false);\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield<oT>::quiet_load(std::istream& is, const file_type type)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).load(is, type, false);\n  }\n\n\n\n//! construct a field from a given field\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::init(const field<oT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(this != &x)\n    {\n    const uword x_n_rows   = x.n_rows;\n    const uword x_n_cols   = x.n_cols;\n    const uword x_n_slices = x.n_slices;\n    \n    init(x_n_rows, x_n_cols, x_n_slices);\n    \n    field& t = *this;\n    \n    if(x_n_slices == 1)\n      {\n      for(uword ucol=0; ucol < x_n_cols; ++ucol)\n      for(uword urow=0; urow < x_n_rows; ++urow)\n        {\n        t.at(urow,ucol) = x.at(urow,ucol);\n        }\n      }\n    else\n      {\n      for(uword uslice=0; uslice < x_n_slices; ++uslice)\n      for(uword ucol=0;   ucol   < x_n_cols;   ++ucol  )\n      for(uword urow=0;   urow   < x_n_rows;   ++urow  )\n        {\n        t.at(urow,ucol,uslice) = x.at(urow,ucol,uslice);\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::init(const uword n_rows_in, const uword n_cols_in)\n  {\n  (*this).init(n_rows_in, n_cols_in, 1);\n  }\n\n\n\n//! internal field construction; if the requested size is small enough, memory from the stack is used. otherwise memory is allocated via 'new'\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::init(const uword n_rows_in, const uword n_cols_in, const uword n_slices_in)\n  {\n  arma_extra_debug_sigprint( arma_boost::format(\"n_rows_in = %d, n_cols_in = %d, n_slices_in = %d\") % n_rows_in % n_cols_in % n_slices_in );\n  \n  #if (defined(ARMA_USE_CXX11) || defined(ARMA_64BIT_WORD))\n    const char* error_message = \"field::init(): requested size is too large\";\n  #else\n    const char* error_message = \"field::init(): requested size is too large; suggest to compile in C++11 mode or enable ARMA_64BIT_WORD\";\n  #endif\n  \n  arma_debug_check\n    (\n      (\n      ( (n_rows_in > 0x0FFF) || (n_cols_in > 0x0FFF) || (n_slices_in > 0xFF) )\n        ? ( (double(n_rows_in) * double(n_cols_in) * double(n_slices_in)) > double(ARMA_MAX_UWORD) )\n        : false\n      ),\n    error_message\n    );\n  \n  const uword n_elem_new = n_rows_in * n_cols_in * n_slices_in;\n  \n  if(n_elem == n_elem_new)\n    {\n    // delete_objects();\n    // create_objects();\n    access::rw(n_rows)   = n_rows_in;\n    access::rw(n_cols)   = n_cols_in;\n    access::rw(n_slices) = n_slices_in;\n    }\n  else\n    {\n    delete_objects();\n    \n    if(n_elem > sizeof(mem_local)/sizeof(oT*) )\n      {\n      delete [] mem;\n      }\n    \n    if(n_elem_new <= sizeof(mem_local)/sizeof(oT*) )\n      {\n      mem = mem_local;\n      }\n    else\n      {\n      mem = new(std::nothrow) oT* [n_elem_new];\n      arma_check_bad_alloc( (mem == 0), \"field::init(): out of memory\" );\n      }\n    \n    access::rw(n_elem) = n_elem_new;\n    \n    if(n_elem_new == 0)\n      {\n      access::rw(n_rows)   = 0;\n      access::rw(n_cols)   = 0;\n      access::rw(n_slices) = 0;\n      }\n    else\n      {\n      access::rw(n_rows)   = n_rows_in;\n      access::rw(n_cols)   = n_cols_in;\n      access::rw(n_slices) = n_slices_in;\n      }\n    \n    create_objects();\n    \n    }\n  \n  }\n\n\n\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::delete_objects()\n  {\n  arma_extra_debug_sigprint( arma_boost::format(\"n_elem = %d\") % n_elem );\n  \n  for(uword i=0; i<n_elem; ++i)\n    {\n    if(mem[i] != 0)\n      {\n      delete mem[i];\n      mem[i] = 0;\n      }\n    }\n  \n  }\n\n\n\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::create_objects()\n  {\n  arma_extra_debug_sigprint( arma_boost::format(\"n_elem = %d\") % n_elem );\n  \n  for(uword i=0; i<n_elem; ++i)\n    {\n    mem[i] = new oT;\n    }\n  \n  }\n\n\n\ntemplate<typename oT>\ninline\nfield<oT>::iterator::iterator(field<oT>& in_M, const bool at_end)\n  : M(in_M)\n  , i( (at_end == false) ? 0 : in_M.n_elem )\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename oT>\ninline\noT&\nfield<oT>::iterator::operator*()\n  {\n  return M[i];\n  }\n\n\n\ntemplate<typename oT>\ninline\ntypename field<oT>::iterator&\nfield<oT>::iterator::operator++()\n  {\n  ++i;\n  \n  return *this;\n  }\n\n\n\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::iterator::operator++(int)\n  {\n  operator++();\n  }\n\n\n\ntemplate<typename oT>\ninline\ntypename field<oT>::iterator&\nfield<oT>::iterator::operator--()\n  {\n  if(i > 0)\n    {\n    --i;\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::iterator::operator--(int)\n  {\n  operator--();\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield<oT>::iterator::operator!=(const typename field<oT>::iterator& X) const\n  {\n  return (i != X.i);\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield<oT>::iterator::operator==(const typename field<oT>::iterator& X) const\n  {\n  return (i == X.i);\n  }\n\n\n\ntemplate<typename oT>\ninline\nfield<oT>::const_iterator::const_iterator(const field<oT>& in_M, const bool at_end)\n  : M(in_M)\n  , i( (at_end == false) ? 0 : in_M.n_elem )\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename oT>\ninline\nfield<oT>::const_iterator::const_iterator(const typename field<oT>::iterator& X)\n  : M(X.M)\n  , i(X.i)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename oT>\ninline\nconst oT&\nfield<oT>::const_iterator::operator*() const\n  {\n  return M[i];\n  }\n\n\n\ntemplate<typename oT>\ninline\ntypename field<oT>::const_iterator&\nfield<oT>::const_iterator::operator++()\n  {\n  ++i;\n  \n  return *this;\n  }\n\n\n\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::const_iterator::operator++(int)\n  {\n  operator++();\n  }\n\n\n\ntemplate<typename oT>\ninline\ntypename field<oT>::const_iterator&\nfield<oT>::const_iterator::operator--()\n  {\n  if(i > 0)\n    {\n    --i;\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::const_iterator::operator--(int)\n  {\n  operator--();\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield<oT>::const_iterator::operator!=(const typename field<oT>::const_iterator& X) const\n  {\n  return (i != X.i);\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield<oT>::const_iterator::operator==(const typename field<oT>::const_iterator& X) const\n  {\n  return (i == X.i);\n  }\n\n\n\ntemplate<typename oT>\ninline\ntypename field<oT>::iterator\nfield<oT>::begin()\n  {\n  arma_extra_debug_sigprint();\n  \n  return field<oT>::iterator(*this);\n  }\n\n\n\ntemplate<typename oT>\ninline\ntypename field<oT>::const_iterator\nfield<oT>::begin() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return field<oT>::const_iterator(*this);\n  }\n\n\n\ntemplate<typename oT>\ninline\ntypename field<oT>::const_iterator\nfield<oT>::cbegin() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return field<oT>::const_iterator(*this);\n  }\n\n\n\ntemplate<typename oT>\ninline\ntypename field<oT>::iterator\nfield<oT>::end()\n  {\n  arma_extra_debug_sigprint();\n  \n  return field<oT>::iterator(*this, true);\n  }\n\n\n\ntemplate<typename oT>\ninline\ntypename field<oT>::const_iterator\nfield<oT>::end() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return field<oT>::const_iterator(*this, true);\n  }\n  \n\n\ntemplate<typename oT>\ninline\ntypename field<oT>::const_iterator\nfield<oT>::cend() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return field<oT>::const_iterator(*this, true);\n  }\n\n\n\ntemplate<typename oT>\ninline\nvoid\nfield<oT>::clear()\n  {\n  reset();\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield<oT>::empty() const\n  {\n  return (n_elem == 0);\n  }\n\n\n\ntemplate<typename oT>\ninline\nuword\nfield<oT>::size() const\n  {\n  return n_elem;\n  }\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename oT>\ninline\nvoid\nfield_aux::reset_objects(field<oT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  x.delete_objects();\n  x.create_objects();\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nfield_aux::reset_objects(field< Mat<eT> >& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  for(uword i=0; i<x.n_elem; ++i)\n    {\n    (*(x.mem[i])).reset();\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nfield_aux::reset_objects(field< Col<eT> >& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  for(uword i=0; i<x.n_elem; ++i)\n    {\n    (*(x.mem[i])).reset();\n    }\n  }\n  \n  \n  \ntemplate<typename eT>\ninline\nvoid\nfield_aux::reset_objects(field< Row<eT> >& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  for(uword i=0; i<x.n_elem; ++i)\n    {\n    (*(x.mem[i])).reset();\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nfield_aux::reset_objects(field< Cube<eT> >& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  for(uword i=0; i<x.n_elem; ++i)\n    {\n    (*(x.mem[i])).reset();\n    }\n  }\n\n\n\ninline\nvoid\nfield_aux::reset_objects(field< std::string >& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  for(uword i=0; i<x.n_elem; ++i)\n    {\n    (*(x.mem[i])).clear();\n    }\n  }\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield_aux::save(const field<oT>&, const std::string&, const file_type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  err_msg = \" [saving/loading this type of field is currently not supported] filename = \";\n  \n  return false;\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield_aux::save(const field<oT>&, std::ostream&, const file_type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  err_msg = \" [saving/loading this type of field is currently not supported] filename = \";\n  \n  return false;\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield_aux::load(field<oT>&, const std::string&, const file_type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  err_msg = \" [saving/loading this type of field is currently not supported] filename = \";\n  \n  return false;\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nfield_aux::load(field<oT>&, std::istream&, const file_type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  err_msg = \" [saving/loading this type of field is currently not supported] filename = \";\n  \n  return false;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nfield_aux::save(const field< Mat<eT> >& x, const std::string& name, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(type)\n    {\n    case arma_binary:\n      return diskio::save_arma_binary(x, name);\n      break;\n      \n    case ppm_binary:\n      return diskio::save_ppm_binary(x, name);\n      break;\n    \n    default:\n      err_msg = \" [unsupported type] filename = \";\n      return false;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nfield_aux::save(const field< Mat<eT> >& x, std::ostream& os, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(type)\n    {\n    case arma_binary:\n      return diskio::save_arma_binary(x, os);\n      break;\n      \n    case ppm_binary:\n      return diskio::save_ppm_binary(x, os);\n      break;\n    \n    default:\n      err_msg = \" [unsupported type] filename = \";\n      return false;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nfield_aux::load(field< Mat<eT> >& x, const std::string& name, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(type)\n    {\n    case auto_detect:\n      return diskio::load_auto_detect(x, name, err_msg);\n      break;\n    \n    case arma_binary:\n      return diskio::load_arma_binary(x, name, err_msg);\n      break;\n      \n    case ppm_binary:\n      return diskio::load_ppm_binary(x, name, err_msg);\n      break;\n    \n    default:\n      err_msg = \" [unsupported type] filename = \";\n      return false;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nfield_aux::load(field< Mat<eT> >& x, std::istream& is, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(type)\n    {\n    case auto_detect:\n      return diskio::load_auto_detect(x, is, err_msg);\n      break;\n    \n    case arma_binary:\n      return diskio::load_arma_binary(x, is, err_msg);\n      break;\n      \n    case ppm_binary:\n      return diskio::load_ppm_binary(x, is, err_msg);\n      break;\n    \n    default:\n      err_msg = \" [unsupported type] filename = \";\n      return false;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nfield_aux::save(const field< Col<eT> >& x, const std::string& name, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(type)\n    {\n    case arma_binary:\n      return diskio::save_arma_binary(x, name);\n      break;\n      \n    case ppm_binary:\n      return diskio::save_ppm_binary(x, name);\n      break;\n    \n    default:\n      err_msg = \" [unsupported type] filename = \";\n      return false;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nfield_aux::save(const field< Col<eT> >& x, std::ostream& os, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(type)\n    {\n    case arma_binary:\n      return diskio::save_arma_binary(x, os);\n      break;\n      \n    case ppm_binary:\n      return diskio::save_ppm_binary(x, os);\n      break;\n    \n    default:\n      err_msg = \" [unsupported type] filename = \";\n      return false;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nfield_aux::load(field< Col<eT> >& x, const std::string& name, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(type)\n    {\n    case auto_detect:\n      return diskio::load_auto_detect(x, name, err_msg);\n      break;\n    \n    case arma_binary:\n      return diskio::load_arma_binary(x, name, err_msg);\n      break;\n      \n    case ppm_binary:\n      return diskio::load_ppm_binary(x, name, err_msg);\n      break;\n    \n    default:\n      err_msg = \" [unsupported type] filename = \";\n      return false;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nfield_aux::load(field< Col<eT> >& x, std::istream& is, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(type)\n    {\n    case auto_detect:\n      return diskio::load_auto_detect(x, is, err_msg);\n      break;\n    \n    case arma_binary:\n      return diskio::load_arma_binary(x, is, err_msg);\n      break;\n      \n    case ppm_binary:\n      return diskio::load_ppm_binary(x, is, err_msg);\n      break;\n    \n    default:\n      err_msg = \" [unsupported type] filename = \";\n      return false;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nfield_aux::save(const field< Row<eT> >& x, const std::string& name, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(type)\n    {\n    case arma_binary:\n      return diskio::save_arma_binary(x, name);\n      break;\n      \n    case ppm_binary:\n      return diskio::save_ppm_binary(x, name);\n      break;\n    \n    default:\n      err_msg = \" [unsupported type] filename = \";\n      return false;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nfield_aux::save(const field< Row<eT> >& x, std::ostream& os, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(type)\n    {\n    case arma_binary:\n      return diskio::save_arma_binary(x, os);\n      break;\n      \n    case ppm_binary:\n      return diskio::save_ppm_binary(x, os);\n      break;\n    \n    default:\n      err_msg = \" [unsupported type] filename = \";\n      return false;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nfield_aux::load(field< Row<eT> >& x, const std::string& name, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(type)\n    {\n    case auto_detect:\n      return diskio::load_auto_detect(x, name, err_msg);\n      break;\n    \n    case arma_binary:\n      return diskio::load_arma_binary(x, name, err_msg);\n      break;\n      \n    case ppm_binary:\n      return diskio::load_ppm_binary(x, name, err_msg);\n      break;\n    \n    default:\n      err_msg = \" [unsupported type] filename = \";\n      return false;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nfield_aux::load(field< Row<eT> >& x, std::istream& is, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(type)\n    {\n    case auto_detect:\n      return diskio::load_auto_detect(x, is, err_msg);\n      break;\n    \n    case arma_binary:\n      return diskio::load_arma_binary(x, is, err_msg);\n      break;\n      \n    case ppm_binary:\n      return diskio::load_ppm_binary(x, is, err_msg);\n      break;\n    \n    default:\n      err_msg = \" [unsupported type] filename = \";\n      return false;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nfield_aux::save(const field< Cube<eT> >& x, const std::string& name, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(type)\n    {\n    case arma_binary:\n      return diskio::save_arma_binary(x, name);\n      break;\n    \n    default:\n      err_msg = \" [unsupported type] filename = \";\n      return false;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nfield_aux::save(const field< Cube<eT> >& x, std::ostream& os, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(type)\n    {\n    case arma_binary:\n      return diskio::save_arma_binary(x, os);\n      break;\n    \n    default:\n      err_msg = \" [unsupported type] filename = \";\n      return false;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nfield_aux::load(field< Cube<eT> >& x, const std::string& name, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(type)\n    {\n    case auto_detect:\n    case arma_binary:\n      return diskio::load_arma_binary(x, name, err_msg);\n      break;\n    \n    default:\n      err_msg = \" [unsupported type] filename = \";\n      return false;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nfield_aux::load(field< Cube<eT> >& x, std::istream& is, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  switch(type)\n    {\n    case auto_detect:\n    case arma_binary:\n      return diskio::load_arma_binary(x, is, err_msg);\n      break;\n      \n    default:\n      err_msg = \" [unsupported type] filename = \";\n      return false;\n    }\n  }\n\n\n\ninline\nbool\nfield_aux::save(const field< std::string >& x, const std::string& name, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_ignore(type);\n  \n  err_msg.clear();\n  \n  return diskio::save_std_string(x, name);\n  }\n\n\n\ninline\nbool\nfield_aux::save(const field< std::string >& x, std::ostream& os, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_ignore(type);\n  \n  err_msg.clear();\n  \n  return diskio::save_std_string(x, os);\n  }\n\n\n\ninline\nbool\nfield_aux::load(field< std::string >& x, const std::string& name, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_ignore(type);\n  \n  return diskio::load_std_string(x, name, err_msg);\n  }\n\n\n\ninline\nbool\nfield_aux::load(field< std::string >& x, std::istream& is, const file_type type, std::string& err_msg)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_ignore(type);\n  \n  return diskio::load_std_string(x, is, err_msg);\n  }\n\n\n\n#ifdef ARMA_EXTRA_FIELD_MEAT\n  #include ARMA_INCFILE_WRAP(ARMA_EXTRA_FIELD_MEAT)\n#endif\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_accu.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// Copyright (C) 2012 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_accu\n//! @{\n\n\n\ntemplate<typename T1>\narma_hot\ninline\ntypename T1::elem_type\naccu_proxy_linear(const Proxy<T1>& P)\n  {\n  typedef typename T1::elem_type eT;\n  \n  const uword n_elem = P.get_n_elem();\n  \n  #if defined(__FINITE_MATH_ONLY__) && (__FINITE_MATH_ONLY__ > 0)\n    {\n    eT val = eT(0);\n    \n    if(P.is_aligned())\n      {\n      typename Proxy<T1>::aligned_ea_type A = P.get_aligned_ea();\n      \n      for(uword i=0; i<n_elem; ++i)  { val += A.at_alt(i); }\n      }\n    else\n      {\n      typename Proxy<T1>::ea_type A = P.get_ea();\n      \n      for(uword i=0; i<n_elem; ++i)  { val += A[i]; }\n      }\n    \n    return val;\n    }\n  #else\n    {\n    eT val1 = eT(0);\n    eT val2 = eT(0);\n    \n    typename Proxy<T1>::ea_type A = P.get_ea();\n    \n    uword i,j;\n    for(i=0, j=1; j < n_elem; i+=2, j+=2)\n      {\n      val1 += A[i];\n      val2 += A[j];\n      }\n    \n    if(i < n_elem)\n      {\n      val1 += A[i];   // equivalent to: val1 += A[n_elem-1];\n      }\n    \n    return (val1 + val2);\n    }\n  #endif\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\ntypename T1::elem_type\naccu_proxy_mat(const Proxy<T1>& P)\n  {\n  const quasi_unwrap<typename Proxy<T1>::stored_type> tmp(P.Q);\n  \n  return arrayops::accumulate(tmp.M.memptr(), tmp.M.n_elem);\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\ntypename T1::elem_type\naccu_proxy_at(const Proxy<T1>& P)\n  {\n  typedef typename T1::elem_type eT;\n  \n  const uword n_rows = P.get_n_rows();\n  const uword n_cols = P.get_n_cols();\n  \n  eT val = eT(0);\n  \n  if(n_rows != 1)\n    {\n    eT val1 = eT(0);\n    eT val2 = eT(0);\n    \n    for(uword col=0; col < n_cols; ++col)\n      {\n      uword i,j;\n      for(i=0, j=1; j < n_rows; i+=2, j+=2)\n        {\n        val1 += P.at(i,col);\n        val2 += P.at(j,col);\n        }\n      \n      if(i < n_rows)\n        {\n        val1 += P.at(i,col);\n        }\n      }\n    \n    val = val1 + val2;\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n      {\n      val += P.at(0,col);\n      }\n    }\n  \n  return val;\n  }\n\n\n\n//! accumulate the elements of a matrix\ntemplate<typename T1>\narma_hot\ninline\ntypename enable_if2< is_arma_type<T1>::value, typename T1::elem_type >::result\naccu(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<T1> P(X);\n  \n  const bool have_direct_mem = (is_Mat<typename Proxy<T1>::stored_type>::value) || (is_subview_col<typename Proxy<T1>::stored_type>::value);\n  \n  return (Proxy<T1>::prefer_at_accessor) ? accu_proxy_at(P) : (have_direct_mem ? accu_proxy_mat(P) : accu_proxy_linear(P));\n  }\n\n\n\n//! explicit handling of Hamming norm (also known as zero norm)\ntemplate<typename T1>\ninline\narma_warn_unused\nuword\naccu(const mtOp<uword,T1,op_rel_noteq>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const eT val = X.aux;\n  \n  const Proxy<T1> P(X.m);\n  \n  uword n_nonzero = 0;\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n          ea_type A      = P.get_ea();\n    const uword   n_elem = P.get_n_elem();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      n_nonzero += (A[i] != val) ? uword(1) : uword(0);\n      }\n    }\n  else\n    {\n    const uword P_n_cols = P.get_n_cols();\n    const uword P_n_rows = P.get_n_rows();\n    \n    if(P_n_rows == 1)\n      {\n      for(uword col=0; col < P_n_cols; ++col)\n        {\n        n_nonzero += (P.at(0,col) != val) ? uword(1) : uword(0);\n        }\n      }\n    else\n      {\n      for(uword col=0; col < P_n_cols; ++col)\n      for(uword row=0; row < P_n_rows; ++row)\n        {\n        n_nonzero += (P.at(row,col) != val) ? uword(1) : uword(0);\n        }\n      }\n    }\n  \n  return n_nonzero;\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\nuword\naccu(const mtOp<uword,T1,op_rel_eq>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const eT val = X.aux;\n  \n  const Proxy<T1> P(X.m);\n  \n  uword n_nonzero = 0;\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n          ea_type A      = P.get_ea();\n    const uword   n_elem = P.get_n_elem();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      n_nonzero += (A[i] == val) ? uword(1) : uword(0);\n      }\n    }\n  else\n    {\n    const uword P_n_cols = P.get_n_cols();\n    const uword P_n_rows = P.get_n_rows();\n    \n    if(P_n_rows == 1)\n      {\n      for(uword col=0; col < P_n_cols; ++col)\n        {\n        n_nonzero += (P.at(0,col) == val) ? uword(1) : uword(0);\n        }\n      }\n    else\n      {\n      for(uword col=0; col < P_n_cols; ++col)\n      for(uword row=0; row < P_n_rows; ++row)\n        {\n        n_nonzero += (P.at(row,col) == val) ? uword(1) : uword(0);\n        }\n      }\n    }\n  \n  return n_nonzero;\n  }\n\n\n\n//! accumulate the elements of a subview (submatrix)\ntemplate<typename eT>\narma_hot\narma_pure\narma_warn_unused\ninline\neT\naccu(const subview<eT>& X)\n  {\n  arma_extra_debug_sigprint();  \n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  eT val = eT(0);\n  \n  if(X_n_rows == 1)\n    {\n    typedef subview_row<eT> sv_type;\n    \n    const sv_type& sv = reinterpret_cast<const sv_type&>(X);  // subview_row<eT> is a child class of subview<eT> and has no extra data\n    \n    const Proxy<sv_type> P(sv);\n    \n    val = accu_proxy_linear(P);\n    }\n  else\n  if(X_n_cols == 1)\n    {\n    val = arrayops::accumulate( X.colptr(0), X_n_rows );\n    }\n  else\n    {\n    for(uword col=0; col < X_n_cols; ++col)\n      {\n      val += arrayops::accumulate( X.colptr(col), X_n_rows );\n      }\n    }\n  \n  return val;\n  }\n\n\n\ntemplate<typename eT>\narma_hot\narma_pure\narma_warn_unused\ninline\neT\naccu(const subview_col<eT>& X)\n  {\n  arma_extra_debug_sigprint();  \n  \n  return arrayops::accumulate( X.colptr(0), X.n_rows );\n  }\n\n\n\n//! accumulate the elements of a cube\ntemplate<typename T1>\narma_hot\narma_warn_unused\ninline\ntypename T1::elem_type\naccu(const BaseCube<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type          eT;\n  typedef typename ProxyCube<T1>::ea_type ea_type;\n  \n  const ProxyCube<T1> A(X.get_ref());\n  \n  if(is_Cube<typename ProxyCube<T1>::stored_type>::value)\n    {\n    unwrap_cube<typename ProxyCube<T1>::stored_type> tmp(A.Q);\n    \n    return arrayops::accumulate(tmp.M.memptr(), tmp.M.n_elem);\n    }\n  \n  \n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n          ea_type P      = A.get_ea();\n    const uword   n_elem = A.get_n_elem();\n    \n    eT val1 = eT(0);\n    eT val2 = eT(0);\n    \n    uword i,j;\n    \n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\n      {\n      val1 += P[i];\n      val2 += P[j];\n      }\n    \n    if(i < n_elem)\n      {\n      val1 += P[i];\n      }\n    \n    return val1 + val2;\n    }\n  else\n    {\n    const uword n_rows   = A.get_n_rows();\n    const uword n_cols   = A.get_n_cols();\n    const uword n_slices = A.get_n_slices();\n    \n    eT val1 = eT(0);\n    eT val2 = eT(0);\n    \n    for(uword slice=0; slice<n_slices; ++slice)\n    for(uword col=0; col<n_cols; ++col)\n      {\n      uword i,j;\n      for(i=0, j=1; j<n_rows; i+=2, j+=2)\n        {\n        val1 += A.at(i,col,slice);\n        val2 += A.at(j,col,slice);\n        }\n      \n      if(i < n_rows)\n        {\n        val1 += A.at(i,col,slice);\n        }\n      }\n    \n    return val1 + val2;\n    }\n  }\n\n\n\ntemplate<typename T>\narma_inline\narma_warn_unused\nconst typename arma_scalar_only<T>::result &\naccu(const T& x)\n  {\n  return x;\n  }\n\n\n\n//! accumulate values in a sparse object\ntemplate<typename T1>\narma_hot\ninline\narma_warn_unused\ntypename enable_if2<is_arma_sparse_type<T1>::value, typename T1::elem_type>::result\naccu(const T1& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const SpProxy<T1> p(x);\n  \n  if(SpProxy<T1>::must_use_iterator == false)\n    {\n    // direct counting\n    return arrayops::accumulate(p.get_values(), p.get_n_nonzero());\n    }\n  else\n    {\n    typename SpProxy<T1>::const_iterator_type it     = p.begin();\n    typename SpProxy<T1>::const_iterator_type it_end = p.end();\n    \n    eT result = eT(0);\n    \n    while(it != it_end)\n      {\n      result += (*it);\n      ++it;\n      }\n    \n    return result;\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_all.hpp",
    "content": "// Copyright (C) 2013-2015 Conrad Sanderson\n// Copyright (C) 2013-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_all\n//! @{\n\n\n\ntemplate<typename T1>\narma_inline\nconst mtOp<uword, T1, op_all>\nall\n  (\n  const T1&   X,\n  const uword dim = 0,\n  const typename enable_if< is_arma_type<T1>::value       == true  >::result* junk1 = 0,\n  const typename enable_if< resolves_to_vector<T1>::value == false >::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return mtOp<uword, T1, op_all>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst mtOp<uword, T1, op_all>\nall\n  (\n  const T1&   X,\n  const uword dim,\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return mtOp<uword, T1, op_all>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\nbool\nall\n  (\n  const T1& X,\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return op_all::all_vec(X);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\nbool\nall(const mtOp<uword, T1, op_all>& in)\n  {\n  arma_extra_debug_sigprint();\n  arma_extra_debug_print(\"all(): two consecutive calls to all() detected\");\n  \n  return op_all::all_vec(in.m);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op< mtOp<uword, T1, op_all>, op_all>\nall(const mtOp<uword, T1, op_all>& in, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, mtOp<uword, T1, op_all>, op_all>(in, dim, 0);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_any.hpp",
    "content": "// Copyright (C) 2013-2015 Conrad Sanderson\n// Copyright (C) 2013-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_any\n//! @{\n\n\n\ntemplate<typename T1>\narma_inline\nconst mtOp<uword, T1, op_any>\nany\n  (\n  const T1&   X,\n  const uword dim = 0,\n  const typename enable_if< is_arma_type<T1>::value       == true  >::result* junk1 = 0,\n  const typename enable_if< resolves_to_vector<T1>::value == false >::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return mtOp<uword, T1, op_any>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst mtOp<uword, T1, op_any>\nany\n  (\n  const T1&   X,\n  const uword dim,\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return mtOp<uword, T1, op_any>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\nbool\nany\n  (\n  const T1& X,\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return op_any::any_vec(X);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\nbool\nany(const mtOp<uword, T1, op_any>& in)\n  {\n  arma_extra_debug_sigprint();\n  arma_extra_debug_print(\"any(): two consecutive calls to any() detected\");\n  \n  return op_any::any_vec(in.m);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op< mtOp<uword, T1, op_any>, op_any>\nany(const mtOp<uword, T1, op_any>& in, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, mtOp<uword, T1, op_any>, op_any>(in, dim, 0);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_as_scalar.hpp",
    "content": "// Copyright (C) 2010-2015 Conrad Sanderson\n// Copyright (C) 2010-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_as_scalar\n//! @{\n\n\n\ntemplate<uword N>\nstruct as_scalar_redirect\n  {\n  template<typename T1>\n  inline static typename T1::elem_type apply(const T1& X);\n  };\n\n\n\ntemplate<>\nstruct as_scalar_redirect<2>\n  {\n  template<typename T1, typename T2>\n  inline static typename T1::elem_type apply(const Glue<T1,T2,glue_times>& X);\n  };\n\n\ntemplate<>\nstruct as_scalar_redirect<3>\n  {\n  template<typename T1, typename T2, typename T3>\n  inline static typename T1::elem_type apply(const Glue< Glue<T1, T2, glue_times>, T3, glue_times>& X);\n  };\n\n\n\ntemplate<uword N>\ntemplate<typename T1>\ninline\ntypename T1::elem_type\nas_scalar_redirect<N>::apply(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(X);\n  \n  if(P.get_n_elem() != 1)\n    {\n    arma_debug_check(true, \"as_scalar(): expression doesn't evaluate to exactly one element\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  return (Proxy<T1>::prefer_at_accessor) ? P.at(0,0) : P[0];\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\ntypename T1::elem_type\nas_scalar_redirect<2>::apply(const Glue<T1, T2, glue_times>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  // T1 must result in a matrix with one row\n  // T2 must result in a matrix with one column\n  \n  const bool has_all_mat        = (is_Mat<T1>::value || is_Mat_trans<T1>::value) && (is_Mat<T2>::value || is_Mat_trans<T2>::value);\n  const bool prefer_at_accessor = Proxy<T1>::prefer_at_accessor                  || Proxy<T2>::prefer_at_accessor;\n  \n  const bool do_partial_unwrap = has_all_mat || prefer_at_accessor;\n  \n  if(do_partial_unwrap == true)\n    {\n    const partial_unwrap<T1> tmp1(X.A);\n    const partial_unwrap<T2> tmp2(X.B);\n    \n    typedef typename partial_unwrap<T1>::stored_type TA;\n    typedef typename partial_unwrap<T2>::stored_type TB;\n    \n    const TA& A = tmp1.M;\n    const TB& B = tmp2.M;\n    \n    const uword A_n_rows = (tmp1.do_trans == false) ? (TA::is_row ? 1 : A.n_rows) : (TA::is_col ? 1 : A.n_cols);\n    const uword A_n_cols = (tmp1.do_trans == false) ? (TA::is_col ? 1 : A.n_cols) : (TA::is_row ? 1 : A.n_rows);\n    \n    const uword B_n_rows = (tmp2.do_trans == false) ? (TB::is_row ? 1 : B.n_rows) : (TB::is_col ? 1 : B.n_cols);\n    const uword B_n_cols = (tmp2.do_trans == false) ? (TB::is_col ? 1 : B.n_cols) : (TB::is_row ? 1 : B.n_rows);\n    \n    arma_debug_check( (A_n_rows != 1) || (B_n_cols != 1) || (A_n_cols != B_n_rows), \"as_scalar(): incompatible dimensions\" );\n    \n    const eT val = op_dot::direct_dot(A.n_elem, A.memptr(), B.memptr());\n    \n    return (tmp1.do_times || tmp2.do_times) ? (val * tmp1.get_val() * tmp2.get_val()) : val;\n    }\n  else\n    {\n    const Proxy<T1> PA(X.A);\n    const Proxy<T2> PB(X.B);\n    \n    arma_debug_check\n      (\n      (PA.get_n_rows() != 1) || (PB.get_n_cols() != 1) || (PA.get_n_cols() != PB.get_n_rows()),\n      \"as_scalar(): incompatible dimensions\"\n      );\n    \n    return op_dot::apply_proxy(PA,PB);\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2, typename T3>\ninline\ntypename T1::elem_type\nas_scalar_redirect<3>::apply(const Glue< Glue<T1, T2, glue_times>, T3, glue_times >& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  // T1 * T2 must result in a matrix with one row\n  // T3 must result in a matrix with one column\n  \n  typedef typename strip_inv    <T2           >::stored_type T2_stripped_1;\n  typedef typename strip_diagmat<T2_stripped_1>::stored_type T2_stripped_2;\n  \n  const strip_inv    <T2>            strip1(X.A.B);\n  const strip_diagmat<T2_stripped_1> strip2(strip1.M);\n  \n  const bool tmp2_do_inv     = strip1.do_inv;\n  const bool tmp2_do_diagmat = strip2.do_diagmat;\n  \n  if(tmp2_do_diagmat == false)\n    {\n    const Mat<eT> tmp(X);\n    \n    if(tmp.n_elem != 1)\n      {\n      arma_debug_check(true, \"as_scalar(): expression doesn't evaluate to exactly one element\");\n      \n      return Datum<eT>::nan;\n      }\n    \n    return tmp[0];\n    }\n  else\n    {\n    const partial_unwrap<T1>            tmp1(X.A.A);\n    const partial_unwrap<T2_stripped_2> tmp2(strip2.M);\n    const partial_unwrap<T3>            tmp3(X.B);\n    \n    const Mat<eT>& A = tmp1.M;\n    const Mat<eT>& B = tmp2.M;\n    const Mat<eT>& C = tmp3.M;\n    \n    const uword A_n_rows = (tmp1.do_trans == false) ? A.n_rows : A.n_cols;\n    const uword A_n_cols = (tmp1.do_trans == false) ? A.n_cols : A.n_rows;\n    \n    const bool B_is_vec = B.is_vec();\n    \n    const uword B_n_rows = (B_is_vec == true) ? B.n_elem : ( (tmp2.do_trans == false) ? B.n_rows : B.n_cols );\n    const uword B_n_cols = (B_is_vec == true) ? B.n_elem : ( (tmp2.do_trans == false) ? B.n_cols : B.n_rows );\n    \n    const uword C_n_rows = (tmp3.do_trans == false) ? C.n_rows : C.n_cols;\n    const uword C_n_cols = (tmp3.do_trans == false) ? C.n_cols : C.n_rows;\n    \n    const eT val = tmp1.get_val() * tmp2.get_val() * tmp3.get_val();\n    \n    arma_debug_check\n      (\n      (A_n_rows != 1)        ||\n      (C_n_cols != 1)        ||\n      (A_n_cols != B_n_rows) ||\n      (B_n_cols != C_n_rows)\n      ,\n      \"as_scalar(): incompatible dimensions\"\n      );\n    \n    \n    if(B_is_vec == true)\n      {\n      if(tmp2_do_inv == true)\n        {\n        return val * op_dotext::direct_rowvec_invdiagvec_colvec(A.mem, B, C.mem);\n        }\n      else\n        {\n        return val * op_dot::direct_dot(A.n_elem, A.mem, B.mem, C.mem);\n        }\n      }\n    else\n      {\n      if(tmp2_do_inv == true)\n        {\n        return val * op_dotext::direct_rowvec_invdiagmat_colvec(A.mem, B, C.mem);\n        }\n      else\n        {\n        return val * op_dotext::direct_rowvec_diagmat_colvec(A.mem, B, C.mem);\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::elem_type\nas_scalar_diag(const Base<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1>   tmp(X.get_ref());\n  const Mat<eT>& A = tmp.M;\n  \n  if(A.n_elem != 1)\n    {\n    arma_debug_check(true, \"as_scalar(): expression doesn't evaluate to exactly one element\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  return A.mem[0];\n  }\n\n\n\ntemplate<typename T1, typename T2, typename T3>\ninline\ntypename T1::elem_type\nas_scalar_diag(const Glue< Glue<T1, T2, glue_times_diag>, T3, glue_times >& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  // T1 * T2 must result in a matrix with one row\n  // T3 must result in a matrix with one column\n  \n  typedef typename strip_diagmat<T2>::stored_type T2_stripped;\n  \n  const strip_diagmat<T2> strip(X.A.B);\n  \n  const partial_unwrap<T1>          tmp1(X.A.A);\n  const partial_unwrap<T2_stripped> tmp2(strip.M);\n  const partial_unwrap<T3>          tmp3(X.B);\n  \n  const Mat<eT>& A = tmp1.M;\n  const Mat<eT>& B = tmp2.M;\n  const Mat<eT>& C = tmp3.M;\n  \n  \n  const uword A_n_rows = (tmp1.do_trans == false) ? A.n_rows : A.n_cols;\n  const uword A_n_cols = (tmp1.do_trans == false) ? A.n_cols : A.n_rows;\n  \n  const bool B_is_vec = B.is_vec();\n  \n  const uword B_n_rows = (B_is_vec == true) ? B.n_elem : ( (tmp2.do_trans == false) ? B.n_rows : B.n_cols );\n  const uword B_n_cols = (B_is_vec == true) ? B.n_elem : ( (tmp2.do_trans == false) ? B.n_cols : B.n_rows );\n  \n  const uword C_n_rows = (tmp3.do_trans == false) ? C.n_rows : C.n_cols;\n  const uword C_n_cols = (tmp3.do_trans == false) ? C.n_cols : C.n_rows;\n  \n  const eT val = tmp1.get_val() * tmp2.get_val() * tmp3.get_val();\n  \n  arma_debug_check\n    (\n    (A_n_rows != 1)        ||\n    (C_n_cols != 1)        ||\n    (A_n_cols != B_n_rows) ||\n    (B_n_cols != C_n_rows)\n    ,\n    \"as_scalar(): incompatible dimensions\"\n    );\n  \n  \n  if(B_is_vec == true)\n    {\n    return val * op_dot::direct_dot(A.n_elem, A.mem, B.mem, C.mem);\n    }\n  else\n    {\n    return val * op_dotext::direct_rowvec_diagmat_colvec(A.mem, B, C.mem);\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_inline\narma_warn_unused\ntypename T1::elem_type\nas_scalar(const Glue<T1, T2, glue_times>& X, const typename arma_not_cx<typename T1::elem_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  if(is_glue_times_diag<T1>::value == false)\n    {\n    const sword N_mat = 1 + depth_lhs< glue_times, Glue<T1,T2,glue_times> >::num;\n    \n    arma_extra_debug_print(arma_boost::format(\"N_mat = %d\") % N_mat);\n    \n    return as_scalar_redirect<N_mat>::apply(X);\n    }\n  else\n    {\n    return as_scalar_diag(X);\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nas_scalar(const Base<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(X.get_ref());\n  \n  if(P.get_n_elem() != 1)\n    {\n    arma_debug_check(true, \"as_scalar(): expression doesn't evaluate to exactly one element\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  return (Proxy<T1>::prefer_at_accessor) ? P.at(0,0) : P[0];\n  }\n\n\n// ensure the following two functions are aware of each other\ntemplate<typename T1,              typename   eop_type> inline arma_warn_unused typename T1::elem_type as_scalar(const   eOp<T1,       eop_type>& X);\ntemplate<typename T1, typename T2, typename eglue_type> inline arma_warn_unused typename T1::elem_type as_scalar(const eGlue<T1, T2, eglue_type>& X);\n\n\n\ntemplate<typename T1, typename eop_type>\ninline\narma_warn_unused\ntypename T1::elem_type\nas_scalar(const eOp<T1, eop_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const eT val = as_scalar(X.P.Q);\n  \n  return eop_core<eop_type>::process(val, X.aux);\n  }\n\n\n\ntemplate<typename T1, typename T2, typename eglue_type>\ninline\narma_warn_unused\ntypename T1::elem_type\nas_scalar(const eGlue<T1, T2, eglue_type>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const eT a = as_scalar(X.P1.Q);\n  const eT b = as_scalar(X.P2.Q);\n  \n  // the optimiser will keep only one return statement\n  \n       if(is_same_type<eglue_type, eglue_plus >::yes) { return a + b; }\n  else if(is_same_type<eglue_type, eglue_minus>::yes) { return a - b; }\n  else if(is_same_type<eglue_type, eglue_div  >::yes) { return a / b; }\n  else if(is_same_type<eglue_type, eglue_schur>::yes) { return a * b; }\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nas_scalar(const BaseCube<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const ProxyCube<T1> P(X.get_ref());\n  \n  if(P.get_n_elem() != 1)\n    {\n    arma_debug_check(true, \"as_scalar(): expression doesn't evaluate to exactly one element\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  return (ProxyCube<T1>::prefer_at_accessor) ? P.at(0,0,0) : P[0];\n  }\n\n\n\ntemplate<typename T>\narma_inline\narma_warn_unused\nconst typename arma_scalar_only<T>::result &\nas_scalar(const T& x)\n  {\n  return x;\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nas_scalar(const SpBase<typename T1::elem_type, T1>& X)\n  {\n  typedef typename T1::elem_type eT;\n  \n  const unwrap_spmat<T1>  tmp(X.get_ref());\n  const SpMat<eT>& A    = tmp.M;\n  \n  if(A.n_elem != 1)\n    {\n    arma_debug_check(true, \"as_scalar(): expression doesn't evaluate to exactly one element\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  return A.at(0,0);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_chol.hpp",
    "content": "// Copyright (C) 2009-2014 Conrad Sanderson\n// Copyright (C) 2009-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_chol\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nconst Op<T1, op_chol>\nchol\n  (\n  const Base<typename T1::elem_type,T1>& X,\n  const char* layout = \"upper\",\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const char sig = (layout != NULL) ? layout[0] : char(0);\n  \n  arma_debug_check( ((sig != 'u') && (sig != 'l')), \"chol(): layout must be \\\"upper\\\" or \\\"lower\\\"\" );\n  \n  return Op<T1, op_chol>(X.get_ref(), ((sig == 'u') ? 0 : 1), 0 );\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\nchol\n  (\n         Mat<typename T1::elem_type>&    out,\n  const Base<typename T1::elem_type,T1>& X,\n  const char* layout = \"upper\",\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  try\n    {\n    out = chol(X, layout);\n    }\n  catch(std::runtime_error&)\n    {\n    return false;\n    }\n  \n  return true;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_clamp.hpp",
    "content": "// Copyright (C) 2014 Conrad Sanderson\n// Copyright (C) 2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_clamp\n//! @{\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value && is_cx<typename T1::elem_type>::no,\n  const mtOp<typename T1::elem_type, T1, op_clamp>\n  >::result\nclamp(const T1& X, const typename T1::elem_type min_val, const typename T1::elem_type max_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (min_val > max_val), \"clamp(): min_val has to be smaller than max_val\" );\n  \n  return mtOp<typename T1::elem_type, T1, op_clamp>(mtOp_dual_aux_indicator(), X, min_val, max_val);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_cond.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_cond\n//! @{\n\n\ntemplate<typename T1>\narma_warn_unused\ninline\ntypename enable_if2<is_supported_blas_type<typename T1::elem_type>::value, typename T1::pod_type>::result\ncond(const Base<typename T1::elem_type, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::pod_type T;\n  \n  Col<T> S;\n  \n  const bool status = auxlib::svd_dc(S, X);\n  \n  if(status == false)\n    {\n    arma_bad(\"cond(): failed to converge\", false);\n    \n    return T(0);\n    }\n  \n  if(S.n_elem > 0)\n    {\n    return T( max(S) / min(S) );\n    }\n  else\n    {\n    return T(0);\n    }\n  }\n\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_conv.hpp",
    "content": "// Copyright (C) 2010 Conrad Sanderson\n// Copyright (C) 2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_conv\n//! @{\n\n\n\n//! Convolution, which is also equivalent to polynomial multiplication and FIR digital filtering.\n\ntemplate<typename T1, typename T2>\ninline\nconst Glue<T1, T2, glue_conv>\nconv(const Base<typename T1::elem_type,T1>& A, const Base<typename T1::elem_type,T2>& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Glue<T1, T2, glue_conv>(A.get_ref(), B.get_ref());\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_conv_to.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_conv_to\n//! @{\n\n\n\n//! conversion from Armadillo Base and BaseCube objects to scalars\n//! (kept only for compatibility with old code; use as_scalar() instead for Base objects like Mat)\ntemplate<typename out_eT>\nclass conv_to\n  {\n  public:\n  \n  template<typename in_eT, typename T1>\n  inline static out_eT from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);\n\n  template<typename in_eT, typename T1>\n  inline static out_eT from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);\n  \n  template<typename in_eT, typename T1>\n  inline static out_eT from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);\n  \n  template<typename in_eT, typename T1>\n  inline static out_eT from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);\n  };\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT, typename T1>\ninline\nout_eT\nconv_to<out_eT>::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  arma_type_check(( is_supported_elem_type<out_eT>::value == false ));\n  \n  const Proxy<T1> P(in.get_ref());\n  \n  arma_debug_check( (P.get_n_elem() != 1), \"conv_to(): given object doesn't have exactly one element\" );\n  \n  return out_eT(Proxy<T1>::prefer_at_accessor ? P.at(0,0) : P[0]);\n  }\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT, typename T1>\ninline\nout_eT\nconv_to<out_eT>::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  arma_type_check(( is_supported_elem_type<out_eT>::value == false ));\n  \n  const Proxy<T1> P(in.get_ref());\n  \n  arma_debug_check( (P.get_n_elem() != 1), \"conv_to(): given object doesn't have exactly one element\" );\n  \n  out_eT out;\n  \n  arrayops::convert_cx_scalar(out, (Proxy<T1>::prefer_at_accessor ? P.at(0,0) : P[0]));\n  \n  return out;\n  }\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT, typename T1>\ninline\nout_eT\nconv_to<out_eT>::from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  arma_type_check(( is_supported_elem_type<out_eT>::value == false ));\n  \n  const ProxyCube<T1> P(in.get_ref());\n  \n  arma_debug_check( (P.get_n_elem() != 1), \"conv_to(): given object doesn't have exactly one element\" );\n  \n  return out_eT(ProxyCube<T1>::prefer_at_accessor ? P.at(0,0,0) : P[0]);\n  }\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT, typename T1>\ninline\nout_eT\nconv_to<out_eT>::from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  arma_type_check(( is_supported_elem_type<out_eT>::value == false ));\n  \n  const ProxyCube<T1> P(in.get_ref());\n  \n  arma_debug_check( (P.get_n_elem() != 1), \"conv_to(): given object doesn't have exactly one element\" );\n  \n  out_eT out;\n  \n  arrayops::convert_cx_scalar(out, (ProxyCube<T1>::prefer_at_accessor ? P.at(0,0,0) : P[0]));\n  \n  return out;\n  }\n\n\n\n//! conversion to Armadillo matrices from Armadillo Base objects, as well as from std::vector\ntemplate<typename out_eT>\nclass conv_to< Mat<out_eT> >\n  {\n  public:\n  \n  template<typename in_eT, typename T1>\n  inline static Mat<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);\n  \n  template<typename in_eT, typename T1>\n  inline static Mat<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);\n  \n  template<typename T1>\n  inline static Mat<out_eT> from(const SpBase<out_eT, T1>& in);\n  \n  \n  \n  template<typename in_eT>\n  inline static Mat<out_eT> from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0);\n  \n  template<typename in_eT>\n  inline static Mat<out_eT> from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0);\n  };\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT, typename T1>\ninline\nMat<out_eT>\nconv_to< Mat<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const quasi_unwrap<T1> tmp(in.get_ref());\n  const Mat<in_eT>& X  = tmp.M;\n  \n  Mat<out_eT> out(X.n_rows, X.n_cols);\n  \n  arrayops::convert( out.memptr(), X.memptr(), X.n_elem );\n  \n  return out;\n  }\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT, typename T1>\ninline\nMat<out_eT>\nconv_to< Mat<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const quasi_unwrap<T1> tmp(in.get_ref());\n  const Mat<in_eT>& X  = tmp.M;\n  \n  Mat<out_eT> out(X.n_rows, X.n_cols);\n  \n  arrayops::convert_cx( out.memptr(), X.memptr(), X.n_elem );\n  \n  return out;\n  }\n\n\n\ntemplate<typename out_eT>\ntemplate<typename T1>\ninline\nMat<out_eT>\nconv_to< Mat<out_eT> >::from(const SpBase<out_eT, T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Mat<out_eT>(in.get_ref());\n  }\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT>\ninline\nMat<out_eT>\nconv_to< Mat<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const uword N = uword( in.size() );\n  \n  Mat<out_eT> out(N, 1);\n  \n  if(N > 0)\n    {\n    arrayops::convert( out.memptr(), &(in[0]), N );\n    }\n  \n  return out;\n  }\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT>\ninline\nMat<out_eT>\nconv_to< Mat<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const uword N = uword( in.size() );\n  \n  Mat<out_eT> out(N, 1);\n  \n  if(N > 0)\n    {\n    arrayops::convert_cx( out.memptr(), &(in[0]), N );\n    }\n  \n  return out;\n  }\n\n\n\n//! conversion to Armadillo row vectors from Armadillo Base objects, as well as from std::vector\ntemplate<typename out_eT>\nclass conv_to< Row<out_eT> >\n  {\n  public:\n  \n  template<typename in_eT, typename T1>\n  inline static Row<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);\n  \n  template<typename in_eT, typename T1>\n  inline static Row<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);\n  \n  \n  \n  template<typename in_eT>\n  inline static Row<out_eT> from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0);\n  \n  template<typename in_eT>\n  inline static Row<out_eT> from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0);\n  };\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT, typename T1>\ninline\nRow<out_eT>\nconv_to< Row<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const quasi_unwrap<T1> tmp(in.get_ref());\n  const Mat<in_eT>& X  = tmp.M;\n  \n  arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), \"conv_to(): given object can't be interpreted as a vector\" );\n  \n  Row<out_eT> out(X.n_elem);\n  \n  arrayops::convert( out.memptr(), X.memptr(), X.n_elem );\n  \n  return out;\n  }\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT, typename T1>\ninline\nRow<out_eT>\nconv_to< Row<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const quasi_unwrap<T1> tmp(in.get_ref());\n  const Mat<in_eT>& X  = tmp.M;\n  \n  arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), \"conv_to(): given object can't be interpreted as a vector\" );\n  \n  Row<out_eT> out(X.n_rows, X.n_cols);\n  \n  arrayops::convert_cx( out.memptr(), X.memptr(), X.n_elem );\n  \n  return out;\n  }\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT>\ninline\nRow<out_eT>\nconv_to< Row<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const uword N = uword( in.size() );\n  \n  Row<out_eT> out(N);\n  \n  if(N > 0)\n    {\n    arrayops::convert( out.memptr(), &(in[0]), N );\n    }\n  \n  return out;\n  }\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT>\ninline\nRow<out_eT>\nconv_to< Row<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const uword N = uword( in.size() );\n  \n  Row<out_eT> out(N);\n  \n  if(N > 0)\n    {\n    arrayops::convert_cx( out.memptr(), &(in[0]), N );\n    }\n  \n  return out;\n  }\n\n\n\n//! conversion to Armadillo column vectors from Armadillo Base objects, as well as from std::vector\ntemplate<typename out_eT>\nclass conv_to< Col<out_eT> >\n  {\n  public:\n  \n  template<typename in_eT, typename T1>\n  inline static Col<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);\n  \n  template<typename in_eT, typename T1>\n  inline static Col<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);\n  \n  \n  \n  template<typename in_eT>\n  inline static Col<out_eT> from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk = 0);\n  \n  template<typename in_eT>\n  inline static Col<out_eT> from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk = 0);\n  };\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT, typename T1>\ninline\nCol<out_eT>\nconv_to< Col<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const quasi_unwrap<T1> tmp(in.get_ref());\n  const Mat<in_eT>& X  = tmp.M;\n  \n  arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), \"conv_to(): given object can't be interpreted as a vector\" );\n  \n  Col<out_eT> out(X.n_elem);\n  \n  arrayops::convert( out.memptr(), X.memptr(), X.n_elem );\n  \n  return out;\n  }\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT, typename T1>\ninline\nCol<out_eT>\nconv_to< Col<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const quasi_unwrap<T1> tmp(in.get_ref());\n  const Mat<in_eT>& X  = tmp.M;\n  \n  arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), \"conv_to(): given object can't be interpreted as a vector\" );\n  \n  Col<out_eT> out(X.n_rows, X.n_cols);\n  \n  arrayops::convert_cx( out.memptr(), X.memptr(), X.n_elem );\n  \n  return out;\n  }\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT>\ninline\nCol<out_eT>\nconv_to< Col<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_not_cx<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const uword N = uword( in.size() );\n  \n  Col<out_eT> out(N);\n  \n  if(N > 0)\n    {\n    arrayops::convert( out.memptr(), &(in[0]), N );\n    }\n  \n  return out;\n  }\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT>\ninline\nCol<out_eT>\nconv_to< Col<out_eT> >::from(const std::vector<in_eT>& in, const typename arma_cx_only<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const uword N = uword( in.size() );\n  \n  Col<out_eT> out(N);\n  \n  if(N > 0)\n    {\n    arrayops::convert_cx( out.memptr(), &(in[0]), N );\n    }\n  \n  return out;\n  }\n\n\n\ntemplate<typename out_eT>\nclass conv_to< SpMat<out_eT> >\n  {\n  public:\n  \n  template<typename T1>\n  inline static SpMat<out_eT> from(const Base<out_eT, T1>& in);\n  };\n\n\n\ntemplate<typename out_eT>\ntemplate<typename T1>\ninline\nSpMat<out_eT>\nconv_to< SpMat<out_eT> >::from(const Base<out_eT, T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpMat<out_eT>(in.get_ref());\n  }\n\n\n\n//! conversion to Armadillo cubes from Armadillo BaseCube objects\ntemplate<typename out_eT>\nclass conv_to< Cube<out_eT> >\n  {\n  public:\n  \n  template<typename in_eT, typename T1>\n  inline static Cube<out_eT> from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);\n  \n  template<typename in_eT, typename T1>\n  inline static Cube<out_eT> from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);\n  };\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT, typename T1>\ninline\nCube<out_eT>\nconv_to< Cube<out_eT> >::from(const BaseCube<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const unwrap_cube<T1>  tmp( in.get_ref() );\n  const Cube<in_eT>& X = tmp.M;\n  \n  Cube<out_eT> out(X.n_rows, X.n_cols, X.n_slices);\n  \n  arrayops::convert( out.memptr(), X.memptr(), X.n_elem );\n  \n  return out;\n  }\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT, typename T1>\ninline\nCube<out_eT>\nconv_to< Cube<out_eT> >::from(const BaseCube<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const unwrap_cube<T1>  tmp( in.get_ref() );\n  const Cube<in_eT>& X = tmp.M;\n  \n  Cube<out_eT> out(X.n_rows, X.n_cols, X.n_slices);\n  \n  arrayops::convert_cx( out.memptr(), X.memptr(), X.n_elem );\n  \n  return out;\n  }\n\n\n\n//! conversion to std::vector from Armadillo Base objects\ntemplate<typename out_eT>\nclass conv_to< std::vector<out_eT> >\n  {\n  public:\n  \n  template<typename in_eT, typename T1>\n  inline static std::vector<out_eT> from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk = 0);\n  \n  template<typename in_eT, typename T1>\n  inline static std::vector<out_eT> from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk = 0);\n  };\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT, typename T1>\ninline\nstd::vector<out_eT>\nconv_to< std::vector<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_not_cx<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const quasi_unwrap<T1> tmp(in.get_ref());\n  const Mat<in_eT>& X  = tmp.M;\n  \n  arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), \"conv_to(): given object can't be interpreted as a vector\" );\n  \n  const uword N = X.n_elem;\n  \n  std::vector<out_eT> out(N);\n  \n  if(N > 0)\n    {\n    arrayops::convert( &(out[0]), X.memptr(), N );\n    }\n  \n  return out;\n  }\n\n\n\ntemplate<typename out_eT>\ntemplate<typename in_eT, typename T1>\ninline\nstd::vector<out_eT>\nconv_to< std::vector<out_eT> >::from(const Base<in_eT, T1>& in, const typename arma_cx_only<in_eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const quasi_unwrap<T1> tmp(in.get_ref());\n  const Mat<in_eT>& X  = tmp.M;\n  \n  arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), \"conv_to(): given object can't be interpreted as a vector\" );\n  \n  const uword N = X.n_elem;\n  \n  std::vector<out_eT> out(N);\n  \n  if(N > 0)\n    {\n    arrayops::convert_cx( &(out[0]), X.memptr(), N );\n    }\n  \n  return out;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_cor.hpp",
    "content": "// Copyright (C) 2009-2010 Conrad Sanderson\n// Copyright (C) 2009-2010 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_cor\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nconst Op<T1, op_cor>\ncor(const Base<typename T1::elem_type,T1>& X, const uword norm_type = 0)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (norm_type > 1), \"cor(): parameter 'norm_type' must be 0 or 1\" );\n  \n  return Op<T1, op_cor>(X.get_ref(), norm_type, 0);\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst Glue<T1,T2,glue_cor>\ncor(const Base<typename T1::elem_type,T1>& A, const Base<typename T1::elem_type,T2>& B, const uword norm_type = 0)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (norm_type > 1), \"cor(): parameter 'norm_type' must be 0 or 1\" );\n  \n  return Glue<T1, T2, glue_cor>(A.get_ref(), B.get_ref(), norm_type);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_cov.hpp",
    "content": "// Copyright (C) 2009-2010 Conrad Sanderson\n// Copyright (C) 2009-2010 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_cov\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nconst Op<T1, op_cov>\ncov(const Base<typename T1::elem_type,T1>& X, const uword norm_type = 0)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (norm_type > 1), \"cov(): parameter 'norm_type' must be 0 or 1\" );\n\n  return Op<T1, op_cov>(X.get_ref(), norm_type, 0);\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst Glue<T1,T2,glue_cov>\ncov(const Base<typename T1::elem_type,T1>& A, const Base<typename T1::elem_type,T2>& B, const uword norm_type = 0)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (norm_type > 1), \"cov(): parameter 'norm_type' must be 0 or 1\" );\n  \n  return Glue<T1, T2, glue_cov>(A.get_ref(), B.get_ref(), norm_type);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_cross.hpp",
    "content": "// Copyright (C) 2010 Conrad Sanderson\n// Copyright (C) 2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_cross\n//! @{\n\n\n\n//! cross product (only valid for 3 dimensional vectors)\ntemplate<typename T1, typename T2>\ninline\nconst Glue<T1, T2, glue_cross>\ncross(const Base<typename T1::elem_type,T1>& X, const Base<typename T1::elem_type,T2>& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Glue<T1, T2, glue_cross>(X.get_ref(), Y.get_ref());\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_cumsum.hpp",
    "content": "// Copyright (C) 2010-2012 Conrad Sanderson\n// Copyright (C) 2010-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_cumsum\n//! @{\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_cumsum_mat>\ncumsum\n  (\n  const T1& X,\n  const uword dim = 0,\n  const typename enable_if< is_arma_type<T1>::value       == true  >::result* junk1 = 0,\n  const typename enable_if< resolves_to_vector<T1>::value == false >::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return Op<T1, op_cumsum_mat>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_cumsum_mat>\ncumsum\n  (\n  const T1& X,\n  const uword dim,\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return Op<T1, op_cumsum_mat>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_cumsum_vec>\ncumsum\n  (\n  const T1& X,\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return Op<T1, op_cumsum_vec>(X);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<Op<T1, op_cumsum_vec>, op_cumsum_mat>\ncumsum\n  (\n  const Op<T1, op_cumsum_vec>& X,\n  const uword dim,\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return Op<Op<T1, op_cumsum_vec>, op_cumsum_mat>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<Op<T1, op_cumsum_vec>, op_cumsum_vec>\ncumsum\n  (\n  const Op<T1, op_cumsum_vec>& X,\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return Op<Op<T1, op_cumsum_vec>, op_cumsum_vec>(X);\n  }\n\n\n\ntemplate<typename T>\narma_inline\narma_warn_unused\nconst typename arma_scalar_only<T>::result &\ncumsum(const T& x)\n  {\n  return x;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_det.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_det\n//! @{\n\n\n\n//! determinant of mat\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\ndet\n  (\n  const Base<typename T1::elem_type,T1>& X,\n  const bool slow = false,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return auxlib::det(X, slow);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\ndet\n  (\n  const Base<typename T1::elem_type,T1>& X,\n  const char* method,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'f')), \"det(): unknown method specified\" );\n  \n  const bool slow = (sig == 's');\n  \n  return auxlib::det(X, slow);\n  }\n\n\n\n//! determinant of diagmat\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\ndet\n  (\n  const Op<T1, op_diagmat>& X,\n  const bool slow = false\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(slow);\n  \n  typedef typename T1::elem_type eT;\n  \n  const diagmat_proxy<T1> A(X.m);\n  \n  const uword N = A.n_elem;\n  \n  eT val1 = eT(1);\n  eT val2 = eT(1);\n  \n  uword i,j;\n  for(i=0, j=1; j<N; i+=2, j+=2)\n    {\n    val1 *= A[i];\n    val2 *= A[j];\n    }\n  \n  \n  if(i < N)\n    {\n    val1 *= A[i];\n    }\n  \n  return val1 * val2;\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\ndet\n  (\n  const Op<T1, op_diagmat>& X,\n  const char* method\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'f')), \"det(): unknown method specified\" );\n  \n  return det(X, false);\n  }\n\n\n\n//! determinant of a triangular matrix\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\ndet\n  (\n  const Op<T1, op_trimat>& X,\n  const bool slow = false\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(slow);\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(X.m);\n  \n  const uword N = P.get_n_rows();\n  \n  arma_debug_check( (N != P.get_n_cols()), \"det(): matrix is not square\" );\n  \n  eT val1 = eT(1);\n  eT val2 = eT(1);\n  \n  uword i,j;\n  for(i=0, j=1; j<N; i+=2, j+=2)\n    {\n    val1 *= P.at(i,i);\n    val2 *= P.at(j,j);\n    }\n  \n  if(i < N)\n    {\n    val1 *= P.at(i,i);\n    }\n  \n  return val1 * val2;\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\ndet\n  (\n  const Op<T1, op_trimat>& X,\n  const char* method\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'f')), \"det(): unknown method specified\" );\n  \n  return det(X, false);\n  }\n\n\n\n//! determinant of inv(A), without doing the inverse operation\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\ndet\n  (\n  const Op<T1,op_inv>& X,\n  const bool slow = false,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  \n  const eT tmp = det(X.m, slow);\n  \n  arma_debug_warn( (tmp == eT(0)), \"det(): warning: denominator is zero\" );\n  \n  return eT(1) / tmp;\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\ndet\n  (\n  const Op<T1,op_inv>& X,\n  const char* method,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'f')), \"det(): unknown method specified\" );\n  \n  const bool slow = (sig == 's');\n  \n  return det(X, slow);\n  }\n\n\n\n//! determinant of trans(A)\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\ndet\n  (\n  const Op<T1,op_htrans>& in,\n  const bool slow = false,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk1 = 0,\n  const typename         arma_not_cx<typename T1::elem_type>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return auxlib::det(in.m, slow);  // bypass op_htrans\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\ndet\n  (\n  const Op<T1,op_htrans>& in,\n  const char* method,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk1 = 0,\n  const typename         arma_not_cx<typename T1::elem_type>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'f')), \"det(): unknown method specified\" );\n  \n  const bool slow = (sig == 's');\n  \n  return auxlib::det(in.m, slow);  // bypass op_htrans\n  }\n\n\n\ntemplate<typename T>\narma_inline\narma_warn_unused\nconst typename arma_scalar_only<T>::result &\ndet(const T& x)\n  {\n  return x;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_diagmat.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_diagmat\n//! @{\n\n\n//! interpret a matrix or a vector as a diagonal matrix (i.e. off-diagonal entries are zero)\ntemplate<typename T1>\narma_inline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value,\n  const Op<T1, op_diagmat>\n  >::result\ndiagmat(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_diagmat>(X);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst SpOp<T1, spop_diagmat>\ndiagmat(const SpBase<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpOp<T1, spop_diagmat>(X.get_ref());\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_diagvec.hpp",
    "content": "// Copyright (C) 2008-2010 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_diagvec\n//! @{\n\n\n//! extract a diagonal from a matrix\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_diagvec>\ndiagvec(const Base<typename T1::elem_type,T1>& X, const sword diag_id = 0)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_diagvec>(X.get_ref(), ((diag_id < 0) ? -diag_id : diag_id), ((diag_id < 0) ? 1 : 0) );\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_dot.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// Copyright (C) 2012 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_dot\n//! @{\n\n\ntemplate<typename T1, typename T2>\narma_inline\narma_warn_unused\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::yes,\n  typename T1::elem_type\n  >::result\ndot\n  (\n  const T1& A,\n  const T2& B\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return op_dot::apply(A,B);\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\narma_warn_unused\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::no,\n  typename promote_type<typename T1::elem_type, typename T2::elem_type>::result\n  >::result\ndot\n  (\n  const T1& A,\n  const T2& B\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return op_dot_mixed::apply(A,B);\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\narma_warn_unused\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value,\n  typename T1::elem_type\n  >::result\nnorm_dot\n  (\n  const T1& A, \n  const T2& B\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return op_norm_dot::apply(A,B);\n  }\n\n\n\n//\n// cdot\n\n\n\ntemplate<typename T1, typename T2>\narma_inline\narma_warn_unused\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value && is_not_complex<typename T1::elem_type>::value,\n  typename T1::elem_type\n  >::result\ncdot\n  (\n  const T1& A,\n  const T2& B\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return op_dot::apply(A,B);\n  }\n\n\n\n\ntemplate<typename T1, typename T2>\narma_inline\narma_warn_unused\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value && is_complex<typename T1::elem_type>::value,\n  typename T1::elem_type\n  >::result\ncdot\n  (\n  const T1& A,\n  const T2& B\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return op_cdot::apply(A,B);\n  }\n\n\n\n// convert dot(htrans(x), y) to cdot(x,y)\n\ntemplate<typename T1, typename T2>\narma_inline\narma_warn_unused\ntypename\nenable_if2\n  <\n  is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value && is_complex<typename T1::elem_type>::value,\n  typename T1::elem_type\n  >::result\ndot\n  (\n  const Op<T1, op_htrans>& A,\n  const T2&                B\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return cdot(A.m, B);\n  }\n\n\n\n//\n// for sparse matrices\n// \n\n\n\nnamespace priv\n  {\n  \n  template<typename T1, typename T2>\n  arma_hot\n  inline\n  typename T1::elem_type\n  dot_helper(const SpProxy<T1>& pa, const SpProxy<T2>& pb)\n    {\n    typedef typename T1::elem_type eT;\n    \n    // Iterate over both objects and see when they are the same\n    eT result = eT(0);\n    \n    typename SpProxy<T1>::const_iterator_type a_it  = pa.begin();\n    typename SpProxy<T1>::const_iterator_type a_end = pa.end();\n    \n    typename SpProxy<T2>::const_iterator_type b_it  = pb.begin();\n    typename SpProxy<T2>::const_iterator_type b_end = pb.end();\n    \n    while((a_it != a_end) && (b_it != b_end))\n      {\n      if(a_it == b_it)\n        {\n        result += (*a_it) * (*b_it);\n        \n        ++a_it;\n        ++b_it;\n        }\n      else if((a_it.col() < b_it.col()) || ((a_it.col() == b_it.col()) && (a_it.row() < b_it.row())))\n        {\n        // a_it is \"behind\"\n        ++a_it;\n        }\n      else\n        {\n        // b_it is \"behind\"\n        ++b_it;\n        }\n      }\n    \n    return result;\n    }\n  \n  }\n\n\n\n//! dot product of two sparse objects\ntemplate<typename T1, typename T2>\narma_warn_unused\narma_hot\ninline\ntypename\nenable_if2\n  <(is_arma_sparse_type<T1>::value) && (is_arma_sparse_type<T2>::value) && (is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n   typename T1::elem_type\n  >::result\ndot\n  (\n  const T1& x,\n  const T2& y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> pa(x);\n  const SpProxy<T2> pb(y);\n  \n  arma_debug_assert_same_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), \"dot()\");\n  \n  typedef typename T1::elem_type eT;\n  \n  typedef typename SpProxy<T1>::stored_type pa_Q_type;\n  typedef typename SpProxy<T2>::stored_type pb_Q_type;\n  \n  if(\n         ( (SpProxy<T1>::must_use_iterator == false) && (SpProxy<T2>::must_use_iterator == false) )\n      && ( (is_SpMat<pa_Q_type>::value     == true ) && (is_SpMat<pb_Q_type>::value     == true ) )   \n    )\n    {\n    const unwrap_spmat<pa_Q_type> tmp_a(pa.Q);\n    const unwrap_spmat<pb_Q_type> tmp_b(pb.Q);\n    \n    const SpMat<eT>& A = tmp_a.M;\n    const SpMat<eT>& B = tmp_b.M;\n    \n    if( &A == &B )\n      {\n      // We can do it directly!\n      return op_dot::direct_dot_arma(A.n_nonzero, A.values, A.values);\n      }\n    else\n      {\n      return priv::dot_helper(pa,pb);\n      }\n    }\n  else\n    {\n    return priv::dot_helper(pa,pb);\n    }\n  }\n\n\n\n//! dot product of one dense and one sparse object\ntemplate<typename T1, typename T2>\narma_warn_unused\narma_hot\ninline\ntypename\nenable_if2\n  <(is_arma_type<T1>::value) && (is_arma_sparse_type<T2>::value) && (is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n   typename T1::elem_type\n  >::result\ndot\n  (\n  const T1& x,\n  const T2& y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const   Proxy<T1> pa(x);\n  const SpProxy<T2> pb(y);\n  \n  arma_debug_assert_same_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), \"dot()\");\n  \n  typedef typename T1::elem_type eT;\n  \n  eT result = eT(0);\n  \n  typename SpProxy<T2>::const_iterator_type it     = pb.begin();\n  typename SpProxy<T2>::const_iterator_type it_end = pb.end();\n  \n  // prefer_at_accessor won't save us operations\n  while(it != it_end)\n    {\n    result += (*it) * pa.at(it.row(), it.col());\n    ++it;\n    }\n  \n  return result;\n  }\n\n\n\n//! dot product of one sparse and one dense object\ntemplate<typename T1, typename T2>\narma_warn_unused\narma_hot\ninline\ntypename\nenable_if2\n  <(is_arma_sparse_type<T1>::value) && (is_arma_type<T2>::value) && (is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n   typename T1::elem_type\n  >::result\ndot\n  (\n  const T1& x,\n  const T2& y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  // this is commutative\n  return dot(y, x);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_eig_gen.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// Copyright (C) 2009 Edmund Highcock\n// Copyright (C) 2011 Stanislav Funiak\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_eig_gen\n//! @{\n\n\n//! Eigenvalues of general real square matrix X\ntemplate<typename T, typename T1>\ninline\nCol< std::complex<T> >\neig_gen\n  (\n  const Base<T, T1>& X, \n  const typename arma_blas_type_only<T>::result* junk1 = 0,\n  const typename         arma_not_cx<T>::result* junk2 = 0 \n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  Mat<T> l_eigvec;\n  Mat<T> r_eigvec;\n  \n  Col< std::complex<T> > eigval;\n  \n  const bool status = auxlib::eig_gen(eigval, l_eigvec, r_eigvec, X, 'n');\n  \n  if(status == false)\n    {\n    eigval.reset();\n    arma_bad(\"eig_gen(): failed to converge\");\n    }\n  \n  return eigval;\n  }\n\n\n\n//! Eigenvalues of general complex square matrix X\ntemplate<typename T, typename T1>\ninline\nCol< std::complex<T> >\neig_gen\n  (\n  const Base< std::complex<T>, T1>& X, \n  const typename arma_blas_type_only< std::complex<T> >::result* junk1 = 0,\n  const typename        arma_cx_only< std::complex<T> >::result* junk2 = 0 \n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  Mat< std::complex<T> > l_eigvec;\n  Mat< std::complex<T> > r_eigvec;\n  \n  Col< std::complex<T> > eigval;\n  \n  const bool status = auxlib::eig_gen(eigval, l_eigvec, r_eigvec, X, 'n');\n  \n  if(status == false)\n    {\n    eigval.reset();\n    arma_bad(\"eig_gen(): failed to converge\");\n    }\n  \n  return eigval;\n  }\n\n\n\n//! Eigenvalues of general real square matrix X\ntemplate<typename T, typename T1>\ninline\nbool\neig_gen\n  (\n         Col< std::complex<T> >& eigval, \n  const Base<T, T1>&             X, \n  const typename arma_blas_type_only<T>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  Mat<T> l_eigvec;\n  Mat<T> r_eigvec;\n  \n  const bool status = auxlib::eig_gen(eigval, l_eigvec, r_eigvec, X, 'n');\n  \n  if(status == false)\n    {\n    eigval.reset();\n    arma_bad(\"eig_gen(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! Eigenvalues of general complex square matrix X\ntemplate<typename T, typename T1>\ninline\nbool\neig_gen\n  (\n         Col< std::complex<T> >&    eigval, \n  const Base< std::complex<T>, T1>& X, \n  const typename arma_blas_type_only< std::complex<T> >::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  Mat< std::complex<T> > l_eigvec;\n  Mat< std::complex<T> > r_eigvec;\n  \n  const bool status = auxlib::eig_gen(eigval, l_eigvec, r_eigvec, X, 'n');\n  \n  if(status == false)\n    {\n    eigval.reset();\n    arma_bad(\"eig_gen(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! Eigenvalues and eigenvectors of general real square matrix X.\n//! Optional argument 'side' specifies which eigenvectors should be computed:\n//! 'r' for right (default) and 'l' for left.\ntemplate<typename eT, typename T1>\ninline\nbool\neig_gen\n  (\n        Col< std::complex<eT> >& eigval, \n        Mat< std::complex<eT> >& eigvec,\n  const Base<eT, T1>&            X, \n  const char                     side = 'r',\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  //std::cout << \"real\" << std::endl;\n  \n  arma_debug_check( ( ((void*)(&eigval)) == ((void*)(&eigvec)) ), \"eig_gen(): eigval is an alias of eigvec\" );\n  \n  Mat<eT> dummy_eigvec;\n  Mat<eT> tmp_eigvec;\n  \n  bool status;\n  \n  switch(side)\n    {\n    case 'r':\n      status = auxlib::eig_gen(eigval, dummy_eigvec, tmp_eigvec, X, side);\n      break;\n    \n    case 'l':\n      status = auxlib::eig_gen(eigval, tmp_eigvec, dummy_eigvec, X, side);\n      break;\n      \n    default:\n      arma_stop(\"eig_gen(): parameter 'side' is invalid\");\n      status = false;\n    }\n  \n  if(status == false)\n    {\n    eigval.reset();\n    eigvec.reset();\n    arma_bad(\"eig_gen(): failed to converge\", false);\n    }\n  else\n    {\n    const uword n = eigval.n_elem;\n    \n    if(n > 0)\n      {\n      eigvec.set_size(n,n);\n      \n      for(uword j=0; j<n; ++j)\n        {\n        if( (j < n-1) && (eigval[j] == std::conj(eigval[j+1])) )\n          {\n          // eigvec.col(j)   = Mat< std::complex<eT> >( tmp_eigvec.col(j),  tmp_eigvec.col(j+1) );\n          // eigvec.col(j+1) = Mat< std::complex<eT> >( tmp_eigvec.col(j), -tmp_eigvec.col(j+1) );\n          \n          for(uword i=0; i<n; ++i)\n            {\n            eigvec.at(i,j)   = std::complex<eT>( tmp_eigvec.at(i,j),  tmp_eigvec.at(i,j+1) );\n            eigvec.at(i,j+1) = std::complex<eT>( tmp_eigvec.at(i,j), -tmp_eigvec.at(i,j+1) );\n            }\n          \n          ++j;\n          }\n        else\n          {\n          // eigvec.col(i) = tmp_eigvec.col(i);\n          \n          for(uword i=0; i<n; ++i)\n            {\n            eigvec.at(i,j) = std::complex<eT>(tmp_eigvec.at(i,j), eT(0));\n            }\n          \n          }\n        }\n      }\n    }\n  \n  return status;\n  }\n\n\n\n//! Eigenvalues and eigenvectors of general complex square matrix X\n//! Optional argument 'side' specifies which eigenvectors should be computed:\n//! 'r' for right (default) and 'l' for left.\ntemplate<typename T, typename T1>\ninline\nbool\neig_gen\n  (\n         Col<std::complex<T> >&    eigval, \n         Mat<std::complex<T> >&    eigvec,\n  const Base<std::complex<T>, T1>& X, \n  const char                       side = 'r',\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  //std::cout << \"complex\" << std::endl;\n  \n  arma_debug_check( ( ((void*)(&eigval)) == ((void*)(&eigvec)) ), \"eig_gen(): eigval is an alias of eigvec\" );\n  \n  Mat< std::complex<T> > dummy_eigvec;\n  \n  bool status;\n  \n  switch(side)\n    {\n    case 'r':\n      status = auxlib::eig_gen(eigval, dummy_eigvec, eigvec, X, side);\n      break;\n    \n    case 'l':\n      status = auxlib::eig_gen(eigval, eigvec, dummy_eigvec, X, side);\n      break;\n      \n    default:\n      arma_stop(\"eig_gen(): parameter 'side' is invalid\");\n      status = false;\n    }\n  \n  if(status == false)\n    {\n    eigval.reset();\n    eigvec.reset();\n    arma_bad(\"eig_gen(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! Eigenvalues and eigenvectors (both left and right) of general real/complex square matrix X\n//! NOTE: DO NOT USE THIS FUNCTION; it is kept ONLY for compatibility with old user code\ntemplate<typename T1>\narma_deprecated\ninline\nbool\neig_gen\n  (\n         Col< std::complex<typename T1::pod_type> >& eigval, \n         Mat<typename T1::elem_type>&                l_eigvec,\n         Mat<typename T1::elem_type>&                r_eigvec,\n  const Base<typename T1::elem_type,T1>&             X,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  arma_debug_check\n    (\n    ((&l_eigvec) == (&r_eigvec)),\n    \"eig_gen(): l_eigvec is an alias of r_eigvec\"\n    );\n  \n  arma_debug_check\n    (\n      (\n      (((void*)(&eigval)) == ((void*)(&l_eigvec)))\n      ||\n      (((void*)(&eigval)) == ((void*)(&r_eigvec)))\n      ),\n    \"eig_gen(): eigval is an alias of l_eigvec or r_eigvec\"\n    );\n  \n  const bool status = auxlib::eig_gen(eigval, l_eigvec, r_eigvec, X, 'b');\n  \n  if(status == false)\n    {\n    eigval.reset();\n    l_eigvec.reset();\n    r_eigvec.reset();\n    arma_bad(\"eig_gen(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_eig_pair.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_eig_pair\n//! @{\n\n\n//! eigenvalues for pair of N-by-N general real matrices (A,B)\ntemplate<typename T, typename T1>\ninline\nCol< std::complex<T> >\neig_pair\n  (\n  const Base<T, T1>& A,\n  const Base<T, T1>& B,\n  const typename arma_blas_type_only<T>::result* junk1 = 0,\n  const typename         arma_not_cx<T>::result* junk2 = 0 \n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  Mat<T> l_eigvec;\n  Mat<T> r_eigvec;\n  \n  Col< std::complex<T> > eigval;\n  \n  const bool status = auxlib::eig_pair(eigval, l_eigvec, r_eigvec, A, B, 'n');\n  \n  if(status == false)\n    {\n    eigval.reset();\n    arma_bad(\"eig_pair(): failed to converge\");\n    }\n  \n  return eigval;\n  }\n\n\n\n//! eigenvalues for pair of N-by-N general complex matrices (A,B)\ntemplate<typename T, typename T1>\ninline\nCol< std::complex<T> >\neig_pair\n  (\n  const Base< std::complex<T>, T1>& A, \n  const Base< std::complex<T>, T1>& B, \n  const typename arma_blas_type_only< std::complex<T> >::result* junk1 = 0,\n  const typename        arma_cx_only< std::complex<T> >::result* junk2 = 0 \n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  Mat< std::complex<T> > l_eigvec;\n  Mat< std::complex<T> > r_eigvec;\n  \n  Col< std::complex<T> > eigval;\n  \n  const bool status = auxlib::eig_pair(eigval, l_eigvec, r_eigvec, A, B, 'n');\n  \n  if(status == false)\n    {\n    eigval.reset();\n    arma_bad(\"eig_pair(): failed to converge\");\n    }\n  \n  return eigval;\n  }\n\n\n\n//! eigenvalues for pair of N-by-N general real matrices (A,B)\ntemplate<typename eT, typename T1, typename T2>\ninline\nbool\neig_pair\n  (\n         Col< std::complex<eT> >& eigval, \n  const Base< eT, T1 >&           A,\n  const Base< eT, T2 >&           B,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  Mat<eT> l_eigvec;\n  Mat<eT> r_eigvec;\n  \n  const bool status = auxlib::eig_pair(eigval, l_eigvec, r_eigvec, A, B, 'n');\n  \n  if(status == false)\n    {\n    eigval.reset();\n    arma_bad(\"eig_pair(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! eigenvalues for pair of N-by-N general complex matrices (A,B)\ntemplate<typename T, typename T1, typename T2>\ninline\nbool\neig_pair\n  (\n         Col< std::complex<T> >&     eigval, \n  const Base< std::complex<T>, T1 >& A,\n  const Base< std::complex<T>, T2 >& B,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  Mat< std::complex<T> > l_eigvec;\n  Mat< std::complex<T> > r_eigvec;\n  \n  const bool status = auxlib::eig_pair(eigval, l_eigvec, r_eigvec, A, B, 'n');\n  \n  if(status == false)\n    {\n    eigval.reset();\n    arma_bad(\"eig_pair(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! eigenvalues and eigenvectors for pair of N-by-N general real matrices (A,B)\ntemplate<typename eT, typename T1, typename T2>\ninline\nbool\neig_pair\n  (\n         Col< std::complex<eT> >& eigval, \n         Mat< std::complex<eT> >& eigvec,\n  const Base< eT, T1 >&           A,\n  const Base< eT, T2 >&           B,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  arma_debug_check( ( ((void*)(&eigval)) == ((void*)(&eigvec)) ), \"eig_pair(): eigval is an alias of eigvec\" );\n  \n  Mat<eT> dummy_eigvec;\n  Mat<eT> tmp_eigvec;\n  \n  const bool status = auxlib::eig_pair(eigval, dummy_eigvec, tmp_eigvec, A, B, 'r');\n  \n  if(status == false)\n    {\n    eigval.reset();\n    eigvec.reset();\n    arma_bad(\"eig_pair(): failed to converge\", false);\n    }\n  else\n    {\n    const uword n = eigval.n_elem;\n    \n    if(n > 0)\n      {\n      eigvec.set_size(n,n);\n      \n      // from LAPACK docs:\n      // If the j-th and (j+1)-th eigenvalues form a complex conjugate pair, then\n      // v(j) = VR(:,j)+i*VR(:,j+1) and v(j+1) = VR(:,j)-i*VR(:,j+1).\n      \n      for(uword j=0; j<n; ++j)\n        {\n        if( (j < n-1) && (eigval[j] == std::conj(eigval[j+1])) )\n          {\n          // eigvec.col(j)   = Mat< std::complex<eT> >( tmp_eigvec.col(j),  tmp_eigvec.col(j+1) );\n          // eigvec.col(j+1) = Mat< std::complex<eT> >( tmp_eigvec.col(j), -tmp_eigvec.col(j+1) );\n          \n          for(uword i=0; i<n; ++i)\n            {\n            eigvec.at(i,j)   = std::complex<eT>( tmp_eigvec.at(i,j),  tmp_eigvec.at(i,j+1) );\n            eigvec.at(i,j+1) = std::complex<eT>( tmp_eigvec.at(i,j), -tmp_eigvec.at(i,j+1) );\n            }\n          \n          ++j;\n          }\n        else\n          {\n          // eigvec.col(i) = tmp_eigvec.col(i);\n          \n          for(uword i=0; i<n; ++i)\n            {\n            eigvec.at(i,j) = std::complex<eT>(tmp_eigvec.at(i,j), eT(0));\n            }\n          }\n        }\n      }\n    }\n  \n  return status;\n  }\n\n\n\n//! eigenvalues and eigenvectors for pair of N-by-N general complex matrices (A,B)\ntemplate<typename T, typename T1, typename T2>\ninline\nbool\neig_pair\n  (\n         Col< std::complex<T> >&     eigval, \n         Mat< std::complex<T> >&     eigvec,\n  const Base< std::complex<T>, T1 >& A,\n  const Base< std::complex<T>, T2 >& B,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  arma_debug_check( ( ((void*)(&eigval)) == ((void*)(&eigvec)) ), \"eig_pair(): eigval is an alias of eigvec\" );\n  \n  Mat< std::complex<T> > dummy_eigvec;\n  \n  const bool status = auxlib::eig_pair(eigval, dummy_eigvec, eigvec, A, B, 'r');\n  \n  if(status == false)\n    {\n    eigval.reset();\n    eigvec.reset();\n    arma_bad(\"eig_pair(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_eig_sym.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// Copyright (C) 2011 Stanislav Funiak\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_eig_sym\n//! @{\n\n\n//! Eigenvalues of real/complex symmetric/hermitian matrix X\ntemplate<typename T1>\ninline\nbool\neig_sym\n  (\n         Col<typename T1::pod_type>&     eigval,\n  const Base<typename T1::elem_type,T1>& X,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  // unwrap_check not used as T1::elem_type and T1::pod_type may not be the same.\n  // furthermore, it doesn't matter if X is an alias of eigval, as auxlib::eig_sym() makes a copy of X\n  \n  const bool status = auxlib::eig_sym(eigval, X);\n  \n  if(status == false)\n    {\n    eigval.reset();\n    arma_bad(\"eig_sym(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! Eigenvalues of real/complex symmetric/hermitian matrix X\ntemplate<typename T1>\ninline\nCol<typename T1::pod_type>\neig_sym\n  (\n  const Base<typename T1::elem_type,T1>& X,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  Col<typename T1::pod_type> out;\n  const bool status = auxlib::eig_sym(out, X);\n\n  if(status == false)\n    {\n    out.reset();\n    arma_bad(\"eig_sym(): failed to converge\");\n    }\n  \n  return out;\n  }\n\n\n\n//! Eigenvalues and eigenvectors of real/complex symmetric/hermitian matrix X\ntemplate<typename T1> \ninline\nbool\neig_sym\n  (\n         Col<typename T1::pod_type>&     eigval,\n         Mat<typename T1::elem_type>&    eigvec,\n  const Base<typename T1::elem_type,T1>& X,\n  const char* method =                   \"dc\",\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'd')),         \"eig_sym(): unknown method specified\"     );\n  arma_debug_check( void_ptr(&eigval) == void_ptr(&eigvec), \"eig_sym(): eigval is an alias of eigvec\" );\n  \n  const Proxy<T1> P(X.get_ref());\n  \n  const bool is_alias = P.is_alias(eigvec);\n  \n  Mat<eT>  eigvec_tmp;\n  Mat<eT>& eigvec_out = (is_alias == false) ? eigvec : eigvec_tmp;\n  \n  bool status = false;\n  \n  if(sig == 'd')       { status = auxlib::eig_sym_dc(eigval, eigvec_out, P.Q); }\n  \n  if(status == false)  { status = auxlib::eig_sym(eigval, eigvec_out, P.Q);    }\n  \n  if(status == false)\n    {\n    eigval.reset();\n    eigvec.reset();\n    arma_bad(\"eig_sym(): failed to converge\", false);\n    }\n  else\n    {\n    if(is_alias)  { eigvec.steal_mem(eigvec_tmp); }\n    }\n  \n  return status;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_eigs_gen.hpp",
    "content": "// Copyright (C) 2013-2014 Ryan Curtin\n// Copyright (C) 2013-2014 Conrad Sanderson\n// Copyright (C) 2013-2014 NICTA\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_eigs_gen\n//! @{\n\n\n//! eigenvalues of general sparse matrix X\ntemplate<typename T1>\ninline\nCol< std::complex<typename T1::pod_type> >\neigs_gen\n  (\n  const SpBase<typename T1::elem_type, T1>& X,\n  const uword                               n_eigvals,\n  const char*                               form = \"lm\",\n  const typename T1::pod_type               tol  = 0.0,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::pod_type T;\n  \n  Mat< std::complex<T> > eigvec;\n  Col< std::complex<T> > eigval;\n  \n  const bool status = sp_auxlib::eigs_gen(eigval, eigvec, X, n_eigvals, form, tol);\n  \n  if(status == false)\n    {\n    eigval.reset();\n    arma_bad(\"eigs_gen(): failed to converge\");\n    }\n  \n  return eigval;\n  }\n\n\n\n//! eigenvalues of general sparse matrix X\ntemplate<typename T1>\ninline\nbool\neigs_gen\n  (\n           Col< std::complex<typename T1::pod_type> >& eigval,\n  const SpBase<typename T1::elem_type, T1>&            X,\n  const uword                                          n_eigvals,\n  const char*                                          form = \"lm\",\n  const typename T1::pod_type                          tol  = 0.0,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::pod_type T;\n  \n  Mat< std::complex<T> > eigvec;\n  \n  const bool status = sp_auxlib::eigs_gen(eigval, eigvec, X, n_eigvals, form, tol);\n  \n  if(status == false)\n    {\n    eigval.reset();\n    arma_bad(\"eigs_gen(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! eigenvalues and eigenvectors of general real sparse matrix X\ntemplate<typename T1>\ninline\nbool\neigs_gen\n  (\n         Col< std::complex<typename T1::pod_type> >& eigval,\n         Mat< std::complex<typename T1::pod_type> >& eigvec,\n  const SpBase<typename T1::elem_type, T1>&          X,\n  const uword                                        n_eigvals,\n  const char*                                        form = \"lm\",\n  const typename T1::pod_type                        tol  = 0.0,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  arma_debug_check( void_ptr(&eigval) == void_ptr(&eigvec), \"eigs_gen(): eigval is an alias of eigvec\" );\n  \n  const bool status = sp_auxlib::eigs_gen(eigval, eigvec, X, n_eigvals, form, tol);\n  \n  if(status == false)\n    {\n    eigval.reset();\n    eigvec.reset();\n    arma_bad(\"eigs_gen(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_eigs_sym.hpp",
    "content": "// Copyright (C) 2013-2014 Ryan Curtin\n// Copyright (C) 2013-2014 Conrad Sanderson\n// Copyright (C) 2013-2014 NICTA\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_eigs_sym\n//! @{\n\n\n//! eigenvalues of symmetric real sparse matrix X\ntemplate<typename T1>\ninline\nCol<typename T1::pod_type>\neigs_sym\n  (\n  const SpBase<typename T1::elem_type,T1>& X,\n  const uword                              n_eigvals,\n  const char*                              form = \"lm\",\n  const typename T1::elem_type             tol  = 0.0,\n  const typename arma_real_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  Mat<typename T1::elem_type> eigvec;\n  Col<typename T1::pod_type > eigval;\n  \n  const bool status = sp_auxlib::eigs_sym(eigval, eigvec, X, n_eigvals, form, tol);\n  \n  if(status == false)\n    {\n    eigval.reset();\n    arma_bad(\"eigs_sym(): failed to converge\");\n    }\n  \n  return eigval;\n  }\n\n\n\n//! eigenvalues of symmetric real sparse matrix X\ntemplate<typename T1>\ninline\nbool\neigs_sym\n  (\n           Col<typename T1::pod_type >&    eigval,\n  const SpBase<typename T1::elem_type,T1>& X,\n  const uword                              n_eigvals,\n  const char*                              form = \"lm\",\n  const typename T1::elem_type             tol  = 0.0,\n  const typename arma_real_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  Mat<typename T1::elem_type> eigvec;\n  \n  const bool status = sp_auxlib::eigs_sym(eigval, eigvec, X, n_eigvals, form, tol);\n  \n  if(status == false)\n    {\n    eigval.reset();\n    arma_bad(\"eigs_sym(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! eigenvalues and eigenvectors of symmetric real sparse matrix X\ntemplate<typename T1>\ninline\nbool\neigs_sym\n  (\n           Col<typename T1::pod_type >&    eigval,\n           Mat<typename T1::elem_type>&    eigvec,\n  const SpBase<typename T1::elem_type,T1>& X,\n  const uword                              n_eigvals,\n  const char*                              form = \"lm\",\n  const typename T1::elem_type             tol  = 0.0,\n  const typename arma_real_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  arma_debug_check( void_ptr(&eigval) == void_ptr(&eigvec), \"eigs_sym(): eigval is an alias of eigvec\" );\n  \n  const bool status = sp_auxlib::eigs_sym(eigval, eigvec, X, n_eigvals, form, tol);\n  \n  if(status == false)\n    {\n    eigval.reset();\n    arma_bad(\"eigs_sym(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_elem.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_elem\n//! @{\n\n\n//\n// real\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< (is_arma_type<T1>::value && is_cx<typename T1::elem_type>::no), const T1& >::result\nreal(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return X;\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst T1&\nreal(const BaseCube<typename T1::pod_type, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return X.get_ref();\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst T1&\nreal(const SpBase<typename T1::pod_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return A.get_ref();\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename enable_if2< (is_arma_type<T1>::value && is_cx<typename T1::elem_type>::yes), const mtOp<typename T1::pod_type, T1, op_real> >::result\nreal(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<typename T1::pod_type, T1, op_real>( X );\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOpCube<typename T1::pod_type, T1, op_real>\nreal(const BaseCube<std::complex<typename T1::pod_type>, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<typename T1::pod_type, T1, op_real>( X.get_ref() );\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst mtSpOp<typename T1::pod_type, T1, spop_real>\nreal(const SpBase<std::complex<typename T1::pod_type>,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtSpOp<typename T1::pod_type, T1, spop_real>(A.get_ref());\n  }\n\n\n\n//\n// imag\n\ntemplate<typename T1>\ninline\nconst Gen< Mat<typename T1::pod_type>, gen_zeros >\nimag(const Base<typename T1::pod_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<T1> A(X.get_ref());\n  \n  return Gen< Mat<typename T1::pod_type>, gen_zeros>(A.get_n_rows(), A.get_n_cols());\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst GenCube<typename T1::pod_type, gen_zeros>\nimag(const BaseCube<typename T1::pod_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const ProxyCube<T1> A(X.get_ref());\n  \n  return GenCube<typename T1::pod_type, gen_zeros>(A.get_n_rows(), A.get_n_cols(), A.get_n_slices());\n  }\n\n\n\ntemplate<typename T1>\ninline\nSpMat<typename T1::pod_type>\nimag(const SpBase<typename T1::pod_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> P(A.get_ref());\n  \n  return SpMat<typename T1::pod_type>(P.get_n_rows(), P.get_n_cols());\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename enable_if2< (is_arma_type<T1>::value && is_cx<typename T1::elem_type>::yes), const mtOp<typename T1::pod_type, T1, op_imag> >::result\nimag(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<typename T1::pod_type, T1, op_imag>( X );\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOpCube<typename T1::pod_type, T1, op_imag>\nimag(const BaseCube<std::complex<typename T1::pod_type>,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<typename T1::pod_type, T1, op_imag>( X.get_ref() );\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst mtSpOp<typename T1::pod_type, T1, spop_imag>\nimag(const SpBase<std::complex<typename T1::pod_type>,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtSpOp<typename T1::pod_type, T1, spop_imag>(A.get_ref());\n  }\n\n\n\n//\n// log\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const eOp<T1, eop_log> >::result\nlog(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_log>(A);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_log>\nlog(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_log>(A.get_ref());\n  }\n\n\n\n//\n// log2\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const eOp<T1, eop_log2> >::result\nlog2(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_log2>(A);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_log2>\nlog2(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_log2>(A.get_ref());\n  }\n\n\n\n//\n// log10\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const eOp<T1, eop_log10> >::result\nlog10(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_log10>(A);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_log10>\nlog10(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_log10>(A.get_ref());\n  }\n\n\n\n//\n// exp\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const eOp<T1, eop_exp> >::result\nexp(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_exp>(A);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_exp>\nexp(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_exp>(A.get_ref());\n  }\n\n\n\n// exp2\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const eOp<T1, eop_exp2> >::result\nexp2(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_exp2>(A);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_exp2>\nexp2(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_exp2>(A.get_ref());\n  }\n\n\n\n// exp10\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const eOp<T1, eop_exp10> >::result\nexp10(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_exp10>(A);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_exp10>\nexp10(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_exp10>(A.get_ref());\n  }\n\n\n\n//\n// abs\n\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< (is_arma_type<T1>::value && is_cx<typename T1::elem_type>::no), const eOp<T1, eop_abs> >::result\nabs(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_abs>(X);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_abs>\nabs(const BaseCube<typename T1::elem_type,T1>& X, const typename arma_not_cx<typename T1::elem_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_ignore(junk);\n  \n  return eOpCube<T1, eop_abs>(X.get_ref());\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename enable_if2< (is_arma_type<T1>::value && is_cx<typename T1::elem_type>::yes), const mtOp<typename T1::pod_type, T1, op_abs> >::result\nabs(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<typename T1::pod_type, T1, op_abs>(X);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOpCube<typename T1::pod_type, T1, op_abs>\nabs(const BaseCube< std::complex<typename T1::pod_type>,T1>& X, const typename arma_cx_only<typename T1::elem_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_ignore(junk);\n  \n  return mtOpCube<typename T1::pod_type, T1, op_abs>( X.get_ref() );\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst SpOp<T1, spop_abs>\nabs(const SpBase<typename T1::elem_type,T1>& X, const typename arma_not_cx<typename T1::elem_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return SpOp<T1, spop_abs>(X.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst mtSpOp<typename T1::pod_type, T1, spop_cx_abs>\nabs(const SpBase< std::complex<typename T1::pod_type>, T1>& X, const typename arma_cx_only<typename T1::elem_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return mtSpOp<typename T1::pod_type, T1, spop_cx_abs>(X.get_ref());\n  }\n\n\n\n//\n// square\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const eOp<T1, eop_square> >::result\nsquare(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_square>(A);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_square>\nsquare(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_square>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst SpOp<T1, spop_square>\nsquare(const SpBase<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpOp<T1, spop_square>(A.get_ref());\n  }\n\n\n\n//\n// sqrt\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const eOp<T1, eop_sqrt> >::result\nsqrt(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_sqrt>(A);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_sqrt>\nsqrt(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_sqrt>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst SpOp<T1, spop_sqrt>\nsqrt(const SpBase<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpOp<T1, spop_sqrt>(A.get_ref());\n  }\n\n\n\n//\n// conj\n\ntemplate<typename T1>\narma_inline\nconst T1&\nconj(const Base<typename T1::pod_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return A.get_ref();\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst T1&\nconj(const BaseCube<typename T1::pod_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return A.get_ref();\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst T1&\nconj(const SpBase<typename T1::pod_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return A.get_ref();\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_conj>\nconj(const Base<std::complex<typename T1::pod_type>,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_conj>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_conj>\nconj(const BaseCube<std::complex<typename T1::pod_type>,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n\n  return eOpCube<T1, eop_conj>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst SpOp<T1, spop_conj>\nconj(const SpBase<std::complex<typename T1::pod_type>,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpOp<T1, spop_conj>(A.get_ref());\n  }\n\n\n\n// pow\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_pow>\npow(const Base<typename T1::elem_type,T1>& A, const typename T1::elem_type exponent)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_pow>(A.get_ref(), exponent);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_pow>\npow(const BaseCube<typename T1::elem_type,T1>& A, const typename T1::elem_type exponent)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_pow>(A.get_ref(), exponent);\n  }\n\n\n\n// pow, specialised handling (non-complex exponent for complex matrices)\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_pow>\npow(const Base<typename T1::elem_type,T1>& A, const typename T1::elem_type::value_type exponent)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  return eOp<T1, eop_pow>(A.get_ref(), eT(exponent));\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_pow>\npow(const BaseCube<typename T1::elem_type,T1>& A, const typename T1::elem_type::value_type exponent)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  return eOpCube<T1, eop_pow>(A.get_ref(), eT(exponent));\n  }\n\n\n\n//\n// floor\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const eOp<T1, eop_floor> >::result\nfloor(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_floor>(A);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_floor>\nfloor(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_floor>(A.get_ref());\n  }\n\n\n\n//\n// ceil\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const eOp<T1, eop_ceil> >::result\nceil(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_ceil>(A);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_ceil>\nceil(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_ceil>(A.get_ref());\n  }\n\n\n\n//\n// round\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const eOp<T1, eop_round> >::result\nround(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_round>(A);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_round>\nround(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_round>(A.get_ref());\n  }\n\n\n\n//\n// sign\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const eOp<T1, eop_sign> >::result\nsign(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_sign>(A);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_sign>\nsign(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_sign>(A.get_ref());\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_eps.hpp",
    "content": "// Copyright (C) 2009-2010 Conrad Sanderson\n// Copyright (C) 2009-2010 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup fn_eps\n//! @{\n\n\n\n//! \\brief\n//! eps version for non-complex matrices and vectors\ntemplate<typename T1>\ninline\nconst eOp<T1, eop_eps>\neps(const Base<typename T1::elem_type, T1>& X, const typename arma_not_cx<typename T1::elem_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return eOp<T1, eop_eps>(X.get_ref());\n  }\n\n\n\n//! \\brief\n//! eps version for complex matrices and vectors\ntemplate<typename T1>\ninline\nMat< typename T1::pod_type >\neps(const Base< std::complex<typename T1::pod_type>, T1>& X, const typename arma_cx_only<typename T1::elem_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_ignore(junk);\n  \n  typedef typename T1::pod_type   T;\n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1>   tmp(X.get_ref());\n  const Mat<eT>& A = tmp.M;\n  \n  Mat<T> out(A.n_rows, A.n_cols);\n  \n         T* out_mem = out.memptr();\n  const eT* A_mem   = A.memptr();\n  const uword n_elem  = A.n_elem;\n  \n  for(uword i=0; i<n_elem; ++i)\n    {\n    out_mem[i] = eop_aux::direct_eps( A_mem[i] );\n    }\n  \n  \n  return out;\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\ntypename arma_integral_only<eT>::result\neps(const eT& x)\n  {\n  arma_ignore(x);\n  \n  return eT(0);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\ntypename arma_real_only<eT>::result\neps(const eT& x)\n  {\n  return eop_aux::direct_eps(x);\n  }\n\n\n\ntemplate<typename T>\narma_inline\narma_warn_unused\ntypename arma_real_only<T>::result\neps(const std::complex<T>& x)\n  {\n  return eop_aux::direct_eps(x);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_expmat.hpp",
    "content": "// Copyright (C) 2014 Conrad Sanderson\n// Copyright (C) 2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_real<typename T1::pod_type>::value,\n  const Op<T1,op_expmat>\n  >::result\nexpmat(const Base<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1,op_expmat>( A.get_ref() );\n  }\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_eye.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_eye\n//! @{\n\n\n\narma_inline\nconst Gen<mat, gen_ones_diag>\neye(const uword n_rows, const uword n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Gen<mat, gen_ones_diag>(n_rows, n_cols);\n  }\n\n\n\ntemplate<typename obj_type>\narma_inline\nconst Gen<obj_type, gen_ones_diag>\neye(const uword n_rows, const uword n_cols, const typename arma_Mat_Col_Row_only<obj_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  if(is_Col<obj_type>::value == true)\n    {\n    arma_debug_check( (n_cols != 1), \"eye(): incompatible size\" );\n    }\n  else\n  if(is_Row<obj_type>::value == true)\n    {\n    arma_debug_check( (n_rows != 1), \"eye(): incompatible size\" );\n    }\n  \n  return Gen<obj_type, gen_ones_diag>(n_rows, n_cols);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_fft.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_fft\n//! @{\n\n\n\n// 1D FFT & 1D IFFT\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_real<typename T1::elem_type>::value),\n  const mtOp<std::complex<typename T1::pod_type>, T1, op_fft_real>\n  >::result\nfft(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<std::complex<typename T1::pod_type>, T1, op_fft_real>(A, uword(0), uword(1));\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_real<typename T1::elem_type>::value),\n  const mtOp<std::complex<typename T1::pod_type>, T1, op_fft_real>\n  >::result\nfft(const T1& A, const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<std::complex<typename T1::pod_type>, T1, op_fft_real>(A, N, uword(0));\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_complex_strict<typename T1::elem_type>::value),\n  const Op<T1, op_fft_cx>\n  >::result\nfft(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_fft_cx>(A, uword(0), uword(1));\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_complex_strict<typename T1::elem_type>::value),\n  const Op<T1, op_fft_cx>\n  >::result\nfft(const T1& A, const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_fft_cx>(A, N, uword(0));\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_complex_strict<typename T1::elem_type>::value),\n  const Op<T1, op_ifft_cx>\n  >::result\nifft(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_ifft_cx>(A, uword(0), uword(1));\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_complex_strict<typename T1::elem_type>::value),\n  const Op<T1, op_ifft_cx>\n  >::result\nifft(const T1& A, const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_ifft_cx>(A, N, uword(0));\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_fft2.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_fft2\n//! @{\n\n\n\n// 2D FFT & 2D IFFT\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value,\n  Mat< std::complex<typename T1::pod_type> >\n  >::result\nfft2(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  // not exactly efficient, but \"better-than-nothing\" implementation\n  \n  typedef typename T1::pod_type T;\n  \n  Mat< std::complex<T> > B = fft(A);\n  \n  // for square matrices, strans() will work out that an inplace transpose can be done,\n  // hence we can potentially avoid creating a temporary matrix\n  \n  B = strans(B);\n  \n  return strans( fft(B) );\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value,\n  Mat< std::complex<typename T1::pod_type> >\n  >::result\nfft2(const T1& A, const uword n_rows, const uword n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1>   tmp(A);\n  const Mat<eT>& B = tmp.M;\n  \n  const bool do_resize = (B.n_rows != n_rows) || (B.n_cols != n_cols);\n  \n  return fft2( do_resize ? resize(B,n_rows,n_cols) : B );\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_complex_strict<typename T1::elem_type>::value),\n  Mat< std::complex<typename T1::pod_type> >\n  >::result\nifft2(const T1& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  // not exactly efficient, but \"better-than-nothing\" implementation\n  \n  typedef typename T1::pod_type T;\n  \n  Mat< std::complex<T> > B = ifft(A);\n  \n  // for square matrices, strans() will work out that an inplace transpose can be done,\n  // hence we can potentially avoid creating a temporary matrix\n  \n  B = strans(B);\n  \n  return strans( ifft(B) );\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_complex_strict<typename T1::elem_type>::value),\n  Mat< std::complex<typename T1::pod_type> >\n  >::result\nifft2(const T1& A, const uword n_rows, const uword n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1>   tmp(A);\n  const Mat<eT>& B = tmp.M;\n  \n  const bool do_resize = (B.n_rows != n_rows) || (B.n_cols != n_cols);\n  \n  return ifft2( do_resize ? resize(B,n_rows,n_cols) : B );\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_find.hpp",
    "content": "// Copyright (C) 2010-2014 Conrad Sanderson\n// Copyright (C) 2010-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_find\n//! @{\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value,\n  const mtOp<uword, T1, op_find_simple>\n  >::result\nfind(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, T1, op_find_simple>(X);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOp<uword, T1, op_find>\nfind(const Base<typename T1::elem_type,T1>& X, const uword k, const char* direction = \"first\")\n  {\n  arma_extra_debug_sigprint();\n  \n  const char sig = (direction != NULL) ? direction[0] : char(0);\n  \n  arma_debug_check\n    (\n    ( (sig != 'f') && (sig != 'F') && (sig != 'l') && (sig != 'L') ),\n    \"find(): direction must be \\\"first\\\" or \\\"last\\\"\"\n    );\n  \n  const uword type = ( (sig == 'f') || (sig == 'F') ) ? 0 : 1;\n  \n  return mtOp<uword, T1, op_find>(X.get_ref(), k, type);\n  }\n\n\n\n//\n\n\n\ntemplate<typename T1>\ninline\nuvec\nfind(const BaseCube<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_cube<T1> tmp(X.get_ref());\n  \n  const Mat<eT> R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false );\n  \n  return find(R);\n  }\n\n\n\ntemplate<typename T1>\ninline\nuvec\nfind(const BaseCube<typename T1::elem_type,T1>& X, const uword k, const char* direction = \"first\")\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_cube<T1> tmp(X.get_ref());\n  \n  const Mat<eT> R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false );\n  \n  return find(R, k, direction);\n  }\n\n\n\ntemplate<typename T1, typename op_rel_type>\ninline\nuvec\nfind(const mtOpCube<uword, T1, op_rel_type>& X, const uword k = 0, const char* direction = \"first\")\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_cube<T1> tmp(X.m);\n  \n  const Mat<eT> R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false );\n  \n  return find( mtOp<uword, Mat<eT>, op_rel_type>(R, X.aux), k, direction );\n  }\n\n\n\ntemplate<typename T1, typename T2, typename glue_rel_type>\ninline\nuvec\nfind(const mtGlueCube<uword, T1, T2, glue_rel_type>& X, const uword k = 0, const char* direction = \"first\")\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  const unwrap_cube<T1> tmp1(X.A);\n  const unwrap_cube<T2> tmp2(X.B);\n  \n  arma_debug_assert_same_size( tmp1.M, tmp2.M, \"relational operator\" );\n  \n  const Mat<eT1> R1( const_cast< eT1* >(tmp1.M.memptr()), tmp1.M.n_elem, 1, false );\n  const Mat<eT2> R2( const_cast< eT2* >(tmp2.M.memptr()), tmp2.M.n_elem, 1, false );\n  \n  return find( mtGlue<uword, Mat<eT1>, Mat<eT2>, glue_rel_type>(R1, R2), k, direction );\n  }\n\n\n\n//\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value,\n  const mtOp<uword, T1, op_find_finite>\n  >::result\nfind_finite(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, T1, op_find_finite>(X);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value,\n  const mtOp<uword, T1, op_find_nonfinite>\n  >::result\nfind_nonfinite(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, T1, op_find_nonfinite>(X);\n  }\n\n\n\n//\n\n\n\ntemplate<typename T1>\ninline\nuvec\nfind_finite(const BaseCube<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_cube<T1> tmp(X.get_ref());\n  \n  const Mat<eT> R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false );\n  \n  return find_finite(R);\n  }\n\n\n\ntemplate<typename T1>\ninline\nuvec\nfind_nonfinite(const BaseCube<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_cube<T1> tmp(X.get_ref());\n  \n  const Mat<eT> R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false );\n  \n  return find_nonfinite(R);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_flip.hpp",
    "content": "// Copyright (C) 2010-2015 Conrad Sanderson\n// Copyright (C) 2010-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_flip\n//! @{\n\n\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const Op<T1, op_flipud> >::result\nflipud(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_flipud>(X);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const Op<T1, op_fliplr> >::result\nfliplr(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_fliplr>(X);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_hist.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// Copyright (C) 2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\ntemplate<typename T1>\ninline\nconst mtOp<uword,T1,op_hist>\nhist\n  (\n  const Base<typename T1::elem_type,T1>& A,\n  const uword n_bins = 10,\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename arma_not_cx<typename T1::elem_type>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return mtOp<uword,T1,op_hist>( A.get_ref(), n_bins, 0 );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst mtGlue<uword,T1,T2,glue_hist>\nhist\n  (\n  const Base<typename T1::elem_type,T1>& A,\n  const Base<typename T1::elem_type,T2>& B,\n  const uword dim = 0,\n  const typename arma_not_cx<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return mtGlue<uword,T1,T2,glue_hist>( A.get_ref(), B.get_ref(), dim );\n  }\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_histc.hpp",
    "content": "// Copyright (C) 2015 Conrad Sanderson\n// Copyright (C) 2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  is_not_complex<typename T1::elem_type>::value,\n  const mtGlue<uword,T1,T2,glue_histc>\n  >::result\nhistc\n  (\n  const Base<typename T1::elem_type,T1>& X,\n  const Base<typename T1::elem_type,T2>& Y,\n  const uword dim = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlue<uword,T1,T2,glue_histc>( X.get_ref(), Y.get_ref(), dim );\n  }\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_inplace_strans.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 Alexandre Drouin \n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_inplace_strans\n//! @{\n\n\n\ntemplate<typename eT>\ninline\nvoid\ninplace_strans\n  (\n        Mat<eT>& X,\n  const char*    method = \"std\"\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'l')), \"inplace_strans(): unknown method specified\" );\n  \n  const bool low_memory = (sig == 'l');\n  \n  if( (low_memory == false) || (X.n_rows == X.n_cols) )\n    {\n    op_strans::apply_mat_inplace(X);\n    }\n  else\n    {\n    // in-place algorithm inspired by:\n    // Fred G. Gustavson, Tadeusz Swirszcz.\n    // In-Place Transposition of Rectangular Matrices.\n    // Applied Parallel Computing. State of the Art in Scientific Computing.\n    // Lecture Notes in Computer Science. Volume 4699, pp. 560-569, 2007.\n    \n    \n    // X.set_size() will check whether we can change the dimensions of X;\n    // X.set_size() will also reuse existing memory, as the number of elements hasn't changed\n    \n    X.set_size(X.n_cols, X.n_rows);\n    \n    const uword m = X.n_cols;\n    const uword n = X.n_rows;\n    \n    std::vector<bool> visited(X.n_elem);  // TODO: replace std::vector<bool> with a better implementation\n    \n    for(uword col = 0; col < m; ++col)\n    for(uword row = 0; row < n; ++row)\n      {\n      const uword pos = col*n + row;\n      \n      if(visited[pos] == false)\n        {\n        uword curr_pos = pos;\n          \n        eT val = X.at(row, col);\n        \n        while(visited[curr_pos] == false) \n          {\n          visited[curr_pos] = true;\n            \n          const uword j = curr_pos / m;\n          const uword i = curr_pos - m * j;\n          \n          const eT tmp = X.at(j, i);\n          X.at(j, i) = val;\n          val = tmp;\n            \n          curr_pos = i*n + j;\n          }\n        }\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_inplace_trans.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_inplace_trans\n//! @{\n\n\n\ntemplate<typename eT>\ninline\ntypename\nenable_if2\n  <\n  is_cx<eT>::no,\n  void\n  >::result\ninplace_htrans\n  (\n        Mat<eT>& X,\n  const char*    method = \"std\"\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_strans(X, method);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename\nenable_if2\n  <\n  is_cx<eT>::yes,\n  void\n  >::result\ninplace_htrans\n  (\n        Mat<eT>& X,\n  const char*    method = \"std\"\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'l')), \"inplace_htrans(): unknown method specified\" );\n  \n  const bool low_memory = (sig == 'l');\n  \n  if( (low_memory == false) || (X.n_rows == X.n_cols) )\n    {\n    op_htrans::apply_mat_inplace(X);\n    }\n  else\n    {\n    inplace_strans(X, method);\n    \n    X = conj(X);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename\nenable_if2\n  <\n  is_cx<eT>::no,\n  void\n  >::result\ninplace_trans\n  (\n        Mat<eT>& X,\n  const char*    method = \"std\"\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'l')), \"inplace_trans(): unknown method specified\" );\n  \n  inplace_strans(X, method);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename\nenable_if2\n  <\n  is_cx<eT>::yes,\n  void\n  >::result\ninplace_trans\n  (\n        Mat<eT>& X,\n  const char*    method = \"std\"\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'l')), \"inplace_trans(): unknown method specified\" );\n  \n  inplace_htrans(X, method);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_interp1.hpp",
    "content": "// Copyright (C) 2015 Conrad Sanderson\n// Copyright (C) 2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_interp1\n//! @{\n\n\n\ntemplate<typename eT>\ninline\nvoid\ninterp1_helper_nearest(const Mat<eT>& XG, const Mat<eT>& YG, const Mat<eT>& XI, Mat<eT>& YI, const eT extrap_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  const eT XG_min = XG.min();\n  const eT XG_max = XG.max();\n  \n  YI.copy_size(XI);\n  \n  const eT* XG_mem = XG.memptr();\n  const eT* YG_mem = YG.memptr();\n  const eT* XI_mem = XI.memptr();\n        eT* YI_mem = YI.memptr();\n  \n  const uword NG = XG.n_elem;\n  const uword NI = XI.n_elem;\n  \n  uword best_j = 0;\n  \n  for(uword i=0; i<NI; ++i)\n    {\n    eT best_err = Datum<eT>::inf;\n    \n    const eT XI_val = XI_mem[i];\n    \n    if((XI_val < XG_min) || (XI_val > XG_max))\n      {\n      YI_mem[i] = extrap_val;\n      }\n    else\n      {\n      // XG and XI are guaranteed to be sorted in ascending manner,\n      // so start searching XG from last known optimum position \n      \n      for(uword j=best_j; j<NG; ++j)\n        {\n        const eT tmp = XG_mem[j] - XI_val;\n        const eT err = (tmp >= eT(0)) ? tmp : -tmp;\n        \n        if(err >= best_err)\n          {\n          // error is going up, so we have found the optimum position\n          break;\n          }\n        else\n          {\n          best_err = err;\n          best_j   = j;   // remember the optimum position\n          }\n        }\n      \n      YI_mem[i] = YG_mem[best_j];\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ninterp1_helper_linear(const Mat<eT>& XG, const Mat<eT>& YG, const Mat<eT>& XI, Mat<eT>& YI, const eT extrap_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  const eT XG_min = XG.min();\n  const eT XG_max = XG.max();\n  \n  YI.copy_size(XI);\n  \n  const eT* XG_mem = XG.memptr();\n  const eT* YG_mem = YG.memptr();\n  const eT* XI_mem = XI.memptr();\n        eT* YI_mem = YI.memptr();\n  \n  const uword NG = XG.n_elem;\n  const uword NI = XI.n_elem;\n  \n  uword a_best_j = 0;\n  uword b_best_j = 0;\n  \n  for(uword i=0; i<NI; ++i)\n    {\n    const eT XI_val = XI_mem[i];\n    \n    if((XI_val < XG_min) || (XI_val > XG_max))\n      {\n      YI_mem[i] = extrap_val;\n      }\n    else\n      {\n      // XG and XI are guaranteed to be sorted in ascending manner,\n      // so start searching XG from last known optimum position \n      \n      eT a_best_err = Datum<eT>::inf;\n      eT b_best_err = Datum<eT>::inf;\n      \n      for(uword j=a_best_j; j<NG; ++j)\n        {\n        const eT tmp = XG_mem[j] - XI_val;\n        const eT err = (tmp >= eT(0)) ? tmp : -tmp;\n        \n        if(err >= a_best_err)\n          {\n          break;\n          }\n        else\n          {\n          a_best_err = err;\n          a_best_j   = j;\n          }\n        }\n      \n      if( (XG_mem[a_best_j] - XI_val) <= eT(0) )\n        {\n        // a_best_j is to the left of the interpolated position\n        \n        b_best_j = ( (a_best_j+1) < NG) ? (a_best_j+1) : a_best_j; \n        }\n      else\n        {\n        // a_best_j is to the right of the interpolated position\n        \n        b_best_j = (a_best_j >= 1) ? (a_best_j-1) : a_best_j; \n        }\n      \n      b_best_err = std::abs( XG_mem[b_best_j] - XI_val );\n      \n      if(a_best_j > b_best_j)\n        {\n        std::swap(a_best_j,   b_best_j  );\n        std::swap(a_best_err, b_best_err);\n        }\n      \n      const eT weight = (a_best_err > eT(0)) ? (a_best_err / (a_best_err + b_best_err)) : eT(0);\n      \n      YI_mem[i] = (eT(1) - weight)*YG_mem[a_best_j] + (weight)*YG_mem[b_best_j];\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ninterp1_helper(const Mat<eT>& X, const Mat<eT>& Y, const Mat<eT>& XI, Mat<eT>& YI, const uword sig, const eT extrap_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ((X.is_vec() == false) || (Y.is_vec() == false) || (XI.is_vec() == false)), \"interp1(): currently only vectors are supported\" );\n  \n  arma_debug_check( (X.n_elem != Y.n_elem), \"interp1(): X and Y must have the same number of elements\" );\n  \n  arma_debug_check( (X.n_elem < 2), \"interp1(): X must have at least two elements\" );\n  \n  // sig = 10: nearest neighbour\n  // sig = 11: nearest neighbour, assume monotonic increase in X and XI\n  // \n  // sig = 20: linear\n  // sig = 21: linear, assume monotonic increase in X and XI\n  \n  if(sig == 11)  { interp1_helper_nearest(X, Y, XI, YI, extrap_val); return; }\n  if(sig == 21)  { interp1_helper_linear (X, Y, XI, YI, extrap_val); return; }\n  \n  \n  Mat<eT> X_tmp;\n  Mat<eT> Y_tmp;\n  \n  const bool X_is_sorted = X.is_sorted();\n  \n  if(X_is_sorted == false)\n    {\n    const uvec X_indices = stable_sort_index(X);\n    \n    const uword N = X.n_elem;\n    \n    X_tmp.set_size(N);\n    Y_tmp.set_size(N);\n    \n    const uword* X_indices_mem = X_indices.memptr();\n    \n    const eT* X_mem = X.memptr();\n    const eT* Y_mem = Y.memptr();\n    \n    eT* X_tmp_mem = X_tmp.memptr();\n    eT* Y_tmp_mem = Y_tmp.memptr();\n    \n    for(uword i=0; i<N; ++i)\n      {\n      const uword j = X_indices_mem[i];\n      \n      X_tmp_mem[i] = X_mem[j];\n      Y_tmp_mem[i] = Y_mem[j];\n      }\n    }\n  \n  const Mat<eT>& X_sorted = (X_is_sorted) ? X : X_tmp;\n  const Mat<eT>& Y_sorted = (X_is_sorted) ? Y : Y_tmp;\n  \n  Mat<eT> XI_tmp;\n  uvec    XI_indices;\n  \n  const bool XI_is_sorted = XI.is_sorted();\n  \n  if(XI_is_sorted == false)\n    {\n    XI_indices = stable_sort_index(XI);\n    \n    const uword N = XI.n_elem;\n    \n    XI_tmp.copy_size(XI);\n    \n    const uword* XI_indices_mem = XI_indices.memptr();\n    \n    const eT* XI_mem     = XI.memptr();\n          eT* XI_tmp_mem = XI_tmp.memptr();\n    \n    for(uword i=0; i<N; ++i)\n      {\n      XI_tmp_mem[i] = XI_mem[ XI_indices_mem[i] ];\n      }\n    }\n  \n  const Mat<eT>& XI_sorted = (XI_is_sorted) ? XI : XI_tmp;\n  \n  \n       if(sig == 10)  { interp1_helper_nearest(X_sorted, Y_sorted, XI_sorted, YI, extrap_val); }\n  else if(sig == 20)  { interp1_helper_linear (X_sorted, Y_sorted, XI_sorted, YI, extrap_val); }\n  \n  \n  if( (XI_is_sorted == false) && (YI.n_elem > 0) )\n    {\n    Mat<eT> YI_unsorted;\n    \n    YI_unsorted.copy_size(YI);\n    \n    const eT* YI_mem          = YI.memptr();\n          eT* YI_unsorted_mem = YI_unsorted.memptr();\n    \n    const uword  N              = XI_sorted.n_elem;\n    const uword* XI_indices_mem = XI_indices.memptr();\n    \n    for(uword i=0; i<N; ++i)\n      {\n      YI_unsorted_mem[ XI_indices_mem[i] ] = YI_mem[i];\n      }\n    \n    YI.steal_mem(YI_unsorted);\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2, typename T3>\ninline\ntypename\nenable_if2\n  <\n  is_real<typename T1::elem_type>::value,\n  void\n  >::result\ninterp1\n  (\n  const Base<typename T1::elem_type, T1>& X,\n  const Base<typename T1::elem_type, T2>& Y,\n  const Base<typename T1::elem_type, T3>& XI,\n         Mat<typename T1::elem_type>&     YI,\n  const char*                             method     = \"linear\",\n  const typename T1::elem_type            extrap_val = Datum<typename T1::elem_type>::nan\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  uword sig = 0;\n  \n  if(method    != NULL   )\n  if(method[0] != char(0))\n  if(method[1] != char(0))\n    {\n    const char c1 = method[0];\n    const char c2 = method[1];\n    \n         if(c1 == 'n')  { sig = 10; }  // nearest neighbour\n    else if(c1 == 'l')  { sig = 20; }  // linear\n    else\n      {\n      if( (c1 == '*') && (c2 == 'n') )  { sig = 11; }  // nearest neighour, assume monotonic increase in X and XI\n      if( (c1 == '*') && (c2 == 'l') )  { sig = 21; }  // linear, assume monotonic increase in X and XI\n      }\n    }\n  \n  arma_debug_check( (sig == 0), \"interp1(): unsupported interpolation type\" ); \n  \n  const quasi_unwrap<T1>  X_tmp( X.get_ref());\n  const quasi_unwrap<T2>  Y_tmp( Y.get_ref());\n  const quasi_unwrap<T3> XI_tmp(XI.get_ref());\n  \n  if( X_tmp.is_alias(YI) || Y_tmp.is_alias(YI) || XI_tmp.is_alias(YI) )\n    {\n    Mat<eT> tmp;\n    \n    interp1_helper(X_tmp.M, Y_tmp.M, XI_tmp.M, tmp, sig, extrap_val);\n    \n    YI.steal_mem(tmp);\n    }\n  else\n    {\n    interp1_helper(X_tmp.M, Y_tmp.M, XI_tmp.M, YI, sig, extrap_val);\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_inv.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_inv\n//! @{\n\n\n\n//! delayed matrix inverse (general matrices)\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_inv>\ninv\n  (\n  const Base<typename T1::elem_type,T1>& X,\n  const bool slow = false,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return Op<T1, op_inv>(X.get_ref(), ((slow == false) ? 0 : 1), 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_inv>\ninv\n  (\n  const Base<typename T1::elem_type,T1>& X,\n  const char* method,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'f')), \"inv(): unknown method specified\" );\n  \n  return Op<T1, op_inv>(X.get_ref(), ((sig == 'f') ? 0 : 1), 0);\n  }\n\n\n\n//! delayed matrix inverse (triangular matrices)\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_inv_tr>\ninv\n  (\n  const Op<T1, op_trimat>& X,\n  const bool slow = false,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(slow);\n  arma_ignore(junk);\n  \n  return Op<T1, op_inv_tr>(X.m, X.aux_uword_a, 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_inv_tr>\ninv\n  (\n  const Op<T1, op_trimat>& X,\n  const char* method,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'f')), \"inv(): unknown method specified\" );\n  \n  return Op<T1, op_inv_tr>(X.m, X.aux_uword_a, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\ninv\n  (\n         Mat<typename T1::elem_type>&    out,\n  const Base<typename T1::elem_type,T1>& X,\n  const bool slow = false,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  try\n    {\n    out = inv(X,slow);\n    }\n  catch(std::runtime_error&)\n    {\n    return false;\n    }\n  \n  return true;\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\ninv\n  (\n         Mat<typename T1::elem_type>&    out,\n  const Base<typename T1::elem_type,T1>& X,\n  const char* method,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  try\n    {\n    out = inv(X,method);\n    }\n  catch(std::runtime_error&)\n    {\n    return false;\n    }\n  \n  return true;\n  }\n\n\n\n//! inverse of symmetric positive definite matrices\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_inv_sympd>\ninv_sympd\n  (\n  const Base<typename T1::elem_type, T1>& X,\n  const char* method = \"std\",\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'f')), \"inv_sympd(): unknown method specified\" );\n  \n  return Op<T1, op_inv_sympd>(X.get_ref(), 0, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\ninv_sympd\n  (\n         Mat<typename T1::elem_type>&    out,\n  const Base<typename T1::elem_type,T1>& X,\n  const char* method = \"std\",\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  try\n    {\n    out = inv_sympd(X,method);\n    }\n  catch(std::runtime_error&)\n    {\n    return false;\n    }\n  \n  return true;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_join.hpp",
    "content": "// Copyright (C) 2010-2015 Conrad Sanderson\n// Copyright (C) 2010-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_join\n//! @{\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst Glue<T1, T2, glue_join>\njoin_cols(const Base<typename T1::elem_type,T1>& A, const Base<typename T1::elem_type,T2>& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Glue<T1, T2, glue_join>(A.get_ref(), B.get_ref(), 0);\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst Glue<T1, T2, glue_join>\njoin_vert(const Base<typename T1::elem_type,T1>& A, const Base<typename T1::elem_type,T2>& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Glue<T1, T2, glue_join>(A.get_ref(), B.get_ref(), 0);\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst Glue<T1, T2, glue_join>\njoin_rows(const Base<typename T1::elem_type,T1>& A, const Base<typename T1::elem_type,T2>& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Glue<T1, T2, glue_join>(A.get_ref(), B.get_ref(), 1);\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst Glue<T1, T2, glue_join>\njoin_horiz(const Base<typename T1::elem_type,T1>& A, const Base<typename T1::elem_type,T2>& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Glue<T1, T2, glue_join>(A.get_ref(), B.get_ref(), 1);\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst GlueCube<T1, T2, glue_join>\njoin_slices(const BaseCube<typename T1::elem_type,T1>& A, const BaseCube<typename T1::elem_type,T2>& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  return GlueCube<T1, T2, glue_join>(A.get_ref(), B.get_ref());\n  }\n\n\n\n//\n// for sparse matrices\n\ntemplate<typename T1, typename T2>\ninline\nconst SpGlue<T1, T2, spglue_join_cols>\njoin_cols(const SpBase<typename T1::elem_type,T1>& A, const SpBase<typename T1::elem_type,T2>& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpGlue<T1, T2, spglue_join_cols>(A.get_ref(), B.get_ref());\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst SpGlue<T1, T2, spglue_join_cols>\njoin_vert(const SpBase<typename T1::elem_type,T1>& A, const SpBase<typename T1::elem_type,T2>& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpGlue<T1, T2, spglue_join_cols>(A.get_ref(), B.get_ref());\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst SpGlue<T1, T2, spglue_join_rows>\njoin_rows(const SpBase<typename T1::elem_type,T1>& A, const SpBase<typename T1::elem_type,T2>& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpGlue<T1, T2, spglue_join_rows>(A.get_ref(), B.get_ref());\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst SpGlue<T1, T2, spglue_join_rows>\njoin_horiz(const SpBase<typename T1::elem_type,T1>& A, const SpBase<typename T1::elem_type,T2>& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpGlue<T1, T2, spglue_join_rows>(A.get_ref(), B.get_ref());\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_kron.hpp",
    "content": "// Copyright (C) 2009-2010 Conrad Sanderson\n// Copyright (C) 2009-2010 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_kron\n//! @{\n\n\n\n//! \\brief\n//! kronecker product of two matrices,\n//! with the matrices having the same element type\ntemplate<typename T1, typename T2>\narma_inline\nconst Glue<T1,T2,glue_kron>\nkron(const Base<typename T1::elem_type,T1>& A, const Base<typename T1::elem_type,T2>& B)\n  {\n  arma_extra_debug_sigprint();\n\n  return Glue<T1, T2, glue_kron>(A.get_ref(), B.get_ref());\n  }\n\n\n\n//! \\brief\n//! kronecker product of two matrices,\n//! with the matrices having different element types\ntemplate<typename T, typename T1, typename T2>\ninline\nMat<typename eT_promoter<T1,T2>::eT>\nkron(const Base<std::complex<T>,T1>& X, const Base<T,T2>& Y)\n  {\n  arma_extra_debug_sigprint();\n\n  typedef typename std::complex<T> eT1;\n\n  promote_type<eT1,T>::check();\n  \n  const unwrap<T1> tmp1(X.get_ref());\n  const unwrap<T2> tmp2(Y.get_ref());\n  \n  const Mat<eT1>& A = tmp1.M;\n  const Mat<T  >& B = tmp2.M;\n\n  Mat<eT1> out;\n  \n  glue_kron::direct_kron(out, A, B);\n  \n  return out;\n  }\n\n\n\n//! \\brief\n//! kronecker product of two matrices,\n//! with the matrices having different element types\ntemplate<typename T, typename T1, typename T2>\ninline\nMat<typename eT_promoter<T1,T2>::eT>\nkron(const Base<T,T1>& X, const Base<std::complex<T>,T2>& Y)\n  {\n  arma_extra_debug_sigprint();\n\n  typedef typename std::complex<T> eT2;  \n\n  promote_type<T,eT2>::check();\n  \n  const unwrap<T1> tmp1(X.get_ref());\n  const unwrap<T2> tmp2(Y.get_ref());\n  \n  const Mat<T  >& A = tmp1.M;\n  const Mat<eT2>& B = tmp2.M;\n\n  Mat<eT2> out;\n  \n  glue_kron::direct_kron(out, A, B);\n  \n  return out;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_log_det.hpp",
    "content": "// Copyright (C) 2010-2011 Conrad Sanderson\n// Copyright (C) 2010-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_log_det\n//! @{\n\n\n\n//! log determinant of mat\ntemplate<typename T1>\ninline\nbool\nlog_det\n  (\n        typename T1::elem_type&          out_val,\n        typename T1::pod_type&           out_sign,\n  const Base<typename T1::elem_type,T1>& X,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return auxlib::log_det(out_val, out_sign, X);\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nlog_det\n  (\n        typename T1::elem_type& out_val,\n        typename T1::pod_type&  out_sign,\n  const Op<T1,op_diagmat>&      X,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  typedef typename T1::pod_type   T;\n  \n  const diagmat_proxy<T1> A(X.m);\n  \n  const uword N = A.n_elem;\n  \n  if(N == 0)\n    {\n    out_val  = eT(0);\n    out_sign =  T(1);\n    \n    return;\n    }\n  \n  eT x = A[0];\n  \n  T  sign = (is_complex<eT>::value == false) ? ( (access::tmp_real(x) < T(0)) ? -1 : +1 ) : +1;\n  eT val  = (is_complex<eT>::value == false) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x);\n  \n  for(uword i=1; i<N; ++i)\n    {\n    x = A[i];\n    \n    sign *= (is_complex<eT>::value == false) ? ( (access::tmp_real(x) < T(0)) ? -1 : +1 ) : +1;\n    val  += (is_complex<eT>::value == false) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x);\n    }\n  \n  out_val  = val;\n  out_sign = sign;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_lu.hpp",
    "content": "// Copyright (C) 2008-2011 Conrad Sanderson\n// Copyright (C) 2008-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_lu\n//! @{\n\n\n\n//! immediate lower upper decomposition, permutation info is embedded into L (similar to Matlab/Octave)\ntemplate<typename T1>\ninline\nbool\nlu\n  (\n         Mat<typename T1::elem_type>&    L,\n         Mat<typename T1::elem_type>&    U,\n  const Base<typename T1::elem_type,T1>& X,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  arma_debug_check( (&L == &U), \"lu(): L and U are the same object\");\n  \n  const bool status = auxlib::lu(L, U, X);\n  \n  if(status == false)\n    {\n    L.reset();\n    U.reset();\n    arma_bad(\"lu(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! immediate lower upper decomposition, also providing the permutation matrix\ntemplate<typename T1>\ninline\nbool\nlu\n  (\n         Mat<typename T1::elem_type>&    L,\n         Mat<typename T1::elem_type>&    U, \n         Mat<typename T1::elem_type>&    P,\n  const Base<typename T1::elem_type,T1>& X,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  arma_debug_check( ( (&L == &U) || (&L == &P) || (&U == &P) ), \"lu(): two or more output objects are the same object\");\n  \n  const bool status = auxlib::lu(L, U, P, X);\n  \n  if(status == false)\n    {\n    L.reset();\n    U.reset();\n    P.reset();\n    arma_bad(\"lu(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_max.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_max\n//! @{\n\n\n//! \\brief\n//! Delayed 'maximum values' operation.\n//! The dimension, along which the maxima are found, is set via 'dim'.\n//! For dim = 0, the maximum value of each column is found (i.e. searches by traversing across rows).\n//! For dim = 1, the maximum value of each row is found (i.e. searches by traversing across columns).\n//! The default is dim = 0.\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_max>\nmax\n  (\n  const T1& X,\n  const uword dim = 0,\n  const typename enable_if< is_arma_type<T1>::value       == true  >::result* junk1 = 0,\n  const typename enable_if< resolves_to_vector<T1>::value == false >::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return Op<T1, op_max>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_max>\nmax\n  (\n  const T1& X,\n  const uword dim,\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return Op<T1, op_max>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nmax\n  (\n  const T1& X,\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return op_max::max(X);\n  }\n\n\n\n//! \\brief\n//! Immediate 'find maximum value' operation,\n//! invoked, for example, by: max(max(A))\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nmax(const Op<T1, op_max>& in)\n  {\n  arma_extra_debug_sigprint();\n  arma_extra_debug_print(\"max(): two consecutive max() calls detected\");\n  \n  return op_max::max(in.m);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op< Op<T1, op_max>, op_max>\nmax(const Op<T1, op_max>& in, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op< Op<T1, op_max>, op_max>(in, dim, 0);\n  }\n\n\n\ntemplate<typename T>\narma_inline\narma_warn_unused\nconst typename arma_scalar_only<T>::result &\nmax(const T& x)\n  {\n  return x;\n  }\n\n\n\n//! element-wise maximum\ntemplate<typename T1, typename T2>\narma_inline\ntypename\nenable_if2\n  <\n  ( is_arma_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value ),\n  const Glue<T1, T2, glue_max>\n  >::result\nmax\n  (\n  const T1& X,\n  const T2& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return Glue<T1, T2, glue_max>(X, Y);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename\nenable_if2\n  <\n  (is_arma_sparse_type<T1>::value == true) && (resolves_to_sparse_vector<T1>::value == true),\n  typename T1::elem_type\n  >::result\nmax(const T1& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  return spop_max::vector_max(x);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_sparse_type<T1>::value == true) && (resolves_to_sparse_vector<T1>::value == false),\n  const SpOp<T1, spop_max>\n  >::result\nmax(const T1& X, const uword dim = 0)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpOp<T1, spop_max>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nmax(const SpOp<T1, spop_max>& X)\n  {\n  arma_extra_debug_sigprint();\n  arma_extra_debug_print(\"max(): two consecutive max() calls detected\");\n  \n  return spop_max::vector_max(X.m);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst SpOp< SpOp<T1, spop_max>, spop_max>\nmax(const SpOp<T1, spop_max>& in, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpOp< SpOp<T1, spop_max>, spop_max>(in, dim, 0);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_mean.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_mean\n//! @{\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_mean>\nmean\n  (\n  const T1& X,\n  const uword dim = 0,\n  const typename enable_if< is_arma_type<T1>::value       == true  >::result* junk1 = 0,\n  const typename enable_if< resolves_to_vector<T1>::value == false >::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return Op<T1, op_mean>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_mean>\nmean\n  (\n  const T1& X,\n  const uword dim,\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return Op<T1, op_mean>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nmean\n  (\n  const T1& X,\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return op_mean::mean_all(X);\n  }\n\n\n\n//! \\brief\n//! Immediate 'find mean value' operation,\n//! invoked, for example, by: mean(mean(A))\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nmean(const Op<T1, op_mean>& in)\n  {\n  arma_extra_debug_sigprint();\n  arma_extra_debug_print(\"mean(): two consecutive mean() calls detected\");\n  \n  return op_mean::mean_all(in.m);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op< Op<T1, op_mean>, op_mean>\nmean(const Op<T1, op_mean>& in, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op< Op<T1, op_mean>, op_mean>(in, dim, 0);\n  }\n\n\n\ntemplate<typename T>\narma_inline\narma_warn_unused\nconst typename arma_scalar_only<T>::result &\nmean(const T& x)\n  {\n  return x;\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\nconst SpOp<T1, spop_mean>\nmean\n  (\n  const T1& X,\n  const uword dim = 0,\n  const typename enable_if< is_arma_sparse_type<T1>::value       == true  >::result* junk1 = 0,\n  const typename enable_if< resolves_to_sparse_vector<T1>::value == false >::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n\n  return SpOp<T1, spop_mean>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\nconst SpOp<T1, spop_mean>\nmean\n  (\n  const T1& X,\n  const uword dim,\n  const typename enable_if< resolves_to_sparse_vector<T1>::value == true >::result* junk1 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n\n  return SpOp<T1, spop_mean>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nmean\n  (\n  const T1& X,\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename enable_if< resolves_to_sparse_vector<T1>::value == true >::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n\n  return spop_mean::mean_all(X);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nmean(const SpOp<T1, spop_mean>& in)\n  {\n  arma_extra_debug_sigprint();\n  arma_extra_debug_print(\"mean(): two consecutive mean() calls detected\");\n\n  return spop_mean::mean_all(in.m);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_median.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_median\n//! @{\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_median>\nmedian\n  (\n  const T1& X,\n  const uword dim = 0,\n  const typename enable_if< is_arma_type<T1>::value       == true  >::result* junk1 = 0,\n  const typename enable_if< resolves_to_vector<T1>::value == false >::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return Op<T1, op_median>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_median>\nmedian\n  (\n  const T1& X,\n  const uword dim,\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return Op<T1, op_median>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nmedian\n  (\n  const T1& X,\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return op_median::median_vec(X);\n  }\n\n\n\ntemplate<typename T>\narma_inline\narma_warn_unused\nconst typename arma_scalar_only<T>::result &\nmedian(const T& x)\n  {\n  return x;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_min.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_min\n//! @{\n\n//! \\brief\n//! Delayed 'minimum values' operation.\n//! The dimension, along which the minima are found, is set via 'dim'.\n//! For dim = 0, the minimum value of each column is found (i.e. searches by traversing across rows).\n//! For dim = 1, the minimum value of each row is found (i.e. searches by traversing across columns).\n//! The default is dim = 0.\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_min>\nmin\n  (\n  const T1& X,\n  const uword dim = 0,\n  const typename enable_if< is_arma_type<T1>::value       == true  >::result* junk1 = 0,\n  const typename enable_if< resolves_to_vector<T1>::value == false >::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return Op<T1, op_min>(X, dim, 0);\n  }\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_min>\nmin\n  (\n  const T1& X,\n  const uword dim,\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return Op<T1, op_min>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nmin\n  (\n  const T1& X,\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return op_min::min(X);\n  }\n\n\n\n//! \\brief\n//! Immediate 'find minimum value' operation,\n//! invoked, for example, by: min(min(A))\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nmin(const Op<T1, op_min>& in)\n  {\n  arma_extra_debug_sigprint();\n  arma_extra_debug_print(\"min(): two consecutive min() calls detected\");\n  \n  return op_min::min(in.m);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op< Op<T1, op_min>, op_min>\nmin(const Op<T1, op_min>& in, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op< Op<T1, op_min>, op_min>(in, dim, 0);\n  }\n\n\n\ntemplate<typename T>\narma_inline\narma_warn_unused\nconst typename arma_scalar_only<T>::result &\nmin(const T& x)\n  {\n  return x;\n  }\n\n\n\n//! element-wise minimum\ntemplate<typename T1, typename T2>\narma_inline\ntypename\nenable_if2\n  <\n  ( is_arma_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value ),\n  const Glue<T1, T2, glue_min>\n  >::result\nmin\n  (\n  const T1& X,\n  const T2& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return Glue<T1, T2, glue_min>(X, Y);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename\nenable_if2\n  <\n  (is_arma_sparse_type<T1>::value == true) && (resolves_to_sparse_vector<T1>::value == true),\n  typename T1::elem_type\n  >::result\nmin(const T1& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  return spop_min::vector_min(x);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_sparse_type<T1>::value == true) && (resolves_to_sparse_vector<T1>::value == false),\n  const SpOp<T1, spop_min>\n  >::result\nmin(const T1& X, const uword dim = 0)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpOp<T1, spop_min>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nmin(const SpOp<T1, spop_min>& X)\n  {\n  arma_extra_debug_sigprint();\n  arma_extra_debug_print(\"min(): two consecutive min() calls detected\");\n  \n  return spop_min::vector_min(X.m);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst SpOp< SpOp<T1, spop_min>, spop_min>\nmin(const SpOp<T1, spop_min>& in, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpOp< SpOp<T1, spop_min>, spop_min>(in, dim, 0);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_misc.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_misc\n//! @{\n\n\n\n//! \\brief\n//! Generate a vector with 'num' elements.\n//! The values of the elements linearly increase from 'start' upto (and including) 'end'.\n\ntemplate<typename vec_type>\ninline\ntypename\nenable_if2\n  <\n  is_Mat<vec_type>::value,\n  vec_type\n  >::result\nlinspace\n  (\n  const typename vec_type::pod_type start,\n  const typename vec_type::pod_type end,\n  const uword num = 100u\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename vec_type::elem_type eT;\n  typedef typename vec_type::pod_type   T;\n  \n  vec_type x;\n    \n  if(num >= 2)\n    {\n    x.set_size(num);\n    \n    eT* x_mem = x.memptr();\n    \n    const uword num_m1 = num - 1;\n    \n    if(is_non_integral<T>::value == true)\n      {\n      const T delta = (end-start)/T(num_m1);\n      \n      for(uword i=0; i<num_m1; ++i)\n        {\n        x_mem[i] = eT(start + i*delta);\n        }\n      \n      x_mem[num_m1] = eT(end);\n      }\n    else\n      {\n      const double delta = (end >= start) ? double(end-start)/double(num_m1) : -double(start-end)/double(num_m1);\n      \n      for(uword i=0; i<num_m1; ++i)\n        {\n        x_mem[i] = eT(double(start) + i*delta);\n        }\n      \n      x_mem[num_m1] = eT(end);\n      }\n    \n    return x;\n    }\n  else\n    {\n    x.set_size(1);\n    \n    x[0] = eT(end);\n    }\n  \n  return x;\n  }\n\n\n\ninline\nmat\nlinspace(const double start, const double end, const uword num = 100u)\n  {\n  arma_extra_debug_sigprint();\n  return linspace<mat>(start, end, num);\n  }\n\n\n\n//\n// log_exp_add\n\ntemplate<typename eT>\ninline\ntypename arma_real_only<eT>::result\nlog_add_exp(eT log_a, eT log_b)\n  {\n  if(log_a < log_b)\n    {\n    std::swap(log_a, log_b);\n    }\n  \n  const eT negdelta = log_b - log_a;\n  \n  if( (negdelta < Datum<eT>::log_min) || (arma_isfinite(negdelta) == false) )\n    {\n    return log_a;\n    }\n  else\n    {\n    return (log_a + arma_log1p(std::exp(negdelta)));\n    }\n  }\n\n\n\n// for compatibility with earlier versions\ntemplate<typename eT>\ninline\ntypename arma_real_only<eT>::result\nlog_add(eT log_a, eT log_b)\n  {\n  return log_add_exp(log_a, log_b);\n  }\n  \n\n\ntemplate<typename eT>\narma_inline\narma_warn_unused\nbool\nis_finite(const eT x, const typename arma_scalar_only<eT>::result* junk = 0)\n  {\n  arma_ignore(junk);\n  \n  return arma_isfinite(x);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value,\n  bool\n  >::result\nis_finite(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(X);\n  \n  const bool have_direct_mem = (is_Mat<typename Proxy<T1>::stored_type>::value) || (is_subview_col<typename Proxy<T1>::stored_type>::value);\n  \n  if(have_direct_mem)\n    {\n    const quasi_unwrap<typename Proxy<T1>::stored_type> tmp(P.Q);\n    \n    return tmp.M.is_finite();\n    }\n  \n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    const typename Proxy<T1>::ea_type Pea = P.get_ea();\n    \n    const uword n_elem = P.get_n_elem();\n    \n    uword i,j;\n    \n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\n      {\n      const eT val_i = Pea[i];\n      const eT val_j = Pea[j];\n      \n      if( (arma_isfinite(val_i) == false) || (arma_isfinite(val_j) == false) )  { return false; }\n      }\n    \n    if(i < n_elem)\n      {\n      if(arma_isfinite(Pea[i]) == false)  { return false; }\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    for(uword col=0; col<n_cols; ++col)\n    for(uword row=0; row<n_rows; ++row)\n      {\n      if(arma_isfinite(P.at(row,col)) == false)  { return false; }\n      }\n    }\n  \n  return true;\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\nbool\nis_finite(const SpBase<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> P(X.get_ref());\n  \n  if(is_SpMat<typename SpProxy<T1>::stored_type>::value)\n    {\n    const unwrap_spmat<typename SpProxy<T1>::stored_type> tmp(P.Q);\n    \n    return tmp.M.is_finite();\n    }\n  else\n    {\n    typename SpProxy<T1>::const_iterator_type it     = P.begin();\n    typename SpProxy<T1>::const_iterator_type it_end = P.end();\n    \n    while(it != it_end)\n      {\n      if(arma_isfinite(*it) == false)  { return false; }\n      ++it;\n      }\n    }\n  \n  return true;\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\nbool\nis_finite(const BaseCube<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_cube<T1> tmp(X.get_ref());\n  const Cube<eT>& A =   tmp.M;\n  \n  return A.is_finite();\n  }\n\n\n\n//! DO NOT USE IN NEW CODE; change instances of inv(sympd(X)) to inv_sympd(X)\ntemplate<typename T1>\narma_deprecated\ninline\nconst T1&\nsympd(const Base<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return X.get_ref();\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nswap(Mat<eT>& A, Mat<eT>& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  A.swap(B);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nswap(Cube<eT>& A, Cube<eT>& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  A.swap(B);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_orth>\north(const Base<typename T1::elem_type, T1>& X, const typename T1::pod_type tol = 0.0, const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  \n  return Op<T1, op_orth>(X.get_ref(), eT(tol));\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\north(Mat<typename T1::elem_type>& out, const Base<typename T1::elem_type, T1>& X, const typename T1::pod_type tol = 0.0, const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  try { out = orth(X,tol); } catch (std::runtime_error&) { return false; }\n  \n  return true;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_n_unique.hpp",
    "content": "// Copyright (C) 2012 Ryan Curtin\n// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_n_unique\n//! @{\n\n\n//! \\brief\n//! Get the number of unique nonzero elements in two sparse matrices.\n//! This is very useful for determining the amount of memory necessary before\n//! a sparse matrix operation on two matrices.\n\ntemplate<typename T1, typename T2, typename op_n_unique_type>\ninline\nuword\nn_unique\n  (\n  const SpBase<typename T1::elem_type, T1>& x,\n  const SpBase<typename T2::elem_type, T2>& y,\n  const op_n_unique_type junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> pa(x.get_ref());\n  const SpProxy<T2> pb(y.get_ref());\n  \n  return n_unique(pa,pb,junk);\n  }\n\n\n\ntemplate<typename T1, typename T2, typename op_n_unique_type>\narma_hot\ninline\nuword\nn_unique\n  (\n  const SpProxy<T1>& pa,\n  const SpProxy<T2>& pb,\n  const op_n_unique_type junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typename SpProxy<T1>::const_iterator_type x_it     = pa.begin();\n  typename SpProxy<T1>::const_iterator_type x_it_end = pa.end();\n  \n  typename SpProxy<T2>::const_iterator_type y_it     = pb.begin();\n  typename SpProxy<T2>::const_iterator_type y_it_end = pb.end();\n\n  uword total_n_nonzero = 0;\n\n  while( (x_it != x_it_end) || (y_it != y_it_end) )\n    {\n    if(x_it == y_it)\n      {\n      if(op_n_unique_type::eval((*x_it), (*y_it)) != typename T1::elem_type(0))\n        {\n        ++total_n_nonzero;\n        }\n\n      ++x_it;\n      ++y_it;\n      }\n    else\n      {\n      if((x_it.col() < y_it.col()) || ((x_it.col() == y_it.col()) && (x_it.row() < y_it.row()))) // if y is closer to the end\n        {\n        if(op_n_unique_type::eval((*x_it), typename T1::elem_type(0)) != typename T1::elem_type(0))\n          {\n          ++total_n_nonzero;\n          }\n\n        ++x_it;\n        }\n      else // x is closer to the end\n        {\n        if(op_n_unique_type::eval(typename T1::elem_type(0), (*y_it)) != typename T1::elem_type(0))\n          {\n          ++total_n_nonzero;\n          }\n\n        ++y_it;\n        }\n      }\n    }\n\n  return total_n_nonzero;\n  }\n\n\n// Simple operators.\nstruct op_n_unique_add\n  {\n  template<typename eT> inline static eT eval(const eT& l, const eT& r) { return (l + r); }\n  };\n\nstruct op_n_unique_sub\n  {\n  template<typename eT> inline static eT eval(const eT& l, const eT& r) { return (l - r); }\n  };\n\nstruct op_n_unique_mul\n  {\n  template<typename eT> inline static eT eval(const eT& l, const eT& r) { return (l * r); }\n  };\n\nstruct op_n_unique_count\n  {\n  template<typename eT> inline static eT eval(const eT&, const eT&) { return eT(1); }\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_nonzeros.hpp",
    "content": "// Copyright (C) 2015 Conrad Sanderson\n// Copyright (C) 2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_nonzeros\n//! @{\n\n\ntemplate<typename T1>\ninline\nconst Op<T1,op_nonzeros>\nnonzeros(const Base<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1,op_nonzeros>(X.get_ref());\n  }\n\n\n\ntemplate<typename T1>\ninline\nCol<typename T1::elem_type>\nnonzeros(const SpBase<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Col<typename T1::elem_type> out;\n  \n  op_nonzeros::apply_noalias(out, X.get_ref());\n  \n  return out;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_norm.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_norm\n//! @{\n\n\n\ntemplate<typename T1>\narma_hot\ninline\ntypename T1::pod_type\narma_vec_norm_1\n  (\n  const Proxy<T1>& P,\n  const typename arma_not_cx<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::pod_type T;\n  \n  T acc = T(0);\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type A = P.get_ea();\n    \n    const uword N = P.get_n_elem();\n    \n    T acc1 = T(0);\n    T acc2 = T(0);\n    \n    uword i,j;\n    for(i=0, j=1; j<N; i+=2, j+=2)\n      {\n      acc1 += std::abs(A[i]);\n      acc2 += std::abs(A[j]);\n      }\n    \n    if(i < N)\n      {\n      acc1 += std::abs(A[i]);\n      }\n    \n    acc = acc1 + acc2;\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    if(n_rows == 1)\n      {\n      for(uword col=0; col<n_cols; ++col)\n        {\n        acc += std::abs(P.at(0,col));\n        }\n      }\n    else\n      {\n      T acc1 = T(0);\n      T acc2 = T(0);\n      \n      for(uword col=0; col<n_cols; ++col)\n        {\n        uword i,j;\n        \n        for(i=0, j=1; j<n_rows; i+=2, j+=2)\n          {\n          acc1 += std::abs(P.at(i,col));\n          acc2 += std::abs(P.at(j,col));\n          }\n        \n        if(i < n_rows)\n          {\n          acc1 += std::abs(P.at(i,col));\n          }\n        }\n      \n      acc = acc1 + acc2;\n      }\n    }\n  \n  return acc;\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\ntypename T1::pod_type\narma_vec_norm_1\n  (\n  const Proxy<T1>& P,\n  const typename arma_cx_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  typedef typename T1::pod_type   T;\n  \n  T acc = T(0);\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type A = P.get_ea();\n    \n    const uword N = P.get_n_elem();\n    \n    for(uword i=0; i<N; ++i)\n      {\n      const std::complex<T>& X = A[i];\n      \n      const T a = X.real();\n      const T b = X.imag();\n      \n      acc += std::sqrt( (a*a) + (b*b) );\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    if(n_rows == 1)\n      {\n      for(uword col=0; col<n_cols; ++col)\n        {\n        const std::complex<T>& X = P.at(0,col);\n        \n        const T a = X.real();\n        const T b = X.imag();\n        \n        acc += std::sqrt( (a*a) + (b*b) );\n        }\n      }\n    else\n      {\n      for(uword col=0; col<n_cols; ++col)\n      for(uword row=0; row<n_rows; ++row)\n        {\n        const std::complex<T>& X = P.at(row,col);\n        \n        const T a = X.real();\n        const T b = X.imag();\n        \n        acc += std::sqrt( (a*a) + (b*b) );\n        }\n      }\n    }\n  \n  if( (acc != T(0)) && arma_isfinite(acc) )\n    {\n    return acc;\n    }\n  else\n    {\n    arma_extra_debug_print(\"arma_vec_norm_1(): detected possible underflow or overflow\");\n    \n    const quasi_unwrap<typename Proxy<T1>::stored_type> R(P.Q);\n    \n    const uword N     = R.M.n_elem;\n    const eT*   R_mem = R.M.memptr();\n    \n    T max_val = priv::most_neg<T>();\n    \n    for(uword i=0; i<N; ++i)\n      {\n      const std::complex<T>& X = R_mem[i];\n      \n      const T a = std::abs(X.real());\n      const T b = std::abs(X.imag());\n      \n      if(a > max_val)  { max_val = a; }\n      if(b > max_val)  { max_val = b; }\n      }\n    \n    if(max_val == T(0))  { return T(0); }\n    \n    T alt_acc = T(0);\n    \n    for(uword i=0; i<N; ++i)\n      {\n      const std::complex<T>& X = R_mem[i];\n      \n      const T a = X.real() / max_val;\n      const T b = X.imag() / max_val;\n      \n      alt_acc += std::sqrt( (a*a) + (b*b) );\n      }\n    \n    return ( alt_acc * max_val );\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\neT\narma_vec_norm_2_direct_mem_robust\n  (\n  const Mat<eT>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword N = X.n_elem;\n  const eT*   A = X.memptr();\n  \n  eT max_val = priv::most_neg<eT>();\n  \n  uword j;\n  \n  for(j=1; j<N; j+=2)\n    {\n    eT val_i = (*A);  A++;\n    eT val_j = (*A);  A++;\n    \n    val_i = std::abs(val_i);\n    val_j = std::abs(val_j);\n    \n    if(val_i > max_val)  { max_val = val_i; }\n    if(val_j > max_val)  { max_val = val_j; }\n    }\n  \n  if((j-1) < N)\n    {\n    const eT val_i = std::abs(*A);\n    \n    if(val_i > max_val)  { max_val = val_i; }\n    }\n  \n  if(max_val == eT(0))  { return eT(0); }\n  \n  const eT* B = X.memptr();\n  \n  eT acc1 = eT(0);\n  eT acc2 = eT(0);\n  \n  for(j=1; j<N; j+=2)\n    {\n    eT val_i = (*B);  B++;\n    eT val_j = (*B);  B++;\n    \n    val_i /= max_val;\n    val_j /= max_val;\n    \n    acc1 += val_i * val_i;\n    acc2 += val_j * val_j;\n    }\n  \n  if((j-1) < N)\n    {\n    const eT val_i = (*B) / max_val;\n    \n    acc1 += val_i * val_i;\n    }\n  \n  return ( std::sqrt(acc1 + acc2) * max_val ); \n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\neT\narma_vec_norm_2_direct_mem_fast\n  (\n  const Mat<eT>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword N = X.n_elem;\n  const eT*   A = X.memptr();\n  \n  eT acc;\n  \n  #if defined(__FINITE_MATH_ONLY__) && (__FINITE_MATH_ONLY__ > 0)\n    {\n    eT acc1 = eT(0);\n    \n    if(memory::is_aligned(A))\n      {\n      memory::mark_as_aligned(A);\n      \n      for(uword i=0; i<N; ++i)  { const eT tmp_i = A[i];  acc1 += tmp_i * tmp_i; }\n      }\n    else\n      {\n      for(uword i=0; i<N; ++i)  { const eT tmp_i = A[i];  acc1 += tmp_i * tmp_i; }\n      }\n    \n    acc = acc1;\n    }\n  #else\n    {\n    eT acc1 = eT(0);\n    eT acc2 = eT(0);\n    \n    uword j;\n    \n    for(j=1; j<N; j+=2)\n      {\n      const eT tmp_i = (*A);  A++;\n      const eT tmp_j = (*A);  A++;\n      \n      acc1 += tmp_i * tmp_i;\n      acc2 += tmp_j * tmp_j;\n      }\n    \n    if((j-1) < N)\n      {\n      const eT tmp_i = (*A);\n      \n      acc1 += tmp_i * tmp_i;\n      }\n    \n    acc = acc1 + acc2;\n    }\n  #endif\n  \n  const eT sqrt_acc = std::sqrt(acc);\n  \n  if( (sqrt_acc != eT(0)) && arma_isfinite(sqrt_acc) )\n    {\n    return sqrt_acc;\n    }\n  else\n    {\n    arma_extra_debug_print(\"arma_vec_norm_2_direct_mem_fast(): detected possible underflow or overflow\");\n    \n    return arma_vec_norm_2_direct_mem_robust(X);\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\ntypename T1::pod_type\narma_vec_norm_2\n  (\n  const Proxy<T1>& P,\n  const typename arma_not_cx<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const bool have_direct_mem = (is_Mat<typename Proxy<T1>::stored_type>::value) || (is_subview_col<typename Proxy<T1>::stored_type>::value);\n  \n  if(have_direct_mem)\n    {\n    const quasi_unwrap<typename Proxy<T1>::stored_type> tmp(P.Q);\n    \n    return arma_vec_norm_2_direct_mem_fast(tmp.M);\n    }\n  \n  typedef typename T1::pod_type T;\n  \n  T acc = T(0);\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type A = P.get_ea();\n    \n    const uword N = P.get_n_elem();\n    \n    T acc1 = T(0);\n    T acc2 = T(0);\n    \n    uword i,j;\n    \n    for(i=0, j=1; j<N; i+=2, j+=2)\n      {\n      const T tmp_i = A[i];\n      const T tmp_j = A[j];\n      \n      acc1 += tmp_i * tmp_i;\n      acc2 += tmp_j * tmp_j;\n      }\n    \n    if(i < N)\n      {\n      const T tmp_i = A[i];\n      \n      acc1 += tmp_i * tmp_i;\n      }\n    \n    acc = acc1 + acc2;\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    if(n_rows == 1)\n      {\n      for(uword col=0; col<n_cols; ++col)\n        {\n        const T tmp = P.at(0,col);\n        \n        acc += tmp * tmp;\n        }\n      }\n    else\n      {\n      for(uword col=0; col<n_cols; ++col)\n        {\n        uword i,j;\n        for(i=0, j=1; j<n_rows; i+=2, j+=2)\n          {\n          const T tmp_i = P.at(i,col);\n          const T tmp_j = P.at(j,col);\n          \n          acc += tmp_i * tmp_i;\n          acc += tmp_j * tmp_j;\n          }\n        \n        if(i < n_rows)\n          {\n          const T tmp_i = P.at(i,col);\n          \n          acc += tmp_i * tmp_i;\n          }\n        }\n      }\n    }\n  \n  \n  const T sqrt_acc = std::sqrt(acc);\n  \n  if( (sqrt_acc != T(0)) && arma_isfinite(sqrt_acc) )\n    {\n    return sqrt_acc;\n    }\n  else\n    {\n    arma_extra_debug_print(\"arma_vec_norm_2(): detected possible underflow or overflow\");\n  \n    const quasi_unwrap<typename Proxy<T1>::stored_type> tmp(P.Q);\n    \n    return arma_vec_norm_2_direct_mem_robust(tmp.M);\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\ntypename T1::pod_type\narma_vec_norm_2\n  (\n  const Proxy<T1>& P,\n  const typename arma_cx_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  typedef typename T1::pod_type   T;\n  \n  T acc = T(0);\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type A = P.get_ea();\n    \n    const uword N = P.get_n_elem();\n    \n    for(uword i=0; i<N; ++i)\n      {\n      const std::complex<T>& X = A[i];\n      \n      const T a = X.real();\n      const T b = X.imag();\n      \n      acc += (a*a) + (b*b);\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    if(n_rows == 1)\n      {\n      for(uword col=0; col<n_cols; ++col)\n        {\n        const std::complex<T>& X = P.at(0,col);\n        \n        const T a = X.real();\n        const T b = X.imag();\n        \n        acc += (a*a) + (b*b);\n        }\n      }\n    else\n      {\n      for(uword col=0; col<n_cols; ++col)\n      for(uword row=0; row<n_rows; ++row)\n        {\n        const std::complex<T>& X = P.at(row,col);\n        \n        const T a = X.real();\n        const T b = X.imag();\n        \n        acc += (a*a) + (b*b);\n        }\n      }\n    }\n  \n  const T sqrt_acc = std::sqrt(acc);\n  \n  if( (sqrt_acc != T(0)) && arma_isfinite(sqrt_acc) )\n    {\n    return sqrt_acc;\n    }\n  else\n    {\n    arma_extra_debug_print(\"arma_vec_norm_2(): detected possible underflow or overflow\");\n    \n    const quasi_unwrap<typename Proxy<T1>::stored_type> R(P.Q);\n    \n    const uword N     = R.M.n_elem;\n    const eT*   R_mem = R.M.memptr();\n    \n    T max_val = priv::most_neg<T>();\n    \n    for(uword i=0; i<N; ++i)\n      {\n      const T val_i = std::abs(R_mem[i]);\n      \n      if(val_i > max_val)  { max_val = val_i; }\n      }\n    \n    if(max_val == T(0))  { return T(0); }\n    \n    T alt_acc = T(0);\n    \n    for(uword i=0; i<N; ++i)\n      {\n      const T val_i = std::abs(R_mem[i]) / max_val;\n      \n      alt_acc += val_i * val_i;\n      }\n    \n    return ( std::sqrt(alt_acc) * max_val ); \n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\ntypename T1::pod_type\narma_vec_norm_k\n  (\n  const Proxy<T1>& P,\n  const int k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::pod_type T;\n  \n  T acc = T(0);\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type A = P.get_ea();\n    \n    const uword N = P.get_n_elem();\n    \n    uword i,j;\n    \n    for(i=0, j=1; j<N; i+=2, j+=2)\n      {\n      acc += std::pow(std::abs(A[i]), k);\n      acc += std::pow(std::abs(A[j]), k);\n      }\n    \n    if(i < N)\n      {\n      acc += std::pow(std::abs(A[i]), k);\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    if(n_rows != 1)\n      {\n      for(uword col=0; col < n_cols; ++col)\n      for(uword row=0; row < n_rows; ++row)\n        {\n        acc += std::pow(std::abs(P.at(row,col)), k);\n        }\n      }\n    else\n      {\n      for(uword col=0; col < n_cols; ++col)\n        {\n        acc += std::pow(std::abs(P.at(0,col)), k);\n        }\n      }\n    }\n  \n  return std::pow(acc, T(1)/T(k));\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\ntypename T1::pod_type\narma_vec_norm_max(const Proxy<T1>& P)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::pod_type T;\n  \n  const uword N = P.get_n_elem();\n  \n  T max_val = (N != 1) ? priv::most_neg<T>() : std::abs(P[0]);\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type A = P.get_ea();\n    \n    uword i,j;\n    for(i=0, j=1; j<N; i+=2, j+=2)\n      {\n      const T tmp_i = std::abs(A[i]);\n      const T tmp_j = std::abs(A[j]);\n      \n      if(max_val < tmp_i) { max_val = tmp_i; }\n      if(max_val < tmp_j) { max_val = tmp_j; }\n      }\n    \n    if(i < N)\n      {\n      const T tmp_i = std::abs(A[i]);\n      \n      if(max_val < tmp_i) { max_val = tmp_i; }\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    if(n_rows != 1)\n      {\n      for(uword col=0; col < n_cols; ++col)\n      for(uword row=0; row < n_rows; ++row)\n        {\n        const T tmp = std::abs(P.at(row,col));\n        \n        if(max_val < tmp) { max_val = tmp; }\n        }\n      }\n    else\n      {\n      for(uword col=0; col < n_cols; ++col)\n        {\n        const T tmp = std::abs(P.at(0,col));\n        \n        if(max_val < tmp) { max_val = tmp; }\n        }\n      }\n    }\n  \n  return max_val;\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\ntypename T1::pod_type\narma_vec_norm_min(const Proxy<T1>& P)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::pod_type T;\n  \n  const uword N = P.get_n_elem();\n  \n  T min_val = (N != 1) ? priv::most_pos<T>() : std::abs(P[0]);\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type A = P.get_ea();\n    \n    uword i,j;\n    for(i=0, j=1; j<N; i+=2, j+=2)\n      {\n      const T tmp_i = std::abs(A[i]);\n      const T tmp_j = std::abs(A[j]);\n      \n      if(min_val > tmp_i) { min_val = tmp_i; }\n      if(min_val > tmp_j) { min_val = tmp_j; }\n      }\n    \n    if(i < N)\n      {\n      const T tmp_i = std::abs(A[i]);\n      \n      if(min_val > tmp_i) { min_val = tmp_i; }\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    if(n_rows != 1)\n      {\n      for(uword col=0; col < n_cols; ++col)\n      for(uword row=0; row < n_rows; ++row)\n        {\n        const T tmp = std::abs(P.at(row,col));\n        \n        if(min_val > tmp) { min_val = tmp; }\n        }\n      }\n    else\n      {\n      for(uword col=0; col < n_cols; ++col)\n        {\n        const T tmp = std::abs(P.at(0,col));\n        \n        if(min_val > tmp) { min_val = tmp; }\n        }\n      }\n    }\n  \n  return min_val;\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::pod_type\narma_mat_norm_1(const Proxy<T1>& P)\n  {\n  arma_extra_debug_sigprint();\n  \n  // TODO: this can be sped up with a dedicated implementation\n  return as_scalar( max( sum(abs(P.Q), 0), 1) );\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::pod_type\narma_mat_norm_2(const Proxy<T1>& P)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::pod_type   T;\n  \n  // TODO: is the SVD based approach only valid for square matrices?\n  \n  Col<T> S;\n  svd(S, P.Q);\n  \n  return (S.n_elem > 0) ? max(S) : T(0);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::pod_type\narma_mat_norm_inf(const Proxy<T1>& P)\n  {\n  arma_extra_debug_sigprint();\n  \n  // TODO: this can be sped up with a dedicated implementation\n  return as_scalar( max( sum(abs(P.Q), 1), 0) );\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename enable_if2< is_arma_type<T1>::value, typename T1::pod_type >::result\nnorm\n  (\n  const T1& X,\n  const uword k = uword(2),\n  const typename arma_real_or_cx_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::pod_type T;\n  \n  const Proxy<T1> P(X);\n  \n  if(P.get_n_elem() == 0)\n    {\n    return T(0);\n    }\n  \n  const bool is_vec = (P.get_n_rows() == 1) || (P.get_n_cols() == 1);\n  \n  if(is_vec)\n    {\n    switch(k)\n      {\n      case 1:\n        return arma_vec_norm_1(P);\n        break;\n      \n      case 2:\n        return arma_vec_norm_2(P);\n        break;\n      \n      default:\n        {\n        arma_debug_check( (k == 0), \"norm(): k must be greater than zero\"   );\n        return arma_vec_norm_k(P, int(k));\n        }\n      }\n    }\n  else\n    {\n    switch(k)\n      {\n      case 1:\n        return arma_mat_norm_1(P);\n        break;\n      \n      case 2:\n        return arma_mat_norm_2(P);\n        break;\n      \n      default:\n        arma_stop(\"norm(): unsupported matrix norm type\");\n        return T(0);\n      }\n    }\n  \n  return T(0);  // prevent erroneous compiler warnings\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename enable_if2< is_arma_type<T1>::value, typename T1::pod_type >::result\nnorm\n  (\n  const T1& X,\n  const char* method,\n  const typename arma_real_or_cx_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::pod_type T;\n  \n  const Proxy<T1> P(X);\n  \n  if(P.get_n_elem() == 0)\n    {\n    return T(0);\n    }\n  \n  const char sig    = (method != NULL) ? method[0] : char(0);\n  const bool is_vec = (P.get_n_rows() == 1) || (P.get_n_cols() == 1);\n  \n  if(is_vec)\n    {\n    if( (sig == 'i') || (sig == 'I') || (sig == '+') )   // max norm\n      {\n      return arma_vec_norm_max(P);\n      }\n    else\n    if(sig == '-')   // min norm\n      {\n      return arma_vec_norm_min(P);\n      }\n    else\n    if( (sig == 'f') || (sig == 'F') )\n      {\n      return arma_vec_norm_2(P);\n      }\n    else\n      {\n      arma_stop(\"norm(): unsupported vector norm type\");\n      return T(0);\n      }\n    }\n  else\n    {\n    if( (sig == 'i') || (sig == 'I') || (sig == '+') )   // inf norm\n      {\n      return arma_mat_norm_inf(P);\n      }\n    else\n    if( (sig == 'f') || (sig == 'F') )\n      {\n      return arma_vec_norm_2(P);\n      }\n    else\n      {\n      arma_stop(\"norm(): unsupported matrix norm type\");\n      return T(0);\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_norm_sparse.hpp",
    "content": "// Copyright (C) 2012-2014 Conrad Sanderson\n// Copyright (C) 2012-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_norm\n//! @{\n\n\n//\n// norms for sparse matrices\n\n\ntemplate<typename T1>\ninline\ntypename T1::pod_type\narma_mat_norm_1(const SpProxy<T1>& P)\n  {\n  arma_extra_debug_sigprint();\n  \n  // TODO: this can be sped up with a dedicated implementation\n  return as_scalar( max( sum(abs(P.Q), 0), 1) );\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::pod_type\narma_mat_norm_2(const SpProxy<T1>& P, const typename arma_real_only<typename T1::elem_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  // norm = sqrt( largest eigenvalue of (A^H)*A ), where ^H is the conjugate transpose\n  // http://math.stackexchange.com/questions/4368/computing-the-largest-eigenvalue-of-a-very-large-sparse-matrix\n  \n  typedef typename T1::elem_type eT;\n  typedef typename T1::pod_type   T;\n  \n  const unwrap_spmat<typename SpProxy<T1>::stored_type> tmp(P.Q);\n  \n  const SpMat<eT>& A = tmp.M;\n  const SpMat<eT>  B = trans(A);\n  \n  const SpMat<eT>  C = (A.n_rows <= A.n_cols) ? (A*B) : (B*A);\n  \n  const Col<T> eigval = eigs_sym(C, 1);\n  \n  return (eigval.n_elem > 0) ? std::sqrt(eigval[0]) : T(0);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::pod_type\narma_mat_norm_2(const SpProxy<T1>& P, const typename arma_cx_only<typename T1::elem_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  //typedef typename T1::elem_type eT;\n  typedef typename T1::pod_type   T;\n  \n  arma_ignore(P);\n  arma_stop(\"norm(): unimplemented norm type for complex sparse matrices\");\n  \n  return T(0);\n  \n  // const unwrap_spmat<typename SpProxy<T1>::stored_type> tmp(P.Q);\n  // \n  // const SpMat<eT>& A = tmp.M;\n  // const SpMat<eT>  B = trans(A);\n  // \n  // const SpMat<eT>  C = (A.n_rows <= A.n_cols) ? (A*B) : (B*A);\n  // \n  // const Col<eT> eigval = eigs_gen(C, 1);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::pod_type\narma_mat_norm_inf(const SpProxy<T1>& P)\n  {\n  arma_extra_debug_sigprint();\n  \n  // TODO: this can be sped up with a dedicated implementation\n  return as_scalar( max( sum(abs(P.Q), 1), 0) );\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename enable_if2< is_arma_sparse_type<T1>::value, typename T1::pod_type >::result\nnorm\n  (\n  const T1& X,\n  const uword k = uword(2),\n  const typename arma_real_or_cx_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  typedef typename T1::pod_type   T;\n  \n  const SpProxy<T1> P(X);\n  \n  if(P.get_n_nonzero() == 0)\n    {\n    return T(0);\n    }\n  \n  const bool is_vec = (P.get_n_rows() == 1) || (P.get_n_cols() == 1);\n  \n  if(is_vec == true)\n    {\n    const unwrap_spmat<typename SpProxy<T1>::stored_type> tmp(P.Q);\n    const SpMat<eT>& A = tmp.M;\n    \n    // create a fake dense vector to allow reuse of code for dense vectors\n    Col<eT> fake_vector( access::rwp(A.values), A.n_nonzero, false );\n    \n    const Proxy< Col<eT> > P_fake_vector(fake_vector);\n    \n    switch(k)\n      {\n      case 1:\n        return arma_vec_norm_1(P_fake_vector);\n        break;\n      \n      case 2:\n        return arma_vec_norm_2(P_fake_vector);\n        break;\n      \n      default:\n        {\n        arma_debug_check( (k == 0), \"norm(): k must be greater than zero\"   );\n        return arma_vec_norm_k(P_fake_vector, int(k));\n        }\n      }\n    }\n  else\n    {\n    switch(k)\n      {\n      case 1:\n        return arma_mat_norm_1(P);\n        break;\n      \n      case 2:\n        return arma_mat_norm_2(P);\n        break;\n      \n      default:\n        arma_stop(\"norm(): unsupported or unimplemented norm type for sparse matrices\");\n        return T(0);\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename enable_if2< is_arma_sparse_type<T1>::value, typename T1::pod_type >::result\nnorm\n  (\n  const T1& X,\n  const char* method,\n  const typename arma_real_or_cx_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  typedef typename T1::pod_type   T;\n  \n  const SpProxy<T1> P(X);\n  \n  if(P.get_n_nonzero() == 0)\n    {\n    return T(0);\n    }\n  \n  \n  const unwrap_spmat<typename SpProxy<T1>::stored_type> tmp(P.Q);\n  const SpMat<eT>& A = tmp.M;\n  \n  // create a fake dense vector to allow reuse of code for dense vectors\n  Col<eT> fake_vector( access::rwp(A.values), A.n_nonzero, false );\n  \n  const Proxy< Col<eT> > P_fake_vector(fake_vector);\n  \n  \n  const char sig    = (method != NULL) ? method[0] : char(0);\n  const bool is_vec = (P.get_n_rows() == 1) || (P.get_n_cols() == 1);\n  \n  if(is_vec == true)\n    {\n    if( (sig == 'i') || (sig == 'I') || (sig == '+') )   // max norm\n      {\n      return arma_vec_norm_max(P_fake_vector);\n      }\n    else\n    if(sig == '-')   // min norm\n      {\n      const T val = arma_vec_norm_min(P_fake_vector);\n      \n      if( P.get_n_nonzero() < P.get_n_elem() )\n        {\n        return (std::min)(T(0), val);\n        }\n      else\n        {\n        return val;\n        }\n      }\n    else\n    if( (sig == 'f') || (sig == 'F') )\n      {\n      return arma_vec_norm_2(P_fake_vector);\n      }\n    else\n      {\n      arma_stop(\"norm(): unsupported vector norm type\");\n      return T(0);\n      }\n    }\n  else\n    {\n    if( (sig == 'i') || (sig == 'I') || (sig == '+') )   // inf norm\n      {\n      return arma_mat_norm_inf(P);\n      }\n    else\n    if( (sig == 'f') || (sig == 'F') )\n      {\n      return arma_vec_norm_2(P_fake_vector);\n      }\n    else\n      {\n      arma_stop(\"norm(): unsupported matrix norm type\");\n      return T(0);\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_normalise.hpp",
    "content": "// Copyright (C) 2014 Conrad Sanderson\n// Copyright (C) 2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_normalise\n//! @{\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && resolves_to_colvector<T1>::value),\n  const Op<T1, op_normalise_colvec>\n  >::result\nnormalise\n  (\n  const T1&   X,\n  const uword p = uword(2),\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename arma_real_or_cx_only<typename T1::elem_type>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return Op<T1, op_normalise_colvec>(X, p, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && resolves_to_rowvector<T1>::value),\n  const Op<T1, op_normalise_rowvec>\n  >::result\nnormalise\n  (\n  const T1&   X,\n  const uword p = uword(2),\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename arma_real_or_cx_only<typename T1::elem_type>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return Op<T1, op_normalise_rowvec>(X, p, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && (resolves_to_vector<T1>::value == false)),\n  const Op<T1, op_normalise_mat>\n  >::result\nnormalise\n  (\n  const T1&   X,\n  const uword p = uword(2),\n  const uword dim = 0,\n  const typename arma_real_or_cx_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return Op<T1, op_normalise_mat>(X, p, dim);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_numel.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_numel\n//! @{\n\n\n\ntemplate<typename T1>\ninline\ntypename enable_if2< is_arma_type<T1>::value, uword >::result\nnumel(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<T1> P(X);\n  \n  return P.get_n_elem();\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename enable_if2< is_arma_cube_type<T1>::value, uword >::result\nnumel(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const ProxyCube<T1> P(X);\n  \n  return P.get_n_elem();\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename enable_if2< is_arma_sparse_type<T1>::value, uword >::result\nnumel(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> P(X);\n  \n  return P.get_n_elem();\n  }\n\n\n\ntemplate<typename oT>\ninline\nuword\nnumel(const field<oT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return X.n_elem;\n  }\n\n\n\ntemplate<typename oT>\ninline\nuword\nnumel(const subview_field<oT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return X.n_elem;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_ones.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_ones\n//! @{\n\n\n\narma_inline\nconst Gen<vec, gen_ones_full>\nones(const uword n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Gen<vec, gen_ones_full>(n_elem, 1);\n  }\n\n\n\ntemplate<typename obj_type>\narma_inline\nconst Gen<obj_type, gen_ones_full>\nones(const uword n_elem, const arma_empty_class junk1 = arma_empty_class(), const typename arma_Mat_Col_Row_only<obj_type>::result* junk2 = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  if(is_Row<obj_type>::value == true)\n    {\n    return Gen<obj_type, gen_ones_full>(1, n_elem);\n    }\n  else\n    {\n    return Gen<obj_type, gen_ones_full>(n_elem, 1);\n    }\n  }\n\n\n\narma_inline\nconst Gen<mat, gen_ones_full>\nones(const uword n_rows, const uword n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Gen<mat, gen_ones_full>(n_rows, n_cols);\n  }\n\n\n\ntemplate<typename obj_type>\ninline\nconst Gen<obj_type, gen_ones_full>\nones(const uword n_rows, const uword n_cols, const typename arma_Mat_Col_Row_only<obj_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  if(is_Col<obj_type>::value == true)\n    {\n    arma_debug_check( (n_cols != 1), \"ones(): incompatible size\" );\n    }\n  else\n  if(is_Row<obj_type>::value == true)\n    {\n    arma_debug_check( (n_rows != 1), \"ones(): incompatible size\" );\n    }\n  \n  return Gen<obj_type, gen_ones_full>(n_rows, n_cols);\n  }\n\n\n\narma_inline\nconst GenCube<cube::elem_type, gen_ones_full>\nones(const uword n_rows, const uword n_cols, const uword n_slices)\n  {\n  arma_extra_debug_sigprint();\n  \n  return GenCube<cube::elem_type, gen_ones_full>(n_rows, n_cols, n_slices);\n  }\n\n\n\ntemplate<typename cube_type>\narma_inline\nconst GenCube<typename cube_type::elem_type, gen_ones_full>\nones(const uword n_rows, const uword n_cols, const uword n_slices, const typename arma_Cube_only<cube_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return GenCube<typename cube_type::elem_type, gen_ones_full>(n_rows, n_cols, n_slices);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_pinv.hpp",
    "content": "// Copyright (C) 2009-2013 Conrad Sanderson\n// Copyright (C) 2009-2013 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_pinv\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nconst Op<T1, op_pinv>\npinv\n  (\n  const Base<typename T1::elem_type,T1>& X,\n  const typename T1::elem_type           tol    = 0.0,\n  const char*                            method = \"dc\",\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'd')), \"pinv(): unknown method specified\" );\n  \n  return (sig == 'd') ? Op<T1, op_pinv>(X.get_ref(), tol, 1, 0) : Op<T1, op_pinv>(X.get_ref(), tol, 0, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\npinv\n  (\n         Mat<typename T1::elem_type>&    out,\n  const Base<typename T1::elem_type,T1>& X,\n  const typename T1::elem_type           tol    = 0.0,\n  const char*                            method = \"dc\",\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  try\n    {\n    out = pinv(X, tol, method);\n    }\n  catch(std::runtime_error&)\n    {\n    return false;\n    }\n  \n  return true;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_princomp.hpp",
    "content": "// Copyright (C) 2010-2012 Conrad Sanderson\n// Copyright (C) 2010-2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_princomp\n//! @{\n\n\n\n//! \\brief\n//! principal component analysis -- 4 arguments version\n//! coeff_out    -> principal component coefficients\n//! score_out    -> projected samples\n//! latent_out   -> eigenvalues of principal vectors\n//! tsquared_out -> Hotelling's T^2 statistic\ntemplate<typename T1>\ninline\nbool\nprincomp\n  (\n         Mat<typename T1::elem_type>&    coeff_out,\n         Mat<typename T1::elem_type>&    score_out,\n         Col<typename T1::pod_type>&     latent_out,\n         Col<typename T1::elem_type>&    tsquared_out,\n  const Base<typename T1::elem_type,T1>& X,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const bool status = op_princomp::direct_princomp(coeff_out, score_out, latent_out, tsquared_out, X);\n  \n  if(status == false)\n    {\n    coeff_out.reset();\n    score_out.reset();\n    latent_out.reset();\n    tsquared_out.reset();\n    \n    arma_bad(\"princomp(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! \\brief\n//! principal component analysis -- 3 arguments version\n//! coeff_out    -> principal component coefficients\n//! score_out    -> projected samples\n//! latent_out   -> eigenvalues of principal vectors\ntemplate<typename T1>\ninline\nbool\nprincomp\n  (\n         Mat<typename T1::elem_type>&    coeff_out,\n         Mat<typename T1::elem_type>&    score_out,\n         Col<typename T1::pod_type>&     latent_out,\n  const Base<typename T1::elem_type,T1>& X,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const bool status = op_princomp::direct_princomp(coeff_out, score_out, latent_out, X); \n  \n  if(status == false)\n    {\n    coeff_out.reset();\n    score_out.reset();\n    latent_out.reset();\n    \n    arma_bad(\"princomp(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! \\brief\n//! principal component analysis -- 2 arguments version\n//! coeff_out    -> principal component coefficients\n//! score_out    -> projected samples\ntemplate<typename T1>\ninline\nbool\nprincomp\n  (\n         Mat<typename T1::elem_type>&    coeff_out,\n         Mat<typename T1::elem_type>&    score_out,\n  const Base<typename T1::elem_type,T1>& X,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const bool status = op_princomp::direct_princomp(coeff_out, score_out, X); \n  \n  if(status == false)\n    {\n    coeff_out.reset();\n    score_out.reset();\n    \n    arma_bad(\"princomp(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! \\brief\n//! principal component analysis -- 1 argument version\n//! coeff_out    -> principal component coefficients\ntemplate<typename T1>\ninline\nbool\nprincomp\n  (\n         Mat<typename T1::elem_type>&    coeff_out,\n  const Base<typename T1::elem_type,T1>& X,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const bool status = op_princomp::direct_princomp(coeff_out, X);\n  \n  if(status == false)\n    {\n    coeff_out.reset();\n    \n    arma_bad(\"princomp(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst Op<T1, op_princomp>\nprincomp\n  (\n  const Base<typename T1::elem_type,T1>& X,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return Op<T1, op_princomp>(X.get_ref());\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_prod.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_prod\n//! @{\n\n\n//! \\brief\n//! Delayed product of elements of a matrix along a specified dimension (either rows or columns).\n//! The result is stored in a dense matrix that has either one column or one row.\n//! For dim = 0, find the sum of each column (i.e. traverse across rows)\n//! For dim = 1, find the sum of each row (i.e. traverse across columns)\n//! The default is dim = 0.\n//! NOTE: this function works differently than in Matlab/Octave.\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_prod>\nprod\n  (\n  const T1& X,\n  const uword dim = 0,\n  const typename enable_if< is_arma_type<T1>::value       == true  >::result* junk1 = 0,\n  const typename enable_if< resolves_to_vector<T1>::value == false >::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return Op<T1, op_prod>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_prod>\nprod\n  (\n  const T1& X,\n  const uword dim,\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return Op<T1, op_prod>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nprod\n  (\n  const T1& X,\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return op_prod::prod( X );\n  }\n\n\n\n//! \\brief\n//! Immediate 'product of all values' operation,\n//! invoked, for example, by: prod(prod(A))\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nprod(const Op<T1, op_prod>& in)\n  {\n  arma_extra_debug_sigprint();\n  arma_extra_debug_print(\"prod(): two consecutive prod() calls detected\");\n  \n  return op_prod::prod( in.m );\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst Op<Op<T1, op_prod>, op_prod>\nprod(const Op<T1, op_prod>& in, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<Op<T1, op_prod>, op_prod>(in, dim, 0);\n  }\n\n\n\ntemplate<typename T>\narma_inline\narma_warn_unused\nconst typename arma_scalar_only<T>::result &\nprod(const T& x)\n  {\n  return x;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_qr.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_qr\n//! @{\n\n\n\n//! QR decomposition\ntemplate<typename T1>\ninline\nbool\nqr\n  (\n         Mat<typename T1::elem_type>&    Q,\n         Mat<typename T1::elem_type>&    R,\n  const Base<typename T1::elem_type,T1>& X,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  arma_debug_check( (&Q == &R), \"qr(): Q and R are the same object\");\n  \n  const bool status = auxlib::qr(Q, R, X);\n  \n  if(status == false)\n    {\n    Q.reset();\n    R.reset();\n    arma_bad(\"qr(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! economical QR decomposition\ntemplate<typename T1>\ninline\nbool\nqr_econ\n  (\n         Mat<typename T1::elem_type>&    Q,\n         Mat<typename T1::elem_type>&    R,\n  const Base<typename T1::elem_type,T1>& X,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  arma_debug_check( (&Q == &R), \"qr_econ(): Q and R are the same object\");\n  \n  const bool status = auxlib::qr_econ(Q, R, X);\n  \n  if(status == false)\n    {\n    Q.reset();\n    R.reset();\n    arma_bad(\"qr_econ(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_qz.hpp",
    "content": "// Copyright (C) 2015 Conrad Sanderson\n// Copyright (C) 2015 NICTA (www.nicta.com.au)\n// Copyright (C) 2015 Keith O'Hara\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_qz\n//! @{\n\n\n\n//! QZ decomposition for pair of N-by-N general matrices (A,B)\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  is_supported_blas_type<typename T1::elem_type>::value,\n  bool\n  >::result\nqz\n  (\n         Mat<typename T1::elem_type>&    AA,\n         Mat<typename T1::elem_type>&    BB,\n         Mat<typename T1::elem_type>&    Q,\n         Mat<typename T1::elem_type>&    Z,\n  const Base<typename T1::elem_type,T1>& A,\n  const Base<typename T1::elem_type,T2>& B\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool status = auxlib::qz(AA, BB, Q, Z, A, B, 'b');\n  \n  if(status == false)\n    {\n    AA.reset();\n    BB.reset();\n    Q.reset();\n    Z.reset();\n    arma_bad(\"qz(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_randg.hpp",
    "content": "// Copyright (C) 2015 Conrad Sanderson\n// Copyright (C) 2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_randg\n//! @{\n\n\n\ntemplate<typename obj_type>\ninline\nobj_type\nrandg(const uword n_rows, const uword n_cols, const distr_param& param = distr_param(), const typename arma_Mat_Col_Row_only<obj_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  #if defined(ARMA_USE_CXX11)\n    {\n    if(is_Col<obj_type>::value == true)\n      {\n      arma_debug_check( (n_cols != 1), \"randg(): incompatible size\" );\n      }\n    else\n    if(is_Row<obj_type>::value == true)\n      {\n      arma_debug_check( (n_rows != 1), \"randg(): incompatible size\" );\n      }\n    \n    obj_type out(n_rows, n_cols);\n    \n    double a;\n    double b;\n    \n    if(param.state == 0)\n      {\n      a = double(1);\n      b = double(1);\n      }\n    else\n    if(param.state == 1)\n      {\n      a = double(param.a_int);\n      b = double(param.b_int);\n      }\n    else\n      {\n      a = param.a_double;\n      b = param.b_double;\n      }\n    \n    arma_debug_check( ((a <= double(0)) || (b <= double(0))), \"randg(): a and b must be greater than zero\" );\n    \n    #if defined(ARMA_USE_EXTERN_CXX11_RNG)\n      {\n      arma_rng_cxx11_instance.randg_fill(out.memptr(), out.n_elem, a, b);\n      }\n    #else\n      {\n      arma_rng_cxx11 local_arma_rng_cxx11_instance;\n      \n      typedef typename arma_rng_cxx11::seed_type seed_type;\n      \n      local_arma_rng_cxx11_instance.set_seed( seed_type(arma_rng::randi<seed_type>()) );\n      \n      local_arma_rng_cxx11_instance.randg_fill(out.memptr(), out.n_elem, a, b);\n      }\n    #endif\n    \n    return out;\n    }\n  #else\n    {\n    arma_ignore(n_rows);\n    arma_ignore(n_cols);\n    arma_ignore(param);\n    \n    arma_stop(\"randg(): C++11 compiler required\");\n    \n    return obj_type();\n    }\n  #endif\n  }\n\n\n\ntemplate<typename obj_type>\ninline\nobj_type\nrandg(const uword n_elem, const distr_param& param = distr_param(), const arma_empty_class junk1 = arma_empty_class(), const typename arma_Mat_Col_Row_only<obj_type>::result* junk2 = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  if(is_Row<obj_type>::value == true)\n    {\n    return randg<obj_type>(1, n_elem, param);\n    }\n  else\n    {\n    return randg<obj_type>(n_elem, 1, param);\n    }\n  }\n\n\n\ninline\nmat\nrandg(const uword n_rows, const uword n_cols, const distr_param& param = distr_param())\n  {\n  arma_extra_debug_sigprint();\n  \n  return randg<mat>(n_rows, n_cols, param);\n  }\n\n\n\ninline\nvec\nrandg(const uword n_elem, const distr_param& param = distr_param())\n  {\n  arma_extra_debug_sigprint();\n  \n  return randg<vec>(n_elem, param);\n  }\n\n\n\ntemplate<typename cube_type>\ninline\ncube_type\nrandg(const uword n_rows, const uword n_cols, const uword n_slices, const distr_param& param = distr_param(), const typename arma_Cube_only<cube_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  #if defined(ARMA_USE_CXX11)\n    {\n    cube_type out(n_rows, n_cols, n_slices);\n  \n    double a;\n    double b;\n    \n    if(param.state == 0)\n      {\n      a = double(1);\n      b = double(1);\n      }\n    else\n    if(param.state == 1)\n      {\n      a = double(param.a_int);\n      b = double(param.b_int);\n      }\n    else\n      {\n      a = param.a_double;\n      b = param.b_double;\n      }\n    \n    arma_debug_check( ((a <= double(0)) || (b <= double(0))), \"randg(): a and b must be greater than zero\" );\n    \n    #if defined(ARMA_USE_EXTERN_CXX11_RNG)\n      {\n      arma_rng_cxx11_instance.randg_fill(out.memptr(), out.n_elem, a, b);\n      }\n    #else\n      {\n      arma_rng_cxx11 local_arma_rng_cxx11_instance;\n      \n      typedef typename arma_rng_cxx11::seed_type seed_type;\n      \n      local_arma_rng_cxx11_instance.set_seed( seed_type(arma_rng::randi<seed_type>()) );\n      \n      local_arma_rng_cxx11_instance.randg_fill(out.memptr(), out.n_elem, a, b);\n      }\n    #endif\n    \n    return out;\n    }\n  #else\n    {\n    arma_ignore(n_rows);\n    arma_ignore(n_cols);\n    arma_ignore(n_slices);\n    arma_ignore(param);\n    \n    arma_stop(\"randg(): C++11 compiler required\");\n    \n    return cube_type();\n    }\n  #endif\n  }\n\n\n\ninline\ncube\nrandg(const uword n_rows, const uword n_cols, const uword n_slices, const distr_param& param = distr_param())\n  {\n  arma_extra_debug_sigprint();\n  \n  return randg<cube>(n_rows, n_cols, n_slices, param);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_randi.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_randi\n//! @{\n\n\n\ntemplate<typename obj_type>\ninline\nobj_type\nrandi(const uword n_rows, const uword n_cols, const distr_param& param = distr_param(), const typename arma_Mat_Col_Row_only<obj_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename obj_type::elem_type eT;\n  \n  if(is_Col<obj_type>::value == true)\n    {\n    arma_debug_check( (n_cols != 1), \"randi(): incompatible size\" );\n    }\n  else\n  if(is_Row<obj_type>::value == true)\n    {\n    arma_debug_check( (n_rows != 1), \"randi(): incompatible size\" );\n    }\n  \n  obj_type out(n_rows, n_cols);\n  \n  int a;\n  int b;\n  \n  if(param.state == 0)\n    {\n    a = 0;\n    b = arma_rng::randi<eT>::max_val();\n    }\n  else\n  if(param.state == 1)\n    {\n    a = param.a_int;\n    b = param.b_int;\n    }\n  else\n    {\n    a = int(param.a_double);\n    b = int(param.b_double);\n    }\n  \n  arma_debug_check( (a > b), \"randi(): incorrect distribution parameters: a must be less than b\" );\n  \n  arma_rng::randi<eT>::fill(out.memptr(), out.n_elem, a, b);\n  \n  return out;\n  }\n\n\n\ntemplate<typename obj_type>\ninline\nobj_type\nrandi(const uword n_elem, const distr_param& param = distr_param(), const arma_empty_class junk1 = arma_empty_class(), const typename arma_Mat_Col_Row_only<obj_type>::result* junk2 = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  if(is_Row<obj_type>::value == true)\n    {\n    return randi<obj_type>(1, n_elem, param);\n    }\n  else\n    {\n    return randi<obj_type>(n_elem, 1, param);\n    }\n  }\n\n\n\ninline\nimat\nrandi(const uword n_rows, const uword n_cols, const distr_param& param = distr_param())\n  {\n  arma_extra_debug_sigprint();\n  \n  return randi<imat>(n_rows, n_cols, param);\n  }\n\n\n\ninline\nivec\nrandi(const uword n_elem, const distr_param& param = distr_param())\n  {\n  arma_extra_debug_sigprint();\n  \n  return randi<ivec>(n_elem, param);\n  }\n\n\n\ntemplate<typename cube_type>\ninline\ncube_type\nrandi(const uword n_rows, const uword n_cols, const uword n_slices, const distr_param& param = distr_param(), const typename arma_Cube_only<cube_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename cube_type::elem_type eT;\n  \n  cube_type out(n_rows, n_cols, n_slices);\n  \n  int a;\n  int b;\n  \n  if(param.state == 0)\n    {\n    a = 0;\n    b = arma_rng::randi<eT>::max_val();\n    }\n  else\n  if(param.state == 1)\n    {\n    a = param.a_int;\n    b = param.b_int;\n    }\n  else\n    {\n    a = int(param.a_double);\n    b = int(param.b_double);\n    }\n  \n  arma_debug_check( (a > b), \"randi(): incorrect distribution parameters: a must be less than b\" );\n  \n  arma_rng::randi<eT>::fill(out.memptr(), out.n_elem, a, b);\n  \n  return out;\n  }\n\n\n\ninline\nicube\nrandi(const uword n_rows, const uword n_cols, const uword n_slices, const distr_param& param = distr_param())\n  {\n  arma_extra_debug_sigprint();\n  \n  return randi<icube>(n_rows, n_cols, n_slices, param);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_randn.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_randn\n//! @{\n\n\ninline\ndouble\nrandn()\n  {\n  return double(arma_rng::randn<double>());\n  }\n\n\ntemplate<typename eT>\ninline\ntypename arma_scalar_only<eT>::result\nrandn()\n  {\n  return eT(arma_rng::randn<eT>());\n  }\n\n\n\n//! Generate a vector with all elements set to random values with a gaussian distribution (zero mean, unit variance)\narma_inline\nconst Gen<vec, gen_randn>\nrandn(const uword n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Gen<vec, gen_randn>(n_elem, 1);\n  }\n\n\n\ntemplate<typename obj_type>\narma_inline\nconst Gen<obj_type, gen_randn>\nrandn(const uword n_elem, const arma_empty_class junk1 = arma_empty_class(), const typename arma_Mat_Col_Row_only<obj_type>::result* junk2 = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  if(is_Row<obj_type>::value == true)\n    {\n    return Gen<obj_type, gen_randn>(1, n_elem);\n    }\n  else\n    {\n    return Gen<obj_type, gen_randn>(n_elem, 1);\n    }\n  }\n\n\n\n//! Generate a dense matrix with all elements set to random values with a gaussian distribution (zero mean, unit variance)\narma_inline\nconst Gen<mat, gen_randn>\nrandn(const uword n_rows, const uword n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Gen<mat, gen_randn>(n_rows, n_cols);\n  }\n\n\n\ntemplate<typename obj_type>\narma_inline\nconst Gen<obj_type, gen_randn>\nrandn(const uword n_rows, const uword n_cols, const typename arma_Mat_Col_Row_only<obj_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  if(is_Col<obj_type>::value == true)\n    {\n    arma_debug_check( (n_cols != 1), \"randn(): incompatible size\" );\n    }\n  else\n  if(is_Row<obj_type>::value == true)\n    {\n    arma_debug_check( (n_rows != 1), \"randn(): incompatible size\" );\n    }\n  \n  return Gen<obj_type, gen_randn>(n_rows, n_cols);\n  }\n\n\n\narma_inline\nconst GenCube<cube::elem_type, gen_randn>\nrandn(const uword n_rows, const uword n_cols, const uword n_slices)\n  {\n  arma_extra_debug_sigprint();\n  \n  return GenCube<cube::elem_type, gen_randn>(n_rows, n_cols, n_slices);\n  }\n\n\n\ntemplate<typename cube_type>\narma_inline\nconst GenCube<typename cube_type::elem_type, gen_randn>\nrandn(const uword n_rows, const uword n_cols, const uword n_slices, const typename arma_Cube_only<cube_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();  \n  arma_ignore(junk);\n  \n  return GenCube<typename cube_type::elem_type, gen_randn>(n_rows, n_cols, n_slices);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_randu.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_randu\n//! @{\n\n\ninline\ndouble\nrandu()\n  {\n  return arma_rng::randu<double>();\n  }\n\n\ntemplate<typename eT>\ninline\ntypename arma_scalar_only<eT>::result\nrandu()\n  {\n  return eT(arma_rng::randu<eT>());\n  }\n\n\n\n//! Generate a vector with all elements set to random values in the [0,1] interval (uniform distribution)\narma_inline\nconst Gen<vec, gen_randu>\nrandu(const uword n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Gen<vec, gen_randu>(n_elem, 1);\n  }\n\n\n\ntemplate<typename obj_type>\narma_inline\nconst Gen<obj_type, gen_randu>\nrandu(const uword n_elem, const arma_empty_class junk1 = arma_empty_class(), const typename arma_Mat_Col_Row_only<obj_type>::result* junk2 = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  if(is_Row<obj_type>::value == true)\n    {\n    return Gen<obj_type, gen_randu>(1, n_elem);\n    }\n  else\n    {\n    return Gen<obj_type, gen_randu>(n_elem, 1);\n    }\n  }\n\n\n\n//! Generate a dense matrix with all elements set to random values in the [0,1] interval (uniform distribution)\narma_inline\nconst Gen<mat, gen_randu>\nrandu(const uword n_rows, const uword n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Gen<mat, gen_randu>(n_rows, n_cols);\n  }\n\n\n\ntemplate<typename obj_type>\narma_inline\nconst Gen<obj_type, gen_randu>\nrandu(const uword n_rows, const uword n_cols, const typename arma_Mat_Col_Row_only<obj_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  if(is_Col<obj_type>::value == true)\n    {\n    arma_debug_check( (n_cols != 1), \"randu(): incompatible size\" );\n    }\n  else\n  if(is_Row<obj_type>::value == true)\n    {\n    arma_debug_check( (n_rows != 1), \"randu(): incompatible size\" );\n    }\n  \n  return Gen<obj_type, gen_randu>(n_rows, n_cols);\n  }\n\n\n\narma_inline\nconst GenCube<cube::elem_type, gen_randu>\nrandu(const uword n_rows, const uword n_cols, const uword n_slices)\n  {\n  arma_extra_debug_sigprint();\n  \n  return GenCube<cube::elem_type, gen_randu>(n_rows, n_cols, n_slices);\n  }\n\n\n\ntemplate<typename cube_type>\narma_inline\nconst GenCube<typename cube_type::elem_type, gen_randu>\nrandu(const uword n_rows, const uword n_cols, const uword n_slices, const typename arma_Cube_only<cube_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return GenCube<typename cube_type::elem_type, gen_randu>(n_rows, n_cols, n_slices);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_rank.hpp",
    "content": "// Copyright (C) 2009-2015 Conrad Sanderson\n// Copyright (C) 2009-2015 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// Copyright (C) 2011 Stanislav Funiak\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_rank\n//! @{\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\nuword\nrank\n  (\n  const Base<typename T1::elem_type,T1>& X,\n        typename T1::pod_type            tol = 0.0,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::pod_type T;\n  \n  uword  X_n_rows;\n  uword  X_n_cols;\n  Col<T> s;\n  \n  const bool status = auxlib::svd_dc(s, X, X_n_rows, X_n_cols);\n  \n  if(status == false)\n    {\n    arma_bad(\"rank(): failed to converge\");\n    \n    return uword(0);\n    }\n  \n  const uword s_n_elem = s.n_elem;\n  const T*    s_mem    = s.memptr();\n  \n  // set tolerance to default if it hasn't been specified\n  if( (tol == T(0)) && (s_n_elem > 0) )\n    {\n    tol = (std::max)(X_n_rows, X_n_cols) * s_mem[0] * std::numeric_limits<T>::epsilon();\n    }\n  \n  uword count = 0;\n  \n  for(uword i=0; i < s_n_elem; ++i)  { count += (s_mem[i] > tol) ? uword(1) : uword(0); }\n  \n  return count;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_repmat.hpp",
    "content": "// Copyright (C) 2009-2015 Conrad Sanderson\n// Copyright (C) 2009-2015 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup fn_repmat\n//! @{\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_repmat>\nrepmat(const Base<typename T1::elem_type,T1>& A, const uword r, const uword c)\n  {\n  arma_extra_debug_sigprint();\n\n  return Op<T1, op_repmat>(A.get_ref(), r, c);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst SpOp<T1, spop_repmat>\nrepmat(const SpBase<typename T1::elem_type,T1>& A, const uword r, const uword c)\n  {\n  arma_extra_debug_sigprint();\n\n  return SpOp<T1, spop_repmat>(A.get_ref(), r, c);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_reshape.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_reshape\n//! @{\n\n\n\ntemplate<typename T1>\ninline\ntypename enable_if2< is_arma_type<T1>::value, const Op<T1, op_reshape> >::result\nreshape(const T1& X, const uword in_n_rows, const uword in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_reshape>(X, in_n_rows, in_n_cols);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst Op<T1, op_reshape_ext>\nreshape(const Base<typename T1::elem_type,T1>& X, const uword in_n_rows, const uword in_n_cols, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (dim > 1), \"reshape(): parameter 'dim' must be 0 or 1\" );\n  \n  return Op<T1, op_reshape_ext>(X.get_ref(), in_n_rows, in_n_cols, dim, 'j');\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst OpCube<T1, op_reshape_ext>\nreshape(const BaseCube<typename T1::elem_type,T1>& X, const uword in_n_rows, const uword in_n_cols, const uword in_n_slices, const uword dim = 0)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (dim > 1), \"reshape(): parameter 'dim' must be 0 or 1\" );\n  \n  return OpCube<T1, op_reshape_ext>(X.get_ref(), in_n_rows, in_n_cols, in_n_slices, dim, 'j');\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst SpOp<T1, spop_reshape>\nreshape(const SpBase<typename T1::elem_type, T1>& X, const uword in_n_rows, const uword in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpOp<T1, spop_reshape>(X.get_ref(), in_n_rows, in_n_cols);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_resize.hpp",
    "content": "// Copyright (C) 2011-2015 Conrad Sanderson\n// Copyright (C) 2011-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_resize\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nconst Op<T1, op_resize>\nresize(const Base<typename T1::elem_type,T1>& X, const uword in_n_rows, const uword in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_resize>(X.get_ref(), in_n_rows, in_n_cols);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst OpCube<T1, op_resize>\nresize(const BaseCube<typename T1::elem_type,T1>& X, const uword in_n_rows, const uword in_n_cols, const uword in_n_slices)\n  {\n  arma_extra_debug_sigprint();\n  \n  return OpCube<T1, op_resize>(X.get_ref(), in_n_rows, in_n_cols, in_n_slices);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst SpOp<T1, spop_resize>\nresize(const SpBase<typename T1::elem_type, T1>& X, const uword in_n_rows, const uword in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpOp<T1, spop_resize>(X.get_ref(), in_n_rows, in_n_cols);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_shuffle.hpp",
    "content": "// Copyright (C) 2009-2013 Conrad Sanderson\n// Copyright (C) 2009-2013 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup fn_shuffle\n//! @{\n\n//! \\brief\n//! Shuffle the rows or the columns of a matrix or vector in random fashion.\n//! If dim = 0, shuffle the columns (default operation).\n//! If dim = 1, shuffle the rows.\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_shuffle>\nshuffle\n  (\n  const T1& X,\n  const uword dim = 0,\n  const typename enable_if< is_arma_type<T1>::value       == true  >::result* junk1 = 0,\n  const typename enable_if< resolves_to_vector<T1>::value == false >::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return Op<T1, op_shuffle>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_shuffle>\nshuffle\n  (\n  const T1& X,\n  const uword dim,\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return Op<T1, op_shuffle>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_shuffle>\nshuffle\n  (\n  const T1& X,\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return T1::is_row ? Op<T1, op_shuffle>(X, 1, 0) : Op<T1, op_shuffle>(X, 0, 0);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_size.hpp",
    "content": "// Copyright (C) 2013-2014 Conrad Sanderson\n// Copyright (C) 2013-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_size\n//! @{\n\n\n\ninline\nconst SizeMat\nsize(const uword n_rows, const uword n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SizeMat(n_rows, n_cols);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename enable_if2< is_arma_type<T1>::value, const SizeMat >::result\nsize(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<T1> P(X);\n  \n  return SizeMat( P.get_n_rows(), P.get_n_cols() );\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename enable_if2< is_arma_type<T1>::value, const uword >::result\nsize(const T1& X, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (dim >= 2), \"size(): dimension out of bounds\" );\n  \n  const Proxy<T1> P(X);\n  \n  return (dim == 0) ? P.get_n_rows() : P.get_n_cols();\n  }\n\n\n\ninline\nconst SizeCube\nsize(const uword n_rows, const uword n_cols, const uword n_slices)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SizeCube(n_rows, n_cols, n_slices);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename enable_if2< is_arma_cube_type<T1>::value, const SizeCube >::result\nsize(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const ProxyCube<T1> P(X);\n  \n  return SizeCube( P.get_n_rows(), P.get_n_cols(), P.get_n_slices() );\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename enable_if2< is_arma_cube_type<T1>::value, const uword >::result\nsize(const T1& X, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (dim >= 3), \"size(): dimension out of bounds\" );\n  \n  const ProxyCube<T1> P(X);\n  \n  return (dim == 0) ? P.get_n_rows() : ( (dim == 1) ? P.get_n_cols() : P.get_n_slices() ); \n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename enable_if2< is_arma_sparse_type<T1>::value, const SizeMat >::result\nsize(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> P(X);\n  \n  return SizeMat( P.get_n_rows(), P.get_n_cols() );\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename enable_if2< is_arma_sparse_type<T1>::value, const uword >::result\nsize(const T1& X, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (dim >= 2), \"size(): dimension out of bounds\" );\n  \n  const SpProxy<T1> P(X);\n  \n  return (dim == 0) ? P.get_n_rows() : P.get_n_cols();\n  }\n\n\n\n\ntemplate<typename oT>\ninline\nconst SizeCube\nsize(const field<oT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SizeCube( X.n_rows, X.n_cols, X.n_slices );\n  }\n\n\n\ntemplate<typename oT>\ninline\nconst SizeCube\nsize(const subview_field<oT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SizeCube( X.n_rows, X.n_cols, X.n_slices );\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_solve.hpp",
    "content": "// Copyright (C) 2009-2013 Conrad Sanderson\n// Copyright (C) 2009-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_solve\n//! @{\n\n\n\n//! Solve a system of linear equations, i.e., A*X = B, where X is unknown.\n//! For a square matrix A, this function is conceptually the same as X = inv(A)*B,\n//! but is done more efficiently.\n//! The number of rows in A and B must be the same.\n//! B can be either a column vector or a matrix.\n//! This function will also try to provide approximate solutions\n//! to under-determined as well as over-determined systems (non-square A matrices).\n\ntemplate<typename T1, typename T2>\ninline\nconst Glue<T1, T2, glue_solve>\nsolve\n  (\n  const Base<typename T1::elem_type,T1>& A,\n  const Base<typename T1::elem_type,T2>& B,\n  const bool slow = false,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return Glue<T1, T2, glue_solve>(A.get_ref(), B.get_ref(), ((slow == false) ? 0 : 1) );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst Glue<T1, T2, glue_solve>\nsolve\n  (\n  const Base<typename T1::elem_type,T1>& A,\n  const Base<typename T1::elem_type,T2>& B,\n  const char* method,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'f')), \"solve(): unknown method specified\" );\n  \n  return Glue<T1, T2, glue_solve>( A.get_ref(), B.get_ref(), ((sig == 'f') ? 0 : 1) );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst Glue<T1, T2, glue_solve_tr>\nsolve\n  (\n  const Op<T1, op_trimat>& A,\n  const Base<typename T1::elem_type,T2>& B,\n  const bool slow = false,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(slow);\n  arma_ignore(junk);\n  \n  return Glue<T1, T2, glue_solve_tr>(A.m, B.get_ref(), A.aux_uword_a);\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst Glue<T1, T2, glue_solve_tr>\nsolve\n  (\n  const Op<T1, op_trimat>& A,\n  const Base<typename T1::elem_type,T2>& B,\n  const char* method,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'f')), \"solve(): unknown method specified\" );\n  \n  return Glue<T1, T2, glue_solve_tr>(A.m, B.get_ref(), A.aux_uword_a);\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nbool\nsolve\n  (\n         Mat<typename T1::elem_type>&    out,\n  const Base<typename T1::elem_type,T1>& A,\n  const Base<typename T1::elem_type,T2>& B,\n  const bool slow = false,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  try\n    {\n    out = solve( A.get_ref(), B.get_ref(), slow );\n    }\n  catch(std::runtime_error&)\n    {\n    return false;\n    }\n  \n  return true;\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nbool\nsolve\n  (\n         Mat<typename T1::elem_type>&    out,\n  const Base<typename T1::elem_type,T1>& A,\n  const Base<typename T1::elem_type,T2>& B,\n  const char* method,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  try\n    {\n    out = solve( A.get_ref(), B.get_ref(), method );\n    }\n  catch(std::runtime_error&)\n    {\n    return false;\n    }\n  \n  return true;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_sort.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_sort\n//! @{\n\n\n//! kept for compatibility with old code\ntemplate<typename T1>\narma_inline\ntypename\nenable_if2\n  <\n  ( (is_arma_type<T1>::value == true) && (resolves_to_vector<T1>::value == false) ),\n  const Op<T1, op_sort>\n  >::result\nsort\n  (\n  const T1&   X,\n  const uword sort_type = 0,\n  const uword dim       = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_sort>(X, sort_type, dim);\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_inline\ntypename\nenable_if2\n  <\n  ( (is_arma_type<T1>::value == true) && (resolves_to_vector<T1>::value == false) && (is_same_type<T2, char>::value) ),\n  const Op<T1, op_sort>\n  >::result\nsort\n  (\n  const T1&   X,\n  const T2*   sort_direction,\n  const uword dim           = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const char sig = (sort_direction != NULL) ? sort_direction[0] : char(0);\n  \n  arma_debug_check( (sig != 'a') && (sig != 'd'), \"sort(): unknown sort direction\");\n  \n  const uword sort_type = (sig == 'a') ? 0 : 1;\n  \n  return Op<T1, op_sort>(X, sort_type, dim);\n  }\n\n\n\n//! kept for compatibility with old code\ntemplate<typename T1>\narma_inline\ntypename\nenable_if2\n  <\n  ( (is_arma_type<T1>::value == true) && (resolves_to_vector<T1>::value == true) ),\n  const Op<T1, op_sort>\n  >::result\nsort\n  (\n  const T1&   X,\n  const uword sort_type = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword dim = (T1::is_col) ? 0 : 1;\n  \n  return Op<T1, op_sort>(X, sort_type, dim);\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_inline\ntypename\nenable_if2\n  <\n  ( (is_arma_type<T1>::value == true) && (resolves_to_vector<T1>::value == true) && (is_same_type<T2, char>::value) ),\n  const Op<T1, op_sort>\n  >::result\nsort\n  (\n  const T1& X,\n  const T2* sort_direction\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const char sig = (sort_direction != NULL) ? sort_direction[0] : char(0);\n  \n  arma_debug_check( (sig != 'a') && (sig != 'd'), \"sort(): unknown sort direction\");\n  \n  const uword sort_type = (sig == 'a') ? 0 : 1;\n  const uword dim       = (T1::is_col) ? 0 : 1;\n  \n  return Op<T1, op_sort>(X, sort_type, dim);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_sort_index.hpp",
    "content": "// Copyright (C) 2009-2015 Conrad Sanderson\n// Copyright (C) 2009-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_sort_index\n//! @{\n\n\n\n\n//! kept for compatibility with old code\ntemplate<typename T1>\ninline\nconst mtOp<uword,T1,op_sort_index>\nsort_index\n  (\n  const Base<typename T1::elem_type,T1>& X,\n  const uword sort_type = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (sort_type > 1), \"sort_index(): parameter 'sort_type' must be 0 or 1\" );\n  \n  return mtOp<uword,T1,op_sort_index>(X.get_ref(), sort_type, uword(0));\n  }\n\n\n\n//! kept for compatibility with old code\ntemplate<typename T1>\ninline\nconst mtOp<uword,T1,op_stable_sort_index>\nstable_sort_index\n  (\n  const Base<typename T1::elem_type,T1>& X,\n  const uword sort_type = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (sort_type > 1), \"stable_sort_index(): parameter 'sort_type' must be 0 or 1\" );\n  \n  return mtOp<uword,T1,op_stable_sort_index>(X.get_ref(), sort_type, uword(0));\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  ( (is_arma_type<T1>::value == true) && (is_same_type<T2, char>::value == true) ),\n  const mtOp<uword,T1,op_sort_index>\n  >::result\nsort_index\n  (\n  const T1& X,\n  const T2* sort_direction\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const char sig = (sort_direction != NULL) ? sort_direction[0] : char(0);\n  \n  arma_debug_check( ((sig != 'a') && (sig != 'd')), \"sort_index(): unknown sort direction\" );\n  \n  return mtOp<uword,T1,op_sort_index>(X, ((sig == 'a') ? uword(0) : uword(1)), uword(0));\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  ( (is_arma_type<T1>::value == true) && (is_same_type<T2, char>::value == true) ),\n  const mtOp<uword,T1,op_stable_sort_index>\n  >::result\nstable_sort_index\n  (\n  const T1& X,\n  const T2* sort_direction\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const char sig = (sort_direction != NULL) ? sort_direction[0] : char(0);\n  \n  arma_debug_check( ((sig != 'a') && (sig != 'd')), \"stable_sort_index(): unknown sort direction\" );\n  \n  return mtOp<uword,T1,op_stable_sort_index>(X, ((sig == 'a') ? uword(0) : uword(1)), uword(0));\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_speye.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// Copyright (C) 2012 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_speye\n//! @{\n\n\n\n//! Generate a sparse matrix with the values along the main diagonal set to one\ntemplate<typename obj_type>\ninline\nobj_type\nspeye(const uword n_rows, const uword n_cols, const typename arma_SpMat_SpCol_SpRow_only<obj_type>::result* junk = NULL)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  if(is_SpCol<obj_type>::value == true)\n    {\n    arma_debug_check( (n_cols != 1), \"speye(): incompatible size\" );\n    }\n  else\n  if(is_SpRow<obj_type>::value == true)\n    {\n    arma_debug_check( (n_rows != 1), \"speye(): incompatible size\" );\n    }\n  \n  obj_type out;\n  \n  out.eye(n_rows, n_cols);\n  \n  return out;\n  }\n\n\n\n// Convenience shortcut method (no template parameter necessary)\ninline\nsp_mat\nspeye(const uword n_rows, const uword n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  sp_mat out;\n  \n  out.eye(n_rows, n_cols);\n  \n  return out;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_spones.hpp",
    "content": "// Copyright (C) 2012-2013 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_spones\n//! @{\n\n\n\n//! Generate a sparse matrix with the non-zero values in the same locations as in the given sparse matrix X,\n//! with the non-zero values set to one\ntemplate<typename T1>\ninline\nSpMat<typename T1::elem_type>\nspones(const SpBase<typename T1::elem_type, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  SpMat<eT> out( X.get_ref() );\n  \n  arrayops::inplace_set( access::rwp(out.values), eT(1), out.n_nonzero );\n  \n  return out;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_sprandn.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_sprandn\n//! @{\n\n\n\n//! Generate a sparse matrix with a randomly selected subset of the elements\n//! set to random values from a Gaussian distribution with zero mean and unit variance\ntemplate<typename obj_type>\ninline\nobj_type\nsprandn\n  (\n  const uword  n_rows,\n  const uword  n_cols,\n  const double density,\n  const typename arma_SpMat_SpCol_SpRow_only<obj_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  if(is_SpCol<obj_type>::value == true)\n    {\n    arma_debug_check( (n_cols != 1), \"sprandn(): incompatible size\" );\n    }\n  else\n  if(is_SpRow<obj_type>::value == true)\n    {\n    arma_debug_check( (n_rows != 1), \"sprandn(): incompatible size\" );\n    }\n  \n  obj_type out;\n  \n  out.sprandn(n_rows, n_cols, density);\n  \n  return out;\n  }\n\n\n\ninline\nsp_mat\nsprandn(const uword n_rows, const uword n_cols, const double density)\n  {\n  arma_extra_debug_sigprint();\n  \n  sp_mat out;\n  \n  out.sprandn(n_rows, n_cols, density);\n  \n  return out;\n  }\n\n\n\n//! Generate a sparse matrix with the non-zero values in the same locations as in the given sparse matrix X,\n//! with the non-zero values set to random values from a Gaussian distribution with zero mean and unit variance\ntemplate<typename T1>\ninline\nSpMat<typename T1::elem_type>\nsprandn(const SpBase<typename T1::elem_type, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  SpMat<eT> out( X.get_ref() );\n  \n  arma_rng::randn<eT>::fill( access::rwp(out.values), out.n_nonzero );\n  \n  return out;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_sprandu.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_sprandu\n//! @{\n\n\n\n//! Generate a sparse matrix with a randomly selected subset of the elements\n//! set to random values in the [0,1] interval (uniform distribution)\ntemplate<typename obj_type>\ninline\nobj_type\nsprandu\n  (\n  const uword  n_rows,\n  const uword  n_cols,\n  const double density,\n  const typename arma_SpMat_SpCol_SpRow_only<obj_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  if(is_SpCol<obj_type>::value == true)\n    {\n    arma_debug_check( (n_cols != 1), \"sprandu(): incompatible size\" );\n    }\n  else\n  if(is_SpRow<obj_type>::value == true)\n    {\n    arma_debug_check( (n_rows != 1), \"sprandu(): incompatible size\" );\n    }\n  \n  obj_type out;\n  \n  out.sprandu(n_rows, n_cols, density);\n  \n  return out;\n  }\n\n\n\ninline\nsp_mat\nsprandu(const uword n_rows, const uword n_cols, const double density)\n  {\n  arma_extra_debug_sigprint();\n  \n  sp_mat out;\n  \n  out.sprandu(n_rows, n_cols, density);\n  \n  return out;\n  }\n\n\n\n//! Generate a sparse matrix with the non-zero values in the same locations as in the given sparse matrix X,\n//! with the non-zero values set to random values in the [0,1] interval (uniform distribution)\ntemplate<typename T1>\ninline\nSpMat<typename T1::elem_type>\nsprandu(const SpBase<typename T1::elem_type, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  SpMat<eT> out( X.get_ref() );\n  \n  arma_rng::randu<eT>::fill( access::rwp(out.values), out.n_nonzero );\n  \n  return out;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_spsolve.hpp",
    "content": "// Copyright (C) 2015 Ryan Curtin\r\n// Copyright (C) 2015 Conrad Sanderson\r\n// \r\n// This Source Code Form is subject to the terms of the Mozilla Public\r\n// License, v. 2.0. If a copy of the MPL was not distributed with this\r\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\r\n\r\n\r\n//! \\addtogroup fn_spsolve\r\n//! @{\r\n\r\n//! Solve a system of linear equations, i.e., A*X = B, where X is unknown,\r\n//! A is sparse, and B is dense.  X will be dense too.\r\n\r\ntemplate<typename T1, typename T2>\r\ninline\r\nbool\r\nspsolve_helper\r\n  (\r\n           Mat<typename T1::elem_type>&     out,\r\n  const SpBase<typename T1::elem_type, T1>& A,\r\n  const   Base<typename T1::elem_type, T2>& B,\r\n  const char*                          solver,\r\n  const spsolve_opts_base&             settings,\r\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\r\n  )\r\n  {\r\n  arma_extra_debug_sigprint();\r\n  arma_ignore(junk);\r\n  \r\n  typedef typename T1::elem_type eT;\r\n  \r\n  const char sig = (solver != NULL) ? solver[0] : char(0);\r\n  \r\n  arma_debug_check( ((sig != 'l') && (sig != 's')), \"spsolve(): unknown solver\" );\r\n  \r\n  bool status = false;\r\n  \r\n  if(sig == 's')  // SuperLU solver\r\n    {\r\n    const superlu_opts& opts = (settings.id == 1) ? static_cast<const superlu_opts&>(settings) : superlu_opts();\r\n    \r\n    arma_debug_check( ( (opts.pivot_thresh < double(0)) || (opts.pivot_thresh > double(1)) ), \"spsolve(): pivot_thresh out of bounds\" );\r\n    \r\n    status = sp_auxlib::spsolve(out, A.get_ref(), B.get_ref(), opts);\r\n    }\r\n  else\r\n  if(sig == 'l')  // brutal LAPACK solver\r\n    {\r\n    arma_debug_warn( (settings.id != 0), \"spsolve(): ignoring settings not applicable to LAPACK based solver\" );\r\n    \r\n    Mat<eT> AA;\r\n    \r\n    bool conversion_ok = true;\r\n    \r\n    try\r\n      {\r\n      Mat<eT> tmp(A.get_ref());  // conversion from sparse to dense can throw std::bad_alloc\r\n      \r\n      AA.steal_mem(tmp);\r\n      }\r\n    catch(std::bad_alloc&)\r\n      {\r\n      conversion_ok = false;\r\n      \r\n      arma_debug_warn(true, \"spsolve(): not enough memory to use LAPACK based solver\");\r\n      }\r\n    \r\n    if(conversion_ok)\r\n      {\r\n      arma_debug_check( (AA.n_rows != AA.n_cols), \"spsolve(): matrix A must be square sized\" );\r\n      \r\n      status = auxlib::solve(out, AA, B.get_ref(), true);\r\n      }\r\n    }\r\n  \r\n  if(status == false)  { out.reset(); }\r\n  \r\n  return status;\r\n  }\r\n\r\n\r\n\r\ntemplate<typename T1, typename T2>\r\ninline\r\nbool\r\nspsolve\r\n  (\r\n           Mat<typename T1::elem_type>&     out,\r\n  const SpBase<typename T1::elem_type, T1>& A,\r\n  const   Base<typename T1::elem_type, T2>& B,\r\n  const char*                          solver   = \"superlu\",\r\n  const spsolve_opts_base&             settings = spsolve_opts_none(),\r\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\r\n  )\r\n  {\r\n  arma_extra_debug_sigprint();\r\n  arma_ignore(junk);\r\n  \r\n  const bool status = spsolve_helper(out, A.get_ref(), B.get_ref(), solver, settings);\r\n  \r\n  if(status == false)\r\n    {\r\n    arma_debug_warn(true, \"spsolve(): solution not found\");\r\n    }\r\n  \r\n  return status;\r\n  }\r\n\r\n\r\n\r\ntemplate<typename T1, typename T2>\r\ninline\r\nMat<typename T1::elem_type>\r\nspsolve\r\n  (\r\n  const SpBase<typename T1::elem_type, T1>& A,\r\n  const   Base<typename T1::elem_type, T2>& B,\r\n  const char*                          solver   = \"superlu\",\r\n  const spsolve_opts_base&             settings = spsolve_opts_none(),\r\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\r\n  )\r\n  {\r\n  arma_extra_debug_sigprint();\r\n  arma_ignore(junk);\r\n  \r\n  typedef typename T1::elem_type eT;\r\n  \r\n  Mat<eT> out;\r\n  \r\n  const bool status = spsolve_helper(out, A.get_ref(), B.get_ref(), solver, settings);\r\n  \r\n  if(status == false)\r\n    {\r\n    arma_bad(\"spsolve(): solution not found\");\r\n    }\r\n  \r\n  return out;\r\n  }\r\n\r\n\r\n\r\n//! @}\r\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_stddev.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_stddev\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nconst mtOp<typename T1::pod_type, T1, op_stddev>\nstddev\n  (\n  const T1& X,\n  const uword norm_type = 0,\n  const uword dim = 0,\n  const typename enable_if< is_arma_type<T1>::value       == true  >::result* junk1 = 0,\n  const typename enable_if< resolves_to_vector<T1>::value == false >::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return mtOp<typename T1::pod_type, T1, op_stddev>(X, norm_type, dim);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOp<typename T1::pod_type, T1, op_stddev>\nstddev\n  (\n  const T1& X,\n  const uword norm_type,\n  const uword dim,\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return mtOp<typename T1::pod_type, T1, op_stddev>(X, norm_type, dim);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::pod_type\nstddev\n  (\n  const T1& X,\n  const uword norm_type = 0,\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return std::sqrt( op_var::var_vec(X, norm_type) );\n  }\n\n\n\ntemplate<typename T>\narma_inline\narma_warn_unused\nconst typename arma_scalar_only<T>::result\nstddev(const T&)\n  {\n  return T(0);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_strans.hpp",
    "content": "// Copyright (C) 2011-2012 Conrad Sanderson\n// Copyright (C) 2011-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_strans\n//! @{\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_strans>\nstrans\n  (\n  const T1& X,\n  const typename enable_if< is_arma_type<T1>::value == true >::result* junk1 = 0,\n  const typename arma_cx_only<typename T1::elem_type>::result*         junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return Op<T1, op_strans>(X);\n  }\n\n\n\n// NOTE: for non-complex objects, deliberately returning op_htrans instead of op_strans,\n// NOTE: due to currently more optimisations available when using op_htrans, especially by glue_times\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_htrans>\nstrans\n  (\n  const T1& X,\n  const typename enable_if< is_arma_type<T1>::value == true >::result* junk1 = 0,\n  const typename arma_not_cx<typename T1::elem_type>::result*          junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return Op<T1, op_htrans>(X);\n  }\n\n\n\n//! two consecutive transpose operations cancel each other\ntemplate<typename T1>\narma_inline\nconst T1&\nstrans(const Op<T1, op_strans>& X)\n  {\n  arma_extra_debug_sigprint();\n  arma_extra_debug_print(\"strans(): removing op_strans\");\n  \n  return X.m;\n  }\n\n\n\n//\n// handling of sparse matrices\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_sparse_type<T1>::value,\n  const SpOp<T1,spop_strans>\n  >::result\nstrans(const T1& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpOp<T1,spop_strans>(x);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_sum.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_sum\n//! @{\n\n\n//! \\brief\n//! Delayed sum of elements of a matrix along a specified dimension (either rows or columns).\n//! The result is stored in a dense matrix that has either one column or one row.\n//! For dim = 0, find the sum of each column (traverse across rows)\n//! For dim = 1, find the sum of each row (traverse across columns)\n//! The default is dim = 0.\n//! NOTE: the dim argument is different than in Matlab/Octave.\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_sum>\nsum\n  (\n  const T1& X,\n  const uword dim = 0,\n  const typename enable_if< is_arma_type<T1>::value       == true  >::result* junk1 = 0,\n  const typename enable_if< resolves_to_vector<T1>::value == false >::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return Op<T1, op_sum>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_sum>\nsum\n  (\n  const T1& X,\n  const uword dim,\n  const typename enable_if< resolves_to_vector<T1>::value == true >::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return Op<T1, op_sum>(X, dim, 0);\n  }\n\n\n\n//! \\brief\n//! Immediate 'sum all values' operation for expressions which resolve to a vector \ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nsum\n  (\n  const T1& X,\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename enable_if< resolves_to_vector<T1>::value == true >::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return accu(X);\n  }\n\n\n\n//! \\brief\n//! Immediate 'sum all values' operation,\n//! invoked, for example, by: sum(sum(A))\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nsum(const Op<T1, op_sum>& in)\n  {\n  arma_extra_debug_sigprint();\n  arma_extra_debug_print(\"sum(): two consecutive sum() calls detected\");\n  \n  return accu(in.m);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<Op<T1, op_sum>, op_sum>\nsum(const Op<T1, op_sum>& in, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<Op<T1, op_sum>, op_sum>(in, dim, 0);\n  }\n\n\n\ntemplate<typename T>\narma_inline\narma_warn_unused\nconst typename arma_scalar_only<T>::result &\nsum(const T& x)\n  {\n  return x;\n  }\n\n\n\n//! sum of sparse object\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_sparse_type<T1>::value == true) && (resolves_to_sparse_vector<T1>::value == true),\n  typename T1::elem_type\n  >::result\nsum(const T1& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  // sum elements\n  return accu(x);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_sparse_type<T1>::value == true) && (resolves_to_sparse_vector<T1>::value == false),\n  const SpOp<T1,spop_sum>\n  >::result\nsum(const T1& x, const uword dim = 0)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpOp<T1,spop_sum>(x, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::elem_type\nsum(const SpOp<T1, spop_sum>& in)\n  {\n  arma_extra_debug_sigprint();\n  arma_extra_debug_print(\"sum(): two consecutive sum() calls detected\");\n  \n  return accu(in.m);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst SpOp<SpOp<T1, spop_sum>, spop_sum>\nsum(const SpOp<T1, spop_sum>& in, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpOp<SpOp<T1, spop_sum>, spop_sum>(in, dim, 0);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_svd.hpp",
    "content": "// Copyright (C) 2009-2013 Conrad Sanderson\n// Copyright (C) 2009-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_svd\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nbool\nsvd\n  (\n         Col<typename T1::pod_type>&     S,\n  const Base<typename T1::elem_type,T1>& X,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  // it doesn't matter if X is an alias of S, as auxlib::svd() makes a copy of X\n  \n  const bool status = auxlib::svd_dc(S, X);\n  \n  if(status == false)\n    {\n    S.reset();\n    arma_bad(\"svd(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\ntemplate<typename T1>\ninline\nCol<typename T1::pod_type>\nsvd\n  (\n  const Base<typename T1::elem_type,T1>& X,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  Col<typename T1::pod_type> out;\n  \n  const bool status = auxlib::svd_dc(out, X);\n  \n  if(status == false)\n    {\n    out.reset();\n    arma_bad(\"svd(): failed to converge\");\n    }\n  \n  return out;\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\nsvd\n  (\n         Mat<typename T1::elem_type>&    U,\n         Col<typename T1::pod_type >&    S,\n         Mat<typename T1::elem_type>&    V,\n  const Base<typename T1::elem_type,T1>& X,\n  const char*                            method = \"dc\",\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  arma_debug_check\n    (\n    ( ((void*)(&U) == (void*)(&S)) || (&U == &V) || ((void*)(&S) == (void*)(&V)) ),\n    \"svd(): two or more output objects are the same object\"\n    );\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'd')), \"svd(): unknown method specified\" );\n  \n  // auxlib::svd() makes an internal copy of X\n  const bool status = (sig == 'd') ? auxlib::svd_dc(U, S, V, X) : auxlib::svd(U, S, V, X);\n  \n  if(status == false)\n    {\n    U.reset();\n    S.reset();\n    V.reset();\n    arma_bad(\"svd(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\nsvd_econ\n  (\n         Mat<typename T1::elem_type>&    U,\n         Col<typename T1::pod_type >&    S,\n         Mat<typename T1::elem_type>&    V,\n  const Base<typename T1::elem_type,T1>& X,\n  const char                             mode,\n  const char*                            method = \"dc\",\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  arma_debug_check\n    (\n    ( ((void*)(&U) == (void*)(&S)) || (&U == &V) || ((void*)(&S) == (void*)(&V)) ),\n    \"svd_econ(): two or more output objects are the same object\"\n    );\n  \n  arma_debug_check\n    (\n    ( (mode != 'l') && (mode != 'r') && (mode != 'b') ),\n    \"svd_econ(): parameter 'mode' or 'side' is incorrect\"\n    );\n  \n  const char sig = (method != NULL) ? method[0] : char(0);\n  \n  arma_debug_check( ((sig != 's') && (sig != 'd')), \"svd_econ(): unknown method specified\" );\n  \n  const bool status = ((mode == 'b') && (sig == 'd')) ? auxlib::svd_dc_econ(U, S, V, X) : auxlib::svd_econ(U, S, V, X, mode);\n  \n  if(status == false)\n    {\n    U.reset();\n    S.reset();\n    V.reset();\n    arma_bad(\"svd_econ(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\nsvd_econ\n  (\n         Mat<typename T1::elem_type>&    U,\n         Col<typename T1::pod_type >&    S,\n         Mat<typename T1::elem_type>&    V,\n  const Base<typename T1::elem_type,T1>& X,\n  const char*                            side   = \"both\",\n  const char*                            method = \"dc\",\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return svd_econ(U, S, V, X, ((side != NULL) ? side[0] : char(0)), method);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_svds.hpp",
    "content": "// Copyright (C) 2015 Conrad Sanderson\n// Copyright (C) 2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_svds\n//! @{\n\n\ntemplate<typename T1>\ninline\nbool\nsvds_helper\n  (\n           Mat<typename T1::elem_type>&    U,\n           Col<typename T1::pod_type >&    S,\n           Mat<typename T1::elem_type>&    V,\n  const SpBase<typename T1::elem_type,T1>& X,\n  const uword                              k,\n  const typename T1::pod_type              tol,\n  const bool                               calc_UV,\n  const typename arma_real_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  typedef typename T1::pod_type   T;\n  \n  if(arma_config::arpack == false)\n    {\n    arma_stop(\"svds(): use of ARPACK needs to be enabled\");\n    return false;\n    }\n  \n  arma_debug_check\n    (\n    ( ((void*)(&U) == (void*)(&S)) || (&U == &V) || ((void*)(&S) == (void*)(&V)) ),\n    \"svds(): two or more output objects are the same object\"\n    );\n  \n  arma_debug_check( (tol < T(0)), \"svds(): tol must be >= 0\" );\n  \n  const unwrap_spmat<T1> tmp(X.get_ref());\n  const SpMat<eT>& A =   tmp.M;\n  \n  const uword kk = (std::min)( (std::min)(A.n_rows, A.n_cols), k );\n  \n  const T A_max = (A.n_nonzero > 0) ? T(max(abs(Col<eT>(const_cast<eT*>(A.values), A.n_nonzero, false)))) : T(0);\n  \n  if(A_max == T(0))\n    {\n    // TODO: use reset instead ?\n    S.zeros(kk);\n    \n    if(calc_UV)\n      {\n      U.eye(A.n_rows, kk);\n      V.eye(A.n_cols, kk);\n      }\n    }\n  else\n    {\n    SpMat<eT> C( (A.n_rows + A.n_cols), (A.n_rows + A.n_cols) );\n    \n    SpMat<eT> B  = A / A_max;\n    SpMat<eT> Bt = B.t();\n    \n    C(0, A.n_rows, size(B) ) = B;\n    C(A.n_rows, 0, size(Bt)) = Bt;\n    \n    Bt.reset();\n    B.reset();\n    \n    Col<eT> eigval;\n    Mat<eT> eigvec;\n    \n    const bool status = sp_auxlib::eigs_sym(eigval, eigvec, C, kk, \"la\", (tol / Datum<T>::sqrt2));\n    \n    if(status == false)\n      {\n      U.reset();\n      S.reset();\n      V.reset();\n      \n      return false;\n      }\n    \n    const T A_norm = max(eigval);\n    \n    const T tol2 = tol / Datum<T>::sqrt2 * A_norm;\n    \n    uvec indices = find(eigval > tol2);\n    \n    if(indices.n_elem > kk)\n      {\n      indices = indices.subvec(0,kk-1);\n      }\n    else\n    if(indices.n_elem < kk)\n      {\n      const uvec indices2 = find(abs(eigval) <= tol2);\n      \n      const uword N_extra = (std::min)( indices2.n_elem, (kk - indices.n_elem) );\n      \n      if(N_extra > 0)  { indices = join_cols(indices, indices2.subvec(0,N_extra-1)); }\n      }\n    \n    const uvec sorted_indices = sort_index(eigval, \"descend\");\n    \n    S = eigval.elem(sorted_indices);  S *= A_max;\n    \n    if(calc_UV)\n      {\n      uvec U_row_indices(A.n_rows);  for(uword i=0; i < A.n_rows; ++i)  { U_row_indices[i] = i;            }\n      uvec V_row_indices(A.n_cols);  for(uword i=0; i < A.n_cols; ++i)  { V_row_indices[i] = i + A.n_rows; }\n      \n      U = Datum<T>::sqrt2 * eigvec(U_row_indices, sorted_indices);\n      V = Datum<T>::sqrt2 * eigvec(V_row_indices, sorted_indices);\n      }\n    }\n  \n  arma_debug_warn( (S.n_elem < k), \"svds(): warning: found fewer singular values than specified\" );\n  \n  return true;\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\nsvds_helper\n  (\n           Mat<typename T1::elem_type>&    U,\n           Col<typename T1::pod_type >&    S,\n           Mat<typename T1::elem_type>&    V,\n  const SpBase<typename T1::elem_type,T1>& X,\n  const uword                              k,\n  const typename T1::pod_type              tol,\n  const bool                               calc_UV,\n  const typename arma_cx_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  typedef typename T1::pod_type   T;\n  \n  if(arma_config::arpack == false)\n    {\n    arma_stop(\"svds(): use of ARPACK needs to be enabled\");\n    return false;\n    }\n  \n  arma_debug_check\n    (\n    ( ((void*)(&U) == (void*)(&S)) || (&U == &V) || ((void*)(&S) == (void*)(&V)) ),\n    \"svds(): two or more output objects are the same object\"\n    );\n  \n  arma_debug_check( (tol < T(0)), \"svds(): tol must be >= 0\" );\n  \n  const unwrap_spmat<T1> tmp(X.get_ref());\n  const SpMat<eT>& A =   tmp.M;\n  \n  const uword kk = (std::min)( (std::min)(A.n_rows, A.n_cols), k );\n  \n  const T A_max = (A.n_nonzero > 0) ? T(max(abs(Col<eT>(const_cast<eT*>(A.values), A.n_nonzero, false)))) : T(0);\n  \n  if(A_max == T(0))\n    {\n    // TODO: use reset instead ?\n    S.zeros(kk);\n    \n    if(calc_UV)\n      {\n      U.eye(A.n_rows, kk);\n      V.eye(A.n_cols, kk);\n      }\n    }\n  else\n    {\n    SpMat<eT> C( (A.n_rows + A.n_cols), (A.n_rows + A.n_cols) );\n    \n    SpMat<eT> B  = A / A_max;\n    SpMat<eT> Bt = B.t();\n    \n    C(0, A.n_rows, size(B) ) = B;\n    C(A.n_rows, 0, size(Bt)) = Bt;\n    \n    Bt.reset();\n    B.reset();\n    \n    Col<eT> eigval_tmp;\n    Mat<eT> eigvec;\n    \n    const bool status = sp_auxlib::eigs_gen(eigval_tmp, eigvec, C, kk, \"lr\", (tol / Datum<T>::sqrt2));\n    \n    if(status == false)\n      {\n      U.reset();\n      S.reset();\n      V.reset();\n      arma_bad(\"svds(): failed to converge\", false);\n      \n      return false;\n      }\n    \n    const Col<T> eigval = real(eigval_tmp);\n    \n    const T A_norm = max(eigval);\n    \n    const T tol2 = tol / Datum<T>::sqrt2 * A_norm;\n    \n    uvec indices = find(eigval > tol2);\n    \n    if(indices.n_elem > kk)\n      {\n      indices = indices.subvec(0,kk-1);\n      }\n    else\n    if(indices.n_elem < kk)\n      {\n      const uvec indices2 = find(abs(eigval) <= tol2);\n      \n      const uword N_extra = (std::min)( indices2.n_elem, (kk - indices.n_elem) );\n      \n      if(N_extra > 0)  { indices = join_cols(indices, indices2.subvec(0,N_extra-1)); }\n      }\n    \n    const uvec sorted_indices = sort_index(eigval, \"descend\");\n    \n    S = eigval.elem(sorted_indices);  S *= A_max;\n    \n    if(calc_UV)\n      {\n      uvec U_row_indices(A.n_rows);  for(uword i=0; i < A.n_rows; ++i)  { U_row_indices[i] = i;            }\n      uvec V_row_indices(A.n_cols);  for(uword i=0; i < A.n_cols; ++i)  { V_row_indices[i] = i + A.n_rows; }\n      \n      U = Datum<T>::sqrt2 * eigvec(U_row_indices, sorted_indices);\n      V = Datum<T>::sqrt2 * eigvec(V_row_indices, sorted_indices);\n      }\n    }\n  \n  arma_debug_warn( (S.n_elem < k), \"svds(): warning: found fewer singular values than specified\" );\n  \n  return true;\n  }\n\n\n\n//! find the k largest singular values and corresponding singular vectors of sparse matrix X\ntemplate<typename T1>\ninline\nbool\nsvds\n  (\n           Mat<typename T1::elem_type>&    U,\n           Col<typename T1::pod_type >&    S,\n           Mat<typename T1::elem_type>&    V,\n  const SpBase<typename T1::elem_type,T1>& X,\n  const uword                              k,\n  const typename T1::pod_type              tol  = 0.0,\n  const typename arma_real_or_cx_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const bool status = svds_helper(U, S, V, X.get_ref(), k, tol, true);\n  \n  if(status == false)\n    {\n    arma_bad(\"svds(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! find the k largest singular values of sparse matrix X\ntemplate<typename T1>\ninline\nbool\nsvds\n  (\n           Col<typename T1::pod_type >&    S,\n  const SpBase<typename T1::elem_type,T1>& X,\n  const uword                              k,\n  const typename T1::pod_type              tol  = 0.0,\n  const typename arma_real_or_cx_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  Mat<typename T1::elem_type> U;\n  Mat<typename T1::elem_type> V;\n  \n  const bool status = svds_helper(U, S, V, X.get_ref(), k, tol, false);\n\n  if(status == false)\n    {\n    arma_bad(\"svds(): failed to converge\", false);\n    }\n  \n  return status;\n  }\n\n\n\n//! find the k largest singular values of sparse matrix X\ntemplate<typename T1>\ninline\nCol<typename T1::pod_type>\nsvds\n  (\n  const SpBase<typename T1::elem_type,T1>& X,\n  const uword                              k,\n  const typename T1::pod_type              tol  = 0.0,\n  const typename arma_real_or_cx_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  Col<typename T1::pod_type>  S;\n\n  Mat<typename T1::elem_type> U;\n  Mat<typename T1::elem_type> V;\n  \n  const bool status = svds_helper(U, S, V, X.get_ref(), k, tol, false);\n  \n  if(status == false)\n    {\n    arma_bad(\"svds(): failed to converge\", true);\n    }\n  \n  return S;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_syl_lyap.hpp",
    "content": "// Copyright (C) 2011-2012 Conrad Sanderson\n// Copyright (C) 2011-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_syl_lyap\n//! @{\n\n\n//! find the solution of the Sylvester equation AX + XB = C\ntemplate<typename T1, typename T2, typename T3>\ninline\nbool\nsyl\n  (\n        Mat <typename T1::elem_type>   & out,\n  const Base<typename T1::elem_type,T1>& in_A,\n  const Base<typename T1::elem_type,T2>& in_B,\n  const Base<typename T1::elem_type,T3>& in_C,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_check<T1> tmp_A(in_A.get_ref(), out);\n  const unwrap_check<T2> tmp_B(in_B.get_ref(), out);\n  const unwrap_check<T3> tmp_C(in_C.get_ref(), out);\n  \n  const Mat<eT>& A = tmp_A.M;\n  const Mat<eT>& B = tmp_B.M;\n  const Mat<eT>& C = tmp_C.M;\n  \n  const bool status = auxlib::syl(out, A, B, C);\n  \n  if(status == false)\n    {\n    out.reset();\n    arma_bad(\"syl(): equation appears to be singular\", false);\n    }\n  \n  return status;\n  }\n\n\n\ntemplate<typename T1, typename T2, typename T3>\ninline\nMat<typename T1::elem_type>\nsyl\n  (\n  const Base<typename T1::elem_type,T1>& in_A,\n  const Base<typename T1::elem_type,T2>& in_B,\n  const Base<typename T1::elem_type,T3>& in_C,\n  const typename arma_blas_type_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1> tmp_A( in_A.get_ref() );\n  const unwrap<T2> tmp_B( in_B.get_ref() );\n  const unwrap<T3> tmp_C( in_C.get_ref() );\n  \n  const Mat<eT>& A = tmp_A.M;\n  const Mat<eT>& B = tmp_B.M;\n  const Mat<eT>& C = tmp_C.M;\n  \n  Mat<eT> out;\n  \n  const bool status = auxlib::syl(out, A, B, C);\n  \n  if(status == false)\n    {\n    out.reset();\n    arma_bad(\"syl(): equation appears to be singular\");\n    }\n  \n  return out;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_symmat.hpp",
    "content": "// Copyright (C) 2011-2014 Conrad Sanderson\n// Copyright (C) 2011-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_symmat\n//! @{\n\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_cx<typename T1::elem_type>::no, const Op<T1, op_symmat> >::result\nsymmatu(const Base<typename T1::elem_type,T1>& X, const bool do_conj = false)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(do_conj);\n  \n  return Op<T1, op_symmat>(X.get_ref(), 0, 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_cx<typename T1::elem_type>::no, const Op<T1, op_symmat> >::result\nsymmatl(const Base<typename T1::elem_type,T1>& X, const bool do_conj = false)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(do_conj);\n  \n  return Op<T1, op_symmat>(X.get_ref(), 1, 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_cx<typename T1::elem_type>::yes, const Op<T1, op_symmat_cx> >::result\nsymmatu(const Base<typename T1::elem_type,T1>& X, const bool do_conj = true)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_symmat_cx>(X.get_ref(), 0, (do_conj ? 1 : 0));\n  }\n\n\n\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_cx<typename T1::elem_type>::yes, const Op<T1, op_symmat_cx> >::result\nsymmatl(const Base<typename T1::elem_type,T1>& X, const bool do_conj = true)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_symmat_cx>(X.get_ref(), 1, (do_conj ? 1 : 0));\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_toeplitz.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_toeplitz\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nOp<T1, op_toeplitz>\ntoeplitz(const Base<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_toeplitz>( X.get_ref() );\n  }\n\n\n\ntemplate<typename T1>\ninline\nOp<T1, op_toeplitz_c>\ncirc_toeplitz(const Base<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_toeplitz_c>( X.get_ref() );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nGlue<T1, T2, glue_toeplitz>\ntoeplitz(const Base<typename T1::elem_type,T1>& X, const Base<typename T1::elem_type,T2>& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Glue<T1, T2, glue_toeplitz>( X.get_ref(), Y.get_ref() );\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_trace.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2012 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_trace\n//! @{\n\n\n//! Immediate trace (sum of diagonal elements) of a square dense matrix\ntemplate<typename T1>\narma_hot\narma_warn_unused\ninline\ntypename enable_if2<is_arma_type<T1>::value, typename T1::elem_type>::result\ntrace(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> A(X);\n  \n  arma_debug_check( (A.get_n_rows() != A.get_n_cols()), \"trace(): matrix must be square sized\" );\n  \n  const uword N = A.get_n_rows();\n  \n  eT val1 = eT(0);\n  eT val2 = eT(0);\n  \n  uword i,j;\n  for(i=0, j=1; j<N; i+=2, j+=2)\n    {\n    val1 += A.at(i,i);\n    val2 += A.at(j,j);\n    }\n  \n  if(i < N)\n    {\n    val1 += A.at(i,i);\n    }\n  \n  return val1 + val2;\n  }\n\n\n\ntemplate<typename T1>\narma_hot\narma_warn_unused\ninline\ntypename T1::elem_type\ntrace(const Op<T1, op_diagmat>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const diagmat_proxy<T1> A(X.m);\n  \n  const uword N = A.n_elem;\n  \n  eT val = eT(0);\n  \n  for(uword i=0; i<N; ++i)\n    {\n    val += A[i];\n    }\n  \n  return val;\n  }\n\n\n\n//! speedup for trace(A*B), where the result of A*B is a square sized matrix\ntemplate<typename T1, typename T2>\narma_hot\ninline\ntypename T1::elem_type\ntrace_mul_unwrap(const T1& XA, const T2& XB)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1>    PA(XA);\n  const unwrap<T2> tmpB(XB);\n  \n  const Mat<eT>& B = tmpB.M;\n  \n  arma_debug_assert_mul_size(PA.get_n_rows(), PA.get_n_cols(), B.n_rows, B.n_cols, \"matrix multiplication\");\n  \n  arma_debug_check( (PA.get_n_rows() != B.n_cols), \"trace(): matrix must be square sized\" );\n  \n  const uword N1 = PA.get_n_rows();   // equivalent to B.n_cols, due to square size requirements\n  const uword N2 = PA.get_n_cols();   // equivalent to B.n_rows, due to matrix multiplication requirements\n  \n  eT val = eT(0);\n  \n  for(uword i=0; i<N1; ++i)\n    {\n    const eT* B_colmem = B.colptr(i);\n    \n    eT acc1 = eT(0);\n    eT acc2 = eT(0);\n    \n    uword j,k;\n    for(j=0, k=1; k < N2; j+=2, k+=2)\n      {\n      const eT tmp_j = B_colmem[j];\n      const eT tmp_k = B_colmem[k];\n      \n      acc1 += PA.at(i,j) * tmp_j;\n      acc2 += PA.at(i,k) * tmp_k;\n      }\n    \n    if(j < N2)\n      {\n      acc1 += PA.at(i,j) * B_colmem[j];\n      }\n    \n    val += (acc1 + acc2);\n    }\n  \n  return val;\n  }\n\n\n\n//! speedup for trace(A*B), where the result of A*B is a square sized matrix\ntemplate<typename T1, typename T2>\narma_hot\ninline\ntypename T1::elem_type\ntrace_mul_proxy(const T1& XA, const T2& XB)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> PA(XA);\n  const Proxy<T2> PB(XB);\n  \n  if(is_Mat<typename Proxy<T2>::stored_type>::value == true)\n    {\n    return trace_mul_unwrap(PA.Q, PB.Q);\n    }\n  \n  arma_debug_assert_mul_size(PA.get_n_rows(), PA.get_n_cols(), PB.get_n_rows(), PB.get_n_cols(), \"matrix multiplication\");\n  \n  arma_debug_check( (PA.get_n_rows() != PB.get_n_cols()), \"trace(): matrix must be square sized\" );\n  \n  const uword N1 = PA.get_n_rows();   // equivalent to PB.get_n_cols(), due to square size requirements\n  const uword N2 = PA.get_n_cols();   // equivalent to PB.get_n_rows(), due to matrix multiplication requirements\n  \n  eT val = eT(0);\n  \n  for(uword i=0; i<N1; ++i)\n    {\n    eT acc1 = eT(0);\n    eT acc2 = eT(0);\n    \n    uword j,k;\n    for(j=0, k=1; k < N2; j+=2, k+=2)\n      {\n      const eT tmp_j = PB.at(j,i);\n      const eT tmp_k = PB.at(k,i);\n      \n      acc1 += PA.at(i,j) * tmp_j;\n      acc2 += PA.at(i,k) * tmp_k;\n      }\n    \n    if(j < N2)\n      {\n      acc1 += PA.at(i,j) * PB.at(j,i);\n      }\n    \n    val += (acc1 + acc2);\n    }\n  \n  return val;\n  }\n\n\n\n//! speedup for trace(A*B), where the result of A*B is a square sized matrix\ntemplate<typename T1, typename T2>\narma_hot\narma_warn_unused\ninline\ntypename T1::elem_type\ntrace(const Glue<T1, T2, glue_times>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (is_Mat<T2>::value) ? trace_mul_unwrap(X.A, X.B) : trace_mul_proxy(X.A, X.B);\n  }\n\n\n\n//! trace of sparse object\ntemplate<typename T1>\narma_hot\narma_warn_unused\ninline\ntypename enable_if2<is_arma_sparse_type<T1>::value, typename T1::elem_type>::result\ntrace(const T1& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> p(x);\n  \n  arma_debug_check( (p.get_n_rows() != p.get_n_cols()), \"trace(): matrix must be square sized\" );\n  \n  typedef typename T1::elem_type eT;\n  \n  eT result = eT(0);\n  \n  typename SpProxy<T1>::const_iterator_type it     = p.begin();\n  typename SpProxy<T1>::const_iterator_type it_end = p.end();\n  \n  while(it != it_end)\n    {\n    if(it.row() == it.col())\n      {\n      result += (*it);\n      }\n    \n    ++it;\n    }\n  \n  return result;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_trans.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_trans\n//! @{\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_htrans>\ntrans\n  (\n  const T1& X,\n  const typename enable_if< is_arma_type<T1>::value == true >::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return Op<T1, op_htrans>(X);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_htrans>\nhtrans\n  (\n  const T1& X,\n  const typename enable_if< is_arma_type<T1>::value == true >::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return Op<T1, op_htrans>(X);\n  }\n\n\n\n//! two consecutive transpose operations cancel each other\ntemplate<typename T1>\narma_inline\nconst T1&\ntrans(const Op<T1, op_htrans>& X)\n  {\n  arma_extra_debug_sigprint();\n  arma_extra_debug_print(\"trans(): removing op_htrans\");\n  \n  return X.m;\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst T1&\nhtrans(const Op<T1, op_htrans>& X)\n  {\n  arma_extra_debug_sigprint();\n  arma_extra_debug_print(\"htrans(): removing op_htrans\");\n  \n  return X.m;\n  }\n\n\n\n//\n// handling of sparse matrices\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_sparse_type<T1>::value,\n  const SpOp<T1,spop_strans>\n  >::result\ntrans\n  (\n  const T1& x,\n  const typename arma_not_cx<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return SpOp<T1,spop_strans>(x);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_sparse_type<T1>::value,\n  const SpOp<T1,spop_htrans>\n  >::result\ntrans\n  (\n  const T1& x,\n  const typename arma_cx_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return SpOp<T1,spop_htrans>(x);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_sparse_type<T1>::value,\n  const SpOp<T1,spop_strans>\n  >::result\nhtrans\n  (\n  const T1& x,\n  const typename arma_not_cx<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return SpOp<T1,spop_strans>(x);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_sparse_type<T1>::value,\n  const SpOp<T1,spop_htrans>\n  >::result\nhtrans\n  (\n  const T1& x,\n  const typename arma_cx_only<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return SpOp<T1,spop_htrans>(x);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_trig.hpp",
    "content": "// Copyright (C) 2009-2010 Conrad Sanderson\n// Copyright (C) 2009-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_trig\n//! @{\n\n//\n// trigonometric functions:\n// cos family: cos, acos, cosh, acosh\n// sin family: sin, asin, sinh, asinh\n// tan family: tan, atan, tanh, atanh\n\n\n//\n// cos\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_cos>\ncos(const Base<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_cos>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_cos>\ncos(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_cos>(A.get_ref());\n  }\n\n\n\n//\n// acos\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_acos>\nacos(const Base<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_acos>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_acos>\nacos(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_acos>(A.get_ref());\n  }\n\n\n\n//\n// cosh\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_cosh>\ncosh(const Base<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_cosh>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_cosh>\ncosh(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_cosh>(A.get_ref());\n  }\n\n\n\n//\n// acosh\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_acosh>\nacosh(const Base<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_acosh>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_acosh>\nacosh(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_acosh>(A.get_ref());\n  }\n\n\n\n//\n// sin\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_sin>\nsin(const Base<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_sin>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_sin>\nsin(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_sin>(A.get_ref());\n  }\n\n\n\n//\n// asin\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_asin>\nasin(const Base<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_asin>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_asin>\nasin(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_asin>(A.get_ref());\n  }\n\n\n\n//\n// sinh\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_sinh>\nsinh(const Base<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_sinh>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_sinh>\nsinh(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_sinh>(A.get_ref());\n  }\n\n\n\n//\n// asinh\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_asinh>\nasinh(const Base<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_asinh>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_asinh>\nasinh(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_asinh>(A.get_ref());\n  }\n\n\n\n//\n// tan\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_tan>\ntan(const Base<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_tan>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_tan>\ntan(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_tan>(A.get_ref());\n  }\n\n\n\n//\n// atan\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_atan>\natan(const Base<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_atan>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_atan>\natan(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_atan>(A.get_ref());\n  }\n\n\n\n//\n// tanh\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_tanh>\ntanh(const Base<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_tanh>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_tanh>\ntanh(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_tanh>(A.get_ref());\n  }\n\n\n\n//\n// atanh\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_atanh>\natanh(const Base<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_atanh>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_atanh>\natanh(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_atanh>(A.get_ref());\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_trimat.hpp",
    "content": "// Copyright (C) 2010 Conrad Sanderson\n// Copyright (C) 2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_trimat\n//! @{\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_trimat>\ntrimatu(const Base<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_trimat>(X.get_ref(), 0, 0);\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_trimat>\ntrimatl(const Base<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_trimat>(X.get_ref(), 1, 0);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_trunc_exp.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup fn_trunc_exp\n//! @{\n\n\n\ntemplate<typename eT>\ninline\nstatic\ntypename arma_real_only<eT>::result\ntrunc_exp(const eT x)\n  {\n  if(std::numeric_limits<eT>::is_iec559 && (x >= Math<eT>::log_max() ))\n    {\n    return std::numeric_limits<eT>::max();\n    }\n  else\n    {\n    return std::exp(x);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nstatic\ntypename arma_integral_only<eT>::result\ntrunc_exp(const eT x)\n  {\n  return eT( trunc_exp( double(x) ) );\n  }\n\n\n\ntemplate<typename T>\ninline\nstatic\nstd::complex<T>\ntrunc_exp(const std::complex<T>& x)\n  {\n  return std::polar( trunc_exp( x.real() ), x.imag() );\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_trunc_exp>\ntrunc_exp(const Base<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_trunc_exp>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_trunc_exp>\ntrunc_exp(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_trunc_exp>(A.get_ref());\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_trunc_log.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_trunc_log\n//! @{\n\n\n\ntemplate<typename eT>\ninline\nstatic\ntypename arma_real_only<eT>::result\ntrunc_log(const eT x)\n  {\n  if(std::numeric_limits<eT>::is_iec559)\n    {\n    if(x == std::numeric_limits<eT>::infinity())\n      {\n      return Math<eT>::log_max();\n      }\n    else\n      {\n      return (x <= eT(0)) ? Math<eT>::log_min() : std::log(x);\n      }\n    }\n  else\n    {\n    return std::log(x);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nstatic\ntypename arma_integral_only<eT>::result\ntrunc_log(const eT x)\n  {\n  return eT( trunc_log( double(x) ) );\n  }\n\n\n\ntemplate<typename T>\ninline\nstatic\nstd::complex<T>\ntrunc_log(const std::complex<T>& x)\n  {\n  return std::complex<T>( trunc_log( std::abs(x) ), std::arg(x) );\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOp<T1, eop_trunc_log>\ntrunc_log(const Base<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_trunc_log>(A.get_ref());\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_trunc_log>\ntrunc_log(const BaseCube<typename T1::elem_type,T1>& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_trunc_log>(A.get_ref());\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_unique.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// Copyright (C) 2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2012 Arnold Wiliem\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\ntemplate<typename T1>\ninline\nconst Op<T1,op_unique>\nunique\n  (\n  const Base<typename T1::elem_type,T1>& A,\n  const typename arma_not_cx<typename T1::elem_type>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return Op<T1,op_unique>( A.get_ref() );\n  }\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_var.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_var\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nconst mtOp<typename T1::pod_type, T1, op_var>\nvar\n  (\n  const T1& X,\n  const uword norm_type = 0,\n  const uword dim = 0,\n  const typename enable_if< is_arma_type<T1>::value       == true  >::result* junk1 = 0,\n  const typename enable_if< resolves_to_vector<T1>::value == false >::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return mtOp<typename T1::pod_type, T1, op_var>(X, norm_type, dim);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOp<typename T1::pod_type, T1, op_var>\nvar\n  (\n  const T1& X,\n  const uword norm_type,\n  const uword dim,\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return mtOp<typename T1::pod_type, T1, op_var>(X, norm_type, dim);\n  }\n\n\n\ntemplate<typename T1>\ninline\narma_warn_unused\ntypename T1::pod_type\nvar\n  (\n  const T1& X,\n  const uword norm_type = 0,\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename enable_if<resolves_to_vector<T1>::value == true>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  return op_var::var_vec( X, norm_type );\n  }\n\n\n\ntemplate<typename T>\narma_inline\narma_warn_unused\nconst typename arma_scalar_only<T>::result\nvar(const T&)\n  {\n  return T(0);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtSpOp<typename T1::pod_type, T1, spop_var>\nvar\n  (\n  const T1& X,\n  const uword norm_type = 0,\n  const uword dim = 0,\n  const typename enable_if< is_arma_sparse_type<T1>::value       == true  >::result* junk1 = 0,\n  const typename enable_if< resolves_to_sparse_vector<T1>::value == false >::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n\n  return mtSpOp<typename T1::pod_type, T1, spop_var>(X, norm_type, dim);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtSpOp<typename T1::pod_type, T1, spop_var>\nvar\n  (\n  const T1& X,\n  const uword norm_type,\n  const uword dim = 0,\n  const typename enable_if<resolves_to_sparse_vector<T1>::value == true>::result* junk1 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n\n  return mtSpOp<typename T1::pod_type, T1, spop_var>(X, norm_type, dim);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::pod_type\nvar\n  (\n  const T1& X,\n  const uword norm_type = 0,\n  const arma_empty_class junk1 = arma_empty_class(),\n  const typename enable_if<resolves_to_sparse_vector<T1>::value == true>::result* junk2 = 0\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n\n  return spop_var::var_vec(X, norm_type);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_vectorise.hpp",
    "content": "// Copyright (C) 2013-2014 Conrad Sanderson\n// Copyright (C) 2013-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_vectorise\n//! @{\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value,\n  const Op<T1, op_vectorise_col>\n  >::result\nvectorise(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_vectorise_col>(X);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value,\n  const Op<T1, op_vectorise_all>\n  >::result\nvectorise(const T1& X, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (dim > 1), \"vectorise(): parameter 'dim' must be 0 or 1\" );\n  \n  return Op<T1, op_vectorise_all>(X, dim, 0);\n  }\n\n\n\ntemplate<typename T1>\ninline\nCol<typename T1::elem_type>\nvectorise(const BaseCube<typename T1::elem_type, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Col<typename T1::elem_type> out;\n  \n  op_vectorise_cube_col::apply(out, X);\n  \n  return out;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/fn_zeros.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup fn_zeros\n//! @{\n\n\n//! Generate a vector with all elements set to zero\narma_inline\nconst Gen<vec, gen_zeros>\nzeros(const uword n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Gen<vec, gen_zeros>(n_elem, 1);\n  }\n\n\n\ntemplate<typename obj_type>\narma_inline\nconst Gen<obj_type, gen_zeros>\nzeros(const uword n_elem, const arma_empty_class junk1 = arma_empty_class(), const typename arma_Mat_Col_Row_only<obj_type>::result* junk2 = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  if(is_Row<obj_type>::value == true)\n    {\n    return Gen<obj_type, gen_zeros>(1, n_elem);\n    }\n  else\n    {\n    return Gen<obj_type, gen_zeros>(n_elem, 1);\n    }\n  }\n\n\n\n//! Generate a dense matrix with all elements set to zero\narma_inline\nconst Gen<mat, gen_zeros>\nzeros(const uword n_rows, const uword n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Gen<mat, gen_zeros>(n_rows, n_cols);\n  }\n\n\n\ntemplate<typename obj_type>\narma_inline\nconst Gen<obj_type, gen_zeros>\nzeros(const uword n_rows, const uword n_cols, const typename arma_Mat_Col_Row_only<obj_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  if(is_Col<obj_type>::value == true)\n    {\n    arma_debug_check( (n_cols != 1), \"zeros(): incompatible size\" );\n    }\n  else\n  if(is_Row<obj_type>::value == true)\n    {\n    arma_debug_check( (n_rows != 1), \"zeros(): incompatible size\" );\n    }\n  \n  return Gen<obj_type, gen_zeros>(n_rows, n_cols);\n  }\n\n\n\narma_inline\nconst GenCube<cube::elem_type, gen_zeros>\nzeros(const uword n_rows, const uword n_cols, const uword n_slices)\n  {\n  arma_extra_debug_sigprint();\n  \n  return GenCube<cube::elem_type, gen_zeros>(n_rows, n_cols, n_slices);\n  }\n\n\n\ntemplate<typename cube_type>\narma_inline\nconst GenCube<typename cube_type::elem_type, gen_zeros>\nzeros(const uword n_rows, const uword n_cols, const uword n_slices, const typename arma_Cube_only<cube_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  return GenCube<typename cube_type::elem_type, gen_zeros>(n_rows, n_cols, n_slices);\n  }\n\n\n\ntemplate<typename sp_obj_type>\ninline\nsp_obj_type\nzeros(const uword n_rows, const uword n_cols, const typename arma_SpMat_SpCol_SpRow_only<sp_obj_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  if(is_SpCol<sp_obj_type>::value == true)\n    {\n    arma_debug_check( (n_cols != 1), \"zeros(): incompatible size\" );\n    }\n  else\n  if(is_SpRow<sp_obj_type>::value == true)\n    {\n    arma_debug_check( (n_rows != 1), \"zeros(): incompatible size\" );\n    }\n  \n  return sp_obj_type(n_rows, n_cols);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/forward_bones.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\nusing std::cout;\nusing std::cerr;\nusing std::endl;\nusing std::ios;\nusing std::size_t;\n\ntemplate<typename elem_type, typename derived> struct Base;\ntemplate<typename elem_type, typename derived> struct BaseCube;\n\ntemplate<typename eT> class Mat;\ntemplate<typename eT> class Col;\ntemplate<typename eT> class Row;\ntemplate<typename eT> class Cube;\ntemplate<typename eT> class xvec_htrans;\ntemplate<typename oT> class field;\n\ntemplate<typename eT, bool do_conj> class xtrans_mat;\n\n\ntemplate<typename eT> class subview;\ntemplate<typename eT> class subview_col;\ntemplate<typename eT> class subview_row;\ntemplate<typename eT> class subview_row_strans;\ntemplate<typename eT> class subview_row_htrans;\ntemplate<typename eT> class subview_cube;\ntemplate<typename oT> class subview_field;\n\ntemplate<typename eT> class SpValProxy;\ntemplate<typename eT> class SpMat;\ntemplate<typename eT> class SpCol;\ntemplate<typename eT> class SpRow;\ntemplate<typename eT> class SpSubview;\n\ntemplate<typename eT> class diagview;\ntemplate<typename eT> class spdiagview;\n\ntemplate<typename eT, typename T1>              class subview_elem1;\ntemplate<typename eT, typename T1, typename T2> class subview_elem2;\n\ntemplate<typename parent, unsigned int mode>              class subview_each1;\ntemplate<typename parent, unsigned int mode, typename TB> class subview_each2;\n\nclass SizeMat;\nclass SizeCube;\n\nclass arma_empty_class {};\n\nclass diskio;\n\nclass op_min;\nclass op_max;\n\nclass op_strans;\nclass op_htrans;\nclass op_htrans2;\nclass op_inv;\nclass op_sum;\nclass op_abs;\nclass op_diagmat;\nclass op_trimat;\nclass op_diagvec;\nclass op_vectorise_col;\nclass op_normalise_colvec;\nclass op_normalise_rowvec;\nclass op_clamp;\nclass op_cumsum_vec;\nclass op_shuffle;\nclass op_sort;\nclass op_find;\nclass op_find_simple;\nclass op_flipud;\nclass op_fliplr;\nclass op_real;\nclass op_imag;\nclass op_nonzeros;\nclass op_sort_index;\nclass op_stable_sort_index;\n\nclass eop_conj;\n\nclass glue_times;\nclass glue_times_diag;\n\nclass glue_rel_lt;\nclass glue_rel_gt;\nclass glue_rel_lteq;\nclass glue_rel_gteq;\nclass glue_rel_eq;\nclass glue_rel_noteq;\nclass glue_rel_and;\nclass glue_rel_or;\n\nclass op_rel_lt_pre;\nclass op_rel_lt_post;\nclass op_rel_gt_pre;\nclass op_rel_gt_post;\nclass op_rel_lteq_pre;\nclass op_rel_lteq_post;\nclass op_rel_gteq_pre;\nclass op_rel_gteq_post;\nclass op_rel_eq;\nclass op_rel_noteq;\n\nclass gen_ones_diag;\nclass gen_ones_full;\nclass gen_zeros;\nclass gen_randu;\nclass gen_randn;\n\nclass glue_mixed_plus;\nclass glue_mixed_minus;\nclass glue_mixed_div;\nclass glue_mixed_schur;\nclass glue_mixed_times;\n\nclass op_cx_scalar_times;\nclass op_cx_scalar_plus;\nclass op_cx_scalar_minus_pre;\nclass op_cx_scalar_minus_post;\nclass op_cx_scalar_div_pre;\nclass op_cx_scalar_div_post;\n\n\n\nclass op_subview_elem_equ;\nclass op_subview_elem_inplace_plus;\nclass op_subview_elem_inplace_minus;\nclass op_subview_elem_inplace_schur;\nclass op_subview_elem_inplace_div;\n\n\n\ntemplate<const bool, const bool, const bool, const bool> class gemm;\ntemplate<const bool, const bool, const bool>             class gemv;\n\n\ntemplate<                 typename eT, typename gen_type> class  Gen; \n\ntemplate<                 typename T1, typename  op_type> class   Op; \ntemplate<                 typename T1, typename eop_type> class  eOp;\ntemplate<typename out_eT, typename T1, typename  op_type> class mtOp;\n\ntemplate<                 typename T1, typename T2, typename  glue_type> class   Glue;\ntemplate<                 typename T1, typename T2, typename eglue_type> class  eGlue;\ntemplate<typename out_eT, typename T1, typename T2, typename  glue_type> class mtGlue;\n\n\n\ntemplate<                 typename eT, typename gen_type> class  GenCube; \n\ntemplate<                 typename T1, typename  op_type> class   OpCube; \ntemplate<                 typename T1, typename eop_type> class  eOpCube; \ntemplate<typename out_eT, typename T1, typename  op_type> class mtOpCube;\n\ntemplate<                 typename T1, typename T2, typename  glue_type> class   GlueCube;\ntemplate<                 typename T1, typename T2, typename eglue_type> class  eGlueCube;\ntemplate<typename out_eT, typename T1, typename T2, typename  glue_type> class mtGlueCube;\n\n\ntemplate<typename T1> class Proxy;\ntemplate<typename T1> class ProxyCube;\n\n\n\nclass spop_strans;\nclass spop_htrans;\nclass spop_scalar_times;\n\nclass spglue_plus;\nclass spglue_plus2;\n\nclass spglue_minus;\nclass spglue_minus2;\n\nclass spglue_times;\nclass spglue_times2;\n\n\ntemplate<                 typename T1, typename spop_type> class   SpOp;\ntemplate<typename out_eT, typename T1, typename spop_type> class mtSpOp;\n\ntemplate<typename T1, typename T2, typename spglue_type> class SpGlue;\n\n\ntemplate<typename T1> class SpProxy;\n\n\n\nstruct arma_vec_indicator   {};\nstruct arma_fixed_indicator {};\n\n\n//! \\addtogroup injector\n//! @{\n\ntemplate<typename Dummy = int> struct injector_end_of_row {};\n\nstatic const injector_end_of_row<> endr = injector_end_of_row<>();\n//!< endr indicates \"end of row\" when using the << operator;\n//!< similar conceptual meaning to std::endl\n\n//! @}\n\n\n\n//! \\addtogroup diskio\n//! @{\n\n\nenum file_type\n  {\n  file_type_unknown,\n  auto_detect,  //!< Automatically detect the file type\n  raw_ascii,    //!< ASCII format (text), without any other information.\n  arma_ascii,   //!< Armadillo ASCII format (text), with information about matrix type and size\n  csv_ascii,    //!< comma separated values (CSV), without any other information\n  raw_binary,   //!< raw binary format, without any other information.\n  arma_binary,  //!< Armadillo binary format, with information about matrix type and size\n  pgm_binary,   //!< Portable Grey Map (greyscale image)\n  ppm_binary,   //!< Portable Pixel Map (colour image), used by the field and cube classes\n  hdf5_binary,  //!< Open binary format, not specific to Armadillo, which can store arbitrary data\n  coord_ascii   //!< simple co-ordinate format for sparse matrices\n  };\n\n\n//! @}\n\n\n\n//! \\addtogroup fill\n//! @{\n\nnamespace fill\n  {\n  struct fill_none  {};\n  struct fill_zeros {};\n  struct fill_ones  {};\n  struct fill_eye   {};\n  struct fill_randu {};\n  struct fill_randn {};\n  \n  template<typename fill_type> \n  struct fill_class { inline fill_class() {} };\n  \n  static const fill_class<fill_none > none;\n  static const fill_class<fill_zeros> zeros;\n  static const fill_class<fill_ones > ones;\n  static const fill_class<fill_eye  > eye;\n  static const fill_class<fill_randu> randu;\n  static const fill_class<fill_randn> randn;\n  }\n\n//! @}\n\n\n\n//! \\addtogroup fn_spsolve\n//! @{\n\n\nstruct spsolve_opts_base\n  {\n  const unsigned int id;\n  \n  inline spsolve_opts_base(const unsigned int in_id) : id(in_id) {}\n  };\n\n\nstruct spsolve_opts_none : public spsolve_opts_base\n  {\n  inline spsolve_opts_none() : spsolve_opts_base(0) {}\n  };\n\n\nstruct superlu_opts : public spsolve_opts_base\n  {\n  typedef enum {NATURAL, MMD_ATA, MMD_AT_PLUS_A, COLAMD} permutation_type;\n  \n  typedef enum {REF_NONE, REF_SINGLE, REF_DOUBLE, REF_EXTRA} refine_type;\n  \n  bool             equilibrate;\n  bool             symmetric;\n  double           pivot_thresh;\n  permutation_type permutation;\n  refine_type      refine;\n  \n  inline superlu_opts()\n    : spsolve_opts_base(1)\n    {\n    equilibrate  = true;\n    symmetric    = false;\n    pivot_thresh = 1.0;\n    permutation  = COLAMD;\n    refine       = REF_NONE;\n    }\n  };\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_conv_bones.hpp",
    "content": "// Copyright (C) 2010 Conrad Sanderson\n// Copyright (C) 2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup glue_conv\n//! @{\n\n\n\nclass glue_conv\n  {\n  public:\n\n  template<typename T1, typename T2> inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_conv>& X);\n  };\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_conv_meat.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup glue_conv\n//! @{\n\n\n//! rudimentary implementation of the convolution operation\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_conv::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_conv>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_check<T1> A_tmp(X.A, out);\n  const unwrap_check<T2> B_tmp(X.B, out);\n  \n  const Mat<eT>& A = A_tmp.M;\n  const Mat<eT>& B = B_tmp.M;\n  \n  arma_debug_check\n    (\n    ( ((A.is_vec() == false) && (A.is_empty() == false)) || ((B.is_vec() == false) && (B.is_empty() == false)) ),\n    \"conv(): given object is not a vector\"\n    );\n  \n  \n  const Mat<eT>& h = (A.n_elem <= B.n_elem) ? A : B;\n  const Mat<eT>& x = (A.n_elem <= B.n_elem) ? B : A;\n  \n  \n  const uword   h_n_elem = h.n_elem;\n  const uword   x_n_elem = x.n_elem;\n  const uword out_n_elem = h_n_elem + x_n_elem - 1;\n  \n  \n  if( (h_n_elem == 0) || (x_n_elem == 0) )\n    {\n    out.reset();\n    return;\n    }\n  \n  \n  (A.n_cols == 1) ? out.set_size(out_n_elem, 1) : out.set_size(1, out_n_elem);\n  \n  \n  const eT*   h_mem = h.memptr();\n  const eT*   x_mem = x.memptr();\n        eT* out_mem = out.memptr();\n  \n  \n  for(uword out_i = 0; out_i < (h_n_elem-1); ++out_i)\n    {\n    eT acc = eT(0);\n    \n    uword h_i = out_i;\n    \n    for(uword x_i = 0; x_i <= out_i; ++x_i, --h_i)\n      {\n      acc += h_mem[h_i] * x_mem[x_i];\n      }\n    \n    out_mem[out_i] = acc;\n    }\n  \n  \n  for(uword out_i = h_n_elem-1; out_i < out_n_elem - (h_n_elem-1); ++out_i)\n    {\n    eT acc = eT(0);\n   \n    uword h_i = h_n_elem - 1;\n    \n    for(uword x_i = out_i - h_n_elem + 1; x_i <= out_i; ++x_i, --h_i)\n      {\n      acc += h_mem[h_i] * x_mem[x_i];\n      }\n      \n    out_mem[out_i] = acc;\n    }\n  \n  \n  for(uword out_i = out_n_elem - (h_n_elem-1); out_i < out_n_elem; ++out_i)\n    {\n    eT acc = eT(0);\n    \n    uword h_i = h_n_elem - 1;\n    \n    for(uword x_i = out_i - h_n_elem + 1; x_i < x_n_elem; ++x_i, --h_i)\n      {\n      acc += h_mem[h_i] * x_mem[x_i];\n      }\n    \n    out_mem[out_i] = acc;\n    }\n  \n  \n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_cor_bones.hpp",
    "content": "// Copyright (C) 2009-2010 Conrad Sanderson\n// Copyright (C) 2009-2010 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup glue_cor\n//! @{\n\n\n\nclass glue_cor\n  {\n  public:\n\n  template<typename eT> inline static void direct_cor(Mat<eT>&                out, const Mat<eT>&                A, const Mat<eT>&                B, const uword norm_type);\n  template<typename T>  inline static void direct_cor(Mat< std::complex<T> >& out, const Mat< std::complex<T> >& A, const Mat< std::complex<T> >& B, const uword norm_type);\n  \n  template<typename T1, typename T2> inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_cor>& X);\n  };\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_cor_meat.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup glue_cor\n//! @{\n\n\n\ntemplate<typename eT>\ninline\nvoid\nglue_cor::direct_cor(Mat<eT>& out, const Mat<eT>& A, const Mat<eT>& B, const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(A.is_empty() || B.is_empty() )\n    {\n    out.reset();\n    return;\n    }\n  \n  if(A.is_vec() && B.is_vec())\n    {\n    arma_debug_check( (A.n_elem != B.n_elem), \"cor(): the number of elements in the two vectors must match\" );\n    \n    const eT* A_ptr = A.memptr();\n    const eT* B_ptr = B.memptr();\n    \n    eT A_acc   = eT(0);\n    eT B_acc   = eT(0);\n    eT out_acc = eT(0);\n    \n    const uword N = A.n_elem;\n    \n    for(uword i=0; i<N; ++i)\n      {\n      const eT A_tmp = A_ptr[i];\n      const eT B_tmp = B_ptr[i];\n      \n      A_acc += A_tmp;\n      B_acc += B_tmp;\n      \n      out_acc += A_tmp * B_tmp;\n      }\n    \n    out_acc -= (A_acc * B_acc)/eT(N);\n    \n    const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N);    \n    \n    out.set_size(1,1);\n    out[0] = out_acc/norm_val;\n    \n    const Mat<eT> stddev_A = (A.n_rows == 1) ? Mat<eT>(stddev(trans(A))) : Mat<eT>(stddev(A));\n    const Mat<eT> stddev_B = (B.n_rows == 1) ? Mat<eT>(stddev(trans(B))) : Mat<eT>(stddev(B));\n    \n    out /= stddev_A * stddev_B;\n    }\n  else\n    {\n    arma_debug_assert_mul_size(A, B, true, false, \"cor()\");\n    \n    const uword N = A.n_rows;\n    const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N);\n    \n    out = trans(A) * B;\n    out -= (trans(sum(A)) * sum(B))/eT(N);\n    out /= norm_val;\n    out /= trans(stddev(A)) * stddev(B);\n    }\n  }\n\n\n\ntemplate<typename T>\ninline\nvoid\nglue_cor::direct_cor(Mat< std::complex<T> >& out, const Mat< std::complex<T> >& A, const Mat< std::complex<T> >& B, const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<T> eT;\n  \n  if(A.is_empty() || B.is_empty() )\n    {\n    out.reset();\n    return;\n    }\n  \n  if(A.is_vec() && B.is_vec())\n    {\n    arma_debug_check( (A.n_elem != B.n_elem), \"cor(): the number of elements in the two vectors must match\" );\n    \n    const eT* A_ptr = A.memptr();\n    const eT* B_ptr = B.memptr();        \n    \n    eT A_acc   = eT(0);\n    eT B_acc   = eT(0);\n    eT out_acc = eT(0);\n    \n    const uword N = A.n_elem;\n    \n    for(uword i=0; i<N; ++i)\n      {\n      const eT A_tmp = A_ptr[i];\n      const eT B_tmp = B_ptr[i];\n      \n      A_acc += A_tmp;\n      B_acc += B_tmp;\n      \n      out_acc += std::conj(A_tmp) * B_tmp;\n      }\n    \n    out_acc -= (std::conj(A_acc) * B_acc)/eT(N);\n    \n    const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N);\n    \n    out.set_size(1,1);\n    out[0] = out_acc/norm_val;\n    \n    const Mat<T> stddev_A = (A.n_rows == 1) ? Mat<T>(stddev(trans(A))) : Mat<T>(stddev(A));\n    const Mat<T> stddev_B = (B.n_rows == 1) ? Mat<T>(stddev(trans(B))) : Mat<T>(stddev(B));\n    \n    out /= conv_to< Mat<eT> >::from( stddev_A * stddev_B );\n    }\n  else\n    {\n    arma_debug_assert_mul_size(A, B, true, false, \"cor()\");\n    \n    const uword N = A.n_rows;\n    const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N);\n    \n    out = trans(A) * B;                     // out = strans(conj(A)) * B;\n    out -= (trans(sum(A)) * sum(B))/eT(N);  // out -= (strans(conj(sum(A))) * sum(B))/eT(N);\n    out /= norm_val;\n    out /= conv_to< Mat<eT> >::from( trans(stddev(A)) * stddev(B) );\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_cor::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_cor>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_check<T1> A_tmp(X.A, out);\n  const unwrap_check<T2> B_tmp(X.B, out);\n  \n  const Mat<eT>& A = A_tmp.M;\n  const Mat<eT>& B = B_tmp.M;\n  \n  const uword norm_type = X.aux_uword;\n  \n  if(&A != &B)\n    {\n    glue_cor::direct_cor(out, A, B, norm_type);\n    }\n  else\n    {\n    op_cor::direct_cor(out, A, norm_type);\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_cov_bones.hpp",
    "content": "// Copyright (C) 2009-2010 Conrad Sanderson\n// Copyright (C) 2009-2010 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup glue_cov\n//! @{\n\n\n\nclass glue_cov\n  {\n  public:\n\n  template<typename eT> inline static void direct_cov(Mat<eT>&                out, const Mat<eT>&                A, const Mat<eT>&                B, const uword norm_type);\n  template<typename T>  inline static void direct_cov(Mat< std::complex<T> >& out, const Mat< std::complex<T> >& A, const Mat< std::complex<T> >& B, const uword norm_type);\n  \n  template<typename T1, typename T2> inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_cov>& X);\n  };\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_cov_meat.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup glue_cov\n//! @{\n\n\n\ntemplate<typename eT>\ninline\nvoid\nglue_cov::direct_cov(Mat<eT>& out, const Mat<eT>& A, const Mat<eT>& B, const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n\n  if(A.is_vec() && B.is_vec())\n    {\n    arma_debug_check( (A.n_elem != B.n_elem), \"cov(): the number of elements in A and B must match\" );\n\n    const eT* A_ptr = A.memptr();\n    const eT* B_ptr = B.memptr();\n\n    eT A_acc   = eT(0);\n    eT B_acc   = eT(0);\n    eT out_acc = eT(0);\n\n    const uword N = A.n_elem;\n\n    for(uword i=0; i<N; ++i)\n      {\n      const eT A_tmp = A_ptr[i];\n      const eT B_tmp = B_ptr[i];\n\n      A_acc += A_tmp;\n      B_acc += B_tmp;\n\n      out_acc += A_tmp * B_tmp;\n      }\n\n    out_acc -= (A_acc * B_acc)/eT(N);\n\n    const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N);\n\n    out.set_size(1,1);\n    out[0] = out_acc/norm_val;\n    }\n  else\n    {\n    arma_debug_assert_mul_size(A, B, true, false, \"cov()\");\n    \n    const uword N = A.n_rows;\n    const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N);\n    \n    out = trans(A) * B;\n    out -= (trans(sum(A)) * sum(B))/eT(N);\n    out /= norm_val;\n    }\n  }\n\n\n\ntemplate<typename T>\ninline\nvoid\nglue_cov::direct_cov(Mat< std::complex<T> >& out, const Mat< std::complex<T> >& A, const Mat< std::complex<T> >& B, const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n\n  typedef typename std::complex<T> eT;\n\n  if(A.is_vec() && B.is_vec())\n    { \n    arma_debug_check( (A.n_elem != B.n_elem), \"cov(): the number of elements in A and B must match\" );\n\n    const eT* A_ptr = A.memptr();\n    const eT* B_ptr = B.memptr();        \n\n    eT A_acc   = eT(0);\n    eT B_acc   = eT(0);\n    eT out_acc = eT(0);\n\n    const uword N = A.n_elem;\n\n    for(uword i=0; i<N; ++i)\n      {\n      const eT A_tmp = A_ptr[i];\n      const eT B_tmp = B_ptr[i];\n\n      A_acc += A_tmp;\n      B_acc += B_tmp;\n\n      out_acc += std::conj(A_tmp) * B_tmp;\n      }\n\n    out_acc -= (std::conj(A_acc) * B_acc)/eT(N);\n\n    const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N);\n\n    out.set_size(1,1);\n    out[0] = out_acc/norm_val;\n    }\n  else\n    {\n    arma_debug_assert_mul_size(A, B, true, false, \"cov()\");\n    \n    const uword N = A.n_rows;\n    const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N);\n    \n    out = trans(A) * B;                     // out = strans(conj(A)) * B;\n    out -= (trans(sum(A)) * sum(B))/eT(N);  // out -= (strans(conj(sum(A))) * sum(B))/eT(N);\n    out /= norm_val;\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_cov::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_cov>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  typedef typename T1::elem_type eT;\n\n  const unwrap_check<T1> A_tmp(X.A, out);\n  const unwrap_check<T2> B_tmp(X.B, out);\n\n  const Mat<eT>& A = A_tmp.M;\n  const Mat<eT>& B = B_tmp.M;\n  \n  const uword norm_type = X.aux_uword;\n\n  if(&A != &B)\n    {\n    glue_cov::direct_cov(out, A, B, norm_type);\n    }\n  else\n    {\n    op_cov::direct_cov(out, A, norm_type);\n    }\n  \n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_cross_bones.hpp",
    "content": "// Copyright (C) 2010 Conrad Sanderson\n// Copyright (C) 2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup glue_cross\n//! @{\n\n\n\nclass glue_cross\n  {\n  public:\n\n  template<typename T1, typename T2> inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_cross>& X);\n  };\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_cross_meat.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup glue_cross\n//! @{\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_cross::apply(Mat<typename T1::elem_type>& out, const Glue<T1, T2, glue_cross>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> PA(X.A);\n  const Proxy<T2> PB(X.B);\n  \n  arma_debug_check( ((PA.get_n_elem() != 3) || (PB.get_n_elem() != 3)), \"cross(): input vectors must have 3 elements\" );\n  \n  const uword PA_n_rows = Proxy<T1>::is_row ? 1 : PA.get_n_rows();\n  const uword PA_n_cols = Proxy<T1>::is_col ? 1 : PA.get_n_cols();\n  \n  out.set_size(PA_n_rows, PA_n_cols);\n  \n  eT* out_mem = out.memptr();\n  \n  if( (Proxy<T1>::prefer_at_accessor == false) && (Proxy<T2>::prefer_at_accessor == false) )\n    {\n    typename Proxy<T1>::ea_type A = PA.get_ea();\n    typename Proxy<T2>::ea_type B = PB.get_ea();\n    \n    const eT ax = A[0];\n    const eT ay = A[1];\n    const eT az = A[2];\n    \n    const eT bx = B[0];\n    const eT by = B[1];\n    const eT bz = B[2];\n    \n    out_mem[0] = ay*bz - az*by;\n    out_mem[1] = az*bx - ax*bz;\n    out_mem[2] = ax*by - ay*bx;\n    }\n  else\n    {\n    const bool PA_is_col = Proxy<T1>::is_col ? true : (PA_n_cols       == 1);\n    const bool PB_is_col = Proxy<T2>::is_col ? true : (PB.get_n_cols() == 1);\n    \n    const eT ax = PA.at(0,0);\n    const eT ay = PA_is_col ? PA.at(1,0) : PA.at(0,1);\n    const eT az = PA_is_col ? PA.at(2,0) : PA.at(0,2);\n    \n    const eT bx = PB.at(0,0);\n    const eT by = PB_is_col ? PB.at(1,0) : PB.at(0,1);\n    const eT bz = PB_is_col ? PB.at(2,0) : PB.at(0,2);\n    \n    out_mem[0] = ay*bz - az*by;\n    out_mem[1] = az*bx - ax*bz;\n    out_mem[2] = ax*by - ay*bx;\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_hist_bones.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// Copyright (C) 2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\nclass glue_hist\n   {\n   public:\n\n   template<typename T1, typename T2> inline static void apply(Mat<uword>& out, const mtGlue<uword,T1,T2,glue_hist>& in);\n   };\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_hist_meat.hpp",
    "content": "// Copyright (C) 2012-2015 Conrad Sanderson\n// Copyright (C) 2012-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_hist::apply(Mat<uword>& out, const mtGlue<uword,T1,T2,glue_hist>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword dim = in.aux_uword;\n  \n  const unwrap_check_mixed<T1> tmp1(in.A, out);\n  const unwrap_check_mixed<T2> tmp2(in.B, out);\n  \n  const Mat<eT>& X = tmp1.M;\n  const Mat<eT>& C = tmp2.M;\n  \n  \n  arma_debug_check\n    (\n    ((C.is_vec() == false) && (C.is_empty() == false)),\n    \"hist(): parameter 'centers' must be a vector\"\n    );\n  \n  arma_debug_check\n    (\n    (dim > 1),\n    \"hist(): parameter 'dim' must be 0 or 1\"\n    );\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  const uword X_n_elem = X.n_elem;\n  \n  const uword C_n_elem = C.n_elem;\n  \n  if( C_n_elem == 0 )\n    {\n    out.reset();\n    return;\n    }\n  \n  // for vectors we are currently ignoring the \"dim\" parameter\n  \n  uword out_n_rows = 0;\n  uword out_n_cols = 0;\n  \n  if( (X.vec_state == 0) && (X.n_elem == 1u) )\n    {\n    if(out.vec_state == 1u)\n      {\n      out_n_rows = C_n_elem;\n      out_n_cols = 1;\n      }\n    else\n      {\n      out_n_rows = 1;\n      out_n_cols = C_n_elem;\n      }\n    }\n  else\n  if( (X.vec_state > 0) || X.is_vec() )\n    {\n    if(X.vec_state == 2u)\n      {\n      out_n_rows = 1;\n      out_n_cols = C_n_elem;\n      }\n    else\n    if(X.vec_state == 1u)\n      {\n      out_n_rows = C_n_elem;\n      out_n_cols = 1;\n      }\n    else\n    if(X.is_rowvec())\n      {\n      out_n_rows = 1;\n      out_n_cols = C_n_elem;\n      }\n    else\n    if(X.is_colvec())\n      {\n      out_n_rows = C_n_elem;\n      out_n_cols = 1;\n      }\n    }\n  else\n    {\n    if(dim == 0)\n      {\n      out_n_rows = C_n_elem;\n      out_n_cols = X_n_cols;\n      }\n    else\n    if(dim == 1)\n      {\n      out_n_rows = X_n_rows;\n      out_n_cols = C_n_elem;\n      }\n    }\n  \n  out.zeros(out_n_rows, out_n_cols);\n  \n  \n  const eT* C_mem    = C.memptr();\n  const eT  center_0 = C_mem[0];\n  \n  if( (X.vec_state > 0) || X.is_vec() )\n    {\n    const eT*    X_mem   = X.memptr();\n          uword* out_mem = out.memptr();\n    \n    for(uword i=0; i < X_n_elem; ++i)\n      {\n      const eT val = X_mem[i];\n      \n      if(is_finite(val))\n        {\n        eT    opt_dist  = (val >= center_0) ? (val - center_0) : (center_0 - val);\n        uword opt_index = 0;\n        \n        for(uword j=1; j < C_n_elem; ++j)\n          {\n          const eT center = C_mem[j];\n          const eT dist   = (val >= center) ? (val - center) : (center - val);\n          \n          if(dist < opt_dist)\n            {\n            opt_dist  = dist;\n            opt_index = j;\n            }\n          else\n            {\n            break;\n            }\n          }\n        \n        out_mem[opt_index]++;\n        }\n      else\n        {\n        // -inf\n        if(val < eT(0)) { out_mem[0]++; }\n        \n        // +inf\n        if(val > eT(0)) { out_mem[C_n_elem-1]++; }\n        \n        // ignore NaN\n        }\n      }\n    }\n  else\n    {\n    if(dim == 0)\n      {\n      for(uword col=0; col < X_n_cols; ++col)\n        {\n        const eT*    X_coldata   = X.colptr(col);\n              uword* out_coldata = out.colptr(col);\n        \n        for(uword row=0; row < X_n_rows; ++row)\n          {\n          const eT val = X_coldata[row];\n          \n          if(arma_isfinite(val))\n            {\n            eT    opt_dist  = (center_0 >= val) ? (center_0 - val) : (val - center_0);\n            uword opt_index = 0;\n            \n            for(uword j=1; j < C_n_elem; ++j)\n              {\n              const eT center = C_mem[j];\n              const eT dist   = (center >= val) ? (center - val) : (val - center);\n              \n              if(dist < opt_dist)\n                {\n                opt_dist  = dist;\n                opt_index = j;\n                }\n              else\n                {\n                break;\n                }\n              }\n            \n            out_coldata[opt_index]++;\n            }\n          else\n            {\n            // -inf\n            if(val < eT(0)) { out_coldata[0]++; }\n            \n            // +inf\n            if(val > eT(0)) { out_coldata[C_n_elem-1]++; }\n            \n            // ignore NaN\n            }\n          }\n        }\n      }\n    else\n    if(dim == 1)\n      {\n      for(uword row=0; row < X_n_rows; ++row)\n        {\n        for(uword col=0; col < X_n_cols; ++col)\n          {\n          const eT val = X.at(row,col);\n          \n          if(arma_isfinite(val))\n            {\n            eT    opt_dist  = (center_0 >= val) ? (center_0 - val) : (val - center_0);\n            uword opt_index = 0;\n            \n            for(uword j=1; j < C_n_elem; ++j)\n              {\n              const eT center = C_mem[j];\n              const eT dist   = (center >= val) ? (center - val) : (val - center);\n              \n              if(dist < opt_dist)\n                {\n                opt_dist  = dist;\n                opt_index = j;\n                }\n              else\n                {\n                break;\n                }\n              }\n            \n            out.at(row,opt_index)++;\n            }\n          else\n            {\n            // -inf\n            if(val < eT(0)) { out.at(row,0)++; }\n            \n            // +inf\n            if(val > eT(0)) { out.at(row,C_n_elem-1)++; }\n            \n            // ignore NaN\n            }\n          }\n        }\n      }\n    }\n  }\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_histc_bones.hpp",
    "content": "// Copyright (C) 2015 Conrad Sanderson\n// Copyright (C) 2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\nstruct glue_histc\n   {\n   template<typename T1, typename T2>\n   inline static void apply(Mat<uword>& C, const mtGlue<uword,T1,T2,glue_histc>& expr);\n   };\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_histc_meat.hpp",
    "content": "// Copyright (C) 2015 Conrad Sanderson\n// Copyright (C) 2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_histc::apply(Mat<uword>& C, const mtGlue<uword,T1,T2,glue_histc>& expr)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword dim = expr.aux_uword;\n  \n  arma_debug_check( (dim > 1), \"histc(): parameter 'dim' must be 0 or 1\" );\n  \n  const unwrap_check_mixed<T1> tmpA(expr.A, C);\n  const unwrap_check_mixed<T2> tmpB(expr.B, C);\n  \n  typedef typename T1::elem_type eT;\n  \n  const Mat<eT>& A = tmpA.M;\n  const Mat<eT>& B = tmpB.M;\n  \n  arma_debug_check( ((B.is_vec() == false) && (B.is_empty() == false)), \"histc(): parameter 'edges' is not a vector\" );\n  \n  const uword A_n_rows = A.n_rows;\n  const uword A_n_cols = A.n_cols;\n  \n  const uword A_n_elem = A.n_elem;\n  const uword B_n_elem = B.n_elem;\n  \n  if( B_n_elem == uword(0) )  { C.reset(); return; }\n  \n  // NOTE: the \"dim\" parameter is currently ignored for vectors\n  \n  uword C_n_rows = uword(0);\n  uword C_n_cols = uword(0);\n  \n  if( (A.n_elem == uword(1)) && (A.vec_state == uword(0)) )\n    {\n    if(C.vec_state == uword(1))\n      {\n      C_n_rows = B_n_elem;\n      C_n_cols = uword(1);\n      }\n    else\n      {\n      C_n_rows = uword(1);\n      C_n_cols = B_n_elem;\n      }\n    }\n  else\n  if( A.is_vec() || (A.vec_state > 0) )\n    {\n    if(A.vec_state == uword(2))\n      {\n      C_n_rows = uword(1);\n      C_n_cols = B_n_elem;\n      }\n    else\n    if(A.vec_state == uword(1))\n      {\n      C_n_rows = B_n_elem;\n      C_n_cols = uword(1);\n      }\n    else\n    if(A.is_rowvec())\n      {\n      C_n_rows = uword(1);\n      C_n_cols = B_n_elem;\n      }\n    else\n    if(A.is_colvec())\n      {\n      C_n_rows = B_n_elem;\n      C_n_cols = uword(1);\n      }\n    }\n  else\n    {\n    if(dim == uword(0))\n      {\n      C_n_rows = B_n_elem;\n      C_n_cols = A_n_cols;\n      }\n    else\n    if(dim == uword(1))\n      {\n      C_n_rows = A_n_rows;\n      C_n_cols = B_n_elem;\n      }\n    }\n  \n  \n  C.zeros(C_n_rows, C_n_cols);\n  \n  \n  const eT*   B_mem       = B.memptr();\n  const uword B_n_elem_m1 = B_n_elem - 1;\n  \n  if( A.is_vec() || (A.vec_state > 0) )\n    {\n    const eT*    A_mem = A.memptr();\n          uword* C_mem = C.memptr();\n    \n    for(uword j=0; j < A_n_elem; ++j)\n      {\n      const eT x = A_mem[j];\n      \n      for(uword i=0; i < B_n_elem_m1; ++i)\n        {\n             if( (B_mem[i]           <= x) && (x < B_mem[i+1]) )  { C_mem[i]++;           break; }\n        else if(  B_mem[B_n_elem_m1] == x                      )  { C_mem[B_n_elem_m1]++; break; }    // for compatibility with Matlab\n        }\n      }\n    }\n  else\n  if(dim == uword(1))\n    {\n    for(uword row=0; row < A_n_rows; ++row)\n      {\n      for(uword col=0; col < A_n_cols; ++col)\n        {\n        const eT x = A.at(row,col);\n        \n        for(uword i=0; i < B_n_elem_m1; ++i)\n          {\n               if( (B_mem[i]            <= x) && (x < B_mem[i+1]) )  { C.at(row,i)++;           break; }\n          else if(  B_mem[B_n_elem_m1]  == x                      )  { C.at(row,B_n_elem_m1)++; break; }   // for compatibility with Matlab\n          }\n        }\n      }\n    }\n  else\n  if(dim == uword(0))\n    {\n    for(uword col=0; col < A_n_cols; ++col)\n      {\n      const eT*    A_coldata = A.colptr(col);\n            uword* C_coldata = C.colptr(col);\n      \n      for(uword row=0; row < A_n_rows; ++row)\n        {\n        const eT x = A_coldata[row];\n        \n        for(uword i=0; i < B_n_elem_m1; ++i)\n          {\n               if( (B_mem[i]           <= x) && (x < B_mem[i+1]) )  { C_coldata[i]++;           break; }\n          else if(  B_mem[B_n_elem_m1] == x                      )  { C_coldata[B_n_elem_m1]++; break; }    // for compatibility with Matlab\n          }\n        }\n      }\n    }\n  }\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_join_bones.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup glue_join\n//! @{\n\n\n\nclass glue_join\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_join>& X);\n  \n  template<typename eT>\n  inline static void apply_noalias(Mat<eT>& out, const Mat<eT>& A, const Mat<eT>& B, const uword join_type);\n  \n  template<typename T1, typename T2>\n  inline static void apply(Cube<typename T1::elem_type>& out, const GlueCube<T1,T2,glue_join>& X);\n  };\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_join_meat.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup glue_join\n//! @{\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_join::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_join>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword join_type = X.aux_uword;\n  \n  const unwrap<T1> A_tmp(X.A);\n  const unwrap<T2> B_tmp(X.B);\n  \n  const Mat<eT>& A = A_tmp.M;\n  const Mat<eT>& B = B_tmp.M;\n  \n  if( (&out != &A) && (&out != &B) )\n    {\n    glue_join::apply_noalias(out, A, B, join_type);\n    }\n  else\n    {\n    Mat<eT> tmp;\n    \n    glue_join::apply_noalias(tmp, A, B, join_type);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nglue_join::apply_noalias(Mat<eT>& out, const Mat<eT>& A, const Mat<eT>& B, const uword join_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword A_n_rows = A.n_rows;\n  const uword A_n_cols = A.n_cols;\n  \n  const uword B_n_rows = B.n_rows;\n  const uword B_n_cols = B.n_cols;\n  \n  if(join_type == 0)\n    {\n    arma_debug_check\n      (\n      ( (A_n_cols != B_n_cols) && ( (A_n_rows > 0) || (A_n_cols > 0) ) && ( (B_n_rows > 0) || (B_n_cols > 0) ) ),\n      \"join_cols() / join_vert(): number of columns must be the same\"\n      );\n    }\n  else\n    {\n    arma_debug_check\n      (\n      ( (A_n_rows != B.n_rows) && ( (A_n_rows > 0) || (A_n_cols > 0) ) && ( (B_n_rows > 0) || (B_n_cols > 0) ) ),\n      \"join_rows() / join_horiz(): number of rows must be the same\"\n      );\n    }\n  \n  \n  if(join_type == 0)   // join columns (i.e. result matrix has more rows)\n    {\n    out.set_size( A_n_rows + B_n_rows, (std::max)(A_n_cols, B_n_cols) );\n    \n    if( out.n_elem > 0 )\n      {\n      if(A.is_empty() == false)\n        { \n        out.submat(0,        0,   A_n_rows-1, out.n_cols-1) = A;\n        }\n      \n      if(B.is_empty() == false)\n        {\n        out.submat(A_n_rows, 0, out.n_rows-1, out.n_cols-1) = B;\n        }\n      }\n    }\n  else   // join rows  (i.e. result matrix has more columns)\n    {\n    out.set_size( (std::max)(A_n_rows, B_n_rows), A_n_cols + B_n_cols );\n    \n    if( out.n_elem > 0 )\n      {\n      if(A.is_empty() == false)\n        {\n        out.submat(0, 0,        out.n_rows-1,   A.n_cols-1) = A;\n        }\n      \n      if(B.is_empty() == false)\n        {\n        out.submat(0, A_n_cols, out.n_rows-1, out.n_cols-1) = B;\n        }\n      }\n    }\n  }\n  \n  \n  \n  \ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_join::apply(Cube<typename T1::elem_type>& out, const GlueCube<T1,T2,glue_join>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n\n  const unwrap_cube<T1> A_tmp(X.A);\n  const unwrap_cube<T2> B_tmp(X.B);\n  \n  const Cube<eT>& A = A_tmp.M;\n  const Cube<eT>& B = B_tmp.M;\n  \n  if(A.n_elem == 0)\n    {\n    out = B;\n    return;\n    }\n  \n  if(B.n_elem == 0)\n    {\n    out = A;\n    return;\n    }\n  \n  \n  arma_debug_check( ( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) ), \"join_slices(): size of slices must be the same\" );\n  \n  \n  if( (&out != &A) && (&out != &B) )\n    {\n    out.set_size(A.n_rows, A.n_cols, A.n_slices + B.n_slices);\n    \n    out.slices(0,          A.n_slices-1  ) = A;\n    out.slices(A.n_slices, out.n_slices-1) = B;\n    }\n  else  // we have aliasing\n    {\n    Cube<eT> C(A.n_rows, A.n_cols, A.n_slices + B.n_slices);\n    \n    C.slices(0,          A.n_slices-1) = A;\n    C.slices(A.n_slices, C.n_slices-1) = B;\n    \n    out.steal_mem(C);\n    }\n  \n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_kron_bones.hpp",
    "content": "// Copyright (C) 2009-2010 Conrad Sanderson\n// Copyright (C) 2009-2010 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup glue_kron\n//! @{\n\n\n\nclass glue_kron\n  {\n  public:\n\n  template<typename eT> inline static void direct_kron(Mat<eT>&                out, const Mat<eT>&                A, const Mat<eT>&                B);\n  template<typename T>  inline static void direct_kron(Mat< std::complex<T> >& out, const Mat< std::complex<T> >& A, const Mat<T>&                 B);\n  template<typename T>  inline static void direct_kron(Mat< std::complex<T> >& out, const Mat<T>&                 A, const Mat< std::complex<T> >& B);\n  \n  template<typename T1, typename T2>   inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_kron>& X);\n  };\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_kron_meat.hpp",
    "content": "// Copyright (C) 2009-2013 Conrad Sanderson\n// Copyright (C) 2009-2013 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup glue_kron\n//! @{\n\n\n\n//! \\brief\n//! both input matrices have the same element type\ntemplate<typename eT>\ninline\nvoid\nglue_kron::direct_kron(Mat<eT>& out, const Mat<eT>& A, const Mat<eT>& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword A_rows = A.n_rows;\n  const uword A_cols = A.n_cols;\n  const uword B_rows = B.n_rows;\n  const uword B_cols = B.n_cols;\n  \n  out.set_size(A_rows*B_rows, A_cols*B_cols);\n  \n  for(uword j = 0; j < A_cols; j++)\n    {\n    for(uword i = 0; i < A_rows; i++)\n      {\n      out.submat(i*B_rows, j*B_cols, (i+1)*B_rows-1, (j+1)*B_cols-1) = A.at(i,j) * B; \n      }\n    }\n  }\n\n\n\n//! \\brief\n//! different types of input matrices\n//! A -> complex, B -> basic element type\ntemplate<typename T>\ninline\nvoid\nglue_kron::direct_kron(Mat< std::complex<T> >& out, const Mat< std::complex<T> >& A, const Mat<T>& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<T> eT;\n  \n  const uword A_rows = A.n_rows;\n  const uword A_cols = A.n_cols;\n  const uword B_rows = B.n_rows;\n  const uword B_cols = B.n_cols;\n  \n  out.set_size(A_rows*B_rows, A_cols*B_cols);\n  \n  Mat<eT> tmp_B = conv_to< Mat<eT> >::from(B);\n  \n  for(uword j = 0; j < A_cols; j++)\n    {\n    for(uword i = 0; i < A_rows; i++)\n      {\n      out.submat(i*B_rows, j*B_cols, (i+1)*B_rows-1, (j+1)*B_cols-1) = A.at(i,j) * tmp_B; \n      }\n    }  \n  }\n\n\n\n//! \\brief\n//! different types of input matrices\n//! A -> basic element type, B -> complex\ntemplate<typename T>\ninline\nvoid\nglue_kron::direct_kron(Mat< std::complex<T> >& out, const Mat<T>& A, const Mat< std::complex<T> >& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword A_rows = A.n_rows;\n  const uword A_cols = A.n_cols;\n  const uword B_rows = B.n_rows;\n  const uword B_cols = B.n_cols;\n  \n  out.set_size(A_rows*B_rows, A_cols*B_cols);\n  \n  for(uword j = 0; j < A_cols; j++)\n    {\n    for(uword i = 0; i < A_rows; i++)\n      {\n      out.submat(i*B_rows, j*B_cols, (i+1)*B_rows-1, (j+1)*B_cols-1) = A.at(i,j) * B; \n      }\n    }  \n  }\n\n\n\n//! \\brief\n//! apply Kronecker product for two objects with same element type\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_kron::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_kron>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1> A_tmp(X.A);\n  const unwrap<T2> B_tmp(X.B);\n  \n  const Mat<eT>& A = A_tmp.M;\n  const Mat<eT>& B = B_tmp.M;\n  \n  if( (&out != &A) && (&out != &B) )\n    {\n    glue_kron::direct_kron(out, A, B); \n    }\n  else\n    {\n    Mat<eT> tmp;\n    \n    glue_kron::direct_kron(tmp, A, B);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_max_bones.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup glue_max\n//! @{\n\n\n\nclass glue_max\n  {\n  public:\n  \n  template<typename eT, typename T1, typename T2> inline static void apply(Mat< eT              >& out, const Proxy<T1>& PA, const Proxy<T2>& PB);\n  \n  template<typename  T, typename T1, typename T2> inline static void apply(Mat< std::complex<T> >& out, const Proxy<T1>& PA, const Proxy<T2>& PB);\n  \n  template<typename T1, typename T2> inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_max>& X);\n  };\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_max_meat.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup glue_max\n//! @{\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ninline\nvoid\nglue_max::apply(Mat<eT>& out, const Proxy<T1>& PA, const Proxy<T2>& PB)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_rows = PA.get_n_rows();\n  const uword n_cols = PA.get_n_cols();\n  \n  arma_debug_assert_same_size(n_rows, n_cols, PB.get_n_rows(), PB.get_n_cols(), \"max(): given objects do not have the same size\");\n  \n  out.set_size(n_rows, n_cols);\n  \n  eT* out_mem = out.memptr();\n  \n  if( (Proxy<T1>::prefer_at_accessor == false) && (Proxy<T2>::prefer_at_accessor == false) )\n    {\n    typename Proxy<T1>::ea_type A = PA.get_ea();\n    typename Proxy<T2>::ea_type B = PB.get_ea();\n    \n    const uword N = PA.get_n_elem();\n    \n    for(uword i=0; i<N; ++i)\n      {\n      out_mem[i] = (std::max)(A[i], B[i]);\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      *out_mem = (std::max)( PA.at(row,col), PB.at(row,col) );\n      \n      ++out_mem;\n      }\n    }\n  }\n\n\n\ntemplate<typename T, typename T1, typename T2>\ninline\nvoid\nglue_max::apply(Mat< std::complex<T> >& out, const Proxy<T1>& PA, const Proxy<T2>& PB)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<T> eT;\n  \n  const uword n_rows = PA.get_n_rows();\n  const uword n_cols = PA.get_n_cols();\n  \n  arma_debug_assert_same_size(n_rows, n_cols, PB.get_n_rows(), PB.get_n_cols(), \"max(): given objects do not have the same size\");\n  \n  out.set_size(n_rows, n_cols);\n  \n  eT* out_mem = out.memptr();\n  \n  if( (Proxy<T1>::prefer_at_accessor == false) && (Proxy<T2>::prefer_at_accessor == false) )\n    {\n    typename Proxy<T1>::ea_type A = PA.get_ea();\n    typename Proxy<T2>::ea_type B = PB.get_ea();\n    \n    const uword N = PA.get_n_elem();\n    \n    for(uword i=0; i<N; ++i)\n      {\n      const eT A_val = A[i];\n      const eT B_val = B[i];\n      \n      out_mem[i] = ( std::abs(A_val) > std::abs(B_val) ) ? A_val : B_val;\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      const eT A_val = PA.at(row,col);\n      const eT B_val = PB.at(row,col);\n      \n      *out_mem = ( std::abs(A_val) > std::abs(B_val) ) ? A_val : B_val;\n      \n      ++out_mem;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_max::apply(Mat<typename T1::elem_type>& out, const Glue<T1, T2, glue_max>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> PA(X.A);\n  const Proxy<T2> PB(X.B);\n  \n  if(PA.is_alias(out) || PB.is_alias(out))\n    {\n    Mat<eT> tmp;\n    \n    glue_max::apply(tmp, PA, PB);\n    \n    out.steal_mem(tmp);\n    }\n  else\n    {\n    glue_max::apply(out, PA, PB);\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_min_bones.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup glue_min\n//! @{\n\n\n\nclass glue_min\n  {\n  public:\n  \n  template<typename eT, typename T1, typename T2> inline static void apply(Mat< eT              >& out, const Proxy<T1>& PA, const Proxy<T2>& PB);\n  \n  template<typename  T, typename T1, typename T2> inline static void apply(Mat< std::complex<T> >& out, const Proxy<T1>& PA, const Proxy<T2>& PB);\n  \n  template<typename T1, typename T2> inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_min>& X);\n  };\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_min_meat.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup glue_min\n//! @{\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ninline\nvoid\nglue_min::apply(Mat<eT>& out, const Proxy<T1>& PA, const Proxy<T2>& PB)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_rows = PA.get_n_rows();\n  const uword n_cols = PA.get_n_cols();\n  \n  arma_debug_assert_same_size(n_rows, n_cols, PB.get_n_rows(), PB.get_n_cols(), \"min(): given objects do not have the same size\");\n  \n  out.set_size(n_rows, n_cols);\n  \n  eT* out_mem = out.memptr();\n  \n  if( (Proxy<T1>::prefer_at_accessor == false) && (Proxy<T2>::prefer_at_accessor == false) )\n    {\n    typename Proxy<T1>::ea_type A = PA.get_ea();\n    typename Proxy<T2>::ea_type B = PB.get_ea();\n    \n    const uword N = PA.get_n_elem();\n    \n    for(uword i=0; i<N; ++i)\n      {\n      out_mem[i] = (std::min)(A[i], B[i]);\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      *out_mem = (std::min)( PA.at(row,col), PB.at(row,col) );\n      \n      ++out_mem;\n      }\n    }\n  }\n\n\n\ntemplate<typename T, typename T1, typename T2>\ninline\nvoid\nglue_min::apply(Mat< std::complex<T> >& out, const Proxy<T1>& PA, const Proxy<T2>& PB)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<T> eT;\n  \n  const uword n_rows = PA.get_n_rows();\n  const uword n_cols = PA.get_n_cols();\n  \n  arma_debug_assert_same_size(n_rows, n_cols, PB.get_n_rows(), PB.get_n_cols(), \"min(): given objects do not have the same size\");\n  \n  out.set_size(n_rows, n_cols);\n  \n  eT* out_mem = out.memptr();\n  \n  if( (Proxy<T1>::prefer_at_accessor == false) && (Proxy<T2>::prefer_at_accessor == false) )\n    {\n    typename Proxy<T1>::ea_type A = PA.get_ea();\n    typename Proxy<T2>::ea_type B = PB.get_ea();\n    \n    const uword N = PA.get_n_elem();\n    \n    for(uword i=0; i<N; ++i)\n      {\n      const eT A_val = A[i];\n      const eT B_val = B[i];\n      \n      out_mem[i] = ( std::abs(A_val) < std::abs(B_val) ) ? A_val : B_val;\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      const eT A_val = PA.at(row,col);\n      const eT B_val = PB.at(row,col);\n      \n      *out_mem = ( std::abs(A_val) < std::abs(B_val) ) ? A_val : B_val;\n      \n      ++out_mem;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_min::apply(Mat<typename T1::elem_type>& out, const Glue<T1, T2, glue_min>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> PA(X.A);\n  const Proxy<T2> PB(X.B);\n  \n  if(PA.is_alias(out) || PB.is_alias(out))\n    {\n    Mat<eT> tmp;\n    \n    glue_min::apply(tmp, PA, PB);\n    \n    out.steal_mem(tmp);\n    }\n  else\n    {\n    glue_min::apply(out, PA, PB);\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_mixed_bones.hpp",
    "content": "// Copyright (C) 2009-2010 Conrad Sanderson\n// Copyright (C) 2009-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup glue_mixed\n//! @{\n\n\n\nclass glue_mixed_times\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(Mat<typename eT_promoter<T1,T2>::eT>& out, const mtGlue<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_times>& X);\n  };\n\n\n\nclass glue_mixed_plus\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(Mat<typename eT_promoter<T1,T2>::eT>& out, const mtGlue<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_plus>& X);\n  \n  template<typename T1, typename T2>\n  inline static void apply(Cube<typename eT_promoter<T1,T2>::eT>& out, const mtGlueCube<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_plus>& X);\n  };\n\n\n\nclass glue_mixed_minus\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(Mat<typename eT_promoter<T1,T2>::eT>& out, const mtGlue<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_minus>& X);\n  \n  template<typename T1, typename T2>\n  inline static void apply(Cube<typename eT_promoter<T1,T2>::eT>& out, const mtGlueCube<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_minus>& X);\n  };\n\n\n\nclass glue_mixed_div\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(Mat<typename eT_promoter<T1,T2>::eT>& out, const mtGlue<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_div>& X);\n  \n  template<typename T1, typename T2>\n  inline static void apply(Cube<typename eT_promoter<T1,T2>::eT>& out, const mtGlueCube<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_div>& X);\n  };\n\n\n\nclass glue_mixed_schur\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(Mat<typename eT_promoter<T1,T2>::eT>& out, const mtGlue<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_schur>& X);\n  \n  template<typename T1, typename T2>\n  inline static void apply(Cube<typename eT_promoter<T1,T2>::eT>& out, const mtGlueCube<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_schur>& X);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_mixed_meat.hpp",
    "content": "// Copyright (C) 2009-2015 Conrad Sanderson\n// Copyright (C) 2009-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup glue_mixed\n//! @{\n\n\n\n//! matrix multiplication with different element types\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_mixed_times::apply(Mat<typename eT_promoter<T1,T2>::eT>& out, const mtGlue<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_times>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  const unwrap_check_mixed<T1> tmp1(X.A, out);\n  const unwrap_check_mixed<T2> tmp2(X.B, out);\n  \n  const Mat<eT1>& A = tmp1.M;\n  const Mat<eT2>& B = tmp2.M;\n  \n  arma_debug_assert_mul_size(A, B, \"matrix multiplication\");\n  \n  out.set_size(A.n_rows, B.n_cols);\n  \n  gemm_mixed<>::apply(out, A, B);\n  }\n\n\n\n//! matrix addition with different element types\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_mixed_plus::apply(Mat<typename eT_promoter<T1,T2>::eT>& out, const mtGlue<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_plus>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  const Proxy<T1> A(X.A);\n  const Proxy<T2> B(X.B);\n  \n  arma_debug_assert_same_size(A, B, \"addition\");\n  \n  const uword n_rows = A.get_n_rows();\n  const uword n_cols = A.get_n_cols();\n  \n  out.set_size(n_rows, n_cols);\n  \n        out_eT* out_mem = out.memptr();\n  const uword   n_elem  = out.n_elem;\n    \n  const bool prefer_at_accessor = (Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type AA = A.get_ea();\n    typename Proxy<T2>::ea_type BB = B.get_ea();\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      for(uword i=0; i<n_elem; ++i)\n        {\n        out_mem[i] = upgrade_val<eT1,eT2>::apply(AA[i]) + upgrade_val<eT1,eT2>::apply(BB[i]);\n        }\n      }\n    else\n      {\n      for(uword i=0; i<n_elem; ++i)\n        {\n        out_mem[i] = upgrade_val<eT1,eT2>::apply(AA[i]) + upgrade_val<eT1,eT2>::apply(BB[i]);\n        }\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      (*out_mem) = upgrade_val<eT1,eT2>::apply(A.at(row,col)) + upgrade_val<eT1,eT2>::apply(B.at(row,col));\n      out_mem++;\n      }\n    }\n  }\n\n\n\n//! matrix subtraction with different element types\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_mixed_minus::apply(Mat<typename eT_promoter<T1,T2>::eT>& out, const mtGlue<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_minus>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  const Proxy<T1> A(X.A);\n  const Proxy<T2> B(X.B);\n  \n  arma_debug_assert_same_size(A, B, \"subtraction\");\n  \n  const uword n_rows = A.get_n_rows();\n  const uword n_cols = A.get_n_cols();\n  \n  out.set_size(n_rows, n_cols);\n  \n        out_eT* out_mem = out.memptr();\n  const uword   n_elem  = out.n_elem;\n    \n  const bool prefer_at_accessor = (Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type AA = A.get_ea();\n    typename Proxy<T2>::ea_type BB = B.get_ea();\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      for(uword i=0; i<n_elem; ++i)\n        {\n        out_mem[i] = upgrade_val<eT1,eT2>::apply(AA[i]) - upgrade_val<eT1,eT2>::apply(BB[i]);\n        }\n      }\n    else\n      {\n      for(uword i=0; i<n_elem; ++i)\n        {\n        out_mem[i] = upgrade_val<eT1,eT2>::apply(AA[i]) - upgrade_val<eT1,eT2>::apply(BB[i]);\n        }\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      (*out_mem) = upgrade_val<eT1,eT2>::apply(A.at(row,col)) - upgrade_val<eT1,eT2>::apply(B.at(row,col));\n      out_mem++;\n      }\n    }\n  }\n\n\n\n//! element-wise matrix division with different element types\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_mixed_div::apply(Mat<typename eT_promoter<T1,T2>::eT>& out, const mtGlue<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_div>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  const Proxy<T1> A(X.A);\n  const Proxy<T2> B(X.B);\n  \n  arma_debug_assert_same_size(A, B, \"element-wise division\");\n  \n  const uword n_rows = A.get_n_rows();\n  const uword n_cols = A.get_n_cols();\n  \n  out.set_size(n_rows, n_cols);\n  \n        out_eT* out_mem = out.memptr();\n  const uword   n_elem  = out.n_elem;\n    \n  const bool prefer_at_accessor = (Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type AA = A.get_ea();\n    typename Proxy<T2>::ea_type BB = B.get_ea();\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      for(uword i=0; i<n_elem; ++i)\n        {\n        out_mem[i] = upgrade_val<eT1,eT2>::apply(AA[i]) / upgrade_val<eT1,eT2>::apply(BB[i]);\n        }\n      }\n    else\n      {\n      for(uword i=0; i<n_elem; ++i)\n        {\n        out_mem[i] = upgrade_val<eT1,eT2>::apply(AA[i]) / upgrade_val<eT1,eT2>::apply(BB[i]);\n        }\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      (*out_mem) = upgrade_val<eT1,eT2>::apply(A.at(row,col)) / upgrade_val<eT1,eT2>::apply(B.at(row,col));\n      out_mem++;\n      }\n    }\n  }\n\n\n\n//! element-wise matrix multiplication with different element types\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_mixed_schur::apply(Mat<typename eT_promoter<T1,T2>::eT>& out, const mtGlue<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_schur>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  const Proxy<T1> A(X.A);\n  const Proxy<T2> B(X.B);\n  \n  arma_debug_assert_same_size(A, B, \"element-wise multiplication\");\n  \n  const uword n_rows = A.get_n_rows();\n  const uword n_cols = A.get_n_cols();\n  \n  out.set_size(n_rows, n_cols);\n  \n        out_eT* out_mem = out.memptr();\n  const uword   n_elem  = out.n_elem;\n    \n  const bool prefer_at_accessor = (Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type AA = A.get_ea();\n    typename Proxy<T2>::ea_type BB = B.get_ea();\n    \n    if(memory::is_aligned(out_mem))\n      {\n      memory::mark_as_aligned(out_mem);\n      \n      for(uword i=0; i<n_elem; ++i)\n        {\n        out_mem[i] = upgrade_val<eT1,eT2>::apply(AA[i]) * upgrade_val<eT1,eT2>::apply(BB[i]);\n        }\n      }\n    else\n      {\n      for(uword i=0; i<n_elem; ++i)\n        {\n        out_mem[i] = upgrade_val<eT1,eT2>::apply(AA[i]) * upgrade_val<eT1,eT2>::apply(BB[i]);\n        }\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      (*out_mem) = upgrade_val<eT1,eT2>::apply(A.at(row,col)) * upgrade_val<eT1,eT2>::apply(B.at(row,col));\n      out_mem++;\n      }\n    }\n  }\n\n\n\n//\n//\n//\n\n\n\n//! cube addition with different element types\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_mixed_plus::apply(Cube<typename eT_promoter<T1,T2>::eT>& out, const mtGlueCube<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_plus>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  const ProxyCube<T1> A(X.A);\n  const ProxyCube<T2> B(X.B);\n  \n  arma_debug_assert_same_size(A, B, \"addition\");\n  \n  const uword n_rows   = A.get_n_rows();\n  const uword n_cols   = A.get_n_cols();\n  const uword n_slices = A.get_n_slices();\n\n  out.set_size(n_rows, n_cols, n_slices);\n  \n        out_eT* out_mem = out.memptr();\n  const uword    n_elem = out.n_elem;\n  \n  const bool prefer_at_accessor = (ProxyCube<T1>::prefer_at_accessor || ProxyCube<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    typename ProxyCube<T1>::ea_type AA = A.get_ea();\n    typename ProxyCube<T2>::ea_type BB = B.get_ea();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      out_mem[i] = upgrade_val<eT1,eT2>::apply(AA[i]) + upgrade_val<eT1,eT2>::apply(BB[i]);\n      }\n    }\n  else\n    {\n    for(uword slice = 0; slice < n_slices; ++slice)\n    for(uword col   = 0; col   < n_cols;   ++col  )\n    for(uword row   = 0; row   < n_rows;   ++row  )\n      {\n      (*out_mem) = upgrade_val<eT1,eT2>::apply(A.at(row,col,slice)) + upgrade_val<eT1,eT2>::apply(B.at(row,col,slice));\n      out_mem++;\n      }\n    }\n  }\n\n\n\n//! cube subtraction with different element types\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_mixed_minus::apply(Cube<typename eT_promoter<T1,T2>::eT>& out, const mtGlueCube<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_minus>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  const ProxyCube<T1> A(X.A);\n  const ProxyCube<T2> B(X.B);\n  \n  arma_debug_assert_same_size(A, B, \"subtraction\");\n  \n  const uword n_rows   = A.get_n_rows();\n  const uword n_cols   = A.get_n_cols();\n  const uword n_slices = A.get_n_slices();\n\n  out.set_size(n_rows, n_cols, n_slices);\n  \n        out_eT* out_mem = out.memptr();\n  const uword    n_elem = out.n_elem;\n  \n  const bool prefer_at_accessor = (ProxyCube<T1>::prefer_at_accessor || ProxyCube<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    typename ProxyCube<T1>::ea_type AA = A.get_ea();\n    typename ProxyCube<T2>::ea_type BB = B.get_ea();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      out_mem[i] = upgrade_val<eT1,eT2>::apply(AA[i]) - upgrade_val<eT1,eT2>::apply(BB[i]);\n      }\n    }\n  else\n    {\n    for(uword slice = 0; slice < n_slices; ++slice)\n    for(uword col   = 0; col   < n_cols;   ++col  )\n    for(uword row   = 0; row   < n_rows;   ++row  )\n      {\n      (*out_mem) = upgrade_val<eT1,eT2>::apply(A.at(row,col,slice)) - upgrade_val<eT1,eT2>::apply(B.at(row,col,slice));\n      out_mem++;\n      }\n    }\n  }\n\n\n\n//! element-wise cube division with different element types\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_mixed_div::apply(Cube<typename eT_promoter<T1,T2>::eT>& out, const mtGlueCube<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_div>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  const ProxyCube<T1> A(X.A);\n  const ProxyCube<T2> B(X.B);\n  \n  arma_debug_assert_same_size(A, B, \"element-wise division\");\n  \n  const uword n_rows   = A.get_n_rows();\n  const uword n_cols   = A.get_n_cols();\n  const uword n_slices = A.get_n_slices();\n\n  out.set_size(n_rows, n_cols, n_slices);\n  \n        out_eT* out_mem = out.memptr();\n  const uword    n_elem = out.n_elem;\n  \n  const bool prefer_at_accessor = (ProxyCube<T1>::prefer_at_accessor || ProxyCube<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    typename ProxyCube<T1>::ea_type AA = A.get_ea();\n    typename ProxyCube<T2>::ea_type BB = B.get_ea();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      out_mem[i] = upgrade_val<eT1,eT2>::apply(AA[i]) / upgrade_val<eT1,eT2>::apply(BB[i]);\n      }\n    }\n  else\n    {\n    for(uword slice = 0; slice < n_slices; ++slice)\n    for(uword col   = 0; col   < n_cols;   ++col  )\n    for(uword row   = 0; row   < n_rows;   ++row  )\n      {\n      (*out_mem) = upgrade_val<eT1,eT2>::apply(A.at(row,col,slice)) / upgrade_val<eT1,eT2>::apply(B.at(row,col,slice));\n      out_mem++;\n      }\n    }\n  }\n\n\n\n//! element-wise cube multiplication with different element types\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_mixed_schur::apply(Cube<typename eT_promoter<T1,T2>::eT>& out, const mtGlueCube<typename eT_promoter<T1,T2>::eT, T1, T2, glue_mixed_schur>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  const ProxyCube<T1> A(X.A);\n  const ProxyCube<T2> B(X.B);\n  \n  arma_debug_assert_same_size(A, B, \"element-wise multiplication\");\n  \n  const uword n_rows   = A.get_n_rows();\n  const uword n_cols   = A.get_n_cols();\n  const uword n_slices = A.get_n_slices();\n\n  out.set_size(n_rows, n_cols, n_slices);\n  \n        out_eT* out_mem = out.memptr();\n  const uword    n_elem = out.n_elem;\n  \n  const bool prefer_at_accessor = (ProxyCube<T1>::prefer_at_accessor || ProxyCube<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    typename ProxyCube<T1>::ea_type AA = A.get_ea();\n    typename ProxyCube<T2>::ea_type BB = B.get_ea();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      out_mem[i] = upgrade_val<eT1,eT2>::apply(AA[i]) * upgrade_val<eT1,eT2>::apply(BB[i]);\n      }\n    }\n  else\n    {\n    for(uword slice = 0; slice < n_slices; ++slice)\n    for(uword col   = 0; col   < n_cols;   ++col  )\n    for(uword row   = 0; row   < n_rows;   ++row  )\n      {\n      (*out_mem) = upgrade_val<eT1,eT2>::apply(A.at(row,col,slice)) * upgrade_val<eT1,eT2>::apply(B.at(row,col,slice));\n      out_mem++;\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_relational_bones.hpp",
    "content": "// Copyright (C) 2009-2014 Conrad Sanderson\n// Copyright (C) 2009-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup glue_relational\n//! @{\n\n\n\nclass glue_rel_lt\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(Mat <uword>& out, const mtGlue<uword, T1, T2, glue_rel_lt>& X);\n  \n  template<typename T1, typename T2>\n  inline static void apply(Cube <uword>& out, const mtGlueCube<uword, T1, T2, glue_rel_lt>& X);\n  };\n\n\n\nclass glue_rel_gt\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(Mat <uword>& out, const mtGlue<uword, T1, T2, glue_rel_gt>& X);\n  \n  template<typename T1, typename T2>\n  inline static void apply(Cube <uword>& out, const mtGlueCube<uword, T1, T2, glue_rel_gt>& X);\n  };\n\n\n\nclass glue_rel_lteq\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(Mat <uword>& out, const mtGlue<uword, T1, T2, glue_rel_lteq>& X);\n  \n  template<typename T1, typename T2>\n  inline static void apply(Cube <uword>& out, const mtGlueCube<uword, T1, T2, glue_rel_lteq>& X);\n  };\n\n\n\nclass glue_rel_gteq\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(Mat <uword>& out, const mtGlue<uword, T1, T2, glue_rel_gteq>& X);\n  \n  template<typename T1, typename T2>\n  inline static void apply(Cube <uword>& out, const mtGlueCube<uword, T1, T2, glue_rel_gteq>& X);\n  };\n\n\n\nclass glue_rel_eq\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(Mat <uword>& out, const mtGlue<uword, T1, T2, glue_rel_eq>& X);\n  \n  template<typename T1, typename T2>\n  inline static void apply(Cube <uword>& out, const mtGlueCube<uword, T1, T2, glue_rel_eq>& X);\n  };\n\n\n\nclass glue_rel_noteq\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(Mat <uword>& out, const mtGlue<uword, T1, T2, glue_rel_noteq>& X);\n  \n  template<typename T1, typename T2>\n  inline static void apply(Cube <uword>& out, const mtGlueCube<uword, T1, T2, glue_rel_noteq>& X);\n  };\n\n\n\nclass glue_rel_and\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(Mat <uword>& out, const mtGlue<uword, T1, T2, glue_rel_and>& X);\n  \n  template<typename T1, typename T2>\n  inline static void apply(Cube <uword>& out, const mtGlueCube<uword, T1, T2, glue_rel_and>& X);\n  };\n\n\n\nclass glue_rel_or\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(Mat <uword>& out, const mtGlue<uword, T1, T2, glue_rel_or>& X);\n  \n  template<typename T1, typename T2>\n  inline static void apply(Cube <uword>& out, const mtGlueCube<uword, T1, T2, glue_rel_or>& X);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_relational_meat.hpp",
    "content": "// Copyright (C) 2009-2014 Conrad Sanderson\n// Copyright (C) 2009-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup glue_relational\n//! @{\n\n\n\n#undef operator_rel\n#undef operator_str\n\n#undef arma_applier_mat\n#undef arma_applier_cube\n\n\n#define arma_applier_mat(operator_rel, operator_str) \\\n  {\\\n  const Proxy<T1> P1(X.A);\\\n  const Proxy<T2> P2(X.B);\\\n  \\\n  arma_debug_assert_same_size(P1, P2, operator_str);\\\n  \\\n  const bool bad_alias = (Proxy<T1>::has_subview && P1.is_alias(out)) || (Proxy<T2>::has_subview && P2.is_alias(out));\\\n  \\\n  if(bad_alias == false)\\\n    {\\\n    \\\n    const uword n_rows = P1.get_n_rows();\\\n    const uword n_cols = P1.get_n_cols();\\\n    \\\n    out.set_size(n_rows, n_cols);\\\n    \\\n    uword* out_mem = out.memptr();\\\n    \\\n    const bool prefer_at_accessor = (Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor);\\\n    \\\n    if(prefer_at_accessor == false)\\\n      {\\\n      typename Proxy<T1>::ea_type A = P1.get_ea();\\\n      typename Proxy<T2>::ea_type B = P2.get_ea();\\\n      \\\n      const uword n_elem = out.n_elem;\\\n      \\\n      for(uword i=0; i<n_elem; ++i)\\\n        {\\\n        out_mem[i] = (A[i] operator_rel B[i]) ? uword(1) : uword(0);\\\n        }\\\n      }\\\n    else\\\n      {\\\n      if(n_rows == 1)\\\n        {\\\n        for(uword count=0; count < n_cols; ++count)\\\n          {\\\n          out_mem[count] = (P1.at(0,count) operator_rel P2.at(0,count)) ? uword(1) : uword(0);\\\n          }\\\n        }\\\n      else\\\n        {\\\n        for(uword col=0; col<n_cols; ++col)\\\n        for(uword row=0; row<n_rows; ++row)\\\n          {\\\n          *out_mem = (P1.at(row,col) operator_rel P2.at(row,col)) ? uword(1) : uword(0);\\\n          out_mem++;\\\n          }\\\n        }\\\n      }\\\n    }\\\n  else\\\n    {\\\n    const unwrap_check<typename Proxy<T1>::stored_type> tmp1(P1.Q, P1.is_alias(out));\\\n    const unwrap_check<typename Proxy<T2>::stored_type> tmp2(P2.Q, P2.is_alias(out));\\\n    \\\n    out = (tmp1.M) operator_rel (tmp2.M);\\\n    }\\\n  }\n\n\n\n\n#define arma_applier_cube(operator_rel, operator_str) \\\n  {\\\n  const ProxyCube<T1> P1(X.A);\\\n  const ProxyCube<T2> P2(X.B);\\\n  \\\n  arma_debug_assert_same_size(P1, P2, operator_str);\\\n  \\\n  const bool bad_alias = (ProxyCube<T1>::has_subview && P1.is_alias(out)) || (ProxyCube<T2>::has_subview && P2.is_alias(out));\\\n  \\\n  if(bad_alias == false)\\\n    {\\\n    \\\n    const uword n_rows   = P1.get_n_rows();\\\n    const uword n_cols   = P1.get_n_cols();\\\n    const uword n_slices = P1.get_n_slices();\\\n    \\\n    out.set_size(n_rows, n_cols, n_slices);\\\n    \\\n    uword* out_mem = out.memptr();\\\n    \\\n    const bool prefer_at_accessor = (ProxyCube<T1>::prefer_at_accessor || ProxyCube<T2>::prefer_at_accessor);\\\n    \\\n    if(prefer_at_accessor == false)\\\n      {\\\n      typename ProxyCube<T1>::ea_type A = P1.get_ea();\\\n      typename ProxyCube<T2>::ea_type B = P2.get_ea();\\\n      \\\n      const uword n_elem = out.n_elem;\\\n      \\\n      for(uword i=0; i<n_elem; ++i)\\\n        {\\\n        out_mem[i] = (A[i] operator_rel B[i]) ? uword(1) : uword(0);\\\n        }\\\n      }\\\n    else\\\n      {\\\n      for(uword slice = 0; slice < n_slices; ++slice)\\\n      for(uword col   = 0; col   < n_cols;   ++col  )\\\n      for(uword row   = 0; row   < n_rows;   ++row  )\\\n        {\\\n        *out_mem = (P1.at(row,col,slice) operator_rel P2.at(row,col,slice)) ? uword(1) : uword(0);\\\n        out_mem++;\\\n        }\\\n      }\\\n    }\\\n  else\\\n    {\\\n    const unwrap_cube<typename ProxyCube<T1>::stored_type> tmp1(P1.Q);\\\n    const unwrap_cube<typename ProxyCube<T2>::stored_type> tmp2(P2.Q);\\\n    \\\n    out = (tmp1.M) operator_rel (tmp2.M);\\\n    }\\\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_rel_lt::apply\n  (\n        Mat   <uword>& out,\n  const mtGlue<uword, T1, T2, glue_rel_lt>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat(<, \"operator<\");\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_rel_gt::apply\n  (\n        Mat   <uword>& out,\n  const mtGlue<uword, T1, T2, glue_rel_gt>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat(>, \"operator>\");\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_rel_lteq::apply\n  (\n        Mat   <uword>& out,\n  const mtGlue<uword, T1, T2, glue_rel_lteq>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat(<=, \"operator<=\");\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_rel_gteq::apply\n  (\n        Mat   <uword>& out,\n  const mtGlue<uword, T1, T2, glue_rel_gteq>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat(>=, \"operator>=\");\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_rel_eq::apply\n  (\n        Mat   <uword>& out,\n  const mtGlue<uword, T1, T2, glue_rel_eq>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat(==, \"operator==\");\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_rel_noteq::apply\n  (\n        Mat   <uword>& out,\n  const mtGlue<uword, T1, T2, glue_rel_noteq>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat(!=, \"operator!=\");\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_rel_and::apply\n  (\n        Mat   <uword>& out,\n  const mtGlue<uword, T1, T2, glue_rel_and>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat(&&, \"operator&&\");\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_rel_or::apply\n  (\n        Mat   <uword>& out,\n  const mtGlue<uword, T1, T2, glue_rel_or>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat(||, \"operator||\");\n  }\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_rel_lt::apply\n  (\n        Cube      <uword>& out,\n  const mtGlueCube<uword, T1, T2, glue_rel_lt>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube(<, \"operator<\");\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_rel_gt::apply\n  (\n        Cube      <uword>& out,\n  const mtGlueCube<uword, T1, T2, glue_rel_gt>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube(>, \"operator>\");\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_rel_lteq::apply\n  (\n        Cube      <uword>& out,\n  const mtGlueCube<uword, T1, T2, glue_rel_lteq>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube(<=, \"operator<=\");\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_rel_gteq::apply\n  (\n        Cube      <uword>& out,\n  const mtGlueCube<uword, T1, T2, glue_rel_gteq>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube(>=, \"operator>=\");\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_rel_eq::apply\n  (\n        Cube      <uword>& out,\n  const mtGlueCube<uword, T1, T2, glue_rel_eq>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube(==, \"operator==\");\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_rel_noteq::apply\n  (\n        Cube      <uword>& out,\n  const mtGlueCube<uword, T1, T2, glue_rel_noteq>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube(!=, \"operator!=\");\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_rel_and::apply\n  (\n        Cube      <uword>& out,\n  const mtGlueCube<uword, T1, T2, glue_rel_and>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube(&&, \"operator&&\");\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_rel_or::apply\n  (\n        Cube      <uword>& out,\n  const mtGlueCube<uword, T1, T2, glue_rel_or>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube(||, \"operator||\");\n  }\n\n\n\n#undef arma_applier_mat\n#undef arma_applier_cube\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_solve_bones.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup glue_solve\n//! @{\n\n\n\nclass glue_solve\n  {\n  public:\n  \n  template<typename eT, typename T2> inline static void solve_direct(Mat<eT>& out, Mat<eT>& A, const Base<eT,T2>& X, const bool slow);\n  \n  template<typename T1, typename T2> inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_solve>& X);\n  };\n\n\n\nclass glue_solve_tr\n  {\n  public:\n  \n  template<typename T1, typename T2> inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_solve_tr>& X);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_solve_meat.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup glue_solve\n//! @{\n\n\n\ntemplate<typename eT, typename T2>\ninline\nvoid\nglue_solve::solve_direct(Mat<eT>& out, Mat<eT>& A, const Base<eT,T2>& X, const bool slow)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword A_n_rows = A.n_rows;\n  const uword A_n_cols = A.n_cols;\n  \n  bool status = false;\n  \n  if(A_n_rows == A_n_cols)\n    {\n    status = auxlib::solve(out, A, X, slow);\n    }\n  else\n  if(A_n_rows > A_n_cols)\n    {\n    arma_extra_debug_print(\"solve(): detected over-determined system\");\n    status = auxlib::solve_od(out, A, X);\n    }\n  else\n    {\n    arma_extra_debug_print(\"solve(): detected under-determined system\");\n    status = auxlib::solve_ud(out, A, X);\n    }\n  \n  if(status == false)\n    {\n    out.reset();\n    arma_bad(\"solve(): solution not found\");\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_solve::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_solve>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  Mat<eT> A = X.A.get_ref();\n  \n  glue_solve::solve_direct( out, A, X.B, (X.aux_uword == 1) );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_solve_tr::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_solve_tr>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_check<T1> A_tmp(X.A, out);\n  const unwrap_check<T2> B_tmp(X.B, out);\n  \n  const Mat<eT>& A = A_tmp.M;\n  const Mat<eT>& B = B_tmp.M;\n  \n  bool  err_state = false;\n  char* err_msg   = 0;\n  \n  arma_debug_set_error( err_state, err_msg, ((&A) == (&B)),           \"solve(): A is an alias of B\" );\n  arma_debug_set_error( err_state, err_msg, (A.n_rows != B.n_rows),   \"solve(): number of rows in A and B must be the same\" );\n  arma_debug_set_error( err_state, err_msg, (A.is_square() == false), \"solve(): A is not a square matrix\" );\n  \n  arma_debug_check(err_state, err_msg);\n  \n  const bool status = auxlib::solve_tr(out, A, B, X.aux_uword);\n  \n  if(status == false)\n    {\n    out.reset();\n    arma_bad(\"solve(): solution not found\");\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_times_bones.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup glue_times\n//! @{\n\n\n\n//! \\brief\n//! Template metaprogram depth_lhs\n//! calculates the number of Glue<Tx,Ty, glue_type> instances on the left hand side argument of Glue<Tx,Ty, glue_type>\n//! i.e. it recursively expands each Tx, until the type of Tx is not \"Glue<..,.., glue_type>\"  (i.e the \"glue_type\" changes)\n\ntemplate<typename glue_type, typename T1>\nstruct depth_lhs\n  {\n  static const uword num = 0;\n  };\n\ntemplate<typename glue_type, typename T1, typename T2>\nstruct depth_lhs< glue_type, Glue<T1,T2,glue_type> >\n  {\n  static const uword num = 1 + depth_lhs<glue_type, T1>::num;\n  };\n\n\n\ntemplate<bool do_inv_detect>\nstruct glue_times_redirect2_helper\n  {\n  template<typename T1, typename T2>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_times>& X);\n  };\n\n\ntemplate<>\nstruct glue_times_redirect2_helper<true>\n  {\n  template<typename T1, typename T2>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_times>& X);\n  };\n\n\n\ntemplate<bool do_inv_detect>\nstruct glue_times_redirect3_helper\n  {\n  template<typename T1, typename T2, typename T3>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Glue< Glue<T1,T2,glue_times>,T3,glue_times>& X);\n  };\n\n\ntemplate<>\nstruct glue_times_redirect3_helper<true>\n  {\n  template<typename T1, typename T2, typename T3>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Glue< Glue<T1,T2,glue_times>,T3,glue_times>& X);\n  };\n\n\n\ntemplate<uword N>\nstruct glue_times_redirect\n  {\n  template<typename T1, typename T2>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_times>& X);\n  };\n\n\ntemplate<>\nstruct glue_times_redirect<2>\n  {\n  template<typename T1, typename T2>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_times>& X);\n  };\n\n\ntemplate<>\nstruct glue_times_redirect<3>\n  {\n  template<typename T1, typename T2, typename T3>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Glue< Glue<T1,T2,glue_times>,T3,glue_times>& X);\n  };\n\n\ntemplate<>\nstruct glue_times_redirect<4>\n  {\n  template<typename T1, typename T2, typename T3, typename T4>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Glue< Glue< Glue<T1,T2,glue_times>, T3, glue_times>, T4, glue_times>& X);\n  };\n\n\n\n//! Class which implements the immediate multiplication of two or more matrices\nclass glue_times\n  {\n  public:\n  \n  \n  template<typename T1, typename T2>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_times>& X);\n  \n  \n  template<typename T1>\n  arma_hot inline static void apply_inplace(Mat<typename T1::elem_type>& out, const T1& X);\n  \n  template<typename T1, typename T2>\n  arma_hot inline static void apply_inplace_plus(Mat<typename T1::elem_type>& out, const Glue<T1, T2, glue_times>& X, const sword sign);\n  \n  //\n  \n  template<typename eT, const bool do_trans_A, const bool do_trans_B, typename TA, typename TB>\n  arma_inline static uword mul_storage_cost(const TA& A, const TB& B);\n  \n  template<typename eT, const bool do_trans_A, const bool do_trans_B, const bool do_scalar_times, typename TA, typename TB>\n  arma_hot inline static void apply(Mat<eT>& out, const TA& A, const TB& B, const eT val);\n  \n  template<typename eT, const bool do_trans_A, const bool do_trans_B, const bool do_trans_C, const bool do_scalar_times, typename TA, typename TB, typename TC>\n  arma_hot inline static void apply(Mat<eT>& out, const TA& A, const TB& B, const TC& C, const eT val);\n  \n  template<typename eT, const bool do_trans_A, const bool do_trans_B, const bool do_trans_C, const bool do_trans_D, const bool do_scalar_times, typename TA, typename TB, typename TC, typename TD>\n  arma_hot inline static void apply(Mat<eT>& out, const TA& A, const TB& B, const TC& C, const TD& D, const eT val);\n  };\n\n\n\nclass glue_times_diag\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1, T2, glue_times_diag>& X);\n  \n  };\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_times_meat.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup glue_times\n//! @{\n\n\n\ntemplate<bool do_inv_detect>\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\nglue_times_redirect2_helper<do_inv_detect>::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_times>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const partial_unwrap<T1> tmp1(X.A);\n  const partial_unwrap<T2> tmp2(X.B);\n  \n  const typename partial_unwrap<T1>::stored_type& A = tmp1.M;\n  const typename partial_unwrap<T2>::stored_type& B = tmp2.M;\n  \n  const bool use_alpha = partial_unwrap<T1>::do_times || partial_unwrap<T2>::do_times;\n  const eT       alpha = use_alpha ? (tmp1.get_val() * tmp2.get_val()) : eT(0);\n  \n  const bool alias = tmp1.is_alias(out) || tmp2.is_alias(out);\n  \n  if(alias == false)\n    {\n    glue_times::apply\n      <\n      eT,\n      partial_unwrap<T1>::do_trans,\n      partial_unwrap<T2>::do_trans,\n      (partial_unwrap<T1>::do_times || partial_unwrap<T2>::do_times)\n      >\n      (out, A, B, alpha);\n    }\n  else\n    {\n    Mat<eT> tmp;\n    \n    glue_times::apply\n      <\n      eT,\n      partial_unwrap<T1>::do_trans,\n      partial_unwrap<T2>::do_trans,\n      (partial_unwrap<T1>::do_times || partial_unwrap<T2>::do_times)\n      >\n      (tmp, A, B, alpha);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\nglue_times_redirect2_helper<true>::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_times>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  if(strip_inv<T1>::do_inv == true)\n    {\n    arma_extra_debug_print(\"glue_times_redirect<2>::apply(): detected inv(A)*B\");\n    \n    const strip_inv<T1> A_strip(X.A);\n    \n    Mat<eT> A = A_strip.M;\n    \n    arma_debug_check( (A.is_square() == false), \"inv(): given matrix is not square\" );\n    \n    const unwrap_check<T2> B_tmp(X.B, out);\n    const Mat<eT>& B = B_tmp.M;\n    \n    arma_debug_assert_mul_size(A, B, \"matrix multiplication\");\n    \n    glue_solve::solve_direct( out, A, B, A_strip.slow );\n    \n    return;\n    }\n  \n  glue_times_redirect2_helper<false>::apply(out, X);\n  }\n\n\n\ntemplate<bool do_inv_detect>\ntemplate<typename T1, typename T2, typename T3>\narma_hot\ninline\nvoid\nglue_times_redirect3_helper<do_inv_detect>::apply(Mat<typename T1::elem_type>& out, const Glue< Glue<T1,T2,glue_times>, T3, glue_times>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  // we have exactly 3 objects\n  // hence we can safely expand X as X.A.A, X.A.B and X.B\n  \n  const partial_unwrap<T1> tmp1(X.A.A);\n  const partial_unwrap<T2> tmp2(X.A.B);\n  const partial_unwrap<T3> tmp3(X.B  );\n  \n  const typename partial_unwrap<T1>::stored_type& A = tmp1.M;\n  const typename partial_unwrap<T2>::stored_type& B = tmp2.M;\n  const typename partial_unwrap<T3>::stored_type& C = tmp3.M;\n  \n  const bool use_alpha = partial_unwrap<T1>::do_times || partial_unwrap<T2>::do_times || partial_unwrap<T3>::do_times;\n  const eT       alpha = use_alpha ? (tmp1.get_val() * tmp2.get_val() * tmp3.get_val()) : eT(0);\n  \n  const bool alias = tmp1.is_alias(out) || tmp2.is_alias(out) || tmp3.is_alias(out);\n  \n  if(alias == false)\n    {\n    glue_times::apply\n      <\n      eT,\n      partial_unwrap<T1>::do_trans,\n      partial_unwrap<T2>::do_trans,\n      partial_unwrap<T3>::do_trans,\n      (partial_unwrap<T1>::do_times || partial_unwrap<T2>::do_times || partial_unwrap<T3>::do_times)\n      >\n      (out, A, B, C, alpha);\n    }\n  else\n    {\n    Mat<eT> tmp;\n    \n    glue_times::apply\n      <\n      eT,\n      partial_unwrap<T1>::do_trans,\n      partial_unwrap<T2>::do_trans,\n      partial_unwrap<T3>::do_trans,\n      (partial_unwrap<T1>::do_times || partial_unwrap<T2>::do_times || partial_unwrap<T3>::do_times)\n      >\n      (tmp, A, B, C, alpha);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2, typename T3>\narma_hot\ninline\nvoid\nglue_times_redirect3_helper<true>::apply(Mat<typename T1::elem_type>& out, const Glue< Glue<T1,T2,glue_times>, T3, glue_times>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  if(strip_inv<T1>::do_inv == true)\n    {\n    // replace inv(A)*B*C with solve(A,B*C);\n    \n    arma_extra_debug_print(\"glue_times_redirect<3>::apply(): detected inv(A)*B*C\");\n    \n    const strip_inv<T1> A_strip(X.A.A);\n    \n    Mat<eT> A = A_strip.M;\n    \n    arma_debug_check( (A.is_square() == false), \"inv(): given matrix is not square\" );\n    \n    const partial_unwrap<T2> tmp2(X.A.B);\n    const partial_unwrap<T3> tmp3(X.B  );\n    \n    const typename partial_unwrap<T2>::stored_type& B = tmp2.M;\n    const typename partial_unwrap<T3>::stored_type& C = tmp3.M;\n    \n    const bool use_alpha = partial_unwrap<T2>::do_times || partial_unwrap<T3>::do_times;\n    const eT       alpha = use_alpha ? (tmp2.get_val() * tmp3.get_val()) : eT(0);\n    \n    Mat<eT> BC;\n    \n    glue_times::apply\n      <\n      eT,\n      partial_unwrap<T2>::do_trans,\n      partial_unwrap<T3>::do_trans,\n      (partial_unwrap<T2>::do_times || partial_unwrap<T3>::do_times)\n      >\n      (BC, B, C, alpha);\n    \n    arma_debug_assert_mul_size(A, BC, \"matrix multiplication\");\n    \n    glue_solve::solve_direct( out, A, BC, A_strip.slow );\n    \n    return;\n    }\n  \n  \n  if(strip_inv<T2>::do_inv == true)\n    {\n    // replace A*inv(B)*C with A*solve(B,C)\n    \n    arma_extra_debug_print(\"glue_times_redirect<3>::apply(): detected A*inv(B)*C\");\n    \n    const strip_inv<T2> B_strip(X.A.B);\n    \n    Mat<eT> B = B_strip.M;\n    \n    arma_debug_check( (B.is_square() == false), \"inv(): given matrix is not square\" );\n    \n    const unwrap<T3> C_tmp(X.B);\n    const Mat<eT>& C = C_tmp.M;\n    \n    arma_debug_assert_mul_size(B, C, \"matrix multiplication\");\n    \n    Mat<eT> solve_result;\n    \n    glue_solve::solve_direct( solve_result, B, C, B_strip.slow );\n    \n    const partial_unwrap_check<T1> tmp1(X.A.A, out);\n    \n    const typename partial_unwrap_check<T1>::stored_type& A = tmp1.M;\n    \n    const bool use_alpha = partial_unwrap_check<T1>::do_times;\n    const eT       alpha = use_alpha ? tmp1.get_val() : eT(0);\n    \n    glue_times::apply\n      <\n      eT,\n      partial_unwrap_check<T1>::do_trans,\n      false,\n      partial_unwrap_check<T1>::do_times\n      >\n      (out, A, solve_result, alpha);\n    \n    return;\n    }\n  \n  \n  glue_times_redirect3_helper<false>::apply(out, X);\n  }\n\n\n\ntemplate<uword N>\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\nglue_times_redirect<N>::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_times>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const partial_unwrap<T1> tmp1(X.A);\n  const partial_unwrap<T2> tmp2(X.B);\n  \n  const typename partial_unwrap<T1>::stored_type& A = tmp1.M;\n  const typename partial_unwrap<T2>::stored_type& B = tmp2.M;\n  \n  const bool use_alpha = partial_unwrap<T1>::do_times || partial_unwrap<T2>::do_times;\n  const eT       alpha = use_alpha ? (tmp1.get_val() * tmp2.get_val()) : eT(0);\n  \n  const bool alias = tmp1.is_alias(out) || tmp2.is_alias(out);\n  \n  if(alias == false)\n    {\n    glue_times::apply\n      <\n      eT,\n      partial_unwrap<T1>::do_trans,\n      partial_unwrap<T2>::do_trans,\n      (partial_unwrap<T1>::do_times || partial_unwrap<T2>::do_times)\n      >\n      (out, A, B, alpha);\n    }\n  else\n    {\n    Mat<eT> tmp;\n    \n    glue_times::apply\n      <\n      eT,\n      partial_unwrap<T1>::do_trans,\n      partial_unwrap<T2>::do_trans,\n      (partial_unwrap<T1>::do_times || partial_unwrap<T2>::do_times)\n      >\n      (tmp, A, B, alpha);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\nglue_times_redirect<2>::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_times>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  glue_times_redirect2_helper< is_supported_blas_type<eT>::value >::apply(out, X);\n  }\n\n\n\ntemplate<typename T1, typename T2, typename T3>\narma_hot\ninline\nvoid\nglue_times_redirect<3>::apply(Mat<typename T1::elem_type>& out, const Glue< Glue<T1,T2,glue_times>, T3, glue_times>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  glue_times_redirect3_helper< is_supported_blas_type<eT>::value >::apply(out, X);\n  }\n\n\n\ntemplate<typename T1, typename T2, typename T3, typename T4>\narma_hot\ninline\nvoid\nglue_times_redirect<4>::apply(Mat<typename T1::elem_type>& out, const Glue< Glue< Glue<T1,T2,glue_times>, T3, glue_times>, T4, glue_times>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  // there is exactly 4 objects\n  // hence we can safely expand X as X.A.A.A, X.A.A.B, X.A.B and X.B\n  \n  const partial_unwrap<T1> tmp1(X.A.A.A);\n  const partial_unwrap<T2> tmp2(X.A.A.B);\n  const partial_unwrap<T3> tmp3(X.A.B  );\n  const partial_unwrap<T4> tmp4(X.B    );\n  \n  const typename partial_unwrap<T1>::stored_type& A = tmp1.M;\n  const typename partial_unwrap<T2>::stored_type& B = tmp2.M;\n  const typename partial_unwrap<T3>::stored_type& C = tmp3.M;\n  const typename partial_unwrap<T4>::stored_type& D = tmp4.M;\n  \n  const bool use_alpha = partial_unwrap<T1>::do_times || partial_unwrap<T2>::do_times || partial_unwrap<T3>::do_times || partial_unwrap<T4>::do_times;\n  const eT       alpha = use_alpha ? (tmp1.get_val() * tmp2.get_val() * tmp3.get_val() * tmp4.get_val()) : eT(0);\n  \n  const bool alias = tmp1.is_alias(out) || tmp2.is_alias(out) || tmp3.is_alias(out) || tmp4.is_alias(out);\n  \n  if(alias == false)\n    {\n    glue_times::apply\n      <\n      eT,\n      partial_unwrap<T1>::do_trans,\n      partial_unwrap<T2>::do_trans,\n      partial_unwrap<T3>::do_trans,\n      partial_unwrap<T4>::do_trans,\n      (partial_unwrap<T1>::do_times || partial_unwrap<T2>::do_times || partial_unwrap<T3>::do_times || partial_unwrap<T4>::do_times)\n      >\n      (out, A, B, C, D, alpha);\n    }\n  else\n    {\n    Mat<eT> tmp;\n    \n    glue_times::apply\n      <\n      eT,\n      partial_unwrap<T1>::do_trans,\n      partial_unwrap<T2>::do_trans,\n      partial_unwrap<T3>::do_trans,\n      partial_unwrap<T4>::do_trans,\n      (partial_unwrap<T1>::do_times || partial_unwrap<T2>::do_times || partial_unwrap<T3>::do_times || partial_unwrap<T4>::do_times)\n      >\n      (tmp, A, B, C, D, alpha);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\nglue_times::apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_times>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const sword N_mat = 1 + depth_lhs< glue_times, Glue<T1,T2,glue_times> >::num;\n  \n  arma_extra_debug_print(arma_boost::format(\"N_mat = %d\") % N_mat);\n  \n  glue_times_redirect<N_mat>::apply(out, X);\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nglue_times::apply_inplace(Mat<typename T1::elem_type>& out, const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  out = out * X;\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\nglue_times::apply_inplace_plus(Mat<typename T1::elem_type>& out, const Glue<T1, T2, glue_times>& X, const sword sign)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result  T;\n  \n  if( (is_outer_product<T1>::value) || (has_op_inv<T1>::value) || (has_op_inv<T2>::value) )\n    {\n    // partial workaround for corner cases\n    \n    const Mat<eT> tmp(X);\n    \n    if(sign > sword(0))  { out += tmp; }  else  { out -= tmp; }\n    \n    return;\n    }\n  \n  const partial_unwrap_check<T1> tmp1(X.A, out);\n  const partial_unwrap_check<T2> tmp2(X.B, out);\n  \n  typedef typename partial_unwrap_check<T1>::stored_type TA;\n  typedef typename partial_unwrap_check<T2>::stored_type TB;\n  \n  const TA& A = tmp1.M;\n  const TB& B = tmp2.M;\n  \n  const bool do_trans_A = partial_unwrap_check<T1>::do_trans;\n  const bool do_trans_B = partial_unwrap_check<T2>::do_trans;\n  \n  const bool use_alpha = partial_unwrap_check<T1>::do_times || partial_unwrap_check<T2>::do_times || (sign < sword(0));\n  \n  const eT       alpha = use_alpha ? ( tmp1.get_val() * tmp2.get_val() * ( (sign > sword(0)) ? eT(1) : eT(-1) ) ) : eT(0);\n  \n  arma_debug_assert_mul_size(A, B, do_trans_A, do_trans_B, \"matrix multiplication\");\n  \n  const uword result_n_rows = (do_trans_A == false) ? (TA::is_row ? 1 : A.n_rows) : (TA::is_col ? 1 : A.n_cols);\n  const uword result_n_cols = (do_trans_B == false) ? (TB::is_col ? 1 : B.n_cols) : (TB::is_row ? 1 : B.n_rows);\n  \n  arma_debug_assert_same_size(out.n_rows, out.n_cols, result_n_rows, result_n_cols, ( (sign > sword(0)) ? \"addition\" : \"subtraction\" ) );\n  \n  if(out.n_elem == 0)\n    {\n    return;\n    }\n  \n  \n  if( (do_trans_A == false) && (do_trans_B == false) && (use_alpha == false) )\n    {\n         if( ((A.n_rows == 1) || (TA::is_row)) && (is_cx<eT>::no) )  { gemv<true,         false, true>::apply(out.memptr(), B, A.memptr(), alpha, eT(1)); }\n    else if(  (B.n_cols == 1) || (TB::is_col)                     )  { gemv<false,        false, true>::apply(out.memptr(), A, B.memptr(), alpha, eT(1)); }\n    else                                                             { gemm<false, false, false, true>::apply(out,          A, B,          alpha, eT(1)); }\n    }\n  else\n  if( (do_trans_A == false) && (do_trans_B == false) && (use_alpha == true) )\n    {\n         if( ((A.n_rows == 1) || (TA::is_row)) && (is_cx<eT>::no) )  { gemv<true,         true, true>::apply(out.memptr(), B, A.memptr(), alpha, eT(1)); }\n    else if(  (B.n_cols == 1) || (TB::is_col)                     )  { gemv<false,        true, true>::apply(out.memptr(), A, B.memptr(), alpha, eT(1)); }\n    else                                                             { gemm<false, false, true, true>::apply(out,          A, B,          alpha, eT(1)); }\n    }\n  else\n  if( (do_trans_A == true) && (do_trans_B == false) && (use_alpha == false) )\n    {\n         if( ((A.n_cols == 1) || (TA::is_col)) && (is_cx<eT>::no)  )  { gemv<true,        false, true>::apply(out.memptr(), B, A.memptr(), alpha, eT(1)); }\n    else if(  (B.n_cols == 1) || (TB::is_col)                      )  { gemv<true,        false, true>::apply(out.memptr(), A, B.memptr(), alpha, eT(1)); }\n    else if( (void_ptr(&A) == void_ptr(&B))    && (is_cx<eT>::no)  )  { syrk<true,        false, true>::apply(out,          A,             alpha, eT(1)); }\n    else if( (void_ptr(&A) == void_ptr(&B))    && (is_cx<eT>::yes) )  { herk<true,        false, true>::apply(out,          A,              T(0),  T(1)); }\n    else                                                              { gemm<true, false, false, true>::apply(out,          A, B,          alpha, eT(1)); }\n    }\n  else\n  if( (do_trans_A == true) && (do_trans_B == false) && (use_alpha == true) )\n    {\n         if( ((A.n_cols == 1) || (TA::is_col)) && (is_cx<eT>::no) )  { gemv<true,        true, true>::apply(out.memptr(), B, A.memptr(), alpha, eT(1)); }\n    else if(  (B.n_cols == 1) || (TB::is_col)                     )  { gemv<true,        true, true>::apply(out.memptr(), A, B.memptr(), alpha, eT(1)); }\n    else if( (void_ptr(&A) == void_ptr(&B))    && (is_cx<eT>::no) )  { syrk<true,        true, true>::apply(out,          A,             alpha, eT(1)); }\n    else                                                             { gemm<true, false, true, true>::apply(out,          A, B,          alpha, eT(1)); }\n    }\n  else\n  if( (do_trans_A == false) && (do_trans_B == true) && (use_alpha == false) )\n    {\n         if( ((A.n_rows == 1) || (TA::is_row)) && (is_cx<eT>::no)  )  { gemv<false,       false, true>::apply(out.memptr(), B, A.memptr(), alpha, eT(1)); }\n    else if( ((B.n_rows == 1) || (TB::is_row)) && (is_cx<eT>::no)  )  { gemv<false,       false, true>::apply(out.memptr(), A, B.memptr(), alpha, eT(1)); }\n    else if( (void_ptr(&A) == void_ptr(&B))    && (is_cx<eT>::no)  )  { syrk<false,       false, true>::apply(out,          A,             alpha, eT(1)); }\n    else if( (void_ptr(&A) == void_ptr(&B))    && (is_cx<eT>::yes) )  { herk<false,       false, true>::apply(out,          A,              T(0),  T(1)); }\n    else                                                              { gemm<false, true, false, true>::apply(out,          A, B,          alpha, eT(1)); }\n    }\n  else\n  if( (do_trans_A == false) && (do_trans_B == true) && (use_alpha == true) )\n    {\n         if( ((A.n_rows == 1) || (TA::is_row)) && (is_cx<eT>::no) )  { gemv<false,       true, true>::apply(out.memptr(), B, A.memptr(), alpha, eT(1)); }\n    else if( ((B.n_rows == 1) || (TB::is_row)) && (is_cx<eT>::no) )  { gemv<false,       true, true>::apply(out.memptr(), A, B.memptr(), alpha, eT(1)); }\n    else if( (void_ptr(&A) == void_ptr(&B))    && (is_cx<eT>::no) )  { syrk<false,       true, true>::apply(out,          A,             alpha, eT(1)); }\n    else                                                             { gemm<false, true, true, true>::apply(out,          A, B,          alpha, eT(1)); }\n    }\n  else\n  if( (do_trans_A == true) && (do_trans_B == true) && (use_alpha == false) )\n    {\n         if( ((A.n_cols == 1) || (TA::is_col)) && (is_cx<eT>::no) )  { gemv<false,      false, true>::apply(out.memptr(), B, A.memptr(), alpha, eT(1)); }\n    else if( ((B.n_rows == 1) || (TB::is_row)) && (is_cx<eT>::no) )  { gemv<true,       false, true>::apply(out.memptr(), A, B.memptr(), alpha, eT(1)); }\n    else                                                             { gemm<true, true, false, true>::apply(out,          A, B,          alpha, eT(1)); }\n    }\n  else\n  if( (do_trans_A == true) && (do_trans_B == true) && (use_alpha == true) )\n    {\n         if( ((A.n_cols == 1) || (TA::is_col)) && (is_cx<eT>::no) )  { gemv<false,      true, true>::apply(out.memptr(), B, A.memptr(), alpha, eT(1)); }\n    else if( ((B.n_rows == 1) || (TB::is_row)) && (is_cx<eT>::no) )  { gemv<true,       true, true>::apply(out.memptr(), A, B.memptr(), alpha, eT(1)); }\n    else                                                             { gemm<true, true, true, true>::apply(out,          A, B,          alpha, eT(1)); }\n    }\n  }\n\n\n\ntemplate<typename eT, const bool do_trans_A, const bool do_trans_B, typename TA, typename TB>\narma_inline\nuword\nglue_times::mul_storage_cost(const TA& A, const TB& B)\n  {\n  const uword final_A_n_rows = (do_trans_A == false) ? ( TA::is_row ? 1 : A.n_rows ) : ( TA::is_col ? 1 : A.n_cols );\n  const uword final_B_n_cols = (do_trans_B == false) ? ( TB::is_col ? 1 : B.n_cols ) : ( TB::is_row ? 1 : B.n_rows );\n  \n  return final_A_n_rows * final_B_n_cols;\n  }\n\n\n\ntemplate\n  <\n  typename   eT,\n  const bool do_trans_A,\n  const bool do_trans_B,\n  const bool use_alpha,\n  typename   TA,\n  typename   TB\n  >\narma_hot\ninline\nvoid\nglue_times::apply\n  (\n        Mat<eT>& out,\n  const TA&      A,\n  const TB&      B,\n  const eT       alpha\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  //arma_debug_assert_mul_size(A, B, do_trans_A, do_trans_B, \"matrix multiplication\");\n  arma_debug_assert_trans_mul_size<do_trans_A, do_trans_B>(A.n_rows, A.n_cols, B.n_rows, B.n_cols, \"matrix multiplication\");\n  \n  const uword final_n_rows = (do_trans_A == false) ? (TA::is_row ? 1 : A.n_rows) : (TA::is_col ? 1 : A.n_cols);\n  const uword final_n_cols = (do_trans_B == false) ? (TB::is_col ? 1 : B.n_cols) : (TB::is_row ? 1 : B.n_rows);\n  \n  out.set_size(final_n_rows, final_n_cols);\n  \n  if( (A.n_elem == 0) || (B.n_elem == 0) )\n    {\n    out.zeros();\n    return;\n    }\n  \n  \n  if( (do_trans_A == false) && (do_trans_B == false) && (use_alpha == false) )\n    {\n         if( ((A.n_rows == 1) || (TA::is_row)) && (is_cx<eT>::no) )  { gemv<true,         false, false>::apply(out.memptr(), B, A.memptr()); }\n    else if(  (B.n_cols == 1) || (TB::is_col)                     )  { gemv<false,        false, false>::apply(out.memptr(), A, B.memptr()); }\n    else                                                             { gemm<false, false, false, false>::apply(out,          A, B         ); }\n    }\n  else\n  if( (do_trans_A == false) && (do_trans_B == false) && (use_alpha == true) )\n    {\n         if( ((A.n_rows == 1) || (TA::is_row)) && (is_cx<eT>::no) )  { gemv<true,         true, false>::apply(out.memptr(), B, A.memptr(), alpha); }\n    else if(  (B.n_cols == 1) || (TB::is_col)                     )  { gemv<false,        true, false>::apply(out.memptr(), A, B.memptr(), alpha); }\n    else                                                             { gemm<false, false, true, false>::apply(out,          A, B,          alpha); }\n    }\n  else\n  if( (do_trans_A == true) && (do_trans_B == false) && (use_alpha == false) )\n    {\n         if( ((A.n_cols == 1) || (TA::is_col)) && (is_cx<eT>::no)  )  { gemv<true,        false, false>::apply(out.memptr(), B, A.memptr()); }\n    else if(  (B.n_cols == 1) || (TB::is_col)                      )  { gemv<true,        false, false>::apply(out.memptr(), A, B.memptr()); }\n    else if( (void_ptr(&A) == void_ptr(&B))    && (is_cx<eT>::no)  )  { syrk<true,        false, false>::apply(out,          A            ); }\n    else if( (void_ptr(&A) == void_ptr(&B))    && (is_cx<eT>::yes) )  { herk<true,        false, false>::apply(out,          A            ); }\n    else                                                              { gemm<true, false, false, false>::apply(out,          A, B         ); }\n    }\n  else\n  if( (do_trans_A == true) && (do_trans_B == false) && (use_alpha == true) )\n    {\n         if( ((A.n_cols == 1) || (TA::is_col)) && (is_cx<eT>::no) )  { gemv<true,        true, false>::apply(out.memptr(), B, A.memptr(), alpha); }\n    else if(  (B.n_cols == 1) || (TB::is_col)                     )  { gemv<true,        true, false>::apply(out.memptr(), A, B.memptr(), alpha); }\n    else if( (void_ptr(&A) == void_ptr(&B))    && (is_cx<eT>::no) )  { syrk<true,        true, false>::apply(out,          A,             alpha); }\n    else                                                             { gemm<true, false, true, false>::apply(out,          A, B,          alpha); }\n    }\n  else\n  if( (do_trans_A == false) && (do_trans_B == true) && (use_alpha == false) )\n    {\n         if( ((A.n_rows == 1) || (TA::is_row)) && (is_cx<eT>::no)  )  { gemv<false,       false, false>::apply(out.memptr(), B, A.memptr()); }\n    else if( ((B.n_rows == 1) || (TB::is_row)) && (is_cx<eT>::no)  )  { gemv<false,       false, false>::apply(out.memptr(), A, B.memptr()); }\n    else if( (void_ptr(&A) == void_ptr(&B))    && (is_cx<eT>::no)  )  { syrk<false,       false, false>::apply(out,          A            ); }\n    else if( (void_ptr(&A) == void_ptr(&B))    && (is_cx<eT>::yes) )  { herk<false,       false, false>::apply(out,          A            ); }\n    else                                                              { gemm<false, true, false, false>::apply(out,          A, B         ); }\n    }\n  else\n  if( (do_trans_A == false) && (do_trans_B == true) && (use_alpha == true) )\n    {\n         if( ((A.n_rows == 1) || (TA::is_row)) && (is_cx<eT>::no) ) { gemv<false,       true, false>::apply(out.memptr(), B, A.memptr(), alpha); }\n    else if( ((B.n_rows == 1) || (TB::is_row)) && (is_cx<eT>::no) ) { gemv<false,       true, false>::apply(out.memptr(), A, B.memptr(), alpha); }\n    else if( (void_ptr(&A) == void_ptr(&B))    && (is_cx<eT>::no) ) { syrk<false,       true, false>::apply(out,          A,             alpha); }\n    else                                                            { gemm<false, true, true, false>::apply(out,          A, B,          alpha); }\n    }\n  else\n  if( (do_trans_A == true) && (do_trans_B == true) && (use_alpha == false) )\n    {\n         if( ((A.n_cols == 1) || (TA::is_col)) && (is_cx<eT>::no) )  { gemv<false,      false, false>::apply(out.memptr(), B, A.memptr()); }\n    else if( ((B.n_rows == 1) || (TB::is_row)) && (is_cx<eT>::no) )  { gemv<true,       false, false>::apply(out.memptr(), A, B.memptr()); }\n    else                                                             { gemm<true, true, false, false>::apply(out,          A, B         ); }\n    }\n  else\n  if( (do_trans_A == true) && (do_trans_B == true) && (use_alpha == true) )\n    {\n         if( ((A.n_cols == 1) || (TA::is_col)) && (is_cx<eT>::no) )  { gemv<false,      true, false>::apply(out.memptr(), B, A.memptr(), alpha); }\n    else if( ((B.n_rows == 1) || (TB::is_row)) && (is_cx<eT>::no) )  { gemv<true,       true, false>::apply(out.memptr(), A, B.memptr(), alpha); }\n    else                                                             { gemm<true, true, true, false>::apply(out,          A, B,          alpha); }\n    }\n  }\n\n\n\ntemplate\n  <\n  typename   eT,\n  const bool do_trans_A,\n  const bool do_trans_B,\n  const bool do_trans_C,\n  const bool use_alpha,\n  typename   TA,\n  typename   TB,\n  typename   TC\n  >\narma_hot\ninline\nvoid\nglue_times::apply\n  (\n        Mat<eT>& out,\n  const TA&      A,\n  const TB&      B,\n  const TC&      C,\n  const eT       alpha\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT> tmp;\n  \n  const uword storage_cost_AB = glue_times::mul_storage_cost<eT, do_trans_A, do_trans_B>(A, B);\n  const uword storage_cost_BC = glue_times::mul_storage_cost<eT, do_trans_B, do_trans_C>(B, C);\n  \n  if(storage_cost_AB <= storage_cost_BC)\n    {\n    // out = (A*B)*C\n    \n    glue_times::apply<eT, do_trans_A, do_trans_B, use_alpha>(tmp, A,   B, alpha);\n    glue_times::apply<eT, false,      do_trans_C, false    >(out, tmp, C, eT(0));\n    }\n  else\n    {\n    // out = A*(B*C)\n    \n    glue_times::apply<eT, do_trans_B, do_trans_C, use_alpha>(tmp, B, C,   alpha);\n    glue_times::apply<eT, do_trans_A, false,      false    >(out, A, tmp, eT(0));\n    }\n  }\n\n\n\ntemplate\n  <\n  typename   eT,\n  const bool do_trans_A,\n  const bool do_trans_B,\n  const bool do_trans_C,\n  const bool do_trans_D,\n  const bool use_alpha,\n  typename   TA,\n  typename   TB,\n  typename   TC,\n  typename   TD\n  >\narma_hot\ninline\nvoid\nglue_times::apply\n  (\n        Mat<eT>& out,\n  const TA&      A,\n  const TB&      B,\n  const TC&      C,\n  const TD&      D,\n  const eT       alpha\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT> tmp;\n  \n  const uword storage_cost_AC = glue_times::mul_storage_cost<eT, do_trans_A, do_trans_C>(A, C);\n  const uword storage_cost_BD = glue_times::mul_storage_cost<eT, do_trans_B, do_trans_D>(B, D);\n  \n  if(storage_cost_AC <= storage_cost_BD)\n    {\n    // out = (A*B*C)*D\n    \n    glue_times::apply<eT, do_trans_A, do_trans_B, do_trans_C, use_alpha>(tmp, A, B, C, alpha);\n    \n    glue_times::apply<eT, false, do_trans_D, false>(out, tmp, D, eT(0));\n    }\n  else\n    {\n    // out = A*(B*C*D)\n    \n    glue_times::apply<eT, do_trans_B, do_trans_C, do_trans_D, use_alpha>(tmp, B, C, D, alpha);\n    \n    glue_times::apply<eT, do_trans_A, false, false>(out, A, tmp, eT(0));\n    }\n  }\n\n\n\n//\n// glue_times_diag\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\nglue_times_diag::apply(Mat<typename T1::elem_type>& out, const Glue<T1, T2, glue_times_diag>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const strip_diagmat<T1> S1(X.A);\n  const strip_diagmat<T2> S2(X.B);\n  \n  typedef typename strip_diagmat<T1>::stored_type T1_stripped;\n  typedef typename strip_diagmat<T2>::stored_type T2_stripped;\n  \n  if( (strip_diagmat<T1>::do_diagmat == true) && (strip_diagmat<T2>::do_diagmat == false) )\n    {\n    const diagmat_proxy_check<T1_stripped> A(S1.M, out);\n    \n    const unwrap_check<T2> tmp(X.B, out);\n    const Mat<eT>& B     = tmp.M;\n    \n    const uword A_n_elem = A.n_elem;\n    const uword B_n_rows = B.n_rows;\n    const uword B_n_cols = B.n_cols;\n    \n    arma_debug_assert_mul_size(A_n_elem, A_n_elem, B_n_rows, B_n_cols, \"matrix multiplication\");\n    \n    out.set_size(A_n_elem, B_n_cols);\n    \n    for(uword col=0; col < B_n_cols; ++col)\n      {\n            eT* out_coldata = out.colptr(col);\n      const eT* B_coldata   = B.colptr(col);\n      \n      uword i,j;\n      for(i=0, j=1; j < B_n_rows; i+=2, j+=2)\n        {\n        eT tmp_i = A[i];\n        eT tmp_j = A[j];\n        \n        tmp_i *= B_coldata[i];\n        tmp_j *= B_coldata[j];\n        \n        out_coldata[i] = tmp_i;\n        out_coldata[j] = tmp_j;\n        }\n      \n      if(i < B_n_rows)\n        {\n        out_coldata[i] = A[i] * B_coldata[i];\n        }\n      }\n    }\n  else\n  if( (strip_diagmat<T1>::do_diagmat == false) && (strip_diagmat<T2>::do_diagmat == true) )\n    {\n    const unwrap_check<T1> tmp(X.A, out);\n    const Mat<eT>& A     = tmp.M;\n    \n    const diagmat_proxy_check<T2_stripped> B(S2.M, out);\n    \n    const uword A_n_rows = A.n_rows;\n    const uword A_n_cols = A.n_cols;\n    const uword B_n_elem = B.n_elem;\n    \n    arma_debug_assert_mul_size(A_n_rows, A_n_cols, B_n_elem, B_n_elem, \"matrix multiplication\");\n    \n    out.set_size(A_n_rows, B_n_elem);\n    \n    for(uword col=0; col < A_n_cols; ++col)\n      {\n      const eT  val = B[col];\n      \n            eT* out_coldata = out.colptr(col);\n      const eT*   A_coldata =   A.colptr(col);\n      \n      uword i,j;\n      for(i=0, j=1; j < A_n_rows; i+=2, j+=2)\n        {\n        const eT tmp_i = A_coldata[i] * val;\n        const eT tmp_j = A_coldata[j] * val;\n        \n        out_coldata[i] = tmp_i;\n        out_coldata[j] = tmp_j;\n        }\n      \n      if(i < A_n_rows)\n        {\n        out_coldata[i] = A_coldata[i] * val;\n        }\n      }\n    }\n  else\n  if( (strip_diagmat<T1>::do_diagmat == true) && (strip_diagmat<T2>::do_diagmat == true) )\n    {\n    const diagmat_proxy_check<T1_stripped> A(S1.M, out);\n    const diagmat_proxy_check<T2_stripped> B(S2.M, out);\n    \n    const uword A_n_elem = A.n_elem;\n    const uword B_n_elem = B.n_elem;\n    \n    arma_debug_assert_mul_size(A_n_elem, A_n_elem, B_n_elem, B_n_elem, \"matrix multiplication\");\n    \n    out.zeros(A_n_elem, A_n_elem);\n    \n    for(uword i=0; i < A_n_elem; ++i)\n      {\n      out.at(i,i) = A[i] * B[i];\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_toeplitz_bones.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup glue_toeplitz\n//! @{\n\n\n\nclass glue_toeplitz\n  {\n  public:\n  \n  template<typename T1, typename T2> inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1, T2, glue_toeplitz>& in);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/glue_toeplitz_meat.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup glue_toeplitz\n//! @{\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nglue_toeplitz::apply(Mat<typename T1::elem_type>& out, const Glue<T1, T2, glue_toeplitz>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_check<T1> tmp1(in.A, out);\n  const unwrap_check<T2> tmp2(in.B, out);\n  \n  const Mat<eT>& A = tmp1.M;\n  const Mat<eT>& B = tmp2.M;\n  \n  arma_debug_check\n    (\n    ( ((A.is_vec() == false) && (A.is_empty() == false)) || ((B.is_vec() == false) && (B.is_empty() == false)) ),\n    \"toeplitz(): given object is not a vector\"\n    );\n  \n  const uword A_N = A.n_elem;\n  const uword B_N = B.n_elem;\n  \n  const eT* A_mem = A.memptr();\n  const eT* B_mem = B.memptr();\n  \n  out.set_size(A_N, B_N);\n  \n  if( out.is_empty() )  { return; }\n  \n  for(uword col=0; col < B_N; ++col)\n    {\n    eT* col_mem = out.colptr(col);\n    \n    uword i = 0;\n    for(uword row=col; row < A_N; ++row, ++i)  { col_mem[row] = A_mem[i]; }\n    }\n  \n  for(uword row=0; row < A_N; ++row)\n    {\n    uword i = 1;\n    for(uword col=(row+1); col < B_N; ++col, ++i)  { out.at(row,col) = B_mem[i]; }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/gmm_diag_bones.hpp",
    "content": "// Copyright (C) 2014 Conrad Sanderson\n// Copyright (C) 2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\nstruct gmm_dist_mode { const uword id;  inline explicit gmm_dist_mode(const uword in_id) : id(in_id) {} };\n\ninline bool operator==(const gmm_dist_mode& a, const gmm_dist_mode& b) { return (a.id == b.id); }\ninline bool operator!=(const gmm_dist_mode& a, const gmm_dist_mode& b) { return (a.id != b.id); }\n\nstruct gmm_dist_eucl : public gmm_dist_mode { inline gmm_dist_eucl() : gmm_dist_mode(1) {} };\nstruct gmm_dist_maha : public gmm_dist_mode { inline gmm_dist_maha() : gmm_dist_mode(2) {} };\nstruct gmm_dist_prob : public gmm_dist_mode { inline gmm_dist_prob() : gmm_dist_mode(3) {} };\n\nstatic const gmm_dist_eucl eucl_dist;\nstatic const gmm_dist_maha maha_dist;\nstatic const gmm_dist_prob prob_dist;\n\n\n\nstruct gmm_seed_mode { const uword id; inline explicit gmm_seed_mode(const uword in_id) : id(in_id) {} };\n\ninline bool operator==(const gmm_seed_mode& a, const gmm_seed_mode& b) { return (a.id == b.id); }\ninline bool operator!=(const gmm_seed_mode& a, const gmm_seed_mode& b) { return (a.id != b.id); }\n\nstruct gmm_seed_keep_existing : public gmm_seed_mode { inline gmm_seed_keep_existing() : gmm_seed_mode(1) {} };\nstruct gmm_seed_static_subset : public gmm_seed_mode { inline gmm_seed_static_subset() : gmm_seed_mode(2) {} };\nstruct gmm_seed_static_spread : public gmm_seed_mode { inline gmm_seed_static_spread() : gmm_seed_mode(3) {} };\nstruct gmm_seed_random_subset : public gmm_seed_mode { inline gmm_seed_random_subset() : gmm_seed_mode(4) {} };\nstruct gmm_seed_random_spread : public gmm_seed_mode { inline gmm_seed_random_spread() : gmm_seed_mode(5) {} };\n\nstatic const gmm_seed_keep_existing keep_existing;\nstatic const gmm_seed_static_subset static_subset;\nstatic const gmm_seed_static_spread static_spread;\nstatic const gmm_seed_random_subset random_subset;\nstatic const gmm_seed_random_spread random_spread;\n\n\nnamespace gmm_priv\n{\n\nstruct gmm_empty_arg {};\n\n\n#if defined(_OPENMP)\n  struct arma_omp_state\n    {\n    const int orig_dynamic_state;\n    \n    inline  arma_omp_state() : orig_dynamic_state(omp_get_dynamic()) { omp_set_dynamic(0); }\n    inline ~arma_omp_state() { omp_set_dynamic(orig_dynamic_state); }\n    };\n#else\n  struct arma_omp_state {};\n#endif\n\n\n\ntemplate<typename eT>\nclass gmm_diag\n  {\n  public:\n  \n  arma_aligned const Mat<eT> means;\n  arma_aligned const Mat<eT> dcovs;\n  arma_aligned const Row<eT> hefts;\n  \n  //\n  //\n  \n  inline ~gmm_diag();\n  inline  gmm_diag();\n  \n  inline                  gmm_diag(const gmm_diag& x);\n  inline const gmm_diag& operator=(const gmm_diag& x);\n  \n  inline      gmm_diag(const uword in_n_dims, const uword in_n_gaus);\n  inline void    reset(const uword in_n_dims, const uword in_n_gaus);\n  inline void    reset();\n  \n  template<typename T1, typename T2, typename T3>\n  inline void set_params(const Base<eT,T1>& in_means, const Base<eT,T2>& in_dcovs, const Base<eT,T3>& in_hefts);\n  \n  template<typename T1> inline void set_means(const Base<eT,T1>& in_means);\n  template<typename T1> inline void set_dcovs(const Base<eT,T1>& in_dcovs);\n  template<typename T1> inline void set_hefts(const Base<eT,T1>& in_hefts);\n  \n  inline uword n_dims() const;\n  inline uword n_gaus() const;\n  \n  inline bool load(const std::string name);\n  inline bool save(const std::string name) const;\n  \n  inline Col<eT> generate()              const;\n  inline Mat<eT> generate(const uword N) const;\n  \n  template<typename T1> inline eT      log_p(const T1& expr, const gmm_empty_arg& junk1 = gmm_empty_arg(), typename enable_if<((is_arma_type<T1>::value) && (resolves_to_colvector<T1>::value == true ))>::result* junk2 = 0) const;\n  template<typename T1> inline eT      log_p(const T1& expr, const uword gaus_id,                          typename enable_if<((is_arma_type<T1>::value) && (resolves_to_colvector<T1>::value == true ))>::result* junk2 = 0) const;\n  \n  template<typename T1> inline Row<eT> log_p(const T1& expr, const gmm_empty_arg& junk1 = gmm_empty_arg(), typename enable_if<((is_arma_type<T1>::value) && (resolves_to_colvector<T1>::value == false))>::result* junk2 = 0) const;\n  template<typename T1> inline Row<eT> log_p(const T1& expr, const uword gaus_id,                          typename enable_if<((is_arma_type<T1>::value) && (resolves_to_colvector<T1>::value == false))>::result* junk2 = 0) const;\n  \n  template<typename T1> inline eT  avg_log_p(const Base<eT,T1>& expr)                      const;\n  template<typename T1> inline eT  avg_log_p(const Base<eT,T1>& expr, const uword gaus_id) const;\n  \n  template<typename T1> inline uword   assign(const T1& expr, const gmm_dist_mode& dist, typename enable_if<((is_arma_type<T1>::value) && (resolves_to_colvector<T1>::value == true ))>::result* junk = 0) const;\n  template<typename T1> inline urowvec assign(const T1& expr, const gmm_dist_mode& dist, typename enable_if<((is_arma_type<T1>::value) && (resolves_to_colvector<T1>::value == false))>::result* junk = 0) const;\n  \n  template<typename T1> inline urowvec  raw_hist(const Base<eT,T1>& expr, const gmm_dist_mode& dist_mode) const;\n  template<typename T1> inline Row<eT> norm_hist(const Base<eT,T1>& expr, const gmm_dist_mode& dist_mode) const;\n  \n  template<typename T1>\n  inline\n  bool\n  learn\n    (\n    const Base<eT,T1>&    data,\n    const uword           n_gaus,\n    const gmm_dist_mode&  dist_mode,\n    const gmm_seed_mode&  seed_mode,\n    const uword           km_iter,\n    const uword           em_iter,\n    const eT              var_floor,\n    const bool            print_mode\n    );\n  \n  \n  //\n  \n  protected:\n  \n  \n  arma_aligned Row<eT> log_det_etc;\n  arma_aligned Row<eT> log_hefts;\n  arma_aligned Col<eT> mah_aux;\n  \n  //\n  \n  inline void init(const gmm_diag& x);\n  \n  inline void init(const uword in_n_dim, const uword in_n_gaus);\n  \n  inline void init_constants();\n\n  inline umat internal_gen_boundaries(const uword N) const;\n\n  inline eT internal_scalar_log_p(const eT* x                     ) const;\n  inline eT internal_scalar_log_p(const eT* x, const uword gaus_id) const;\n  \n  template<typename T1> inline Row<eT> internal_vec_log_p(const T1& X                     ) const;\n  template<typename T1> inline Row<eT> internal_vec_log_p(const T1& X, const uword gaus_id) const;\n  \n  template<typename T1> inline eT internal_avg_log_p(const T1& X                     ) const;\n  template<typename T1> inline eT internal_avg_log_p(const T1& X, const uword gaus_id) const;\n  \n  template<typename T1> inline uword internal_scalar_assign(const T1& X, const gmm_dist_mode& dist_mode) const;\n  \n  template<typename T1> inline void internal_vec_assign(urowvec& out, const T1& X, const gmm_dist_mode& dist_mode) const;\n  \n  inline void internal_raw_hist(urowvec& hist, const Mat<eT>& X, const gmm_dist_mode& dist_mode) const;\n  \n  //\n  \n  template<uword dist_id> inline void generate_initial_means(const Mat<eT>& X, const gmm_seed_mode& seed);\n  \n  template<uword dist_id> inline void generate_initial_dcovs_and_hefts(const Mat<eT>& X, const eT var_floor);\n  \n  template<uword dist_id> inline bool km_iterate(const Mat<eT>& X, const uword max_iter, const bool verbose);\n  \n  template<uword dist_id> inline void km_update_stats(const Mat<eT>& X, const uword start_index, const uword end_index, const Mat<eT>& old_means, field< running_mean_vec<eT> >& running_means) const;\n  \n  //\n  \n  inline bool em_iterate(const Mat<eT>& X, const uword max_iter, const eT var_floor, const bool verbose);\n  \n  inline void em_update_params(const Mat<eT>& X, const umat& boundaries, field< Mat<eT> >& t_acc_means, field< Mat<eT> >& t_acc_dcovs, field< Col<eT> >& t_acc_norm_lhoods, field< Col<eT> >& t_gaus_log_lhoods, Col<eT>& t_progress_log_lhoods);\n  \n  inline void em_generate_acc(const Mat<eT>& X, const uword start_index, const uword end_index, Mat<eT>& acc_means, Mat<eT>& acc_dcovs, Col<eT>& acc_norm_lhoods, Col<eT>& gaus_log_lhoods, eT& progress_log_lhood) const;\n  \n  inline void em_fix_params(const eT var_floor);\n  };\n\n}\n\n\ntypedef gmm_priv::gmm_diag<double>  gmm_diag;\ntypedef gmm_priv::gmm_diag<float>  fgmm_diag;\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/gmm_diag_meat.hpp",
    "content": "// Copyright (C) 2014 Conrad Sanderson\n// Copyright (C) 2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\nnamespace gmm_priv\n{\n\n\ntemplate<typename eT>\ninline\ngmm_diag<eT>::~gmm_diag()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  arma_type_check(( (is_same_type<eT,float>::value == false) && (is_same_type<eT,double>::value == false) ));\n  }\n\n\n\ntemplate<typename eT>\ninline\ngmm_diag<eT>::gmm_diag()\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\ntemplate<typename eT>\ninline\ngmm_diag<eT>::gmm_diag(const gmm_diag<eT>& x)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init(x);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst gmm_diag<eT>&\ngmm_diag<eT>::operator=(const gmm_diag<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  init(x);\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\ngmm_diag<eT>::gmm_diag(const uword in_n_dims, const uword in_n_gaus)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init(in_n_dims, in_n_gaus);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ngmm_diag<eT>::reset()\n  {\n  arma_extra_debug_sigprint();\n  \n  mah_aux.reset();\n  \n  init(0, 0);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ngmm_diag<eT>::reset(const uword in_n_dims, const uword in_n_gaus)\n  {\n  arma_extra_debug_sigprint();\n  \n  mah_aux.reset();\n  \n  init(in_n_dims, in_n_gaus);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename T2, typename T3>\ninline\nvoid\ngmm_diag<eT>::set_params(const Base<eT,T1>& in_means_expr, const Base<eT,T2>& in_dcovs_expr, const Base<eT,T3>& in_hefts_expr)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1> tmp1(in_means_expr.get_ref());\n  const unwrap<T2> tmp2(in_dcovs_expr.get_ref());\n  const unwrap<T3> tmp3(in_hefts_expr.get_ref());\n  \n  const Mat<eT>& in_means = tmp1.M;\n  const Mat<eT>& in_dcovs = tmp2.M;\n  const Mat<eT>& in_hefts = tmp3.M;\n  \n  arma_debug_check\n    (\n    (size(in_means) != size(in_dcovs)) || (in_hefts.n_cols != in_means.n_cols) || (in_hefts.n_rows != 1),\n    \"gmm_diag::set_params(): given parameters have inconsistent and/or wrong sizes\"\n    );\n  \n  arma_debug_check( (in_means.is_finite() == false), \"gmm_diag::set_params(): given means have non-finite values\" );\n  arma_debug_check( (in_dcovs.is_finite() == false), \"gmm_diag::set_params(): given dcovs have non-finite values\" );\n  arma_debug_check( (in_hefts.is_finite() == false), \"gmm_diag::set_params(): given hefts have non-finite values\" );\n  \n  arma_debug_check( (any(vectorise(in_dcovs) <= eT(0))), \"gmm_diag::set_params(): given dcovs have negative or zero values\" );\n  arma_debug_check( (any(vectorise(in_hefts) <  eT(0))), \"gmm_diag::set_params(): given hefts have negative values\"         );\n  \n  const eT s = accu(in_hefts);\n  \n  arma_debug_check( ((s < (eT(1) - Datum<eT>::eps)) || (s > (eT(1) + Datum<eT>::eps))), \"gmm_diag::set_params(): sum of given hefts is not 1\" );\n  \n  access::rw(means) = in_means;\n  access::rw(dcovs) = in_dcovs;\n  access::rw(hefts) = in_hefts;\n  \n  init_constants();\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\ngmm_diag<eT>::set_means(const Base<eT,T1>& in_means_expr)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1> tmp(in_means_expr.get_ref());\n  \n  const Mat<eT>& in_means = tmp.M;\n  \n  arma_debug_check( (size(in_means) != size(means)), \"gmm_diag::set_means(): given means have incompatible size\" );\n  arma_debug_check( (in_means.is_finite() == false), \"gmm_diag::set_means(): given means have non-finite values\" );\n  \n  access::rw(means) = in_means;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\ngmm_diag<eT>::set_dcovs(const Base<eT,T1>& in_dcovs_expr)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1> tmp(in_dcovs_expr.get_ref());\n  \n  const Mat<eT>& in_dcovs = tmp.M;\n  \n  arma_debug_check( (size(in_dcovs) != size(dcovs)),     \"gmm_diag::set_dcovs(): given dcovs have incompatible size\"       );\n  arma_debug_check( (in_dcovs.is_finite() == false),     \"gmm_diag::set_dcovs(): given dcovs have non-finite values\"       );\n  arma_debug_check( (any(vectorise(in_dcovs) <= eT(0))), \"gmm_diag::set_dcovs(): given dcovs have negative or zero values\" );\n  \n  access::rw(dcovs) = in_dcovs;\n  \n  init_constants();\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\ngmm_diag<eT>::set_hefts(const Base<eT,T1>& in_hefts_expr)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1> tmp(in_hefts_expr.get_ref());\n  \n  const Mat<eT>& in_hefts = tmp.M;\n  \n  arma_debug_check( (size(in_hefts) != size(hefts)),     \"gmm_diag::set_hefts(): given hefts have incompatible size\" );\n  arma_debug_check( (in_hefts.is_finite() == false),     \"gmm_diag::set_hefts(): given hefts have non-finite values\" );\n  arma_debug_check( (any(vectorise(in_hefts) <  eT(0))), \"gmm_diag::set_hefts(): given hefts have negative values\"   );\n  \n  const eT s = accu(in_hefts);\n  \n  arma_debug_check( ((s < (eT(1) - Datum<eT>::eps)) || (s > (eT(1) + Datum<eT>::eps))), \"gmm_diag::set_hefts(): sum of given hefts is not 1\" );\n  \n  access::rw(hefts) = in_hefts;\n  \n  log_hefts = log(hefts);  // TODO: possible issue when one of the hefts is zero\n  }\n\n\n\ntemplate<typename eT>\ninline\nuword\ngmm_diag<eT>::n_dims() const\n  {\n  return means.n_rows;\n  }\n\n\n\ntemplate<typename eT>\ninline\nuword\ngmm_diag<eT>::n_gaus() const\n  {\n  return means.n_cols;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\ngmm_diag<eT>::load(const std::string name)\n  {\n  arma_extra_debug_sigprint();\n  \n  Cube<eT> Q;\n  \n  bool status = Q.load(name, arma_binary);\n  \n  if( (status == false) || (Q.n_slices != 2) )\n    {\n    reset();\n    return false;\n    }\n  \n  if( (Q.n_rows < 2) || (Q.n_cols < 1) )\n    {\n    reset();\n    return true;\n    }\n  \n  access::rw(hefts) = Q.slice(0).row(0);\n  access::rw(means) = Q.slice(0).submat(1, 0, Q.n_rows-1, Q.n_cols-1);\n  access::rw(dcovs) = Q.slice(1).submat(1, 0, Q.n_rows-1, Q.n_cols-1);\n  \n  init_constants();\n  \n  return true;\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\ngmm_diag<eT>::save(const std::string name) const\n  {\n  arma_extra_debug_sigprint();\n  \n  Cube<eT> Q(means.n_rows + 1, means.n_cols, 2);\n  \n  if(Q.n_elem > 0)\n    {\n    Q.slice(0).row(0) = hefts;\n    Q.slice(1).row(0).zeros();  // reserved for future use\n    \n    Q.slice(0).submat(1, 0, size(means)) = means;\n    Q.slice(1).submat(1, 0, size(dcovs)) = dcovs;\n    }\n  \n  const bool status = Q.save(name, arma_binary);\n  \n  return status;\n  }\n\n\n\ntemplate<typename eT>\ninline\nCol<eT>\ngmm_diag<eT>::generate() const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword N_dims = means.n_rows;\n  const uword N_gaus = means.n_cols;\n  \n  Col<eT> out( (N_gaus > 0) ? N_dims : uword(0) );\n  \n  if(N_gaus > 0)\n    {\n    const double val = randu<double>();\n    \n    double csum    = double(0);\n    uword  gaus_id = 0;\n    \n    for(uword j=0; j < N_gaus; ++j)\n      {\n      csum += hefts[j];\n      \n      if(val <= csum)  { gaus_id = j; break; }\n      }\n    \n    out =  randn< Col<eT> >(N_dims);    \n    out %= sqrt(dcovs.col(gaus_id));\n    out += means.col(gaus_id);\n    }\n  \n  return out;\n  }\n\n\n\ntemplate<typename eT>\ninline\nMat<eT>\ngmm_diag<eT>::generate(const uword N_vec) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword N_dims = means.n_rows;\n  const uword N_gaus = means.n_cols;\n  \n  Mat<eT> out( ( (N_gaus > 0) ? N_dims : uword(0) ), N_vec );\n  \n  if(N_gaus > 0)\n    {\n    const eT* hefts_mem = hefts.memptr();\n    \n    for(uword i=0; i < N_vec; ++i)\n      {\n      const double val = randu<double>();\n      \n      double csum    = double(0);\n      uword  gaus_id = 0;\n      \n      for(uword j=0; j < N_gaus; ++j)\n        {\n        csum += hefts_mem[j];\n        \n        if(val <= csum)  { gaus_id = j; break; }\n        }\n      \n      subview_col<eT> out_col = out.col(i);\n      \n      out_col =  randn< Col<eT> >(N_dims);    \n      out_col %= sqrt(dcovs.col(gaus_id));\n      out_col += means.col(gaus_id);\n      }\n    }\n  \n  return out;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\neT\ngmm_diag<eT>::log_p(const T1& expr, const gmm_empty_arg& junk1, typename enable_if<((is_arma_type<T1>::value) && (resolves_to_colvector<T1>::value == true))>::result* junk2) const\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  const quasi_unwrap<T1> tmp(expr);\n  \n  arma_debug_check( (tmp.M.n_rows != means.n_rows), \"gmm_diag::log_p(): incompatible dimensions\" );\n  \n  return internal_scalar_log_p( tmp.M.memptr() );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\neT\ngmm_diag<eT>::log_p(const T1& expr, const uword gaus_id, typename enable_if<((is_arma_type<T1>::value) && (resolves_to_colvector<T1>::value == true))>::result* junk2) const\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk2);\n  \n  const quasi_unwrap<T1> tmp(expr);\n  \n  arma_debug_check( (tmp.M.n_rows != means.n_rows), \"gmm_diag::log_p(): incompatible dimensions\" );\n  \n  arma_debug_check( (gaus_id >= means.n_cols), \"gmm_diag::log_p(): specified gaussian is out of range\" );\n  \n  return internal_scalar_log_p( tmp.M.memptr(), gaus_id );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nRow<eT>\ngmm_diag<eT>::log_p(const T1& expr, const gmm_empty_arg& junk1, typename enable_if<((is_arma_type<T1>::value) && (resolves_to_colvector<T1>::value == false))>::result* junk2) const\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  if(is_subview<T1>::value)\n    {\n    const subview<eT>& X = reinterpret_cast< const subview<eT>& >(expr);\n    \n    return internal_vec_log_p(X);\n    }\n  else\n    {\n    const unwrap<T1>   tmp(expr);\n    const Mat<eT>& X = tmp.M;\n    \n    return internal_vec_log_p(X);\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nRow<eT>\ngmm_diag<eT>::log_p(const T1& expr, const uword gaus_id, typename enable_if<((is_arma_type<T1>::value) && (resolves_to_colvector<T1>::value == false))>::result* junk2) const\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk2);\n  \n  if(is_subview<T1>::value)\n    {\n    const subview<eT>& X = reinterpret_cast< const subview<eT>& >(expr);\n    \n    return internal_vec_log_p(X, gaus_id);\n    }\n  else\n    {\n    const unwrap<T1>   tmp(expr);\n    const Mat<eT>& X = tmp.M;\n    \n    return internal_vec_log_p(X, gaus_id);\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\neT\ngmm_diag<eT>::avg_log_p(const Base<eT,T1>& expr) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(is_subview<T1>::value)\n    {\n    const subview<eT>& X = reinterpret_cast< const subview<eT>& >( expr.get_ref() );\n    \n    return internal_avg_log_p(X);\n    }\n  else\n    {\n    const unwrap<T1>   tmp(expr.get_ref());\n    const Mat<eT>& X = tmp.M;\n    \n    return internal_avg_log_p(X);\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\neT\ngmm_diag<eT>::avg_log_p(const Base<eT,T1>& expr, const uword gaus_id) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(is_subview<T1>::value)\n    {\n    const subview<eT>& X = reinterpret_cast< const subview<eT>& >( expr.get_ref() );\n    \n    return internal_avg_log_p(X, gaus_id);\n    }\n  else\n    {\n    const unwrap<T1>   tmp(expr.get_ref());\n    const Mat<eT>& X = tmp.M;\n    \n    return internal_avg_log_p(X, gaus_id);\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nuword\ngmm_diag<eT>::assign(const T1& expr, const gmm_dist_mode& dist, typename enable_if<((is_arma_type<T1>::value) && (resolves_to_colvector<T1>::value == true))>::result* junk) const\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  if(is_subview_col<T1>::value)\n    {\n    const subview_col<eT>& X = reinterpret_cast< const subview_col<eT>& >(expr);\n    \n    return internal_scalar_assign(X, dist);\n    }\n  else\n    {\n    const unwrap<T1>   tmp(expr);\n    const Mat<eT>& X = tmp.M;\n    \n    return internal_scalar_assign(X, dist);\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nurowvec\ngmm_diag<eT>::assign(const T1& expr, const gmm_dist_mode& dist, typename enable_if<((is_arma_type<T1>::value) && (resolves_to_colvector<T1>::value == false))>::result* junk) const\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  urowvec out;\n  \n  if(is_subview<T1>::value)\n    {\n    const subview<eT>& X = reinterpret_cast< const subview<eT>& >(expr);\n    \n    internal_vec_assign(out, X, dist);\n    }\n  else\n    {\n    const unwrap<T1>   tmp(expr);\n    const Mat<eT>& X = tmp.M;\n    \n    internal_vec_assign(out, X, dist);\n    }\n  \n  return out;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nurowvec\ngmm_diag<eT>::raw_hist(const Base<eT,T1>& expr, const gmm_dist_mode& dist_mode) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1>   tmp(expr.get_ref());\n  const Mat<eT>& X = tmp.M;\n  \n  arma_debug_check( (X.n_rows != means.n_rows), \"gmm_diag::raw_hist(): incompatible dimensions\" );\n  \n  arma_debug_check( ((dist_mode != eucl_dist) && (dist_mode != prob_dist)), \"gmm_diag::raw_hist(): unsupported distance mode\" );\n  \n  urowvec hist;\n  \n  internal_raw_hist(hist, X, dist_mode);\n  \n  return hist;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nRow<eT>\ngmm_diag<eT>::norm_hist(const Base<eT,T1>& expr, const gmm_dist_mode& dist_mode) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1>   tmp(expr.get_ref());\n  const Mat<eT>& X = tmp.M;\n  \n  arma_debug_check( (X.n_rows != means.n_rows), \"gmm_diag::norm_hist(): incompatible dimensions\" );\n  \n  arma_debug_check( ((dist_mode != eucl_dist) && (dist_mode != prob_dist)), \"gmm_diag::norm_hist(): unsupported distance mode\" );\n  \n  urowvec hist;\n  \n  internal_raw_hist(hist, X, dist_mode);\n  \n  const uword  hist_n_elem = hist.n_elem;\n  const uword* hist_mem    = hist.memptr();\n  \n  eT acc = eT(0);\n  for(uword i=0; i<hist_n_elem; ++i)  { acc += eT(hist_mem[i]); }\n  \n  if(acc == eT(0))  { acc = eT(1); }\n  \n  Row<eT> out(hist_n_elem);\n  \n  eT* out_mem = out.memptr();\n  \n  for(uword i=0; i<hist_n_elem; ++i)  { out_mem[i] = eT(hist_mem[i]) / acc; }\n  \n  return out;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nbool\ngmm_diag<eT>::learn\n  (\n  const Base<eT,T1>&   data,\n  const uword          N_gaus,\n  const gmm_dist_mode& dist_mode,\n  const gmm_seed_mode& seed_mode,\n  const uword          km_iter,\n  const uword          em_iter,\n  const eT             var_floor,\n  const bool           print_mode\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool dist_mode_ok = (dist_mode == eucl_dist) || (dist_mode == maha_dist);\n  \n  const bool seed_mode_ok = \\\n       (seed_mode == keep_existing)\n    || (seed_mode == static_subset)\n    || (seed_mode == static_spread)\n    || (seed_mode == random_subset)\n    || (seed_mode == random_spread);\n  \n  arma_debug_check( (dist_mode_ok == false), \"gmm_diag::learn(): dist_mode must be eucl_dist or maha_dist\" );\n  arma_debug_check( (seed_mode_ok == false), \"gmm_diag::learn(): unknown seed_mode\"                        );\n  arma_debug_check( (var_floor < eT(0)    ), \"gmm_diag::learn(): variance floor is negative\"               );\n  \n  const unwrap<T1>   tmp_X(data.get_ref());\n  const Mat<eT>& X = tmp_X.M;\n  \n  if(X.is_empty()          )  { arma_warn(true, \"gmm_diag::learn(): given matrix is empty\"             ); return false; }\n  if(X.is_finite() == false)  { arma_warn(true, \"gmm_diag::learn(): given matrix has non-finite values\"); return false; }\n  \n  if(N_gaus == 0)  { reset(); return true; }\n  \n  if(dist_mode == maha_dist)\n    {\n    mah_aux = var(X,1,1);\n    \n    const uword mah_aux_n_elem = mah_aux.n_elem;\n          eT*   mah_aux_mem    = mah_aux.memptr();\n    \n    for(uword i=0; i < mah_aux_n_elem; ++i)\n      {\n      const eT val = mah_aux_mem[i];\n      \n      mah_aux_mem[i] = ((val != eT(0)) && arma_isfinite(val)) ? eT(1) / val : eT(1);\n      }\n    }\n  \n  \n  // copy current model, in case of failure by k-means and/or EM\n  \n  const gmm_diag<eT> orig = (*this);\n  \n  \n  // initial means\n  \n  if(seed_mode == keep_existing)\n    {\n    if(means.is_empty()        )  { arma_warn(true, \"gmm_diag::learn(): no existing means\"      ); return false; }\n    if(X.n_rows != means.n_rows)  { arma_warn(true, \"gmm_diag::learn(): dimensionality mismatch\"); return false; }\n    \n    // TODO: also check for number of vectors?\n    }\n  else\n    {\n    if(X.n_cols < N_gaus)  { arma_warn(true, \"gmm_diag::learn(): number of vectors is less than number of gaussians\"); return false; }\n    \n    reset(X.n_rows, N_gaus);\n    \n    if(print_mode)  { get_stream_err2() << \"gmm_diag::learn(): generating initial means\\n\"; }\n    \n         if(dist_mode == eucl_dist)  { generate_initial_means<1>(X, seed_mode); }\n    else if(dist_mode == maha_dist)  { generate_initial_means<2>(X, seed_mode); }\n    }\n  \n  \n  // k-means\n  \n  if(km_iter > 0)\n    {\n    const arma_ostream_state stream_state(get_stream_err2());\n    \n    bool status = false;\n    \n         if(dist_mode == eucl_dist)  { status = km_iterate<1>(X, km_iter, print_mode); }\n    else if(dist_mode == maha_dist)  { status = km_iterate<2>(X, km_iter, print_mode); }\n    \n    stream_state.restore(get_stream_err2());\n    \n    if(status == false)  { arma_warn(true, \"gmm_diag::learn(): k-means algorithm failed\"); init(orig); return false; }\n    }\n  \n  \n  // initial dcovs\n  \n  const eT vfloor = (eT(var_floor) > eT(0)) ? eT(var_floor) : std::numeric_limits<eT>::min();\n  \n  if(seed_mode != keep_existing)\n    {\n    if(print_mode)  { get_stream_err2() << \"gmm_diag::learn(): generating initial covariances\\n\"; }\n    \n         if(dist_mode == eucl_dist)  { generate_initial_dcovs_and_hefts<1>(X, vfloor); }\n    else if(dist_mode == maha_dist)  { generate_initial_dcovs_and_hefts<2>(X, vfloor); }\n    }\n  \n  \n  // EM algorithm\n  \n  if(em_iter > 0)\n    {\n    const arma_ostream_state stream_state(get_stream_err2());\n    \n    const bool status = em_iterate(X, em_iter, vfloor, print_mode);\n    \n    stream_state.restore(get_stream_err2());\n    \n    if(status == false)  { arma_warn(true, \"gmm_diag::learn(): EM algorithm failed\"); init(orig); return false; }\n    }\n  \n  mah_aux.reset();\n  \n  init_constants();\n  \n  return true;\n  }\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename eT>\ninline\nvoid\ngmm_diag<eT>::init(const gmm_diag<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  gmm_diag<eT>& t = *this;\n  \n  if(&t != &x)\n    {\n    access::rw(t.means) = x.means;\n    access::rw(t.dcovs) = x.dcovs;\n    access::rw(t.hefts) = x.hefts;\n    \n    init_constants();\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ngmm_diag<eT>::init(const uword in_n_dims, const uword in_n_gaus)\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(means).zeros(in_n_dims, in_n_gaus);\n  \n  access::rw(dcovs).ones(in_n_dims, in_n_gaus);\n  \n  access::rw(hefts).set_size(in_n_gaus);\n  \n  access::rw(hefts).fill(eT(1) / eT(in_n_gaus));\n  \n  init_constants();\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ngmm_diag<eT>::init_constants()\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword N_dims = means.n_rows;\n  const uword N_gaus = means.n_cols;\n  \n  const eT tmp = (eT(N_dims)/eT(2)) * std::log(eT(2) * Datum<eT>::pi);\n  \n  log_det_etc.set_size(N_gaus);\n  \n  for(uword i=0; i<N_gaus; ++i)\n    {\n    const eT logdet = accu( log(dcovs.col(i)) );\n    \n    log_det_etc[i] = eT(-1) * ( tmp + eT(0.5) * logdet );\n    }\n  \n  log_hefts = log(hefts);  // TODO: possible issue when one of the hefts is zero\n  }\n\n\n\ntemplate<typename eT>\ninline\numat\ngmm_diag<eT>::internal_gen_boundaries(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(_OPENMP)\n    // const uword n_cores = 0;\n    const uword n_cores   = uword(omp_get_num_procs());\n    const uword n_threads = (n_cores > 0) ? ( (n_cores <= N) ? n_cores : 1 ) : 1;\n  #else\n    // static const uword n_cores   = 0;\n    static const uword n_threads = 1;\n  #endif\n  \n  // get_stream_err2() << \"gmm_diag::internal_gen_boundaries(): n_cores:   \" << n_cores   << '\\n';\n  // get_stream_err2() << \"gmm_diag::internal_gen_boundaries(): n_threads: \" << n_threads << '\\n';\n  \n  umat boundaries(2, n_threads);\n  \n  if(N > 0)\n    {\n    const uword chunk_size = N / n_threads;\n    \n    uword count = 0;\n    \n    for(uword t=0; t<n_threads; t++)\n      {\n      boundaries.at(0,t) = count;\n      \n      count += chunk_size;\n      \n      boundaries.at(1,t) = count-1;\n      }\n    \n    boundaries.at(1,n_threads-1) = N - 1;\n    }\n  else\n    {\n    boundaries.zeros();\n    }\n  \n  // get_stream_err2() << \"gmm_diag::internal_gen_boundaries(): boundaries: \" << '\\n' << boundaries << '\\n';\n  \n  return boundaries;\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\neT\ngmm_diag<eT>::internal_scalar_log_p(const eT* x) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const eT* log_hefts_mem = log_hefts.mem;\n  \n  const uword N_gaus = means.n_cols;\n  \n  if(N_gaus > 0)\n    {\n    eT log_sum = internal_scalar_log_p(x, 0) + log_hefts_mem[0];\n    \n    for(uword g=1; g < N_gaus; ++g)\n      {\n      const eT tmp = internal_scalar_log_p(x, g) + log_hefts_mem[g];\n      \n      log_sum = log_add_exp(log_sum, tmp);\n      }\n    \n    return log_sum;\n    }\n  else\n    {\n    return -Datum<eT>::inf;\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\neT\ngmm_diag<eT>::internal_scalar_log_p(const eT* x, const uword g) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const eT* mean = means.colptr(g);\n  const eT* dcov = dcovs.colptr(g);\n  \n  const uword N_dims = means.n_rows;\n  \n  eT val_i = eT(0);\n  eT val_j = eT(0);\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<N_dims; i+=2, j+=2)\n    {\n    eT tmp_i = x[i];\n    eT tmp_j = x[j];\n    \n    tmp_i -= mean[i];\n    tmp_j -= mean[j];\n    \n    val_i += (tmp_i*tmp_i) / dcov[i];\n    val_j += (tmp_j*tmp_j) / dcov[j];\n    }\n  \n  if(i < N_dims)\n    {\n    const eT tmp = x[i] - mean[i];\n    \n    val_i += (tmp*tmp) / dcov[i];\n    }\n  \n  return eT(-0.5)*(val_i + val_j) + log_det_etc.mem[g];\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nRow<eT>\ngmm_diag<eT>::internal_vec_log_p(const T1& X) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (X.n_rows != means.n_rows), \"gmm_diag::log_p(): incompatible dimensions\" );\n  \n  const uword N = X.n_cols;\n  \n  Row<eT> out(N);\n  \n  if(N > 0)\n    {\n    #if defined(_OPENMP)\n      {\n      const arma_omp_state save_omp_state;\n      \n      const umat boundaries = internal_gen_boundaries(N);\n      \n      const uword n_threads = boundaries.n_cols;\n      \n      #pragma omp parallel for\n      for(uword t=0; t < n_threads; ++t)\n        {\n        const uword start_index = boundaries.at(0,t);\n        const uword   end_index = boundaries.at(1,t);\n        \n        eT* out_mem = out.memptr();\n        \n        for(uword i=start_index; i <= end_index; ++i)\n          {\n          out_mem[i] = internal_scalar_log_p( X.colptr(i) );\n          }\n        }\n      }\n    #else\n      {\n      eT* out_mem = out.memptr();\n      \n      for(uword i=0; i < N; ++i)\n        {\n        out_mem[i] = internal_scalar_log_p( X.colptr(i) );\n        }\n      }\n    #endif\n    }\n  \n  return out;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nRow<eT>\ngmm_diag<eT>::internal_vec_log_p(const T1& X, const uword gaus_id) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (X.n_rows != means.n_rows), \"gmm_diag::log_p(): incompatible dimensions\" );\n  arma_debug_check( (gaus_id  >= means.n_cols), \"gmm_diag::log_p(): gaus_id is out of range\" );\n  \n  const uword N = X.n_cols;\n  \n  Row<eT> out(N);\n  \n  if(N > 0)\n    {\n    #if defined(_OPENMP)\n      {\n      const arma_omp_state save_omp_state;\n      \n      const umat boundaries = internal_gen_boundaries(N);\n      \n      const uword n_threads = boundaries.n_cols;\n      \n      #pragma omp parallel for\n      for(uword t=0; t < n_threads; ++t)\n        {\n        const uword start_index = boundaries.at(0,t);\n        const uword   end_index = boundaries.at(1,t);\n        \n        eT* out_mem = out.memptr();\n        \n        for(uword i=start_index; i <= end_index; ++i)\n          {\n          out_mem[i] = internal_scalar_log_p( X.colptr(i), gaus_id );\n          }\n        }\n      }\n    #else\n      {\n      eT* out_mem = out.memptr();\n      \n      for(uword i=0; i < N; ++i)\n        {\n        out_mem[i] = internal_scalar_log_p( X.colptr(i), gaus_id );\n        }\n      }\n    #endif\n    }\n  \n  return out;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\neT\ngmm_diag<eT>::internal_avg_log_p(const T1& X) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (X.n_rows != means.n_rows), \"gmm_diag::avg_log_p(): incompatible dimensions\" );\n    \n  const uword N = X.n_cols;\n  \n  if(N == 0)  { return (-Datum<eT>::inf); }\n  \n  \n  #if defined(_OPENMP)\n    {\n    const arma_omp_state save_omp_state;\n    \n    const umat boundaries = internal_gen_boundaries(N);\n    \n    const uword n_threads = boundaries.n_cols;\n    \n    field< running_mean_scalar<eT> > t_running_means(n_threads);\n    \n    \n    #pragma omp parallel for\n    for(uword t=0; t < n_threads; ++t)\n      {\n      const uword start_index = boundaries.at(0,t);\n      const uword   end_index = boundaries.at(1,t);\n      \n      running_mean_scalar<eT>& current_running_mean = t_running_means[t];\n      \n      for(uword i=start_index; i <= end_index; ++i)\n        {\n        current_running_mean( internal_scalar_log_p( X.colptr(i) ) );\n        }\n      }\n    \n    \n    eT avg = eT(0);\n    \n    for(uword t=0; t < n_threads; ++t)\n      {\n      running_mean_scalar<eT>& current_running_mean = t_running_means[t];\n      \n      const eT w = eT(current_running_mean.count()) / eT(N);\n      \n      avg += w * current_running_mean.mean();\n      }\n    \n    return avg;\n    }\n  #else\n    {\n    running_mean_scalar<eT> running_mean;\n    \n    for(uword i=0; i<N; ++i)\n      {\n      running_mean( internal_scalar_log_p( X.colptr(i) ) );\n      }\n    \n    return running_mean.mean();\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\neT\ngmm_diag<eT>::internal_avg_log_p(const T1& X, const uword gaus_id) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (X.n_rows != means.n_rows), \"gmm_diag::avg_log_p(): incompatible dimensions\" );\n  arma_debug_check( (gaus_id  >= means.n_cols), \"gmm_diag::avg_log_p(): specified gaussian is out of range\"    );\n  \n  const uword N = X.n_cols;\n  \n  if(N == 0)  { return (-Datum<eT>::inf); }\n  \n  \n  #if defined(_OPENMP)\n    {\n    const arma_omp_state save_omp_state;\n    \n    const umat boundaries = internal_gen_boundaries(N);\n    \n    const uword n_threads = boundaries.n_cols;\n    \n    field< running_mean_scalar<eT> > t_running_means(n_threads);\n    \n    \n    #pragma omp parallel for\n    for(uword t=0; t < n_threads; ++t)\n      {\n      const uword start_index = boundaries.at(0,t);\n      const uword   end_index = boundaries.at(1,t);\n      \n      running_mean_scalar<eT>& current_running_mean = t_running_means[t];\n      \n      for(uword i=start_index; i <= end_index; ++i)\n        {\n        current_running_mean( internal_scalar_log_p( X.colptr(i), gaus_id) );\n        }\n      }\n    \n    \n    eT avg = eT(0);\n    \n    for(uword t=0; t < n_threads; ++t)\n      {\n      running_mean_scalar<eT>& current_running_mean = t_running_means[t];\n      \n      const eT w = eT(current_running_mean.count()) / eT(N);\n      \n      avg += w * current_running_mean.mean();\n      }\n    \n    return avg;\n    }\n  #else\n    {\n    running_mean_scalar<eT> running_mean;\n    \n    for(uword i=0; i<N; ++i)\n      {\n      running_mean( internal_scalar_log_p( X.colptr(i), gaus_id ) );\n      }\n    \n    return running_mean.mean();\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nuword\ngmm_diag<eT>::internal_scalar_assign(const T1& X, const gmm_dist_mode& dist_mode) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword N_dims = means.n_rows;\n  const uword N_gaus = means.n_cols;\n  \n  arma_debug_check( (X.n_rows != N_dims), \"gmm_diag::assign(): incompatible dimensions\" );\n  arma_debug_check( (N_gaus == 0),        \"gmm_diag::assign(): model has no means\"      );\n  \n  const eT* X_mem = X.colptr(0);\n  \n  if(dist_mode == eucl_dist)\n    {\n    eT    best_dist = Datum<eT>::inf;\n    uword best_g    = 0;\n    \n    for(uword g=0; g < N_gaus; ++g)\n      {\n      const eT tmp_dist = distance<eT,1>::eval(N_dims, X_mem, means.colptr(g), X_mem);\n      \n      if(tmp_dist <= best_dist)\n        {\n        best_dist = tmp_dist;\n        best_g    = g;\n        }\n      }\n    \n    return best_g;\n    }\n  else\n  if(dist_mode == prob_dist)\n    {\n    const eT* log_hefts_mem = log_hefts.memptr();\n    \n    eT    best_p = -Datum<eT>::inf;\n    uword best_g = 0;\n    \n    for(uword g=0; g < N_gaus; ++g)\n      {\n      const eT tmp_p = internal_scalar_log_p(X_mem, g) + log_hefts_mem[g];\n      \n      if(tmp_p >= best_p)\n        {\n        best_p = tmp_p;\n        best_g = g;\n        }\n      }\n    \n    return best_g;\n    }\n  else\n    {\n    arma_debug_check(true, \"gmm_diag::assign(): unsupported distance mode\");\n    }\n  \n  return uword(0);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\ngmm_diag<eT>::internal_vec_assign(urowvec& out, const T1& X, const gmm_dist_mode& dist_mode) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword N_dims = means.n_rows;\n  const uword N_gaus = means.n_cols;\n  \n  arma_debug_check( (X.n_rows != N_dims), \"gmm_diag::assign(): incompatible dimensions\" );\n  \n  const uword X_n_cols = (N_gaus > 0) ? X.n_cols : 0;\n  \n  out.set_size(1,X_n_cols);\n  \n  uword* out_mem = out.memptr();\n  \n  if(dist_mode == eucl_dist)\n    {\n    for(uword i=0; i<X_n_cols; ++i)\n      {\n      const eT* X_colptr = X.colptr(i);\n       \n      eT    best_dist = Datum<eT>::inf;\n      uword best_g    = 0;\n      \n      for(uword g=0; g<N_gaus; ++g)\n        {\n        const eT tmp_dist = distance<eT,1>::eval(N_dims, X_colptr, means.colptr(g), X_colptr);\n        \n        if(tmp_dist <= best_dist)\n          {\n          best_dist = tmp_dist;\n          best_g    = g;\n          }\n        }\n      \n      out_mem[i] = best_g;\n      }\n    }\n  else\n  if(dist_mode == prob_dist)\n    {\n    const eT* log_hefts_mem = log_hefts.memptr();\n    \n    for(uword i=0; i<X_n_cols; ++i)\n      {\n      const eT* X_colptr = X.colptr(i);\n       \n      eT    best_p = -Datum<eT>::inf;\n      uword best_g = 0;\n      \n      for(uword g=0; g<N_gaus; ++g)\n        {\n        const eT tmp_p = internal_scalar_log_p(X_colptr, g) + log_hefts_mem[g];\n        \n        if(tmp_p >= best_p)\n          {\n          best_p = tmp_p;\n          best_g = g;\n          }\n        }\n      \n      out_mem[i] = best_g;\n      }\n    }\n  else\n    {\n    arma_debug_check(true, \"gmm_diag::assign(): unsupported distance mode\");\n    }\n  }\n\n\n\n\ntemplate<typename eT>\ninline\nvoid\ngmm_diag<eT>::internal_raw_hist(urowvec& hist, const Mat<eT>& X, const gmm_dist_mode& dist_mode) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword N_dims = means.n_rows;\n  const uword N_gaus = means.n_cols;\n  \n  const uword X_n_cols = X.n_cols;\n  \n  hist.zeros(N_gaus);\n  \n  if(N_gaus == 0)  { return; }\n  \n  uword* hist_mem = hist.memptr();\n  \n  if(dist_mode == eucl_dist)\n    {\n    for(uword i=0; i<X_n_cols; ++i)\n      {\n      const eT* X_colptr = X.colptr(i);\n       \n      eT    best_dist = Datum<eT>::inf;\n      uword best_g    = 0;\n      \n      for(uword g=0; g < N_gaus; ++g)\n        {\n        const eT tmp_dist = distance<eT,1>::eval(N_dims, X_colptr, means.colptr(g), X_colptr);\n        \n        if(tmp_dist <= best_dist)\n          {\n          best_dist = tmp_dist;\n          best_g    = g;\n          }\n        }\n      \n      hist_mem[best_g]++;\n      }\n    }\n  else\n  if(dist_mode == prob_dist)\n    {\n    const eT* log_hefts_mem = log_hefts.memptr();\n    \n    for(uword i=0; i<X_n_cols; ++i)\n      {\n      const eT* X_colptr = X.colptr(i);\n        \n      eT    best_p = -Datum<eT>::inf;\n      uword best_g = 0;\n      \n      for(uword g=0; g < N_gaus; ++g)\n        {\n        const eT tmp_p = internal_scalar_log_p(X_colptr, g) + log_hefts_mem[g];\n        \n        if(tmp_p >= best_p)\n          {\n          best_p = tmp_p;\n          best_g = g;\n          }\n        }\n      \n      hist_mem[best_g]++;\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword dist_id>\ninline\nvoid\ngmm_diag<eT>::generate_initial_means(const Mat<eT>& X, const gmm_seed_mode& seed_mode)\n  {\n  const uword N_dims = means.n_rows;\n  const uword N_gaus = means.n_cols;\n  \n  if( (seed_mode == static_subset) || (seed_mode == random_subset) )\n    {\n    uvec initial_indices;\n    \n         if(seed_mode == static_subset)  { initial_indices = linspace<uvec>(0, X.n_cols-1, N_gaus);                   }\n    else if(seed_mode == random_subset)  { initial_indices = uvec(sort_index(randu<vec>(X.n_cols))).rows(0,N_gaus-1); }\n    \n    // not using randi() here as on some primitive systems it produces vectors with non-unique values\n    \n    // initial_indices.print(\"initial_indices:\");\n    \n    access::rw(means) = X.cols(initial_indices);\n    }\n  else\n  if( (seed_mode == static_spread) || (seed_mode == random_spread) )\n    {\n    uword start_index = 0;\n    \n         if(seed_mode == static_spread)  { start_index = X.n_cols / 2;                                         }\n    else if(seed_mode == random_spread)  { start_index = as_scalar(randi<uvec>(1, distr_param(0,X.n_cols-1))); }\n    \n    access::rw(means).col(0) = X.unsafe_col(start_index);\n    \n    const eT* mah_aux_mem = mah_aux.memptr();\n    \n    running_stat<double> rs;\n    \n    for(uword g=1; g < N_gaus; ++g)\n      {\n      eT    max_dist = eT(0);\n      uword best_i   = uword(0);\n      \n      for(uword i=0; i < X.n_cols; ++i)\n        {\n        rs.reset();\n        \n        const eT* X_colptr = X.colptr(i);\n        \n        bool ignore_i = false;\n        \n        // find the average distance between sample i and the means so far\n        for(uword h = 0; h < g; ++h)\n          {\n          const eT dist = distance<eT,dist_id>::eval(N_dims, X_colptr, means.colptr(h), mah_aux_mem);\n          \n          // ignore sample already selected as a mean\n          if(dist == eT(0))  { ignore_i = true; break; }\n          else               { rs(dist);               }\n          }\n        \n        if( (rs.mean() >= max_dist) && (ignore_i == false))\n          {\n          max_dist = rs.mean(); best_i = i;\n          }\n        }\n      \n      // set the mean to the sample that is the furthest away from the means so far\n      access::rw(means).col(g) = X.unsafe_col(best_i);\n      }\n    }\n  \n  // get_stream_err2() << \"generate_initial_means():\" << '\\n';\n  // means.print();\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword dist_id>\ninline\nvoid\ngmm_diag<eT>::generate_initial_dcovs_and_hefts(const Mat<eT>& X, const eT var_floor)\n  {\n  const uword N_dims = means.n_rows;\n  const uword N_gaus = means.n_cols;\n  \n  field< running_stat_vec< Col<eT> > > rs(N_gaus);\n  \n  const eT* mah_aux_mem = mah_aux.memptr();\n  \n  for(uword i=0; i<X.n_cols; ++i)\n    {\n    const eT* X_colptr = X.colptr(i);\n    \n    double min_dist = Datum<eT>::inf;\n    uword  best_g   = 0;\n    \n    for(uword g=0; g<N_gaus; ++g)\n      {\n      const double dist = distance<eT,dist_id>::eval(N_dims, X_colptr, means.colptr(g), mah_aux_mem);\n      \n      if(dist <= min_dist)  { min_dist = dist; best_g = g; }\n      }\n    \n    rs(best_g)(X.unsafe_col(i));\n    }\n  \n  for(uword g=0; g<N_gaus; ++g)\n    {\n    if( rs(g).count() >= eT(2) )\n      {\n      access::rw(dcovs).col(g) = rs(g).var(1);\n      }\n    else\n      {\n      access::rw(dcovs).col(g).ones();\n      }\n    \n    access::rw(hefts)(g) = (std::max)(eT(1), rs(g).count()) / eT(X.n_cols);\n    }\n  \n  em_fix_params(var_floor);\n  }\n\n\n\n//! multi-threaded implementation of k-means, inspired by MapReduce\ntemplate<typename eT>\ntemplate<uword dist_id>\ninline\nbool\ngmm_diag<eT>::km_iterate(const Mat<eT>& X, const uword max_iter, const bool verbose)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(verbose)\n    {\n    get_stream_err2().unsetf(ios::showbase);\n    get_stream_err2().unsetf(ios::uppercase);\n    get_stream_err2().unsetf(ios::showpos);\n    get_stream_err2().unsetf(ios::scientific);\n    \n    get_stream_err2().setf(ios::right);\n    get_stream_err2().setf(ios::fixed);\n    }\n  \n  const uword N_dims = means.n_rows;\n  const uword N_gaus = means.n_cols;\n  \n  Mat<eT> old_means = means;\n  Mat<eT> new_means = means;\n  \n  running_mean_scalar<double> rs_delta;\n  \n  field< running_mean_vec<eT> > running_means(N_gaus);\n  \n  const eT* mah_aux_mem = mah_aux.memptr();\n  \n  \n  #if defined(_OPENMP)\n    const arma_omp_state save_omp_state;\n    \n    const umat boundaries = internal_gen_boundaries(X.n_cols);\n    \n    const uword n_threads = boundaries.n_cols;\n    \n    field< field< running_mean_vec<eT> > > t_running_means(n_threads);\n    \n    for(uword t=0; t < n_threads; ++t)  { t_running_means[t].set_size(N_gaus); }\n    \n    vec tmp_mean(N_dims);\n    \n    if(verbose)\n      {\n      get_stream_err2() << \"gmm_diag::learn(): k-means: n_threads: \" << n_threads  << '\\n';\n      }\n  #endif\n  \n  \n  for(uword iter=1; iter <= max_iter; ++iter)\n    {\n    #if defined(_OPENMP)\n      {\n      for(uword t=0; t < n_threads; ++t)\n        {\n        for(uword g=0; g < N_gaus; ++g)  { t_running_means[t][g].reset(); }\n        }\n      \n      \n      // km_update_stats() is the \"map\" operation, which produces partial means\n      \n      #pragma omp parallel for\n      for(uword t=0; t < n_threads; ++t)\n        {\n        field< running_mean_vec<eT> >& current_running_means = t_running_means[t];\n        \n        km_update_stats<dist_id>(X, boundaries.at(0,t), boundaries.at(1,t), old_means, current_running_means);\n        }\n      \n      \n      // the \"reduce\" operation, which combines the partial means produced by the separate threads;\n      // takes into account the counts for each mean\n      \n      for(uword g=0; g < N_gaus; ++g)\n        {\n        uword total_count = 0;\n        \n        for(uword t=0; t < n_threads; ++t)  { total_count += t_running_means[t][g].count(); }\n        \n        tmp_mean.zeros();\n        \n        bool  dead       = true;\n        uword last_index = 0;\n        \n        if(total_count > 0)\n          {\n          for(uword t=0; t < n_threads; ++t)\n            {\n            const eT w = eT(t_running_means[t][g].count()) / eT(total_count);\n            \n            if(w > eT(0))\n              {\n              tmp_mean += w * t_running_means[t][g].mean();\n              \n              dead       = false;\n              last_index = t_running_means[t][g].last_index();\n              }\n            }\n          }\n        \n        running_means[g].reset();\n        \n        if(dead == false)  { running_means[g](tmp_mean, last_index); }\n        }\n      }\n    #else\n      {\n      for(uword g=0; g < N_gaus; ++g)  { running_means[g].reset(); }\n      \n      km_update_stats<dist_id>(X, 0, X.n_cols-1, old_means, running_means);\n      }\n    #endif\n    \n    uword n_dead_means = 0;\n    \n    for(uword g=0; g < N_gaus; ++g)\n      {\n      if(running_means[g].count() > 0)\n        {\n        new_means.col(g) = running_means[g].mean();\n        }\n      else\n        {\n        n_dead_means++;\n        }\n      }\n    \n    if(n_dead_means > 0)\n      {\n      if(verbose)  { get_stream_err2() << \"gmm_diag::learn(): k-means: recovering from dead means\\n\"; }\n      \n      if(n_dead_means == 1)\n        {\n        uword dead_g         = 0;\n        uword populous_g     = 0;\n        uword populous_count = running_means(0).count(); \n        \n        for(uword g=1; g < N_gaus; ++g)\n          {\n          const uword count = running_means(g).count();\n          \n          if(count == 0)  { dead_g = g; }\n          \n          if(populous_count < count)\n            {\n            populous_count = count;\n            populous_g     = g;\n            }\n          }\n        \n        if( (populous_count <= 2) || (dead_g == populous_g) )  { return false; }\n        \n        new_means.col(dead_g) = X.unsafe_col( running_means(populous_g).last_index() );\n        }\n      else\n        {\n        uword dead_g = 0;\n        \n        for(uword live_g = 0; live_g < N_gaus; ++live_g)\n          {\n          if(running_means(live_g).count() >= 2)\n            {\n            for(; dead_g < N_gaus; ++dead_g)\n              {\n              if(running_means(dead_g).count() == 0)  { break; }\n              }\n            \n            new_means.col(dead_g) = X.unsafe_col( running_means(live_g).last_index() );\n            \n            dead_g++;\n            }\n          }\n        }\n      }\n    \n    rs_delta.reset();\n    \n    for(uword g=0; g < N_gaus; ++g)\n      {\n      rs_delta( distance<eT,dist_id>::eval(N_dims, old_means.colptr(g), new_means.colptr(g), mah_aux_mem) );\n      }\n    \n    if(verbose)\n      {\n      get_stream_err2() << \"gmm_diag::learn(): k-means: iteration: \";\n      get_stream_err2().unsetf(ios::scientific);\n      get_stream_err2().setf(ios::fixed);\n      get_stream_err2().width(std::streamsize(4));\n      get_stream_err2() << iter;\n      get_stream_err2() << \"   delta: \";\n      get_stream_err2().unsetf(ios::fixed);\n      //get_stream_err2().setf(ios::scientific);\n      get_stream_err2() << rs_delta.mean() << '\\n';\n      }\n    \n    arma::swap(old_means, new_means);\n    \n    if(rs_delta.mean() <= Datum<eT>::eps)  { break; }\n    }\n  \n  access::rw(means) = old_means;\n  \n  return true;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<uword dist_id>\ninline\nvoid\ngmm_diag<eT>::km_update_stats(const Mat<eT>& X, const uword start_index, const uword end_index, const Mat<eT>& old_means, field< running_mean_vec<eT> >& running_means) const\n  {\n  arma_extra_debug_sigprint();\n  \n  // get_stream_err2() << \"km_update_stats(): start_index: \" << start_index << '\\n';\n  // get_stream_err2() << \"km_update_stats():   end_index: \" <<   end_index << '\\n';\n  \n  const uword N_dims = means.n_rows;\n  const uword N_gaus = means.n_cols;\n  \n  const eT* mah_aux_mem = mah_aux.memptr();\n  \n  for(uword i=start_index; i <= end_index; ++i)\n    {\n    const eT* X_colptr = X.colptr(i);\n    \n    double best_dist = Datum<eT>::inf;\n    uword  best_g    = 0;\n    \n    for(uword g=0; g < N_gaus; ++g)\n      {\n      const double dist = distance<eT,dist_id>::eval(N_dims, X_colptr, old_means.colptr(g), mah_aux_mem);\n      \n      // get_stream_err2() << \"g: \" << g << \"   dist: \" << dist << '\\n';\n      // old_means.col(g).print(\"old_means.col(g):\");\n      // vec tmp(old_means.colptr(g), old_means.n_rows);\n      // tmp.print(\"tmp:\");\n      \n      if(dist <= best_dist)  { best_dist = dist; best_g = g; }\n      }\n    \n    // get_stream_err2() << \"best_g: \" << best_g << '\\n';\n    \n    running_means[best_g]( X.unsafe_col(i), i );\n    }\n  }\n\n\n\n//! multi-threaded implementation of Expectation-Maximisation, inspired by MapReduce\ntemplate<typename eT>\ninline\nbool\ngmm_diag<eT>::em_iterate(const Mat<eT>& X, const uword max_iter, const eT var_floor, const bool verbose)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword N_dims = means.n_rows;\n  const uword N_gaus = means.n_cols;\n  \n  if(verbose)\n    {\n    get_stream_err2().unsetf(ios::showbase);\n    get_stream_err2().unsetf(ios::uppercase);\n    get_stream_err2().unsetf(ios::showpos);\n    get_stream_err2().unsetf(ios::scientific);\n    \n    get_stream_err2().setf(ios::right);\n    get_stream_err2().setf(ios::fixed);\n    }\n  \n  #if defined(_OPENMP)\n    const arma_omp_state save_omp_state;\n  #endif\n  \n  const umat boundaries = internal_gen_boundaries(X.n_cols);\n  \n  const uword n_threads = boundaries.n_cols;\n  \n  field< Mat<eT> > t_acc_means(n_threads); \n  field< Mat<eT> > t_acc_dcovs(n_threads);\n  \n  field< Col<eT> > t_acc_norm_lhoods(n_threads);\n  field< Col<eT> > t_gaus_log_lhoods(n_threads);\n  \n  Col<eT>          t_progress_log_lhood(n_threads);\n  \n  for(uword t=0; t<n_threads; t++)\n    {\n    t_acc_means[t].set_size(N_dims, N_gaus);\n    t_acc_dcovs[t].set_size(N_dims, N_gaus);\n    \n    t_acc_norm_lhoods[t].set_size(N_gaus);\n    t_gaus_log_lhoods[t].set_size(N_gaus);\n    }\n  \n  \n  #if defined(_OPENMP)\n    if(verbose)\n      {\n      get_stream_err2() << \"gmm_diag::learn(): EM: n_threads: \" << n_threads  << '\\n';\n      }\n  #endif\n  \n  eT old_avg_log_p = -Datum<eT>::inf;\n  \n  for(uword iter=1; iter <= max_iter; ++iter)\n    {\n    init_constants();\n    \n    em_update_params(X, boundaries, t_acc_means, t_acc_dcovs, t_acc_norm_lhoods, t_gaus_log_lhoods, t_progress_log_lhood);\n    \n    em_fix_params(var_floor);\n    \n    const eT new_avg_log_p = mean(t_progress_log_lhood);\n    \n    if(verbose)\n      {\n      get_stream_err2() << \"gmm_diag::learn(): EM: iteration: \";\n      get_stream_err2().unsetf(ios::scientific);\n      get_stream_err2().setf(ios::fixed);\n      get_stream_err2().width(std::streamsize(4));\n      get_stream_err2() << iter;\n      get_stream_err2() << \"   avg_log_p: \";\n      get_stream_err2().unsetf(ios::fixed);\n      //get_stream_err2().setf(ios::scientific);\n      get_stream_err2() << new_avg_log_p << '\\n';\n      }\n    \n    if(is_finite(new_avg_log_p) == false)  { return false; }\n    \n    if(std::abs(old_avg_log_p - new_avg_log_p) <= Datum<eT>::eps)  { break; }\n    \n    \n    old_avg_log_p = new_avg_log_p;\n    }\n  \n  \n  if(any(vectorise(dcovs) <= eT(0)))  { return false; }\n  if(means.is_finite() == false    )  { return false; }\n  if(dcovs.is_finite() == false    )  { return false; }\n  if(hefts.is_finite() == false    )  { return false; }\n  \n  return true;\n  }\n\n\n\n\ntemplate<typename eT>\ninline\nvoid\ngmm_diag<eT>::em_update_params\n  (\n  const Mat<eT>&          X,\n  const umat&             boundaries,\n        field< Mat<eT> >& t_acc_means,\n        field< Mat<eT> >& t_acc_dcovs,\n        field< Col<eT> >& t_acc_norm_lhoods,\n        field< Col<eT> >& t_gaus_log_lhoods,\n        Col<eT>&          t_progress_log_lhood\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_threads = boundaries.n_cols;\n  \n  \n  // em_generate_acc() is the \"map\" operation, which produces partial accumulators for means, diagonal covariances and hefts\n    \n  #if defined(_OPENMP)\n    {\n    #pragma omp parallel for\n    for(uword t=0; t<n_threads; t++)\n      {\n      Mat<eT>& acc_means          = t_acc_means[t];\n      Mat<eT>& acc_dcovs          = t_acc_dcovs[t];\n      Col<eT>& acc_norm_lhoods    = t_acc_norm_lhoods[t];\n      Col<eT>& gaus_log_lhoods    = t_gaus_log_lhoods[t];\n      eT&      progress_log_lhood = t_progress_log_lhood[t];\n      \n      em_generate_acc(X, boundaries.at(0,t), boundaries.at(1,t), acc_means, acc_dcovs, acc_norm_lhoods, gaus_log_lhoods, progress_log_lhood);\n      }\n    }\n  #else\n    {\n    em_generate_acc(X, boundaries.at(0,0), boundaries.at(1,0), t_acc_means[0], t_acc_dcovs[0], t_acc_norm_lhoods[0], t_gaus_log_lhoods[0], t_progress_log_lhood[0]);\n    }\n  #endif\n  \n  const uword N_dims = means.n_rows;\n  const uword N_gaus = means.n_cols;\n  \n  Mat<eT>& final_acc_means = t_acc_means[0];\n  Mat<eT>& final_acc_dcovs = t_acc_dcovs[0];\n  \n  Col<eT>& final_acc_norm_lhoods = t_acc_norm_lhoods[0];\n  \n  \n  // the \"reduce\" operation, which combines the partial accumulators produced by the separate threads\n  \n  for(uword t=1; t<n_threads; t++)\n    {\n    final_acc_means += t_acc_means[t];\n    final_acc_dcovs += t_acc_dcovs[t];\n    \n    final_acc_norm_lhoods += t_acc_norm_lhoods[t];\n    }\n  \n  \n  eT* hefts_mem = access::rw(hefts).memptr();\n    \n  for(uword g=0; g < N_gaus; ++g)\n    {\n    eT* mean_mem = access::rw(means).colptr(g);\n    eT* dcov_mem = access::rw(dcovs).colptr(g);\n    \n    eT* acc_mean_mem = final_acc_means.colptr(g);\n    eT* acc_dcov_mem = final_acc_dcovs.colptr(g);\n    \n    const eT acc_norm_lhood = final_acc_norm_lhoods[g];\n    \n    hefts_mem[g] = acc_norm_lhood / eT(X.n_cols);\n    \n    for(uword d=0; d < N_dims; ++d)\n      {\n      const eT tmp = acc_mean_mem[d] / acc_norm_lhood;\n      \n      mean_mem[d] = tmp;\n      dcov_mem[d] = acc_dcov_mem[d] / acc_norm_lhood - tmp*tmp;\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ngmm_diag<eT>::em_generate_acc\n  (\n  const Mat<eT>& X,\n  const uword    start_index,\n  const uword      end_index,\n        Mat<eT>& acc_means,\n        Mat<eT>& acc_dcovs,\n        Col<eT>& acc_norm_lhoods,\n        Col<eT>& gaus_log_lhoods,\n        eT&      progress_log_lhood\n  )\n  const\n  {\n  arma_extra_debug_sigprint();\n  \n  progress_log_lhood = eT(0);\n  \n  acc_means.zeros();\n  acc_dcovs.zeros();\n  \n  acc_norm_lhoods.zeros();\n  gaus_log_lhoods.zeros();\n  \n  const uword N_dims = means.n_rows;\n  const uword N_gaus = means.n_cols;\n  \n  const eT* log_hefts_mem       = log_hefts.memptr();\n        eT* gaus_log_lhoods_mem = gaus_log_lhoods.memptr();\n  \n  \n  for(uword i=start_index; i <= end_index; i++)\n    {\n    const eT* x = X.colptr(i);\n    \n    for(uword g=0; g < N_gaus; ++g)\n      {\n      gaus_log_lhoods_mem[g] = internal_scalar_log_p(x, g) + log_hefts_mem[g];\n      }\n    \n    eT log_lhood_sum = gaus_log_lhoods_mem[0];\n    \n    for(uword g=1; g < N_gaus; ++g)\n      {\n      log_lhood_sum = log_add_exp(log_lhood_sum, gaus_log_lhoods_mem[g]);\n      }\n    \n    progress_log_lhood += log_lhood_sum;\n    \n    for(uword g=0; g < N_gaus; ++g)\n      {\n      const eT norm_lhood = std::exp(gaus_log_lhoods_mem[g] - log_lhood_sum);\n      \n      acc_norm_lhoods[g] += norm_lhood;\n      \n      eT* acc_mean_mem = acc_means.colptr(g);\n      eT* acc_dcov_mem = acc_dcovs.colptr(g);\n      \n      for(uword d=0; d < N_dims; ++d)\n        {\n        const eT x_d = x[d];\n        const eT y_d = x_d * norm_lhood;\n        \n        acc_mean_mem[d] += y_d;\n        acc_dcov_mem[d] += y_d * x_d;  // equivalent to x_d * x_d * norm_lhood\n        }\n      }\n    }\n  \n  progress_log_lhood /= eT((end_index - start_index) + 1);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\ngmm_diag<eT>::em_fix_params(const eT var_floor)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword N_dims = means.n_rows;\n  const uword N_gaus = means.n_cols;\n  \n  for(uword g=0; g < N_gaus; ++g)\n    {\n    eT* dcov_mem = access::rw(dcovs).colptr(g);\n    \n    for(uword d=0; d < N_dims; ++d)\n      {\n      if(dcov_mem[d] < var_floor)  { dcov_mem[d] = var_floor; }\n      }\n    }\n  \n  const eT heft_sum = accu(hefts);\n  \n  if(heft_sum != eT(1))  { access::rw(hefts) / heft_sum; }\n  }\n\n\n}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/gmm_misc_bones.hpp",
    "content": "// Copyright (C) 2014 Conrad Sanderson\n// Copyright (C) 2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\nnamespace gmm_priv\n{\n\n\n// running_mean_scalar\n\ntemplate<typename eT>\nclass running_mean_scalar\n  {\n  public:\n  \n  inline running_mean_scalar();\n  inline running_mean_scalar(const running_mean_scalar& in_rms);\n  \n  inline const running_mean_scalar& operator=(const running_mean_scalar& in_rms);\n  \n  arma_hot inline void operator() (const eT X);\n  \n  inline void  reset();\n  \n  inline uword count() const;\n  inline eT    mean()  const;\n  \n  \n  private:\n  \n  arma_aligned uword counter;\n  arma_aligned eT    r_mean;\n  };\n\n\n\n// running_mean_vec\n\ntemplate<typename eT>\nclass running_mean_vec\n  {\n  public:\n  \n  inline running_mean_vec();\n  inline running_mean_vec(const running_mean_vec& in_rmv);\n  \n  inline const running_mean_vec& operator=(const running_mean_vec& in_rmv);\n  \n  arma_hot inline void operator() (const Col<eT>& X, const uword index);\n  \n  inline void reset();\n  \n  inline uword          last_index() const;\n  inline uword          count()      const;\n  inline const Col<eT>& mean()       const;\n  \n  \n  private:\n  \n  arma_aligned uword   last_i;\n  arma_aligned uword   counter;\n  arma_aligned Col<eT> r_mean;\n  };\n\n\n\n// distance\n\ntemplate<typename eT, uword dist_id>\nstruct distance {};\n\n\ntemplate<typename eT>\nstruct distance<eT, uword(1)>\n  {\n  arma_inline arma_hot static eT eval(const uword N, const eT* A, const eT* B, const eT*);\n  };\n\n\n\ntemplate<typename eT>\nstruct distance<eT, uword(2)>\n  {\n  arma_inline arma_hot static eT eval(const uword N, const eT* A, const eT* B, const eT* C);\n  };\n\n\n}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/gmm_misc_meat.hpp",
    "content": "// Copyright (C) 2014 Conrad Sanderson\n// Copyright (C) 2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\nnamespace gmm_priv\n{\n\n\ntemplate<typename eT>\ninline\nrunning_mean_scalar<eT>::running_mean_scalar()\n  : counter(uword(0))\n  , r_mean (   eT(0))\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\ntemplate<typename eT>\ninline\nrunning_mean_scalar<eT>::running_mean_scalar(const running_mean_scalar<eT>& in)\n  : counter(in.counter)\n  , r_mean (in.r_mean )\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst running_mean_scalar<eT>&\nrunning_mean_scalar<eT>::operator=(const running_mean_scalar<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  counter = in.counter;\n  r_mean  = in.r_mean;\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\nrunning_mean_scalar<eT>::operator() (const eT X)\n  {\n  arma_extra_debug_sigprint();\n  \n  counter++;\n  \n  if(counter > 1)\n    {\n    const eT old_r_mean = r_mean;\n    \n    r_mean = old_r_mean + (X - old_r_mean)/counter;\n    }\n  else\n    {\n    r_mean = X;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nrunning_mean_scalar<eT>::reset()\n  {\n  arma_extra_debug_sigprint();\n  \n  counter = 0;\n  r_mean  = eT(0);\n  }\n\n\n\ntemplate<typename eT>\ninline\nuword\nrunning_mean_scalar<eT>::count() const\n  {\n  return counter;\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nrunning_mean_scalar<eT>::mean() const\n  {\n  return r_mean;\n  }\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename eT>\ninline\nrunning_mean_vec<eT>::running_mean_vec()\n  : last_i (0)\n  , counter(0)\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\ntemplate<typename eT>\ninline\nrunning_mean_vec<eT>::running_mean_vec(const running_mean_vec<eT>& in)\n  : last_i (in.last_i )\n  , counter(in.counter)\n  , r_mean (in.r_mean )\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst running_mean_vec<eT>&\nrunning_mean_vec<eT>::operator=(const running_mean_vec<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  last_i  = in.last_i; \n  counter = in.counter;\n  r_mean  = in.r_mean;\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\nrunning_mean_vec<eT>::operator() (const Col<eT>& X, const uword index)\n  {\n  arma_extra_debug_sigprint();\n  \n  last_i = index;\n  \n  counter++;\n  \n  if(counter > 1)\n    {\n    const uword n_elem      = r_mean.n_elem;\n    \n          eT*   r_mean_mem  = r_mean.memptr();\n    const eT*   X_mem       = X.memptr();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      const eT r_mean_val = r_mean_mem[i];\n      \n      r_mean_mem[i] = r_mean_val + (X_mem[i] - r_mean_val)/counter;\n      }\n    }\n  else\n    {\n    r_mean = X;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nrunning_mean_vec<eT>::reset()\n  {\n  arma_extra_debug_sigprint();\n  \n  last_i  = 0;\n  counter = 0;\n  \n  r_mean.reset();\n  }\n\n\n\ntemplate<typename eT>\ninline\nuword\nrunning_mean_vec<eT>::last_index() const\n  {\n  return last_i;\n  }\n\n\n\ntemplate<typename eT>\ninline\nuword\nrunning_mean_vec<eT>::count() const\n  {\n  return counter;\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst Col<eT>&\nrunning_mean_vec<eT>::mean() const\n  {\n  return r_mean;\n  }\n\n\n\n\n//\n//\n//\n\n\n\n\ntemplate<typename eT>\narma_inline\narma_hot\neT\ndistance<eT, uword(1)>::eval(const uword N, const eT* A, const eT* B, const eT*)\n  {\n  eT acc1 = eT(0);\n  eT acc2 = eT(0);\n  \n  uword i,j;\n  for(i=0, j=1; j<N; i+=2, j+=2)\n    {\n    eT tmp_i = A[i];\n    eT tmp_j = A[j];\n    \n    tmp_i -= B[i];\n    tmp_j -= B[j];\n    \n    acc1 += tmp_i*tmp_i;\n    acc2 += tmp_j*tmp_j;\n    }\n  \n  if(i < N)\n    {\n    const eT tmp_i = A[i] - B[i];\n    \n    acc1 += tmp_i*tmp_i;\n    }\n  \n  return (acc1 + acc2);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\narma_hot\neT\ndistance<eT, uword(2)>::eval(const uword N, const eT* A, const eT* B, const eT* C)\n  {\n  eT acc1 = eT(0);\n  eT acc2 = eT(0);\n  \n  uword i,j;\n  for(i=0, j=1; j<N; i+=2, j+=2)\n    {\n    eT tmp_i = A[i];\n    eT tmp_j = A[j];\n    \n    tmp_i -= B[i];\n    tmp_j -= B[j];\n    \n    acc1 += (tmp_i*tmp_i) * C[i];\n    acc2 += (tmp_j*tmp_j) * C[j];\n    }\n  \n  if(i < N)\n    {\n    const eT tmp_i = A[i] - B[i];\n    \n    acc1 += (tmp_i*tmp_i) * C[i];\n    }\n  \n  return (acc1 + acc2);\n  }\n\n}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/hdf5_bones.hpp",
    "content": "// Copyright (C) 2014 Ryan Curtin\r\n// \r\n// This Source Code Form is subject to the terms of the Mozilla Public\r\n// License, v. 2.0. If a copy of the MPL was not distributed with this\r\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\r\n\r\n\r\n#if defined(ARMA_USE_HDF5)\r\n\r\n#if !defined(ARMA_USE_HDF5_ALT)\r\n  \r\n  // macros needed if the wrapper run-time library is not being used\r\n  \r\n  #define arma_H5Tcopy      H5Tcopy\r\n  #define arma_H5Tcreate    H5Tcreate\r\n  #define arma_H5Tinsert    H5Tinsert\r\n  #define arma_H5Tequal     H5Tequal\r\n  #define arma_H5Tclose     H5Tclose\r\n\r\n  #define arma_H5Dopen      H5Dopen\r\n  #define arma_H5Dget_type  H5Dget_type\r\n  #define arma_H5Dclose     H5Dclose\r\n  #define arma_H5Dwrite     H5Dwrite\r\n  #define arma_H5Dget_space H5Dget_space\r\n  #define arma_H5Dread      H5Dread\r\n  #define arma_H5Dcreate    H5Dcreate\r\n\r\n  #define arma_H5Sget_simple_extent_ndims   H5Sget_simple_extent_ndims\r\n  #define arma_H5Sget_simple_extent_dims    H5Sget_simple_extent_dims\r\n  #define arma_H5Sclose                     H5Sclose\r\n  #define arma_H5Screate_simple             H5Screate_simple\r\n\r\n  #define arma_H5Ovisit     H5Ovisit\r\n\r\n  #define arma_H5Eset_auto  H5Eset_auto\r\n  #define arma_H5Eget_auto  H5Eget_auto\r\n\r\n  #define arma_H5Fopen      H5Fopen\r\n  #define arma_H5Fcreate    H5Fcreate\r\n  #define arma_H5Fclose     H5Fclose\r\n  #define arma_H5Fis_hdf5   H5Fis_hdf5\r\n\r\n  #define arma_H5T_NATIVE_UCHAR   H5T_NATIVE_UCHAR\r\n  #define arma_H5T_NATIVE_CHAR    H5T_NATIVE_CHAR\r\n  #define arma_H5T_NATIVE_SHORT   H5T_NATIVE_SHORT\r\n  #define arma_H5T_NATIVE_USHORT  H5T_NATIVE_USHORT\r\n  #define arma_H5T_NATIVE_INT     H5T_NATIVE_INT\r\n  #define arma_H5T_NATIVE_UINT    H5T_NATIVE_UINT\r\n  #define arma_H5T_NATIVE_LONG    H5T_NATIVE_LONG\r\n  #define arma_H5T_NATIVE_ULONG   H5T_NATIVE_ULONG\r\n  #define arma_H5T_NATIVE_LLONG   H5T_NATIVE_LLONG\r\n  #define arma_H5T_NATIVE_ULLONG  H5T_NATIVE_ULLONG\r\n  #define arma_H5T_NATIVE_FLOAT   H5T_NATIVE_FLOAT\r\n  #define arma_H5T_NATIVE_DOUBLE  H5T_NATIVE_DOUBLE\r\n\r\n#else\r\n\r\n// prototypes for the wrapper functions defined in the wrapper run-time library (src/wrapper.cpp)\r\n\r\nextern \"C\"\r\n  {\r\n  // Wrapper functions for H5* functions.\r\n  hid_t  arma_H5Tcopy(hid_t dtype_id);\r\n  hid_t  arma_H5Tcreate(H5T_class_t cl, size_t size);\r\n  herr_t arma_H5Tinsert(hid_t dtype_id, const char* name, size_t offset, hid_t field_id);\r\n  htri_t arma_H5Tequal(hid_t dtype_id1, hid_t dtype_id2);\r\n  herr_t arma_H5Tclose(hid_t dtype_id);\r\n  \r\n  hid_t  arma_H5Dopen(hid_t loc_id, const char* name, hid_t dapl_id);\r\n  hid_t  arma_H5Dget_type(hid_t dataset_id);\r\n  herr_t arma_H5Dclose(hid_t dataset_id);\r\n  hid_t  arma_H5Dcreate(hid_t loc_id, const char* name, hid_t dtype_id, hid_t space_id, hid_t lcpl_id, hid_t dcpl_id, hid_t dapl_id);\r\n  herr_t arma_H5Dwrite(hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id, hid_t xfer_plist_id, const void* buf);\r\n  hid_t  arma_H5Dget_space(hid_t dataset_id);\r\n  herr_t arma_H5Dread(hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id, hid_t xfer_plist_id, void* buf);\r\n  \r\n  int    arma_H5Sget_simple_extent_ndims(hid_t space_id);\r\n  int    arma_H5Sget_simple_extent_dims(hid_t space_id, hsize_t* dims, hsize_t* maxdims);\r\n  herr_t arma_H5Sclose(hid_t space_id);\r\n  hid_t  arma_H5Screate_simple(int rank, const hsize_t* current_dims, const hsize_t* maximum_dims);\r\n  \r\n  herr_t arma_H5Ovisit(hid_t object_id, H5_index_t index_type, H5_iter_order_t order, H5O_iterate_t op, void* op_data);\r\n  \r\n  herr_t arma_H5Eset_auto(hid_t estack_id, H5E_auto_t func, void* client_data);\r\n  herr_t arma_H5Eget_auto(hid_t estack_id, H5E_auto_t* func, void** client_data);\r\n  \r\n  hid_t  arma_H5Fopen(const char* name, unsigned flags, hid_t fapl_id);\r\n  hid_t  arma_H5Fcreate(const char* name, unsigned flags, hid_t fcpl_id, hid_t fapl_id);\r\n  herr_t arma_H5Fclose(hid_t file_id);\r\n  htri_t arma_H5Fis_hdf5(const char* name);\r\n  \r\n  // Wrapper variables that represent the hid_t values for the H5T_NATIVE_*\r\n  // types.  Note that H5T_NATIVE_UCHAR itself is a macro that resolves to about\r\n  // forty other macros, and we definitely don't want to hijack those,\r\n  // so this is the best way to go about wrapping these...\r\n  extern hid_t arma_H5T_NATIVE_UCHAR;\r\n  extern hid_t arma_H5T_NATIVE_CHAR;\r\n  extern hid_t arma_H5T_NATIVE_SHORT;\r\n  extern hid_t arma_H5T_NATIVE_USHORT;\r\n  extern hid_t arma_H5T_NATIVE_INT;\r\n  extern hid_t arma_H5T_NATIVE_UINT;\r\n  extern hid_t arma_H5T_NATIVE_LONG;\r\n  extern hid_t arma_H5T_NATIVE_ULONG;\r\n  extern hid_t arma_H5T_NATIVE_LLONG;\r\n  extern hid_t arma_H5T_NATIVE_ULLONG;\r\n  extern hid_t arma_H5T_NATIVE_FLOAT;\r\n  extern hid_t arma_H5T_NATIVE_DOUBLE;\r\n  \r\n  }\r\n  \r\n  // Lastly, we have to hijack H5open() and H5check_version(), which are called\r\n  // by some expanded macros of the other H5* functions.  This means we can't\r\n  // create arma_H5open(), because we can't modify those macros.  Instead, we'll\r\n  // create arma::H5open() and arma::H5check_version(), and then issue a using\r\n  // directive so that arma::H5open() and arma::H5check_version() are always\r\n  // called.\r\n  //\r\n  // There is potential danger in the use of a using directive like this, but in\r\n  // this case, I can't think of a better way to solve the problem, and I doubt\r\n  // this will cause problems in any situations that aren't truly bizarre.  And\r\n  // if it does cause problems, the user can #define ARMA_DONT_USE_WRAPPER or\r\n  // #undef ARMA_USE_WRAPPER in their Armadillo configuration.\r\n  herr_t H5open();\r\n  herr_t H5check_version(unsigned majnum, unsigned minnum, unsigned relnum);\r\n  \r\n  using arma::H5open;\r\n  using arma::H5check_version;\r\n  \r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/hdf5_misc.hpp",
    "content": "// Copyright (C) 2012 Ryan Curtin\n// Copyright (C) 2012 Conrad Sanderson\n// Copyright (C) 2013 Szabolcs Horvat\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n//! \\addtogroup hdf5_misc\n//! @{\n\n\n#if defined(ARMA_USE_HDF5)\nnamespace hdf5_misc\n{\n\n\n//! Given a certain type, find the corresponding HDF5 datatype.  This can't be\n//! done entirely at compile time, unfortunately, because the H5T_* macros\n//! depend on function calls.\ntemplate< typename eT >\ninline\nhid_t\nget_hdf5_type()\n  {\n  return -1; // Return invalid.\n  }\n\n\n\n//! Specializations for each valid element type\n//! (taken from all the possible typedefs of {u8, s8, ..., u64, s64} and the other native types.  \n//! We can't use the actual u8/s8 typedefs because their relations to the H5T_... types are unclear.\ntemplate<>\ninline\nhid_t\nget_hdf5_type< unsigned char >()\n  {\n  return arma_H5Tcopy(arma_H5T_NATIVE_UCHAR);\n  }\n\ntemplate<>\ninline\nhid_t\nget_hdf5_type< char >()\n  {\n  return arma_H5Tcopy(arma_H5T_NATIVE_CHAR);\n  }\n\ntemplate<>\ninline\nhid_t\nget_hdf5_type< short >()\n  {\n  return arma_H5Tcopy(arma_H5T_NATIVE_SHORT);\n  }\n\ntemplate<>\ninline\nhid_t\nget_hdf5_type< unsigned short >()\n  {\n  return arma_H5Tcopy(arma_H5T_NATIVE_USHORT);\n  }\n\ntemplate<>\ninline\nhid_t\nget_hdf5_type< int >()\n  {\n  return arma_H5Tcopy(arma_H5T_NATIVE_INT);\n  }\n\ntemplate<>\ninline\nhid_t\nget_hdf5_type< unsigned int >()\n  {\n  return arma_H5Tcopy(arma_H5T_NATIVE_UINT);\n  }\n\ntemplate<>\ninline\nhid_t\nget_hdf5_type< long >()\n  {\n  return arma_H5Tcopy(arma_H5T_NATIVE_LONG);\n  }\n\ntemplate<>\ninline\nhid_t\nget_hdf5_type< unsigned long >()\n  {\n  return arma_H5Tcopy(arma_H5T_NATIVE_ULONG);\n  }\n\n\n#if defined(ARMA_USE_U64S64) && defined(ULLONG_MAX)\n  template<>\n  inline\n  hid_t\n  get_hdf5_type< long long >()\n    {\n    return arma_H5Tcopy(arma_H5T_NATIVE_LLONG);\n    }\n\n  template<>\n  inline\n  hid_t\n  get_hdf5_type< unsigned long long >()\n    {\n    return arma_H5Tcopy(arma_H5T_NATIVE_ULLONG);\n    }\n#endif\n\n\ntemplate<>\ninline\nhid_t\nget_hdf5_type< float >()\n  {\n  return arma_H5Tcopy(arma_H5T_NATIVE_FLOAT);\n  }\n\ntemplate<>\ninline\nhid_t\nget_hdf5_type< double >()\n  {\n  return arma_H5Tcopy(arma_H5T_NATIVE_DOUBLE);\n  }\n\n\n\n//! Utility hid_t since HOFFSET() won't work with std::complex.\ntemplate<typename eT>\nstruct hdf5_complex_t\n  {\n  eT real;\n  eT imag;\n  };\n\n\n\ntemplate<>\ninline\nhid_t\nget_hdf5_type< std::complex<float> >()\n  {\n  hid_t type = arma_H5Tcreate(H5T_COMPOUND, sizeof(hdf5_complex_t<float>));\n  \n  arma_H5Tinsert(type, \"real\", HOFFSET(hdf5_complex_t<float>, real), arma_H5T_NATIVE_FLOAT);\n  arma_H5Tinsert(type, \"imag\", HOFFSET(hdf5_complex_t<float>, imag), arma_H5T_NATIVE_FLOAT);\n  \n  return type;\n  }\n\n\n\ntemplate<>\ninline\nhid_t\nget_hdf5_type< std::complex<double> >()\n  {\n  hid_t type = arma_H5Tcreate(H5T_COMPOUND, sizeof(hdf5_complex_t<double>));\n\n  arma_H5Tinsert(type, \"real\", HOFFSET(hdf5_complex_t<double>, real), arma_H5T_NATIVE_DOUBLE);\n  arma_H5Tinsert(type, \"imag\", HOFFSET(hdf5_complex_t<double>, imag), arma_H5T_NATIVE_DOUBLE);\n\n  return type;\n  }\n\n\n\n// Compare datatype against all supported types.\ninline\nbool\nis_supported_arma_hdf5_type(hid_t datatype)\n  {\n  hid_t  search_type;\n  \n  bool is_equal;\n  \n  \n  // start with most likely used types: double, complex<double>, float, complex<float>\n  \n  search_type = get_hdf5_type<double>();\n  is_equal = ( arma_H5Tequal(datatype, search_type) > 0 );\n  arma_H5Tclose(search_type);\n  if (is_equal) { return true; }\n  \n  search_type = get_hdf5_type< std::complex<double> >();\n  is_equal = ( arma_H5Tequal(datatype, search_type) > 0 );\n  arma_H5Tclose(search_type);\n  if (is_equal) { return true; }\n  \n  search_type = get_hdf5_type<float>();\n  is_equal = ( arma_H5Tequal(datatype, search_type) > 0 );\n  arma_H5Tclose(search_type);\n  if (is_equal) { return true; }\n  \n  search_type = get_hdf5_type< std::complex<float> >();\n  is_equal = ( arma_H5Tequal(datatype, search_type) > 0 );\n  arma_H5Tclose(search_type);\n  if (is_equal) { return true; }\n  \n  \n  // remaining supported types: u8, s8, u16, s16, u32, s32, u64, s64, ulng_t, slng_t\n  \n  search_type = get_hdf5_type<u8>();\n  is_equal = ( arma_H5Tequal(datatype, search_type) > 0 );\n  arma_H5Tclose(search_type);\n  if (is_equal) { return true; }\n  \n  search_type = get_hdf5_type<s8>();\n  is_equal = ( arma_H5Tequal(datatype, search_type) > 0 );\n  arma_H5Tclose(search_type);\n  if (is_equal) { return true; }\n  \n  search_type = get_hdf5_type<u16>();\n  is_equal = ( arma_H5Tequal(datatype, search_type) > 0 );\n  arma_H5Tclose(search_type);\n  if (is_equal) { return true; }\n  \n  search_type = get_hdf5_type<s16>();\n  is_equal = ( arma_H5Tequal(datatype, search_type) > 0 );\n  arma_H5Tclose(search_type);\n  if (is_equal) { return true; }\n  \n  search_type = get_hdf5_type<u32>();\n  is_equal = ( arma_H5Tequal(datatype, search_type) > 0 );\n  arma_H5Tclose(search_type);\n  if (is_equal) { return true; }\n  \n  search_type = get_hdf5_type<s32>();\n  is_equal = ( arma_H5Tequal(datatype, search_type) > 0 );\n  arma_H5Tclose(search_type);\n  if (is_equal) { return true; }\n  \n  #if defined(ARMA_USE_U64S64)\n    {\n    search_type = get_hdf5_type<u64>();\n    is_equal = ( arma_H5Tequal(datatype, search_type) > 0 );\n    arma_H5Tclose(search_type);\n    if (is_equal) { return true; }\n    \n    search_type = get_hdf5_type<s64>();\n    is_equal = ( arma_H5Tequal(datatype, search_type) > 0 );\n    arma_H5Tclose(search_type);\n    if (is_equal) { return true; }\n    }\n  #endif\n  \n  #if defined(ARMA_ALLOW_LONG)\n    {\n    search_type = get_hdf5_type<ulng_t>();\n    is_equal = ( arma_H5Tequal(datatype, search_type) > 0 );\n    arma_H5Tclose(search_type);\n    if (is_equal) { return true; }\n    \n    search_type = get_hdf5_type<slng_t>();\n    is_equal = ( arma_H5Tequal(datatype, search_type) > 0 );\n    arma_H5Tclose(search_type);\n    if (is_equal) { return true; }\n    }\n  #endif\n  \n  return false;\n  }\n\n\n\n//! Auxiliary functions and structs for search_hdf5_file.\nstruct hdf5_search_info\n  {\n  const  std::vector<std::string>& names;\n  int    num_dims;\n  bool   exact;\n  hid_t  best_match;\n  size_t best_match_position; // Position of best match in names vector.\n  };\n\n\n\ninline\nherr_t\nhdf5_search_callback\n  (\n  hid_t             loc_id,\n  const char*       name,\n  const H5O_info_t* info,\n  void*             operator_data  // hdf5_search_info\n  )\n  {\n  hdf5_search_info* search_info = (hdf5_search_info*) operator_data;\n\n  // We are looking for datasets.\n  if (info->type == H5O_TYPE_DATASET)\n    {\n    // Check type of dataset to see if we could even load it.\n    hid_t dataset  = arma_H5Dopen(loc_id, name, H5P_DEFAULT);\n    hid_t datatype = arma_H5Dget_type(dataset);\n    \n    const bool is_supported = is_supported_arma_hdf5_type(datatype);\n    \n    arma_H5Tclose(datatype);\n    arma_H5Dclose(dataset);\n    \n    if(is_supported == false)\n      {\n      // Forget about it and move on.\n      return 0;\n      }\n    \n    // Now we have to check against our set of names.\n    // Only check names which could be better.\n    for (size_t string_pos = 0; string_pos < search_info->best_match_position; ++string_pos)\n      {\n      // name is the full path (/path/to/dataset); names[string_pos] may be\n      // \"dataset\", \"/to/dataset\", or \"/path/to/dataset\".\n      // So if we count the number of forward slashes in names[string_pos],\n      // and then simply take the last substring of name containing that number of slashes,\n      // we can do the comparison.\n      \n      // Count the number of forward slashes in names[string_pos].\n      uword count = 0;\n      for (uword i = 0; i < search_info->names[string_pos].length(); ++i)\n        {\n        if ((search_info->names[string_pos])[i] == '/') { ++count; }\n        }\n\n      // Count the number of forward slashes in the full name.\n      uword name_count = 0;\n      const std::string str = std::string(name);\n      for (uword i = 0; i < str.length(); ++i)\n        {\n        if (str[i] == '/') { ++count; }\n        }\n\n      // If we are asking for more slashes than we have, this can't be a match.\n      // Skip to below, where we decide whether or not to keep it anyway based\n      // on the exactness condition of the search.\n      if (count <= name_count)\n        {\n        size_t start_pos = (count == 0) ? 0 : std::string::npos;\n        while (count > 0)\n          {\n          // Move pointer to previous slash.\n          start_pos = str.rfind('/', start_pos);\n          \n          // Break if we've run out of slashes.\n          if (start_pos == std::string::npos) { break; }\n          \n          --count;\n          }\n\n        // Now take the substring (this may end up being the full string).\n        const std::string substring = str.substr(start_pos);\n\n        // Are they the same?\n        if (substring == search_info->names[string_pos])\n          {\n          // We have found the object; it must be better than our existing match.\n          hid_t match_candidate = arma_H5Dopen(loc_id, name, H5P_DEFAULT);\n\n\n          // arma_check(match_candidate < 0, \"Mat::load(): cannot open an HDF5 dataset\");\n          if(match_candidate < 0)\n            {\n            return -1;\n            }\n          \n          \n          // Ensure that the dataset is valid and of the correct dimensionality.\n          hid_t filespace = arma_H5Dget_space(match_candidate);\n          int num_dims = arma_H5Sget_simple_extent_ndims(filespace);\n          \n          if (num_dims <= search_info->num_dims)\n            {\n            // Valid dataset -- we'll keep it.\n            // If we already have an existing match we have to close it.\n            if (search_info->best_match != -1)\n              {\n              arma_H5Dclose(search_info->best_match);\n              }\n\n            search_info->best_match_position = string_pos;\n            search_info->best_match          = match_candidate;\n            }\n          \n          arma_H5Sclose(filespace);\n          }\n        }\n      \n      \n      // If they are not the same, but we have not found anything and we don't need an exact match, take this.\n      if ((search_info->exact == false) && (search_info->best_match == -1))\n        {\n        hid_t match_candidate = arma_H5Dopen(loc_id, name, H5P_DEFAULT);\n        \n        // arma_check(match_candidate < 0, \"Mat::load(): cannot open an HDF5 dataset\");\n        if(match_candidate < 0)\n          {\n          return -1;\n          }\n        \n        hid_t filespace = arma_H5Dget_space(match_candidate);\n        int num_dims = arma_H5Sget_simple_extent_ndims(filespace);\n        \n        if (num_dims <= search_info->num_dims)\n          {\n          // Valid dataset -- we'll keep it.\n          search_info->best_match = arma_H5Dopen(loc_id, name, H5P_DEFAULT);\n          }\n        \n        arma_H5Sclose(filespace);\n        }\n      }\n    }\n  \n  return 0;\n  }\n\n\n\n//! Search an HDF5 file for the given dataset names.  \n//! If 'exact' is true, failure to find a dataset in the list of names means that -1 is returned.\n//! If 'exact' is false and no datasets are found, -1 is returned.  \n//! The number of dimensions is used to help prune down invalid datasets;\n//! 2 dimensions is a matrix, 1 dimension is a vector, and 3 dimensions is a cube.  \n//! If the number of dimensions in a dataset is less than or equal to num_dims, \n//! it will be considered -- for instance, a one-dimensional HDF5 vector can be loaded as a single-column matrix.\ninline\nhid_t\nsearch_hdf5_file\n  (\n  const std::vector<std::string>& names,\n  hid_t                           hdf5_file,\n  int                             num_dims = 2,\n  bool                            exact = false\n  )\n  {\n  hdf5_search_info search_info = { names, num_dims, exact, -1, names.size() };\n  \n  // We'll use the H5Ovisit to track potential entries.\n  herr_t status = arma_H5Ovisit(hdf5_file, H5_INDEX_NAME, H5_ITER_NATIVE, hdf5_search_callback, void_ptr(&search_info));\n  \n  // Return the best match; it will be -1 if there was a problem.\n  return (status < 0) ? -1 : search_info.best_match;\n  }\n\n\n\n//! Load an HDF5 matrix into an array of type specified by datatype,\n//! then convert that into the desired array 'dest'.\n//! This should only be called when eT is not the datatype.\ntemplate<typename eT>\ninline\nhid_t\nload_and_convert_hdf5\n  (\n  eT   *dest,\n  hid_t dataset,\n  hid_t datatype,\n  uword n_elem\n  )\n  {\n  \n  // We can't use nice template specializations here\n  // as the determination of the type of 'datatype' must be done at runtime.\n  // So we end up with this ugliness...\n  hid_t search_type;\n  \n  bool is_equal;\n  \n  \n  // u8\n  search_type = get_hdf5_type<u8>();\n  is_equal = (arma_H5Tequal(datatype, search_type) > 0);\n  arma_H5Tclose(search_type);\n  \n  if(is_equal)\n    {\n    Col<u8> v(n_elem);\n    hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr()));\n    arrayops::convert(dest, v.memptr(), n_elem);\n\n    return status;\n    }\n  \n  \n  // s8\n  search_type = get_hdf5_type<s8>();\n  is_equal = (arma_H5Tequal(datatype, search_type) > 0);\n  arma_H5Tclose(search_type);\n  \n  if(is_equal)\n    {\n    Col<s8> v(n_elem);\n    hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr()));\n    arrayops::convert(dest, v.memptr(), n_elem);\n\n    return status;\n    }\n  \n  \n  // u16\n  search_type = get_hdf5_type<u16>();\n  is_equal = (arma_H5Tequal(datatype, search_type) > 0);\n  arma_H5Tclose(search_type);\n  \n  if(is_equal)\n    {\n    Col<u16> v(n_elem);\n    hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr()));\n    arrayops::convert(dest, v.memptr(), n_elem);\n\n    return status;\n    }\n  \n  \n  // s16\n  search_type = get_hdf5_type<s16>();\n  is_equal = (arma_H5Tequal(datatype, search_type) > 0);\n  arma_H5Tclose(search_type);\n  \n  if(is_equal)\n    {\n    Col<s16> v(n_elem);\n    hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr()));\n    arrayops::convert(dest, v.memptr(), n_elem);\n\n    return status;\n    }\n  \n  \n  // u32\n  search_type = get_hdf5_type<u32>();\n  is_equal = (arma_H5Tequal(datatype, search_type) > 0);\n  arma_H5Tclose(search_type);\n  \n  if(is_equal)\n    {\n    Col<u32> v(n_elem);\n    hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr()));\n    arrayops::convert(dest, v.memptr(), n_elem);\n\n    return status;\n    }\n  \n  \n  // s32\n  search_type = get_hdf5_type<s32>();\n  is_equal = (arma_H5Tequal(datatype, search_type) > 0);\n  arma_H5Tclose(search_type);\n  \n  if(is_equal)\n    {\n    Col<s32> v(n_elem);\n    hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr()));\n    arrayops::convert(dest, v.memptr(), n_elem);\n\n    return status;\n    }\n  \n  \n  #if defined(ARMA_USE_U64S64)\n    {\n    // u64\n    search_type = get_hdf5_type<u64>();\n    is_equal = (arma_H5Tequal(datatype, search_type) > 0);\n    arma_H5Tclose(search_type);\n    \n    if(is_equal)\n      {\n      Col<u64> v(n_elem);\n      hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr()));\n      arrayops::convert(dest, v.memptr(), n_elem);\n\n      return status;\n      }\n    \n    \n    // s64\n    search_type = get_hdf5_type<s64>();\n    is_equal = (arma_H5Tequal(datatype, search_type) > 0);\n    arma_H5Tclose(search_type);\n    \n    if(is_equal)\n      {\n      Col<s64> v(n_elem);\n      hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr()));\n      arrayops::convert(dest, v.memptr(), n_elem);\n\n      return status;\n      }\n    }\n  #endif\n  \n  \n  #if defined(ARMA_ALLOW_LONG)\n    {\n    // ulng_t\n    search_type = get_hdf5_type<ulng_t>();\n    is_equal = (arma_H5Tequal(datatype, search_type) > 0);\n    arma_H5Tclose(search_type);\n    \n    if(is_equal)\n      {\n      Col<ulng_t> v(n_elem);\n      hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr()));\n      arrayops::convert(dest, v.memptr(), n_elem);\n\n      return status;\n      }\n    \n    \n    // slng_t\n    search_type = get_hdf5_type<slng_t>();\n    is_equal = (arma_H5Tequal(datatype, search_type) > 0);\n    arma_H5Tclose(search_type);\n    \n    if(is_equal)\n      {\n      Col<slng_t> v(n_elem);\n      hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr()));\n      arrayops::convert(dest, v.memptr(), n_elem);\n\n      return status;\n      }\n    }\n  #endif\n  \n  \n  // float\n  search_type = get_hdf5_type<float>();\n  is_equal = (arma_H5Tequal(datatype, search_type) > 0);\n  arma_H5Tclose(search_type);\n  \n  if(is_equal)\n    {\n    Col<float> v(n_elem);\n    hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr()));\n    arrayops::convert(dest, v.memptr(), n_elem);\n\n    return status;\n    }\n  \n  \n  // double\n  search_type = get_hdf5_type<double>();\n  is_equal = (arma_H5Tequal(datatype, search_type) > 0);\n  arma_H5Tclose(search_type);\n  \n  if(is_equal)\n    {\n    Col<double> v(n_elem);\n    hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr()));\n    arrayops::convert(dest, v.memptr(), n_elem);\n\n    return status;\n    }\n  \n  \n  // complex float\n  search_type = get_hdf5_type< std::complex<float> >();\n  is_equal = (arma_H5Tequal(datatype, search_type) > 0);\n  arma_H5Tclose(search_type);\n  \n  if(is_equal)\n    {\n    if(is_complex<eT>::value == false)\n      {\n      return -1; // can't read complex data into non-complex matrix/cube\n      }\n    \n    Col< std::complex<float> > v(n_elem);\n    hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr()));\n    arrayops::convert_cx(dest, v.memptr(), n_elem);\n    \n    return status;\n    }\n  \n  \n  // complex double\n  search_type = get_hdf5_type< std::complex<double> >();\n  is_equal = (arma_H5Tequal(datatype, search_type) > 0);\n  arma_H5Tclose(search_type);\n  \n  if(is_equal)\n    {\n    if(is_complex<eT>::value == false)\n      {\n      return -1; // can't read complex data into non-complex matrix/cube\n      }\n    \n    Col< std::complex<double> > v(n_elem);\n    hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr()));\n    arrayops::convert_cx(dest, v.memptr(), n_elem);\n    \n    return status;\n    }\n  \n  \n  return -1; // Failure.\n  }\n\n\n\n}       // namespace hdf5_misc\n#endif  // #if defined(ARMA_USE_HDF5)\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/include_atlas.hpp",
    "content": "// Copyright (C) 2008-2011 Conrad Sanderson\n// Copyright (C) 2008-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n#if defined(ARMA_USE_ATLAS)\n  #if !defined(ARMA_ATLAS_INCLUDE_DIR)\n    extern \"C\"\n      {\n      #include <cblas.h>\n      #include <clapack.h>\n      }\n  #else\n    #define ARMA_STR1(x) x\n    #define ARMA_STR2(x) ARMA_STR1(x)\n    \n    #define ARMA_CBLAS   ARMA_STR2(ARMA_ATLAS_INCLUDE_DIR)ARMA_STR2(cblas.h)\n    #define ARMA_CLAPACK ARMA_STR2(ARMA_ATLAS_INCLUDE_DIR)ARMA_STR2(clapack.h)\n    \n    extern \"C\"\n      {\n      #include ARMA_INCFILE_WRAP(ARMA_CBLAS)\n      #include ARMA_INCFILE_WRAP(ARMA_CLAPACK)\n      }\n    \n    #undef ARMA_STR1\n    #undef ARMA_STR2\n    #undef ARMA_CBLAS\n    #undef ARMA_CLAPACK\n  #endif\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/include_hdf5.hpp",
    "content": "// Copyright (C) 2014 Conrad Sanderson\n// Copyright (C) 2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n#if defined(ARMA_USE_HDF5)\n  #if !defined(ARMA_HDF5_INCLUDE_DIR)\n    #include <hdf5.h>\n  #else\n    #define ARMA_STR1(x) x\n    #define ARMA_STR2(x) ARMA_STR1(x)\n    \n    #define ARMA_HDF5_HEADER ARMA_STR2(ARMA_HDF5_INCLUDE_DIR)ARMA_STR2(hdf5.h)\n    \n    #include ARMA_INCFILE_WRAP(ARMA_HDF5_HEADER)\n    \n    #undef ARMA_STR1\n    #undef ARMA_STR2\n    #undef ARMA_HDF5_HEADER\n  #endif\n\n  #if defined(H5_USE_16_API_DEFAULT) || defined(H5_USE_16_API)\n    #pragma message (\"WARNING: disabling use of HDF5 due to its incompatible configuration\")\n    #undef ARMA_USE_HDF5\n  #endif\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/include_superlu.hpp",
    "content": "// This Source Code Form is a compilation of:\n// (1) source code written by Ryan Curtin and Conrad Sanderson, and\n// (2) extracts from SuperLU 4.3 source code.\n\n// This compilation is Copyright (C) 2015 Ryan Curtin and Conrad Sanderson\n// and is subject to the terms of the Mozilla Public License, v. 2.0.\n// \n// The source code that is distinct and separate from SuperLU 4.3 source code\n// is Copyright (C) 2015 Ryan Curtin and Conrad Sanderson and is subject to the\n// terms of the Mozilla Public License, v. 2.0.\n// \n// If a copy of the MPL was not distributed with this file,\n// You can obtain one at http://mozilla.org/MPL/2.0/.\n// \n// The original SuperLU 4.3 source code is licensed under a 3-clause BSD license,\n// as follows:\n// \n// Copyright (c) 2003, The Regents of the University of California, through\n// Lawrence Berkeley National Laboratory (subject to receipt of any required \n// approvals from U.S. Dept. of Energy) \n// \n// All rights reserved. \n// \n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met: \n// \n// (1) Redistributions of source code must retain the above copyright notice,\n// this list of conditions and the following disclaimer. \n// (2) Redistributions in binary form must reproduce the above copyright notice,\n// this list of conditions and the following disclaimer in the documentation\n// and/or other materials provided with the distribution. \n// (3) Neither the name of Lawrence Berkeley National Laboratory, U.S. Dept. of\n// Energy nor the names of its contributors may be used to endorse or promote\n// products derived from this software without specific prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\n// IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \n\n\n#if defined(ARMA_USE_SUPERLU)\n\n\n#if defined(ARMA_USE_SUPERLU_HEADERS) || defined(ARMA_SUPERLU_INCLUDE_DIR)\n\n// Since we need to suport float, double, cx_float and cx_double,\n// as well as preserve the sanity of the user,\n// we cannot simply include all the SuperLU headers due to their messy state\n// (duplicate definitions, pollution of global namespace, bizarro defines).\n// As such we are forced to include only a subset of the headers\n// and manually specify a few SuperLU structures and function prototypes.\n//\n// CAVEAT:\n// This code requires SuperLU version 4.3,\n// and assumes that newer 4.x versions will have no API changes.\n\nnamespace arma\n{\n\nnamespace superlu\n  {\n  // slu_*defs.h has int typedef'fed to int_t.  I'll just write it as int for\n  // simplicity, where I can, but supermatrix.h needs int_t.\n  typedef int int_t;\n  \n  // Include supermatrix.h.  This gives us SuperMatrix.\n  // Put it in the slu namespace.\n  // For versions of SuperLU I am familiar with, supermatrix.h does not include any other files.\n  // Therefore, putting it in the superlu namespace is reasonably safe.\n  // This same reasoning is true for superlu_enum_consts.h.\n  \n  #if defined(ARMA_SUPERLU_INCLUDE_DIR)\n    #define ARMA_SLU_STR(x) x\n    #define ARMA_SLU_STR2(x) ARMA_SLU_STR(x)\n    \n    #define ARMA_SLU_SUPERMATRIX_H         ARMA_SLU_STR2(ARMA_SUPERLU_INCLUDE_DIR)ARMA_SLU_STR2(supermatrix.h)\n    #define ARMA_SLU_SUPERLU_ENUM_CONSTS_H ARMA_SLU_STR2(ARMA_SUPERLU_INCLUDE_DIR)ARMA_SLU_STR2(superlu_enum_consts.h)\n  #else\n    #define ARMA_SLU_SUPERMATRIX_H         supermatrix.h\n    #define ARMA_SLU_SUPERLU_ENUM_CONSTS_H superlu_enum_consts.h\n  #endif\n  \n  #include ARMA_INCFILE_WRAP(ARMA_SLU_SUPERMATRIX_H)\n  #include ARMA_INCFILE_WRAP(ARMA_SLU_SUPERLU_ENUM_CONSTS_H)\n  \n  #undef ARMA_SLU_SUPERMATRIX_H\n  #undef ARMA_SLU_SUPERLU_ENUM_CONSTS_H\n  \n  \n  typedef struct\n    {\n    int*    panel_histo;\n    double* utime;\n    float*  ops;\n    int     TinyPivots;\n    int     RefineSteps;\n    int     expansions;\n    } SuperLUStat_t;\n  \n  \n  typedef struct\n    {\n    fact_t        Fact;\n    yes_no_t      Equil;\n    colperm_t     ColPerm;\n    trans_t       Trans;\n    IterRefine_t  IterRefine;\n    double        DiagPivotThresh;\n    yes_no_t      SymmetricMode;\n    yes_no_t      PivotGrowth;\n    yes_no_t      ConditionNumber;\n    rowperm_t     RowPerm;\n    int           ILU_DropRule;\n    double        ILU_DropTol;\n    double        ILU_FillFactor;\n    norm_t        ILU_Norm;\n    double        ILU_FillTol;\n    milu_t        ILU_MILU;\n    double        ILU_MILU_Dim;\n    yes_no_t      ParSymbFact;\n    yes_no_t      ReplaceTinyPivot;\n    yes_no_t      SolveInitialized;\n    yes_no_t      RefineInitialized;\n    yes_no_t      PrintStat;\n    int           nnzL, nnzU;\n    int           num_lookaheads;\n    yes_no_t      lookahead_etree;\n    yes_no_t      SymPattern;\n    } superlu_options_t;\n  }\n}\n\n\n#else\n\n// Not using any SuperLU headers, so define all required enums and structs.\n// \n// CAVEAT:\n// This code requires SuperLU version 4.3,\n// and assumes that newer 4.x versions will have no API changes.\n\nnamespace arma\n{\n\nnamespace superlu\n  {\n  typedef int int_t;\n  \n  typedef enum\n    {\n    SLU_NC,\n    SLU_NCP,\n    SLU_NR,\n    SLU_SC,\n    SLU_SCP,\n    SLU_SR,\n    SLU_DN,\n    SLU_NR_loc\n    } Stype_t;\n  \n  \n  typedef enum\n    {\n    SLU_S,\n    SLU_D,\n    SLU_C,\n    SLU_Z\n    } Dtype_t;\n  \n  \n  typedef enum\n    {\n    SLU_GE,\n    SLU_TRLU,\n    SLU_TRUU,\n    SLU_TRL,\n    SLU_TRU,\n    SLU_SYL,\n    SLU_SYU,\n    SLU_HEL,\n    SLU_HEU\n    } Mtype_t;\n  \n  \n  typedef struct\n    {\n    Stype_t Stype;\n    Dtype_t Dtype;\n    Mtype_t Mtype;\n    int_t   nrow;\n    int_t   ncol;\n    void*   Store;\n    } SuperMatrix;\n  \n  \n  typedef struct\n    {\n    int*    panel_histo;\n    double* utime;\n    float*  ops;\n    int     TinyPivots;\n    int     RefineSteps;\n    int     expansions;\n    } SuperLUStat_t;\n  \n  \n  typedef enum {NO, YES}                                          yes_no_t;\n  typedef enum {DOFACT, SamePattern, SamePattern_SameRowPerm, FACTORED} fact_t;\n  typedef enum {NOROWPERM, LargeDiag, MY_PERMR}                   rowperm_t;\n  typedef enum {NATURAL, MMD_ATA, MMD_AT_PLUS_A, COLAMD,\n                METIS_AT_PLUS_A, PARMETIS, ZOLTAN, MY_PERMC}      colperm_t;\n  typedef enum {NOTRANS, TRANS, CONJ}                             trans_t;\n  typedef enum {NOREFINE, SLU_SINGLE=1, SLU_DOUBLE, SLU_EXTRA}    IterRefine_t;\n  typedef enum {ONE_NORM, TWO_NORM, INF_NORM}                     norm_t;\n  typedef enum {SILU, SMILU_1, SMILU_2, SMILU_3}                  milu_t;\n\n\n  typedef struct\n    {\n    fact_t        Fact;\n    yes_no_t      Equil;\n    colperm_t     ColPerm;\n    trans_t       Trans;\n    IterRefine_t  IterRefine;\n    double        DiagPivotThresh;\n    yes_no_t      SymmetricMode;\n    yes_no_t      PivotGrowth;\n    yes_no_t      ConditionNumber;\n    rowperm_t     RowPerm;\n    int           ILU_DropRule;\n    double        ILU_DropTol;\n    double        ILU_FillFactor;\n    norm_t        ILU_Norm;\n    double        ILU_FillTol;\n    milu_t        ILU_MILU;\n    double        ILU_MILU_Dim;\n    yes_no_t      ParSymbFact;\n    yes_no_t      ReplaceTinyPivot;\n    yes_no_t      SolveInitialized;\n    yes_no_t      RefineInitialized;\n    yes_no_t      PrintStat;\n    int           nnzL, nnzU;\n    int           num_lookaheads;\n    yes_no_t      lookahead_etree;\n    yes_no_t      SymPattern;\n    } superlu_options_t;\n  \n  \n  typedef struct\n    {\n    int_t  nnz;\n    void*  nzval;\n    int_t* rowind;\n    int_t* colptr;\n    } NCformat;\n  \n  \n  typedef struct\n    {\n    int_t lda;\n    void* nzval;\n    } DNformat;\n  \n  }\n}\n\n#endif\n\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/injector_bones.hpp",
    "content": "// Copyright (C) 2010 Conrad Sanderson\n// Copyright (C) 2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup injector\n//! @{\n\n\n\ntemplate<typename eT>\nclass mat_injector_row\n  {\n  public:\n  \n  inline      mat_injector_row();\n  \n  inline void insert(const eT val) const;\n  \n  mutable uword        n_cols;\n  mutable podarray<eT> A;\n  mutable podarray<eT> B;\n  };\n\n\n\ntemplate<typename T1>\nclass mat_injector\n  {\n  public:\n  \n  typedef typename T1::elem_type elem_type;\n  \n  inline void  insert(const elem_type val) const;\n  inline void  end_of_row()                const;\n  inline      ~mat_injector();\n  \n  \n  private:\n  \n  inline mat_injector(T1& in_X, const elem_type val);\n  inline mat_injector(T1& in_X, const injector_end_of_row<>& x);\n  \n  T1&           X;\n  mutable uword n_rows;\n  \n  mutable podarray< mat_injector_row<elem_type>* >* AA;\n  mutable podarray< mat_injector_row<elem_type>* >* BB;\n  \n  friend class Mat<elem_type>;\n  friend class Row<elem_type>;\n  friend class Col<elem_type>;\n  };\n\n\n\n//\n\n\n\ntemplate<typename oT>\nclass field_injector_row\n  {\n  public:\n  \n  inline      field_injector_row();\n  inline     ~field_injector_row();\n  \n  inline void insert(const oT& val) const;\n  \n  mutable uword      n_cols;\n  mutable field<oT>* AA;\n  mutable field<oT>* BB;\n  };\n\n  \n  \ntemplate<typename T1>\nclass field_injector\n  {\n  public:\n  \n  typedef typename T1::object_type object_type;\n  \n  inline void  insert(const object_type& val) const;\n  inline void  end_of_row()                   const;\n  inline      ~field_injector();\n  \n  \n  private:\n  \n  inline field_injector(T1& in_X, const object_type& val);\n  inline field_injector(T1& in_X, const injector_end_of_row<>& x);\n  \n  T1&           X;\n  mutable uword n_rows;\n  \n  mutable podarray< field_injector_row<object_type>* >* AA;\n  mutable podarray< field_injector_row<object_type>* >* BB;\n  \n  friend class field<object_type>;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/injector_meat.hpp",
    "content": "// Copyright (C) 2010 Conrad Sanderson\n// Copyright (C) 2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup injector\n//! @{\n\n\n\ntemplate<typename eT>\ninline\nmat_injector_row<eT>::mat_injector_row()\n  : n_cols(0)\n  {\n  arma_extra_debug_sigprint();\n  \n  A.set_size( podarray_prealloc_n_elem::val );\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nmat_injector_row<eT>::insert(const eT val) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_cols < A.n_elem)\n    {\n    A[n_cols] = val;\n    ++n_cols;\n    }\n  else\n    {\n    B.set_size(2 * A.n_elem);\n    \n    arrayops::copy(B.memptr(), A.memptr(), n_cols);\n    \n    B[n_cols] = val;\n    ++n_cols;\n    \n    std::swap( access::rw(A.mem),    access::rw(B.mem)    );\n    std::swap( access::rw(A.n_elem), access::rw(B.n_elem) );\n    }\n  }\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename T1>\ninline\nmat_injector<T1>::mat_injector(T1& in_X, const typename mat_injector<T1>::elem_type val)\n  : X(in_X)\n  , n_rows(1)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename mat_injector<T1>::elem_type eT;\n  \n  AA = new podarray< mat_injector_row<eT>* >;\n  BB = new podarray< mat_injector_row<eT>* >;\n  \n  podarray< mat_injector_row<eT>* >& A = *AA;\n  \n  A.set_size(n_rows);\n  \n  for(uword row=0; row<n_rows; ++row)\n    {\n    A[row] = new mat_injector_row<eT>;\n    }\n  \n  (*(A[0])).insert(val);\n  }\n\n\n\ntemplate<typename T1>\ninline\nmat_injector<T1>::mat_injector(T1& in_X, const injector_end_of_row<>& x)\n  : X(in_X)\n  , n_rows(1)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(x);\n  \n  typedef typename mat_injector<T1>::elem_type eT;\n  \n  AA = new podarray< mat_injector_row<eT>* >;\n  BB = new podarray< mat_injector_row<eT>* >;\n  \n  podarray< mat_injector_row<eT>* >& A = *AA;\n  \n  A.set_size(n_rows);\n  \n  for(uword row=0; row<n_rows; ++row)\n    {\n    A[row] = new mat_injector_row<eT>;\n    }\n  \n  (*this).end_of_row();\n  }\n\n\n\ntemplate<typename T1>\ninline\nmat_injector<T1>::~mat_injector()\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename mat_injector<T1>::elem_type eT;\n  \n  podarray< mat_injector_row<eT>* >& A = *AA;\n  \n  if(n_rows > 0)\n    {\n    uword max_n_cols = (*(A[0])).n_cols;\n    \n    for(uword row=1; row<n_rows; ++row)\n      {\n      const uword n_cols = (*(A[row])).n_cols;\n      \n      if(max_n_cols < n_cols)\n        {\n        max_n_cols = n_cols;\n        }\n      }\n    \n    const uword max_n_rows = ((*(A[n_rows-1])).n_cols == 0) ? n_rows-1 : n_rows;\n    \n    if(is_Mat_only<T1>::value == true)\n      {\n      X.set_size(max_n_rows, max_n_cols);\n      \n      for(uword row=0; row<max_n_rows; ++row)\n        {\n        const uword n_cols = (*(A[row])).n_cols;\n        \n        for(uword col=0; col<n_cols; ++col)\n          {\n          X.at(row,col) = (*(A[row])).A[col];\n          }\n        \n        for(uword col=n_cols; col<max_n_cols; ++col)\n          {\n          X.at(row,col) = eT(0);\n          }\n        }\n      }\n    else\n    if(is_Row<T1>::value == true)\n      {\n      arma_debug_check( (max_n_rows > 1), \"matrix initialisation: incompatible dimensions\" );\n      \n      const uword n_cols = (*(A[0])).n_cols;\n      \n      X.set_size(1, n_cols);\n      \n      arrayops::copy( X.memptr(), (*(A[0])).A.memptr(), n_cols );\n      }\n    else\n    if(is_Col<T1>::value == true)\n      {\n      const bool is_vec = ( (max_n_rows == 1) || (max_n_cols == 1) );\n      \n      arma_debug_check( (is_vec == false), \"matrix initialisation: incompatible dimensions\" );\n      \n      const uword n_elem = (std::max)(max_n_rows, max_n_cols);\n      \n      X.set_size(n_elem, 1);\n      \n      uword i = 0;\n      for(uword row=0; row<max_n_rows; ++row)\n        {\n        const uword n_cols = (*(A[0])).n_cols;\n        \n        for(uword col=0; col<n_cols; ++col)\n          {\n          X[i] = (*(A[row])).A[col];\n          ++i;\n          }\n        \n        for(uword col=n_cols; col<max_n_cols; ++col)\n          {\n          X[i] = eT(0);\n          ++i;\n          }\n        }\n      }\n    }\n  \n  for(uword row=0; row<n_rows; ++row)\n    {\n    delete A[row];\n    }\n    \n  delete AA;\n  delete BB;\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nmat_injector<T1>::insert(const typename mat_injector<T1>::elem_type val) const\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename mat_injector<T1>::elem_type eT;\n  \n  podarray< mat_injector_row<eT>* >& A = *AA;\n  \n  (*(A[n_rows-1])).insert(val);\n  }\n\n\n\n\ntemplate<typename T1>\ninline\nvoid\nmat_injector<T1>::end_of_row() const\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename mat_injector<T1>::elem_type eT;\n  \n  podarray< mat_injector_row<eT>* >& A = *AA;\n  podarray< mat_injector_row<eT>* >& B = *BB;\n  \n  B.set_size( n_rows+1 );\n  \n  arrayops::copy(B.memptr(), A.memptr(), n_rows);\n  \n  for(uword row=n_rows; row<(n_rows+1); ++row)\n    {\n    B[row] = new mat_injector_row<eT>;\n    }\n  \n  std::swap(AA, BB);\n  \n  n_rows += 1;\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst mat_injector<T1>&\noperator<<(const mat_injector<T1>& ref, const typename mat_injector<T1>::elem_type val)\n  {\n  arma_extra_debug_sigprint();\n  \n  ref.insert(val);\n  \n  return ref;\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst mat_injector<T1>&\noperator<<(const mat_injector<T1>& ref, const injector_end_of_row<>& x)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(x);\n  \n  ref.end_of_row();\n  \n  return ref;\n  }\n\n\n\n//// using a mixture of operator << and , doesn't work yet\n//// e.g. A << 1, 2, 3 << endr\n//// in the above \"3 << endr\" requires special handling.\n//// similarly, special handling is necessary for \"endr << 3\"\n//// \n// template<typename T1>\n// arma_inline\n// const mat_injector<T1>&\n// operator,(const mat_injector<T1>& ref, const typename mat_injector<T1>::elem_type val)\n//   {\n//   arma_extra_debug_sigprint();\n//   \n//   ref.insert(val);\n//   \n//   return ref;\n//   }\n\n\n\n// template<typename T1>\n// arma_inline\n// const mat_injector<T1>&\n// operator,(const mat_injector<T1>& ref, const injector_end_of_row<>& x)\n//   {\n//   arma_extra_debug_sigprint();\n//   arma_ignore(x);\n//   \n//   ref.end_of_row();\n//   \n//   return ref;\n//   }\n\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename oT>\ninline\nfield_injector_row<oT>::field_injector_row()\n  : n_cols(0)\n  {\n  arma_extra_debug_sigprint();\n  \n  AA = new field<oT>;\n  BB = new field<oT>;\n  \n  field<oT>& A = *AA;\n  \n  A.set_size( field_prealloc_n_elem::val );\n  }\n\n\n\ntemplate<typename oT>\ninline\nfield_injector_row<oT>::~field_injector_row()\n  {\n  arma_extra_debug_sigprint();\n  \n  delete AA;\n  delete BB;\n  }\n\n\n\ntemplate<typename oT>\ninline\nvoid\nfield_injector_row<oT>::insert(const oT& val) const\n  {\n  arma_extra_debug_sigprint();\n  \n  field<oT>& A = *AA;\n  field<oT>& B = *BB;\n  \n  if(n_cols < A.n_elem)\n    {\n    A[n_cols] = val;\n    ++n_cols;\n    }\n  else\n    {\n    B.set_size(2 * A.n_elem);\n    \n    for(uword i=0; i<n_cols; ++i)\n      {\n      B[i] = A[i];\n      }\n    \n    B[n_cols] = val;\n    ++n_cols;\n    \n    std::swap(AA, BB);\n    }\n  }\n\n\n\n//\n//\n//\n\n\ntemplate<typename T1>\ninline\nfield_injector<T1>::field_injector(T1& in_X, const typename field_injector<T1>::object_type& val)\n  : X(in_X)\n  , n_rows(1)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename field_injector<T1>::object_type oT;\n  \n  AA = new podarray< field_injector_row<oT>* >;\n  BB = new podarray< field_injector_row<oT>* >;\n  \n  podarray< field_injector_row<oT>* >& A = *AA;\n  \n  A.set_size(n_rows);\n  \n  for(uword row=0; row<n_rows; ++row)\n    {\n    A[row] = new field_injector_row<oT>;\n    }\n  \n  (*(A[0])).insert(val);\n  }\n\n\n\ntemplate<typename T1>\ninline\nfield_injector<T1>::field_injector(T1& in_X, const injector_end_of_row<>& x)\n  : X(in_X)\n  , n_rows(1)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(x);\n  \n  typedef typename field_injector<T1>::object_type oT;\n  \n  AA = new podarray< field_injector_row<oT>* >;\n  BB = new podarray< field_injector_row<oT>* >;\n  \n  podarray< field_injector_row<oT>* >& A = *AA;\n  \n  A.set_size(n_rows);\n  \n  for(uword row=0; row<n_rows; ++row)\n    {\n    A[row] = new field_injector_row<oT>;\n    }\n  \n  (*this).end_of_row();\n  }\n\n\n\ntemplate<typename T1>\ninline\nfield_injector<T1>::~field_injector()\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename field_injector<T1>::object_type oT;\n  \n  podarray< field_injector_row<oT>* >& A = *AA;\n  \n  if(n_rows > 0)\n    {\n    uword max_n_cols = (*(A[0])).n_cols;\n    \n    for(uword row=1; row<n_rows; ++row)\n      {\n      const uword n_cols = (*(A[row])).n_cols;\n      \n      if(max_n_cols < n_cols)\n        {\n        max_n_cols = n_cols;\n        }\n      }\n      \n    const uword max_n_rows = ((*(A[n_rows-1])).n_cols == 0) ? n_rows-1 : n_rows;\n    \n    X.set_size(max_n_rows, max_n_cols);\n    \n    for(uword row=0; row<max_n_rows; ++row)\n      {\n      const uword n_cols = (*(A[row])).n_cols;\n      \n      for(uword col=0; col<n_cols; ++col)\n        {\n        const field<oT>& tmp = *((*(A[row])).AA);\n        X.at(row,col) = tmp[col];\n        }\n      \n      for(uword col=n_cols; col<max_n_cols; ++col)\n        {\n        X.at(row,col) = oT();\n        }\n      }\n    }\n  \n  \n  for(uword row=0; row<n_rows; ++row)\n    {\n    delete A[row];\n    }\n  \n  delete AA;\n  delete BB;\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nfield_injector<T1>::insert(const typename field_injector<T1>::object_type& val) const\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename field_injector<T1>::object_type oT;\n  \n  podarray< field_injector_row<oT>* >& A = *AA;\n  \n  (*(A[n_rows-1])).insert(val);\n  }\n\n\n\n\ntemplate<typename T1>\ninline\nvoid\nfield_injector<T1>::end_of_row() const\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename field_injector<T1>::object_type oT;\n  \n  podarray< field_injector_row<oT>* >& A = *AA;\n  podarray< field_injector_row<oT>* >& B = *BB;\n  \n  B.set_size( n_rows+1 );\n  \n  for(uword row=0; row<n_rows; ++row)\n    {\n    B[row] = A[row];\n    }\n  \n  for(uword row=n_rows; row<(n_rows+1); ++row)\n    {\n    B[row] = new field_injector_row<oT>;\n    }\n  \n  std::swap(AA, BB);\n  \n  n_rows += 1;\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst field_injector<T1>&\noperator<<(const field_injector<T1>& ref, const typename field_injector<T1>::object_type& val)\n  {\n  arma_extra_debug_sigprint();\n  \n  ref.insert(val);\n  \n  return ref;\n  }\n\n\n\ntemplate<typename T1>\narma_inline\nconst field_injector<T1>&\noperator<<(const field_injector<T1>& ref, const injector_end_of_row<>& x)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(x);\n  \n  ref.end_of_row();\n  \n  return ref;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/lapack_bones.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2009 Edmund Highcock\n// Copyright (C) 2011 James Sanders\n// Copyright (C) 2012 Eric Jon Sundstrom\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n#ifdef ARMA_USE_LAPACK\n\n\n#if !defined(ARMA_BLAS_CAPITALS)\n  \n  #define arma_sgetrf sgetrf\n  #define arma_dgetrf dgetrf\n  #define arma_cgetrf cgetrf\n  #define arma_zgetrf zgetrf\n  \n  #define arma_sgetri sgetri\n  #define arma_dgetri dgetri\n  #define arma_cgetri cgetri\n  #define arma_zgetri zgetri\n  \n  #define arma_strtri strtri\n  #define arma_dtrtri dtrtri\n  #define arma_ctrtri ctrtri\n  #define arma_ztrtri ztrtri\n  \n  #define arma_ssyev  ssyev\n  #define arma_dsyev  dsyev\n\n  #define arma_cheev  cheev\n  #define arma_zheev  zheev\n  \n  #define arma_ssyevd ssyevd\n  #define arma_dsyevd dsyevd\n  \n  #define arma_cheevd cheevd\n  #define arma_zheevd zheevd\n  \n  #define arma_sgeev  sgeev\n  #define arma_dgeev  dgeev\n  \n  #define arma_cgeev  cgeev\n  #define arma_zgeev  zgeev\n  \n  #define arma_sggev  sggev\n  #define arma_dggev  dggev\n  \n  #define arma_cggev  cggev\n  #define arma_zggev  zggev\n  \n  #define arma_spotrf spotrf\n  #define arma_dpotrf dpotrf\n  #define arma_cpotrf cpotrf\n  #define arma_zpotrf zpotrf\n  \n  #define arma_spotri spotri\n  #define arma_dpotri dpotri\n  #define arma_cpotri cpotri\n  #define arma_zpotri zpotri\n  \n  #define arma_sgeqrf sgeqrf\n  #define arma_dgeqrf dgeqrf\n  #define arma_cgeqrf cgeqrf\n  #define arma_zgeqrf zgeqrf\n  \n  #define arma_sorgqr sorgqr\n  #define arma_dorgqr dorgqr\n  \n  #define arma_cungqr cungqr\n  #define arma_zungqr zungqr\n  \n  #define arma_sgesvd sgesvd\n  #define arma_dgesvd dgesvd\n  \n  #define arma_cgesvd cgesvd\n  #define arma_zgesvd zgesvd\n  \n  #define arma_sgesdd sgesdd\n  #define arma_dgesdd dgesdd\n  #define arma_cgesdd cgesdd\n  #define arma_zgesdd zgesdd\n  \n  #define arma_sgesv  sgesv\n  #define arma_dgesv  dgesv\n  #define arma_cgesv  cgesv\n  #define arma_zgesv  zgesv\n  \n  #define arma_sgels  sgels\n  #define arma_dgels  dgels\n  #define arma_cgels  cgels\n  #define arma_zgels  zgels\n  \n  #define arma_strtrs strtrs\n  #define arma_dtrtrs dtrtrs\n  #define arma_ctrtrs ctrtrs\n  #define arma_ztrtrs ztrtrs\n\n  #define arma_sgees  sgees\n  #define arma_dgees  dgees\n  #define arma_cgees  cgees\n  #define arma_zgees  zgees\n  \n  #define arma_strsyl strsyl\n  #define arma_dtrsyl dtrsyl\n  #define arma_ctrsyl ctrsyl\n  #define arma_ztrsyl ztrsyl\n  \n  #define arma_ssytrf ssytrf\n  #define arma_dsytrf dsytrf\n  #define arma_csytrf csytrf\n  #define arma_zsytrf zsytrf\n  \n  #define arma_ssytri ssytri\n  #define arma_dsytri dsytri\n  #define arma_csytri csytri\n  #define arma_zsytri zsytri\n  \n  #define arma_sgges  sgges\n  #define arma_dgges  dgges\n  #define arma_cgges  cgges\n  #define arma_zgges  zgges\n  \n#else\n  \n  #define arma_sgetrf SGETRF\n  #define arma_dgetrf DGETRF\n  #define arma_cgetrf CGETRF\n  #define arma_zgetrf ZGETRF\n  \n  #define arma_sgetri SGETRI\n  #define arma_dgetri DGETRI\n  #define arma_cgetri CGETRI\n  #define arma_zgetri ZGETRI\n  \n  #define arma_strtri STRTRI\n  #define arma_dtrtri DTRTRI\n  #define arma_ctrtri CTRTRI\n  #define arma_ztrtri ZTRTRI\n  \n  #define arma_ssyev  SSYEV\n  #define arma_dsyev  DSYEV\n  \n  #define arma_cheev  CHEEV\n  #define arma_zheev  ZHEEV\n  \n  #define arma_ssyevd SSYEVD\n  #define arma_dsyevd DSYEVD\n  \n  #define arma_cheevd CHEEVD\n  #define arma_zheevd ZHEEVD\n  \n  #define arma_sgeev  SGEEV\n  #define arma_dgeev  DGEEV\n  \n  #define arma_cgeev  CGEEV\n  #define arma_zgeev  ZGEEV\n  \n  #define arma_sggev  SGGEV\n  #define arma_dggev  DGGEV\n  \n  #define arma_cggev  CGGEV\n  #define arma_zggev  ZGGEV\n  \n  #define arma_spotrf SPOTRF\n  #define arma_dpotrf DPOTRF\n  #define arma_cpotrf CPOTRF\n  #define arma_zpotrf ZPOTRF\n  \n  #define arma_spotri SPOTRI\n  #define arma_dpotri DPOTRI\n  #define arma_cpotri CPOTRI\n  #define arma_zpotri ZPOTRI\n  \n  #define arma_sgeqrf SGEQRF\n  #define arma_dgeqrf DGEQRF\n  #define arma_cgeqrf CGEQRF\n  #define arma_zgeqrf ZGEQRF\n  \n  #define arma_sorgqr SORGQR\n  #define arma_dorgqr DORGQR\n  \n  #define arma_cungqr CUNGQR\n  #define arma_zungqr ZUNGQR\n  \n  #define arma_sgesvd SGESVD\n  #define arma_dgesvd DGESVD\n  \n  #define arma_cgesvd CGESVD\n  #define arma_zgesvd ZGESVD\n  \n  #define arma_sgesdd SGESDD\n  #define arma_dgesdd DGESDD\n  #define arma_cgesdd CGESDD\n  #define arma_zgesdd ZGESDD\n  \n  #define arma_sgesv  SGESV\n  #define arma_dgesv  DGESV\n  #define arma_cgesv  CGESV\n  #define arma_zgesv  ZGESV\n  \n  #define arma_sgels  SGELS\n  #define arma_dgels  DGELS\n  #define arma_cgels  CGELS\n  #define arma_zgels  ZGELS\n  \n  #define arma_strtrs STRTRS\n  #define arma_dtrtrs DTRTRS\n  #define arma_ctrtrs CTRTRS\n  #define arma_ztrtrs ZTRTRS\n\n  #define arma_sgees  SGEES\n  #define arma_dgees  DGEES\n  #define arma_cgees  CGEES\n  #define arma_zgees  ZGEES\n\n  #define arma_strsyl STRSYL\n  #define arma_dtrsyl DTRSYL\n  #define arma_ctrsyl CTRSYL\n  #define arma_ztrsyl ZTRSYL\n  \n  #define arma_ssytrf SSYTRF\n  #define arma_dsytrf DSYTRF\n  #define arma_csytrf CSYTRF\n  #define arma_zsytrf ZSYTRF\n  \n  #define arma_ssytri SSYTRI\n  #define arma_dsytri DSYTRI\n  #define arma_csytri CSYTRI\n  #define arma_zsytri ZSYTRI\n  \n  #define arma_sgges  SGGES\n  #define arma_dgges  DGGES\n  #define arma_cgges  CGGES\n  #define arma_zgges  ZGGES\n  \n#endif\n\n\n\nextern \"C\"\n  {\n  // LU factorisation\n  void arma_fortran(arma_sgetrf)(blas_int* m, blas_int* n,  float* a, blas_int* lda, blas_int* ipiv, blas_int* info);\n  void arma_fortran(arma_dgetrf)(blas_int* m, blas_int* n, double* a, blas_int* lda, blas_int* ipiv, blas_int* info);\n  void arma_fortran(arma_cgetrf)(blas_int* m, blas_int* n,   void* a, blas_int* lda, blas_int* ipiv, blas_int* info);\n  void arma_fortran(arma_zgetrf)(blas_int* m, blas_int* n,   void* a, blas_int* lda, blas_int* ipiv, blas_int* info);\n  \n  // matrix inversion (using LU factorisation result)\n  void arma_fortran(arma_sgetri)(blas_int* n,  float* a, blas_int* lda, blas_int* ipiv,  float* work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_dgetri)(blas_int* n, double* a, blas_int* lda, blas_int* ipiv, double* work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_cgetri)(blas_int* n,  void*  a, blas_int* lda, blas_int* ipiv,   void* work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_zgetri)(blas_int* n,  void*  a, blas_int* lda, blas_int* ipiv,   void* work, blas_int* lwork, blas_int* info);\n  \n  // matrix inversion (triangular matrices)\n  void arma_fortran(arma_strtri)(char* uplo, char* diag, blas_int* n,  float* a, blas_int* lda, blas_int* info);\n  void arma_fortran(arma_dtrtri)(char* uplo, char* diag, blas_int* n, double* a, blas_int* lda, blas_int* info);\n  void arma_fortran(arma_ctrtri)(char* uplo, char* diag, blas_int* n,   void* a, blas_int* lda, blas_int* info);\n  void arma_fortran(arma_ztrtri)(char* uplo, char* diag, blas_int* n,   void* a, blas_int* lda, blas_int* info);\n  \n  // eigenvector decomposition of symmetric real matrices\n  void arma_fortran(arma_ssyev)(char* jobz, char* uplo, blas_int* n,  float* a, blas_int* lda,  float* w,  float* work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_dsyev)(char* jobz, char* uplo, blas_int* n, double* a, blas_int* lda, double* w, double* work, blas_int* lwork, blas_int* info);\n    \n  // eigenvector decomposition of hermitian matrices (complex)\n  void arma_fortran(arma_cheev)(char* jobz, char* uplo, blas_int* n,   void* a, blas_int* lda,  float* w,   void* work, blas_int* lwork,  float* rwork, blas_int* info);\n  void arma_fortran(arma_zheev)(char* jobz, char* uplo, blas_int* n,   void* a, blas_int* lda, double* w,   void* work, blas_int* lwork, double* rwork, blas_int* info);\n  \n  // eigenvector decomposition of symmetric real matrices by divide and conquer\n  void arma_fortran(arma_ssyevd)(char* jobz, char* uplo, blas_int* n,  float* a, blas_int* lda,  float* w,  float* work, blas_int* lwork, blas_int* iwork, blas_int* liwork, blas_int* info);\n  void arma_fortran(arma_dsyevd)(char* jobz, char* uplo, blas_int* n, double* a, blas_int* lda, double* w, double* work, blas_int* lwork, blas_int* iwork, blas_int* liwork, blas_int* info);\n  \n  // eigenvector decomposition of hermitian matrices (complex) by divide and conquer\n  void arma_fortran(arma_cheevd)(char* jobz, char* uplo, blas_int* n,   void* a, blas_int* lda,  float* w,   void* work, blas_int* lwork,  float* rwork, blas_int* lrwork, blas_int* iwork, blas_int* liwork, blas_int* info);\n  void arma_fortran(arma_zheevd)(char* jobz, char* uplo, blas_int* n,   void* a, blas_int* lda, double* w,   void* work, blas_int* lwork, double* rwork, blas_int* lrwork, blas_int* iwork, blas_int* liwork, blas_int* info);\n  \n  // eigenvector decomposition of general real matrices\n  void arma_fortran(arma_sgeev)(char* jobvl, char* jobvr, blas_int* n,  float* a, blas_int* lda,  float* wr,  float* wi,  float* vl, blas_int* ldvl,  float* vr, blas_int* ldvr,  float* work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_dgeev)(char* jobvl, char* jobvr, blas_int* n, double* a, blas_int* lda, double* wr, double* wi, double* vl, blas_int* ldvl, double* vr, blas_int* ldvr, double* work, blas_int* lwork, blas_int* info);\n  \n  // eigenvector decomposition of general complex matrices\n  void arma_fortran(arma_cgeev)(char* jobvl, char* jobvr, blas_int* n, void* a, blas_int* lda, void* w, void* vl, blas_int* ldvl, void* vr, blas_int* ldvr, void* work, blas_int* lwork,  float* rwork, blas_int* info);\n  void arma_fortran(arma_zgeev)(char* jobvl, char* jobvr, blas_int* n, void* a, blas_int* lda, void* w, void* vl, blas_int* ldvl, void* vr, blas_int* ldvr, void* work, blas_int* lwork, double* rwork, blas_int* info);\n  \n  // eigenvector decomposition of general real matrix pair\n  void arma_fortran(arma_sggev)(char* jobvl, char* jobvr, blas_int* n,  float* a, blas_int* lda,  float* b, blas_int* ldb,  float* alphar,  float* alphai,  float* beta,  float* vl, blas_int* ldvl,  float* vr, blas_int* ldvr,  float* work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_dggev)(char* jobvl, char* jobvr, blas_int* n, double* a, blas_int* lda, double* b, blas_int* ldb, double* alphar, double* alphai, double* beta, double* vl, blas_int* ldvl, double* vr, blas_int* ldvr, double* work, blas_int* lwork, blas_int* info);\n  \n  // eigenvector decomposition of general complex matrix pair\n  void arma_fortran(arma_cggev)(char* jobvl, char* jobvr, blas_int* n, void* a, blas_int* lda, void* b, blas_int* ldb, void* alpha, void* beta, void* vl, blas_int* ldvl, void* vr, blas_int* ldvr, void* work, blas_int* lwork,  float* rwork, blas_int* info);\n  void arma_fortran(arma_zggev)(char* jobvl, char* jobvr, blas_int* n, void* a, blas_int* lda, void* b, blas_int* ldb, void* alpha, void* beta, void* vl, blas_int* ldvl, void* vr, blas_int* ldvr, void* work, blas_int* lwork, double* rwork, blas_int* info);\n  \n  // Cholesky decomposition\n  void arma_fortran(arma_spotrf)(char* uplo, blas_int* n,  float* a, blas_int* lda, blas_int* info);\n  void arma_fortran(arma_dpotrf)(char* uplo, blas_int* n, double* a, blas_int* lda, blas_int* info);\n  void arma_fortran(arma_cpotrf)(char* uplo, blas_int* n,   void* a, blas_int* lda, blas_int* info);\n  void arma_fortran(arma_zpotrf)(char* uplo, blas_int* n,   void* a, blas_int* lda, blas_int* info);\n  \n  // matrix inversion (using Cholesky decomposition result)\n  void arma_fortran(arma_spotri)(char* uplo, blas_int* n,  float* a, blas_int* lda, blas_int* info);\n  void arma_fortran(arma_dpotri)(char* uplo, blas_int* n, double* a, blas_int* lda, blas_int* info);\n  void arma_fortran(arma_cpotri)(char* uplo, blas_int* n,   void* a, blas_int* lda, blas_int* info);\n  void arma_fortran(arma_zpotri)(char* uplo, blas_int* n,   void* a, blas_int* lda, blas_int* info);\n  \n  // QR decomposition\n  void arma_fortran(arma_sgeqrf)(blas_int* m, blas_int* n,  float* a, blas_int* lda,  float* tau,  float* work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_dgeqrf)(blas_int* m, blas_int* n, double* a, blas_int* lda, double* tau, double* work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_cgeqrf)(blas_int* m, blas_int* n,   void* a, blas_int* lda,   void* tau,   void* work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_zgeqrf)(blas_int* m, blas_int* n,   void* a, blas_int* lda,   void* tau,   void* work, blas_int* lwork, blas_int* info);\n  \n  // Q matrix calculation from QR decomposition (real matrices)\n  void arma_fortran(arma_sorgqr)(blas_int* m, blas_int* n, blas_int* k,  float* a, blas_int* lda,  float* tau,  float* work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_dorgqr)(blas_int* m, blas_int* n, blas_int* k, double* a, blas_int* lda, double* tau, double* work, blas_int* lwork, blas_int* info);\n  \n  // Q matrix calculation from QR decomposition (complex matrices)\n  void arma_fortran(arma_cungqr)(blas_int* m, blas_int* n, blas_int* k,   void* a, blas_int* lda,   void* tau,   void* work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_zungqr)(blas_int* m, blas_int* n, blas_int* k,   void* a, blas_int* lda,   void* tau,   void* work, blas_int* lwork, blas_int* info);\n  \n  // SVD (real matrices)\n  void arma_fortran(arma_sgesvd)(char* jobu, char* jobvt, blas_int* m, blas_int* n, float*  a, blas_int* lda, float*  s, float*  u, blas_int* ldu, float*  vt, blas_int* ldvt, float*  work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_dgesvd)(char* jobu, char* jobvt, blas_int* m, blas_int* n, double* a, blas_int* lda, double* s, double* u, blas_int* ldu, double* vt, blas_int* ldvt, double* work, blas_int* lwork, blas_int* info);\n  \n  // SVD (complex matrices)\n  void arma_fortran(arma_cgesvd)(char* jobu, char* jobvt, blas_int* m, blas_int* n, void*   a, blas_int* lda, float*  s, void*   u, blas_int* ldu, void*   vt, blas_int* ldvt, void*   work, blas_int* lwork, float*  rwork, blas_int* info);\n  void arma_fortran(arma_zgesvd)(char* jobu, char* jobvt, blas_int* m, blas_int* n, void*   a, blas_int* lda, double* s, void*   u, blas_int* ldu, void*   vt, blas_int* ldvt, void*   work, blas_int* lwork, double* rwork, blas_int* info);\n  \n  // SVD (real matrices) by divide and conquer\n  void arma_fortran(arma_sgesdd)(char* jobz, blas_int* m, blas_int* n, float*  a, blas_int* lda, float*  s, float*  u, blas_int* ldu, float*  vt, blas_int* ldvt, float*  work, blas_int* lwork, blas_int* iwork, blas_int* info);\n  void arma_fortran(arma_dgesdd)(char* jobz, blas_int* m, blas_int* n, double* a, blas_int* lda, double* s, double* u, blas_int* ldu, double* vt, blas_int* ldvt, double* work, blas_int* lwork, blas_int* iwork, blas_int* info);\n  \n  // SVD (complex matrices) by divide and conquer\n  void arma_fortran(arma_cgesdd)(char* jobz, blas_int* m, blas_int* n, void* a, blas_int* lda, float*  s, void* u, blas_int* ldu, void* vt, blas_int* ldvt, void* work, blas_int* lwork, float*  rwork, blas_int* iwork, blas_int* info);\n  void arma_fortran(arma_zgesdd)(char* jobz, blas_int* m, blas_int* n, void* a, blas_int* lda, double* s, void* u, blas_int* ldu, void* vt, blas_int* ldvt, void* work, blas_int* lwork, double* rwork, blas_int* iwork, blas_int* info);\n  \n  // solve system of linear equations, using LU decomposition\n  void arma_fortran(arma_sgesv)(blas_int* n, blas_int* nrhs, float*  a, blas_int* lda, blas_int* ipiv, float*  b, blas_int* ldb, blas_int* info);\n  void arma_fortran(arma_dgesv)(blas_int* n, blas_int* nrhs, double* a, blas_int* lda, blas_int* ipiv, double* b, blas_int* ldb, blas_int* info);\n  void arma_fortran(arma_cgesv)(blas_int* n, blas_int* nrhs, void*   a, blas_int* lda, blas_int* ipiv, void*   b, blas_int* ldb, blas_int* info);\n  void arma_fortran(arma_zgesv)(blas_int* n, blas_int* nrhs, void*   a, blas_int* lda, blas_int* ipiv, void*   b, blas_int* ldb, blas_int* info);\n  \n  // solve over/underdetermined system of linear equations\n  void arma_fortran(arma_sgels)(char* trans, blas_int* m, blas_int* n, blas_int* nrhs, float*  a, blas_int* lda, float*  b, blas_int* ldb, float*  work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_dgels)(char* trans, blas_int* m, blas_int* n, blas_int* nrhs, double* a, blas_int* lda, double* b, blas_int* ldb, double* work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_cgels)(char* trans, blas_int* m, blas_int* n, blas_int* nrhs, void*   a, blas_int* lda, void*   b, blas_int* ldb, void*   work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_zgels)(char* trans, blas_int* m, blas_int* n, blas_int* nrhs, void*   a, blas_int* lda, void*   b, blas_int* ldb, void*   work, blas_int* lwork, blas_int* info);\n  \n  // solve a triangular system of linear equations\n  void arma_fortran(arma_strtrs)(char* uplo, char* trans, char* diag, blas_int* n, blas_int* nrhs, const float*  a, blas_int* lda, float*  b, blas_int* ldb, blas_int* info);\n  void arma_fortran(arma_dtrtrs)(char* uplo, char* trans, char* diag, blas_int* n, blas_int* nrhs, const double* a, blas_int* lda, double* b, blas_int* ldb, blas_int* info);\n  void arma_fortran(arma_ctrtrs)(char* uplo, char* trans, char* diag, blas_int* n, blas_int* nrhs, const void*   a, blas_int* lda, void*   b, blas_int* ldb, blas_int* info);\n  void arma_fortran(arma_ztrtrs)(char* uplo, char* trans, char* diag, blas_int* n, blas_int* nrhs, const void*   a, blas_int* lda, void*   b, blas_int* ldb, blas_int* info);\n  \n  // Schur decomposition (real matrices)\n  void arma_fortran(arma_sgees)(char* jobvs, char* sort, blas_int* select, blas_int* n, float*  a, blas_int* lda, blas_int* sdim, float*  wr, float*  wi, float*  vs, blas_int* ldvs, float*  work, blas_int* lwork, blas_int* bwork, blas_int* info);\n  void arma_fortran(arma_dgees)(char* jobvs, char* sort, blas_int* select, blas_int* n, double* a, blas_int* lda, blas_int* sdim, double* wr, double* wi, double* vs, blas_int* ldvs, double* work, blas_int* lwork, blas_int* bwork, blas_int* info);\n  \n  // Schur decomposition (complex matrices)\n  void arma_fortran(arma_cgees)(char* jobvs, char* sort, blas_int* select, blas_int* n, void* a, blas_int* lda, blas_int* sdim, void* w, void* vs, blas_int* ldvs, void* work, blas_int* lwork, float*  rwork, blas_int* bwork, blas_int* info);\n  void arma_fortran(arma_zgees)(char* jobvs, char* sort, blas_int* select, blas_int* n, void* a, blas_int* lda, blas_int* sdim, void* w, void* vs, blas_int* ldvs, void* work, blas_int* lwork, double* rwork, blas_int* bwork, blas_int* info);\n  \n  // solve a Sylvester equation ax + xb = c, with a and b assumed to be in Schur form\n  void arma_fortran(arma_strsyl)(char* transa, char* transb, blas_int* isgn, blas_int* m, blas_int* n, const float*  a, blas_int* lda, const float*  b, blas_int* ldb, float*  c, blas_int* ldc, float*  scale, blas_int* info);\n  void arma_fortran(arma_dtrsyl)(char* transa, char* transb, blas_int* isgn, blas_int* m, blas_int* n, const double* a, blas_int* lda, const double* b, blas_int* ldb, double* c, blas_int* ldc, double* scale, blas_int* info);\n  void arma_fortran(arma_ctrsyl)(char* transa, char* transb, blas_int* isgn, blas_int* m, blas_int* n, const void*   a, blas_int* lda, const void*   b, blas_int* ldb, void*   c, blas_int* ldc, float*  scale, blas_int* info);\n  void arma_fortran(arma_ztrsyl)(char* transa, char* transb, blas_int* isgn, blas_int* m, blas_int* n, const void*   a, blas_int* lda, const void*   b, blas_int* ldb, void*   c, blas_int* ldc, double* scale, blas_int* info);\n  \n  void arma_fortran(arma_ssytrf)(char* uplo, blas_int* n, float*  a, blas_int* lda, blas_int* ipiv, float*  work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_dsytrf)(char* uplo, blas_int* n, double* a, blas_int* lda, blas_int* ipiv, double* work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_csytrf)(char* uplo, blas_int* n, void*   a, blas_int* lda, blas_int* ipiv, void*   work, blas_int* lwork, blas_int* info);\n  void arma_fortran(arma_zsytrf)(char* uplo, blas_int* n, void*   a, blas_int* lda, blas_int* ipiv, void*   work, blas_int* lwork, blas_int* info);\n  \n  void arma_fortran(arma_ssytri)(char* uplo, blas_int* n, float*  a, blas_int* lda, blas_int* ipiv, float*  work, blas_int* info);\n  void arma_fortran(arma_dsytri)(char* uplo, blas_int* n, double* a, blas_int* lda, blas_int* ipiv, double* work, blas_int* info);\n  void arma_fortran(arma_csytri)(char* uplo, blas_int* n, void*   a, blas_int* lda, blas_int* ipiv, void*   work, blas_int* info);\n  void arma_fortran(arma_zsytri)(char* uplo, blas_int* n, void*   a, blas_int* lda, blas_int* ipiv, void*   work, blas_int* info);\n  \n  // QZ decomposition (real matrices)\n  void arma_fortran(arma_sgges)(char* jobvsl, char* jobvsr, char* sort, char* selctg, blas_int* n,  float* a, blas_int* lda,  float* b, blas_int* ldb, blas_int* sdim,  float* alphar,  float* alphai,  float* beta,  float* vsl, blas_int* ldvsl,  float* vsr, blas_int* ldvsr,  float* work, blas_int* lwork,  float* bwork, blas_int* info);\n  void arma_fortran(arma_dgges)(char* jobvsl, char* jobvsr, char* sort, char* selctg, blas_int* n, double* a, blas_int* lda, double* b, blas_int* ldb, blas_int* sdim, double* alphar, double* alphai, double* beta, double* vsl, blas_int* ldvsl, double* vsr, blas_int* ldvsr, double* work, blas_int* lwork, double* bwork, blas_int* info);\n  \n  // QZ decomposition (complex matrices)\n  void arma_fortran(arma_cgges)(char* jobvsl, char* jobvsr, char* sort, char* selctg, blas_int* n, void* a, blas_int* lda, void* b, blas_int* ldb, blas_int* sdim, void* alpha, void* beta, void* vsl, blas_int* ldvsl, void* vsr, blas_int* ldvsr, void* work, blas_int* lwork,  float* rwork,  float* bwork, blas_int* info);\n  void arma_fortran(arma_zgges)(char* jobvsl, char* jobvsr, char* sort, char* selctg, blas_int* n, void* a, blas_int* lda, void* b, blas_int* ldb, blas_int* sdim, void* alpha, void* beta, void* vsl, blas_int* ldvsl, void* vsr, blas_int* ldvsr, void* work, blas_int* lwork, double* rwork, double* bwork, blas_int* info);\n  \n  // void arma_fortran(arma_dgeqp3)(blas_int* m, blas_int* n, double* a, blas_int* lda, blas_int* jpvt, double* tau, double* work, blas_int* lwork, blas_int* info);\n  // void arma_fortran(arma_dormqr)(char* side, char* trans, blas_int* m, blas_int* n, blas_int* k, double* a, blas_int* lda, double* tau, double* c, blas_int* ldc, double* work, blas_int* lwork, blas_int* info);\n  // void  arma_fortran(arma_dposv)(char* uplo, blas_int* n, blas_int* nrhs, double* a, blas_int* lda, double* b, blas_int* ldb, blas_int* info);\n  }\n\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/lapack_wrapper.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// Copyright (C) 2009 Edmund Highcock\n// Copyright (C) 2011 James Sanders\n// Copyright (C) 2012 Eric Jon Sundstrom\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n#ifdef ARMA_USE_LAPACK\n\n\n//! \\namespace lapack namespace for LAPACK functions\nnamespace lapack\n  {\n  \n  \n  template<typename eT>\n  inline\n  void\n  getrf(blas_int* m, blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_sgetrf)(m, n, (T*)a, lda, ipiv, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dgetrf)(m, n, (T*)a, lda, ipiv, info);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      arma_fortran(arma_cgetrf)(m, n, (T*)a, lda, ipiv, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      arma_fortran(arma_zgetrf)(m, n, (T*)a, lda, ipiv, info);\n      }\n    }\n    \n    \n    \n  template<typename eT>\n  inline\n  void\n  getri(blas_int* n,  eT* a, blas_int* lda, blas_int* ipiv, eT* work, blas_int* lwork, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_sgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      arma_fortran(arma_cgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      arma_fortran(arma_zgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  trtri(char* uplo, char* diag, blas_int* n, eT* a, blas_int* lda, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_strtri)(uplo, diag, n, (T*)a, lda, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dtrtri)(uplo, diag, n, (T*)a, lda, info);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      arma_fortran(arma_ctrtri)(uplo, diag, n, (T*)a, lda, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      arma_fortran(arma_ztrtri)(uplo, diag, n, (T*)a, lda, info);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  syev(char* jobz, char* uplo, blas_int* n, eT* a, blas_int* lda, eT* w,  eT* work, blas_int* lwork, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_ssyev)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dsyev)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, info);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  syevd(char* jobz, char* uplo, blas_int* n, eT* a, blas_int* lda, eT* w,  eT* work, blas_int* lwork, blas_int* iwork, blas_int* liwork, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_ssyevd)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, iwork, liwork, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dsyevd)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, iwork, liwork, info);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  heev\n    (\n    char* jobz, char* uplo, blas_int* n,\n    eT* a, blas_int* lda, typename eT::value_type* w,\n    eT* work, blas_int* lwork, typename eT::value_type* rwork,\n    blas_int* info\n    )\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef float T;\n      typedef typename std::complex<T> cx_T;\n      arma_fortran(arma_cheev)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef double T;\n      typedef typename std::complex<T> cx_T;\n      arma_fortran(arma_zheev)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, info);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  heevd\n    (\n    char* jobz, char* uplo, blas_int* n,\n    eT* a, blas_int* lda, typename eT::value_type* w,\n    eT* work, blas_int* lwork, typename eT::value_type* rwork, \n    blas_int* lrwork, blas_int* iwork, blas_int* liwork,\n    blas_int* info\n    )\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef float T;\n      typedef typename std::complex<T> cx_T;\n      arma_fortran(arma_cheevd)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, lrwork, iwork, liwork, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef double T;\n      typedef typename std::complex<T> cx_T;\n      arma_fortran(arma_zheevd)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, lrwork, iwork, liwork, info);\n      }\n    }\n  \n\t\n\t\n  template<typename eT>\n  inline\n  void\n  geev\n    (\n    char* jobvl, char* jobvr, blas_int* n, \n    eT* a, blas_int* lda, eT* wr, eT* wi, eT* vl, \n    blas_int* ldvl, eT* vr, blas_int* ldvr, \n    eT* work, blas_int* lwork,\n    blas_int* info\n    )\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n\n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_sgeev)(jobvl, jobvr, n,  (T*)a, lda, (T*)wr, (T*)wi, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dgeev)(jobvl, jobvr, n,  (T*)a, lda, (T*)wr, (T*)wi, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info);\n      }\n    }\n\n\n  template<typename eT>\n  inline\n  void\n  cx_geev\n    (\n    char* jobvl, char* jobvr, blas_int* n, \n    eT* a, blas_int* lda, eT* w, \n    eT* vl, blas_int* ldvl, \n    eT* vr, blas_int* ldvr, \n    eT* work, blas_int* lwork, typename eT::value_type* rwork, \n    blas_int* info\n    )\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef float T;\n      typedef typename std::complex<T> cx_T;\n      arma_fortran(arma_cgeev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)w, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef double T;\n      typedef typename std::complex<T> cx_T;\n      arma_fortran(arma_zgeev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)w, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info);\n      }\n    }\n  \n  \n  template<typename eT>\n  inline\n  void\n  ggev\n    (\n    char* jobvl, char* jobvr, blas_int* n,\n    eT* a, blas_int* lda, eT* b, blas_int* ldb,\n    eT* alphar, eT* alphai, eT* beta,\n    eT* vl, blas_int* ldvl, eT* vr, blas_int* ldvr,\n    eT* work, blas_int* lwork,\n    blas_int* info\n    )\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_sggev)(jobvl, jobvr, n, (T*)a, lda, (T*)b, ldb, (T*)alphar, (T*)alphai, (T*)beta, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dggev)(jobvl, jobvr, n, (T*)a, lda, (T*)b, ldb, (T*)alphar, (T*)alphai, (T*)beta, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  cx_ggev\n    (\n    char* jobvl, char* jobvr, blas_int* n,\n    eT* a, blas_int* lda, eT* b, blas_int* ldb,\n    eT* alpha, eT* beta,\n    eT* vl, blas_int* ldvl, eT* vr, blas_int* ldvr,\n    eT* work, blas_int* lwork, typename eT::value_type* rwork,\n    blas_int* info\n    )\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef float T;\n      typedef typename std::complex<T> cx_T;\n      arma_fortran(arma_cggev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)b, ldb, (cx_T*)alpha, (cx_T*)beta, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef double T;\n      typedef typename std::complex<T> cx_T;\n      arma_fortran(arma_zggev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)b, ldb, (cx_T*)alpha, (cx_T*)beta, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  potrf(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_spotrf)(uplo, n, (T*)a, lda, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dpotrf)(uplo, n, (T*)a, lda, info);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      arma_fortran(arma_cpotrf)(uplo, n, (T*)a, lda, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      arma_fortran(arma_zpotrf)(uplo, n, (T*)a, lda, info);\n      }\n    \n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  potri(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_spotri)(uplo, n, (T*)a, lda, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dpotri)(uplo, n, (T*)a, lda, info);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      arma_fortran(arma_cpotri)(uplo, n, (T*)a, lda, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      arma_fortran(arma_zpotri)(uplo, n, (T*)a, lda, info);\n      }\n    \n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  geqrf(blas_int* m, blas_int* n, eT* a, blas_int* lda, eT* tau, eT* work, blas_int* lwork, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_sgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      arma_fortran(arma_cgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      arma_fortran(arma_zgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info);\n      }\n    \n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  orgqr(blas_int* m, blas_int* n, blas_int* k, eT* a, blas_int* lda, eT* tau, eT* work, blas_int* lwork, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_sorgqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dorgqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info);\n      }\n    }\n\n\n  \n  template<typename eT>\n  inline\n  void\n  ungqr(blas_int* m, blas_int* n, blas_int* k, eT* a, blas_int* lda, eT* tau, eT* work, blas_int* lwork, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_cungqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_zungqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info);\n      }\n    }\n  \n  \n  template<typename eT>\n  inline\n  void\n  gesvd\n    (\n    char* jobu, char* jobvt, blas_int* m, blas_int* n, eT* a, blas_int* lda,\n    eT* s, eT* u, blas_int* ldu, eT* vt, blas_int* ldvt,\n    eT* work, blas_int* lwork, blas_int* info\n    )\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_sgesvd)(jobu, jobvt, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dgesvd)(jobu, jobvt, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, info);\n      }\n    }\n  \n  \n  \n  template<typename T>\n  inline\n  void\n  cx_gesvd\n    (\n    char* jobu, char* jobvt, blas_int* m, blas_int* n, std::complex<T>* a, blas_int* lda,\n    T* s, std::complex<T>* u, blas_int* ldu, std::complex<T>* vt, blas_int* ldvt, \n    std::complex<T>* work, blas_int* lwork, T* rwork, blas_int* info\n    )\n    {\n    arma_type_check(( is_supported_blas_type<T>::value == false ));\n    arma_type_check(( is_supported_blas_type< std::complex<T> >::value == false ));\n    \n    if(is_float<T>::value)\n      {\n      typedef float bT;\n      arma_fortran(arma_cgesvd)\n        (\n        jobu, jobvt, m, n, (std::complex<bT>*)a, lda,\n        (bT*)s, (std::complex<bT>*)u, ldu, (std::complex<bT>*)vt, ldvt,\n        (std::complex<bT>*)work, lwork, (bT*)rwork, info\n        );\n      }\n    else\n    if(is_double<T>::value)\n      {\n      typedef double bT;\n      arma_fortran(arma_zgesvd)\n        (\n        jobu, jobvt, m, n, (std::complex<bT>*)a, lda,\n        (bT*)s, (std::complex<bT>*)u, ldu, (std::complex<bT>*)vt, ldvt,\n        (std::complex<bT>*)work, lwork, (bT*)rwork, info\n        );\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  gesdd\n    (\n    char* jobz, blas_int* m, blas_int* n,\n    eT* a, blas_int* lda, eT* s, eT* u, blas_int* ldu, eT* vt, blas_int* ldvt,\n    eT* work, blas_int* lwork, blas_int* iwork, blas_int* info\n    )\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_sgesdd)(jobz, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, iwork, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dgesdd)(jobz, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, iwork, info);\n      }\n    }\n  \n  \n  \n  template<typename T>\n  inline\n  void\n  cx_gesdd\n    (\n    char* jobz, blas_int* m, blas_int* n,\n    std::complex<T>* a, blas_int* lda, T* s, std::complex<T>* u, blas_int* ldu, std::complex<T>* vt, blas_int* ldvt,\n    std::complex<T>* work, blas_int* lwork, T* rwork, blas_int* iwork, blas_int* info\n    )\n    {\n    arma_type_check(( is_supported_blas_type<T>::value == false ));\n    arma_type_check(( is_supported_blas_type< std::complex<T> >::value == false ));\n    \n    if(is_float<T>::value)\n      {\n      typedef float bT;\n      arma_fortran(arma_cgesdd)\n        (\n        jobz, m, n,\n        (std::complex<bT>*)a, lda, (bT*)s, (std::complex<bT>*)u, ldu, (std::complex<bT>*)vt, ldvt,\n        (std::complex<bT>*)work, lwork, (bT*)rwork, iwork, info\n        );\n      }\n    else\n    if(is_double<T>::value)\n      {\n      typedef double bT;\n      arma_fortran(arma_zgesdd)\n        (\n        jobz, m, n,\n        (std::complex<bT>*)a, lda, (bT*)s, (std::complex<bT>*)u, ldu, (std::complex<bT>*)vt, ldvt,\n        (std::complex<bT>*)work, lwork, (bT*)rwork, iwork, info\n        );\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  gesv(blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, blas_int* ipiv, eT* b, blas_int* ldb, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_sgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      arma_fortran(arma_cgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      arma_fortran(arma_zgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  gels(char* trans, blas_int* m, blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, eT* b, blas_int* ldb, eT* work, blas_int* lwork, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_sgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      arma_fortran(arma_cgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      arma_fortran(arma_zgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  trtrs(char* uplo, char* trans, char* diag, blas_int* n, blas_int* nrhs, const eT* a, blas_int* lda, eT* b, blas_int* ldb, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_strtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dtrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      arma_fortran(arma_ctrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      arma_fortran(arma_ztrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  gees(char* jobvs, char* sort, blas_int* select, blas_int* n, eT* a, blas_int* lda, blas_int* sdim, eT* wr, eT* wi, eT* vs, blas_int* ldvs, eT* work, blas_int* lwork, blas_int* bwork, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_sgees)(jobvs, sort, select, n, (T*)a, lda, sdim, (T*)wr, (T*)wi, (T*)vs, ldvs, (T*)work, lwork, bwork, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dgees)(jobvs, sort, select, n, (T*)a, lda, sdim, (T*)wr, (T*)wi, (T*)vs, ldvs, (T*)work, lwork, bwork, info);\n      }\n    }\n  \n  \n  \n  template<typename T>\n  inline\n  void\n  cx_gees(char* jobvs, char* sort, blas_int* select, blas_int* n, std::complex<T>* a, blas_int* lda, blas_int* sdim, std::complex<T>* w, std::complex<T>* vs, blas_int* ldvs, std::complex<T>* work, blas_int* lwork, T* rwork, blas_int* bwork, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<T>::value == false ));\n    arma_type_check(( is_supported_blas_type< std::complex<T> >::value == false ));\n    \n    if(is_float<T>::value)\n      {\n      typedef float bT;\n      typedef std::complex<bT> cT;\n      arma_fortran(arma_cgees)(jobvs, sort, select, n, (cT*)a, lda, sdim, (cT*)w, (cT*)vs, ldvs, (cT*)work, lwork, (bT*)rwork, bwork, info);\n      }\n    else\n    if(is_double<T>::value)\n      {\n      typedef double bT;\n      typedef std::complex<bT> cT;\n      arma_fortran(arma_zgees)(jobvs, sort, select, n, (cT*)a, lda, sdim, (cT*)w, (cT*)vs, ldvs, (cT*)work, lwork, (bT*)rwork, bwork, info);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  trsyl(char* transa, char* transb, blas_int* isgn, blas_int* m, blas_int* n, const eT* a, blas_int* lda, const eT* b, blas_int* ldb, eT* c, blas_int* ldc, eT* scale, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_strsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (T*)scale, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dtrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (T*)scale, info);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      arma_fortran(arma_ctrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (float*)scale, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      arma_fortran(arma_ztrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (double*)scale, info);\n      }\n    }\n  \n  \n  template<typename eT>\n  inline\n  void\n  sytrf(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, eT* work, blas_int* lwork, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_ssytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dsytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      arma_fortran(arma_csytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      arma_fortran(arma_zsytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info);\n      }\n    }\n  \n  \n  template<typename eT>\n  inline\n  void\n  sytri(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, eT* work, blas_int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_ssytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dsytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef std::complex<float> T;\n      arma_fortran(arma_csytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef std::complex<double> T;\n      arma_fortran(arma_zsytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  gges\n    (\n    char* jobvsl, char* jobvsr, char* sort, char* selctg, blas_int* n,\n    eT* a, blas_int* lda, eT* b, blas_int* ldb, blas_int* sdim,\n    eT* alphar, eT* alphai, eT* beta,\n    eT* vsl, blas_int* ldvsl, eT* vsr, blas_int* ldvsr,\n    eT* work, blas_int* lwork, eT* bwork,\n    blas_int* info\n    )\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      typedef float T;\n      arma_fortran(arma_sgges)(jobvsl, jobvsr, sort, selctg, n, (T*)a, lda, (T*)b, ldb, sdim, (T*)alphar, (T*)alphai, (T*)beta, (T*)vsl, ldvsl, (T*)vsr, ldvsr, (T*)work, lwork, (T*)bwork, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      typedef double T;\n      arma_fortran(arma_dgges)(jobvsl, jobvsr, sort, selctg, n, (T*)a, lda, (T*)b, ldb, sdim, (T*)alphar, (T*)alphai, (T*)beta, (T*)vsl, ldvsl, (T*)vsr, ldvsr, (T*)work, lwork, (T*)bwork, info);\n      }\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  void\n  cx_gges\n    (\n    char* jobvsl, char* jobvsr, char* sort, char* selctg, blas_int* n,\n    eT* a, blas_int* lda, eT* b, blas_int* ldb, blas_int* sdim,\n    eT* alpha, eT* beta,\n    eT* vsl, blas_int* ldvsl, eT* vsr, blas_int* ldvsr,\n    eT* work, blas_int* lwork, typename eT::value_type* rwork,\n    typename eT::value_type* bwork,\n    blas_int* info\n    )\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n          \n    if(is_supported_complex_float<eT>::value)\n      {\n      typedef float T;\n      typedef typename std::complex<T> cx_T;\n      arma_fortran(arma_cgges)(jobvsl, jobvsr, sort, selctg, n, (cx_T*)a, lda, (cx_T*)b, ldb, sdim, (cx_T*)alpha, (cx_T*)beta, (cx_T*)vsl, ldvsl, (cx_T*)vsr, ldvsr, (cx_T*)work, lwork, (T*)rwork, (T*)bwork, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      typedef double T;\n      typedef typename std::complex<T> cx_T;\n      arma_fortran(arma_zgges)(jobvsl, jobvsr, sort, selctg, n, (cx_T*)a, lda, (cx_T*)b, ldb, sdim, (cx_T*)alpha, (cx_T*)beta, (cx_T*)vsl, ldvsl, (cx_T*)vsr, ldvsr, (cx_T*)work, lwork, (T*)rwork, (T*)bwork, info);\n      }\n    }\n  \n  \n  }\n\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/memory.hpp",
    "content": "// Copyright (C) 2012-2014 Conrad Sanderson\n// Copyright (C) 2012-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup memory\n//! @{\n\n\nclass memory\n  {\n  public:\n  \n                        arma_inline             static uword enlarge_to_mult_of_chunksize(const uword n_elem);\n  \n  template<typename eT>      inline arma_malloc static eT*   acquire(const uword n_elem);\n  \n  template<typename eT>      inline arma_malloc static eT*   acquire_chunked(const uword n_elem);\n  \n  template<typename eT> arma_inline             static void  release(eT* mem);\n  \n  \n  template<typename eT> arma_inline static bool      is_aligned(const eT*  mem);\n  template<typename eT> arma_inline static void mark_as_aligned(      eT*& mem);\n  template<typename eT> arma_inline static void mark_as_aligned(const eT*& mem);\n  };\n\n\n\narma_inline\nuword\nmemory::enlarge_to_mult_of_chunksize(const uword n_elem)\n  {\n  const uword chunksize = arma_config::spmat_chunksize;\n  \n  // this relies on integer division\n  const uword n_elem_mod = (n_elem > 0) ? (((n_elem-1) / chunksize) + 1) * chunksize : uword(0);\n  \n  return n_elem_mod;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_malloc\neT*\nmemory::acquire(const uword n_elem)\n  {\n  arma_debug_check\n    (\n    ( size_t(n_elem) > (std::numeric_limits<size_t>::max() / sizeof(eT)) ),\n    \"arma::memory::acquire(): requested size is too large\"\n    );\n  \n  eT* out_memptr;\n  \n  #if   defined(ARMA_USE_TBB_ALLOC)\n    {\n    out_memptr = (eT *) scalable_malloc(sizeof(eT)*n_elem);\n    }\n  #elif defined(ARMA_USE_MKL_ALLOC)\n    {\n    out_memptr = (eT *) mkl_malloc( sizeof(eT)*n_elem, 128 );\n    }\n  #elif defined(ARMA_HAVE_POSIX_MEMALIGN)\n    {\n    eT* memptr;\n    \n    const size_t alignment = 16;  // change the 16 to 64 if you wish to align to the cache line\n    \n    int status = posix_memalign((void **)&memptr, ( (alignment >= sizeof(void*)) ? alignment : sizeof(void*) ), sizeof(eT)*n_elem);\n    \n    out_memptr = (status == 0) ? memptr : NULL;\n    }\n  #elif defined(_MSC_VER)\n    {\n    out_memptr = (eT *) _aligned_malloc( sizeof(eT)*n_elem, 16 );  // lives in malloc.h\n    }\n  #else\n    {\n    //return ( new(std::nothrow) eT[n_elem] );\n    out_memptr = (eT *) malloc(sizeof(eT)*n_elem);\n    }\n  #endif\n  \n  // TODO: for mingw, use __mingw_aligned_malloc\n  \n  if(n_elem > 0)\n    {\n    arma_check_bad_alloc( (out_memptr == NULL), \"arma::memory::acquire(): out of memory\" );\n    }\n  \n  return out_memptr;\n  }\n\n\n\n//! get memory in multiples of chunks, holding at least n_elem\ntemplate<typename eT>\ninline\narma_malloc\neT*\nmemory::acquire_chunked(const uword n_elem)\n  {\n  const uword n_elem_mod = memory::enlarge_to_mult_of_chunksize(n_elem);\n  \n  return memory::acquire<eT>(n_elem_mod);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nvoid\nmemory::release(eT* mem)\n  {\n  #if   defined(ARMA_USE_TBB_ALLOC)\n    {\n    scalable_free( (void *)(mem) );\n    }\n  #elif defined(ARMA_USE_MKL_ALLOC)\n    {\n    mkl_free( (void *)(mem) );\n    }\n  #elif defined(ARMA_HAVE_POSIX_MEMALIGN)\n    {\n    free( (void *)(mem) );\n    }\n  #elif defined(_MSC_VER)\n    {\n    _aligned_free( (void *)(mem) );\n    }\n  #else\n    {\n    //delete [] mem;\n    free( (void *)(mem) );\n    }\n  #endif\n  \n  // TODO: for mingw, use __mingw_aligned_free\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nbool\nmemory::is_aligned(const eT* mem)\n  {\n  #if (defined(ARMA_HAVE_ICC_ASSUME_ALIGNED) || defined(ARMA_HAVE_GCC_ASSUME_ALIGNED)) && !defined(ARMA_DONT_CHECK_ALIGNMENT)\n    {\n    return (sizeof(std::size_t) >= sizeof(eT*)) ? ((std::size_t(mem) & 0x0F) == 0) : false;\n    }\n  #else\n    {\n    arma_ignore(mem);\n    \n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nvoid\nmemory::mark_as_aligned(eT*& mem)\n  {\n  #if defined(ARMA_HAVE_ICC_ASSUME_ALIGNED)\n    {\n    __assume_aligned(mem, 16);\n    }\n  #elif defined(ARMA_HAVE_GCC_ASSUME_ALIGNED)\n    {\n    mem = (eT*)__builtin_assume_aligned(mem, 16);\n    }\n  #else\n    {\n    arma_ignore(mem);\n    }\n  #endif\n  \n  // TODO: MSVC?  __assume( (mem & 0x0F) == 0 );\n  //\n  // http://comments.gmane.org/gmane.comp.gcc.patches/239430\n  // GCC __builtin_assume_aligned is similar to ICC's __assume_aligned,\n  // so for lvalue first argument ICC's __assume_aligned can be emulated using\n  // #define __assume_aligned(lvalueptr, align) lvalueptr = __builtin_assume_aligned (lvalueptr, align) \n  //\n  // http://www.inf.ethz.ch/personal/markusp/teaching/263-2300-ETH-spring11/slides/class19.pdf\n  // http://software.intel.com/sites/products/documentation/hpc/composerxe/en-us/cpp/lin/index.htm\n  // http://d3f8ykwhia686p.cloudfront.net/1live/intel/CompilerAutovectorizationGuide.pdf\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nvoid\nmemory::mark_as_aligned(const eT*& mem)\n  {\n  #if defined(ARMA_HAVE_ICC_ASSUME_ALIGNED)\n    {\n    __assume_aligned(mem, 16);\n    }\n  #elif defined(ARMA_HAVE_GCC_ASSUME_ALIGNED)\n    {\n    mem = (const eT*)__builtin_assume_aligned(mem, 16);\n    }\n  #else\n    {\n    arma_ignore(mem);\n    }\n  #endif\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/mtGlueCube_bones.hpp",
    "content": "// Copyright (C) 2008-2011 Conrad Sanderson\n// Copyright (C) 2008-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup mtGlueCube\n//! @{\n\n\n\ntemplate<typename out_eT, typename T1, typename T2, typename glue_type>\nclass mtGlueCube : public BaseCube<out_eT, mtGlueCube<out_eT, T1, T2, glue_type> >\n  {\n  public:\n  \n  typedef          out_eT                       elem_type;\n  typedef typename get_pod_type<out_eT>::result pod_type;\n  \n  arma_inline  mtGlueCube(const T1& in_A, const T2& in_B);\n  arma_inline  mtGlueCube(const T1& in_A, const T2& in_B, const uword in_aux_uword);\n  arma_inline ~mtGlueCube();\n  \n  arma_aligned const T1&   A;         //!< first operand\n  arma_aligned const T2&   B;         //!< second operand\n  arma_aligned       uword aux_uword; //!< storage of auxiliary data, uword format\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/mtGlueCube_meat.hpp",
    "content": "// Copyright (C) 2008-2011 Conrad Sanderson\n// Copyright (C) 2008-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup mtGlueCube\n//! @{\n\n\n\ntemplate<typename out_eT, typename T1, typename T2, typename glue_type>\ninline\nmtGlueCube<out_eT,T1,T2,glue_type>::mtGlueCube(const T1& in_A, const T2& in_B)\n  : A(in_A)\n  , B(in_B)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename out_eT, typename T1, typename T2, typename glue_type>\ninline\nmtGlueCube<out_eT,T1,T2,glue_type>::mtGlueCube(const T1& in_A, const T2& in_B, const uword in_aux_uword)\n  : A(in_A)\n  , B(in_B)\n  , aux_uword(in_aux_uword)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename out_eT, typename T1, typename T2, typename glue_type>\ninline\nmtGlueCube<out_eT,T1,T2,glue_type>::~mtGlueCube()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/mtGlue_bones.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup mtGlue\n//! @{\n\n\n\ntemplate<typename out_eT, typename T1, typename T2, typename glue_type>\nclass mtGlue : public Base<out_eT, mtGlue<out_eT, T1, T2, glue_type> >\n  {\n  public:\n  \n  typedef          out_eT                       elem_type;\n  typedef typename get_pod_type<out_eT>::result pod_type;\n  \n  static const bool is_row = ( is_glue_mixed_elem<glue_type>::value && (T1::is_row || T2::is_row) ) || ( is_glue_mixed_times<glue_type>::value && T1::is_row );\n  static const bool is_col = ( is_glue_mixed_elem<glue_type>::value && (T1::is_col || T2::is_col) ) || ( is_glue_mixed_times<glue_type>::value && T2::is_col );\n  \n  arma_inline  mtGlue(const T1& in_A, const T2& in_B);\n  arma_inline  mtGlue(const T1& in_A, const T2& in_B, const uword in_aux_uword);\n  arma_inline ~mtGlue();\n  \n  arma_aligned const T1&   A;         //!< first operand\n  arma_aligned const T2&   B;         //!< second operand\n  arma_aligned       uword aux_uword; //!< storage of auxiliary data, uword format\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/mtGlue_meat.hpp",
    "content": "// Copyright (C) 2008-2011 Conrad Sanderson\n// Copyright (C) 2008-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup mtGlue\n//! @{\n\n\n\ntemplate<typename out_eT, typename T1, typename T2, typename glue_type>\ninline\nmtGlue<out_eT,T1,T2,glue_type>::mtGlue(const T1& in_A, const T2& in_B)\n  : A(in_A)\n  , B(in_B)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename out_eT, typename T1, typename T2, typename glue_type>\ninline\nmtGlue<out_eT,T1,T2,glue_type>::mtGlue(const T1& in_A, const T2& in_B, const uword in_aux_uword)\n  : A(in_A)\n  , B(in_B)\n  , aux_uword(in_aux_uword)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename out_eT, typename T1, typename T2, typename glue_type>\ninline\nmtGlue<out_eT,T1,T2,glue_type>::~mtGlue()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/mtOpCube_bones.hpp",
    "content": "// Copyright (C) 2008-2011 Conrad Sanderson\n// Copyright (C) 2008-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup mtOpCube\n//! @{\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\nclass mtOpCube : public BaseCube<out_eT, mtOpCube<out_eT, T1, op_type> >\n  {\n  public:\n  \n  typedef          out_eT                       elem_type;\n  typedef typename get_pod_type<out_eT>::result pod_type;\n\n  typedef typename T1::elem_type                in_eT;\n\n  inline explicit mtOpCube(const T1& in_m);\n  inline          mtOpCube(const T1& in_m, const in_eT in_aux);\n  inline          mtOpCube(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c);\n  inline          mtOpCube(const T1& in_m, const in_eT in_aux,         const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c);\n  \n  inline          mtOpCube(const char junk, const T1& in_m, const out_eT in_aux);\n  \n  inline         ~mtOpCube();\n    \n  \n  arma_aligned const T1&    m;            //!< storage of reference to the operand (eg. a matrix)\n  arma_aligned       in_eT  aux;          //!< storage of auxiliary data, using the element type as used by T1\n  arma_aligned       out_eT aux_out_eT;   //!< storage of auxiliary data, using the element type as specified by the out_eT template parameter\n  arma_aligned       uword  aux_uword_a;  //!< storage of auxiliary data, uword format\n  arma_aligned       uword  aux_uword_b;  //!< storage of auxiliary data, uword format\n  arma_aligned       uword  aux_uword_c;  //!< storage of auxiliary data, uword format\n  \n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/mtOpCube_meat.hpp",
    "content": "// Copyright (C) 2008-2011 Conrad Sanderson\n// Copyright (C) 2008-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup mtOpCube\n//! @{\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\ninline\nmtOpCube<out_eT, T1, op_type>::mtOpCube(const T1& in_m)\n  : m(in_m)\n  {\n  arma_extra_debug_sigprint();\n  }\n  \n\n\ntemplate<typename out_eT, typename T1, typename op_type>\ninline\nmtOpCube<out_eT, T1, op_type>::mtOpCube(const T1& in_m, const typename T1::elem_type in_aux)\n  : m(in_m)\n  , aux(in_aux)\n  {\n  arma_extra_debug_sigprint();\n  }\n  \n\n\ntemplate<typename out_eT, typename T1, typename op_type>\ninline\nmtOpCube<out_eT, T1, op_type>::mtOpCube(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c)\n  : m(in_m)\n  , aux_uword_a(in_aux_uword_a)\n  , aux_uword_b(in_aux_uword_b)\n  , aux_uword_c(in_aux_uword_c)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\ninline\nmtOpCube<out_eT, T1, op_type>::mtOpCube(const T1& in_m, const typename T1::elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c)\n  : m(in_m)\n  , aux(in_aux)\n  , aux_uword_a(in_aux_uword_a)\n  , aux_uword_b(in_aux_uword_b)\n  , aux_uword_c(in_aux_uword_c)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\ninline\nmtOpCube<out_eT, T1, op_type>::mtOpCube(const char junk, const T1& in_m, const out_eT in_aux)\n  : m(in_m)\n  , aux_out_eT(in_aux)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  }\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\ninline\nmtOpCube<out_eT, T1, op_type>::~mtOpCube()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/mtOp_bones.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup mtOp\n//! @{\n\n\nstruct mtOp_dual_aux_indicator {};\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\nclass mtOp : public Base<out_eT, mtOp<out_eT, T1, op_type> >\n  {\n  public:\n  \n  typedef          out_eT                       elem_type;\n  typedef typename get_pod_type<out_eT>::result pod_type;\n  \n  typedef typename T1::elem_type                in_eT;\n  \n  static const bool is_row = \\\n     (T1::is_row && (is_op_mixed_elem<op_type>::value || is_same_type<op_type, op_clamp>::value || is_same_type<op_type, op_real>::value || is_same_type<op_type, op_imag>::value || is_same_type<op_type, op_abs>::value));\n  \n  static const bool is_col = \\\n     (T1::is_col && (is_op_mixed_elem<op_type>::value || is_same_type<op_type, op_clamp>::value || is_same_type<op_type, op_real>::value || is_same_type<op_type, op_imag>::value || is_same_type<op_type, op_abs>::value))\n  || (is_same_type<op_type, op_find_simple>::value)\n  || (is_same_type<op_type, op_find>::value)\n  || (is_same_type<op_type, op_sort_index>::value)\n  || (is_same_type<op_type, op_stable_sort_index>::value);\n  \n  \n  \n  inline explicit mtOp(const T1& in_m);\n  inline          mtOp(const T1& in_m, const in_eT in_aux);\n  inline          mtOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b);\n  inline          mtOp(const T1& in_m, const in_eT in_aux,         const uword in_aux_uword_a, const uword in_aux_uword_b);\n  \n  inline          mtOp(const char junk, const T1& in_m, const out_eT in_aux);\n  \n  inline          mtOp(const mtOp_dual_aux_indicator&, const T1& in_m, const in_eT in_aux_a, const out_eT in_aux_b);\n  \n  inline         ~mtOp();\n    \n  \n  arma_aligned const T1&    m;            //!< storage of reference to the operand (eg. a matrix)\n  arma_aligned       in_eT  aux;          //!< storage of auxiliary data, using the element type as used by T1\n  arma_aligned       out_eT aux_out_eT;   //!< storage of auxiliary data, using the element type as specified by the out_eT template parameter\n  arma_aligned       uword  aux_uword_a;  //!< storage of auxiliary data, uword format\n  arma_aligned       uword  aux_uword_b;  //!< storage of auxiliary data, uword format\n  \n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/mtOp_meat.hpp",
    "content": "// Copyright (C) 2008-2011 Conrad Sanderson\n// Copyright (C) 2008-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup mtOp\n//! @{\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\ninline\nmtOp<out_eT, T1, op_type>::mtOp(const T1& in_m)\n  : m(in_m)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\ninline\nmtOp<out_eT, T1, op_type>::mtOp(const T1& in_m, const typename T1::elem_type in_aux)\n  : m(in_m)\n  , aux(in_aux)\n  {\n  arma_extra_debug_sigprint();\n  }\n  \n\n\ntemplate<typename out_eT, typename T1, typename op_type>\ninline\nmtOp<out_eT, T1, op_type>::mtOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b)\n  : m(in_m)\n  , aux_uword_a(in_aux_uword_a)\n  , aux_uword_b(in_aux_uword_b)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\ninline\nmtOp<out_eT, T1, op_type>::mtOp(const T1& in_m, const typename T1::elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b)\n  : m(in_m)\n  , aux(in_aux)\n  , aux_uword_a(in_aux_uword_a)\n  , aux_uword_b(in_aux_uword_b)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\ninline\nmtOp<out_eT, T1, op_type>::mtOp(const char junk, const T1& in_m, const out_eT in_aux)\n  : m(in_m)\n  , aux_out_eT(in_aux)\n  {\n  arma_ignore(junk);\n  \n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\ninline\nmtOp<out_eT, T1, op_type>::mtOp(const mtOp_dual_aux_indicator&, const T1& in_m, const typename T1::elem_type in_aux_a, const out_eT in_aux_b)\n  : m         (in_m    )\n  , aux       (in_aux_a)\n  , aux_out_eT(in_aux_b)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\ninline\nmtOp<out_eT, T1, op_type>::~mtOp()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/mtSpOp_bones.hpp",
    "content": "// Copyright (C) 2012 Ryan Curtin\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup mtSpOp\n//! @{\n\n// Class for delayed multi-type sparse operations.  These are operations where\n// the resulting type is different than the stored type.\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\nclass mtSpOp : public SpBase<out_eT, mtSpOp<out_eT, T1, op_type> >\n  {\n  public:\n\n  typedef          out_eT                       elem_type;\n  typedef typename get_pod_type<out_eT>::result pod_type;\n\n  typedef typename T1::elem_type                in_eT;\n\n  static const bool is_row = false;\n  static const bool is_col = false;\n\n  inline explicit mtSpOp(const T1& in_m);\n  inline          mtSpOp(const T1& in_m, const uword aux_uword_a, const uword aux_uword_b);\n\n  inline          ~mtSpOp();\n\n  arma_aligned const T1&    m;\n  arma_aligned       uword  aux_uword_a;\n  arma_aligned       uword  aux_uword_b;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/mtSpOp_meat.hpp",
    "content": "// Copyright (C) 2012 Ryan Curtin\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup mtSpOp\n//! @{\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\ninline\nmtSpOp<out_eT, T1, op_type>::mtSpOp(const T1& in_m)\n  : m(in_m)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\ninline\nmtSpOp<out_eT, T1, op_type>::mtSpOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b)\n  : m(in_m)\n  , aux_uword_a(in_aux_uword_a)\n  , aux_uword_b(in_aux_uword_b)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\ninline\nmtSpOp<out_eT, T1, op_type>::~mtSpOp()\n  {\n  arma_extra_debug_sigprint();\n  }\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/mul_gemm.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup gemm\n//! @{\n\n\n\n//! for tiny square matrices, size <= 4x4\ntemplate<const bool do_trans_A=false, const bool use_alpha=false, const bool use_beta=false>\nclass gemm_emul_tinysq\n  {\n  public:\n  \n  \n  template<typename eT, typename TA, typename TB>\n  arma_hot\n  inline\n  static\n  void\n  apply\n    (\n          Mat<eT>& C,\n    const TA&      A,\n    const TB&      B,\n    const eT       alpha = eT(1),\n    const eT       beta  = eT(0)\n    )\n    {\n    arma_extra_debug_sigprint();\n    \n    switch(A.n_rows)\n      {\n      case  4:  gemv_emul_tinysq<do_trans_A, use_alpha, use_beta>::apply( C.colptr(3), A, B.colptr(3), alpha, beta );\n      case  3:  gemv_emul_tinysq<do_trans_A, use_alpha, use_beta>::apply( C.colptr(2), A, B.colptr(2), alpha, beta );\n      case  2:  gemv_emul_tinysq<do_trans_A, use_alpha, use_beta>::apply( C.colptr(1), A, B.colptr(1), alpha, beta );\n      case  1:  gemv_emul_tinysq<do_trans_A, use_alpha, use_beta>::apply( C.colptr(0), A, B.colptr(0), alpha, beta );\n      default:  ;\n      }\n    }\n  \n  };\n\n\n\n//! emulation of gemm(), for non-complex matrices only, as it assumes only simple transposes (ie. doesn't do hermitian transposes)\ntemplate<const bool do_trans_A=false, const bool do_trans_B=false, const bool use_alpha=false, const bool use_beta=false>\nclass gemm_emul_large\n  {\n  public:\n  \n  template<typename eT, typename TA, typename TB>\n  arma_hot\n  inline\n  static\n  void\n  apply\n    (\n          Mat<eT>& C,\n    const TA&      A,\n    const TB&      B,\n    const eT       alpha = eT(1),\n    const eT       beta  = eT(0)\n    )\n    {\n    arma_extra_debug_sigprint();\n\n    const uword A_n_rows = A.n_rows;\n    const uword A_n_cols = A.n_cols;\n    \n    const uword B_n_rows = B.n_rows;\n    const uword B_n_cols = B.n_cols;\n    \n    if( (do_trans_A == false) && (do_trans_B == false) )\n      {\n      arma_aligned podarray<eT> tmp(A_n_cols);\n      \n      eT* A_rowdata = tmp.memptr();\n      \n      for(uword row_A=0; row_A < A_n_rows; ++row_A)\n        {\n        tmp.copy_row(A, row_A);\n        \n        for(uword col_B=0; col_B < B_n_cols; ++col_B)\n          {\n          const eT acc = op_dot::direct_dot_arma(B_n_rows, A_rowdata, B.colptr(col_B));\n          \n               if( (use_alpha == false) && (use_beta == false) )  { C.at(row_A,col_B) =       acc;                          }\n          else if( (use_alpha == true ) && (use_beta == false) )  { C.at(row_A,col_B) = alpha*acc;                          }\n          else if( (use_alpha == false) && (use_beta == true ) )  { C.at(row_A,col_B) =       acc + beta*C.at(row_A,col_B); }\n          else if( (use_alpha == true ) && (use_beta == true ) )  { C.at(row_A,col_B) = alpha*acc + beta*C.at(row_A,col_B); }\n          }\n        }\n      }\n    else\n    if( (do_trans_A == true) && (do_trans_B == false) )\n      {\n      for(uword col_A=0; col_A < A_n_cols; ++col_A)\n        {\n        // col_A is interpreted as row_A when storing the results in matrix C\n        \n        const eT* A_coldata = A.colptr(col_A);\n        \n        for(uword col_B=0; col_B < B_n_cols; ++col_B)\n          {\n          const eT acc = op_dot::direct_dot_arma(B_n_rows, A_coldata, B.colptr(col_B));\n          \n               if( (use_alpha == false) && (use_beta == false) )  { C.at(col_A,col_B) =       acc;                          }\n          else if( (use_alpha == true ) && (use_beta == false) )  { C.at(col_A,col_B) = alpha*acc;                          }\n          else if( (use_alpha == false) && (use_beta == true ) )  { C.at(col_A,col_B) =       acc + beta*C.at(col_A,col_B); }\n          else if( (use_alpha == true ) && (use_beta == true ) )  { C.at(col_A,col_B) = alpha*acc + beta*C.at(col_A,col_B); }\n          }\n        }\n      }\n    else\n    if( (do_trans_A == false) && (do_trans_B == true) )\n      {\n      Mat<eT> BB;\n      op_strans::apply_mat_noalias(BB, B);\n      \n      gemm_emul_large<false, false, use_alpha, use_beta>::apply(C, A, BB, alpha, beta);\n      }\n    else\n    if( (do_trans_A == true) && (do_trans_B == true) )\n      {\n      // mat B_tmp = trans(B);\n      // dgemm_arma<true, false,  use_alpha, use_beta>::apply(C, A, B_tmp, alpha, beta);\n      \n      \n      // By using the trans(A)*trans(B) = trans(B*A) equivalency,\n      // transpose operations are not needed\n      \n      arma_aligned podarray<eT> tmp(B.n_cols);\n      eT* B_rowdata = tmp.memptr();\n      \n      for(uword row_B=0; row_B < B_n_rows; ++row_B)\n        {\n        tmp.copy_row(B, row_B);\n        \n        for(uword col_A=0; col_A < A_n_cols; ++col_A)\n          {\n          const eT acc = op_dot::direct_dot_arma(A_n_rows, B_rowdata, A.colptr(col_A));\n          \n               if( (use_alpha == false) && (use_beta == false) )  { C.at(col_A,row_B) =       acc;                          }\n          else if( (use_alpha == true ) && (use_beta == false) )  { C.at(col_A,row_B) = alpha*acc;                          }\n          else if( (use_alpha == false) && (use_beta == true ) )  { C.at(col_A,row_B) =       acc + beta*C.at(col_A,row_B); }\n          else if( (use_alpha == true ) && (use_beta == true ) )  { C.at(col_A,row_B) = alpha*acc + beta*C.at(col_A,row_B); }\n          }\n        }\n      }\n    }\n  \n  };\n  \n\n\ntemplate<const bool do_trans_A=false, const bool do_trans_B=false, const bool use_alpha=false, const bool use_beta=false>\nclass gemm_emul\n  {\n  public:\n  \n  \n  template<typename eT, typename TA, typename TB>\n  arma_hot\n  inline\n  static\n  void\n  apply\n    (\n          Mat<eT>& C,\n    const TA&      A,\n    const TB&      B,\n    const eT       alpha = eT(1),\n    const eT       beta  = eT(0),\n    const typename arma_not_cx<eT>::result* junk = 0\n    )\n    {\n    arma_extra_debug_sigprint();\n    arma_ignore(junk);\n    \n    gemm_emul_large<do_trans_A, do_trans_B, use_alpha, use_beta>::apply(C, A, B, alpha, beta);\n    }\n  \n  \n  \n  template<typename eT>\n  arma_hot\n  inline\n  static\n  void\n  apply\n    (\n          Mat<eT>& C,\n    const Mat<eT>& A,\n    const Mat<eT>& B,\n    const eT       alpha = eT(1),\n    const eT       beta  = eT(0),\n    const typename arma_cx_only<eT>::result* junk = 0\n    )\n    {\n    arma_extra_debug_sigprint();\n    arma_ignore(junk);\n    \n    // \"better than nothing\" handling of hermitian transposes for complex number matrices\n    \n    Mat<eT> tmp_A;\n    Mat<eT> tmp_B;\n    \n    if(do_trans_A)  { op_htrans::apply_mat_noalias(tmp_A, A); }\n    if(do_trans_B)  { op_htrans::apply_mat_noalias(tmp_B, B); }\n    \n    const Mat<eT>& AA = (do_trans_A == false) ? A : tmp_A;\n    const Mat<eT>& BB = (do_trans_B == false) ? B : tmp_B;\n    \n    gemm_emul_large<false, false, use_alpha, use_beta>::apply(C, AA, BB, alpha, beta);\n    }\n\n  };\n\n\n\n//! \\brief\n//! Wrapper for ATLAS/BLAS dgemm function, using template arguments to control the arguments passed to dgemm.\n//! Matrix 'C' is assumed to have been set to the correct size (i.e. taking into account transposes)\n\ntemplate<const bool do_trans_A=false, const bool do_trans_B=false, const bool use_alpha=false, const bool use_beta=false>\nclass gemm\n  {\n  public:\n  \n  template<typename eT, typename TA, typename TB>\n  inline\n  static\n  void\n  apply_blas_type( Mat<eT>& C, const TA& A, const TB& B, const eT alpha = eT(1), const eT beta = eT(0) )\n    {\n    arma_extra_debug_sigprint();\n    \n    if( (A.n_rows <= 4) && (A.n_rows == A.n_cols) && (A.n_rows == B.n_rows) && (B.n_rows == B.n_cols) && (is_cx<eT>::no) ) \n      {\n      if(do_trans_B == false)\n        {\n        gemm_emul_tinysq<do_trans_A, use_alpha, use_beta>::apply(C, A, B, alpha, beta);\n        }\n      else\n        {\n        Mat<eT> BB(B.n_rows, B.n_rows);\n        \n        op_strans::apply_mat_noalias_tinysq(BB, B);\n        \n        gemm_emul_tinysq<do_trans_A, use_alpha, use_beta>::apply(C, A, BB, alpha, beta);\n        }\n      }\n    else\n      {\n      #if defined(ARMA_USE_ATLAS)\n        {\n        arma_extra_debug_print(\"atlas::cblas_gemm()\");\n        \n        arma_debug_assert_atlas_size(A,B);\n        \n        atlas::cblas_gemm<eT>\n          (\n          atlas::CblasColMajor,\n          (do_trans_A) ? ( is_cx<eT>::yes ? CblasConjTrans : atlas::CblasTrans ) : atlas::CblasNoTrans,\n          (do_trans_B) ? ( is_cx<eT>::yes ? CblasConjTrans : atlas::CblasTrans ) : atlas::CblasNoTrans,\n          C.n_rows,\n          C.n_cols,\n          (do_trans_A) ? A.n_rows : A.n_cols,\n          (use_alpha) ? alpha : eT(1),\n          A.mem,\n          (do_trans_A) ? A.n_rows : C.n_rows,\n          B.mem,\n          (do_trans_B) ? C.n_cols : ( (do_trans_A) ? A.n_rows : A.n_cols ),\n          (use_beta) ? beta : eT(0),\n          C.memptr(),\n          C.n_rows\n          );\n        }\n      #elif defined(ARMA_USE_BLAS)\n        {\n        arma_extra_debug_print(\"blas::gemm()\");\n        \n        arma_debug_assert_blas_size(A,B);\n        \n        const char trans_A = (do_trans_A) ? ( is_cx<eT>::yes ? 'C' : 'T' ) : 'N';\n        const char trans_B = (do_trans_B) ? ( is_cx<eT>::yes ? 'C' : 'T' ) : 'N';\n        \n        const blas_int m   = C.n_rows;\n        const blas_int n   = C.n_cols;\n        const blas_int k   = (do_trans_A) ? A.n_rows : A.n_cols;\n        \n        const eT local_alpha = (use_alpha) ? alpha : eT(1);\n        \n        const blas_int lda = (do_trans_A) ? k : m;\n        const blas_int ldb = (do_trans_B) ? n : k;\n        \n        const eT local_beta  = (use_beta) ? beta : eT(0);\n        \n        arma_extra_debug_print( arma_boost::format(\"blas::gemm(): trans_A = %c\") % trans_A );\n        arma_extra_debug_print( arma_boost::format(\"blas::gemm(): trans_B = %c\") % trans_B );\n        \n        blas::gemm<eT>\n          (\n          &trans_A,\n          &trans_B,\n          &m,\n          &n,\n          &k,\n          &local_alpha,\n          A.mem,\n          &lda,\n          B.mem,\n          &ldb,\n          &local_beta,\n          C.memptr(),\n          &m\n          );\n        }\n      #else\n        {\n        gemm_emul<do_trans_A, do_trans_B, use_alpha, use_beta>::apply(C,A,B,alpha,beta);\n        }\n      #endif\n      }\n    }\n  \n  \n  \n  //! immediate multiplication of matrices A and B, storing the result in C\n  template<typename eT, typename TA, typename TB>\n  inline\n  static\n  void\n  apply( Mat<eT>& C, const TA& A, const TB& B, const eT alpha = eT(1), const eT beta = eT(0) )\n    {\n    gemm_emul<do_trans_A, do_trans_B, use_alpha, use_beta>::apply(C,A,B,alpha,beta);\n    }\n  \n  \n  \n  template<typename TA, typename TB>\n  arma_inline\n  static\n  void\n  apply\n    (\n          Mat<float>& C,\n    const TA&         A,\n    const TB&         B,\n    const float alpha = float(1),\n    const float beta  = float(0)\n    )\n    {\n    gemm<do_trans_A, do_trans_B, use_alpha, use_beta>::apply_blas_type(C,A,B,alpha,beta);\n    }\n  \n  \n  \n  template<typename TA, typename TB>\n  arma_inline\n  static\n  void\n  apply\n    (\n          Mat<double>& C,\n    const TA&          A,\n    const TB&          B,\n    const double alpha = double(1),\n    const double beta  = double(0)\n    )\n    {\n    gemm<do_trans_A, do_trans_B, use_alpha, use_beta>::apply_blas_type(C,A,B,alpha,beta);\n    }\n  \n  \n  \n  template<typename TA, typename TB>\n  arma_inline\n  static\n  void\n  apply\n    (\n          Mat< std::complex<float> >& C,\n    const TA&                         A,\n    const TB&                         B,\n    const std::complex<float> alpha = std::complex<float>(1),\n    const std::complex<float> beta  = std::complex<float>(0)\n    )\n    {\n    gemm<do_trans_A, do_trans_B, use_alpha, use_beta>::apply_blas_type(C,A,B,alpha,beta);\n    }\n  \n  \n  \n  template<typename TA, typename TB>\n  arma_inline\n  static\n  void\n  apply\n    (\n          Mat< std::complex<double> >& C,\n    const TA&                          A,\n    const TB&                          B,\n    const std::complex<double> alpha = std::complex<double>(1),\n    const std::complex<double> beta  = std::complex<double>(0)\n    )\n    {\n    gemm<do_trans_A, do_trans_B, use_alpha, use_beta>::apply_blas_type(C,A,B,alpha,beta);\n    }\n  \n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/mul_gemm_mixed.hpp",
    "content": "// Copyright (C) 2008-2011 Conrad Sanderson\n// Copyright (C) 2008-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup gemm_mixed\n//! @{\n\n\n\n//! \\brief\n//! Matrix multplication where the matrices have differing element types.\n//! Uses caching for speedup.\n//! Matrix 'C' is assumed to have been set to the correct size (i.e. taking into account transposes)\n\ntemplate<const bool do_trans_A=false, const bool do_trans_B=false, const bool use_alpha=false, const bool use_beta=false>\nclass gemm_mixed_large\n  {\n  public:\n  \n  template<typename out_eT, typename in_eT1, typename in_eT2>\n  arma_hot\n  inline\n  static\n  void\n  apply\n    (\n          Mat<out_eT>& C,\n    const Mat<in_eT1>& A,\n    const Mat<in_eT2>& B,\n    const out_eT       alpha = out_eT(1),\n    const out_eT       beta  = out_eT(0)\n    )\n    {\n    arma_extra_debug_sigprint();\n    \n    const uword A_n_rows = A.n_rows;\n    const uword A_n_cols = A.n_cols;\n    \n    const uword B_n_rows = B.n_rows;\n    const uword B_n_cols = B.n_cols;\n    \n    if( (do_trans_A == false) && (do_trans_B == false) )\n      {\n      podarray<in_eT1> tmp(A_n_cols);\n      in_eT1* A_rowdata = tmp.memptr();\n      \n      for(uword row_A=0; row_A < A_n_rows; ++row_A)\n        {\n        tmp.copy_row(A, row_A);\n        \n        for(uword col_B=0; col_B < B_n_cols; ++col_B)\n          {\n          const in_eT2* B_coldata = B.colptr(col_B);\n          \n          out_eT acc = out_eT(0);\n          for(uword i=0; i < B_n_rows; ++i)\n            {\n            acc += upgrade_val<in_eT1,in_eT2>::apply(A_rowdata[i]) * upgrade_val<in_eT1,in_eT2>::apply(B_coldata[i]);\n            }\n        \n               if( (use_alpha == false) && (use_beta == false) )  { C.at(row_A,col_B) =       acc;                          }\n          else if( (use_alpha == true ) && (use_beta == false) )  { C.at(row_A,col_B) = alpha*acc;                          }\n          else if( (use_alpha == false) && (use_beta == true ) )  { C.at(row_A,col_B) =       acc + beta*C.at(row_A,col_B); }\n          else if( (use_alpha == true ) && (use_beta == true ) )  { C.at(row_A,col_B) = alpha*acc + beta*C.at(row_A,col_B); }\n          }\n        }\n      }\n    else\n    if( (do_trans_A == true) && (do_trans_B == false) )\n      {\n      for(uword col_A=0; col_A < A_n_cols; ++col_A)\n        {\n        // col_A is interpreted as row_A when storing the results in matrix C\n        \n        const in_eT1* A_coldata = A.colptr(col_A);\n        \n        for(uword col_B=0; col_B < B_n_cols; ++col_B)\n          {\n          const in_eT2* B_coldata = B.colptr(col_B);\n          \n          out_eT acc = out_eT(0);\n          for(uword i=0; i < B_n_rows; ++i)\n            {\n            acc += upgrade_val<in_eT1,in_eT2>::apply(A_coldata[i]) * upgrade_val<in_eT1,in_eT2>::apply(B_coldata[i]);\n            }\n        \n               if( (use_alpha == false) && (use_beta == false) )  { C.at(col_A,col_B) =       acc;                          }\n          else if( (use_alpha == true ) && (use_beta == false) )  { C.at(col_A,col_B) = alpha*acc;                          }\n          else if( (use_alpha == false) && (use_beta == true ) )  { C.at(col_A,col_B) =       acc + beta*C.at(col_A,col_B); }\n          else if( (use_alpha == true ) && (use_beta == true ) )  { C.at(col_A,col_B) = alpha*acc + beta*C.at(col_A,col_B); }\n          }\n        }\n      }\n    else\n    if( (do_trans_A == false) && (do_trans_B == true) )\n      {\n      Mat<in_eT2> B_tmp;\n      \n      op_strans::apply_mat_noalias(B_tmp, B);\n      \n      gemm_mixed_large<false, false, use_alpha, use_beta>::apply(C, A, B_tmp, alpha, beta);\n      }\n    else\n    if( (do_trans_A == true) && (do_trans_B == true) )\n      {\n      // mat B_tmp = trans(B);\n      // dgemm_arma<true, false,  use_alpha, use_beta>::apply(C, A, B_tmp, alpha, beta);\n      \n      \n      // By using the trans(A)*trans(B) = trans(B*A) equivalency,\n      // transpose operations are not needed\n      \n      podarray<in_eT2> tmp(B_n_cols);\n      in_eT2* B_rowdata = tmp.memptr();\n      \n      for(uword row_B=0; row_B < B_n_rows; ++row_B)\n        {\n        tmp.copy_row(B, row_B);\n        \n        for(uword col_A=0; col_A < A_n_cols; ++col_A)\n          {\n          const in_eT1* A_coldata = A.colptr(col_A);\n          \n          out_eT acc = out_eT(0);\n          for(uword i=0; i < A_n_rows; ++i)\n            {\n            acc += upgrade_val<in_eT1,in_eT2>::apply(B_rowdata[i]) * upgrade_val<in_eT1,in_eT2>::apply(A_coldata[i]);\n            }\n          \n               if( (use_alpha == false) && (use_beta == false) )  { C.at(col_A,row_B) =       acc;                          }\n          else if( (use_alpha == true ) && (use_beta == false) )  { C.at(col_A,row_B) = alpha*acc;                          }\n          else if( (use_alpha == false) && (use_beta == true ) )  { C.at(col_A,row_B) =       acc + beta*C.at(col_A,row_B); }\n          else if( (use_alpha == true ) && (use_beta == true ) )  { C.at(col_A,row_B) = alpha*acc + beta*C.at(col_A,row_B); }\n          }\n        }\n      \n      }\n    }\n    \n  };\n\n\n\n//! Matrix multplication where the matrices have different element types.\n//! Simple version (no caching).\n//! Matrix 'C' is assumed to have been set to the correct size (i.e. taking into account transposes)\ntemplate<const bool do_trans_A=false, const bool do_trans_B=false, const bool use_alpha=false, const bool use_beta=false>\nclass gemm_mixed_small\n  {\n  public:\n  \n  template<typename out_eT, typename in_eT1, typename in_eT2>\n  arma_hot\n  inline\n  static\n  void\n  apply\n    (\n          Mat<out_eT>& C,\n    const Mat<in_eT1>& A,\n    const Mat<in_eT2>& B,\n    const out_eT       alpha = out_eT(1),\n    const out_eT       beta  = out_eT(0)\n    )\n    {\n    arma_extra_debug_sigprint();\n    \n    const uword A_n_rows = A.n_rows;\n    const uword A_n_cols = A.n_cols;\n    \n    const uword B_n_rows = B.n_rows;\n    const uword B_n_cols = B.n_cols;\n    \n    if( (do_trans_A == false) && (do_trans_B == false) )\n      {\n      for(uword row_A = 0; row_A < A_n_rows; ++row_A)\n        {\n        for(uword col_B = 0; col_B < B_n_cols; ++col_B)\n          {\n          const in_eT2* B_coldata = B.colptr(col_B);\n          \n          out_eT acc = out_eT(0);\n          for(uword i = 0; i < B_n_rows; ++i)\n            {\n            const out_eT val1 = upgrade_val<in_eT1,in_eT2>::apply(A.at(row_A,i));\n            const out_eT val2 = upgrade_val<in_eT1,in_eT2>::apply(B_coldata[i]);\n            acc += val1 * val2;\n            //acc += upgrade_val<in_eT1,in_eT2>::apply(A.at(row_A,i)) * upgrade_val<in_eT1,in_eT2>::apply(B_coldata[i]);\n            }\n          \n               if( (use_alpha == false) && (use_beta == false) )  { C.at(row_A,col_B) =       acc;                          }\n          else if( (use_alpha == true ) && (use_beta == false) )  { C.at(row_A,col_B) = alpha*acc;                          }\n          else if( (use_alpha == false) && (use_beta == true ) )  { C.at(row_A,col_B) =       acc + beta*C.at(row_A,col_B); }\n          else if( (use_alpha == true ) && (use_beta == true ) )  { C.at(row_A,col_B) = alpha*acc + beta*C.at(row_A,col_B); }\n          }\n        }\n      }\n    else\n    if( (do_trans_A == true) && (do_trans_B == false) )\n      {\n      for(uword col_A=0; col_A < A_n_cols; ++col_A)\n        {\n        // col_A is interpreted as row_A when storing the results in matrix C\n        \n        const in_eT1* A_coldata = A.colptr(col_A);\n        \n        for(uword col_B=0; col_B < B_n_cols; ++col_B)\n          {\n          const in_eT2* B_coldata = B.colptr(col_B);\n          \n          out_eT acc = out_eT(0);\n          for(uword i=0; i < B_n_rows; ++i)\n            {\n            acc += upgrade_val<in_eT1,in_eT2>::apply(A_coldata[i]) * upgrade_val<in_eT1,in_eT2>::apply(B_coldata[i]);\n            }\n        \n               if( (use_alpha == false) && (use_beta == false) )  { C.at(col_A,col_B) =       acc;                          }\n          else if( (use_alpha == true ) && (use_beta == false) )  { C.at(col_A,col_B) = alpha*acc;                          }\n          else if( (use_alpha == false) && (use_beta == true ) )  { C.at(col_A,col_B) =       acc + beta*C.at(col_A,col_B); }\n          else if( (use_alpha == true ) && (use_beta == true ) )  { C.at(col_A,col_B) = alpha*acc + beta*C.at(col_A,col_B); }\n          }\n        }\n      }\n    else\n    if( (do_trans_A == false) && (do_trans_B == true) )\n      {\n      for(uword row_A = 0; row_A < A_n_rows; ++row_A)\n        {\n        for(uword row_B = 0; row_B < B_n_rows; ++row_B)\n          {\n          out_eT acc = out_eT(0);\n          for(uword i = 0; i < B_n_cols; ++i)\n            {\n            acc += upgrade_val<in_eT1,in_eT2>::apply(A.at(row_A,i)) * upgrade_val<in_eT1,in_eT2>::apply(B.at(row_B,i));\n            }\n          \n               if( (use_alpha == false) && (use_beta == false) )  { C.at(row_A,row_B) =       acc;                          }\n          else if( (use_alpha == true ) && (use_beta == false) )  { C.at(row_A,row_B) = alpha*acc;                          }\n          else if( (use_alpha == false) && (use_beta == true ) )  { C.at(row_A,row_B) =       acc + beta*C.at(row_A,row_B); }\n          else if( (use_alpha == true ) && (use_beta == true ) )  { C.at(row_A,row_B) = alpha*acc + beta*C.at(row_A,row_B); }\n          }\n        }\n      }\n    else\n    if( (do_trans_A == true) && (do_trans_B == true) )\n      {\n      for(uword row_B=0; row_B < B_n_rows; ++row_B)\n        {\n        \n        for(uword col_A=0; col_A < A_n_cols; ++col_A)\n          {\n          const in_eT1* A_coldata = A.colptr(col_A);\n          \n          out_eT acc = out_eT(0);\n          for(uword i=0; i < A_n_rows; ++i)\n            {\n            acc += upgrade_val<in_eT1,in_eT2>::apply(B.at(row_B,i)) * upgrade_val<in_eT1,in_eT2>::apply(A_coldata[i]);\n            }\n        \n               if( (use_alpha == false) && (use_beta == false) )  { C.at(col_A,row_B) =       acc;                          }\n          else if( (use_alpha == true ) && (use_beta == false) )  { C.at(col_A,row_B) = alpha*acc;                          }\n          else if( (use_alpha == false) && (use_beta == true ) )  { C.at(col_A,row_B) =       acc + beta*C.at(col_A,row_B); }\n          else if( (use_alpha == true ) && (use_beta == true ) )  { C.at(col_A,row_B) = alpha*acc + beta*C.at(col_A,row_B); }\n          }\n        }\n      \n      }\n    }\n    \n  };\n\n\n\n\n\n//! \\brief\n//! Matrix multplication where the matrices have differing element types.\n\ntemplate<const bool do_trans_A=false, const bool do_trans_B=false, const bool use_alpha=false, const bool use_beta=false>\nclass gemm_mixed\n  {\n  public:\n  \n  //! immediate multiplication of matrices A and B, storing the result in C\n  template<typename out_eT, typename in_eT1, typename in_eT2>\n  inline\n  static\n  void\n  apply\n    (\n          Mat<out_eT>& C,\n    const Mat<in_eT1>& A,\n    const Mat<in_eT2>& B,\n    const out_eT       alpha = out_eT(1),\n    const out_eT       beta  = out_eT(0)\n    )\n    {\n    arma_extra_debug_sigprint();\n    \n    Mat<in_eT1> tmp_A;\n    Mat<in_eT2> tmp_B;\n    \n    const bool predo_trans_A = ( (do_trans_A == true) && (is_cx<in_eT1>::yes) );\n    const bool predo_trans_B = ( (do_trans_B == true) && (is_cx<in_eT2>::yes) );\n    \n    if(do_trans_A)\n      {\n      op_htrans::apply_mat_noalias(tmp_A, A);\n      }\n    \n    if(do_trans_B)\n      {\n      op_htrans::apply_mat_noalias(tmp_B, B);\n      }\n     \n    const Mat<in_eT1>& AA = (predo_trans_A == false) ? A : tmp_A;\n    const Mat<in_eT2>& BB = (predo_trans_B == false) ? B : tmp_B;\n    \n    if( (AA.n_elem <= 64u) && (BB.n_elem <= 64u) )\n      {\n      gemm_mixed_small<((predo_trans_A) ? false : do_trans_A), ((predo_trans_B) ? false : do_trans_B), use_alpha, use_beta>::apply(C, AA, BB, alpha, beta);\n      }\n    else\n      {\n      gemm_mixed_large<((predo_trans_A) ? false : do_trans_A), ((predo_trans_B) ? false : do_trans_B), use_alpha, use_beta>::apply(C, AA, BB, alpha, beta);\n      }\n    }\n  \n  \n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/mul_gemv.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup gemv\n//! @{\n\n\n\n//! for tiny square matrices, size <= 4x4\ntemplate<const bool do_trans_A=false, const bool use_alpha=false, const bool use_beta=false>\nclass gemv_emul_tinysq\n  {\n  public:\n  \n  \n  template<const uword row, const uword col>\n  struct pos\n    {\n    static const uword n2 = (do_trans_A == false) ? (row + col*2) : (col + row*2);\n    static const uword n3 = (do_trans_A == false) ? (row + col*3) : (col + row*3);\n    static const uword n4 = (do_trans_A == false) ? (row + col*4) : (col + row*4);\n    };\n  \n  \n  \n  template<typename eT, const uword i>\n  arma_hot\n  arma_inline\n  static\n  void\n  assign(eT* y, const eT acc, const eT alpha, const eT beta)\n    {\n    if(use_beta == false)\n      {\n      y[i] = (use_alpha == false) ? acc : alpha*acc;\n      }\n    else\n      {\n      const eT tmp = y[i];\n      \n      y[i] = beta*tmp + ( (use_alpha == false) ? acc : alpha*acc );\n      }\n    }\n  \n  \n\n  template<typename eT, typename TA>\n  arma_hot\n  inline\n  static\n  void\n  apply( eT* y, const TA& A, const eT* x, const eT alpha = eT(1), const eT beta = eT(0) )\n    {\n    arma_extra_debug_sigprint();\n    \n    const eT*  Am = A.memptr();\n    \n    switch(A.n_rows)\n      {\n      case 1:\n        {\n        const eT acc = Am[0] * x[0];\n        \n        assign<eT, 0>(y, acc, alpha, beta);\n        }\n        break;\n      \n      \n      case 2:\n        {\n        const eT x0 = x[0];\n        const eT x1 = x[1];\n        \n        const eT acc0 = Am[pos<0,0>::n2]*x0 + Am[pos<0,1>::n2]*x1;\n        const eT acc1 = Am[pos<1,0>::n2]*x0 + Am[pos<1,1>::n2]*x1;\n        \n        assign<eT, 0>(y, acc0, alpha, beta);\n        assign<eT, 1>(y, acc1, alpha, beta);\n        }\n        break;\n      \n        \n      case 3:\n        {\n        const eT x0 = x[0];\n        const eT x1 = x[1];\n        const eT x2 = x[2];\n        \n        const eT acc0 = Am[pos<0,0>::n3]*x0 + Am[pos<0,1>::n3]*x1 + Am[pos<0,2>::n3]*x2;\n        const eT acc1 = Am[pos<1,0>::n3]*x0 + Am[pos<1,1>::n3]*x1 + Am[pos<1,2>::n3]*x2;\n        const eT acc2 = Am[pos<2,0>::n3]*x0 + Am[pos<2,1>::n3]*x1 + Am[pos<2,2>::n3]*x2;\n        \n        assign<eT, 0>(y, acc0, alpha, beta);\n        assign<eT, 1>(y, acc1, alpha, beta);\n        assign<eT, 2>(y, acc2, alpha, beta);\n        }\n        break;\n      \n      \n      case 4:\n        {\n        const eT x0 = x[0];\n        const eT x1 = x[1];\n        const eT x2 = x[2];\n        const eT x3 = x[3];\n        \n        const eT acc0 = Am[pos<0,0>::n4]*x0 + Am[pos<0,1>::n4]*x1 + Am[pos<0,2>::n4]*x2 + Am[pos<0,3>::n4]*x3;\n        const eT acc1 = Am[pos<1,0>::n4]*x0 + Am[pos<1,1>::n4]*x1 + Am[pos<1,2>::n4]*x2 + Am[pos<1,3>::n4]*x3;\n        const eT acc2 = Am[pos<2,0>::n4]*x0 + Am[pos<2,1>::n4]*x1 + Am[pos<2,2>::n4]*x2 + Am[pos<2,3>::n4]*x3;\n        const eT acc3 = Am[pos<3,0>::n4]*x0 + Am[pos<3,1>::n4]*x1 + Am[pos<3,2>::n4]*x2 + Am[pos<3,3>::n4]*x3;\n        \n        assign<eT, 0>(y, acc0, alpha, beta);\n        assign<eT, 1>(y, acc1, alpha, beta);\n        assign<eT, 2>(y, acc2, alpha, beta);\n        assign<eT, 3>(y, acc3, alpha, beta);\n        }\n        break;\n      \n      \n      default:\n        ;\n      }\n    }\n    \n  };\n\n\n\nclass gemv_emul_helper\n  {\n  public:\n  \n  template<typename eT, typename TA>\n  arma_hot\n  inline\n  static\n  typename arma_not_cx<eT>::result\n  dot_row_col( const TA& A, const eT* x, const uword row, const uword N )\n    {\n    eT acc1 = eT(0);\n    eT acc2 = eT(0);\n    \n    uword i,j;\n    for(i=0, j=1; j < N; i+=2, j+=2)\n      {\n      const eT xi = x[i];\n      const eT xj = x[j];\n      \n      acc1 += A.at(row,i) * xi;\n      acc2 += A.at(row,j) * xj;\n      }\n    \n    if(i < N)\n      {\n      acc1 += A.at(row,i) * x[i];\n      }\n    \n    return (acc1 + acc2);\n    }\n  \n  \n  \n  template<typename eT, typename TA>\n  arma_hot\n  inline\n  static\n  typename arma_cx_only<eT>::result\n  dot_row_col( const TA& A, const eT* x, const uword row, const uword N )\n    {\n    typedef typename get_pod_type<eT>::result T;\n    \n    T val_real = T(0);\n    T val_imag = T(0);\n    \n    for(uword i=0; i<N; ++i)\n      {\n      const std::complex<T>& Ai = A.at(row,i);\n      const std::complex<T>& xi = x[i];\n      \n      const T a = Ai.real();\n      const T b = Ai.imag();\n      \n      const T c = xi.real();\n      const T d = xi.imag();\n      \n      val_real += (a*c) - (b*d);\n      val_imag += (a*d) + (b*c);\n      }\n    \n    return std::complex<T>(val_real, val_imag);\n    }\n  \n  };\n\n\n\n//! \\brief\n//! Partial emulation of ATLAS/BLAS gemv().\n//! 'y' is assumed to have been set to the correct size (i.e. taking into account the transpose)\n\ntemplate<const bool do_trans_A=false, const bool use_alpha=false, const bool use_beta=false>\nclass gemv_emul\n  {\n  public:\n  \n  template<typename eT, typename TA>\n  arma_hot\n  inline\n  static\n  void\n  apply( eT* y, const TA& A, const eT* x, const eT alpha = eT(1), const eT beta = eT(0) )\n    {\n    arma_extra_debug_sigprint();\n    \n    const uword A_n_rows = A.n_rows;\n    const uword A_n_cols = A.n_cols;\n    \n    if(do_trans_A == false)\n      {\n      if(A_n_rows == 1)\n        {\n        const eT acc = op_dot::direct_dot_arma(A_n_cols, A.memptr(), x);\n        \n             if( (use_alpha == false) && (use_beta == false) )  { y[0] =       acc;             }\n        else if( (use_alpha == true ) && (use_beta == false) )  { y[0] = alpha*acc;             }\n        else if( (use_alpha == false) && (use_beta == true ) )  { y[0] =       acc + beta*y[0]; }\n        else if( (use_alpha == true ) && (use_beta == true ) )  { y[0] = alpha*acc + beta*y[0]; }\n        }\n      else\n      for(uword row=0; row < A_n_rows; ++row)\n        {\n        const eT acc = gemv_emul_helper::dot_row_col(A, x, row, A_n_cols);\n        \n             if( (use_alpha == false) && (use_beta == false) )  { y[row] =       acc;               }\n        else if( (use_alpha == true ) && (use_beta == false) )  { y[row] = alpha*acc;               }\n        else if( (use_alpha == false) && (use_beta == true ) )  { y[row] =       acc + beta*y[row]; }\n        else if( (use_alpha == true ) && (use_beta == true ) )  { y[row] = alpha*acc + beta*y[row]; }\n        }\n      }\n    else\n    if(do_trans_A == true)\n      {\n      if(is_cx<eT>::no)\n        {\n        for(uword col=0; col < A_n_cols; ++col)\n          {\n          // col is interpreted as row when storing the results in 'y'\n          \n          \n          // const eT* A_coldata = A.colptr(col);\n          // \n          // eT acc = eT(0);\n          // for(uword row=0; row < A_n_rows; ++row)\n          //   {\n          //   acc += A_coldata[row] * x[row];\n          //   }\n          \n          const eT acc = op_dot::direct_dot_arma(A_n_rows, A.colptr(col), x);\n          \n               if( (use_alpha == false) && (use_beta == false) )  { y[col] =       acc;               }\n          else if( (use_alpha == true ) && (use_beta == false) )  { y[col] = alpha*acc;               }\n          else if( (use_alpha == false) && (use_beta == true ) )  { y[col] =       acc + beta*y[col]; }\n          else if( (use_alpha == true ) && (use_beta == true ) )  { y[col] = alpha*acc + beta*y[col]; }\n          }\n        }\n      else\n        {\n        Mat<eT> AA;\n        \n        op_htrans::apply_mat_noalias(AA, A);\n        \n        gemv_emul<false, use_alpha, use_beta>::apply(y, AA, x, alpha, beta);\n        }\n      }\n    }\n  \n  };\n\n\n\n//! \\brief\n//! Wrapper for ATLAS/BLAS gemv function, using template arguments to control the arguments passed to gemv.\n//! 'y' is assumed to have been set to the correct size (i.e. taking into account the transpose)\n\ntemplate<const bool do_trans_A=false, const bool use_alpha=false, const bool use_beta=false>\nclass gemv\n  {\n  public:\n  \n  template<typename eT, typename TA>\n  inline\n  static\n  void\n  apply_blas_type( eT* y, const TA& A, const eT* x, const eT alpha = eT(1), const eT beta = eT(0) )\n    {\n    arma_extra_debug_sigprint();\n    \n    if( (A.n_rows <= 4) && (A.n_rows == A.n_cols) && (is_cx<eT>::no) )\n      {\n      gemv_emul_tinysq<do_trans_A, use_alpha, use_beta>::apply(y, A, x, alpha, beta);\n      }\n    else\n      {\n      #if defined(ARMA_USE_ATLAS)\n        {\n        arma_debug_assert_atlas_size(A);\n        \n        if(is_cx<eT>::no)\n          {\n          // use gemm() instead of gemv() to work around a speed issue in Atlas 3.8.4\n          \n          arma_extra_debug_print(\"atlas::cblas_gemm()\");\n          \n          atlas::cblas_gemm<eT>\n            (\n            atlas::CblasColMajor,\n            (do_trans_A) ? ( is_cx<eT>::yes ? CblasConjTrans : atlas::CblasTrans ) : atlas::CblasNoTrans,\n            atlas::CblasNoTrans,\n            (do_trans_A) ? A.n_cols : A.n_rows,\n            1,\n            (do_trans_A) ? A.n_rows : A.n_cols,\n            (use_alpha) ? alpha : eT(1),\n            A.mem,\n            A.n_rows,\n            x,\n            (do_trans_A) ? A.n_rows : A.n_cols,\n            (use_beta) ? beta : eT(0),\n            y,\n            (do_trans_A) ? A.n_cols : A.n_rows\n            );\n          }\n        else\n          {\n          arma_extra_debug_print(\"atlas::cblas_gemv()\");\n          \n          atlas::cblas_gemv<eT>\n            (\n            atlas::CblasColMajor,\n            (do_trans_A) ? ( is_cx<eT>::yes ? CblasConjTrans : atlas::CblasTrans ) : atlas::CblasNoTrans,\n            A.n_rows,\n            A.n_cols,\n            (use_alpha) ? alpha : eT(1),\n            A.mem,\n            A.n_rows,\n            x,\n            1,\n            (use_beta) ? beta : eT(0),\n            y,\n            1\n            );\n          }\n        }\n      #elif defined(ARMA_USE_BLAS)\n        {\n        arma_extra_debug_print(\"blas::gemv()\");\n        \n        arma_debug_assert_blas_size(A);\n        \n        const char      trans_A     = (do_trans_A) ? ( is_cx<eT>::yes ? 'C' : 'T' ) : 'N';\n        const blas_int  m           = A.n_rows;\n        const blas_int  n           = A.n_cols;\n        const eT        local_alpha = (use_alpha) ? alpha : eT(1);\n        //const blas_int  lda         = A.n_rows;\n        const blas_int  inc         = 1;\n        const eT        local_beta  = (use_beta) ? beta : eT(0);\n        \n        arma_extra_debug_print( arma_boost::format(\"blas::gemv(): trans_A = %c\") % trans_A );\n        \n        blas::gemv<eT>\n          (\n          &trans_A,\n          &m,\n          &n,\n          &local_alpha,\n          A.mem,\n          &m,  // lda\n          x,\n          &inc,\n          &local_beta,\n          y,\n          &inc\n          );\n        }\n      #else\n        {\n        gemv_emul<do_trans_A, use_alpha, use_beta>::apply(y,A,x,alpha,beta);\n        }\n      #endif\n      }\n    \n    }\n  \n  \n  \n  template<typename eT, typename TA>\n  arma_inline\n  static\n  void\n  apply( eT* y, const TA& A, const eT* x, const eT alpha = eT(1), const eT beta = eT(0) )\n    {\n    gemv_emul<do_trans_A, use_alpha, use_beta>::apply(y,A,x,alpha,beta);\n    }\n  \n  \n  \n  template<typename TA>\n  arma_inline\n  static\n  void\n  apply\n    (\n          float* y,\n    const TA&    A,\n    const float* x,\n    const float  alpha = float(1),\n    const float  beta  = float(0)\n    )\n    {\n    gemv<do_trans_A, use_alpha, use_beta>::apply_blas_type(y,A,x,alpha,beta);\n    }\n  \n  \n  \n  template<typename TA>\n  arma_inline\n  static\n  void\n  apply\n    (\n          double* y,\n    const TA&     A,\n    const double* x,\n    const double  alpha = double(1),\n    const double  beta  = double(0)\n    )\n    {\n    gemv<do_trans_A, use_alpha, use_beta>::apply_blas_type(y,A,x,alpha,beta);\n    }\n  \n  \n  \n  template<typename TA>\n  arma_inline\n  static\n  void\n  apply\n    (\n          std::complex<float>* y,\n    const TA&                  A,\n    const std::complex<float>* x,\n    const std::complex<float>  alpha = std::complex<float>(1),\n    const std::complex<float>  beta  = std::complex<float>(0)\n    )\n    {\n    gemv<do_trans_A, use_alpha, use_beta>::apply_blas_type(y,A,x,alpha,beta);\n    }\n\n\n  \n  template<typename TA>\n  arma_inline\n  static\n  void\n  apply\n    (\n          std::complex<double>* y,\n    const TA&                   A,\n    const std::complex<double>* x,\n    const std::complex<double>  alpha = std::complex<double>(1),\n    const std::complex<double>  beta  = std::complex<double>(0)\n    )\n    {\n    gemv<do_trans_A, use_alpha, use_beta>::apply_blas_type(y,A,x,alpha,beta);\n    }\n\n\n  \n  };\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/mul_herk.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup herk\n//! @{\n\n\n\nclass herk_helper\n  {\n  public:\n  \n  template<typename eT>\n  inline\n  static\n  void\n  inplace_conj_copy_upper_tri_to_lower_tri(Mat<eT>& C)\n    {\n    // under the assumption that C is a square matrix\n    \n    const uword N = C.n_rows;\n    \n    for(uword k=0; k < N; ++k)\n      {\n      eT* colmem = C.colptr(k);\n      \n      for(uword i=(k+1); i < N; ++i)\n        {\n        colmem[i] = std::conj( C.at(k,i) );\n        }\n      }\n    }\n  \n  \n  template<typename eT>\n  static\n  arma_hot\n  arma_pure\n  inline\n  eT\n  dot_conj_row(const uword n_elem, const eT* const A, const Mat<eT>& B, const uword row)\n    {\n    arma_extra_debug_sigprint();\n    \n    typedef typename get_pod_type<eT>::result T;\n    \n    T val_real = T(0);\n    T val_imag = T(0);\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      const std::complex<T>& X = A[i];\n      const std::complex<T>& Y = B.at(row,i);\n      \n      const T a = X.real();\n      const T b = X.imag();\n      \n      const T c = Y.real();\n      const T d = Y.imag();\n      \n      val_real += (a*c) + (b*d);\n      val_imag += (b*c) - (a*d);\n      }\n    \n    return std::complex<T>(val_real, val_imag);\n    }\n  \n  };\n\n\n\ntemplate<const bool do_trans_A=false, const bool use_alpha=false, const bool use_beta=false>\nclass herk_vec\n  {\n  public:\n  \n  template<typename T, typename TA>\n  arma_hot\n  inline\n  static\n  void\n  apply\n    (\n          Mat< std::complex<T> >& C,\n    const TA&                     A,\n    const T                       alpha = T(1),\n    const T                       beta  = T(0)\n    )\n    {\n    arma_extra_debug_sigprint();\n    \n    typedef std::complex<T> eT;\n    \n    const uword A_n_rows = A.n_rows;\n    const uword A_n_cols = A.n_cols;\n    \n    // for beta != 0, C is assumed to be hermitian\n    \n    // do_trans_A == false  ->   C = alpha * A   * A^H + beta*C\n    // do_trans_A == true   ->   C = alpha * A^H * A   + beta*C\n    \n    const eT* A_mem = A.memptr();\n    \n    if(do_trans_A == false)\n      {\n      if(A_n_rows == 1)\n        {\n        const eT acc = op_cdot::direct_cdot(A_n_cols, A_mem, A_mem);\n        \n             if( (use_alpha == false) && (use_beta == false) )  { C[0] =       acc;             }\n        else if( (use_alpha == true ) && (use_beta == false) )  { C[0] = alpha*acc;             }\n        else if( (use_alpha == false) && (use_beta == true ) )  { C[0] =       acc + beta*C[0]; }\n        else if( (use_alpha == true ) && (use_beta == true ) )  { C[0] = alpha*acc + beta*C[0]; }\n        }\n      else\n      for(uword row_A=0; row_A < A_n_rows; ++row_A)\n        {\n        const eT& A_rowdata = A_mem[row_A];\n        \n        for(uword k=row_A; k < A_n_rows; ++k)\n          {\n          const eT acc = A_rowdata * std::conj( A_mem[k] );\n          \n          if( (use_alpha == false) && (use_beta == false) )\n            {\n                              C.at(row_A, k) = acc;\n            if(row_A != k)  { C.at(k, row_A) = std::conj(acc); }\n            }\n          else\n          if( (use_alpha == true) && (use_beta == false) )\n            {\n            const eT val = alpha*acc;\n            \n                              C.at(row_A, k) = val;\n            if(row_A != k)  { C.at(k, row_A) = std::conj(val); }\n            }\n          else\n          if( (use_alpha == false) && (use_beta == true) )\n            {\n                              C.at(row_A, k) =           acc  + beta*C.at(row_A, k);\n            if(row_A != k)  { C.at(k, row_A) = std::conj(acc) + beta*C.at(k, row_A); }\n            }\n          else\n          if( (use_alpha == true) && (use_beta == true) )\n            {\n            const eT val = alpha*acc;\n            \n                              C.at(row_A, k) =           val  + beta*C.at(row_A, k);\n            if(row_A != k)  { C.at(k, row_A) = std::conj(val) + beta*C.at(k, row_A); }\n            }\n          }\n        }\n      }\n    else\n    if(do_trans_A == true)\n      {\n      if(A_n_cols == 1)\n        {\n        const eT acc = op_cdot::direct_cdot(A_n_rows, A_mem, A_mem);\n        \n             if( (use_alpha == false) && (use_beta == false) )  { C[0] =       acc;             }\n        else if( (use_alpha == true ) && (use_beta == false) )  { C[0] = alpha*acc;             }\n        else if( (use_alpha == false) && (use_beta == true ) )  { C[0] =       acc + beta*C[0]; }\n        else if( (use_alpha == true ) && (use_beta == true ) )  { C[0] = alpha*acc + beta*C[0]; }\n        }\n      else\n      for(uword col_A=0; col_A < A_n_cols; ++col_A)\n        {\n        // col_A is interpreted as row_A when storing the results in matrix C\n        \n        const eT A_coldata = std::conj( A_mem[col_A] );\n        \n        for(uword k=col_A; k < A_n_cols ; ++k)\n          {\n          const eT acc = A_coldata * A_mem[k];\n          \n          if( (use_alpha == false) && (use_beta == false) )\n            {\n                              C.at(col_A, k) = acc;\n            if(col_A != k)  { C.at(k, col_A) = std::conj(acc); }\n            }\n          else\n          if( (use_alpha == true ) && (use_beta == false) )\n            {\n            const eT val = alpha*acc;\n            \n                              C.at(col_A, k) = val;\n            if(col_A != k)  { C.at(k, col_A) = std::conj(val); }\n            }\n          else\n          if( (use_alpha == false) && (use_beta == true ) )\n            {\n                              C.at(col_A, k) =           acc  + beta*C.at(col_A, k);\n            if(col_A != k)  { C.at(k, col_A) = std::conj(acc) + beta*C.at(k, col_A); }\n            }\n          else\n          if( (use_alpha == true ) && (use_beta == true ) )\n            {\n            const eT val = alpha*acc;\n            \n                              C.at(col_A, k) =           val  + beta*C.at(col_A, k);\n            if(col_A != k)  { C.at(k, col_A) = std::conj(val) + beta*C.at(k, col_A); }\n            }\n          }\n        }\n      }\n    }\n  \n  };\n\n\n\ntemplate<const bool do_trans_A=false, const bool use_alpha=false, const bool use_beta=false>\nclass herk_emul\n  {\n  public:\n  \n  template<typename T, typename TA>\n  arma_hot\n  inline\n  static\n  void\n  apply\n    (\n          Mat< std::complex<T> >& C,\n    const TA&                     A,\n    const T                       alpha = T(1),\n    const T                       beta  = T(0)\n    )\n    {\n    arma_extra_debug_sigprint();\n    \n    typedef std::complex<T> eT;\n    \n    // do_trans_A == false  ->   C = alpha * A   * A^H + beta*C\n    // do_trans_A == true   ->   C = alpha * A^H * A   + beta*C\n    \n    if(do_trans_A == false)\n      {\n      Mat<eT> AA;\n      \n      op_htrans::apply_mat_noalias(AA, A);\n      \n      herk_emul<true, use_alpha, use_beta>::apply(C, AA, alpha, beta);\n      }\n    else\n    if(do_trans_A == true)\n      {\n      const uword A_n_rows = A.n_rows;\n      const uword A_n_cols = A.n_cols;\n      \n      for(uword col_A=0; col_A < A_n_cols; ++col_A)\n        {\n        // col_A is interpreted as row_A when storing the results in matrix C\n        \n        const eT* A_coldata = A.colptr(col_A);\n        \n        for(uword k=col_A; k < A_n_cols ; ++k)\n          {\n          const eT acc = op_cdot::direct_cdot(A_n_rows, A_coldata, A.colptr(k));\n          \n          if( (use_alpha == false) && (use_beta == false) )\n            {\n                              C.at(col_A, k) = acc;\n            if(col_A != k)  { C.at(k, col_A) = std::conj(acc); }\n            }\n          else\n          if( (use_alpha == true) && (use_beta == false) )\n            {\n            const eT val = alpha*acc;\n            \n                              C.at(col_A, k) = val;\n            if(col_A != k)  { C.at(k, col_A) = std::conj(val); }\n            }\n          else\n          if( (use_alpha == false) && (use_beta == true) )\n            {\n                              C.at(col_A, k) =           acc  + beta*C.at(col_A, k);\n            if(col_A != k)  { C.at(k, col_A) = std::conj(acc) + beta*C.at(k, col_A); }\n            }\n          else\n          if( (use_alpha == true) && (use_beta == true) )\n            {\n            const eT val = alpha*acc;\n            \n                              C.at(col_A, k) =           val  + beta*C.at(col_A, k);\n            if(col_A != k)  { C.at(k, col_A) = std::conj(val) + beta*C.at(k, col_A); }\n            }\n          }\n        }\n      }\n    }\n  \n  };\n\n\n\ntemplate<const bool do_trans_A=false, const bool use_alpha=false, const bool use_beta=false>\nclass herk\n  {\n  public:\n  \n  template<typename T, typename TA>\n  inline\n  static\n  void\n  apply_blas_type( Mat<std::complex<T> >& C, const TA& A, const T alpha = T(1), const T beta = T(0) )\n    {\n    arma_extra_debug_sigprint();\n    \n    const uword threshold = 16;\n    \n    if(A.is_vec())\n      {\n      // work around poor handling of vectors by herk() in ATLAS 3.8.4 and standard BLAS\n      \n      herk_vec<do_trans_A, use_alpha, use_beta>::apply(C,A,alpha,beta);\n      \n      return;\n      }\n    \n    \n    if( (A.n_elem <= threshold) )\n      {\n      herk_emul<do_trans_A, use_alpha, use_beta>::apply(C,A,alpha,beta);\n      }\n    else\n      {\n      #if defined(ARMA_USE_ATLAS)\n        {\n        if(use_beta == true)\n          {\n          typedef typename std::complex<T> eT;\n          \n          // use a temporary matrix, as we can't assume that matrix C is already symmetric\n          Mat<eT> D(C.n_rows, C.n_cols);\n          \n          herk<do_trans_A, use_alpha, false>::apply_blas_type(D,A,alpha);\n          \n          // NOTE: assuming beta=1; this is okay for now, as currently glue_times only uses beta=1\n          arrayops::inplace_plus(C.memptr(), D.memptr(), C.n_elem);\n          \n          return;\n          }\n        \n        atlas::cblas_herk<T>\n          (\n          atlas::CblasColMajor,\n          atlas::CblasUpper,\n          (do_trans_A) ? CblasConjTrans : atlas::CblasNoTrans,\n          C.n_cols,\n          (do_trans_A) ? A.n_rows : A.n_cols,\n          (use_alpha) ? alpha : T(1),\n          A.mem,\n          (do_trans_A) ? A.n_rows : C.n_cols,\n          (use_beta) ? beta : T(0),\n          C.memptr(),\n          C.n_cols\n          );\n        \n        herk_helper::inplace_conj_copy_upper_tri_to_lower_tri(C);\n        }\n      #elif defined(ARMA_USE_BLAS)\n        {\n        if(use_beta == true)\n          {\n          typedef typename std::complex<T> eT;\n          \n          // use a temporary matrix, as we can't assume that matrix C is already symmetric\n          Mat<eT> D(C.n_rows, C.n_cols);\n          \n          herk<do_trans_A, use_alpha, false>::apply_blas_type(D,A,alpha);\n          \n          // NOTE: assuming beta=1; this is okay for now, as currently glue_times only uses beta=1\n          arrayops::inplace_plus(C.memptr(), D.memptr(), C.n_elem);\n          \n          return;\n          }\n        \n        arma_extra_debug_print(\"blas::herk()\");\n        \n        const char uplo = 'U';\n        \n        const char trans_A = (do_trans_A) ? 'C' : 'N';\n        \n        const blas_int n = C.n_cols;\n        const blas_int k = (do_trans_A) ? A.n_rows : A.n_cols;\n        \n        const T local_alpha = (use_alpha) ? alpha : T(1);\n        const T local_beta  = (use_beta)  ? beta  : T(0);\n        \n        const blas_int lda = (do_trans_A) ? k : n;\n        \n        arma_extra_debug_print( arma_boost::format(\"blas::herk(): trans_A = %c\") % trans_A );\n        \n        blas::herk<T>\n          (\n          &uplo,\n          &trans_A,\n          &n,\n          &k,\n          &local_alpha,\n          A.mem,\n          &lda,\n          &local_beta,\n          C.memptr(),\n          &n // &ldc\n          );\n        \n        herk_helper::inplace_conj_copy_upper_tri_to_lower_tri(C);\n        }\n      #else\n        {\n        herk_emul<do_trans_A, use_alpha, use_beta>::apply(C,A,alpha,beta);\n        }\n      #endif\n      }\n    \n    }\n  \n  \n  \n  template<typename eT, typename TA>\n  inline\n  static\n  void\n  apply( Mat<eT>& C, const TA& A, const eT alpha = eT(1), const eT beta = eT(0), const typename arma_not_cx<eT>::result* junk = 0 )\n    {\n    arma_ignore(C);\n    arma_ignore(A);\n    arma_ignore(alpha);\n    arma_ignore(beta);\n    arma_ignore(junk);\n    \n    // herk() cannot be used by non-complex matrices\n    \n    return;\n    }\n  \n  \n  \n  template<typename TA>\n  arma_inline\n  static\n  void\n  apply\n    (\n          Mat< std::complex<float> >& C,\n    const TA&                         A,\n    const float                       alpha = float(1),\n    const float                       beta  = float(0)\n    )\n    {\n    herk<do_trans_A, use_alpha, use_beta>::apply_blas_type(C,A,alpha,beta);\n    }\n  \n  \n  \n  template<typename TA>\n  arma_inline\n  static\n  void\n  apply\n    (\n          Mat< std::complex<double> >& C,\n    const TA&                          A,\n    const double                       alpha = double(1),\n    const double                       beta  = double(0)\n    )\n    {\n    herk<do_trans_A, use_alpha, use_beta>::apply_blas_type(C,A,alpha,beta);\n    }\n  \n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/mul_syrk.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup syrk\n//! @{\n\n\n\nclass syrk_helper\n  {\n  public:\n  \n  template<typename eT>\n  inline\n  static\n  void\n  inplace_copy_upper_tri_to_lower_tri(Mat<eT>& C)\n    {\n    // under the assumption that C is a square matrix\n    \n    const uword N = C.n_rows;\n    \n    for(uword k=0; k < N; ++k)\n      {\n      eT* colmem = C.colptr(k);\n      \n      uword i, j;\n      for(i=(k+1), j=(k+2); j < N; i+=2, j+=2)\n        {\n        const eT tmp_i = C.at(k,i);\n        const eT tmp_j = C.at(k,j);\n        \n        colmem[i] = tmp_i;\n        colmem[j] = tmp_j;\n        }\n      \n      if(i < N)\n        {\n        colmem[i] = C.at(k,i);\n        }\n      }\n    }\n  };\n\n\n\n//! partial emulation of BLAS function syrk(), specialised for A being a vector\ntemplate<const bool do_trans_A=false, const bool use_alpha=false, const bool use_beta=false>\nclass syrk_vec\n  {\n  public:\n  \n  template<typename eT, typename TA>\n  arma_hot\n  inline\n  static\n  void\n  apply\n    (\n          Mat<eT>& C,\n    const TA&      A,\n    const eT       alpha = eT(1),\n    const eT       beta  = eT(0)\n    )\n    {\n    arma_extra_debug_sigprint();\n    \n    const uword A_n1 = (do_trans_A == false) ? A.n_rows : A.n_cols;\n    const uword A_n2 = (do_trans_A == false) ? A.n_cols : A.n_rows;\n    \n    const eT* A_mem = A.memptr();\n    \n    if(A_n1 == 1)\n      {\n      const eT acc1 = op_dot::direct_dot(A_n2, A_mem, A_mem);\n      \n           if( (use_alpha == false) && (use_beta == false) )  { C[0] =       acc1;             }\n      else if( (use_alpha == true ) && (use_beta == false) )  { C[0] = alpha*acc1;             }\n      else if( (use_alpha == false) && (use_beta == true ) )  { C[0] =       acc1 + beta*C[0]; }\n      else if( (use_alpha == true ) && (use_beta == true ) )  { C[0] = alpha*acc1 + beta*C[0]; }\n      }\n    else\n    for(uword k=0; k < A_n1; ++k)\n      {\n      const eT A_k = A_mem[k];\n      \n      uword i,j;\n      for(i=(k), j=(k+1); j < A_n1; i+=2, j+=2)\n        {\n        const eT acc1 = A_k * A_mem[i];\n        const eT acc2 = A_k * A_mem[j];\n        \n        if( (use_alpha == false) && (use_beta == false) )\n          {\n          C.at(k, i) = acc1;\n          C.at(k, j) = acc2;\n          \n          C.at(i, k) = acc1;\n          C.at(j, k) = acc2;\n          }\n        else\n        if( (use_alpha == true ) && (use_beta == false) )\n          {\n          const eT val1 = alpha*acc1;\n          const eT val2 = alpha*acc2;\n          \n          C.at(k, i) = val1;\n          C.at(k, j) = val2;\n          \n          C.at(i, k) = val1;\n          C.at(j, k) = val2;\n          }\n        else\n        if( (use_alpha == false) && (use_beta == true) )\n          {\n          C.at(k, i) = acc1 + beta*C.at(k, i);\n          C.at(k, j) = acc2 + beta*C.at(k, j);\n          \n          if(i != k) { C.at(i, k) = acc1 + beta*C.at(i, k); }\n                       C.at(j, k) = acc2 + beta*C.at(j, k);\n          }\n        else\n        if( (use_alpha == true ) && (use_beta == true) )\n          {\n          const eT val1 = alpha*acc1;\n          const eT val2 = alpha*acc2;\n          \n          C.at(k, i) = val1 + beta*C.at(k, i);\n          C.at(k, j) = val2 + beta*C.at(k, j);\n          \n          if(i != k)  { C.at(i, k) = val1 + beta*C.at(i, k); }\n                        C.at(j, k) = val2 + beta*C.at(j, k);\n          }\n        }\n      \n      if(i < A_n1)\n        {\n        const eT acc1 = A_k * A_mem[i];\n        \n        if( (use_alpha == false) && (use_beta == false) )\n          {\n          C.at(k, i) = acc1;\n          C.at(i, k) = acc1;\n          }\n        else\n        if( (use_alpha == true) && (use_beta == false) )\n          {\n          const eT val1 = alpha*acc1;\n          \n          C.at(k, i) = val1;\n          C.at(i, k) = val1;\n          }\n        else\n        if( (use_alpha == false) && (use_beta == true) )\n          {\n                        C.at(k, i) = acc1 + beta*C.at(k, i);\n          if(i != k)  { C.at(i, k) = acc1 + beta*C.at(i, k); }\n          }\n        else\n        if( (use_alpha == true) && (use_beta == true) )\n          {\n          const eT val1 = alpha*acc1;\n          \n                        C.at(k, i) = val1 + beta*C.at(k, i);\n          if(i != k)  { C.at(i, k) = val1 + beta*C.at(i, k); }\n          }\n        }\n      }\n    }\n  \n  };\n\n\n\n//! partial emulation of BLAS function syrk()\ntemplate<const bool do_trans_A=false, const bool use_alpha=false, const bool use_beta=false>\nclass syrk_emul\n  {\n  public:\n  \n  template<typename eT, typename TA>\n  arma_hot\n  inline\n  static\n  void\n  apply\n    (\n          Mat<eT>& C,\n    const TA&      A,\n    const eT       alpha = eT(1),\n    const eT       beta  = eT(0)\n    )\n    {\n    arma_extra_debug_sigprint();\n    \n    // do_trans_A == false  ->   C = alpha * A   * A^T + beta*C\n    // do_trans_A == true   ->   C = alpha * A^T * A   + beta*C\n    \n    if(do_trans_A == false)\n      {\n      Mat<eT> AA;\n      \n      op_strans::apply_mat_noalias(AA, A);\n      \n      syrk_emul<true, use_alpha, use_beta>::apply(C, AA, alpha, beta);\n      }\n    else\n    if(do_trans_A == true)\n      {\n      const uword A_n_rows = A.n_rows;\n      const uword A_n_cols = A.n_cols;\n      \n      for(uword col_A=0; col_A < A_n_cols; ++col_A)\n        {\n        // col_A is interpreted as row_A when storing the results in matrix C\n        \n        const eT* A_coldata = A.colptr(col_A);\n        \n        for(uword k=col_A; k < A_n_cols; ++k)\n          {\n          const eT acc = op_dot::direct_dot_arma(A_n_rows, A_coldata, A.colptr(k));\n          \n          if( (use_alpha == false) && (use_beta == false) )\n            {\n            C.at(col_A, k) = acc;\n            C.at(k, col_A) = acc;\n            }\n          else\n          if( (use_alpha == true ) && (use_beta == false) )\n            {\n            const eT val = alpha*acc;\n            \n            C.at(col_A, k) = val;\n            C.at(k, col_A) = val;\n            }\n          else\n          if( (use_alpha == false) && (use_beta == true ) )\n            {\n                              C.at(col_A, k) = acc + beta*C.at(col_A, k);\n            if(col_A != k)  { C.at(k, col_A) = acc + beta*C.at(k, col_A); }\n            }\n          else\n          if( (use_alpha == true ) && (use_beta == true ) )\n            {\n            const eT val = alpha*acc;\n            \n                              C.at(col_A, k) = val + beta*C.at(col_A, k);\n            if(col_A != k)  { C.at(k, col_A) = val + beta*C.at(k, col_A); }\n            }\n          }\n        }\n      }\n    }\n  \n  };\n\n\n\ntemplate<const bool do_trans_A=false, const bool use_alpha=false, const bool use_beta=false>\nclass syrk\n  {\n  public:\n  \n  template<typename eT, typename TA>\n  inline\n  static\n  void\n  apply_blas_type( Mat<eT>& C, const TA& A, const eT alpha = eT(1), const eT beta = eT(0) )\n    {\n    arma_extra_debug_sigprint();\n    \n    if(A.is_vec())\n      {\n      // work around poor handling of vectors by syrk() in ATLAS 3.8.4 and standard BLAS\n      \n      syrk_vec<do_trans_A, use_alpha, use_beta>::apply(C,A,alpha,beta);\n      \n      return;\n      }\n    \n    const uword threshold = (is_cx<eT>::yes ? 16u : 48u);\n    \n    if( A.n_elem <= threshold )\n      {\n      syrk_emul<do_trans_A, use_alpha, use_beta>::apply(C,A,alpha,beta);\n      }\n    else\n      {\n      #if defined(ARMA_USE_ATLAS)\n        {\n        if(use_beta == true)\n          {\n          // use a temporary matrix, as we can't assume that matrix C is already symmetric\n          Mat<eT> D(C.n_rows, C.n_cols);\n          \n          syrk<do_trans_A, use_alpha, false>::apply_blas_type(D,A,alpha);\n          \n          // NOTE: assuming beta=1; this is okay for now, as currently glue_times only uses beta=1\n          arrayops::inplace_plus(C.memptr(), D.memptr(), C.n_elem);\n          \n          return;\n          }\n        \n        atlas::cblas_syrk<eT>\n          (\n          atlas::CblasColMajor,\n          atlas::CblasUpper,\n          (do_trans_A) ? atlas::CblasTrans : atlas::CblasNoTrans,\n          C.n_cols,\n          (do_trans_A) ? A.n_rows : A.n_cols,\n          (use_alpha) ? alpha : eT(1),\n          A.mem,\n          (do_trans_A) ? A.n_rows : C.n_cols,\n          (use_beta) ? beta : eT(0),\n          C.memptr(),\n          C.n_cols\n          );\n        \n        syrk_helper::inplace_copy_upper_tri_to_lower_tri(C);\n        }\n      #elif defined(ARMA_USE_BLAS)\n        {\n        if(use_beta == true)\n          {\n          // use a temporary matrix, as we can't assume that matrix C is already symmetric\n          Mat<eT> D(C.n_rows, C.n_cols);\n          \n          syrk<do_trans_A, use_alpha, false>::apply_blas_type(D,A,alpha);\n          \n          // NOTE: assuming beta=1; this is okay for now, as currently glue_times only uses beta=1\n          arrayops::inplace_plus(C.memptr(), D.memptr(), C.n_elem);\n          \n          return;\n          }\n        \n        arma_extra_debug_print(\"blas::syrk()\");\n        \n        const char uplo = 'U';\n        \n        const char trans_A = (do_trans_A) ? 'T' : 'N';\n        \n        const blas_int n = C.n_cols;\n        const blas_int k = (do_trans_A) ? A.n_rows : A.n_cols;\n        \n        const eT local_alpha = (use_alpha) ? alpha : eT(1);\n        const eT local_beta  = (use_beta)  ? beta  : eT(0);\n        \n        const blas_int lda = (do_trans_A) ? k : n;\n        \n        arma_extra_debug_print( arma_boost::format(\"blas::syrk(): trans_A = %c\") % trans_A );\n        \n        blas::syrk<eT>\n          (\n          &uplo,\n          &trans_A,\n          &n,\n          &k,\n          &local_alpha,\n          A.mem,\n          &lda,\n          &local_beta,\n          C.memptr(),\n          &n // &ldc\n          );\n        \n        syrk_helper::inplace_copy_upper_tri_to_lower_tri(C);\n        }\n      #else\n        {\n        syrk_emul<do_trans_A, use_alpha, use_beta>::apply(C,A,alpha,beta);\n        }\n      #endif\n      }\n    }\n  \n  \n  \n  template<typename eT, typename TA>\n  inline\n  static\n  void\n  apply( Mat<eT>& C, const TA& A, const eT alpha = eT(1), const eT beta = eT(0) )\n    {\n    if(is_cx<eT>::no)\n      {\n      if(A.is_vec())\n        {\n        syrk_vec<do_trans_A, use_alpha, use_beta>::apply(C,A,alpha,beta);\n        }\n      else\n        {\n        syrk_emul<do_trans_A, use_alpha, use_beta>::apply(C,A,alpha,beta);\n        }\n      }\n    else\n      {\n      // handling of complex matrix by syrk_emul() is not yet implemented\n      return;\n      }\n    }\n  \n  \n  \n  template<typename TA>\n  arma_inline\n  static\n  void\n  apply\n    (\n          Mat<float>& C,\n    const TA&         A,\n    const float alpha = float(1),\n    const float beta  = float(0)\n    )\n    {\n    syrk<do_trans_A, use_alpha, use_beta>::apply_blas_type(C,A,alpha,beta);\n    }\n  \n  \n  \n  template<typename TA>\n  arma_inline\n  static\n  void\n  apply\n    (\n          Mat<double>& C,\n    const TA&          A,\n    const double alpha = double(1),\n    const double beta  = double(0)\n    )\n    {\n    syrk<do_trans_A, use_alpha, use_beta>::apply_blas_type(C,A,alpha,beta);\n    }\n  \n  \n  \n  template<typename TA>\n  arma_inline\n  static\n  void\n  apply\n    (\n          Mat< std::complex<float> >& C,\n    const TA&                         A,\n    const std::complex<float> alpha = std::complex<float>(1),\n    const std::complex<float> beta  = std::complex<float>(0)\n    )\n    {\n    arma_ignore(C);\n    arma_ignore(A);\n    arma_ignore(alpha);\n    arma_ignore(beta);\n    \n    // handling of complex matrix by syrk() is not yet implemented\n    return;\n    }\n  \n  \n  \n  template<typename TA>\n  arma_inline\n  static\n  void\n  apply\n    (\n          Mat< std::complex<double> >& C,\n    const TA&                          A,\n    const std::complex<double> alpha = std::complex<double>(1),\n    const std::complex<double> beta  = std::complex<double>(0)\n    )\n    {\n    arma_ignore(C);\n    arma_ignore(A);\n    arma_ignore(alpha);\n    arma_ignore(beta);\n    \n    // handling of complex matrix by syrk() is not yet implemented\n    return;\n    }\n  \n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_all_bones.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_all\n//! @{\n\n\n\nclass op_all\n  {\n  public:\n  \n  \n  template<typename T1>\n  static inline bool\n  all_vec_helper(const Base<typename T1::elem_type, T1>& X);\n  \n  \n  template<typename T1, typename op_type>\n  static inline bool\n  all_vec_helper\n    (\n    const mtOp<uword, T1, op_type>& X,\n    const typename arma_op_rel_only<op_type>::result           junk1 = 0,\n    const typename arma_not_cx<typename T1::elem_type>::result junk2 = 0\n    );\n  \n  \n  template<typename T1, typename T2, typename glue_type>\n  static inline bool\n  all_vec_helper\n    (\n    const mtGlue<uword, T1, T2, glue_type>& X,\n    const typename arma_glue_rel_only<glue_type>::result       junk1 = 0,\n    const typename arma_not_cx<typename T1::elem_type>::result junk2 = 0,\n    const typename arma_not_cx<typename T2::elem_type>::result junk3 = 0\n    );\n  \n  \n  template<typename T1>\n  static inline bool all_vec(T1& X);\n  \n  \n  template<typename T1>\n  static inline void apply_helper(Mat<uword>& out, const Proxy<T1>& P, const uword dim);\n  \n  \n  template<typename T1>\n  static inline void apply(Mat<uword>& out, const mtOp<uword, T1, op_all>& X);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_all_meat.hpp",
    "content": "// Copyright (C) 2013-2014 Conrad Sanderson\n// Copyright (C) 2013-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_all\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nbool\nop_all::all_vec_helper(const Base<typename T1::elem_type, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(X.get_ref());\n  \n  const uword n_elem = P.get_n_elem();\n  \n  uword count = 0;\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type Pea = P.get_ea();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      count += (Pea[i] != eT(0)) ? uword(1) : uword(0);\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      if(P.at(row,col) != eT(0))  { ++count; }\n      }\n    }\n  \n  // NOTE: for empty vectors it makes more sense to return false, but we need to return true for compatability with Octave\n  return (n_elem == count);\n  }\n\n\n\ntemplate<typename T1, typename op_type>\ninline\nbool\nop_all::all_vec_helper\n  (\n  const mtOp<uword, T1, op_type>& X,\n  const typename arma_op_rel_only<op_type>::result           junk1,\n  const typename arma_not_cx<typename T1::elem_type>::result junk2\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  typedef typename T1::elem_type eT;\n  \n  const eT val = X.aux;\n  \n  const Proxy<T1> P(X.m);\n  \n  const uword n_elem = P.get_n_elem();\n  \n  uword count = 0;\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type Pea = P.get_ea();\n    \n    for(uword i=0; i < n_elem; ++i)\n      {\n      const eT tmp = Pea[i];\n      \n           if(is_same_type<op_type, op_rel_lt_pre   >::yes)  { count += (val <  tmp) ? uword(1) : uword(0); }\n      else if(is_same_type<op_type, op_rel_lt_post  >::yes)  { count += (tmp <  val) ? uword(1) : uword(0); }\n      else if(is_same_type<op_type, op_rel_gt_pre   >::yes)  { count += (val >  tmp) ? uword(1) : uword(0); }\n      else if(is_same_type<op_type, op_rel_gt_post  >::yes)  { count += (tmp >  val) ? uword(1) : uword(0); }\n      else if(is_same_type<op_type, op_rel_lteq_pre >::yes)  { count += (val <= tmp) ? uword(1) : uword(0); }\n      else if(is_same_type<op_type, op_rel_lteq_post>::yes)  { count += (tmp <= val) ? uword(1) : uword(0); }\n      else if(is_same_type<op_type, op_rel_gteq_pre >::yes)  { count += (val >= tmp) ? uword(1) : uword(0); }\n      else if(is_same_type<op_type, op_rel_gteq_post>::yes)  { count += (tmp >= val) ? uword(1) : uword(0); }\n      else if(is_same_type<op_type, op_rel_eq       >::yes)  { count += (tmp == val) ? uword(1) : uword(0); }\n      else if(is_same_type<op_type, op_rel_noteq    >::yes)  { count += (tmp != val) ? uword(1) : uword(0); }\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      const eT tmp = P.at(row,col);\n      \n           if(is_same_type<op_type, op_rel_lt_pre   >::yes)  { if(val <  tmp) { ++count; } }\n      else if(is_same_type<op_type, op_rel_lt_post  >::yes)  { if(tmp <  val) { ++count; } }\n      else if(is_same_type<op_type, op_rel_gt_pre   >::yes)  { if(val >  tmp) { ++count; } }\n      else if(is_same_type<op_type, op_rel_gt_post  >::yes)  { if(tmp >  val) { ++count; } }\n      else if(is_same_type<op_type, op_rel_lteq_pre >::yes)  { if(val <= tmp) { ++count; } }\n      else if(is_same_type<op_type, op_rel_lteq_post>::yes)  { if(tmp <= val) { ++count; } }\n      else if(is_same_type<op_type, op_rel_gteq_pre >::yes)  { if(val >= tmp) { ++count; } }\n      else if(is_same_type<op_type, op_rel_gteq_post>::yes)  { if(tmp >= val) { ++count; } }\n      else if(is_same_type<op_type, op_rel_eq       >::yes)  { if(tmp == val) { ++count; } }\n      else if(is_same_type<op_type, op_rel_noteq    >::yes)  { if(tmp != val) { ++count; } }\n      }\n    }\n  \n  return (n_elem == count);\n  }\n\n\n\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nbool\nop_all::all_vec_helper\n  (\n  const mtGlue<uword, T1, T2, glue_type>& X,\n  const typename arma_glue_rel_only<glue_type>::result       junk1,\n  const typename arma_not_cx<typename T1::elem_type>::result junk2,\n  const typename arma_not_cx<typename T2::elem_type>::result junk3\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  arma_ignore(junk3);\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename Proxy<T1>::ea_type ea_type1;\n  typedef typename Proxy<T2>::ea_type ea_type2;\n  \n  const Proxy<T1> A(X.A);\n  const Proxy<T2> B(X.B);\n  \n  arma_debug_assert_same_size(A, B, \"relational operator\");\n  \n  const uword n_elem = A.get_n_elem();\n  \n  uword count = 0;\n  \n  const bool prefer_at_accessor = Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor;\n  \n  if(prefer_at_accessor == false)\n    {\n    ea_type1 PA = A.get_ea();\n    ea_type2 PB = B.get_ea();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      const eT1 tmp1 = PA[i];\n      const eT2 tmp2 = PB[i];\n      \n           if(is_same_type<glue_type, glue_rel_lt    >::yes)  { count += (tmp1 <  tmp2) ? uword(1) : uword(0); }\n      else if(is_same_type<glue_type, glue_rel_gt    >::yes)  { count += (tmp1 >  tmp2) ? uword(1) : uword(0); }\n      else if(is_same_type<glue_type, glue_rel_lteq  >::yes)  { count += (tmp1 <= tmp2) ? uword(1) : uword(0); }\n      else if(is_same_type<glue_type, glue_rel_gteq  >::yes)  { count += (tmp1 >= tmp2) ? uword(1) : uword(0); }\n      else if(is_same_type<glue_type, glue_rel_eq    >::yes)  { count += (tmp1 == tmp2) ? uword(1) : uword(0); }\n      else if(is_same_type<glue_type, glue_rel_noteq >::yes)  { count += (tmp1 != tmp2) ? uword(1) : uword(0); }\n      else if(is_same_type<glue_type, glue_rel_and   >::yes)  { count += (tmp1 && tmp2) ? uword(1) : uword(0); }\n      else if(is_same_type<glue_type, glue_rel_or    >::yes)  { count += (tmp1 || tmp2) ? uword(1) : uword(0); }\n      }\n    }\n  else\n    {\n    const uword n_rows = A.get_n_rows();\n    const uword n_cols = A.get_n_cols();\n    \n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      const eT1 tmp1 = A.at(row,col);\n      const eT2 tmp2 = B.at(row,col);\n      \n           if(is_same_type<glue_type, glue_rel_lt    >::yes)  { if(tmp1 <  tmp2) { ++count; } }\n      else if(is_same_type<glue_type, glue_rel_gt    >::yes)  { if(tmp1 >  tmp2) { ++count; } }\n      else if(is_same_type<glue_type, glue_rel_lteq  >::yes)  { if(tmp1 <= tmp2) { ++count; } }\n      else if(is_same_type<glue_type, glue_rel_gteq  >::yes)  { if(tmp1 >= tmp2) { ++count; } }\n      else if(is_same_type<glue_type, glue_rel_eq    >::yes)  { if(tmp1 == tmp2) { ++count; } }\n      else if(is_same_type<glue_type, glue_rel_noteq >::yes)  { if(tmp1 != tmp2) { ++count; } }\n      else if(is_same_type<glue_type, glue_rel_and   >::yes)  { if(tmp1 && tmp2) { ++count; } }\n      else if(is_same_type<glue_type, glue_rel_or    >::yes)  { if(tmp1 || tmp2) { ++count; } }\n      }\n    }\n  \n  return (n_elem == count);\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\nop_all::all_vec(T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return op_all::all_vec_helper(X);\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_all::apply_helper(Mat<uword>& out, const Proxy<T1>& P, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_rows = P.get_n_rows();\n  const uword n_cols = P.get_n_cols();\n  \n  typedef typename Proxy<T1>::elem_type eT;\n  \n  if(dim == 0)  // traverse rows (ie. process each column)\n    {\n    out.zeros(1, n_cols);\n    \n    if(out.n_elem == 0)  { return; }\n    \n    uword* out_mem = out.memptr();\n    \n    if(is_Mat<typename Proxy<T1>::stored_type>::value)\n      {\n      const unwrap<typename Proxy<T1>::stored_type> U(P.Q);\n      \n      for(uword col=0; col < n_cols; ++col)\n        {\n        const eT* colmem = U.M.colptr(col);\n        \n        uword count = 0;\n        \n        for(uword row=0; row < n_rows; ++row)\n          {\n          count += (colmem[row] != eT(0)) ? uword(1) : uword(0);\n          }\n        \n        out_mem[col] = (n_rows == count) ? uword(1) : uword(0); \n        }\n      }\n    else\n      {\n      for(uword col=0; col < n_cols; ++col)\n        {\n        uword count = 0;\n        \n        for(uword row=0; row < n_rows; ++row)\n          {\n          if(P.at(row,col) != eT(0))  { ++count; }\n          }\n        \n        out_mem[col] = (n_rows == count) ? uword(1) : uword(0); \n        }\n      }\n    }\n  else\n    {\n    out.zeros(n_rows, 1);\n    \n    uword* out_mem = out.memptr();\n    \n    // internal dual use of 'out': keep the counts for each row\n    \n    if(is_Mat<typename Proxy<T1>::stored_type>::value)\n      {\n      const unwrap<typename Proxy<T1>::stored_type> U(P.Q);\n      \n      for(uword col=0; col < n_cols; ++col)\n        {\n        const eT* colmem = U.M.colptr(col);\n        \n        for(uword row=0; row < n_rows; ++row)\n          {\n          out_mem[row] += (colmem[row] != eT(0)) ? uword(1) : uword(0);\n          }\n        }\n      }\n    else\n      {\n      for(uword col=0; col < n_cols; ++col)\n        {\n        for(uword row=0; row < n_rows; ++row)\n          {\n          if(P.at(row,col) != eT(0))  { ++out_mem[row]; }\n          }\n        }\n      }\n    \n    \n    // see what the counts tell us\n    \n    for(uword row=0; row < n_rows; ++row)\n      {\n      out_mem[row] = (n_cols == out_mem[row]) ? uword(1) : uword(0);\n      }\n    \n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_all::apply(Mat<uword>& out, const mtOp<uword, T1, op_all>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword dim = X.aux_uword_a;\n  \n  const Proxy<T1> P(X.m);\n  \n  if(P.is_alias(out) == false)\n    {\n    op_all::apply_helper(out, P, dim);\n    }\n  else\n    {\n    Mat<uword> out2;\n    \n    op_all::apply_helper(out2, P, dim);\n    \n    out.steal_mem(out2);\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_any_bones.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_any\n//! @{\n\n\n\nclass op_any\n  {\n  public:\n  \n  \n  template<typename T1>\n  static inline bool\n  any_vec_helper(const Base<typename T1::elem_type, T1>& X);\n  \n  \n  template<typename T1, typename op_type>\n  static inline bool\n  any_vec_helper\n    (\n    const mtOp<uword, T1, op_type>& X,\n    const typename arma_op_rel_only<op_type>::result           junk1 = 0,\n    const typename arma_not_cx<typename T1::elem_type>::result junk2 = 0\n    );\n  \n  \n  template<typename T1, typename T2, typename glue_type>\n  static inline bool\n  any_vec_helper\n    (\n    const mtGlue<uword, T1, T2, glue_type>& X,\n    const typename arma_glue_rel_only<glue_type>::result       junk1 = 0,\n    const typename arma_not_cx<typename T1::elem_type>::result junk2 = 0,\n    const typename arma_not_cx<typename T2::elem_type>::result junk3 = 0\n    );\n  \n  \n  template<typename T1>\n  static inline bool any_vec(T1& X);\n  \n  \n  template<typename T1>\n  static inline void apply_helper(Mat<uword>& out, const Proxy<T1>& P, const uword dim);\n  \n  \n  template<typename T1>\n  static inline void apply(Mat<uword>& out, const mtOp<uword, T1, op_any>& X);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_any_meat.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_any\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nbool\nop_any::any_vec_helper(const Base<typename T1::elem_type, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(X.get_ref());\n  \n  const uword n_elem = P.get_n_elem();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type Pea = P.get_ea();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      if(Pea[i] != eT(0))  { return true; }\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      if(P.at(row,col) != eT(0))  { return true; }\n      }\n    }\n  \n  return false;\n  }\n\n\n\ntemplate<typename T1, typename op_type>\ninline\nbool\nop_any::any_vec_helper\n  (\n  const mtOp<uword, T1, op_type>& X,\n  const typename arma_op_rel_only<op_type>::result           junk1,\n  const typename arma_not_cx<typename T1::elem_type>::result junk2\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  typedef typename T1::elem_type eT;\n  \n  const eT val = X.aux;\n  \n  const Proxy<T1> P(X.m);\n  \n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type Pea = P.get_ea();\n    \n    const uword n_elem = P.get_n_elem();\n  \n    for(uword i=0; i < n_elem; ++i)\n      {\n      const eT tmp = Pea[i];\n      \n           if(is_same_type<op_type, op_rel_lt_pre   >::yes)  { if(val <  tmp) { return true; } }\n      else if(is_same_type<op_type, op_rel_lt_post  >::yes)  { if(tmp <  val) { return true; } }\n      else if(is_same_type<op_type, op_rel_gt_pre   >::yes)  { if(val >  tmp) { return true; } }\n      else if(is_same_type<op_type, op_rel_gt_post  >::yes)  { if(tmp >  val) { return true; } }\n      else if(is_same_type<op_type, op_rel_lteq_pre >::yes)  { if(val <= tmp) { return true; } }\n      else if(is_same_type<op_type, op_rel_lteq_post>::yes)  { if(tmp <= val) { return true; } }\n      else if(is_same_type<op_type, op_rel_gteq_pre >::yes)  { if(val >= tmp) { return true; } }\n      else if(is_same_type<op_type, op_rel_gteq_post>::yes)  { if(tmp >= val) { return true; } }\n      else if(is_same_type<op_type, op_rel_eq       >::yes)  { if(tmp == val) { return true; } }\n      else if(is_same_type<op_type, op_rel_noteq    >::yes)  { if(tmp != val) { return true; } }\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      const eT tmp = P.at(row,col);\n      \n           if(is_same_type<op_type, op_rel_lt_pre   >::yes)  { if(val <  tmp) { return true; } }\n      else if(is_same_type<op_type, op_rel_lt_post  >::yes)  { if(tmp <  val) { return true; } }\n      else if(is_same_type<op_type, op_rel_gt_pre   >::yes)  { if(val >  tmp) { return true; } }\n      else if(is_same_type<op_type, op_rel_gt_post  >::yes)  { if(tmp >  val) { return true; } }\n      else if(is_same_type<op_type, op_rel_lteq_pre >::yes)  { if(val <= tmp) { return true; } }\n      else if(is_same_type<op_type, op_rel_lteq_post>::yes)  { if(tmp <= val) { return true; } }\n      else if(is_same_type<op_type, op_rel_gteq_pre >::yes)  { if(val >= tmp) { return true; } }\n      else if(is_same_type<op_type, op_rel_gteq_post>::yes)  { if(tmp >= val) { return true; } }\n      else if(is_same_type<op_type, op_rel_eq       >::yes)  { if(tmp == val) { return true; } }\n      else if(is_same_type<op_type, op_rel_noteq    >::yes)  { if(tmp != val) { return true; } }\n      }\n    }\n  \n  return false;\n  }\n\n\n\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nbool\nop_any::any_vec_helper\n  (\n  const mtGlue<uword, T1, T2, glue_type>& X,\n  const typename arma_glue_rel_only<glue_type>::result       junk1,\n  const typename arma_not_cx<typename T1::elem_type>::result junk2,\n  const typename arma_not_cx<typename T2::elem_type>::result junk3\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  arma_ignore(junk3);\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename Proxy<T1>::ea_type ea_type1;\n  typedef typename Proxy<T2>::ea_type ea_type2;\n  \n  const Proxy<T1> A(X.A);\n  const Proxy<T2> B(X.B);\n  \n  arma_debug_assert_same_size(A, B, \"relational operator\");\n  \n  const bool prefer_at_accessor = Proxy<T1>::prefer_at_accessor || Proxy<T2>::prefer_at_accessor;\n  \n  if(prefer_at_accessor == false)\n    {\n    ea_type1 PA = A.get_ea();\n    ea_type2 PB = B.get_ea();\n    \n    const uword n_elem = A.get_n_elem();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      const eT1 tmp1 = PA[i];\n      const eT2 tmp2 = PB[i];\n      \n           if(is_same_type<glue_type, glue_rel_lt    >::yes)  { if(tmp1 <  tmp2) { return true; } }\n      else if(is_same_type<glue_type, glue_rel_gt    >::yes)  { if(tmp1 >  tmp2) { return true; } }\n      else if(is_same_type<glue_type, glue_rel_lteq  >::yes)  { if(tmp1 <= tmp2) { return true; } }\n      else if(is_same_type<glue_type, glue_rel_gteq  >::yes)  { if(tmp1 >= tmp2) { return true; } }\n      else if(is_same_type<glue_type, glue_rel_eq    >::yes)  { if(tmp1 == tmp2) { return true; } }\n      else if(is_same_type<glue_type, glue_rel_noteq >::yes)  { if(tmp1 != tmp2) { return true; } }\n      else if(is_same_type<glue_type, glue_rel_and   >::yes)  { if(tmp1 && tmp2) { return true; } }\n      else if(is_same_type<glue_type, glue_rel_or    >::yes)  { if(tmp1 || tmp2) { return true; } }\n      }\n    }\n  else\n    {\n    const uword n_rows = A.get_n_rows();\n    const uword n_cols = A.get_n_cols();\n    \n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      const eT1 tmp1 = A.at(row,col);\n      const eT2 tmp2 = B.at(row,col);\n      \n           if(is_same_type<glue_type, glue_rel_lt    >::yes)  { if(tmp1 <  tmp2) { return true; } }\n      else if(is_same_type<glue_type, glue_rel_gt    >::yes)  { if(tmp1 >  tmp2) { return true; } }\n      else if(is_same_type<glue_type, glue_rel_lteq  >::yes)  { if(tmp1 <= tmp2) { return true; } }\n      else if(is_same_type<glue_type, glue_rel_gteq  >::yes)  { if(tmp1 >= tmp2) { return true; } }\n      else if(is_same_type<glue_type, glue_rel_eq    >::yes)  { if(tmp1 == tmp2) { return true; } }\n      else if(is_same_type<glue_type, glue_rel_noteq >::yes)  { if(tmp1 != tmp2) { return true; } }\n      else if(is_same_type<glue_type, glue_rel_and   >::yes)  { if(tmp1 && tmp2) { return true; } }\n      else if(is_same_type<glue_type, glue_rel_or    >::yes)  { if(tmp1 || tmp2) { return true; } }\n      }\n    }\n  \n  return false;\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\nop_any::any_vec(T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return op_any::any_vec_helper(X);\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_any::apply_helper(Mat<uword>& out, const Proxy<T1>& P, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_rows = P.get_n_rows();\n  const uword n_cols = P.get_n_cols();\n  \n  typedef typename Proxy<T1>::elem_type eT;\n  \n  if(dim == 0)  // traverse rows (ie. process each column)\n    {\n    out.zeros(1, n_cols);\n    \n    uword* out_mem = out.memptr();\n    \n    if(is_Mat<typename Proxy<T1>::stored_type>::value)\n      {\n      const unwrap<typename Proxy<T1>::stored_type> U(P.Q);\n      \n      for(uword col=0; col < n_cols; ++col)\n        {\n        const eT* colmem = U.M.colptr(col);\n        \n        for(uword row=0; row < n_rows; ++row)\n          {\n          if(colmem[row] != eT(0))  { out_mem[col] = uword(1); break; }\n          }\n        }\n      }\n    else\n      {\n      for(uword col=0; col < n_cols; ++col)\n        {\n        for(uword row=0; row < n_rows; ++row)\n          {\n          if(P.at(row,col) != eT(0))  { out_mem[col] = uword(1); break; }\n          }\n        }\n      }\n    }\n  else\n    {\n    out.zeros(n_rows, 1);\n    \n    uword* out_mem = out.memptr();\n    \n    if(is_Mat<typename Proxy<T1>::stored_type>::value)\n      {\n      const unwrap<typename Proxy<T1>::stored_type> U(P.Q);\n      \n      for(uword col=0; col < n_cols; ++col)\n        {\n        const eT* colmem = U.M.colptr(col);\n        \n        for(uword row=0; row < n_rows; ++row)\n          {\n          if(colmem[row] != eT(0))  { out_mem[row] = uword(1); }\n          }\n        }\n      }\n    else\n      {\n      for(uword col=0; col < n_cols; ++col)\n        {\n        for(uword row=0; row < n_rows; ++row)\n          {\n          if(P.at(row,col) != eT(0))  { out_mem[row] = uword(1); }\n          }\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_any::apply(Mat<uword>& out, const mtOp<uword, T1, op_any>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword dim = X.aux_uword_a;\n  \n  const Proxy<T1> P(X.m);\n  \n  if(P.is_alias(out) == false)\n    {\n    op_any::apply_helper(out, P, dim);\n    }\n  else\n    {\n    Mat<uword> out2;\n    \n    op_any::apply_helper(out2, P, dim);\n    \n    out.steal_mem(out2);\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_chol_bones.hpp",
    "content": "// Copyright (C) 2008-2010 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_chol\n//! @{\n\n\n\nclass op_chol\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_chol>& X);\n\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_chol_meat.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_chol\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_chol::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_chol>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool status = auxlib::chol(out, X.m, X.aux_uword_a);\n  \n  if(status == false)\n    {\n    out.reset();\n    arma_bad(\"chol(): failed to converge\");\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_clamp_bones.hpp",
    "content": "// Copyright (C) 2014 Conrad Sanderson\n// Copyright (C) 2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_clamp\n//! @{\n\n\n\nclass op_clamp\n  {\n  public:\n  \n  template<typename T1> inline static void apply(Mat<typename T1::elem_type>& out, const mtOp<typename T1::elem_type, T1, op_clamp>& in);\n  \n  template<typename T1> inline static void apply_noalias(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const typename T1::elem_type min_val, const typename T1::elem_type max_val);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_clamp_meat.hpp",
    "content": "// Copyright (C) 2014 Conrad Sanderson\n// Copyright (C) 2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_clamp\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_clamp::apply(Mat<typename T1::elem_type>& out, const mtOp<typename T1::elem_type, T1, op_clamp>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(in.m);\n  \n  if(P.is_alias(out) && (is_Mat<T1>::value == false))\n    {\n    Mat<eT> tmp;\n    \n    op_clamp::apply_noalias(tmp, P, in.aux, in.aux_out_eT);\n    \n    out.steal_mem(tmp);\n    }\n  else\n    {\n    op_clamp::apply_noalias(out, P, in.aux, in.aux_out_eT);\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_clamp::apply_noalias(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const typename T1::elem_type min_val, const typename T1::elem_type max_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword n_rows = P.get_n_rows();\n  const uword n_cols = P.get_n_cols();\n  \n  out.set_size(n_rows, n_cols);\n  \n  eT* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    const uword N = P.get_n_elem();\n    \n    typename Proxy<T1>::ea_type A = P.get_ea();\n    \n    uword i,j;\n    for(i=0, j=1; j<N; i+=2, j+=2)\n      {\n      eT val_i = A[i];\n      eT val_j = A[j];\n      \n           if(val_i < min_val)  { val_i = min_val; }\n      else if(val_i > max_val)  { val_i = max_val; }\n      \n           if(val_j < min_val)  { val_j = min_val; }\n      else if(val_j > max_val)  { val_j = max_val; }\n      \n      out_mem[i] = val_i;\n      out_mem[j] = val_j;\n      }\n    \n    if(i < N)\n      {\n      eT val_i = A[i];\n      \n           if(val_i < min_val)  { val_i = min_val; }\n      else if(val_i > max_val)  { val_i = max_val; }\n      \n      out_mem[i] = val_i;\n      }\n    }\n  else\n    {\n    for(uword col=0; col<n_cols; ++col)\n    for(uword row=0; row<n_rows; ++row)\n      {\n      eT val = P.at(row,col);\n      \n           if(val < min_val)  { val = min_val; }\n      else if(val > max_val)  { val = max_val; }\n      \n      (*out_mem) = val;  ++out_mem;\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_cor_bones.hpp",
    "content": "// Copyright (C) 2009-2010 Conrad Sanderson\n// Copyright (C) 2009-2010 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_cor\n//! @{\n\n\n\nclass op_cor\n  {\n  public:\n  \n  template<typename eT> inline static void direct_cor(Mat<eT>&                out, const Mat<eT>& X,                const uword norm_type);\n  template<typename  T> inline static void direct_cor(Mat< std::complex<T> >& out, const Mat< std::complex<T> >& X, const uword norm_type);\n  \n  template<typename T1> inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_cor>& in);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_cor_meat.hpp",
    "content": "// Copyright (C) 2009-2011 Conrad Sanderson\n// Copyright (C) 2009-2011 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_cor\n//! @{\n\n\n\ntemplate<typename eT>\ninline\nvoid\nop_cor::direct_cor(Mat<eT>& out, const Mat<eT>& A, const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(A.is_empty())\n    {\n    out.reset();\n    return;\n    }\n  \n  if(A.is_vec())\n    {\n    out.set_size(1,1);\n    out[0] = eT(1);\n    }\n  else\n    {\n    const uword N = A.n_rows;\n    const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N);\n\n    const Row<eT> acc = sum(A);\n    const Row<eT> sd  = stddev(A);\n\n    out = (trans(A) * A);\n    out -= (trans(acc) * acc)/eT(N);\n    out /= norm_val;\n    out /= trans(sd) * sd;\n    }\n  }\n\n\n\ntemplate<typename T>\ninline\nvoid\nop_cor::direct_cor(Mat< std::complex<T> >& out, const Mat< std::complex<T> >& A, const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n\n  typedef typename std::complex<T> eT;\n\n  if(A.is_empty())\n    {\n    out.reset();\n    return;\n    }\n  \n  if(A.is_vec())\n    {\n    out.set_size(1,1);\n    out[0] = eT(1);\n    }\n  else\n    {\n    const uword N = A.n_rows;\n    const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N);\n\n    const Row<eT> acc = sum(A);\n    const Row<T>  sd  = stddev(A);\n\n    out = trans(A) * A;               // out = strans(conj(A)) * A;\n    out -= (trans(acc) * acc)/eT(N);  // out -= (strans(conj(acc)) * acc)/eT(N);\n    out /= norm_val;\n\n    //out = out / (trans(sd) * sd);\n    out /= conv_to< Mat<eT> >::from(trans(sd) * sd);\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_cor::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_cor>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_check<T1> tmp(in.m, out);\n  const Mat<eT>& A     = tmp.M;\n  \n  const uword norm_type = in.aux_uword_a;\n  \n  op_cor::direct_cor(out, A, norm_type);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_cov_bones.hpp",
    "content": "// Copyright (C) 2009-2010 Conrad Sanderson\n// Copyright (C) 2009-2010 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_cov\n//! @{\n\n\n\nclass op_cov\n  {\n  public:\n  \n  template<typename eT> inline static void direct_cov(Mat<eT>&                out, const Mat<eT>& X,                const uword norm_type);\n  template<typename  T> inline static void direct_cov(Mat< std::complex<T> >& out, const Mat< std::complex<T> >& X, const uword norm_type);\n  \n  template<typename T1> inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_cov>& in);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_cov_meat.hpp",
    "content": "// Copyright (C) 2009-2011 Conrad Sanderson\n// Copyright (C) 2009-2011 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_cov\n//! @{\n\n\n\ntemplate<typename eT>\ninline\nvoid\nop_cov::direct_cov(Mat<eT>& out, const Mat<eT>& A, const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(A.is_vec())\n    {\n    if(A.n_rows == 1)\n      {\n      out = var(trans(A), norm_type);      \n      }\n    else\n      {\n      out = var(A, norm_type);\n      }\n    }\n  else\n    {\n    const uword N = A.n_rows;\n    const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N);\n\n    const Row<eT> acc = sum(A);\n\n    out = trans(A) * A;\n    out -= (trans(acc) * acc)/eT(N);\n    out /= norm_val;\n    }\n  }\n\n\n\ntemplate<typename T>\ninline\nvoid\nop_cov::direct_cov(Mat< std::complex<T> >& out, const Mat< std::complex<T> >& A, const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<T> eT;\n  \n  if(A.is_vec())\n    {\n    if(A.n_rows == 1)\n      {\n      const Mat<T> tmp_mat = var(trans(A), norm_type);\n      out.set_size(1,1);\n      out[0] = tmp_mat[0];\n      }\n    else\n      {\n      const Mat<T> tmp_mat = var(A, norm_type);\n      out.set_size(1,1);\n      out[0] = tmp_mat[0];\n      }\n    }\n  else\n    {\n    const uword N = A.n_rows;\n    const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N);\n    \n    const Row<eT> acc = sum(A);\n    \n    out = trans(A) * A;               // out = strans(conj(A)) * A;\n    out -= (trans(acc) * acc)/eT(N);  // out -= (strans(conj(acc)) * acc)/eT(N);\n    out /= norm_val;\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_cov::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_cov>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_check<T1> tmp(in.m, out);\n  const Mat<eT>& A     = tmp.M;\n  \n  const uword norm_type = in.aux_uword_a;\n  \n  op_cov::direct_cov(out, A, norm_type);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_cumsum_bones.hpp",
    "content": "// Copyright (C) 2010-2015 Conrad Sanderson\n// Copyright (C) 2010-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_cumsum\n//! @{\n\n\n\nclass op_cumsum_mat\n  {\n  public:\n  \n  template<typename eT>\n  inline static void apply_noalias(Mat<eT>& out, const Mat<eT>& X, const uword dim);\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_cumsum_mat>& in);\n  };\n\n\n\nclass op_cumsum_vec\n  {\n  public:\n  \n  template<typename eT>\n  inline static void apply_noalias(Mat<eT>& out, const Mat<eT>& X);\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_cumsum_vec>& in);\n  };\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_cumsum_meat.hpp",
    "content": "// Copyright (C) 2010-2015 Conrad Sanderson\n// Copyright (C) 2010-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_cumsum\n//! @{\n\n\ntemplate<typename eT>\ninline\nvoid\nop_cumsum_mat::apply_noalias(Mat<eT>& out, const Mat<eT>& X, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  out.copy_size(X);\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  if(dim == 0)\n    {\n    arma_extra_debug_print(\"op_cumsum_mat::apply(): dim = 0\");\n    \n    for(uword col=0; col<X_n_cols; ++col)\n      {\n            eT* out_colmem = out.colptr(col);\n      const eT* X_colmem   = X.colptr(col);\n      \n      eT acc = eT(0);\n      \n      for(uword row=0; row<X_n_rows; ++row)\n        {\n        acc += X_colmem[row];\n        \n        out_colmem[row] = acc;\n        }\n      }\n    }\n  else\n  if(dim == 1)\n    {\n    arma_extra_debug_print(\"op_cumsum_mat::apply(): dim = 1\");\n    \n    for(uword row=0; row<X_n_rows; ++row)\n      {\n      eT acc = eT(0);\n      \n      for(uword col=0; col<X_n_cols; ++col)\n        {\n        acc += X.at(row,col);\n        \n        out.at(row,col) = acc;\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_cumsum_mat::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_cumsum_mat>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1>   tmp(in.m);\n  const Mat<eT>& X = tmp.M;\n  \n  const uword dim = in.aux_uword_a;\n  arma_debug_check( (dim > 1), \"cumsum(): parameter 'dim' must be 0 or 1\" );\n  \n  if(&out == &X)\n    {\n    Mat<eT> out2;\n    \n    op_cumsum_mat::apply_noalias(out2, X, dim);\n    \n    out.steal_mem(out2);\n    }\n  else\n    {\n    op_cumsum_mat::apply_noalias(out, X, dim);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nop_cumsum_vec::apply_noalias(Mat<eT>& out, const Mat<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_elem = X.n_elem;\n  \n  out.copy_size(X);\n  \n        eT* out_mem = out.memptr();\n  const eT* X_mem   = X.memptr();\n  \n  eT acc = eT(0);\n  \n  for(uword i=0; i<n_elem; ++i)\n    {\n    acc += X_mem[i];\n    \n    out_mem[i] = acc;\n    }\n  }\n\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_cumsum_vec::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_cumsum_vec>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const quasi_unwrap<T1> U(in.m);\n  \n  const Mat<eT>& X = U.M;\n  \n  if(U.is_alias(out))\n    {\n    Mat<eT> out2;\n    \n    op_cumsum_vec::apply_noalias(out2, X);\n    \n    out.steal_mem(out2);\n    }\n  else\n    {\n    op_cumsum_vec::apply_noalias(out, X);\n    }\n  }\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_cx_scalar_bones.hpp",
    "content": "// Copyright (C) 2008-2010 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_cx_scalar\n//! @{\n\n\n\nclass op_cx_scalar_times\n  {\n  public:\n  \n  template<typename T1>\n  inline static void\n  apply\n    (\n          Mat< typename std::complex<typename T1::pod_type> >& out,\n    const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_times>& X\n    );\n  \n  template<typename T1>\n  inline static void\n  apply\n    (\n             Cube< typename std::complex<typename T1::pod_type> >& out,\n    const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_times>& X\n    );\n\n  };\n\n\n\nclass op_cx_scalar_plus\n  {\n  public:\n  \n  template<typename T1>\n  inline static void\n  apply\n    (\n          Mat< typename std::complex<typename T1::pod_type> >& out,\n    const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_plus>& X\n    );\n  \n  template<typename T1>\n  inline static void\n  apply\n    (\n             Cube< typename std::complex<typename T1::pod_type> >& out,\n    const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_plus>& X\n    );\n\n  };\n\n\n\nclass op_cx_scalar_minus_pre\n  {\n  public:\n  \n  template<typename T1>\n  inline static void\n  apply\n    (\n          Mat< typename std::complex<typename T1::pod_type> >& out,\n    const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_minus_pre>& X\n    );\n  \n  template<typename T1>\n  inline static void\n  apply\n    (\n             Cube< typename std::complex<typename T1::pod_type> >& out,\n    const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_minus_pre>& X\n    );\n\n  };\n\n\n\nclass op_cx_scalar_minus_post\n  {\n  public:\n  \n  template<typename T1>\n  inline static void\n  apply\n    (\n          Mat< typename std::complex<typename T1::pod_type> >& out,\n    const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_minus_post>& X\n    );\n  \n  template<typename T1>\n  inline static void\n  apply\n    (\n             Cube< typename std::complex<typename T1::pod_type> >& out,\n    const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_minus_post>& X\n    );\n\n  };\n\n\n\nclass op_cx_scalar_div_pre\n  {\n  public:\n  \n  template<typename T1>\n  inline static void\n  apply\n    (\n          Mat< typename std::complex<typename T1::pod_type> >& out,\n    const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_div_pre>& X\n    );\n  \n  template<typename T1>\n  inline static void\n  apply\n    (\n             Cube< typename std::complex<typename T1::pod_type> >& out,\n    const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_div_pre>& X\n    );\n\n  };\n\n\n\nclass op_cx_scalar_div_post\n  {\n  public:\n  \n  template<typename T1>\n  inline static void\n  apply\n    (\n          Mat< typename std::complex<typename T1::pod_type> >& out,\n    const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_div_post>& X\n    );\n  \n  template<typename T1>\n  inline static void\n  apply\n    (\n             Cube< typename std::complex<typename T1::pod_type> >& out,\n    const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_div_post>& X\n    );\n\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_cx_scalar_meat.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_cx_scalar\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_cx_scalar_times::apply\n  (\n        Mat< typename std::complex<typename T1::pod_type> >& out,\n  const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_times>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<typename T1::pod_type> eT;\n  \n  const Proxy<T1> A(X.m);\n  \n  const uword n_rows = A.get_n_rows();\n  const uword n_cols = A.get_n_cols();\n  \n  out.set_size(n_rows, n_cols);\n  \n  const eT  k       = X.aux_out_eT;\n        eT* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    const uword n_elem = A.get_n_elem();\n  \n    for(uword i=0; i<n_elem; ++i)\n      {\n      out_mem[i] = A[i] * k;\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      *out_mem = A.at(row,col) * k;  ++out_mem;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_cx_scalar_plus::apply\n  (\n        Mat< typename std::complex<typename T1::pod_type> >& out,\n  const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_plus>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<typename T1::pod_type> eT;\n  \n  const Proxy<T1> A(X.m);\n  \n  const uword n_rows = A.get_n_rows();\n  const uword n_cols = A.get_n_cols();\n  \n  out.set_size(n_rows, n_cols);\n  \n  const eT  k       = X.aux_out_eT;\n        eT* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    const uword n_elem = A.get_n_elem();\n  \n    for(uword i=0; i<n_elem; ++i)\n      {\n      out_mem[i] = A[i] + k;\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      *out_mem = A.at(row,col) + k;  ++out_mem;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_cx_scalar_minus_pre::apply\n  (\n        Mat< typename std::complex<typename T1::pod_type> >& out,\n  const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_minus_pre>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<typename T1::pod_type> eT;\n  \n  const Proxy<T1> A(X.m);\n  \n  const uword n_rows = A.get_n_rows();\n  const uword n_cols = A.get_n_cols();\n  \n  out.set_size(n_rows, n_cols);\n  \n  const eT  k       = X.aux_out_eT;\n        eT* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    const uword n_elem = A.get_n_elem();\n  \n    for(uword i=0; i<n_elem; ++i)\n      {\n      out_mem[i] = k - A[i];\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      *out_mem = k - A.at(row,col);  ++out_mem;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_cx_scalar_minus_post::apply\n  (\n        Mat< typename std::complex<typename T1::pod_type> >& out,\n  const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_minus_post>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<typename T1::pod_type> eT;\n  \n  const Proxy<T1> A(X.m);\n  \n  const uword n_rows = A.get_n_rows();\n  const uword n_cols = A.get_n_cols();\n  \n  out.set_size(n_rows, n_cols);\n  \n  const eT  k       = X.aux_out_eT;\n        eT* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    const uword n_elem = A.get_n_elem();\n  \n    for(uword i=0; i<n_elem; ++i)\n      {\n      out_mem[i] = A[i] - k;\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      *out_mem = A.at(row,col) - k;  ++out_mem;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_cx_scalar_div_pre::apply\n  (\n        Mat< typename std::complex<typename T1::pod_type> >& out,\n  const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_div_pre>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<typename T1::pod_type> eT;\n  \n  const Proxy<T1> A(X.m);\n  \n  const uword n_rows = A.get_n_rows();\n  const uword n_cols = A.get_n_cols();\n  \n  out.set_size(n_rows, n_cols);\n  \n  const eT  k       = X.aux_out_eT;\n        eT* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    const uword n_elem = A.get_n_elem();\n  \n    for(uword i=0; i<n_elem; ++i)\n      {\n      out_mem[i] = k / A[i];\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      *out_mem = k / A.at(row,col);  ++out_mem;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_cx_scalar_div_post::apply\n  (\n        Mat< typename std::complex<typename T1::pod_type> >& out,\n  const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_div_post>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<typename T1::pod_type> eT;\n  \n  const Proxy<T1> A(X.m);\n  \n  const uword n_rows = A.get_n_rows();\n  const uword n_cols = A.get_n_cols();\n  \n  out.set_size(n_rows, n_cols);\n  \n  const eT  k       = X.aux_out_eT;\n        eT* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    const uword n_elem = A.get_n_elem();\n  \n    for(uword i=0; i<n_elem; ++i)\n      {\n      out_mem[i] = A[i] / k;\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      *out_mem = A.at(row,col) / k;  ++out_mem;\n      }\n    }\n  }\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_cx_scalar_times::apply\n  (\n           Cube< typename std::complex<typename T1::pod_type> >& out,\n  const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_times>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<typename T1::pod_type> eT;\n  \n  const ProxyCube<T1> A(X.m);\n  \n  const uword n_rows   = A.get_n_rows();\n  const uword n_cols   = A.get_n_cols();\n  const uword n_slices = A.get_n_slices();\n  \n  out.set_size(n_rows, n_cols, n_slices);\n  \n  const eT    k       = X.aux_out_eT;\n  const uword n_elem  = out.n_elem;\n        eT*   out_mem = out.memptr();\n  \n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      out_mem[i] = A[i] * k;\n      }\n    }\n  else\n    {\n    for(uword slice = 0; slice < n_slices; ++slice)\n    for(uword col   = 0; col   < n_cols;   ++col  )\n    for(uword row   = 0; row   < n_rows;   ++row  )\n      {\n      *out_mem = A.at(row,col,slice) * k;  ++out_mem;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_cx_scalar_plus::apply\n  (\n           Cube< typename std::complex<typename T1::pod_type> >& out,\n  const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_plus>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<typename T1::pod_type> eT;\n  \n  const ProxyCube<T1> A(X.m);\n  \n  const uword n_rows   = A.get_n_rows();\n  const uword n_cols   = A.get_n_cols();\n  const uword n_slices = A.get_n_slices();\n  \n  out.set_size(n_rows, n_cols, n_slices);\n  \n  const eT    k       = X.aux_out_eT;\n  const uword n_elem  = out.n_elem;\n        eT*   out_mem = out.memptr();\n  \n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      out_mem[i] = A[i] + k;\n      }\n    }\n  else\n    {\n    for(uword slice = 0; slice < n_slices; ++slice)\n    for(uword col   = 0; col   < n_cols;   ++col  )\n    for(uword row   = 0; row   < n_rows;   ++row  )\n      {\n      *out_mem = A.at(row,col,slice) + k;  ++out_mem;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_cx_scalar_minus_pre::apply\n  (\n           Cube< typename std::complex<typename T1::pod_type> >& out,\n  const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_minus_pre>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<typename T1::pod_type> eT;\n  \n  const ProxyCube<T1> A(X.m);\n  \n  const uword n_rows   = A.get_n_rows();\n  const uword n_cols   = A.get_n_cols();\n  const uword n_slices = A.get_n_slices();\n  \n  out.set_size(n_rows, n_cols, n_slices);\n  \n  const eT    k       = X.aux_out_eT;\n  const uword n_elem  = out.n_elem;\n        eT*   out_mem = out.memptr();\n  \n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      out_mem[i] = k - A[i];\n      }\n    }\n  else\n    {\n    for(uword slice = 0; slice < n_slices; ++slice)\n    for(uword col   = 0; col   < n_cols;   ++col  )\n    for(uword row   = 0; row   < n_rows;   ++row  )\n      {\n      *out_mem = k - A.at(row,col,slice);  ++out_mem;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_cx_scalar_minus_post::apply\n  (\n           Cube< typename std::complex<typename T1::pod_type> >& out,\n  const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_minus_post>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<typename T1::pod_type> eT;\n  \n  const ProxyCube<T1> A(X.m);\n  \n  const uword n_rows   = A.get_n_rows();\n  const uword n_cols   = A.get_n_cols();\n  const uword n_slices = A.get_n_slices();\n  \n  out.set_size(n_rows, n_cols, n_slices);\n  \n  const eT    k       = X.aux_out_eT;\n  const uword n_elem  = out.n_elem;\n        eT*   out_mem = out.memptr();\n  \n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      out_mem[i] = A[i] - k;\n      }\n    }\n  else\n    {\n    for(uword slice = 0; slice < n_slices; ++slice)\n    for(uword col   = 0; col   < n_cols;   ++col  )\n    for(uword row   = 0; row   < n_rows;   ++row  )\n      {\n      *out_mem = A.at(row,col,slice) - k;  ++out_mem;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_cx_scalar_div_pre::apply\n  (\n           Cube< typename std::complex<typename T1::pod_type> >& out,\n  const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_div_pre>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<typename T1::pod_type> eT;\n  \n  const ProxyCube<T1> A(X.m);\n  \n  const uword n_rows   = A.get_n_rows();\n  const uword n_cols   = A.get_n_cols();\n  const uword n_slices = A.get_n_slices();\n  \n  out.set_size(n_rows, n_cols, n_slices);\n  \n  const eT    k       = X.aux_out_eT;\n  const uword n_elem  = out.n_elem;\n        eT*   out_mem = out.memptr();\n  \n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      out_mem[i] = k / A[i];\n      }\n    }\n  else\n    {\n    for(uword slice = 0; slice < n_slices; ++slice)\n    for(uword col   = 0; col   < n_cols;   ++col  )\n    for(uword row   = 0; row   < n_rows;   ++row  )\n      {\n      *out_mem = k / A.at(row,col,slice);  ++out_mem;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_cx_scalar_div_post::apply\n  (\n           Cube< typename std::complex<typename T1::pod_type> >& out,\n  const mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_div_post>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<typename T1::pod_type> eT;\n  \n  const ProxyCube<T1> A(X.m);\n  \n  const uword n_rows   = A.get_n_rows();\n  const uword n_cols   = A.get_n_cols();\n  const uword n_slices = A.get_n_slices();\n  \n  out.set_size(n_rows, n_cols, n_slices);\n  \n  const eT    k       = X.aux_out_eT;\n  const uword n_elem  = out.n_elem;\n        eT*   out_mem = out.memptr();\n  \n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      out_mem[i] = A[i] / k;\n      }\n    }\n  else\n    {\n    for(uword slice = 0; slice < n_slices; ++slice)\n    for(uword col   = 0; col   < n_cols;   ++col  )\n    for(uword row   = 0; row   < n_rows;   ++row  )\n      {\n      *out_mem = A.at(row,col,slice) / k;  ++out_mem;\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_diagmat_bones.hpp",
    "content": "// Copyright (C) 2008-2010 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_diagmat\n//! @{\n\n\n\nclass op_diagmat\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_diagmat>& X);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_diagmat_meat.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_diagmat\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_diagmat::apply(Mat<typename T1::elem_type>& out, const Op<T1, op_diagmat>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(X.m);\n  \n  const uword n_rows = P.get_n_rows();\n  const uword n_cols = P.get_n_cols();\n  \n  const bool P_is_vec = (n_rows == 1) || (n_cols == 1);\n  \n  \n  if(P.is_alias(out) == false)\n    {\n    if(P_is_vec)    // generate a diagonal matrix out of a vector\n      {\n      const uword N = (n_rows == 1) ? n_cols : n_rows;\n      \n      out.zeros(N, N);\n      \n      if(Proxy<T1>::prefer_at_accessor == false)\n        {\n        typename Proxy<T1>::ea_type P_ea = P.get_ea();\n        \n        for(uword i=0; i < N; ++i) { out.at(i,i) = P_ea[i]; }\n        }\n      else\n        {\n        if(n_rows == 1)\n          {\n          for(uword i=0; i < N; ++i) { out.at(i,i) = P.at(0,i); }\n          }\n        else\n          {\n          for(uword i=0; i < N; ++i) { out.at(i,i) = P.at(i,0); }\n          }\n        }\n      }\n    else   // generate a diagonal matrix out of a matrix\n      {\n      arma_debug_check( (n_rows != n_cols), \"diagmat(): given matrix is not square\" );\n      \n      out.zeros(n_rows, n_rows);\n      \n      for(uword i=0; i < n_rows; ++i) { out.at(i,i) = P.at(i,i); }\n      }\n    }\n  else   // we have aliasing\n    {\n    if(P_is_vec)   // generate a diagonal matrix out of a vector\n      {\n      const uword N = (n_rows == 1) ? n_cols : n_rows;\n      \n      podarray<eT> tmp(N);\n      eT* tmp_mem = tmp.memptr();\n      \n      if(Proxy<T1>::prefer_at_accessor == false)\n        {\n        typename Proxy<T1>::ea_type P_ea = P.get_ea();\n        \n        for(uword i=0; i < N; ++i) { tmp_mem[i] = P_ea[i]; }\n        }\n      else\n        {\n        if(n_rows == 1)\n          {\n          for(uword i=0; i < N; ++i) { tmp_mem[i] = P.at(0,i); }\n          }\n        else\n          {\n          for(uword i=0; i < N; ++i) { tmp_mem[i] = P.at(i,0); }\n          }\n        }\n      \n      out.zeros(N, N);\n      \n      for(uword i=0; i < N; ++i) { out.at(i,i) = tmp_mem[i]; }\n      }\n    else   // generate a diagonal matrix out of a matrix\n      {\n      arma_debug_check( (n_rows != n_cols), \"diagmat(): given matrix is not square\" );\n      \n      if( (Proxy<T1>::has_subview == false) && (Proxy<T1>::fake_mat == false) )\n        {\n        // NOTE: we have aliasing and it's not due to a subview, hence we're assuming that the output matrix already has the correct size\n        \n        for(uword i=0; i < n_rows; ++i)\n          {\n          const eT val = P.at(i,i);\n          \n          arrayops::fill_zeros(out.colptr(i), n_rows);\n          \n          out.at(i,i) = val;\n          }\n        }\n      else\n        {\n        podarray<eT> tmp(n_rows);\n        eT* tmp_mem = tmp.memptr();\n        \n        for(uword i=0; i < n_rows; ++i)  { tmp_mem[i] = P.at(i,i); }\n        \n        out.zeros(n_rows, n_rows);\n        \n        for(uword i=0; i < n_rows; ++i)  { out.at(i,i) = tmp_mem[i]; }\n        }\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_diagvec_bones.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_diagvec\n//! @{\n\n\n\nclass op_diagvec\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_diagvec>& X);\n  \n  template<typename T1>\n  arma_hot inline static void apply_unwrap(Mat<typename T1::elem_type>& out, const T1& X,       const uword row_offset, const uword col_offset, const uword len);\n  \n  template<typename T1>\n  arma_hot inline static void apply_proxy(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword row_offset, const uword col_offset, const uword len);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_diagvec_meat.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_diagvec\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_diagvec::apply(Mat<typename T1::elem_type>& out, const Op<T1, op_diagvec>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword a = X.aux_uword_a;\n  const uword b = X.aux_uword_b;\n  \n  const uword row_offset = (b >  0) ? a : 0;\n  const uword col_offset = (b == 0) ? a : 0;\n  \n  const Proxy<T1> P(X.m);\n  \n  const uword n_rows = P.get_n_rows();\n  const uword n_cols = P.get_n_cols();\n  \n  arma_debug_check\n    (\n    ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),\n    \"diagvec(): requested diagonal is out of bounds\"\n    );\n  \n  const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value) && (Proxy<T1>::fake_mat == false) )\n    {\n    op_diagvec::apply_unwrap(out, P.Q, row_offset, col_offset, len);\n    }\n  else\n    {\n    if(P.is_alias(out) == false)\n      {\n      op_diagvec::apply_proxy(out, P, row_offset, col_offset, len);\n      }\n    else\n      {\n      Mat<eT> tmp;\n      \n      op_diagvec::apply_proxy(tmp, P, row_offset, col_offset, len);\n      \n      out.steal_mem(tmp);\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_diagvec::apply_unwrap(Mat<typename T1::elem_type>& out, const T1& X, const uword row_offset, const uword col_offset, const uword len)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_check<T1> tmp_A(X, out);\n  const Mat<eT>& A =     tmp_A.M;\n  \n  out.set_size(len, 1);\n  \n  eT* out_mem = out.memptr();\n  \n  uword i,j;\n  for(i=0, j=1; j < len; i+=2, j+=2)\n    {\n    const eT tmp_i = A.at( i + row_offset, i + col_offset );\n    const eT tmp_j = A.at( j + row_offset, j + col_offset );\n    \n    out_mem[i] = tmp_i;\n    out_mem[j] = tmp_j;\n    }\n  \n  if(i < len)\n    {\n    out_mem[i] = A.at( i + row_offset, i + col_offset );\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_diagvec::apply_proxy(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword row_offset, const uword col_offset, const uword len)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  out.set_size(len, 1);\n  \n  eT* out_mem = out.memptr();\n  \n  uword i,j;\n  for(i=0, j=1; j < len; i+=2, j+=2)\n    {\n    const eT tmp_i = P.at( i + row_offset, i + col_offset );\n    const eT tmp_j = P.at( j + row_offset, j + col_offset );\n    \n    out_mem[i] = tmp_i;\n    out_mem[j] = tmp_j;\n    }\n  \n  if(i < len)\n    {\n    out_mem[i] = P.at( i + row_offset, i + col_offset );\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_dot_bones.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_dot\n//! @{\n\n//! \\brief\n//! dot product operation \n\nclass op_dot\n  {\n  public:\n  \n  template<typename eT>\n  arma_hot arma_pure arma_inline static\n  typename arma_not_cx<eT>::result\n  direct_dot_arma(const uword n_elem, const eT* const A, const eT* const B);\n  \n  template<typename eT>\n  arma_hot arma_pure inline static\n  typename arma_cx_only<eT>::result\n  direct_dot_arma(const uword n_elem, const eT* const A, const eT* const B);\n  \n  template<typename eT>\n  arma_hot arma_pure inline static typename arma_real_only<eT>::result\n  direct_dot(const uword n_elem, const eT* const A, const eT* const B);\n  \n  template<typename eT>\n  arma_hot arma_pure inline static typename arma_cx_only<eT>::result\n  direct_dot(const uword n_elem, const eT* const A, const eT* const B);\n  \n  template<typename eT>\n  arma_hot arma_pure inline static typename arma_integral_only<eT>::result\n  direct_dot(const uword n_elem, const eT* const A, const eT* const B);\n  \n  \n  template<typename eT>\n  arma_hot arma_pure inline static eT direct_dot(const uword n_elem, const eT* const A, const eT* const B, const eT* C);\n  \n  template<typename T1, typename T2>\n  arma_hot inline static typename T1::elem_type apply(const T1& X, const T2& Y);\n  \n  template<typename T1, typename T2>\n  arma_hot inline static typename  arma_not_cx<typename T1::elem_type>::result apply_proxy(const Proxy<T1>& PA, const Proxy<T2>& PB);\n  \n  template<typename T1, typename T2>\n  arma_hot inline static typename arma_cx_only<typename T1::elem_type>::result apply_proxy(const Proxy<T1>& PA, const Proxy<T2>& PB);\n  };\n\n\n\n//! \\brief\n//! normalised dot product operation \n\nclass op_norm_dot\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  arma_hot inline static typename T1::elem_type apply(const T1& X, const T2& Y);\n  };\n\n\n\n//! \\brief\n//! complex conjugate dot product operation\n\nclass op_cdot\n  {\n  public:\n  \n  template<typename eT>\n  arma_hot inline static eT direct_cdot_arma(const uword n_elem, const eT* const A, const eT* const B);\n  \n  template<typename eT>\n  arma_hot inline static eT direct_cdot(const uword n_elem, const eT* const A, const eT* const B);\n  \n  template<typename T1, typename T2>\n  arma_hot inline static typename T1::elem_type apply       (const T1& X, const T2& Y);\n  \n  template<typename T1, typename T2>\n  arma_hot inline static typename T1::elem_type apply_unwrap(const T1& X, const T2& Y);\n  \n  template<typename T1, typename T2>\n  arma_hot inline static typename T1::elem_type apply_proxy (const T1& X, const T2& Y);\n  };\n\n\n\nclass op_dot_mixed\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  arma_hot inline static\n  typename promote_type<typename T1::elem_type, typename T2::elem_type>::result\n  apply(const T1& A, const T2& B);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_dot_meat.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_dot\n//! @{\n\n\n\n//! for two arrays, generic version for non-complex values\ntemplate<typename eT>\narma_hot\narma_pure\narma_inline\ntypename arma_not_cx<eT>::result\nop_dot::direct_dot_arma(const uword n_elem, const eT* const A, const eT* const B)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(__FINITE_MATH_ONLY__) && (__FINITE_MATH_ONLY__ > 0)\n    {\n    eT val = eT(0);\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      val += A[i] * B[i];\n      }\n    \n    return val;\n    }\n  #else\n    {\n    eT val1 = eT(0);\n    eT val2 = eT(0);\n    \n    uword i, j;\n    \n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\n      {\n      val1 += A[i] * B[i];\n      val2 += A[j] * B[j];\n      }\n    \n    if(i < n_elem)\n      {\n      val1 += A[i] * B[i];\n      }\n    \n    return val1 + val2;\n    }\n  #endif\n  }\n\n\n\n//! for two arrays, generic version for complex values\ntemplate<typename eT>\narma_hot\narma_pure\ninline\ntypename arma_cx_only<eT>::result\nop_dot::direct_dot_arma(const uword n_elem, const eT* const A, const eT* const B)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  T val_real = T(0);\n  T val_imag = T(0);\n  \n  for(uword i=0; i<n_elem; ++i)\n    {\n    const std::complex<T>& X = A[i];\n    const std::complex<T>& Y = B[i];\n    \n    const T a = X.real();\n    const T b = X.imag();\n    \n    const T c = Y.real();\n    const T d = Y.imag();\n    \n    val_real += (a*c) - (b*d);\n    val_imag += (a*d) + (b*c);\n    }\n  \n  return std::complex<T>(val_real, val_imag);\n  }\n\n\n\n//! for two arrays, float and double version\ntemplate<typename eT>\narma_hot\narma_pure\ninline\ntypename arma_real_only<eT>::result\nop_dot::direct_dot(const uword n_elem, const eT* const A, const eT* const B)\n  {\n  arma_extra_debug_sigprint();\n  \n  if( n_elem <= 32u )\n    {\n    return op_dot::direct_dot_arma(n_elem, A, B);\n    }\n  else\n    {\n    #if defined(ARMA_USE_ATLAS)\n      {\n      arma_extra_debug_print(\"atlas::cblas_dot()\");\n      \n      return atlas::cblas_dot(n_elem, A, B);\n      }\n    #elif defined(ARMA_USE_BLAS)\n      {\n      arma_extra_debug_print(\"blas::dot()\");\n      \n      return blas::dot(n_elem, A, B);\n      }\n    #else\n      {\n      return op_dot::direct_dot_arma(n_elem, A, B);\n      }\n    #endif\n    }\n  }\n\n\n\n//! for two arrays, complex version\ntemplate<typename eT>\ninline\narma_hot\narma_pure\ntypename arma_cx_only<eT>::result\nop_dot::direct_dot(const uword n_elem, const eT* const A, const eT* const B)\n  {\n  if( n_elem <= 16u )\n    {\n    return op_dot::direct_dot_arma(n_elem, A, B);\n    }\n  else\n    {\n    #if defined(ARMA_USE_ATLAS)\n      {\n      arma_extra_debug_print(\"atlas::cx_cblas_dot()\");\n      \n      return atlas::cx_cblas_dot(n_elem, A, B);\n      }\n    #elif defined(ARMA_USE_BLAS)\n      {\n      arma_extra_debug_print(\"blas::dot()\");\n      \n      return blas::dot(n_elem, A, B);\n      }\n    #else\n      {\n      return op_dot::direct_dot_arma(n_elem, A, B);\n      }\n    #endif\n    }\n  }\n\n\n\n//! for two arrays, integral version\ntemplate<typename eT>\narma_hot\narma_pure\ninline\ntypename arma_integral_only<eT>::result\nop_dot::direct_dot(const uword n_elem, const eT* const A, const eT* const B)\n  {\n  return op_dot::direct_dot_arma(n_elem, A, B);\n  }\n\n\n\n\n//! for three arrays\ntemplate<typename eT>\narma_hot\narma_pure\ninline\neT\nop_dot::direct_dot(const uword n_elem, const eT* const A, const eT* const B, const eT* C)\n  {\n  arma_extra_debug_sigprint();\n  \n  eT val = eT(0);\n  \n  for(uword i=0; i<n_elem; ++i)\n    {\n    val += A[i] * B[i] * C[i];\n    }\n\n  return val;\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\ntypename T1::elem_type\nop_dot::apply(const T1& X, const T2& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool prefer_at_accessor = (Proxy<T1>::prefer_at_accessor) || (Proxy<T2>::prefer_at_accessor);\n  \n  const bool have_direct_mem = ((is_Mat<T1>::value || is_subview_col<T1>::value) && (is_Mat<T2>::value || is_subview_col<T2>::value));\n  \n  if(prefer_at_accessor || have_direct_mem)\n    {\n    const quasi_unwrap<T1> A(X);\n    const quasi_unwrap<T2> B(Y);\n    \n    arma_debug_check( (A.M.n_elem != B.M.n_elem), \"dot(): objects must have the same number of elements\" );\n    \n    return op_dot::direct_dot(A.M.n_elem, A.M.memptr(), B.M.memptr());\n    }\n  else\n    {\n    if(is_subview_row<T1>::value && is_subview_row<T2>::value)\n      {\n      typedef typename T1::elem_type eT;\n      \n      const subview_row<eT>& A = reinterpret_cast< const subview_row<eT>& >(X);\n      const subview_row<eT>& B = reinterpret_cast< const subview_row<eT>& >(Y);\n      \n      if( (A.m.n_rows == 1) && (B.m.n_rows == 1) )\n        {\n        arma_debug_check( (A.n_elem != B.n_elem), \"dot(): objects must have the same number of elements\" );\n        \n        const eT* A_mem = A.m.memptr();\n        const eT* B_mem = B.m.memptr();\n        \n        return op_dot::direct_dot(A.n_elem, &A_mem[A.aux_col1], &B_mem[B.aux_col1]);\n        }\n      }\n    \n    const Proxy<T1> PA(X);\n    const Proxy<T2> PB(Y);\n    \n    arma_debug_check( (PA.get_n_elem() != PB.get_n_elem()), \"dot(): objects must have the same number of elements\" );\n    \n    if(is_Mat<typename Proxy<T1>::stored_type>::value && is_Mat<typename Proxy<T2>::stored_type>::value)\n      {\n      const quasi_unwrap<typename Proxy<T1>::stored_type> A(PA.Q);\n      const quasi_unwrap<typename Proxy<T2>::stored_type> B(PB.Q);\n      \n      return op_dot::direct_dot(A.M.n_elem, A.M.memptr(), B.M.memptr());\n      }\n    \n    return op_dot::apply_proxy(PA,PB);\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\ntypename arma_not_cx<typename T1::elem_type>::result\nop_dot::apply_proxy(const Proxy<T1>& PA, const Proxy<T2>& PB)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type      eT;\n  typedef typename Proxy<T1>::ea_type ea_type1;\n  typedef typename Proxy<T2>::ea_type ea_type2;\n  \n  const uword N = PA.get_n_elem();\n  \n  ea_type1 A = PA.get_ea();\n  ea_type2 B = PB.get_ea();\n  \n  eT val1 = eT(0);\n  eT val2 = eT(0);\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<N; i+=2, j+=2)\n    {\n    val1 += A[i] * B[i];\n    val2 += A[j] * B[j];\n    }\n  \n  if(i < N)\n    {\n    val1 += A[i] * B[i];\n    }\n  \n  return val1 + val2;\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\ntypename arma_cx_only<typename T1::elem_type>::result\nop_dot::apply_proxy(const Proxy<T1>& PA, const Proxy<T2>& PB)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result  T;\n  \n  typedef typename Proxy<T1>::ea_type ea_type1;\n  typedef typename Proxy<T2>::ea_type ea_type2;\n  \n  const uword N = PA.get_n_elem();\n  \n  ea_type1 A = PA.get_ea();\n  ea_type2 B = PB.get_ea();\n  \n  T val_real = T(0);\n  T val_imag = T(0);\n  \n  for(uword i=0; i<N; ++i)\n    {\n    const std::complex<T> xx = A[i];\n    const std::complex<T> yy = B[i];\n    \n    const T a = xx.real();\n    const T b = xx.imag();\n    \n    const T c = yy.real();\n    const T d = yy.imag();\n    \n    val_real += (a*c) - (b*d);\n    val_imag += (a*d) + (b*c);\n    }\n  \n  return std::complex<T>(val_real, val_imag);\n  }\n\n\n\n//\n// op_norm_dot\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\ntypename T1::elem_type\nop_norm_dot::apply(const T1& X, const T2& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  typedef typename T1::pod_type   T;\n  \n  const quasi_unwrap<T1> tmp1(X);\n  const quasi_unwrap<T2> tmp2(Y);\n  \n  const Col<eT> A( const_cast<eT*>(tmp1.M.memptr()), tmp1.M.n_elem, false );\n  const Col<eT> B( const_cast<eT*>(tmp2.M.memptr()), tmp2.M.n_elem, false );\n  \n  arma_debug_check( (A.n_elem != B.n_elem), \"norm_dot(): objects must have the same number of elements\" );\n  \n  const T denom = norm(A,2) * norm(B,2);\n  \n  return (denom != T(0)) ? ( op_dot::apply(A,B) / denom ) : eT(0);\n  }\n\n\n\n//\n// op_cdot\n\n\n\ntemplate<typename eT>\narma_hot\narma_pure\ninline\neT\nop_cdot::direct_cdot_arma(const uword n_elem, const eT* const A, const eT* const B)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  T val_real = T(0);\n  T val_imag = T(0);\n  \n  for(uword i=0; i<n_elem; ++i)\n    {\n    const std::complex<T>& X = A[i];\n    const std::complex<T>& Y = B[i];\n    \n    const T a = X.real();\n    const T b = X.imag();\n    \n    const T c = Y.real();\n    const T d = Y.imag();\n    \n    val_real += (a*c) + (b*d);\n    val_imag += (a*d) - (b*c);\n    }\n  \n  return std::complex<T>(val_real, val_imag);\n  }\n\n\n\ntemplate<typename eT>\narma_hot\narma_pure\ninline\neT\nop_cdot::direct_cdot(const uword n_elem, const eT* const A, const eT* const B)\n  {\n  arma_extra_debug_sigprint();\n  \n  if( n_elem <= 32u )\n    {\n    return op_cdot::direct_cdot_arma(n_elem, A, B);\n    }\n  else\n    {\n    #if defined(ARMA_USE_BLAS)\n      {\n      arma_extra_debug_print(\"blas::gemv()\");\n      \n      // using gemv() workaround due to compatibility issues with cdotc() and zdotc()\n      \n      const char trans   = 'C';\n      \n      const blas_int m   = blas_int(n_elem);\n      const blas_int n   = 1;\n      //const blas_int lda = (n_elem > 0) ? blas_int(n_elem) : blas_int(1);\n      const blas_int inc = 1;\n      \n      const eT alpha     = eT(1);\n      const eT beta      = eT(0);\n      \n      eT result[2];  // paranoia: using two elements instead of one\n      \n      //blas::gemv(&trans, &m, &n, &alpha, A, &lda, B, &inc, &beta, &result[0], &inc);\n      blas::gemv(&trans, &m, &n, &alpha, A, &m, B, &inc, &beta, &result[0], &inc);\n      \n      return result[0];\n      }\n    #elif defined(ARMA_USE_ATLAS)\n      {\n      // TODO: use dedicated atlas functions cblas_cdotc_sub() and cblas_zdotc_sub() and retune threshold\n\n      return op_cdot::direct_cdot_arma(n_elem, A, B);\n      }\n    #else\n      {\n      return op_cdot::direct_cdot_arma(n_elem, A, B);\n      }\n    #endif\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\ntypename T1::elem_type\nop_cdot::apply(const T1& X, const T2& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  if( (is_Mat<T1>::value == true) && (is_Mat<T2>::value == true) )\n    {\n    return op_cdot::apply_unwrap(X,Y);\n    }\n  else\n    {\n    return op_cdot::apply_proxy(X,Y);\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\ntypename T1::elem_type\nop_cdot::apply_unwrap(const T1& X, const T2& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1> tmp1(X);\n  const unwrap<T2> tmp2(Y);\n  \n  const Mat<eT>& A = tmp1.M;\n  const Mat<eT>& B = tmp2.M;\n  \n  arma_debug_check( (A.n_elem != B.n_elem), \"cdot(): objects must have the same number of elements\" );\n  \n  return op_cdot::direct_cdot( A.n_elem, A.mem, B.mem );\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\ntypename T1::elem_type\nop_cdot::apply_proxy(const T1& X, const T2& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result  T;\n  \n  typedef typename Proxy<T1>::ea_type ea_type1;\n  typedef typename Proxy<T2>::ea_type ea_type2;\n  \n  const bool prefer_at_accessor = (Proxy<T1>::prefer_at_accessor) || (Proxy<T2>::prefer_at_accessor);\n  \n  if(prefer_at_accessor == false)\n    {\n    const Proxy<T1> PA(X);\n    const Proxy<T2> PB(Y);\n    \n    const uword N = PA.get_n_elem();\n    \n    arma_debug_check( (N != PB.get_n_elem()), \"cdot(): objects must have the same number of elements\" );\n    \n    ea_type1 A = PA.get_ea();\n    ea_type2 B = PB.get_ea();\n    \n    T val_real = T(0);\n    T val_imag = T(0);\n    \n    for(uword i=0; i<N; ++i)\n      {\n      const std::complex<T> AA = A[i];\n      const std::complex<T> BB = B[i];\n      \n      const T a = AA.real();\n      const T b = AA.imag();\n      \n      const T c = BB.real();\n      const T d = BB.imag();\n      \n      val_real += (a*c) + (b*d);\n      val_imag += (a*d) - (b*c);\n      }\n    \n    return std::complex<T>(val_real, val_imag);\n    }\n  else\n    {\n    return op_cdot::apply_unwrap( X, Y );\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\ntypename promote_type<typename T1::elem_type, typename T2::elem_type>::result\nop_dot_mixed::apply(const T1& A, const T2& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type in_eT1;\n  typedef typename T2::elem_type in_eT2;\n  \n  typedef typename promote_type<in_eT1, in_eT2>::result out_eT;\n  \n  const Proxy<T1> PA(A);\n  const Proxy<T2> PB(B);\n  \n  const uword N = PA.get_n_elem();\n  \n  arma_debug_check( (N != PB.get_n_elem()), \"dot(): objects must have the same number of elements\" );\n  \n  out_eT acc = out_eT(0);\n  \n  for(uword i=0; i < N; ++i)\n    {\n    acc += upgrade_val<in_eT1,in_eT2>::apply(PA[i]) * upgrade_val<in_eT1,in_eT2>::apply(PB[i]);\n    }\n  \n  return acc;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_dotext_bones.hpp",
    "content": "// Copyright (C) 2008-2010 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_dotext\n//! @{\n\n\n\nclass op_dotext\n  {\n  public:\n  \n  \n  template<typename eT>\n  inline static eT direct_rowvec_mat_colvec       (const eT* A_mem, const Mat<eT>& B, const eT* C_mem);\n  \n  template<typename eT>\n  inline static eT direct_rowvec_transmat_colvec  (const eT* A_mem, const Mat<eT>& B, const eT* C_mem);\n  \n  template<typename eT>\n  inline static eT direct_rowvec_diagmat_colvec   (const eT* A_mem, const Mat<eT>& B, const eT* C_mem);\n  \n  template<typename eT>\n  inline static eT direct_rowvec_invdiagmat_colvec(const eT* A_mem, const Mat<eT>& B, const eT* C_mem);\n  \n  template<typename eT>\n  inline static eT direct_rowvec_invdiagvec_colvec(const eT* A_mem, const Mat<eT>& B, const eT* C_mem);\n  \n  };\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_dotext_meat.hpp",
    "content": "// Copyright (C) 2008-2010 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_dotext\n//! @{\n\n\n\ntemplate<typename eT>\ninline\neT\nop_dotext::direct_rowvec_mat_colvec\n  (\n  const eT*      A_mem,\n  const Mat<eT>& B,\n  const eT*      C_mem\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword cost_AB = B.n_cols;\n  const uword cost_BC = B.n_rows;\n  \n  if(cost_AB <= cost_BC)\n    {\n    podarray<eT> tmp(B.n_cols);\n    \n    for(uword col=0; col<B.n_cols; ++col)\n      {\n      const eT* B_coldata = B.colptr(col);\n      \n      eT val = eT(0);\n      for(uword i=0; i<B.n_rows; ++i)\n        {\n        val += A_mem[i] * B_coldata[i];\n        }\n        \n      tmp[col] = val;\n      }\n    \n    return op_dot::direct_dot(B.n_cols, tmp.mem, C_mem);\n    }\n  else\n    {\n    podarray<eT> tmp(B.n_rows);\n    \n    for(uword row=0; row<B.n_rows; ++row)\n      {\n      eT val = eT(0);\n      for(uword col=0; col<B.n_cols; ++col)\n        {\n        val += B.at(row,col) * C_mem[col];\n        }\n      \n      tmp[row] = val;\n      }\n    \n    return op_dot::direct_dot(B.n_rows, A_mem, tmp.mem);\n    }\n  \n  \n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nop_dotext::direct_rowvec_transmat_colvec\n  (\n  const eT*      A_mem,\n  const Mat<eT>& B,\n  const eT*      C_mem\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword cost_AB = B.n_rows;\n  const uword cost_BC = B.n_cols;\n  \n  if(cost_AB <= cost_BC)\n    {\n    podarray<eT> tmp(B.n_rows);\n    \n    for(uword row=0; row<B.n_rows; ++row)\n      {\n      eT val = eT(0);\n      \n      for(uword i=0; i<B.n_cols; ++i)\n        {\n        val += A_mem[i] * B.at(row,i);\n        }\n        \n      tmp[row] = val;\n      }\n    \n    return op_dot::direct_dot(B.n_rows, tmp.mem, C_mem);\n    }\n  else\n    {\n    podarray<eT> tmp(B.n_cols);\n    \n    for(uword col=0; col<B.n_cols; ++col)\n      {\n      const eT* B_coldata = B.colptr(col);\n      \n      eT val = eT(0);\n      \n      for(uword i=0; i<B.n_rows; ++i)\n        {\n        val += B_coldata[i] * C_mem[i];\n        }\n      \n      tmp[col] = val;\n      }\n    \n    return op_dot::direct_dot(B.n_cols, A_mem, tmp.mem);\n    }\n  \n  \n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nop_dotext::direct_rowvec_diagmat_colvec\n  (\n  const eT*      A_mem,\n  const Mat<eT>& B,\n  const eT*      C_mem\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  eT val = eT(0);\n\n  for(uword i=0; i<B.n_rows; ++i)\n    {\n    val += A_mem[i] * B.at(i,i) * C_mem[i];\n    }\n\n  return val;\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nop_dotext::direct_rowvec_invdiagmat_colvec\n  (\n  const eT*      A_mem,\n  const Mat<eT>& B,\n  const eT*      C_mem\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  eT val = eT(0);\n\n  for(uword i=0; i<B.n_rows; ++i)\n    {\n    val += (A_mem[i] * C_mem[i]) / B.at(i,i);\n    }\n\n  return val;\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nop_dotext::direct_rowvec_invdiagvec_colvec\n  (\n  const eT*      A_mem,\n  const Mat<eT>& B,\n  const eT*      C_mem\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const eT* B_mem = B.mem;\n  \n  eT val = eT(0);\n\n  for(uword i=0; i<B.n_elem; ++i)\n    {\n    val += (A_mem[i] * C_mem[i]) / B_mem[i];\n    }\n\n  return val;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_expmat_bones.hpp",
    "content": "// Copyright (C) 2014 Conrad Sanderson\n// Copyright (C) 2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_expmat\n//! @{\n\n\n\nclass op_expmat\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_expmat>& expr);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_expmat_meat.hpp",
    "content": "// Copyright (C) 2014 Conrad Sanderson\n// Copyright (C) 2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_expmat\n//! @{\n\n\n//! implementation based on:\n//! Cleve Moler, Charles Van Loan.\n//! Nineteen Dubious Ways to Compute the Exponential of a Matrix, Twenty-Five Years Later.\n//! SIAM Review, Vol. 45, No. 1, 2003, pp. 3-49.\n//! http://dx.doi.org/10.1137/S00361445024180\n\n\ntemplate<typename T1>\ninline\nvoid\nop_expmat::apply(Mat<typename T1::elem_type>& out, const Op<T1, op_expmat>& expr)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  typedef typename T1::pod_type   T;\n  \n  \n  if(is_op_diagmat<T1>::value)\n    {\n    out = expr.m;  // force the evaluation of diagmat()\n    \n    const uword n_rows = out.n_rows;\n    \n    for(uword i=0; i<n_rows; ++i)\n      {\n      out.at(i,i) = std::exp( out.at(i,i) );\n      }\n    }\n  else\n    {\n    const unwrap<T1>   tmp(expr.m);\n    const Mat<eT>& A = tmp.M;\n    \n    arma_debug_check( (A.is_square() == false), \"expmat(): given matrix is not square sized\" );\n    \n    const T norm_val = arma::norm(A, \"inf\");\n    \n    const double log2_val = (norm_val > T(0)) ? double(eop_aux::log2(norm_val)) : double(0);\n    \n    int exponent = int(0);  std::frexp(log2_val, &exponent);\n    \n    const uword s = uword( (std::max)(int(0), exponent + int(1)) );\n    \n    const Mat<eT> AA = A / eT(eop_aux::pow(double(2), double(s)));\n    \n    T c = T(0.5);\n    \n    Mat<eT> E(AA.n_rows, AA.n_rows, fill::eye);  E += c * AA;\n    Mat<eT> D(AA.n_rows, AA.n_rows, fill::eye);  D -= c * AA;\n    \n    Mat<eT> X = AA;\n    \n    bool positive = true;\n    \n    const uword N = 6;\n    \n    for(uword i = 2; i <= N; ++i)\n      {\n      c = c * T(N - i + 1) / T(i * (2*N - i + 1));\n      \n      X = AA * X;\n      \n      E += c * X;\n      \n      if(positive)  { D += c * X; }  else  { D -= c * X; }\n      \n      positive = (positive) ? false : true;\n      }\n    \n    out = solve(D, E);\n    \n    for(uword i=0; i < s; ++i)  { out = out * out; }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_fft_bones.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_fft\n//! @{\n\n\n\nclass op_fft_real\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply( Mat< std::complex<typename T1::pod_type> >& out, const mtOp<std::complex<typename T1::pod_type>,T1,op_fft_real>& in );\n  };\n\n\n\nclass op_fft_cx\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply( Mat<typename T1::elem_type>& out, const Op<T1,op_fft_cx>& in );\n  \n  template<typename T1, bool inverse>\n  inline static void apply_noalias(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword a, const uword b);\n\n  template<typename T1> arma_hot inline static void copy_vec       (typename Proxy<T1>::elem_type* dest, const Proxy<T1>& P, const uword N);\n  template<typename T1> arma_hot inline static void copy_vec_proxy (typename Proxy<T1>::elem_type* dest, const Proxy<T1>& P, const uword N);\n  template<typename T1> arma_hot inline static void copy_vec_unwrap(typename Proxy<T1>::elem_type* dest, const Proxy<T1>& P, const uword N);\n  };\n\n\n\nclass op_ifft_cx\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply( Mat<typename T1::elem_type>& out, const Op<T1,op_ifft_cx>& in );\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_fft_meat.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_fft\n//! @{\n\n\n\n//\n// op_fft_real\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_fft_real::apply( Mat< std::complex<typename T1::pod_type> >& out, const mtOp<std::complex<typename T1::pod_type>,T1,op_fft_real>& in )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::pod_type         in_eT;\n  typedef typename std::complex<in_eT> out_eT;\n  \n  const Proxy<T1> P(in.m);\n  \n  const uword n_rows = P.get_n_rows();\n  const uword n_cols = P.get_n_cols();\n  const uword n_elem = P.get_n_elem();\n  \n  const bool is_vec = ( (n_rows == 1) || (n_cols == 1) );\n  \n  const uword N_orig = (is_vec)              ? n_elem         : n_rows;\n  const uword N_user = (in.aux_uword_b == 0) ? in.aux_uword_a : N_orig;\n  \n  fft_engine<out_eT,false> worker(N_user);\n  \n  // no need to worry about aliasing, as we're going from a real object to complex complex, which by definition cannot alias\n  \n  if(is_vec)\n    {\n    (n_cols == 1) ? out.set_size(N_user, 1) : out.set_size(1, N_user);\n    \n    if( (out.n_elem == 0) || (N_orig == 0) )\n      {\n      out.zeros();\n      return;\n      }\n    \n    if( (N_user == 1) && (N_orig >= 1) )\n      {\n      out[0] = out_eT( P[0] );\n      return;\n      }\n    \n    podarray<out_eT> data(N_user);\n    \n    out_eT* data_mem = data.memptr();\n    \n    if(N_user > N_orig)  { arrayops::fill_zeros( &data_mem[N_orig], (N_user - N_orig) ); }\n    \n    const uword N = (std::min)(N_user, N_orig);\n    \n    if(Proxy<T1>::prefer_at_accessor == false)\n      {\n      typename Proxy<T1>::ea_type X = P.get_ea();\n      \n      for(uword i=0; i < N; ++i)  { data_mem[i] = out_eT( X[i], in_eT(0) ); }\n      }\n    else\n      {\n      if(n_cols == 1)\n        {\n        for(uword i=0; i < N; ++i)  { data_mem[i] = out_eT( P.at(i,0), in_eT(0) ); }\n        }\n      else\n        {\n        for(uword i=0; i < N; ++i)  { data_mem[i] = out_eT( P.at(0,i), in_eT(0) ); }\n        }\n      }\n    \n    worker.run( out.memptr(), data_mem );\n    }\n  else\n    {\n    // process each column seperately\n    \n    out.set_size(N_user, n_cols);\n    \n    if( (out.n_elem == 0) || (N_orig == 0) )\n      {\n      out.zeros();\n      return;\n      }\n    \n    if( (N_user == 1) && (N_orig >= 1) )\n      {\n      for(uword col=0; col < n_cols; ++col)  { out.at(0,col) = out_eT( P.at(0,col) ); }\n      \n      return;\n      }\n    \n    podarray<out_eT> data(N_user);\n    \n    out_eT* data_mem = data.memptr();\n    \n    if(N_user > N_orig)  { arrayops::fill_zeros( &data_mem[N_orig], (N_user - N_orig) ); }\n    \n    const uword N = (std::min)(N_user, N_orig);\n    \n    for(uword col=0; col < n_cols; ++col)\n      {\n      for(uword i=0; i < N; ++i)  { data_mem[i] = P.at(i, col); }\n      \n      worker.run( out.colptr(col), data_mem );\n      }\n    }\n  }\n\n\n\n//\n// op_fft_cx\n\n\ntemplate<typename T1>\ninline\nvoid\nop_fft_cx::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_fft_cx>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(in.m);\n  \n  if(P.is_alias(out) == false)\n    {\n    op_fft_cx::apply_noalias<T1,false>(out, P, in.aux_uword_a, in.aux_uword_b);\n    }\n  else\n    {\n    Mat<eT> tmp;\n    \n    op_fft_cx::apply_noalias<T1,false>(tmp, P, in.aux_uword_a, in.aux_uword_b);\n    \n    out.steal_mem(tmp);\n    }\n  }\n  \n\n\ntemplate<typename T1, bool inverse>\ninline\nvoid\nop_fft_cx::apply_noalias(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword a, const uword b)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword n_rows = P.get_n_rows();\n  const uword n_cols = P.get_n_cols();\n  const uword n_elem = P.get_n_elem();\n  \n  const bool is_vec = ( (n_rows == 1) || (n_cols == 1) );\n  \n  const uword N_orig = (is_vec) ? n_elem : n_rows;\n  const uword N_user = (b == 0) ? a      : N_orig;\n  \n  fft_engine<eT,inverse> worker(N_user);\n  \n  if(is_vec)\n    {\n    (n_cols == 1) ? out.set_size(N_user, 1) : out.set_size(1, N_user);\n    \n    if( (out.n_elem == 0) || (N_orig == 0) )\n      {\n      out.zeros();\n      return;\n      }\n    \n    if( (N_user == 1) && (N_orig >= 1) )\n      {\n      out[0] = P[0];\n      return;\n      }\n    \n    if( (N_user > N_orig) || (is_Mat<typename Proxy<T1>::stored_type>::value == false) )\n      {\n      podarray<eT> data(N_user);\n      \n      eT* data_mem = data.memptr();\n      \n      if(N_user > N_orig)  { arrayops::fill_zeros( &data_mem[N_orig], (N_user - N_orig) ); }\n      \n      op_fft_cx::copy_vec( data_mem, P, (std::min)(N_user, N_orig) );\n      \n      worker.run( out.memptr(), data_mem );\n      }\n    else\n      {\n      const unwrap< typename Proxy<T1>::stored_type > tmp(P.Q);\n      \n      worker.run( out.memptr(), tmp.M.memptr() );\n      }\n    }\n  else\n    {\n    // process each column seperately\n    \n    out.set_size(N_user, n_cols);\n    \n    if( (out.n_elem == 0) || (N_orig == 0) )\n      {\n      out.zeros();\n      return;\n      }\n    \n    if( (N_user == 1) && (N_orig >= 1) )\n      {\n      for(uword col=0; col < n_cols; ++col)  { out.at(0,col) = P.at(0,col); }\n      \n      return;\n      }\n    \n    if( (N_user > N_orig) || (is_Mat<typename Proxy<T1>::stored_type>::value == false) )\n      {\n      podarray<eT> data(N_user);\n      \n      eT* data_mem = data.memptr();\n      \n      if(N_user > N_orig)  { arrayops::fill_zeros( &data_mem[N_orig], (N_user - N_orig) ); }\n      \n      const uword N = (std::min)(N_user, N_orig);\n      \n      for(uword col=0; col < n_cols; ++col)\n        {\n        for(uword i=0; i < N; ++i)  { data_mem[i] = P.at(i, col); }\n        \n        worker.run( out.colptr(col), data_mem );\n        }\n      }\n    else\n      {\n      const unwrap< typename Proxy<T1>::stored_type > tmp(P.Q);\n      \n      for(uword col=0; col < n_cols; ++col)\n        {\n        worker.run( out.colptr(col), tmp.M.colptr(col) );\n        }\n      }\n    }\n    \n  \n  // correct the scaling for the inverse transform\n  if(inverse == true)\n    {\n    typedef typename get_pod_type<eT>::result T;\n    \n    const T k = T(1) / T(N_user);\n    \n    eT* out_mem = out.memptr();\n    \n    const uword out_n_elem = out.n_elem;\n    \n    for(uword i=0; i < out_n_elem; ++i)  { out_mem[i] *= k; }\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_fft_cx::copy_vec(typename Proxy<T1>::elem_type* dest, const Proxy<T1>& P, const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(is_Mat< typename Proxy<T1>::stored_type >::value == true)\n    {\n    op_fft_cx::copy_vec_unwrap(dest, P, N);\n    }\n  else\n    {\n    op_fft_cx::copy_vec_proxy(dest, P, N);\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_fft_cx::copy_vec_unwrap(typename Proxy<T1>::elem_type* dest, const Proxy<T1>& P, const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap< typename Proxy<T1>::stored_type > tmp(P.Q);\n  \n  arrayops::copy(dest, tmp.M.memptr(), N);\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_fft_cx::copy_vec_proxy(typename Proxy<T1>::elem_type* dest, const Proxy<T1>& P, const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type X = P.get_ea();\n    \n    for(uword i=0; i < N; ++i)  { dest[i] = X[i]; }\n    }\n  else\n    {\n    if(P.get_n_cols() == 1)\n      {\n      for(uword i=0; i < N; ++i)  { dest[i] = P.at(i,0); }\n      }\n    else\n      {\n      for(uword i=0; i < N; ++i)  { dest[i] = P.at(0,i); }\n      }\n    }\n  }\n\n\n\n//\n// op_ifft_cx\n\n\ntemplate<typename T1>\ninline\nvoid\nop_ifft_cx::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_ifft_cx>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(in.m);\n  \n  if(P.is_alias(out) == false)\n    {\n    op_fft_cx::apply_noalias<T1,true>(out, P, in.aux_uword_a, in.aux_uword_b);\n    }\n  else\n    {\n    Mat<eT> tmp;\n    \n    op_fft_cx::apply_noalias<T1,true>(tmp, P, in.aux_uword_a, in.aux_uword_b);\n    \n    out.steal_mem(tmp);\n    }\n  }\n  \n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_find_bones.hpp",
    "content": "// Copyright (C) 2010-2014 Conrad Sanderson\n// Copyright (C) 2010-2014 NICTA (www.nicta.com.au)\n// Copyright (C) 2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_find\n//! @{\n\n\n\nclass op_find\n  {\n  public:\n  \n  template<typename T1>\n  inline static uword\n  helper\n    (\n    Mat<uword>& indices,\n    const Base<typename T1::elem_type, T1>& X\n    );\n  \n  template<typename T1, typename op_type>\n  inline static uword\n  helper\n    (\n    Mat<uword>& indices,\n    const mtOp<uword, T1, op_type>& X,\n    const typename arma_op_rel_only<op_type>::result junk1 = 0,\n    const typename arma_not_cx<typename T1::elem_type>::result junk2 = 0\n    );\n  \n  template<typename T1, typename op_type>\n  inline static uword\n  helper\n    (\n    Mat<uword>& indices,\n    const mtOp<uword, T1, op_type>& X,\n    const typename arma_op_rel_only<op_type>::result junk1 = 0,\n    const typename arma_cx_only<typename T1::elem_type>::result junk2 = 0\n    );\n  \n  template<typename T1, typename T2, typename glue_type>\n  inline static uword\n  helper\n    (\n    Mat<uword>& indices,\n    const mtGlue<uword, T1, T2, glue_type>& X,\n    const typename arma_glue_rel_only<glue_type>::result junk1 = 0,\n    const typename arma_not_cx<typename T1::elem_type>::result junk2 = 0,\n    const typename arma_not_cx<typename T2::elem_type>::result junk3 = 0\n    );\n  \n  template<typename T1, typename T2, typename glue_type>\n  inline static uword\n  helper\n    (\n    Mat<uword>& indices,\n    const mtGlue<uword, T1, T2, glue_type>& X,\n    const typename arma_glue_rel_only<glue_type>::result junk1 = 0,\n    const typename arma_cx_only<typename T1::elem_type>::result junk2 = 0,\n    const typename arma_cx_only<typename T2::elem_type>::result junk3 = 0\n    );\n  \n  template<typename T1>\n  inline static void apply(Mat<uword>& out, const mtOp<uword, T1, op_find>& X);\n  };\n\n\n\nclass op_find_simple\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<uword>& out, const mtOp<uword, T1, op_find_simple>& X);\n  };\n\n\n\nclass op_find_finite\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<uword>& out, const mtOp<uword, T1, op_find_finite>& X);\n  };\n\n\n\nclass op_find_nonfinite\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<uword>& out, const mtOp<uword, T1, op_find_nonfinite>& X);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_find_meat.hpp",
    "content": "// Copyright (C) 2010-2014 Conrad Sanderson\n// Copyright (C) 2010-2014 NICTA (www.nicta.com.au)\n// Copyright (C) 2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_find\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nuword\nop_find::helper\n  (\n  Mat<uword>& indices,\n  const Base<typename T1::elem_type, T1>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> A(X.get_ref());\n  \n  const uword n_elem = A.get_n_elem();\n  \n  indices.set_size(n_elem, 1);\n  \n  uword* indices_mem = indices.memptr();\n  uword  n_nz        = 0;\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type PA = A.get_ea();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      if(PA[i] != eT(0))  { indices_mem[n_nz] = i;  ++n_nz; }\n      }\n    }\n  else\n    {\n    const uword n_rows = A.get_n_rows();\n    const uword n_cols = A.get_n_cols();\n    \n    uword i = 0;\n    \n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      if(A.at(row,col) != eT(0))  { indices_mem[n_nz] = i; ++n_nz; }\n      \n      ++i;\n      }\n    }\n  \n  return n_nz;\n  }\n\n\n\ntemplate<typename T1, typename op_type>\ninline\nuword\nop_find::helper\n  (\n  Mat<uword>& indices,\n  const mtOp<uword, T1, op_type>& X,\n  const typename arma_op_rel_only<op_type>::result           junk1,\n  const typename arma_not_cx<typename T1::elem_type>::result junk2\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  typedef typename T1::elem_type eT;\n  \n  const eT val = X.aux;\n  \n  const Proxy<T1> A(X.m);\n  \n  const uword n_elem = A.get_n_elem();\n  \n  indices.set_size(n_elem, 1);\n  \n  uword* indices_mem = indices.memptr();\n  uword  n_nz        = 0;\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type PA = A.get_ea();\n    \n    uword i,j;\n    for(i=0, j=1; j < n_elem; i+=2, j+=2)\n      {\n      const eT tpi = PA[i];\n      const eT tpj = PA[j];\n      \n      bool not_zero_i;\n      bool not_zero_j;\n      \n           if(is_same_type<op_type, op_rel_lt_pre   >::yes)  { not_zero_i = (val <  tpi); }\n      else if(is_same_type<op_type, op_rel_lt_post  >::yes)  { not_zero_i = (tpi <  val); }\n      else if(is_same_type<op_type, op_rel_gt_pre   >::yes)  { not_zero_i = (val >  tpi); }\n      else if(is_same_type<op_type, op_rel_gt_post  >::yes)  { not_zero_i = (tpi >  val); }\n      else if(is_same_type<op_type, op_rel_lteq_pre >::yes)  { not_zero_i = (val <= tpi); }\n      else if(is_same_type<op_type, op_rel_lteq_post>::yes)  { not_zero_i = (tpi <= val); }\n      else if(is_same_type<op_type, op_rel_gteq_pre >::yes)  { not_zero_i = (val >= tpi); }\n      else if(is_same_type<op_type, op_rel_gteq_post>::yes)  { not_zero_i = (tpi >= val); }\n      else if(is_same_type<op_type, op_rel_eq       >::yes)  { not_zero_i = (tpi == val); }\n      else if(is_same_type<op_type, op_rel_noteq    >::yes)  { not_zero_i = (tpi != val); }\n      else not_zero_i = false;\n      \n           if(is_same_type<op_type, op_rel_lt_pre   >::yes)  { not_zero_j = (val <  tpj); }\n      else if(is_same_type<op_type, op_rel_lt_post  >::yes)  { not_zero_j = (tpj <  val); }\n      else if(is_same_type<op_type, op_rel_gt_pre   >::yes)  { not_zero_j = (val >  tpj); }\n      else if(is_same_type<op_type, op_rel_gt_post  >::yes)  { not_zero_j = (tpj >  val); }\n      else if(is_same_type<op_type, op_rel_lteq_pre >::yes)  { not_zero_j = (val <= tpj); }\n      else if(is_same_type<op_type, op_rel_lteq_post>::yes)  { not_zero_j = (tpj <= val); }\n      else if(is_same_type<op_type, op_rel_gteq_pre >::yes)  { not_zero_j = (val >= tpj); }\n      else if(is_same_type<op_type, op_rel_gteq_post>::yes)  { not_zero_j = (tpj >= val); }\n      else if(is_same_type<op_type, op_rel_eq       >::yes)  { not_zero_j = (tpj == val); }\n      else if(is_same_type<op_type, op_rel_noteq    >::yes)  { not_zero_j = (tpj != val); }\n      else not_zero_j = false;\n      \n      if(not_zero_i == true)  { indices_mem[n_nz] = i;  ++n_nz; }\n      if(not_zero_j == true)  { indices_mem[n_nz] = j;  ++n_nz; }\n      }\n    \n    if(i < n_elem)\n      {\n      bool not_zero;\n      \n      const eT tmp = PA[i];\n      \n           if(is_same_type<op_type, op_rel_lt_pre   >::yes)  { not_zero = (val <  tmp); }\n      else if(is_same_type<op_type, op_rel_lt_post  >::yes)  { not_zero = (tmp <  val); }\n      else if(is_same_type<op_type, op_rel_gt_pre   >::yes)  { not_zero = (val >  tmp); }\n      else if(is_same_type<op_type, op_rel_gt_post  >::yes)  { not_zero = (tmp >  val); }\n      else if(is_same_type<op_type, op_rel_lteq_pre >::yes)  { not_zero = (val <= tmp); }\n      else if(is_same_type<op_type, op_rel_lteq_post>::yes)  { not_zero = (tmp <= val); }\n      else if(is_same_type<op_type, op_rel_gteq_pre >::yes)  { not_zero = (val >= tmp); }\n      else if(is_same_type<op_type, op_rel_gteq_post>::yes)  { not_zero = (tmp >= val); }\n      else if(is_same_type<op_type, op_rel_eq       >::yes)  { not_zero = (tmp == val); }\n      else if(is_same_type<op_type, op_rel_noteq    >::yes)  { not_zero = (tmp != val); }\n      else not_zero = false;\n      \n      if(not_zero == true)  { indices_mem[n_nz] = i;  ++n_nz; }\n      }\n    }\n  else\n    {\n    const uword n_rows = A.get_n_rows();\n    const uword n_cols = A.get_n_cols();\n    \n    uword i = 0;\n    \n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      const eT tmp = A.at(row,col);\n      \n      bool not_zero;\n      \n           if(is_same_type<op_type, op_rel_lt_pre   >::yes)  { not_zero = (val <  tmp); }\n      else if(is_same_type<op_type, op_rel_lt_post  >::yes)  { not_zero = (tmp <  val); }\n      else if(is_same_type<op_type, op_rel_gt_pre   >::yes)  { not_zero = (val >  tmp); }\n      else if(is_same_type<op_type, op_rel_gt_post  >::yes)  { not_zero = (tmp >  val); }\n      else if(is_same_type<op_type, op_rel_lteq_pre >::yes)  { not_zero = (val <= tmp); }\n      else if(is_same_type<op_type, op_rel_lteq_post>::yes)  { not_zero = (tmp <= val); }\n      else if(is_same_type<op_type, op_rel_gteq_pre >::yes)  { not_zero = (val >= tmp); }\n      else if(is_same_type<op_type, op_rel_gteq_post>::yes)  { not_zero = (tmp >= val); }\n      else if(is_same_type<op_type, op_rel_eq       >::yes)  { not_zero = (tmp == val); }\n      else if(is_same_type<op_type, op_rel_noteq    >::yes)  { not_zero = (tmp != val); }\n      else not_zero = false;\n      \n      if(not_zero == true)  { indices_mem[n_nz] = i;  ++n_nz; }\n      \n      ++i;\n      }\n    }\n  \n  return n_nz;\n  }\n\n\n\ntemplate<typename T1, typename op_type>\ninline\nuword\nop_find::helper\n  (\n  Mat<uword>& indices,\n  const mtOp<uword, T1, op_type>& X,\n  const typename arma_op_rel_only<op_type>::result            junk1,\n  const typename arma_cx_only<typename T1::elem_type>::result junk2\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  \n  typedef typename T1::elem_type      eT;\n  typedef typename Proxy<T1>::ea_type ea_type;\n  \n  const eT val = X.aux;\n  \n  const Proxy<T1> A(X.m);\n  \n  ea_type     PA     = A.get_ea();\n  const uword n_elem = A.get_n_elem();\n  \n  indices.set_size(n_elem, 1);\n  \n  uword* indices_mem = indices.memptr();\n  uword  n_nz        = 0;\n  \n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      const eT tmp = PA[i];\n      \n      bool not_zero;\n      \n           if(is_same_type<op_type, op_rel_eq   >::yes)  { not_zero = (tmp == val); }\n      else if(is_same_type<op_type, op_rel_noteq>::yes)  { not_zero = (tmp != val); }\n      else not_zero = false;\n      \n      if(not_zero == true) { indices_mem[n_nz] = i;  ++n_nz; }\n      }\n    }\n  else\n    {\n    const uword n_rows = A.get_n_rows();\n    const uword n_cols = A.get_n_cols();\n    \n    uword i = 0;\n    \n    for(uword col=0; col<n_cols; ++col)\n    for(uword row=0; row<n_rows; ++row)\n      {\n      const eT tmp = A.at(row,col);\n      \n      bool not_zero;\n      \n           if(is_same_type<op_type, op_rel_eq   >::yes)  { not_zero = (tmp == val); }\n      else if(is_same_type<op_type, op_rel_noteq>::yes)  { not_zero = (tmp != val); }\n      else not_zero = false;\n      \n      if(not_zero == true) { indices_mem[n_nz] = i;  ++n_nz; }\n      \n      i++;\n      }\n    }\n  \n  return n_nz;\n  }\n\n\n\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nuword\nop_find::helper\n  (\n  Mat<uword>& indices,\n  const mtGlue<uword, T1, T2, glue_type>& X,\n  const typename arma_glue_rel_only<glue_type>::result       junk1,\n  const typename arma_not_cx<typename T1::elem_type>::result junk2,\n  const typename arma_not_cx<typename T2::elem_type>::result junk3\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  arma_ignore(junk3);\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename Proxy<T1>::ea_type ea_type1;\n  typedef typename Proxy<T2>::ea_type ea_type2;\n  \n  const Proxy<T1> A(X.A);\n  const Proxy<T2> B(X.B);\n  \n  arma_debug_assert_same_size(A, B, \"relational operator\");\n  \n  ea_type1 PA = A.get_ea();\n  ea_type2 PB = B.get_ea();\n  \n  const uword n_elem = B.get_n_elem();\n  \n  indices.set_size(n_elem, 1);\n  \n  uword* indices_mem = indices.memptr();\n  uword  n_nz        = 0;\n  \n  for(uword i=0; i<n_elem; ++i)\n    {\n    const eT1 tmp1 = PA[i];\n    const eT2 tmp2 = PB[i];\n    \n    bool not_zero;\n    \n         if(is_same_type<glue_type, glue_rel_lt    >::yes)  { not_zero = (tmp1 <  tmp2); }\n    else if(is_same_type<glue_type, glue_rel_gt    >::yes)  { not_zero = (tmp1 >  tmp2); }\n    else if(is_same_type<glue_type, glue_rel_lteq  >::yes)  { not_zero = (tmp1 <= tmp2); }\n    else if(is_same_type<glue_type, glue_rel_gteq  >::yes)  { not_zero = (tmp1 >= tmp2); }\n    else if(is_same_type<glue_type, glue_rel_eq    >::yes)  { not_zero = (tmp1 == tmp2); }\n    else if(is_same_type<glue_type, glue_rel_noteq >::yes)  { not_zero = (tmp1 != tmp2); }\n    else if(is_same_type<glue_type, glue_rel_and   >::yes)  { not_zero = (tmp1 && tmp2); }\n    else if(is_same_type<glue_type, glue_rel_or    >::yes)  { not_zero = (tmp1 || tmp2); }\n    else not_zero = false;\n    \n    if(not_zero == true)  { indices_mem[n_nz] = i;  ++n_nz; }\n    }\n  \n  return n_nz;\n  }\n\n\n\ntemplate<typename T1, typename T2, typename glue_type>\ninline\nuword\nop_find::helper\n  (\n  Mat<uword>& indices,\n  const mtGlue<uword, T1, T2, glue_type>& X,\n  const typename arma_glue_rel_only<glue_type>::result        junk1,\n  const typename arma_cx_only<typename T1::elem_type>::result junk2,\n  const typename arma_cx_only<typename T2::elem_type>::result junk3\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n  arma_ignore(junk3);\n  \n  typedef typename Proxy<T1>::ea_type ea_type1;\n  typedef typename Proxy<T2>::ea_type ea_type2;\n  \n  const Proxy<T1> A(X.A);\n  const Proxy<T2> B(X.B);\n  \n  arma_debug_assert_same_size(A, B, \"relational operator\");\n  \n  ea_type1 PA = A.get_ea();\n  ea_type2 PB = B.get_ea();\n  \n  const uword n_elem = B.get_n_elem();\n  \n  indices.set_size(n_elem, 1);\n  \n  uword* indices_mem = indices.memptr();\n  uword  n_nz        = 0;\n  \n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      bool not_zero;\n      \n           if(is_same_type<glue_type, glue_rel_eq    >::yes)  { not_zero = (PA[i] == PB[i]); }\n      else if(is_same_type<glue_type, glue_rel_noteq >::yes)  { not_zero = (PA[i] != PB[i]); }\n      else not_zero = false;\n      \n      if(not_zero == true)  { indices_mem[n_nz] = i;  ++n_nz; }\n      }\n    }\n  else\n    {\n    const uword n_rows = A.get_n_rows();\n    const uword n_cols = A.get_n_cols();\n    \n    uword i = 0;\n    \n    for(uword col=0; col<n_cols; ++col)\n    for(uword row=0; row<n_rows; ++row)\n      {\n      bool not_zero;\n      \n           if(is_same_type<glue_type, glue_rel_eq    >::yes)  { not_zero = (A.at(row,col) == B.at(row,col)); }\n      else if(is_same_type<glue_type, glue_rel_noteq >::yes)  { not_zero = (A.at(row,col) != B.at(row,col)); }\n      else not_zero = false;\n      \n      if(not_zero == true)  { indices_mem[n_nz] = i;  ++n_nz; }\n      \n      i++;\n      }\n   }\n  \n  return n_nz;\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_find::apply(Mat<uword>& out, const mtOp<uword, T1, op_find>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword k    = X.aux_uword_a;\n  const uword type = X.aux_uword_b;\n  \n  Mat<uword> indices;\n  const uword n_nz = op_find::helper(indices, X.m);\n  \n  if(n_nz > 0)\n    {\n    if(type == 0)   // \"first\"\n      {\n      out = (k > 0 && k <= n_nz) ? indices.rows(0,      k-1   ) : indices.rows(0, n_nz-1);\n      }\n    else   // \"last\"\n      {\n      out = (k > 0 && k <= n_nz) ? indices.rows(n_nz-k, n_nz-1) : indices.rows(0, n_nz-1);\n      }\n    }\n  else\n    {\n    out.set_size(0,1);  // empty column vector\n    }\n  }\n\n\n\n//\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_find_simple::apply(Mat<uword>& out, const mtOp<uword, T1, op_find_simple>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<uword> indices;\n  const uword n_nz = op_find::helper(indices, X.m);\n  \n  out.steal_mem_col(indices, n_nz);\n  }\n\n\n\n//\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_find_finite::apply(Mat<uword>& out, const mtOp<uword, T1, op_find_finite>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<T1> P(X.m);\n  \n  const uword n_elem = P.get_n_elem();\n  \n  Mat<uword> indices(n_elem,1);\n  \n  uword* indices_mem = indices.memptr();\n  uword  count       = 0;\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    const typename Proxy<T1>::ea_type Pea = P.get_ea();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      if( arma_isfinite(Pea[i]) )  { indices_mem[count] = i; count++; }\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows(); \n    const uword n_cols = P.get_n_cols(); \n    \n    uword i = 0;\n    \n    for(uword col=0; col<n_cols; ++col)\n    for(uword row=0; row<n_rows; ++row)\n      {\n      if( arma_isfinite(P.at(row,col)) )  { indices_mem[count] = i; count++; }\n      \n      i++;\n      }\n    }\n  \n  out.steal_mem_col(indices, count);\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_find_nonfinite::apply(Mat<uword>& out, const mtOp<uword, T1, op_find_nonfinite>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<T1> P(X.m);\n  \n  const uword n_elem = P.get_n_elem();\n  \n  Mat<uword> indices(n_elem,1);\n  \n  uword* indices_mem = indices.memptr();\n  uword  count       = 0;\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    const typename Proxy<T1>::ea_type Pea = P.get_ea();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      if( arma_isfinite(Pea[i]) == false )  { indices_mem[count] = i; count++; }\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows(); \n    const uword n_cols = P.get_n_cols(); \n    \n    uword i = 0;\n    \n    for(uword col=0; col<n_cols; ++col)\n    for(uword row=0; row<n_rows; ++row)\n      {\n      if( arma_isfinite(P.at(row,col)) == false )  { indices_mem[count] = i; count++; }\n      \n      i++;\n      }\n    }\n  \n  out.steal_mem_col(indices, count);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_flip_bones.hpp",
    "content": "// Copyright (C) 2010 Conrad Sanderson\n// Copyright (C) 2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_flip\n//! @{\n\n\n\nclass op_flipud\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_flipud>& in);\n\n  };\n\n\n\n\nclass op_fliplr\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_fliplr>& in);\n\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_flip_meat.hpp",
    "content": "// Copyright (C) 2010-2015 Conrad Sanderson\n// Copyright (C) 2010-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_flip\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_flipud::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_flipud>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1>   tmp(in.m);\n  const Mat<eT>& X = tmp.M;\n  \n  const uword X_n_rows = X.n_rows;\n  \n  if(&out != &X)\n    {\n    out.copy_size(X);\n    \n    if(T1::is_col || X.is_colvec())\n      {\n      for(uword i=0; i<X_n_rows; ++i)  { out[i] = X[X_n_rows-1 - i]; }\n      }\n    else\n      {\n      for(uword i=0; i<X_n_rows; ++i)  { out.row(i) = X.row(X_n_rows-1 - i); }\n      }\n    }\n  else\n    {\n    const uword N = X_n_rows / 2;\n    \n    if(T1::is_col || X.is_colvec())\n      {\n      for(uword i=0; i<N; ++i)  { std::swap(out[i], out[X_n_rows-1 - i]); }\n      }\n    else\n      {\n      for(uword i=0; i<N; ++i)  { out.swap_rows(i, X_n_rows-1 - i); }\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_fliplr::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_fliplr>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1>   tmp(in.m);\n  const Mat<eT>& X = tmp.M;\n  \n  const uword X_n_cols = X.n_cols;\n  \n  if(&out != &X)\n    {\n    out.copy_size(X);\n    \n    if(T1::is_row || X.is_rowvec())\n      {\n      for(uword i=0; i<X_n_cols; ++i)  { out[i] = X[X_n_cols-1 - i]; }\n      }\n    else\n      {\n      for(uword i=0; i<X_n_cols; ++i)  { out.col(i) = X.col(X_n_cols-1 - i); }\n      }\n    }\n  else\n    {\n    const uword N = X_n_cols / 2;\n    \n    if(T1::is_row || X.is_rowvec())\n      {\n      for(uword i=0; i<N; ++i)  { std::swap(out[i], out[X_n_cols-1 - i]); }\n      }\n    else\n      {\n      for(uword i=0; i<N; ++i)  { out.swap_cols(i, X_n_cols-1 - i); }\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_hist_bones.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// Copyright (C) 2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_hist\n//! @{\n\n\n\nclass op_hist\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<uword>& out, const mtOp<uword, T1, op_hist>& X);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_hist_meat.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// Copyright (C) 2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_hist\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_hist::apply(Mat<uword>& out, const mtOp<uword, T1, op_hist>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword n_bins = X.aux_uword_a;\n  \n  const unwrap_check_mixed<T1> tmp(X.m, out);\n  const Mat<eT>& A           = tmp.M;\n  \n  \n        uword A_n_elem = A.n_elem;\n  const eT*   A_mem    = A.memptr();\n  \n  eT min_val = priv::most_pos<eT>();\n  eT max_val = priv::most_neg<eT>();\n  \n  uword i,j;\n  for(i=0, j=1; j < A_n_elem; i+=2, j+=2)\n    {\n    const eT val_i = A_mem[i];\n    const eT val_j = A_mem[j];\n    \n    if(min_val > val_i) { min_val = val_i; }\n    if(min_val > val_j) { min_val = val_j; }\n      \n    if(max_val < val_i) { max_val = val_i; }\n    if(max_val < val_j) { max_val = val_j; }\n    }\n  \n  if(i < A_n_elem)\n    {\n    const eT val_i = A_mem[i];\n    \n    if(min_val > val_i) { min_val = val_i; }\n    if(max_val < val_i) { max_val = val_i; }\n    }\n  \n  if(arma_isfinite(min_val) == false) { min_val = priv::most_neg<eT>(); }\n  if(arma_isfinite(max_val) == false) { max_val = priv::most_pos<eT>(); }\n  \n  if(n_bins >= 1)\n    {\n    Col<eT> c(n_bins);\n    eT* c_mem = c.memptr();\n    \n    for(uword ii=0; ii < n_bins; ++ii)\n      {\n      c_mem[ii] = (0.5 + ii) / double(n_bins);   // TODO: may need to be modified for integer matrices\n      }\n    \n    c = ((max_val - min_val) * c) + min_val;\n    \n    out = hist(A, c);\n    }\n  else\n    {\n    out.reset();\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_htrans_bones.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_htrans\n//! @{\n\n\n//! 'hermitian transpose' operation\n\nclass op_htrans\n  {\n  public:\n  \n  template<typename eT>\n  arma_hot arma_inline static void apply_mat_noalias(Mat<eT>& out, const Mat<eT>& A, const typename arma_not_cx<eT>::result* junk = 0);\n  \n  template<typename eT>\n  arma_hot      inline static void apply_mat_noalias(Mat<eT>& out, const Mat<eT>& A, const typename arma_cx_only<eT>::result* junk = 0);\n  \n  //\n  \n  template<typename eT>\n  arma_hot arma_inline static void apply_mat_inplace(Mat<eT>& out, const typename arma_not_cx<eT>::result* junk = 0);\n  \n  template<typename eT>\n  arma_hot      inline static void apply_mat_inplace(Mat<eT>& out, const typename arma_cx_only<eT>::result* junk = 0);\n  \n  //\n  \n  template<typename eT>\n  arma_hot arma_inline static void apply_mat(Mat<eT>& out, const Mat<eT>& A, const typename arma_not_cx<eT>::result* junk = 0);\n  \n  template<typename eT>\n  arma_hot      inline static void apply_mat(Mat<eT>& out, const Mat<eT>& A, const typename arma_cx_only<eT>::result* junk = 0);\n  \n  //\n  \n  template<typename T1>\n  arma_hot inline static void apply_proxy(Mat<typename T1::elem_type>& out, const T1& X);\n  \n  //\n  \n  template<typename T1>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_htrans>& in, const typename arma_not_cx<typename T1::elem_type>::result* junk = 0);\n  \n  template<typename T1>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_htrans>& in, const typename arma_cx_only<typename T1::elem_type>::result* junk = 0);\n  \n  //\n  \n  template<typename T1>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Op< Op<T1, op_trimat>, op_htrans>& in);\n  };\n\n\n\nclass op_htrans2\n  {\n  public:\n  \n  template<typename eT>\n  arma_hot inline static void apply_noalias(Mat<eT>& out, const Mat<eT>& A, const eT val);\n  \n  template<typename eT>\n  arma_hot inline static void apply(Mat<eT>& out, const Mat<eT>& A, const eT val);\n  \n  //\n  \n  template<typename T1>\n  arma_hot inline static void apply_proxy(Mat<typename T1::elem_type>& out, const T1& X, const typename T1::elem_type val);\n  \n  //\n  \n  template<typename T1>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_htrans2>& in, const typename arma_not_cx<typename T1::elem_type>::result* junk = 0);\n  \n  template<typename T1>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_htrans2>& in, const typename arma_cx_only<typename T1::elem_type>::result* junk = 0);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_htrans_meat.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// Copyright (C) 2012 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_htrans\n//! @{\n\n\n\ntemplate<typename eT>\narma_hot\narma_inline\nvoid\nop_htrans::apply_mat_noalias(Mat<eT>& out, const Mat<eT>& A, const typename arma_not_cx<eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  op_strans::apply_mat_noalias(out, A);\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\nop_htrans::apply_mat_noalias(Mat<eT>& out, const Mat<eT>& A, const typename arma_cx_only<eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const uword A_n_rows = A.n_rows;\n  const uword A_n_cols = A.n_cols;\n  \n  out.set_size(A_n_cols, A_n_rows);\n  \n  if( (A_n_cols == 1) || (A_n_rows == 1) )\n    {\n    const uword n_elem = A.n_elem;\n    \n    const eT* A_mem   = A.memptr();\n          eT* out_mem = out.memptr();\n    \n    for(uword i=0; i < n_elem; ++i)\n      {\n      out_mem[i] = std::conj(A_mem[i]);\n      }\n    }\n  else\n    {\n    eT* outptr = out.memptr();\n    \n    for(uword k=0; k < A_n_rows; ++k)\n      {\n      const eT* Aptr = &(A.at(k,0));\n      \n      for(uword j=0; j < A_n_cols; ++j)\n        {\n        (*outptr) = std::conj(*Aptr);\n        \n        Aptr += A_n_rows;\n        outptr++;\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\narma_inline\nvoid\nop_htrans::apply_mat_inplace(Mat<eT>& out, const typename arma_not_cx<eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  op_strans::apply_mat_inplace(out);\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\nop_htrans::apply_mat_inplace(Mat<eT>& out, const typename arma_cx_only<eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const uword n_rows = out.n_rows;\n  const uword n_cols = out.n_cols;\n    \n  if(n_rows == n_cols)\n    {\n    arma_extra_debug_print(\"doing in-place hermitian transpose of a square matrix\");\n    \n    for(uword col=0; col < n_cols; ++col)\n      {\n      eT* coldata = out.colptr(col);\n      \n      out.at(col,col) = std::conj( out.at(col,col) );\n      \n      for(uword row=(col+1); row < n_rows; ++row)\n        {\n        const eT val1 = std::conj(coldata[row]);\n        const eT val2 = std::conj(out.at(col,row));\n        \n        out.at(col,row) = val1;\n        coldata[row]    = val2;\n        }\n      }\n    }\n  else\n    {\n    Mat<eT> tmp;\n    \n    op_htrans::apply_mat_noalias(tmp, out);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\narma_inline\nvoid\nop_htrans::apply_mat(Mat<eT>& out, const Mat<eT>& A, const typename arma_not_cx<eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  op_strans::apply_mat(out, A);\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\nop_htrans::apply_mat(Mat<eT>& out, const Mat<eT>& A, const typename arma_cx_only<eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  if(&out != &A)\n    {\n    op_htrans::apply_mat_noalias(out, A);\n    }\n  else\n    {\n    op_htrans::apply_mat_inplace(out);\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_htrans::apply_proxy(Mat<typename T1::elem_type>& out, const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(X);\n  \n  // allow detection of in-place transpose\n  if( (is_Mat<typename Proxy<T1>::stored_type>::value == true) && (Proxy<T1>::fake_mat == false) )\n    {\n    const unwrap<typename Proxy<T1>::stored_type> tmp(P.Q);\n    \n    op_htrans::apply_mat(out, tmp.M);\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    const bool is_alias = P.is_alias(out);\n    \n    if( (resolves_to_vector<T1>::value == true) && (Proxy<T1>::prefer_at_accessor == false) )\n      {\n      if(is_alias == false)\n        {\n        out.set_size(n_cols, n_rows);\n        \n        eT* out_mem = out.memptr();\n        \n        const uword n_elem = P.get_n_elem();\n        \n        typename Proxy<T1>::ea_type Pea = P.get_ea();\n        \n        for(uword i=0; i < n_elem; ++i)\n          {\n          out_mem[i] = std::conj(Pea[i]);\n          }\n        }\n      else  // aliasing\n        {\n        Mat<eT> out2(n_cols, n_rows);\n        \n        eT* out_mem = out2.memptr();\n        \n        const uword n_elem = P.get_n_elem();\n        \n        typename Proxy<T1>::ea_type Pea = P.get_ea();\n        \n        for(uword i=0; i < n_elem; ++i)\n          {\n          out_mem[i] = std::conj(Pea[i]);\n          }\n        \n        out.steal_mem(out2);\n        }\n      }\n    else\n      {\n      if(is_alias == false)\n        {\n        out.set_size(n_cols, n_rows);\n        \n        eT* outptr = out.memptr();\n        \n        for(uword k=0; k < n_rows; ++k)\n          {\n          for(uword j=0; j < n_cols; ++j)\n            {\n            (*outptr) = std::conj(P.at(k,j));\n            \n            outptr++;\n            }\n          }\n        }\n      else // aliasing\n        {\n        Mat<eT> out2(n_cols, n_rows);\n        \n        eT* out2ptr = out2.memptr();\n        \n        for(uword k=0; k < n_rows; ++k)\n          {\n          for(uword j=0; j < n_cols; ++j)\n            {\n            (*out2ptr) = std::conj(P.at(k,j));\n            \n            out2ptr++;\n            }\n          }\n        \n        out.steal_mem(out2);\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_htrans::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_htrans>& in, const typename arma_not_cx<typename T1::elem_type>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  op_strans::apply_proxy(out, in.m);\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_htrans::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_htrans>& in, const typename arma_cx_only<typename T1::elem_type>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  op_htrans::apply_proxy(out, in.m);\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_htrans::apply(Mat<typename T1::elem_type>& out, const Op< Op<T1, op_trimat>, op_htrans>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1>   tmp(in.m.m);\n  const Mat<eT>& A = tmp.M;\n  \n  const bool upper = in.m.aux_uword_a;\n  \n  op_trimat::apply_htrans(out, A, upper);\n  }\n\n\n\n//\n// op_htrans2\n\n\n\ntemplate<typename eT>\narma_hot\narma_inline\nvoid\nop_htrans2::apply_noalias(Mat<eT>& out, const Mat<eT>& A, const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword A_n_rows = A.n_rows;\n  const uword A_n_cols = A.n_cols;\n  \n  out.set_size(A_n_cols, A_n_rows);\n  \n  if( (A_n_cols == 1) || (A_n_rows == 1) )\n    {\n    const uword n_elem = A.n_elem;\n    \n    const eT* A_mem   = A.memptr();\n          eT* out_mem = out.memptr();\n    \n    for(uword i=0; i < n_elem; ++i)\n      {\n      out_mem[i] = val * std::conj(A_mem[i]);\n      }\n    }\n  else\n    {\n    eT* outptr = out.memptr();\n    \n    for(uword k=0; k < A_n_rows; ++k)\n      {\n      const eT* Aptr = &(A.at(k,0));\n      \n      for(uword j=0; j < A_n_cols; ++j)\n        {\n        (*outptr) = val * std::conj(*Aptr);\n        \n        Aptr += A_n_rows;\n        outptr++;\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\nop_htrans2::apply(Mat<eT>& out, const Mat<eT>& A, const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(&out != &A)\n    {\n    op_htrans2::apply_noalias(out, A, val);\n    }\n  else\n    {\n    const uword n_rows = out.n_rows;\n    const uword n_cols = out.n_cols;\n      \n    if(n_rows == n_cols)\n      {\n      arma_extra_debug_print(\"doing in-place hermitian transpose of a square matrix\");\n      \n      // TODO: do multiplication while swapping\n      \n      for(uword col=0; col < n_cols; ++col)\n        {\n        eT* coldata = out.colptr(col);\n        \n        out.at(col,col) = std::conj( out.at(col,col) );\n        \n        for(uword row=(col+1); row < n_rows; ++row)\n          {\n          const eT val1 = std::conj(coldata[row]);\n          const eT val2 = std::conj(out.at(col,row));\n          \n          out.at(col,row) = val1;\n          coldata[row]    = val2;\n          }\n        }\n      \n      arrayops::inplace_mul( out.memptr(), val, out.n_elem );\n      }\n    else\n      {\n      Mat<eT> tmp;\n      op_htrans2::apply_noalias(tmp, A, val);\n      \n      out.steal_mem(tmp);\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_htrans2::apply_proxy(Mat<typename T1::elem_type>& out, const T1& X, const typename T1::elem_type val)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(X);\n  \n  // allow detection of in-place transpose\n  if( (is_Mat<typename Proxy<T1>::stored_type>::value == true) && (Proxy<T1>::fake_mat == false) )\n    {\n    const unwrap<typename Proxy<T1>::stored_type> tmp(P.Q);\n    \n    op_htrans2::apply(out, tmp.M, val);\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    const bool is_alias = P.is_alias(out);\n    \n    if( (resolves_to_vector<T1>::value == true) && (Proxy<T1>::prefer_at_accessor == false) )\n      {\n      if(is_alias == false)\n        {\n        out.set_size(n_cols, n_rows);\n        \n        eT* out_mem = out.memptr();\n        \n        const uword n_elem = P.get_n_elem();\n        \n        typename Proxy<T1>::ea_type Pea = P.get_ea();\n        \n        for(uword i=0; i < n_elem; ++i)\n          {\n          out_mem[i] = val * std::conj(Pea[i]);\n          }\n        }\n      else  // aliasing\n        {\n        Mat<eT> out2(n_cols, n_rows);\n        \n        eT* out_mem = out2.memptr();\n        \n        const uword n_elem = P.get_n_elem();\n        \n        typename Proxy<T1>::ea_type Pea = P.get_ea();\n        \n        for(uword i=0; i < n_elem; ++i)\n          {\n          out_mem[i] = val * std::conj(Pea[i]);\n          }\n        \n        out.steal_mem(out2);\n        }\n      }\n    else\n      {\n      if(is_alias == false)\n        {\n        out.set_size(n_cols, n_rows);\n        \n        eT* outptr = out.memptr();\n        \n        for(uword k=0; k < n_rows; ++k)\n          {\n          for(uword j=0; j < n_cols; ++j)\n            {\n            (*outptr) = val * std::conj(P.at(k,j));\n            \n            outptr++;\n            }\n          }\n        }\n      else // aliasing\n        {\n        Mat<eT> out2(n_cols, n_rows);\n        \n        eT* out2ptr = out2.memptr();\n        \n        for(uword k=0; k < n_rows; ++k)\n          {\n          for(uword j=0; j < n_cols; ++j)\n            {\n            (*out2ptr) = val * std::conj(P.at(k,j));\n            \n            out2ptr++;\n            }\n          }\n        \n        out.steal_mem(out2);\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_htrans2::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_htrans2>& in, const typename arma_not_cx<typename T1::elem_type>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  op_strans2::apply_proxy(out, in.m, in.aux);\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_htrans2::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_htrans2>& in, const typename arma_cx_only<typename T1::elem_type>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  op_htrans2::apply_proxy(out, in.m, in.aux);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_inv_bones.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_inv\n//! @{\n\n\n\n//! 'invert matrix' operation (general matrices)\nclass op_inv\n  {\n  public:\n  \n  template<typename eT>\n  inline static void apply(Mat<eT>& out, const Mat<eT>& A, const bool slow = false);\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_inv>& in);\n  \n  template<typename T1>\n  inline static bool apply_diagmat(Mat<typename T1::elem_type>& out, const T1& X);\n  };\n\n\n\n//! 'invert matrix' operation (triangular matrices)\nclass op_inv_tr\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_inv_tr>& in);\n  };\n\n\n\n//! 'invert matrix' operation (symmetric positive definite matrices)\nclass op_inv_sympd\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_inv_sympd>& in);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_inv_meat.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_inv\n//! @{\n\n\n//! immediate inverse of a matrix, storing the result in a dense matrix\ntemplate<typename eT>\ninline\nvoid\nop_inv::apply(Mat<eT>& out, const Mat<eT>& A, const bool slow)\n  {\n  arma_extra_debug_sigprint();\n  \n  // no need to check for aliasing, due to:\n  // - auxlib::inv() copies A to out before inversion\n  // - for 2x2 and 3x3 matrices the code is alias safe\n  \n  bool status = auxlib::inv(out, A, slow);\n  \n  if(status == false)\n    {\n    out.reset();\n    arma_bad(\"inv(): matrix appears to be singular\");\n    }\n  }\n\n\n\n//! immediate inverse of T1, storing the result in a dense matrix\ntemplate<typename T1>\ninline\nvoid\nop_inv::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_inv>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const strip_diagmat<T1> strip(X.m);\n  \n  bool status;\n  \n  if(strip.do_diagmat == true)\n    {\n    status = op_inv::apply_diagmat(out, strip.M);\n    }\n  else\n    {\n    const uword mode = X.aux_uword_a;\n    \n    status = (mode == 0) ? auxlib::inv(out, X.m) : auxlib::inv(out, X.m, true);\n    }\n    \n  if(status == false)\n    {\n    out.reset();\n    arma_bad(\"inv(): matrix appears to be singular\");\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\nop_inv::apply_diagmat(Mat<typename T1::elem_type>& out, const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const diagmat_proxy<T1> A(X);\n  \n  const uword N = A.n_elem;\n  \n  bool status = true;\n  \n  if(A.is_alias(out) == false)\n    {\n    out.zeros(N,N);\n    \n    for(uword i=0; i<N; ++i)\n      {\n      const eT val = A[i];\n      \n      out.at(i,i) = eT(1) / val;\n      \n      if(val == eT(0))  { status = false; }\n      }\n    }\n  else\n    {\n    Mat<eT> tmp(N, N, fill::zeros);\n    \n    for(uword i=0; i<N; ++i)\n      {\n      const eT val = A[i];\n      \n      tmp.at(i,i) = eT(1) / val;\n      \n      if(val == eT(0))  { status = false; }\n      }\n    \n    out.steal_mem(tmp);\n    }\n  \n  return status;\n  }\n\n\n\n//! inverse of T1 (triangular matrices)\ntemplate<typename T1>\ninline\nvoid\nop_inv_tr::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_inv_tr>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool status = auxlib::inv_tr(out, X.m, X.aux_uword_a);\n  \n  if(status == false)\n    {\n    out.reset();\n    arma_bad(\"inv(): matrix appears to be singular\");\n    }\n  }\n\n\n\n//! inverse of T1 (symmetric positive definite matrices)\ntemplate<typename T1>\ninline\nvoid\nop_inv_sympd::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_inv_sympd>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool status = auxlib::inv_sympd(out, X.m, X.aux_uword_a);\n  \n  if(status == false)\n    {\n    out.reset();\n    arma_bad(\"inv_sympd(): matrix appears to be singular\");\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_max_bones.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_max\n//! @{\n\n\nclass op_max\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_max>& in);\n  \n  template<typename eT>\n  inline static void apply_noalias(Mat<eT>& out, const Mat<eT>& X, const uword dim, const typename arma_not_cx<eT>::result* junk = 0);\n  \n  template<typename eT>\n  inline static void apply_noalias(Mat<eT>& out, const Mat<eT>& X, const uword dim, const typename arma_cx_only<eT>::result* junk = 0);\n  \n  \n  //\n  // for non-complex numbers\n  \n  template<typename eT>\n  inline static eT direct_max(const eT* const X, const uword N);\n  \n  template<typename eT>\n  inline static eT direct_max(const eT* const X, const uword N, uword& index_of_max_val);\n  \n  template<typename eT>\n  inline static eT direct_max(const Mat<eT>& X, const uword row);\n  \n  template<typename eT>\n  inline static eT max(const subview<eT>& X);\n  \n  template<typename T1>\n  inline static typename arma_not_cx<typename T1::elem_type>::result max(const Base<typename T1::elem_type, T1>& X);\n  \n  template<typename T1>\n  inline static typename arma_not_cx<typename T1::elem_type>::result max_with_index(const Proxy<T1>& P, uword& index_of_max_val);\n  \n\n  //\n  // for complex numbers\n  \n  template<typename T>\n  inline static std::complex<T> direct_max(const std::complex<T>* const X, const uword n_elem);\n  \n  template<typename T>\n  inline static std::complex<T> direct_max(const std::complex<T>* const X, const uword n_elem, uword& index_of_max_val);\n  \n  template<typename T>\n  inline static std::complex<T> direct_max(const Mat< std::complex<T> >& X, const uword row);\n  \n  template<typename T>\n  inline static std::complex<T> max(const subview< std::complex<T> >& X);\n  \n  template<typename T1>\n  inline static typename arma_cx_only<typename T1::elem_type>::result max(const Base<typename T1::elem_type, T1>& X);\n  \n  template<typename T1>\n  inline static typename arma_cx_only<typename T1::elem_type>::result max_with_index(const Proxy<T1>& P, uword& index_of_max_val);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_max_meat.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_max\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_max::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_max>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword dim = in.aux_uword_a;\n  arma_debug_check( (dim > 1), \"max(): parameter 'dim' must be 0 or 1\");\n  \n  const unwrap<T1>   U(in.m);\n  const Mat<eT>& X = U.M;\n  \n  if(&out != &X)\n    {\n    op_max::apply_noalias(out, X, dim);\n    }\n  else\n    {\n    Mat<eT> tmp;\n    \n    op_max::apply_noalias(tmp, X, dim);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nop_max::apply_noalias(Mat<eT>& out, const Mat<eT>& X, const uword dim, const typename arma_not_cx<eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  if(dim == 0)\n    {\n    arma_extra_debug_print(\"op_max::apply(): dim = 0\");\n    \n    out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols);\n    \n    if(X_n_rows == 0)  { return; }\n    \n    eT* out_mem = out.memptr();\n    \n    for(uword col=0; col<X_n_cols; ++col)\n      {\n      out_mem[col] = op_max::direct_max( X.colptr(col), X_n_rows );\n      }\n    }\n  else\n  if(dim == 1)\n    {\n    arma_extra_debug_print(\"op_max::apply(): dim = 1\");\n    \n    out.set_size(X_n_rows, (X_n_cols > 0) ? 1 : 0);\n    \n    if(X_n_cols == 0)  { return; }\n    \n    eT* out_mem = out.memptr();\n    \n    arrayops::copy(out_mem, X.colptr(0), X_n_rows);\n    \n    for(uword col=1; col<X_n_cols; ++col)\n      {\n      const eT* col_mem = X.colptr(col);\n      \n      for(uword row=0; row<X_n_rows; ++row)\n        {\n        const eT col_val = col_mem[row];\n        \n        if(col_val > out_mem[row])  { out_mem[row] = col_val; }\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nop_max::apply_noalias(Mat<eT>& out, const Mat<eT>& X, const uword dim, const typename arma_cx_only<eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  if(dim == 0)\n    {\n    arma_extra_debug_print(\"op_max::apply(): dim = 0\");\n    \n    out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols);\n    \n    if(X_n_rows == 0)  { return; }\n    \n    eT* out_mem = out.memptr();\n    \n    for(uword col=0; col<X_n_cols; ++col)\n      {\n      out_mem[col] = op_max::direct_max( X.colptr(col), X_n_rows );\n      }\n    }\n  else\n  if(dim == 1)\n    {\n    arma_extra_debug_print(\"op_max::apply(): dim = 1\");\n    \n    out.set_size(X_n_rows, (X_n_cols > 0) ? 1 : 0);\n    \n    if(X_n_cols == 0)  { return; }\n    \n    eT* out_mem = out.memptr();\n    \n    for(uword row=0; row<X_n_rows; ++row)\n      {\n      out_mem[row] = op_max::direct_max( X, row );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_pure\ninline\neT\nop_max::direct_max(const eT* const X, const uword n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  eT max_val = priv::most_neg<eT>();\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    const eT X_i = X[i];\n    const eT X_j = X[j];\n    \n    if(X_i > max_val) { max_val = X_i; }\n    if(X_j > max_val) { max_val = X_j; }\n    }\n  \n  \n  if(i < n_elem)\n    {\n    const eT X_i = X[i];\n    \n    if(X_i > max_val) { max_val = X_i; }\n    }\n  \n  return max_val;\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nop_max::direct_max(const eT* const X, const uword n_elem, uword& index_of_max_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  eT max_val = priv::most_neg<eT>();\n  \n  uword best_index = 0;\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    const eT X_i = X[i];\n    const eT X_j = X[j];\n    \n    if(X_i > max_val)\n      {\n      max_val    = X_i;\n      best_index = i;\n      }\n    \n    if(X_j > max_val)\n      {\n      max_val    = X_j;\n      best_index = j;\n      }\n    }\n  \n  \n  if(i < n_elem)\n    {\n    const eT X_i = X[i];\n    \n    if(X_i > max_val)\n      {\n      max_val    = X_i;\n      best_index = i;\n      }\n    }\n  \n  index_of_max_val = best_index;\n  \n  return max_val;\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nop_max::direct_max(const Mat<eT>& X, const uword row)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword X_n_cols = X.n_cols;\n  \n  eT max_val = priv::most_neg<eT>();\n  \n  uword i,j;\n  for(i=0, j=1; j < X_n_cols; i+=2, j+=2)\n    {\n    const eT tmp_i = X.at(row,i);\n    const eT tmp_j = X.at(row,j);\n    \n    if(tmp_i > max_val) { max_val = tmp_i; }\n    if(tmp_j > max_val) { max_val = tmp_j; }\n    }\n  \n  if(i < X_n_cols)\n    {\n    const eT tmp_i = X.at(row,i);\n    \n    if(tmp_i > max_val) { max_val = tmp_i; }\n    }\n  \n  return max_val;\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nop_max::max(const subview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(X.n_elem == 0)\n    {\n    arma_debug_check(true, \"max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  eT max_val = priv::most_neg<eT>();\n  \n  if(X_n_rows == 1)\n    {\n    const Mat<eT>& A = X.m;\n    \n    const uword start_row = X.aux_row1;\n    const uword start_col = X.aux_col1;\n    \n    const uword end_col_p1 = start_col + X_n_cols;\n    \n    uword i,j;\n    for(i=start_col, j=start_col+1; j < end_col_p1; i+=2, j+=2)\n      {\n      const eT tmp_i = A.at(start_row, i);\n      const eT tmp_j = A.at(start_row, j);\n      \n      if(tmp_i > max_val) { max_val = tmp_i; }\n      if(tmp_j > max_val) { max_val = tmp_j; }\n      }\n    \n    if(i < end_col_p1)\n      {\n      const eT tmp_i = A.at(start_row, i);\n      \n      if(tmp_i > max_val) { max_val = tmp_i; }\n      }\n    }\n  else\n    {\n    for(uword col=0; col < X_n_cols; ++col)\n      {\n      max_val = (std::max)(max_val, op_max::direct_max(X.colptr(col), X_n_rows));\n      }\n    }\n  \n  return max_val;\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename arma_not_cx<typename T1::elem_type>::result\nop_max::max(const Base<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(X.get_ref());\n  \n  const uword n_elem = P.get_n_elem();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  eT max_val = priv::most_neg<eT>();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n    ea_type A = P.get_ea();\n    \n    uword i,j;\n    \n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\n      {\n      const eT tmp_i = A[i];\n      const eT tmp_j = A[j];\n      \n      if(tmp_i > max_val) { max_val = tmp_i; }\n      if(tmp_j > max_val) { max_val = tmp_j; }\n      }\n    \n    if(i < n_elem)\n      {\n      const eT tmp_i = A[i];\n      \n      if(tmp_i > max_val) { max_val = tmp_i; }\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    if(n_rows == 1)\n      {\n      uword i,j;\n      for(i=0, j=1; j < n_cols; i+=2, j+=2)\n        {\n        const eT tmp_i = P.at(0,i);\n        const eT tmp_j = P.at(0,j);\n        \n        if(tmp_i > max_val) { max_val = tmp_i; }\n        if(tmp_j > max_val) { max_val = tmp_j; }\n        }\n      \n      if(i < n_cols)\n        {\n        const eT tmp_i = P.at(0,i);\n        \n        if(tmp_i > max_val) { max_val = tmp_i; }\n        }\n      }\n    else\n      {\n      for(uword col=0; col < n_cols; ++col)\n        {\n        uword i,j;\n        for(i=0, j=1; j < n_rows; i+=2, j+=2)\n          {\n          const eT tmp_i = P.at(i,col);\n          const eT tmp_j = P.at(j,col);\n          \n          if(tmp_i > max_val) { max_val = tmp_i; }\n          if(tmp_j > max_val) { max_val = tmp_j; }\n          }\n          \n        if(i < n_rows)\n          {\n          const eT tmp_i = P.at(i,col);\n          \n          if(tmp_i > max_val) { max_val = tmp_i; }\n          }\n        }\n      }\n    }\n  \n  return max_val;\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename arma_not_cx<typename T1::elem_type>::result\nop_max::max_with_index(const Proxy<T1>& P, uword& index_of_max_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword n_elem = P.get_n_elem();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  eT    best_val   = priv::most_neg<eT>();\n  uword best_index = 0;\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n    ea_type A = P.get_ea();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      const eT tmp = A[i];\n      \n      if(tmp > best_val)  { best_val = tmp;  best_index = i; }\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    if(n_rows == 1)\n      {\n      for(uword i=0; i < n_cols; ++i)\n        {\n        const eT tmp = P.at(0,i);\n        \n        if(tmp > best_val)  { best_val = tmp;  best_index = i; }\n        }\n      }\n    else\n    if(n_cols == 1)\n      {\n      for(uword i=0; i < n_rows; ++i)\n        {\n        const eT tmp = P.at(i,0);\n        \n        if(tmp > best_val)  { best_val = tmp;  best_index = i; }\n        }\n      }\n    else\n      {\n      uword count = 0;\n      \n      for(uword col=0; col < n_cols; ++col)\n      for(uword row=0; row < n_rows; ++row)\n        {\n        const eT tmp = P.at(row,col);\n        \n        if(tmp > best_val)  { best_val = tmp;  best_index = count; }\n        \n        ++count;\n        }\n      }\n    }\n  \n  index_of_max_val = best_index;\n  \n  return best_val;\n  }\n\n\n\ntemplate<typename T>\ninline\nstd::complex<T>\nop_max::direct_max(const std::complex<T>* const X, const uword n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  uword index   = 0;\n  T   max_val = priv::most_neg<T>();\n  \n  for(uword i=0; i<n_elem; ++i)\n    {\n    const T tmp_val = std::abs(X[i]);\n    \n    if(tmp_val > max_val)\n      {\n      max_val = tmp_val;\n      index   = i;\n      }\n    }\n  \n  return X[index];\n  }\n\n\n\ntemplate<typename T>\ninline\nstd::complex<T>\nop_max::direct_max(const std::complex<T>* const X, const uword n_elem, uword& index_of_max_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  uword index   = 0;\n  T   max_val = priv::most_neg<T>();\n  \n  for(uword i=0; i<n_elem; ++i)\n    {\n    const T tmp_val = std::abs(X[i]);\n    \n    if(tmp_val > max_val)\n      {\n      max_val = tmp_val;\n      index   = i;\n      }\n    }\n  \n  index_of_max_val = index;\n  \n  return X[index];\n  }\n\n\n\ntemplate<typename T>\ninline \nstd::complex<T>\nop_max::direct_max(const Mat< std::complex<T> >& X, const uword row)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword X_n_cols = X.n_cols;\n  \n  uword index   = 0;\n  T   max_val = priv::most_neg<T>();\n  \n  for(uword col=0; col<X_n_cols; ++col)\n    {\n    const T tmp_val = std::abs(X.at(row,col));\n    \n    if(tmp_val > max_val)\n      {\n      max_val = tmp_val;\n      index   = col;\n      }\n    }\n  \n  return X.at(row,index);\n  }\n\n\n\ntemplate<typename T>\ninline\nstd::complex<T>\nop_max::max(const subview< std::complex<T> >& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<T> eT;\n  \n  if(X.n_elem == 0)\n    {\n    arma_debug_check(true, \"max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  const Mat<eT>& A = X.m;\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  const uword start_row = X.aux_row1;\n  const uword start_col = X.aux_col1;\n  \n  const uword end_row_p1 = start_row + X_n_rows;\n  const uword end_col_p1 = start_col + X_n_cols;\n  \n  T max_val = priv::most_neg<T>();\n  \n  uword best_row = 0;\n  uword best_col = 0;\n    \n  if(X_n_rows == 1)\n    {\n    best_col = 0;\n    \n    for(uword col=start_col; col < end_col_p1; ++col)\n      {\n      const T tmp_val = std::abs( A.at(start_row, col) );\n      \n      if(tmp_val > max_val)\n        {\n        max_val  = tmp_val;\n        best_col = col;\n        }\n      }\n    \n    best_row = start_row;\n    }\n  else\n    {\n    for(uword col=start_col; col < end_col_p1; ++col)\n    for(uword row=start_row; row < end_row_p1; ++row)\n      {\n      const T tmp_val = std::abs( A.at(row, col) );\n      \n      if(tmp_val > max_val)\n        {\n        max_val  = tmp_val;\n        best_row = row;\n        best_col = col;\n        }\n      }\n    }\n  \n  return A.at(best_row, best_col);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename arma_cx_only<typename T1::elem_type>::result\nop_max::max(const Base<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result T;\n  \n  const Proxy<T1> P(X.get_ref());\n  \n  const uword n_elem = P.get_n_elem();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  T max_val = priv::most_neg<T>();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n    ea_type A = P.get_ea();\n    \n    uword index = 0;\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      const T tmp = std::abs(A[i]);\n      \n      if(tmp > max_val)\n        {\n        max_val = tmp;\n        index   = i;\n        }\n      }\n    \n    return( A[index] );\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    uword best_row = 0;\n    uword best_col = 0;\n    \n    if(n_rows == 1)\n      {\n      for(uword col=0; col < n_cols; ++col)\n        {\n        const T tmp = std::abs(P.at(0,col));\n        \n        if(tmp > max_val)\n          {\n          max_val  = tmp;\n          best_col = col;\n          }\n        }\n      }\n    else\n      {\n      for(uword col=0; col < n_cols; ++col)\n      for(uword row=0; row < n_rows; ++row)\n        {\n        const T tmp = std::abs(P.at(row,col));\n        \n        if(tmp > max_val)\n          {\n          max_val = tmp;\n          \n          best_row = row;\n          best_col = col;\n          }\n        }\n      }\n    \n    return P.at(best_row, best_col);\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename arma_cx_only<typename T1::elem_type>::result\nop_max::max_with_index(const Proxy<T1>& P, uword& index_of_max_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result T;\n  \n  const uword n_elem = P.get_n_elem();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  T best_val = priv::most_neg<T>();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n    ea_type A = P.get_ea();\n    \n    uword best_index = 0;\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      const T tmp = std::abs(A[i]);\n      \n      if(tmp > best_val)  { best_val = tmp;  best_index = i; }\n      }\n    \n    index_of_max_val = best_index;\n    \n    return( A[best_index] );\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    uword best_row   = 0;\n    uword best_col   = 0;\n    uword best_index = 0;\n    \n    if(n_rows == 1)\n      {\n      for(uword col=0; col < n_cols; ++col)\n        {\n        const T tmp = std::abs(P.at(0,col));\n        \n        if(tmp > best_val)  { best_val = tmp;  best_col = col; }\n        }\n      \n      best_index = best_col;\n      }\n    else\n    if(n_cols == 1)\n      {\n      for(uword row=0; row < n_rows; ++row)\n        {\n        const T tmp = std::abs(P.at(row,0));\n        \n        if(tmp > best_val)  { best_val = tmp;  best_row = row; }\n        }\n      \n      best_index = best_row;\n      }\n    else\n      {\n      uword count = 0;\n      \n      for(uword col=0; col < n_cols; ++col)\n      for(uword row=0; row < n_rows; ++row)\n        {\n        const T tmp = std::abs(P.at(row,col));\n        \n        if(tmp > best_val)\n          {\n          best_val = tmp;\n          \n          best_row = row;\n          best_col = col;\n          \n          best_index = count;\n          }\n        \n        ++count;\n        }\n      }\n    \n    index_of_max_val = best_index;\n    \n    return P.at(best_row, best_col);\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_mean_bones.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_mean\n//! @{\n\n\n//! Class for finding mean values of a matrix\nclass op_mean\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_mean>& in);\n  \n  template<typename T1>\n  inline static void apply_noalias(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword dim);\n  \n  template<typename T1>\n  inline static void apply_noalias_unwrap(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword dim);\n  \n  template<typename T1>\n  inline static void apply_noalias_proxy(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword dim);\n  \n  //\n  \n  template<typename eT>\n  inline static eT direct_mean(const eT* const X, const uword N);\n  \n  template<typename eT>\n  inline static eT direct_mean_robust(const eT* const X, const uword N);\n  \n\n  //\n  \n  template<typename eT>\n  inline static eT direct_mean(const Mat<eT>& X, const uword row);\n  \n  template<typename eT>\n  inline static eT direct_mean_robust(const Mat<eT>& X, const uword row);\n  \n\n  //\n  \n  template<typename eT>\n  inline static eT mean_all(const subview<eT>& X);\n  \n  template<typename eT>\n  inline static eT mean_all_robust(const subview<eT>& X);\n  \n  \n  //\n  \n  template<typename eT>\n  inline static eT mean_all(const diagview<eT>& X);\n  \n  template<typename eT>\n  inline static eT mean_all_robust(const diagview<eT>& X);\n  \n  \n  //\n  \n  template<typename T1>\n  inline static typename T1::elem_type mean_all(const Base<typename T1::elem_type, T1>& X);\n  \n  \n  //\n  \n  template<typename eT>\n  arma_inline static eT robust_mean(const eT A, const eT B);\n  \n  template<typename T>\n  arma_inline static std::complex<T> robust_mean(const std::complex<T>& A, const std::complex<T>& B);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_mean_meat.hpp",
    "content": "// Copyright (C) 2009-2015 Conrad Sanderson\n// Copyright (C) 2009-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_mean\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_mean::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_mean>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword dim = in.aux_uword_a;\n  arma_debug_check( (dim > 1), \"mean(): parameter 'dim' must be 0 or 1\" );\n  \n  const Proxy<T1> P(in.m);\n  \n  if(P.is_alias(out) == false)\n    {\n    op_mean::apply_noalias(out, P, dim);\n    }\n  else\n    {\n    Mat<eT> tmp;\n    \n    op_mean::apply_noalias(tmp, P, dim);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_mean::apply_noalias(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(is_Mat<typename Proxy<T1>::stored_type>::value)\n    {\n    op_mean::apply_noalias_unwrap(out, P, dim);\n    }\n  else\n    {\n    op_mean::apply_noalias_proxy(out, P, dim);\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_mean::apply_noalias_unwrap(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result  T;\n  \n  typedef typename Proxy<T1>::stored_type P_stored_type;\n  \n  const unwrap<P_stored_type> tmp(P.Q);\n  \n  const typename unwrap<P_stored_type>::stored_type& X = tmp.M;\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  if(dim == 0)\n    {\n    out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols);\n    \n    if(X_n_rows == 0)  { return; }\n    \n    eT* out_mem = out.memptr();\n    \n    for(uword col=0; col < X_n_cols; ++col)\n      {\n      out_mem[col] = op_mean::direct_mean( X.colptr(col), X_n_rows );\n      }\n    }\n  else\n  if(dim == 1)\n    {\n    out.zeros(X_n_rows, (X_n_cols > 0) ? 1 : 0);\n    \n    if(X_n_cols == 0)  { return; }\n    \n    eT* out_mem = out.memptr();\n    \n    for(uword col=0; col < X_n_cols; ++col)\n      {\n      const eT* col_mem = X.colptr(col);\n      \n      for(uword row=0; row < X_n_rows; ++row)\n        {\n        out_mem[row] += col_mem[row];\n        }\n      }\n    \n    out /= T(X_n_cols);\n    \n    for(uword row=0; row < X_n_rows; ++row)\n      {\n      if(arma_isfinite(out_mem[row]) == false)\n        {\n        out_mem[row] = op_mean::direct_mean_robust( X, row );\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_mean::apply_noalias_proxy(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result  T;\n  \n  const uword P_n_rows = P.get_n_rows();\n  const uword P_n_cols = P.get_n_cols();\n  \n  if(dim == 0)\n    {\n    out.set_size((P_n_rows > 0) ? 1 : 0, P_n_cols);\n    \n    if(P_n_rows == 0)  { return; }\n    \n    eT* out_mem = out.memptr();\n    \n    for(uword col=0; col < P_n_cols; ++col)\n      {\n      eT val1 = eT(0);\n      eT val2 = eT(0);\n      \n      uword i,j;\n      for(i=0, j=1; j < P_n_rows; i+=2, j+=2)\n        {\n        val1 += P.at(i,col);\n        val2 += P.at(j,col);\n        }\n      \n      if(i < P_n_rows)\n        {\n        val1 += P.at(i,col);\n        }\n      \n      out_mem[col] = (val1 + val2) / T(P_n_rows);\n      }\n    }\n  else\n  if(dim == 1)\n    {\n    out.zeros(P_n_rows, (P_n_cols > 0) ? 1 : 0);\n    \n    if(P_n_cols == 0)  { return; }\n    \n    eT* out_mem = out.memptr();\n    \n    for(uword col=0; col < P_n_cols; ++col)\n    for(uword row=0; row < P_n_rows; ++row)\n      {\n      out_mem[row] += P.at(row,col);\n      }\n    \n    out /= T(P_n_cols);\n    }\n  \n  if(out.is_finite() == false)\n    {\n    // TODO: replace with dedicated handling to avoid unwrapping\n    op_mean::apply_noalias_unwrap(out, P, dim);\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_pure\ninline\neT\nop_mean::direct_mean(const eT* const X, const uword n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  const eT result = arrayops::accumulate(X, n_elem) / T(n_elem);\n  \n  return arma_isfinite(result) ? result : op_mean::direct_mean_robust(X, n_elem);\n  }\n\n\n\ntemplate<typename eT>\narma_pure\ninline\neT\nop_mean::direct_mean_robust(const eT* const X, const uword n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  // use an adapted form of the mean finding algorithm from the running_stat class\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  uword i,j;\n  \n  eT r_mean = eT(0);\n  \n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    const eT Xi = X[i];\n    const eT Xj = X[j];\n    \n    r_mean = r_mean + (Xi - r_mean)/T(j);    // we need i+1, and j is equivalent to i+1 here\n    r_mean = r_mean + (Xj - r_mean)/T(j+1);\n    }\n  \n  \n  if(i < n_elem)\n    {\n    const eT Xi = X[i];\n    \n    r_mean = r_mean + (Xi - r_mean)/T(i+1);\n    }\n  \n  return r_mean;\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nop_mean::direct_mean(const Mat<eT>& X, const uword row)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  const uword X_n_cols = X.n_cols;\n  \n  eT val = eT(0);\n  \n  uword i,j;\n  for(i=0, j=1; j < X_n_cols; i+=2, j+=2)\n    {\n    val += X.at(row,i);\n    val += X.at(row,j);\n    }\n  \n  if(i < X_n_cols)\n    {\n    val += X.at(row,i);\n    }\n  \n  const eT result = val / T(X_n_cols);\n  \n  return arma_isfinite(result) ? result : op_mean::direct_mean_robust(X, row);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nop_mean::direct_mean_robust(const Mat<eT>& X, const uword row)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  const uword X_n_cols = X.n_cols;\n  \n  eT r_mean = eT(0);\n  \n  for(uword col=0; col < X_n_cols; ++col)\n    {\n    r_mean = r_mean + (X.at(row,col) - r_mean)/T(col+1);\n    }\n  \n  return r_mean;\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nop_mean::mean_all(const subview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  const uword X_n_elem = X.n_elem;\n  \n  if(X_n_elem == 0)\n    {\n    arma_debug_check(true, \"mean(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  eT val = eT(0);\n  \n  if(X_n_rows == 1)\n    {\n    const Mat<eT>& A = X.m;\n    \n    const uword start_row = X.aux_row1;\n    const uword start_col = X.aux_col1;\n    \n    const uword end_col_p1 = start_col + X_n_cols;\n    \n    uword i,j;\n    for(i=start_col, j=start_col+1; j < end_col_p1; i+=2, j+=2)\n      {\n      val += A.at(start_row, i);\n      val += A.at(start_row, j);\n      }\n    \n    if(i < end_col_p1)\n      {\n      val += A.at(start_row, i);\n      }\n    }\n  else\n    {\n    for(uword col=0; col < X_n_cols; ++col)\n      {\n      val += arrayops::accumulate(X.colptr(col), X_n_rows);\n      }\n    }\n  \n  const eT result = val / T(X_n_elem);\n  \n  return arma_isfinite(result) ? result : op_mean::mean_all_robust(X);\n  }\n\n\n\ntemplate<typename eT>\ninline \neT\nop_mean::mean_all_robust(const subview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  const uword start_row = X.aux_row1;\n  const uword start_col = X.aux_col1;\n  \n  const uword end_row_p1 = start_row + X_n_rows;\n  const uword end_col_p1 = start_col + X_n_cols;\n  \n  const Mat<eT>& A = X.m;\n  \n  \n  eT r_mean = eT(0);\n  \n  if(X_n_rows == 1)\n    {\n    uword i=0;\n    \n    for(uword col = start_col; col < end_col_p1; ++col, ++i)\n      {\n      r_mean = r_mean + (A.at(start_row,col) - r_mean)/T(i+1);\n      }\n    }\n  else\n    {\n    uword i=0;\n    \n    for(uword col = start_col; col < end_col_p1; ++col)\n    for(uword row = start_row; row < end_row_p1; ++row, ++i)\n      {\n      r_mean = r_mean + (A.at(row,col) - r_mean)/T(i+1);\n      }\n    }\n  \n  return r_mean;\n  }\n\n\n\ntemplate<typename eT>\ninline \neT\nop_mean::mean_all(const diagview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  const uword X_n_elem = X.n_elem;\n  \n  if(X_n_elem == 0)\n    {\n    arma_debug_check(true, \"mean(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  eT val = eT(0);\n  \n  for(uword i=0; i<X_n_elem; ++i)\n    {\n    val += X[i];\n    }\n  \n  const eT result = val / T(X_n_elem);\n  \n  return arma_isfinite(result) ? result : op_mean::mean_all_robust(X);\n  }\n\n\n\ntemplate<typename eT>\ninline \neT\nop_mean::mean_all_robust(const diagview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  const uword X_n_elem = X.n_elem;\n  \n  eT r_mean = eT(0);\n  \n  for(uword i=0; i<X_n_elem; ++i)\n    {\n    r_mean = r_mean + (X[i] - r_mean)/T(i+1);\n    }\n  \n  return r_mean;\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::elem_type \nop_mean::mean_all(const Base<typename T1::elem_type, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1>   tmp(X.get_ref());\n  const Mat<eT>& A = tmp.M;\n  \n  const uword A_n_elem = A.n_elem;\n  \n  if(A_n_elem == 0)\n    {\n    arma_debug_check(true, \"mean(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  return op_mean::direct_mean(A.memptr(), A_n_elem);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT\nop_mean::robust_mean(const eT A, const eT B)\n  {\n  return A + (B - A)/eT(2);\n  }\n\n\n\ntemplate<typename T>\narma_inline\nstd::complex<T>\nop_mean::robust_mean(const std::complex<T>& A, const std::complex<T>& B)\n  {\n  return A + (B - A)/T(2);\n  }\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_median_bones.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_median\n//! @{\n\n\ntemplate<typename T>\nstruct arma_cx_median_packet\n  {\n  T     val;\n  uword index;\n  };\n\n\n\ntemplate<typename T>\narma_inline\nbool\noperator< (const arma_cx_median_packet<T>& A, const arma_cx_median_packet<T>& B)\n  {\n  return A.val < B.val;\n  }\n\n\n\n//! Class for finding median values of a matrix\nclass op_median\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_median>& in);\n  \n  template<typename T, typename T1>\n  inline static void apply(Mat< std::complex<T> >& out, const Op<T1,op_median>& in);\n  \n  //\n  //\n  \n  template<typename T1>\n  inline static typename T1::elem_type median_vec(const T1& X, const typename arma_not_cx<typename T1::elem_type>::result* junk = 0);\n  \n  template<typename T1>\n  inline static typename T1::elem_type median_vec(const T1& X, const typename arma_cx_only<typename T1::elem_type>::result* junk = 0);\n  \n  //\n  //\n  \n  template<typename eT>\n  inline static eT direct_median(std::vector<eT>& X);\n  \n  template<typename T>\n  inline static void direct_cx_median_index(uword& out_index1, uword& out_index2, std::vector< arma_cx_median_packet<T> >& X);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_median_meat.hpp",
    "content": "// Copyright (C) 2009-2015 Conrad Sanderson\n// Copyright (C) 2009-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_median\n//! @{\n\n\n\n//! \\brief\n//! For each row or for each column, find the median value.\n//! The result is stored in a dense matrix that has either one column or one row.\n//! The dimension, for which the medians are found, is set via the median() function.\ntemplate<typename T1>\ninline\nvoid\nop_median::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_median>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword dim = in.aux_uword_a;\n  arma_debug_check( (dim > 1), \"median(): parameter 'dim' must be 0 or 1\" );\n  \n  const Proxy<T1> P(in.m);\n  \n  typedef typename Proxy<T1>::stored_type P_stored_type;\n  \n  const bool is_alias = P.is_alias(out);\n  \n  if( (is_Mat<P_stored_type>::value == true) || is_alias )\n    {\n    const unwrap_check<P_stored_type> tmp(P.Q, is_alias);\n    \n    const typename unwrap_check<P_stored_type>::stored_type& X = tmp.M;\n    \n    const uword X_n_rows = X.n_rows;\n    const uword X_n_cols = X.n_cols;\n    \n    if(dim == 0)  // in each column\n      {\n      arma_extra_debug_print(\"op_median::apply(): dim = 0\");\n      \n      out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols);\n      \n      if(X_n_rows > 0)\n        {\n        std::vector<eT> tmp_vec(X_n_rows);\n        \n        for(uword col=0; col < X_n_cols; ++col)\n          {\n          arrayops::copy( &(tmp_vec[0]), X.colptr(col), X_n_rows );\n          \n          out[col] = op_median::direct_median(tmp_vec);\n          }\n        }\n      }\n    else  // in each row\n      {\n      arma_extra_debug_print(\"op_median::apply(): dim = 1\");\n      \n      out.set_size(X_n_rows, (X_n_cols > 0) ? 1 : 0);\n      \n      if(X_n_cols > 0)\n        {\n        std::vector<eT> tmp_vec(X_n_cols);\n          \n        for(uword row=0; row < X_n_rows; ++row)\n          {\n          for(uword col=0; col < X_n_cols; ++col)  { tmp_vec[col] = X.at(row,col); }\n          \n          out[row] = op_median::direct_median(tmp_vec);\n          }\n        }\n      }\n    }\n  else\n    {\n    const uword P_n_rows = P.get_n_rows();\n    const uword P_n_cols = P.get_n_cols();\n    \n    if(dim == 0)  // in each column\n      {\n      arma_extra_debug_print(\"op_median::apply(): dim = 0\");\n      \n      out.set_size((P_n_rows > 0) ? 1 : 0, P_n_cols);\n      \n      if(P_n_rows > 0)\n        {\n        std::vector<eT> tmp_vec(P_n_rows);\n        \n        for(uword col=0; col < P_n_cols; ++col)\n          {\n          for(uword row=0; row < P_n_rows; ++row)  { tmp_vec[row] = P.at(row,col); }\n          \n          out[col] = op_median::direct_median(tmp_vec);\n          }\n        }\n      }\n    else  // in each row\n      {\n      arma_extra_debug_print(\"op_median::apply(): dim = 1\");\n      \n      out.set_size(P_n_rows, (P_n_cols > 0) ? 1 : 0);\n      \n      if(P_n_cols > 0)\n        {\n        std::vector<eT> tmp_vec(P_n_cols);\n          \n        for(uword row=0; row < P_n_rows; ++row)\n          {\n          for(uword col=0; col < P_n_cols; ++col)  { tmp_vec[col] = P.at(row,col); }\n          \n          out[row] = op_median::direct_median(tmp_vec);\n          }\n        }\n      }\n    }\n  }\n\n\n\n//! Implementation for complex numbers\ntemplate<typename T, typename T1>\ninline\nvoid\nop_median::apply(Mat< std::complex<T> >& out, const Op<T1,op_median>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<T> eT;\n  \n  arma_type_check(( is_same_type<eT, typename T1::elem_type>::no ));\n  \n  const unwrap_check<T1> tmp(in.m, out);\n  const Mat<eT>&     X = tmp.M;\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  const uword dim = in.aux_uword_a;\n  arma_debug_check( (dim > 1), \"median(): parameter 'dim' must be 0 or 1\" );\n  \n  if(dim == 0)  // in each column\n    {\n    arma_extra_debug_print(\"op_median::apply(): dim = 0\");\n    \n    out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols);\n    \n    if(X_n_rows > 0)\n      {\n      std::vector< arma_cx_median_packet<T> > tmp_vec(X_n_rows);\n      \n      for(uword col=0; col<X_n_cols; ++col)\n        {\n        const eT* colmem = X.colptr(col);\n        \n        for(uword row=0; row<X_n_rows; ++row)\n          {\n          tmp_vec[row].val   = std::abs(colmem[row]);\n          tmp_vec[row].index = row;\n          }\n        \n        uword index1;\n        uword index2;\n        op_median::direct_cx_median_index(index1, index2, tmp_vec);\n          \n        out[col] = op_mean::robust_mean(colmem[index1], colmem[index2]);\n        }\n      }\n    }\n  else\n  if(dim == 1)  // in each row\n    {\n    arma_extra_debug_print(\"op_median::apply(): dim = 1\");\n    \n    out.set_size(X_n_rows, (X_n_cols > 0) ? 1 : 0);\n    \n    if(X_n_cols > 0)\n      {\n      std::vector< arma_cx_median_packet<T> > tmp_vec(X_n_cols);\n      \n      for(uword row=0; row<X_n_rows; ++row)\n        {\n        for(uword col=0; col<X_n_cols; ++col)\n          {\n          tmp_vec[col].val   = std::abs(X.at(row,col));\n          tmp_vec[col].index = col;\n          }\n        \n        uword index1;\n        uword index2;\n        op_median::direct_cx_median_index(index1, index2, tmp_vec);\n        \n        out[row] = op_mean::robust_mean( X.at(row,index1), X.at(row,index2) );\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::elem_type\nop_median::median_vec\n  (\n  const T1& X,\n  const typename arma_not_cx<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  \n  typedef typename Proxy<T1>::stored_type P_stored_type;\n    \n  const Proxy<T1> P(X);\n  \n  const uword n_elem = P.get_n_elem();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"median(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  std::vector<eT> tmp_vec(n_elem);\n  \n  if(is_Mat<P_stored_type>::value == true)\n    {\n    const unwrap<P_stored_type> tmp(P.Q);\n    \n    const typename unwrap<P_stored_type>::stored_type& Y = tmp.M;\n    \n    arrayops::copy( &(tmp_vec[0]), Y.memptr(), n_elem );\n    }\n  else\n    {\n    if(Proxy<T1>::prefer_at_accessor == false)\n      {\n      typedef typename Proxy<T1>::ea_type ea_type;\n      \n      ea_type A = P.get_ea();\n      \n      for(uword i=0; i<n_elem; ++i)  { tmp_vec[i] = A[i]; }\n      }\n    else\n      {\n      const uword n_rows = P.get_n_rows();\n      const uword n_cols = P.get_n_cols();\n      \n      if(n_cols == 1)\n        {\n        for(uword row=0; row < n_rows; ++row)  { tmp_vec[row] = P.at(row,0); }\n        }\n      else\n      if(n_rows == 1)\n        {\n        for(uword col=0; col < n_cols; ++col)  { tmp_vec[col] = P.at(0,col); }\n        }\n      else\n        {\n        arma_stop(\"op_median::median_vec(): expected a vector\" );\n        }\n      }\n    }\n  \n  return op_median::direct_median(tmp_vec);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::elem_type\nop_median::median_vec\n  (\n  const T1& X,\n  const typename arma_cx_only<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  typedef typename T1::pod_type   T;\n  \n  const Proxy<T1> P(X);\n  \n  const uword n_elem = P.get_n_elem();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"median(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  std::vector< arma_cx_median_packet<T> > tmp_vec(n_elem);\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n    ea_type A = P.get_ea();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      tmp_vec[i].val   = std::abs( A[i] );\n      tmp_vec[i].index = i;\n      }\n    \n    uword index1;\n    uword index2;\n    op_median::direct_cx_median_index(index1, index2, tmp_vec);\n    \n    return op_mean::robust_mean( A[index1], A[index2] );\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    if(n_cols == 1)\n      {\n      for(uword row=0; row < n_rows; ++row)\n        {\n        tmp_vec[row].val   = std::abs( P.at(row,0) );\n        tmp_vec[row].index = row;\n        }\n      \n      uword index1;\n      uword index2;\n      op_median::direct_cx_median_index(index1, index2, tmp_vec);\n      \n      return op_mean::robust_mean( P.at(index1,0), P.at(index2,0) );\n      }\n    else\n    if(n_rows == 1)\n      {\n      for(uword col=0; col < n_cols; ++col)\n        {\n        tmp_vec[col].val   = std::abs( P.at(0,col) );\n        tmp_vec[col].index = col;\n        }\n      \n      uword index1;\n      uword index2;\n      op_median::direct_cx_median_index(index1, index2, tmp_vec);\n      \n      return op_mean::robust_mean( P.at(0,index1), P.at(0,index2) );\n      }\n    else\n      {\n      arma_stop(\"op_median::median_vec(): expected a vector\" );\n      \n      return eT(0);\n      }\n    }\n  }\n\n\n\n//! find the median value of a std::vector (contents is modified)\ntemplate<typename eT>\ninline \neT\nop_median::direct_median(std::vector<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_elem = uword(X.size());\n  const uword half   = n_elem/2;\n  \n  typename std::vector<eT>::iterator first    = X.begin();\n  typename std::vector<eT>::iterator nth      = first + half;\n  typename std::vector<eT>::iterator pastlast = X.end();\n  \n  std::nth_element(first, nth, pastlast);\n  \n  if((n_elem % 2) == 0)  // even number of elements\n    {\n    typename std::vector<eT>::iterator start   = X.begin();\n    typename std::vector<eT>::iterator pastend = start + half;\n    \n    const eT val1 = (*nth);\n    const eT val2 = (*(std::max_element(start, pastend)));\n    \n    return op_mean::robust_mean(val1, val2);\n    }\n  else  // odd number of elements\n    {\n    return (*nth);\n    }\n  }\n\n\n\ntemplate<typename T>\ninline \nvoid\nop_median::direct_cx_median_index\n  (\n  uword& out_index1, \n  uword& out_index2, \n  std::vector< arma_cx_median_packet<T> >& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef arma_cx_median_packet<T> eT;\n  \n  const uword n_elem = uword(X.size());\n  const uword half   = n_elem/2;\n  \n  typename std::vector<eT>::iterator first    = X.begin();\n  typename std::vector<eT>::iterator nth      = first + half;\n  typename std::vector<eT>::iterator pastlast = X.end();\n  \n  std::nth_element(first, nth, pastlast);\n  \n  out_index1 = (*nth).index;\n  \n  if((n_elem % 2) == 0)  // even number of elements\n    {\n    typename std::vector<eT>::iterator start   = X.begin();\n    typename std::vector<eT>::iterator pastend = start + half;\n    \n    out_index2 = (*(std::max_element(start, pastend))).index;\n    }\n  else  // odd number of elements\n    {\n    out_index2 = out_index1;\n    }\n  }\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_min_bones.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_min\n//! @{\n\n\nclass op_min\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_min>& in);\n  \n  template<typename eT>\n  inline static void apply_noalias(Mat<eT>& out, const Mat<eT>& X, const uword dim, const typename arma_not_cx<eT>::result* junk = 0);\n  \n  template<typename eT>\n  inline static void apply_noalias(Mat<eT>& out, const Mat<eT>& X, const uword dim, const typename arma_cx_only<eT>::result* junk = 0);\n  \n  \n  //\n  // for non-complex numbers\n  \n  template<typename eT>\n  inline static eT direct_min(const eT* const X, const uword N);\n  \n  template<typename eT>\n  inline static eT direct_min(const eT* const X, const uword N, uword& index_of_min_val);\n  \n  template<typename eT>\n  inline static eT direct_min(const Mat<eT>& X, const uword row);\n  \n  template<typename eT>\n  inline static eT min(const subview<eT>& X);\n  \n  template<typename T1>\n  inline static typename arma_not_cx<typename T1::elem_type>::result min(const Base<typename T1::elem_type, T1>& X);\n  \n  template<typename T1>\n  inline static typename arma_not_cx<typename T1::elem_type>::result min_with_index(const Proxy<T1>& P, uword& index_of_min_val);\n  \n  \n  //\n  // for complex numbers\n  \n  template<typename T>\n  inline static std::complex<T> direct_min(const std::complex<T>* const X, const uword n_elem);\n  \n  template<typename T>\n  inline static std::complex<T> direct_min(const std::complex<T>* const X, const uword n_elem, uword& index_of_min_val);\n  \n  template<typename T>\n  inline static std::complex<T> direct_min(const Mat< std::complex<T> >& X, const uword row);\n  \n  template<typename T>\n  inline static std::complex<T> min(const subview< std::complex<T> >&X);\n  \n  template<typename T1>\n  inline static typename arma_cx_only<typename T1::elem_type>::result min(const Base<typename T1::elem_type, T1>& X);\n  \n  template<typename T1>\n  inline static typename arma_cx_only<typename T1::elem_type>::result min_with_index(const Proxy<T1>& P, uword& index_of_min_val);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_min_meat.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_min\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_min::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_min>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword dim = in.aux_uword_a;\n  arma_debug_check( (dim > 1), \"min(): parameter 'dim' must be 0 or 1\");\n  \n  const unwrap<T1>   U(in.m);\n  const Mat<eT>& X = U.M;\n  \n  if(&out != &X)\n    {\n    op_min::apply_noalias(out, X, dim);\n    }\n  else\n    {\n    Mat<eT> tmp;\n    \n    op_min::apply_noalias(tmp, X, dim);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nop_min::apply_noalias(Mat<eT>& out, const Mat<eT>& X, const uword dim, const typename arma_not_cx<eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  if(dim == 0)\n    {\n    arma_extra_debug_print(\"op_min::apply(): dim = 0\");\n    \n    out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols);\n    \n    if(X_n_rows == 0)  { return; }\n    \n    eT* out_mem = out.memptr();\n    \n    for(uword col=0; col<X_n_cols; ++col)\n      {\n      out_mem[col] = op_min::direct_min( X.colptr(col), X_n_rows );\n      }\n    }\n  else\n  if(dim == 1)\n    {\n    arma_extra_debug_print(\"op_min::apply(): dim = 1\");\n    \n    out.set_size(X_n_rows, (X_n_cols > 0) ? 1 : 0);\n    \n    if(X_n_cols == 0)  { return; }\n    \n    eT* out_mem = out.memptr();\n    \n    arrayops::copy(out_mem, X.colptr(0), X_n_rows);\n    \n    for(uword col=1; col<X_n_cols; ++col)\n      {\n      const eT* col_mem = X.colptr(col);\n      \n      for(uword row=0; row<X_n_rows; ++row)\n        {\n        const eT col_val = col_mem[row];\n        \n        if(col_val < out_mem[row])  { out_mem[row] = col_val; }\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nop_min::apply_noalias(Mat<eT>& out, const Mat<eT>& X, const uword dim, const typename arma_cx_only<eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  if(dim == 0)\n    {\n    arma_extra_debug_print(\"op_min::apply(): dim = 0\");\n    \n    out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols);\n    \n    if(X_n_rows == 0)  { return; }\n    \n    eT* out_mem = out.memptr();\n    \n    for(uword col=0; col<X_n_cols; ++col)\n      {\n      out_mem[col] = op_min::direct_min( X.colptr(col), X_n_rows );\n      }\n    }\n  else\n  if(dim == 1)\n    {\n    arma_extra_debug_print(\"op_min::apply(): dim = 1\");\n    \n    out.set_size(X_n_rows, (X_n_cols > 0) ? 1 : 0);\n    \n    if(X_n_cols == 0)  { return; }\n    \n    eT* out_mem = out.memptr();\n    \n    for(uword row=0; row<X_n_rows; ++row)\n      {\n      out_mem[row] = op_min::direct_min( X, row );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_pure\ninline \neT\nop_min::direct_min(const eT* const X, const uword n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  eT min_val = priv::most_pos<eT>();\n  \n  uword i,j;\n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    const eT X_i = X[i];\n    const eT X_j = X[j];\n    \n    if(X_i < min_val) { min_val = X_i; }\n    if(X_j < min_val) { min_val = X_j; }\n    }\n  \n  if(i < n_elem)\n    {\n    const eT X_i = X[i];\n    \n    if(X_i < min_val) { min_val = X_i; }\n    }\n  \n  return min_val;\n  }\n\n\n\ntemplate<typename eT>\ninline \neT\nop_min::direct_min(const eT* const X, const uword n_elem, uword& index_of_min_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  eT min_val = priv::most_pos<eT>();\n  \n  uword best_index = 0;\n  \n  uword i,j;\n  for(i=0, j=1; j<n_elem; i+=2, j+=2)\n    {\n    const eT X_i = X[i];\n    const eT X_j = X[j];\n    \n    if(X_i < min_val)\n      {\n      min_val    = X_i;\n      best_index = i;\n      }\n    \n    if(X_j < min_val)\n      {\n      min_val    = X_j;\n      best_index = j;\n      }\n    }\n  \n  if(i < n_elem)\n    {\n    const eT X_i = X[i];\n    \n    if(X_i < min_val)\n      {\n      min_val    = X_i;\n      best_index = i;\n      }\n    }\n  \n  index_of_min_val = best_index;\n  \n  return min_val;\n  }  \n\n\n\ntemplate<typename eT>\ninline \neT\nop_min::direct_min(const Mat<eT>& X, const uword row)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword X_n_cols = X.n_cols;\n  \n  eT min_val = priv::most_pos<eT>();\n  \n  uword i,j;\n  for(i=0, j=1; j < X_n_cols; i+=2, j+=2)\n    {\n    const eT tmp_i = X.at(row,i);\n    const eT tmp_j = X.at(row,j);\n    \n    if(tmp_i < min_val) { min_val = tmp_i; }\n    if(tmp_j < min_val) { min_val = tmp_j; }\n    }\n  \n  if(i < X_n_cols)\n    {\n    const eT tmp_i = X.at(row,i);\n    \n    if(tmp_i < min_val) { min_val = tmp_i; }\n    }\n  \n  return min_val;\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nop_min::min(const subview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(X.n_elem == 0)\n    {\n    arma_debug_check(true, \"min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n    \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  eT min_val = priv::most_pos<eT>();\n  \n  if(X_n_rows == 1)\n    {\n    const Mat<eT>& A = X.m;\n    \n    const uword start_row = X.aux_row1;\n    const uword start_col = X.aux_col1;\n    \n    const uword end_col_p1 = start_col + X_n_cols;\n  \n    uword i,j;\n    for(i=start_col, j=start_col+1; j < end_col_p1; i+=2, j+=2)\n      {\n      const eT tmp_i = A.at(start_row, i);\n      const eT tmp_j = A.at(start_row, j);\n      \n      if(tmp_i < min_val) { min_val = tmp_i; }\n      if(tmp_j < min_val) { min_val = tmp_j; }\n      }\n    \n    if(i < end_col_p1)\n      {\n      const eT tmp_i = A.at(start_row, i);\n      \n      if(tmp_i < min_val) { min_val = tmp_i; }\n      }\n    }\n  else\n    {\n    for(uword col=0; col < X_n_cols; ++col)\n      {\n      min_val = (std::min)(min_val, op_min::direct_min(X.colptr(col), X_n_rows));\n      }\n    }\n  \n  return min_val;\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename arma_not_cx<typename T1::elem_type>::result\nop_min::min(const Base<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(X.get_ref());\n  \n  const uword n_elem = P.get_n_elem();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  eT min_val = priv::most_pos<eT>();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n    ea_type A = P.get_ea();\n    \n    uword i,j;\n    \n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\n      {\n      const eT tmp_i = A[i];\n      const eT tmp_j = A[j];\n      \n      if(tmp_i < min_val) { min_val = tmp_i; }\n      if(tmp_j < min_val) { min_val = tmp_j; }\n      }\n    \n    if(i < n_elem)\n      {\n      const eT tmp_i = A[i];\n      \n      if(tmp_i < min_val) { min_val = tmp_i; }\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    if(n_rows == 1)\n      {\n      uword i,j;\n      for(i=0, j=1; j < n_cols; i+=2, j+=2)\n        {\n        const eT tmp_i = P.at(0,i);\n        const eT tmp_j = P.at(0,j);\n        \n        if(tmp_i < min_val) { min_val = tmp_i; }\n        if(tmp_j < min_val) { min_val = tmp_j; }\n        }\n      \n      if(i < n_cols)\n        {\n        const eT tmp_i = P.at(0,i);\n        \n        if(tmp_i < min_val) { min_val = tmp_i; }\n        }\n      }\n    else\n      {\n      for(uword col=0; col < n_cols; ++col)\n        {\n        uword i,j;\n        for(i=0, j=1; j < n_rows; i+=2, j+=2)\n          {\n          const eT tmp_i = P.at(i,col);\n          const eT tmp_j = P.at(j,col);\n          \n          if(tmp_i < min_val) { min_val = tmp_i; }\n          if(tmp_j < min_val) { min_val = tmp_j; }\n          }\n          \n        if(i < n_rows)\n          {\n          const eT tmp_i = P.at(i,col);\n          \n          if(tmp_i < min_val) { min_val = tmp_i; }\n          }\n        }\n      }\n    }\n  \n  return min_val;\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename arma_not_cx<typename T1::elem_type>::result\nop_min::min_with_index(const Proxy<T1>& P, uword& index_of_min_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword n_elem = P.get_n_elem();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  eT    best_val   = priv::most_pos<eT>();\n  uword best_index = 0;\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n    ea_type A = P.get_ea();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      const eT tmp = A[i];\n      \n      if(tmp < best_val)  { best_val = tmp;  best_index = i; }\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    if(n_rows == 1)\n      {\n      for(uword i=0; i < n_cols; ++i)\n        {\n        const eT tmp = P.at(0,i);\n        \n        if(tmp < best_val)  { best_val = tmp;  best_index = i; }\n        }\n      }\n    else\n    if(n_cols == 1)\n      {\n      for(uword i=0; i < n_rows; ++i)\n        {\n        const eT tmp = P.at(i,0);\n        \n        if(tmp < best_val)  { best_val = tmp;  best_index = i; }\n        }\n      }\n    else\n      {\n      uword count = 0;\n      \n      for(uword col=0; col < n_cols; ++col)\n      for(uword row=0; row < n_rows; ++row)\n        {\n        const eT tmp = P.at(row,col);\n        \n        if(tmp < best_val)  { best_val = tmp;  best_index = count; }\n        \n        ++count;\n        }\n      }\n    }\n  \n  index_of_min_val = best_index;\n  \n  return best_val;\n  }\n\n\n\ntemplate<typename T>\ninline \nstd::complex<T>\nop_min::direct_min(const std::complex<T>* const X, const uword n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  uword index   = 0;\n  T     min_val = priv::most_pos<T>();\n  \n  for(uword i=0; i<n_elem; ++i)\n    {\n    const T tmp_val = std::abs(X[i]);\n    \n    if(tmp_val < min_val)\n      {\n      min_val = tmp_val;\n      index   = i;\n      }\n    }\n  \n  return X[index];\n  }\n\n\n\ntemplate<typename T>\ninline \nstd::complex<T>\nop_min::direct_min(const std::complex<T>* const X, const uword n_elem, uword& index_of_min_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  uword index   = 0;\n  T     min_val = priv::most_pos<T>();\n  \n  for(uword i=0; i<n_elem; ++i)\n    {\n    const T tmp_val = std::abs(X[i]);\n    \n    if(tmp_val < min_val)\n      {\n      min_val = tmp_val;\n      index   = i;\n      }\n    }\n  \n  index_of_min_val = index;\n  \n  return X[index];\n  }\n\n\n\ntemplate<typename T>\ninline \nstd::complex<T>\nop_min::direct_min(const Mat< std::complex<T> >& X, const uword row)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword X_n_cols = X.n_cols;\n  \n  uword index   = 0;\n  T   min_val = priv::most_pos<T>();\n  \n  for(uword col=0; col<X_n_cols; ++col)\n    {\n    const T tmp_val = std::abs(X.at(row,col));\n    \n    if(tmp_val < min_val)\n      {\n      min_val = tmp_val;\n      index   = col;\n      }\n    }\n  \n  return X.at(row,index);\n  }\n\n\n\ntemplate<typename T>\ninline\nstd::complex<T>\nop_min::min(const subview< std::complex<T> >& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<T> eT;\n  \n  if(X.n_elem == 0)\n    {\n    arma_debug_check(true, \"min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  const Mat<eT>& A = X.m;\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  const uword start_row = X.aux_row1;\n  const uword start_col = X.aux_col1;\n  \n  const uword end_row_p1 = start_row + X_n_rows;\n  const uword end_col_p1 = start_col + X_n_cols;\n  \n  T min_val = priv::most_pos<T>();\n  \n  uword best_row = 0;\n  uword best_col = 0;\n    \n  if(X_n_rows == 1)\n    {\n    best_col = 0;\n    \n    for(uword col=start_col; col < end_col_p1; ++col)\n      {\n      const T tmp_val = std::abs( A.at(start_row, col) );\n      \n      if(tmp_val < min_val)\n        {\n        min_val  = tmp_val;\n        best_col = col;\n        }\n      }\n    \n    best_row = start_row;\n    }\n  else\n    {\n    for(uword col=start_col; col < end_col_p1; ++col)\n    for(uword row=start_row; row < end_row_p1; ++row)\n      {\n      const T tmp_val = std::abs( A.at(row, col) );\n      \n      if(tmp_val < min_val)\n        {\n        min_val  = tmp_val;\n        best_row = row;\n        best_col = col;\n        }\n      }\n    }\n  \n  return A.at(best_row, best_col);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename arma_cx_only<typename T1::elem_type>::result\nop_min::min(const Base<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result T;\n  \n  const Proxy<T1> P(X.get_ref());\n  \n  const uword n_elem = P.get_n_elem();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  T min_val = priv::most_pos<T>();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n    ea_type A = P.get_ea();\n    \n    uword index = 0;\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      const T tmp = std::abs(A[i]);\n      \n      if(tmp < min_val)\n        {\n        min_val = tmp;\n        index   = i;\n        }\n      }\n    \n    return( A[index] );\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    uword best_row = 0;\n    uword best_col = 0;\n    \n    if(n_rows == 1)\n      {\n      for(uword col=0; col < n_cols; ++col)\n        {\n        const T tmp = std::abs(P.at(0,col));\n        \n        if(tmp < min_val)\n          {\n          min_val  = tmp;\n          best_col = col;\n          }\n        }\n      }\n    else\n      {\n      for(uword col=0; col < n_cols; ++col)\n      for(uword row=0; row < n_rows; ++row)\n        {\n        const T tmp = std::abs(P.at(row,col));\n        \n        if(tmp < min_val)\n          {\n          min_val = tmp;\n          \n          best_row = row;\n          best_col = col;\n          }\n        }\n      }\n    \n    return P.at(best_row, best_col);\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename arma_cx_only<typename T1::elem_type>::result\nop_min::min_with_index(const Proxy<T1>& P, uword& index_of_min_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result T;\n  \n  const uword n_elem = P.get_n_elem();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  T best_val = priv::most_pos<T>();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n    ea_type A = P.get_ea();\n    \n    uword best_index = 0;\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      const T tmp = std::abs(A[i]);\n      \n      if(tmp < best_val)  { best_val = tmp;  best_index = i; }\n      }\n    \n    index_of_min_val = best_index;\n    \n    return( A[best_index] );\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    uword best_row   = 0;\n    uword best_col   = 0;\n    uword best_index = 0;\n    \n    if(n_rows == 1)\n      {\n      for(uword col=0; col < n_cols; ++col)\n        {\n        const T tmp = std::abs(P.at(0,col));\n        \n        if(tmp < best_val)  { best_val = tmp;  best_col = col; }\n        }\n      \n      best_index = best_col;\n      }\n    else\n    if(n_cols == 1)\n      {\n      for(uword row=0; row < n_rows; ++row)\n        {\n        const T tmp = std::abs(P.at(row,0));\n        \n        if(tmp < best_val)  { best_val = tmp;  best_row = row; }\n        }\n      \n      best_index = best_row;\n      }\n    else\n      {\n      uword count = 0;\n      \n      for(uword col=0; col < n_cols; ++col)\n      for(uword row=0; row < n_rows; ++row)\n        {\n        const T tmp = std::abs(P.at(row,col));\n        \n        if(tmp < best_val)\n          {\n          best_val = tmp;\n          \n          best_row = row;\n          best_col = col;\n          \n          best_index = count;\n          }\n        \n        ++count;\n        }\n      }\n    \n    index_of_min_val = best_index;\n    \n    return P.at(best_row, best_col);\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_misc_bones.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_misc\n//! @{\n\n\n\nclass op_real\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply( Mat<typename T1::pod_type>& out, const mtOp<typename T1::pod_type, T1, op_real>& X);\n  \n  template<typename T1>\n  inline static void apply( Cube<typename T1::pod_type>& out, const mtOpCube<typename T1::pod_type, T1, op_real>& X);\n  };\n\n\n\nclass op_imag\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply( Mat<typename T1::pod_type>& out, const mtOp<typename T1::pod_type, T1, op_imag>& X);\n  \n  template<typename T1>\n  inline static void apply( Cube<typename T1::pod_type>& out, const mtOpCube<typename T1::pod_type, T1, op_imag>& X);\n  };\n\n\n\nclass op_abs\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply( Mat<typename T1::pod_type>& out, const mtOp<typename T1::pod_type, T1, op_abs>& X);\n  \n  template<typename T1>\n  inline static void apply( Cube<typename T1::pod_type>& out, const mtOpCube<typename T1::pod_type, T1, op_abs>& X);\n  };\n\n\n\nclass op_orth\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1, op_orth>& expr);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_misc_meat.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_misc\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_real::apply( Mat<typename T1::pod_type>& out, const mtOp<typename T1::pod_type, T1, op_real>& X )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::pod_type T;\n  \n  const Proxy<T1> P(X.m);\n  \n  const uword n_rows = P.get_n_rows();\n  const uword n_cols = P.get_n_cols();\n    \n  out.set_size(n_rows, n_cols);\n  \n  T* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n    const uword   n_elem  = P.get_n_elem();\n          ea_type A       = P.get_ea();\n    \n    for(uword i=0; i < n_elem; ++i)\n      {\n      out_mem[i] = std::real( A[i] );\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      *out_mem = std::real( P.at(row,col) );\n      out_mem++;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_real::apply( Cube<typename T1::pod_type>& out, const mtOpCube<typename T1::pod_type, T1, op_real>& X )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::pod_type T;\n  \n  const ProxyCube<T1> P(X.m);\n  \n  const uword n_rows   = P.get_n_rows();\n  const uword n_cols   = P.get_n_cols();\n  const uword n_slices = P.get_n_slices();\n    \n  out.set_size(n_rows, n_cols, n_slices);\n  \n  T* out_mem = out.memptr();\n\n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n    typedef typename ProxyCube<T1>::ea_type ea_type;\n    \n    const uword   n_elem  = P.get_n_elem();\n          ea_type A       = P.get_ea();\n    \n    for(uword i=0; i < n_elem; ++i)\n      {\n      out_mem[i] = std::real( A[i] );\n      }\n    }\n  else\n    {\n    for(uword slice=0; slice < n_slices; ++slice)\n    for(uword col=0;   col   < n_cols;   ++col  )\n    for(uword row=0;   row   < n_rows;   ++row  )\n      {\n      *out_mem = std::real( P.at(row,col,slice) );\n      out_mem++;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_imag::apply( Mat<typename T1::pod_type>& out, const mtOp<typename T1::pod_type, T1, op_imag>& X )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::pod_type T;\n  \n  const Proxy<T1> P(X.m);\n  \n  const uword n_rows = P.get_n_rows();\n  const uword n_cols = P.get_n_cols();\n    \n  out.set_size(n_rows, n_cols);\n  \n  T* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n    const uword   n_elem  = P.get_n_elem();\n          ea_type A       = P.get_ea();\n    \n    for(uword i=0; i < n_elem; ++i)\n      {\n      out_mem[i] = std::imag( A[i] );\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      *out_mem = std::imag( P.at(row,col) );\n      out_mem++;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_imag::apply( Cube<typename T1::pod_type>& out, const mtOpCube<typename T1::pod_type, T1, op_imag>& X )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::pod_type T;\n  \n  const ProxyCube<T1> P(X.m);\n  \n  const uword n_rows   = P.get_n_rows();\n  const uword n_cols   = P.get_n_cols();\n  const uword n_slices = P.get_n_slices();\n    \n  out.set_size(n_rows, n_cols, n_slices);\n  \n  T* out_mem = out.memptr();\n\n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n    typedef typename ProxyCube<T1>::ea_type ea_type;\n    \n    const uword   n_elem  = P.get_n_elem();\n          ea_type A       = P.get_ea();\n    \n    for(uword i=0; i < n_elem; ++i)\n      {\n      out_mem[i] = std::imag( A[i] );\n      }\n    }\n  else\n    {\n    for(uword slice=0; slice < n_slices; ++slice)\n    for(uword col=0;   col   < n_cols;   ++col  )\n    for(uword row=0;   row   < n_rows;   ++row  )\n      {\n      *out_mem = std::imag( P.at(row,col,slice) );\n      out_mem++;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_abs::apply( Mat<typename T1::pod_type>& out, const mtOp<typename T1::pod_type, T1, op_abs>& X )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::pod_type T;\n  \n  const Proxy<T1> P(X.m);\n  \n  const uword n_rows = P.get_n_rows();\n  const uword n_cols = P.get_n_cols();\n    \n  out.set_size(n_rows, n_cols);\n  \n  T* out_mem = out.memptr();\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n    const uword   n_elem  = P.get_n_elem();\n          ea_type A       = P.get_ea();\n    \n    for(uword i=0; i < n_elem; ++i)\n      {\n      out_mem[i] = std::abs( A[i] );\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      *out_mem = std::abs( P.at(row,col) );\n      out_mem++;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_abs::apply( Cube<typename T1::pod_type>& out, const mtOpCube<typename T1::pod_type, T1, op_abs>& X )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::pod_type T;\n  \n  const ProxyCube<T1> P(X.m);\n  \n  const uword n_rows   = P.get_n_rows();\n  const uword n_cols   = P.get_n_cols();\n  const uword n_slices = P.get_n_slices();\n    \n  out.set_size(n_rows, n_cols, n_slices);\n  \n  T* out_mem = out.memptr();\n\n  if(ProxyCube<T1>::prefer_at_accessor == false)\n    {\n    typedef typename ProxyCube<T1>::ea_type ea_type;\n    \n    const uword   n_elem  = P.get_n_elem();\n          ea_type A       = P.get_ea();\n    \n    for(uword i=0; i < n_elem; ++i)\n      {\n      out_mem[i] = std::abs( A[i] );\n      }\n    }\n  else\n    {\n    for(uword slice=0; slice < n_slices; ++slice)\n    for(uword col=0;   col   < n_cols;   ++col  )\n    for(uword row=0;   row   < n_rows;   ++row  )\n      {\n      *out_mem = std::abs( P.at(row,col,slice) );\n      out_mem++;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_orth::apply( Mat<typename T1::elem_type>& out, const Op<T1, op_orth>& expr )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  typedef typename T1::pod_type   T;\n  \n  T tol = access::tmp_real(expr.aux);\n  \n  arma_debug_check((tol < T(0)), \"orth(): tolerance must be >= 0\");\n  \n  const unwrap<T1>   tmp(expr.m);\n  const Mat<eT>& X = tmp.M;\n  \n  Mat<eT> U;\n  Col< T> s;\n  Mat<eT> V;\n  \n  //const bool status = auxlib::svd_econ(U, s, V, X, 'l');\n  //const bool status = auxlib::svd_dc(U, s, V, X);\n  const bool status = auxlib::svd_dc_econ(U, s, V, X);\n  \n  V.reset();\n  \n  if(status == false)  { out.reset(); arma_bad(\"orth(): svd failed\"); return; }\n  \n  if(s.is_empty())  { out.reset(); return; }\n  \n  const uword s_n_elem = s.n_elem;\n  const T*    s_mem    = s.memptr();\n  \n  // set tolerance to default if it hasn't been specified\n  if(tol == T(0))  { tol = (std::max)(X.n_rows, X.n_cols) * s_mem[0] * std::numeric_limits<T>::epsilon(); }\n  \n  uword count = 0;\n  \n  for(uword i=0; i < s_n_elem; ++i)  { count += (s_mem[i] > tol) ? uword(1) : uword(0); }\n  \n  if(count > 0)\n    {\n    out = U.head_cols(count);  // out *= eT(-1);\n    }\n  else\n    {\n    out.set_size(X.n_rows, 0);\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_nonzeros_bones.hpp",
    "content": "// Copyright (C) 2015 Conrad Sanderson\n// Copyright (C) 2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_nonzeros\n//! @{\n\n\n\nclass op_nonzeros\n  {\n  public:\n  \n  // for dense matrices\n  \n  template<typename T1>\n  static inline void apply_noalias(Mat<typename T1::elem_type>& out, const Proxy<T1>& P);\n  \n  template<typename T1>\n  static inline void apply(Mat<typename T1::elem_type>& out, const Op<T1, op_nonzeros>& X);\n  \n  \n  // for sparse matrices\n  \n  template<typename T1>\n  static inline void apply_noalias(Mat<typename T1::elem_type>& out, const SpBase<typename T1::elem_type, T1>& X);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_nonzeros_meat.hpp",
    "content": "// Copyright (C) 2015 Conrad Sanderson\n// Copyright (C) 2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_nonzeros\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_nonzeros::apply_noalias(Mat<typename T1::elem_type>& out, const Proxy<T1>& P)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword N_max = P.get_n_elem();\n  \n  Mat<eT> tmp(N_max, 1);\n  \n  eT* tmp_mem = tmp.memptr();\n  \n  uword N_nz = 0;\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type Pea = P.get_ea();\n    \n    for(uword i=0; i<N_max; ++i)\n      {\n      const eT val = Pea[i];\n      \n      if(val != eT(0))  { tmp_mem[N_nz] = val; ++N_nz; }\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      const eT val = P.at(row,col);\n      \n      if(val != eT(0))  { tmp_mem[N_nz] = val; ++N_nz; }\n      }\n    }\n  \n  out.steal_mem_col(tmp, N_nz);\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_nonzeros::apply(Mat<typename T1::elem_type>& out, const Op<T1, op_nonzeros>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(X.m);\n  \n  if(P.get_n_elem() == 0)  { out.set_size(0,1); return; }\n  \n  if(P.is_alias(out))\n    {\n    Mat<eT> out2;\n    \n    op_nonzeros::apply_noalias(out2, P);\n    \n    out.steal_mem(out2);\n    }\n  else\n    {\n    op_nonzeros::apply_noalias(out, P);\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_nonzeros::apply_noalias(Mat<typename T1::elem_type>& out, const SpBase<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const SpProxy<T1> P(X.get_ref());\n  \n  const uword N = P.get_n_nonzero();\n  \n  out.set_size(N,1);\n  \n  if(N > 0)\n    {\n    if(is_SpMat<typename SpProxy<T1>::stored_type>::value)\n      {\n      const unwrap_spmat<typename SpProxy<T1>::stored_type> U(P.Q);\n      \n      arrayops::copy(out.memptr(), U.M.values, N);\n      }\n    else\n      {\n      eT* out_mem = out.memptr();\n      \n      typename SpProxy<T1>::const_iterator_type it = P.begin();\n      \n      for(uword i=0; i<N; ++i)  { out_mem[i] = (*it); ++it; }\n      }\n    }\n  }\n  \n  \n  \n  \n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_normalise_bones.hpp",
    "content": "// Copyright (C) 2014 Conrad Sanderson\n// Copyright (C) 2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_normalise\n//! @{\n\n\n\nclass op_normalise_colvec\n  {\n  public:\n  \n  template<typename T1> inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_normalise_colvec>& in);\n  };\n\n\n\nclass op_normalise_rowvec\n  {\n  public:\n  \n  template<typename T1> inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_normalise_rowvec>& in);\n  };\n\n\n\nclass op_normalise_mat\n  {\n  public:\n  \n  template<typename T1> inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_normalise_mat>& in);\n  \n  template<typename eT> inline static void apply(Mat<eT>& out, const Mat<eT>& A, const uword p, const uword dim);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_normalise_meat.hpp",
    "content": "// Copyright (C) 2014 Conrad Sanderson\n// Copyright (C) 2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_normalise\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_normalise_colvec::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_normalise_colvec>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::pod_type T;\n  \n  const uword p = in.aux_uword_a;\n  \n  arma_debug_check( (p == 0), \"normalise(): parameter 'p' must be greater than zero\" );\n  \n  const quasi_unwrap<T1> tmp(in.m);\n  \n  const T norm_val_a = norm(tmp.M, p);\n  const T norm_val_b = (norm_val_a != T(0)) ? norm_val_a : T(1);\n  \n  out = tmp.M / norm_val_b;\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_normalise_rowvec::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_normalise_rowvec>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::pod_type T;\n  \n  const uword p = in.aux_uword_a;\n  \n  arma_debug_check( (p == 0), \"normalise(): parameter 'p' must be greater than zero\" );\n  \n  const unwrap<T1> tmp(in.m);\n  \n  const T norm_val_a = norm(tmp.M, p);\n  const T norm_val_b = (norm_val_a != T(0)) ? norm_val_a : T(1);\n  \n  out = tmp.M / norm_val_b;\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_normalise_mat::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_normalise_mat>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword p   = in.aux_uword_a;\n  const uword dim = in.aux_uword_b;\n  \n  arma_debug_check( (p   == 0), \"normalise(): parameter 'p' must be greater than zero\" );\n  arma_debug_check( (dim >  1), \"normalise(): parameter 'dim' must be 0 or 1\"          );\n  \n  const unwrap<T1>   tmp(in.m);\n  const Mat<eT>& A = tmp.M;\n  \n  const bool alias = ( (&out) == (&A) );\n  \n  if(alias)\n    {\n    Mat<eT> out2;\n    \n    op_normalise_mat::apply(out2, A, p, dim);\n    \n    out.steal_mem(out2);\n    }\n  else\n    {\n    op_normalise_mat::apply(out, A, p, dim);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nop_normalise_mat::apply(Mat<eT>& out, const Mat<eT>& A, const uword p, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  out.copy_size(A);\n  \n  if(A.n_elem == 0)  { return; }\n  \n  if(dim == 0)\n    {\n    const uword n_cols = A.n_cols;\n    \n    for(uword i=0; i<n_cols; ++i)\n      {\n      const T norm_val_a = norm(A.col(i), p);\n      const T norm_val_b = (norm_val_a != T(0)) ? norm_val_a : T(1);\n      \n      out.col(i) = A.col(i) / norm_val_b;\n      }\n    }\n  else\n    {\n    // better-than-nothing implementation\n    \n    const uword n_rows = A.n_rows;\n    \n    for(uword i=0; i<n_rows; ++i)\n      {\n      const T norm_val_a = norm(A.row(i), p);\n      const T norm_val_b = (norm_val_a != T(0)) ? norm_val_a : T(1);\n      \n      out.row(i) = A.row(i) / norm_val_b;\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_pinv_bones.hpp",
    "content": "// Copyright (C) 2009-2013 Conrad Sanderson\n// Copyright (C) 2009-2013 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_pinv\n//! @{\n\n\n\nclass op_pinv\n  {\n  public:\n  \n  template<typename T1> inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_pinv>& in);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_pinv_meat.hpp",
    "content": "// Copyright (C) 2009-2015 Conrad Sanderson\n// Copyright (C) 2009-2015 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// Copyright (C) 2011 Stanislav Funiak\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_pinv\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_pinv::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_pinv>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result  T;\n  \n  const bool use_divide_and_conquer = (in.aux_uword_a == 1);\n  \n  T tol = access::tmp_real(in.aux);\n  \n  arma_debug_check((tol < T(0)), \"pinv(): tolerance must be >= 0\");\n  \n  const Proxy<T1> P(in.m);\n  \n  const uword n_rows = P.get_n_rows();\n  const uword n_cols = P.get_n_cols();\n  \n  if( (n_rows*n_cols) == 0 )\n    {\n    out.set_size(n_cols,n_rows);\n    return;\n    }\n  \n  \n  // economical SVD decomposition \n  Mat<eT> U;\n  Col< T> s;\n  Mat<eT> V;\n  \n  bool status = false;\n  \n  if(use_divide_and_conquer)\n    {\n    status = (n_cols > n_rows) ? auxlib::svd_dc_econ(U, s, V, trans(P.Q)) : auxlib::svd_dc_econ(U, s, V, P.Q);\n    }\n  else\n    {\n    status = (n_cols > n_rows) ? auxlib::svd_econ(U, s, V, trans(P.Q), 'b') : auxlib::svd_econ(U, s, V, P.Q, 'b');\n    }\n  \n  if(status == false)\n    {\n    out.reset();\n    arma_bad(\"pinv(): svd failed\");\n    return;\n    }\n  \n  const uword s_n_elem = s.n_elem;\n  const T*    s_mem    = s.memptr();\n  \n  // set tolerance to default if it hasn't been specified\n  if( (tol == T(0)) && (s_n_elem > 0) )\n    {\n    tol = (std::max)(n_rows, n_cols) * s_mem[0] * std::numeric_limits<T>::epsilon();\n    }\n  \n  \n  uword count = 0;\n  \n  for(uword i = 0; i < s_n_elem; ++i)\n    {\n    count += (s_mem[i] >= tol) ? uword(1) : uword(0);\n    }\n  \n  \n  if(count > 0)\n    {\n    Col<T> s2(count);\n    \n    T* s2_mem = s2.memptr();\n    \n    uword count2 = 0;\n    \n    for(uword i=0; i < s_n_elem; ++i)\n      {\n      const T val = s_mem[i];\n      \n      if(val >= tol)  {  s2_mem[count2] = T(1) / val;  ++count2; }\n      }\n    \n    \n    if(n_rows >= n_cols)\n      {\n      out = ( (V.n_cols > count) ? V.cols(0,count-1) : V ) * diagmat(s2) * trans( (U.n_cols > count) ? U.cols(0,count-1) : U );\n      }\n    else\n      {\n      out = ( (U.n_cols > count) ? U.cols(0,count-1) : U ) * diagmat(s2) * trans( (V.n_cols > count) ? V.cols(0,count-1) : V );\n      }\n    }\n  else\n    {\n    out.zeros(n_cols, n_rows);\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_princomp_bones.hpp",
    "content": "// Copyright (C) 2010-2012 Conrad Sanderson\n// Copyright (C) 2010-2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_princomp\n//! @{\n\n\n\nclass op_princomp\n  {\n  public:\n  \n  //\n  // real element versions\n  \n  template<typename T1>\n  inline static bool\n  direct_princomp\n    (\n           Mat<typename T1::elem_type>&     coeff_out,\n    const Base<typename T1::elem_type, T1>& X,\n    const typename arma_not_cx<typename T1::elem_type>::result* junk = 0\n    );\n  \n  template<typename T1>\n  inline static bool\n  direct_princomp\n    (\n           Mat<typename T1::elem_type>&     coeff_out,\n           Mat<typename T1::elem_type>&     score_out,\n    const Base<typename T1::elem_type, T1>& X,\n    const typename arma_not_cx<typename T1::elem_type>::result* junk = 0\n    );\n  \n  template<typename T1>\n  inline static bool\n  direct_princomp\n    (\n           Mat<typename T1::elem_type>&     coeff_out,\n           Mat<typename T1::elem_type>&     score_out,\n           Col<typename T1::elem_type>&     latent_out,\n    const Base<typename T1::elem_type, T1>& X,\n    const typename arma_not_cx<typename T1::elem_type>::result* junk = 0\n    );\n  \n  template<typename T1>\n  inline static bool\n  direct_princomp\n    (\n           Mat<typename T1::elem_type>&     coeff_out,\n           Mat<typename T1::elem_type>&     score_out,\n           Col<typename T1::elem_type>&     latent_out,\n           Col<typename T1::elem_type>&     tsquared_out,\n    const Base<typename T1::elem_type, T1>& X,\n    const typename arma_not_cx<typename T1::elem_type>::result* junk = 0\n    );\n  \n  \n  //\n  // complex element versions\n  \n  template<typename T1>\n  inline static bool\n  direct_princomp\n    (\n           Mat< std::complex<typename T1::pod_type> >&     coeff_out,\n    const Base< std::complex<typename T1::pod_type>, T1 >& X,\n    const typename arma_cx_only<typename T1::elem_type>::result* junk = 0\n    );\n  \n  template<typename T1>\n  inline static bool\n  direct_princomp\n    (\n           Mat< std::complex<typename T1::pod_type> >&     coeff_out,\n           Mat< std::complex<typename T1::pod_type> >&     score_out,\n    const Base< std::complex<typename T1::pod_type>, T1 >& X,\n    const typename arma_cx_only<typename T1::elem_type>::result* junk = 0\n    );\n  \n  template<typename T1>\n  inline static bool\n  direct_princomp\n    (\n           Mat< std::complex<typename T1::pod_type> >&     coeff_out,\n           Mat< std::complex<typename T1::pod_type> >&     score_out,\n           Col<              typename T1::pod_type  >&     latent_out,\n    const Base< std::complex<typename T1::pod_type>, T1 >& X,\n    const typename arma_cx_only<typename T1::elem_type>::result* junk = 0\n    );\n  \n  template<typename T1>\n  inline static bool\n  direct_princomp\n    (\n           Mat< std::complex<typename T1::pod_type> >&     coeff_out,\n           Mat< std::complex<typename T1::pod_type> >&     score_out,\n           Col<              typename T1::pod_type  >&     latent_out,\n           Col< std::complex<typename T1::pod_type> >&     tsquared_out,\n    const Base< std::complex<typename T1::pod_type>, T1 >& X,\n    const typename arma_cx_only<typename T1::elem_type>::result* junk = 0\n    );\n  \n  \n  template<typename T1>\n  inline static void\n  apply(Mat<typename T1::elem_type>& out, const Op<T1,op_princomp>& in);\n  \n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_princomp_meat.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// Copyright (C) 2010 Dimitrios Bouzas\n// Copyright (C) 2011 Stanislav Funiak\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_princomp\n//! @{\n\n\n\n//! \\brief\n//! principal component analysis -- 4 arguments version\n//! computation is done via singular value decomposition\n//! coeff_out    -> principal component coefficients\n//! score_out    -> projected samples\n//! latent_out   -> eigenvalues of principal vectors\n//! tsquared_out -> Hotelling's T^2 statistic\ntemplate<typename T1>\ninline\nbool\nop_princomp::direct_princomp\n  (\n         Mat<typename T1::elem_type>&     coeff_out,\n         Mat<typename T1::elem_type>&     score_out,\n         Col<typename T1::elem_type>&     latent_out,\n         Col<typename T1::elem_type>&     tsquared_out,\n  const Base<typename T1::elem_type, T1>& X,\n  const typename arma_not_cx<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_check<T1> Y( X.get_ref(), score_out );\n  const Mat<eT>& in    = Y.M;\n\n  const uword n_rows = in.n_rows;\n  const uword n_cols = in.n_cols;\n  \n  if(n_rows > 1) // more than one sample\n    {\n    // subtract the mean - use score_out as temporary matrix\n    score_out = in;  score_out.each_row() -= mean(in);\n    \n    // singular value decomposition\n    Mat<eT> U;\n    Col<eT> s;\n    \n    const bool svd_ok = svd(U, s, coeff_out, score_out);\n    \n    if(svd_ok == false)  { return false; }\n    \n    // normalize the eigenvalues\n    s /= std::sqrt( double(n_rows - 1) );\n    \n    // project the samples to the principals\n    score_out *= coeff_out;\n    \n    if(n_rows <= n_cols) // number of samples is less than their dimensionality\n      {\n      score_out.cols(n_rows-1,n_cols-1).zeros();\n      \n      //Col<eT> s_tmp = zeros< Col<eT> >(n_cols);\n      Col<eT> s_tmp(n_cols);\n      s_tmp.zeros();\n      \n      s_tmp.rows(0,n_rows-2) = s.rows(0,n_rows-2);\n      s = s_tmp;\n          \n      // compute the Hotelling's T-squared\n      s_tmp.rows(0,n_rows-2) = eT(1) / s_tmp.rows(0,n_rows-2);\n      \n      const Mat<eT> S = score_out * diagmat(Col<eT>(s_tmp));   \n      tsquared_out = sum(S%S,1); \n      }\n    else\n      {\n      // compute the Hotelling's T-squared   \n      const Mat<eT> S = score_out * diagmat(Col<eT>( eT(1) / s));\n      tsquared_out = sum(S%S,1);\n      }\n            \n    // compute the eigenvalues of the principal vectors\n    latent_out = s%s;\n    }\n  else // 0 or 1 samples\n    {\n    coeff_out.eye(n_cols, n_cols);\n    \n    score_out.copy_size(in);\n    score_out.zeros();\n    \n    latent_out.set_size(n_cols);\n    latent_out.zeros();\n    \n    tsquared_out.set_size(n_rows);\n    tsquared_out.zeros();\n    }\n  \n  return true;\n  }\n\n\n\n//! \\brief\n//! principal component analysis -- 3 arguments version\n//! computation is done via singular value decomposition\n//! coeff_out    -> principal component coefficients\n//! score_out    -> projected samples\n//! latent_out   -> eigenvalues of principal vectors\ntemplate<typename T1>\ninline\nbool\nop_princomp::direct_princomp\n  (\n         Mat<typename T1::elem_type>&     coeff_out,\n         Mat<typename T1::elem_type>&     score_out,\n         Col<typename T1::elem_type>&     latent_out,\n  const Base<typename T1::elem_type, T1>& X,\n  const typename arma_not_cx<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_check<T1> Y( X.get_ref(), score_out );\n  const Mat<eT>& in    = Y.M;\n  \n  const uword n_rows = in.n_rows;\n  const uword n_cols = in.n_cols;\n  \n  if(n_rows > 1) // more than one sample\n    {\n    // subtract the mean - use score_out as temporary matrix\n    score_out = in;  score_out.each_row() -= mean(in);\n    \n    // singular value decomposition\n    Mat<eT> U;\n    Col<eT> s;\n    \n    const bool svd_ok = svd(U, s, coeff_out, score_out);\n    \n    if(svd_ok == false)  { return false; }\n    \n    // normalize the eigenvalues\n    s /= std::sqrt( double(n_rows - 1) );\n    \n    // project the samples to the principals\n    score_out *= coeff_out;\n    \n    if(n_rows <= n_cols) // number of samples is less than their dimensionality\n      {\n      score_out.cols(n_rows-1,n_cols-1).zeros();\n      \n      Col<eT> s_tmp = zeros< Col<eT> >(n_cols);\n      s_tmp.rows(0,n_rows-2) = s.rows(0,n_rows-2);\n      s = s_tmp;\n      }\n      \n    // compute the eigenvalues of the principal vectors\n    latent_out = s%s;\n    \n    }\n  else // 0 or 1 samples\n    {\n    coeff_out.eye(n_cols, n_cols);\n    \n    score_out.copy_size(in);\n    score_out.zeros();\n    \n    latent_out.set_size(n_cols);\n    latent_out.zeros(); \n    }\n  \n  return true;\n  }\n\n\n\n//! \\brief\n//! principal component analysis -- 2 arguments version\n//! computation is done via singular value decomposition\n//! coeff_out    -> principal component coefficients\n//! score_out    -> projected samples\ntemplate<typename T1>\ninline\nbool\nop_princomp::direct_princomp\n  (\n         Mat<typename T1::elem_type>&     coeff_out,\n         Mat<typename T1::elem_type>&     score_out,\n  const Base<typename T1::elem_type, T1>& X,\n  const typename arma_not_cx<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_check<T1> Y( X.get_ref(), score_out );\n  const Mat<eT>& in    = Y.M;\n  \n  const uword n_rows = in.n_rows;\n  const uword n_cols = in.n_cols;\n  \n  if(n_rows > 1) // more than one sample\n    {\n    // subtract the mean - use score_out as temporary matrix\n    score_out = in;  score_out.each_row() -= mean(in);\n    \n    // singular value decomposition\n    Mat<eT> U;\n    Col<eT> s;\n    \n    const bool svd_ok = svd(U, s, coeff_out, score_out);\n    \n    if(svd_ok == false)  { return false; }\n    \n    // normalize the eigenvalues\n    s /= std::sqrt( double(n_rows - 1) );\n    \n    // project the samples to the principals\n    score_out *= coeff_out;\n    \n    if(n_rows <= n_cols) // number of samples is less than their dimensionality\n      {\n      score_out.cols(n_rows-1,n_cols-1).zeros();\n      \n      Col<eT> s_tmp = zeros< Col<eT> >(n_cols);\n      s_tmp.rows(0,n_rows-2) = s.rows(0,n_rows-2);\n      s = s_tmp;\n      }\n    }\n  else // 0 or 1 samples\n    {\n    coeff_out.eye(n_cols, n_cols);\n    score_out.copy_size(in);\n    score_out.zeros();\n    }\n  \n  return true;\n  }\n\n\n\n//! \\brief\n//! principal component analysis -- 1 argument version\n//! computation is done via singular value decomposition\n//! coeff_out    -> principal component coefficients\ntemplate<typename T1>\ninline\nbool\nop_princomp::direct_princomp\n  (\n         Mat<typename T1::elem_type>&     coeff_out,\n  const Base<typename T1::elem_type, T1>& X,\n  const typename arma_not_cx<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1>    Y( X.get_ref() );\n  const Mat<eT>& in = Y.M;\n  \n  if(in.n_elem != 0)\n    {\n    Mat<eT> tmp = in; tmp.each_row() -= mean(in);\n    \n    // singular value decomposition\n    Mat<eT> U;\n    Col<eT> s;\n    \n    const bool svd_ok = svd(U, s, coeff_out, tmp);\n    \n    if(svd_ok == false)  { return false; }\n    }\n  else\n    {\n    coeff_out.eye(in.n_cols, in.n_cols);\n    }\n  \n  return true;\n  }\n\n\n\n//! \\brief\n//! principal component analysis -- 4 arguments complex version\n//! computation is done via singular value decomposition\n//! coeff_out    -> principal component coefficients\n//! score_out    -> projected samples\n//! latent_out   -> eigenvalues of principal vectors\n//! tsquared_out -> Hotelling's T^2 statistic\ntemplate<typename T1>\ninline\nbool\nop_princomp::direct_princomp\n  (\n         Mat< std::complex<typename T1::pod_type> >&     coeff_out,\n         Mat< std::complex<typename T1::pod_type> >&     score_out,\n         Col<              typename T1::pod_type  >&     latent_out,\n         Col< std::complex<typename T1::pod_type> >&     tsquared_out,\n  const Base< std::complex<typename T1::pod_type>, T1 >& X,\n  const typename arma_cx_only<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::pod_type     T;\n  typedef          std::complex<T> eT;\n  \n  const unwrap_check<T1> Y( X.get_ref(), score_out );\n  const Mat<eT>& in    = Y.M;\n  \n  const uword n_rows = in.n_rows;\n  const uword n_cols = in.n_cols;\n  \n  if(n_rows > 1) // more than one sample\n    {\n    // subtract the mean - use score_out as temporary matrix\n    score_out = in;  score_out.each_row() -= mean(in);\n \t  \n    // singular value decomposition\n    Mat<eT> U;\n    Col< T> s;\n    \n    const bool svd_ok = svd(U, s, coeff_out, score_out); \n    \n    if(svd_ok == false)  { return false; }\n    \n    // normalize the eigenvalues\n    s /= std::sqrt( double(n_rows - 1) );\n    \n    // project the samples to the principals\n    score_out *= coeff_out;\n    \n    if(n_rows <= n_cols) // number of samples is less than their dimensionality\n      {\n      score_out.cols(n_rows-1,n_cols-1).zeros();\n      \n      Col<T> s_tmp = zeros< Col<T> >(n_cols);\n      s_tmp.rows(0,n_rows-2) = s.rows(0,n_rows-2);\n      s = s_tmp;\n          \n      // compute the Hotelling's T-squared   \n      s_tmp.rows(0,n_rows-2) = 1.0 / s_tmp.rows(0,n_rows-2);\n      const Mat<eT> S = score_out * diagmat(Col<T>(s_tmp));                     \n      tsquared_out = sum(S%S,1); \n      }\n    else\n      {\n      // compute the Hotelling's T-squared   \n      const Mat<eT> S = score_out * diagmat(Col<T>(T(1) / s));                     \n      tsquared_out = sum(S%S,1);\n      }\n    \n    // compute the eigenvalues of the principal vectors\n    latent_out = s%s;\n    \n    }\n  else // 0 or 1 samples\n    {\n    coeff_out.eye(n_cols, n_cols);\n    \n    score_out.copy_size(in);\n    score_out.zeros();\n      \n    latent_out.set_size(n_cols);\n    latent_out.zeros();\n      \n    tsquared_out.set_size(n_rows);\n    tsquared_out.zeros();\n    }\n  \n  return true;\n  }\n\n\n\n//! \\brief\n//! principal component analysis -- 3 arguments complex version\n//! computation is done via singular value decomposition\n//! coeff_out    -> principal component coefficients\n//! score_out    -> projected samples\n//! latent_out   -> eigenvalues of principal vectors\ntemplate<typename T1>\ninline\nbool\nop_princomp::direct_princomp\n  (\n         Mat< std::complex<typename T1::pod_type> >&     coeff_out,\n         Mat< std::complex<typename T1::pod_type> >&     score_out,\n         Col<              typename T1::pod_type  >&     latent_out,\n  const Base< std::complex<typename T1::pod_type>, T1 >& X,\n  const typename arma_cx_only<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::pod_type     T;\n  typedef          std::complex<T> eT;\n  \n  const unwrap_check<T1> Y( X.get_ref(), score_out );\n  const Mat<eT>& in    = Y.M;\n  \n  const uword n_rows = in.n_rows;\n  const uword n_cols = in.n_cols;\n  \n  if(n_rows > 1) // more than one sample\n    {\n    // subtract the mean - use score_out as temporary matrix\n    score_out = in;  score_out.each_row() -= mean(in);\n    \n    // singular value decomposition\n    Mat<eT> U;\n    Col< T> s;\n    \n    const bool svd_ok = svd(U, s, coeff_out, score_out);\n    \n    if(svd_ok == false)  { return false; }\n    \n    // normalize the eigenvalues\n    s /= std::sqrt( double(n_rows - 1) );\n    \n    // project the samples to the principals\n    score_out *= coeff_out;\n    \n    if(n_rows <= n_cols) // number of samples is less than their dimensionality\n      {\n      score_out.cols(n_rows-1,n_cols-1).zeros();\n      \n      Col<T> s_tmp = zeros< Col<T> >(n_cols);\n      s_tmp.rows(0,n_rows-2) = s.rows(0,n_rows-2);\n      s = s_tmp;\n      }\n      \n    // compute the eigenvalues of the principal vectors\n    latent_out = s%s;\n    }\n  else // 0 or 1 samples\n    {\n    coeff_out.eye(n_cols, n_cols);\n\n    score_out.copy_size(in);\n    score_out.zeros();\n\n    latent_out.set_size(n_cols);\n    latent_out.zeros();\n    }\n  \n  return true;\n  }\n\n\n\n//! \\brief\n//! principal component analysis -- 2 arguments complex version\n//! computation is done via singular value decomposition\n//! coeff_out    -> principal component coefficients\n//! score_out    -> projected samples\ntemplate<typename T1>\ninline\nbool\nop_princomp::direct_princomp\n  (\n         Mat< std::complex<typename T1::pod_type> >&     coeff_out,\n         Mat< std::complex<typename T1::pod_type> >&     score_out,\n  const Base< std::complex<typename T1::pod_type>, T1 >& X,\n  const typename arma_cx_only<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::pod_type     T;\n  typedef          std::complex<T> eT;\n  \n  const unwrap_check<T1> Y( X.get_ref(), score_out );\n  const Mat<eT>& in    = Y.M;\n  \n  const uword n_rows = in.n_rows;\n  const uword n_cols = in.n_cols;\n  \n  if(n_rows > 1) // more than one sample\n    {\n    // subtract the mean - use score_out as temporary matrix\n    score_out = in;  score_out.each_row() -= mean(in);\n    \n    // singular value decomposition\n    Mat<eT> U;\n    Col< T> s;\n    \n    const bool svd_ok = svd(U, s, coeff_out, score_out);\n    \n    if(svd_ok == false)  { return false; }\n    \n    // normalize the eigenvalues\n    s /= std::sqrt( double(n_rows - 1) );\n\n    // project the samples to the principals\n    score_out *= coeff_out;\n\n    if(n_rows <= n_cols) // number of samples is less than their dimensionality\n      {\n      score_out.cols(n_rows-1,n_cols-1).zeros();\n      }\n\n    }\n  else // 0 or 1 samples\n    {\n    coeff_out.eye(n_cols, n_cols);\n    \n    score_out.copy_size(in);\n    score_out.zeros();\n    }\n  \n  return true;\n  }\n\n\n\n//! \\brief\n//! principal component analysis -- 1 argument complex version\n//! computation is done via singular value decomposition\n//! coeff_out    -> principal component coefficients\ntemplate<typename T1>\ninline\nbool\nop_princomp::direct_princomp\n  (\n         Mat< std::complex<typename T1::pod_type> >&     coeff_out,\n  const Base< std::complex<typename T1::pod_type>, T1 >& X,\n  const typename arma_cx_only<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::pod_type     T;\n  typedef          std::complex<T> eT;\n  \n  const unwrap<T1>    Y( X.get_ref() );\n  const Mat<eT>& in = Y.M;\n  \n  if(in.n_elem != 0)\n    {\n    // singular value decomposition\n    Mat<eT> U;\n    Col< T> s;\n    \n    Mat<eT> tmp = in;  tmp.each_row() -= mean(in);\n    \n    const bool svd_ok = svd(U, s, coeff_out, tmp);\n    \n    if(svd_ok == false)  { return false; }\n    }\n  else\n    {\n    coeff_out.eye(in.n_cols, in.n_cols);\n    }\n  \n  return true;\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_princomp::apply\n  (\n        Mat<typename T1::elem_type>& out,\n  const Op<T1,op_princomp>&          in\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_check<T1> tmp(in.m, out);\n  const Mat<eT>& A     = tmp.M;\n  \n  const bool status = op_princomp::direct_princomp(out, A);\n  \n  if(status == false)\n    {\n    out.reset();\n    \n    arma_bad(\"princomp(): failed to converge\");\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_prod_bones.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_prod\n//! @{\n\n//! Class for finding products of values in a matrix  (e.g. along rows or columns)\nclass op_prod\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1, op_prod>& in);\n  \n  template<typename eT>\n  inline static eT prod(const subview<eT>& S);\n  \n  template<typename T1>\n  inline static typename T1::elem_type prod(const Base<typename T1::elem_type,T1>& X);\n  };\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_prod_meat.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_prod\n//! @{\n\n//! \\brief\n//! Immediate product of elements of a matrix along a specified dimension (either rows or columns).\n//! The result is stored in a dense matrix that has either one column or one row.\n//! See the prod() function for more details.\ntemplate<typename T1>\ninline\nvoid\nop_prod::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_prod>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword dim = in.aux_uword_a;\n  arma_debug_check( (dim > 1), \"prod(): parameter 'dim' must be 0 or 1\" );\n  \n  const unwrap_check<T1> tmp(in.m, out);\n  const Mat<eT>& X     = tmp.M;\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n    \n  if(dim == 0)  // traverse across rows (i.e. find the product in each column)\n    {\n    out.set_size(1, X_n_cols);\n    \n    eT* out_mem = out.memptr();\n    \n    for(uword col=0; col<X_n_cols; ++col)\n      {\n      out_mem[col] = arrayops::product(X.colptr(col), X_n_rows);\n      }\n    }\n  else  // traverse across columns (i.e. find the product in each row)\n    {\n    out.set_size(X_n_rows, 1);\n    \n    eT* out_mem = out.memptr();\n    \n    for(uword row=0; row<X_n_rows; ++row)\n      {\n      eT val = eT(1);\n      \n      uword i,j;\n      for(i=0, j=1; j < X_n_cols; i+=2, j+=2)\n        {\n        val *= X.at(row,i);\n        val *= X.at(row,j);\n        }\n      \n      if(i < X_n_cols)\n        {\n        val *= X.at(row,i);\n        }\n      \n      out_mem[row] = val;\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nop_prod::prod(const subview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  eT val = eT(1);\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  if(X_n_rows == 1)\n    {\n    const Mat<eT>& A = X.m;\n  \n    const uword start_row = X.aux_row1;\n    const uword start_col = X.aux_col1;\n    \n    const uword end_col_p1 = start_col + X_n_cols;\n    \n    uword i,j;\n    for(i=start_col, j=start_col+1; j < end_col_p1; i+=2, j+=2)\n      {\n      val *= A.at(start_row, i);\n      val *= A.at(start_row, j);\n      }\n    \n    if(i < end_col_p1)\n      {\n      val *= A.at(start_row, i);\n      }\n    }\n  else\n    {\n    for(uword col=0; col < X_n_cols; ++col)\n      {\n      val *= arrayops::product( X.colptr(col), X_n_rows );\n      }\n    }\n  \n  return val;\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::elem_type\nop_prod::prod(const Base<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(X.get_ref());\n  \n  eT val = eT(1);\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typedef typename Proxy<T1>::ea_type ea_type;\n    \n    const ea_type A = P.get_ea();\n    \n    const uword n_elem = P.get_n_elem();\n    \n    uword i,j;\n    for(i=0, j=1; j < n_elem; i+=2, j+=2)\n      {\n      val *= A[i];\n      val *= A[j];\n      }\n    \n    if(i < n_elem)\n      {\n      val *= A[i];\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    if(n_rows == 1)\n      {\n      uword i,j;\n      for(i=0, j=1; j < n_cols; i+=2, j+=2)\n        {\n        val *= P.at(0,i);\n        val *= P.at(0,j);\n        }\n      \n      if(i < n_cols)\n        {\n        val *= P.at(0,i);\n        }\n      }\n    else\n      {\n      for(uword col=0; col < n_cols; ++col)\n        {\n        uword i,j;\n        for(i=0, j=1; j < n_rows; i+=2, j+=2)\n          {\n          val *= P.at(i,col);\n          val *= P.at(j,col);\n          }\n        \n        if(i < n_rows)\n          {\n          val *= P.at(i,col);\n          }\n        }\n      }\n    }\n  \n  return val;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_relational_bones.hpp",
    "content": "// Copyright (C) 2009-2010 Conrad Sanderson\n// Copyright (C) 2009-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_relational\n//! @{\n\n\n\nclass op_rel_lt_pre\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_lt_pre>& X);\n  \n  template<typename T1>\n  inline static void apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_lt_pre>& X);\n  };\n\n\n\nclass op_rel_lt_post\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_lt_post>& X);\n  \n  template<typename T1>\n  inline static void apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_lt_post>& X);\n  };\n\n\n\nclass op_rel_gt_pre\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_gt_pre>& X);\n  \n  template<typename T1>\n  inline static void apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_gt_pre>& X);\n  };\n\n\n\nclass op_rel_gt_post\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_gt_post>& X);\n  \n  template<typename T1>\n  inline static void apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_gt_post>& X);\n  };\n\n\n\nclass op_rel_lteq_pre\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_lteq_pre>& X);\n  \n  template<typename T1>\n  inline static void apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_lteq_pre>& X);\n  };\n\n\n\nclass op_rel_lteq_post\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_lteq_post>& X);\n  \n  template<typename T1>\n  inline static void apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_lteq_post>& X);\n  };\n\n\n\nclass op_rel_gteq_pre\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_gteq_pre>& X);\n  \n  template<typename T1>\n  inline static void apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_gteq_pre>& X);\n  };\n\n\n\nclass op_rel_gteq_post\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_gteq_post>& X);\n  \n  template<typename T1>\n  inline static void apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_gteq_post>& X);\n  };\n\n\n\nclass op_rel_eq\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_eq>& X);\n  \n  template<typename T1>\n  inline static void apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_eq>& X);\n  };\n\n\n\nclass op_rel_noteq\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_noteq>& X);\n  \n  template<typename T1>\n  inline static void apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_noteq>& X);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_relational_meat.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_relational\n//! @{\n\n\n#undef operator_rel\n\n#undef arma_applier_mat_pre\n#undef arma_applier_mat_post\n\n#undef arma_applier_cube_pre\n#undef arma_applier_cube_post\n\n\n#define arma_applier_mat_pre(operator_rel) \\\n  {\\\n  typedef typename T1::elem_type      eT;\\\n  typedef typename Proxy<T1>::ea_type ea_type;\\\n  \\\n  const eT val = X.aux;\\\n  \\\n  const Proxy<T1> P(X.m);\\\n  \\\n  const uword n_rows = P.get_n_rows();\\\n  const uword n_cols = P.get_n_cols();\\\n  \\\n  const bool bad_alias = ( Proxy<T1>::has_subview && P.is_alias(out) );\\\n  \\\n  if(bad_alias == false)\\\n    {\\\n    out.set_size(n_rows, n_cols);\\\n    \\\n    uword* out_mem = out.memptr();\\\n    \\\n    if(Proxy<T1>::prefer_at_accessor == false)\\\n      {\\\n            ea_type PA     = P.get_ea();\\\n      const uword   n_elem = out.n_elem;\\\n      \\\n      for(uword i=0; i<n_elem; ++i)\\\n        {\\\n        out_mem[i] = (val operator_rel PA[i]) ? uword(1) : uword(0);\\\n        }\\\n      }\\\n    else\\\n      {\\\n      if(n_rows == 1)\\\n        {\\\n        for(uword count=0; count < n_cols; ++count)\\\n          {\\\n          out_mem[count] = (val operator_rel P.at(0,count)) ? uword(1) : uword(0);\\\n          }\\\n        }\\\n      else\\\n        {\\\n        for(uword col=0; col < n_cols; ++col)\\\n        for(uword row=0; row < n_rows; ++row)\\\n          {\\\n          *out_mem = (val operator_rel P.at(row,col)) ? uword(1) : uword(0);\\\n          out_mem++;\\\n          }\\\n        }\\\n      }\\\n    }\\\n  else\\\n    {\\\n    const Mat<eT> tmp(P.Q);\\\n    \\\n    out = (val) operator_rel (tmp);\\\n    }\\\n  }\n\n\n\n#define arma_applier_mat_post(operator_rel) \\\n  {\\\n  typedef typename T1::elem_type      eT;\\\n  typedef typename Proxy<T1>::ea_type ea_type;\\\n  \\\n  const eT val = X.aux;\\\n  \\\n  const Proxy<T1> P(X.m);\\\n  \\\n  const uword n_rows = P.get_n_rows();\\\n  const uword n_cols = P.get_n_cols();\\\n  \\\n  const bool bad_alias = ( Proxy<T1>::has_subview && P.is_alias(out) );\\\n  \\\n  if(bad_alias == false)\\\n    {\\\n    out.set_size(n_rows, n_cols);\\\n    \\\n    uword* out_mem = out.memptr();\\\n    \\\n    if(Proxy<T1>::prefer_at_accessor == false)\\\n      {\\\n            ea_type PA     = P.get_ea();\\\n      const uword   n_elem = out.n_elem;\\\n      \\\n      for(uword i=0; i<n_elem; ++i)\\\n        {\\\n        out_mem[i] = (PA[i] operator_rel val) ? uword(1) : uword(0);\\\n        }\\\n      }\\\n    else\\\n      {\\\n      if(n_rows == 1)\\\n        {\\\n        for(uword count=0; count < n_cols; ++count)\\\n          {\\\n          out_mem[count] = (P.at(0,count) operator_rel val) ? uword(1) : uword(0);\\\n          }\\\n        }\\\n      else\\\n        {\\\n        for(uword col=0; col < n_cols; ++col)\\\n        for(uword row=0; row < n_rows; ++row)\\\n          {\\\n          *out_mem = (P.at(row,col) operator_rel val) ? uword(1) : uword(0);\\\n          out_mem++;\\\n          }\\\n        }\\\n      }\\\n    }\\\n  else\\\n    {\\\n    const Mat<eT> tmp(P.Q);\\\n    \\\n    out = (tmp) operator_rel (val);\\\n    }\\\n  }\n\n\n\n#define arma_applier_cube_pre(operator_rel) \\\n  {\\\n  typedef typename T1::elem_type          eT;\\\n  typedef typename ProxyCube<T1>::ea_type ea_type;\\\n  \\\n  const eT val = X.aux;\\\n  \\\n  const ProxyCube<T1> P(X.m);\\\n  \\\n  const uword n_rows   = P.get_n_rows();\\\n  const uword n_cols   = P.get_n_cols();\\\n  const uword n_slices = P.get_n_slices();\\\n  \\\n  const bool bad_alias = ( ProxyCube<T1>::has_subview && P.is_alias(out) );\\\n  \\\n  if(bad_alias == false)\\\n    {\\\n    out.set_size(n_rows, n_cols, n_slices);\\\n    \\\n    uword* out_mem = out.memptr();\\\n    \\\n    if(ProxyCube<T1>::prefer_at_accessor == false)\\\n      {\\\n            ea_type PA     = P.get_ea();\\\n      const uword   n_elem = out.n_elem;\\\n      \\\n      for(uword i=0; i<n_elem; ++i)\\\n        {\\\n        out_mem[i] = (val operator_rel PA[i]) ? uword(1) : uword(0);\\\n        }\\\n      }\\\n    else\\\n      {\\\n      for(uword slice=0; slice < n_slices; ++slice)\\\n      for(uword col=0;   col   < n_cols;   ++col  )\\\n      for(uword row=0;   row   < n_rows;   ++row  )\\\n        {\\\n        *out_mem = (val operator_rel P.at(row,col,slice)) ? uword(1) : uword(0);\\\n        out_mem++;\\\n        }\\\n      }\\\n    }\\\n  else\\\n    {\\\n    const unwrap_cube<typename ProxyCube<T1>::stored_type> tmp(P.Q);\\\n    \\\n    out = (val) operator_rel (tmp.M);\\\n    }\\\n  }\n\n\n\n#define arma_applier_cube_post(operator_rel) \\\n  {\\\n  typedef typename T1::elem_type          eT;\\\n  typedef typename ProxyCube<T1>::ea_type ea_type;\\\n  \\\n  const eT val = X.aux;\\\n  \\\n  const ProxyCube<T1> P(X.m);\\\n  \\\n  const uword n_rows   = P.get_n_rows();\\\n  const uword n_cols   = P.get_n_cols();\\\n  const uword n_slices = P.get_n_slices();\\\n  \\\n  const bool bad_alias = ( ProxyCube<T1>::has_subview && P.is_alias(out) );\\\n  \\\n  if(bad_alias == false)\\\n    {\\\n    out.set_size(n_rows, n_cols, n_slices);\\\n    \\\n    uword* out_mem = out.memptr();\\\n    \\\n    if(ProxyCube<T1>::prefer_at_accessor == false)\\\n      {\\\n            ea_type PA     = P.get_ea();\\\n      const uword   n_elem = out.n_elem;\\\n      \\\n      for(uword i=0; i<n_elem; ++i)\\\n        {\\\n        out_mem[i] = (PA[i] operator_rel val) ? uword(1) : uword(0);\\\n        }\\\n      }\\\n    else\\\n      {\\\n      for(uword slice=0; slice < n_slices; ++slice)\\\n      for(uword col=0;   col   < n_cols;   ++col  )\\\n      for(uword row=0;   row   < n_rows;   ++row  )\\\n        {\\\n        *out_mem = (P.at(row,col,slice) operator_rel val) ? uword(1) : uword(0);\\\n        out_mem++;\\\n        }\\\n      }\\\n    }\\\n  else\\\n    {\\\n    const unwrap_cube<typename ProxyCube<T1>::stored_type> tmp(P.Q);\\\n    \\\n    out = (tmp.M) operator_rel (val);\\\n    }\\\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_lt_pre::apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_lt_pre>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat_pre( < );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_gt_pre::apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_gt_pre>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat_pre( > );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_lteq_pre::apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_lteq_pre>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat_pre( <= );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_gteq_pre::apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_gteq_pre>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat_pre( >= );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_lt_post::apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_lt_post>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat_post( < );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_gt_post::apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_gt_post>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat_post( > );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_lteq_post::apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_lteq_post>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat_post( <= );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_gteq_post::apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_gteq_post>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat_post( >= );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_eq::apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_eq>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat_post( == );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_noteq::apply(Mat<uword>& out, const mtOp<uword, T1, op_rel_noteq>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_mat_post( != );\n  }\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_lt_pre::apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_lt_pre>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube_pre( < );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_gt_pre::apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_gt_pre>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube_pre( > );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_lteq_pre::apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_lteq_pre>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube_pre( <= );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_gteq_pre::apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_gteq_pre>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube_pre( >= );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_lt_post::apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_lt_post>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube_post( < );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_gt_post::apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_gt_post>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube_post( > );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_lteq_post::apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_lteq_post>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube_post( <= );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_gteq_post::apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_gteq_post>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube_post( >= );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_eq::apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_eq>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube_post( == );\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_rel_noteq::apply(Cube<uword>& out, const mtOpCube<uword, T1, op_rel_noteq>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_applier_cube_post( != );\n  }\n\n\n\n#undef arma_applier_mat_pre\n#undef arma_applier_mat_post\n\n#undef arma_applier_cube_pre\n#undef arma_applier_cube_post\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_repmat_bones.hpp",
    "content": "// Copyright (C) 2009-2010 Conrad Sanderson\n// Copyright (C) 2009-2010 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_repmat\n//! @{\n\n\n\nclass op_repmat\n  {\n  public:\n  template<typename T1> inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_repmat>& in);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_repmat_meat.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_repmat\n//! @{\n\n\n\n//! \\brief\n//! implementation of the 'repeat matrix' operation, used for constructing matrices\ntemplate<typename T1>\ninline\nvoid\nop_repmat::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_repmat>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_check<T1> tmp(in.m, out);\n  const Mat<eT>& X     = tmp.M;\n  \n  const uword copies_per_row = in.aux_uword_a;\n  const uword copies_per_col = in.aux_uword_b;\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  out.set_size(X_n_rows * copies_per_row, X_n_cols * copies_per_col);\n  \n  const uword out_n_rows = out.n_rows;\n  const uword out_n_cols = out.n_cols;\n  \n  // if( (out_n_rows > 0) && (out_n_cols > 0) )\n  //   {\n  //   for(uword col = 0; col < out_n_cols; col += X_n_cols)\n  //   for(uword row = 0; row < out_n_rows; row += X_n_rows)\n  //     {\n  //     out.submat(row, col, row+X_n_rows-1, col+X_n_cols-1) = X;\n  //     }\n  //   }\n  \n  if( (out_n_rows > 0) && (out_n_cols > 0) )\n    {\n    if(copies_per_row != 1)\n      {\n      for(uword col_copy=0; col_copy < copies_per_col; ++col_copy)\n        {\n        const uword out_col_offset = X_n_cols * col_copy;\n        \n        for(uword col=0; col < X_n_cols; ++col)\n          {\n                eT* out_colptr = out.colptr(col + out_col_offset);\n          const eT* X_colptr   = X.colptr(col);\n          \n          for(uword row_copy=0; row_copy < copies_per_row; ++row_copy)\n            {\n            const uword out_row_offset = X_n_rows * row_copy;\n            \n            arrayops::copy( &out_colptr[out_row_offset], X_colptr, X_n_rows );\n            }\n          }\n        }\n      }\n    else\n      {\n      for(uword col_copy=0; col_copy < copies_per_col; ++col_copy)\n        {\n        const uword out_col_offset = X_n_cols * col_copy;\n        \n        for(uword col=0; col < X_n_cols; ++col)\n          {\n                eT* out_colptr = out.colptr(col + out_col_offset);\n          const eT* X_colptr   = X.colptr(col);\n          \n          arrayops::copy( out_colptr, X_colptr, X_n_rows );\n          }\n        }\n      }\n    }\n  \n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_reshape_bones.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_reshape\n//! @{\n\n\n\nclass op_reshape\n  {\n  public:\n  \n  template<typename eT> inline static void apply_unwrap(Mat<eT>&                     out, const Mat<eT>&   A, const uword in_n_rows, const uword in_n_cols, const uword in_dim);\n  \n  template<typename T1> inline static void apply_proxy (Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword in_n_rows, const uword in_n_cols);\n  \n  template<typename T1> inline static void apply       (Mat<typename T1::elem_type>& out, const Op<T1,op_reshape>& in);\n  };\n\n\n\nclass op_reshape_ext\n  {\n  public:\n  \n  template<typename T1> inline static void apply( Mat<typename T1::elem_type>& out, const     Op<T1,op_reshape_ext>& in);\n  template<typename T1> inline static void apply(Cube<typename T1::elem_type>& out, const OpCube<T1,op_reshape_ext>& in);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_reshape_meat.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_reshape\n//! @{\n\n\n\ntemplate<typename eT>\ninline\nvoid\nop_reshape::apply_unwrap(Mat<eT>& out, const Mat<eT>& A, const uword in_n_rows, const uword in_n_cols, const uword in_dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool is_alias = (&out == &A);\n  \n  const uword in_n_elem = in_n_rows * in_n_cols;\n  \n  if(A.n_elem == in_n_elem)\n    {\n    if(in_dim == 0)\n      {\n      if(is_alias == false)\n        {\n        out.set_size(in_n_rows, in_n_cols);\n        arrayops::copy( out.memptr(), A.memptr(), out.n_elem );\n        }\n      else  // &out == &A, i.e. inplace resize\n        {\n        out.set_size(in_n_rows, in_n_cols);\n        // set_size() doesn't destroy data as long as the number of elements in the matrix remains the same\n        }\n      }\n    else\n      {\n      unwrap_check< Mat<eT> > B_tmp(A, is_alias);\n      const Mat<eT>& B      = B_tmp.M;\n      \n      out.set_size(in_n_rows, in_n_cols);\n      \n      eT* out_mem = out.memptr();\n      \n      const uword B_n_rows = B.n_rows;\n      const uword B_n_cols = B.n_cols;\n      \n      for(uword row=0; row<B_n_rows; ++row)\n        {\n        uword i,j;\n        for(i=0, j=1; j < B_n_cols; i+=2, j+=2)\n          {\n          const eT tmp_i = B.at(row,i);\n          const eT tmp_j = B.at(row,j);\n          \n          *out_mem = tmp_i;  out_mem++;\n          *out_mem = tmp_j;  out_mem++;\n          }\n        \n        if(i < B_n_cols)\n          {\n          *out_mem = B.at(row,i);  out_mem++;\n          }\n        }\n      }\n    }\n  else\n    {\n    const unwrap_check< Mat<eT> > B_tmp(A, is_alias);\n    const Mat<eT>& B            = B_tmp.M;\n    \n    const uword n_elem_to_copy = (std::min)(B.n_elem, in_n_elem);\n    \n    out.set_size(in_n_rows, in_n_cols);\n    \n    eT* out_mem = out.memptr();\n    \n    if(in_dim == 0)\n      {\n      arrayops::copy( out_mem, B.memptr(), n_elem_to_copy );\n      }\n    else\n      {\n      uword row = 0;\n      uword col = 0;\n      \n      const uword B_n_cols = B.n_cols;\n      \n      for(uword i=0; i<n_elem_to_copy; ++i)\n        {\n        out_mem[i] = B.at(row,col);\n        \n        ++col;\n        \n        if(col >= B_n_cols)\n          {\n          col = 0;\n          ++row;\n          }\n        }\n      }\n    \n    for(uword i=n_elem_to_copy; i<in_n_elem; ++i)\n      {\n      out_mem[i] = eT(0);\n      }\n    \n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_reshape::apply_proxy(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword in_n_rows, const uword in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  out.set_size(in_n_rows, in_n_cols);\n  \n  eT* out_mem = out.memptr();\n  \n  const uword in_n_elem = in_n_rows * in_n_cols;\n  \n  if(P.get_n_elem() == in_n_elem)\n    {\n    if(Proxy<T1>::prefer_at_accessor == false)\n      {\n      typename Proxy<T1>::ea_type Pea = P.get_ea();\n      \n      for(uword i=0; i<in_n_elem; ++i)\n        {\n        out_mem[i] = Pea[i];\n        }\n      }\n    else\n      {\n      const uword P_n_rows = P.get_n_rows();\n      const uword P_n_cols = P.get_n_cols();\n      \n      for(uword col=0; col < P_n_cols; ++col)\n        {\n        uword i,j;\n        \n        for(i=0, j=1; j < P_n_rows; i+=2, j+=2)\n          {\n          const eT tmp_i = P.at(i,col);\n          const eT tmp_j = P.at(j,col);\n          \n          *out_mem = tmp_i;  out_mem++;\n          *out_mem = tmp_j;  out_mem++;\n          }\n        \n        if(i < P_n_rows)\n          {\n          *out_mem = P.at(i,col);  out_mem++;\n          }\n        }\n      }\n    }\n  else\n    {\n    const uword n_elem_to_copy = (std::min)(P.get_n_elem(), in_n_elem);\n    \n    if(Proxy<T1>::prefer_at_accessor == false)\n      {\n      typename Proxy<T1>::ea_type Pea = P.get_ea();\n      \n      for(uword i=0; i<n_elem_to_copy; ++i)\n        {\n        out_mem[i] = Pea[i];\n        }\n      }\n    else\n      {\n      uword i = 0;\n      \n      const uword P_n_rows = P.get_n_rows();\n      const uword P_n_cols = P.get_n_cols();\n      \n      for(uword col=0; col < P_n_cols; ++col)\n      for(uword row=0; row < P_n_rows; ++row)\n        {\n        if(i >= n_elem_to_copy)  { goto nested_loop_end; }\n        \n        out_mem[i] = P.at(row,col);\n        \n        ++i;\n        }\n      \n      nested_loop_end: ;\n      }\n    \n    for(uword i=n_elem_to_copy; i<in_n_elem; ++i)\n      {\n      out_mem[i] = eT(0);\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_reshape::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_reshape>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(in.m);\n  \n  const uword in_n_rows = in.aux_uword_a;\n  const uword in_n_cols = in.aux_uword_b;\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value == true) && (Proxy<T1>::fake_mat == false) )\n    {\n    // not checking for aliasing here, as this might be an inplace reshape\n    \n    const unwrap<typename Proxy<T1>::stored_type> tmp(P.Q);\n    \n    op_reshape::apply_unwrap(out, tmp.M, in_n_rows, in_n_cols, uword(0));\n    }\n  else\n    {\n    if(P.is_alias(out))\n      {\n      Mat<eT> tmp;\n      \n      op_reshape::apply_proxy(tmp, P, in_n_rows, in_n_cols);\n      \n      out.steal_mem(tmp);\n      }\n    else\n      {\n      op_reshape::apply_proxy(out, P, in_n_rows, in_n_cols);\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_reshape_ext::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_reshape_ext>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1> tmp(in.m);\n  \n  const uword in_n_rows = in.aux_uword_a;\n  const uword in_n_cols = in.aux_uword_b;\n  const uword in_dim    = in.aux_uword_c;\n  \n  op_reshape::apply_unwrap(out, tmp.M, in_n_rows, in_n_cols, in_dim);\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_reshape_ext::apply(Cube<typename T1::elem_type>& out, const OpCube<T1,op_reshape_ext>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_cube<T1> A_tmp(in.m);\n  const Cube<eT>& A   = A_tmp.M;\n  \n  const uword in_n_rows   = in.aux_uword_a;\n  const uword in_n_cols   = in.aux_uword_b;\n  const uword in_n_slices = in.aux_uword_c;\n  const uword in_dim      = in.aux_uword_d;\n  \n  const uword in_n_elem = in_n_rows * in_n_cols * in_n_slices;\n  \n  if(A.n_elem == in_n_elem)\n    {\n    if(in_dim == 0)\n      {\n      if(&out != &A)\n        {\n        out.set_size(in_n_rows, in_n_cols, in_n_slices);\n        arrayops::copy( out.memptr(), A.memptr(), out.n_elem );\n        }\n      else  // &out == &A, i.e. inplace resize\n        {\n        out.set_size(in_n_rows, in_n_cols, in_n_slices);\n        // set_size() doesn't destroy data as long as the number of elements in the cube remains the same\n        }\n      }\n    else\n      {\n      unwrap_cube_check< Cube<eT> > B_tmp(A, out);\n      const Cube<eT>& B           = B_tmp.M;\n      \n      out.set_size(in_n_rows, in_n_cols, in_n_slices);\n      \n      eT* out_mem = out.memptr();\n      \n      const uword B_n_rows   = B.n_rows;\n      const uword B_n_cols   = B.n_cols;\n      const uword B_n_slices = B.n_slices;\n      \n      for(uword slice = 0; slice < B_n_slices; ++slice)\n      for(uword row   = 0; row   < B_n_rows;   ++row  )\n      for(uword col   = 0; col   < B_n_cols;   ++col  )\n        {\n        *out_mem = B.at(row,col,slice);\n        out_mem++;\n        }\n      }\n    }\n  else\n    {\n    const unwrap_cube_check< Cube<eT> > B_tmp(A, out);\n    const Cube<eT>& B                 = B_tmp.M;\n    \n    const uword n_elem_to_copy = (std::min)(B.n_elem, in_n_elem);\n    \n    out.set_size(in_n_rows, in_n_cols, in_n_slices);\n    \n    eT* out_mem = out.memptr();\n    \n    if(in_dim == 0)\n      {\n      arrayops::copy( out_mem, B.memptr(), n_elem_to_copy );\n      }\n    else\n      {\n      uword row   = 0;\n      uword col   = 0;\n      uword slice = 0;\n      \n      const uword B_n_rows = B.n_rows;\n      const uword B_n_cols = B.n_cols;\n      \n      for(uword i=0; i<n_elem_to_copy; ++i)\n        {\n        out_mem[i] = B.at(row,col,slice);\n        \n        ++col;\n        \n        if(col >= B_n_cols)\n          {\n          col = 0;\n          ++row;\n          \n          if(row >= B_n_rows)\n            {\n            row = 0;\n            ++slice;\n            }\n          }\n        }\n      }\n    \n    for(uword i=n_elem_to_copy; i<in_n_elem; ++i)\n      {\n      out_mem[i] = eT(0);\n      }\n    \n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_resize_bones.hpp",
    "content": "// Copyright (C) 2011 Conrad Sanderson\n// Copyright (C) 2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_resize\n//! @{\n\n\n\nclass op_resize\n  {\n  public:\n  \n  template<typename T1> inline static void apply( Mat<typename T1::elem_type>& out, const     Op<T1,op_resize>& in);\n  template<typename T1> inline static void apply(Cube<typename T1::elem_type>& out, const OpCube<T1,op_resize>& in);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_resize_meat.hpp",
    "content": "// Copyright (C) 2011-2013 Conrad Sanderson\n// Copyright (C) 2011-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_resize\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_resize::apply(Mat<typename T1::elem_type>& actual_out, const Op<T1,op_resize>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword out_n_rows = in.aux_uword_a;\n  const uword out_n_cols = in.aux_uword_b;\n  \n  const unwrap<T1>   tmp(in.m);\n  const Mat<eT>& A = tmp.M;\n  \n  const uword A_n_rows = A.n_rows;\n  const uword A_n_cols = A.n_cols;\n  \n  const bool alias = (&actual_out == &A);\n  \n  if(alias)\n    {\n    if( (A_n_rows == out_n_rows) && (A_n_cols == out_n_cols) )\n      {\n      return;\n      }\n    \n    if(actual_out.is_empty())\n      {\n      actual_out.zeros(out_n_rows, out_n_cols);\n      return;\n      }\n    }\n  \n  Mat<eT>  B;\n  Mat<eT>& out = alias ? B : actual_out;\n  \n  out.set_size(out_n_rows, out_n_cols);\n  \n  if( (out_n_rows > A_n_rows) || (out_n_cols > A_n_cols) )\n    {\n    out.zeros();\n    }\n  \n  if( (out.n_elem > 0) && (A.n_elem > 0) )\n    {\n    const uword end_row = (std::min)(out_n_rows, A_n_rows) - 1;\n    const uword end_col = (std::min)(out_n_cols, A_n_cols) - 1;\n    \n    out.submat(0, 0, end_row, end_col) = A.submat(0, 0, end_row, end_col);\n    }\n  \n  if(alias)\n    {\n    actual_out.steal_mem(B);\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_resize::apply(Cube<typename T1::elem_type>& actual_out, const OpCube<T1,op_resize>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword out_n_rows   = in.aux_uword_a;\n  const uword out_n_cols   = in.aux_uword_b;\n  const uword out_n_slices = in.aux_uword_c;\n  \n  const unwrap_cube<T1> tmp(in.m);\n  const Cube<eT>& A   = tmp.M;\n  \n  const uword A_n_rows   = A.n_rows;\n  const uword A_n_cols   = A.n_cols;\n  const uword A_n_slices = A.n_slices;\n  \n  const bool alias = (&actual_out == &A);\n  \n  if(alias)\n    {\n    if( (A_n_rows == out_n_rows) && (A_n_cols == out_n_cols) && (A_n_slices == out_n_slices) )\n      {\n      return;\n      }\n    \n    if(actual_out.is_empty())\n      {\n      actual_out.zeros(out_n_rows, out_n_cols, out_n_slices);\n      return;\n      }\n    }\n  \n  Cube<eT>  B;\n  Cube<eT>& out = alias ? B : actual_out;\n  \n  out.set_size(out_n_rows, out_n_cols, out_n_slices);\n  \n  if( (out_n_rows > A_n_rows) || (out_n_cols > A_n_cols) || (out_n_slices > A_n_slices) )\n    {\n    out.zeros();\n    }\n  \n  if( (out.n_elem > 0) && (A.n_elem > 0) )\n    {\n    const uword end_row   = (std::min)(out_n_rows,   A_n_rows)   - 1;\n    const uword end_col   = (std::min)(out_n_cols,   A_n_cols)   - 1;\n    const uword end_slice = (std::min)(out_n_slices, A_n_slices) - 1;\n    \n    out.subcube(0, 0, 0, end_row, end_col, end_slice) = A.subcube(0, 0, 0, end_row, end_col, end_slice);\n    }\n  \n  if(alias)\n    {\n    actual_out.steal_mem(B);\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_shuffle_bones.hpp",
    "content": "// Copyright (C) 2009-2010 Conrad Sanderson\n// Copyright (C) 2009-2010 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_shuffle\n//! @{\n\n\n\nclass op_shuffle\n  {\n  public:\n  \n  template<typename T1> inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_shuffle>& in);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_shuffle_meat.hpp",
    "content": "// Copyright (C) 2009-2013 Conrad Sanderson\n// Copyright (C) 2009-2013 NICTA (www.nicta.com.au)\n// Copyright (C) 2009-2010 Dimitrios Bouzas\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_shuffle\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_shuffle::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_shuffle>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1>   tmp(in.m);\n  const Mat<eT>& X = tmp.M;\n  \n  if(X.is_empty()) { out.copy_size(X); return; }\n  \n  const uword dim = in.aux_uword_a;\n  \n  arma_debug_check( (dim > 1), \"shuffle(): parameter 'dim' must be 0 or 1\" );\n  \n  const uword N = (dim == 0) ? X.n_rows : X.n_cols;\n  \n  \n  // see op_sort_index_bones.hpp for the definition of arma_sort_index_packet\n  // and the associated comparison functor\n  std::vector< arma_sort_index_packet<int,uword> > packet_vec(N);\n  \n  for(uword i=0; i<N; ++i)\n    {\n    packet_vec[i].val   = int(arma_rng::randi<int>());\n    packet_vec[i].index = i;\n    }\n  \n  arma_sort_index_helper_ascend comparator;\n  \n  std::sort( packet_vec.begin(), packet_vec.end(), comparator );\n  \n  const bool is_alias = (&out == &X);\n  \n  if(X.is_vec() == false)\n    {\n    if(is_alias == false)\n      {\n      arma_extra_debug_print(\"op_shuffle::apply(): matrix\");\n      \n      out.copy_size(X);\n      \n      if(dim == 0)\n        {\n        for(uword i=0; i<N; ++i) { out.row(i) = X.row(packet_vec[i].index); }\n        }\n      else\n        {\n        for(uword i=0; i<N; ++i) { out.col(i) = X.col(packet_vec[i].index); }\n        }\n      }\n    else  // in-place shuffle\n      {\n      arma_extra_debug_print(\"op_shuffle::apply(): in-place matrix\");\n      \n      // reuse the val member variable of packet_vec\n      // to indicate whether a particular row or column\n      // has already been shuffled\n      \n      for(uword i=0; i<N; ++i)\n        {\n        packet_vec[i].val = 0;\n        }\n        \n      if(dim == 0)\n        {\n        for(uword i=0; i<N; ++i)\n          {\n          if(packet_vec[i].val == 0)\n            {\n            const uword j = packet_vec[i].index;\n            \n            out.swap_rows(i, j);\n            \n            packet_vec[j].val = 1;\n            }\n          }\n        }\n      else\n        {\n        for(uword i=0; i<N; ++i)\n          {\n          if(packet_vec[i].val == 0)\n            {\n            const uword j = packet_vec[i].index;\n            \n            out.swap_cols(i, j);\n            \n            packet_vec[j].val = 1;\n            }\n          }\n        }\n      }\n    }\n  else  // we're dealing with a vector\n    {\n    if(is_alias == false)\n      {\n      arma_extra_debug_print(\"op_shuffle::apply(): vector\");\n      \n      out.copy_size(X);\n      \n      if(dim == 0)\n        {\n        if(X.n_rows > 1)  // i.e. column vector\n          {\n          for(uword i=0; i<N; ++i) { out[i] = X[ packet_vec[i].index ]; }\n          }\n        else\n          {\n          out = X;\n          }\n        }\n      else\n        {\n        if(X.n_cols > 1)  // i.e. row vector\n          {\n          for(uword i=0; i<N; ++i) { out[i] = X[ packet_vec[i].index ]; }\n          }\n        else\n          {\n          out = X;\n          }\n        }\n      }\n    else  // in-place shuffle\n      {\n      arma_extra_debug_print(\"op_shuffle::apply(): in-place vector\");\n      \n      // reuse the val member variable of packet_vec\n      // to indicate whether a particular row or column\n      // has already been shuffled\n      \n      for(uword i=0; i<N; ++i)\n        {\n        packet_vec[i].val = 0;\n        }\n        \n      if(dim == 0)\n        {\n        if(X.n_rows > 1)  // i.e. column vector\n          {\n          for(uword i=0; i<N; ++i)\n            {\n            if(packet_vec[i].val == 0)\n              {\n              const uword j = packet_vec[i].index;\n              \n              std::swap(out[i], out[j]);\n              \n              packet_vec[j].val = 1;\n              }\n            }\n          }\n        }\n      else\n        {\n        if(X.n_cols > 1)  // i.e. row vector\n          {\n          for(uword i=0; i<N; ++i)\n            {\n            if(packet_vec[i].val == 0)\n              {\n              const uword j = packet_vec[i].index;\n              \n              std::swap(out[i], out[j]);\n              \n              packet_vec[j].val = 1;\n              }\n            }\n          }\n        }\n      }\n    }\n  \n  }\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_sort_bones.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_sort\n//! @{\n\n\n\nclass op_sort\n  {\n  public:\n  \n  template<typename eT>\n  inline static void copy_row(eT* X, const Mat<eT>& A, const uword row);\n  \n  template<typename eT>\n  inline static void copy_row(Mat<eT>& A, const eT* X, const uword row);\n  \n  template<typename eT>\n  inline static void direct_sort(eT* X, const uword N, const uword sort_type = 0);\n  \n  template<typename eT>\n  inline static void direct_sort_ascending(eT* X, const uword N);\n  \n  template<typename eT>\n  inline static void apply_noalias(Mat<eT>& out, const Mat<eT>& X, const uword sort_type, const uword dim);\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_sort>& in);\n  };\n\n\n\ntemplate<typename eT>\nstruct arma_ascend_sort_helper\n  {\n  arma_inline bool operator() (const eT a, const eT b) const { return (a < b); }\n  };\n  \n\n\ntemplate<typename eT>\nstruct arma_descend_sort_helper\n  {\n  arma_inline bool operator() (const eT a, const eT b) const { return (a > b); }\n  };\n  \n\n\ntemplate<typename T>\nstruct arma_ascend_sort_helper< std::complex<T> >\n  {\n  typedef typename std::complex<T> eT;\n  \n  inline bool operator() (const eT& a, const eT& b) const { return (std::abs(a) < std::abs(b)); }\n  };\n\n\n\ntemplate<typename T>\nstruct arma_descend_sort_helper< std::complex<T> >\n  {\n  typedef typename std::complex<T> eT;\n  \n  inline bool operator() (const eT& a, const eT& b) const { return (std::abs(a) > std::abs(b)); }\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_sort_index_bones.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_sort_index\n//! @{\n\n\n\nclass op_sort_index\n  {\n  public:\n  \n  template<typename T1>\n  static inline bool apply_noalias(Mat<uword>& out, const Proxy<T1>& P, const uword sort_type);\n  \n  template<typename T1>\n  static inline void apply(Mat<uword>& out, const mtOp<uword,T1,op_sort_index>& in);\n  };\n\n\n\nclass op_stable_sort_index\n  {\n  public:\n  \n  template<typename T1>\n  static inline bool apply_noalias(Mat<uword>& out, const Proxy<T1>& P, const uword sort_type);\n  \n  template<typename T1>\n  static inline void apply(Mat<uword>& out, const mtOp<uword,T1,op_stable_sort_index>& in);\n  };\n\n\n\ntemplate<typename T1, typename T2>\nstruct arma_sort_index_packet\n  {\n  T1 val;\n  T2 index;\n  };\n\n\n\nclass arma_sort_index_helper_ascend\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  arma_inline\n  bool\n  operator() (const arma_sort_index_packet<T1,T2>& A, const arma_sort_index_packet<T1,T2>& B) const\n    {\n    return (A.val < B.val);\n    }\n  };\n\n\n\nclass arma_sort_index_helper_descend\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  arma_inline\n  bool\n  operator() (const arma_sort_index_packet<T1,T2>& A, const arma_sort_index_packet<T1,T2>& B) const\n    {\n    return (A.val > B.val);\n    }\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_sort_index_meat.hpp",
    "content": "// Copyright (C) 2009-2015 Conrad Sanderson\n// Copyright (C) 2009-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_sort_index\n//! @{\n\n\n\ntemplate<typename T1, bool sort_stable>\ninline\nbool\narma_sort_index_helper(Mat<uword>& out, const Proxy<T1>& P, const uword sort_type, typename arma_not_cx<typename T1::elem_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword n_elem = P.get_n_elem();\n  \n  out.set_size(n_elem, 1);\n  \n  std::vector< arma_sort_index_packet<eT, uword> > packet_vec(n_elem);\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      const eT val = P[i];\n      \n      if(arma_isnan(val))  { out.reset(); return false; }\n      \n      packet_vec[i].val   = val;\n      packet_vec[i].index = i;\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    uword i = 0;\n    \n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      const eT val = P.at(row,col);\n      \n      if(arma_isnan(val))  { out.reset(); return false; }\n      \n      packet_vec[i].val   = val;\n      packet_vec[i].index = i;\n      \n      ++i;\n      }\n    }\n  \n  \n  if(sort_type == 0)\n    {\n    // ascend\n    \n    arma_sort_index_helper_ascend comparator;\n    \n    if(sort_stable == false)\n      {\n      std::sort( packet_vec.begin(), packet_vec.end(), comparator );\n      }\n    else\n      {\n      std::stable_sort( packet_vec.begin(), packet_vec.end(), comparator );\n      }\n    }\n  else\n    {\n    // descend\n    \n    arma_sort_index_helper_descend comparator;\n    \n    if(sort_stable == false)\n      {\n      std::sort( packet_vec.begin(), packet_vec.end(), comparator );\n      }\n    else\n      {\n      std::stable_sort( packet_vec.begin(), packet_vec.end(), comparator );\n      }\n    }\n  \n  uword* out_mem = out.memptr();\n  \n  for(uword i=0; i<n_elem; ++i)\n    {\n    out_mem[i] = packet_vec[i].index;\n    }\n  \n  return true;\n  }\n\n\n\ntemplate<typename T1, bool sort_stable>\ninline\nbool\narma_sort_index_helper(Mat<uword>& out, const Proxy<T1>& P, const uword sort_type, typename arma_cx_only<typename T1::elem_type>::result* junk = 0)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result  T;\n  \n  const uword n_elem = P.get_n_elem();\n  \n  out.set_size(n_elem, 1);\n  \n  std::vector< arma_sort_index_packet<T, uword> > packet_vec(n_elem);\n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    for(uword i=0; i<n_elem; ++i)\n      {\n      const T val = std::abs(P[i]);\n      \n      if(arma_isnan(val))  { out.reset(); return false; }\n      \n      packet_vec[i].val   = val;\n      packet_vec[i].index = i;\n      }\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    uword i = 0;\n    \n    for(uword col=0; col < n_cols; ++col)\n    for(uword row=0; row < n_rows; ++row)\n      {\n      const T val = std::abs(P.at(row,col));\n      \n      if(arma_isnan(val))  { out.reset(); return false; }\n      \n      packet_vec[i].val   = val;\n      packet_vec[i].index = i;\n      \n      ++i;\n      }\n    }\n  \n  \n  if(sort_type == 0)\n    {\n    // ascend\n    \n    arma_sort_index_helper_ascend comparator;\n    \n    if(sort_stable == false)\n      {\n      std::sort( packet_vec.begin(), packet_vec.end(), comparator );\n      }\n    else\n      {\n      std::stable_sort( packet_vec.begin(), packet_vec.end(), comparator );\n      }\n    }\n  else\n    {\n    // descend\n    \n    arma_sort_index_helper_descend comparator;\n    \n    if(sort_stable == false)\n      {\n      std::sort( packet_vec.begin(), packet_vec.end(), comparator );\n      }\n    else\n      {\n      std::stable_sort( packet_vec.begin(), packet_vec.end(), comparator );\n      }\n    }\n  \n  uword* out_mem = out.memptr();\n  \n  for(uword i=0; i<n_elem; ++i)\n    {\n    out_mem[i] = packet_vec[i].index;\n    }\n  \n  return true;\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\nop_sort_index::apply_noalias(Mat<uword>& out, const Proxy<T1>& P, const uword sort_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  return arma_sort_index_helper<T1,false>(out, P, sort_type);\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_sort_index::apply(Mat<uword>& out, const mtOp<uword,T1,op_sort_index>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<T1> P(in.m);\n  \n  if(P.get_n_elem() == 0)  { out.set_size(0,1); return; }\n  \n  const uword sort_type = in.aux_uword_a;\n  \n  bool all_non_nan = false;\n  \n  if(P.is_alias(out))\n    {\n    Mat<uword> out2;\n    \n    all_non_nan = op_sort_index::apply_noalias(out2, P, sort_type);\n    \n    out.steal_mem(out2);\n    }\n  else\n    {\n    all_non_nan = op_sort_index::apply_noalias(out, P, sort_type);\n    }\n  \n  arma_debug_check( (all_non_nan == false), \"sort_index(): detected NaN\" );\n  }\n\n\n\ntemplate<typename T1>\ninline\nbool\nop_stable_sort_index::apply_noalias(Mat<uword>& out, const Proxy<T1>& P, const uword sort_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  return arma_sort_index_helper<T1,true>(out, P, sort_type);\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_stable_sort_index::apply(Mat<uword>& out, const mtOp<uword,T1,op_stable_sort_index>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<T1> P(in.m);\n  \n  if(P.get_n_elem() == 0)  { out.set_size(0,1); return; }\n  \n  const uword sort_type = in.aux_uword_a;\n  \n  bool all_non_nan = false;\n  \n  if(P.is_alias(out))\n    {\n    Mat<uword> out2;\n    \n    all_non_nan = op_stable_sort_index::apply_noalias(out2, P, sort_type);\n    \n    out.steal_mem(out2);\n    }\n  else\n    {\n    all_non_nan = op_stable_sort_index::apply_noalias(out, P, sort_type);\n    }\n  \n  arma_debug_check( (all_non_nan == false), \"stable_sort_index(): detected NaN\" );\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_sort_meat.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_sort\n//! @{\n\n\n\ntemplate<typename eT>\ninline \nvoid\nop_sort::direct_sort(eT* X, const uword n_elem, const uword sort_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(sort_type == 0)\n    {\n    arma_ascend_sort_helper<eT> comparator;\n    \n    std::sort(&X[0], &X[n_elem], comparator);\n    }\n  else\n    {\n    arma_descend_sort_helper<eT> comparator;\n    \n    std::sort(&X[0], &X[n_elem], comparator);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline \nvoid\nop_sort::direct_sort_ascending(eT* X, const uword n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_ascend_sort_helper<eT> comparator;\n    \n  std::sort(&X[0], &X[n_elem], comparator);\n  }\n\n\n\ntemplate<typename eT>\ninline \nvoid\nop_sort::copy_row(eT* X, const Mat<eT>& A, const uword row)\n  {\n  const uword N = A.n_cols;\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<N; i+=2, j+=2)\n    {\n    X[i] = A.at(row,i);\n    X[j] = A.at(row,j);\n    }\n  \n  if(i < N)\n    {\n    X[i] = A.at(row,i);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline \nvoid\nop_sort::copy_row(Mat<eT>& A, const eT* X, const uword row)\n  {\n  const uword N = A.n_cols;\n  \n  uword i,j;\n  \n  for(i=0, j=1; j<N; i+=2, j+=2)\n    {\n    A.at(row,i) = X[i]; \n    A.at(row,j) = X[j];\n    }\n  \n  if(i < N)\n    {\n    A.at(row,i) = X[i];\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nop_sort::apply_noalias(Mat<eT>& out, const Mat<eT>& X, const uword sort_type, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  if( (X.n_rows * X.n_cols) <= 1 )\n    {\n    out = X;\n    return;\n    }\n  \n  \n  if(dim == 0)  // sort the contents of each column\n    {\n    arma_extra_debug_print(\"op_sort::apply(): dim = 0\");\n    \n    out = X;\n    \n    const uword n_rows = out.n_rows;\n    const uword n_cols = out.n_cols;\n      \n    for(uword col=0; col < n_cols; ++col)\n      {\n      op_sort::direct_sort( out.colptr(col), n_rows, sort_type );\n      }\n    }\n  else\n  if(dim == 1)  // sort the contents of each row\n    {\n    if(X.n_rows == 1)  // a row vector\n      {\n      arma_extra_debug_print(\"op_sort::apply(): dim = 1, vector specific\");\n      \n      out = X;\n      op_sort::direct_sort(out.memptr(), out.n_elem, sort_type);\n      }\n    else  // not a row vector\n      {\n      arma_extra_debug_print(\"op_sort::apply(): dim = 1, generic\");\n      \n      out.copy_size(X);\n      \n      const uword n_rows = out.n_rows;\n      const uword n_cols = out.n_cols;\n      \n      podarray<eT> tmp_array(n_cols);\n      \n      for(uword row=0; row < n_rows; ++row)\n        {\n        op_sort::copy_row(tmp_array.memptr(), X, row);\n        \n        op_sort::direct_sort( tmp_array.memptr(), n_cols, sort_type );\n        \n        op_sort::copy_row(out, tmp_array.memptr(), row);\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_sort::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_sort>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const quasi_unwrap<T1> U(in.m);\n  \n  const Mat<eT>& X = U.M;\n  \n  const uword sort_type = in.aux_uword_a;\n  const uword dim       = in.aux_uword_b;\n  \n  arma_debug_check( (sort_type > 1), \"sort(): parameter 'sort_type' must be 0 or 1\" );\n  arma_debug_check( (dim > 1),       \"sort(): parameter 'dim' must be 0 or 1\"       );\n  arma_debug_check( (X.has_nan()),   \"sort(): detected NaN\"                         );\n  \n  if(U.is_alias(out))\n    {\n    Mat<eT> out2;\n    \n    op_sort::apply_noalias(out2, X, sort_type, dim);\n    \n    out.steal_mem(out2);\n    }\n  else\n    {\n    apply_noalias(out, X, sort_type, dim);\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_stddev_bones.hpp",
    "content": "// Copyright (C) 2009-2011 Conrad Sanderson\n// Copyright (C) 2009-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_stddev\n//! @{\n\n//! Class for finding the standard deviation\nclass op_stddev\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::pod_type>& out, const mtOp<typename T1::pod_type, T1, op_stddev>& in);\n  };\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_stddev_meat.hpp",
    "content": "// Copyright (C) 2009-2015 Conrad Sanderson\n// Copyright (C) 2009-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_stddev\n//! @{\n\n\n//! \\brief\n//! For each row or for each column, find the standard deviation.\n//! The result is stored in a dense matrix that has either one column or one row.\n//! The dimension for which the standard deviations are found is set via the stddev() function.\ntemplate<typename T1>\ninline\nvoid\nop_stddev::apply(Mat<typename T1::pod_type>& out, const mtOp<typename T1::pod_type, T1, op_stddev>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type  in_eT;\n  typedef typename T1::pod_type  out_eT;\n  \n  const unwrap_check_mixed<T1> tmp(in.m, out);\n  const Mat<in_eT>&        X = tmp.M;\n  \n  const uword norm_type = in.aux_uword_a;\n  const uword dim       = in.aux_uword_b;\n  \n  arma_debug_check( (norm_type > 1), \"stddev(): parameter 'norm_type' must be 0 or 1\" );\n  arma_debug_check( (dim > 1),       \"stddev(): parameter 'dim' must be 0 or 1\"       );\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  if(dim == 0)\n    {\n    arma_extra_debug_print(\"op_stddev::apply(): dim = 0\");\n    \n    out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols);\n    \n    if(X_n_rows > 0)\n      {\n      out_eT* out_mem = out.memptr();\n      \n      for(uword col=0; col<X_n_cols; ++col)\n        {\n        out_mem[col] = std::sqrt( op_var::direct_var( X.colptr(col), X_n_rows, norm_type ) );\n        }\n      }\n    }\n  else\n  if(dim == 1)\n    {\n    arma_extra_debug_print(\"op_stddev::apply(): dim = 1\");\n    \n    out.set_size(X_n_rows, (X_n_cols > 0) ? 1 : 0);\n    \n    if(X_n_cols > 0)\n      {\n      podarray<in_eT> dat(X_n_cols);\n      \n      in_eT*  dat_mem = dat.memptr();\n      out_eT* out_mem = out.memptr();\n      \n      for(uword row=0; row<X_n_rows; ++row)\n        {\n        dat.copy_row(X, row);\n        \n        out_mem[row] = std::sqrt( op_var::direct_var( dat_mem, X_n_cols, norm_type) );\n        }\n      }\n    }\n  }\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_strans_bones.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_strans\n//! @{\n\n\n//! 'matrix transpose' operation (simple transpose, ie. without taking the conjugate of the elements)\n\nclass op_strans\n  {\n  public:\n  \n  template<const bool do_flip, const uword row, const uword col>\n  struct pos\n    {\n    static const uword n2 = (do_flip == false) ? (row + col*2) : (col + row*2);\n    static const uword n3 = (do_flip == false) ? (row + col*3) : (col + row*3);\n    static const uword n4 = (do_flip == false) ? (row + col*4) : (col + row*4);\n    };\n  \n  template<typename eT, typename TA>\n  arma_hot inline static void apply_mat_noalias_tinysq(Mat<eT>& out, const TA& A);\n  \n  template<typename eT, typename TA>\n  arma_hot inline static void apply_mat_noalias(Mat<eT>& out, const TA& A);\n  \n  template<typename eT>\n  arma_hot inline static void apply_mat_inplace(Mat<eT>& out);\n  \n  template<typename eT, typename TA>\n  arma_hot inline static void apply_mat(Mat<eT>& out, const TA& A);\n  \n  template<typename T1>\n  arma_hot inline static void apply_proxy(Mat<typename T1::elem_type>& out, const T1& X);\n  \n  template<typename T1>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_strans>& in);\n  };\n\n\n\nclass op_strans2\n  {\n  public:\n  \n  template<const bool do_flip, const uword row, const uword col>\n  struct pos\n    {\n    static const uword n2 = (do_flip == false) ? (row + col*2) : (col + row*2);\n    static const uword n3 = (do_flip == false) ? (row + col*3) : (col + row*3);\n    static const uword n4 = (do_flip == false) ? (row + col*4) : (col + row*4);\n    };\n  \n  template<typename eT, typename TA>\n  arma_hot inline static void apply_noalias_tinysq(Mat<eT>& out, const TA& A, const eT val);\n  \n  template<typename eT, typename TA>\n  arma_hot inline static void apply_noalias(Mat<eT>& out, const TA& A, const eT val);\n  \n  template<typename eT, typename TA>\n  arma_hot inline static void apply(Mat<eT>& out, const TA& A, const eT val);\n  \n  template<typename T1>\n  arma_hot inline static void apply_proxy(Mat<typename T1::elem_type>& out, const T1& X, const typename T1::elem_type val);\n  \n  // NOTE: there is no direct handling of Op<T1,op_strans2>, as op_strans2::apply_proxy() is currently only called by op_htrans2 for non-complex numbers\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_strans_meat.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// Copyright (C) 2012 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_strans\n//! @{\n\n\n\n//! for tiny square matrices (size <= 4x4)\ntemplate<typename eT, typename TA>\narma_hot\ninline\nvoid\nop_strans::apply_mat_noalias_tinysq(Mat<eT>& out, const TA& A)\n  {\n  const eT*   Am =   A.memptr();\n        eT* outm = out.memptr();\n  \n  switch(A.n_rows)\n    {\n    case 1:\n      {\n      outm[0] = Am[0];\n      }\n      break;\n      \n    case 2:\n      {\n      outm[pos<false,0,0>::n2] = Am[pos<true,0,0>::n2];\n      outm[pos<false,1,0>::n2] = Am[pos<true,1,0>::n2];\n      \n      outm[pos<false,0,1>::n2] = Am[pos<true,0,1>::n2];\n      outm[pos<false,1,1>::n2] = Am[pos<true,1,1>::n2];\n      }\n      break;\n    \n    case 3:\n      {\n      outm[pos<false,0,0>::n3] = Am[pos<true,0,0>::n3];\n      outm[pos<false,1,0>::n3] = Am[pos<true,1,0>::n3];\n      outm[pos<false,2,0>::n3] = Am[pos<true,2,0>::n3];\n      \n      outm[pos<false,0,1>::n3] = Am[pos<true,0,1>::n3];\n      outm[pos<false,1,1>::n3] = Am[pos<true,1,1>::n3];\n      outm[pos<false,2,1>::n3] = Am[pos<true,2,1>::n3];\n      \n      outm[pos<false,0,2>::n3] = Am[pos<true,0,2>::n3];\n      outm[pos<false,1,2>::n3] = Am[pos<true,1,2>::n3];\n      outm[pos<false,2,2>::n3] = Am[pos<true,2,2>::n3];\n      }\n      break;\n    \n    case 4:\n      {\n      outm[pos<false,0,0>::n4] = Am[pos<true,0,0>::n4];\n      outm[pos<false,1,0>::n4] = Am[pos<true,1,0>::n4];\n      outm[pos<false,2,0>::n4] = Am[pos<true,2,0>::n4];\n      outm[pos<false,3,0>::n4] = Am[pos<true,3,0>::n4];\n      \n      outm[pos<false,0,1>::n4] = Am[pos<true,0,1>::n4];\n      outm[pos<false,1,1>::n4] = Am[pos<true,1,1>::n4];\n      outm[pos<false,2,1>::n4] = Am[pos<true,2,1>::n4];\n      outm[pos<false,3,1>::n4] = Am[pos<true,3,1>::n4];\n      \n      outm[pos<false,0,2>::n4] = Am[pos<true,0,2>::n4];\n      outm[pos<false,1,2>::n4] = Am[pos<true,1,2>::n4];\n      outm[pos<false,2,2>::n4] = Am[pos<true,2,2>::n4];\n      outm[pos<false,3,2>::n4] = Am[pos<true,3,2>::n4];\n      \n      outm[pos<false,0,3>::n4] = Am[pos<true,0,3>::n4];\n      outm[pos<false,1,3>::n4] = Am[pos<true,1,3>::n4];\n      outm[pos<false,2,3>::n4] = Am[pos<true,2,3>::n4];\n      outm[pos<false,3,3>::n4] = Am[pos<true,3,3>::n4];\n      }\n      break;\n    \n    default:\n      ;\n    }\n  \n  }\n\n\n\n//! Immediate transpose of a dense matrix\ntemplate<typename eT, typename TA>\narma_hot\ninline\nvoid\nop_strans::apply_mat_noalias(Mat<eT>& out, const TA& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword A_n_cols = A.n_cols;\n  const uword A_n_rows = A.n_rows;\n  \n  out.set_size(A_n_cols, A_n_rows);\n  \n  if( (TA::is_row) || (TA::is_col) || (A_n_cols == 1) || (A_n_rows == 1) )\n    {\n    arrayops::copy( out.memptr(), A.memptr(), A.n_elem );\n    }\n  else\n    {\n    if( (A_n_rows <= 4) && (A_n_rows == A_n_cols) )\n      {\n      op_strans::apply_mat_noalias_tinysq(out, A);\n      }\n    else\n      {\n      eT* outptr = out.memptr();\n      \n      for(uword k=0; k < A_n_rows; ++k)\n        {\n        const eT* Aptr = &(A.at(k,0));\n        \n        uword j;\n        for(j=1; j < A_n_cols; j+=2)\n          {\n          const eT tmp_i = (*Aptr);  Aptr += A_n_rows;\n          const eT tmp_j = (*Aptr);  Aptr += A_n_rows;\n          \n          (*outptr) = tmp_i;  outptr++;\n          (*outptr) = tmp_j;  outptr++;\n          }\n        \n        if((j-1) < A_n_cols)\n          {\n          (*outptr) = (*Aptr);  outptr++;;\n          }\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\nop_strans::apply_mat_inplace(Mat<eT>& out)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_rows = out.n_rows;\n  const uword n_cols = out.n_cols;\n  \n  if(n_rows == n_cols)\n    {\n    arma_extra_debug_print(\"op_strans::apply(): doing in-place transpose of a square matrix\");\n    \n    const uword N = n_rows;\n    \n    for(uword k=0; k < N; ++k)\n      {\n      eT* colptr = &(out.at(k,k));\n      eT* rowptr = colptr;\n      \n      colptr++;\n      rowptr += N;\n      \n      uword j;\n      \n      for(j=(k+2); j < N; j+=2)\n        {\n        std::swap( (*rowptr), (*colptr) );  rowptr += N;  colptr++;\n        std::swap( (*rowptr), (*colptr) );  rowptr += N;  colptr++;\n        }\n      \n      if((j-1) < N)\n        {\n        std::swap( (*rowptr), (*colptr) );\n        }\n      }\n    }\n  else\n    {\n    Mat<eT> tmp;\n    \n    op_strans::apply_mat_noalias(tmp, out);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename eT, typename TA>\narma_hot\ninline\nvoid\nop_strans::apply_mat(Mat<eT>& out, const TA& A)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(&out != &A)\n    {\n    op_strans::apply_mat_noalias(out, A);\n    }\n  else\n    {\n    op_strans::apply_mat_inplace(out);\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_strans::apply_proxy(Mat<typename T1::elem_type>& out, const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(X);\n  \n  // allow detection of in-place transpose\n  if( (is_Mat<typename Proxy<T1>::stored_type>::value == true) && (Proxy<T1>::fake_mat == false) )\n    {\n    const unwrap<typename Proxy<T1>::stored_type> tmp(P.Q);\n    \n    op_strans::apply_mat(out, tmp.M);\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    const bool is_alias = P.is_alias(out);\n    \n    if( (resolves_to_vector<T1>::value == true) && (Proxy<T1>::prefer_at_accessor == false) )\n      {\n      if(is_alias == false)\n        {\n        out.set_size(n_cols, n_rows);\n        \n        eT* out_mem = out.memptr();\n        \n        const uword n_elem = P.get_n_elem();\n        \n        typename Proxy<T1>::ea_type Pea = P.get_ea();\n        \n        uword i,j;\n        for(i=0, j=1; j < n_elem; i+=2, j+=2)\n          {\n          const eT tmp_i = Pea[i];\n          const eT tmp_j = Pea[j];\n          \n          out_mem[i] = tmp_i;\n          out_mem[j] = tmp_j;\n          }\n        \n        if(i < n_elem)\n          {\n          out_mem[i] = Pea[i];\n          }\n        }\n      else  // aliasing\n        {\n        Mat<eT> out2(n_cols, n_rows);\n        \n        eT* out_mem = out2.memptr();\n        \n        const uword n_elem = P.get_n_elem();\n        \n        typename Proxy<T1>::ea_type Pea = P.get_ea();\n        \n        uword i,j;\n        for(i=0, j=1; j < n_elem; i+=2, j+=2)\n          {\n          const eT tmp_i = Pea[i];\n          const eT tmp_j = Pea[j];\n          \n          out_mem[i] = tmp_i;\n          out_mem[j] = tmp_j;\n          }\n        \n        if(i < n_elem)\n          {\n          out_mem[i] = Pea[i];\n          }\n        \n        out.steal_mem(out2);\n        }\n      }\n    else   // general matrix transpose\n      {\n      if(is_alias == false)\n        {\n        out.set_size(n_cols, n_rows);\n        \n        eT* outptr = out.memptr();\n        \n        for(uword k=0; k < n_rows; ++k)\n          {\n          uword j;\n          for(j=1; j < n_cols; j+=2)\n            {\n            const uword i = j-1;\n            \n            const eT tmp_i = P.at(k,i);\n            const eT tmp_j = P.at(k,j);\n            \n            (*outptr) = tmp_i;  outptr++;\n            (*outptr) = tmp_j;  outptr++;\n            }\n          \n          const uword i = j-1;\n          \n          if(i < n_cols)\n            {\n            (*outptr) = P.at(k,i);  outptr++;\n            }\n          }\n        }\n      else // aliasing\n        {\n        Mat<eT> out2(n_cols, n_rows);\n        \n        eT* out2ptr = out2.memptr();\n        \n        for(uword k=0; k < n_rows; ++k)\n          {\n          uword j;\n          for(j=1; j < n_cols; j+=2)\n            {\n            const uword i = j-1;\n            \n            const eT tmp_i = P.at(k,i);\n            const eT tmp_j = P.at(k,j);\n            \n            (*out2ptr) = tmp_i;  out2ptr++;\n            (*out2ptr) = tmp_j;  out2ptr++;\n            }\n          \n          const uword i = j-1;\n        \n          if(i < n_cols)\n            {\n            (*out2ptr) = P.at(k,i);  out2ptr++;\n            }\n          }\n        \n        out.steal_mem(out2);\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_strans::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_strans>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  op_strans::apply_proxy(out, in.m);\n  }\n\n\n\n//\n// op_strans2\n\n\n\n//! for tiny square matrices (size <= 4x4)\ntemplate<typename eT, typename TA>\narma_hot\ninline\nvoid\nop_strans2::apply_noalias_tinysq(Mat<eT>& out, const TA& A, const eT val)\n  {\n  const eT* Am   =   A.memptr();\n        eT* outm = out.memptr();\n  \n  switch(A.n_rows)\n    {\n    case 1:\n      {\n      outm[0] = val * Am[0];\n      }\n      break;\n      \n    case 2:\n      {\n      outm[pos<false,0,0>::n2] = val * Am[pos<true,0,0>::n2];\n      outm[pos<false,1,0>::n2] = val * Am[pos<true,1,0>::n2];\n      \n      outm[pos<false,0,1>::n2] = val * Am[pos<true,0,1>::n2];\n      outm[pos<false,1,1>::n2] = val * Am[pos<true,1,1>::n2];\n      }\n      break;\n    \n    case 3:\n      {\n      outm[pos<false,0,0>::n3] = val * Am[pos<true,0,0>::n3];\n      outm[pos<false,1,0>::n3] = val * Am[pos<true,1,0>::n3];\n      outm[pos<false,2,0>::n3] = val * Am[pos<true,2,0>::n3];\n      \n      outm[pos<false,0,1>::n3] = val * Am[pos<true,0,1>::n3];\n      outm[pos<false,1,1>::n3] = val * Am[pos<true,1,1>::n3];\n      outm[pos<false,2,1>::n3] = val * Am[pos<true,2,1>::n3];\n      \n      outm[pos<false,0,2>::n3] = val * Am[pos<true,0,2>::n3];\n      outm[pos<false,1,2>::n3] = val * Am[pos<true,1,2>::n3];\n      outm[pos<false,2,2>::n3] = val * Am[pos<true,2,2>::n3];\n      }\n      break;\n    \n    case 4:\n      {\n      outm[pos<false,0,0>::n4] = val * Am[pos<true,0,0>::n4];\n      outm[pos<false,1,0>::n4] = val * Am[pos<true,1,0>::n4];\n      outm[pos<false,2,0>::n4] = val * Am[pos<true,2,0>::n4];\n      outm[pos<false,3,0>::n4] = val * Am[pos<true,3,0>::n4];\n      \n      outm[pos<false,0,1>::n4] = val * Am[pos<true,0,1>::n4];\n      outm[pos<false,1,1>::n4] = val * Am[pos<true,1,1>::n4];\n      outm[pos<false,2,1>::n4] = val * Am[pos<true,2,1>::n4];\n      outm[pos<false,3,1>::n4] = val * Am[pos<true,3,1>::n4];\n      \n      outm[pos<false,0,2>::n4] = val * Am[pos<true,0,2>::n4];\n      outm[pos<false,1,2>::n4] = val * Am[pos<true,1,2>::n4];\n      outm[pos<false,2,2>::n4] = val * Am[pos<true,2,2>::n4];\n      outm[pos<false,3,2>::n4] = val * Am[pos<true,3,2>::n4];\n      \n      outm[pos<false,0,3>::n4] = val * Am[pos<true,0,3>::n4];\n      outm[pos<false,1,3>::n4] = val * Am[pos<true,1,3>::n4];\n      outm[pos<false,2,3>::n4] = val * Am[pos<true,2,3>::n4];\n      outm[pos<false,3,3>::n4] = val * Am[pos<true,3,3>::n4];\n      }\n      break;\n    \n    default:\n      ;\n    }\n  \n  }\n\n\n\ntemplate<typename eT, typename TA>\narma_hot\ninline\nvoid\nop_strans2::apply_noalias(Mat<eT>& out, const TA& A, const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword A_n_cols = A.n_cols;\n  const uword A_n_rows = A.n_rows;\n  \n  out.set_size(A_n_cols, A_n_rows);\n  \n  if( (TA::is_col) || (TA::is_row) || (A_n_cols == 1) || (A_n_rows == 1) )\n    {\n    const uword N = A.n_elem;\n    \n    const eT*   A_mem =   A.memptr();\n          eT* out_mem = out.memptr();\n    \n    uword i,j;\n    for(i=0, j=1; j < N; i+=2, j+=2)\n      {\n      const eT tmp_i = A_mem[i];\n      const eT tmp_j = A_mem[j];\n      \n      out_mem[i] = val * tmp_i;\n      out_mem[j] = val * tmp_j;\n      }\n    \n    if(i < N)\n      {\n      out_mem[i] = val * A_mem[i];\n      }\n    }\n  else\n    {\n    if( (A_n_rows <= 4) && (A_n_rows == A_n_cols) )\n      {\n      op_strans2::apply_noalias_tinysq(out, A, val);\n      }\n    else\n      {\n      eT* outptr = out.memptr();\n      \n      for(uword k=0; k < A_n_rows; ++k)\n        {\n        const eT* Aptr = &(A.at(k,0));\n        \n        uword j;\n        for(j=1; j < A_n_cols; j+=2)\n          {\n          const eT tmp_i = (*Aptr);  Aptr += A_n_rows;\n          const eT tmp_j = (*Aptr);  Aptr += A_n_rows;\n          \n          (*outptr) = val * tmp_i;  outptr++;\n          (*outptr) = val * tmp_j;  outptr++;\n          }\n        \n        if((j-1) < A_n_cols)\n          {\n          (*outptr) = val * (*Aptr);  outptr++;;\n          }\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT, typename TA>\narma_hot\ninline\nvoid\nop_strans2::apply(Mat<eT>& out, const TA& A, const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(&out != &A)\n    {\n    op_strans2::apply_noalias(out, A, val);\n    }\n  else\n    {\n    const uword n_rows = out.n_rows;\n    const uword n_cols = out.n_cols;\n    \n    if(n_rows == n_cols)\n      {\n      arma_extra_debug_print(\"op_strans2::apply(): doing in-place transpose of a square matrix\");\n      \n      const uword N = n_rows;\n      \n      // TODO: do multiplication while swapping\n      \n      for(uword k=0; k < N; ++k)\n        {\n        eT* colptr = out.colptr(k);\n        \n        uword i,j;\n        \n        for(i=(k+1), j=(k+2); j < N; i+=2, j+=2)\n          {\n          std::swap(out.at(k,i), colptr[i]);\n          std::swap(out.at(k,j), colptr[j]);\n          }\n        \n        if(i < N)\n          {\n          std::swap(out.at(k,i), colptr[i]);\n          }\n        }\n      \n      arrayops::inplace_mul( out.memptr(), val, out.n_elem );\n      }\n    else\n      {\n      Mat<eT> tmp;\n      op_strans2::apply_noalias(tmp, A, val);\n      \n      out.steal_mem(tmp);\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_strans2::apply_proxy(Mat<typename T1::elem_type>& out, const T1& X, const typename T1::elem_type val)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(X);\n  \n  // allow detection of in-place transpose\n  if( (is_Mat<typename Proxy<T1>::stored_type>::value == true) && (Proxy<T1>::fake_mat == false) )\n    {\n    const unwrap<typename Proxy<T1>::stored_type> tmp(P.Q);\n    \n    op_strans2::apply(out, tmp.M, val);\n    }\n  else\n    {\n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    const bool is_alias = P.is_alias(out);\n    \n    if( (resolves_to_vector<T1>::value == true) && (Proxy<T1>::prefer_at_accessor == false) )\n      {\n      if(is_alias == false)\n        {\n        out.set_size(n_cols, n_rows);\n        \n        eT* out_mem = out.memptr();\n        \n        const uword n_elem = P.get_n_elem();\n        \n        typename Proxy<T1>::ea_type Pea = P.get_ea();\n        \n        uword i,j;\n        for(i=0, j=1; j < n_elem; i+=2, j+=2)\n          {\n          const eT tmp_i = Pea[i];\n          const eT tmp_j = Pea[j];\n          \n          out_mem[i] = val * tmp_i;\n          out_mem[j] = val * tmp_j;\n          }\n        \n        if(i < n_elem)\n          {\n          out_mem[i] = val * Pea[i];\n          }\n        }\n      else  // aliasing\n        {\n        Mat<eT> out2(n_cols, n_rows);\n        \n        eT* out_mem = out2.memptr();\n        \n        const uword n_elem = P.get_n_elem();\n        \n        typename Proxy<T1>::ea_type Pea = P.get_ea();\n        \n        uword i,j;\n        for(i=0, j=1; j < n_elem; i+=2, j+=2)\n          {\n          const eT tmp_i = Pea[i];\n          const eT tmp_j = Pea[j];\n          \n          out_mem[i] = val * tmp_i;\n          out_mem[j] = val * tmp_j;\n          }\n        \n        if(i < n_elem)\n          {\n          out_mem[i] = val * Pea[i];\n          }\n        \n        out.steal_mem(out2);\n        }\n      }\n    else   // general matrix transpose\n      {\n      if(is_alias == false)\n        {\n        out.set_size(n_cols, n_rows);\n        \n        eT* outptr = out.memptr();\n        \n        for(uword k=0; k < n_rows; ++k)\n          {\n          uword j;\n          for(j=1; j < n_cols; j+=2)\n            {\n            const uword i = j-1;\n            \n            const eT tmp_i = P.at(k,i);\n            const eT tmp_j = P.at(k,j);\n            \n            (*outptr) = val * tmp_i;  outptr++;\n            (*outptr) = val * tmp_j;  outptr++;\n            }\n          \n          const uword i = j-1;\n          \n          if(i < n_cols)\n            {\n            (*outptr) = val * P.at(k,i);  outptr++;\n            }\n          }\n        }\n      else // aliasing\n        {\n        Mat<eT> out2(n_cols, n_rows);\n        \n        eT* out2ptr = out2.memptr();\n        \n        for(uword k=0; k < n_rows; ++k)\n          {\n          uword j;\n          for(j=1; j < n_cols; j+=2)\n            {\n            const uword i = j-1;\n            \n            const eT tmp_i = P.at(k,i);\n            const eT tmp_j = P.at(k,j);\n            \n            (*out2ptr) = val * tmp_i;  out2ptr++;\n            (*out2ptr) = val * tmp_j;  out2ptr++;\n            }\n          \n          const uword i = j-1;\n        \n          if(i < n_cols)\n            {\n            (*out2ptr) = val * P.at(k,i);  out2ptr++;\n            }\n          }\n        \n        out.steal_mem(out2);\n        }\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_sum_bones.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_sum\n//! @{\n\n\nclass op_sum\n  {\n  public:\n  \n  template<typename T1>\n  arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1, op_sum>& in);\n  \n  template<typename T1>\n  arma_hot inline static void apply_noalias(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword dim);\n  \n  template<typename T1>\n  arma_hot inline static void apply_noalias_unwrap(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword dim);\n  \n  template<typename T1>\n  arma_hot inline static void apply_noalias_proxy(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword dim);\n  };\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_sum_meat.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_sum\n//! @{\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_sum::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_sum>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword dim = in.aux_uword_a;\n  arma_debug_check( (dim > 1), \"sum(): parameter 'dim' must be 0 or 1\" );\n  \n  const Proxy<T1> P(in.m);\n  \n  if(P.is_alias(out) == false)\n    {\n    op_sum::apply_noalias(out, P, dim);\n    }\n  else\n    {\n    Mat<eT> tmp;\n    \n    op_sum::apply_noalias(tmp, P, dim);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_sum::apply_noalias(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(is_Mat<typename Proxy<T1>::stored_type>::value)\n    {\n    op_sum::apply_noalias_unwrap(out, P, dim);\n    }\n  else\n    {\n    op_sum::apply_noalias_proxy(out, P, dim);\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_sum::apply_noalias_unwrap(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  typedef typename Proxy<T1>::stored_type P_stored_type;\n  \n  const unwrap<P_stored_type> tmp(P.Q);\n  \n  const typename unwrap<P_stored_type>::stored_type& X = tmp.M;\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  if(dim == 0)\n    {\n    out.set_size(1, X_n_cols);\n    \n    eT* out_mem = out.memptr();\n    \n    for(uword col=0; col < X_n_cols; ++col)\n      {\n      out_mem[col] = arrayops::accumulate( X.colptr(col), X_n_rows );\n      }\n    }\n  else\n    {\n    out.zeros(X_n_rows, 1);\n    \n    eT* out_mem = out.memptr();\n    \n    for(uword col=0; col < X_n_cols; ++col)\n      {\n      const eT* col_mem = X.colptr(col);\n      \n      for(uword row=0; row < X_n_rows; ++row)\n        {\n        out_mem[row] += col_mem[row];\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nop_sum::apply_noalias_proxy(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword dim)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword P_n_rows = P.get_n_rows();\n  const uword P_n_cols = P.get_n_cols();\n  \n  if(dim == 0)\n    {\n    out.set_size(1, P_n_cols);\n    \n    eT* out_mem = out.memptr();\n    \n    for(uword col=0; col < P_n_cols; ++col)\n      {\n      eT val1 = eT(0);\n      eT val2 = eT(0);\n      \n      uword i,j;\n      for(i=0, j=1; j < P_n_rows; i+=2, j+=2)\n        {\n        val1 += P.at(i,col);\n        val2 += P.at(j,col);\n        }\n      \n      if(i < P_n_rows)\n        {\n        val1 += P.at(i,col);\n        }\n      \n      out_mem[col] = (val1 + val2);\n      }\n    }\n  else\n    {\n    out.zeros(P_n_rows, 1);\n    \n    eT* out_mem = out.memptr();\n    \n    for(uword col=0; col < P_n_cols; ++col)\n    for(uword row=0; row < P_n_rows; ++row)\n      {\n      out_mem[row] += P.at(row,col);\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_symmat_bones.hpp",
    "content": "// Copyright (C) 2011-2014 Conrad Sanderson\n// Copyright (C) 2011-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_symmat\n//! @{\n\n\n\nclass op_symmat\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_symmat>& in);\n  };\n\n\n\nclass op_symmat_cx\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_symmat_cx>& in);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_symmat_meat.hpp",
    "content": "// Copyright (C) 2011-2014 Conrad Sanderson\n// Copyright (C) 2011-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_symmat\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_symmat::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_symmat>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1>   tmp(in.m);\n  const Mat<eT>& A = tmp.M;\n  \n  arma_debug_check( (A.is_square() == false), \"symmatu()/symmatl(): given matrix must be square\" );\n  \n  const uword N     = A.n_rows;\n  const bool  upper = (in.aux_uword_a == 0);\n  \n  if(&out != &A)\n    {\n    out.copy_size(A);\n    \n    if(upper)\n      {\n      // upper triangular: copy the diagonal and the elements above the diagonal\n      \n      for(uword i=0; i<N; ++i)\n        {\n        const eT* A_data   = A.colptr(i);\n              eT* out_data = out.colptr(i);\n        \n        arrayops::copy( out_data, A_data, i+1 );\n        }\n      }\n    else\n      {\n      // lower triangular: copy the diagonal and the elements below the diagonal\n      \n      for(uword i=0; i<N; ++i)\n        {\n        const eT* A_data   = A.colptr(i);\n              eT* out_data = out.colptr(i);\n        \n        arrayops::copy( &out_data[i], &A_data[i], N-i );\n        }\n      }\n    }\n  \n  \n  if(upper)\n    {\n    // reflect elements across the diagonal from upper triangle to lower triangle\n    \n    for(uword col=1; col < N; ++col)\n      {\n      const eT* coldata = out.colptr(col);\n      \n      for(uword row=0; row < col; ++row)\n        {\n        out.at(col,row) = coldata[row];\n        }\n      }\n    }\n  else\n    {\n    // reflect elements across the diagonal from lower triangle to upper triangle\n    \n    for(uword col=0; col < N; ++col)\n      {\n      const eT* coldata = out.colptr(col);\n      \n      for(uword row=(col+1); row < N; ++row)\n        {\n        out.at(col,row) = coldata[row];\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_symmat_cx::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_symmat_cx>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1>   tmp(in.m);\n  const Mat<eT>& A = tmp.M;\n  \n  arma_debug_check( (A.is_square() == false), \"symmatu()/symmatl(): given matrix must be square\" );\n  \n  const uword N  = A.n_rows;\n  \n  const bool upper   = (in.aux_uword_a == 0);\n  const bool do_conj = (in.aux_uword_b == 1);\n  \n  if(&out != &A)\n    {\n    out.copy_size(A);\n    \n    if(upper)\n      {\n      // upper triangular: copy the diagonal and the elements above the diagonal\n      \n      for(uword i=0; i<N; ++i)\n        {\n        const eT* A_data   = A.colptr(i);\n              eT* out_data = out.colptr(i);\n        \n        arrayops::copy( out_data, A_data, i+1 );\n        }\n      }\n    else\n      {\n      // lower triangular: copy the diagonal and the elements below the diagonal\n      \n      for(uword i=0; i<N; ++i)\n        {\n        const eT* A_data   = A.colptr(i);\n              eT* out_data = out.colptr(i);\n        \n        arrayops::copy( &out_data[i], &A_data[i], N-i );\n        }\n      }\n    }\n  \n  \n  if(do_conj)\n    {\n    if(upper)\n      {\n      // reflect elements across the diagonal from upper triangle to lower triangle\n      \n      for(uword col=1; col < N; ++col)\n        {\n        const eT* coldata = out.colptr(col);\n        \n        for(uword row=0; row < col; ++row)\n          {\n          out.at(col,row) = std::conj(coldata[row]);\n          }\n        }\n      }\n    else\n      {\n      // reflect elements across the diagonal from lower triangle to upper triangle\n      \n      for(uword col=0; col < N; ++col)\n        {\n        const eT* coldata = out.colptr(col);\n        \n        for(uword row=(col+1); row < N; ++row)\n          {\n          out.at(col,row) = std::conj(coldata[row]);\n          }\n        }\n      }\n    }\n  else  // don't do complex conjugation\n    {\n    if(upper)\n      {\n      // reflect elements across the diagonal from upper triangle to lower triangle\n      \n      for(uword col=1; col < N; ++col)\n        {\n        const eT* coldata = out.colptr(col);\n        \n        for(uword row=0; row < col; ++row)\n          {\n          out.at(col,row) = coldata[row];\n          }\n        }\n      }\n    else\n      {\n      // reflect elements across the diagonal from lower triangle to upper triangle\n      \n      for(uword col=0; col < N; ++col)\n        {\n        const eT* coldata = out.colptr(col);\n        \n        for(uword row=(col+1); row < N; ++row)\n          {\n          out.at(col,row) = coldata[row];\n          }\n        }\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_toeplitz_bones.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_toeplitz\n//! @{\n\n\n\nclass op_toeplitz\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_toeplitz>& in);\n  };\n\n\n\nclass op_toeplitz_c\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_toeplitz_c>& in);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_toeplitz_meat.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// Copyright (C) 2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_toeplitz\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_toeplitz::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_toeplitz>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_check<T1>  tmp(in.m, out);\n  const Mat<eT>& X      = tmp.M;\n  \n  arma_debug_check( ((X.is_vec() == false) && (X.is_empty() == false)), \"toeplitz(): given object is not a vector\" );\n  \n  const uword N     = X.n_elem;\n  const eT*   X_mem = X.memptr();\n  \n  out.set_size(N,N);\n  \n  for(uword col=0; col < N; ++col)\n    {\n    eT* col_mem = out.colptr(col);\n    \n    uword i;\n    \n    i = col;\n    for(uword row=0; row < col; ++row, --i) { col_mem[row] = X_mem[i]; }\n    \n    i = 0;\n    for(uword row=col; row < N; ++row, ++i) { col_mem[row] = X_mem[i]; }      \n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_toeplitz_c::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_toeplitz_c>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_check<T1>  tmp(in.m, out);\n  const Mat<eT>& X      = tmp.M;\n  \n  arma_debug_check( ((X.is_vec() == false) && (X.is_empty() == false)), \"circ_toeplitz(): given object is not a vector\" );\n  \n  const uword N     = X.n_elem;\n  const eT*   X_mem = X.memptr();\n  \n  out.set_size(N,N);\n  \n  if(X.is_rowvec() == true)\n    {\n    for(uword row=0; row < N; ++row)\n      {\n      uword i;\n      \n      i = row;\n      for(uword col=0; col < row; ++col, --i)  { out.at(row,col) = X_mem[N-i]; }\n      \n      i = 0;\n      for(uword col=row; col < N; ++col, ++i)  { out.at(row,col) = X_mem[i];   }\n      }\n    }\n  else\n    {\n    for(uword col=0; col < N; ++col)\n      {\n      eT* col_mem = out.colptr(col);\n      \n      uword i;\n      \n      i = col;\n      for(uword row=0; row < col; ++row, --i)  { col_mem[row] = X_mem[N-i]; }\n      \n      i = 0;\n      for(uword row=col; row < N; ++row, ++i)  { col_mem[row] = X_mem[i];   }\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_trimat_bones.hpp",
    "content": "// Copyright (C) 2010-2012 Conrad Sanderson\n// Copyright (C) 2010-2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2011 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_trimat\n//! @{\n\n\n\nclass op_trimat\n  {\n  public:\n  \n  template<typename eT>\n  inline static void fill_zeros(Mat<eT>& A, const bool upper);\n  \n  //\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_trimat>& in);\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<Op<T1,op_htrans>, op_trimat>& in);\n  \n  //\n  \n  template<typename eT>\n  inline static void apply_htrans(Mat<eT>& out, const Mat<eT>& A, const bool upper, const typename arma_not_cx<eT>::result* junk = 0);\n  \n  template<typename eT>\n  inline static void apply_htrans(Mat<eT>& out, const Mat<eT>& A, const bool upper, const typename arma_cx_only<eT>::result* junk = 0);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_trimat_meat.hpp",
    "content": "// Copyright (C) 2010-2012 Conrad Sanderson\n// Copyright (C) 2010-2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2011      Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_trimat\n//! @{\n\n\n\ntemplate<typename eT>\ninline\nvoid\nop_trimat::fill_zeros(Mat<eT>& out, const bool upper)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword N = out.n_rows;\n  \n  if(upper)\n    {\n    // upper triangular: set all elements below the diagonal to zero\n    \n    for(uword i=0; i<N; ++i)\n      {\n      eT* data = out.colptr(i);\n      \n      arrayops::inplace_set( &data[i+1], eT(0), (N-(i+1)) );\n      }\n    }\n  else\n    {\n    // lower triangular: set all elements above the diagonal to zero\n    \n    for(uword i=1; i<N; ++i)\n      {\n      eT* data = out.colptr(i);\n      \n      arrayops::inplace_set( data, eT(0), i );\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_trimat::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_trimat>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1>   tmp(in.m);\n  const Mat<eT>& A = tmp.M;\n  \n  arma_debug_check( (A.is_square() == false), \"trimatu()/trimatl(): given matrix must be square\" );\n  \n  const uword N     = A.n_rows;\n  const bool  upper = (in.aux_uword_a == 0);\n  \n  if(&out != &A)\n    {\n    out.copy_size(A);\n    \n    if(upper)\n      {\n      // upper triangular: copy the diagonal and the elements above the diagonal\n      for(uword i=0; i<N; ++i)\n        {\n        const eT* A_data   = A.colptr(i);\n              eT* out_data = out.colptr(i);\n        \n        arrayops::copy( out_data, A_data, i+1 );\n        }\n      }\n    else\n      {\n      // lower triangular: copy the diagonal and the elements below the diagonal\n      for(uword i=0; i<N; ++i)\n        {\n        const eT* A_data   = A.colptr(i);\n              eT* out_data = out.colptr(i);\n        \n        arrayops::copy( &out_data[i], &A_data[i], N-i );\n        }\n      }\n    }\n  \n  op_trimat::fill_zeros(out, upper);\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_trimat::apply(Mat<typename T1::elem_type>& out, const Op<Op<T1, op_htrans>, op_trimat>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap<T1>   tmp(in.m.m);\n  const Mat<eT>& A = tmp.M;\n  \n  const bool upper = (in.aux_uword_a == 0);\n  \n  op_trimat::apply_htrans(out, A, upper);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nop_trimat::apply_htrans\n  (\n        Mat<eT>& out,\n  const Mat<eT>& A,\n  const bool     upper,\n  const typename arma_not_cx<eT>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  // This specialisation is for trimatl(trans(X)) = trans(trimatu(X)) and also\n  // trimatu(trans(X)) = trans(trimatl(X)).  We want to avoid the creation of an\n  // extra temporary.\n  \n  // It doesn't matter if the input and output matrices are the same; we will\n  // pull data from the upper or lower triangular to the lower or upper\n  // triangular (respectively) and then set the rest to 0, so overwriting issues\n  // aren't present.\n  \n  arma_debug_check( (A.is_square() == false), \"trimatu()/trimatl(): given matrix must be square\" );\n  \n  const uword N = A.n_rows;\n  \n  if(&out != &A)\n    {\n    out.copy_size(A);\n    }\n  \n  // We can't really get away with any array copy operations here,\n  // unfortunately...\n  \n  if(upper)\n    {\n    // Upper triangular: but since we're transposing, we're taking the lower\n    // triangular and putting it in the upper half.\n    for(uword row = 0; row < N; ++row)\n      {\n      eT* out_colptr = out.colptr(row);\n      \n      for(uword col = 0; col <= row; ++col)\n        {\n        //out.at(col, row) = A.at(row, col);\n        out_colptr[col] = A.at(row, col);\n        }\n      }\n    }\n  else\n    {\n    // Lower triangular: but since we're transposing, we're taking the upper\n    // triangular and putting it in the lower half.\n    for(uword row = 0; row < N; ++row)\n      {\n      for(uword col = row; col < N; ++col)\n        {\n        out.at(col, row) = A.at(row, col);\n        }\n      }\n    }\n  \n  op_trimat::fill_zeros(out, upper);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nop_trimat::apply_htrans\n  (\n        Mat<eT>& out,\n  const Mat<eT>& A,\n  const bool     upper,\n  const typename arma_cx_only<eT>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  arma_debug_check( (A.is_square() == false), \"trimatu()/trimatl(): given matrix must be square\" );\n  \n  const uword N = A.n_rows;\n  \n  if(&out != &A)\n    {\n    out.copy_size(A);\n    }\n  \n  if(upper)\n    {\n    // Upper triangular: but since we're transposing, we're taking the lower\n    // triangular and putting it in the upper half.\n    for(uword row = 0; row < N; ++row)\n      {\n      eT* out_colptr = out.colptr(row);\n      \n      for(uword col = 0; col <= row; ++col)\n        {\n        //out.at(col, row) = std::conj( A.at(row, col) );\n        out_colptr[col] = std::conj( A.at(row, col) );\n        }\n      }\n    }\n  else\n    {\n    // Lower triangular: but since we're transposing, we're taking the upper\n    // triangular and putting it in the lower half.\n    for(uword row = 0; row < N; ++row)\n      {\n      for(uword col = row; col < N; ++col)\n        {\n        out.at(col, row) = std::conj( A.at(row, col) );\n        }\n      }\n    }\n  \n  op_trimat::fill_zeros(out, upper);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_unique_bones.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// Copyright (C) 2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2012 Arnold Wiliem\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_unique\n//! @{\n\n\n\nclass op_unique\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_unique>& X);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_unique_meat.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// Copyright (C) 2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2012 Arnold Wiliem\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_unique\n//! @{\n\n\n\n// TODO: add an efficient implementation for complex numbers\n\ntemplate<typename T1>\ninline\nvoid\nop_unique::apply(Mat<typename T1::elem_type>& out, const Op<T1, op_unique>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const Proxy<T1> P(X.m);\n  \n  const uword in_n_rows = P.get_n_rows();\n  const uword in_n_cols = P.get_n_cols();\n  const uword in_n_elem = P.get_n_elem();\n  \n  \n  if(in_n_elem <= 1)\n    {\n    if(in_n_elem == 1)\n      {\n      const eT tmp = P[0];\n      \n      out.set_size(in_n_rows, in_n_cols);\n      \n      out[0] = tmp;\n      }\n    else\n      {\n      out.set_size(in_n_rows, in_n_cols);\n      }\n    \n    return;\n    }\n  \n  \n  std::vector<eT> lvec(in_n_elem);\n  \n  \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type Pea = P.get_ea();\n    \n    uword i,j;\n    for(i=0, j=1; j < in_n_elem; i+=2, j+=2)\n      {\n      const eT tmp_i = Pea[i];\n      const eT tmp_j = Pea[j];\n      \n      lvec[i] = tmp_i;\n      lvec[j] = tmp_j;\n      }\n    \n    if(i < in_n_elem)\n      {\n      lvec[i] = Pea[i];\n      }\n    }\n  else\n    {\n    uword i = 0;\n    \n    for(uword col=0; col < in_n_cols; ++col)\n    for(uword row=0; row < in_n_rows; ++row, ++i)\n      {\n      lvec[i] = P.at(row,col);\n      }\n    }\n  \n  std::sort( lvec.begin(), lvec.end() );\n  \n  uword N_unique = 1;\n  \n  for(uword i=1; i < in_n_elem; ++i)\n    {\n    const eT a = lvec[i-1];\n    const eT b = lvec[i  ];\n    \n    const eT diff = a - b;\n    \n    if(diff != eT(0)) { ++N_unique; }\n    }\n  \n  uword out_n_rows;\n  uword out_n_cols;\n  \n  if( (in_n_rows == 1) || (in_n_cols == 1) )\n    {\n    if(in_n_rows == 1)\n      {\n      out_n_rows = 1;\n      out_n_cols = N_unique;\n      }\n    else\n      {\n      out_n_rows = N_unique;\n      out_n_cols = 1;\n      }\n    }\n  else\n    {\n    out_n_rows = N_unique;\n    out_n_cols = 1;\n    }\n  \n  // we don't need to worry about aliasing at this stage, as all the data is stored in lvec\n  out.set_size(out_n_rows, out_n_cols);\n  \n  eT* out_mem = out.memptr();\n  \n  if(in_n_elem > 0) { out_mem[0] = lvec[0]; }\n  \n  N_unique = 1;\n  \n  for(uword i=1; i < in_n_elem; ++i)\n    {\n    const eT a = lvec[i-1];\n    const eT b = lvec[i  ];\n    \n    const eT diff = a - b;\n    \n    if(diff != eT(0))\n      {\n      out_mem[N_unique] = b;\n      ++N_unique;\n      }\n    }\n  \n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_var_bones.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_var\n//! @{\n\n\n\n//! Class for finding variance values of a matrix\nclass op_var\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(Mat<typename T1::pod_type>& out, const mtOp<typename T1::pod_type, T1, op_var>& in);\n  \n  \n  //\n  \n  template<typename eT>\n  inline static typename get_pod_type<eT>::result var_vec(const subview_col<eT>& X, const uword norm_type = 0);\n\n  template<typename eT>\n  inline static typename get_pod_type<eT>::result var_vec(const subview_row<eT>& X, const uword norm_type = 0);\n  \n  template<typename T1>\n  inline static typename T1::pod_type var_vec(const Base<typename T1::elem_type, T1>& X, const uword norm_type = 0);\n  \n  \n  //\n  \n  template<typename eT>\n  inline static eT direct_var(const eT* const X, const uword N, const uword norm_type = 0);\n  \n  template<typename eT>\n  inline static eT direct_var_robust(const eT* const X, const uword N, const uword norm_type = 0);\n  \n  \n  //\n  \n  template<typename T>\n  inline static  T direct_var(const std::complex<T>* const X, const uword N, const uword norm_type = 0);\n  \n  template<typename T>\n  inline static  T direct_var_robust(const std::complex<T>* const X, const uword N, const uword norm_type = 0);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_var_meat.hpp",
    "content": "// Copyright (C) 2009-2015 Conrad Sanderson\n// Copyright (C) 2009-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup op_var\n//! @{\n\n\n//! \\brief\n//! For each row or for each column, find the variance.\n//! The result is stored in a dense matrix that has either one column or one row.\n//! The dimension, for which the variances are found, is set via the var() function.\ntemplate<typename T1>\ninline\nvoid\nop_var::apply(Mat<typename T1::pod_type>& out, const mtOp<typename T1::pod_type, T1, op_var>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type  in_eT;\n  typedef typename T1::pod_type  out_eT;\n  \n  const unwrap_check_mixed<T1> tmp(in.m, out);\n  const Mat<in_eT>&        X = tmp.M;\n  \n  const uword norm_type = in.aux_uword_a;\n  const uword dim       = in.aux_uword_b;\n  \n  arma_debug_check( (norm_type > 1), \"var(): parameter 'norm_type' must be 0 or 1\" );\n  arma_debug_check( (dim > 1),       \"var(): parameter 'dim' must be 0 or 1\"       );\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  if(dim == 0)\n    {\n    arma_extra_debug_print(\"op_var::apply(): dim = 0\");\n    \n    out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols);\n    \n    if(X_n_rows > 0)\n      {\n      out_eT* out_mem = out.memptr();\n      \n      for(uword col=0; col<X_n_cols; ++col)\n        {\n        out_mem[col] = op_var::direct_var( X.colptr(col), X_n_rows, norm_type );\n        }\n      }\n    }\n  else\n  if(dim == 1)\n    {\n    arma_extra_debug_print(\"op_var::apply(): dim = 1\");\n    \n    out.set_size(X_n_rows, (X_n_cols > 0) ? 1 : 0);\n    \n    if(X_n_cols > 0)\n      {\n      podarray<in_eT> dat(X_n_cols);\n      \n      in_eT*  dat_mem = dat.memptr();\n      out_eT* out_mem = out.memptr();\n      \n      for(uword row=0; row<X_n_rows; ++row)\n        {\n        dat.copy_row(X, row);\n        \n        out_mem[row] = op_var::direct_var( dat_mem, X_n_cols, norm_type );\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::pod_type\nop_var::var_vec(const Base<typename T1::elem_type, T1>& X, const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  arma_debug_check( (norm_type > 1), \"var(): parameter 'norm_type' must be 0 or 1\" );\n  \n  const Proxy<T1> P(X.get_ref());\n  \n  const podarray<eT> tmp(P);\n  \n  return op_var::direct_var(tmp.memptr(), tmp.n_elem, norm_type);\n  }\n\n\n\ntemplate<typename eT>\ninline\ntypename get_pod_type<eT>::result\nop_var::var_vec(const subview_col<eT>& X, const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (norm_type > 1), \"var(): parameter 'norm_type' must be 0 or 1\" );\n  \n  return op_var::direct_var(X.colptr(0), X.n_rows, norm_type);\n  }\n\n\n\n\ntemplate<typename eT>\ninline\ntypename get_pod_type<eT>::result\nop_var::var_vec(const subview_row<eT>& X, const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (norm_type > 1), \"var(): parameter 'norm_type' must be 0 or 1\" );\n  \n  const Mat<eT>& A = X.m;\n  \n  const uword start_row = X.aux_row1;\n  const uword start_col = X.aux_col1;\n  \n  const uword end_col_p1 = start_col + X.n_cols;\n  \n  podarray<eT> tmp(X.n_elem);\n  eT* tmp_mem = tmp.memptr();\n  \n  for(uword i=0, col=start_col; col < end_col_p1; ++col, ++i)\n    {\n    tmp_mem[i] = A.at(start_row, col);\n    }\n  \n  return op_var::direct_var(tmp.memptr(), tmp.n_elem, norm_type);\n  }\n\n\n\n//! find the variance of an array\ntemplate<typename eT>\ninline\neT\nop_var::direct_var(const eT* const X, const uword n_elem, const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem >= 2)\n    {\n    const eT acc1 = op_mean::direct_mean(X, n_elem);\n    \n    eT acc2 = eT(0);\n    eT acc3 = eT(0);\n    \n    uword i,j;\n    \n    for(i=0, j=1; j<n_elem; i+=2, j+=2)\n      {\n      const eT Xi = X[i];\n      const eT Xj = X[j];\n      \n      const eT tmpi = acc1 - Xi;\n      const eT tmpj = acc1 - Xj;\n      \n      acc2 += tmpi*tmpi + tmpj*tmpj;\n      acc3 += tmpi      + tmpj;\n      }\n    \n    if(i < n_elem)\n      {\n      const eT Xi = X[i];\n      \n      const eT tmpi = acc1 - Xi;\n      \n      acc2 += tmpi*tmpi;\n      acc3 += tmpi;\n      }\n    \n    const eT norm_val = (norm_type == 0) ? eT(n_elem-1) : eT(n_elem);\n    const eT var_val  = (acc2 - acc3*acc3/eT(n_elem)) / norm_val;\n    \n    return arma_isfinite(var_val) ? var_val : op_var::direct_var_robust(X, n_elem, norm_type);\n    }\n  else\n    {\n    return eT(0);\n    }\n  }\n\n\n\n//! find the variance of an array (robust but slow)\ntemplate<typename eT>\ninline\neT\nop_var::direct_var_robust(const eT* const X, const uword n_elem, const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem > 1)\n    {\n    eT r_mean = X[0];\n    eT r_var  = eT(0);\n    \n    for(uword i=1; i<n_elem; ++i)\n      {\n      const eT tmp      = X[i] - r_mean;\n      const eT i_plus_1 = eT(i+1);\n      \n      r_var  = eT(i-1)/eT(i) * r_var + (tmp*tmp)/i_plus_1;\n      \n      r_mean = r_mean + tmp/i_plus_1;\n      }\n    \n    return (norm_type == 0) ? r_var : (eT(n_elem-1)/eT(n_elem)) * r_var;\n    }\n  else\n    {\n    return eT(0);\n    }\n  }\n\n\n\n//! find the variance of an array (version for complex numbers)\ntemplate<typename T>\ninline\nT\nop_var::direct_var(const std::complex<T>* const X, const uword n_elem, const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<T> eT;\n  \n  if(n_elem >= 2)\n    {\n    const eT acc1 = op_mean::direct_mean(X, n_elem);\n    \n    T  acc2 =  T(0);\n    eT acc3 = eT(0);\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      const eT tmp = acc1 - X[i];\n      \n      acc2 += std::norm(tmp);\n      acc3 += tmp;\n      }\n    \n    const T norm_val = (norm_type == 0) ? T(n_elem-1) : T(n_elem);\n    const T var_val  = (acc2 - std::norm(acc3)/T(n_elem)) / norm_val;\n    \n    return arma_isfinite(var_val) ? var_val : op_var::direct_var_robust(X, n_elem, norm_type);\n    }\n  else\n    {\n    return T(0);\n    }\n  }\n\n\n\n//! find the variance of an array (version for complex numbers) (robust but slow)\ntemplate<typename T>\ninline\nT\nop_var::direct_var_robust(const std::complex<T>* const X, const uword n_elem, const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename std::complex<T> eT;\n  \n  if(n_elem > 1)\n    {\n    eT r_mean = X[0];\n     T r_var  = T(0);\n    \n    for(uword i=1; i<n_elem; ++i)\n      {\n      const eT tmp      = X[i] - r_mean;\n      const  T i_plus_1 = T(i+1);\n      \n      r_var  = T(i-1)/T(i) * r_var + std::norm(tmp)/i_plus_1;\n      \n      r_mean = r_mean + tmp/i_plus_1;\n      }\n    \n    return (norm_type == 0) ? r_var : (T(n_elem-1)/T(n_elem)) * r_var;\n    }\n  else\n    {\n    return T(0);\n    }\n  }\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_vectorise_bones.hpp",
    "content": "// Copyright (C) 2013-2015 Conrad Sanderson\n// Copyright (C) 2013-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_vectorise\n//! @{\n\n\n\nclass op_vectorise_col\n  {\n  public:\n  \n  template<typename T1> inline static void apply( Mat<typename T1::elem_type>& out, const Op<T1,op_vectorise_col>& in);\n  \n  template<typename T1> inline static void apply_proxy( Mat<typename T1::elem_type>& out, const Proxy<T1>& P);\n  };\n\n\n\nclass op_vectorise_row\n  {\n  public:\n  \n  template<typename T1> inline static void apply( Mat<typename T1::elem_type>& out, const Op<T1,op_vectorise_row>& in);\n  \n  template<typename T1> inline static void apply_proxy( Mat<typename T1::elem_type>& out, const Proxy<T1>& P);\n  };\n\n\n\nclass op_vectorise_all\n  {\n  public:\n  \n  template<typename T1> inline static void apply( Mat<typename T1::elem_type>& out, const Op<T1,op_vectorise_all>& in);\n  };\n\n\n\nclass op_vectorise_cube_col\n  {\n  public:\n  \n  template<typename T1> inline static void apply( Mat<typename T1::elem_type>& out, const BaseCube<typename T1::elem_type, T1>& in);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/op_vectorise_meat.hpp",
    "content": "// Copyright (C) 2013-2015 Conrad Sanderson\n// Copyright (C) 2013-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup op_vectorise\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_vectorise_col::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_vectorise_col>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<T1> P(in.m);\n  \n  op_vectorise_col::apply_proxy(out, P);\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_vectorise_col::apply_proxy(Mat<typename T1::elem_type>& out, const Proxy<T1>& P)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  if(P.is_alias(out) == false)\n    {\n    const uword N = P.get_n_elem();\n    \n    out.set_size(N, 1);\n      \n    if(is_Mat<typename Proxy<T1>::stored_type>::value == true)\n      {\n      const unwrap<typename Proxy<T1>::stored_type> tmp(P.Q);\n      \n      arrayops::copy(out.memptr(), tmp.M.memptr(), N);\n      }\n    else\n      {\n      eT* outmem = out.memptr();\n      \n      if(Proxy<T1>::prefer_at_accessor == false)\n        {\n        // TODO: add handling of aligned access ?\n        \n        typename Proxy<T1>::ea_type A = P.get_ea();\n        \n        uword i,j;\n        \n        for(i=0, j=1; j < N; i+=2, j+=2)\n          {\n          const eT tmp_i = A[i];\n          const eT tmp_j = A[j];\n          \n          outmem[i] = tmp_i;\n          outmem[j] = tmp_j;\n          }\n        \n        if(i < N)\n          {\n          outmem[i] = A[i];\n          }\n        }\n      else\n        {\n        const uword n_rows = P.get_n_rows();\n        const uword n_cols = P.get_n_cols();\n        \n        if(n_rows == 1)\n          {\n          for(uword i=0; i < n_cols; ++i)\n            {\n            outmem[i] = P.at(0,i);\n            }\n          }\n        else\n          {\n          for(uword col=0; col < n_cols; ++col)\n          for(uword row=0; row < n_rows; ++row)\n            {\n            *outmem = P.at(row,col);\n            outmem++;\n            }\n          }\n        }\n      }\n    }\n  else  // we have aliasing\n    {\n    arma_extra_debug_print(\"op_vectorise_col::apply(): aliasing detected\");\n    \n    if( (is_Mat<typename Proxy<T1>::stored_type>::value == true) && (Proxy<T1>::fake_mat == false) )\n      {\n      out.set_size(out.n_elem, 1);  // set_size() doesn't destroy data as long as the number of elements in the matrix remains the same\n      }\n    else\n      {\n      Mat<eT> tmp;\n      \n      op_vectorise_col::apply_proxy(tmp, P);\n      \n      out.steal_mem(tmp);\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_vectorise_row::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_vectorise_row>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<T1> P(in.m);\n  \n  op_vectorise_row::apply_proxy(out, P);\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_vectorise_row::apply_proxy(Mat<typename T1::elem_type>& out, const Proxy<T1>& P)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  if(P.is_alias(out) == false)\n    {\n    out.set_size( 1, P.get_n_elem() );\n    \n    eT* outmem = out.memptr();\n    \n    const uword n_rows = P.get_n_rows();\n    const uword n_cols = P.get_n_cols();\n    \n    for(uword row=0; row < n_rows; ++row)\n      {\n      uword i,j;\n      \n      for(i=0, j=1; j < n_cols; i+=2, j+=2)\n        {\n        const eT tmp_i = P.at(row,i);\n        const eT tmp_j = P.at(row,j);\n        \n        *outmem = tmp_i; outmem++;\n        *outmem = tmp_j; outmem++;\n        }\n      \n      if(i < n_cols)\n        {\n        *outmem = P.at(row,i); outmem++;\n        }\n      }\n    }\n  else  // we have aliasing\n    {\n    arma_extra_debug_print(\"op_vectorise_row::apply(): aliasing detected\");\n    \n    Mat<eT> tmp;\n    \n    op_vectorise_row::apply_proxy(tmp, P);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_vectorise_all::apply(Mat<typename T1::elem_type>& out, const Op<T1,op_vectorise_all>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<T1> P(in.m);\n  \n  const uword dim = in.aux_uword_a;\n  \n  if(dim == 0)\n    {\n    op_vectorise_col::apply_proxy(out, P);\n    }\n  else\n    {\n    op_vectorise_row::apply_proxy(out, P);\n    }\n  }\n\n\n\n//\n\n\n\ntemplate<typename T1>\ninline\nvoid\nop_vectorise_cube_col::apply(Mat<typename T1::elem_type>& out, const BaseCube<typename T1::elem_type, T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  ProxyCube<T1> P(in.get_ref());\n  \n  const uword N = P.get_n_elem();\n  \n  out.set_size(N, 1);\n  \n  if(is_Cube<typename ProxyCube<T1>::stored_type>::value == true)\n    {\n    const unwrap_cube<typename ProxyCube<T1>::stored_type> tmp(P.Q);\n    \n    arrayops::copy(out.memptr(), tmp.M.memptr(), N);\n    }\n  else\n    {\n    eT* outmem = out.memptr();\n    \n    if(ProxyCube<T1>::prefer_at_accessor == false)\n      {\n      typename ProxyCube<T1>::ea_type A = P.get_ea();\n      \n      uword i,j;\n      \n      for(i=0, j=1; j < N; i+=2, j+=2)\n        {\n        const eT tmp_i = A[i];\n        const eT tmp_j = A[j];\n        \n        outmem[i] = tmp_i;\n        outmem[j] = tmp_j;\n        }\n      \n      if(i < N)\n        {\n        outmem[i] = A[i];\n        }\n      }\n    else\n      {\n      const uword n_rows   = P.get_n_rows();\n      const uword n_cols   = P.get_n_cols();\n      const uword n_slices = P.get_n_slices();\n      \n      for(uword slice=0; slice < n_slices; ++slice)\n      for(uword   col=0;   col < n_cols;   ++col  )\n      for(uword   row=0;   row < n_rows;   ++row  )\n        {\n        *outmem = P.at(row,col,slice);\n        outmem++;\n        }\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/operator_cube_div.hpp",
    "content": "// Copyright (C) 2009-2010 Conrad Sanderson\n// Copyright (C) 2009-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup operator_cube_div\n//! @{\n\n  \n\n//! BaseCube / scalar\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_scalar_div_post>\noperator/\n  (\n  const BaseCube<typename T1::elem_type,T1>& X,\n  const typename T1::elem_type               k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_scalar_div_post>(X.get_ref(), k);\n  }\n\n\n\n//! scalar / BaseCube\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_scalar_div_pre>\noperator/\n  (\n  const typename T1::elem_type               k,\n  const BaseCube<typename T1::elem_type,T1>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_scalar_div_pre>(X.get_ref(), k);\n  }\n\n\n\n//! complex scalar / non-complex BaseCube (experimental)\ntemplate<typename T1>\narma_inline\nconst mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_div_pre>\noperator/\n  (\n  const std::complex<typename T1::pod_type>& k,\n  const BaseCube<typename T1::pod_type, T1>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_div_pre>('j', X.get_ref(), k);\n  }\n\n\n\n//! non-complex BaseCube / complex scalar (experimental)\ntemplate<typename T1>\narma_inline\nconst mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_div_post>\noperator/\n  (\n  const BaseCube<typename T1::pod_type, T1>& X,\n  const std::complex<typename T1::pod_type>& k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_div_post>('j', X.get_ref(), k);\n  }\n\n\n\n//! element-wise division of BaseCube objects with same element type\ntemplate<typename T1, typename T2>\narma_inline\nconst eGlueCube<T1, T2, eglue_div>\noperator/\n  (\n  const BaseCube<typename T1::elem_type,T1>& X,\n  const BaseCube<typename T1::elem_type,T2>& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eGlueCube<T1, T2, eglue_div>(X.get_ref(), Y.get_ref());\n  }\n\n\n\n//! element-wise division of BaseCube objects with different element types\ntemplate<typename T1, typename T2>\ninline\nconst mtGlueCube<typename promote_type<typename T1::elem_type, typename T2::elem_type>::result, T1, T2, glue_mixed_div>\noperator/\n  (\n  const BaseCube< typename force_different_type<typename T1::elem_type, typename T2::elem_type>::T1_result, T1>& X,\n  const BaseCube< typename force_different_type<typename T1::elem_type, typename T2::elem_type>::T2_result, T2>& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  return mtGlueCube<out_eT, T1, T2, glue_mixed_div>( X.get_ref(), Y.get_ref() );\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/operator_cube_minus.hpp",
    "content": "// Copyright (C) 2008-2010 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup operator_cube_minus\n//! @{\n\n\n\n//! unary -\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_neg>\noperator-\n  (\n  const BaseCube<typename T1::elem_type,T1>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_neg>(X.get_ref());\n  }\n\n\n\n//! cancellation of two consecutive negations: -(-T1)\ntemplate<typename T1>\narma_inline\nconst typename ProxyCube<T1>::stored_type&\noperator-\n  (\n  const eOpCube<T1, eop_neg>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return X.P.Q;\n  }\n\n\n\n//! BaseCube - scalar\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_scalar_minus_post>\noperator-\n  (\n  const BaseCube<typename T1::elem_type,T1>& X,\n  const typename T1::elem_type               k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_scalar_minus_post>(X.get_ref(), k);\n  }\n\n\n\n//! scalar - BaseCube\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_scalar_minus_pre>\noperator-\n  (\n  const typename T1::elem_type               k,\n  const BaseCube<typename T1::elem_type,T1>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_scalar_minus_pre>(X.get_ref(), k);\n  }\n\n\n\n//! complex scalar - non-complex BaseCube (experimental)\ntemplate<typename T1>\narma_inline\nconst mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_minus_pre>\noperator-\n  (\n  const std::complex<typename T1::pod_type>& k,\n  const BaseCube<typename T1::pod_type, T1>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_minus_pre>('j', X.get_ref(), k);\n  }\n\n\n\n//! non-complex BaseCube - complex scalar (experimental)\ntemplate<typename T1>\narma_inline\nconst mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_minus_post>\noperator-\n  (\n  const BaseCube<typename T1::pod_type, T1>& X,\n  const std::complex<typename T1::pod_type>& k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_minus_post>('j', X.get_ref(), k);\n  }\n\n\n\n//! subtraction of BaseCube objects with same element type\ntemplate<typename T1, typename T2>\narma_inline\nconst eGlueCube<T1, T2, eglue_minus>\noperator-\n  (\n  const BaseCube<typename T1::elem_type,T1>& X,\n  const BaseCube<typename T1::elem_type,T2>& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eGlueCube<T1, T2, eglue_minus>(X.get_ref(), Y.get_ref());\n  }\n\n\n\n//! subtraction of BaseCube objects with different element types\ntemplate<typename T1, typename T2>\ninline\nconst mtGlueCube<typename promote_type<typename T1::elem_type, typename T2::elem_type>::result, T1, T2, glue_mixed_minus>\noperator-\n  (\n  const BaseCube< typename force_different_type<typename T1::elem_type, typename T2::elem_type>::T1_result, T1>& X,\n  const BaseCube< typename force_different_type<typename T1::elem_type, typename T2::elem_type>::T2_result, T2>& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  return mtGlueCube<out_eT, T1, T2, glue_mixed_minus>( X.get_ref(), Y.get_ref() );\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/operator_cube_plus.hpp",
    "content": "// Copyright (C) 2008-2010 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup operator_cube_plus\n//! @{\n\n\n\n//! unary plus operation (does nothing, but is required for completeness)\ntemplate<typename T1>\narma_inline\nconst BaseCube<typename T1::elem_type,T1>&\noperator+\n  (\n  const BaseCube<typename T1::elem_type,T1>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return X;\n  }\n\n\n\n//! BaseCube + scalar\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_scalar_plus>\noperator+\n  (\n  const BaseCube<typename T1::elem_type,T1>& X,\n  const typename T1::elem_type               k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_scalar_plus>(X.get_ref(), k);\n  }\n\n\n\n//! scalar + BaseCube\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_scalar_plus>\noperator+\n  (\n  const typename T1::elem_type               k,\n  const BaseCube<typename T1::elem_type,T1>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_scalar_plus>(X.get_ref(), k);\n  }\n\n\n\n//! non-complex BaseCube + complex scalar (experimental)\ntemplate<typename T1>\narma_inline\nconst mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_plus>\noperator+\n  (\n  const BaseCube<typename T1::pod_type, T1>& X,\n  const std::complex<typename T1::pod_type>& k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_plus>('j', X.get_ref(), k);\n  }\n\n\n\n//! complex scalar + non-complex BaseCube (experimental)\ntemplate<typename T1>\narma_inline\nconst mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_plus>\noperator+\n  (\n  const std::complex<typename T1::pod_type>& k,\n  const BaseCube<typename T1::pod_type, T1>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_plus>('j', X.get_ref(), k);  // NOTE: order is swapped\n  }\n\n\n\n//! addition of BaseCube objects with same element type\ntemplate<typename T1, typename T2>\narma_inline\nconst eGlueCube<T1, T2, eglue_plus>\noperator+\n  (\n  const BaseCube<typename T1::elem_type,T1>& X,\n  const BaseCube<typename T1::elem_type,T2>& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eGlueCube<T1, T2, eglue_plus>(X.get_ref(), Y.get_ref());\n  }\n\n\n\n//! addition of BaseCube objects with different element types\ntemplate<typename T1, typename T2>\ninline\nconst mtGlueCube<typename promote_type<typename T1::elem_type, typename T2::elem_type>::result, T1, T2, glue_mixed_plus>\noperator+\n  (\n  const BaseCube< typename force_different_type<typename T1::elem_type, typename T2::elem_type>::T1_result, T1>& X,\n  const BaseCube< typename force_different_type<typename T1::elem_type, typename T2::elem_type>::T2_result, T2>& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  return mtGlueCube<out_eT, T1, T2, glue_mixed_plus>( X.get_ref(), Y.get_ref() );\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/operator_cube_relational.hpp",
    "content": "// Copyright (C) 2009-2014 Conrad Sanderson\n// Copyright (C) 2009-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup operator_cube_relational\n//! @{\n\n\n\n// <  : lt\n// >  : gt\n// <= : lteq\n// >= : gteq\n// == : eq\n// != : noteq\n// && : and\n// || : or\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst mtGlueCube<uword, T1, T2, glue_rel_lt>\noperator<\n(const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T1>& X, const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T2>& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlueCube<uword, T1, T2, glue_rel_lt>( X.get_ref(), Y.get_ref() );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst mtGlueCube<uword, T1, T2, glue_rel_gt>\noperator>\n(const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T1>& X, const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T2>& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlueCube<uword, T1, T2, glue_rel_gt>( X.get_ref(), Y.get_ref() );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst mtGlueCube<uword, T1, T2, glue_rel_lteq>\noperator<=\n(const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T1>& X, const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T2>& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlueCube<uword, T1, T2, glue_rel_lteq>( X.get_ref(), Y.get_ref() );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst mtGlueCube<uword, T1, T2, glue_rel_gteq>\noperator>=\n(const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T1>& X, const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T2>& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlueCube<uword, T1, T2, glue_rel_gteq>( X.get_ref(), Y.get_ref() );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst mtGlueCube<uword, T1, T2, glue_rel_eq>\noperator==\n(const BaseCube<typename T1::elem_type,T1>& X, const BaseCube<typename T1::elem_type,T2>& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlueCube<uword, T1, T2, glue_rel_eq>( X.get_ref(), Y.get_ref() );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst mtGlueCube<uword, T1, T2, glue_rel_noteq>\noperator!=\n(const BaseCube<typename T1::elem_type,T1>& X, const BaseCube<typename T1::elem_type,T2>& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlueCube<uword, T1, T2, glue_rel_noteq>( X.get_ref(), Y.get_ref() );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst mtGlueCube<uword, T1, T2, glue_rel_and>\noperator&&\n(const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T1>& X, const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T2>& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlueCube<uword, T1, T2, glue_rel_and>( X.get_ref(), Y.get_ref() );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nconst mtGlueCube<uword, T1, T2, glue_rel_or>\noperator||\n(const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T1>& X, const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T2>& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlueCube<uword, T1, T2, glue_rel_or>( X.get_ref(), Y.get_ref() );\n  }\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename T1>\ninline\nconst mtOpCube<uword, T1, op_rel_lt_pre>\noperator<\n(const typename arma_not_cx<typename T1::elem_type>::result val, const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<uword, T1, op_rel_lt_pre>(X.get_ref(), val);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOpCube<uword, T1, op_rel_lt_post>\noperator<\n(const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T1>& X, const typename arma_not_cx<typename T1::elem_type>::result val)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<uword, T1, op_rel_lt_post>(X.get_ref(), val);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOpCube<uword, T1, op_rel_gt_pre>\noperator>\n(const typename arma_not_cx<typename T1::elem_type>::result val, const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<uword, T1, op_rel_gt_pre>(X.get_ref(), val);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOpCube<uword, T1, op_rel_gt_post>\noperator>\n(const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T1>& X, const typename arma_not_cx<typename T1::elem_type>::result val)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<uword, T1, op_rel_gt_post>(X.get_ref(), val);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOpCube<uword, T1, op_rel_lteq_pre>\noperator<=\n(const typename arma_not_cx<typename T1::elem_type>::result val, const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<uword, T1, op_rel_lteq_pre>(X.get_ref(), val);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOpCube<uword, T1, op_rel_lteq_post>\noperator<=\n(const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T1>& X, const typename arma_not_cx<typename T1::elem_type>::result val)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<uword, T1, op_rel_lteq_post>(X.get_ref(), val);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOpCube<uword, T1, op_rel_gteq_pre>\noperator>=\n(const typename arma_not_cx<typename T1::elem_type>::result val, const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<uword, T1, op_rel_gteq_pre>(X.get_ref(), val);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOpCube<uword, T1, op_rel_gteq_post>\noperator>=\n(const BaseCube<typename arma_not_cx<typename T1::elem_type>::result,T1>& X, const typename arma_not_cx<typename T1::elem_type>::result val)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<uword, T1, op_rel_gteq_post>(X.get_ref(), val);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOpCube<uword, T1, op_rel_eq>\noperator==\n(const typename T1::elem_type val, const BaseCube<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<uword, T1, op_rel_eq>(X.get_ref(), val);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOpCube<uword, T1, op_rel_eq>\noperator==\n(const BaseCube<typename T1::elem_type,T1>& X, const typename T1::elem_type val)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<uword, T1, op_rel_eq>(X.get_ref(), val);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOpCube<uword, T1, op_rel_noteq>\noperator!=\n(const typename T1::elem_type val, const BaseCube<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<uword, T1, op_rel_noteq>(X.get_ref(), val);\n  }\n\n\n\ntemplate<typename T1>\ninline\nconst mtOpCube<uword, T1, op_rel_noteq>\noperator!=\n(const BaseCube<typename T1::elem_type,T1>& X, const typename T1::elem_type val)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<uword, T1, op_rel_noteq>(X.get_ref(), val);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/operator_cube_schur.hpp",
    "content": "// Copyright (C) 2008-2010 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup operator_cube_schur\n//! @{\n\n\n// operator %, which we define it to do a schur product (element-wise multiplication)\n\n\n//! element-wise multiplication of BaseCube objects with same element type\ntemplate<typename T1, typename T2>\narma_inline\nconst eGlueCube<T1, T2, eglue_schur>\noperator%\n  (\n  const BaseCube<typename T1::elem_type,T1>& X,\n  const BaseCube<typename T1::elem_type,T2>& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eGlueCube<T1, T2, eglue_schur>(X.get_ref(), Y.get_ref());\n  }\n\n\n\n//! element-wise multiplication of BaseCube objects with different element types\ntemplate<typename T1, typename T2>\ninline\nconst mtGlueCube<typename promote_type<typename T1::elem_type, typename T2::elem_type>::result, T1, T2, glue_mixed_schur>\noperator%\n  (\n  const BaseCube< typename force_different_type<typename T1::elem_type, typename T2::elem_type>::T1_result, T1>& X,\n  const BaseCube< typename force_different_type<typename T1::elem_type, typename T2::elem_type>::T2_result, T2>& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  return mtGlueCube<out_eT, T1, T2, glue_mixed_schur>( X.get_ref(), Y.get_ref() );\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/operator_cube_times.hpp",
    "content": "// Copyright (C) 2008-2010 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n\n//! \\addtogroup operator_cube_times\n//! @{\n\n\n\n//! BaseCube * scalar\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_scalar_times>\noperator*\n  (\n  const BaseCube<typename T1::elem_type,T1>& X,\n  const typename T1::elem_type               k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_scalar_times>(X.get_ref(), k);\n  }\n\n\n\n//! scalar * BaseCube\ntemplate<typename T1>\narma_inline\nconst eOpCube<T1, eop_scalar_times>\noperator*\n  (\n  const typename T1::elem_type               k,\n  const BaseCube<typename T1::elem_type,T1>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOpCube<T1, eop_scalar_times>(X.get_ref(), k);\n  }\n\n\n\n//! non-complex BaseCube * complex scalar (experimental)\ntemplate<typename T1>\narma_inline\nconst mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_times>\noperator*\n  (\n  const BaseCube<typename T1::pod_type, T1>& X,\n  const std::complex<typename T1::pod_type>& k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_times>('j', X.get_ref(), k);\n  }\n\n\n\n//! complex scalar * non-complex BaseCube (experimental)\ntemplate<typename T1>\narma_inline\nconst mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_times>\noperator*\n  (\n  const std::complex<typename T1::pod_type>& k,\n  const BaseCube<typename T1::pod_type, T1>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOpCube<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_times>('j', X.get_ref(), k);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/operator_div.hpp",
    "content": "// Copyright (C) 2009-2012 Conrad Sanderson\n// Copyright (C) 2009-2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2012 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup operator_div\n//! @{\n\n\n\n//! Base / scalar\ntemplate<typename T1>\narma_inline\ntypename\nenable_if2< is_arma_type<T1>::value, const eOp<T1, eop_scalar_div_post> >::result\noperator/\n  (\n  const T1&                    X,\n  const typename T1::elem_type k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_scalar_div_post>(X, k);\n  }\n\n\n\n//! scalar / Base\ntemplate<typename T1>\narma_inline\ntypename\nenable_if2< is_arma_type<T1>::value, const eOp<T1, eop_scalar_div_pre> >::result\noperator/\n  (\n  const typename T1::elem_type k,\n  const T1&                    X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_scalar_div_pre>(X, k);\n  }\n\n\n\n//! complex scalar / non-complex Base\ntemplate<typename T1>\narma_inline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_cx<typename T1::elem_type>::no),\n  const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_div_pre>\n  >::result\noperator/\n  (\n  const std::complex<typename T1::pod_type>& k,\n  const T1&                                  X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_div_pre>('j', X, k);\n  }\n\n\n\n//! non-complex Base / complex scalar\ntemplate<typename T1>\narma_inline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_cx<typename T1::elem_type>::no),\n  const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_div_post>\n  >::result\noperator/\n  (\n  const T1&                                  X,\n  const std::complex<typename T1::pod_type>& k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_div_post>('j', X, k);\n  }\n\n\n\n//! element-wise division of Base objects with same element type\ntemplate<typename T1, typename T2>\narma_inline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  const eGlue<T1, T2, eglue_div>\n  >::result\noperator/\n  (\n  const T1& X,\n  const T2& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eGlue<T1, T2, eglue_div>(X, Y);\n  }\n\n\n\n//! element-wise division of Base objects with different element types\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_type<T2>::value && (is_same_type<typename T1::elem_type, typename T2::elem_type>::no)),\n  const mtGlue<typename promote_type<typename T1::elem_type, typename T2::elem_type>::result, T1, T2, glue_mixed_div>\n  >::result\noperator/\n  (\n  const T1& X,\n  const T2& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  return mtGlue<out_eT, T1, T2, glue_mixed_div>( X, Y );\n  }\n\n\n\n//! element-wise division of sparse matrix by scalar\ntemplate<typename T1>\ninline\ntypename\nenable_if2<is_arma_sparse_type<T1>::value, SpMat<typename T1::elem_type> >::result\noperator/\n  (\n  const T1&                    X,\n  const typename T1::elem_type y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<typename T1::elem_type> result(X);\n  \n  result /= y;\n  \n  return result;\n  }\n\n\n\n//! element-wise division of one sparse and one dense object\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_sparse_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  SpMat<typename T1::elem_type>\n  >::result\noperator/\n  (\n  const T1& x,\n  const T2& y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const SpProxy<T1> pa(x);\n  const   Proxy<T2> pb(y);\n  \n  const uword n_rows = pa.get_n_rows();\n  const uword n_cols = pa.get_n_cols();\n  \n  arma_debug_assert_same_size(n_rows, n_cols, pb.get_n_rows(), pb.get_n_cols(), \"element-wise division\");\n  \n  SpMat<eT> result(n_rows, n_cols);\n  \n  uword new_n_nonzero = 0;\n  \n  for(uword col=0; col < n_cols; ++col)\n  for(uword row=0; row < n_rows; ++row)\n    {\n    const eT val = pa.at(row,col) / pb.at(row, col);\n    \n    if(val != eT(0))\n      {\n      ++new_n_nonzero;\n      }\n    }\n  \n  result.mem_resize(new_n_nonzero);\n  \n  uword cur_pos = 0;\n  \n  for(uword col=0; col < n_cols; ++col)\n  for(uword row=0; row < n_rows; ++row)\n    {\n    const eT val = pa.at(row,col) / pb.at(row, col);\n    \n    if(val != eT(0))\n      {\n      access::rw(result.values[cur_pos]) = val;\n      access::rw(result.row_indices[cur_pos]) = row;\n      ++access::rw(result.col_ptrs[col + 1]);\n      ++cur_pos;\n      }\n    }\n  \n  // Fix column pointers\n  for(uword col = 1; col <= result.n_cols; ++col)\n    {\n    access::rw(result.col_ptrs[col]) += result.col_ptrs[col - 1];\n    }\n  \n  return result;\n  }\n\n\n\n//! element-wise division of one dense and one sparse object\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_sparse_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  Mat<typename T1::elem_type>\n  >::result\noperator/\n  (\n  const T1& x,\n  const T2& y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const   Proxy<T1> pa(x);\n  const SpProxy<T2> pb(y);\n  \n  const uword n_rows = pa.get_n_rows();\n  const uword n_cols = pa.get_n_cols();\n  \n  arma_debug_assert_same_size(n_rows, n_cols, pb.get_n_rows(), pb.get_n_cols(), \"element-wise division\");\n  \n  Mat<eT> result(n_rows, n_cols);\n  \n  for(uword col=0; col < n_cols; ++col)\n  for(uword row=0; row < n_rows; ++row)\n    {\n    result.at(row, col) = pa.at(row, col) / pb.at(row, col);\n    }\n  \n  return result;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/operator_minus.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2012 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup operator_minus\n//! @{\n\n\n\n//! unary -\ntemplate<typename T1>\narma_inline\ntypename\nenable_if2< is_arma_type<T1>::value, const eOp<T1, eop_neg> >::result\noperator-\n(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1,eop_neg>(X);\n  }\n\n\n\n//! cancellation of two consecutive negations: -(-T1)\ntemplate<typename T1>\narma_inline\nconst typename Proxy<T1>::stored_type&\noperator-\n(const eOp<T1, eop_neg>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return X.P.Q;\n  }\n\n\n\n//! Base - scalar\ntemplate<typename T1>\narma_inline\ntypename\nenable_if2< is_arma_type<T1>::value, const eOp<T1, eop_scalar_minus_post> >::result\noperator-\n  (\n  const T1&                    X,\n  const typename T1::elem_type k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_scalar_minus_post>(X, k);\n  }\n\n\n\n//! scalar - Base\ntemplate<typename T1>\narma_inline\ntypename\nenable_if2< is_arma_type<T1>::value, const eOp<T1, eop_scalar_minus_pre> >::result\noperator-\n  (\n  const typename T1::elem_type k,\n  const T1&                    X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_scalar_minus_pre>(X, k);\n  }\n\n\n\n//! complex scalar - non-complex Base\ntemplate<typename T1>\narma_inline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_cx<typename T1::elem_type>::no),\n  const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_minus_pre>\n  >::result\noperator-\n  (\n  const std::complex<typename T1::pod_type>& k,\n  const T1&                                  X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_minus_pre>('j', X, k);\n  }\n\n\n\n//! non-complex Base - complex scalar\ntemplate<typename T1>\narma_inline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_cx<typename T1::elem_type>::no),\n  const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_minus_post>\n  >::result\noperator-\n  (\n  const T1&                                  X,\n  const std::complex<typename T1::pod_type>& k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_minus_post>('j', X, k);\n  }\n\n\n\n//! subtraction of Base objects with same element type\ntemplate<typename T1, typename T2>\narma_inline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value,\n  const eGlue<T1, T2, eglue_minus>\n  >::result\noperator-\n  (\n  const T1& X,\n  const T2& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eGlue<T1, T2, eglue_minus>(X, Y);\n  }\n\n\n\n//! subtraction of Base objects with different element types\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_type<T2>::value && (is_same_type<typename T1::elem_type, typename T2::elem_type>::no)),\n  const mtGlue<typename promote_type<typename T1::elem_type, typename T2::elem_type>::result, T1, T2, glue_mixed_minus>\n  >::result\noperator-\n  (\n  const T1& X,\n  const T2& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  return mtGlue<out_eT, T1, T2, glue_mixed_minus>( X, Y );\n  }\n\n\n\n//! unary \"-\" for sparse objects \ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_sparse_type<T1>::value && is_signed<typename T1::elem_type>::value,\n  SpOp<T1,spop_scalar_times>\n  >::result\noperator-\n(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  return SpOp<T1,spop_scalar_times>(X, eT(-1));\n  }\n\n\n\n//! subtraction of two sparse objects\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_sparse_type<T1>::value && is_arma_sparse_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  const SpGlue<T1,T2,spglue_minus>\n  >::result\noperator-\n  (\n  const T1& X,\n  const T2& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpGlue<T1,T2,spglue_minus>(X,Y);\n  }\n\n\n\n//! subtraction of one sparse and one dense object\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_sparse_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  Mat<typename T1::elem_type>\n  >::result\noperator-\n  (\n  const T1& x,\n  const T2& y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> pa(x);\n  \n  Mat<typename T1::elem_type> result(-y);\n  \n  arma_debug_assert_same_size( pa.get_n_rows(), pa.get_n_cols(), result.n_rows, result.n_cols, \"subtraction\" );\n  \n  typename SpProxy<T1>::const_iterator_type it     = pa.begin();\n  typename SpProxy<T1>::const_iterator_type it_end = pa.end();\n  \n  while(it != it_end)\n    {\n    result.at(it.row(), it.col()) += (*it);\n    ++it;\n    }\n  \n  return result;\n  }\n\n\n\n//! subtraction of one dense and one sparse object\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_sparse_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  Mat<typename T1::elem_type>\n  >::result\noperator-\n  (\n  const T1& x,\n  const T2& y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<typename T1::elem_type> result(x);\n  \n  const SpProxy<T2> pb(y.get_ref());\n  \n  arma_debug_assert_same_size( result.n_rows, result.n_cols, pb.get_n_rows(), pb.get_n_cols(), \"subtraction\" );\n  \n  typename SpProxy<T2>::const_iterator_type it     = pb.begin();\n  typename SpProxy<T2>::const_iterator_type it_end = pb.end();\n\n  while(it != it_end)\n    {\n    result.at(it.row(), it.col()) -= (*it);\n    ++it;\n    }\n  \n  return result;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/operator_ostream.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup operator_ostream\n//! @{\n\n\n\ntemplate<typename eT, typename T1>\ninline\nstd::ostream&\noperator<< (std::ostream& o, const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1> tmp(X.get_ref());\n  \n  arma_ostream::print(o, tmp.M, true);\n  \n  return o;\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nstd::ostream&\noperator<< (std::ostream& o, const SpBase<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap_spmat<T1> tmp(X.get_ref());\n  \n  arma_ostream::print(o, tmp.M, true);\n  \n  return o;\n  }\n\n\n\ntemplate<typename T1>\ninline\nstd::ostream&\noperator<< (std::ostream& o, const SpValProxy<T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  o << eT(X);\n  \n  return o;\n  }\n\n\n\ntemplate<typename T1>\ninline\nstd::ostream&\noperator<< (std::ostream& o, const BaseCube<typename T1::elem_type,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap_cube<T1> tmp(X.get_ref());\n  \n  arma_ostream::print(o, tmp.M, true);\n  \n  return o;\n  }\n\n\n\n//! Print the contents of a field to the specified stream.\ntemplate<typename T1>\ninline\nstd::ostream&\noperator<< (std::ostream& o, const field<T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_ostream::print(o, X);\n  \n  return o;\n  }\n\n\n\n//! Print the contents of a subfield to the specified stream\ntemplate<typename T1>\ninline\nstd::ostream&\noperator<< (std::ostream& o, const subview_field<T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_ostream::print(o, X);\n\n  return o;\n  }\n\n\n\ninline\nstd::ostream&\noperator<< (std::ostream& o, const SizeMat& S)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_ostream::print(o, S);\n  \n  return o;\n  }\n\n\n\ninline\nstd::ostream&\noperator<< (std::ostream& o, const SizeCube& S)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_ostream::print(o, S);\n  \n  return o;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/operator_plus.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2012 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup operator_plus\n//! @{\n\n\n\n//! unary plus operation (does nothing, but is required for completeness)\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const T1& >::result\noperator+\n(const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return X;\n  }\n\n\n\n//! Base + scalar\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const eOp<T1, eop_scalar_plus> >::result\noperator+\n(const T1& X, const typename T1::elem_type k)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_scalar_plus>(X, k);\n  }\n\n\n\n//! scalar + Base\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const eOp<T1, eop_scalar_plus> >::result\noperator+\n(const typename T1::elem_type k, const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_scalar_plus>(X, k);  // NOTE: order is swapped\n  }\n\n\n\n//! non-complex Base + complex scalar\ntemplate<typename T1>\narma_inline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_cx<typename T1::elem_type>::no),\n  const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_plus>\n  >::result\noperator+\n  (\n  const T1&                                  X,\n  const std::complex<typename T1::pod_type>& k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_plus>('j', X, k);\n  }\n\n\n\n//! complex scalar + non-complex Base\ntemplate<typename T1>\narma_inline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_cx<typename T1::elem_type>::no),\n  const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_plus>\n  >::result\noperator+\n  (\n  const std::complex<typename T1::pod_type>& k,\n  const T1&                                  X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_plus>('j', X, k);  // NOTE: order is swapped\n  }\n\n\n\n//! addition of user-accessible Armadillo objects with same element type\ntemplate<typename T1, typename T2>\narma_inline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value,\n  const eGlue<T1, T2, eglue_plus>\n  >::result\noperator+\n  (\n  const T1& X,\n  const T2& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eGlue<T1, T2, eglue_plus>(X, Y);\n  }\n\n\n\n//! addition of user-accessible Armadillo objects with different element types\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_type<T2>::value && (is_same_type<typename T1::elem_type, typename T2::elem_type>::no)),\n  const mtGlue<typename promote_type<typename T1::elem_type, typename T2::elem_type>::result, T1, T2, glue_mixed_plus>\n  >::result\noperator+\n  (\n  const T1& X,\n  const T2& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  return mtGlue<out_eT, T1, T2, glue_mixed_plus>( X, Y );\n  }\n\n\n\n//! addition of two sparse objects\ntemplate<typename T1, typename T2>\ninline\narma_hot\ntypename\nenable_if2\n  <\n  (is_arma_sparse_type<T1>::value && is_arma_sparse_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  SpGlue<T1,T2,spglue_plus>\n  >::result\noperator+\n  (\n  const T1& x,\n  const T2& y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpGlue<T1,T2,spglue_plus>(x, y);\n  }\n\n\n\n//! addition of sparse and non-sparse object\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_sparse_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  Mat<typename T1::elem_type>\n  >::result\noperator+\n  (\n  const T1& x,\n  const T2& y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<typename T1::elem_type> result(x);\n  \n  const SpProxy<T2> pb(y);\n  \n  arma_debug_assert_same_size( result.n_rows, result.n_cols, pb.get_n_rows(), pb.get_n_cols(), \"addition\" );\n  \n  typename SpProxy<T2>::const_iterator_type it     = pb.begin();\n  typename SpProxy<T2>::const_iterator_type it_end = pb.end();\n  \n  while(it != it_end)\n    {\n    result.at(it.row(), it.col()) += (*it);\n    ++it;\n    }\n  \n  return result;\n  }\n\n\n\n//! addition of sparse and non-sparse object\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_sparse_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  Mat<typename T1::elem_type>\n  >::result\noperator+\n  (\n  const T1& x,\n  const T2& y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  // Just call the other order (these operations are commutative)\n  return (y + x);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/operator_relational.hpp",
    "content": "// Copyright (C) 2009-2014 Conrad Sanderson\n// Copyright (C) 2009-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup operator_relational\n//! @{\n\n\n// <  : lt\n// >  : gt\n// <= : lteq\n// >= : gteq\n// == : eq\n// != : noteq\n// && : and\n// || : or\n\n\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_type<T2>::value && (is_cx<typename T1::elem_type>::no) && (is_cx<typename T2::elem_type>::no)),\n  const mtGlue<uword, T1, T2, glue_rel_lt>\n  >::result\noperator<\n(const T1& X, const T2& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlue<uword, T1, T2, glue_rel_lt>( X, Y );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_type<T2>::value && (is_cx<typename T1::elem_type>::no) && (is_cx<typename T2::elem_type>::no)),\n  const mtGlue<uword, T1, T2, glue_rel_gt>\n  >::result\noperator>\n(const T1& X, const T2& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlue<uword, T1, T2, glue_rel_gt>( X, Y );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_type<T2>::value && (is_cx<typename T1::elem_type>::no) && (is_cx<typename T2::elem_type>::no)),\n  const mtGlue<uword, T1, T2, glue_rel_lteq>\n  >::result\noperator<=\n(const T1& X, const T2& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlue<uword, T1, T2, glue_rel_lteq>( X, Y );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_type<T2>::value && (is_cx<typename T1::elem_type>::no) && (is_cx<typename T2::elem_type>::no)),\n  const mtGlue<uword, T1, T2, glue_rel_gteq>\n  >::result\noperator>=\n(const T1& X, const T2& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlue<uword, T1, T2, glue_rel_gteq>( X, Y );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_type<T2>::value),\n  const mtGlue<uword, T1, T2, glue_rel_eq>\n  >::result\noperator==\n(const T1& X, const T2& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlue<uword, T1, T2, glue_rel_eq>( X, Y );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_type<T2>::value),\n  const mtGlue<uword, T1, T2, glue_rel_noteq>\n  >::result\noperator!=\n(const T1& X, const T2& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlue<uword, T1, T2, glue_rel_noteq>( X, Y );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_type<T2>::value && (is_cx<typename T1::elem_type>::no) && (is_cx<typename T2::elem_type>::no)),\n  const mtGlue<uword, T1, T2, glue_rel_and>\n  >::result\noperator&&\n(const T1& X, const T2& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlue<uword, T1, T2, glue_rel_and>( X, Y );\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_type<T2>::value && (is_cx<typename T1::elem_type>::no) && (is_cx<typename T2::elem_type>::no)),\n  const mtGlue<uword, T1, T2, glue_rel_or>\n  >::result\noperator||\n(const T1& X, const T2& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtGlue<uword, T1, T2, glue_rel_or>( X, Y );\n  }\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && (is_cx<typename T1::elem_type>::no)),\n  const mtOp<uword, T1, op_rel_lt_pre>\n  >::result\noperator<\n(const typename T1::elem_type val, const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, T1, op_rel_lt_pre>(X, val);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && (is_cx<typename T1::elem_type>::no)),\n  const mtOp<uword, T1, op_rel_lt_post>\n  >::result\noperator<\n(const T1& X, const typename T1::elem_type val)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, T1, op_rel_lt_post>(X, val);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && (is_cx<typename T1::elem_type>::no)),\n  const mtOp<uword, T1, op_rel_gt_pre>\n  >::result\noperator>\n(const typename T1::elem_type val, const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, T1, op_rel_gt_pre>(X, val);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && (is_cx<typename T1::elem_type>::no)),\n  const mtOp<uword, T1, op_rel_gt_post>\n  >::result\noperator>\n(const T1& X, const typename T1::elem_type val)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, T1, op_rel_gt_post>(X, val);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && (is_cx<typename T1::elem_type>::no)),\n  const mtOp<uword, T1, op_rel_lteq_pre>\n  >::result\noperator<=\n(const typename T1::elem_type val, const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, T1, op_rel_lteq_pre>(X, val);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && (is_cx<typename T1::elem_type>::no)),\n  const mtOp<uword, T1, op_rel_lteq_post>\n  >::result\noperator<=\n(const T1& X, const typename T1::elem_type val)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, T1, op_rel_lteq_post>(X, val);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && (is_cx<typename T1::elem_type>::no)),\n  const mtOp<uword, T1, op_rel_gteq_pre>\n  >::result\noperator>=\n(const typename T1::elem_type val, const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, T1, op_rel_gteq_pre>(X, val);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && (is_cx<typename T1::elem_type>::no)),\n  const mtOp<uword, T1, op_rel_gteq_post>\n  >::result\noperator>=\n(const T1& X, const typename T1::elem_type val)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, T1, op_rel_gteq_post>(X, val);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value,\n  const mtOp<uword, T1, op_rel_eq>\n  >::result\noperator==\n(const typename T1::elem_type val, const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, T1, op_rel_eq>(X, val);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value,\n  const mtOp<uword, T1, op_rel_eq>\n  >::result\noperator==\n(const T1& X, const typename T1::elem_type val)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, T1, op_rel_eq>(X, val);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value,\n  const mtOp<uword, T1, op_rel_noteq>\n  >::result\noperator!=\n(const typename T1::elem_type val, const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, T1, op_rel_noteq>(X, val);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value,\n  const mtOp<uword, T1, op_rel_noteq>\n  >::result\noperator!=\n(const T1& X, const typename T1::elem_type val)\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<uword, T1, op_rel_noteq>(X, val);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/operator_schur.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2012 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup operator_schur\n//! @{\n\n\n// operator %, which we define it to do a schur product (element-wise multiplication)\n\n\n//! element-wise multiplication of user-accessible Armadillo objects with same element type\ntemplate<typename T1, typename T2>\narma_inline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value,\n  const eGlue<T1, T2, eglue_schur>\n  >::result\noperator%\n  (\n  const T1& X,\n  const T2& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return eGlue<T1, T2, eglue_schur>(X, Y);\n  }\n\n\n\n//! element-wise multiplication of user-accessible Armadillo objects with different element types\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_type<T2>::value && (is_same_type<typename T1::elem_type, typename T2::elem_type>::no)),\n  const mtGlue<typename promote_type<typename T1::elem_type, typename T2::elem_type>::result, T1, T2, glue_mixed_schur>\n  >::result\noperator%\n  (\n  const T1& X,\n  const T2& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  return mtGlue<out_eT, T1, T2, glue_mixed_schur>( X, Y );\n  }\n\n\n\n//! element-wise multiplication of two sparse matrices\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_sparse_type<T1>::value && is_arma_sparse_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  SpMat<typename T1::elem_type>\n  >::result\noperator%\n  (\n  const SpBase<typename T1::elem_type, T1>& x,\n  const SpBase<typename T2::elem_type, T2>& y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n\n  const SpProxy<T1> pa(x.get_ref());\n  const SpProxy<T2> pb(y.get_ref());\n\n  arma_debug_assert_same_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), \"element-wise multiplication\");\n\n  SpMat<typename T1::elem_type> result(pa.get_n_rows(), pa.get_n_cols());\n  \n  if( (pa.get_n_nonzero() != 0) && (pb.get_n_nonzero() != 0) )\n    {\n    // Resize memory to correct size.\n    result.mem_resize(n_unique(x, y, op_n_unique_mul()));\n    \n    // Now iterate across both matrices.\n    typename SpProxy<T1>::const_iterator_type x_it = pa.begin();\n    typename SpProxy<T2>::const_iterator_type y_it = pb.begin();\n    \n    typename SpProxy<T1>::const_iterator_type x_end = pa.end();\n    typename SpProxy<T2>::const_iterator_type y_end = pb.end();\n    \n    uword cur_val = 0;\n    while((x_it != x_end) || (y_it != y_end))\n      {\n      if(x_it == y_it)\n        {\n        const eT val = (*x_it) * (*y_it);\n        \n        if (val != eT(0))\n          {\n          access::rw(result.values[cur_val]) = val;\n          access::rw(result.row_indices[cur_val]) = x_it.row();\n          ++access::rw(result.col_ptrs[x_it.col() + 1]);\n          ++cur_val;\n          }\n        \n        ++x_it;\n        ++y_it;\n        }\n      else\n        {\n        const uword x_it_row = x_it.row();\n        const uword x_it_col = x_it.col();\n        \n        const uword y_it_row = y_it.row();\n        const uword y_it_col = y_it.col();\n        \n        if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end\n          {\n          ++x_it;\n          }\n        else\n          {\n          ++y_it;\n          }\n        }\n      }\n    \n    // Fix column pointers to be cumulative.\n    for(uword c = 1; c <= result.n_cols; ++c)\n      {\n      access::rw(result.col_ptrs[c]) += result.col_ptrs[c - 1];\n      }\n    }\n  \n  return result;\n  }\n\n\n\n//! element-wise multiplication of one dense and one sparse object\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_sparse_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  SpMat<typename T1::elem_type>\n  >::result\noperator%\n  (\n  const T1& x,\n  const T2& y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const   Proxy<T1> pa(x);\n  const SpProxy<T2> pb(y);\n  \n  arma_debug_assert_same_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), \"element-wise multiplication\");\n  \n  SpMat<eT> result(pa.get_n_rows(), pa.get_n_cols());\n  \n  // count new size\n  uword new_n_nonzero = 0;\n  \n  typename SpProxy<T2>::const_iterator_type it     = pb.begin();\n  typename SpProxy<T2>::const_iterator_type it_end = pb.end();\n  \n  while(it != it_end)\n    {\n    if( ((*it) * pa.at(it.row(), it.col())) != eT(0) )\n      {\n      ++new_n_nonzero;\n      }\n    \n    ++it;\n    }\n  \n  // Resize memory accordingly.\n  result.mem_resize(new_n_nonzero);\n  \n  uword cur_val = 0;\n  \n  typename SpProxy<T2>::const_iterator_type it2 = pb.begin();\n  \n  while(it2 != it_end)\n    {\n    const uword it2_row = it2.row();\n    const uword it2_col = it2.col();\n    \n    const eT val = (*it2) * pa.at(it2_row, it2_col);\n    \n    if(val != eT(0))\n      {\n      access::rw(result.values[cur_val]) = val;\n      access::rw(result.row_indices[cur_val]) = it2_row;\n      ++access::rw(result.col_ptrs[it2_col + 1]);\n      ++cur_val;\n      }\n    \n    ++it2;\n    }\n  \n  // Fix column pointers.\n  for(uword c = 1; c <= result.n_cols; ++c)\n    {\n    access::rw(result.col_ptrs[c]) += result.col_ptrs[c - 1];\n    }\n  \n  return result;\n  }\n\n\n\n//! element-wise multiplication of one sparse and one dense object\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_sparse_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  SpMat<typename T1::elem_type>\n  >::result\noperator%\n  (\n  const T1& x,\n  const T2& y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  // This operation is commutative.\n  return (y % x);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/operator_times.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2012 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup operator_times\n//! @{\n\n\n\n//! Base * scalar\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const eOp<T1, eop_scalar_times> >::result\noperator*\n(const T1& X, const typename T1::elem_type k)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_scalar_times>(X,k);\n  }\n\n\n\n//! scalar * Base\ntemplate<typename T1>\narma_inline\ntypename enable_if2< is_arma_type<T1>::value, const eOp<T1, eop_scalar_times> >::result\noperator*\n(const typename T1::elem_type k, const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return eOp<T1, eop_scalar_times>(X,k);  // NOTE: order is swapped\n  }\n\n\n\n//! non-complex Base * complex scalar\ntemplate<typename T1>\narma_inline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_cx<typename T1::elem_type>::no),\n  const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_times>\n  >::result\noperator*\n  (\n  const T1&                                  X,\n  const std::complex<typename T1::pod_type>& k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_times>('j', X, k);\n  }\n\n\n\n//! complex scalar * non-complex Base\ntemplate<typename T1>\narma_inline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_cx<typename T1::elem_type>::no),\n  const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_times>\n  >::result\noperator*\n  (\n  const std::complex<typename T1::pod_type>& k,\n  const T1&                                  X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_times>('j', X, k);\n  }\n\n\n\n//! scalar * trans(T1)\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_htrans2>\noperator*\n(const typename T1::elem_type k, const Op<T1, op_htrans>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_htrans2>(X.m, k);\n  }\n\n\n\n//! trans(T1) * scalar\ntemplate<typename T1>\narma_inline\nconst Op<T1, op_htrans2>\noperator*\n(const Op<T1, op_htrans>& X, const typename T1::elem_type k)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Op<T1, op_htrans2>(X.m, k);\n  }\n\n\n\n//! Base * diagmat\ntemplate<typename T1, typename T2>\narma_inline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  const Glue<T1, Op<T2, op_diagmat>, glue_times_diag>\n  >::result\noperator*\n(const T1& X, const Op<T2, op_diagmat>& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Glue<T1, Op<T2, op_diagmat>, glue_times_diag>(X, Y);\n  }\n\n\n\n//! diagmat * Base\ntemplate<typename T1, typename T2>\narma_inline\ntypename\nenable_if2\n  <\n  (is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  const Glue<Op<T1, op_diagmat>, T2, glue_times_diag>\n  >::result\noperator*\n(const Op<T1, op_diagmat>& X, const T2& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Glue<Op<T1, op_diagmat>, T2, glue_times_diag>(X, Y);\n  }\n\n\n\n//! diagmat * diagmat\ntemplate<typename T1, typename T2>\ninline\nMat< typename promote_type<typename T1::elem_type, typename T2::elem_type>::result >\noperator*\n(const Op<T1, op_diagmat>& X, const Op<T2, op_diagmat>& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  const diagmat_proxy<T1> A(X.m);\n  const diagmat_proxy<T2> B(Y.m);\n  \n  arma_debug_assert_mul_size(A.n_elem, A.n_elem, B.n_elem, B.n_elem, \"matrix multiplication\");\n  \n  const uword N = A.n_elem;\n  \n  Mat<out_eT> out(N,N);\n  \n  out.zeros();\n  \n  for(uword i=0; i<N; ++i)\n    {\n    out.at(i,i) = upgrade_val<eT1,eT2>::apply( A[i] ) * upgrade_val<eT1,eT2>::apply( B[i] );\n    }\n  \n  return out;\n  }\n\n\n\n//! multiplication of Base objects with same element type\ntemplate<typename T1, typename T2>\narma_inline\ntypename\nenable_if2\n  <\n  is_arma_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value,\n  const Glue<T1, T2, glue_times>\n  >::result\noperator*\n(const T1& X, const T2& Y)\n  {\n  arma_extra_debug_sigprint();\n  \n  return Glue<T1, T2, glue_times>(X, Y);\n  }\n\n\n\n//! multiplication of Base objects with different element types\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_type<T2>::value && (is_same_type<typename T1::elem_type, typename T2::elem_type>::no)),\n  const mtGlue< typename promote_type<typename T1::elem_type, typename T2::elem_type>::result, T1, T2, glue_mixed_times >\n  >::result\noperator*\n  (\n  const T1& X,\n  const T2& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT1;\n  typedef typename T2::elem_type eT2;\n  \n  typedef typename promote_type<eT1,eT2>::result out_eT;\n  \n  promote_type<eT1,eT2>::check();\n  \n  return mtGlue<out_eT, T1, T2, glue_mixed_times>( X, Y );\n  }\n\n\n\n//! sparse multiplied by scalar\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_sparse_type<T1>::value,\n  SpOp<T1,spop_scalar_times>\n  >::result\noperator*\n  (\n  const T1& X,\n  const typename T1::elem_type k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpOp<T1,spop_scalar_times>(X, k);\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename\nenable_if2\n  <\n  is_arma_sparse_type<T1>::value,\n  SpOp<T1,spop_scalar_times>\n  >::result\noperator*\n  (\n  const typename T1::elem_type k,\n  const T1& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpOp<T1,spop_scalar_times>(X, k);\n  }\n\n\n\n//! multiplication of two sparse objects\ntemplate<typename T1, typename T2>\ninline\narma_hot\ntypename\nenable_if2\n  <\n  (is_arma_sparse_type<T1>::value && is_arma_sparse_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  const SpGlue<T1,T2,spglue_times>\n  >::result\noperator*\n  (\n  const T1& x,\n  const T2& y\n  )\n  {\n  arma_extra_debug_sigprint();\n\n  return SpGlue<T1,T2,spglue_times>(x, y);\n  }\n\n\n\n//! convert \"(sparse + sparse) * scalar\" to specialised operation \"scalar * (sparse + sparse)\"\ntemplate<typename T1, typename T2>\ninline\nconst SpGlue<T1,T2,spglue_plus2>\noperator*\n  (\n  const SpGlue<T1,T2,spglue_plus>& X,\n  const typename T1::elem_type k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpGlue<T1,T2,spglue_plus2>(X.A, X.B, k);\n  }\n\n\n\n//! convert \"scalar * (sparse + sparse)\" to specialised operation \ntemplate<typename T1, typename T2>\ninline\nconst SpGlue<T1,T2,spglue_plus2>\noperator*\n  (\n  const typename T1::elem_type k,\n  const SpGlue<T1,T2,spglue_plus>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpGlue<T1,T2,spglue_plus2>(X.A, X.B, k);\n  }\n\n\n\n//! convert \"(sparse - sparse) * scalar\" to specialised operation \"scalar * (sparse - sparse)\"\ntemplate<typename T1, typename T2>\ninline\nconst SpGlue<T1,T2,spglue_minus2>\noperator*\n  (\n  const SpGlue<T1,T2,spglue_minus>& X,\n  const typename T1::elem_type k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpGlue<T1,T2,spglue_minus2>(X.A, X.B, k);\n  }\n\n\n\n//! convert \"scalar * (sparse - sparse)\" to specialised operation \ntemplate<typename T1, typename T2>\ninline\nconst SpGlue<T1,T2,spglue_minus2>\noperator*\n  (\n  const typename T1::elem_type k,\n  const SpGlue<T1,T2,spglue_minus>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpGlue<T1,T2,spglue_minus2>(X.A, X.B, k);\n  }\n\n\n\n//! convert \"(sparse*sparse) * scalar\" to specialised operation \"scalar * (sparse*sparse)\"\ntemplate<typename T1, typename T2>\ninline\nconst SpGlue<T1,T2,spglue_times2>\noperator*\n  (\n  const SpGlue<T1,T2,spglue_times>& X,\n  const typename T1::elem_type k\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpGlue<T1,T2,spglue_times2>(X.A, X.B, k);\n  }\n\n\n\n//! convert \"scalar * (sparse*sparse)\" to specialised operation\ntemplate<typename T1, typename T2>\ninline\nconst SpGlue<T1,T2,spglue_times2>\noperator*\n  (\n  const typename T1::elem_type k,\n  const SpGlue<T1,T2,spglue_times>& X\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpGlue<T1,T2,spglue_times2>(X.A, X.B, k);\n  }\n\n\n\n//! convert \"(scalar*sparse) * sparse\" to specialised operation \"scalar * (sparse*sparse)\"\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  is_arma_sparse_type<T2>::value,\n  const SpGlue<T1,T2,spglue_times2>\n  >::result\noperator*\n  (\n  const SpOp<T1,spop_scalar_times>& X,\n  const T2& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpGlue<T1,T2,spglue_times2>(X.m, Y, X.aux);\n  }\n\n\n\n//! convert \"sparse * (scalar*sparse)\" to specialised operation \"scalar * (sparse*sparse)\"\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  is_arma_sparse_type<T1>::value,\n  const SpGlue<T1,T2,spglue_times2>\n  >::result\noperator*\n  (\n  const T1& X,\n  const SpOp<T2,spop_scalar_times>& Y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  return SpGlue<T1,T2,spglue_times2>(X, Y.m, Y.aux);\n  }\n\n\n\n//! multiplication of one sparse and one dense object\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_sparse_type<T1>::value && is_arma_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  Mat<typename T1::elem_type>\n  >::result\noperator*\n  (\n  const T1& x,\n  const T2& y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> pa(x);\n  const   Proxy<T2> pb(y);\n  \n  arma_debug_assert_mul_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), \"matrix multiplication\");\n  \n  Mat<typename T1::elem_type> result(pa.get_n_rows(), pb.get_n_cols());\n  result.zeros();\n  \n  if( (pa.get_n_nonzero() > 0) && (pb.get_n_elem() > 0) )\n    {\n    typename SpProxy<T1>::const_iterator_type x_it     = pa.begin();\n    typename SpProxy<T1>::const_iterator_type x_it_end = pa.end();\n    \n    const uword result_n_cols = result.n_cols;\n      \n    while(x_it != x_it_end)\n      {\n      for(uword col = 0; col < result_n_cols; ++col)\n        {\n        result.at(x_it.row(), col) += (*x_it) * pb.at(x_it.col(), col);\n        }\n      \n      ++x_it;\n      }\n    }\n  \n  return result;\n  }\n\n\n\n//! multiplication of one dense and one sparse object\ntemplate<typename T1, typename T2>\ninline\ntypename\nenable_if2\n  <\n  (is_arma_type<T1>::value && is_arma_sparse_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),\n  Mat<typename T1::elem_type>\n  >::result\noperator*\n  (\n  const T1& x,\n  const T2& y\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  const   Proxy<T1> pa(x);\n  const SpProxy<T2> pb(y);\n  \n  arma_debug_assert_mul_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), \"matrix multiplication\");\n  \n  Mat<typename T1::elem_type> result(pa.get_n_rows(), pb.get_n_cols());\n  result.zeros();\n  \n  if( (pa.get_n_elem() > 0) && (pb.get_n_nonzero() > 0) )\n    {\n    typename SpProxy<T2>::const_iterator_type y_col_it     = pb.begin();\n    typename SpProxy<T2>::const_iterator_type y_col_it_end = pb.end();\n    \n    const uword result_n_rows = result.n_rows;\n    \n    while(y_col_it != y_col_it_end)\n      {\n      for(uword row = 0; row < result_n_rows; ++row)\n        {\n        result.at(row, y_col_it.col()) += pa.at(row, y_col_it.row()) * (*y_col_it);\n        }\n      \n      ++y_col_it;\n      }\n    }\n  \n  return result;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/podarray_bones.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup podarray\n//! @{\n\n\n\nstruct podarray_prealloc_n_elem\n  {\n  static const uword val = 16;\n  };\n\n\n\n//! A lightweight array for POD types. For internal use only!\ntemplate<typename eT>\nclass podarray\n  {\n  public:\n  \n  arma_aligned const uword n_elem; //!< number of elements held\n  arma_aligned       eT*   mem;    //!< pointer to memory used by the object\n  \n  \n  protected:\n  //! internal memory, to avoid calling the 'new' operator for small amounts of memory.\n  arma_align_mem eT mem_local[ podarray_prealloc_n_elem::val ];\n  \n  \n  public:\n  \n  inline ~podarray();\n  inline  podarray();\n  \n  inline                 podarray (const podarray& x);\n  inline const podarray& operator=(const podarray& x);\n  \n  arma_inline explicit podarray(const uword new_N);\n  \n  arma_inline explicit podarray(const eT* X, const uword new_N);\n  \n  template<typename T1>\n  inline explicit podarray(const Proxy<T1>& P);\n  \n  arma_inline eT& operator[] (const uword i);\n  arma_inline eT  operator[] (const uword i) const;\n  \n  arma_inline eT& operator() (const uword i);\n  arma_inline eT  operator() (const uword i) const;\n  \n  inline void set_min_size(const uword min_n_elem);\n  \n  inline void set_size(const uword new_n_elem);\n  inline void reset();\n  \n  \n  inline void fill(const eT val);\n  \n  inline void zeros();\n  inline void zeros(const uword new_n_elem);\n  \n  arma_inline       eT* memptr();\n  arma_inline const eT* memptr() const;\n  \n  arma_hot inline void copy_row(const Mat<eT>& A, const uword row);\n  \n  \n  protected:\n  \n  inline void init_cold(const uword new_n_elem);\n  inline void init_warm(const uword new_n_elem);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/podarray_meat.hpp",
    "content": "// Copyright (C) 2008-2012 Conrad Sanderson\n// Copyright (C) 2008-2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup podarray\n//! @{\n\n\ntemplate<typename eT>\narma_hot\ninline\npodarray<eT>::~podarray()\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  if(n_elem > podarray_prealloc_n_elem::val )\n    {\n    memory::release( mem );\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\npodarray<eT>::podarray()\n  : n_elem(0)\n  , mem   (0)\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\ntemplate<typename eT>\ninline\npodarray<eT>::podarray(const podarray& x)\n  : n_elem(x.n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword x_n_elem = x.n_elem;\n  \n  init_cold(x_n_elem);\n  \n  arrayops::copy( memptr(), x.memptr(), x_n_elem );\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst podarray<eT>&\npodarray<eT>::operator=(const podarray& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(this != &x)\n    {\n    const uword x_n_elem = x.n_elem;\n    \n    init_warm(x_n_elem);\n    \n    arrayops::copy( memptr(), x.memptr(), x_n_elem );\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\narma_hot\narma_inline\npodarray<eT>::podarray(const uword new_n_elem)\n  : n_elem(new_n_elem)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold(new_n_elem);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\npodarray<eT>::podarray(const eT* X, const uword new_n_elem)\n  : n_elem(new_n_elem)\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  init_cold(new_n_elem);\n  \n  arrayops::copy( memptr(), X, new_n_elem );\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\npodarray<eT>::podarray(const Proxy<T1>& P)\n  : n_elem(P.get_n_elem())\n  {\n  arma_extra_debug_sigprint_this(this);\n  \n  const uword P_n_elem = P.get_n_elem();\n    \n  init_cold(P_n_elem);\n  \n  eT* out_mem = (*this).memptr();\n    \n  if(Proxy<T1>::prefer_at_accessor == false)\n    {\n    typename Proxy<T1>::ea_type A = P.get_ea();\n    \n    uword i,j;\n    for(i=0, j=1; j < P_n_elem; i+=2, j+=2)\n      {\n      const eT val_i = A[i];\n      const eT val_j = A[j];\n      \n      out_mem[i] = val_i;\n      out_mem[j] = val_j;\n      }\n    \n    if(i < P_n_elem)\n      {\n      out_mem[i] = A[i];\n      }\n    }\n  else\n    {\n    const uword P_n_rows = P.get_n_rows();\n    const uword P_n_cols = P.get_n_cols();\n    \n    if(P_n_rows != 1)\n      {\n      uword count = 0;\n      \n      for(uword col=0; col < P_n_cols; ++col)\n      for(uword row=0; row < P_n_rows; ++row, ++count)\n        {\n        out_mem[count] = P.at(row,col);\n        }\n      }\n    else\n      {\n      for(uword col=0; col < P_n_cols; ++col)\n        {\n        out_mem[col] = P.at(0,col);\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT\npodarray<eT>::operator[] (const uword i) const\n  {\n  return mem[i];\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT&\npodarray<eT>::operator[] (const uword i)\n  {\n  return access::rw(mem[i]);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT\npodarray<eT>::operator() (const uword i) const\n  {\n  arma_debug_check( (i >= n_elem), \"podarray::operator(): index out of bounds\");\n  \n  return mem[i];\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT&\npodarray<eT>::operator() (const uword i)\n  {\n  arma_debug_check( (i >= n_elem), \"podarray::operator(): index out of bounds\");\n  \n  return access::rw(mem[i]);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\npodarray<eT>::set_min_size(const uword min_n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(min_n_elem > n_elem)\n    {  \n    init_warm(min_n_elem);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\npodarray<eT>::set_size(const uword new_n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  init_warm(new_n_elem);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\npodarray<eT>::reset()\n  {\n  arma_extra_debug_sigprint();\n  \n  init_warm(0);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\npodarray<eT>::fill(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::inplace_set(memptr(), val, n_elem);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\npodarray<eT>::zeros()\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::fill_zeros(memptr(), n_elem);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\npodarray<eT>::zeros(const uword new_n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  init_warm(new_n_elem);\n  \n  arrayops::fill_zeros(memptr(), n_elem);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT*\npodarray<eT>::memptr()\n  {\n  return mem;\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst eT*\npodarray<eT>::memptr() const\n  {\n  return mem;\n  }\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\npodarray<eT>::copy_row(const Mat<eT>& A, const uword row)\n  {\n  const uword cols = A.n_cols;\n  \n  // note: this function assumes that the podarray has been set to the correct size beforehand\n  eT* out = memptr();\n  \n  switch(cols)\n    {\n    default:\n      {\n      uword i,j;\n      for(i=0, j=1; j < cols; i+=2, j+=2)\n        {\n        const eT tmp_i = A.at(row, i);\n        const eT tmp_j = A.at(row, j);\n        \n        out[i] = tmp_i;\n        out[j] = tmp_j;\n        }\n      \n      if(i < cols)\n        {\n        out[i] = A.at(row, i);\n        }\n      }\n      break;\n    \n    case 8:  out[7] = A.at(row, 7);\n    case 7:  out[6] = A.at(row, 6);\n    case 6:  out[5] = A.at(row, 5);\n    case 5:  out[4] = A.at(row, 4);\n    case 4:  out[3] = A.at(row, 3);\n    case 3:  out[2] = A.at(row, 2);\n    case 2:  out[1] = A.at(row, 1);\n    case 1:  out[0] = A.at(row, 0);\n    case 0:  ;\n    }\n  }\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\npodarray<eT>::init_cold(const uword new_n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(new_n_elem <= podarray_prealloc_n_elem::val )\n    {\n    mem = mem_local;\n    }\n  else\n    {\n    mem = memory::acquire<eT>(new_n_elem);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\npodarray<eT>::init_warm(const uword new_n_elem)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem == new_n_elem)\n    {\n    return;\n    }\n    \n  if(n_elem > podarray_prealloc_n_elem::val )\n    {\n    memory::release( mem );\n    }\n  \n  if(new_n_elem <= podarray_prealloc_n_elem::val )\n    {\n    mem = mem_local;\n    }\n  else\n    {\n    mem = memory::acquire<eT>(new_n_elem);\n    }\n  \n  access::rw(n_elem) = new_n_elem;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/promote_type.hpp",
    "content": "// Copyright (C) 2009-2013 Conrad Sanderson\n// Copyright (C) 2009-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup promote_type\n//! @{\n\n\ntemplate<typename T1, typename T2>\nstruct is_promotable\n  {\n  static const bool value = false;\n  typedef T1 result;\n  };\n\n\nstruct is_promotable_ok\n  {\n  static const bool value = true;\n  };\n\n\ntemplate<typename T> struct is_promotable<T,               T> : public is_promotable_ok { typedef T               result; };\ntemplate<typename T> struct is_promotable<std::complex<T>, T> : public is_promotable_ok { typedef std::complex<T> result; };\n\ntemplate<> struct is_promotable<std::complex<double>, std::complex<float> > : public is_promotable_ok { typedef std::complex<double> result; };\ntemplate<> struct is_promotable<std::complex<double>, float>                : public is_promotable_ok { typedef std::complex<double> result; };\ntemplate<> struct is_promotable<std::complex<float>,  double>               : public is_promotable_ok { typedef std::complex<double> result; };\n\n\n#if defined(ARMA_USE_U64S64)\ntemplate<typename t> struct is_promotable<std::complex<t>, u64>    : public is_promotable_ok { typedef std::complex<t> result; };\ntemplate<typename t> struct is_promotable<std::complex<t>, s64>    : public is_promotable_ok { typedef std::complex<t> result; };\n#endif\n#if defined(ARMA_ALLOW_LONG)\ntemplate<typename t> struct is_promotable<std::complex<t>, ulng_t> : public is_promotable_ok { typedef std::complex<t> result; };\ntemplate<typename t> struct is_promotable<std::complex<t>, slng_t> : public is_promotable_ok { typedef std::complex<t> result; };\n#endif\ntemplate<typename T> struct is_promotable<std::complex<T>, s32>    : public is_promotable_ok { typedef std::complex<T> result; };\ntemplate<typename T> struct is_promotable<std::complex<T>, u32>    : public is_promotable_ok { typedef std::complex<T> result; };\ntemplate<typename T> struct is_promotable<std::complex<T>, s16>    : public is_promotable_ok { typedef std::complex<T> result; };\ntemplate<typename T> struct is_promotable<std::complex<T>, u16>    : public is_promotable_ok { typedef std::complex<T> result; };\ntemplate<typename T> struct is_promotable<std::complex<T>, s8>     : public is_promotable_ok { typedef std::complex<T> result; };\ntemplate<typename T> struct is_promotable<std::complex<T>, u8>     : public is_promotable_ok { typedef std::complex<T> result; };\n\n\ntemplate<> struct is_promotable<double, float > : public is_promotable_ok { typedef double result; };\n#if defined(ARMA_USE_U64S64)\ntemplate<> struct is_promotable<double, s64   > : public is_promotable_ok { typedef double result; };\ntemplate<> struct is_promotable<double, u64   > : public is_promotable_ok { typedef double result; };\n#endif\n#if defined(ARMA_ALLOW_LONG)\ntemplate<> struct is_promotable<double, slng_t> : public is_promotable_ok { typedef double result; };\ntemplate<> struct is_promotable<double, ulng_t> : public is_promotable_ok { typedef double result; };\n#endif\ntemplate<> struct is_promotable<double, s32   > : public is_promotable_ok { typedef double result; };\ntemplate<> struct is_promotable<double, u32   > : public is_promotable_ok { typedef double result; };\ntemplate<> struct is_promotable<double, s16   > : public is_promotable_ok { typedef double result; };\ntemplate<> struct is_promotable<double, u16   > : public is_promotable_ok { typedef double result; };\ntemplate<> struct is_promotable<double, s8    > : public is_promotable_ok { typedef double result; };\ntemplate<> struct is_promotable<double, u8    > : public is_promotable_ok { typedef double result; };\n\n#if defined(ARMA_USE_U64S64)\ntemplate<> struct is_promotable<float, s64   > : public is_promotable_ok { typedef float result; };\ntemplate<> struct is_promotable<float, u64   > : public is_promotable_ok { typedef float result; };\n#endif\n#if defined(ARMA_ALLOW_LONG)\ntemplate<> struct is_promotable<float, slng_t> : public is_promotable_ok { typedef float result; };\ntemplate<> struct is_promotable<float, ulng_t> : public is_promotable_ok { typedef float result; };\n#endif\ntemplate<> struct is_promotable<float, s32   > : public is_promotable_ok { typedef float result; };\ntemplate<> struct is_promotable<float, u32   > : public is_promotable_ok { typedef float result; };\ntemplate<> struct is_promotable<float, s16   > : public is_promotable_ok { typedef float result; };\ntemplate<> struct is_promotable<float, u16   > : public is_promotable_ok { typedef float result; };\ntemplate<> struct is_promotable<float, s8    > : public is_promotable_ok { typedef float result; };\ntemplate<> struct is_promotable<float, u8    > : public is_promotable_ok { typedef float result; };\n\n#if defined(ARMA_USE_U64S64)\ntemplate<> struct is_promotable<u64, u32> : public is_promotable_ok { typedef u64 result; };\ntemplate<> struct is_promotable<u64, u16> : public is_promotable_ok { typedef u64 result; };\ntemplate<> struct is_promotable<u64, u8 > : public is_promotable_ok { typedef u64 result; };\n#endif\n\n#if defined(ARMA_USE_U64S64)\ntemplate<> struct is_promotable<s64, u64> : public is_promotable_ok { typedef s64 result; };  // float ?  \ntemplate<> struct is_promotable<s64, u32> : public is_promotable_ok { typedef s64 result; };\ntemplate<> struct is_promotable<s64, s32> : public is_promotable_ok { typedef s64 result; };\ntemplate<> struct is_promotable<s64, s16> : public is_promotable_ok { typedef s64 result; };\ntemplate<> struct is_promotable<s64, u16> : public is_promotable_ok { typedef s64 result; };\ntemplate<> struct is_promotable<s64, s8 > : public is_promotable_ok { typedef s64 result; };\ntemplate<> struct is_promotable<s64, u8 > : public is_promotable_ok { typedef s64 result; };\n#endif\n\ntemplate<> struct is_promotable<s32, u32> : public is_promotable_ok { typedef s32 result; };  // float ?  \ntemplate<> struct is_promotable<s32, s16> : public is_promotable_ok { typedef s32 result; };\ntemplate<> struct is_promotable<s32, u16> : public is_promotable_ok { typedef s32 result; };\ntemplate<> struct is_promotable<s32, s8 > : public is_promotable_ok { typedef s32 result; };\ntemplate<> struct is_promotable<s32, u8 > : public is_promotable_ok { typedef s32 result; };\n\ntemplate<> struct is_promotable<u32, s16> : public is_promotable_ok { typedef s32 result; };  // float ?\ntemplate<> struct is_promotable<u32, u16> : public is_promotable_ok { typedef u32 result; };\ntemplate<> struct is_promotable<u32, s8 > : public is_promotable_ok { typedef s32 result; };  // float ?\ntemplate<> struct is_promotable<u32, u8 > : public is_promotable_ok { typedef u32 result; };\n\ntemplate<> struct is_promotable<s16, u16> : public is_promotable_ok { typedef s16 result; };  // s32 ?\ntemplate<> struct is_promotable<s16, s8 > : public is_promotable_ok { typedef s16 result; };\ntemplate<> struct is_promotable<s16, u8 > : public is_promotable_ok { typedef s16 result; };\n\ntemplate<> struct is_promotable<u16, s8> : public is_promotable_ok { typedef s16 result; };  // s32 ?\ntemplate<> struct is_promotable<u16, u8> : public is_promotable_ok { typedef u16 result; };\n\ntemplate<> struct is_promotable<s8, u8> : public is_promotable_ok { typedef s8 result; };  // s16 ?\n\n\n\n\n//\n// mirrored versions\n\ntemplate<typename T> struct is_promotable<T, std::complex<T> > : public is_promotable_ok { typedef std::complex<T> result; };\n\ntemplate<> struct is_promotable<std::complex<float>, std::complex<double> > : public is_promotable_ok { typedef std::complex<double> result; };\ntemplate<> struct is_promotable<float,               std::complex<double> > : public is_promotable_ok { typedef std::complex<double> result; };\ntemplate<> struct is_promotable<double,              std::complex<float>  > : public is_promotable_ok { typedef std::complex<double> result; };\n\n#if defined(ARMA_USE_U64S64)\ntemplate<typename T> struct is_promotable<s64,    std::complex<T> > : public is_promotable_ok { typedef std::complex<T> result; };\ntemplate<typename T> struct is_promotable<u64,    std::complex<T> > : public is_promotable_ok { typedef std::complex<T> result; };\n#endif\n#if defined(ARMA_ALLOW_LONG)\ntemplate<typename T> struct is_promotable<slng_t, std::complex<T> > : public is_promotable_ok { typedef std::complex<T> result; };\ntemplate<typename T> struct is_promotable<ulng_t, std::complex<T> > : public is_promotable_ok { typedef std::complex<T> result; };\n#endif\ntemplate<typename T> struct is_promotable<s32,    std::complex<T> > : public is_promotable_ok { typedef std::complex<T> result; };\ntemplate<typename T> struct is_promotable<u32,    std::complex<T> > : public is_promotable_ok { typedef std::complex<T> result; };\ntemplate<typename T> struct is_promotable<s16,    std::complex<T> > : public is_promotable_ok { typedef std::complex<T> result; };\ntemplate<typename T> struct is_promotable<u16,    std::complex<T> > : public is_promotable_ok { typedef std::complex<T> result; };\ntemplate<typename T> struct is_promotable<s8,     std::complex<T> > : public is_promotable_ok { typedef std::complex<T> result; };\ntemplate<typename T> struct is_promotable<u8,     std::complex<T> > : public is_promotable_ok { typedef std::complex<T> result; };\n\n\ntemplate<> struct is_promotable<float,  double> : public is_promotable_ok { typedef double result; };\n#if defined(ARMA_USE_U64S64)\ntemplate<> struct is_promotable<s64,    double> : public is_promotable_ok { typedef double result; };\ntemplate<> struct is_promotable<u64,    double> : public is_promotable_ok { typedef double result; };\n#endif\n#if defined(ARMA_ALLOW_LONG)\ntemplate<> struct is_promotable<slng_t, double> : public is_promotable_ok { typedef double result; };\ntemplate<> struct is_promotable<ulng_t, double> : public is_promotable_ok { typedef double result; };\n#endif\ntemplate<> struct is_promotable<s32,    double> : public is_promotable_ok { typedef double result; };\ntemplate<> struct is_promotable<u32,    double> : public is_promotable_ok { typedef double result; };\ntemplate<> struct is_promotable<s16,    double> : public is_promotable_ok { typedef double result; };\ntemplate<> struct is_promotable<u16,    double> : public is_promotable_ok { typedef double result; };\ntemplate<> struct is_promotable<s8,     double> : public is_promotable_ok { typedef double result; };\ntemplate<> struct is_promotable<u8,     double> : public is_promotable_ok { typedef double result; };\n\n#if defined(ARMA_USE_U64S64)\ntemplate<> struct is_promotable<s64,    float> : public is_promotable_ok { typedef float result; };\ntemplate<> struct is_promotable<u64,    float> : public is_promotable_ok { typedef float result; };\n#endif\n#if defined(ARMA_ALLOW_LONG)\ntemplate<> struct is_promotable<slng_t, float> : public is_promotable_ok { typedef float result; };\ntemplate<> struct is_promotable<ulng_t, float> : public is_promotable_ok { typedef float result; };\n#endif\ntemplate<> struct is_promotable<s32,    float> : public is_promotable_ok { typedef float result; };\ntemplate<> struct is_promotable<u32,    float> : public is_promotable_ok { typedef float result; };\ntemplate<> struct is_promotable<s16,    float> : public is_promotable_ok { typedef float result; };\ntemplate<> struct is_promotable<u16,    float> : public is_promotable_ok { typedef float result; };\ntemplate<> struct is_promotable<s8,     float> : public is_promotable_ok { typedef float result; };\ntemplate<> struct is_promotable<u8,     float> : public is_promotable_ok { typedef float result; };\n\n#if defined(ARMA_USE_U64S64)\ntemplate<> struct is_promotable<u32, u64> : public is_promotable_ok { typedef u64 result; };\ntemplate<> struct is_promotable<u16, u64> : public is_promotable_ok { typedef u64 result; };\ntemplate<> struct is_promotable<u8,  u64> : public is_promotable_ok { typedef u64 result; };\n#endif\n\n#if defined(ARMA_USE_U64S64)\ntemplate<> struct is_promotable<u64, s64> : public is_promotable_ok { typedef s64 result; };  // float ?  \ntemplate<> struct is_promotable<u32, s64> : public is_promotable_ok { typedef s64 result; };\ntemplate<> struct is_promotable<s16, s64> : public is_promotable_ok { typedef s64 result; };\ntemplate<> struct is_promotable<u16, s64> : public is_promotable_ok { typedef s64 result; };\ntemplate<> struct is_promotable<s8 , s64> : public is_promotable_ok { typedef s64 result; };\ntemplate<> struct is_promotable<u8 , s64> : public is_promotable_ok { typedef s64 result; };\n#endif\n\ntemplate<> struct is_promotable<u32, s32> : public is_promotable_ok { typedef s32 result; };  // float ?  \ntemplate<> struct is_promotable<s16, s32> : public is_promotable_ok { typedef s32 result; };\ntemplate<> struct is_promotable<u16, s32> : public is_promotable_ok { typedef s32 result; };\ntemplate<> struct is_promotable<s8 , s32> : public is_promotable_ok { typedef s32 result; };\ntemplate<> struct is_promotable<u8 , s32> : public is_promotable_ok { typedef s32 result; };\n\ntemplate<> struct is_promotable<s16, u32> : public is_promotable_ok { typedef s32 result; };  // float ?\ntemplate<> struct is_promotable<u16, u32> : public is_promotable_ok { typedef u32 result; };\ntemplate<> struct is_promotable<s8 , u32> : public is_promotable_ok { typedef s32 result; };  // float ?\ntemplate<> struct is_promotable<u8 , u32> : public is_promotable_ok { typedef u32 result; };\n\ntemplate<> struct is_promotable<u16, s16> : public is_promotable_ok { typedef s16 result; };  // s32 ?\ntemplate<> struct is_promotable<s8 , s16> : public is_promotable_ok { typedef s16 result; };\ntemplate<> struct is_promotable<u8 , s16> : public is_promotable_ok { typedef s16 result; };\n\ntemplate<> struct is_promotable<s8, u16> : public is_promotable_ok { typedef s16 result; };  // s32 ?\ntemplate<> struct is_promotable<u8, u16> : public is_promotable_ok { typedef u16 result; };\n\ntemplate<> struct is_promotable<u8, s8> : public is_promotable_ok { typedef s8 result; };  // s16 ?\n\n\n\n\n\ntemplate<typename T1, typename T2>\nstruct promote_type\n  {\n  inline static void check()\n    {\n    arma_type_check(( is_promotable<T1,T2>::value == false ));\n    }\n  \n  typedef typename is_promotable<T1,T2>::result result;\n  };\n\n\n\ntemplate<typename T1, typename T2>\nstruct eT_promoter\n  {\n  typedef typename promote_type<typename T1::elem_type, typename T2::elem_type>::result eT;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/restrictors.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup restrictors\n//! @{\n\n\n\n// structures for template based restrictions of input/output arguments\n// (part of the SFINAE approach)\n// http://en.wikipedia.org/wiki/SFINAE\n\n\ntemplate<typename T> struct arma_scalar_only { };\n\ntemplate<> struct arma_scalar_only<u8>     { typedef u8     result; };\ntemplate<> struct arma_scalar_only<s8>     { typedef s8     result; };\ntemplate<> struct arma_scalar_only<u16>    { typedef u16    result; };\ntemplate<> struct arma_scalar_only<s16>    { typedef s16    result; };\ntemplate<> struct arma_scalar_only<u32>    { typedef u32    result; };\ntemplate<> struct arma_scalar_only<s32>    { typedef s32    result; };\n#if defined(ARMA_USE_U64S64)\ntemplate<> struct arma_scalar_only<u64>    { typedef u64    result; };\ntemplate<> struct arma_scalar_only<s64>    { typedef s64    result; };\n#endif\ntemplate<> struct arma_scalar_only<float>  { typedef float  result; };\ntemplate<> struct arma_scalar_only<double> { typedef double result; };\n#if defined(ARMA_ALLOW_LONG)\ntemplate<> struct arma_scalar_only<ulng_t> { typedef ulng_t result; };\ntemplate<> struct arma_scalar_only<slng_t> { typedef slng_t result; };\n#endif\n\ntemplate<typename T>\nstruct arma_scalar_only< std::complex<T> > { typedef std::complex<T> result; };\n\n\n\ntemplate<typename T> struct arma_integral_only { };\n\ntemplate<> struct arma_integral_only<u8>  { typedef u8  result; };\ntemplate<> struct arma_integral_only<s8>  { typedef s8  result; };\ntemplate<> struct arma_integral_only<u16> { typedef u16 result; };\ntemplate<> struct arma_integral_only<s16> { typedef s16 result; };\ntemplate<> struct arma_integral_only<u32> { typedef u32 result; };\ntemplate<> struct arma_integral_only<s32> { typedef s32 result; };\n#if defined(ARMA_USE_U64S64)\ntemplate<> struct arma_integral_only<u64> { typedef u64 result; };\ntemplate<> struct arma_integral_only<s64> { typedef s64 result; };\n#endif\n#if defined(ARMA_ALLOW_LONG)\ntemplate<> struct arma_integral_only<ulng_t> { typedef ulng_t result; };\ntemplate<> struct arma_integral_only<slng_t> { typedef slng_t result; };\n#endif\n\n\n\ntemplate<typename T> struct arma_unsigned_integral_only { };\n\ntemplate<> struct arma_unsigned_integral_only<u8>     { typedef u8     result; };\ntemplate<> struct arma_unsigned_integral_only<u16>    { typedef u16    result; };\ntemplate<> struct arma_unsigned_integral_only<u32>    { typedef u32    result; };\n#if defined(ARMA_USE_U64S64)\ntemplate<> struct arma_unsigned_integral_only<u64>    { typedef u64    result; };\n#endif\n#if defined(ARMA_ALLOW_LONG)\ntemplate<> struct arma_unsigned_integral_only<ulng_t> { typedef ulng_t result; };\n#endif\n\n\n\ntemplate<typename T> struct arma_signed_integral_only { };\n\ntemplate<> struct arma_signed_integral_only<s8>     { typedef s8     result; };\ntemplate<> struct arma_signed_integral_only<s16>    { typedef s16    result; };\ntemplate<> struct arma_signed_integral_only<s32>    { typedef s32    result; };\n#if defined(ARMA_USE_U64S64)\ntemplate<> struct arma_signed_integral_only<s64>    { typedef s64    result; };\n#endif\n#if defined(ARMA_ALLOW_LONG)\ntemplate<> struct arma_signed_integral_only<slng_t> { typedef slng_t result; };\n#endif\n\n\n\ntemplate<typename T> struct arma_signed_only { };\n\ntemplate<> struct arma_signed_only<s8>     { typedef s8     result; };\ntemplate<> struct arma_signed_only<s16>    { typedef s16    result; };\ntemplate<> struct arma_signed_only<s32>    { typedef s32    result; };\n#if defined(ARMA_USE_U64S64)\ntemplate<> struct arma_signed_only<s64>    { typedef s64    result; };\n#endif\ntemplate<> struct arma_signed_only<float>  { typedef float  result; };\ntemplate<> struct arma_signed_only<double> { typedef double result; };\n#if defined(ARMA_ALLOW_LONG)\ntemplate<> struct arma_signed_only<slng_t> { typedef slng_t result; };\n#endif\n\ntemplate<typename T> struct arma_signed_only< std::complex<T> > { typedef std::complex<T> result; };\n\n\n\ntemplate<typename T> struct arma_real_only { };\n\ntemplate<> struct arma_real_only<float>  { typedef float  result; };\ntemplate<> struct arma_real_only<double> { typedef double result; };\n\n\ntemplate<typename T> struct arma_real_or_cx_only { };\n\ntemplate<> struct arma_real_or_cx_only< float >                { typedef float                result; };\ntemplate<> struct arma_real_or_cx_only< double >               { typedef double               result; };\ntemplate<> struct arma_real_or_cx_only< std::complex<float>  > { typedef std::complex<float>  result; };\ntemplate<> struct arma_real_or_cx_only< std::complex<double> > { typedef std::complex<double> result; };\n\n\n\ntemplate<typename T> struct arma_cx_only { };\n\ntemplate<> struct arma_cx_only< std::complex<float>  > { typedef std::complex<float>  result; };\ntemplate<> struct arma_cx_only< std::complex<double> > { typedef std::complex<double> result; };\n\n\n\ntemplate<typename T> struct arma_not_cx                    { typedef T result; };\ntemplate<typename T> struct arma_not_cx< std::complex<T> > { };\n\n\n\ntemplate<typename T> struct arma_blas_type_only { };\n\ntemplate<> struct arma_blas_type_only< float                > { typedef float                result; };\ntemplate<> struct arma_blas_type_only< double               > { typedef double               result; };\ntemplate<> struct arma_blas_type_only< std::complex<float>  > { typedef std::complex<float>  result; };\ntemplate<> struct arma_blas_type_only< std::complex<double> > { typedef std::complex<double> result; };\n\n\n\ntemplate<typename T> struct arma_not_blas_type { typedef T result; };\n\ntemplate<> struct arma_not_blas_type< float                > {  };\ntemplate<> struct arma_not_blas_type< double               > {  };\ntemplate<> struct arma_not_blas_type< std::complex<float>  > {  };\ntemplate<> struct arma_not_blas_type< std::complex<double> > {  };\n\n\n\ntemplate<typename T> struct arma_op_rel_only { };\n\ntemplate<> struct arma_op_rel_only< op_rel_lt_pre    > { typedef int result; };\ntemplate<> struct arma_op_rel_only< op_rel_lt_post   > { typedef int result; };\ntemplate<> struct arma_op_rel_only< op_rel_gt_pre    > { typedef int result; };\ntemplate<> struct arma_op_rel_only< op_rel_gt_post   > { typedef int result; };\ntemplate<> struct arma_op_rel_only< op_rel_lteq_pre  > { typedef int result; };\ntemplate<> struct arma_op_rel_only< op_rel_lteq_post > { typedef int result; };\ntemplate<> struct arma_op_rel_only< op_rel_gteq_pre  > { typedef int result; };\ntemplate<> struct arma_op_rel_only< op_rel_gteq_post > { typedef int result; };\ntemplate<> struct arma_op_rel_only< op_rel_eq        > { typedef int result; };\ntemplate<> struct arma_op_rel_only< op_rel_noteq     > { typedef int result; };\n\n\n\ntemplate<typename T> struct arma_not_op_rel { typedef int result; };\n\ntemplate<> struct arma_not_op_rel< op_rel_lt_pre    > { };\ntemplate<> struct arma_not_op_rel< op_rel_lt_post   > { };\ntemplate<> struct arma_not_op_rel< op_rel_gt_pre    > { };\ntemplate<> struct arma_not_op_rel< op_rel_gt_post   > { };\ntemplate<> struct arma_not_op_rel< op_rel_lteq_pre  > { };\ntemplate<> struct arma_not_op_rel< op_rel_lteq_post > { };\ntemplate<> struct arma_not_op_rel< op_rel_gteq_pre  > { };\ntemplate<> struct arma_not_op_rel< op_rel_gteq_post > { };\ntemplate<> struct arma_not_op_rel< op_rel_eq        > { };\ntemplate<> struct arma_not_op_rel< op_rel_noteq     > { };\n\n\n\ntemplate<typename T> struct arma_glue_rel_only { };\n\ntemplate<> struct arma_glue_rel_only< glue_rel_lt    > { typedef int result; };\ntemplate<> struct arma_glue_rel_only< glue_rel_gt    > { typedef int result; };\ntemplate<> struct arma_glue_rel_only< glue_rel_lteq  > { typedef int result; };\ntemplate<> struct arma_glue_rel_only< glue_rel_gteq  > { typedef int result; };\ntemplate<> struct arma_glue_rel_only< glue_rel_eq    > { typedef int result; };\ntemplate<> struct arma_glue_rel_only< glue_rel_noteq > { typedef int result; };\ntemplate<> struct arma_glue_rel_only< glue_rel_and   > { typedef int result; };\ntemplate<> struct arma_glue_rel_only< glue_rel_or    > { typedef int result; };\n\n\n\ntemplate<typename T> struct arma_Mat_Col_Row_only { };\n\ntemplate<typename eT> struct arma_Mat_Col_Row_only< Mat<eT> > { typedef Mat<eT> result; };\ntemplate<typename eT> struct arma_Mat_Col_Row_only< Col<eT> > { typedef Col<eT> result; };\ntemplate<typename eT> struct arma_Mat_Col_Row_only< Row<eT> > { typedef Row<eT> result; };\n\n\n\ntemplate<typename  T> struct arma_Cube_only             { };\ntemplate<typename eT> struct arma_Cube_only< Cube<eT> > { typedef Cube<eT> result; };\n\n\ntemplate<typename T> struct arma_SpMat_SpCol_SpRow_only { };\n\ntemplate<typename eT> struct arma_SpMat_SpCol_SpRow_only< SpMat<eT> > { typedef SpMat<eT> result; };\ntemplate<typename eT> struct arma_SpMat_SpCol_SpRow_only< SpCol<eT> > { typedef SpCol<eT> result; };\ntemplate<typename eT> struct arma_SpMat_SpCol_SpRow_only< SpRow<eT> > { typedef SpRow<eT> result; };\n\n\n\ntemplate<bool> struct enable_if       {                     };\ntemplate<>     struct enable_if<true> { typedef int result; };\n\n\ntemplate<bool, typename result_type > struct enable_if2                    {                             };\ntemplate<      typename result_type > struct enable_if2<true, result_type> { typedef result_type result; };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/running_stat_bones.hpp",
    "content": "// Copyright (C) 2009-2013 Conrad Sanderson\n// Copyright (C) 2009-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup running_stat\n//! @{\n\n\n\ntemplate<typename eT>\nclass arma_counter\n  {\n  public:\n  \n  inline ~arma_counter();\n  inline  arma_counter();\n  \n  inline const arma_counter& operator++();\n  inline void                operator++(int);\n  \n  inline void reset();\n  inline eT   value()         const;\n  inline eT   value_plus_1()  const;\n  inline eT   value_minus_1() const;\n  \n  \n  private:\n  \n  arma_aligned eT    d_count;\n  arma_aligned uword i_count;\n  };\n\n\n\n//! Class for keeping statistics of a continuously sampled process / signal.\n//! Useful if the storage of individual samples is not necessary or desired.\n//! Also useful if the number of samples is not known beforehand or exceeds \n//! available memory.\ntemplate<typename eT>\nclass running_stat\n  {\n  public:\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  \n  inline ~running_stat();\n  inline  running_stat();\n  \n  inline void operator() (const T sample);\n  inline void operator() (const std::complex<T>& sample);\n  \n  inline void reset();\n  \n  inline eT mean() const;\n  \n  inline  T var   (const uword norm_type = 0) const;\n  inline  T stddev(const uword norm_type = 0) const;\n  \n  inline eT min()  const;\n  inline eT max()  const;\n  \n  inline T count() const;\n  \n  //\n  //\n  \n  private:\n  \n  arma_aligned arma_counter<T> counter;\n  \n  arma_aligned eT r_mean;\n  arma_aligned  T r_var;\n  \n  arma_aligned eT min_val;\n  arma_aligned eT max_val;\n  \n  arma_aligned  T min_val_norm;\n  arma_aligned  T max_val_norm;\n  \n  \n  friend class running_stat_aux;\n  };\n\n\n\nclass running_stat_aux\n  {\n  public:\n  \n  template<typename eT>\n  inline static void update_stats(running_stat<eT>& x, const eT sample, const typename arma_not_cx<eT>::result* junk = 0);\n  \n  template<typename eT>\n  inline static void update_stats(running_stat<eT>& x, const std::complex<eT>& sample, const typename arma_not_cx<eT>::result* junk = 0);\n  \n  template<typename eT>\n  inline static void update_stats(running_stat<eT>& x, const typename eT::value_type sample, const typename arma_cx_only<eT>::result* junk = 0);\n  \n  template<typename eT>\n  inline static void update_stats(running_stat<eT>& x, const eT& sample, const typename arma_cx_only<eT>::result* junk = 0);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/running_stat_meat.hpp",
    "content": "// Copyright (C) 2009-2011 Conrad Sanderson\n// Copyright (C) 2009-2011 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup running_stat\n//! @{\n\n\n\ntemplate<typename eT>\ninline\narma_counter<eT>::~arma_counter()\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_counter<eT>::arma_counter()\n  : d_count(   eT(0))\n  , i_count(uword(0))\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst arma_counter<eT>& \narma_counter<eT>::operator++()\n  {\n  if(i_count < ARMA_MAX_UWORD)\n    {\n    i_count++;\n    }\n  else\n    {\n    d_count += eT(ARMA_MAX_UWORD);\n    i_count  = 1;\n    }\n  \n  return *this;\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\narma_counter<eT>::operator++(int)\n  {\n  operator++();\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\narma_counter<eT>::reset()\n  {\n  d_count =    eT(0);\n  i_count = uword(0);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\narma_counter<eT>::value() const\n  {\n  return d_count + eT(i_count);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\narma_counter<eT>::value_plus_1() const\n  {\n  if(i_count < ARMA_MAX_UWORD)\n    {\n    return d_count + eT(i_count + 1);\n    }\n  else\n    {\n    return d_count + eT(ARMA_MAX_UWORD) + eT(1);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\narma_counter<eT>::value_minus_1() const\n  {\n  if(i_count > 0)\n    {\n    return d_count + eT(i_count - 1);\n    }\n  else\n    {\n    return d_count - eT(1);\n    }\n  }\n\n\n\n//\n\n\n\ntemplate<typename eT>\ninline\nrunning_stat<eT>::~running_stat()\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\ntemplate<typename eT>\ninline\nrunning_stat<eT>::running_stat()\n  : r_mean      (                          eT(0))\n  , r_var       (typename running_stat<eT>::T(0))\n  , min_val     (                          eT(0))\n  , max_val     (                          eT(0))\n  , min_val_norm(typename running_stat<eT>::T(0))\n  , max_val_norm(typename running_stat<eT>::T(0))\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\n//! update statistics to reflect new sample\ntemplate<typename eT>\ninline\nvoid\nrunning_stat<eT>::operator() (const typename running_stat<eT>::T sample)\n  {\n  arma_extra_debug_sigprint();\n  \n  if( arma_isfinite(sample) == false )\n    {\n    arma_warn(true, \"running_stat: sample ignored as it is non-finite\" );\n    return;\n    }\n  \n  running_stat_aux::update_stats(*this, sample);\n  }\n\n\n\n//! update statistics to reflect new sample (version for complex numbers)\ntemplate<typename eT>\ninline\nvoid\nrunning_stat<eT>::operator() (const std::complex< typename running_stat<eT>::T >& sample)\n  {\n  arma_extra_debug_sigprint();\n  \n  if( arma_isfinite(sample) == false )\n    {\n    arma_warn(true, \"running_stat: sample ignored as it is non-finite\" );\n    return;\n    }\n  \n  running_stat_aux::update_stats(*this, sample);\n  }\n\n\n\n//! set all statistics to zero\ntemplate<typename eT>\ninline\nvoid\nrunning_stat<eT>::reset()\n  {\n  arma_extra_debug_sigprint();\n  \n  // typedef typename running_stat<eT>::T T;\n  \n  counter.reset();\n  \n  r_mean       = eT(0);\n  r_var        =  T(0);\n  \n  min_val      = eT(0);\n  max_val      = eT(0);\n  \n  min_val_norm =  T(0);\n  max_val_norm =  T(0);\n  }\n\n\n\n//! mean or average value\ntemplate<typename eT>\ninline\neT\nrunning_stat<eT>::mean() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return r_mean;\n  }\n\n\n\n//! variance\ntemplate<typename eT>\ninline\ntypename running_stat<eT>::T\nrunning_stat<eT>::var(const uword norm_type) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const T N = counter.value();\n  \n  if(N > T(1))\n    {\n    if(norm_type == 0)\n      {\n      return r_var;\n      }\n    else\n      {\n      const T N_minus_1 = counter.value_minus_1();\n      return (N_minus_1/N) * r_var;\n      }\n    }\n  else\n    {\n    return T(0);\n    }\n  }\n\n\n\n//! standard deviation\ntemplate<typename eT>\ninline\ntypename running_stat<eT>::T\nrunning_stat<eT>::stddev(const uword norm_type) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return std::sqrt( (*this).var(norm_type) );\n  }\n\n\n\n//! minimum value\ntemplate<typename eT>\ninline\neT\nrunning_stat<eT>::min() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return min_val;\n  }\n\n\n\n//! maximum value\ntemplate<typename eT>\ninline\neT\nrunning_stat<eT>::max() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return max_val;\n  }\n\n\n\n//! number of samples so far\ntemplate<typename eT>\ninline\ntypename get_pod_type<eT>::result\nrunning_stat<eT>::count() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return counter.value();\n  }\n\n\n\n//! update statistics to reflect new sample (version for non-complex numbers, non-complex sample)\ntemplate<typename eT>\ninline\nvoid\nrunning_stat_aux::update_stats(running_stat<eT>& x, const eT sample, const typename arma_not_cx<eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename running_stat<eT>::T T;\n  \n  const T N = x.counter.value();\n  \n  if(N > T(0))\n    {\n    if(sample < x.min_val)\n      {\n      x.min_val = sample;\n      }\n    \n    if(sample > x.max_val)\n      {\n      x.max_val = sample;\n      }\n    \n    const T  N_plus_1   = x.counter.value_plus_1();\n    const T  N_minus_1  = x.counter.value_minus_1();\n    \n    // note: variance has to be updated before the mean\n    \n    const eT tmp = sample - x.r_mean;\n    \n    x.r_var  = N_minus_1/N * x.r_var + (tmp*tmp)/N_plus_1;\n    \n    x.r_mean = x.r_mean + (sample - x.r_mean)/N_plus_1;\n    //x.r_mean = (N/N_plus_1)*x.r_mean + sample/N_plus_1;\n    //x.r_mean = (x.r_mean + sample/N) * N/N_plus_1;\n    }\n  else\n    {\n    x.r_mean  = sample;\n    x.min_val = sample;\n    x.max_val = sample;\n    \n    // r_var is initialised to zero\n    // in the constructor and reset()\n    }\n  \n  x.counter++;\n  }\n\n\n\n//! update statistics to reflect new sample (version for non-complex numbers, complex sample)\ntemplate<typename eT>\ninline\nvoid\nrunning_stat_aux::update_stats(running_stat<eT>& x, const std::complex<eT>& sample, const typename arma_not_cx<eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  running_stat_aux::update_stats(x, std::real(sample));\n  }\n\n\n\n//! update statistics to reflect new sample (version for complex numbers, non-complex sample)\ntemplate<typename eT>\ninline\nvoid\nrunning_stat_aux::update_stats(running_stat<eT>& x, const typename eT::value_type sample, const typename arma_cx_only<eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename eT::value_type T;\n  \n  running_stat_aux::update_stats(x, std::complex<T>(sample));\n  }\n\n\n\n//! alter statistics to reflect new sample (version for complex numbers, complex sample)\ntemplate<typename eT>\ninline\nvoid\nrunning_stat_aux::update_stats(running_stat<eT>& x, const eT& sample, const typename arma_cx_only<eT>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename eT::value_type T;\n  \n  const T sample_norm = std::norm(sample);\n  const T N           = x.counter.value();\n  \n  if(N > T(0))\n    {\n    if(sample_norm < x.min_val_norm)\n      {\n      x.min_val_norm = sample_norm;\n      x.min_val      = sample;\n      }\n    \n    if(sample_norm > x.max_val_norm)\n      {\n      x.max_val_norm = sample_norm;\n      x.max_val      = sample;\n      }\n    \n    const T  N_plus_1   = x.counter.value_plus_1();\n    const T  N_minus_1  = x.counter.value_minus_1();\n    \n    x.r_var = N_minus_1/N * x.r_var + std::norm(sample - x.r_mean)/N_plus_1;\n    \n    x.r_mean = x.r_mean + (sample - x.r_mean)/N_plus_1;\n    //x.r_mean = (N/N_plus_1)*x.r_mean + sample/N_plus_1;\n    //x.r_mean = (x.r_mean + sample/N) * N/N_plus_1;\n    }\n  else\n    {\n    x.r_mean       = sample;\n    x.min_val      = sample;\n    x.max_val      = sample;\n    x.min_val_norm = sample_norm;\n    x.max_val_norm = sample_norm;\n    \n    // r_var is initialised to zero\n    // in the constructor and reset()\n    }\n  \n  x.counter++;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/running_stat_vec_bones.hpp",
    "content": "// Copyright (C) 2009-2013 Conrad Sanderson\n// Copyright (C) 2009-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup running_stat_vec\n//! @{\n\n\ntemplate<typename obj_type, bool> struct rsv_get_elem_type                  { };\ntemplate<typename obj_type>       struct rsv_get_elem_type<obj_type, false> { typedef          obj_type            elem_type; };\ntemplate<typename obj_type>       struct rsv_get_elem_type<obj_type, true>  { typedef typename obj_type::elem_type elem_type; };\n\n\n//! Class for keeping statistics of a continuously sampled process / signal.\n//! Useful if the storage of individual samples is not necessary or desired.\n//! Also useful if the number of samples is not known beforehand or exceeds \n//! available memory.\ntemplate<typename obj_type>\nclass running_stat_vec\n  {\n  public:\n  \n  // voodoo for compatibility with old user code\n  typedef typename rsv_get_elem_type<obj_type, is_Mat<obj_type>::value>::elem_type eT;\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  inline ~running_stat_vec();\n  inline  running_stat_vec(const bool in_calc_cov = false);  // TODO: investigate char* overload, eg. \"calc_cov\", \"no_calc_cov\"\n  \n  inline running_stat_vec(const running_stat_vec& in_rsv);\n  \n  inline const running_stat_vec& operator=(const running_stat_vec& in_rsv);\n  \n  template<typename T1> arma_hot inline void operator() (const Base<              T, T1>& X);\n  template<typename T1> arma_hot inline void operator() (const Base<std::complex<T>, T1>& X);\n  \n  inline void reset();\n  \n  inline const Mat<eT>&  mean() const;\n  \n  inline const Mat< T>&  var   (const uword norm_type = 0);\n  inline       Mat< T>   stddev(const uword norm_type = 0) const;\n  inline const Mat<eT>&  cov   (const uword norm_type = 0);\n  \n  inline const Mat<eT>& min() const;\n  inline const Mat<eT>& max() const;\n  \n  inline T count() const;\n  \n  //\n  //\n  \n  private:\n  \n  const bool calc_cov;\n  \n  arma_aligned arma_counter<T> counter;\n  \n  arma_aligned Mat<eT> r_mean;\n  arma_aligned Mat< T> r_var;\n  arma_aligned Mat<eT> r_cov;\n  \n  arma_aligned Mat<eT> min_val;\n  arma_aligned Mat<eT> max_val;\n  \n  arma_aligned Mat< T> min_val_norm;\n  arma_aligned Mat< T> max_val_norm;\n  \n  arma_aligned Mat< T> r_var_dummy;\n  arma_aligned Mat<eT> r_cov_dummy;\n  \n  arma_aligned Mat<eT> tmp1;\n  arma_aligned Mat<eT> tmp2;\n  \n  friend class running_stat_vec_aux;\n  };\n\n\n\nclass running_stat_vec_aux\n  {\n  public:\n  \n  template<typename obj_type>\n  inline static void\n  update_stats\n    (\n    running_stat_vec<obj_type>& x,\n    const                  Mat<typename running_stat_vec<obj_type>::eT>& sample,\n    const typename arma_not_cx<typename running_stat_vec<obj_type>::eT>::result* junk = 0\n    );\n  \n  template<typename obj_type>\n  inline static void\n  update_stats\n    (\n    running_stat_vec<obj_type>& x,\n    const          Mat<std::complex< typename running_stat_vec<obj_type>::T > >& sample,\n    const typename       arma_not_cx<typename running_stat_vec<obj_type>::eT>::result* junk = 0\n    );\n  \n  template<typename obj_type>\n  inline static void\n  update_stats\n    (\n    running_stat_vec<obj_type>& x,\n    const                  Mat< typename running_stat_vec<obj_type>::T >& sample,\n    const typename arma_cx_only<typename running_stat_vec<obj_type>::eT>::result* junk = 0\n    );\n  \n  template<typename obj_type>\n  inline static void\n  update_stats\n    (\n    running_stat_vec<obj_type>& x,\n    const                   Mat<typename running_stat_vec<obj_type>::eT>& sample,\n    const typename arma_cx_only<typename running_stat_vec<obj_type>::eT>::result* junk = 0\n    );\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/running_stat_vec_meat.hpp",
    "content": "// Copyright (C) 2009-2013 Conrad Sanderson\n// Copyright (C) 2009-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup running_stat_vec\n//! @{\n\n\n\ntemplate<typename obj_type>\ninline\nrunning_stat_vec<obj_type>::~running_stat_vec()\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\ntemplate<typename obj_type>\ninline\nrunning_stat_vec<obj_type>::running_stat_vec(const bool in_calc_cov)\n  : calc_cov(in_calc_cov)\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\ntemplate<typename obj_type>\ninline\nrunning_stat_vec<obj_type>::running_stat_vec(const running_stat_vec<obj_type>& in_rsv)\n  : calc_cov    (in_rsv.calc_cov)\n  , counter     (in_rsv.counter)\n  , r_mean      (in_rsv.r_mean)\n  , r_var       (in_rsv.r_var)\n  , r_cov       (in_rsv.r_cov)\n  , min_val     (in_rsv.min_val)\n  , max_val     (in_rsv.max_val)\n  , min_val_norm(in_rsv.min_val_norm)\n  , max_val_norm(in_rsv.max_val_norm)\n  {\n  arma_extra_debug_sigprint_this(this);\n  }\n\n\n\ntemplate<typename obj_type>\ninline\nconst running_stat_vec<obj_type>&\nrunning_stat_vec<obj_type>::operator=(const running_stat_vec<obj_type>& in_rsv)\n  {\n  arma_extra_debug_sigprint();\n  \n  access::rw(calc_cov) = in_rsv.calc_cov;\n  \n  counter      = in_rsv.counter;\n  r_mean       = in_rsv.r_mean;\n  r_var        = in_rsv.r_var;\n  r_cov        = in_rsv.r_cov;\n  min_val      = in_rsv.min_val;\n  max_val      = in_rsv.max_val;\n  min_val_norm = in_rsv.min_val_norm;\n  max_val_norm = in_rsv.max_val_norm;\n  \n  return *this;\n  }\n\n\n\n//! update statistics to reflect new sample\ntemplate<typename obj_type>\ntemplate<typename T1>\narma_hot\ninline\nvoid\nrunning_stat_vec<obj_type>::operator() (const Base<typename running_stat_vec<obj_type>::T, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const quasi_unwrap<T1> tmp(X.get_ref());\n  const Mat<T>& sample = tmp.M;\n  \n  if( sample.is_empty() )\n    {\n    return;\n    }\n  \n  if( sample.is_finite() == false )\n    {\n    arma_warn(true, \"running_stat_vec: sample ignored as it has non-finite elements\");\n    return;\n    }\n  \n  running_stat_vec_aux::update_stats(*this, sample);\n  }\n\n\n\ntemplate<typename obj_type>\ntemplate<typename T1>\narma_hot\ninline\nvoid\nrunning_stat_vec<obj_type>::operator() (const Base< std::complex<typename running_stat_vec<obj_type>::T>, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  const quasi_unwrap<T1> tmp(X.get_ref());\n  \n  const Mat< std::complex<T> >& sample = tmp.M;\n  \n  if( sample.is_empty() )\n    {\n    return;\n    }\n  \n  if( sample.is_finite() == false )\n    {\n    arma_warn(true, \"running_stat_vec: sample ignored as it has non-finite elements\");\n    return;\n    }\n  \n  running_stat_vec_aux::update_stats(*this, sample);\n  }\n\n\n\n//! set all statistics to zero\ntemplate<typename obj_type>\ninline\nvoid\nrunning_stat_vec<obj_type>::reset()\n  {\n  arma_extra_debug_sigprint();\n  \n  counter.reset();\n  \n  r_mean.reset();\n  r_var.reset();\n  r_cov.reset();\n  \n  min_val.reset();\n  max_val.reset();\n  \n  min_val_norm.reset();\n  max_val_norm.reset();\n  \n  r_var_dummy.reset();\n  r_cov_dummy.reset();\n  \n  tmp1.reset();\n  tmp2.reset();\n  }\n\n\n\n//! mean or average value\ntemplate<typename obj_type>\ninline\nconst Mat< typename running_stat_vec<obj_type>::eT >&\nrunning_stat_vec<obj_type>::mean() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return r_mean;\n  }\n\n\n\n//! variance\ntemplate<typename obj_type>\ninline\nconst Mat< typename running_stat_vec<obj_type>::T >&\nrunning_stat_vec<obj_type>::var(const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  const T N = counter.value();\n  \n  if(N > T(1))\n    {\n    if(norm_type == 0)\n      {\n      return r_var;\n      }\n    else\n      {\n      const T N_minus_1 = counter.value_minus_1();\n      \n      r_var_dummy = (N_minus_1/N) * r_var;\n      \n      return r_var_dummy;\n      }\n    }\n  else\n    {\n    r_var_dummy.zeros(r_mean.n_rows, r_mean.n_cols);\n    \n    return r_var_dummy;\n    }\n  \n  }\n\n\n\n//! standard deviation\ntemplate<typename obj_type>\ninline\nMat< typename running_stat_vec<obj_type>::T >\nrunning_stat_vec<obj_type>::stddev(const uword norm_type) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const T N = counter.value();\n  \n  if(N > T(1))\n    {\n    if(norm_type == 0)\n      {\n      return sqrt(r_var);\n      }\n    else\n      {\n      const T N_minus_1 = counter.value_minus_1();\n      \n      return sqrt( (N_minus_1/N) * r_var );\n      }\n    }\n  else\n    {\n    return Mat<T>();\n    }\n  }\n\n\n\n//! covariance\ntemplate<typename obj_type>\ninline\nconst Mat< typename running_stat_vec<obj_type>::eT >&\nrunning_stat_vec<obj_type>::cov(const uword norm_type)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(calc_cov == true)\n    {\n    const T N = counter.value();\n    \n    if(N > T(1))\n      {\n      if(norm_type == 0)\n        {\n        return r_cov;\n        }\n      else\n        {\n        const T N_minus_1 = counter.value_minus_1();\n        \n        r_cov_dummy = (N_minus_1/N) * r_cov;\n        \n        return r_cov_dummy;\n        }\n      }\n    else\n      {\n      r_cov_dummy.zeros(r_mean.n_rows, r_mean.n_cols);\n      \n      return r_cov_dummy;\n      }\n    }\n  else\n    {\n    r_cov_dummy.reset();\n    \n    return r_cov_dummy;\n    }\n  \n  }\n\n\n\n//! vector with minimum values\ntemplate<typename obj_type>\ninline\nconst Mat< typename running_stat_vec<obj_type>::eT >&\nrunning_stat_vec<obj_type>::min() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return min_val;\n  }\n\n\n\n//! vector with maximum values\ntemplate<typename obj_type>\ninline\nconst Mat< typename running_stat_vec<obj_type>::eT >&\nrunning_stat_vec<obj_type>::max() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return max_val;\n  }\n\n\n\n//! number of samples so far\ntemplate<typename obj_type>\ninline\ntypename running_stat_vec<obj_type>::T\nrunning_stat_vec<obj_type>::count() const\n  {\n  arma_extra_debug_sigprint();\n  \n  return counter.value();\n  }\n\n\n\n//\n\n\n\n//! update statistics to reflect new sample (version for non-complex numbers)\ntemplate<typename obj_type>\ninline\nvoid\nrunning_stat_vec_aux::update_stats\n  (\n  running_stat_vec<obj_type>& x,\n  const                  Mat<typename running_stat_vec<obj_type>::eT>& sample,\n  const typename arma_not_cx<typename running_stat_vec<obj_type>::eT>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename running_stat_vec<obj_type>::eT eT;\n  typedef typename running_stat_vec<obj_type>::T   T;\n  \n  const T N = x.counter.value();\n  \n  if(N > T(0))\n    {\n    arma_debug_assert_same_size(x.r_mean, sample, \"running_stat_vec(): dimensionality mismatch\");\n    \n    const uword n_elem      = sample.n_elem;\n    const eT*   sample_mem  = sample.memptr();\n          eT*   r_mean_mem  = x.r_mean.memptr();\n           T*   r_var_mem   = x.r_var.memptr();\n          eT*   min_val_mem = x.min_val.memptr();\n          eT*   max_val_mem = x.max_val.memptr();\n    \n    const T  N_plus_1   = x.counter.value_plus_1();\n    const T  N_minus_1  = x.counter.value_minus_1();\n    \n    if(x.calc_cov == true)\n      {\n      Mat<eT>& tmp1 = x.tmp1;\n      Mat<eT>& tmp2 = x.tmp2;\n      \n      tmp1 = sample - x.r_mean;\n      \n      if(sample.n_cols == 1)\n        {\n        tmp2 = tmp1*trans(tmp1);\n        }\n      else\n        {\n        tmp2 = trans(tmp1)*tmp1;\n        }\n      \n      x.r_cov *= (N_minus_1/N);\n      x.r_cov += tmp2 / N_plus_1;\n      }\n    \n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      const eT val = sample_mem[i];\n      \n      if(val < min_val_mem[i])\n        {\n        min_val_mem[i] = val;\n        }\n      \n      if(val > max_val_mem[i])\n        {\n        max_val_mem[i] = val;\n        }\n        \n      const eT r_mean_val = r_mean_mem[i];\n      const eT tmp        = val - r_mean_val;\n    \n      r_var_mem[i] = N_minus_1/N * r_var_mem[i] + (tmp*tmp)/N_plus_1;\n      \n      r_mean_mem[i] = r_mean_val + (val - r_mean_val)/N_plus_1;\n      }\n    }\n  else\n    {\n    arma_debug_check( (sample.is_vec() == false), \"running_stat_vec(): given sample is not a vector\");\n    \n    x.r_mean.set_size(sample.n_rows, sample.n_cols);\n    \n    x.r_var.zeros(sample.n_rows, sample.n_cols);\n    \n    if(x.calc_cov == true)\n      {\n      x.r_cov.zeros(sample.n_elem, sample.n_elem);\n      }\n    \n    x.min_val.set_size(sample.n_rows, sample.n_cols);\n    x.max_val.set_size(sample.n_rows, sample.n_cols);\n    \n    \n    const uword n_elem      = sample.n_elem;\n    const eT*   sample_mem  = sample.memptr();\n          eT*   r_mean_mem  = x.r_mean.memptr();\n          eT*   min_val_mem = x.min_val.memptr();\n          eT*   max_val_mem = x.max_val.memptr();\n          \n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      const eT val = sample_mem[i];\n      \n       r_mean_mem[i] = val;\n      min_val_mem[i] = val;\n      max_val_mem[i] = val;\n      }\n    }\n  \n  x.counter++;\n  }\n\n\n\n//! update statistics to reflect new sample (version for non-complex numbers, complex sample)\ntemplate<typename obj_type>\ninline\nvoid\nrunning_stat_vec_aux::update_stats\n  (\n  running_stat_vec<obj_type>& x,\n  const          Mat<std::complex< typename running_stat_vec<obj_type>::T > >& sample,\n  const typename       arma_not_cx<typename running_stat_vec<obj_type>::eT>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename running_stat_vec<obj_type>::eT eT;\n  \n  running_stat_vec_aux::update_stats(x, conv_to< Mat<eT> >::from(sample));\n  }\n\n\n\n//! update statistics to reflect new sample (version for complex numbers, non-complex sample)\ntemplate<typename obj_type>\ninline\nvoid\nrunning_stat_vec_aux::update_stats\n  (\n  running_stat_vec<obj_type>& x,\n  const                   Mat<typename running_stat_vec<obj_type>::T >& sample,\n  const typename arma_cx_only<typename running_stat_vec<obj_type>::eT>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename running_stat_vec<obj_type>::eT eT;\n  \n  running_stat_vec_aux::update_stats(x, conv_to< Mat<eT> >::from(sample));\n  }\n\n\n\n//! alter statistics to reflect new sample (version for complex numbers, complex sample)\ntemplate<typename obj_type>\ninline\nvoid\nrunning_stat_vec_aux::update_stats\n  (\n  running_stat_vec<obj_type>& x,\n  const                   Mat<typename running_stat_vec<obj_type>::eT>& sample,\n  const typename arma_cx_only<typename running_stat_vec<obj_type>::eT>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename running_stat_vec<obj_type>::eT eT;\n  typedef typename running_stat_vec<obj_type>::T   T;\n  \n  const T N = x.counter.value();\n  \n  if(N > T(0))\n    {\n    arma_debug_assert_same_size(x.r_mean, sample, \"running_stat_vec(): dimensionality mismatch\");\n    \n    const uword n_elem           = sample.n_elem;\n    const eT*   sample_mem       = sample.memptr();\n          eT*   r_mean_mem       = x.r_mean.memptr();\n           T*   r_var_mem        = x.r_var.memptr();\n          eT*   min_val_mem      = x.min_val.memptr();\n          eT*   max_val_mem      = x.max_val.memptr();\n           T*   min_val_norm_mem = x.min_val_norm.memptr();\n           T*   max_val_norm_mem = x.max_val_norm.memptr();\n    \n    const T  N_plus_1   = x.counter.value_plus_1();\n    const T  N_minus_1  = x.counter.value_minus_1();\n    \n    if(x.calc_cov == true)\n      {\n      Mat<eT>& tmp1 = x.tmp1;\n      Mat<eT>& tmp2 = x.tmp2;\n      \n      tmp1 = sample - x.r_mean;\n      \n      if(sample.n_cols == 1)\n        {\n        tmp2 = arma::conj(tmp1)*strans(tmp1);\n        }\n      else\n        {\n        tmp2 = trans(tmp1)*tmp1;  //tmp2 = strans(conj(tmp1))*tmp1;\n        }\n      \n      x.r_cov *= (N_minus_1/N);\n      x.r_cov += tmp2 / N_plus_1;\n      }\n    \n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      const eT& val      = sample_mem[i];\n      const  T  val_norm = std::norm(val);\n      \n      if(val_norm < min_val_norm_mem[i])\n        {\n        min_val_norm_mem[i] = val_norm;\n        min_val_mem[i]      = val;\n        }\n      \n      if(val_norm > max_val_norm_mem[i])\n        {\n        max_val_norm_mem[i] = val_norm;\n        max_val_mem[i]      = val;\n        }\n      \n      const eT& r_mean_val = r_mean_mem[i];\n      \n      r_var_mem[i] = N_minus_1/N * r_var_mem[i] + std::norm(val - r_mean_val)/N_plus_1;\n      \n      r_mean_mem[i] = r_mean_val + (val - r_mean_val)/N_plus_1;\n      }\n    }\n  else\n    {\n    arma_debug_check( (sample.is_vec() == false), \"running_stat_vec(): given sample is not a vector\");\n    \n    x.r_mean.set_size(sample.n_rows, sample.n_cols);\n    \n    x.r_var.zeros(sample.n_rows, sample.n_cols);\n    \n    if(x.calc_cov == true)\n      {\n      x.r_cov.zeros(sample.n_elem, sample.n_elem);\n      }\n    \n    x.min_val.set_size(sample.n_rows, sample.n_cols);\n    x.max_val.set_size(sample.n_rows, sample.n_cols);\n    \n    x.min_val_norm.set_size(sample.n_rows, sample.n_cols);\n    x.max_val_norm.set_size(sample.n_rows, sample.n_cols);\n    \n    \n    const uword n_elem           = sample.n_elem;\n    const eT*   sample_mem       = sample.memptr();\n          eT*   r_mean_mem       = x.r_mean.memptr();\n          eT*   min_val_mem      = x.min_val.memptr();\n          eT*   max_val_mem      = x.max_val.memptr();\n           T*   min_val_norm_mem = x.min_val_norm.memptr();\n           T*   max_val_norm_mem = x.max_val_norm.memptr();\n    \n    for(uword i=0; i<n_elem; ++i)\n      {\n      const eT& val      = sample_mem[i];\n      const  T  val_norm = std::norm(val);\n      \n       r_mean_mem[i] = val;\n      min_val_mem[i] = val;\n      max_val_mem[i] = val;\n      \n      min_val_norm_mem[i] = val_norm;\n      max_val_norm_mem[i] = val_norm;\n      }\n    }\n  \n  x.counter++;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/sp_auxlib_bones.hpp",
    "content": "// Copyright (C) 2013-2015 Ryan Curtin\n// Copyright (C) 2013-2015 Conrad Sanderson\n// Copyright (C) 2013-2015 NICTA\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup sp_auxlib\n//! @{\n\n\n//! wrapper for accesing external functions for sparse matrices defined in ARPACK\nclass sp_auxlib\n  {\n  public:\n  \n  enum form_type\n    {\n    form_none, form_lm, form_sm, form_lr, form_la, form_sr, form_li, form_si, form_sa\n    };\n  \n  inline static form_type interpret_form_str(const char* form_str);\n  \n  //\n  // eigs_sym() via ARPACK\n  \n  template<typename eT, typename T1>\n  inline static bool eigs_sym(Col<eT>& eigval, Mat<eT>& eigvec, const SpBase<eT, T1>& X, const uword n_eigvals, const char* form_str, const eT default_tol);\n  \n  \n  //\n  // eigs_gen() via ARPACK\n  \n  template<typename T, typename T1>\n  inline static bool eigs_gen(Col< std::complex<T> >& eigval, Mat< std::complex<T> >& eigvec, const SpBase<T, T1>& X, const uword n_eigvals, const char* form_str, const T default_tol);\n  \n  template<typename T, typename T1>\n  inline static bool eigs_gen(Col< std::complex<T> >& eigval, Mat< std::complex<T> >& eigvec, const SpBase< std::complex<T>, T1>& X, const uword n_eigvals, const char* form_str, const T default_tol);\n  \n  \n  //\n  // spsolve() via SuperLU\n  \n  template<typename T1, typename T2>\n  inline static bool spsolve(Mat<typename T1::elem_type>& out, const SpBase<typename T1::elem_type, T1>& A, const Base<typename T1::elem_type, T2>& B, const superlu_opts& user_opts);\n  \n  #if defined(ARMA_USE_SUPERLU)\n    template<typename eT>\n    inline static bool convert_to_supermatrix(superlu::SuperMatrix& out, const SpMat<eT>& A);\n    \n    template<typename eT>\n    inline static bool convert_to_supermatrix(superlu::SuperMatrix& out, const Mat<eT>& A);\n    \n    inline static void destroy_supermatrix(superlu::SuperMatrix& out);\n  #endif\n  \n  \n  \n  private:\n  \n  // calls arpack saupd()/naupd() because the code is so similar for each\n  // all of the extra variables are later used by seupd()/neupd(), but those\n  // functions are very different and we can't combine their code\n  \n  template<typename eT, typename T, typename T1>\n  inline static void run_aupd\n    (\n    const uword n_eigvals, char* which, const SpProxy<T1>& p, const bool sym,\n    blas_int& n, eT& tol,\n    podarray<T>& resid, blas_int& ncv, podarray<T>& v, blas_int& ldv,\n    podarray<blas_int>& iparam, podarray<blas_int>& ipntr,\n    podarray<T>& workd, podarray<T>& workl, blas_int& lworkl, podarray<eT>& rwork,\n    blas_int& info\n    );\n\n  };\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/sp_auxlib_meat.hpp",
    "content": "// Copyright (C) 2013-2015 Ryan Curtin\n// Copyright (C) 2013-2015 Conrad Sanderson\n// Copyright (C) 2013-2015 NICTA\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup sp_auxlib\n//! @{\n\n\ninline\nsp_auxlib::form_type\nsp_auxlib::interpret_form_str(const char* form_str)\n  {\n  arma_extra_debug_sigprint();\n  \n  // the order of the 3 if statements below is important\n  if( form_str    == NULL    )  { return form_none; }\n  if( form_str[0] == char(0) )  { return form_none; }\n  if( form_str[1] == char(0) )  { return form_none; }\n  \n  const char c1 = form_str[0];\n  const char c2 = form_str[1];\n  \n  if(c1 == 'l')\n    {\n    if(c2 == 'm')  { return form_lm; }\n    if(c2 == 'r')  { return form_lr; }\n    if(c2 == 'i')  { return form_li; }\n    if(c2 == 'a')  { return form_la; }\n    }\n  else\n  if(c1 == 's')\n    {\n    if(c2 == 'm')  { return form_sm; }\n    if(c2 == 'r')  { return form_sr; }\n    if(c2 == 'i')  { return form_si; }\n    if(c2 == 'a')  { return form_sa; }\n    }\n  \n  return form_none;\n  }\n\n\n\n//! immediate eigendecomposition of symmetric real sparse object\ntemplate<typename eT, typename T1>\ninline\nbool\nsp_auxlib::eigs_sym(Col<eT>& eigval, Mat<eT>& eigvec, const SpBase<eT, T1>& X, const uword n_eigvals, const char* form_str, const eT default_tol)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_ARPACK)\n    {\n    const form_type form_val = sp_auxlib::interpret_form_str(form_str);\n    \n    arma_debug_check( (form_val != form_lm) && (form_val != form_sm) && (form_val != form_la) && (form_val != form_sa), \"eigs_sym(): unknown form specified\" );\n    \n    char  which_sm[3] = \"SM\";\n    char  which_lm[3] = \"LM\";\n    char  which_sa[3] = \"SA\";\n    char  which_la[3] = \"LA\";\n    char* which;\n    switch (form_val)\n      {\n      case form_sm:  which = which_sm;  break;\n      case form_lm:  which = which_lm;  break;\n      case form_sa:  which = which_sa;  break;\n      case form_la:  which = which_la;  break;\n\n      default:       which = which_lm;  break;\n      }\n    \n    // Make a sparse proxy object.\n    SpProxy<T1> p(X.get_ref());\n    \n    // Make sure it's square.\n    arma_debug_check( (p.get_n_rows() != p.get_n_cols()), \"eigs_sym(): given sparse matrix is not square\");\n    \n    // Make sure we aren't asking for every eigenvalue.\n    arma_debug_check( (n_eigvals + 1 >= p.get_n_rows()), \"eigs_sym(): n_eigvals + 1 must be less than the number of rows in the matrix\");\n    \n    // If the matrix is empty, the case is trivial.\n    if(p.get_n_cols() == 0) // We already know n_cols == n_rows.\n      {\n      eigval.reset();\n      eigvec.reset();\n      return true;\n      }\n    \n    // Set up variables that get used for neupd().\n    blas_int n, ncv, ldv, lworkl, info;\n    eT tol = default_tol;\n    podarray<eT> resid, v, workd, workl;\n    podarray<blas_int> iparam, ipntr;\n    podarray<eT> rwork; // Not used in this case.\n    \n    run_aupd(n_eigvals, which, p, true /* sym, not gen */, n, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, rwork, info);\n    \n    if(info != 0)\n      {\n      return false;\n      }\n    \n    // The process has converged, and now we need to recover the actual eigenvectors using seupd()\n    blas_int rvec = 1; // .TRUE\n    blas_int nev  = n_eigvals;\n    \n    char howmny = 'A';\n    char bmat   = 'I'; // We are considering the standard eigenvalue problem.\n    \n    podarray<blas_int> select(ncv); // Logical array of dimension NCV.\n    blas_int ldz = n;\n    \n    // seupd() will output directly into the eigval and eigvec objects.\n    eigval.set_size(n_eigvals);\n    eigvec.set_size(n, n_eigvals);\n    \n    arpack::seupd(&rvec, &howmny, select.memptr(), eigval.memptr(), eigvec.memptr(), &ldz, (eT*) NULL, &bmat, &n, which, &nev, &tol, resid.memptr(), &ncv, v.memptr(), &ldv, iparam.memptr(), ipntr.memptr(), workd.memptr(), workl.memptr(), &lworkl, &info);\n    \n    // Check for errors.\n    if(info != 0)\n      {\n      std::stringstream tmp;\n      tmp << \"eigs_sym(): ARPACK error \" << info << \" in seupd()\";\n      arma_debug_warn(true, tmp.str());\n      return false;\n      }\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(eigval);\n    arma_ignore(eigvec);\n    arma_ignore(X);\n    arma_ignore(n_eigvals);\n    arma_ignore(form_str);\n    arma_ignore(default_tol);\n    \n    arma_stop(\"eigs_sym(): use of ARPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n//! immediate eigendecomposition of non-symmetric real sparse object\ntemplate<typename T, typename T1>\ninline\nbool\nsp_auxlib::eigs_gen(Col< std::complex<T> >& eigval, Mat< std::complex<T> >& eigvec, const SpBase<T, T1>& X, const uword n_eigvals, const char* form_str, const T default_tol)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_ARPACK)\n    {\n    const form_type form_val = sp_auxlib::interpret_form_str(form_str);\n    \n    arma_debug_check( (form_val == form_none), \"eigs_gen(): unknown form specified\" );\n    \n    char which_lm[3] = \"LM\";\n    char which_sm[3] = \"SM\";\n    char which_lr[3] = \"LR\";\n    char which_sr[3] = \"SR\";\n    char which_li[3] = \"LI\";\n    char which_si[3] = \"SI\";\n    \n    char* which;\n    \n    switch(form_val)\n      {\n      case form_lm:  which = which_lm;  break;\n      case form_sm:  which = which_sm;  break;\n      case form_lr:  which = which_lr;  break;\n      case form_sr:  which = which_sr;  break;\n      case form_li:  which = which_li;  break;\n      case form_si:  which = which_si;  break;\n      \n      default:       which = which_lm;\n      }\n    \n    \n    // Make a sparse proxy object.\n    SpProxy<T1> p(X.get_ref());\n    \n    // Make sure it's square.\n    arma_debug_check( (p.get_n_rows() != p.get_n_cols()), \"eigs_gen(): given sparse matrix is not square\");\n    \n    // Make sure we aren't asking for every eigenvalue.\n    arma_debug_check( (n_eigvals + 1 >= p.get_n_rows()), \"eigs_gen(): n_eigvals + 1 must be less than the number of rows in the matrix\");\n    \n    // If the matrix is empty, the case is trivial.\n    if(p.get_n_cols() == 0) // We already know n_cols == n_rows.\n      {\n      eigval.reset();\n      eigvec.reset();\n      return true;\n      }\n    \n    // Set up variables that get used for neupd().\n    blas_int n, ncv, ldv, lworkl, info;\n    T tol = default_tol;\n    podarray<T> resid, v, workd, workl;\n    podarray<blas_int> iparam, ipntr;\n    podarray<T> rwork; // Not used in the real case.\n    \n    run_aupd(n_eigvals, which, p, false /* gen, not sym */, n, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, rwork, info);\n    \n    if(info != 0)\n      {\n      return false;\n      }\n\n    // The process has converged, and now we need to recover the actual eigenvectors using neupd().\n    blas_int rvec = 1; // .TRUE\n    blas_int nev = n_eigvals;\n    \n    char howmny = 'A';\n    char bmat   = 'I'; // We are considering the standard eigenvalue problem.\n    \n    podarray<blas_int> select(ncv); // Logical array of dimension NCV.\n    podarray<T> dr(nev + 1); // Real array of dimension NEV + 1.\n    podarray<T> di(nev + 1); // Real array of dimension NEV + 1.\n    podarray<T> z(n * (nev + 1)); // Real N by NEV array if HOWMNY = 'A'.\n    blas_int ldz = n;\n    podarray<T> workev(3 * ncv);\n    \n    arpack::neupd(&rvec, &howmny, select.memptr(), dr.memptr(), di.memptr(), z.memptr(), &ldz, (T*) NULL, (T*) NULL, workev.memptr(), &bmat, &n, which, &nev, &tol, resid.memptr(), &ncv, v.memptr(), &ldv, iparam.memptr(), ipntr.memptr(), workd.memptr(), workl.memptr(), &lworkl, rwork.memptr(), &info);\n    \n    // Check for errors.\n    if(info != 0)\n      {\n      std::stringstream tmp;\n      tmp << \"eigs_gen(): ARPACK error \" << info << \" in neupd()\";\n      arma_debug_warn(true, tmp.str());\n      return false;\n      }\n    \n    // Put it into the outputs.\n    eigval.set_size(n_eigvals);\n    eigvec.set_size(n, n_eigvals);\n    \n    for (uword i = 0; i < n_eigvals; ++i)\n      {\n      eigval[i] = std::complex<T>(dr[i], di[i]);\n      }\n    \n    // Now recover the eigenvectors.\n    for (uword i = 0; i < n_eigvals; ++i)\n      {\n      // ARPACK ?neupd lays things out kinda odd in memory; so does LAPACK\n      // ?geev (see auxlib::eig_gen()).\n      if((i < n_eigvals - 1) && (eigval[i] == std::conj(eigval[i + 1])))\n        {\n        for (uword j = 0; j < n; ++j)\n          {\n          eigvec.at(j, i)     = std::complex<T>(z[n * i + j], z[n * (i + 1) + j]);\n          eigvec.at(j, i + 1) = std::complex<T>(z[n * i + j], -z[n * (i + 1) + j]);\n          }\n        ++i; // Skip the next one.\n        }\n      else\n      if((i == n_eigvals - 1) && (std::complex<T>(eigval[i]).imag() != 0.0))\n        {\n        // We don't have the matched conjugate eigenvalue.\n        for (uword j = 0; j < n; ++j)\n          {\n          eigvec.at(j, i) = std::complex<T>(z[n * i + j], z[n * (i + 1) + j]);\n          }\n        }\n      else\n        {\n        // The eigenvector is entirely real.\n        for (uword j = 0; j < n; ++j)\n          {\n          eigvec.at(j, i) = std::complex<T>(z[n * i + j], T(0));\n          }\n        }\n      }\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(eigval);\n    arma_ignore(eigvec);\n    arma_ignore(X);\n    arma_ignore(n_eigvals);\n    arma_ignore(form_str);\n    arma_ignore(default_tol);\n    \n    arma_stop(\"eigs_gen(): use of ARPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n\n//! immediate eigendecomposition of non-symmetric complex sparse object\ntemplate<typename T, typename T1>\ninline\nbool\nsp_auxlib::eigs_gen(Col< std::complex<T> >& eigval, Mat< std::complex<T> >& eigvec, const SpBase< std::complex<T>, T1>& X, const uword n_eigvals, const char* form_str, const T default_tol)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_ARPACK)\n    {\n    const form_type form_val = sp_auxlib::interpret_form_str(form_str);\n    \n    arma_debug_check( (form_val == form_none), \"eigs_gen(): unknown form specified\" );\n    \n    char which_lm[3] = \"LM\";\n    char which_sm[3] = \"SM\";\n    char which_lr[3] = \"LR\";\n    char which_sr[3] = \"SR\";\n    char which_li[3] = \"LI\";\n    char which_si[3] = \"SI\";\n    \n    char* which;\n    \n    switch(form_val)\n      {\n      case form_lm:  which = which_lm;  break;\n      case form_sm:  which = which_sm;  break;\n      case form_lr:  which = which_lr;  break;\n      case form_sr:  which = which_sr;  break;\n      case form_li:  which = which_li;  break;\n      case form_si:  which = which_si;  break;\n      \n      default:       which = which_lm;\n      }\n    \n    \n    // Make a sparse proxy object.\n    SpProxy<T1> p(X.get_ref());\n    \n    // Make sure it's square.\n    arma_debug_check( (p.get_n_rows() != p.get_n_cols()), \"eigs_gen(): given sparse matrix is not square\");\n    \n    // Make sure we aren't asking for every eigenvalue.\n    arma_debug_check( (n_eigvals + 1 >= p.get_n_rows()), \"eigs_gen(): n_eigvals + 1 must be less than the number of rows in the matrix\");\n    \n    // If the matrix is empty, the case is trivial.\n    if(p.get_n_cols() == 0) // We already know n_cols == n_rows.\n      {\n      eigval.reset();\n      eigvec.reset();\n      return true;\n      }\n    \n    // Set up variables that get used for neupd().\n    blas_int n, ncv, ldv, lworkl, info;\n    T tol = default_tol;\n    podarray< std::complex<T> > resid, v, workd, workl;\n    podarray<blas_int> iparam, ipntr;\n    podarray<T> rwork;\n    \n    run_aupd(n_eigvals, which, p, false /* gen, not sym */, n, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, rwork, info);\n    \n    if(info != 0)\n      {\n      return false;\n      }\n    \n    // The process has converged, and now we need to recover the actual eigenvectors using neupd().\n    blas_int rvec = 1; // .TRUE\n    blas_int nev  = n_eigvals;\n    \n    char howmny = 'A';\n    char bmat   = 'I'; // We are considering the standard eigenvalue problem.\n    \n    podarray<blas_int> select(ncv); // Logical array of dimension NCV.\n    podarray<std::complex<T> > d(nev + 1); // Real array of dimension NEV + 1.\n    podarray<std::complex<T> > z(n * nev); // Real N by NEV array if HOWMNY = 'A'.\n    blas_int ldz = n;\n    podarray<std::complex<T> > workev(2 * ncv);\n    \n    // Prepare the outputs; neupd() will write directly to them.\n    eigval.set_size(n_eigvals);\n    eigvec.set_size(n, n_eigvals);\n    std::complex<T> sigma;\n    \n    arpack::neupd(&rvec, &howmny, select.memptr(), eigval.memptr(),\n(std::complex<T>*) NULL, eigvec.memptr(), &ldz, (std::complex<T>*) &sigma, (std::complex<T>*) NULL, workev.memptr(), &bmat, &n, which, &nev, &tol, resid.memptr(), &ncv, v.memptr(), &ldv, iparam.memptr(), ipntr.memptr(), workd.memptr(), workl.memptr(), &lworkl, rwork.memptr(), &info);\n    \n    // Check for errors.\n    if(info != 0)\n      {\n      std::stringstream tmp;\n      tmp << \"eigs_gen(): ARPACK error \" << info << \" in neupd()\";\n      arma_debug_warn(true, tmp.str());\n      return false;\n      }\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(eigval);\n    arma_ignore(eigvec);\n    arma_ignore(X);\n    arma_ignore(n_eigvals);\n    arma_ignore(form_str);\n    arma_ignore(default_tol);\n    \n    arma_stop(\"eigs_gen(): use of ARPACK needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nbool\nsp_auxlib::spsolve(Mat<typename T1::elem_type>& X, const SpBase<typename T1::elem_type, T1>& A_expr, const Base<typename T1::elem_type, T2>& B_expr, const superlu_opts& user_opts)\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_SUPERLU)\n    {\n    // The goal is to solve the system A*X = B for the matrix X.\n    \n    // The first thing we need to do is create SuperMatrix structures to call\n    // the SuperLU functions with.  SuperLU will overwrite the B matrix with\n    // the output matrix, so we'll unwrap B into X temporarily.\n    \n    typedef typename T1::elem_type eT;\n    \n    const unwrap_spmat<T1> tmp1(A_expr.get_ref());\n    const SpMat<eT>& A =   tmp1.M;\n    \n    X = B_expr.get_ref();\n    \n    if(A.n_rows > A.n_cols)\n      {\n      arma_stop(\"spsolve(): solving over-determined systems currently not supported\");\n      X.reset();\n      return false;\n      }\n    else if(A.n_rows < A.n_cols)\n      {\n      arma_stop(\"spsolve(): solving under-determined systems currently not supported\");\n      X.reset();\n      return false;\n      }\n    \n    arma_debug_check( (A.n_rows != X.n_rows), \"spsolve(): number of rows in the given objects must be the same\" );\n    \n    if(A.is_empty() || X.is_empty())\n      {\n      X.zeros(A.n_cols, X.n_cols);\n      return true;\n      }\n    \n    if(arma_config::debug)\n      {\n      bool overflow;\n      \n      overflow = (A.n_nonzero > INT_MAX);\n      overflow = (A.n_rows > INT_MAX) || overflow;\n      overflow = (A.n_cols > INT_MAX) || overflow;\n      overflow = (X.n_rows > INT_MAX) || overflow;\n      overflow = (X.n_cols > INT_MAX) || overflow;\n      \n      if(overflow)\n        {\n        arma_bad(\"spsolve(): integer overflow: matrix dimensions are too large for integer type used by SuperLU\");\n        }\n      }\n    \n    superlu::SuperMatrix x;  arrayops::inplace_set(reinterpret_cast<char*>(&x), char(0), sizeof(superlu::SuperMatrix));\n    superlu::SuperMatrix a;  arrayops::inplace_set(reinterpret_cast<char*>(&a), char(0), sizeof(superlu::SuperMatrix));\n    \n    const bool status_x = convert_to_supermatrix(x, X);\n    const bool status_a = convert_to_supermatrix(a, A);\n    \n    if( (status_x == false) || (status_a == false) )\n      {\n      destroy_supermatrix(a);\n      destroy_supermatrix(x);\n      X.reset();\n      return false;\n      }\n    \n    superlu::SuperMatrix l;  arrayops::inplace_set(reinterpret_cast<char*>(&l), char(0), sizeof(superlu::SuperMatrix));\n    superlu::SuperMatrix u;  arrayops::inplace_set(reinterpret_cast<char*>(&u), char(0), sizeof(superlu::SuperMatrix));\n    \n    // Use default options.\n    superlu::superlu_options_t options;\n    superlu::set_default_opts(&options);\n    \n    \n    // process user_opts\n    \n    if(user_opts.equilibrate == true)   { options.Equil = superlu::YES; }\n    if(user_opts.equilibrate == false)  { options.Equil = superlu::NO;  }\n    \n    if(user_opts.symmetric == true)   { options.SymmetricMode = superlu::YES; }\n    if(user_opts.symmetric == false)  { options.SymmetricMode = superlu::NO;  }\n    \n    options.DiagPivotThresh = user_opts.pivot_thresh;\n    \n    if(user_opts.permutation == superlu_opts::NATURAL)        { options.ColPerm = superlu::NATURAL;       }\n    if(user_opts.permutation == superlu_opts::MMD_ATA)        { options.ColPerm = superlu::MMD_ATA;       }\n    if(user_opts.permutation == superlu_opts::MMD_AT_PLUS_A)  { options.ColPerm = superlu::MMD_AT_PLUS_A; }\n    if(user_opts.permutation == superlu_opts::COLAMD)         { options.ColPerm = superlu::COLAMD;        }\n    \n    if(user_opts.refine == superlu_opts::REF_NONE)    { options.IterRefine = superlu::NOREFINE;   }\n    if(user_opts.refine == superlu_opts::REF_SINGLE)  { options.IterRefine = superlu::SLU_SINGLE; }\n    if(user_opts.refine == superlu_opts::REF_DOUBLE)  { options.IterRefine = superlu::SLU_DOUBLE; }\n    if(user_opts.refine == superlu_opts::REF_EXTRA)   { options.IterRefine = superlu::SLU_EXTRA;  }\n    \n    \n    // paranoia: use SuperLU's memory allocation, in case it reallocs\n    \n    int* perm_c = (int*) superlu::malloc( (A.n_cols+1) * sizeof(int));  // extra paranoia: increase array length by 1\n    int* perm_r = (int*) superlu::malloc( (A.n_rows+1) * sizeof(int));\n    \n    arrayops::inplace_set(perm_c, 0, A.n_cols+1);\n    arrayops::inplace_set(perm_r, 0, A.n_rows+1);\n    \n    superlu::SuperLUStat_t stat;\n    superlu::init_stat(&stat);\n    \n    int info = 0; // Return code.\n    \n    superlu::gssv<eT>(&options, &a, perm_c, perm_r, &l, &u, &x, &stat, &info);\n    \n    \n    // Process the return code.\n    if( (info > 0) && (info <= int(A.n_cols)) )\n      {\n      std::stringstream tmp;\n      tmp << \"spsolve(): could not solve system; LU factorisation completed, but detected zero in U(\" << (info-1) << ',' << (info-1) << ')';\n      arma_debug_warn(true, tmp.str());\n      }\n    else\n    if(info > int(A.n_cols))\n      {\n      std::stringstream tmp;\n      tmp << \"spsolve(): memory allocation failure: could not allocate \" << (info - int(A.n_cols)) << \" bytes\";\n      arma_debug_warn(true, tmp.str());\n      }\n    else\n    if(info < 0)\n      {\n      std::stringstream tmp;\n      tmp << \"spsolve(): unknown SuperLU error code from gssv(): \" << info;\n      arma_debug_warn(true, tmp.str());\n      }\n    \n    \n    superlu::free_stat(&stat);\n    \n    superlu::free(perm_c);\n    superlu::free(perm_r);\n    \n    // No need to extract the matrix, since it's still using the same memory.\n    destroy_supermatrix(u);\n    destroy_supermatrix(l);\n    destroy_supermatrix(a);\n    destroy_supermatrix(x);\n    \n    return (info == 0);\n    }\n  #else\n    {\n    arma_ignore(X);\n    arma_ignore(A_expr);\n    arma_ignore(B_expr);\n    arma_stop(\"spsolve(): use of SuperLU needs to be enabled\");\n    return false;\n    }\n  #endif\n  }\n\n\n\n#if defined(ARMA_USE_SUPERLU)\n  \n  template<typename eT>\n  inline\n  bool\n  sp_auxlib::convert_to_supermatrix(superlu::SuperMatrix& out, const SpMat<eT>& A)\n    {\n    arma_extra_debug_sigprint();\n    \n    // We store in column-major CSC.\n    out.Stype = superlu::SLU_NC;\n    \n    if(is_float<eT>::value)\n      {\n      out.Dtype = superlu::SLU_S;\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      out.Dtype = superlu::SLU_D;\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      out.Dtype = superlu::SLU_C;\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      out.Dtype = superlu::SLU_Z;\n      }\n    \n    out.Mtype = superlu::SLU_GE; // Just a general matrix.  We don't know more now.\n    \n    // We have to actually create the object which stores the data.\n    // This gets cleaned by destroy_supermatrix().\n    // We have to use SuperLU's stupid memory allocation routines since they are\n    // not guaranteed to be new and delete.  See the comments in superlu_bones.hpp\n    superlu::NCformat* nc = (superlu::NCformat*)superlu::malloc(sizeof(superlu::NCformat));\n    \n    if(nc == NULL)  { return false; }\n    \n    nc->nnz    = A.n_nonzero;\n    nc->nzval  = (void*)          superlu::malloc(sizeof(eT)             * A.n_nonzero   );\n    nc->colptr = (superlu::int_t*)superlu::malloc(sizeof(superlu::int_t) * (A.n_cols + 1));\n    nc->rowind = (superlu::int_t*)superlu::malloc(sizeof(superlu::int_t) * A.n_nonzero   );\n    \n    if( (nc->nzval == NULL) || (nc->colptr == NULL) || (nc->rowind == NULL) )  { return false; }\n    \n    // Fill the matrix.\n    arrayops::copy((eT*) nc->nzval, A.values, A.n_nonzero);\n    \n    // // These have to be copied by hand, because the types may differ.\n    // for (uword i = 0; i <= A.n_cols; ++i)  { nc->colptr[i] = (int_t) A.col_ptrs[i]; }\n    // for (uword i = 0; i < A.n_nonzero; ++i) { nc->rowind[i] = (int_t) A.row_indices[i]; }\n    \n    arrayops::convert(nc->colptr, A.col_ptrs,    A.n_cols+1 );\n    arrayops::convert(nc->rowind, A.row_indices, A.n_nonzero);\n    \n    out.nrow  = A.n_rows;\n    out.ncol  = A.n_cols;\n    out.Store = (void*) nc;\n    \n    return true;\n    }\n  \n  \n  \n  template<typename eT>\n  inline\n  bool\n  sp_auxlib::convert_to_supermatrix(superlu::SuperMatrix& out, const Mat<eT>& A)\n    {\n    arma_extra_debug_sigprint();\n    \n    // This is being stored as a dense matrix.\n    out.Stype = superlu::SLU_DN;\n    \n    if(is_float<eT>::value)\n      {\n      out.Dtype = superlu::SLU_S;\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      out.Dtype = superlu::SLU_D;\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      out.Dtype = superlu::SLU_C;\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      out.Dtype = superlu::SLU_Z;\n      }\n    \n    out.Mtype = superlu::SLU_GE;\n    \n    // We have to create the object that stores the data.\n    superlu::DNformat* dn = (superlu::DNformat*)superlu::malloc(sizeof(superlu::DNformat));\n    \n    if(dn == NULL)  { return false; }\n    \n    dn->lda   = A.n_rows;\n    dn->nzval = (void*) A.memptr();  // re-use memory instead of copying\n    \n    out.nrow  = A.n_rows;\n    out.ncol  = A.n_cols;\n    out.Store = (void*) dn;\n    \n    return true;\n    }\n  \n  \n  \n  inline\n  void\n  sp_auxlib::destroy_supermatrix(superlu::SuperMatrix& out)\n    {\n    arma_extra_debug_sigprint();\n    \n    // Clean up.\n    if(out.Stype == superlu::SLU_NC)\n      {\n      superlu::destroy_compcol_mat(&out);\n      }\n    else\n    if(out.Stype == superlu::SLU_DN)\n      {\n      // superlu::destroy_dense_mat(&out);\n      \n      // since dn->nzval is set to re-use memory from a Mat object (which manages its own memory),\n      // we cannot simply call superlu::destroy_dense_mat().\n      // Only the out.Store structure can be freed.\n      \n      superlu::DNformat* dn = (superlu::DNformat*) out.Store;\n      \n      if(dn != NULL)  { superlu::free(dn); }\n      }\n    else\n    if(out.Stype == superlu::SLU_SC)\n      {\n      superlu::destroy_supernode_mat(&out);\n      }\n    else\n      {\n      // Uh, crap.\n      \n      std::stringstream tmp;\n      \n      tmp << \"sp_auxlib::destroy_supermatrix(): unhandled Stype\" << std::endl;\n      tmp << \"Stype  val: \" << out.Stype << std::endl;\n      tmp << \"Stype name: \";\n      \n      if(out.Stype == superlu::SLU_NC)      { tmp << \"SLU_NC\";     }\n      if(out.Stype == superlu::SLU_NCP)     { tmp << \"SLU_NCP\";    }\n      if(out.Stype == superlu::SLU_NR)      { tmp << \"SLU_NR\";     }\n      if(out.Stype == superlu::SLU_SC)      { tmp << \"SLU_SC\";     }\n      if(out.Stype == superlu::SLU_SCP)     { tmp << \"SLU_SCP\";    }\n      if(out.Stype == superlu::SLU_SR)      { tmp << \"SLU_SR\";     }\n      if(out.Stype == superlu::SLU_DN)      { tmp << \"SLU_DN\";     }\n      if(out.Stype == superlu::SLU_NR_loc)  { tmp << \"SLU_NR_loc\"; }\n      \n      arma_debug_warn(true, tmp.str());\n      arma_bad(\"sp_auxlib::destroy_supermatrix(): internal error\");\n      }\n    }\n  \n#endif\n\n\n\ntemplate<typename eT, typename T, typename T1>\ninline\nvoid\nsp_auxlib::run_aupd\n  (\n  const uword n_eigvals, char* which, const SpProxy<T1>& p, const bool sym,\n  blas_int& n, eT& tol,\n  podarray<T>& resid, blas_int& ncv, podarray<T>& v, blas_int& ldv,\n  podarray<blas_int>& iparam, podarray<blas_int>& ipntr,\n  podarray<T>& workd, podarray<T>& workl, blas_int& lworkl, podarray<eT>& rwork,\n  blas_int& info\n  )\n  {\n  #if defined(ARMA_USE_ARPACK)\n    {\n    // ARPACK provides a \"reverse communication interface\" which is an\n    // entertainingly archaic FORTRAN software engineering technique that\n    // basically means that we call saupd()/naupd() and it tells us with some\n    // return code what we need to do next (usually a matrix-vector product) and\n    // then call it again.  So this results in some type of iterative process\n    // where we call saupd()/naupd() many times.\n    blas_int ido = 0; // This must be 0 for the first call.\n    char bmat = 'I'; // We are considering the standard eigenvalue problem.\n    n = p.get_n_rows(); // The size of the matrix.\n    blas_int nev = n_eigvals;\n    \n    resid.set_size(n);\n    \n    // \"NCV must satisfy the two inequalities 2 <= NCV-NEV and NCV <= N\".\n    // \"It is recommended that NCV >= 2 * NEV\".\n    ncv = 2 + nev;\n    if (ncv < 2 * nev) { ncv = 2 * nev; }\n    if (ncv > n)       { ncv = n; }\n    v.set_size(n * ncv); // Array N by NCV (output).\n    rwork.set_size(ncv); // Work array of size NCV for complex calls.\n    ldv = n; // \"Leading dimension of V exactly as declared in the calling program.\"\n    \n    // IPARAM: integer array of length 11.\n    iparam.zeros(11);\n    iparam(0) = 1; // Exact shifts (not provided by us).\n    iparam(2) = 1000; // Maximum iterations; all the examples use 300, but they were written in the ancient times.\n    iparam(6) = 1; // Mode 1: A * x = lambda * x.\n    \n    // IPNTR: integer array of length 14 (output).\n    ipntr.set_size(14);\n    \n    // Real work array used in the basic Arnoldi iteration for reverse communication.\n    workd.set_size(3 * n);\n    \n    // lworkl must be at least 3 * NCV^2 + 6 * NCV.\n    lworkl = 3 * (ncv * ncv) + 6 * ncv;\n    \n    // Real work array of length lworkl.\n    workl.set_size(lworkl);\n    \n    info = 0; // Set to 0 initially to use random initial vector.\n    \n    // All the parameters have been set or created.  Time to loop a lot.\n    while (ido != 99)\n      {\n      // Call saupd() or naupd() with the current parameters.\n      if(sym)\n        arpack::saupd(&ido, &bmat, &n, which, &nev, &tol, resid.memptr(), &ncv, v.memptr(), &ldv, iparam.memptr(), ipntr.memptr(), workd.memptr(), workl.memptr(), &lworkl, &info);\n      else\n        arpack::naupd(&ido, &bmat, &n, which, &nev, &tol, resid.memptr(), &ncv, v.memptr(), &ldv, iparam.memptr(), ipntr.memptr(), workd.memptr(), workl.memptr(), &lworkl, rwork.memptr(), &info);\n      \n      // What do we do now?\n      switch (ido)\n        {\n        case -1:\n        case 1:\n          {\n          // We need to calculate the matrix-vector multiplication y = OP * x\n          // where x is of length n and starts at workd(ipntr(0)), and y is of\n          // length n and starts at workd(ipntr(1)).\n          \n          // operator*(sp_mat, vec) doesn't properly put the result into the\n          // right place so we'll just reimplement it here for now...\n          \n          // Set the output to point at the right memory.  We have to subtract\n          // one from FORTRAN pointers...\n          Col<T> out(workd.memptr() + ipntr(1) - 1, n, false /* don't copy */);\n          // Set the input to point at the right memory.\n          Col<T> in(workd.memptr() + ipntr(0) - 1, n, false /* don't copy */);\n          \n          out.zeros();\n          typename SpProxy<T1>::const_iterator_type x_it     = p.begin();\n          typename SpProxy<T1>::const_iterator_type x_it_end = p.end();\n          \n          while(x_it != x_it_end)\n            {\n            out[x_it.row()] += (*x_it) * in[x_it.col()];\n            ++x_it;\n            }\n          \n          // No need to modify memory further since it was all done in-place.\n          \n          break;\n          }\n        case 99:\n          // Nothing to do here, things have converged.\n          break;\n        default:\n          {\n          return; // Parent frame can look at the value of info.\n          }\n        }\n      }\n    \n    // The process has ended; check the return code.\n    if( (info != 0) && (info != 1) )\n      {\n      // Print warnings if there was a failure.\n      std::stringstream tmp;\n      \n      if(sym)\n        {\n        tmp << \"eigs_sym(): ARPACK error \" << info << \" in saupd()\";\n        }\n      else\n        {\n        tmp << \"eigs_gen(): ARPACK error \" << info << \" in naupd()\";\n        }\n      \n      arma_debug_warn(true, tmp.str());\n      \n      return; // Parent frame can look at the value of info.\n      }\n    }\n  #else\n    arma_ignore(n_eigvals);\n    arma_ignore(which);\n    arma_ignore(p);\n    arma_ignore(sym);\n    arma_ignore(n);\n    arma_ignore(tol);\n    arma_ignore(resid);\n    arma_ignore(ncv);\n    arma_ignore(v);\n    arma_ignore(ldv);\n    arma_ignore(iparam);\n    arma_ignore(ipntr);\n    arma_ignore(workd);\n    arma_ignore(workl);\n    arma_ignore(lworkl);\n    arma_ignore(rwork);\n    arma_ignore(info);\n  #endif\n  }\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/span.hpp",
    "content": "// Copyright (C) 2010-2012 Conrad Sanderson\n// Copyright (C) 2010-2012 NICTA (www.nicta.com.au)\n// Copyright (C) 2011 Stanislav Funiak\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n//! \\addtogroup span\n//! @{\n\n\nstruct span_alt {};\n\n\ntemplate<typename Dummy = int>\nclass span_base\n  {\n  public:\n  static const span_alt all;\n  };\n\n\ntemplate<typename Dummy>\nconst span_alt span_base<Dummy>::all = span_alt();\n\n\nclass span : public span_base<>\n  {\n  public:\n\n  uword a;\n  uword b;\n  bool  whole;\n  \n  inline\n  span()\n    : whole(true)\n    {\n    }\n  \n  \n  inline\n  span(const span_alt&)\n    : whole(true)\n    {\n    }\n  \n  // TODO:\n  // if the \"explicit\" keyword is removed or commented out,\n  // the compiler will be able to automatically convert integers to an instance of the span class.\n  // this is useful for Cube::operator()(span&, span&, span&),\n  // but it might have unintended consequences or interactions elsewhere.\n  // as such, removal of \"explicit\" needs thorough testing.\n  inline\n  explicit\n  span(const uword in_a)\n    : a(in_a)\n    , b(in_a)\n    , whole(false)\n    {\n    }\n  \n  \n  // the \"explicit\" keyword is required here to prevent a C++11 compiler\n  // automatically converting {a,b} into an instance of span() when submatrices are specified\n  inline\n  explicit\n  span(const uword in_a, const uword in_b)\n    : a(in_a)\n    , b(in_b)\n    , whole(false)\n    {\n    }\n\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spdiagview_bones.hpp",
    "content": "// Copyright (C) 2015 Conrad Sanderson\n// Copyright (C) 2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spdiagview\n//! @{\n\n\n//! Class for storing data required to extract and set the diagonals of a sparse matrix\ntemplate<typename eT>\nclass spdiagview : public Base<eT, spdiagview<eT> >\n  {\n  public:\n  \n  typedef eT                                elem_type;\n  typedef typename get_pod_type<eT>::result pod_type;\n  \n  arma_aligned const SpMat<eT>& m;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  const uword row_offset;\n  const uword col_offset;\n  \n  const uword n_rows;     // equal to n_elem\n  const uword n_elem;\n  \n  static const uword n_cols = 1;\n  \n  \n  protected:\n  \n  arma_inline spdiagview(const SpMat<eT>& in_m, const uword in_row_offset, const uword in_col_offset, const uword len);\n  \n  \n  public:\n  \n  inline ~spdiagview();\n  \n  inline void operator=(const spdiagview& x);\n  \n  inline void operator+=(const eT val);\n  inline void operator-=(const eT val);\n  inline void operator*=(const eT val);\n  inline void operator/=(const eT val);\n  \n  template<typename T1> inline void operator= (const Base<eT,T1>& x);\n  template<typename T1> inline void operator+=(const Base<eT,T1>& x);\n  template<typename T1> inline void operator-=(const Base<eT,T1>& x);\n  template<typename T1> inline void operator%=(const Base<eT,T1>& x);\n  template<typename T1> inline void operator/=(const Base<eT,T1>& x);\n  \n  template<typename T1> inline void operator= (const SpBase<eT,T1>& x);\n  template<typename T1> inline void operator+=(const SpBase<eT,T1>& x);\n  template<typename T1> inline void operator-=(const SpBase<eT,T1>& x);\n  template<typename T1> inline void operator%=(const SpBase<eT,T1>& x);\n  template<typename T1> inline void operator/=(const SpBase<eT,T1>& x);\n  \n  inline eT                      at_alt    (const uword ii) const;\n  \n  inline SpValProxy< SpMat<eT> > operator[](const uword ii);\n  inline eT                      operator[](const uword ii) const;\n  \n  inline SpValProxy< SpMat<eT> >         at(const uword ii);\n  inline eT                              at(const uword ii) const;\n  \n  inline SpValProxy< SpMat<eT> > operator()(const uword ii);\n  inline eT                      operator()(const uword ii) const;\n  \n  inline SpValProxy< SpMat<eT> >         at(const uword in_n_row, const uword);\n  inline eT                              at(const uword in_n_row, const uword) const;\n  \n  inline SpValProxy< SpMat<eT> > operator()(const uword in_n_row, const uword in_n_col);\n  inline eT                      operator()(const uword in_n_row, const uword in_n_col) const;\n  \n  \n  inline void fill(const eT val);\n  inline void zeros();\n  inline void ones();\n  inline void randu();\n  inline void randn();\n    \n  inline static void extract(Mat<eT>& out, const spdiagview& in);\n  \n  \n  private:\n  \n  friend class SpMat<eT>;\n  spdiagview();\n  };\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spdiagview_meat.hpp",
    "content": "// Copyright (C) 2015 Conrad Sanderson\n// Copyright (C) 2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spdiagview\n//! @{\n\n\ntemplate<typename eT>\ninline\nspdiagview<eT>::~spdiagview()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\ntemplate<typename eT>\narma_inline\nspdiagview<eT>::spdiagview(const SpMat<eT>& in_m, const uword in_row_offset, const uword in_col_offset, const uword in_len)\n  : m(in_m)\n  , row_offset(in_row_offset)\n  , col_offset(in_col_offset)\n  , n_rows(in_len)\n  , n_elem(in_len)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\n//! set a diagonal of our matrix using a diagonal from a foreign matrix\ntemplate<typename eT>\ninline\nvoid\nspdiagview<eT>::operator= (const spdiagview<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  spdiagview<eT>& d = *this;\n  \n  arma_debug_check( (d.n_elem != x.n_elem), \"spdiagview: diagonals have incompatible lengths\");\n  \n        SpMat<eT>& d_m = const_cast< SpMat<eT>& >(d.m);\n  const SpMat<eT>& x_m = x.m;\n  \n  if(&d_m != &x_m)\n    {\n    const uword d_n_elem     = d.n_elem;\n    const uword d_row_offset = d.row_offset;\n    const uword d_col_offset = d.col_offset;\n    \n    const uword x_row_offset = x.row_offset;\n    const uword x_col_offset = x.col_offset;\n    \n    for(uword i=0; i < d_n_elem; ++i)\n      {\n      d_m.at(i + d_row_offset, i + d_col_offset) = x_m.at(i + x_row_offset, i + x_col_offset);\n      }\n    }\n  else\n    {\n    const Mat<eT> tmp = x;\n    \n    (*this).operator=(tmp);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nspdiagview<eT>::operator+=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT>& t_m = const_cast< SpMat<eT>& >(m);\n  \n  const uword t_n_elem     = n_elem;\n  const uword t_row_offset = row_offset;\n  const uword t_col_offset = col_offset;\n  \n  for(uword i=0; i < t_n_elem; ++i)\n    {\n    t_m.at(i + t_row_offset, i + t_col_offset) += val;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nspdiagview<eT>::operator-=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT>& t_m = const_cast< SpMat<eT>& >(m);\n  \n  const uword t_n_elem     = n_elem;\n  const uword t_row_offset = row_offset;\n  const uword t_col_offset = col_offset;\n  \n  for(uword i=0; i < t_n_elem; ++i)\n    {\n    t_m.at(i + t_row_offset, i + t_col_offset) -= val;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nspdiagview<eT>::operator*=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT>& t_m = const_cast< SpMat<eT>& >(m);\n  \n  const uword t_n_elem     = n_elem;\n  const uword t_row_offset = row_offset;\n  const uword t_col_offset = col_offset;\n  \n  for(uword i=0; i < t_n_elem; ++i)\n    {\n    t_m.at(i + t_row_offset, i + t_col_offset) *= val;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nspdiagview<eT>::operator/=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT>& t_m = const_cast< SpMat<eT>& >(m);\n  \n  const uword t_n_elem     = n_elem;\n  const uword t_row_offset = row_offset;\n  const uword t_col_offset = col_offset;\n  \n  for(uword i=0; i < t_n_elem; ++i)\n    {\n    t_m.at(i + t_row_offset, i + t_col_offset) /= val;\n    }\n  }\n\n\n\n//! set a diagonal of our matrix using data from a foreign object\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nspdiagview<eT>::operator= (const Base<eT,T1>& o)\n  {\n  arma_extra_debug_sigprint();\n  \n  spdiagview<eT>& d = *this;\n  \n  SpMat<eT>& d_m = const_cast< SpMat<eT>& >(d.m);\n  \n  const uword d_n_elem     = d.n_elem;\n  const uword d_row_offset = d.row_offset;\n  const uword d_col_offset = d.col_offset;\n    \n  const Proxy<T1> P( o.get_ref() );\n  \n  arma_debug_check\n    (\n    ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ),\n    \"spdiagview: given object has incompatible size\"\n    );\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value) || (Proxy<T1>::prefer_at_accessor) )\n    {\n    const unwrap<typename Proxy<T1>::stored_type> tmp(P.Q);\n    const Mat<eT>& x = tmp.M;\n    \n    const eT* x_mem = x.memptr();\n\n    for(uword i=0; i < d_n_elem; ++i)\n      {\n      d_m.at(i + d_row_offset, i + d_col_offset) = x_mem[i];\n      }\n    }\n  else\n    {\n    typename Proxy<T1>::ea_type Pea = P.get_ea();\n      \n    for(uword i=0; i < d_n_elem; ++i)\n      {\n      d_m.at(i + d_row_offset, i + d_col_offset) = Pea[i];\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nspdiagview<eT>::operator+=(const Base<eT,T1>& o)\n  {\n  arma_extra_debug_sigprint();\n  \n  spdiagview<eT>& d = *this;\n  \n  SpMat<eT>& d_m = const_cast< SpMat<eT>& >(d.m);\n  \n  const uword d_n_elem     = d.n_elem;\n  const uword d_row_offset = d.row_offset;\n  const uword d_col_offset = d.col_offset;\n    \n  const Proxy<T1> P( o.get_ref() );\n  \n  arma_debug_check\n    (\n    ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ),\n    \"spdiagview: given object has incompatible size\"\n    );\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value) || (Proxy<T1>::prefer_at_accessor) )\n    {\n    const unwrap<typename Proxy<T1>::stored_type> tmp(P.Q);\n    const Mat<eT>& x = tmp.M;\n    \n    const eT* x_mem = x.memptr();\n\n    for(uword i=0; i < d_n_elem; ++i)\n      {\n      d_m.at(i + d_row_offset, i + d_col_offset) += x_mem[i];\n      }\n    }\n  else\n    {\n    typename Proxy<T1>::ea_type Pea = P.get_ea();\n      \n    for(uword i=0; i < d_n_elem; ++i)\n      {\n      d_m.at(i + d_row_offset, i + d_col_offset) += Pea[i];\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nspdiagview<eT>::operator-=(const Base<eT,T1>& o)\n  {\n  arma_extra_debug_sigprint();\n  \n  spdiagview<eT>& d = *this;\n  \n  SpMat<eT>& d_m = const_cast< SpMat<eT>& >(d.m);\n  \n  const uword d_n_elem     = d.n_elem;\n  const uword d_row_offset = d.row_offset;\n  const uword d_col_offset = d.col_offset;\n    \n  const Proxy<T1> P( o.get_ref() );\n  \n  arma_debug_check\n    (\n    ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ),\n    \"spdiagview: given object has incompatible size\"\n    );\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value) || (Proxy<T1>::prefer_at_accessor) )\n    {\n    const unwrap<typename Proxy<T1>::stored_type> tmp(P.Q);\n    const Mat<eT>& x = tmp.M;\n    \n    const eT* x_mem = x.memptr();\n\n    for(uword i=0; i < d_n_elem; ++i)\n      {\n      d_m.at(i + d_row_offset, i + d_col_offset) -= x_mem[i];\n      }\n    }\n  else\n    {\n    typename Proxy<T1>::ea_type Pea = P.get_ea();\n      \n    for(uword i=0; i < d_n_elem; ++i)\n      {\n      d_m.at(i + d_row_offset, i + d_col_offset) -= Pea[i];\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nspdiagview<eT>::operator%=(const Base<eT,T1>& o)\n  {\n  arma_extra_debug_sigprint();\n  \n  spdiagview<eT>& d = *this;\n  \n  SpMat<eT>& d_m = const_cast< SpMat<eT>& >(d.m);\n  \n  const uword d_n_elem     = d.n_elem;\n  const uword d_row_offset = d.row_offset;\n  const uword d_col_offset = d.col_offset;\n    \n  const Proxy<T1> P( o.get_ref() );\n  \n  arma_debug_check\n    (\n    ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ),\n    \"spdiagview: given object has incompatible size\"\n    );\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value) || (Proxy<T1>::prefer_at_accessor) )\n    {\n    const unwrap<typename Proxy<T1>::stored_type> tmp(P.Q);\n    const Mat<eT>& x = tmp.M;\n    \n    const eT* x_mem = x.memptr();\n\n    for(uword i=0; i < d_n_elem; ++i)\n      {\n      d_m.at(i + d_row_offset, i + d_col_offset) *= x_mem[i];\n      }\n    }\n  else\n    {\n    typename Proxy<T1>::ea_type Pea = P.get_ea();\n      \n    for(uword i=0; i < d_n_elem; ++i)\n      {\n      d_m.at(i + d_row_offset, i + d_col_offset) *= Pea[i];\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nspdiagview<eT>::operator/=(const Base<eT,T1>& o)\n  {\n  arma_extra_debug_sigprint();\n  \n  spdiagview<eT>& d = *this;\n  \n  SpMat<eT>& d_m = const_cast< SpMat<eT>& >(d.m);\n  \n  const uword d_n_elem     = d.n_elem;\n  const uword d_row_offset = d.row_offset;\n  const uword d_col_offset = d.col_offset;\n    \n  const Proxy<T1> P( o.get_ref() );\n  \n  arma_debug_check\n    (\n    ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ),\n    \"spdiagview: given object has incompatible size\"\n    );\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value) || (Proxy<T1>::prefer_at_accessor) )\n    {\n    const unwrap<typename Proxy<T1>::stored_type> tmp(P.Q);\n    const Mat<eT>& x = tmp.M;\n    \n    const eT* x_mem = x.memptr();\n\n    for(uword i=0; i < d_n_elem; ++i)\n      {\n      d_m.at(i + d_row_offset, i + d_col_offset) /= x_mem[i];\n      }\n    }\n  else\n    {\n    typename Proxy<T1>::ea_type Pea = P.get_ea();\n      \n    for(uword i=0; i < d_n_elem; ++i)\n      {\n      d_m.at(i + d_row_offset, i + d_col_offset) /= Pea[i];\n      }\n    }\n  }\n\n\n\n//! set a diagonal of our matrix using data from a foreign object\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nspdiagview<eT>::operator= (const SpBase<eT,T1>& o)\n  {\n  arma_extra_debug_sigprint();\n  \n  spdiagview<eT>& d = *this;\n  \n  SpMat<eT>& d_m = const_cast< SpMat<eT>& >(d.m);\n  \n  const uword d_n_elem     = d.n_elem;\n  const uword d_row_offset = d.row_offset;\n  const uword d_col_offset = d.col_offset;\n  \n  const SpProxy<T1> P( o.get_ref() );\n  \n  arma_debug_check\n    (\n    ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ),\n    \"spdiagview: given object has incompatible size\"\n    );\n  \n  if( SpProxy<T1>::must_use_iterator || P.is_alias(d_m) )\n    {\n    const SpMat<eT> tmp(P.Q);\n    \n    if(tmp.n_cols == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) = tmp.at(i,0); }\n      }\n    else\n    if(tmp.n_rows == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) = tmp.at(0,i); }\n      }\n    }\n  else\n    {\n    if(P.get_n_cols() == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) = P.at(i,0); }\n      }\n    else\n    if(P.get_n_rows() == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) = P.at(0,i); }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nspdiagview<eT>::operator+=(const SpBase<eT,T1>& o)\n  {\n  arma_extra_debug_sigprint();\n  \n  spdiagview<eT>& d = *this;\n  \n  SpMat<eT>& d_m = const_cast< SpMat<eT>& >(d.m);\n  \n  const uword d_n_elem     = d.n_elem;\n  const uword d_row_offset = d.row_offset;\n  const uword d_col_offset = d.col_offset;\n  \n  const SpProxy<T1> P( o.get_ref() );\n  \n  arma_debug_check\n    (\n    ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ),\n    \"spdiagview: given object has incompatible size\"\n    );\n  \n  if( SpProxy<T1>::must_use_iterator || P.is_alias(d_m) )\n    {\n    const SpMat<eT> tmp(P.Q);\n    \n    if(tmp.n_cols == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) += tmp.at(i,0); }\n      }\n    else\n    if(tmp.n_rows == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) += tmp.at(0,i); }\n      }\n    }\n  else\n    {\n    if(P.get_n_cols() == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) += P.at(i,0); }\n      }\n    else\n    if(P.get_n_rows() == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) += P.at(0,i); }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nspdiagview<eT>::operator-=(const SpBase<eT,T1>& o)\n  {\n  arma_extra_debug_sigprint();\n  \n  spdiagview<eT>& d = *this;\n  \n  SpMat<eT>& d_m = const_cast< SpMat<eT>& >(d.m);\n  \n  const uword d_n_elem     = d.n_elem;\n  const uword d_row_offset = d.row_offset;\n  const uword d_col_offset = d.col_offset;\n  \n  const SpProxy<T1> P( o.get_ref() );\n  \n  arma_debug_check\n    (\n    ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ),\n    \"spdiagview: given object has incompatible size\"\n    );\n  \n  if( SpProxy<T1>::must_use_iterator || P.is_alias(d_m) )\n    {\n    const SpMat<eT> tmp(P.Q);\n    \n    if(tmp.n_cols == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) -= tmp.at(i,0); }\n      }\n    else\n    if(tmp.n_rows == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) -= tmp.at(0,i); }\n      }\n    }\n  else\n    {\n    if(P.get_n_cols() == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) -= P.at(i,0); }\n      }\n    else\n    if(P.get_n_rows() == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) -= P.at(0,i); }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nspdiagview<eT>::operator%=(const SpBase<eT,T1>& o)\n  {\n  arma_extra_debug_sigprint();\n  \n  spdiagview<eT>& d = *this;\n  \n  SpMat<eT>& d_m = const_cast< SpMat<eT>& >(d.m);\n  \n  const uword d_n_elem     = d.n_elem;\n  const uword d_row_offset = d.row_offset;\n  const uword d_col_offset = d.col_offset;\n  \n  const SpProxy<T1> P( o.get_ref() );\n  \n  arma_debug_check\n    (\n    ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ),\n    \"spdiagview: given object has incompatible size\"\n    );\n  \n  if( SpProxy<T1>::must_use_iterator || P.is_alias(d_m) )\n    {\n    const SpMat<eT> tmp(P.Q);\n    \n    if(tmp.n_cols == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) *= tmp.at(i,0); }\n      }\n    else\n    if(tmp.n_rows == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) *= tmp.at(0,i); }\n      }\n    }\n  else\n    {\n    if(P.get_n_cols() == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) *= P.at(i,0); }\n      }\n    else\n    if(P.get_n_rows() == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) *= P.at(0,i); }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nspdiagview<eT>::operator/=(const SpBase<eT,T1>& o)\n  {\n  arma_extra_debug_sigprint();\n  \n  spdiagview<eT>& d = *this;\n  \n  SpMat<eT>& d_m = const_cast< SpMat<eT>& >(d.m);\n  \n  const uword d_n_elem     = d.n_elem;\n  const uword d_row_offset = d.row_offset;\n  const uword d_col_offset = d.col_offset;\n  \n  const SpProxy<T1> P( o.get_ref() );\n  \n  arma_debug_check\n    (\n    ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ),\n    \"spdiagview: given object has incompatible size\"\n    );\n  \n  if( SpProxy<T1>::must_use_iterator || P.is_alias(d_m) )\n    {\n    const SpMat<eT> tmp(P.Q);\n    \n    if(tmp.n_cols == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) /= tmp.at(i,0); }\n      }\n    else\n    if(tmp.n_rows == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) /= tmp.at(0,i); }\n      }\n    }\n  else\n    {\n    if(P.get_n_cols() == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) /= P.at(i,0); }\n      }\n    else\n    if(P.get_n_rows() == 1)\n      {\n      for(uword i=0; i < d_n_elem; ++i)  { d_m.at(i + d_row_offset, i + d_col_offset) /= P.at(0,i); }\n      }\n    }\n  }\n\n\n\n//! extract a diagonal and store it as a dense column vector\ntemplate<typename eT>\ninline\nvoid\nspdiagview<eT>::extract(Mat<eT>& out, const spdiagview<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  // NOTE: we're assuming that the 'out' matrix has already been set to the correct size;\n  // size setting is done by either the Mat contructor or Mat::operator=()\n  \n  const SpMat<eT>& in_m = in.m;\n  \n  const uword in_n_elem     = in.n_elem;\n  const uword in_row_offset = in.row_offset;\n  const uword in_col_offset = in.col_offset;\n  \n  eT* out_mem = out.memptr();\n  \n  for(uword i=0; i < in_n_elem; ++i)\n    {\n    out_mem[i] = in_m.at(i + in_row_offset, i + in_col_offset );\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nspdiagview<eT>::at_alt(const uword i) const\n  {\n  return m.at(i+row_offset, i+col_offset);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpValProxy< SpMat<eT> >\nspdiagview<eT>::operator[](const uword i)\n  {\n  return (const_cast< SpMat<eT>& >(m)).at(i+row_offset, i+col_offset);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nspdiagview<eT>::operator[](const uword i) const\n  {\n  return m.at(i+row_offset, i+col_offset);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpValProxy< SpMat<eT> >\nspdiagview<eT>::at(const uword i)\n  {\n  return (const_cast< SpMat<eT>& >(m)).at(i+row_offset, i+col_offset);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nspdiagview<eT>::at(const uword i) const\n  {\n  return m.at(i+row_offset, i+col_offset);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpValProxy< SpMat<eT> >\nspdiagview<eT>::operator()(const uword i)\n  {\n  arma_debug_check( (i >= n_elem), \"spdiagview::operator(): out of bounds\" );\n  \n  return (const_cast< SpMat<eT>& >(m)).at(i+row_offset, i+col_offset);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nspdiagview<eT>::operator()(const uword i) const\n  {\n  arma_debug_check( (i >= n_elem), \"spdiagview::operator(): out of bounds\" );\n  \n  return m.at(i+row_offset, i+col_offset);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpValProxy< SpMat<eT> >\nspdiagview<eT>::at(const uword row, const uword)\n  {\n  return (const_cast< SpMat<eT>& >(m)).at(row+row_offset, row+col_offset);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nspdiagview<eT>::at(const uword row, const uword) const\n  {\n  return m.at(row+row_offset, row+col_offset);\n  }\n\n\n\ntemplate<typename eT>\ninline\nSpValProxy< SpMat<eT> >\nspdiagview<eT>::operator()(const uword row, const uword col)\n  {\n  arma_debug_check( ((row >= n_elem) || (col > 0)), \"spdiagview::operator(): out of bounds\" );\n  \n  return (const_cast< SpMat<eT>& >(m)).at(row+row_offset, row+col_offset);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nspdiagview<eT>::operator()(const uword row, const uword col) const\n  {\n  arma_debug_check( ((row >= n_elem) || (col > 0)), \"spdiagview::operator(): out of bounds\" );\n  \n  return m.at(row+row_offset, row+col_offset);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nspdiagview<eT>::fill(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT>& x = const_cast< SpMat<eT>& >(m);\n  \n  const uword local_n_elem = n_elem;\n  \n  for(uword i=0; i < local_n_elem; ++i)\n    {\n    x.at(i+row_offset, i+col_offset) = val;\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nspdiagview<eT>::zeros()\n  {\n  arma_extra_debug_sigprint();\n  \n  (*this).fill(eT(0));\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nspdiagview<eT>::ones()\n  {\n  arma_extra_debug_sigprint();\n  \n  (*this).fill(eT(1));\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nspdiagview<eT>::randu()\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT>& x = const_cast< SpMat<eT>& >(m);\n  \n  const uword local_n_elem = n_elem;\n  \n  for(uword i=0; i < local_n_elem; ++i)\n    {\n    x.at(i+row_offset, i+col_offset) = eT(arma_rng::randu<eT>());\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nspdiagview<eT>::randn()\n  {\n  arma_extra_debug_sigprint();\n  \n  SpMat<eT>& x = const_cast< SpMat<eT>& >(m);\n  \n  const uword local_n_elem = n_elem;\n  \n  for(uword i=0; i < local_n_elem; ++i)\n    {\n    x.at(i+row_offset, i+col_offset) = eT(arma_rng::randn<eT>());\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spglue_join_bones.hpp",
    "content": "// Copyright (C) 2015 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spglue_join\n//! @{\n\n\n\nclass spglue_join_cols\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_join_cols>& X);\n  \n  template<typename eT>\n  inline static void apply_noalias(SpMat<eT>& out, const SpMat<eT>& A, const SpMat<eT>& B);\n  };\n\n\n\nclass spglue_join_rows\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_join_rows>& X);\n  \n  template<typename eT>\n  inline static void apply_noalias(SpMat<eT>& out, const SpMat<eT>& A, const SpMat<eT>& B);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spglue_join_meat.hpp",
    "content": "// Copyright (C) 2015 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spglue_join\n//! @{\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nspglue_join_cols::apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_join_cols>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_spmat<T1> A_tmp(X.A);\n  const unwrap_spmat<T2> B_tmp(X.B);\n  \n  const SpMat<eT>& A = A_tmp.M;\n  const SpMat<eT>& B = B_tmp.M;\n  \n  if( (&out != &A) && (&out != &B) )\n    {\n    spglue_join_cols::apply_noalias(out, A, B);\n    }\n  else\n    {\n    SpMat<eT> tmp;\n    \n    spglue_join_cols::apply_noalias(tmp, A, B);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nspglue_join_cols::apply_noalias(SpMat<eT>& out, const SpMat<eT>& A, const SpMat<eT>& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword A_n_rows = A.n_rows;\n  const uword A_n_cols = A.n_cols;\n  \n  const uword B_n_rows = B.n_rows;\n  const uword B_n_cols = B.n_cols;\n  \n  arma_debug_check\n    (\n    ( (A_n_cols != B_n_cols) && ( (A_n_rows > 0) || (A_n_cols > 0) ) && ( (B_n_rows > 0) || (B_n_cols > 0) ) ),\n    \"join_cols() / join_vert(): number of columns must be the same\"\n    );\n  \n  out.set_size( A_n_rows + B_n_rows, (std::max)(A_n_cols, B_n_cols) );\n  \n  if( out.n_elem > 0 )\n    {\n    if(A.is_empty() == false)\n      { \n      out.submat(0,        0,   A_n_rows-1, out.n_cols-1) = A;\n      }\n    \n    if(B.is_empty() == false)\n      {\n      out.submat(A_n_rows, 0, out.n_rows-1, out.n_cols-1) = B;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nspglue_join_rows::apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_join_rows>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_spmat<T1> A_tmp(X.A);\n  const unwrap_spmat<T2> B_tmp(X.B);\n  \n  const SpMat<eT>& A = A_tmp.M;\n  const SpMat<eT>& B = B_tmp.M;\n  \n  if( (&out != &A) && (&out != &B) )\n    {\n    spglue_join_rows::apply_noalias(out, A, B);\n    }\n  else\n    {\n    SpMat<eT> tmp;\n    \n    spglue_join_rows::apply_noalias(tmp, A, B);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nspglue_join_rows::apply_noalias(SpMat<eT>& out, const SpMat<eT>& A, const SpMat<eT>& B)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword A_n_rows = A.n_rows;\n  const uword A_n_cols = A.n_cols;\n  \n  const uword B_n_rows = B.n_rows;\n  const uword B_n_cols = B.n_cols;\n  \n  arma_debug_check\n    (\n    ( (A_n_rows != B.n_rows) && ( (A_n_rows > 0) || (A_n_cols > 0) ) && ( (B_n_rows > 0) || (B_n_cols > 0) ) ),\n    \"join_rows() / join_horiz(): number of rows must be the same\"\n    );\n  \n  out.set_size( (std::max)(A_n_rows, B_n_rows), A_n_cols + B_n_cols );\n  \n  if( out.n_elem > 0 )\n    {\n    if(A.is_empty() == false)\n      {\n      out.submat(0, 0,        out.n_rows-1,   A.n_cols-1) = A;\n      }\n    \n    if(B.is_empty() == false)\n      {\n      out.submat(0, A_n_cols, out.n_rows-1, out.n_cols-1) = B;\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spglue_minus_bones.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spglue_minus\n//! @{\n\n\n\nclass spglue_minus\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  arma_hot inline static void apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_minus>& X);\n  \n  template<typename eT, typename T1, typename T2>\n  arma_hot inline static void apply_noalias(SpMat<eT>& result, const SpProxy<T1>& pa, const SpProxy<T2>& pb);\n  };\n\n\n\nclass spglue_minus2\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  arma_hot inline static void apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_minus2>& X);\n  };\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spglue_minus_meat.hpp",
    "content": "// Copyright (C) 2012-2014 Ryan Curtin\n// Copyright (C) 2012-2014 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spglue_minus\n//! @{\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\nspglue_minus::apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_minus>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const SpProxy<T1> pa(X.A);\n  const SpProxy<T2> pb(X.B);\n  \n  const bool is_alias = pa.is_alias(out) || pb.is_alias(out);\n  \n  if(is_alias == false)\n    {\n    spglue_minus::apply_noalias(out, pa, pb);\n    }\n  else\n    {\n    SpMat<eT> tmp;\n    spglue_minus::apply_noalias(tmp, pa, pb);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\narma_hot\ninline\nvoid\nspglue_minus::apply_noalias(SpMat<eT>& result, const SpProxy<T1>& pa, const SpProxy<T2>& pb)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), \"subtraction\");\n  \n  if( (pa.get_n_nonzero() != 0) && (pb.get_n_nonzero() != 0) )\n    {\n    result.zeros(pa.get_n_rows(), pa.get_n_cols());\n    \n    // Resize memory to correct size.\n    result.mem_resize(n_unique(pa, pb, op_n_unique_sub()));\n    \n    // Now iterate across both matrices.\n    typename SpProxy<T1>::const_iterator_type x_it = pa.begin();\n    typename SpProxy<T2>::const_iterator_type y_it = pb.begin();\n    \n    typename SpProxy<T1>::const_iterator_type x_end = pa.end();\n    typename SpProxy<T2>::const_iterator_type y_end = pb.end();\n    \n    uword cur_val = 0;\n    while((x_it != x_end) || (y_it != y_end))\n      {\n      if(x_it == y_it)\n        {\n        const eT val = (*x_it) - (*y_it);\n        \n        if(val != eT(0))\n          {\n          access::rw(result.values[cur_val]) = val;\n          access::rw(result.row_indices[cur_val]) = x_it.row();\n          ++access::rw(result.col_ptrs[x_it.col() + 1]);\n          ++cur_val;\n          }\n        \n        ++x_it;\n        ++y_it;\n        }\n      else\n        {\n        const uword x_it_row = x_it.row();\n        const uword x_it_col = x_it.col();\n        \n        const uword y_it_row = y_it.row();\n        const uword y_it_col = y_it.col();\n        \n        if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end\n          {\n          const eT val = (*x_it);\n          \n          if(val != eT(0))\n            {\n            access::rw(result.values[cur_val]) = val;\n            access::rw(result.row_indices[cur_val]) = x_it_row;\n            ++access::rw(result.col_ptrs[x_it_col + 1]);\n            ++cur_val;\n            }\n            \n          ++x_it;\n          }\n        else\n          {\n          const eT val = (*y_it);\n          \n          if(val != eT(0))\n            {\n            access::rw(result.values[cur_val]) = -(val);  // take the negative\n            access::rw(result.row_indices[cur_val]) = y_it_row;\n            ++access::rw(result.col_ptrs[y_it_col + 1]);\n            ++cur_val;\n            }\n          \n          ++y_it;\n          }\n        }\n      }\n    \n    // Fix column pointers to be cumulative.\n    for(uword c = 1; c <= result.n_cols; ++c)\n      {\n      access::rw(result.col_ptrs[c]) += result.col_ptrs[c - 1];\n      }\n    }\n  else\n    {\n    if(pa.get_n_nonzero() == 0)\n      {\n      result = pb.Q;\n      result *= eT(-1);\n      \n      return;\n      }\n    \n    if(pb.get_n_nonzero() == 0)\n      {\n      result = pa.Q;\n      return;\n      }\n    }\n  }\n\n\n\n//\n//\n// spglue_minus2: scalar*(A - B)\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\nspglue_minus2::apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_minus2>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const SpProxy<T1> pa(X.A);\n  const SpProxy<T2> pb(X.B);\n  \n  const bool is_alias = pa.is_alias(out) || pb.is_alias(out);\n  \n  if(is_alias == false)\n    {\n    spglue_minus::apply_noalias(out, pa, pb);\n    }\n  else\n    {\n    SpMat<eT> tmp;\n    spglue_minus::apply_noalias(tmp, pa, pb);\n    \n    out.steal_mem(tmp);\n    }\n  \n  out *= X.aux;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spglue_plus_bones.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spglue_plus\n//! @{\n\n\n\nclass spglue_plus\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  arma_hot inline static void apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_plus>& X);\n  \n  template<typename eT, typename T1, typename T2>\n  arma_hot inline static void apply_noalias(SpMat<eT>& out, const SpProxy<T1>& pa, const SpProxy<T2>& pb);\n  };\n\n\n\nclass spglue_plus2\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  arma_hot inline static void apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_plus2>& X);\n  };\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spglue_plus_meat.hpp",
    "content": "// Copyright (C) 2012-2014 Ryan Curtin\n// Copyright (C) 2012-2014 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spglue_plus\n//! @{\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\nspglue_plus::apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_plus>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const SpProxy<T1> pa(X.A);\n  const SpProxy<T2> pb(X.B);\n  \n  const bool is_alias = pa.is_alias(out) || pb.is_alias(out);\n  \n  if(is_alias == false)\n    {\n    spglue_plus::apply_noalias(out, pa, pb);\n    }\n  else\n    {\n    SpMat<eT> tmp;\n    spglue_plus::apply_noalias(tmp, pa, pb);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\narma_hot\ninline\nvoid\nspglue_plus::apply_noalias(SpMat<eT>& out, const SpProxy<T1>& pa, const SpProxy<T2>& pb)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), \"addition\");\n  \n  if( (pa.get_n_nonzero() != 0) && (pb.get_n_nonzero() != 0) )\n    {\n    out.zeros(pa.get_n_rows(), pa.get_n_cols());\n    \n    // Resize memory to correct size.\n    out.mem_resize(n_unique(pa, pb, op_n_unique_add()));\n    \n    // Now iterate across both matrices.\n    typename SpProxy<T1>::const_iterator_type x_it = pa.begin();\n    typename SpProxy<T2>::const_iterator_type y_it = pb.begin();\n    \n    typename SpProxy<T1>::const_iterator_type x_end = pa.end();\n    typename SpProxy<T2>::const_iterator_type y_end = pb.end();\n    \n    uword cur_val = 0;\n    while( (x_it != x_end) || (y_it != y_end) )\n      {\n      if(x_it == y_it)\n        {\n        const eT val = (*x_it) + (*y_it);\n        \n        if(val != eT(0))\n          {\n          access::rw(out.values[cur_val]) = val;\n          access::rw(out.row_indices[cur_val]) = x_it.row();\n          ++access::rw(out.col_ptrs[x_it.col() + 1]);\n          ++cur_val;\n          }\n        \n        ++x_it;\n        ++y_it;\n        }\n      else\n        {\n        const uword x_it_row = x_it.row();\n        const uword x_it_col = x_it.col();\n        \n        const uword y_it_row = y_it.row();\n        const uword y_it_col = y_it.col();\n        \n        if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end\n          {\n          const eT val = (*x_it);\n          \n          if(val != eT(0))\n            {\n            access::rw(out.values[cur_val]) = val;\n            access::rw(out.row_indices[cur_val]) = x_it_row;\n            ++access::rw(out.col_ptrs[x_it_col + 1]);\n            ++cur_val;\n            }\n          \n          ++x_it;\n          }\n        else\n          {\n          const eT val = (*y_it);\n          \n          if(val != eT(0))\n            {\n            access::rw(out.values[cur_val]) = val;\n            access::rw(out.row_indices[cur_val]) = y_it_row;\n            ++access::rw(out.col_ptrs[y_it_col + 1]);\n            ++cur_val;\n            }\n          \n          ++y_it;\n          }\n        }\n      }\n    \n    const uword out_n_cols = out.n_cols;\n    \n    uword* col_ptrs = access::rwp(out.col_ptrs);\n    \n    // Fix column pointers to be cumulative.\n    for(uword c = 1; c <= out_n_cols; ++c)\n      {\n      col_ptrs[c] += col_ptrs[c - 1];\n      }\n    }\n  else\n    {\n    if(pa.get_n_nonzero() == 0)\n      {\n      out = pb.Q;\n      return;\n      }\n    \n    if(pb.get_n_nonzero() == 0)\n      {\n      out = pa.Q;\n      return;\n      }\n    }\n  }\n\n\n\n//\n//\n// spglue_plus2: scalar*(A + B)\n\n\n\ntemplate<typename T1, typename T2>\narma_hot\ninline\nvoid\nspglue_plus2::apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_plus2>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const SpProxy<T1> pa(X.A);\n  const SpProxy<T2> pb(X.B);\n  \n  const bool is_alias = pa.is_alias(out) || pb.is_alias(out);\n  \n  if(is_alias == false)\n    {\n    spglue_plus::apply_noalias(out, pa, pb);\n    }\n  else\n    {\n    SpMat<eT> tmp;\n    spglue_plus::apply_noalias(tmp, pa, pb);\n    \n    out.steal_mem(tmp);\n    }\n  \n  out *= X.aux;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spglue_times_bones.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spglue_times\n//! @{\n\n\n\nclass spglue_times\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_times>& X);\n  \n  template<typename eT, typename T1, typename T2>\n  arma_hot inline static void apply_noalias(SpMat<eT>& c, const SpProxy<T1>& pa, const SpProxy<T2>& pb);\n  };\n\n\n\nclass spglue_times2\n  {\n  public:\n  \n  template<typename T1, typename T2>\n  inline static void apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_times2>& X);\n  };\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spglue_times_meat.hpp",
    "content": "// Copyright (C) 2012 Ryan Curtin\n// Copyright (C) 2012-2015 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spglue_times\n//! @{\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nspglue_times::apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_times>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  // unconditionally unwrapping, as the column iterator in SpSubview is slow\n  \n  const unwrap_spmat<T1> tmp1(X.A);\n  const unwrap_spmat<T2> tmp2(X.B);\n  \n  const SpProxy<typename unwrap_spmat<T1>::stored_type> pa(tmp1.M);\n  const SpProxy<typename unwrap_spmat<T2>::stored_type> pb(tmp2.M);\n  \n  const bool is_alias = pa.is_alias(out) || pb.is_alias(out);\n  \n  if(is_alias == false)\n    {\n    spglue_times::apply_noalias(out, pa, pb);\n    }\n  else\n    {\n    SpMat<eT> tmp;\n    spglue_times::apply_noalias(tmp, pa, pb);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\narma_hot\ninline\nvoid\nspglue_times::apply_noalias(SpMat<eT>& c, const SpProxy<T1>& pa, const SpProxy<T2>& pb)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword x_n_rows = pa.get_n_rows();\n  const uword x_n_cols = pa.get_n_cols();\n  const uword y_n_rows = pb.get_n_rows();\n  const uword y_n_cols = pb.get_n_cols();\n\n  arma_debug_assert_mul_size(x_n_rows, x_n_cols, y_n_rows, y_n_cols, \"matrix multiplication\");\n\n  // First we must determine the structure of the new matrix (column pointers).\n  // This follows the algorithm described in 'Sparse Matrix Multiplication\n  // Package (SMMP)' (R.E. Bank and C.C. Douglas, 2001).  Their description of\n  // \"SYMBMM\" does not include anything about memory allocation.  In addition it\n  // does not consider that there may be elements which space may be allocated\n  // for but which evaluate to zero anyway.  So we have to modify the algorithm\n  // to work that way.  For the \"SYMBMM\" implementation we will not determine\n  // the row indices but instead just the column pointers.\n  \n  //SpMat<typename T1::elem_type> c(x_n_rows, y_n_cols); // Initializes col_ptrs to 0.\n  c.zeros(x_n_rows, y_n_cols);\n  \n  //if( (pa.get_n_elem() == 0) || (pb.get_n_elem() == 0) )\n  if( (pa.get_n_nonzero() == 0) || (pb.get_n_nonzero() == 0) )\n    {\n    return;\n    }\n  \n  // Auxiliary storage which denotes when items have been found.\n  podarray<uword> index(x_n_rows);\n  index.fill(x_n_rows); // Fill with invalid links.\n  \n  typename SpProxy<T2>::const_iterator_type y_it  = pb.begin();\n  typename SpProxy<T2>::const_iterator_type y_end = pb.end();\n\n  // SYMBMM: calculate column pointers for resultant matrix to obtain a good\n  // upper bound on the number of nonzero elements.\n  uword cur_col_length = 0;\n  uword last_ind = x_n_rows + 1;\n  do\n    {\n    const uword y_it_row = y_it.row();\n    \n    // Look through the column that this point (*y_it) could affect.\n    typename SpProxy<T1>::const_iterator_type x_it = pa.begin_col(y_it_row);\n    \n    while(x_it.col() == y_it_row)\n      {\n      // A point at x(i, j) and y(j, k) implies a point at c(i, k).\n      if(index[x_it.row()] == x_n_rows)\n        {\n        index[x_it.row()] = last_ind;\n        last_ind = x_it.row();\n        ++cur_col_length;\n        }\n\n      ++x_it;\n      }\n\n    const uword old_col = y_it.col();\n    ++y_it;\n\n    // See if column incremented.\n    if(old_col != y_it.col())\n      {\n      // Set column pointer (this is not a cumulative count; that is done later).\n      access::rw(c.col_ptrs[old_col + 1]) = cur_col_length;\n      cur_col_length = 0;\n\n      // Return index markers to zero.  Use last_ind for traversal.\n      while(last_ind != x_n_rows + 1)\n        {\n        const uword tmp = index[last_ind];\n        index[last_ind] = x_n_rows;\n        last_ind = tmp;\n        }\n      }\n    }\n  while(y_it != y_end);\n\n  // Accumulate column pointers.\n  for(uword i = 0; i < c.n_cols; ++i)\n    {\n    access::rw(c.col_ptrs[i + 1]) += c.col_ptrs[i];\n    }\n\n  // Now that we know a decent bound on the number of nonzero elements, allocate\n  // the memory and fill it.\n  c.mem_resize(c.col_ptrs[c.n_cols]);\n\n  // Now the implementation of the NUMBMM algorithm.\n  uword cur_pos = 0; // Current position in c matrix.\n  podarray<eT> sums(x_n_rows); // Partial sums.\n  sums.zeros();\n  \n  // setting the size of 'sorted_indices' to x_n_rows is a better-than-nothing guess;\n  // the correct minimum size is determined later\n  podarray<uword> sorted_indices(x_n_rows);\n  \n  // last_ind is already set to x_n_rows, and cur_col_length is already set to 0.\n  // We will loop through all columns as necessary.\n  uword cur_col = 0;\n  while(cur_col < c.n_cols)\n    {\n    // Skip to next column with elements in it.\n    while((cur_col < c.n_cols) && (c.col_ptrs[cur_col] == c.col_ptrs[cur_col + 1]))\n      {\n      // Update current column pointer to actual number of nonzero elements up\n      // to this point.\n      access::rw(c.col_ptrs[cur_col]) = cur_pos;\n      ++cur_col;\n      }\n\n    if(cur_col == c.n_cols)\n      {\n      break;\n      }\n\n    // Update current column pointer.\n    access::rw(c.col_ptrs[cur_col]) = cur_pos;\n\n    // Check all elements in this column.\n    typename SpProxy<T2>::const_iterator_type y_col_it = pb.begin_col(cur_col);\n    \n    while(y_col_it.col() == cur_col)\n      {\n      // Check all elements in the column of the other matrix corresponding to\n      // the row of this column.\n      typename SpProxy<T1>::const_iterator_type x_col_it = pa.begin_col(y_col_it.row());\n\n      const eT y_value = (*y_col_it);\n\n      while(x_col_it.col() == y_col_it.row())\n        {\n        // A point at x(i, j) and y(j, k) implies a point at c(i, k).\n        // Add to partial sum.\n        const eT x_value = (*x_col_it);\n        sums[x_col_it.row()] += (x_value * y_value);\n\n        // Add point if it hasn't already been marked.\n        if(index[x_col_it.row()] == x_n_rows)\n          {\n          index[x_col_it.row()] = last_ind;\n          last_ind = x_col_it.row();\n          }\n\n        ++x_col_it;\n        }\n\n      ++y_col_it;\n      }\n\n    // Now sort the indices that were used in this column.\n    //podarray<uword> sorted_indices(c.col_ptrs[cur_col + 1] - c.col_ptrs[cur_col]);\n    sorted_indices.set_min_size(c.col_ptrs[cur_col + 1] - c.col_ptrs[cur_col]);\n    \n    // .set_min_size() can only enlarge the array to the specified size,\n    // hence if we request a smaller size than already allocated,\n    // no new memory allocation is done\n    \n    \n    uword cur_index = 0;\n    while(last_ind != x_n_rows + 1)\n      {\n      const uword tmp = last_ind;\n\n      // Check that it wasn't a \"fake\" nonzero element.\n      if(sums[tmp] != eT(0))\n        {\n        // Assign to next open position.\n        sorted_indices[cur_index] = tmp;\n        ++cur_index;\n        }\n\n      last_ind = index[tmp];\n      index[tmp] = x_n_rows;\n      }\n\n    // Now sort the indices.\n    if (cur_index != 0)\n      {\n      op_sort::direct_sort_ascending(sorted_indices.memptr(), cur_index);\n\n      for(uword k = 0; k < cur_index; ++k)\n        {\n        const uword row = sorted_indices[k];\n        access::rw(c.row_indices[cur_pos]) = row;\n        access::rw(c.values[cur_pos]) = sums[row];\n        sums[row] = eT(0);\n        ++cur_pos;\n        }\n      }\n\n    // Move to next column.\n    ++cur_col;\n    }\n\n  // Update last column pointer and resize to actual memory size.\n  access::rw(c.col_ptrs[c.n_cols]) = cur_pos;\n  c.mem_resize(cur_pos);\n  }\n\n\n\n//\n//\n// spglue_times2: scalar*(A * B)\n\n\n\ntemplate<typename T1, typename T2>\ninline\nvoid\nspglue_times2::apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_times2>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const SpProxy<T1> pa(X.A);\n  const SpProxy<T2> pb(X.B);\n  \n  const bool is_alias = pa.is_alias(out) || pb.is_alias(out);\n  \n  if(is_alias == false)\n    {\n    spglue_times::apply_noalias(out, pa, pb);\n    }\n  else\n    {\n    SpMat<eT> tmp;\n    spglue_times::apply_noalias(tmp, pa, pb);\n    \n    out.steal_mem(tmp);\n    }\n  \n  out *= X.aux;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spop_htrans_bones.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spop_htrans\n//! @{\n\n\n//! hermitian transpose operation for sparse matrices\n\nclass spop_htrans\n  {\n  public:\n  \n  template<typename T1>\n  arma_hot inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1,spop_htrans>& in, const typename arma_not_cx<typename T1::elem_type>::result* junk = 0);\n  \n  template<typename T1>\n  arma_hot inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1,spop_htrans>& in, const typename arma_cx_only<typename T1::elem_type>::result* junk = 0);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spop_htrans_meat.hpp",
    "content": "// Copyright (C) 2012-2014 Ryan Curtin\n// Copyright (C) 2012-2014 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spop_htrans\n//! @{\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nspop_htrans::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1,spop_htrans>& in, const typename arma_not_cx<typename T1::elem_type>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  spop_strans::apply(out, in);\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nspop_htrans::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1,spop_htrans>& in, const typename arma_cx_only<typename T1::elem_type>::result* junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename   T1::elem_type  eT;\n  typedef typename umat::elem_type ueT;\n  \n  const SpProxy<T1> p(in.m);\n  \n  const uword N = p.get_n_nonzero();\n  \n  if(N == uword(0))\n    {\n    out.zeros(p.get_n_cols(), p.get_n_rows());\n    return;\n    }\n  \n  umat locs(2, N);\n  \n  Col<eT> vals(N);\n  \n  eT* vals_ptr = vals.memptr();\n  \n  typename SpProxy<T1>::const_iterator_type it = p.begin();\n  \n  for(uword count = 0; count < N; ++count)\n    {\n    ueT* locs_ptr = locs.colptr(count);\n    \n    locs_ptr[0] = it.col();\n    locs_ptr[1] = it.row();\n    \n    vals_ptr[count] = std::conj(*it);\n    \n    ++it;\n    }\n  \n  SpMat<eT> tmp(locs, vals, p.get_n_cols(), p.get_n_rows());\n  \n  out.steal_mem(tmp);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spop_max_bones.hpp",
    "content": "// Copyright (C) 2012-2015 Conrad Sanderson\n// Copyright (C) 2012-2014 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spop_max\n//! @{\n\n\nclass spop_max\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_max>& in);\n  \n  //\n  \n  template<typename T1>\n  inline static void apply_proxy(SpMat<typename T1::elem_type>& out, const SpProxy<T1>& p, const uword dim, const typename arma_not_cx<typename T1::elem_type>::result* junk = 0);\n  \n  template<typename T1>\n  inline static typename T1::elem_type vector_max(const T1& X, const typename arma_not_cx<typename T1::elem_type>::result* junk = 0);\n  \n  template<typename T1>\n  inline static typename arma_not_cx<typename T1::elem_type>::result max(const SpBase<typename T1::elem_type, T1>& X);\n  \n  template<typename T1>\n  inline static typename arma_not_cx<typename T1::elem_type>::result max_with_index(const SpProxy<T1>& P, uword& index_of_max_val);\n  \n  //\n  \n  template<typename T1>\n  inline static void apply_proxy(SpMat<typename T1::elem_type>& out, const SpProxy<T1>& p, const uword dim, const typename arma_cx_only<typename T1::elem_type>::result* junk = 0);\n  \n  template<typename T1>\n  inline static typename T1::elem_type vector_max(const T1& X, const typename arma_cx_only<typename T1::elem_type>::result* junk = 0);\n  \n  template<typename T1>\n  inline static typename arma_cx_only<typename T1::elem_type>::result max(const SpBase<typename T1::elem_type, T1>& X);\n  \n  template<typename T1>\n  inline static typename arma_cx_only<typename T1::elem_type>::result max_with_index(const SpProxy<T1>& P, uword& index_of_max_val);\n  };\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spop_max_meat.hpp",
    "content": "// Copyright (C) 2012-2014 Ryan Curtin\n// Copyright (C) 2012-2015 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spop_max\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_max::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1,spop_max>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword dim = in.aux_uword_a;\n  arma_debug_check( (dim > 1), \"max(): parameter 'dim' must be 0 or 1\" );\n  \n  const SpProxy<T1> p(in.m);\n  \n  const uword p_n_rows = p.get_n_rows();\n  const uword p_n_cols = p.get_n_cols();\n  \n  if( (p_n_rows == 0) || (p_n_cols == 0) || (p.get_n_nonzero() == 0) )\n    {\n    if(dim == 0)  { out.zeros((p_n_rows > 0) ? 1 : 0, p_n_cols); }\n    if(dim == 1)  { out.zeros(p_n_rows, (p_n_cols > 0) ? 1 : 0); }\n    \n    return;\n    }\n  \n  spop_max::apply_proxy(out, p, dim);\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_max::apply_proxy\n  (\n        SpMat<typename T1::elem_type>& out,\n  const SpProxy<T1>&                   p,\n  const uword                          dim,\n  const typename arma_not_cx<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  \n  typename SpProxy<T1>::const_iterator_type it     = p.begin();\n  typename SpProxy<T1>::const_iterator_type it_end = p.end();\n  \n  const uword p_n_cols = p.get_n_cols();\n  const uword p_n_rows = p.get_n_rows();\n  \n  if(dim == 0) // find the maximum in each column\n    {\n    Row<eT> value(p_n_cols, fill::zeros);\n    urowvec count(p_n_cols, fill::zeros);\n    \n    while(it != it_end)\n      {\n      const uword col = it.col();\n      \n      value[col] = (count[col] == 0) ? (*it) : (std::max)(value[col], (*it));\n      count[col]++;\n      ++it;\n      }\n    \n    for(uword col=0; col<p_n_cols; ++col)\n      {\n      if(count[col] < p_n_rows)  { value[col] = (std::max)(value[col], eT(0)); }\n      }\n    \n    out = value;\n    }\n  else\n  if(dim == 1)  // find the maximum in each row\n    {\n    Col<eT> value(p_n_rows, fill::zeros);\n    ucolvec count(p_n_rows, fill::zeros);\n    \n    while(it != it_end)\n      {\n      const uword row = it.row();\n      \n      value[row] = (count[row] == 0) ? (*it) : (std::max)(value[row], (*it));\n      count[row]++;\n      ++it;\n      }\n    \n    for(uword row=0; row<p_n_rows; ++row)\n      {\n      if(count[row] < p_n_cols)  { value[row] = (std::max)(value[row], eT(0)); }\n      }\n    \n    out = value;\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::elem_type\nspop_max::vector_max\n  (\n  const T1& x,\n  const typename arma_not_cx<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  \n  const SpProxy<T1> p(x);\n  \n  if(p.get_n_elem() == 0)\n    {\n    arma_debug_check(true, \"max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  if(p.get_n_nonzero() == 0)  { return eT(0); }\n  \n  if(SpProxy<T1>::must_use_iterator == false)\n    {\n    // direct access of values\n    if(p.get_n_nonzero() == p.get_n_elem())\n      {\n      return op_max::direct_max(p.get_values(), p.get_n_nonzero());\n      }\n    else\n      {\n      return std::max(eT(0), op_max::direct_max(p.get_values(), p.get_n_nonzero()));\n      }\n    }\n  else\n    {\n    // use iterator\n    typename SpProxy<T1>::const_iterator_type it     = p.begin();\n    typename SpProxy<T1>::const_iterator_type it_end = p.end();\n    \n    eT result = (*it);\n    ++it;\n    \n    while(it != it_end)\n      {\n      if((*it) > result)  { result = (*it); }\n      \n      ++it;\n      }\n    \n    if(p.get_n_nonzero() == p.get_n_elem())\n      {\n      return result;\n      }\n    else\n      {\n      return std::max(eT(0), result);\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename arma_not_cx<typename T1::elem_type>::result\nspop_max::max(const SpBase<typename T1::elem_type, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const SpProxy<T1> P(X.get_ref());\n  \n  const uword n_elem    = P.get_n_elem();\n  const uword n_nonzero = P.get_n_nonzero();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  eT max_val = priv::most_neg<eT>();\n  \n  if(SpProxy<T1>::must_use_iterator)\n    {\n    // We have to iterate over the elements.\n    typedef typename SpProxy<T1>::const_iterator_type it_type;\n    \n    it_type it     = P.begin();\n    it_type it_end = P.end();\n    \n    while (it != it_end)\n      {\n      if ((*it) > max_val)  { max_val = *it; }\n      \n      ++it;\n      }\n    }\n  else\n    {\n    // We can do direct access of the values, row_indices, and col_ptrs.\n    // We don't need the location of the max value, so we can just call out to\n    // other functions...\n    max_val = op_max::direct_max(P.get_values(), n_nonzero);\n    }\n  \n  if(n_elem == n_nonzero)\n    {\n    return max_val;\n    }\n  else\n    {\n    return std::max(eT(0), max_val);\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename arma_not_cx<typename T1::elem_type>::result\nspop_max::max_with_index(const SpProxy<T1>& P, uword& index_of_max_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword n_elem    = P.get_n_elem();\n  const uword n_nonzero = P.get_n_nonzero();\n  const uword n_rows    = P.get_n_rows();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  eT max_val = priv::most_neg<eT>();\n  \n  if(SpProxy<T1>::must_use_iterator)\n    {\n    // We have to iterate over the elements.\n    typedef typename SpProxy<T1>::const_iterator_type it_type;\n    \n    it_type it     = P.begin();\n    it_type it_end = P.end();\n    \n    while (it != it_end)\n      {\n      if ((*it) > max_val)\n        {\n        max_val = *it;\n        index_of_max_val = it.row() + it.col() * n_rows;\n        }\n      \n      ++it;\n      }\n    }\n  else\n    {\n    // We can do direct access.\n    max_val = op_max::direct_max(P.get_values(), n_nonzero, index_of_max_val);\n    \n    // Convert to actual position in matrix.\n    const uword row = P.get_row_indices()[index_of_max_val];\n    uword col = 0;\n    while (P.get_col_ptrs()[++col] <= index_of_max_val) { }\n    index_of_max_val = (col - 1) * n_rows + row;\n    }\n  \n  \n  if(n_elem != n_nonzero)\n    {\n    max_val = std::max(eT(0), max_val);\n    \n    // If the max_val is a nonzero element, we need its actual position in the matrix.\n    if(max_val == eT(0))\n      {\n      // Find first zero element.\n      uword last_row = 0;\n      uword last_col = 0;\n      \n      typedef typename SpProxy<T1>::const_iterator_type it_type;\n      \n      it_type it     = P.begin();\n      it_type it_end = P.end();\n      \n      while (it != it_end)\n        {\n        // Have we moved more than one position from the last place?\n        if ((it.col() == last_col) && (it.row() - last_row > 1))\n          {\n          index_of_max_val = it.col() * n_rows + last_row + 1;\n          break;\n          }\n        else if ((it.col() >= last_col + 1) && (last_row < n_rows - 1))\n          {\n          index_of_max_val = last_col * n_rows + last_row + 1;\n          break;\n          }\n        else if ((it.col() == last_col + 1) && (it.row() > 0))\n          {\n          index_of_max_val = it.col() * n_rows;\n          break;\n          }\n        else if (it.col() > last_col + 1)\n          {\n          index_of_max_val = (last_col + 1) * n_rows;\n          break;\n          }\n        \n        last_row = it.row();\n        last_col = it.col();\n        ++it;\n        }\n      }\n    }\n  \n  return max_val;\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_max::apply_proxy\n  (\n        SpMat<typename T1::elem_type>& out,\n  const SpProxy<T1>&                   p,\n  const uword                          dim,\n  const typename arma_cx_only<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result  T;\n  \n  typename SpProxy<T1>::const_iterator_type it     = p.begin();\n  typename SpProxy<T1>::const_iterator_type it_end = p.end();\n  \n  const uword p_n_cols = p.get_n_cols();\n  const uword p_n_rows = p.get_n_rows();\n  \n  if(dim == 0) // find the maximum in each column\n    {\n    Row<eT> rawval(p_n_cols, fill::zeros);\n    Row< T> absval(p_n_cols, fill::zeros);\n    \n    while(it != it_end)\n      {\n      const uword col = it.col();\n      \n      const eT& v = (*it);\n      const  T  a = std::abs(v);\n      \n      if(a > absval[col])\n        {\n        absval[col] = a;\n        rawval[col] = v;\n        }\n      \n      ++it;\n      }\n    \n    out = rawval;\n    }\n  else\n  if(dim == 1)  // find the maximum in each row\n    {\n    Col<eT> rawval(p_n_rows, fill::zeros);\n    Col< T> absval(p_n_rows, fill::zeros);\n    \n    while(it != it_end)\n      {\n      const uword row = it.row();\n      \n      const eT& v = (*it);\n      const  T  a = std::abs(v);\n      \n      if(a > absval[row])\n        {\n        absval[row] = a;\n        rawval[row] = v;\n        }\n      \n      ++it;\n      }\n    \n    out = rawval;\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::elem_type\nspop_max::vector_max\n  (\n  const T1& x,\n  const typename arma_cx_only<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result  T;\n  \n  const SpProxy<T1> p(x);\n  \n  if(p.get_n_elem() == 0)\n    {\n    arma_debug_check(true, \"max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  if(p.get_n_nonzero() == 0)  { return eT(0); }\n  \n  if(SpProxy<T1>::must_use_iterator == false)\n    {\n    // direct access of values\n    if(p.get_n_nonzero() == p.get_n_elem())\n      {\n      return op_max::direct_max(p.get_values(), p.get_n_nonzero());\n      }\n    else\n      {\n      const eT val1 = eT(0);\n      const eT val2 = op_max::direct_max(p.get_values(), p.get_n_nonzero());\n      \n      return ( std::abs(val1) >= std::abs(val2) ) ? val1 : val2;\n      }\n    }\n  else\n    {\n    // use iterator\n    typename SpProxy<T1>::const_iterator_type it     = p.begin();\n    typename SpProxy<T1>::const_iterator_type it_end = p.end();\n\n    eT best_val_orig = *it;\n     T best_val_abs  = std::abs(best_val_orig);\n    \n    ++it;\n    \n    while(it != it_end)\n      {\n      eT val_orig = *it;\n       T val_abs  = std::abs(val_orig);\n      \n      if(val_abs > best_val_abs)\n        {\n        best_val_abs  = val_abs;\n        best_val_orig = val_orig;\n        }\n\n      ++it;\n      }\n\n    if(p.get_n_nonzero() == p.get_n_elem())\n      {\n      return best_val_orig;\n      }\n    else\n      {\n      const eT val1 = eT(0);\n      \n      return ( std::abs(val1) >= best_val_abs ) ? val1 : best_val_orig;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename arma_cx_only<typename T1::elem_type>::result\nspop_max::max(const SpBase<typename T1::elem_type, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result  T;\n\n  const SpProxy<T1> P(X.get_ref());\n\n  const uword n_elem    = P.get_n_elem();\n  const uword n_nonzero = P.get_n_nonzero();\n\n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n   T max_val = priv::most_neg<T>();\n  eT ret_val;\n  \n  if(SpProxy<T1>::must_use_iterator)\n    {\n    // We have to iterate over the elements.\n    typedef typename SpProxy<T1>::const_iterator_type it_type;\n    \n    it_type it     = P.begin();\n    it_type it_end = P.end();\n    \n    while (it != it_end)\n      {\n      const T tmp_val = std::abs(*it);\n      \n      if (tmp_val > max_val)\n        {\n        max_val = tmp_val;\n        ret_val = *it;\n        }\n      \n      ++it;\n      }\n    }\n  else\n    {\n    // We can do direct access of the values, row_indices, and col_ptrs.\n    // We don't need the location of the max value, so we can just call out to\n    // other functions...\n    ret_val = op_max::direct_max(P.get_values(), n_nonzero);\n    max_val = std::abs(ret_val);\n    }\n  \n  if(n_elem == n_nonzero)\n    {\n    return max_val;\n    }\n  else\n    {\n    if (T(0) > max_val)\n      return eT(0);\n    else\n      return ret_val;\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename arma_cx_only<typename T1::elem_type>::result\nspop_max::max_with_index(const SpProxy<T1>& P, uword& index_of_max_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result  T;\n  \n  const uword n_elem    = P.get_n_elem();\n  const uword n_nonzero = P.get_n_nonzero();\n  const uword n_rows    = P.get_n_rows();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  T max_val = priv::most_neg<T>();\n  \n  if(SpProxy<T1>::must_use_iterator)\n    {\n    // We have to iterate over the elements.\n    typedef typename SpProxy<T1>::const_iterator_type it_type;\n    \n    it_type it     = P.begin();\n    it_type it_end = P.end();\n    \n    while (it != it_end)\n      {\n      const T tmp_val = std::abs(*it);\n      \n      if (tmp_val > max_val)\n        {\n                 max_val = tmp_val;\n        index_of_max_val = it.row() + it.col() * n_rows;\n        }\n      \n      ++it;\n      }\n    }\n  else\n    {\n    // We can do direct access.\n    max_val = std::abs(op_max::direct_max(P.get_values(), n_nonzero, index_of_max_val));\n\n    // Convert to actual position in matrix.\n    const uword row = P.get_row_indices()[index_of_max_val];\n    uword col = 0;\n    while (P.get_col_ptrs()[++col] <= index_of_max_val) { }\n    index_of_max_val = (col - 1) * n_rows + row;\n    }\n  \n  \n  if(n_elem != n_nonzero)\n    {\n    max_val = std::max(T(0), max_val);\n\n    // If the max_val is a nonzero element, we need its actual position in the matrix.\n    if(max_val == T(0))\n      {\n      // Find first zero element.\n      uword last_row = 0;\n      uword last_col = 0;\n      \n      typedef typename SpProxy<T1>::const_iterator_type it_type;\n      \n      it_type it     = P.begin();\n      it_type it_end = P.end();\n      \n      while (it != it_end)\n        {\n        // Have we moved more than one position from the last place?\n        if ((it.col() == last_col) && (it.row() - last_row > 1))\n          {\n          index_of_max_val = it.col() * n_rows + last_row + 1;\n          break;\n          }\n        else if ((it.col() >= last_col + 1) && (last_row < n_rows - 1))\n          {\n          index_of_max_val = last_col * n_rows + last_row + 1;\n          break;\n          }\n        else if ((it.col() == last_col + 1) && (it.row() > 0))\n          {\n          index_of_max_val = it.col() * n_rows;\n          break;\n          }\n        else if (it.col() > last_col + 1)\n          {\n          index_of_max_val = (last_col + 1) * n_rows;\n          break;\n          }\n\n        last_row = it.row();\n        last_col = it.col();\n        ++it;\n        }\n      }\n    }\n\n  return P[index_of_max_val];\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spop_mean_bones.hpp",
    "content": "// Copyright (C) 2012 Ryan Curtin\n// Copyright (C) 2012-2015 Conrad Sanderson\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spop_mean\n//! @{\n\n\n//! Class for finding mean values of a sparse matrix\nclass spop_mean\n  {\n  public:\n\n  // Apply mean into an output sparse matrix (or vector).\n  template<typename T1>\n  inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_mean>& in);\n\n  template<typename T1>\n  inline static void apply_noalias_fast(SpMat<typename T1::elem_type>& out, const SpProxy<T1>& p, const uword dim);\n  \n  template<typename T1>\n  inline static void apply_noalias_slow(SpMat<typename T1::elem_type>& out, const SpProxy<T1>& p, const uword dim);\n  \n  // Take direct mean of a set of values.  Length of array and number of values can be different.\n  template<typename eT>\n  inline static eT direct_mean(const eT* const X, const uword length, const uword N);\n\n  template<typename eT>\n  inline static eT direct_mean_robust(const eT* const X, const uword length, const uword N);\n\n  template<typename T1>\n  inline static typename T1::elem_type mean_all(const SpBase<typename T1::elem_type, T1>& X);\n\n  // Take the mean using an iterator.\n  template<typename T1, typename eT>\n  inline static eT iterator_mean(T1& it, const T1& end, const uword n_zero, const eT junk);\n\n  template<typename T1, typename eT>\n  inline static eT iterator_mean_robust(T1& it, const T1& end, const uword n_zero, const eT junk);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spop_mean_meat.hpp",
    "content": "// Copyright (C) 2012 Ryan Curtin\n// Copyright (C) 2012-2015 Conrad Sanderson\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spop_mean\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_mean::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_mean>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword dim = in.aux_uword_a;\n  arma_debug_check( (dim > 1), \"mean(): parameter 'dim' must be 0 or 1\" );\n  \n  const SpProxy<T1> p(in.m);\n  \n  if(p.is_alias(out) == false)\n    {\n    spop_mean::apply_noalias_fast(out, p, dim);\n    }\n  else\n    {\n    SpMat<eT> tmp;\n    \n    spop_mean::apply_noalias_fast(tmp, p, dim);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_mean::apply_noalias_fast\n  (\n        SpMat<typename T1::elem_type>& out,\n  const SpProxy<T1>&                   p,\n  const uword                          dim\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  typedef typename T1::pod_type   T;\n  \n  const uword p_n_rows = p.get_n_rows();\n  const uword p_n_cols = p.get_n_cols();\n  \n  if( (p_n_rows == 0) || (p_n_cols == 0) || (p.get_n_nonzero() == 0) )\n    {\n    if(dim == 0)  { out.zeros((p_n_rows > 0) ? 1 : 0, p_n_cols); }\n    if(dim == 1)  { out.zeros(p_n_rows, (p_n_cols > 0) ? 1 : 0); }\n    \n    return;\n    }\n  \n  if(dim == 0) // find the mean in each column\n    {\n    Row<eT> acc(p_n_cols, fill::zeros);\n    \n    if(SpProxy<T1>::must_use_iterator)\n      {\n      typename SpProxy<T1>::const_iterator_type it     = p.begin();\n      typename SpProxy<T1>::const_iterator_type it_end = p.end();\n      \n      while(it != it_end)  { acc[it.col()] += (*it);  ++it; }\n      \n      acc /= T(p_n_rows);\n      }\n    else\n      {\n      for(uword col = 0; col < p_n_cols; ++col)\n        {\n        acc[col] = arrayops::accumulate\n          (\n          &p.get_values()[p.get_col_ptrs()[col]],\n          p.get_col_ptrs()[col + 1] - p.get_col_ptrs()[col]\n          ) / T(p_n_rows);\n        }\n      }\n    \n    out = acc;\n    }\n  else\n  if(dim == 1)  // find the mean in each row\n    {\n    Col<eT> acc(p_n_rows, fill::zeros);\n    \n    typename SpProxy<T1>::const_iterator_type it     = p.begin();\n    typename SpProxy<T1>::const_iterator_type it_end = p.end();\n    \n    while(it != it_end)  { acc[it.row()] += (*it);  ++it; }\n    \n    acc /= T(p_n_cols);\n    \n    out = acc;\n    }\n  \n  if(out.is_finite() == false)\n    {\n    spop_mean::apply_noalias_slow(out, p, dim);\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_mean::apply_noalias_slow\n  (\n        SpMat<typename T1::elem_type>& out,\n  const SpProxy<T1>&                   p,\n  const uword                          dim\n  )\n  {\n  arma_extra_debug_sigprint();\n\n  typedef typename T1::elem_type eT;\n  \n  const uword p_n_rows = p.get_n_rows();\n  const uword p_n_cols = p.get_n_cols();\n\n  if(dim == 0)  // find the mean in each column\n    {\n    arma_extra_debug_print(\"spop_mean::apply_noalias(): dim = 0\");\n    \n    out.set_size((p_n_rows > 0) ? 1 : 0, p_n_cols);\n    \n    if( (p_n_rows == 0) || (p.get_n_nonzero() == 0) )  { return; }\n    \n    for(uword col = 0; col < p_n_cols; ++col)\n      {\n      // Do we have to use an iterator or can we use memory directly?\n      if(SpProxy<T1>::must_use_iterator)\n        {\n        typename SpProxy<T1>::const_iterator_type it  = p.begin_col(col);\n        typename SpProxy<T1>::const_iterator_type end = p.begin_col(col + 1);\n        \n        const uword n_zero = p_n_rows - (end.pos() - it.pos());\n        \n        out.at(0,col) = spop_mean::iterator_mean(it, end, n_zero, eT(0));\n        }\n      else\n        {\n        out.at(0,col) = spop_mean::direct_mean\n          (\n          &p.get_values()[p.get_col_ptrs()[col]],\n          p.get_col_ptrs()[col + 1] - p.get_col_ptrs()[col],\n          p_n_rows\n          );\n        }\n      }\n    }\n  else\n  if(dim == 1)  // find the mean in each row\n    {\n    arma_extra_debug_print(\"spop_mean::apply_noalias(): dim = 1\");\n    \n    out.set_size(p_n_rows, (p_n_cols > 0) ? 1 : 0);\n    \n    if( (p_n_cols == 0) || (p.get_n_nonzero() == 0) )  { return; }\n    \n    for(uword row = 0; row < p_n_rows; ++row)\n      {\n      // We must use an iterator regardless of how it is stored.\n      typename SpProxy<T1>::const_row_iterator_type it  = p.begin_row(row);\n      typename SpProxy<T1>::const_row_iterator_type end = p.end_row(row);\n      \n      const uword n_zero = p_n_cols - (end.pos() - it.pos());\n      \n      out.at(row,0) = spop_mean::iterator_mean(it, end, n_zero, eT(0));\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nspop_mean::direct_mean\n  (\n  const eT* const X,\n  const uword length,\n  const uword N\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  const eT result = ((length > 0) && (N > 0)) ? eT(arrayops::accumulate(X, length) / T(N)) : eT(0);\n  \n  return arma_isfinite(result) ? result : spop_mean::direct_mean_robust(X, length, N);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nspop_mean::direct_mean_robust\n  (\n  const eT* const X,\n  const uword length,\n  const uword N\n  )\n  {\n  arma_extra_debug_sigprint();\n\n  typedef typename get_pod_type<eT>::result T;\n\n  uword i, j;\n\n  eT r_mean = eT(0);\n\n  const uword diff = (N - length); // number of zeros\n\n  for(i = 0, j = 1; j < length; i += 2, j += 2)\n    {\n    const eT Xi = X[i];\n    const eT Xj = X[j];\n\n    r_mean += (Xi - r_mean) / T(diff + j);\n    r_mean += (Xj - r_mean) / T(diff + j + 1);\n    }\n\n  if(i < length)\n    {\n    const eT Xi = X[i];\n\n    r_mean += (Xi - r_mean) / T(diff + i + 1);\n    }\n\n  return r_mean;\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::elem_type\nspop_mean::mean_all(const SpBase<typename T1::elem_type, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  SpProxy<T1> p(X.get_ref());\n  \n  if(SpProxy<T1>::must_use_iterator)\n    {\n    typename SpProxy<T1>::const_iterator_type it  = p.begin();\n    typename SpProxy<T1>::const_iterator_type end = p.end();\n\n    return spop_mean::iterator_mean(it, end, p.get_n_elem() - p.get_n_nonzero(), typename T1::elem_type(0));\n    }\n  else // must_use_iterator == false; that is, we can directly access the values array\n    {\n    return spop_mean::direct_mean(p.get_values(), p.get_n_nonzero(), p.get_n_elem());\n    }\n  }\n\n\n\ntemplate<typename T1, typename eT>\ninline\neT\nspop_mean::iterator_mean(T1& it, const T1& end, const uword n_zero, const eT junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename get_pod_type<eT>::result T;\n  \n  eT acc = eT(0);\n  \n  T1 backup_it(it); // in case we have to use robust iterator_mean\n  \n  const uword it_begin_pos = it.pos();\n  \n  while (it != end)\n    {\n    acc += (*it);\n    ++it;\n    }\n  \n  const uword count = n_zero + (it.pos() - it_begin_pos);\n  \n  const eT result = (count > 0) ? eT(acc / T(count)) : eT(0);\n  \n  return arma_isfinite(result) ? result : spop_mean::iterator_mean_robust(backup_it, end, n_zero, eT(0));\n  }\n\n\n\ntemplate<typename T1, typename eT>\ninline\neT\nspop_mean::iterator_mean_robust(T1& it, const T1& end, const uword n_zero, const eT junk)\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n\n  typedef typename get_pod_type<eT>::result T;\n\n  eT r_mean = eT(0);\n\n  const uword it_begin_pos = it.pos();\n\n  while (it != end)\n    {\n    r_mean += ((*it - r_mean) / T(n_zero + (it.pos() - it_begin_pos) + 1));\n    ++it;\n    }\n\n  return r_mean;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spop_min_bones.hpp",
    "content": "// Copyright (C) 2012-2015 Conrad Sanderson\n// Copyright (C) 2012-2014 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spop_min\n//! @{\n\n\nclass spop_min\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_min>& in);\n  \n  //\n  \n  template<typename T1>\n  inline static void apply_proxy(SpMat<typename T1::elem_type>& out, const SpProxy<T1>& p, const uword dim, const typename arma_not_cx<typename T1::elem_type>::result* junk = 0);\n  \n  template<typename T1>\n  inline static typename T1::elem_type vector_min(const T1& X, const typename arma_not_cx<typename T1::elem_type>::result* junk = 0);\n  \n  template<typename T1>\n  inline static typename arma_not_cx<typename T1::elem_type>::result min(const SpBase<typename T1::elem_type, T1>& X);\n  \n  template<typename T1>\n  inline static typename arma_not_cx<typename T1::elem_type>::result min_with_index(const SpProxy<T1>& P, uword& index_of_min_val);\n  \n  //\n  \n  template<typename T1>\n  inline static void apply_proxy(SpMat<typename T1::elem_type>& out, const SpProxy<T1>& p, const uword dim, const typename arma_cx_only<typename T1::elem_type>::result* junk = 0);\n  \n  template<typename T1>\n  inline static typename T1::elem_type vector_min(const T1& X, const typename arma_cx_only<typename T1::elem_type>::result* junk = 0);\n  \n  template<typename T1>\n  inline static typename arma_cx_only<typename T1::elem_type>::result min(const SpBase<typename T1::elem_type, T1>& X);\n  \n  template<typename T1>\n  inline static typename arma_cx_only<typename T1::elem_type>::result min_with_index(const SpProxy<T1>& P, uword& index_of_min_val);\n  };\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spop_min_meat.hpp",
    "content": "// Copyright (C) 2012-2014 Ryan Curtin\n// Copyright (C) 2012-2015 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spop_min\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_min::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1,spop_min>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword dim = in.aux_uword_a;\n  arma_debug_check( (dim > 1), \"min(): parameter 'dim' must be 0 or 1\" );\n  \n  const SpProxy<T1> p(in.m);\n  \n  const uword p_n_rows = p.get_n_rows();\n  const uword p_n_cols = p.get_n_cols();\n  \n  if( (p_n_rows == 0) || (p_n_cols == 0) || (p.get_n_nonzero() == 0) )\n    {\n    if(dim == 0)  { out.zeros((p_n_rows > 0) ? 1 : 0, p_n_cols); }\n    if(dim == 1)  { out.zeros(p_n_rows, (p_n_cols > 0) ? 1 : 0); }\n    \n    return;\n    }\n  \n  spop_min::apply_proxy(out, p, dim);\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_min::apply_proxy\n  (\n        SpMat<typename T1::elem_type>& out,\n  const SpProxy<T1>&                   p,\n  const uword                          dim,\n  const typename arma_not_cx<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  \n  typename SpProxy<T1>::const_iterator_type it     = p.begin();\n  typename SpProxy<T1>::const_iterator_type it_end = p.end();\n  \n  const uword p_n_cols = p.get_n_cols();\n  const uword p_n_rows = p.get_n_rows();\n  \n  if(dim == 0) // find the minimum in each column\n    {\n    Row<eT> value(p_n_cols, fill::zeros);\n    urowvec count(p_n_cols, fill::zeros);\n    \n    while(it != it_end)\n      {\n      const uword col = it.col();\n      \n      value[col] = (count[col] == 0) ? (*it) : (std::min)(value[col], (*it));\n      count[col]++;\n      ++it;\n      }\n    \n    for(uword col=0; col<p_n_cols; ++col)\n      {\n      if(count[col] < p_n_rows)  { value[col] = (std::min)(value[col], eT(0)); }\n      }\n    \n    out = value;\n    }\n  else\n  if(dim == 1)  // find the minimum in each row\n    {\n    Col<eT> value(p_n_rows, fill::zeros);\n    ucolvec count(p_n_rows, fill::zeros);\n    \n    while(it != it_end)\n      {\n      const uword row = it.row();\n      \n      value[row] = (count[row] == 0) ? (*it) : (std::min)(value[row], (*it));\n      count[row]++;\n      ++it;\n      }\n    \n    for(uword row=0; row<p_n_rows; ++row)\n      {\n      if(count[row] < p_n_cols)  { value[row] = (std::min)(value[row], eT(0)); }\n      }\n    \n    out = value;\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::elem_type\nspop_min::vector_min\n  (\n  const T1& x,\n  const typename arma_not_cx<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type eT;\n  \n  const SpProxy<T1> p(x);\n  \n  if(p.get_n_elem() == 0)\n    {\n    arma_debug_check(true, \"min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  if(p.get_n_nonzero() == 0)  { return eT(0); }\n  \n  if(SpProxy<T1>::must_use_iterator == false)\n    {\n    // direct access of values\n    if(p.get_n_nonzero() == p.get_n_elem())\n      {\n      return op_min::direct_min(p.get_values(), p.get_n_nonzero());\n      }\n    else\n      {\n      return std::min(eT(0), op_min::direct_min(p.get_values(), p.get_n_nonzero()));\n      }\n    }\n  else\n    {\n    // use iterator\n    typename SpProxy<T1>::const_iterator_type it     = p.begin();\n    typename SpProxy<T1>::const_iterator_type it_end = p.end();\n    \n    eT result = (*it);\n    ++it;\n    \n    while(it != it_end)\n      {\n      if((*it) < result)  { result = (*it); }\n      \n      ++it;\n      }\n    \n    if(p.get_n_nonzero() == p.get_n_elem())\n      {\n      return result;\n      }\n    else\n      {\n      return std::min(eT(0), result);\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename arma_not_cx<typename T1::elem_type>::result\nspop_min::min(const SpBase<typename T1::elem_type, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  typedef typename T1::elem_type eT;\n\n  const SpProxy<T1> P(X.get_ref());\n\n  const uword n_elem    = P.get_n_elem();\n  const uword n_nonzero = P.get_n_nonzero();\n\n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n\n  eT min_val = priv::most_pos<eT>();\n\n  if(SpProxy<T1>::must_use_iterator)\n    {\n    // We have to iterate over the elements.\n    typedef typename SpProxy<T1>::const_iterator_type it_type;\n\n    it_type it     = P.begin();\n    it_type it_end = P.end();\n\n    while (it != it_end)\n      {\n      if ((*it) < min_val)  { min_val = *it; }\n      \n      ++it;\n      }\n    }\n  else\n    {\n    // We can do direct access of the values, row_indices, and col_ptrs.\n    // We don't need the location of the min value, so we can just call out to\n    // other functions...\n    min_val = op_min::direct_min(P.get_values(), n_nonzero);\n    }\n\n  if(n_elem == n_nonzero)\n    {\n    return min_val;\n    }\n  else\n    {\n    return std::min(eT(0), min_val);\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename arma_not_cx<typename T1::elem_type>::result\nspop_min::min_with_index(const SpProxy<T1>& P, uword& index_of_min_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword n_elem    = P.get_n_elem();\n  const uword n_nonzero = P.get_n_nonzero();\n  const uword n_rows    = P.get_n_rows();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  eT min_val = priv::most_pos<eT>();\n  \n  if(SpProxy<T1>::must_use_iterator)\n    {\n    // We have to iterate over the elements.\n    typedef typename SpProxy<T1>::const_iterator_type it_type;\n    \n    it_type it     = P.begin();\n    it_type it_end = P.end();\n    \n    while (it != it_end)\n      {\n      if ((*it) < min_val)\n        {\n        min_val = *it;\n        index_of_min_val = it.row() + it.col() * n_rows;\n        }\n      \n      ++it;\n      }\n    }\n  else\n    {\n    // We can do direct access.\n    min_val = op_min::direct_min(P.get_values(), n_nonzero, index_of_min_val);\n    \n    // Convert to actual position in matrix.\n    const uword row = P.get_row_indices()[index_of_min_val];\n    uword col = 0;\n    while (P.get_col_ptrs()[++col] < index_of_min_val + 1) { }\n    index_of_min_val = (col - 1) * n_rows + row;\n    }\n  \n  \n  if(n_elem != n_nonzero)\n    {\n    min_val = std::min(eT(0), min_val);\n\n    // If the min_val is a nonzero element, we need its actual position in the matrix.\n    if(min_val == eT(0))\n      {\n      // Find first zero element.\n      uword last_row = 0;\n      uword last_col = 0;\n      \n      typedef typename SpProxy<T1>::const_iterator_type it_type;\n      \n      it_type it     = P.begin();\n      it_type it_end = P.end();\n      \n      while (it != it_end)\n        {\n        // Have we moved more than one position from the last place?\n        if ((it.col() == last_col) && (it.row() - last_row > 1))\n          {\n          index_of_min_val = it.col() * n_rows + last_row + 1;\n          break;\n          }\n        else if ((it.col() >= last_col + 1) && (last_row < n_rows - 1))\n          {\n          index_of_min_val = last_col * n_rows + last_row + 1;\n          break;\n          }\n        else if ((it.col() == last_col + 1) && (it.row() > 0))\n          {\n          index_of_min_val = it.col() * n_rows;\n          break;\n          }\n        else if (it.col() > last_col + 1)\n          {\n          index_of_min_val = (last_col + 1) * n_rows;\n          break;\n          }\n        \n        last_row = it.row();\n        last_col = it.col();\n        ++it;\n        }\n      }\n    }\n  \n  return min_val;\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_min::apply_proxy\n  (\n        SpMat<typename T1::elem_type>& out,\n  const SpProxy<T1>&                   p,\n  const uword                          dim,\n  const typename arma_cx_only<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result  T;\n  \n  typename SpProxy<T1>::const_iterator_type it     = p.begin();\n  typename SpProxy<T1>::const_iterator_type it_end = p.end();\n  \n  const uword p_n_cols = p.get_n_cols();\n  const uword p_n_rows = p.get_n_rows();\n  \n  if(dim == 0) // find the minimum in each column\n    {\n    Row<eT> rawval(p_n_cols, fill::zeros);\n    Row< T> absval(p_n_cols, fill::zeros);\n    urowvec  count(p_n_cols, fill::zeros);\n    \n    while(it != it_end)\n      {\n      const uword col = it.col();\n      \n      const eT& v = (*it);\n      const  T  a = std::abs(v);\n      \n      if(count[col] == 0)\n        {\n        absval[col] = a;\n        rawval[col] = v;\n        }\n      else\n        {\n        if(a < absval[col])\n          {\n          absval[col] = a;\n          rawval[col] = v;\n          }\n        }\n      \n      count[col]++;\n      ++it;\n      }\n    \n    for(uword col=0; col < p_n_cols; ++col)\n      {\n      if(count[col] < p_n_rows)\n        {\n        if(T(0) < absval[col])  { rawval[col] = eT(0); }\n        }\n      }\n    \n    out = rawval;\n    }\n  else\n  if(dim == 1)  // find the minimum in each row\n    {\n    Col<eT> rawval(p_n_rows, fill::zeros);\n    Col< T> absval(p_n_rows, fill::zeros);\n    ucolvec  count(p_n_rows, fill::zeros);\n    \n    while(it != it_end)\n      {\n      const uword row = it.row();\n      \n      const eT& v = (*it);\n      const  T  a = std::abs(v);\n      \n      if(count[row] == 0)\n        {\n        absval[row] = a;\n        rawval[row] = v;\n        }\n      else\n        {\n        if(a < absval[row])\n          {\n          absval[row] = a;\n          rawval[row] = v;\n          }\n        }\n      \n      count[row]++;\n      ++it;\n      }\n    \n    for(uword row=0; row < p_n_rows; ++row)\n      {\n      if(count[row] < p_n_cols)\n        {\n        if(T(0) < absval[row])  { rawval[row] = eT(0); }\n        }\n      }\n    \n    out = rawval;\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::elem_type\nspop_min::vector_min\n  (\n  const T1& x,\n  const typename arma_cx_only<typename T1::elem_type>::result* junk\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk);\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result  T;\n\n  const SpProxy<T1> p(x);\n  \n  if(p.get_n_elem() == 0)\n    {\n    arma_debug_check(true, \"min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  if(p.get_n_nonzero() == 0)  { return eT(0); }\n  \n  if(SpProxy<T1>::must_use_iterator == false)\n    {\n    // direct access of values\n    if(p.get_n_nonzero() == p.get_n_elem())\n      {\n      return op_min::direct_min(p.get_values(), p.get_n_nonzero());\n      }\n    else\n      {\n      const eT val1 = eT(0);\n      const eT val2 = op_min::direct_min(p.get_values(), p.get_n_nonzero());\n      \n      return ( std::abs(val1) < std::abs(val2) ) ? val1 : val2;\n      }\n    }\n  else\n    {\n    // use iterator\n    typename SpProxy<T1>::const_iterator_type it     = p.begin();\n    typename SpProxy<T1>::const_iterator_type it_end = p.end();\n\n    eT best_val_orig = *it;\n     T best_val_abs  = std::abs(best_val_orig);\n    \n    ++it;\n    \n    while(it != it_end)\n      {\n      eT val_orig = *it;\n       T val_abs  = std::abs(val_orig);\n      \n      if(val_abs < best_val_abs)\n        {\n        best_val_abs  = val_abs;\n        best_val_orig = val_orig;\n        }\n\n      ++it;\n      }\n\n    if(p.get_n_nonzero() == p.get_n_elem())\n      {\n      return best_val_orig;\n      }\n    else\n      {\n      const eT val1 = eT(0);\n      \n      return ( std::abs(val1) < best_val_abs ) ? val1 : best_val_orig;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename arma_cx_only<typename T1::elem_type>::result\nspop_min::min(const SpBase<typename T1::elem_type, T1>& X)\n  {\n  arma_extra_debug_sigprint();\n\n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result  T;\n\n  const SpProxy<T1> P(X.get_ref());\n\n  const uword n_elem    = P.get_n_elem();\n  const uword n_nonzero = P.get_n_nonzero();\n\n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n\n   T min_val = priv::most_pos<T>();\n  eT ret_val;\n\n  if(SpProxy<T1>::must_use_iterator)\n    {\n    // We have to iterate over the elements.\n    typedef typename SpProxy<T1>::const_iterator_type it_type;\n    \n    it_type it     = P.begin();\n    it_type it_end = P.end();\n    \n    while (it != it_end)\n      {\n      const T tmp_val = std::abs(*it);\n      \n      if (tmp_val < min_val)\n        {\n        min_val = tmp_val;\n        ret_val = *it;\n        }\n      \n      ++it;\n      }\n    }\n  else\n    {\n    // We can do direct access of the values, row_indices, and col_ptrs.\n    // We don't need the location of the min value, so we can just call out to\n    // other functions...\n    ret_val = op_min::direct_min(P.get_values(), n_nonzero);\n    min_val = std::abs(ret_val);\n    }\n\n  if(n_elem == n_nonzero)\n    {\n    return ret_val;\n    }\n  else\n    {\n    if (T(0) < min_val)\n      return eT(0);\n    else\n      return ret_val;\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename arma_cx_only<typename T1::elem_type>::result\nspop_min::min_with_index(const SpProxy<T1>& P, uword& index_of_min_val)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type            eT;\n  typedef typename get_pod_type<eT>::result  T;\n  \n  const uword n_elem    = P.get_n_elem();\n  const uword n_nonzero = P.get_n_nonzero();\n  const uword n_rows    = P.get_n_rows();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  T min_val = priv::most_pos<T>();\n  \n  if(SpProxy<T1>::must_use_iterator)\n    {\n    // We have to iterate over the elements.\n    typedef typename SpProxy<T1>::const_iterator_type it_type;\n    \n    it_type it     = P.begin();\n    it_type it_end = P.end();\n    \n    while (it != it_end)\n      {\n      const T tmp_val = std::abs(*it);\n      \n      if (tmp_val < min_val)\n        {\n                 min_val = tmp_val;\n        index_of_min_val = it.row() + it.col() * n_rows;\n        }\n      \n      ++it;\n      }\n    }\n  else\n    {\n    // We can do direct access.\n    min_val = std::abs(op_min::direct_min(P.get_values(), n_nonzero, index_of_min_val));\n\n    // Convert to actual position in matrix.\n    const uword row = P.get_row_indices()[index_of_min_val];\n    uword col = 0;\n    while (P.get_col_ptrs()[++col] < index_of_min_val + 1) { }\n    index_of_min_val = (col - 1) * n_rows + row;\n    }\n  \n  \n  if(n_elem != n_nonzero)\n    {\n    min_val = std::min(T(0), min_val);\n\n    // If the min_val is a nonzero element, we need its actual position in the matrix.\n    if(min_val == T(0))\n      {\n      // Find first zero element.\n      uword last_row = 0;\n      uword last_col = 0;\n      \n      typedef typename SpProxy<T1>::const_iterator_type it_type;\n      \n      it_type it     = P.begin();\n      it_type it_end = P.end();\n      \n      while (it != it_end)\n        {\n        // Have we moved more than one position from the last place?\n        if ((it.col() == last_col) && (it.row() - last_row > 1))\n          {\n          index_of_min_val = it.col() * n_rows + last_row + 1;\n          break;\n          }\n        else if ((it.col() >= last_col + 1) && (last_row < n_rows - 1))\n          {\n          index_of_min_val = last_col * n_rows + last_row + 1;\n          break;\n          }\n        else if ((it.col() == last_col + 1) && (it.row() > 0))\n          {\n          index_of_min_val = it.col() * n_rows;\n          break;\n          }\n        else if (it.col() > last_col + 1)\n          {\n          index_of_min_val = (last_col + 1) * n_rows;\n          break;\n          }\n\n        last_row = it.row();\n        last_col = it.col();\n        ++it;\n        }\n      }\n    }\n\n  return P[index_of_min_val];\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spop_misc_bones.hpp",
    "content": "// Copyright (C) 2012-2015 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spop_misc\n//! @{\n\n\nclass spop_scalar_times\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_scalar_times>& in);\n  };\n\n\n\nclass spop_square\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_square>& in);\n  };\n\n\n\nclass spop_sqrt\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_sqrt>& in);\n  };\n\n\n\nclass spop_abs\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_abs>& in);\n  };\n\n\n\nclass spop_cx_abs\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1::pod_type, T1, spop_cx_abs>& in);\n  };\n\n\n\nclass spop_real\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1::pod_type, T1, spop_real>& in);\n  };\n\n\n\nclass spop_imag\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1::pod_type, T1, spop_imag>& in);\n  };\n\n\n\nclass spop_conj\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_conj>& in);\n  };\n\n\n\nclass spop_repmat\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_repmat>& in);\n  };\n\n\n\nclass spop_reshape\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_reshape>& in);\n  };\n\n\n\nclass spop_resize\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_resize>& in);\n  };\n\n\n\nclass spop_diagmat\n  {\n  public:\n  \n  template<typename T1>\n  inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_diagmat>& in);\n  \n  template<typename T1>\n  inline static void apply_noalias(SpMat<typename T1::elem_type>& out, const SpProxy<T1>& p);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spop_misc_meat.hpp",
    "content": "// Copyright (C) 2012-2015 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spop_misc\n//! @{\n\n\n\nnamespace priv\n  {\n  template<typename eT>\n  struct functor_scalar_times\n    {\n    const eT k;\n    \n    functor_scalar_times(const eT in_k) : k(in_k) {}\n    \n    arma_inline eT operator()(const eT val) const { return val * k; }\n    };\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_scalar_times::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1,spop_scalar_times>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  if(in.aux != eT(0))\n    {\n    out.init_xform(in.m, priv::functor_scalar_times<eT>(in.aux));\n    }\n  else\n    {\n    const SpProxy<T1> P(in.m);\n    \n    out.zeros( P.get_n_rows(), P.get_n_cols() );\n    }\n  }\n\n\n\nnamespace priv\n  {\n  struct functor_square\n    {\n    template<typename eT>\n    arma_inline eT operator()(const eT val) const { return val*val; }\n    };\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_square::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1,spop_square>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  out.init_xform(in.m, priv::functor_square());\n  }\n\n\n\nnamespace priv\n  {\n  struct functor_sqrt\n    {\n    template<typename eT>\n    arma_inline eT operator()(const eT val) const { return eop_aux::sqrt(val); }\n    };\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_sqrt::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1,spop_sqrt>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  out.init_xform(in.m, priv::functor_sqrt());\n  }\n\n\n\nnamespace priv\n  {\n  struct functor_abs\n    {\n    template<typename eT>\n    arma_inline eT operator()(const eT val) const { return eop_aux::arma_abs(val); }\n    };\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_abs::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1,spop_abs>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  out.init_xform(in.m, priv::functor_abs());\n  }\n\n\n\nnamespace priv\n  {\n  struct functor_cx_abs\n    {\n    template<typename T>\n    arma_inline T operator()(const std::complex<T>& val) const { return std::abs(val); }\n    };\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_cx_abs::apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1::pod_type, T1, spop_cx_abs>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  out.init_xform_mt(in.m, priv::functor_cx_abs());\n  }\n\n\n\nnamespace priv\n  {\n  struct functor_real\n    {\n    template<typename T>\n    arma_inline T operator()(const std::complex<T>& val) const { return val.real(); }\n    };\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_real::apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1::pod_type, T1, spop_real>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  out.init_xform_mt(in.m, priv::functor_real());\n  }\n\n\n\nnamespace priv\n  {\n  struct functor_imag\n    {\n    template<typename T>\n    arma_inline T operator()(const std::complex<T>& val) const { return val.imag(); }\n    };\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_imag::apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1::pod_type, T1, spop_imag>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  out.init_xform_mt(in.m, priv::functor_imag());\n  }\n\n\n\nnamespace priv\n  {\n  struct functor_conj\n    {\n    template<typename eT>\n    arma_inline eT operator()(const eT val) const { return eop_aux::conj(val); }\n    };\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_conj::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1,spop_conj>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  out.init_xform(in.m, priv::functor_conj());\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_repmat::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_repmat>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const unwrap_spmat<T1> U(in.m);\n  const SpMat<eT>& X =   U.M;\n  \n  const uword X_n_rows = X.n_rows;\n  const uword X_n_cols = X.n_cols;\n  \n  const uword copies_per_row = in.aux_uword_a;\n  const uword copies_per_col = in.aux_uword_b;\n  \n  // out.set_size(X_n_rows * copies_per_row, X_n_cols * copies_per_col);\n  // \n  // const uword out_n_rows = out.n_rows;\n  // const uword out_n_cols = out.n_cols;\n  // \n  // if( (out_n_rows > 0) && (out_n_cols > 0) )\n  //   {\n  //   for(uword col = 0; col < out_n_cols; col += X_n_cols)\n  //   for(uword row = 0; row < out_n_rows; row += X_n_rows)\n  //     {\n  //     out.submat(row, col, row+X_n_rows-1, col+X_n_cols-1) = X;\n  //     }\n  //   }\n  \n  SpMat<eT> tmp(X_n_rows * copies_per_row, X_n_cols);\n  \n  if(tmp.n_elem > 0)\n    {\n    for(uword row = 0; row < tmp.n_rows; row += X_n_rows)\n      {\n      tmp.submat(row, 0, row+X_n_rows-1, X_n_cols-1) = X;\n      }\n    }\n  \n  // tmp contains copies of the input matrix, so no need to check for aliasing\n  \n  out.set_size(X_n_rows * copies_per_row, X_n_cols * copies_per_col);\n  \n  const uword out_n_rows = out.n_rows;\n  const uword out_n_cols = out.n_cols;\n  \n  if( (out_n_rows > 0) && (out_n_cols > 0) )\n    {\n    for(uword col = 0; col < out_n_cols; col += X_n_cols)\n      {\n      out.submat(0, col, out_n_rows-1, col+X_n_cols-1) = tmp;\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_reshape::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_reshape>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  out = in.m;\n  \n  out.reshape(in.aux_uword_a, in.aux_uword_b);\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_resize::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_resize>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  out = in.m;\n  \n  out.resize(in.aux_uword_a, in.aux_uword_b);\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_diagmat::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_diagmat>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const SpProxy<T1> p(in.m);\n  \n  if(p.is_alias(out) == false)\n    {\n    spop_diagmat::apply_noalias(out, p);\n    }\n  else\n    {\n    SpMat<eT> tmp;\n    \n    spop_diagmat::apply_noalias(tmp, p);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_diagmat::apply_noalias(SpMat<typename T1::elem_type>& out, const SpProxy<T1>& p)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword n_rows = p.get_n_rows();\n  const uword n_cols = p.get_n_cols();\n  \n  const bool p_is_vec = (n_rows == 1) || (n_cols == 1);\n  \n  if(p_is_vec)    // generate a diagonal matrix out of a vector\n    {\n    const uword N = (n_rows == 1) ? n_cols : n_rows;\n    \n    out.zeros(N, N);\n    \n    if(p.get_n_nonzero() == 0)  { return; }\n    \n    typename SpProxy<T1>::const_iterator_type it     = p.begin();\n    typename SpProxy<T1>::const_iterator_type it_end = p.end();\n      \n    if(n_cols == 1)\n      {\n      while(it != it_end)\n        {\n        const uword row = it.row();\n        \n        out.at(row,row) = (*it);\n        \n        ++it;\n        }\n      }\n    else\n    if(n_rows == 1)\n      {\n      while(it != it_end)\n        {\n        const uword col = it.col();\n        \n        out.at(col,col) = (*it);\n        \n        ++it;\n        }\n      }\n    }\n  else   // generate a diagonal matrix out of a matrix\n    {\n    arma_debug_check( (n_rows != n_cols), \"diagmat(): given matrix is not square\" );\n    \n    out.zeros(n_rows, n_rows);\n    \n    if(p.get_n_nonzero() == 0)  { return; }\n    \n    typename SpProxy<T1>::const_iterator_type it     = p.begin();\n    typename SpProxy<T1>::const_iterator_type it_end = p.end();\n      \n    while(it != it_end)\n      {\n      const uword row = it.row();\n      const uword col = it.col();\n      \n      if(row == col)\n        {\n        out.at(row,row) = (*it);\n        }\n      \n      ++it;\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spop_strans_bones.hpp",
    "content": "// Copyright (C) 2012-2014 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spop_strans\n//! @{\n\n\n//! simple transpose operation (no complex conjugates) for sparse matrices \n\nclass spop_strans\n  {\n  public:\n  \n  template<typename eT>\n  arma_hot inline static void apply_spmat(SpMat<eT>& out, const SpMat<eT>& X);\n  \n  template<typename T1>\n  arma_hot inline static void apply_proxy(SpMat<typename T1::elem_type>& out, const T1& X);\n  \n  template<typename T1>\n  arma_hot inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1,spop_strans>& in);\n  \n  template<typename T1>\n  arma_hot inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1,spop_htrans>& in);\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spop_strans_meat.hpp",
    "content": "// Copyright (C) 2012-2014 Ryan Curtin\n// Copyright (C) 2012-2014 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spop_strans\n//! @{\n\n\n\ntemplate<typename eT>\narma_hot\ninline\nvoid\nspop_strans::apply_spmat(SpMat<eT>& out, const SpMat<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename umat::elem_type ueT;\n  \n  const uword N = X.n_nonzero;\n  \n  if(N == uword(0))\n    {\n    out.zeros(X.n_cols, X.n_rows);\n    return;\n    }\n  \n  umat locs(2, N);\n  \n  typename SpMat<eT>::const_iterator it = X.begin();\n  \n  for(uword count = 0; count < N; ++count)\n    {\n    ueT* locs_ptr = locs.colptr(count);\n    \n    locs_ptr[0] = it.col();\n    locs_ptr[1] = it.row();\n    \n    ++it;\n    }\n  \n  const Col<eT> vals(const_cast<eT*>(X.values), N, false);\n  \n  SpMat<eT> tmp(locs, vals, X.n_cols, X.n_rows);\n  \n  out.steal_mem(tmp);\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nspop_strans::apply_proxy(SpMat<typename T1::elem_type>& out, const T1& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename   T1::elem_type  eT;\n  typedef typename umat::elem_type ueT;\n  \n  const SpProxy<T1> p(X);\n  \n  const uword N = p.get_n_nonzero();\n  \n  if(N == uword(0))\n    {\n    out.zeros(p.get_n_cols(), p.get_n_rows());\n    return;\n    }\n  \n  umat locs(2, N);\n  \n  Col<eT> vals(N);\n  \n  eT* vals_ptr = vals.memptr();\n  \n  typename SpProxy<T1>::const_iterator_type it = p.begin();\n  \n  for(uword count = 0; count < N; ++count)\n    {\n    ueT* locs_ptr = locs.colptr(count);\n    \n    locs_ptr[0] = it.col();\n    locs_ptr[1] = it.row();\n    \n    vals_ptr[count] = (*it);\n    \n    ++it;\n    }\n  \n  SpMat<eT> tmp(locs, vals, p.get_n_cols(), p.get_n_rows());\n  \n  out.steal_mem(tmp);\n  }\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nspop_strans::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1,spop_strans>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(is_SpMat<T1>::value)\n    {\n    const unwrap_spmat<T1> tmp(in.m);\n    \n    spop_strans::apply_spmat(out, tmp.M);\n    }\n  else\n    {\n    spop_strans::apply_proxy(out, in.m);\n    }\n  }\n\n\n\n//! for transpose of non-complex matrices, redirected from spop_htrans::apply()\ntemplate<typename T1>\narma_hot\ninline\nvoid\nspop_strans::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1,spop_htrans>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(is_SpMat<T1>::value)\n    {\n    const unwrap_spmat<T1> tmp(in.m);\n    \n    spop_strans::apply_spmat(out, tmp.M);\n    }\n  else\n    {\n    spop_strans::apply_proxy(out, in.m);\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spop_sum_bones.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spop_sum\n//! @{\n\n\nclass spop_sum\n  {\n  public:\n  \n  template<typename T1>\n  arma_hot inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_sum>& in);\n  };\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spop_sum_meat.hpp",
    "content": "// Copyright (C) 2012 Ryan Curtin\n// Copyright (C) 2012-2015 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spop_sum\n//! @{\n\n\n\ntemplate<typename T1>\narma_hot\ninline\nvoid\nspop_sum::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1,spop_sum>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type eT;\n  \n  const uword dim = in.aux_uword_a;\n  arma_debug_check( (dim > 1), \"sum(): parameter 'dim' must be 0 or 1\" );\n  \n  const SpProxy<T1> p(in.m);\n  \n  const uword p_n_rows = p.get_n_rows();\n  const uword p_n_cols = p.get_n_cols();\n  \n  if(p.get_n_nonzero() == 0)\n    {\n    if(dim == 0)  { out.zeros(1,p_n_cols); }\n    if(dim == 1)  { out.zeros(p_n_rows,1); }\n    \n    return;\n    }\n  \n  if(dim == 0) // find the sum in each column\n    {\n    Row<eT> acc(p_n_cols, fill::zeros);\n    \n    if(SpProxy<T1>::must_use_iterator)\n      {\n      typename SpProxy<T1>::const_iterator_type it     = p.begin();\n      typename SpProxy<T1>::const_iterator_type it_end = p.end();\n      \n      while(it != it_end)  { acc[it.col()] += (*it);  ++it; }\n      }\n    else\n      {\n      for(uword col = 0; col < p_n_cols; ++col)\n        {\n        acc[col] = arrayops::accumulate\n          (\n          &p.get_values()[p.get_col_ptrs()[col]],\n          p.get_col_ptrs()[col + 1] - p.get_col_ptrs()[col]\n          );\n        }\n      }\n    \n    out = acc;\n    }\n  else\n  if(dim == 1)  // find the sum in each row\n    {\n    Col<eT> acc(p_n_rows, fill::zeros);\n    \n    typename SpProxy<T1>::const_iterator_type it     = p.begin();\n    typename SpProxy<T1>::const_iterator_type it_end = p.end();\n    \n    while(it != it_end)  { acc[it.row()] += (*it);  ++it; }\n    \n    out = acc;\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spop_var_bones.hpp",
    "content": "// Copyright (C) 2012 Ryan Curtin\n// Copyright (C) 2012 Conrad Sanderson\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spop_var\n//! @{\n\n\n\n//! Class for finding variance values of a sparse matrix\nclass spop_var\n  {\n  public:\n\n  template<typename T1>\n  inline static void apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1::pod_type, T1, spop_var>& in);\n\n  template<typename T1>\n  inline static void apply_noalias(SpMat<typename T1::pod_type>& out, const SpProxy<T1>& p, const uword norm_type, const uword dim);\n  \n  // Calculate variance of a sparse vector, where we can directly use the memory.\n  template<typename T1>\n  inline static typename T1::pod_type var_vec(const T1& X, const uword norm_type = 0);\n  \n  // Calculate the variance directly.  Because this is for sparse matrices, we\n  // specify both the number of elements in the array (the length of the array)\n  // as well as the actual number of elements when zeros are included.\n  template<typename eT>\n  inline static eT direct_var(const eT* const X, const uword length, const uword N, const uword norm_type = 0);\n\n  // For complex numbers.\n\n  template<typename T>\n  inline static T direct_var(const std::complex<T>* const X, const uword length, const uword N, const uword norm_type = 0);\n\n  // Calculate the variance using iterators, for non-complex numbers.\n  template<typename T1, typename eT>\n  inline static eT iterator_var(T1& it, const T1& end, const uword n_zero, const uword norm_type, const eT junk1, const typename arma_not_cx<eT>::result* junk2 = 0);\n\n  // Calculate the variance using iterators, for complex numbers.\n  template<typename T1, typename eT>\n  inline static typename get_pod_type<eT>::result iterator_var(T1& it, const T1& end, const uword n_zero, const uword norm_type, const eT junk1, const typename arma_cx_only<eT>::result* junk2 = 0);\n\n  };\n\n\n\n//! @}\n  \n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/spop_var_meat.hpp",
    "content": "// Copyright (C) 2012 Ryan Curtin\n// Copyright (C) 2012-2015 Conrad Sanderson\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup spop_var\n//! @{\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_var::apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1::pod_type, T1, spop_var>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  //typedef typename T1::elem_type  in_eT;\n  typedef typename T1::pod_type  out_eT;\n  \n  const uword norm_type = in.aux_uword_a;\n  const uword dim       = in.aux_uword_b;\n  \n  arma_debug_check( (norm_type > 1), \"var(): parameter 'norm_type' must be 0 or 1\" );\n  arma_debug_check( (dim > 1),       \"var(): parameter 'dim' must be 0 or 1\"       );\n  \n  const SpProxy<T1> p(in.m);\n  \n  if(p.is_alias(out) == false)\n    {\n    spop_var::apply_noalias(out, p, norm_type, dim);\n    }\n  else\n    {\n    SpMat<out_eT> tmp;\n    \n    spop_var::apply_noalias(tmp, p, norm_type, dim);\n    \n    out.steal_mem(tmp);\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\nvoid\nspop_var::apply_noalias\n  (\n        SpMat<typename T1::pod_type>& out,\n  const SpProxy<T1>&                  p,\n  const uword                         norm_type,\n  const uword                         dim\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  typedef typename T1::elem_type  in_eT;\n  //typedef typename T1::pod_type  out_eT;\n  \n  const uword p_n_rows = p.get_n_rows();\n  const uword p_n_cols = p.get_n_cols();\n  \n  // TODO: this is slow; rewrite based on the approach used by sparse mean()\n  \n  if(dim == 0)  // find variance in each column\n    {\n    arma_extra_debug_print(\"spop_var::apply_noalias(): dim = 0\");\n    \n    out.set_size((p_n_rows > 0) ? 1 : 0, p_n_cols);\n    \n    if( (p_n_rows == 0) || (p.get_n_nonzero() == 0) )  { return; }\n    \n    for(uword col = 0; col < p_n_cols; ++col)\n      {\n      if(SpProxy<T1>::must_use_iterator)\n        {\n        // We must use an iterator; we can't access memory directly.\n        typename SpProxy<T1>::const_iterator_type it  = p.begin_col(col);\n        typename SpProxy<T1>::const_iterator_type end = p.begin_col(col + 1);\n        \n        const uword n_zero = p_n_rows - (end.pos() - it.pos());\n        \n        // in_eT is used just to get the specialization right (complex / noncomplex)\n        out.at(0, col) = spop_var::iterator_var(it, end, n_zero, norm_type, in_eT(0));\n        }\n      else\n        {\n        // We can use direct memory access to calculate the variance.\n        out.at(0, col) = spop_var::direct_var\n          (\n          &p.get_values()[p.get_col_ptrs()[col]],\n          p.get_col_ptrs()[col + 1] - p.get_col_ptrs()[col],\n          p_n_rows,\n          norm_type\n          );\n        }\n      }\n    }\n  else\n  if(dim == 1)  // find variance in each row\n    {\n    arma_extra_debug_print(\"spop_var::apply_noalias(): dim = 1\");\n    \n    out.set_size(p_n_rows, (p_n_cols > 0) ? 1 : 0);\n    \n    if( (p_n_cols == 0) || (p.get_n_nonzero() == 0) )  { return; }\n    \n    for(uword row = 0; row < p_n_rows; ++row)\n      {\n      // We have to use an iterator here regardless of whether or not we can\n      // directly access memory.\n      typename SpProxy<T1>::const_row_iterator_type it  = p.begin_row(row);\n      typename SpProxy<T1>::const_row_iterator_type end = p.end_row(row);\n      \n      const uword n_zero = p_n_cols - (end.pos() - it.pos());\n      \n      out.at(row, 0) = spop_var::iterator_var(it, end, n_zero, norm_type, in_eT(0));\n      }\n    }\n  }\n\n\n\ntemplate<typename T1>\ninline\ntypename T1::pod_type\nspop_var::var_vec\n  (\n  const T1& X,\n  const uword norm_type\n  )\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (norm_type > 1), \"var(): parameter 'norm_type' must be 0 or 1\" );\n  \n  // conditionally unwrap it into a temporary and then directly operate.\n  \n  const unwrap_spmat<T1> tmp(X);\n  \n  return direct_var(tmp.M.values, tmp.M.n_nonzero, tmp.M.n_elem, norm_type);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nspop_var::direct_var\n  (\n  const eT* const X,\n  const uword length,\n  const uword N,\n  const uword norm_type\n  )\n  {\n  arma_extra_debug_sigprint();\n\n  if(length >= 2 && N >= 2)\n    {\n    const eT acc1 = spop_mean::direct_mean(X, length, N);\n\n    eT acc2 = eT(0);\n    eT acc3 = eT(0);\n\n    uword i, j;\n\n    for(i = 0, j = 1; j < length; i += 2, j += 2)\n      {\n      const eT Xi = X[i];\n      const eT Xj = X[j];\n\n      const eT tmpi = acc1 - Xi;\n      const eT tmpj = acc1 - Xj;\n\n      acc2 += tmpi * tmpi + tmpj * tmpj;\n      acc3 += tmpi + tmpj;\n      }\n\n    if(i < length)\n      {\n      const eT Xi = X[i];\n\n      const eT tmpi = acc1 - Xi;\n\n      acc2 += tmpi * tmpi;\n      acc3 += tmpi;\n      }\n\n    // Now add in all zero elements.\n    acc2 += (N - length) * (acc1 * acc1);\n    acc3 += (N - length) * acc1;\n\n    const eT norm_val = (norm_type == 0) ? eT(N - 1) : eT(N);\n    const eT var_val  = (acc2 - (acc3 * acc3) / eT(N)) / norm_val;\n\n    return var_val;\n    }\n  else if(length == 1 && N > 1) // if N == 1, then variance is zero.\n    {\n    const eT mean = X[0] / eT(N);\n    const eT val = mean - X[0];\n\n    const eT acc2 = (val * val) + (N - length) * (mean * mean);\n    const eT acc3 = val + (N - length) * mean;\n\n    const eT norm_val = (norm_type == 0) ? eT(N - 1) : eT(N);\n    const eT var_val  = (acc2 - (acc3 * acc3) / eT(N)) / norm_val;\n\n    return var_val;\n    }\n  else\n    {\n    return eT(0);\n    }\n  }\n\n\n\ntemplate<typename T>\ninline\nT\nspop_var::direct_var\n  (\n  const std::complex<T>* const X,\n  const uword length,\n  const uword N,\n  const uword norm_type\n  )\n  {\n  arma_extra_debug_sigprint();\n\n  typedef typename std::complex<T> eT;\n\n  if(length >= 2 && N >= 2)\n    {\n    const eT acc1 = spop_mean::direct_mean(X, length, N);\n\n     T acc2 =  T(0);\n    eT acc3 = eT(0);\n\n    for (uword i = 0; i < length; ++i)\n      {\n      const eT tmp = acc1 - X[i];\n\n      acc2 += std::norm(tmp);\n      acc3 += tmp;\n      }\n\n    // Add zero elements to sums\n    acc2 += std::norm(acc1) * T(N - length);\n    acc3 += acc1 * T(N - length);\n\n    const T norm_val = (norm_type == 0) ? T(N - 1) : T(N);\n    const T var_val  = (acc2 - std::norm(acc3) / T(N)) / norm_val;\n\n    return var_val;\n    }\n  else if(length == 1 && N > 1) // if N == 1, then variance is zero.\n    {\n    const eT mean = X[0] / T(N);\n    const eT val = mean - X[0];\n\n    const T acc2 = std::norm(val) + (N - length) * std::norm(mean);\n    const eT acc3 = val + T(N - length) * mean;\n\n    const T norm_val = (norm_type == 0) ? T(N - 1) : T(N);\n    const T var_val  = (acc2 - std::norm(acc3) / T(N)) / norm_val;\n\n    return var_val;\n    }\n  else\n    {\n    return T(0); // All elements are zero\n    }\n  }\n\n\n\ntemplate<typename T1, typename eT>\ninline\neT\nspop_var::iterator_var\n  (\n  T1& it,\n  const T1& end,\n  const uword n_zero,\n  const uword norm_type,\n  const eT junk1,\n  const typename arma_not_cx<eT>::result* junk2\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n\n  T1 new_it(it); // for mean\n  // T1 backup_it(it); // in case we have to call robust iterator_var\n  eT mean = spop_mean::iterator_mean(new_it, end, n_zero, eT(0));\n\n  eT acc2 = eT(0);\n  eT acc3 = eT(0);\n\n  const uword it_begin_pos = it.pos();\n\n  while (it != end)\n    {\n    const eT tmp = mean - (*it);\n\n    acc2 += (tmp * tmp);\n    acc3 += (tmp);\n\n    ++it;\n    }\n\n  const uword n_nonzero = (it.pos() - it_begin_pos);\n  if (n_nonzero == 0)\n    {\n    return eT(0);\n    }\n\n  if (n_nonzero + n_zero == 1)\n    {\n    return eT(0); // only one element\n    }\n\n  // Add in entries for zeros.\n  acc2 += eT(n_zero) * (mean * mean);\n  acc3 += eT(n_zero) * mean;\n\n  const eT norm_val = (norm_type == 0) ? eT(n_zero + n_nonzero - 1) : eT(n_zero + n_nonzero);\n  const eT var_val  = (acc2 - (acc3 * acc3) / eT(n_nonzero + n_zero)) / norm_val;\n\n  return var_val;\n  }\n\n\n\ntemplate<typename T1, typename eT>\ninline\ntypename get_pod_type<eT>::result\nspop_var::iterator_var\n  (\n  T1& it,\n  const T1& end,\n  const uword n_zero,\n  const uword norm_type,\n  const eT junk1,\n  const typename arma_cx_only<eT>::result* junk2\n  )\n  {\n  arma_extra_debug_sigprint();\n  arma_ignore(junk1);\n  arma_ignore(junk2);\n\n  typedef typename get_pod_type<eT>::result T;\n\n  T1 new_it(it); // for mean\n  // T1 backup_it(it); // in case we have to call robust iterator_var\n  eT mean = spop_mean::iterator_mean(new_it, end, n_zero, eT(0));\n\n   T acc2 =  T(0);\n  eT acc3 = eT(0);\n\n  const uword it_begin_pos = it.pos();\n\n  while (it != end)\n    {\n    eT tmp = mean - (*it);\n\n    acc2 += std::norm(tmp);\n    acc3 += (tmp);\n\n    ++it;\n    }\n\n  const uword n_nonzero = (it.pos() - it_begin_pos);\n  if (n_nonzero == 0)\n    {\n    return T(0);\n    }\n\n  if (n_nonzero + n_zero == 1)\n    {\n    return T(0); // only one element\n    }\n\n  // Add in entries for zero elements.\n  acc2 += T(n_zero) * std::norm(mean);\n  acc3 += T(n_zero) * mean;\n\n  const T norm_val = (norm_type == 0) ? T(n_zero + n_nonzero - 1) : T(n_zero + n_nonzero);\n  const T var_val  = (acc2 - std::norm(acc3) / T(n_nonzero + n_zero)) / norm_val;\n\n  return var_val;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/strip.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup strip\n//! @{\n\n\n\ntemplate<typename T1>\nstruct strip_diagmat\n  {\n  typedef T1 stored_type;\n  \n  arma_hot inline\n  strip_diagmat(const T1& X)\n    : M(X)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  static const bool do_diagmat = false;\n  \n  const T1& M;\n  };\n\n\n\ntemplate<typename T1>\nstruct strip_diagmat< Op<T1, op_diagmat> >\n  {\n  typedef T1 stored_type;\n  \n  arma_hot inline\n  strip_diagmat(const Op<T1, op_diagmat>& X)\n    : M(X.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  static const bool do_diagmat = true;\n  \n  const T1& M;\n  };\n\n\n\ntemplate<typename T1>\nstruct strip_inv\n  {\n  typedef T1 stored_type;\n  \n  arma_hot inline\n  strip_inv(const T1& X)\n    : M(X)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const T1& M;\n  \n  static const bool slow   = false;\n  static const bool do_inv = false;\n  };\n\n\n\ntemplate<typename T1>\nstruct strip_inv< Op<T1, op_inv> >\n  {\n  typedef T1 stored_type;\n  \n  arma_hot inline\n  strip_inv(const Op<T1, op_inv>& X)\n    : M(X.m)\n    , slow(X.aux_uword_a == 1)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const T1&  M;\n  const bool slow;\n  \n  static const bool do_inv = true;\n  };\n\n\n\ntemplate<typename T1>\nstruct strip_inv< Op<T1, op_inv_sympd> >\n  {\n  typedef T1 stored_type;\n  \n  arma_hot inline\n  strip_inv(const Op<T1, op_inv_sympd>& X)\n    : M(X.m)\n    , slow(X.aux_uword_a == 1)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const T1&  M;\n  const bool slow;\n  \n  static const bool do_inv = true;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/subview_bones.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// Copyright (C)      2011 James Sanders\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup subview\n//! @{\n\n\n//! Class for storing data required to construct or apply operations to a submatrix\n//! (i.e. where the submatrix starts and ends as well as a reference/pointer to the original matrix),\ntemplate<typename eT>\nclass subview : public Base<eT, subview<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  arma_aligned const Mat<eT>& m;\n  \n  static const bool is_row = false;\n  static const bool is_col = false;\n  \n  const uword aux_row1;\n  const uword aux_col1;\n  \n  const uword n_rows;\n  const uword n_cols;\n  const uword n_elem;\n  \n  protected:\n  \n  arma_inline subview(const Mat<eT>& in_m, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols);\n  \n  \n  public:\n  \n  inline ~subview();\n  \n  inline void operator=  (const eT val);\n  inline void operator+= (const eT val);\n  inline void operator-= (const eT val);\n  inline void operator*= (const eT val);\n  inline void operator/= (const eT val);\n  \n  // deliberately returning void\n  template<typename T1> inline void operator=  (const Base<eT,T1>& x);\n  template<typename T1> inline void operator+= (const Base<eT,T1>& x);\n  template<typename T1> inline void operator-= (const Base<eT,T1>& x);\n  template<typename T1> inline void operator%= (const Base<eT,T1>& x);\n  template<typename T1> inline void operator/= (const Base<eT,T1>& x);\n  \n  template<typename T1> inline void operator= (const SpBase<eT, T1>& x);\n  template<typename T1> inline void operator+=(const SpBase<eT, T1>& x);\n  template<typename T1> inline void operator-=(const SpBase<eT, T1>& x);\n  template<typename T1> inline void operator%=(const SpBase<eT, T1>& x);\n  template<typename T1> inline void operator/=(const SpBase<eT, T1>& x);\n\n  inline void operator=  (const subview& x);\n  inline void operator+= (const subview& x);\n  inline void operator-= (const subview& x);\n  inline void operator%= (const subview& x);\n  inline void operator/= (const subview& x);\n  \n  template<typename T1, typename gen_type>\n  inline typename enable_if2< is_same_type<typename T1::elem_type, eT>::value, void>::result operator=(const Gen<T1,gen_type>& x);\n  \n  \n  inline static void extract(Mat<eT>& out, const subview& in);\n  \n  inline static void  plus_inplace(Mat<eT>& out, const subview& in);\n  inline static void minus_inplace(Mat<eT>& out, const subview& in);\n  inline static void schur_inplace(Mat<eT>& out, const subview& in);\n  inline static void   div_inplace(Mat<eT>& out, const subview& in);\n  \n  template<typename functor> inline void transform(functor F);\n  template<typename functor> inline void     imbue(functor F);\n  \n  inline void fill(const eT val);\n  inline void zeros();\n  inline void ones();\n  inline void eye();\n  inline void randu();\n  inline void randn();\n  \n  inline eT  at_alt    (const uword ii) const;\n  \n  inline eT& operator[](const uword ii);\n  inline eT  operator[](const uword ii) const;\n  \n  inline eT& operator()(const uword ii);\n  inline eT  operator()(const uword ii) const;\n  \n  inline eT& operator()(const uword in_row, const uword in_col);\n  inline eT  operator()(const uword in_row, const uword in_col) const;\n  \n  inline eT&         at(const uword in_row, const uword in_col);\n  inline eT          at(const uword in_row, const uword in_col) const;\n  \n  arma_inline       eT* colptr(const uword in_col);\n  arma_inline const eT* colptr(const uword in_col) const;\n  \n  inline bool check_overlap(const subview& x) const;\n  \n  inline arma_warn_unused bool is_vec()    const;\n  inline arma_warn_unused bool is_finite() const;\n  \n  inline arma_warn_unused bool has_inf() const;\n  inline arma_warn_unused bool has_nan() const;\n  \n  inline       subview_row<eT> row(const uword row_num);\n  inline const subview_row<eT> row(const uword row_num) const;\n  \n  inline            subview_row<eT> operator()(const uword row_num, const span& col_span);\n  inline      const subview_row<eT> operator()(const uword row_num, const span& col_span) const;\n  \n  inline       subview_col<eT> col(const uword col_num);\n  inline const subview_col<eT> col(const uword col_num) const;\n  \n  inline            subview_col<eT> operator()(const span& row_span, const uword col_num);\n  inline      const subview_col<eT> operator()(const span& row_span, const uword col_num) const;\n  \n  inline            Col<eT>  unsafe_col(const uword col_num);\n  inline      const Col<eT>  unsafe_col(const uword col_num) const;\n  \n  inline       subview<eT> rows(const uword in_row1, const uword in_row2);\n  inline const subview<eT> rows(const uword in_row1, const uword in_row2) const;\n  \n  inline       subview<eT> cols(const uword in_col1, const uword in_col2);\n  inline const subview<eT> cols(const uword in_col1, const uword in_col2) const;\n  \n  inline       subview<eT> submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2);\n  inline const subview<eT> submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const;\n  \n  inline            subview<eT> submat    (const span& row_span, const span& col_span);\n  inline      const subview<eT> submat    (const span& row_span, const span& col_span) const;\n  \n  inline            subview<eT> operator()(const span& row_span, const span& col_span);\n  inline      const subview<eT> operator()(const span& row_span, const span& col_span) const;\n  \n  inline subview_each1< subview<eT>, 0 > each_col();\n  inline subview_each1< subview<eT>, 1 > each_row();\n  \n  template<typename T1> inline subview_each2< subview<eT>, 0, T1 > each_col(const Base<uword, T1>& indices);\n  template<typename T1> inline subview_each2< subview<eT>, 1, T1 > each_row(const Base<uword, T1>& indices);\n  \n  inline       diagview<eT> diag(const sword in_id = 0);\n  inline const diagview<eT> diag(const sword in_id = 0) const;\n  \n  inline void swap_rows(const uword in_row1, const uword in_row2);\n  inline void swap_cols(const uword in_col1, const uword in_col2);\n  \n  \n  private:\n  \n  friend class Mat<eT>;\n  subview();\n  };\n\n\n\ntemplate<typename eT>\nclass subview_col : public subview<eT>\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  const eT* colmem;\n  \n  inline void operator= (const subview<eT>& x);\n  inline void operator= (const subview_col& x);\n  inline void operator= (const eT val);\n  \n  template<typename T1>\n  inline void operator= (const Base<eT,T1>& x);\n  \n  template<typename T1, typename gen_type>\n  inline typename enable_if2< is_same_type<typename T1::elem_type, eT>::value, void>::result operator=(const Gen<T1,gen_type>& x);\n  \n  arma_inline const Op<subview_col<eT>,op_htrans>  t() const;\n  arma_inline const Op<subview_col<eT>,op_htrans> ht() const;\n  arma_inline const Op<subview_col<eT>,op_strans> st() const;\n  \n  inline void fill(const eT val);\n  inline void zeros();\n  inline void ones();\n  \n  arma_inline eT  at_alt    (const uword i) const;\n  \n  arma_inline eT& operator[](const uword i);\n  arma_inline eT  operator[](const uword i) const;\n  \n  inline eT& operator()(const uword i);\n  inline eT  operator()(const uword i) const;\n  \n  inline eT& operator()(const uword in_row, const uword in_col);\n  inline eT  operator()(const uword in_row, const uword in_col) const;\n  \n  inline eT&         at(const uword in_row, const uword in_col);\n  inline eT          at(const uword in_row, const uword in_col) const;\n  \n  arma_inline       eT* colptr(const uword in_col);\n  arma_inline const eT* colptr(const uword in_col) const;\n  \n  inline       subview_col<eT> rows(const uword in_row1, const uword in_row2);\n  inline const subview_col<eT> rows(const uword in_row1, const uword in_row2) const;\n  \n  inline       subview_col<eT> subvec(const uword in_row1, const uword in_row2);\n  inline const subview_col<eT> subvec(const uword in_row1, const uword in_row2) const;\n  \n  inline       subview_col<eT> head(const uword N);\n  inline const subview_col<eT> head(const uword N) const;\n  \n  inline       subview_col<eT> tail(const uword N);\n  inline const subview_col<eT> tail(const uword N) const;\n  \n  \n  protected:\n  \n  inline subview_col(const Mat<eT>& in_m, const uword in_col);\n  inline subview_col(const Mat<eT>& in_m, const uword in_col, const uword in_row1, const uword in_n_rows);\n  \n  \n  private:\n  \n  friend class Mat<eT>;\n  friend class Col<eT>;\n  friend class subview<eT>;\n  \n  subview_col();\n  };\n\n\n\ntemplate<typename eT>\nclass subview_row : public subview<eT>\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool is_row = true;\n  static const bool is_col = false;\n  \n  inline void operator= (const subview<eT>& x);\n  inline void operator= (const subview_row& x);\n  inline void operator= (const eT val);\n  \n  template<typename T1>\n  inline void operator= (const Base<eT,T1>& x);\n  \n  template<typename T1, typename gen_type>\n  inline typename enable_if2< is_same_type<typename T1::elem_type, eT>::value, void>::result operator=(const Gen<T1,gen_type>& x);\n  \n  arma_inline const Op<subview_row<eT>,op_htrans>  t() const;\n  arma_inline const Op<subview_row<eT>,op_htrans> ht() const;\n  arma_inline const Op<subview_row<eT>,op_strans> st() const;\n  \n  inline eT  at_alt    (const uword i) const;\n  \n  inline eT& operator[](const uword i);\n  inline eT  operator[](const uword i) const;\n  \n  inline eT& operator()(const uword i);\n  inline eT  operator()(const uword i) const;\n  \n  inline eT& operator()(const uword in_row, const uword in_col);\n  inline eT  operator()(const uword in_row, const uword in_col) const;\n  \n  inline eT&         at(const uword in_row, const uword in_col);\n  inline eT          at(const uword in_row, const uword in_col) const;\n  \n  inline       subview_row<eT> cols(const uword in_col1, const uword in_col2);\n  inline const subview_row<eT> cols(const uword in_col1, const uword in_col2) const;\n  \n  inline       subview_row<eT> subvec(const uword in_col1, const uword in_col2);\n  inline const subview_row<eT> subvec(const uword in_col1, const uword in_col2) const;\n  \n  inline       subview_row<eT> head(const uword N);\n  inline const subview_row<eT> head(const uword N) const;\n  \n  inline       subview_row<eT> tail(const uword N);\n  inline const subview_row<eT> tail(const uword N) const;\n  \n  \n  protected:\n  \n  inline subview_row(const Mat<eT>& in_m, const uword in_row);\n  inline subview_row(const Mat<eT>& in_m, const uword in_row, const uword in_col1, const uword in_n_cols);\n  \n  \n  private:\n  \n  friend class Mat<eT>;\n  friend class Row<eT>;\n  friend class subview<eT>;\n  \n  subview_row();\n  };\n\n\n\ntemplate<typename eT>\nclass subview_row_strans : public Base<eT, subview_row_strans<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const subview_row<eT>& sv_row;\n  \n         const uword n_rows;     // equal to n_elem\n         const uword n_elem;\n  static const uword n_cols = 1;\n  \n  \n  inline explicit subview_row_strans(const subview_row<eT>& in_sv_row);\n  \n  inline void extract(Mat<eT>& out) const;\n  \n  inline eT  at_alt    (const uword i) const;\n  \n  inline eT  operator[](const uword i) const;\n  inline eT  operator()(const uword i) const;\n  \n  inline eT  operator()(const uword in_row, const uword in_col) const;\n  inline eT          at(const uword in_row, const uword in_col) const;\n  };\n\n\n\ntemplate<typename eT>\nclass subview_row_htrans : public Base<eT, subview_row_htrans<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const subview_row<eT>& sv_row;\n  \n         const uword n_rows;     // equal to n_elem\n         const uword n_elem;\n  static const uword n_cols = 1;\n  \n  \n  inline explicit subview_row_htrans(const subview_row<eT>& in_sv_row);\n  \n  inline void extract(Mat<eT>& out) const;\n  \n  inline eT  at_alt    (const uword i) const;\n  \n  inline eT  operator[](const uword i) const;\n  inline eT  operator()(const uword i) const;\n  \n  inline eT  operator()(const uword in_row, const uword in_col) const;\n  inline eT          at(const uword in_row, const uword in_col) const;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/subview_cube_bones.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup subview_cube\n//! @{\n\n\n//! Class for storing data required to construct or apply operations to a subcube\n//! (i.e. where the subcube starts and ends as well as a reference/pointer to the original cube),\ntemplate<typename eT>\nclass subview_cube : public BaseCube<eT, subview_cube<eT> >\n  {\n  public:    \n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  arma_aligned const Cube<eT>& m;\n  \n  const uword aux_row1;\n  const uword aux_col1;\n  const uword aux_slice1;\n  \n  const uword n_rows;\n  const uword n_cols;\n  const uword n_elem_slice;\n  const uword n_slices;\n  const uword n_elem;\n  \n  \n  protected:\n  \n  arma_inline subview_cube(const Cube<eT>& in_m, const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_n_rows, const uword in_n_cols, const uword in_n_slices);\n  \n  \n  public:\n  \n  inline ~subview_cube();\n  \n  inline void operator=  (const eT val);\n  inline void operator+= (const eT val);\n  inline void operator-= (const eT val);\n  inline void operator*= (const eT val);\n  inline void operator/= (const eT val);\n  \n  // deliberately returning void\n  template<typename T1> inline void operator=  (const BaseCube<eT,T1>& x);\n  template<typename T1> inline void operator+= (const BaseCube<eT,T1>& x);\n  template<typename T1> inline void operator-= (const BaseCube<eT,T1>& x);\n  template<typename T1> inline void operator%= (const BaseCube<eT,T1>& x);\n  template<typename T1> inline void operator/= (const BaseCube<eT,T1>& x);\n  \n  inline void operator=  (const subview_cube& x);\n  inline void operator+= (const subview_cube& x);\n  inline void operator-= (const subview_cube& x);\n  inline void operator%= (const subview_cube& x);\n  inline void operator/= (const subview_cube& x);\n  \n  template<typename T1> inline void operator=  (const Base<eT,T1>& x);\n  template<typename T1> inline void operator+= (const Base<eT,T1>& x);\n  template<typename T1> inline void operator-= (const Base<eT,T1>& x);\n  template<typename T1> inline void operator%= (const Base<eT,T1>& x);\n  template<typename T1> inline void operator/= (const Base<eT,T1>& x);\n\n  inline static void       extract(Cube<eT>& out, const subview_cube& in);\n  inline static void  plus_inplace(Cube<eT>& out, const subview_cube& in);\n  inline static void minus_inplace(Cube<eT>& out, const subview_cube& in);\n  inline static void schur_inplace(Cube<eT>& out, const subview_cube& in);\n  inline static void   div_inplace(Cube<eT>& out, const subview_cube& in);\n  \n  inline static void       extract(Mat<eT>& out, const subview_cube& in);\n  inline static void  plus_inplace(Mat<eT>& out, const subview_cube& in);\n  inline static void minus_inplace(Mat<eT>& out, const subview_cube& in);\n  inline static void schur_inplace(Mat<eT>& out, const subview_cube& in);\n  inline static void   div_inplace(Mat<eT>& out, const subview_cube& in);\n  \n  template<typename functor> inline void transform(functor F);\n  template<typename functor> inline void     imbue(functor F);\n  \n  inline void fill(const eT val);\n  inline void zeros();\n  inline void ones();\n  inline void randu();\n  inline void randn();\n  \n  inline arma_warn_unused bool is_finite() const;\n  \n  inline arma_warn_unused bool has_inf() const;\n  inline arma_warn_unused bool has_nan() const;\n  \n  inline arma_warn_unused eT min() const;\n  inline arma_warn_unused eT max() const;\n  \n  inline eT  at_alt    (const uword i) const;\n  \n  inline eT& operator[](const uword i);\n  inline eT  operator[](const uword i) const;\n  \n  inline eT& operator()(const uword i);\n  inline eT  operator()(const uword i) const;\n  \n  arma_inline eT& operator()(const uword in_row, const uword in_col, const uword in_slice);\n  arma_inline eT  operator()(const uword in_row, const uword in_col, const uword in_slice) const;\n  \n  arma_inline eT&         at(const uword in_row, const uword in_col, const uword in_slice);\n  arma_inline eT          at(const uword in_row, const uword in_col, const uword in_slice) const;\n  \n  arma_inline       eT* slice_colptr(const uword in_slice, const uword in_col);\n  arma_inline const eT* slice_colptr(const uword in_slice, const uword in_col) const;\n  \n  inline bool check_overlap(const subview_cube& x) const;\n  inline bool check_overlap(const Mat<eT>&      x) const;\n  \n  \n  private:\n  \n  friend class  Mat<eT>;\n  friend class Cube<eT>;\n  \n  subview_cube();\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/subview_cube_meat.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup subview_cube\n//! @{\n\n\ntemplate<typename eT>\ninline\nsubview_cube<eT>::~subview_cube()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nsubview_cube<eT>::subview_cube\n  (\n  const Cube<eT>& in_m,\n  const uword     in_row1,\n  const uword     in_col1,\n  const uword     in_slice1,\n  const uword     in_n_rows,\n  const uword     in_n_cols,\n  const uword     in_n_slices\n  )\n  : m           (in_m)\n  , aux_row1    (in_row1)\n  , aux_col1    (in_col1)\n  , aux_slice1  (in_slice1)\n  , n_rows      (in_n_rows)\n  , n_cols      (in_n_cols)\n  , n_elem_slice(in_n_rows * in_n_cols)\n  , n_slices    (in_n_slices)\n  , n_elem      (n_elem_slice * in_n_slices)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::operator= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem != 1)\n    {\n    arma_debug_assert_same_size(n_rows, n_cols, n_slices, 1, 1, 1, \"copy into subcube\");\n    }\n  \n  Cube<eT>& Q = const_cast< Cube<eT>& >(m);\n  \n  Q.at(aux_row1, aux_col1, aux_slice1) = val;\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::operator+= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  for(uword slice = 0; slice < local_n_slices; ++slice)\n    {\n    for(uword col = 0; col < local_n_cols; ++col)\n      {\n      arrayops::inplace_plus( slice_colptr(slice,col), val, local_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::operator-= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  for(uword slice = 0; slice < local_n_slices; ++slice)\n    {\n    for(uword col = 0; col < local_n_cols; ++col)\n      {\n      arrayops::inplace_minus( slice_colptr(slice,col), val, local_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::operator*= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  for(uword slice = 0; slice < local_n_slices; ++slice)\n    {\n    for(uword col = 0; col < local_n_cols; ++col)\n      {\n      arrayops::inplace_mul( slice_colptr(slice,col), val, local_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::operator/= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  for(uword slice = 0; slice < local_n_slices; ++slice)\n    {\n    for(uword col = 0; col < local_n_cols; ++col)\n      {\n      arrayops::inplace_div( slice_colptr(slice,col), val, local_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview_cube<eT>::operator= (const BaseCube<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap_cube<T1> tmp(in.get_ref());\n  \n  const Cube<eT>&         x = tmp.M;\n        subview_cube<eT>& t = *this;\n  \n  arma_debug_assert_same_size(t, x, \"copy into subcube\");\n  \n  const uword t_n_rows   = t.n_rows;\n  const uword t_n_cols   = t.n_cols;\n  const uword t_n_slices = t.n_slices;\n  \n  for(uword slice = 0; slice < t_n_slices; ++slice)\n    {\n    for(uword col = 0; col < t_n_cols; ++col)\n      {\n      arrayops::copy( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview_cube<eT>::operator+= (const BaseCube<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap_cube<T1> tmp(in.get_ref());\n  \n  const Cube<eT>&         x = tmp.M;\n        subview_cube<eT>& t = *this;\n  \n  arma_debug_assert_same_size(t, x, \"addition\");\n  \n  const uword t_n_rows   = t.n_rows;\n  const uword t_n_cols   = t.n_cols;\n  const uword t_n_slices = t.n_slices;\n  \n  for(uword slice = 0; slice < t_n_slices; ++slice)\n    {\n    for(uword col = 0; col < t_n_cols; ++col)\n      {\n      arrayops::inplace_plus( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview_cube<eT>::operator-= (const BaseCube<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap_cube<T1> tmp(in.get_ref());\n  \n  const Cube<eT>&         x = tmp.M;\n        subview_cube<eT>& t = *this;\n  \n  arma_debug_assert_same_size(t, x, \"subtraction\");\n  \n  const uword t_n_rows   = t.n_rows;\n  const uword t_n_cols   = t.n_cols;\n  const uword t_n_slices = t.n_slices;\n  \n  for(uword slice = 0; slice < t_n_slices; ++slice)\n    {\n    for(uword col = 0; col < t_n_cols; ++col)\n      {\n      arrayops::inplace_minus( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview_cube<eT>::operator%= (const BaseCube<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap_cube<T1> tmp(in.get_ref());\n  \n  const Cube<eT>&         x = tmp.M;\n        subview_cube<eT>& t = *this;\n  \n  arma_debug_assert_same_size(t, x, \"element-wise multiplication\");\n  \n  const uword t_n_rows   = t.n_rows;\n  const uword t_n_cols   = t.n_cols;\n  const uword t_n_slices = t.n_slices;\n  \n  for(uword slice = 0; slice < t_n_slices; ++slice)\n    {\n    for(uword col = 0; col < t_n_cols; ++col)\n      {\n      arrayops::inplace_mul( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview_cube<eT>::operator/= (const BaseCube<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap_cube<T1> tmp(in.get_ref());\n  \n  const Cube<eT>&         x = tmp.M;\n        subview_cube<eT>& t = *this;\n  \n  arma_debug_assert_same_size(t, x, \"element-wise division\");\n  \n  const uword t_n_rows   = t.n_rows;\n  const uword t_n_cols   = t.n_cols;\n  const uword t_n_slices = t.n_slices;\n  \n  for(uword slice = 0; slice < t_n_slices; ++slice)\n    {\n    for(uword col = 0; col < t_n_cols; ++col)\n      {\n      arrayops::inplace_div( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );\n      }\n    }\n  }\n\n\n\n//! x.subcube(...) = y.subcube(...)\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::operator= (const subview_cube<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(check_overlap(x))\n    {\n    const Cube<eT> tmp(x);\n    \n    (*this).operator=(tmp);\n    \n    return;\n    }\n  \n  subview_cube<eT>& t = *this;\n  \n  arma_debug_assert_same_size(t, x, \"copy into subcube\");\n  \n  const uword t_n_rows   = t.n_rows;\n  const uword t_n_cols   = t.n_cols;\n  const uword t_n_slices = t.n_slices;\n  \n  for(uword slice = 0; slice < t_n_slices; ++slice)\n    {\n    for(uword col = 0; col < t_n_cols; ++col)\n      {\n      arrayops::copy( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::operator+= (const subview_cube<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(check_overlap(x))\n    {\n    const Cube<eT> tmp(x);\n    \n    (*this).operator+=(tmp);\n    \n    return;\n    }\n  \n  subview_cube<eT>& t = *this;\n  \n  arma_debug_assert_same_size(t, x, \"addition\");\n  \n  const uword t_n_rows   = t.n_rows;\n  const uword t_n_cols   = t.n_cols;\n  const uword t_n_slices = t.n_slices;\n  \n  for(uword slice = 0; slice < t_n_slices; ++slice)\n    {\n    for(uword col = 0; col < t_n_cols; ++col)\n      {\n      arrayops::inplace_plus( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::operator-= (const subview_cube<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(check_overlap(x))\n    {\n    const Cube<eT> tmp(x);\n    \n    (*this).operator-=(tmp);\n    \n    return;\n    }\n  \n  subview_cube<eT>& t = *this;\n  \n  arma_debug_assert_same_size(t, x, \"subtraction\");\n  \n  const uword t_n_rows   = t.n_rows;\n  const uword t_n_cols   = t.n_cols;\n  const uword t_n_slices = t.n_slices;\n  \n  for(uword slice = 0; slice < t_n_slices; ++slice)\n    {\n    for(uword col = 0; col < t_n_cols; ++col)\n      {\n      arrayops::inplace_minus( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::operator%= (const subview_cube<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(check_overlap(x))\n    {\n    const Cube<eT> tmp(x);\n    \n    (*this).operator%=(tmp);\n    \n    return;\n    }\n  \n  subview_cube<eT>& t = *this;\n  \n  arma_debug_assert_same_size(t, x, \"element-wise multiplication\");\n  \n  const uword t_n_rows   = t.n_rows;\n  const uword t_n_cols   = t.n_cols;\n  const uword t_n_slices = t.n_slices;\n  \n  for(uword slice = 0; slice < t_n_slices; ++slice)\n    {\n    for(uword col = 0; col < t_n_cols; ++col)\n      {\n      arrayops::inplace_mul( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::operator/= (const subview_cube<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(check_overlap(x))\n    {\n    const Cube<eT> tmp(x);\n    \n    (*this).operator/=(tmp);\n    \n    return;\n    }\n  \n  subview_cube<eT>& t = *this;\n  \n  arma_debug_assert_same_size(t, x, \"element-wise division\");\n  \n  const uword t_n_rows   = t.n_rows;\n  const uword t_n_cols   = t.n_cols;\n  const uword t_n_slices = t.n_slices;\n  \n  for(uword slice = 0; slice < t_n_slices; ++slice)\n    {\n    for(uword col = 0; col < t_n_cols; ++col)\n      {\n      arrayops::inplace_div( t.slice_colptr(slice,col), x.slice_colptr(slice,col), t_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview_cube<eT>::operator= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1> tmp(in.get_ref());\n  \n  const Mat<eT>&          x = tmp.M;\n        subview_cube<eT>& t = *this;\n  \n  const uword t_n_rows   = t.n_rows;\n  const uword t_n_cols   = t.n_cols;\n  const uword t_n_slices = t.n_slices;\n  \n  const uword x_n_rows   = x.n_rows;\n  const uword x_n_cols   = x.n_cols;\n  \n  if( ((x_n_rows == 1) || (x_n_cols == 1)) && (t_n_rows == 1) && (t_n_cols == 1) && (x.n_elem == t_n_slices) )\n    {\n    Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);\n    \n    const uword t_aux_row1   = t.aux_row1;\n    const uword t_aux_col1   = t.aux_col1;\n    const uword t_aux_slice1 = t.aux_slice1;\n    \n    const eT* x_mem = x.memptr();\n    \n    uword i,j;\n    for(i=0, j=1; j < t_n_slices; i+=2, j+=2)\n      {\n      const eT tmp_i = x_mem[i];\n      const eT tmp_j = x_mem[j];\n      \n      Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) = tmp_i;\n      Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + j) = tmp_j;\n      }\n    \n    if(i < t_n_slices)\n      {\n      Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) = x_mem[i];\n      }\n    }\n  else\n  if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )\n    {\n    // interpret the matrix as a cube with one slice\n    \n    for(uword col = 0; col < t_n_cols; ++col)\n      {\n      arrayops::copy( t.slice_colptr(0, col), x.colptr(col), t_n_rows );\n      }\n    }\n  else\n  if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )\n    {\n    for(uword i=0; i < t_n_slices; ++i)\n      {\n      arrayops::copy( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );\n      }\n    }\n  else\n  if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )\n    {\n    Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);\n    \n    const uword t_aux_row1   = t.aux_row1;\n    const uword t_aux_col1   = t.aux_col1;\n    const uword t_aux_slice1 = t.aux_slice1;\n    \n    for(uword slice=0; slice < t_n_slices; ++slice)\n      {\n      const uword mod_slice = t_aux_slice1 + slice;\n      \n      const eT* x_colptr = x.colptr(slice);\n      \n      uword i,j;\n      for(i=0, j=1; j < t_n_cols; i+=2, j+=2)\n        {\n        const eT tmp_i = x_colptr[i];\n        const eT tmp_j = x_colptr[j];\n        \n        Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) = tmp_i;\n        Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) = tmp_j;\n        }\n      \n      if(i < t_n_cols)\n        {\n        Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) = x_colptr[i];\n        }\n      }\n    }\n  else\n    {\n    if(arma_config::debug == true)\n      {\n      arma_stop( arma_incompat_size_string(t, x, \"copy into subcube\") );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview_cube<eT>::operator+= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1> tmp(in.get_ref());\n  \n  const Mat<eT>&          x = tmp.M;\n        subview_cube<eT>& t = *this;\n  \n  const uword t_n_rows   = t.n_rows;\n  const uword t_n_cols   = t.n_cols;\n  const uword t_n_slices = t.n_slices;\n  \n  const uword x_n_rows   = x.n_rows;\n  const uword x_n_cols   = x.n_cols;\n  \n  if( ((x_n_rows == 1) || (x_n_cols == 1)) && (t_n_rows == 1) && (t_n_cols == 1) && (x.n_elem == t_n_slices) )\n    {\n    Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);\n    \n    const uword t_aux_row1   = t.aux_row1;\n    const uword t_aux_col1   = t.aux_col1;\n    const uword t_aux_slice1 = t.aux_slice1;\n    \n    const eT* x_mem = x.memptr();\n    \n    uword i,j;\n    for(i=0, j=1; j < t_n_slices; i+=2, j+=2)\n      {\n      const eT tmp_i = x_mem[i];\n      const eT tmp_j = x_mem[j];\n      \n      Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) += tmp_i;\n      Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + j) += tmp_j;\n      }\n    \n    if(i < t_n_slices)\n      {\n      Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) += x_mem[i];\n      }\n    }\n  else\n  if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )\n    {\n    for(uword col = 0; col < t_n_cols; ++col)\n      {\n      arrayops::inplace_plus( t.slice_colptr(0, col), x.colptr(col), t_n_rows );\n      }\n    }\n  else\n  if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )\n    {\n    for(uword i=0; i < t_n_slices; ++i)\n      {\n      arrayops::inplace_plus( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );\n      }\n    }\n  else\n  if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )\n    {\n    Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);\n    \n    const uword t_aux_row1   = t.aux_row1;\n    const uword t_aux_col1   = t.aux_col1;\n    const uword t_aux_slice1 = t.aux_slice1;\n    \n    for(uword slice=0; slice < t_n_slices; ++slice)\n      {\n      const uword mod_slice = t_aux_slice1 + slice;\n      \n      const eT* x_colptr = x.colptr(slice);\n      \n      uword i,j;\n      for(i=0, j=1; j < t_n_cols; i+=2, j+=2)\n        {\n        const eT tmp_i = x_colptr[i];\n        const eT tmp_j = x_colptr[j];\n        \n        Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) += tmp_i;\n        Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) += tmp_j;\n        }\n      \n      if(i < t_n_cols)\n        {\n        Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) += x_colptr[i];\n        }\n      }\n    }\n  else\n    {\n    if(arma_config::debug == true)\n      {\n      arma_stop( arma_incompat_size_string(t, x, \"addition\") );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview_cube<eT>::operator-= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1> tmp(in.get_ref());\n  \n  const Mat<eT>&          x = tmp.M;\n        subview_cube<eT>& t = *this;\n  \n  const uword t_n_rows   = t.n_rows;\n  const uword t_n_cols   = t.n_cols;\n  const uword t_n_slices = t.n_slices;\n  \n  const uword x_n_rows   = x.n_rows;\n  const uword x_n_cols   = x.n_cols;\n  \n  if( ((x_n_rows == 1) || (x_n_cols == 1)) && (t_n_rows == 1) && (t_n_cols == 1) && (x.n_elem == t_n_slices) )\n    {\n    Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);\n    \n    const uword t_aux_row1   = t.aux_row1;\n    const uword t_aux_col1   = t.aux_col1;\n    const uword t_aux_slice1 = t.aux_slice1;\n    \n    const eT* x_mem = x.memptr();\n    \n    uword i,j;\n    for(i=0, j=1; j < t_n_slices; i+=2, j+=2)\n      {\n      const eT tmp_i = x_mem[i];\n      const eT tmp_j = x_mem[j];\n      \n      Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) -= tmp_i;\n      Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + j) -= tmp_j;\n      }\n    \n    if(i < t_n_slices)\n      {\n      Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) -= x_mem[i];\n      }\n    }\n  else\n  if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )\n    {\n    for(uword col = 0; col < t_n_cols; ++col)\n      {\n      arrayops::inplace_minus( t.slice_colptr(0, col), x.colptr(col), t_n_rows );\n      }\n    }\n  else\n  if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )\n    {\n    for(uword i=0; i < t_n_slices; ++i)\n      {\n      arrayops::inplace_minus( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );\n      }\n    }\n  else\n  if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )\n    {\n    Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);\n    \n    const uword t_aux_row1   = t.aux_row1;\n    const uword t_aux_col1   = t.aux_col1;\n    const uword t_aux_slice1 = t.aux_slice1;\n    \n    for(uword slice=0; slice < t_n_slices; ++slice)\n      {\n      const uword mod_slice = t_aux_slice1 + slice;\n      \n      const eT* x_colptr = x.colptr(slice);\n      \n      uword i,j;\n      for(i=0, j=1; j < t_n_cols; i+=2, j+=2)\n        {\n        const eT tmp_i = x_colptr[i];\n        const eT tmp_j = x_colptr[j];\n        \n        Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) -= tmp_i;\n        Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) -= tmp_j;\n        }\n      \n      if(i < t_n_cols)\n        {\n        Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) -= x_colptr[i];\n        }\n      }\n    }\n  else\n    {\n    if(arma_config::debug == true)\n      {\n      arma_stop( arma_incompat_size_string(t, x, \"subtraction\") );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview_cube<eT>::operator%= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1> tmp(in.get_ref());\n  \n  const Mat<eT>&          x = tmp.M;\n        subview_cube<eT>& t = *this;\n  \n  const uword t_n_rows   = t.n_rows;\n  const uword t_n_cols   = t.n_cols;\n  const uword t_n_slices = t.n_slices;\n  \n  const uword x_n_rows   = x.n_rows;\n  const uword x_n_cols   = x.n_cols;\n  \n  if( ((x_n_rows == 1) || (x_n_cols == 1)) && (t_n_rows == 1) && (t_n_cols == 1) && (x.n_elem == t_n_slices) )\n    {\n    Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);\n    \n    const uword t_aux_row1   = t.aux_row1;\n    const uword t_aux_col1   = t.aux_col1;\n    const uword t_aux_slice1 = t.aux_slice1;\n    \n    const eT* x_mem = x.memptr();\n    \n    uword i,j;\n    for(i=0, j=1; j < t_n_slices; i+=2, j+=2)\n      {\n      const eT tmp_i = x_mem[i];\n      const eT tmp_j = x_mem[j];\n      \n      Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) *= tmp_i;\n      Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + j) *= tmp_j;\n      }\n    \n    if(i < t_n_slices)\n      {\n      Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) *= x_mem[i];\n      }\n    }\n  else\n  if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )\n    {\n    for(uword col = 0; col < t_n_cols; ++col)\n      {\n      arrayops::inplace_mul( t.slice_colptr(0, col), x.colptr(col), t_n_rows );\n      }\n    }\n  else\n  if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )\n    {\n    for(uword i=0; i < t_n_slices; ++i)\n      {\n      arrayops::inplace_mul( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );\n      }\n    }\n  else\n  if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )\n    {\n    Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);\n    \n    const uword t_aux_row1   = t.aux_row1;\n    const uword t_aux_col1   = t.aux_col1;\n    const uword t_aux_slice1 = t.aux_slice1;\n    \n    for(uword slice=0; slice < t_n_slices; ++slice)\n      {\n      const uword mod_slice = t_aux_slice1 + slice;\n      \n      const eT* x_colptr = x.colptr(slice);\n      \n      uword i,j;\n      for(i=0, j=1; j < t_n_cols; i+=2, j+=2)\n        {\n        const eT tmp_i = x_colptr[i];\n        const eT tmp_j = x_colptr[j];\n        \n        Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) *= tmp_i;\n        Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) *= tmp_j;\n        }\n      \n      if(i < t_n_cols)\n        {\n        Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) *= x_colptr[i];\n        }\n      }\n    }\n  else\n    {\n    if(arma_config::debug == true)\n      {\n      arma_stop( arma_incompat_size_string(t, x, \"element-wise multiplication\") );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview_cube<eT>::operator/= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1> tmp(in.get_ref());\n  \n  const Mat<eT>&          x = tmp.M;\n        subview_cube<eT>& t = *this;\n  \n  const uword t_n_rows   = t.n_rows;\n  const uword t_n_cols   = t.n_cols;\n  const uword t_n_slices = t.n_slices;\n  \n  const uword x_n_rows   = x.n_rows;\n  const uword x_n_cols   = x.n_cols;\n  \n  if( ((x_n_rows == 1) || (x_n_cols == 1)) && (t_n_rows == 1) && (t_n_cols == 1) && (x.n_elem == t_n_slices) )\n    {\n    Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);\n    \n    const uword t_aux_row1   = t.aux_row1;\n    const uword t_aux_col1   = t.aux_col1;\n    const uword t_aux_slice1 = t.aux_slice1;\n    \n    const eT* x_mem = x.memptr();\n    \n    uword i,j;\n    for(i=0, j=1; j < t_n_slices; i+=2, j+=2)\n      {\n      const eT tmp_i = x_mem[i];\n      const eT tmp_j = x_mem[j];\n      \n      Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) /= tmp_i;\n      Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + j) /= tmp_j;\n      }\n    \n    if(i < t_n_slices)\n      {\n      Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) /= x_mem[i];\n      }\n    }\n  else\n  if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) )\n    {\n    for(uword col = 0; col < t_n_cols; ++col)\n      {\n      arrayops::inplace_div( t.slice_colptr(0, col), x.colptr(col), t_n_rows );\n      }\n    }\n  else\n  if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) )\n    {\n    for(uword i=0; i < t_n_slices; ++i)\n      {\n      arrayops::inplace_div( t.slice_colptr(i, 0), x.colptr(i), t_n_rows );\n      }\n    }\n  else\n  if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) )\n    {\n    Cube<eT>& Q = const_cast< Cube<eT>& >(t.m);\n    \n    const uword t_aux_row1   = t.aux_row1;\n    const uword t_aux_col1   = t.aux_col1;\n    const uword t_aux_slice1 = t.aux_slice1;\n    \n    for(uword slice=0; slice < t_n_slices; ++slice)\n      {\n      const uword mod_slice = t_aux_slice1 + slice;\n      \n      const eT* x_colptr = x.colptr(slice);\n      \n      uword i,j;\n      for(i=0, j=1; j < t_n_cols; i+=2, j+=2)\n        {\n        const eT tmp_i = x_colptr[i];\n        const eT tmp_j = x_colptr[j];\n        \n        Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) /= tmp_i;\n        Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) /= tmp_j;\n        }\n      \n      if(i < t_n_cols)\n        {\n        Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) /= x_colptr[i];\n        }\n      }\n    }\n  else\n    {\n    if(arma_config::debug == true)\n      {\n      arma_stop( arma_incompat_size_string(t, x, \"element-wise division\") );\n      }\n    }\n  }\n\n\n\n//! transform each element in the subview using a functor\ntemplate<typename eT>\ntemplate<typename functor>\ninline\nvoid\nsubview_cube<eT>::transform(functor F)\n  {\n  arma_extra_debug_sigprint();\n  \n  Cube<eT>& Q = const_cast< Cube<eT>& >(m);\n  \n  const uword start_col   = aux_col1;\n  const uword start_row   = aux_row1;\n  const uword start_slice = aux_slice1;\n  \n  const uword end_col_plus1   = start_col   + n_cols;\n  const uword end_row_plus1   = start_row   + n_rows;\n  const uword end_slice_plus1 = start_slice + n_slices;\n  \n  for(uword uslice = start_slice; uslice < end_slice_plus1; ++uslice)\n  for(uword ucol   = start_col;     ucol < end_col_plus1;   ++ucol  )\n  for(uword urow   = start_row;     urow < end_row_plus1;   ++urow  )\n    {\n    Q.at(urow, ucol, uslice) = eT( F( Q.at(urow, ucol, uslice) ) );\n    }\n  }\n\n\n\n//! imbue (fill) the subview with values provided by a functor\ntemplate<typename eT>\ntemplate<typename functor>\ninline\nvoid\nsubview_cube<eT>::imbue(functor F)\n  {\n  arma_extra_debug_sigprint();\n  \n  Cube<eT>& Q = const_cast< Cube<eT>& >(m);\n  \n  const uword start_col   = aux_col1;\n  const uword start_row   = aux_row1;\n  const uword start_slice = aux_slice1;\n  \n  const uword end_col_plus1   = start_col   + n_cols;\n  const uword end_row_plus1   = start_row   + n_rows;\n  const uword end_slice_plus1 = start_slice + n_slices;\n  \n  for(uword uslice = start_slice; uslice < end_slice_plus1; ++uslice)\n  for(uword ucol   = start_col;     ucol < end_col_plus1;   ++ucol  )\n  for(uword urow   = start_row;     urow < end_row_plus1;   ++urow  )\n    {\n    Q.at(urow, ucol, uslice) = eT( F() );\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::fill(const eT val)\n  {\n  arma_extra_debug_sigprint();\n\n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  for(uword slice = 0; slice < local_n_slices; ++slice)\n    {\n    for(uword col = 0; col < local_n_cols; ++col)\n      {\n      arrayops::inplace_set( slice_colptr(slice,col), val, local_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::zeros()\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  for(uword slice = 0; slice < local_n_slices; ++slice)\n    {\n    for(uword col = 0; col < local_n_cols; ++col)\n      {\n      arrayops::fill_zeros( slice_colptr(slice,col), local_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::ones()\n  {\n  arma_extra_debug_sigprint();\n  \n  fill(eT(1));\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::randu()\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  for(uword slice = 0; slice < local_n_slices; ++slice)\n    {\n    for(uword col = 0; col < local_n_cols; ++col)\n      {\n      arma_rng::randu<eT>::fill( slice_colptr(slice,col), local_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::randn()\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  for(uword slice = 0; slice < local_n_slices; ++slice)\n    {\n    for(uword col = 0; col < local_n_cols; ++col)\n      {\n      arma_rng::randn<eT>::fill( slice_colptr(slice,col), local_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nsubview_cube<eT>::is_finite() const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  for(uword slice = 0; slice < local_n_slices; ++slice)\n    {\n    for(uword col = 0; col < local_n_cols; ++col)\n      {\n      if(arrayops::is_finite(slice_colptr(slice,col), local_n_rows) == false)  { return false; }\n      }\n    }\n  \n  return true;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nsubview_cube<eT>::has_inf() const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  for(uword slice = 0; slice < local_n_slices; ++slice)\n    {\n    for(uword col = 0; col < local_n_cols; ++col)\n      {\n      if(arrayops::has_inf(slice_colptr(slice,col), local_n_rows))  { return true; }\n      }\n    }\n  \n  return false;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nsubview_cube<eT>::has_nan() const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  for(uword slice = 0; slice < local_n_slices; ++slice)\n    {\n    for(uword col = 0; col < local_n_cols; ++col)\n      {\n      if(arrayops::has_nan(slice_colptr(slice,col), local_n_rows))  { return true; }\n      }\n    }\n  \n  return false;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\neT\nsubview_cube<eT>::min() const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"subview_cube::min(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  eT min_val = at(0,0,0);\n  \n  for(uword si=0; si < local_n_slices; ++si)\n  for(uword ci=0; ci < local_n_cols;   ++ci)\n    {\n    min_val = (std::min)( min_val, op_min::direct_min(slice_colptr(si,ci), local_n_rows) );\n    }\n  \n  return min_val;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\neT\nsubview_cube<eT>::max() const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem == 0)\n    {\n    arma_debug_check(true, \"subview_cube::max(): object has no elements\");\n    \n    return Datum<eT>::nan;\n    }\n  \n  const uword local_n_rows   = n_rows;\n  const uword local_n_cols   = n_cols;\n  const uword local_n_slices = n_slices;\n  \n  eT max_val = at(0,0,0);\n  \n  for(uword si=0; si < local_n_slices; ++si)\n  for(uword ci=0; ci < local_n_cols;   ++ci)\n    {\n    max_val = (std::max)( max_val, op_max::direct_max(slice_colptr(si,ci), local_n_rows) );\n    }\n  \n  return max_val;\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_cube<eT>::at_alt(const uword i) const\n  {\n  return operator[](i);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT&\nsubview_cube<eT>::operator[](const uword i)\n  {\n  const uword in_slice = i / n_elem_slice;\n  const uword offset   = in_slice * n_elem_slice;\n  const uword j        = i - offset;\n  \n  const uword in_col   = j / n_rows;\n  const uword in_row   = j % n_rows;\n\n  const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;\n  \n  return access::rw( (const_cast< Cube<eT>& >(m)).mem[index] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_cube<eT>::operator[](const uword i) const\n  {\n  const uword in_slice = i / n_elem_slice;\n  const uword offset   = in_slice * n_elem_slice;\n  const uword j        = i - offset;\n  \n  const uword in_col   = j / n_rows;\n  const uword in_row   = j % n_rows;\n\n  const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;\n  \n  return m.mem[index];\n  }\n\n\n\ntemplate<typename eT>\ninline\neT&\nsubview_cube<eT>::operator()(const uword i)\n  {\n  arma_debug_check( (i >= n_elem), \"subview_cube::operator(): index out of bounds\");\n  \n  const uword in_slice = i / n_elem_slice;\n  const uword offset   = in_slice * n_elem_slice;\n  const uword j        = i - offset;\n  \n  const uword in_col   = j / n_rows;\n  const uword in_row   = j % n_rows;\n\n  const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;\n  \n  return access::rw( (const_cast< Cube<eT>& >(m)).mem[index] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_cube<eT>::operator()(const uword i) const\n  {\n  arma_debug_check( (i >= n_elem), \"subview_cube::operator(): index out of bounds\");\n  \n  const uword in_slice = i / n_elem_slice;\n  const uword offset   = in_slice * n_elem_slice;\n  const uword j        = i - offset;\n  \n  const uword in_col   = j / n_rows;\n  const uword in_row   = j % n_rows;\n\n  const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;\n  \n  return m.mem[index];\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT&\nsubview_cube<eT>::operator()(const uword in_row, const uword in_col, const uword in_slice)\n  {\n  arma_debug_check( ( (in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices) ), \"subview_cube::operator(): location out of bounds\");\n  \n  const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;\n  \n  return access::rw( (const_cast< Cube<eT>& >(m)).mem[index] );\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT\nsubview_cube<eT>::operator()(const uword in_row, const uword in_col, const uword in_slice) const\n  {\n  arma_debug_check( ( (in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices) ), \"subview_cube::operator(): location out of bounds\");\n  \n  const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;\n  \n  return m.mem[index];\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT&\nsubview_cube<eT>::at(const uword in_row, const uword in_col, const uword in_slice)\n  {\n  const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;\n  \n  return access::rw( (const_cast< Cube<eT>& >(m)).mem[index] );\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT\nsubview_cube<eT>::at(const uword in_row, const uword in_col, const uword in_slice) const\n  {\n  const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;\n  \n  return m.mem[index];\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT*\nsubview_cube<eT>::slice_colptr(const uword in_slice, const uword in_col)\n  {\n  return & access::rw((const_cast< Cube<eT>& >(m)).mem[  (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1  ]);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst eT*\nsubview_cube<eT>::slice_colptr(const uword in_slice, const uword in_col) const\n  {\n  return & m.mem[ (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 ];\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nsubview_cube<eT>::check_overlap(const subview_cube<eT>& x) const\n  {\n  const subview_cube<eT>& t = *this;\n  \n  if(&t.m != &x.m)\n    {\n    return false;\n    }\n  else\n    {\n    if( (t.n_elem == 0) || (x.n_elem == 0) )\n      {\n      return false;\n      }\n    else\n      {\n      const uword t_row_start  = t.aux_row1;\n      const uword t_row_end_p1 = t_row_start + t.n_rows;\n      \n      const uword t_col_start  = t.aux_col1;\n      const uword t_col_end_p1 = t_col_start + t.n_cols;\n      \n      const uword t_slice_start  = t.aux_slice1;\n      const uword t_slice_end_p1 = t_slice_start + t.n_slices;\n      \n      \n      const uword x_row_start  = x.aux_row1;\n      const uword x_row_end_p1 = x_row_start + x.n_rows;\n      \n      const uword x_col_start  = x.aux_col1;\n      const uword x_col_end_p1 = x_col_start + x.n_cols;\n      \n      const uword x_slice_start  = x.aux_slice1;\n      const uword x_slice_end_p1 = x_slice_start + x.n_slices;\n      \n      \n      const bool outside_rows   = ( (x_row_start   >= t_row_end_p1  ) || (t_row_start   >= x_row_end_p1  ) );\n      const bool outside_cols   = ( (x_col_start   >= t_col_end_p1  ) || (t_col_start   >= x_col_end_p1  ) );\n      const bool outside_slices = ( (x_slice_start >= t_slice_end_p1) || (t_slice_start >= x_slice_end_p1) );\n      \n      return ( (outside_rows == false) && (outside_cols == false) && (outside_slices == false) );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nsubview_cube<eT>::check_overlap(const Mat<eT>& x) const\n  {\n  const subview_cube<eT>& t = *this;\n  \n  const uword t_aux_slice1        = t.aux_slice1;\n  const uword t_aux_slice2_plus_1 = t_aux_slice1 + t.n_slices;\n  \n  for(uword slice = t_aux_slice1; slice < t_aux_slice2_plus_1; ++slice)\n    {\n    if(t.m.mat_ptrs[slice] != NULL)\n      {\n      const Mat<eT>& y = *(t.m.mat_ptrs[slice]);\n      \n      if( x.memptr() == y.memptr() )  { return true; }\n      }\n    }\n  \n  return false;\n  }\n\n\n\n//! cube X = Y.subcube(...)\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::extract(Cube<eT>& out, const subview_cube<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n\n  // NOTE: we're assuming that the cube has already been set to the correct size and there is no aliasing;\n  // size setting and alias checking is done by either the Cube contructor or operator=()\n  \n  const uword n_rows   = in.n_rows;\n  const uword n_cols   = in.n_cols;\n  const uword n_slices = in.n_slices;\n  \n  arma_extra_debug_print(arma_boost::format(\"out.n_rows = %d   out.n_cols = %d    out.n_slices = %d    in.m.n_rows = %d   in.m.n_cols = %d   in.m.n_slices = %d\") % out.n_rows % out.n_cols % out.n_slices % in.m.n_rows % in.m.n_cols % in.m.n_slices);\n  \n  \n  for(uword slice = 0; slice < n_slices; ++slice)\n    {\n    for(uword col = 0; col < n_cols; ++col)\n      {\n      arrayops::copy( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );\n      }\n    }\n  }\n\n\n\n//! cube X += Y.subcube(...)\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::plus_inplace(Cube<eT>& out, const subview_cube<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out, in, \"addition\");\n  \n  const uword n_rows   = out.n_rows;\n  const uword n_cols   = out.n_cols;\n  const uword n_slices = out.n_slices;\n  \n  for(uword slice = 0; slice<n_slices; ++slice)\n    {\n    for(uword col = 0; col<n_cols; ++col)\n      {\n      arrayops::inplace_plus( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );\n      }\n    }\n  }\n\n\n\n//! cube X -= Y.subcube(...)\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::minus_inplace(Cube<eT>& out, const subview_cube<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out, in, \"subtraction\");\n  \n  const uword n_rows   = out.n_rows;\n  const uword n_cols   = out.n_cols;\n  const uword n_slices = out.n_slices;\n  \n  for(uword slice = 0; slice<n_slices; ++slice)\n    {\n    for(uword col = 0; col<n_cols; ++col)\n      {\n      arrayops::inplace_minus( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );\n      }\n    }\n  }\n\n\n\n//! cube X %= Y.subcube(...)\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::schur_inplace(Cube<eT>& out, const subview_cube<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out, in, \"element-wise multiplication\");\n  \n  const uword n_rows   = out.n_rows;\n  const uword n_cols   = out.n_cols;\n  const uword n_slices = out.n_slices;\n  \n  for(uword slice = 0; slice<n_slices; ++slice)\n    {\n    for(uword col = 0; col<n_cols; ++col)\n      {\n      arrayops::inplace_mul( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );\n      }\n    }\n  }\n\n\n\n//! cube X /= Y.subcube(...)\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::div_inplace(Cube<eT>& out, const subview_cube<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out, in, \"element-wise division\");\n  \n  const uword n_rows   = out.n_rows;\n  const uword n_cols   = out.n_cols;\n  const uword n_slices = out.n_slices;\n  \n  for(uword slice = 0; slice<n_slices; ++slice)\n    {\n    for(uword col = 0; col<n_cols; ++col)\n      {\n      arrayops::inplace_div( out.slice_colptr(slice,col), in.slice_colptr(slice,col), n_rows );\n      }\n    }\n  }\n\n\n\n//! mat X = Y.subcube(...)\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::extract(Mat<eT>& out, const subview_cube<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_cube_as_mat(out, in, \"copy into matrix\", false);\n  \n  const uword in_n_rows   = in.n_rows;\n  const uword in_n_cols   = in.n_cols;\n  const uword in_n_slices = in.n_slices;\n  \n  const uword out_vec_state = out.vec_state;\n  \n  if(in_n_slices == 1)\n    {\n    out.set_size(in_n_rows, in_n_cols);\n    \n    for(uword col=0; col < in_n_cols; ++col)\n      {\n      arrayops::copy( out.colptr(col), in.slice_colptr(0, col), in_n_rows );\n      }\n    }\n  else\n    {\n    if(out_vec_state == 0)\n      {\n      if(in_n_cols == 1)\n        {\n        out.set_size(in_n_rows, in_n_slices);\n        \n        for(uword i=0; i < in_n_slices; ++i)\n          {\n          arrayops::copy( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );\n          }\n        }\n      else\n      if(in_n_rows == 1)\n        {\n        const Cube<eT>& Q = in.m;\n        \n        const uword in_aux_row1   = in.aux_row1;\n        const uword in_aux_col1   = in.aux_col1;\n        const uword in_aux_slice1 = in.aux_slice1;\n        \n        out.set_size(in_n_cols, in_n_slices);\n        \n        for(uword slice=0; slice < in_n_slices; ++slice)\n          {\n          const uword mod_slice = in_aux_slice1 + slice;\n          \n          eT* out_colptr = out.colptr(slice);\n          \n          uword i,j;\n          for(i=0, j=1; j < in_n_cols; i+=2, j+=2)\n            {\n            const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);\n            const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);\n            \n            out_colptr[i] = tmp_i;\n            out_colptr[j] = tmp_j;\n            }\n          \n          if(i < in_n_cols)\n            {\n            out_colptr[i] = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);\n            }\n          }\n        }\n      }\n    else\n      {\n      out.set_size(in_n_slices);\n      \n      eT* out_mem = out.memptr();\n      \n      const Cube<eT>& Q = in.m;\n      \n      const uword in_aux_row1   = in.aux_row1;\n      const uword in_aux_col1   = in.aux_col1;\n      const uword in_aux_slice1 = in.aux_slice1;\n      \n      for(uword i=0; i<in_n_slices; ++i)\n        {\n        out_mem[i] = Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);\n        }\n      }\n    }\n  }\n\n\n\n//! mat X += Y.subcube(...)\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::plus_inplace(Mat<eT>& out, const subview_cube<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_cube_as_mat(out, in, \"addition\", true);\n  \n  const uword in_n_rows   = in.n_rows;\n  const uword in_n_cols   = in.n_cols;\n  const uword in_n_slices = in.n_slices;\n  \n  const uword out_n_rows    = out.n_rows;\n  const uword out_n_cols    = out.n_cols;\n  const uword out_vec_state = out.vec_state;\n  \n  if(in_n_slices == 1)\n    {\n    for(uword col=0; col < in_n_cols; ++col)\n      {\n      arrayops::inplace_plus( out.colptr(col), in.slice_colptr(0, col), in_n_rows );\n      }\n    }\n  else\n    {\n    if(out_vec_state == 0)\n      {\n      if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )\n        {\n        for(uword i=0; i < in_n_slices; ++i)\n          {\n          arrayops::inplace_plus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );\n          }\n        }\n      else\n      if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )\n        {\n        const Cube<eT>& Q = in.m;\n        \n        const uword in_aux_row1   = in.aux_row1;\n        const uword in_aux_col1   = in.aux_col1;\n        const uword in_aux_slice1 = in.aux_slice1;\n        \n        for(uword slice=0; slice < in_n_slices; ++slice)\n          {\n          const uword mod_slice = in_aux_slice1 + slice;\n          \n          eT* out_colptr = out.colptr(slice);\n          \n          uword i,j;\n          for(i=0, j=1; j < in_n_cols; i+=2, j+=2)\n            {\n            const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);\n            const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);\n            \n            out_colptr[i] += tmp_i;\n            out_colptr[j] += tmp_j;\n            }\n          \n          if(i < in_n_cols)\n            {\n            out_colptr[i] += Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);\n            }\n          }\n        }\n      }\n    else\n      {\n      eT* out_mem = out.memptr();\n      \n      const Cube<eT>& Q = in.m;\n      \n      const uword in_aux_row1   = in.aux_row1;\n      const uword in_aux_col1   = in.aux_col1;\n      const uword in_aux_slice1 = in.aux_slice1;\n      \n      for(uword i=0; i<in_n_slices; ++i)\n        {\n        out_mem[i] += Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);\n        }\n      }\n    }\n  }\n\n\n\n//! mat X -= Y.subcube(...)\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::minus_inplace(Mat<eT>& out, const subview_cube<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_cube_as_mat(out, in, \"subtraction\", true);\n  \n  const uword in_n_rows   = in.n_rows;\n  const uword in_n_cols   = in.n_cols;\n  const uword in_n_slices = in.n_slices;\n  \n  const uword out_n_rows    = out.n_rows;\n  const uword out_n_cols    = out.n_cols;\n  const uword out_vec_state = out.vec_state;\n  \n  if(in_n_slices == 1)\n    {\n    for(uword col=0; col < in_n_cols; ++col)\n      {\n      arrayops::inplace_minus( out.colptr(col), in.slice_colptr(0, col), in_n_rows );\n      }\n    }\n  else\n    {\n    if(out_vec_state == 0)\n      {\n      if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )\n        {\n        for(uword i=0; i < in_n_slices; ++i)\n          {\n          arrayops::inplace_minus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );\n          }\n        }\n      else\n      if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )\n        {\n        const Cube<eT>& Q = in.m;\n        \n        const uword in_aux_row1   = in.aux_row1;\n        const uword in_aux_col1   = in.aux_col1;\n        const uword in_aux_slice1 = in.aux_slice1;\n        \n        for(uword slice=0; slice < in_n_slices; ++slice)\n          {\n          const uword mod_slice = in_aux_slice1 + slice;\n          \n          eT* out_colptr = out.colptr(slice);\n          \n          uword i,j;\n          for(i=0, j=1; j < in_n_cols; i+=2, j+=2)\n            {\n            const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);\n            const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);\n            \n            out_colptr[i] -= tmp_i;\n            out_colptr[j] -= tmp_j;\n            }\n          \n          if(i < in_n_cols)\n            {\n            out_colptr[i] -= Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);\n            }\n          }\n        }\n      }\n    else\n      {\n      eT* out_mem = out.memptr();\n      \n      const Cube<eT>& Q = in.m;\n      \n      const uword in_aux_row1   = in.aux_row1;\n      const uword in_aux_col1   = in.aux_col1;\n      const uword in_aux_slice1 = in.aux_slice1;\n      \n      for(uword i=0; i<in_n_slices; ++i)\n        {\n        out_mem[i] -= Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);\n        }\n      }\n    }\n  }\n\n\n\n//! mat X %= Y.subcube(...)\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::schur_inplace(Mat<eT>& out, const subview_cube<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_cube_as_mat(out, in, \"element-wise multiplication\", true);\n  \n  const uword in_n_rows   = in.n_rows;\n  const uword in_n_cols   = in.n_cols;\n  const uword in_n_slices = in.n_slices;\n  \n  const uword out_n_rows    = out.n_rows;\n  const uword out_n_cols    = out.n_cols;\n  const uword out_vec_state = out.vec_state;\n  \n  if(in_n_slices == 1)\n    {\n    for(uword col=0; col < in_n_cols; ++col)\n      {\n      arrayops::inplace_mul( out.colptr(col), in.slice_colptr(0, col), in_n_rows );\n      }\n    }\n  else\n    {\n    if(out_vec_state == 0)\n      {\n      if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )\n        {\n        for(uword i=0; i < in_n_slices; ++i)\n          {\n          arrayops::inplace_mul( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );\n          }\n        }\n      else\n      if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )\n        {\n        const Cube<eT>& Q = in.m;\n        \n        const uword in_aux_row1   = in.aux_row1;\n        const uword in_aux_col1   = in.aux_col1;\n        const uword in_aux_slice1 = in.aux_slice1;\n        \n        for(uword slice=0; slice < in_n_slices; ++slice)\n          {\n          const uword mod_slice = in_aux_slice1 + slice;\n          \n          eT* out_colptr = out.colptr(slice);\n          \n          uword i,j;\n          for(i=0, j=1; j < in_n_cols; i+=2, j+=2)\n            {\n            const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);\n            const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);\n            \n            out_colptr[i] *= tmp_i;\n            out_colptr[j] *= tmp_j;\n            }\n          \n          if(i < in_n_cols)\n            {\n            out_colptr[i] *= Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);\n            }\n          }\n        }\n      }\n    else\n      {\n      eT* out_mem = out.memptr();\n      \n      const Cube<eT>& Q = in.m;\n      \n      const uword in_aux_row1   = in.aux_row1;\n      const uword in_aux_col1   = in.aux_col1;\n      const uword in_aux_slice1 = in.aux_slice1;\n      \n      for(uword i=0; i<in_n_slices; ++i)\n        {\n        out_mem[i] *= Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);\n        }\n      }\n    }\n  }\n\n\n\n//! mat X /= Y.subcube(...)\ntemplate<typename eT>\ninline\nvoid\nsubview_cube<eT>::div_inplace(Mat<eT>& out, const subview_cube<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_cube_as_mat(out, in, \"element-wise division\", true);\n  \n  const uword in_n_rows   = in.n_rows;\n  const uword in_n_cols   = in.n_cols;\n  const uword in_n_slices = in.n_slices;\n  \n  const uword out_n_rows    = out.n_rows;\n  const uword out_n_cols    = out.n_cols;\n  const uword out_vec_state = out.vec_state;\n  \n  if(in_n_slices == 1)\n    {\n    for(uword col=0; col < in_n_cols; ++col)\n      {\n      arrayops::inplace_div( out.colptr(col), in.slice_colptr(0, col), in_n_rows );\n      }\n    }\n  else\n    {\n    if(out_vec_state == 0)\n      {\n      if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) )\n        {\n        for(uword i=0; i < in_n_slices; ++i)\n          {\n          arrayops::inplace_div( out.colptr(i), in.slice_colptr(i, 0), in_n_rows );\n          }\n        }\n      else\n      if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) )\n        {\n        const Cube<eT>& Q = in.m;\n        \n        const uword in_aux_row1   = in.aux_row1;\n        const uword in_aux_col1   = in.aux_col1;\n        const uword in_aux_slice1 = in.aux_slice1;\n        \n        for(uword slice=0; slice < in_n_slices; ++slice)\n          {\n          const uword mod_slice = in_aux_slice1 + slice;\n          \n          eT* out_colptr = out.colptr(slice);\n          \n          uword i,j;\n          for(i=0, j=1; j < in_n_cols; i+=2, j+=2)\n            {\n            const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);\n            const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice);\n            \n            out_colptr[i] /= tmp_i;\n            out_colptr[j] /= tmp_j;\n            }\n          \n          if(i < in_n_cols)\n            {\n            out_colptr[i] /= Q.at(in_aux_row1, in_aux_col1 + i, mod_slice);\n            }\n          }\n        }\n      }\n    else\n      {\n      eT* out_mem = out.memptr();\n      \n      const Cube<eT>& Q = in.m;\n      \n      const uword in_aux_row1   = in.aux_row1;\n      const uword in_aux_col1   = in.aux_col1;\n      const uword in_aux_slice1 = in.aux_slice1;\n      \n      for(uword i=0; i<in_n_slices; ++i)\n        {\n        out_mem[i] /= Q.at(in_aux_row1, in_aux_col1, in_aux_slice1 + i);\n        }\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/subview_each_bones.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup subview_each\n//! @{\n\n\n\ntemplate<typename parent, unsigned int mode>\nclass subview_each_common\n  {\n  public:\n  \n  typedef typename parent::elem_type eT;\n  \n  \n  protected:\n  \n  parent& p;\n  \n  arma_inline subview_each_common(parent& in_p);\n  \n  arma_inline const Mat<typename parent::elem_type>& get_mat_ref_helper(const Mat    <typename parent::elem_type>& X) const;\n  arma_inline const Mat<typename parent::elem_type>& get_mat_ref_helper(const subview<typename parent::elem_type>& X) const;\n  \n  arma_inline const Mat<typename parent::elem_type>& get_mat_ref() const;\n  \n  inline void check_size(const Mat<typename parent::elem_type>& A) const;\n  \n  arma_cold inline const std::string incompat_size_string(const Mat<typename parent::elem_type>& A) const;\n  \n  \n  private:\n  \n  subview_each_common();\n  };\n\n\n\n\ntemplate<typename parent, unsigned int mode>\nclass subview_each1 : public subview_each_common<parent, mode>\n  {\n  protected:\n  \n  arma_inline subview_each1(parent& in_p);\n  \n  \n  public:\n  \n  typedef typename parent::elem_type eT;\n  \n  inline ~subview_each1();\n  \n  // deliberately returning void\n  template<typename T1> inline void operator=  (const Base<eT,T1>& x);\n  template<typename T1> inline void operator+= (const Base<eT,T1>& x);\n  template<typename T1> inline void operator-= (const Base<eT,T1>& x);\n  template<typename T1> inline void operator%= (const Base<eT,T1>& x);\n  template<typename T1> inline void operator/= (const Base<eT,T1>& x);\n  \n  \n  private:\n  \n  friend class Mat<eT>;\n  friend class subview<eT>;\n  \n  subview_each1();\n  };\n\n\n\ntemplate<typename parent, unsigned int mode, typename TB>\nclass subview_each2 : public subview_each_common<parent, mode>\n  {\n  protected:\n  \n  const Base<uword, TB>& base_indices;\n  \n  inline subview_each2(parent& in_p, const Base<uword, TB>& in_indices);\n  \n  inline void check_indices(const Mat<uword>& indices) const;\n  \n  \n  public:\n  \n  typedef typename parent::elem_type eT;\n  \n  inline ~subview_each2();\n  \n  // deliberately returning void\n  template<typename T1> inline void operator=  (const Base<eT,T1>& x);\n  template<typename T1> inline void operator+= (const Base<eT,T1>& x);\n  template<typename T1> inline void operator-= (const Base<eT,T1>& x);\n  template<typename T1> inline void operator%= (const Base<eT,T1>& x);\n  template<typename T1> inline void operator/= (const Base<eT,T1>& x);\n  \n  // TODO: add handling of scalars\n  \n  \n  private:\n  \n  friend class Mat<eT>;\n  friend class subview<eT>;\n  \n  subview_each2();\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/subview_each_meat.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup subview_each\n//! @{\n\n\n//\n//\n// subview_each_common\n\ntemplate<typename parent, unsigned int mode>\ninline\nsubview_each_common<parent,mode>::subview_each_common(parent& in_p)\n  : p(in_p)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename parent, unsigned int mode>\narma_inline\nconst Mat<typename parent::elem_type>&\nsubview_each_common<parent,mode>::get_mat_ref_helper(const Mat<typename parent::elem_type>& X) const\n  {\n  return X;\n  }\n\n\n\ntemplate<typename parent, unsigned int mode>\narma_inline\nconst Mat<typename parent::elem_type>&\nsubview_each_common<parent,mode>::get_mat_ref_helper(const subview<typename parent::elem_type>& X) const\n  {\n  return X.m;\n  }\n\n\n\ntemplate<typename parent, unsigned int mode>\narma_inline\nconst Mat<typename parent::elem_type>&\nsubview_each_common<parent,mode>::get_mat_ref() const\n  {\n  return get_mat_ref_helper(p);\n  }\n\n\n\ntemplate<typename parent, unsigned int mode>\ninline\nvoid\nsubview_each_common<parent,mode>::check_size(const Mat<typename parent::elem_type>& A) const\n  {\n  if(arma_config::debug == true)\n    {\n    if(mode == 0)\n      {\n      if( (A.n_rows != p.n_rows) || (A.n_cols != 1) )\n        {\n        arma_stop( incompat_size_string(A) );\n        }\n      }\n    else\n      {\n      if( (A.n_rows != 1) || (A.n_cols != p.n_cols) )\n        {\n        arma_stop( incompat_size_string(A) );\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename parent, unsigned int mode>\narma_cold\ninline\nconst std::string\nsubview_each_common<parent,mode>::incompat_size_string(const Mat<typename parent::elem_type>& A) const\n  {\n  std::stringstream tmp;\n  \n  if(mode == 0)\n    {\n    tmp << \"each_col(): incompatible size; expected \" << p.n_rows << \"x1\" << \", got \" << A.n_rows << 'x' << A.n_cols;\n    }\n  else\n    {\n    tmp << \"each_row(): incompatible size; expected 1x\" << p.n_cols << \", got \" << A.n_rows << 'x' << A.n_cols;\n    }\n  \n  return tmp.str();\n  }\n  \n\n\n//\n//\n// subview_each1\n\n\n\ntemplate<typename parent, unsigned int mode>\ninline\nsubview_each1<parent,mode>::~subview_each1()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename parent, unsigned int mode>\ninline\nsubview_each1<parent,mode>::subview_each1(parent& in_p)\n  : subview_each_common<parent,mode>::subview_each_common(in_p)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename parent, unsigned int mode>\ntemplate<typename T1>\ninline\nvoid\nsubview_each1<parent,mode>::operator= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  parent& p = subview_each_common<parent,mode>::p;\n  \n  const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );\n  const Mat<eT>& A     = tmp.M;\n  \n  subview_each_common<parent,mode>::check_size(A);\n  \n  const eT*   A_mem    = A.memptr();\n  const uword p_n_rows = p.n_rows;\n  const uword p_n_cols = p.n_cols;\n  \n  if(mode == 0) // each column\n    {\n    for(uword i=0; i < p_n_cols; ++i)\n      {\n      arrayops::copy( p.colptr(i), A_mem, p_n_rows );\n      }\n    }\n  else // each row\n    {\n    for(uword i=0; i < p_n_cols; ++i)\n      {\n      arrayops::inplace_set( p.colptr(i), A_mem[i], p_n_rows);\n      }\n    }\n  }\n\n\n\ntemplate<typename parent, unsigned int mode>\ntemplate<typename T1>\ninline\nvoid\nsubview_each1<parent,mode>::operator+= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  parent& p = subview_each_common<parent,mode>::p;\n  \n  const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );\n  const Mat<eT>& A     = tmp.M;\n  \n  subview_each_common<parent,mode>::check_size(A);\n  \n  const eT*   A_mem    = A.memptr();\n  const uword p_n_rows = p.n_rows;\n  const uword p_n_cols = p.n_cols;\n    \n  if(mode == 0) // each column\n    {\n    for(uword i=0; i < p_n_cols; ++i)\n      {\n      arrayops::inplace_plus( p.colptr(i), A_mem, p_n_rows );\n      }\n    }\n  else // each row\n    {\n    for(uword i=0; i < p_n_cols; ++i)\n      {\n      arrayops::inplace_plus( p.colptr(i), A_mem[i], p_n_rows);\n      }\n    }\n  }\n\n\n\ntemplate<typename parent, unsigned int mode>\ntemplate<typename T1>\ninline\nvoid\nsubview_each1<parent,mode>::operator-= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  parent& p = subview_each_common<parent,mode>::p;\n  \n  const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );\n  const Mat<eT>& A     = tmp.M;\n  \n  subview_each_common<parent,mode>::check_size(A);\n  \n  const eT*   A_mem    = A.memptr();\n  const uword p_n_rows = p.n_rows;\n  const uword p_n_cols = p.n_cols;\n    \n  if(mode == 0) // each column\n    {\n    for(uword i=0; i < p_n_cols; ++i)\n      {\n      arrayops::inplace_minus( p.colptr(i), A_mem, p_n_rows );\n      }\n    }\n  else // each row\n    {\n    for(uword i=0; i < p_n_cols; ++i)\n      {\n      arrayops::inplace_minus( p.colptr(i), A_mem[i], p_n_rows);\n      }\n    }\n  }\n\n\n\ntemplate<typename parent, unsigned int mode>\ntemplate<typename T1>\ninline\nvoid\nsubview_each1<parent,mode>::operator%= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  parent& p = subview_each_common<parent,mode>::p;\n  \n  const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );\n  const Mat<eT>& A     = tmp.M;\n  \n  subview_each_common<parent,mode>::check_size(A);\n  \n  const eT*   A_mem    = A.memptr();\n  const uword p_n_rows = p.n_rows;\n  const uword p_n_cols = p.n_cols;\n  \n  if(mode == 0) // each column\n    {\n    for(uword i=0; i < p_n_cols; ++i)\n      {\n      arrayops::inplace_mul( p.colptr(i), A_mem, p_n_rows );\n      }\n    }\n  else // each row\n    {\n    for(uword i=0; i < p_n_cols; ++i)\n      {\n      arrayops::inplace_mul( p.colptr(i), A_mem[i], p_n_rows);\n      }\n    }\n  }\n\n\n\ntemplate<typename parent, unsigned int mode>\ntemplate<typename T1>\ninline\nvoid\nsubview_each1<parent,mode>::operator/= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  parent& p = subview_each_common<parent,mode>::p;\n  \n  const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );\n  const Mat<eT>& A     = tmp.M;\n  \n  subview_each_common<parent,mode>::check_size(A);\n  \n  const eT*   A_mem    = A.memptr();\n  const uword p_n_rows = p.n_rows;\n  const uword p_n_cols = p.n_cols;\n  \n  if(mode == 0) // each column\n    {\n    for(uword i=0; i < p_n_cols; ++i)\n      {\n      arrayops::inplace_div( p.colptr(i), A_mem, p_n_rows );\n      }\n    }\n  else // each row\n    {\n    for(uword i=0; i < p_n_cols; ++i)\n      {\n      arrayops::inplace_div( p.colptr(i), A_mem[i], p_n_rows);\n      }\n    }\n  }\n\n\n\n//\n//\n// subview_each2\n\n\n\ntemplate<typename parent, unsigned int mode, typename TB>\ninline\nsubview_each2<parent,mode,TB>::~subview_each2()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename parent, unsigned int mode, typename TB>\ninline\nsubview_each2<parent,mode,TB>::subview_each2(parent& in_p, const Base<uword, TB>& in_indices)\n  : subview_each_common<parent,mode>::subview_each_common(in_p)\n  , base_indices(in_indices)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename parent, unsigned int mode, typename TB>\ninline\nvoid\nsubview_each2<parent,mode,TB>::check_indices(const Mat<uword>& indices) const\n  {\n  if(mode == 0)\n    {\n    arma_debug_check( ((indices.is_vec() == false) && (indices.is_empty() == false)), \"each_col(): list of indices must be a vector\" );\n    }\n  else\n    {\n    arma_debug_check( ((indices.is_vec() == false) && (indices.is_empty() == false)), \"each_row(): list of indices must be a vector\" );\n    }\n  }\n\n\n\ntemplate<typename parent, unsigned int mode, typename TB>\ntemplate<typename T1>\ninline\nvoid\nsubview_each2<parent,mode,TB>::operator= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  parent& p = subview_each_common<parent,mode>::p;\n  \n  const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );\n  const Mat<eT>& A     = tmp.M;\n  \n  subview_each_common<parent,mode>::check_size(A);\n  \n  const unwrap_check_mixed<TB> tmp_indices( base_indices.get_ref(), (*this).get_mat_ref() );\n  const Mat<uword>& indices =  tmp_indices.M;\n  \n  check_indices(indices);\n  \n  const eT*   A_mem    = A.memptr();\n  const uword p_n_rows = p.n_rows;\n  const uword p_n_cols = p.n_cols;\n  \n  const uword* indices_mem = indices.memptr();\n  const uword  N           = indices.n_elem;\n  \n  if(mode == 0) // each column\n    {\n    for(uword i=0; i < N; ++i)\n      {\n      const uword col = indices_mem[i];\n      \n      arma_debug_check( (col > p_n_cols), \"each_col(): index out of bounds\" );\n      \n      arrayops::copy( p.colptr(col), A_mem, p_n_rows );\n      }\n    }\n  else // each row\n    {\n    for(uword i=0; i < N; ++i)\n      {\n      const uword row = indices_mem[i];\n      \n      arma_debug_check( (row > p_n_rows), \"each_row(): index out of bounds\" );\n      \n      for(uword col=0; col < p_n_cols; ++col)\n        {\n        p.at(row,col) = A_mem[col];\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename parent, unsigned int mode, typename TB>\ntemplate<typename T1>\ninline\nvoid\nsubview_each2<parent,mode,TB>::operator+= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  parent& p = subview_each_common<parent,mode>::p;\n  \n  const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );\n  const Mat<eT>& A     = tmp.M;\n  \n  subview_each_common<parent,mode>::check_size(A);\n  \n  const unwrap_check_mixed<TB> tmp_indices( base_indices.get_ref(), (*this).get_mat_ref() );\n  const Mat<uword>& indices =  tmp_indices.M;\n  \n  check_indices(indices);\n  \n  const eT*   A_mem    = A.memptr();\n  const uword p_n_rows = p.n_rows;\n  const uword p_n_cols = p.n_cols;\n  \n  const uword* indices_mem = indices.memptr();\n  const uword  N           = indices.n_elem;\n  \n  if(mode == 0) // each column\n    {\n    for(uword i=0; i < N; ++i)\n      {\n      const uword col = indices_mem[i];\n      \n      arma_debug_check( (col > p_n_cols), \"each_col(): index out of bounds\" );\n      \n      arrayops::inplace_plus( p.colptr(col), A_mem, p_n_rows );\n      }\n    }\n  else // each row\n    {\n    for(uword i=0; i < N; ++i)\n      {\n      const uword row = indices_mem[i];\n      \n      arma_debug_check( (row > p_n_rows), \"each_row(): index out of bounds\" );\n      \n      for(uword col=0; col < p_n_cols; ++col)\n        {\n        p.at(row,col) += A_mem[col];\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename parent, unsigned int mode, typename TB>\ntemplate<typename T1>\ninline\nvoid\nsubview_each2<parent,mode,TB>::operator-= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  parent& p = subview_each_common<parent,mode>::p;\n  \n  const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );\n  const Mat<eT>& A     = tmp.M;\n  \n  subview_each_common<parent,mode>::check_size(A);\n  \n  const unwrap_check_mixed<TB> tmp_indices( base_indices.get_ref(), (*this).get_mat_ref() );\n  const Mat<uword>& indices =  tmp_indices.M;\n  \n  check_indices(indices);\n  \n  const eT*   A_mem    = A.memptr();\n  const uword p_n_rows = p.n_rows;\n  const uword p_n_cols = p.n_cols;\n  \n  const uword* indices_mem = indices.memptr();\n  const uword  N           = indices.n_elem;\n  \n  if(mode == 0) // each column\n    {\n    for(uword i=0; i < N; ++i)\n      {\n      const uword col = indices_mem[i];\n      \n      arma_debug_check( (col > p_n_cols), \"each_col(): index out of bounds\" );\n      \n      arrayops::inplace_minus( p.colptr(col), A_mem, p_n_rows );\n      }\n    }\n  else // each row\n    {\n    for(uword i=0; i < N; ++i)\n      {\n      const uword row = indices_mem[i];\n      \n      arma_debug_check( (row > p_n_rows), \"each_row(): index out of bounds\" );\n      \n      for(uword col=0; col < p_n_cols; ++col)\n        {\n        p.at(row,col) -= A_mem[col];\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename parent, unsigned int mode, typename TB>\ntemplate<typename T1>\ninline\nvoid\nsubview_each2<parent,mode,TB>::operator%= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  parent& p = subview_each_common<parent,mode>::p;\n  \n  const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );\n  const Mat<eT>& A     = tmp.M;\n  \n  subview_each_common<parent,mode>::check_size(A);\n  \n  const unwrap_check_mixed<TB> tmp_indices( base_indices.get_ref(), (*this).get_mat_ref() );\n  const Mat<uword>& indices =  tmp_indices.M;\n  \n  check_indices(indices);\n  \n  const eT*   A_mem    = A.memptr();\n  const uword p_n_rows = p.n_rows;\n  const uword p_n_cols = p.n_cols;\n  \n  const uword* indices_mem = indices.memptr();\n  const uword  N           = indices.n_elem;\n  \n  if(mode == 0) // each column\n    {\n    for(uword i=0; i < N; ++i)\n      {\n      const uword col = indices_mem[i];\n      \n      arma_debug_check( (col > p_n_cols), \"each_col(): index out of bounds\" );\n      \n      arrayops::inplace_mul( p.colptr(col), A_mem, p_n_rows );\n      }\n    }\n  else // each row\n    {\n    for(uword i=0; i < N; ++i)\n      {\n      const uword row = indices_mem[i];\n      \n      arma_debug_check( (row > p_n_rows), \"each_row(): index out of bounds\" );\n      \n      for(uword col=0; col < p_n_cols; ++col)\n        {\n        p.at(row,col) *= A_mem[col];\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename parent, unsigned int mode, typename TB>\ntemplate<typename T1>\ninline\nvoid\nsubview_each2<parent,mode,TB>::operator/= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  parent& p = subview_each_common<parent,mode>::p;\n  \n  const unwrap_check<T1> tmp( in.get_ref(), (*this).get_mat_ref() );\n  const Mat<eT>& A     = tmp.M;\n  \n  subview_each_common<parent,mode>::check_size(A);\n  \n  const unwrap_check_mixed<TB> tmp_indices( base_indices.get_ref(), (*this).get_mat_ref() );\n  const Mat<uword>& indices =  tmp_indices.M;\n  \n  check_indices(indices);\n  \n  const eT*   A_mem    = A.memptr();\n  const uword p_n_rows = p.n_rows;\n  const uword p_n_cols = p.n_cols;\n  \n  const uword* indices_mem = indices.memptr();\n  const uword  N           = indices.n_elem;\n  \n  if(mode == 0) // each column\n    {\n    for(uword i=0; i < N; ++i)\n      {\n      const uword col = indices_mem[i];\n      \n      arma_debug_check( (col > p_n_cols), \"each_col(): index out of bounds\" );\n      \n      arrayops::inplace_div( p.colptr(col), A_mem, p_n_rows );\n      }\n    }\n  else // each row\n    {\n    for(uword i=0; i < N; ++i)\n      {\n      const uword row = indices_mem[i];\n      \n      arma_debug_check( (row > p_n_rows), \"each_row(): index out of bounds\" );\n      \n      for(uword col=0; col < p_n_cols; ++col)\n        {\n        p.at(row,col) /= A_mem[col];\n        }\n      }\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/subview_elem1_bones.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup subview_elem1\n//! @{\n\n\n\ntemplate<typename eT, typename T1>\nclass subview_elem1 : public Base<eT, subview_elem1<eT,T1> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool is_row = false;\n  static const bool is_col = true;\n  \n  arma_aligned const Mat<eT>         fake_m;\n  arma_aligned const Mat<eT>&        m;\n  arma_aligned const Base<uword,T1>& a;\n  \n  \n  protected:\n  \n  arma_inline subview_elem1(const  Mat<eT>& in_m, const Base<uword,T1>& in_a);\n  arma_inline subview_elem1(const Cube<eT>& in_q, const Base<uword,T1>& in_a);\n  \n  \n  public:\n  \n  inline ~subview_elem1();\n  \n  template<typename op_type>              inline void inplace_op(const eT                    val);\n  template<typename op_type, typename T2> inline void inplace_op(const subview_elem1<eT,T2>& x  );\n  template<typename op_type, typename T2> inline void inplace_op(const Base<eT,T2>&          x  );\n  \n  arma_inline const Op<subview_elem1<eT,T1>,op_htrans>  t() const;\n  arma_inline const Op<subview_elem1<eT,T1>,op_htrans> ht() const;\n  arma_inline const Op<subview_elem1<eT,T1>,op_strans> st() const;\n  \n  inline void fill(const eT val);\n  inline void zeros();\n  inline void ones();\n  inline void randu();\n  inline void randn();\n  \n  inline void operator+= (const eT val);\n  inline void operator-= (const eT val);\n  inline void operator*= (const eT val);\n  inline void operator/= (const eT val);\n  \n  \n  // deliberately returning void\n  template<typename T2> inline void operator_equ(const subview_elem1<eT,T2>& x);\n  template<typename T2> inline void operator=   (const subview_elem1<eT,T2>& x);\n                        inline void operator=   (const subview_elem1<eT,T1>& x);\n  template<typename T2> inline void operator+=  (const subview_elem1<eT,T2>& x);\n  template<typename T2> inline void operator-=  (const subview_elem1<eT,T2>& x);\n  template<typename T2> inline void operator%=  (const subview_elem1<eT,T2>& x);\n  template<typename T2> inline void operator/=  (const subview_elem1<eT,T2>& x);\n  \n  template<typename T2> inline void operator=  (const Base<eT,T2>& x);\n  template<typename T2> inline void operator+= (const Base<eT,T2>& x);\n  template<typename T2> inline void operator-= (const Base<eT,T2>& x);\n  template<typename T2> inline void operator%= (const Base<eT,T2>& x);\n  template<typename T2> inline void operator/= (const Base<eT,T2>& x);\n  \n  inline static void extract(Mat<eT>& out, const subview_elem1& in);\n  \n  template<typename op_type> inline static void mat_inplace_op(Mat<eT>& out, const subview_elem1& in);\n  \n  inline static void  plus_inplace(Mat<eT>& out, const subview_elem1& in);\n  inline static void minus_inplace(Mat<eT>& out, const subview_elem1& in);\n  inline static void schur_inplace(Mat<eT>& out, const subview_elem1& in);\n  inline static void   div_inplace(Mat<eT>& out, const subview_elem1& in);\n  \n  \n  \n  private:\n  \n  friend class  Mat<eT>;\n  friend class Cube<eT>;\n  \n  subview_elem1();\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/subview_elem1_meat.hpp",
    "content": "// Copyright (C) 2010-2013 Conrad Sanderson\n// Copyright (C) 2010-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup subview_elem1\n//! @{\n\n\ntemplate<typename eT, typename T1>\ninline\nsubview_elem1<eT,T1>::~subview_elem1()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\ntemplate<typename eT, typename T1>\narma_inline\nsubview_elem1<eT,T1>::subview_elem1(const Mat<eT>& in_m, const Base<uword,T1>& in_a)\n  : m(in_m)\n  , a(in_a)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT, typename T1>\narma_inline\nsubview_elem1<eT,T1>::subview_elem1(const Cube<eT>& in_q, const Base<uword,T1>& in_a)\n  : fake_m( const_cast< eT* >(in_q.memptr()), in_q.n_elem, 1, false )\n  ,      m( fake_m )\n  ,      a( in_a   )\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT, typename T1>\ntemplate<typename op_type>\ninline\nvoid\nsubview_elem1<eT,T1>::inplace_op(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& m_local = const_cast< Mat<eT>& >(m);\n  \n        eT*   m_mem    = m_local.memptr();\n  const uword m_n_elem = m_local.n_elem;\n  \n  const unwrap_check_mixed<T1> tmp(a.get_ref(), m_local);\n  const umat& aa = tmp.M;\n  \n  arma_debug_check\n    (\n    ( (aa.is_vec() == false) && (aa.is_empty() == false) ),\n    \"Mat::elem(): given object is not a vector\"\n    );\n  \n  const uword* aa_mem    = aa.memptr();\n  const uword  aa_n_elem = aa.n_elem;\n  \n  uword iq,jq;\n  for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2)\n    {\n    const uword ii = aa_mem[iq];\n    const uword jj = aa_mem[jq];\n    \n    arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), \"Mat::elem(): index out of bounds\" );\n    \n         if(is_same_type<op_type, op_subview_elem_equ          >::yes) { m_mem[ii] =  val; m_mem[jj] =  val; }\n    else if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { m_mem[ii] += val; m_mem[jj] += val; }\n    else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { m_mem[ii] -= val; m_mem[jj] -= val; }\n    else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { m_mem[ii] *= val; m_mem[jj] *= val; }\n    else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { m_mem[ii] /= val; m_mem[jj] /= val; }\n    }\n  \n  if(iq < aa_n_elem)\n    {\n    const uword ii = aa_mem[iq];\n    \n    arma_debug_check( (ii >= m_n_elem) , \"Mat::elem(): index out of bounds\" ); \n    \n         if(is_same_type<op_type, op_subview_elem_equ          >::yes) { m_mem[ii] =  val; }\n    else if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { m_mem[ii] += val; }\n    else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { m_mem[ii] -= val; }\n    else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { m_mem[ii] *= val; }\n    else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { m_mem[ii] /= val; }\n    }\n  }\n\n\n\ntemplate<typename eT, typename T1>\ntemplate<typename op_type, typename T2>\ninline\nvoid\nsubview_elem1<eT,T1>::inplace_op(const subview_elem1<eT,T2>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_elem1<eT,T1>& s = *this;\n  \n  if(&(s.m) == &(x.m))\n    {\n    arma_extra_debug_print(\"subview_elem1::inplace_op(): aliasing detected\");\n    \n    const Mat<eT> tmp(x);\n    \n         if(is_same_type<op_type, op_subview_elem_equ          >::yes) { s.operator= (tmp); }\n    else if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { s.operator+=(tmp); }\n    else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { s.operator-=(tmp); }\n    else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { s.operator%=(tmp); }\n    else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { s.operator/=(tmp); }\n    }\n  else\n    {\n          Mat<eT>& s_m_local = const_cast< Mat<eT>& >(s.m);\n    const Mat<eT>& x_m_local = x.m;\n    \n    const unwrap_check_mixed<T1> s_tmp(s.a.get_ref(), s_m_local);\n    const unwrap_check_mixed<T2> x_tmp(x.a.get_ref(), s_m_local);\n    \n    const umat& s_aa = s_tmp.M;\n    const umat& x_aa = x_tmp.M;\n    \n    arma_debug_check\n      (\n      ( ((s_aa.is_vec() == false) && (s_aa.is_empty() == false)) || ((x_aa.is_vec() == false) && (x_aa.is_empty() == false)) ),\n      \"Mat::elem(): given object is not a vector\"\n      );\n    \n    const uword* s_aa_mem = s_aa.memptr();\n    const uword* x_aa_mem = x_aa.memptr();\n    \n    const uword s_aa_n_elem = s_aa.n_elem;\n    \n    arma_debug_check( (s_aa_n_elem != x_aa.n_elem), \"Mat::elem(): size mismatch\" );\n    \n    \n          eT*   s_m_mem    = s_m_local.memptr();\n    const uword s_m_n_elem = s_m_local.n_elem;\n    \n    const eT*   x_m_mem    = x_m_local.memptr();\n    const uword x_m_n_elem = x_m_local.n_elem;\n    \n    uword iq,jq;\n    for(iq=0, jq=1; jq < s_aa_n_elem; iq+=2, jq+=2)\n      {\n      const uword s_ii = s_aa_mem[iq];\n      const uword s_jj = s_aa_mem[jq];\n      \n      const uword x_ii = x_aa_mem[iq];\n      const uword x_jj = x_aa_mem[jq];\n      \n      arma_debug_check\n        (\n        (s_ii >= s_m_n_elem) || (s_jj >= s_m_n_elem) || (x_ii >= x_m_n_elem) || (x_jj >= x_m_n_elem),\n        \"Mat::elem(): index out of bounds\"\n        );\n      \n           if(is_same_type<op_type, op_subview_elem_equ          >::yes) { s_m_mem[s_ii]  = x_m_mem[x_ii]; s_m_mem[s_jj]  = x_m_mem[x_jj]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { s_m_mem[s_ii] += x_m_mem[x_ii]; s_m_mem[s_jj] += x_m_mem[x_jj]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { s_m_mem[s_ii] -= x_m_mem[x_ii]; s_m_mem[s_jj] -= x_m_mem[x_jj]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { s_m_mem[s_ii] *= x_m_mem[x_ii]; s_m_mem[s_jj] *= x_m_mem[x_jj]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { s_m_mem[s_ii] /= x_m_mem[x_ii]; s_m_mem[s_jj] /= x_m_mem[x_jj]; }\n      }\n    \n    if(iq < s_aa_n_elem)\n      {\n      const uword s_ii = s_aa_mem[iq];\n      const uword x_ii = x_aa_mem[iq];\n      \n      arma_debug_check\n        (\n        ( (s_ii >= s_m_n_elem) || (x_ii >= x_m_n_elem) ),\n        \"Mat::elem(): index out of bounds\"\n        );\n      \n           if(is_same_type<op_type, op_subview_elem_equ          >::yes) { s_m_mem[s_ii]  = x_m_mem[x_ii]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { s_m_mem[s_ii] += x_m_mem[x_ii]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { s_m_mem[s_ii] -= x_m_mem[x_ii]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { s_m_mem[s_ii] *= x_m_mem[x_ii]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { s_m_mem[s_ii] /= x_m_mem[x_ii]; }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT, typename T1>\ntemplate<typename op_type, typename T2>\ninline\nvoid\nsubview_elem1<eT,T1>::inplace_op(const Base<eT,T2>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& m_local = const_cast< Mat<eT>& >(m);\n  \n        eT*   m_mem    = m_local.memptr();\n  const uword m_n_elem = m_local.n_elem;\n  \n  const unwrap_check_mixed<T1> aa_tmp(a.get_ref(), m_local);\n  const umat& aa = aa_tmp.M;\n  \n  arma_debug_check\n    (\n    ( (aa.is_vec() == false) && (aa.is_empty() == false) ),\n    \"Mat::elem(): given object is not a vector\"\n    );\n  \n  const uword* aa_mem    = aa.memptr();\n  const uword  aa_n_elem = aa.n_elem;\n  \n  const Proxy<T2> P(x.get_ref());\n  \n  arma_debug_check( (aa_n_elem != P.get_n_elem()), \"Mat::elem(): size mismatch\" );\n  \n  const bool is_alias = P.is_alias(m);\n  \n  if( (is_alias == false) && (Proxy<T2>::prefer_at_accessor == false) )\n    {\n    typename Proxy<T2>::ea_type X = P.get_ea();\n    \n    uword iq,jq;\n    for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2)\n      {\n      const uword ii = aa_mem[iq];\n      const uword jj = aa_mem[jq];\n      \n      arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), \"Mat::elem(): index out of bounds\" );\n      \n           if(is_same_type<op_type, op_subview_elem_equ          >::yes) { m_mem[ii] =  X[iq]; m_mem[jj]  = X[jq]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { m_mem[ii] += X[iq]; m_mem[jj] += X[jq]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { m_mem[ii] -= X[iq]; m_mem[jj] -= X[jq]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { m_mem[ii] *= X[iq]; m_mem[jj] *= X[jq]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { m_mem[ii] /= X[iq]; m_mem[jj] /= X[jq]; }\n      }\n    \n    if(iq < aa_n_elem)\n      {\n      const uword ii = aa_mem[iq];\n      \n      arma_debug_check( (ii >= m_n_elem) , \"Mat::elem(): index out of bounds\" );\n      \n           if(is_same_type<op_type, op_subview_elem_equ          >::yes) { m_mem[ii] =  X[iq]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { m_mem[ii] += X[iq]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { m_mem[ii] -= X[iq]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { m_mem[ii] *= X[iq]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { m_mem[ii] /= X[iq]; }\n      }\n    }\n  else\n    {\n    arma_extra_debug_print(\"subview_elem1::inplace_op(): aliasing or prefer_at_accessor detected\");\n    \n    const unwrap_check<typename Proxy<T2>::stored_type> tmp(P.Q, is_alias);\n    const Mat<eT>& M = tmp.M;\n    \n    const eT* X = M.memptr();\n    \n    uword iq,jq;\n    for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2)\n      {\n      const uword ii = aa_mem[iq];\n      const uword jj = aa_mem[jq];\n      \n      arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), \"Mat::elem(): index out of bounds\" );\n      \n           if(is_same_type<op_type, op_subview_elem_equ          >::yes) { m_mem[ii] =  X[iq]; m_mem[jj]  = X[jq]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { m_mem[ii] += X[iq]; m_mem[jj] += X[jq]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { m_mem[ii] -= X[iq]; m_mem[jj] -= X[jq]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { m_mem[ii] *= X[iq]; m_mem[jj] *= X[jq]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { m_mem[ii] /= X[iq]; m_mem[jj] /= X[jq]; }\n      }\n    \n    if(iq < aa_n_elem)\n      {\n      const uword ii = aa_mem[iq];\n      \n      arma_debug_check( (ii >= m_n_elem) , \"Mat::elem(): index out of bounds\" );\n      \n           if(is_same_type<op_type, op_subview_elem_equ          >::yes) { m_mem[ii] =  X[iq]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { m_mem[ii] += X[iq]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { m_mem[ii] -= X[iq]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { m_mem[ii] *= X[iq]; }\n      else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { m_mem[ii] /= X[iq]; }\n      }\n    }\n  }\n\n\n\n//\n//\n\n\n\ntemplate<typename eT, typename T1>\narma_inline\nconst Op<subview_elem1<eT,T1>,op_htrans>\nsubview_elem1<eT,T1>::t() const\n  {\n  return Op<subview_elem1<eT,T1>,op_htrans>(*this);\n  }\n\n\n\ntemplate<typename eT, typename T1>\narma_inline\nconst Op<subview_elem1<eT,T1>,op_htrans>\nsubview_elem1<eT,T1>::ht() const\n  {\n  return Op<subview_elem1<eT,T1>,op_htrans>(*this);\n  }\n\n\n\ntemplate<typename eT, typename T1>\narma_inline\nconst Op<subview_elem1<eT,T1>,op_strans>\nsubview_elem1<eT,T1>::st() const\n  {\n  return Op<subview_elem1<eT,T1>,op_strans>(*this);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nsubview_elem1<eT,T1>::fill(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_equ>(val);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nsubview_elem1<eT,T1>::zeros()\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_equ>(eT(0));\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nsubview_elem1<eT,T1>::ones()\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_equ>(eT(1));\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nsubview_elem1<eT,T1>::randu()\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& m_local = const_cast< Mat<eT>& >(m);\n  \n        eT*   m_mem    = m_local.memptr();\n  const uword m_n_elem = m_local.n_elem;\n  \n  const unwrap_check_mixed<T1> tmp(a.get_ref(), m_local);\n  const umat& aa = tmp.M;\n  \n  arma_debug_check\n    (\n    ( (aa.is_vec() == false) && (aa.is_empty() == false) ),\n    \"Mat::elem(): given object is not a vector\"\n    );\n  \n  const uword* aa_mem    = aa.memptr();\n  const uword  aa_n_elem = aa.n_elem;\n  \n  uword iq,jq;\n  for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2)\n    {\n    const uword ii = aa_mem[iq];\n    const uword jj = aa_mem[jq];\n    \n    arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), \"Mat::elem(): index out of bounds\" );\n    \n    const eT val1 = eT(arma_rng::randu<eT>());\n    const eT val2 = eT(arma_rng::randu<eT>());\n    \n    m_mem[ii] = val1;\n    m_mem[jj] = val2;\n    }\n  \n  if(iq < aa_n_elem)\n    {\n    const uword ii = aa_mem[iq];\n    \n    arma_debug_check( (ii >= m_n_elem) , \"Mat::elem(): index out of bounds\" ); \n    \n    m_mem[ii] = eT(arma_rng::randu<eT>());\n    }\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nsubview_elem1<eT,T1>::randn()\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& m_local = const_cast< Mat<eT>& >(m);\n  \n        eT*   m_mem    = m_local.memptr();\n  const uword m_n_elem = m_local.n_elem;\n  \n  const unwrap_check_mixed<T1> tmp(a.get_ref(), m_local);\n  const umat& aa = tmp.M;\n  \n  arma_debug_check\n    (\n    ( (aa.is_vec() == false) && (aa.is_empty() == false) ),\n    \"Mat::elem(): given object is not a vector\"\n    );\n  \n  const uword* aa_mem    = aa.memptr();\n  const uword  aa_n_elem = aa.n_elem;\n  \n  uword iq,jq;\n  for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2)\n    {\n    const uword ii = aa_mem[iq];\n    const uword jj = aa_mem[jq];\n    \n    arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), \"Mat::elem(): index out of bounds\" );\n    \n    arma_rng::randn<eT>::dual_val( m_mem[ii], m_mem[jj] );\n    }\n  \n  if(iq < aa_n_elem)\n    {\n    const uword ii = aa_mem[iq];\n    \n    arma_debug_check( (ii >= m_n_elem) , \"Mat::elem(): index out of bounds\" ); \n    \n    m_mem[ii] = eT(arma_rng::randn<eT>());\n    }\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nsubview_elem1<eT,T1>::operator+= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_plus>(val);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nsubview_elem1<eT,T1>::operator-= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_minus>(val);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nsubview_elem1<eT,T1>::operator*= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_schur>(val);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nsubview_elem1<eT,T1>::operator/= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_div>(val);\n  }\n\n\n\n//\n//\n\n\n\ntemplate<typename eT, typename T1>\ntemplate<typename T2>\ninline\nvoid\nsubview_elem1<eT,T1>::operator_equ(const subview_elem1<eT,T2>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_equ>(x);\n  }\n\n\n\n\ntemplate<typename eT, typename T1>\ntemplate<typename T2>\ninline\nvoid\nsubview_elem1<eT,T1>::operator= (const subview_elem1<eT,T2>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  (*this).operator_equ(x);\n  }\n\n\n\n//! work around compiler bugs\ntemplate<typename eT, typename T1>\ninline\nvoid\nsubview_elem1<eT,T1>::operator= (const subview_elem1<eT,T1>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  (*this).operator_equ(x);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ntemplate<typename T2>\ninline\nvoid\nsubview_elem1<eT,T1>::operator+= (const subview_elem1<eT,T2>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_plus>(x);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ntemplate<typename T2>\ninline\nvoid\nsubview_elem1<eT,T1>::operator-= (const subview_elem1<eT,T2>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_minus>(x);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ntemplate<typename T2>\ninline\nvoid\nsubview_elem1<eT,T1>::operator%= (const subview_elem1<eT,T2>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_schur>(x);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ntemplate<typename T2>\ninline\nvoid\nsubview_elem1<eT,T1>::operator/= (const subview_elem1<eT,T2>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_div>(x);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ntemplate<typename T2>\ninline\nvoid\nsubview_elem1<eT,T1>::operator= (const Base<eT,T2>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_equ>(x);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ntemplate<typename T2>\ninline\nvoid\nsubview_elem1<eT,T1>::operator+= (const Base<eT,T2>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_plus>(x);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ntemplate<typename T2>\ninline\nvoid\nsubview_elem1<eT,T1>::operator-= (const Base<eT,T2>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_minus>(x);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ntemplate<typename T2>\ninline\nvoid\nsubview_elem1<eT,T1>::operator%= (const Base<eT,T2>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_schur>(x);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ntemplate<typename T2>\ninline\nvoid\nsubview_elem1<eT,T1>::operator/= (const Base<eT,T2>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_div>(x);\n  }\n\n\n\n//\n//\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nsubview_elem1<eT,T1>::extract(Mat<eT>& actual_out, const subview_elem1<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap_check_mixed<T1> tmp1(in.a.get_ref(), actual_out);\n  const umat& aa = tmp1.M;\n  \n  arma_debug_check\n    (\n    ( (aa.is_vec() == false) && (aa.is_empty() == false) ),\n    \"Mat::elem(): given object is not a vector\"\n    );\n  \n  const uword* aa_mem    = aa.memptr();\n  const uword  aa_n_elem = aa.n_elem;\n  \n  const Mat<eT>& m_local = in.m;\n  \n  const eT*   m_mem    = m_local.memptr();\n  const uword m_n_elem = m_local.n_elem;\n  \n  const bool alias = (&actual_out == &m_local);\n  \n  arma_extra_debug_warn(alias, \"subview_elem1::extract(): aliasing detected\");\n  \n  Mat<eT>* tmp_out = alias ? new Mat<eT>() : 0;\n  Mat<eT>& out     = alias ? *tmp_out      : actual_out;\n  \n  out.set_size(aa_n_elem, 1);\n  \n  eT* out_mem = out.memptr();\n  \n  uword i,j;\n  for(i=0, j=1; j<aa_n_elem; i+=2, j+=2)\n    {\n    const uword ii = aa_mem[i];\n    const uword jj = aa_mem[j];\n    \n    arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), \"Mat::elem(): index out of bounds\" );\n    \n    out_mem[i] = m_mem[ii];\n    out_mem[j] = m_mem[jj];\n    }\n  \n  if(i < aa_n_elem)\n    {\n    const uword ii = aa_mem[i];\n    \n    arma_debug_check( (ii >= m_n_elem) , \"Mat::elem(): index out of bounds\" );\n    \n    out_mem[i] = m_mem[ii];\n    }\n  \n  if(alias == true)\n    {\n    actual_out.steal_mem(out);\n    delete tmp_out;\n    }\n  }\n\n\n\ntemplate<typename eT, typename T1>\ntemplate<typename op_type>\ninline\nvoid\nsubview_elem1<eT,T1>::mat_inplace_op(Mat<eT>& out, const subview_elem1& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const unwrap<T1> tmp1(in.a.get_ref());\n  const umat& aa = tmp1.M;\n  \n  arma_debug_check\n    (\n    ( (aa.is_vec() == false) && (aa.is_empty() == false) ),\n    \"Mat::elem(): given object is not a vector\"\n    );\n  \n  const uword* aa_mem    = aa.memptr();\n  const uword  aa_n_elem = aa.n_elem;\n  \n  const unwrap_check< Mat<eT> > tmp2(in.m, out);\n  const Mat<eT>& m_local      = tmp2.M;\n  \n  const eT*   m_mem    = m_local.memptr();\n  const uword m_n_elem = m_local.n_elem;\n  \n  arma_debug_check( (out.n_elem != aa_n_elem), \"Mat::elem(): size mismatch\" );\n  \n  eT* out_mem = out.memptr();\n  \n  uword i,j;\n  for(i=0, j=1; j<aa_n_elem; i+=2, j+=2)\n    {\n    const uword ii = aa_mem[i];\n    const uword jj = aa_mem[j];\n    \n    arma_debug_check( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), \"Mat::elem(): index out of bounds\" );\n    \n         if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { out_mem[i] += m_mem[ii]; out_mem[j] += m_mem[jj]; }\n    else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { out_mem[i] -= m_mem[ii]; out_mem[j] -= m_mem[jj]; }\n    else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { out_mem[i] *= m_mem[ii]; out_mem[j] *= m_mem[jj]; }\n    else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { out_mem[i] /= m_mem[ii]; out_mem[j] /= m_mem[jj]; }\n    }\n  \n  if(i < aa_n_elem)\n    {\n    const uword ii = aa_mem[i];\n    \n    arma_debug_check( (ii >= m_n_elem) , \"Mat::elem(): index out of bounds\" );\n    \n         if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { out_mem[i] += m_mem[ii]; }\n    else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { out_mem[i] -= m_mem[ii]; }\n    else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { out_mem[i] *= m_mem[ii]; }\n    else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { out_mem[i] /= m_mem[ii]; }\n    }\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nsubview_elem1<eT,T1>::plus_inplace(Mat<eT>& out, const subview_elem1& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  mat_inplace_op<op_subview_elem_inplace_plus>(out, in);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nsubview_elem1<eT,T1>::minus_inplace(Mat<eT>& out, const subview_elem1& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  mat_inplace_op<op_subview_elem_inplace_minus>(out, in);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nsubview_elem1<eT,T1>::schur_inplace(Mat<eT>& out, const subview_elem1& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  mat_inplace_op<op_subview_elem_inplace_schur>(out, in);\n  }\n\n\n\ntemplate<typename eT, typename T1>\ninline\nvoid\nsubview_elem1<eT,T1>::div_inplace(Mat<eT>& out, const subview_elem1& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  mat_inplace_op<op_subview_elem_inplace_div>(out, in);\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/subview_elem2_bones.hpp",
    "content": "// Copyright (C) 2012 Conrad Sanderson\n// Copyright (C) 2012 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup subview_elem2\n//! @{\n\n\n\ntemplate<typename eT, typename T1, typename T2>\nclass subview_elem2 : public Base<eT, subview_elem2<eT,T1,T2> >\n  {\n  public:    \n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool is_row = false;\n  static const bool is_col = false;\n  \n  arma_aligned const Mat<eT>& m;\n  \n  arma_aligned const Base<uword,T1>& base_ri;\n  arma_aligned const Base<uword,T2>& base_ci;\n  \n  const bool all_rows;\n  const bool all_cols;\n  \n  \n  protected:\n  \n  arma_inline subview_elem2(const Mat<eT>& in_m, const Base<uword,T1>& in_ri, const Base<uword,T2>& in_ci, const bool in_all_rows, const bool in_all_cols);\n  \n  \n  public:\n  \n  inline ~subview_elem2();\n  \n  template<typename op_type>\n  inline void inplace_op(const eT val);\n  \n  template<typename op_type, typename expr>\n  inline void inplace_op(const Base<eT,expr>& x);\n  \n  inline void fill(const eT val);\n  inline void zeros();\n  inline void ones();\n  \n  inline void operator+= (const eT val);\n  inline void operator-= (const eT val);\n  inline void operator*= (const eT val);\n  inline void operator/= (const eT val);\n  \n  \n  // deliberately returning void\n  template<typename T3, typename T4> inline void operator_equ(const subview_elem2<eT,T3,T4>& x);\n  template<typename T3, typename T4> inline void operator=   (const subview_elem2<eT,T3,T4>& x);\n                                     inline void operator=   (const subview_elem2<eT,T1,T2>& x);\n  \n  template<typename T3, typename T4> inline void operator+=  (const subview_elem2<eT,T3,T4>& x);\n  template<typename T3, typename T4> inline void operator-=  (const subview_elem2<eT,T3,T4>& x);\n  template<typename T3, typename T4> inline void operator%=  (const subview_elem2<eT,T3,T4>& x);\n  template<typename T3, typename T4> inline void operator/=  (const subview_elem2<eT,T3,T4>& x);\n  \n  template<typename expr> inline void operator=  (const Base<eT,expr>& x);\n  template<typename expr> inline void operator+= (const Base<eT,expr>& x);\n  template<typename expr> inline void operator-= (const Base<eT,expr>& x);\n  template<typename expr> inline void operator%= (const Base<eT,expr>& x);\n  template<typename expr> inline void operator/= (const Base<eT,expr>& x);\n  \n  inline static void extract(Mat<eT>& out, const subview_elem2& in);\n  \n  inline static void  plus_inplace(Mat<eT>& out, const subview_elem2& in);\n  inline static void minus_inplace(Mat<eT>& out, const subview_elem2& in);\n  inline static void schur_inplace(Mat<eT>& out, const subview_elem2& in);\n  inline static void   div_inplace(Mat<eT>& out, const subview_elem2& in);\n  \n  \n  \n  private:\n  \n  friend class Mat<eT>;\n  subview_elem2();\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/subview_elem2_meat.hpp",
    "content": "// Copyright (C) 2012-2013 Conrad Sanderson\n// Copyright (C) 2012-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup subview_elem2\n//! @{\n\n\ntemplate<typename eT, typename T1, typename T2>\ninline\nsubview_elem2<eT,T1,T2>::~subview_elem2()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\ntemplate<typename eT, typename T1, typename T2>\narma_inline\nsubview_elem2<eT,T1,T2>::subview_elem2\n  (\n  const Mat<eT>&        in_m,\n  const Base<uword,T1>& in_ri,\n  const Base<uword,T2>& in_ci,\n  const bool            in_all_rows,\n  const bool            in_all_cols\n  )\n  : m        (in_m       )\n  , base_ri  (in_ri      )\n  , base_ci  (in_ci      )\n  , all_rows (in_all_rows)\n  , all_cols (in_all_cols)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ntemplate<typename op_type>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::inplace_op(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& m_local = const_cast< Mat<eT>& >(m);\n  \n  const uword m_n_rows = m_local.n_rows;\n  const uword m_n_cols = m_local.n_cols;\n  \n  if( (all_rows == false) && (all_cols == false) )\n    {\n    const unwrap_check_mixed<T1> tmp1(base_ri.get_ref(), m_local);\n    const unwrap_check_mixed<T2> tmp2(base_ci.get_ref(), m_local);\n    \n    const umat& ri = tmp1.M;\n    const umat& ci = tmp2.M;\n    \n    arma_debug_check\n      (\n      ( ((ri.is_vec() == false) && (ri.is_empty() == false)) || ((ci.is_vec() == false) && (ci.is_empty() == false)) ),\n      \"Mat::elem(): given object is not a vector\"\n      );\n    \n    const uword* ri_mem    = ri.memptr();\n    const uword  ri_n_elem = ri.n_elem;\n    \n    const uword* ci_mem    = ci.memptr();\n    const uword  ci_n_elem = ci.n_elem;\n    \n    for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count)\n      {\n      const uword col = ci_mem[ci_count];\n      \n      arma_debug_check( (col > m_n_cols), \"Mat::elem(): index out of bounds\" );\n      \n      for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count)\n        {\n        const uword row = ri_mem[ri_count];\n        \n        arma_debug_check( (row > m_n_rows), \"Mat::elem(): index out of bounds\" );\n        \n             if(is_same_type<op_type, op_subview_elem_equ          >::yes) { m_local.at(row,col)  = val; }\n        else if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { m_local.at(row,col) += val; }\n        else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { m_local.at(row,col) -= val; }\n        else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { m_local.at(row,col) *= val; }\n        else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { m_local.at(row,col) /= val; }\n        }\n      }\n    }\n  else\n  if( (all_rows == true) && (all_cols == false) )\n    {\n    const unwrap_check_mixed<T2> tmp2(base_ci.get_ref(), m_local);\n    \n    const umat& ci = tmp2.M;\n    \n    arma_debug_check\n      (\n      ( (ci.is_vec() == false) && (ci.is_empty() == false) ),\n      \"Mat::elem(): given object is not a vector\"\n      );\n    \n    const uword* ci_mem    = ci.memptr();\n    const uword  ci_n_elem = ci.n_elem;\n    \n    for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count)\n      {\n      const uword col = ci_mem[ci_count];\n      \n      arma_debug_check( (col > m_n_cols), \"Mat::elem(): index out of bounds\" );\n      \n      eT* colptr = m_local.colptr(col);\n      \n           if(is_same_type<op_type, op_subview_elem_equ          >::yes) { arrayops::inplace_set  (colptr, val, m_n_rows); }\n      else if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { arrayops::inplace_plus (colptr, val, m_n_rows); }\n      else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { arrayops::inplace_minus(colptr, val, m_n_rows); }\n      else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { arrayops::inplace_mul  (colptr, val, m_n_rows); }\n      else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { arrayops::inplace_div  (colptr, val, m_n_rows); }\n      }\n    }\n  else\n  if( (all_rows == false) && (all_cols == true) )\n    {\n    const unwrap_check_mixed<T1> tmp1(base_ri.get_ref(), m_local);\n    \n    const umat& ri = tmp1.M;\n    \n    arma_debug_check\n      (\n      ( (ri.is_vec() == false) && (ri.is_empty() == false) ),\n      \"Mat::elem(): given object is not a vector\"\n      );\n    \n    const uword* ri_mem    = ri.memptr();\n    const uword  ri_n_elem = ri.n_elem;\n\n    for(uword col=0; col < m_n_cols; ++col)\n      {\n      for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count)\n        {\n        const uword row = ri_mem[ri_count];\n        \n        arma_debug_check( (row > m_n_rows), \"Mat::elem(): index out of bounds\" );\n      \n             if(is_same_type<op_type, op_subview_elem_equ          >::yes) { m_local.at(row,col)  = val; }\n        else if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { m_local.at(row,col) += val; }\n        else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { m_local.at(row,col) -= val; }\n        else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { m_local.at(row,col) *= val; }\n        else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { m_local.at(row,col) /= val; }\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ntemplate<typename op_type, typename expr>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::inplace_op(const Base<eT,expr>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& m_local = const_cast< Mat<eT>& >(m);\n  \n  const uword m_n_rows = m_local.n_rows;\n  const uword m_n_cols = m_local.n_cols;\n  \n  const unwrap_check<expr> tmp(x.get_ref(), m_local);\n  const Mat<eT>& X       = tmp.M;\n  \n  if( (all_rows == false) && (all_cols == false) )\n    {\n    const unwrap_check_mixed<T1> tmp1(base_ri.get_ref(), m_local);\n    const unwrap_check_mixed<T2> tmp2(base_ci.get_ref(), m_local);\n    \n    const umat& ri = tmp1.M;\n    const umat& ci = tmp2.M;\n    \n    arma_debug_check\n      (\n      ( ((ri.is_vec() == false) && (ri.is_empty() == false)) || ((ci.is_vec() == false) && (ci.is_empty() == false)) ),\n      \"Mat::elem(): given object is not a vector\"\n      );\n    \n    const uword* ri_mem    = ri.memptr();\n    const uword  ri_n_elem = ri.n_elem;\n    \n    const uword* ci_mem    = ci.memptr();\n    const uword  ci_n_elem = ci.n_elem;\n    \n    arma_debug_assert_same_size( ri_n_elem, ci_n_elem, X.n_rows, X.n_cols, \"Mat::elem()\" );\n    \n    for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count)\n      {\n      const uword col = ci_mem[ci_count];\n      \n      arma_debug_check( (col > m_n_cols), \"Mat::elem(): index out of bounds\" );\n      \n      for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count)\n        {\n        const uword row = ri_mem[ri_count];\n        \n        arma_debug_check( (row > m_n_rows), \"Mat::elem(): index out of bounds\" );\n        \n             if(is_same_type<op_type, op_subview_elem_equ          >::yes) { m_local.at(row,col)  = X.at(ri_count, ci_count); }\n        else if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { m_local.at(row,col) += X.at(ri_count, ci_count); }\n        else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { m_local.at(row,col) -= X.at(ri_count, ci_count); }\n        else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { m_local.at(row,col) *= X.at(ri_count, ci_count); }\n        else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { m_local.at(row,col) /= X.at(ri_count, ci_count); }\n        }\n      }\n    }\n  else\n  if( (all_rows == true) && (all_cols == false) )\n    {\n    const unwrap_check_mixed<T2> tmp2(base_ci.get_ref(), m_local);\n    \n    const umat& ci = tmp2.M;\n    \n    arma_debug_check\n      (\n      ( (ci.is_vec() == false) && (ci.is_empty() == false) ),\n      \"Mat::elem(): given object is not a vector\"\n      );\n    \n    const uword* ci_mem    = ci.memptr();\n    const uword  ci_n_elem = ci.n_elem;\n    \n    arma_debug_assert_same_size( m_n_rows, ci_n_elem, X.n_rows, X.n_cols, \"Mat::elem()\" );\n    \n    for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count)\n      {\n      const uword col = ci_mem[ci_count];\n      \n      arma_debug_check( (col > m_n_cols), \"Mat::elem(): index out of bounds\" );\n      \n            eT* m_colptr = m_local.colptr(col);\n      const eT* X_colptr = X.colptr(ci_count);\n      \n           if(is_same_type<op_type, op_subview_elem_equ          >::yes) { arrayops::copy         (m_colptr, X_colptr, m_n_rows); }\n      else if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { arrayops::inplace_plus (m_colptr, X_colptr, m_n_rows); }\n      else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { arrayops::inplace_minus(m_colptr, X_colptr, m_n_rows); }\n      else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { arrayops::inplace_mul  (m_colptr, X_colptr, m_n_rows); }\n      else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { arrayops::inplace_div  (m_colptr, X_colptr, m_n_rows); }\n      }\n    }\n  else\n  if( (all_rows == false) && (all_cols == true) )\n    {\n    const unwrap_check_mixed<T1> tmp1(base_ri.get_ref(), m_local);\n    \n    const umat& ri = tmp1.M;\n    \n    arma_debug_check\n      (\n      ( (ri.is_vec() == false) && (ri.is_empty() == false) ),\n      \"Mat::elem(): given object is not a vector\"\n      );\n    \n    const uword* ri_mem    = ri.memptr();\n    const uword  ri_n_elem = ri.n_elem;\n    \n    arma_debug_assert_same_size( ri_n_elem, m_n_cols, X.n_rows, X.n_cols, \"Mat::elem()\" );\n    \n    for(uword col=0; col < m_n_cols; ++col)\n      {\n      for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count)\n        {\n        const uword row = ri_mem[ri_count];\n        \n        arma_debug_check( (row > m_n_rows), \"Mat::elem(): index out of bounds\" );\n      \n             if(is_same_type<op_type, op_subview_elem_equ          >::yes) { m_local.at(row,col)  = X.at(ri_count, col); }\n        else if(is_same_type<op_type, op_subview_elem_inplace_plus >::yes) { m_local.at(row,col) += X.at(ri_count, col); }\n        else if(is_same_type<op_type, op_subview_elem_inplace_minus>::yes) { m_local.at(row,col) -= X.at(ri_count, col); }\n        else if(is_same_type<op_type, op_subview_elem_inplace_schur>::yes) { m_local.at(row,col) *= X.at(ri_count, col); }\n        else if(is_same_type<op_type, op_subview_elem_inplace_div  >::yes) { m_local.at(row,col) /= X.at(ri_count, col); }\n        }\n      }\n    }\n  }\n\n\n\n//\n//\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::fill(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_equ>(val);\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::zeros()\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_equ>(eT(0));\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::ones()\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_equ>(eT(1));\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::operator+= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_plus>(val);\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::operator-= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_minus>(val);\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::operator*= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_schur>(val);\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::operator/= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_div>(val);\n  }\n\n\n\n//\n//\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ntemplate<typename T3, typename T4>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::operator_equ(const subview_elem2<eT,T3,T4>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_equ>(x);\n  }\n\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ntemplate<typename T3, typename T4>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::operator= (const subview_elem2<eT,T3,T4>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  (*this).operator_equ(x);\n  }\n\n\n\n//! work around compiler bugs\ntemplate<typename eT, typename T1, typename T2>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::operator= (const subview_elem2<eT,T1,T2>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  (*this).operator_equ(x);\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ntemplate<typename T3, typename T4>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::operator+= (const subview_elem2<eT,T3,T4>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_plus>(x);\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ntemplate<typename T3, typename T4>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::operator-= (const subview_elem2<eT,T3,T4>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_minus>(x);\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ntemplate<typename T3, typename T4>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::operator%= (const subview_elem2<eT,T3,T4>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_schur>(x);\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ntemplate<typename T3, typename T4>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::operator/= (const subview_elem2<eT,T3,T4>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_div>(x);\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ntemplate<typename expr>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::operator= (const Base<eT,expr>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_equ>(x);\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ntemplate<typename expr>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::operator+= (const Base<eT,expr>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_plus>(x);\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ntemplate<typename expr>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::operator-= (const Base<eT,expr>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_minus>(x);\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ntemplate<typename expr>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::operator%= (const Base<eT,expr>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_schur>(x);\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ntemplate<typename expr>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::operator/= (const Base<eT,expr>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  inplace_op<op_subview_elem_inplace_div>(x);\n  }\n\n\n\n//\n//\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::extract(Mat<eT>& actual_out, const subview_elem2<eT,T1,T2>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  Mat<eT>& m_local = const_cast< Mat<eT>& >(in.m);\n  \n  const uword m_n_rows = m_local.n_rows;\n  const uword m_n_cols = m_local.n_cols;\n  \n  const bool alias = (&actual_out == &m_local);\n  \n  arma_extra_debug_warn(alias, \"subview_elem2::extract(): aliasing detected\");\n  \n  Mat<eT>* tmp_out = alias ? new Mat<eT>() : 0;\n  Mat<eT>& out     = alias ? *tmp_out      : actual_out;\n  \n  if( (in.all_rows == false) && (in.all_cols == false) )\n    {\n    const unwrap_check_mixed<T1> tmp1(in.base_ri.get_ref(), actual_out);\n    const unwrap_check_mixed<T2> tmp2(in.base_ci.get_ref(), actual_out);\n    \n    const umat& ri = tmp1.M;\n    const umat& ci = tmp2.M;\n    \n    arma_debug_check\n      (\n      ( ((ri.is_vec() == false) && (ri.is_empty() == false)) || ((ci.is_vec() == false) && (ci.is_empty() == false)) ),\n      \"Mat::elem(): given object is not a vector\"\n      );\n    \n    const uword* ri_mem    = ri.memptr();\n    const uword  ri_n_elem = ri.n_elem;\n    \n    const uword* ci_mem    = ci.memptr();\n    const uword  ci_n_elem = ci.n_elem;\n    \n    out.set_size(ri_n_elem, ci_n_elem);\n    \n    eT*   out_mem   = out.memptr();\n    uword out_count = 0;\n    \n    for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count)\n      {\n      const uword col = ci_mem[ci_count];\n      \n      arma_debug_check( (col > m_n_cols), \"Mat::elem(): index out of bounds\" );\n      \n      for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count)\n        {\n        const uword row = ri_mem[ri_count];\n        \n        arma_debug_check( (row > m_n_rows), \"Mat::elem(): index out of bounds\" );\n        \n        out_mem[out_count] = m_local.at(row,col);\n        ++out_count;\n        }\n      }\n    }\n  else\n  if( (in.all_rows == true) && (in.all_cols == false) )\n    {\n    const unwrap_check_mixed<T2> tmp2(in.base_ci.get_ref(), m_local);\n    \n    const umat& ci = tmp2.M;\n    \n    arma_debug_check\n      (\n      ( (ci.is_vec() == false) && (ci.is_empty() == false) ),\n      \"Mat::elem(): given object is not a vector\"\n      );\n    \n    const uword* ci_mem    = ci.memptr();\n    const uword  ci_n_elem = ci.n_elem;\n    \n    out.set_size(m_n_rows, ci_n_elem);\n    \n    for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count)\n      {\n      const uword col = ci_mem[ci_count];\n      \n      arma_debug_check( (col > m_n_cols), \"Mat::elem(): index out of bounds\" );\n      \n      arrayops::copy( out.colptr(ci_count), m_local.colptr(col), m_n_rows );\n      }\n    }\n  else\n  if( (in.all_rows == false) && (in.all_cols == true) )\n    {\n    const unwrap_check_mixed<T1> tmp1(in.base_ri.get_ref(), m_local);\n    \n    const umat& ri = tmp1.M;\n    \n    arma_debug_check\n      (\n      ( (ri.is_vec() == false) && (ri.is_empty() == false) ),\n      \"Mat::elem(): given object is not a vector\"\n      );\n    \n    const uword* ri_mem    = ri.memptr();\n    const uword  ri_n_elem = ri.n_elem;\n    \n    out.set_size(ri_n_elem, m_n_cols);\n    \n    for(uword col=0; col < m_n_cols; ++col)\n      {\n      for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count)\n        {\n        const uword row = ri_mem[ri_count];\n        \n        arma_debug_check( (row > m_n_rows), \"Mat::elem(): index out of bounds\" );\n        \n        out.at(ri_count,col) = m_local.at(row,col);\n        }\n      }\n    }\n  \n  \n  if(alias)\n    {\n    actual_out.steal_mem(out);\n    \n    delete tmp_out;\n    }\n  }\n\n\n\n// TODO: implement a dedicated function instead of creating a temporary (but lots of potential aliasing issues)\ntemplate<typename eT, typename T1, typename T2>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::plus_inplace(Mat<eT>& out, const subview_elem2& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> tmp(in);\n  \n  out += tmp;\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::minus_inplace(Mat<eT>& out, const subview_elem2& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> tmp(in);\n  \n  out -= tmp;\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::schur_inplace(Mat<eT>& out, const subview_elem2& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> tmp(in);\n  \n  out %= tmp;\n  }\n\n\n\ntemplate<typename eT, typename T1, typename T2>\ninline\nvoid\nsubview_elem2<eT,T1,T2>::div_inplace(Mat<eT>& out, const subview_elem2& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Mat<eT> tmp(in);\n  \n  out /= tmp;\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/subview_field_bones.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup subview_field\n//! @{\n\n\n//! Class for storing data required to construct or apply operations to a subfield\n//! (i.e. where the subfield starts and ends as well as a reference/pointer to the original field),\ntemplate<typename oT>\nclass subview_field\n  {\n  public:  \n  \n  typedef oT object_type;\n  \n  const field<oT>& f;\n  \n  const uword aux_row1;\n  const uword aux_col1;\n  const uword aux_slice1;\n  \n  const uword n_rows;\n  const uword n_cols;\n  const uword n_slices;\n  const uword n_elem;\n  \n  \n  protected:\n  \n  arma_inline subview_field(const field<oT>& in_f, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols);\n  arma_inline subview_field(const field<oT>& in_f, const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_n_rows, const uword in_n_cols, const uword in_n_slices);\n  \n  \n  public:\n  \n  inline ~subview_field();\n  \n  inline void operator= (const field<oT>& x);\n  inline void operator= (const subview_field& x);\n  \n  arma_inline       oT& operator[](const uword i);\n  arma_inline const oT& operator[](const uword i) const;\n  \n  arma_inline       oT& operator()(const uword i);\n  arma_inline const oT& operator()(const uword i) const;\n  \n  arma_inline       oT&         at(const uword row, const uword col);\n  arma_inline const oT&         at(const uword row, const uword col) const;\n\n  arma_inline       oT&         at(const uword row, const uword col, const uword slice);\n  arma_inline const oT&         at(const uword row, const uword col, const uword slice) const;\n  \n  arma_inline       oT& operator()(const uword row, const uword col);\n  arma_inline const oT& operator()(const uword row, const uword col) const;\n  \n  arma_inline       oT& operator()(const uword row, const uword col, const uword slice);\n  arma_inline const oT& operator()(const uword row, const uword col, const uword slice) const;\n  \n  inline bool check_overlap(const subview_field& x) const;\n  \n  inline void print(const std::string extra_text = \"\") const;\n  inline void print(std::ostream& user_stream, const std::string extra_text = \"\") const;\n  \n  \n  inline static void extract(field<oT>& out, const subview_field& in);\n  \n  \n  private:\n  \n  friend class field<oT>;\n  \n  \n  subview_field();\n  //subview_field(const subview_field&);\n  };\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/subview_field_meat.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup subview_field\n//! @{\n\n\ntemplate<typename oT>\ninline\nsubview_field<oT>::~subview_field()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename oT>\narma_inline\nsubview_field<oT>::subview_field\n  (\n  const field<oT>& in_f,\n  const uword      in_row1,\n  const uword      in_col1,\n  const uword      in_n_rows,\n  const uword      in_n_cols\n  )\n  : f(in_f)\n  , aux_row1(in_row1)\n  , aux_col1(in_col1)\n  , aux_slice1(0)\n  , n_rows(in_n_rows)\n  , n_cols(in_n_cols)\n  , n_slices(1)\n  , n_elem(in_n_rows*in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename oT>\narma_inline\nsubview_field<oT>::subview_field\n  (\n  const field<oT>& in_f,\n  const uword      in_row1,\n  const uword      in_col1,\n  const uword      in_slice1,\n  const uword      in_n_rows,\n  const uword      in_n_cols,\n  const uword      in_n_slices\n  )\n  : f(in_f)\n  , aux_row1(in_row1)\n  , aux_col1(in_col1)\n  , aux_slice1(in_slice1)\n  , n_rows(in_n_rows)\n  , n_cols(in_n_cols)\n  , n_slices(in_n_slices)\n  , n_elem(in_n_rows*in_n_cols*in_n_slices)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename oT>\ninline\nvoid\nsubview_field<oT>::operator= (const field<oT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview_field<oT>& t = *this;\n  \n  arma_debug_check( (t.n_rows != x.n_rows) || (t.n_cols != x.n_cols) || (t.n_slices != x.n_slices), \"incompatible field dimensions\");\n  \n  if(t.n_slices == 1)\n    {\n    for(uword col=0; col < t.n_cols; ++col)\n    for(uword row=0; row < t.n_rows; ++row)\n      {\n      t.at(row,col) = x.at(row,col);\n      }\n    }\n  else\n    {\n    for(uword slice=0; slice < t.n_slices; ++slice)\n    for(uword col=0;   col   < t.n_cols;   ++col  )\n    for(uword row=0;   row   < t.n_rows;   ++row  )\n      {\n      t.at(row,col,slice) = x.at(row,col,slice);\n      }\n    }\n  }\n\n\n\n//! x.subfield(...) = y.subfield(...)\ntemplate<typename oT>\ninline\nvoid\nsubview_field<oT>::operator= (const subview_field<oT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(check_overlap(x))\n    {\n    const field<oT> tmp(x);\n    \n    (*this).operator=(tmp);\n    \n    return;\n    }\n  \n  subview_field<oT>& t = *this;\n  \n  arma_debug_check( (t.n_rows != x.n_rows) || (t.n_cols != x.n_cols) || (t.n_slices != x.n_slices), \"incompatible field dimensions\");\n  \n  if(t.n_slices == 1)\n    {\n    for(uword col=0; col < t.n_cols; ++col)\n    for(uword row=0; row < t.n_rows; ++row)\n      {\n      t.at(row,col) = x.at(row,col);\n      }\n    }\n  else\n    {\n    for(uword slice=0; slice < t.n_slices; ++slice)\n    for(uword col=0;   col   < t.n_cols;   ++col  )\n    for(uword row=0;   row   < t.n_rows;   ++row  )\n      {\n      t.at(row,col,slice) = x.at(row,col,slice);\n      }\n    }\n  }\n\n\n\ntemplate<typename oT>\narma_inline\noT&\nsubview_field<oT>::operator[](const uword i)\n  {\n  uword index;\n  \n  if(n_slices == 1)\n    {\n    const uword in_col = i / n_rows;\n    const uword in_row = i % n_rows;\n      \n    index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;\n    }\n  else\n    {\n    const uword n_elem_slice = n_rows*n_cols;\n    \n    const uword in_slice = i / n_elem_slice;\n    const uword offset   = in_slice * n_elem_slice;\n    const uword j        = i - offset;\n    \n    const uword in_col   = j / n_rows;\n    const uword in_row   = j % n_rows;\n    \n    index = (in_slice + aux_slice1)*(f.n_rows*f.n_cols) + (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;\n    }\n  \n  return *((const_cast< field<oT>& >(f)).mem[index]);\n  }\n\n\n\ntemplate<typename oT>\narma_inline\nconst oT&\nsubview_field<oT>::operator[](const uword i) const\n  {\n  uword index;\n  \n  if(n_slices == 1)\n    {\n    const uword in_col = i / n_rows;\n    const uword in_row = i % n_rows;\n      \n    index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;\n    }\n  else\n    {\n    const uword n_elem_slice = n_rows*n_cols;\n    \n    const uword in_slice = i / n_elem_slice;\n    const uword offset   = in_slice * n_elem_slice;\n    const uword j        = i - offset;\n    \n    const uword in_col   = j / n_rows;\n    const uword in_row   = j % n_rows;\n    \n    index = (in_slice + aux_slice1)*(f.n_rows*f.n_cols) + (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;\n    }\n  \n  return *(f.mem[index]);\n  }\n\n\n\ntemplate<typename oT>\narma_inline\noT&\nsubview_field<oT>::operator()(const uword i)\n  {\n  arma_debug_check( (i >= n_elem), \"subview_field::operator(): index out of bounds\");\n  \n  return operator[](i);\n  }\n\n\n\ntemplate<typename oT>\narma_inline\nconst oT&\nsubview_field<oT>::operator()(const uword i) const\n  {\n  arma_debug_check( (i >= n_elem), \"subview_field::operator(): index out of bounds\");\n  \n  return operator[](i);\n  }\n\n\n\ntemplate<typename oT>\narma_inline\noT&\nsubview_field<oT>::operator()(const uword in_row, const uword in_col)\n  {\n  arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), \"subview_field::operator(): index out of bounds\");\n  \n  const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;\n  \n  return *((const_cast< field<oT>& >(f)).mem[index]);\n  }\n\n\n\ntemplate<typename oT>\narma_inline\nconst oT&\nsubview_field<oT>::operator()(const uword in_row, const uword in_col) const\n  {\n  arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), \"subview_field::operator(): index out of bounds\");\n  \n  const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;\n  \n  return *(f.mem[index]);\n  }\n\n\n\ntemplate<typename oT>\narma_inline\noT&\nsubview_field<oT>::operator()(const uword in_row, const uword in_col, const uword in_slice)\n  {\n  arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices)), \"subview_field::operator(): index out of bounds\");\n  \n  const uword index = (in_slice + aux_slice1)*(f.n_rows*f.n_cols) + (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;\n  \n  return *((const_cast< field<oT>& >(f)).mem[index]);\n  }\n\n\n\ntemplate<typename oT>\narma_inline\nconst oT&\nsubview_field<oT>::operator()(const uword in_row, const uword in_col, const uword in_slice) const\n  {\n  arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices)), \"subview_field::operator(): index out of bounds\");\n  \n  const uword index = (in_slice + aux_slice1)*(f.n_rows*f.n_cols) + (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;\n  \n  return *(f.mem[index]);\n  }\n\n\n\ntemplate<typename oT>\narma_inline\noT&\nsubview_field<oT>::at(const uword in_row, const uword in_col)\n  {\n  const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;\n  \n  return *((const_cast< field<oT>& >(f)).mem[index]);\n  }\n\n\n\ntemplate<typename oT>\narma_inline\nconst oT&\nsubview_field<oT>::at(const uword in_row, const uword in_col) const\n  {\n  const uword index = (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;\n  \n  return *(f.mem[index]);\n  }\n\n\n\ntemplate<typename oT>\narma_inline\noT&\nsubview_field<oT>::at(const uword in_row, const uword in_col, const uword in_slice)\n  {\n  const uword index = (in_slice + aux_slice1)*(f.n_rows*f.n_cols) + (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;\n  \n  return *((const_cast< field<oT>& >(f)).mem[index]);\n  }\n\n\n\ntemplate<typename oT>\narma_inline\nconst oT&\nsubview_field<oT>::at(const uword in_row, const uword in_col, const uword in_slice) const\n  {\n  const uword index = (in_slice + aux_slice1)*(f.n_rows*f.n_cols) + (in_col + aux_col1)*f.n_rows + aux_row1 + in_row;\n  \n  return *(f.mem[index]);\n  }\n\n\n\ntemplate<typename oT>\ninline\nbool\nsubview_field<oT>::check_overlap(const subview_field<oT>& x) const\n  {\n  const subview_field<oT>& t = *this;\n  \n  if(&t.f != &x.f)\n    {\n    return false;\n    }\n  else\n    {\n    if( (t.n_elem == 0) || (x.n_elem == 0) )\n      {\n      return false;\n      }\n    else\n      {\n      const uword t_row_start    = t.aux_row1;\n      const uword t_row_end_p1   = t_row_start + t.n_rows;\n      \n      const uword t_col_start    = t.aux_col1;\n      const uword t_col_end_p1   = t_col_start + t.n_cols;\n      \n      const uword t_slice_start  = t.aux_slice1;\n      const uword t_slice_end_p1 = t_slice_start + t.n_slices;\n      \n      const uword x_row_start    = x.aux_row1;\n      const uword x_row_end_p1   = x_row_start + x.n_rows;\n      \n      const uword x_col_start    = x.aux_col1;\n      const uword x_col_end_p1   = x_col_start + x.n_cols;\n      \n      const uword x_slice_start  = x.aux_slice1;\n      const uword x_slice_end_p1 = x_slice_start + x.n_slices;\n      \n      const bool outside_rows   = ( (x_row_start   >= t_row_end_p1  ) || (t_row_start   >= x_row_end_p1  ) );\n      const bool outside_cols   = ( (x_col_start   >= t_col_end_p1  ) || (t_col_start   >= x_col_end_p1  ) );\n      const bool outside_slices = ( (x_slice_start >= t_slice_end_p1) || (t_slice_start >= x_slice_end_p1) );\n      \n      return ( (outside_rows == false) && (outside_cols == false) && (outside_slices == false) );\n      }\n    }\n  }\n\n\n\ntemplate<typename oT>\ninline\nvoid\nsubview_field<oT>::print(const std::string extra_text) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = ARMA_DEFAULT_OSTREAM.width();\n    \n    ARMA_DEFAULT_OSTREAM << extra_text << '\\n';\n  \n    ARMA_DEFAULT_OSTREAM.width(orig_width);\n    }\n  \n  arma_ostream::print(ARMA_DEFAULT_OSTREAM, *this);\n  }\n\n\n\ntemplate<typename oT>\ninline\nvoid\nsubview_field<oT>::print(std::ostream& user_stream, const std::string extra_text) const\n  {\n  arma_extra_debug_sigprint();\n  \n  if(extra_text.length() != 0)\n    {\n    const std::streamsize orig_width = user_stream.width();\n    \n    user_stream << extra_text << '\\n';\n  \n    user_stream.width(orig_width);\n    }\n  \n  arma_ostream::print(user_stream, *this);\n  }\n\n\n\n//! X = Y.subfield(...)\ntemplate<typename oT>\ninline\nvoid\nsubview_field<oT>::extract(field<oT>& actual_out, const subview_field<oT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  //\n  const bool alias = (&actual_out == &in.f);\n  \n  field<oT>* tmp = (alias) ? new field<oT> : 0;\n  field<oT>& out = (alias) ? (*tmp)        : actual_out;\n  \n  //\n  \n  const uword n_rows   = in.n_rows;\n  const uword n_cols   = in.n_cols;\n  const uword n_slices = in.n_slices;\n  \n  out.set_size(n_rows, n_cols, n_slices);\n  \n  arma_extra_debug_print(arma_boost::format(\"out.n_rows = %d   out.n_cols = %d   out.n_slices = %d    in.m.n_rows = %d  in.m.n_cols = %d  in.m.n_slices = %d\") % out.n_rows % out.n_cols % out.n_slices % in.f.n_rows % in.f.n_cols % in.f.n_slices);\n  \n  if(n_slices == 1)\n    {\n    for(uword col = 0; col < n_cols; ++col)\n    for(uword row = 0; row < n_rows; ++row)\n      {\n      out.at(row,col) = in.at(row,col);\n      }\n    }\n  else\n    {\n    for(uword slice = 0; slice < n_slices; ++slice)\n    for(uword col   = 0; col   < n_cols;   ++col  )\n    for(uword row   = 0; row   < n_rows;   ++row  )\n      {\n      out.at(row,col,slice) = in.at(row,col,slice);\n      }\n    }\n  \n  if(alias)\n    {\n    actual_out = out;\n    delete tmp;\n    }\n  \n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/subview_meat.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// Copyright (C) 2011 James Sanders\n// Copyright (C) 2013 Ryan Curtin\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup subview\n//! @{\n\n\ntemplate<typename eT>\ninline\nsubview<eT>::~subview()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\ntemplate<typename eT>\ninline\nsubview<eT>::subview(const Mat<eT>& in_m, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols)\n  : m(in_m)\n  , aux_row1(in_row1)\n  , aux_col1(in_col1)\n  , n_rows(in_n_rows)\n  , n_cols(in_n_cols)\n  , n_elem(in_n_rows*in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::operator= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(n_elem != 1)\n    {\n    arma_debug_assert_same_size(n_rows, n_cols, 1, 1, \"copy into submatrix\");\n    }\n  \n  Mat<eT>& X = const_cast< Mat<eT>& >(m);\n  \n  X.at(aux_row1, aux_col1) = val;\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::operator+= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_cols = n_cols;\n  const uword local_n_rows = n_rows;\n  \n  if(local_n_rows == 1)\n    {\n    Mat<eT>& X = const_cast< Mat<eT>& >(m);\n    \n    const uword urow          = aux_row1;\n    const uword start_col     = aux_col1;\n    const uword end_col_plus1 = start_col + local_n_cols;\n    \n    uword ii,jj;\n    for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2)\n      {\n      X.at(urow, ii) += val;\n      X.at(urow, jj) += val;\n      }\n    \n    if(ii < end_col_plus1)\n      {\n      X.at(urow, ii) += val;\n      }\n    }\n  else\n    {\n    for(uword ucol=0; ucol < local_n_cols; ++ucol)\n      {\n      arrayops::inplace_plus( colptr(ucol), val, local_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::operator-= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_cols = n_cols;\n  const uword local_n_rows = n_rows;\n  \n  if(local_n_rows == 1)\n    {\n    Mat<eT>& X = const_cast< Mat<eT>& >(m);\n    \n    const uword urow          = aux_row1;\n    const uword start_col     = aux_col1;\n    const uword end_col_plus1 = start_col + local_n_cols;\n    \n    uword ii,jj;\n    for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2)\n      {\n      X.at(urow, ii) -= val;\n      X.at(urow, jj) -= val;\n      }\n    \n    if(ii < end_col_plus1)\n      {\n      X.at(urow, ii) -= val;\n      }\n    }\n  else\n    {\n    for(uword ucol=0; ucol < local_n_cols; ++ucol)\n      {\n      arrayops::inplace_minus( colptr(ucol), val, local_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::operator*= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_cols = n_cols;\n  const uword local_n_rows = n_rows;\n  \n  if(local_n_rows == 1)\n    {\n    Mat<eT>& X = const_cast< Mat<eT>& >(m);\n    \n    const uword urow          = aux_row1;\n    const uword start_col     = aux_col1;\n    const uword end_col_plus1 = start_col + local_n_cols;\n    \n    uword ii,jj;\n    for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2)\n      {\n      X.at(urow, ii) *= val;\n      X.at(urow, jj) *= val;\n      }\n    \n    if(ii < end_col_plus1)\n      {\n      X.at(urow, ii) *= val;\n      }\n    }\n  else\n    {\n    for(uword ucol=0; ucol < local_n_cols; ++ucol)\n      {\n      arrayops::inplace_mul( colptr(ucol), val, local_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::operator/= (const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_cols = n_cols;\n  const uword local_n_rows = n_rows;\n  \n  if(local_n_rows == 1)\n    {\n    Mat<eT>& X = const_cast< Mat<eT>& >(m);\n    \n    const uword urow          = aux_row1;\n    const uword start_col     = aux_col1;\n    const uword end_col_plus1 = start_col + local_n_cols;\n    \n    uword ii,jj;\n    for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2)\n      {\n      X.at(urow, ii) /= val;\n      X.at(urow, jj) /= val;\n      }\n    \n    if(ii < end_col_plus1)\n      {\n      X.at(urow, ii) /= val;\n      }\n    }\n  else\n    {\n    for(uword ucol=0; ucol < local_n_cols; ++ucol)\n      {\n      arrayops::inplace_div( colptr(ucol), val, local_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview<eT>::operator= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<T1> P(in.get_ref());\n  \n  subview<eT>& s = *this;\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n    \n  arma_debug_assert_same_size(s, P, \"copy into submatrix\");\n  \n  const bool is_alias = P.is_alias(s.m);\n  \n  arma_extra_debug_warn(is_alias, \"aliasing detected\");\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value) || (is_alias) )\n    {\n    const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);\n    const Mat<eT>& x = tmp.M;\n    \n    if(s_n_rows == 1)\n      {\n      const eT* x_mem = x.memptr();\n      \n      Mat<eT>& A = const_cast< Mat<eT>& >(m);\n      \n      const uword urow      = aux_row1;\n      const uword start_col = aux_col1;\n      \n      uword ii,jj;\n      for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)\n        {\n        A.at(urow, start_col+ii) = x_mem[ii];\n        A.at(urow, start_col+jj) = x_mem[jj];\n        }\n      \n      if(ii < s_n_cols)\n        {\n        A.at(urow, start_col+ii) = x_mem[ii];\n        }\n      }\n    else\n      {\n      for(uword ucol=0; ucol < s_n_cols; ++ucol)\n        {\n        arrayops::copy( s.colptr(ucol), x.colptr(ucol), s_n_rows );\n        }\n      }\n    }\n  else\n    {\n    if(s_n_rows == 1)\n      {\n      Mat<eT>& A = const_cast< Mat<eT>& >(m);\n      \n      const uword urow      = aux_row1;\n      const uword start_col = aux_col1;\n      \n      uword ii,jj;\n      for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)\n        {\n        const eT tmp1 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];\n        const eT tmp2 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,jj) : P[jj];\n        \n        A.at(urow, start_col+ii) = tmp1;\n        A.at(urow, start_col+jj) = tmp2;\n        }\n      \n      if(ii < s_n_cols)\n        {\n        A.at(urow, start_col+ii) = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];\n        }\n      }\n    else\n      {\n      for(uword ucol=0; ucol < s_n_cols; ++ucol)\n        {\n        eT* s_col_data = s.colptr(ucol);\n        \n        uword ii,jj;\n        for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2)\n          {\n          const eT tmp1 = P.at(ii,ucol);\n          const eT tmp2 = P.at(jj,ucol);\n          \n          s_col_data[ii] = tmp1;\n          s_col_data[jj] = tmp2;\n          }\n        \n        if(ii < s_n_rows)\n          {\n          s_col_data[ii] = P.at(ii,ucol);\n          }\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview<eT>::operator+= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<T1> P(in.get_ref());\n  \n  subview<eT>& s = *this;\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  \n  arma_debug_assert_same_size(s, P, \"addition\");\n  \n  const bool is_alias = P.is_alias(s.m);\n  \n  arma_extra_debug_warn(is_alias, \"aliasing detected\");\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value) || (is_alias) )\n    {\n    const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);\n    const Mat<eT>& x = tmp.M;\n    \n    if(s_n_rows == 1)\n      {\n      const eT* x_mem = x.memptr();\n      \n      Mat<eT>& A = const_cast< Mat<eT>& >(m);\n      \n      const uword urow      = aux_row1;\n      const uword start_col = aux_col1;\n      \n      uword ii,jj;\n      for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)\n        {\n        A.at(urow, start_col+ii) += x_mem[ii];\n        A.at(urow, start_col+jj) += x_mem[jj];\n        }\n      \n      if(ii < s_n_cols)\n        {\n        A.at(urow, start_col+ii) += x_mem[ii];\n        }\n      }\n    else\n      {\n      for(uword ucol=0; ucol < s_n_cols; ++ucol)\n        {\n        arrayops::inplace_plus( s.colptr(ucol), x.colptr(ucol), s_n_rows );\n        }\n      }\n    }\n  else\n    {\n    if(s_n_rows == 1)\n      {\n      Mat<eT>& A = const_cast< Mat<eT>& >(m);\n      \n      const uword urow      = aux_row1;\n      const uword start_col = aux_col1;\n      \n      uword ii,jj;\n      for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)\n        {\n        const eT tmp1 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];\n        const eT tmp2 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,jj) : P[jj];\n        \n        A.at(urow, start_col+ii) += tmp1;\n        A.at(urow, start_col+jj) += tmp2;\n        }\n      \n      if(ii < s_n_cols)\n        {\n        A.at(urow, start_col+ii) += (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];\n        }\n      }\n    else\n      {\n      for(uword ucol=0; ucol < s_n_cols; ++ucol)\n        {\n        eT* s_col_data = s.colptr(ucol);\n        \n        uword ii,jj;\n        for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2)\n          {\n          const eT val1 = P.at(ii,ucol);\n          const eT val2 = P.at(jj,ucol);\n          \n          s_col_data[ii] += val1;\n          s_col_data[jj] += val2;\n          }\n        \n        if(ii < s_n_rows)\n          {\n          s_col_data[ii] += P.at(ii,ucol);\n          }\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview<eT>::operator-= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<T1> P(in.get_ref());\n  \n  subview<eT>& s = *this;\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  \n  arma_debug_assert_same_size(s, P, \"subtraction\");\n  \n  const bool is_alias = P.is_alias(s.m);\n  \n  arma_extra_debug_warn(is_alias, \"aliasing detected\");\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value) || (is_alias) )\n    {\n    const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);\n    const Mat<eT>& x = tmp.M;\n    \n    if(s_n_rows == 1)\n      {\n      const eT* x_mem = x.memptr();\n      \n      Mat<eT>& A = const_cast< Mat<eT>& >(m);\n      \n      const uword urow      = aux_row1;\n      const uword start_col = aux_col1;\n      \n      uword ii,jj;\n      for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)\n        {\n        A.at(urow, start_col+ii) -= x_mem[ii];\n        A.at(urow, start_col+jj) -= x_mem[jj];\n        }\n      \n      if(ii < s_n_cols)\n        {\n        A.at(urow, start_col+ii) -= x_mem[ii];\n        }\n      }\n    else\n      {\n      for(uword ucol=0; ucol < s_n_cols; ++ucol)\n        {\n        arrayops::inplace_minus( s.colptr(ucol), x.colptr(ucol), s_n_rows );\n        }\n      }\n    }\n  else\n    {\n    if(s_n_rows == 1)\n      {\n      Mat<eT>& A = const_cast< Mat<eT>& >(m);\n      \n      const uword urow      = aux_row1;\n      const uword start_col = aux_col1;\n      \n      uword ii,jj;\n      for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)\n        {\n        const eT tmp1 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];\n        const eT tmp2 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,jj) : P[jj];\n        \n        A.at(urow, start_col+ii) -= tmp1;\n        A.at(urow, start_col+jj) -= tmp2;\n        }\n      \n      if(ii < s_n_cols)\n        {\n        A.at(urow, start_col+ii) -= (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];\n        }\n      }\n    else\n      {\n      for(uword ucol=0; ucol < s_n_cols; ++ucol)\n        {\n        eT* s_col_data = s.colptr(ucol);\n        \n        uword ii,jj;\n        for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2)\n          {\n          const eT val1 = P.at(ii,ucol);\n          const eT val2 = P.at(jj,ucol);\n          \n          s_col_data[ii] -= val1;\n          s_col_data[jj] -= val2;\n          }\n        \n        if(ii < s_n_rows)\n          {\n          s_col_data[ii] -= P.at(ii,ucol);\n          }\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview<eT>::operator%= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<T1> P(in.get_ref());\n  \n  subview<eT>& s = *this;\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  \n  arma_debug_assert_same_size(s, P, \"element-wise multiplication\");\n  \n  const bool is_alias = P.is_alias(s.m);\n  \n  arma_extra_debug_warn(is_alias, \"aliasing detected\");\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value) || (is_alias) )\n    {\n    const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);\n    const Mat<eT>& x = tmp.M;\n    \n    if(s_n_rows == 1)\n      {\n      const eT* x_mem = x.memptr();\n      \n      Mat<eT>& A = const_cast< Mat<eT>& >(m);\n      \n      const uword urow      = aux_row1;\n      const uword start_col = aux_col1;\n      \n      uword ii,jj;\n      for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)\n        {\n        A.at(urow, start_col+ii) *= x_mem[ii];\n        A.at(urow, start_col+jj) *= x_mem[jj];\n        }\n      \n      if(ii < s_n_cols)\n        {\n        A.at(urow, start_col+ii) *= x_mem[ii];\n        }\n      }\n    else\n      {\n      for(uword ucol=0; ucol < s_n_cols; ++ucol)\n        {\n        arrayops::inplace_mul( s.colptr(ucol), x.colptr(ucol), s_n_rows );\n        }\n      }\n    }\n  else\n    {\n    if(s_n_rows == 1)\n      {\n      Mat<eT>& A = const_cast< Mat<eT>& >(m);\n      \n      const uword urow      = aux_row1;\n      const uword start_col = aux_col1;\n      \n      uword ii,jj;\n      for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)\n        {\n        const eT tmp1 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];\n        const eT tmp2 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,jj) : P[jj];\n        \n        A.at(urow, start_col+ii) *= tmp1;\n        A.at(urow, start_col+jj) *= tmp2;\n        }\n      \n      if(ii < s_n_cols)\n        {\n        A.at(urow, start_col+ii) *= (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];\n        }\n      }\n    else\n      {\n      for(uword ucol=0; ucol < s_n_cols; ++ucol)\n        {\n        eT* s_col_data = s.colptr(ucol);\n        \n        uword ii,jj;\n        for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2)\n          {\n          const eT val1 = P.at(ii,ucol);\n          const eT val2 = P.at(jj,ucol);\n          \n          s_col_data[ii] *= val1;\n          s_col_data[jj] *= val2;\n          }\n        \n        if(ii < s_n_rows)\n          {\n          s_col_data[ii] *= P.at(ii,ucol);\n          }\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview<eT>::operator/= (const Base<eT,T1>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  const Proxy<T1> P(in.get_ref());\n  \n  subview<eT>& s = *this;\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  \n  arma_debug_assert_same_size(s, P, \"element-wise division\");\n  \n  const bool is_alias = P.is_alias(s.m);\n  \n  arma_extra_debug_warn(is_alias, \"aliasing detected\");\n  \n  if( (is_Mat<typename Proxy<T1>::stored_type>::value) || (is_alias) )\n    {\n    const unwrap_check<typename Proxy<T1>::stored_type> tmp(P.Q, is_alias);\n    const Mat<eT>& x = tmp.M;\n    \n    if(s_n_rows == 1)\n      {\n      const eT* x_mem = x.memptr();\n      \n      Mat<eT>& A = const_cast< Mat<eT>& >(m);\n      \n      const uword urow      = aux_row1;\n      const uword start_col = aux_col1;\n      \n      uword ii,jj;\n      for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)\n        {\n        A.at(urow, start_col+ii) /= x_mem[ii];\n        A.at(urow, start_col+jj) /= x_mem[jj];\n        }\n      \n      if(ii < s_n_cols)\n        {\n        A.at(urow, start_col+ii) /= x_mem[ii];\n        }\n      }\n    else\n      {\n      for(uword ucol=0; ucol < s_n_cols; ++ucol)\n        {\n        arrayops::inplace_div( s.colptr(ucol), x.colptr(ucol), s_n_rows );\n        }\n      }\n    }\n  else\n    {\n    if(s_n_rows == 1)\n      {\n      Mat<eT>& A = const_cast< Mat<eT>& >(m);\n      \n      const uword urow      = aux_row1;\n      const uword start_col = aux_col1;\n      \n      uword ii,jj;\n      for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)\n        {\n        const eT tmp1 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];\n        const eT tmp2 = (Proxy<T1>::prefer_at_accessor) ? P.at(0,jj) : P[jj];\n        \n        A.at(urow, start_col+ii) /= tmp1;\n        A.at(urow, start_col+jj) /= tmp2;\n        }\n      \n      if(ii < s_n_cols)\n        {\n        A.at(urow, start_col+ii) /= (Proxy<T1>::prefer_at_accessor) ? P.at(0,ii) : P[ii];\n        }\n      }\n    else\n      {\n      for(uword ucol=0; ucol < s_n_cols; ++ucol)\n        {\n        eT* s_col_data = s.colptr(ucol);\n        \n        uword ii,jj;\n        for(ii=0, jj=1; jj < s_n_rows; ii+=2, jj+=2)\n          {\n          const eT val1 = P.at(ii,ucol);\n          const eT val2 = P.at(jj,ucol);\n          \n          s_col_data[ii] /= val1;\n          s_col_data[jj] /= val2;\n          }\n        \n        if(ii < s_n_rows)\n          {\n          s_col_data[ii] /= P.at(ii,ucol);\n          }\n        }\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview<eT>::operator=(const SpBase<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> p(x.get_ref());\n  \n  arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), \"copy into submatrix\");\n  \n  // Clear the subview.\n  zeros();\n  \n  // Iterate through the sparse subview and set the nonzero values appropriately.\n  typename SpProxy<T1>::const_iterator_type cit = p.begin();\n  \n  while (cit != p.end())\n    {\n    at(cit.row(), cit.col()) = *cit;\n    ++cit;\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview<eT>::operator+=(const SpBase<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> p(x.get_ref());\n  \n  arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), \"addition\");\n  \n  // Iterate through the sparse subview and add its values.\n  typename SpProxy<T1>::const_iterator_type cit = p.begin();\n  \n  while (cit != p.end())\n    {\n    at(cit.row(), cit.col()) += *cit;\n    ++cit;\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview<eT>::operator-=(const SpBase<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> p(x.get_ref());\n  \n  arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), \"subtraction\");\n  \n  // Iterate through the sparse subview and subtract its values.\n  typename SpProxy<T1>::const_iterator_type cit = p.begin();\n  \n  while (cit != p.end())\n    {\n    at(cit.row(), cit.col()) -= *cit;\n    ++cit;\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview<eT>::operator%=(const SpBase<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  // Temporary sparse matrix to hold the values we need.\n  SpMat<eT> tmp = x.get_ref();\n  \n  arma_debug_assert_same_size(n_rows, n_cols, tmp.n_rows, tmp.n_cols, \"element-wise multiplication\");\n  \n  // Iterate over nonzero values.\n  // Any zero values in the sparse expression will result in a zero in our subview.\n  typename SpMat<eT>::const_iterator cit = tmp.begin();\n  \n  while (cit != tmp.end())\n    {\n    // Set elements before this one to zero.\n    tmp.at(cit.row(), cit.col()) *= at(cit.row(), cit.col());\n    ++cit;\n    }\n  \n  // Now set the subview equal to that.\n  *this = tmp;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview<eT>::operator/=(const SpBase<eT, T1>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  const SpProxy<T1> p(x.get_ref());\n  \n  arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), \"element-wise division\");\n  \n  // This is probably going to fill your subview with a bunch of NaNs,\n  // so I'm not going to bother to implement it fast.\n  // You can have slow NaNs.  They're fine too.\n  for (uword c = 0; c < n_cols; ++c)\n  for (uword r = 0; r < n_rows; ++r)\n    {\n    at(r, c) /= p.at(r, c);\n    }\n  }\n\n\n\n//! x.submat(...) = y.submat(...)\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::operator= (const subview<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(check_overlap(x))\n    {\n    const Mat<eT> tmp(x);\n    \n    (*this).operator=(tmp);\n    \n    return;\n    }\n  \n  subview<eT>& s = *this;\n  \n  arma_debug_assert_same_size(s, x, \"copy into submatrix\");\n  \n  const uword s_n_cols = s.n_cols;\n  const uword s_n_rows = s.n_rows;\n  \n  if(s_n_rows == 1)\n    {\n          Mat<eT>& A = const_cast< Mat<eT>& >(s.m);\n    const Mat<eT>& B = x.m;\n    \n    const uword row_A = s.aux_row1;\n    const uword row_B = x.aux_row1;\n    \n    const uword start_col_A = s.aux_col1;\n    const uword start_col_B = x.aux_col1;\n    \n    uword ii,jj;\n    for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)\n      {\n      const eT tmp1 = B.at(row_B, start_col_B + ii);\n      const eT tmp2 = B.at(row_B, start_col_B + jj);\n      \n      A.at(row_A, start_col_A + ii) = tmp1;\n      A.at(row_A, start_col_A + jj) = tmp2;\n      }\n    \n    if(ii < s_n_cols)\n      {\n      A.at(row_A, start_col_A + ii) = B.at(row_B, start_col_B + ii);\n      }\n    }\n  else\n    {\n    for(uword ucol=0; ucol < s_n_cols; ++ucol)\n      {\n      arrayops::copy( s.colptr(ucol), x.colptr(ucol), s_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::operator+= (const subview<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(check_overlap(x))\n    {\n    const Mat<eT> tmp(x);\n    \n    (*this).operator+=(tmp);\n    \n    return;\n    }\n  \n  subview<eT>& s = *this;\n  \n  arma_debug_assert_same_size(s, x, \"addition\");\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  \n  if(s_n_rows == 1)\n    {\n          Mat<eT>& A = const_cast< Mat<eT>& >(s.m);\n    const Mat<eT>& B = x.m;\n    \n    const uword row_A = s.aux_row1;\n    const uword row_B = x.aux_row1;\n    \n    const uword start_col_A = s.aux_col1;\n    const uword start_col_B = x.aux_col1;\n    \n    uword ii,jj;\n    \n    for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)\n      {\n      const eT tmp1 = B.at(row_B, start_col_B + ii);\n      const eT tmp2 = B.at(row_B, start_col_B + jj);\n      \n      A.at(row_A, start_col_A + ii) += tmp1;\n      A.at(row_A, start_col_A + jj) += tmp2;\n      }\n    \n    if(ii < s_n_cols)\n      {\n      A.at(row_A, start_col_A + ii) += B.at(row_B, start_col_B + ii);\n      }\n    }\n  else\n    {\n    for(uword ucol=0; ucol < s_n_cols; ++ucol)\n      {\n      arrayops::inplace_plus( s.colptr(ucol), x.colptr(ucol), s_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::operator-= (const subview<eT>& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(check_overlap(x))\n    {\n    const Mat<eT> tmp(x);\n    \n    (*this).operator-=(tmp);\n    \n    return;\n    }\n  \n  subview<eT>& s = *this;\n  \n  arma_debug_assert_same_size(s, x, \"subtraction\");\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  \n  if(s_n_rows == 1)\n    {\n          Mat<eT>& A = const_cast< Mat<eT>& >(s.m);\n    const Mat<eT>& B = x.m;\n    \n    const uword row_A = s.aux_row1;\n    const uword row_B = x.aux_row1;\n    \n    const uword start_col_A = s.aux_col1;\n    const uword start_col_B = x.aux_col1;\n    \n    uword ii,jj;\n    for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)\n      {\n      const eT tmp1 = B.at(row_B, start_col_B + ii);\n      const eT tmp2 = B.at(row_B, start_col_B + jj);\n      \n      A.at(row_A, start_col_A + ii) -= tmp1;\n      A.at(row_A, start_col_A + jj) -= tmp2;\n      }\n    \n    if(ii < s_n_cols)\n      {\n      A.at(row_A, start_col_A + ii) -= B.at(row_B, start_col_B + ii);\n      }\n    }\n  else\n    {\n    for(uword ucol=0; ucol < s_n_cols; ++ucol)\n      {\n      arrayops::inplace_minus( s.colptr(ucol), x.colptr(ucol), s_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::operator%= (const subview& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(check_overlap(x))\n    {\n    const Mat<eT> tmp(x);\n    \n    (*this).operator%=(tmp);\n    \n    return;\n    }\n  \n  subview<eT>& s = *this;\n  \n  arma_debug_assert_same_size(s, x, \"element-wise multiplication\");\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  \n  if(s_n_rows == 1)\n    {\n          Mat<eT>& A = const_cast< Mat<eT>& >(s.m);\n    const Mat<eT>& B = x.m;\n    \n    const uword row_A = s.aux_row1;\n    const uword row_B = x.aux_row1;\n    \n    const uword start_col_A = s.aux_col1;\n    const uword start_col_B = x.aux_col1;\n    \n    uword ii,jj;\n    for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)\n      {\n      const eT tmp1 = B.at(row_B, start_col_B + ii);\n      const eT tmp2 = B.at(row_B, start_col_B + jj);\n      \n      A.at(row_A, start_col_A + ii) *= tmp1;\n      A.at(row_A, start_col_A + jj) *= tmp2;\n      }\n    \n    if(ii < s_n_cols)\n      {\n      A.at(row_A, start_col_A + ii) *= B.at(row_B, start_col_B + ii);\n      }\n    }\n  else\n    {\n    for(uword ucol=0; ucol < s_n_cols; ++ucol)\n      {\n      arrayops::inplace_mul( s.colptr(ucol), x.colptr(ucol), s_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::operator/= (const subview& x)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(check_overlap(x))\n    {\n    const Mat<eT> tmp(x);\n    \n    (*this).operator/=(tmp);\n    \n    return;\n    }\n  \n  subview<eT>& s = *this;\n  \n  arma_debug_assert_same_size(s, x, \"element-wise division\");\n  \n  const uword s_n_rows = s.n_rows;\n  const uword s_n_cols = s.n_cols;\n  \n  if(s_n_rows == 1)\n    {\n          Mat<eT>& A = const_cast< Mat<eT>& >(s.m);\n    const Mat<eT>& B = x.m;\n    \n    const uword row_A = s.aux_row1;\n    const uword row_B = x.aux_row1;\n    \n    const uword start_col_A = s.aux_col1;\n    const uword start_col_B = x.aux_col1;\n    \n    uword ii,jj;\n    for(ii=0, jj=1; jj < s_n_cols; ii+=2, jj+=2)\n      {\n      const eT tmp1 = B.at(row_B, start_col_B + ii);\n      const eT tmp2 = B.at(row_B, start_col_B + jj);\n      \n      A.at(row_A, start_col_A + ii) /= tmp1;\n      A.at(row_A, start_col_A + jj) /= tmp2;\n      }\n    \n    if(ii < s_n_cols)\n      {\n      A.at(row_A, start_col_A + ii) /= B.at(row_B, start_col_B + ii);\n      }\n    }\n  else\n    {\n    for(uword ucol=0; ucol < s_n_cols; ++ucol)\n      {\n      arrayops::inplace_div( s.colptr(ucol), x.colptr(ucol), s_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename gen_type>\ninline\ntypename enable_if2< is_same_type<typename T1::elem_type, eT>::value, void>::result\nsubview<eT>::operator= (const Gen<T1,gen_type>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(n_rows, n_cols, in.n_rows, in.n_cols, \"copy into submatrix\");\n  \n  in.apply(*this);\n  }\n\n\n\n//! transform each element in the subview using a functor\ntemplate<typename eT>\ntemplate<typename functor>\ninline\nvoid\nsubview<eT>::transform(functor F)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_cols = n_cols;\n  const uword local_n_rows = n_rows;\n  \n  Mat<eT>& X = const_cast< Mat<eT>& >(m);\n  \n  if(local_n_rows == 1)\n    {\n    const uword urow          = aux_row1;\n    const uword start_col     = aux_col1;\n    const uword end_col_plus1 = start_col + local_n_cols;\n    \n    for(uword ucol = start_col; ucol < end_col_plus1; ++ucol)\n      {\n      X.at(urow, ucol) = eT( F( X.at(urow, ucol) ) );\n      }\n    }\n  else\n    {\n    const uword start_col = aux_col1;\n    const uword start_row = aux_row1;\n    \n    const uword end_col_plus1 = start_col + local_n_cols;\n    const uword end_row_plus1 = start_row + local_n_rows;\n    \n    for(uword ucol = start_col; ucol < end_col_plus1; ++ucol)\n    for(uword urow = start_row; urow < end_row_plus1; ++urow)\n      {\n      X.at(urow, ucol) = eT( F( X.at(urow, ucol) ) );\n      }\n    }\n  }\n\n\n\n//! imbue (fill) the subview with values provided by a functor\ntemplate<typename eT>\ntemplate<typename functor>\ninline\nvoid\nsubview<eT>::imbue(functor F)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_cols = n_cols;\n  const uword local_n_rows = n_rows;\n  \n  Mat<eT>& X = const_cast< Mat<eT>& >(m);\n  \n  if(local_n_rows == 1)\n    {\n    const uword urow          = aux_row1;\n    const uword start_col     = aux_col1;\n    const uword end_col_plus1 = start_col + local_n_cols;\n    \n    for(uword ucol = start_col; ucol < end_col_plus1; ++ucol)\n      {\n      X.at(urow, ucol) = eT( F() );\n      }\n    }\n  else\n    {\n    const uword start_col = aux_col1;\n    const uword start_row = aux_row1;\n    \n    const uword end_col_plus1 = start_col + local_n_cols;\n    const uword end_row_plus1 = start_row + local_n_rows;\n    \n    for(uword ucol = start_col; ucol < end_col_plus1; ++ucol)\n    for(uword urow = start_row; urow < end_row_plus1; ++urow)\n      {\n      X.at(urow, ucol) = eT( F() );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::fill(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_cols = n_cols;\n  const uword local_n_rows = n_rows;\n  \n  if(local_n_rows == 1)\n    {\n    Mat<eT>& X = const_cast< Mat<eT>& >(m);\n    \n    const uword urow          = aux_row1;\n    const uword start_col     = aux_col1;\n    const uword end_col_plus1 = start_col + local_n_cols;\n    \n    uword ii,jj;\n    for(ii=start_col, jj=start_col+1; jj < end_col_plus1; ii+=2, jj+=2)\n      {\n      X.at(urow, ii) = val;\n      X.at(urow, jj) = val;\n      }\n    \n    if(ii < end_col_plus1)\n      {\n      X.at(urow, ii) = val;\n      }\n    }\n  else\n    {\n    for(uword ucol=0; ucol < local_n_cols; ++ucol)\n      {\n      arrayops::inplace_set( colptr(ucol), val, local_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::zeros()\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_cols = n_cols;\n  const uword local_n_rows = n_rows;\n  \n  if(local_n_rows == 1)\n    {\n    (*this).fill(eT(0));\n    }\n  else\n    {\n    for(uword ucol=0; ucol < local_n_cols; ++ucol)\n      {\n      arrayops::fill_zeros( colptr(ucol), local_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::ones()\n  {\n  arma_extra_debug_sigprint();\n  \n  (*this).fill(eT(1));\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::eye()\n  {\n  arma_extra_debug_sigprint();\n  \n  (*this).zeros();\n  \n  const uword N = (std::min)(n_rows, n_cols);\n  \n  for(uword ii=0; ii < N; ++ii)\n    {\n    at(ii,ii) = eT(1);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::randu()\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows = n_rows;\n  const uword local_n_cols = n_cols;\n  \n  if(local_n_rows == 1)\n    {\n    for(uword ii=0; ii < local_n_cols; ++ii)\n      {\n      at(0,ii) = eT(arma_rng::randu<eT>());\n      }\n    }\n  else\n    {\n    for(uword ii=0; ii < local_n_cols; ++ii)\n      {\n      arma_rng::randu<eT>::fill( colptr(ii), local_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::randn()\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows = n_rows;\n  const uword local_n_cols = n_cols;\n  \n  if(local_n_rows == 1)\n    {\n    for(uword ii=0; ii < local_n_cols; ++ii)\n      {\n      at(0,ii) = eT(arma_rng::randn<eT>());\n      }\n    }\n  else\n    {\n    for(uword ii=0; ii < local_n_cols; ++ii)\n      {\n      arma_rng::randn<eT>::fill( colptr(ii), local_n_rows );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview<eT>::at_alt(const uword ii) const\n  {\n  return operator[](ii);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT&\nsubview<eT>::operator[](const uword ii)\n  {\n  const uword in_col = ii / n_rows;\n  const uword in_row = ii % n_rows;\n  \n  const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;\n  \n  return access::rw( (const_cast< Mat<eT>& >(m)).mem[index] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview<eT>::operator[](const uword ii) const\n  {\n  const uword in_col = ii / n_rows;\n  const uword in_row = ii % n_rows;\n  \n  const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;\n  \n  return m.mem[index];\n  }\n\n\n\ntemplate<typename eT>\ninline\neT&\nsubview<eT>::operator()(const uword ii)\n  {\n  arma_debug_check( (ii >= n_elem), \"subview::operator(): index out of bounds\");\n    \n  const uword in_col = ii / n_rows;\n  const uword in_row = ii % n_rows;\n  \n  const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;\n  \n  return access::rw( (const_cast< Mat<eT>& >(m)).mem[index] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview<eT>::operator()(const uword ii) const\n  {\n  arma_debug_check( (ii >= n_elem), \"subview::operator(): index out of bounds\");\n  \n  const uword in_col = ii / n_rows;\n  const uword in_row = ii % n_rows;\n  \n  const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;\n  \n  return m.mem[index];\n  }\n\n\n\ntemplate<typename eT>\ninline\neT&\nsubview<eT>::operator()(const uword in_row, const uword in_col)\n  {\n  arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), \"subview::operator(): index out of bounds\");\n  \n  const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;\n  \n  return access::rw( (const_cast< Mat<eT>& >(m)).mem[index] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview<eT>::operator()(const uword in_row, const uword in_col) const\n  {\n  arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), \"subview::operator(): index out of bounds\");\n  \n  const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;\n  \n  return m.mem[index];\n  }\n\n\n\ntemplate<typename eT>\ninline\neT&\nsubview<eT>::at(const uword in_row, const uword in_col)\n  {\n  const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;\n  \n  return access::rw( (const_cast< Mat<eT>& >(m)).mem[index] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview<eT>::at(const uword in_row, const uword in_col) const\n  {\n  const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row;\n  \n  return m.mem[index];\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT*\nsubview<eT>::colptr(const uword in_col)\n  {\n  return & access::rw((const_cast< Mat<eT>& >(m)).mem[ (in_col + aux_col1)*m.n_rows + aux_row1 ]);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst eT*\nsubview<eT>::colptr(const uword in_col) const\n  {\n  return & m.mem[ (in_col + aux_col1)*m.n_rows + aux_row1 ];\n  }\n\n\n\ntemplate<typename eT>\ninline\nbool\nsubview<eT>::check_overlap(const subview<eT>& x) const\n  {\n  const subview<eT>& s = *this;\n  \n  if(&s.m != &x.m)\n    {\n    return false;\n    }\n  else\n    {\n    if( (s.n_elem == 0) || (x.n_elem == 0) )\n      {\n      return false;\n      }\n    else\n      {\n      const uword s_row_start  = s.aux_row1;\n      const uword s_row_end_p1 = s_row_start + s.n_rows;\n      \n      const uword s_col_start  = s.aux_col1;\n      const uword s_col_end_p1 = s_col_start + s.n_cols;\n      \n      \n      const uword x_row_start  = x.aux_row1;\n      const uword x_row_end_p1 = x_row_start + x.n_rows;\n      \n      const uword x_col_start  = x.aux_col1;\n      const uword x_col_end_p1 = x_col_start + x.n_cols;\n      \n      \n      const bool outside_rows = ( (x_row_start >= s_row_end_p1) || (s_row_start >= x_row_end_p1) );\n      const bool outside_cols = ( (x_col_start >= s_col_end_p1) || (s_col_start >= x_col_end_p1) );\n      \n      return ( (outside_rows == false) && (outside_cols == false) );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nsubview<eT>::is_vec() const\n  {\n  return ( (n_rows == 1) || (n_cols == 1) );\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nsubview<eT>::is_finite() const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows = n_rows;\n  const uword local_n_cols = n_cols;\n  \n  for(uword ii=0; ii<local_n_cols; ++ii)\n    {\n    if(arrayops::is_finite(colptr(ii), local_n_rows) == false)  { return false; }\n    }\n  \n  return true;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nsubview<eT>::has_inf() const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows = n_rows;\n  const uword local_n_cols = n_cols;\n  \n  for(uword ii=0; ii<local_n_cols; ++ii)\n    {\n    if(arrayops::has_inf(colptr(ii), local_n_rows))  { return true; }\n    }\n  \n  return false;\n  }\n\n\n\ntemplate<typename eT>\ninline\narma_warn_unused\nbool\nsubview<eT>::has_nan() const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword local_n_rows = n_rows;\n  const uword local_n_cols = n_cols;\n  \n  for(uword ii=0; ii<local_n_cols; ++ii)\n    {\n    if(arrayops::has_nan(colptr(ii), local_n_rows))  { return true; }\n    }\n  \n  return false;\n  }\n\n\n\n//! X = Y.submat(...)\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::extract(Mat<eT>& out, const subview<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing;\n  // size setting and alias checking is done by either the Mat contructor or operator=()\n  \n  const uword n_rows = in.n_rows;  // number of rows in the subview\n  const uword n_cols = in.n_cols;  // number of columns in the subview\n  \n  arma_extra_debug_print(arma_boost::format(\"out.n_rows = %d   out.n_cols = %d    in.m.n_rows = %d  in.m.n_cols = %d\") % out.n_rows % out.n_cols % in.m.n_rows % in.m.n_cols );\n  \n  \n  if(in.is_vec() == true)\n    {\n    if(n_cols == 1)   // a column vector\n      {\n      arma_extra_debug_print(\"subview::extract(): copying col (going across rows)\");\n      \n      // in.colptr(0) the first column of the subview, taking into account any row offset\n      arrayops::copy( out.memptr(), in.colptr(0), n_rows );\n      }\n    else   // a row vector (possibly empty)\n      {\n      arma_extra_debug_print(\"subview::extract(): copying row (going across columns)\");\n      \n      const Mat<eT>& X = in.m;\n      \n      eT* out_mem = out.memptr();\n      \n      const uword row       = in.aux_row1;\n      const uword start_col = in.aux_col1;\n      \n      uword i,j;\n      \n      for(i=0, j=1; j < n_cols; i+=2, j+=2)\n        {\n        const eT tmp1 = X.at(row, start_col+i);\n        const eT tmp2 = X.at(row, start_col+j);\n        \n        out_mem[i] = tmp1;\n        out_mem[j] = tmp2;\n        }\n      \n      if(i < n_cols)\n        {\n        out_mem[i] = X.at(row, start_col+i);\n        }\n      }\n    }\n  else   // general submatrix\n    {\n    arma_extra_debug_print(\"subview::extract(): general submatrix\");\n    \n    for(uword col=0; col < n_cols; ++col)\n      {\n      arrayops::copy( out.colptr(col), in.colptr(col), n_rows );\n      }\n    }\n  }\n\n\n\n//! X += Y.submat(...)\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::plus_inplace(Mat<eT>& out, const subview<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out, in, \"addition\");\n  \n  const uword n_rows = in.n_rows;\n  const uword n_cols = in.n_cols;\n  \n  if(n_rows == 1)\n    {\n    eT* out_mem = out.memptr();\n    \n    const Mat<eT>& X = in.m;\n    \n    const uword row       = in.aux_row1;\n    const uword start_col = in.aux_col1;\n    \n    uword i,j;\n    for(i=0, j=1; j < n_cols; i+=2, j+=2)\n      {\n      const eT tmp1 = X.at(row, start_col+i);\n      const eT tmp2 = X.at(row, start_col+j);\n        \n      out_mem[i] += tmp1;\n      out_mem[j] += tmp2;\n      }\n    \n    if(i < n_cols)\n      {\n      out_mem[i] += X.at(row, start_col+i);\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n      {\n      arrayops::inplace_plus(out.colptr(col), in.colptr(col), n_rows);\n      }\n    }\n  }\n\n\n\n//! X -= Y.submat(...)\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::minus_inplace(Mat<eT>& out, const subview<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out, in, \"subtraction\");\n  \n  const uword n_rows = in.n_rows;\n  const uword n_cols = in.n_cols;\n  \n  if(n_rows == 1)\n    {\n    eT* out_mem = out.memptr();\n    \n    const Mat<eT>& X = in.m;\n    \n    const uword row       = in.aux_row1;\n    const uword start_col = in.aux_col1;\n    \n    uword i,j;\n    for(i=0, j=1; j < n_cols; i+=2, j+=2)\n      {\n      const eT tmp1 = X.at(row, start_col+i);\n      const eT tmp2 = X.at(row, start_col+j);\n        \n      out_mem[i] -= tmp1;\n      out_mem[j] -= tmp2;\n      }\n    \n    if(i < n_cols)\n      {\n      out_mem[i] -= X.at(row, start_col+i);\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n      {\n      arrayops::inplace_minus(out.colptr(col), in.colptr(col), n_rows);\n      }\n    }\n  }\n\n\n\n//! X %= Y.submat(...)\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::schur_inplace(Mat<eT>& out, const subview<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out, in, \"element-wise multiplication\");\n  \n  const uword n_rows = in.n_rows;\n  const uword n_cols = in.n_cols;\n  \n  if(n_rows == 1)\n    {\n    eT* out_mem = out.memptr();\n    \n    const Mat<eT>& X = in.m;\n    \n    const uword row       = in.aux_row1;\n    const uword start_col = in.aux_col1;\n    \n    uword i,j;\n    for(i=0, j=1; j < n_cols; i+=2, j+=2)\n      {\n      const eT tmp1 = X.at(row, start_col+i);\n      const eT tmp2 = X.at(row, start_col+j);\n        \n      out_mem[i] *= tmp1;\n      out_mem[j] *= tmp2;\n      }\n    \n    if(i < n_cols)\n      {\n      out_mem[i] *= X.at(row, start_col+i);\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n      {\n      arrayops::inplace_mul(out.colptr(col), in.colptr(col), n_rows);\n      }\n    }\n  }\n\n\n\n//! X /= Y.submat(...)\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::div_inplace(Mat<eT>& out, const subview<eT>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(out, in, \"element-wise division\");\n  \n  const uword n_rows = in.n_rows;\n  const uword n_cols = in.n_cols;\n  \n  if(n_rows == 1)\n    {\n    eT* out_mem = out.memptr();\n    \n    const Mat<eT>& X = in.m;\n    \n    const uword row       = in.aux_row1;\n    const uword start_col = in.aux_col1;\n    \n    uword i,j;\n    for(i=0, j=1; j < n_cols; i+=2, j+=2)\n      {\n      const eT tmp1 = X.at(row, start_col+i);\n      const eT tmp2 = X.at(row, start_col+j);\n        \n      out_mem[i] /= tmp1;\n      out_mem[j] /= tmp2;\n      }\n    \n    if(i < n_cols)\n      {\n      out_mem[i] /= X.at(row, start_col+i);\n      }\n    }\n  else\n    {\n    for(uword col=0; col < n_cols; ++col)\n      {\n      arrayops::inplace_div(out.colptr(col), in.colptr(col), n_rows);\n      }\n    }\n  }\n\n\n\n//! creation of subview (row vector)\ntemplate<typename eT>\ninline\nsubview_row<eT>\nsubview<eT>::row(const uword row_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( row_num >= n_rows, \"subview::row(): out of bounds\" );\n  \n  const uword base_row = aux_row1 + row_num;\n  \n  return subview_row<eT>(m, base_row, aux_col1, n_cols);\n  }\n\n\n\n//! creation of subview (row vector)\ntemplate<typename eT>\ninline\nconst subview_row<eT>\nsubview<eT>::row(const uword row_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( row_num >= n_rows, \"subview::row(): out of bounds\" );\n  \n  const uword base_row = aux_row1 + row_num;\n  \n  return subview_row<eT>(m, base_row, aux_col1, n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_row<eT>\nsubview<eT>::operator()(const uword row_num, const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool col_all = col_span.whole;\n  \n  const uword local_n_cols = n_cols;\n  \n  const uword in_col1       = col_all ? 0            : col_span.a;\n  const uword in_col2       =                          col_span.b;\n  const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  const uword base_col1     = aux_col1 + in_col1;  \n  const uword base_row      = aux_row1 + row_num;\n  \n  arma_debug_check\n    (\n    (row_num >= n_rows)\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,\n    \"subview::operator(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview_row<eT>(m, base_row, base_col1, submat_n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview_row<eT>\nsubview<eT>::operator()(const uword row_num, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool col_all = col_span.whole;\n  \n  const uword local_n_cols = n_cols;\n  \n  const uword in_col1       = col_all ? 0            : col_span.a;\n  const uword in_col2       =                          col_span.b;\n  const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  const uword base_col1     = aux_col1 + in_col1;\n  const uword base_row      = aux_row1 + row_num;\n  \n  arma_debug_check\n    (\n    (row_num >= n_rows)\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,\n    \"subview::operator(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview_row<eT>(m, base_row, base_col1, submat_n_cols);\n  }\n\n\n\n//! creation of subview (column vector)\ntemplate<typename eT>\ninline\nsubview_col<eT>\nsubview<eT>::col(const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( col_num >= n_cols, \"subview::col(): out of bounds\");\n  \n  const uword base_col = aux_col1 + col_num;\n  \n  return subview_col<eT>(m, base_col, aux_row1, n_rows);\n  }\n\n\n\n//! creation of subview (column vector)\ntemplate<typename eT>\ninline\nconst subview_col<eT>\nsubview<eT>::col(const uword col_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( col_num >= n_cols, \"subview::col(): out of bounds\");\n  \n  const uword base_col = aux_col1 + col_num;\n  \n  return subview_col<eT>(m, base_col, aux_row1, n_rows);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_col<eT>\nsubview<eT>::operator()(const span& row_span, const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all = row_span.whole;\n  \n  const uword local_n_rows = n_rows;\n  \n  const uword in_row1       = row_all ? 0            : row_span.a;\n  const uword in_row2       =                          row_span.b;\n  const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  const uword base_row1       = aux_row1 + in_row1;  \n  const uword base_col        = aux_col1 + col_num;\n  \n  arma_debug_check\n    (\n    (col_num >= n_cols)\n    ||\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ,\n    \"subview::operator(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview_col<eT>(m, base_col, base_row1, submat_n_rows);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview_col<eT>\nsubview<eT>::operator()(const span& row_span, const uword col_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all = row_span.whole;\n  \n  const uword local_n_rows = n_rows;\n  \n  const uword in_row1       = row_all ? 0            : row_span.a;\n  const uword in_row2       =                          row_span.b;\n  const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  const uword base_row1       = aux_row1 + in_row1;\n  const uword base_col        = aux_col1 + col_num;\n  \n  arma_debug_check\n    (\n    (col_num >= n_cols)\n    ||\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ,\n    \"subview::operator(): indices out of bounds or incorrectly used\"\n    );\n  \n  return subview_col<eT>(m, base_col, base_row1, submat_n_rows);\n  }\n\n\n\n//! create a Col object which uses memory from an existing matrix object.\n//! this approach is currently not alias safe\n//! and does not take into account that the parent matrix object could be deleted.\n//! if deleted memory is accessed by the created Col object,\n//! it will cause memory corruption and/or a crash\ntemplate<typename eT>\ninline\nCol<eT>\nsubview<eT>::unsafe_col(const uword col_num)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( col_num >= n_cols, \"subview::unsafe_col(): out of bounds\");\n  \n  return Col<eT>(colptr(col_num), n_rows, false, true);\n  }\n\n\n\n//! create a Col object which uses memory from an existing matrix object.\n//! this approach is currently not alias safe\n//! and does not take into account that the parent matrix object could be deleted.\n//! if deleted memory is accessed by the created Col object,\n//! it will cause memory corruption and/or a crash\ntemplate<typename eT>\ninline\nconst Col<eT>\nsubview<eT>::unsafe_col(const uword col_num) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( col_num >= n_cols, \"subview::unsafe_col(): out of bounds\");\n  \n  return Col<eT>(const_cast<eT*>(colptr(col_num)), n_rows, false, true);\n  }\n\n\n\n//! creation of subview (submatrix comprised of specified row vectors)\ntemplate<typename eT>\ninline\nsubview<eT>\nsubview<eT>::rows(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_row2 >= n_rows),\n    \"subview::rows(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  const uword base_row1 = aux_row1 + in_row1;\n  \n  return subview<eT>(m, base_row1, aux_col1, subview_n_rows, n_cols );\n  }\n\n\n\n//! creation of subview (submatrix comprised of specified row vectors)\ntemplate<typename eT>\ninline\nconst subview<eT>\nsubview<eT>::rows(const uword in_row1, const uword in_row2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_row2 >= n_rows),\n    \"subview::rows(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  const uword base_row1 = aux_row1 + in_row1;\n  \n  return subview<eT>(m, base_row1, aux_col1, subview_n_rows, n_cols );\n  }\n\n\n\n//! creation of subview (submatrix comprised of specified column vectors)\ntemplate<typename eT>\ninline\nsubview<eT>\nsubview<eT>::cols(const uword in_col1, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_col1 > in_col2) || (in_col2 >= n_cols),\n    \"subview::cols(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n  const uword base_col1 = aux_col1 + in_col1;\n  \n  return subview<eT>(m, aux_row1, base_col1, n_rows, subview_n_cols);\n  }\n\n\n\n//! creation of subview (submatrix comprised of specified column vectors)\ntemplate<typename eT>\ninline\nconst subview<eT>\nsubview<eT>::cols(const uword in_col1, const uword in_col2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_col1 > in_col2) || (in_col2 >= n_cols),\n    \"subview::cols(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n  const uword base_col1 = aux_col1 + in_col1;\n  \n  return subview<eT>(m, aux_row1, base_col1, n_rows, subview_n_cols);\n  }\n\n\n\n//! creation of subview (submatrix)\ntemplate<typename eT>\ninline\nsubview<eT>\nsubview<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_col1 >  in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),\n    \"subview::submat(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n  \n  const uword base_row1 = aux_row1 + in_row1;\n  const uword base_col1 = aux_col1 + in_col1;\n  \n  return subview<eT>(m, base_row1, base_col1, subview_n_rows, subview_n_cols);\n  }\n\n\n\n//! creation of subview (generic submatrix)\ntemplate<typename eT>\ninline\nconst subview<eT>\nsubview<eT>::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 > in_row2) || (in_col1 >  in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols),\n    \"subview::submat(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n  \n  const uword base_row1 = aux_row1 + in_row1;\n  const uword base_col1 = aux_col1 + in_col1;\n  \n  return subview<eT>(m, base_row1, base_col1, subview_n_rows, subview_n_cols);\n  }\n\n\n\n//! creation of subview (submatrix)\ntemplate<typename eT>\ninline\nsubview<eT>\nsubview<eT>::submat(const span& row_span, const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all = row_span.whole;\n  const bool col_all = col_span.whole;\n  \n  const uword local_n_rows = n_rows;\n  const uword local_n_cols = n_cols;\n  \n  const uword in_row1       = row_all ? 0            : row_span.a;\n  const uword in_row2       =                          row_span.b;\n  const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  const uword in_col1       = col_all ? 0            : col_span.a;\n  const uword in_col2       =                          col_span.b;\n  const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  arma_debug_check\n    (\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,\n    \"subview::submat(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword base_row1 = aux_row1 + in_row1;\n  const uword base_col1 = aux_col1 + in_col1;\n  \n  return subview<eT>(m, base_row1, base_col1, submat_n_rows, submat_n_cols);\n  }\n\n\n\n//! creation of subview (generic submatrix)\ntemplate<typename eT>\ninline\nconst subview<eT>\nsubview<eT>::submat(const span& row_span, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const bool row_all = row_span.whole;\n  const bool col_all = col_span.whole;\n  \n  const uword local_n_rows = n_rows;\n  const uword local_n_cols = n_cols;\n  \n  const uword in_row1       = row_all ? 0            : row_span.a;\n  const uword in_row2       =                          row_span.b;\n  const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;\n  \n  const uword in_col1       = col_all ? 0            : col_span.a;\n  const uword in_col2       =                          col_span.b;\n  const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;\n  \n  arma_debug_check\n    (\n    ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )\n    ||\n    ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )\n    ,\n    \"subview::submat(): indices out of bounds or incorrectly used\"\n    );\n  \n  const uword base_row1 = aux_row1 + in_row1;\n  const uword base_col1 = aux_col1 + in_col1;\n  \n  return subview<eT>(m, base_row1, base_col1, submat_n_rows, submat_n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview<eT>\nsubview<eT>::operator()(const span& row_span, const span& col_span)\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).submat(row_span, col_span);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview<eT>\nsubview<eT>::operator()(const span& row_span, const span& col_span) const\n  {\n  arma_extra_debug_sigprint();\n  \n  return (*this).submat(row_span, col_span);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_each1< subview<eT>, 0 >\nsubview<eT>::each_col()\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_each1< subview<eT>, 0 >(*this);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_each1< subview<eT>, 1 >\nsubview<eT>::each_row()\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_each1< subview<eT>, 1 >(*this);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nsubview_each2< subview<eT>, 0, T1 >\nsubview<eT>::each_col(const Base<uword,T1>& indices)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_each2< subview<eT>, 0, T1 >(*this, indices);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nsubview_each2< subview<eT>, 1, T1 >\nsubview<eT>::each_row(const Base<uword,T1>& indices)\n  {\n  arma_extra_debug_sigprint();\n  \n  return subview_each2< subview<eT>, 1, T1 >(*this, indices);\n  }\n\n\n\n//! creation of diagview (diagonal)\ntemplate<typename eT>\ninline\ndiagview<eT>\nsubview<eT>::diag(const sword in_id)\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword row_offset = (in_id < 0) ? uword(-in_id) : 0;\n  const uword col_offset = (in_id > 0) ? uword( in_id) : 0;\n  \n  arma_debug_check\n    (\n    ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),\n    \"subview::diag(): requested diagonal out of bounds\"\n    );\n  \n  const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);\n  \n  const uword base_row_offset = aux_row1 + row_offset;\n  const uword base_col_offset = aux_col1 + col_offset;\n  \n  return diagview<eT>(m, base_row_offset, base_col_offset, len);\n  }\n\n\n\n//! creation of diagview (diagonal)\ntemplate<typename eT>\ninline\nconst diagview<eT>\nsubview<eT>::diag(const sword in_id) const\n  {\n  arma_extra_debug_sigprint();\n  \n  const uword row_offset = (in_id < 0) ? -in_id : 0;\n  const uword col_offset = (in_id > 0) ?  in_id : 0;\n  \n  arma_debug_check\n    (\n    ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)),\n    \"subview::diag(): requested diagonal out of bounds\"\n    );\n  \n  const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset);\n  \n  const uword base_row_offset = aux_row1 + row_offset;\n  const uword base_col_offset = aux_col1 + col_offset;\n  \n  return diagview<eT>(m, base_row_offset, base_col_offset, len);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::swap_rows(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_row1 >= n_rows) || (in_row2 >= n_rows),\n    \"subview::swap_rows(): out of bounds\"\n    );\n  \n  eT* mem = (const_cast< Mat<eT>& >(m)).memptr();\n  \n  if(n_elem > 0)\n    {\n    const uword m_n_rows = m.n_rows;\n    \n    for(uword ucol=0; ucol < n_cols; ++ucol)\n      {\n      const uword offset = (aux_col1 + ucol) * m_n_rows;\n      const uword pos1   = aux_row1 + in_row1 + offset;\n      const uword pos2   = aux_row1 + in_row2 + offset;\n      \n      std::swap( access::rw(mem[pos1]), access::rw(mem[pos2]) );\n      }\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview<eT>::swap_cols(const uword in_col1, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check\n    (\n    (in_col1 >= n_cols) || (in_col2 >= n_cols),\n    \"subview::swap_cols(): out of bounds\"\n    );\n  \n  if(n_elem > 0)\n    {\n    eT* ptr1 = colptr(in_col1);\n    eT* ptr2 = colptr(in_col2);\n    \n    for(uword urow=0; urow < n_rows; ++urow)\n      {\n      std::swap( ptr1[urow], ptr2[urow] );\n      }\n    }\n  }\n\n\n\n// template<typename eT>\n// inline\n// subview<eT>::iter::iter(const subview<eT>& S)\n//   : mem       (S.m.mem)\n//   , n_rows    (S.m.n_rows)\n//   , row_start (S.aux_row1)\n//   , row_end_p1(row_start + S.n_rows)\n//   , row       (row_start)\n//   , col       (S.aux_col1)\n//   , i         (row + col*n_rows)\n//   {\n//   arma_extra_debug_sigprint();\n//   }\n// \n// \n// \n// template<typename eT>\n// arma_inline\n// eT\n// subview<eT>::iter::operator*() const\n//   {\n//   return mem[i];\n//   }\n// \n// \n// \n// template<typename eT>\n// inline\n// void\n// subview<eT>::iter::operator++()\n//   {\n//   ++row;\n//   \n//   if(row < row_end_p1)\n//     {\n//     ++i;\n//     }\n//   else\n//     {\n//     row = row_start;\n//     ++col;\n//     \n//     i = row + col*n_rows;\n//     }\n//   }\n// \n// \n// \n// template<typename eT>\n// inline\n// void\n// subview<eT>::iter::operator++(int)\n//   {\n//   operator++();\n//   }\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename eT>\ninline\nsubview_col<eT>::subview_col(const Mat<eT>& in_m, const uword in_col)\n  : subview<eT>(in_m, 0, in_col, in_m.n_rows, 1)\n  , colmem(subview<eT>::colptr(0)) \n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_col<eT>::subview_col(const Mat<eT>& in_m, const uword in_col, const uword in_row1, const uword in_n_rows)\n  : subview<eT>(in_m, in_row1, in_col, in_n_rows, 1)\n  , colmem(subview<eT>::colptr(0)) \n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_col<eT>::operator=(const subview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview<eT>::operator=(X);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_col<eT>::operator=(const subview_col<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview<eT>::operator=(X); // interprets 'subview_col' as 'subview'\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_col<eT>::operator=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  if(subview<eT>::n_elem != 1)\n    {\n    arma_debug_assert_same_size(subview<eT>::n_rows, subview<eT>::n_cols, 1, 1, \"copy into submatrix\");\n    }\n  \n  access::rw( colmem[0] ) = val;\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview_col<eT>::operator=(const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview<eT>::operator=(X);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename gen_type>\ninline\ntypename enable_if2< is_same_type<typename T1::elem_type, eT>::value, void>::result\nsubview_col<eT>::operator= (const Gen<T1,gen_type>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(subview<eT>::n_rows, uword(1), in.n_rows, (in.is_col ? uword(1) : in.n_cols), \"copy into submatrix\");\n  \n  in.apply(*this);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst Op<subview_col<eT>,op_htrans>\nsubview_col<eT>::t() const\n  {\n  return Op<subview_col<eT>,op_htrans>(*this);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst Op<subview_col<eT>,op_htrans>\nsubview_col<eT>::ht() const\n  {\n  return Op<subview_col<eT>,op_htrans>(*this);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst Op<subview_col<eT>,op_strans>\nsubview_col<eT>::st() const\n  {\n  return Op<subview_col<eT>,op_strans>(*this);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_col<eT>::fill(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::inplace_set( access::rwp(colmem), val, subview<eT>::n_rows );\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_col<eT>::zeros()\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::fill_zeros( access::rwp(colmem), subview<eT>::n_rows );\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_col<eT>::ones()\n  {\n  arma_extra_debug_sigprint();\n  \n  arrayops::inplace_set( access::rwp(colmem), eT(1), subview<eT>::n_rows );\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT\nsubview_col<eT>::at_alt(const uword ii) const\n  {\n  const eT* colmem_aligned = colmem;\n  memory::mark_as_aligned(colmem_aligned);\n  \n  return colmem_aligned[ii];\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT&\nsubview_col<eT>::operator[](const uword ii)\n  {\n  return access::rw( colmem[ii] );\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT\nsubview_col<eT>::operator[](const uword ii) const\n  {\n  return colmem[ii];\n  }\n\n\n\ntemplate<typename eT>\ninline\neT&\nsubview_col<eT>::operator()(const uword ii)\n  {\n  arma_debug_check( (ii >= subview<eT>::n_elem), \"subview::operator(): index out of bounds\");\n    \n  return access::rw( colmem[ii] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_col<eT>::operator()(const uword ii) const\n  {\n  arma_debug_check( (ii >= subview<eT>::n_elem), \"subview::operator(): index out of bounds\");\n  \n  return colmem[ii];\n  }\n\n\n\ntemplate<typename eT>\ninline\neT&\nsubview_col<eT>::operator()(const uword in_row, const uword in_col)\n  {\n  arma_debug_check( ((in_row >= subview<eT>::n_rows) || (in_col > 0)), \"subview::operator(): index out of bounds\");\n  \n  return access::rw( colmem[in_row] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_col<eT>::operator()(const uword in_row, const uword in_col) const\n  {\n  arma_debug_check( ((in_row >= subview<eT>::n_rows) || (in_col > 0)), \"subview::operator(): index out of bounds\");\n  \n  return colmem[in_row];\n  }\n\n\n\ntemplate<typename eT>\ninline\neT&\nsubview_col<eT>::at(const uword in_row, const uword)\n  {\n  return access::rw( colmem[in_row] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_col<eT>::at(const uword in_row, const uword) const\n  {\n  return colmem[in_row];\n  }\n\n\n\ntemplate<typename eT>\narma_inline\neT*\nsubview_col<eT>::colptr(const uword)\n  {\n  return const_cast<eT*>(colmem);\n  }\n  \n  \ntemplate<typename eT>\narma_inline\nconst eT*\nsubview_col<eT>::colptr(const uword) const\n  {\n  return colmem;\n  }\n\n\ntemplate<typename eT>\ninline\nsubview_col<eT>\nsubview_col<eT>::rows(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= subview<eT>::n_rows) ), \"subview_col::rows(): indices out of bounds or incorrectly used\");\n  \n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  \n  const uword base_row1 = this->aux_row1 + in_row1;\n  \n  return subview_col<eT>(this->m, this->aux_col1, base_row1, subview_n_rows);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview_col<eT>\nsubview_col<eT>::rows(const uword in_row1, const uword in_row2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= subview<eT>::n_rows) ), \"subview_col::rows(): indices out of bounds or incorrectly used\");\n  \n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  \n  const uword base_row1 = this->aux_row1 + in_row1;\n  \n  return subview_col<eT>(this->m, this->aux_col1, base_row1, subview_n_rows);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_col<eT>\nsubview_col<eT>::subvec(const uword in_row1, const uword in_row2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= subview<eT>::n_rows) ), \"subview_col::subvec(): indices out of bounds or incorrectly used\");\n  \n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  \n  const uword base_row1 = this->aux_row1 + in_row1;\n  \n  return subview_col<eT>(this->m, this->aux_col1, base_row1, subview_n_rows);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview_col<eT>\nsubview_col<eT>::subvec(const uword in_row1, const uword in_row2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (in_row1 > in_row2) || (in_row2 >= subview<eT>::n_rows) ), \"subview_col::subvec(): indices out of bounds or incorrectly used\");\n  \n  const uword subview_n_rows = in_row2 - in_row1 + 1;\n  \n  const uword base_row1 = this->aux_row1 + in_row1;\n  \n  return subview_col<eT>(this->m, this->aux_col1, base_row1, subview_n_rows);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_col<eT>\nsubview_col<eT>::head(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > subview<eT>::n_rows), \"subview_col::head(): size out of bounds\");\n  \n  return subview_col<eT>(this->m, this->aux_col1, this->aux_row1, N);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview_col<eT>\nsubview_col<eT>::head(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > subview<eT>::n_rows), \"subview_col::head(): size out of bounds\");\n  \n  return subview_col<eT>(this->m, this->aux_col1, this->aux_row1, N);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_col<eT>\nsubview_col<eT>::tail(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > subview<eT>::n_rows), \"subview_col::tail(): size out of bounds\");\n  \n  const uword start_row = subview<eT>::aux_row1 + subview<eT>::n_rows - N;\n  \n  return subview_col<eT>(this->m, this->aux_col1, start_row, N);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview_col<eT>\nsubview_col<eT>::tail(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > subview<eT>::n_rows), \"subview_col::tail(): size out of bounds\");\n  \n  const uword start_row = subview<eT>::aux_row1 + subview<eT>::n_rows - N;\n  \n  return subview_col<eT>(this->m, this->aux_col1, start_row, N);\n  }\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename eT>\ninline\nsubview_row<eT>::subview_row(const Mat<eT>& in_m, const uword in_row)\n  : subview<eT>(in_m, in_row, 0, 1, in_m.n_cols)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_row<eT>::subview_row(const Mat<eT>& in_m, const uword in_row, const uword in_col1, const uword in_n_cols)\n  : subview<eT>(in_m, in_row, in_col1, 1, in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_row<eT>::operator=(const subview<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview<eT>::operator=(X);\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_row<eT>::operator=(const subview_row<eT>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview<eT>::operator=(X); // interprets 'subview_row' as 'subview'\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_row<eT>::operator=(const eT val)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview<eT>::operator=(val); // interprets 'subview_row' as 'subview'\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1>\ninline\nvoid\nsubview_row<eT>::operator=(const Base<eT,T1>& X)\n  {\n  arma_extra_debug_sigprint();\n  \n  subview<eT>::operator=(X);\n  }\n\n\n\ntemplate<typename eT>\ntemplate<typename T1, typename gen_type>\ninline\ntypename enable_if2< is_same_type<typename T1::elem_type, eT>::value, void>::result\nsubview_row<eT>::operator= (const Gen<T1,gen_type>& in)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_assert_same_size(uword(1), subview<eT>::n_cols, (in.is_row ? uword(1) : in.n_rows), in.n_cols, \"copy into submatrix\");\n  \n  in.apply(*this);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst Op<subview_row<eT>,op_htrans>\nsubview_row<eT>::t() const\n  {\n  return Op<subview_row<eT>,op_htrans>(*this);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst Op<subview_row<eT>,op_htrans>\nsubview_row<eT>::ht() const\n  {\n  return Op<subview_row<eT>,op_htrans>(*this);\n  }\n\n\n\ntemplate<typename eT>\narma_inline\nconst Op<subview_row<eT>,op_strans>\nsubview_row<eT>::st() const\n  {\n  return Op<subview_row<eT>,op_strans>(*this);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_row<eT>::at_alt(const uword ii) const\n  {\n  const uword index = (ii + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);\n  \n  return subview<eT>::m.mem[index];\n  }\n\n\n\ntemplate<typename eT>\ninline\neT&\nsubview_row<eT>::operator[](const uword ii)\n  {\n  const uword index = (ii + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);\n  \n  return access::rw( (const_cast< Mat<eT>& >(subview<eT>::m)).mem[index] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_row<eT>::operator[](const uword ii) const\n  {\n  const uword index = (ii + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);\n  \n  return subview<eT>::m.mem[index];\n  }\n\n\n\ntemplate<typename eT>\ninline\neT&\nsubview_row<eT>::operator()(const uword ii)\n  {\n  arma_debug_check( (ii >= subview<eT>::n_elem), \"subview::operator(): index out of bounds\");\n    \n  const uword index = (ii + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);\n  \n  return access::rw( (const_cast< Mat<eT>& >(subview<eT>::m)).mem[index] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_row<eT>::operator()(const uword ii) const\n  {\n  arma_debug_check( (ii >= subview<eT>::n_elem), \"subview::operator(): index out of bounds\");\n  \n  const uword index = (ii + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);\n  \n  return subview<eT>::m.mem[index];\n  }\n\n\n\ntemplate<typename eT>\ninline\neT&\nsubview_row<eT>::operator()(const uword in_row, const uword in_col)\n  {\n  arma_debug_check( ((in_row > 0) || (in_col >= subview<eT>::n_cols)), \"subview::operator(): index out of bounds\");\n  \n  const uword index = (in_col + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);\n  \n  return access::rw( (const_cast< Mat<eT>& >(subview<eT>::m)).mem[index] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_row<eT>::operator()(const uword in_row, const uword in_col) const\n  {\n  arma_debug_check( ((in_row > 0) || (in_col >= subview<eT>::n_cols)), \"subview::operator(): index out of bounds\");\n  \n  const uword index = (in_col + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);\n  \n  return subview<eT>::m.mem[index];\n  }\n\n\n\ntemplate<typename eT>\ninline\neT&\nsubview_row<eT>::at(const uword, const uword in_col)\n  {\n  const uword index = (in_col + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);\n  \n  return access::rw( (const_cast< Mat<eT>& >(subview<eT>::m)).mem[index] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_row<eT>::at(const uword, const uword in_col) const\n  {\n  const uword index = (in_col + (subview<eT>::aux_col1))*(subview<eT>::m).n_rows + (subview<eT>::aux_row1);\n  \n  return subview<eT>::m.mem[index];\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_row<eT>\nsubview_row<eT>::cols(const uword in_col1, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= subview<eT>::n_cols) ), \"subview_row::cols(): indices out of bounds or incorrectly used\" );\n  \n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n  \n  const uword base_col1 = this->aux_col1 + in_col1;\n  \n  return subview_row<eT>(this->m, this->aux_row1, base_col1, subview_n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview_row<eT>\nsubview_row<eT>::cols(const uword in_col1, const uword in_col2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= subview<eT>::n_cols) ), \"subview_row::cols(): indices out of bounds or incorrectly used\");\n  \n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n  \n  const uword base_col1 = this->aux_col1 + in_col1;\n  \n  return subview_row<eT>(this->m, this->aux_row1, base_col1, subview_n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_row<eT>\nsubview_row<eT>::subvec(const uword in_col1, const uword in_col2)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= subview<eT>::n_cols) ), \"subview_row::subvec(): indices out of bounds or incorrectly used\");\n  \n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n  \n  const uword base_col1 = this->aux_col1 + in_col1;\n  \n  return subview_row<eT>(this->m, this->aux_row1, base_col1, subview_n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview_row<eT>\nsubview_row<eT>::subvec(const uword in_col1, const uword in_col2) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( ( (in_col1 > in_col2) || (in_col2 >= subview<eT>::n_cols) ), \"subview_row::subvec(): indices out of bounds or incorrectly used\");\n  \n  const uword subview_n_cols = in_col2 - in_col1 + 1;\n  \n  const uword base_col1 = this->aux_col1 + in_col1;\n  \n  return subview_row<eT>(this->m, this->aux_row1, base_col1, subview_n_cols);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_row<eT>\nsubview_row<eT>::head(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > subview<eT>::n_cols), \"subview_row::head(): size out of bounds\");\n  \n  return subview_row<eT>(this->m, this->aux_row1, this->aux_col1, N);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview_row<eT>\nsubview_row<eT>::head(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > subview<eT>::n_cols), \"subview_row::head(): size out of bounds\");\n  \n  return subview_row<eT>(this->m, this->aux_row1, this->aux_col1, N);\n  }\n\n\n\ntemplate<typename eT>\ninline\nsubview_row<eT>\nsubview_row<eT>::tail(const uword N)\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > subview<eT>::n_cols), \"subview_row::tail(): size out of bounds\");\n  \n  const uword start_col = subview<eT>::aux_col1 + subview<eT>::n_cols - N;\n  \n  return subview_row<eT>(this->m, this->aux_row1, start_col, N);\n  }\n\n\n\ntemplate<typename eT>\ninline\nconst subview_row<eT>\nsubview_row<eT>::tail(const uword N) const\n  {\n  arma_extra_debug_sigprint();\n  \n  arma_debug_check( (N > subview<eT>::n_cols), \"subview_row::tail(): size out of bounds\");\n  \n  const uword start_col = subview<eT>::aux_col1 + subview<eT>::n_cols - N;\n  \n  return subview_row<eT>(this->m, this->aux_row1, start_col, N);\n  }\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename eT>\ninline\nsubview_row_strans<eT>::subview_row_strans(const subview_row<eT>& in_sv_row)\n  : sv_row(in_sv_row       )\n  , n_rows(in_sv_row.n_cols)\n  , n_elem(in_sv_row.n_elem)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_row_strans<eT>::extract(Mat<eT>& out) const\n  {\n  arma_extra_debug_sigprint();\n  \n  // NOTE: this function assumes that matrix 'out' has already been set to the correct size\n  \n  const Mat<eT>& X = sv_row.m;\n  \n  eT* out_mem = out.memptr();\n  \n  const uword row           = sv_row.aux_row1;\n  const uword start_col     = sv_row.aux_col1;\n  const uword sv_row_n_cols = sv_row.n_cols;\n  \n  uword ii,jj;\n  \n  for(ii=0, jj=1; jj < sv_row_n_cols; ii+=2, jj+=2)\n    {\n    const eT tmp1 = X.at(row, start_col+ii);\n    const eT tmp2 = X.at(row, start_col+jj);\n    \n    out_mem[ii] = tmp1;\n    out_mem[jj] = tmp2;\n    }\n  \n  if(ii < sv_row_n_cols)\n    {\n    out_mem[ii] = X.at(row, start_col+ii);\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_row_strans<eT>::at_alt(const uword ii) const\n  {\n  return sv_row[ii];\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_row_strans<eT>::operator[](const uword ii) const\n  {\n  return sv_row[ii];\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_row_strans<eT>::operator()(const uword ii) const\n  {\n  return sv_row(ii);\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_row_strans<eT>::operator()(const uword in_row, const uword in_col) const\n  {\n  return sv_row(in_col, in_row);  // deliberately swapped\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_row_strans<eT>::at(const uword in_row, const uword) const\n  {\n  return sv_row.at(0, in_row);  // deliberately swapped\n  }\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename eT>\ninline\nsubview_row_htrans<eT>::subview_row_htrans(const subview_row<eT>& in_sv_row)\n  : sv_row(in_sv_row       )\n  , n_rows(in_sv_row.n_cols)\n  , n_elem(in_sv_row.n_elem)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nsubview_row_htrans<eT>::extract(Mat<eT>& out) const\n  {\n  arma_extra_debug_sigprint();\n  \n  // NOTE: this function assumes that matrix 'out' has already been set to the correct size\n  \n  const Mat<eT>& X = sv_row.m;\n  \n  eT* out_mem = out.memptr();\n  \n  const uword row           = sv_row.aux_row1;\n  const uword start_col     = sv_row.aux_col1;\n  const uword sv_row_n_cols = sv_row.n_cols;\n  \n  for(uword ii=0; ii < sv_row_n_cols; ++ii)\n    {\n    out_mem[ii] = access::alt_conj( X.at(row, start_col+ii) );\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_row_htrans<eT>::at_alt(const uword ii) const\n  {\n  return access::alt_conj( sv_row[ii] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_row_htrans<eT>::operator[](const uword ii) const\n  {\n  return access::alt_conj( sv_row[ii] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_row_htrans<eT>::operator()(const uword ii) const\n  {\n  return access::alt_conj( sv_row(ii) );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_row_htrans<eT>::operator()(const uword in_row, const uword in_col) const\n  {\n  return access::alt_conj( sv_row(in_col, in_row) );  // deliberately swapped\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nsubview_row_htrans<eT>::at(const uword in_row, const uword) const\n  {\n  return access::alt_conj( sv_row.at(0, in_row) );  // deliberately swapped\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/superlu_bones.hpp",
    "content": "// Copyright (C) 2015 Ryan Curtin\n// Copyright (C) 2015 Conrad Sanderson\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/\n\n#if defined(ARMA_USE_SUPERLU)\n\nextern \"C\"\n  {\n  extern void arma_wrapper(sgssv)(superlu::superlu_options_t*, superlu::SuperMatrix*, int*, int*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::SuperLUStat_t*, int*);\n  extern void arma_wrapper(dgssv)(superlu::superlu_options_t*, superlu::SuperMatrix*, int*, int*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::SuperLUStat_t*, int*);\n  extern void arma_wrapper(cgssv)(superlu::superlu_options_t*, superlu::SuperMatrix*, int*, int*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::SuperLUStat_t*, int*);\n  extern void arma_wrapper(zgssv)(superlu::superlu_options_t*, superlu::SuperMatrix*, int*, int*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::SuperLUStat_t*, int*);\n  \n  extern void arma_wrapper(StatInit)(superlu::SuperLUStat_t*);\n  extern void arma_wrapper(StatFree)(superlu::SuperLUStat_t*);\n  extern void arma_wrapper(set_default_options)(superlu::superlu_options_t*);\n  \n  extern void arma_wrapper(Destroy_SuperNode_Matrix)(superlu::SuperMatrix*);\n  extern void arma_wrapper(Destroy_CompCol_Matrix)(superlu::SuperMatrix*);\n  extern void arma_wrapper(Destroy_SuperMatrix_Store)(superlu::SuperMatrix*);\n  \n  // We also need superlu_malloc() and superlu_free().\n  // When using the original SuperLU code directly, you (the user) may\n  // define USER_MALLOC and USER_FREE, but the joke is on you because\n  // if you are linking against SuperLU and not compiling from scratch,\n  // it won't actually make a difference anyway!  If you've compiled\n  // SuperLU against a custom USER_MALLOC and USER_FREE, you're probably up\n  // shit creek about a thousand different ways before you even get to this\n  // code, so, don't do that!\n  \n  extern void* arma_wrapper(superlu_malloc)(size_t);\n  extern void  arma_wrapper(superlu_free)(void*);\n  }\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/superlu_wrapper.hpp",
    "content": "// Copyright (C) 2015 Ryan Curtin\n// Copyright (C) 2015 Conrad Sanderson\n//\n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n\n#if defined(ARMA_USE_SUPERLU)\n\n//! \\namespace superlu namespace for SuperLU functions\nnamespace superlu\n  {\n  \n  template<typename eT>\n  inline\n  void\n  gssv(superlu_options_t* options, SuperMatrix* A, int* perm_c, int* perm_r, SuperMatrix* L, SuperMatrix* U, SuperMatrix* B, SuperLUStat_t* stat, int* info)\n    {\n    arma_type_check(( is_supported_blas_type<eT>::value == false ));\n    \n    if(is_float<eT>::value)\n      {\n      arma_wrapper(sgssv)(options, A, perm_c, perm_r, L, U, B, stat, info);\n      }\n    else\n    if(is_double<eT>::value)\n      {\n      arma_wrapper(dgssv)(options, A, perm_c, perm_r, L, U, B, stat, info);\n      }\n    else\n    if(is_supported_complex_float<eT>::value)\n      {\n      arma_wrapper(cgssv)(options, A, perm_c, perm_r, L, U, B, stat, info);\n      }\n    else\n    if(is_supported_complex_double<eT>::value)\n      {\n      arma_wrapper(zgssv)(options, A, perm_c, perm_r, L, U, B, stat, info);\n      }\n    }\n  \n  \n  \n  inline\n  void\n  init_stat(SuperLUStat_t* stat)\n    {\n    arma_wrapper(StatInit)(stat);\n    }\n\n\n  inline\n  void\n  free_stat(SuperLUStat_t* stat)\n    {\n    arma_wrapper(StatFree)(stat);\n    }\n  \n  \n  \n  inline\n  void\n  set_default_opts(superlu_options_t* opts)\n    {\n    arma_wrapper(set_default_options)(opts);\n    }\n  \n  \n  \n  inline\n  void\n  destroy_supernode_mat(SuperMatrix* a)\n    {\n    arma_wrapper(Destroy_SuperNode_Matrix)(a);\n    }\n\n\n\n  inline\n  void\n  destroy_compcol_mat(SuperMatrix* a)\n    {\n    arma_wrapper(Destroy_CompCol_Matrix)(a);\n    }\n\n\n\n  inline\n  void\n  destroy_dense_mat(SuperMatrix* a)\n    {\n    arma_wrapper(Destroy_SuperMatrix_Store)(a);\n    }\n  \n  \n  \n  inline\n  void*\n  malloc(size_t N)\n    {\n    return arma_wrapper(superlu_malloc)(N);\n    }\n  \n  \n  \n  inline\n  void\n  free(void* mem)\n    {\n    arma_wrapper(superlu_free)(mem);\n    }\n  \n  } // namespace superlu\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/traits.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup traits\n//! @{\n\n\ntemplate<typename T1>\nstruct get_pod_type\n  { typedef T1 result; };\n\ntemplate<typename T2>\nstruct get_pod_type< std::complex<T2> >\n  { typedef T2 result; };\n\n\n\ntemplate<typename T>\nstruct is_Mat_fixed_only\n  {\n  typedef char yes[1];\n  typedef char no[2];\n  \n  template<typename X> static yes& check(typename X::Mat_fixed_type*);\n  template<typename>   static no&  check(...);\n  \n  static const bool value = ( sizeof(check<T>(0)) == sizeof(yes) );\n  };\n\n\n\ntemplate<typename T>\nstruct is_Row_fixed_only\n  {\n  typedef char yes[1];\n  typedef char no[2];\n  \n  template<typename X> static yes& check(typename X::Row_fixed_type*);\n  template<typename>   static no&  check(...);\n  \n  static const bool value = ( sizeof(check<T>(0)) == sizeof(yes) );\n  };\n\n\n\ntemplate<typename T>\nstruct is_Col_fixed_only\n  {\n  typedef char yes[1];\n  typedef char no[2];\n  \n  template<typename X> static yes& check(typename X::Col_fixed_type*);\n  template<typename>   static no&  check(...);\n  \n  static const bool value = ( sizeof(check<T>(0)) == sizeof(yes) );\n  };\n\n\n\ntemplate<typename T>\nstruct is_Mat_fixed\n  { static const bool value = ( is_Mat_fixed_only<T>::value || is_Row_fixed_only<T>::value || is_Col_fixed_only<T>::value ); };\n\n\n\ntemplate<typename T>\nstruct is_Mat_only\n  { static const bool value = is_Mat_fixed_only<T>::value; };\n\ntemplate<typename eT>\nstruct is_Mat_only< Mat<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_Mat_only< const Mat<eT> >\n  { static const bool value = true; };\n\n\n\ntemplate<typename T>\nstruct is_Mat\n  { static const bool value = ( is_Mat_fixed_only<T>::value || is_Row_fixed_only<T>::value || is_Col_fixed_only<T>::value ); };\n\ntemplate<typename eT>\nstruct is_Mat< Mat<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_Mat< const Mat<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_Mat< Row<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_Mat< const Row<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_Mat< Col<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_Mat< const Col<eT> >\n  { static const bool value = true; };\n\n\n\ntemplate<typename T>\nstruct is_Row\n  { static const bool value = is_Row_fixed_only<T>::value; };\n\ntemplate<typename eT>\nstruct is_Row< Row<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_Row< const Row<eT> >\n  { static const bool value = true; };\n\n\n\ntemplate<typename T>\nstruct is_Col\n  { static const bool value = is_Col_fixed_only<T>::value; };\n\ntemplate<typename eT>\nstruct is_Col< Col<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_Col< const Col<eT> >\n  { static const bool value = true; };\n\n\n\ntemplate<typename T>\nstruct is_diagview\n  { static const bool value = false; };\n\ntemplate<typename eT>\nstruct is_diagview< diagview<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_diagview< const diagview<eT> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_subview\n  { static const bool value = false; };\n\ntemplate<typename eT>\nstruct is_subview< subview<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_subview< const subview<eT> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_subview_row\n  { static const bool value = false; };\n\ntemplate<typename eT>\nstruct is_subview_row< subview_row<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_subview_row< const subview_row<eT> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_subview_col\n  { static const bool value = false; };\n\ntemplate<typename eT>\nstruct is_subview_col< subview_col<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_subview_col< const subview_col<eT> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_subview_elem1\n  { static const bool value = false; };\n\ntemplate<typename eT, typename T1>\nstruct is_subview_elem1< subview_elem1<eT, T1> >\n  { static const bool value = true; };\n\ntemplate<typename eT, typename T1>\nstruct is_subview_elem1< const subview_elem1<eT, T1> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_subview_elem2\n  { static const bool value = false; };\n\ntemplate<typename eT, typename T1, typename T2>\nstruct is_subview_elem2< subview_elem2<eT, T1, T2> >\n  { static const bool value = true; };\n\ntemplate<typename eT, typename T1, typename T2>\nstruct is_subview_elem2< const subview_elem2<eT, T1, T2> >\n  { static const bool value = true; };\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename T>\nstruct is_Cube\n  { static const bool value = false; };\n\ntemplate<typename eT>\nstruct is_Cube< Cube<eT> >\n  { static const bool value = true; };\n\ntemplate<typename T>\nstruct is_subview_cube\n  { static const bool value = false; };\n\ntemplate<typename eT>\nstruct is_subview_cube< subview_cube<eT> >\n  { static const bool value = true; };\n\n\n\n//\n//\n//\n\n\ntemplate<typename T>\nstruct is_Gen\n  { static const bool value = false; };\n \ntemplate<typename T1, typename gen_type>\nstruct is_Gen< Gen<T1,gen_type> >\n  { static const bool value = true; };\n \ntemplate<typename T1, typename gen_type>\nstruct is_Gen< const Gen<T1,gen_type> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_Op\n  { static const bool value = false; };\n \ntemplate<typename T1, typename op_type>\nstruct is_Op< Op<T1,op_type> >\n  { static const bool value = true; };\n \ntemplate<typename T1, typename op_type>\nstruct is_Op< const Op<T1,op_type> >\n  { static const bool value = true; };\n\ntemplate<typename T>\nstruct is_eOp\n  { static const bool value = false; };\n \ntemplate<typename T1, typename eop_type>\nstruct is_eOp< eOp<T1,eop_type> >\n  { static const bool value = true; };\n \ntemplate<typename T1, typename eop_type>\nstruct is_eOp< const eOp<T1,eop_type> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_mtOp\n  { static const bool value = false; };\n \ntemplate<typename eT, typename T1, typename op_type>\nstruct is_mtOp< mtOp<eT, T1, op_type> >\n  { static const bool value = true; };\n \ntemplate<typename eT, typename T1, typename op_type>\nstruct is_mtOp< const mtOp<eT, T1, op_type> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_Glue\n  { static const bool value = false; };\n \ntemplate<typename T1, typename T2, typename glue_type>\nstruct is_Glue< Glue<T1,T2,glue_type> >\n  { static const bool value = true; };\n\ntemplate<typename T1, typename T2, typename glue_type>\nstruct is_Glue< const Glue<T1,T2,glue_type> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_eGlue\n  { static const bool value = false; };\n \ntemplate<typename T1, typename T2, typename eglue_type>\nstruct is_eGlue< eGlue<T1,T2,eglue_type> >\n  { static const bool value = true; };\n\ntemplate<typename T1, typename T2, typename eglue_type>\nstruct is_eGlue< const eGlue<T1,T2,eglue_type> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_mtGlue\n  { static const bool value = false; };\n \ntemplate<typename eT, typename T1, typename T2, typename glue_type>\nstruct is_mtGlue< mtGlue<eT, T1, T2, glue_type> >\n  { static const bool value = true; };\n\ntemplate<typename eT, typename T1, typename T2, typename glue_type>\nstruct is_mtGlue< const mtGlue<eT, T1, T2, glue_type> >\n  { static const bool value = true; };\n\n\n//\n//\n\n\ntemplate<typename T>\nstruct is_glue_times\n  { static const bool value = false; };\n\ntemplate<typename T1, typename T2>\nstruct is_glue_times< Glue<T1,T2,glue_times> >\n  { static const bool value = true; };\n\ntemplate<typename T1, typename T2>\nstruct is_glue_times< const Glue<T1,T2,glue_times> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_glue_times_diag\n  { static const bool value = false; };\n\ntemplate<typename T1, typename T2>\nstruct is_glue_times_diag< Glue<T1,T2,glue_times_diag> >\n  { static const bool value = true; };\n\ntemplate<typename T1, typename T2>\nstruct is_glue_times_diag< const Glue<T1,T2,glue_times_diag> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_op_diagmat\n  { static const bool value = false; };\n \ntemplate<typename T1>\nstruct is_op_diagmat< Op<T1,op_diagmat> >\n  { static const bool value = true; };\n\ntemplate<typename T1>\nstruct is_op_diagmat< const Op<T1,op_diagmat> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_op_htrans2\n  { static const bool value = false; };\n \ntemplate<typename T1>\nstruct is_op_htrans2< Op<T1,op_htrans2> >\n  { static const bool value = true; };\n\ntemplate<typename T1>\nstruct is_op_htrans2< const Op<T1,op_htrans2> >\n  { static const bool value = true; };\n\n\n//\n//\n\n\ntemplate<typename T>\nstruct is_Mat_trans\n  { static const bool value = false; };\n\ntemplate<typename T1>\nstruct is_Mat_trans< Op<T1,op_htrans> >\n  { static const bool value = is_Mat<T1>::value; };\n\ntemplate<typename T1>\nstruct is_Mat_trans< Op<T1,op_htrans2> >\n  { static const bool value = is_Mat<T1>::value; };\n\n\n//\n//\n\n\ntemplate<typename T>\nstruct is_GenCube\n  { static const bool value = false; };\n \ntemplate<typename eT, typename gen_type>\nstruct is_GenCube< GenCube<eT,gen_type> >\n  { static const bool value = true; };\n \n\ntemplate<typename T>\nstruct is_OpCube\n  { static const bool value = false; };\n \ntemplate<typename T1, typename op_type>\nstruct is_OpCube< OpCube<T1,op_type> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_eOpCube\n  { static const bool value = false; };\n \ntemplate<typename T1, typename eop_type>\nstruct is_eOpCube< eOpCube<T1,eop_type> >\n  { static const bool value = true; };\n \n\ntemplate<typename T>\nstruct is_mtOpCube\n  { static const bool value = false; };\n \ntemplate<typename eT, typename T1, typename op_type>\nstruct is_mtOpCube< mtOpCube<eT, T1, op_type> >\n  { static const bool value = true; };\n \n\ntemplate<typename T>\nstruct is_GlueCube\n  { static const bool value = false; };\n \ntemplate<typename T1, typename T2, typename glue_type>\nstruct is_GlueCube< GlueCube<T1,T2,glue_type> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_eGlueCube\n  { static const bool value = false; };\n \ntemplate<typename T1, typename T2, typename eglue_type>\nstruct is_eGlueCube< eGlueCube<T1,T2,eglue_type> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_mtGlueCube\n  { static const bool value = false; };\n \ntemplate<typename eT, typename T1, typename T2, typename glue_type>\nstruct is_mtGlueCube< mtGlueCube<eT, T1, T2, glue_type> >\n  { static const bool value = true; };\n\n\n//\n//\n//\n\n\ntemplate<typename T>\nstruct is_op_rel\n  { static const bool value = false; };\n\ntemplate<typename out_eT, typename T1>\nstruct is_op_rel< mtOp<out_eT, T1, op_rel_lt_pre> >\n  { static const bool value = true; };\n\ntemplate<typename out_eT, typename T1>\nstruct is_op_rel< mtOp<out_eT, T1, op_rel_lt_post> >\n  { static const bool value = true; };\n\ntemplate<typename out_eT, typename T1>\nstruct is_op_rel< mtOp<out_eT, T1, op_rel_gt_pre> >\n  { static const bool value = true; };\n\ntemplate<typename out_eT, typename T1>\nstruct is_op_rel< mtOp<out_eT, T1, op_rel_gt_post> >\n  { static const bool value = true; };\n\ntemplate<typename out_eT, typename T1>\nstruct is_op_rel< mtOp<out_eT, T1, op_rel_lteq_pre> >\n  { static const bool value = true; };\n\ntemplate<typename out_eT, typename T1>\nstruct is_op_rel< mtOp<out_eT, T1, op_rel_lteq_post> >\n  { static const bool value = true; };\n\ntemplate<typename out_eT, typename T1>\nstruct is_op_rel< mtOp<out_eT, T1, op_rel_gteq_pre> >\n  { static const bool value = true; };\n\ntemplate<typename out_eT, typename T1>\nstruct is_op_rel< mtOp<out_eT, T1, op_rel_gteq_post> >\n  { static const bool value = true; };\n\ntemplate<typename out_eT, typename T1>\nstruct is_op_rel< mtOp<out_eT, T1, op_rel_eq> >\n  { static const bool value = true; };\n\ntemplate<typename out_eT, typename T1>\nstruct is_op_rel< mtOp<out_eT, T1, op_rel_noteq> >\n  { static const bool value = true; };\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename T>\nstruct is_basevec\n  { static const bool value = ( is_Row_fixed_only<T>::value || is_Col_fixed_only<T>::value ); };\n\ntemplate<typename eT>\nstruct is_basevec< Row<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_basevec< const Row<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_basevec< Col<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_basevec< const Col<eT> >\n  { static const bool value = true; };\n  \ntemplate<typename eT>\nstruct is_basevec< subview_row<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_basevec< const subview_row<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_basevec< subview_col<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_basevec< const subview_col<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_basevec< diagview<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_basevec< const diagview<eT> >\n  { static const bool value = true; };\n  \ntemplate<typename eT, typename T1>\nstruct is_basevec< subview_elem1<eT,T1> >\n  { static const bool value = true; };\n\ntemplate<typename eT, typename T1>\nstruct is_basevec< const subview_elem1<eT,T1> >\n  { static const bool value = true; };\n\n\n//\n//\n//\n\n\n\ntemplate<typename T1>\nstruct is_arma_type\n  {\n  static const bool value\n  =  is_Mat<T1>::value\n  || is_Gen<T1>::value\n  || is_Op<T1>::value\n  || is_Glue<T1>::value\n  || is_eOp<T1>::value\n  || is_eGlue<T1>::value\n  || is_mtOp<T1>::value\n  || is_mtGlue<T1>::value\n  || is_diagview<T1>::value\n  || is_subview<T1>::value\n  || is_subview_row<T1>::value\n  || is_subview_col<T1>::value\n  || is_subview_elem1<T1>::value\n  || is_subview_elem2<T1>::value\n  ;\n  };\n\n\n\ntemplate<typename T1>\nstruct is_arma_cube_type\n  {\n  static const bool value\n  =  is_Cube<T1>::value\n  || is_GenCube<T1>::value\n  || is_OpCube<T1>::value\n  || is_eOpCube<T1>::value\n  || is_mtOpCube<T1>::value\n  || is_GlueCube<T1>::value\n  || is_eGlueCube<T1>::value\n  || is_mtGlueCube<T1>::value\n  || is_subview_cube<T1>::value\n  ;\n  };\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename T>\nstruct is_SpMat\n  { static const bool value = false; };\n\ntemplate<typename eT>\nstruct is_SpMat< SpMat<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_SpMat< SpCol<eT> >\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_SpMat< SpRow<eT> >\n  { static const bool value = true; };\n\n\n\ntemplate<typename T>\nstruct is_SpRow\n  { static const bool value = false; };\n\ntemplate<typename eT>\nstruct is_SpRow< SpRow<eT> >\n  { static const bool value = true; };\n\n\n\ntemplate<typename T>\nstruct is_SpCol\n  { static const bool value = false; };\n\ntemplate<typename eT>\nstruct is_SpCol< SpCol<eT> >\n  { static const bool value = true; };\n\n\n\ntemplate<typename T>\nstruct is_SpSubview\n  { static const bool value = false; };\n\ntemplate<typename eT>\nstruct is_SpSubview< SpSubview<eT> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_SpOp\n  { static const bool value = false; };\n \ntemplate<typename T1, typename op_type>\nstruct is_SpOp< SpOp<T1,op_type> >\n  { static const bool value = true; };\n\n\ntemplate<typename T>\nstruct is_SpGlue\n  { static const bool value = false; };\n \ntemplate<typename T1, typename T2, typename glue_type>\nstruct is_SpGlue< SpGlue<T1,T2,glue_type> >\n  { static const bool value = true; };\n \n\ntemplate<typename T>\nstruct is_mtSpOp\n  { static const bool value = false; };\n \ntemplate<typename eT, typename T1, typename spop_type>\nstruct is_mtSpOp< mtSpOp<eT, T1, spop_type> >\n  { static const bool value = true; };\n \n\n\ntemplate<typename T1>\nstruct is_arma_sparse_type\n  {\n  static const bool value\n  =  is_SpMat<T1>::value\n  || is_SpSubview<T1>::value\n  || is_SpOp<T1>::value\n  || is_SpGlue<T1>::value\n  || is_mtSpOp<T1>::value\n  ;\n  };\n\n\n\n//\n//\n//\n\n\ntemplate<typename T1, typename T2>\nstruct is_same_type\n  {\n  static const bool value = false;\n  static const bool yes   = false;\n  static const bool no    = true;\n  };\n\n\ntemplate<typename T1>\nstruct is_same_type<T1,T1>\n  {\n  static const bool value = true;\n  static const bool yes   = true;\n  static const bool no    = false;\n  };\n\n\n\n//\n//\n//\n\n\ntemplate<typename T1>\nstruct is_u8\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_u8<u8>\n  { static const bool value = true; };\n\n\n\ntemplate<typename T1>\nstruct is_s8\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_s8<s8>\n  { static const bool value = true; };\n\n\n\ntemplate<typename T1>\nstruct is_u16\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_u16<u16>\n  { static const bool value = true; };\n\n\n\ntemplate<typename T1>\nstruct is_s16\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_s16<s16>\n  { static const bool value = true; };\n\n\n\ntemplate<typename T1>\nstruct is_u32\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_u32<u32>\n  { static const bool value = true; };\n\n\n\ntemplate<typename T1>\nstruct is_s32\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_s32<s32>\n  { static const bool value = true; };\n\n\n\n#if defined(ARMA_USE_U64S64)\n  template<typename T1>\n  struct is_u64\n    { static const bool value = false; };\n\n  template<>\n  struct is_u64<u64>\n    { static const bool value = true; };\n  \n  \n  template<typename T1>\n  struct is_s64\n    { static const bool value = false; };\n\n  template<>\n  struct is_s64<s64>\n    { static const bool value = true; };\n#endif\n\n\n\ntemplate<typename T1>\nstruct is_ulng_t\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_ulng_t<ulng_t>\n  { static const bool value = true; };\n\n\n\ntemplate<typename T1>\nstruct is_slng_t\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_slng_t<slng_t>\n  { static const bool value = true; };\n\n\n\ntemplate<typename T1>\nstruct is_ulng_t_32\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_ulng_t_32<ulng_t>\n  { static const bool value = (sizeof(ulng_t) == 4); };\n\n\n\ntemplate<typename T1>\nstruct is_slng_t_32\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_slng_t_32<slng_t>\n  { static const bool value = (sizeof(slng_t) == 4); };\n\n\n\ntemplate<typename T1>\nstruct is_ulng_t_64\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_ulng_t_64<ulng_t>\n  { static const bool value = (sizeof(ulng_t) == 8); };\n\n\n\ntemplate<typename T1>\nstruct is_slng_t_64\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_slng_t_64<slng_t>\n  { static const bool value = (sizeof(slng_t) == 8); };\n\n\n\ntemplate<typename T1>\nstruct is_uword\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_uword<uword>\n  { static const bool value = true; };\n\n\n\ntemplate<typename T1>\nstruct is_sword\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_sword<sword>\n  { static const bool value = true; };\n\n\n\ntemplate<typename T1>\nstruct is_float\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_float<float>\n  { static const bool value = true; };\n\n\n\ntemplate<typename T1>\nstruct is_double\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_double<double>\n  { static const bool value = true; };\n\n\n\ntemplate<typename T1>\nstruct is_real\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_real<float>\n  { static const bool value = true; };\n  \ntemplate<>\nstruct is_real<double>\n  { static const bool value = true; };\n\n\n\n\ntemplate<typename T1>\nstruct is_not_complex\n  { static const bool value = true; };\n\ntemplate<typename eT>\nstruct is_not_complex< std::complex<eT> >\n  { static const bool value = false; };\n\n\n\ntemplate<typename T1>\nstruct is_complex\n  { static const bool value = false; };\n\n// template<>\ntemplate<typename eT>\nstruct is_complex< std::complex<eT> >\n  { static const bool value = true; };\n\n\n\ntemplate<typename T1>\nstruct is_complex_float\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_complex_float< std::complex<float> >\n  { static const bool value = true; };\n\n\n\ntemplate<typename T1>\nstruct is_complex_double\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_complex_double< std::complex<double> >\n  { static const bool value = true; };\n\n\n\ntemplate<typename T1>\nstruct is_complex_strict\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_complex_strict< std::complex<float> >\n  { static const bool value = true; };\n\ntemplate<>\nstruct is_complex_strict< std::complex<double> >\n  { static const bool value = true; };\n\n\n\ntemplate<typename T1>\nstruct is_cx\n  {\n  static const bool value = false;\n  static const bool yes   = false;\n  static const bool no    = true;\n  };\n\n// template<>\ntemplate<typename T>\nstruct is_cx< std::complex<T> >\n  {\n  static const bool value = true;\n  static const bool yes   = true;\n  static const bool no    = false;\n  };\n\n\n\n//! check for a weird implementation of the std::complex class\ntemplate<typename T1>\nstruct is_supported_complex\n  { static const bool value = false; };\n\n//template<>\ntemplate<typename eT>\nstruct is_supported_complex< std::complex<eT> >\n  { static const bool value = ( sizeof(std::complex<eT>) == 2*sizeof(eT) ); };\n\n\n\ntemplate<typename T1>\nstruct is_supported_complex_float\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_supported_complex_float< std::complex<float> >\n  { static const bool value = ( sizeof(std::complex<float>) == 2*sizeof(float) ); };\n\n\n\ntemplate<typename T1>\nstruct is_supported_complex_double\n  { static const bool value = false; };\n\ntemplate<>\nstruct is_supported_complex_double< std::complex<double> >\n  { static const bool value = ( sizeof(std::complex<double>) == 2*sizeof(double) ); };\n\n\n\ntemplate<typename T1>\nstruct is_supported_elem_type\n  {\n  static const bool value = \\\n    is_u8<T1>::value ||\n    is_s8<T1>::value ||\n    is_u16<T1>::value ||\n    is_s16<T1>::value ||\n    is_u32<T1>::value ||\n    is_s32<T1>::value ||\n#if defined(ARMA_USE_U64S64)\n    is_u64<T1>::value ||\n    is_s64<T1>::value ||\n#endif\n#if defined(ARMA_ALLOW_LONG)\n    is_ulng_t<T1>::value ||\n    is_slng_t<T1>::value ||\n#endif\n    is_float<T1>::value ||\n    is_double<T1>::value ||\n    is_supported_complex_float<T1>::value ||\n    is_supported_complex_double<T1>::value;\n  };\n\n\n\ntemplate<typename T1>\nstruct is_supported_blas_type\n  {\n  static const bool value = \\\n    is_float<T1>::value ||\n    is_double<T1>::value ||\n    is_supported_complex_float<T1>::value ||\n    is_supported_complex_double<T1>::value;\n  };\n\n\n\ntemplate<typename T>\nstruct is_signed\n  {\n  static const bool value = true;\n  };\n\n\ntemplate<> struct is_signed<u8>     { static const bool value = false; };\ntemplate<> struct is_signed<u16>    { static const bool value = false; };\ntemplate<> struct is_signed<u32>    { static const bool value = false; };\n#if defined(ARMA_USE_U64S64)\ntemplate<> struct is_signed<u64>    { static const bool value = false; };\n#endif\n#if defined(ARMA_ALLOW_LONG)\ntemplate<> struct is_signed<ulng_t> { static const bool value = false; };\n#endif\n\n\ntemplate<typename T>\nstruct is_non_integral\n  {\n  static const bool value = false;\n  };\n\n\ntemplate<> struct is_non_integral<              float   > { static const bool value = true; };\ntemplate<> struct is_non_integral<              double  > { static const bool value = true; };\ntemplate<> struct is_non_integral< std::complex<float>  > { static const bool value = true; };\ntemplate<> struct is_non_integral< std::complex<double> > { static const bool value = true; };\n\n\n\n\n//\n\nclass arma_junk_class;\n\ntemplate<typename T1, typename T2>\nstruct force_different_type\n  {\n  typedef T1 T1_result;\n  typedef T2 T2_result;\n  };\n  \n\ntemplate<typename T1>\nstruct force_different_type<T1,T1>\n  {\n  typedef T1              T1_result;\n  typedef arma_junk_class T2_result;\n  };\n  \n  \n\n//\n\n\ntemplate<typename T1>\nstruct resolves_to_vector_default { static const bool value = false;                    };\n\ntemplate<typename T1>\nstruct resolves_to_vector_test    { static const bool value = T1::is_col || T1::is_row; };\n\n\ntemplate<typename T1, bool condition>\nstruct resolves_to_vector_redirect {};\n\ntemplate<typename T1>\nstruct resolves_to_vector_redirect<T1, false> { typedef resolves_to_vector_default<T1> result; };\n\ntemplate<typename T1>\nstruct resolves_to_vector_redirect<T1, true>  { typedef resolves_to_vector_test<T1>    result; };\n\n\ntemplate<typename T1>\nstruct resolves_to_vector : public resolves_to_vector_redirect<T1, is_arma_type<T1>::value>::result {};\n\ntemplate<typename T1>\nstruct resolves_to_sparse_vector : public resolves_to_vector_redirect<T1, is_arma_sparse_type<T1>::value>::result {};\n\n//\n\ntemplate<typename T1>\nstruct resolves_to_rowvector_default { static const bool value = false;      };\n\ntemplate<typename T1>\nstruct resolves_to_rowvector_test    { static const bool value = T1::is_row; };\n\n\ntemplate<typename T1, bool condition>\nstruct resolves_to_rowvector_redirect {};\n\ntemplate<typename T1>\nstruct resolves_to_rowvector_redirect<T1, false> { typedef resolves_to_rowvector_default<T1> result; };\n\ntemplate<typename T1>\nstruct resolves_to_rowvector_redirect<T1, true>  { typedef resolves_to_rowvector_test<T1>    result; };\n\n\ntemplate<typename T1>\nstruct resolves_to_rowvector : public resolves_to_rowvector_redirect<T1, is_arma_type<T1>::value>::result {};\n\n//\n\ntemplate<typename T1>\nstruct resolves_to_colvector_default { static const bool value = false;      };\n\ntemplate<typename T1>\nstruct resolves_to_colvector_test    { static const bool value = T1::is_col; };\n\n\ntemplate<typename T1, bool condition>\nstruct resolves_to_colvector_redirect {};\n\ntemplate<typename T1>\nstruct resolves_to_colvector_redirect<T1, false> { typedef resolves_to_colvector_default<T1> result; };\n\ntemplate<typename T1>\nstruct resolves_to_colvector_redirect<T1, true>  { typedef resolves_to_colvector_test<T1>    result; };\n\n\ntemplate<typename T1>\nstruct resolves_to_colvector : public resolves_to_colvector_redirect<T1, is_arma_type<T1>::value>::result {};\n\n\n\ntemplate<typename glue_type> struct is_glue_mixed_times                   { static const bool value = false; };\ntemplate<>                   struct is_glue_mixed_times<glue_mixed_times> { static const bool value = true;  };\n\n\n\ntemplate<typename glue_type> struct is_glue_mixed_elem { static const bool value = false; };\n\ntemplate<>                   struct is_glue_mixed_elem<glue_mixed_plus>  { static const bool value = true;  };\ntemplate<>                   struct is_glue_mixed_elem<glue_mixed_minus> { static const bool value = true;  };\ntemplate<>                   struct is_glue_mixed_elem<glue_mixed_div>   { static const bool value = true;  };\ntemplate<>                   struct is_glue_mixed_elem<glue_mixed_schur> { static const bool value = true;  };\n\ntemplate<>                   struct is_glue_mixed_elem<glue_rel_lt>    { static const bool value = true; };\ntemplate<>                   struct is_glue_mixed_elem<glue_rel_gt>    { static const bool value = true; };\ntemplate<>                   struct is_glue_mixed_elem<glue_rel_lteq>  { static const bool value = true; };\ntemplate<>                   struct is_glue_mixed_elem<glue_rel_gteq>  { static const bool value = true; };\ntemplate<>                   struct is_glue_mixed_elem<glue_rel_eq>    { static const bool value = true; };\ntemplate<>                   struct is_glue_mixed_elem<glue_rel_noteq> { static const bool value = true; };\ntemplate<>                   struct is_glue_mixed_elem<glue_rel_and>   { static const bool value = true; };\ntemplate<>                   struct is_glue_mixed_elem<glue_rel_or>    { static const bool value = true; };\n\n\n\ntemplate<typename op_type> struct is_op_mixed_elem { static const bool value = false; };\n\ntemplate<>                 struct is_op_mixed_elem<op_cx_scalar_times>      { static const bool value = true; };\ntemplate<>                 struct is_op_mixed_elem<op_cx_scalar_plus>       { static const bool value = true; };\ntemplate<>                 struct is_op_mixed_elem<op_cx_scalar_minus_pre>  { static const bool value = true; };\ntemplate<>                 struct is_op_mixed_elem<op_cx_scalar_minus_post> { static const bool value = true; };\ntemplate<>                 struct is_op_mixed_elem<op_cx_scalar_div_pre>    { static const bool value = true; };\ntemplate<>                 struct is_op_mixed_elem<op_cx_scalar_div_post>   { static const bool value = true; };\n\ntemplate<>                 struct is_op_mixed_elem<op_rel_lt_pre>    { static const bool value = true; };\ntemplate<>                 struct is_op_mixed_elem<op_rel_lt_post>   { static const bool value = true; };\ntemplate<>                 struct is_op_mixed_elem<op_rel_gt_pre>    { static const bool value = true; };\ntemplate<>                 struct is_op_mixed_elem<op_rel_gt_post>   { static const bool value = true; };\ntemplate<>                 struct is_op_mixed_elem<op_rel_lteq_pre>  { static const bool value = true; };\ntemplate<>                 struct is_op_mixed_elem<op_rel_lteq_post> { static const bool value = true; };\ntemplate<>                 struct is_op_mixed_elem<op_rel_gteq_pre>  { static const bool value = true; };\ntemplate<>                 struct is_op_mixed_elem<op_rel_gteq_post> { static const bool value = true; };\ntemplate<>                 struct is_op_mixed_elem<op_rel_eq>        { static const bool value = true; };\ntemplate<>                 struct is_op_mixed_elem<op_rel_noteq>     { static const bool value = true; };\n\n\n\ntemplate<typename spop_type> struct is_spop_elem                    { static const bool value = false; };\ntemplate<>                   struct is_spop_elem<spop_scalar_times> { static const bool value = true;  };\n\n\ntemplate<typename spglue_type> struct is_spglue_elem                { static const bool value = false; };\ntemplate<>                     struct is_spglue_elem<spglue_plus>   { static const bool value = true;  };\ntemplate<>                     struct is_spglue_elem<spglue_plus2>  { static const bool value = true;  };\ntemplate<>                     struct is_spglue_elem<spglue_minus>  { static const bool value = true;  };\ntemplate<>                     struct is_spglue_elem<spglue_minus2> { static const bool value = true;  };\n\n\ntemplate<typename spglue_type> struct is_spglue_times               { static const bool value = false; };\ntemplate<>                     struct is_spglue_times<spglue_times> { static const bool value = true;  };\n\n\ntemplate<typename spglue_type> struct is_spglue_times2               { static const bool value = false; };\ntemplate<>                     struct is_spglue_times<spglue_times2> { static const bool value = true;  };\n\n\n\ntemplate<typename T1>\nstruct is_outer_product\n  { static const bool value = false; };\n\ntemplate<typename T1, typename T2>\nstruct is_outer_product< Glue<T1,T2,glue_times> >\n  { static const bool value = (resolves_to_colvector<T1>::value && resolves_to_rowvector<T2>::value); };\n\n\n\ntemplate<typename T1>\nstruct has_op_inv\n  { static const bool value = false; };\n\ntemplate<typename T1>\nstruct has_op_inv< Op<T1,op_inv> >\n  { static const bool value = true;  };\n\ntemplate<typename T1, typename T2>\nstruct has_op_inv< Glue<Op<T1,op_inv>, T2, glue_times> >\n  { static const bool value = true;  };\n\ntemplate<typename T1, typename T2>\nstruct has_op_inv< Glue<T1, Op<T2,op_inv>, glue_times> >\n  { static const bool value = true;  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/typedef_elem.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup typedef_elem\n//! @{\n\n\n#if   UCHAR_MAX >= 0xff\n  typedef unsigned char    u8;\n  typedef          char    s8;\n#elif defined(UINT8_MAX)\n  typedef          uint8_t u8;\n  typedef           int8_t s8;\n#else\n  #error \"don't know how to typedef 'u8' on this system\"\n#endif\n\n// NOTE:\n// \"signed char\" is not the same as \"char\". \n// http://www.embedded.com/columns/programmingpointers/206107018\n// http://en.wikipedia.org/wiki/C_variable_types_and_declarations\n\n\n#if   USHRT_MAX >= 0xffff\n  typedef unsigned short    u16;\n  typedef          short    s16;\n#elif defined(UINT16_MAX)\n  typedef          uint16_t u16;\n  typedef           int16_t s16;\n#else\n  #error \"don't know how to typedef 'u16' on this system\"\n#endif\n\n\n#if   UINT_MAX  >= 0xffffffff\n  typedef unsigned int      u32;\n  typedef          int      s32;\n#elif defined(UINT32_MAX)\n  typedef          uint32_t u32;\n  typedef           int32_t s32;\n#else\n  #error \"don't know how to typedef 'u32' on this system\"\n#endif\n\n\n#if defined(ARMA_USE_U64S64)\n  #if   ULLONG_MAX >= 0xffffffffffffffff\n    typedef unsigned long long u64;\n    typedef          long long s64;\n  #elif ULONG_MAX  >= 0xffffffffffffffff\n    typedef unsigned long      u64;\n    typedef          long      s64;\n    #define ARMA_U64_IS_LONG\n  #elif defined(UINT64_MAX)\n    typedef          uint64_t  u64;\n    typedef           int64_t  s64;\n  #else\n      #error \"don't know how to typedef 'u64' on this system; please disable ARMA_64BIT_WORD\"\n  #endif\n#endif\n\n\n#if !defined(ARMA_USE_U64S64) || (defined(ARMA_USE_U64S64) && !defined(ARMA_U64_IS_LONG))\n  #define ARMA_ALLOW_LONG\n#endif\n\n\ntypedef unsigned long ulng_t;\ntypedef          long slng_t;\n\n\n#if defined(ARMA_64BIT_WORD)\n  typedef u64 uword;\n  typedef s64 sword;\n  \n  typedef u32 uhword;\n  typedef s32 shword;\n\n  #define ARMA_MAX_UWORD  0xffffffffffffffff\n  #define ARMA_MAX_UHWORD 0xffffffff\n#else\n  typedef u32 uword;\n  typedef s32 sword;\n\n  typedef u16 uhword;\n  typedef s16 shword;\n  \n  #define ARMA_MAX_UWORD  0xffffffff\n  #define ARMA_MAX_UHWORD 0xffff\n#endif\n\n\n#if   defined(ARMA_BLAS_LONG_LONG)\n  typedef long long blas_int;\n  #define ARMA_MAX_BLAS_INT 0x7fffffffffffffffULL\n#elif defined(ARMA_BLAS_LONG)\n  typedef long      blas_int;\n  #define ARMA_MAX_BLAS_INT 0x7fffffffffffffffUL\n#else\n  typedef int       blas_int;\n  #define ARMA_MAX_BLAS_INT 0x7fffffffU\n#endif\n\n\ntypedef std::complex<float>  cx_float;\ntypedef std::complex<double> cx_double;\n\ntypedef void* void_ptr;\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/typedef_elem_check.hpp",
    "content": "// Copyright (C) 2008-2014 Conrad Sanderson\n// Copyright (C) 2008-2014 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup typedef_elem\n//! @{\n\n\nnamespace junk\n  {\n  struct arma_elem_size_test\n    {\n    \n    // arma_static_check( (sizeof(size_t) < sizeof(uword)),  ERROR___TYPE_SIZE_T_IS_SMALLER_THAN_UWORD );\n    \n    arma_static_check( (sizeof(u8) != 1), ERROR___TYPE_U8_HAS_UNSUPPORTED_SIZE );\n    arma_static_check( (sizeof(s8) != 1), ERROR___TYPE_S8_HAS_UNSUPPORTED_SIZE );\n    \n    arma_static_check( (sizeof(u16) != 2), ERROR___TYPE_U16_HAS_UNSUPPORTED_SIZE );\n    arma_static_check( (sizeof(s16) != 2), ERROR___TYPE_S16_HAS_UNSUPPORTED_SIZE );\n    \n    arma_static_check( (sizeof(u32) != 4), ERROR___TYPE_U32_HAS_UNSUPPORTED_SIZE );\n    arma_static_check( (sizeof(s32) != 4), ERROR___TYPE_S32_HAS_UNSUPPORTED_SIZE );\n    \n    #if defined(ARMA_USE_U64S64)\n      arma_static_check( (sizeof(u64) != 8), ERROR___TYPE_U64_HAS_UNSUPPORTED_SIZE );\n      arma_static_check( (sizeof(s64) != 8), ERROR___TYPE_S64_HAS_UNSUPPORTED_SIZE );\n    #endif\n    \n    arma_static_check( (sizeof(float)  != 4), ERROR___TYPE_FLOAT_HAS_UNSUPPORTED_SIZE );\n    arma_static_check( (sizeof(double) != 8), ERROR___TYPE_DOUBLE_HAS_UNSUPPORTED_SIZE );\n    \n    arma_static_check( (sizeof(std::complex<float>)  != 8),  ERROR___TYPE_COMPLEX_FLOAT_HAS_UNSUPPORTED_SIZE );\n    arma_static_check( (sizeof(std::complex<double>) != 16), ERROR___TYPE_COMPLEX_DOUBLE_HAS_UNSUPPORTED_SIZE );\n    \n    };\n  }\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/typedef_mat.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup typedef_mat\n//! @{\n\n\ntypedef Mat <unsigned char> uchar_mat;\ntypedef Col <unsigned char> uchar_vec;\ntypedef Col <unsigned char> uchar_colvec;\ntypedef Row <unsigned char> uchar_rowvec;\ntypedef Cube<unsigned char> uchar_cube;\n\ntypedef Mat <u32> u32_mat;\ntypedef Col <u32> u32_vec;\ntypedef Col <u32> u32_colvec;\ntypedef Row <u32> u32_rowvec;\ntypedef Cube<u32> u32_cube;\n\ntypedef Mat <s32> s32_mat;\ntypedef Col <s32> s32_vec;\ntypedef Col <s32> s32_colvec;\ntypedef Row <s32> s32_rowvec;\ntypedef Cube<s32> s32_cube;\n\n#if defined(ARMA_USE_U64S64)\n  typedef Mat <u64> u64_mat;\n  typedef Col <u64> u64_vec;\n  typedef Col <u64> u64_colvec;\n  typedef Row <u64> u64_rowvec;\n  typedef Cube<u64> u64_cube;\n\n  typedef Mat <s64> s64_mat;\n  typedef Col <s64> s64_vec;\n  typedef Col <s64> s64_colvec;\n  typedef Row <s64> s64_rowvec;\n  typedef Cube<s64> s64_cube;\n#endif\n\ntypedef Mat <uword> umat;\ntypedef Col <uword> uvec;\ntypedef Col <uword> ucolvec;\ntypedef Row <uword> urowvec;\ntypedef Cube<uword> ucube;\n\ntypedef Mat <sword> imat;\ntypedef Col <sword> ivec;\ntypedef Col <sword> icolvec;\ntypedef Row <sword> irowvec;\ntypedef Cube<sword> icube;\n\ntypedef Mat <float> fmat;\ntypedef Col <float> fvec;\ntypedef Col <float> fcolvec;\ntypedef Row <float> frowvec;\ntypedef Cube<float> fcube;\n\ntypedef Mat <double> mat;\ntypedef Col <double> vec;\ntypedef Col <double> colvec;\ntypedef Row <double> rowvec;\ntypedef Cube<double> cube;\n\ntypedef Mat <cx_float> cx_fmat;\ntypedef Col <cx_float> cx_fvec;\ntypedef Col <cx_float> cx_fcolvec;\ntypedef Row <cx_float> cx_frowvec;\ntypedef Cube<cx_float> cx_fcube;\n\ntypedef Mat <cx_double> cx_mat;\ntypedef Col <cx_double> cx_vec;\ntypedef Col <cx_double> cx_colvec;\ntypedef Row <cx_double> cx_rowvec;\ntypedef Cube<cx_double> cx_cube;\n\n\n\ntypedef SpMat <uword> sp_umat;\ntypedef SpCol <uword> sp_uvec;\ntypedef SpCol <uword> sp_ucolvec;\ntypedef SpRow <uword> sp_urowvec;\n\ntypedef SpMat <sword> sp_imat;\ntypedef SpCol <sword> sp_ivec;\ntypedef SpCol <sword> sp_icolvec;\ntypedef SpRow <sword> sp_irowvec;\n\ntypedef SpMat <float> sp_fmat;\ntypedef SpCol <float> sp_fvec;\ntypedef SpCol <float> sp_fcolvec;\ntypedef SpRow <float> sp_frowvec;\n\ntypedef SpMat <double> sp_mat;\ntypedef SpCol <double> sp_vec;\ntypedef SpCol <double> sp_colvec;\ntypedef SpRow <double> sp_rowvec;\n\ntypedef SpMat <cx_float> sp_cx_fmat;\ntypedef SpCol <cx_float> sp_cx_fvec;\ntypedef SpCol <cx_float> sp_cx_fcolvec;\ntypedef SpRow <cx_float> sp_cx_frowvec;\n\ntypedef SpMat <cx_double> sp_cx_mat;\ntypedef SpCol <cx_double> sp_cx_vec;\ntypedef SpCol <cx_double> sp_cx_colvec;\ntypedef SpRow <cx_double> sp_cx_rowvec;\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/typedef_mat_fixed.hpp",
    "content": "// Copyright (C) 2010 Conrad Sanderson\n// Copyright (C) 2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup typedef_mat_fixed\n//! @{\n\n\n\ntypedef umat::fixed<2,2> umat22;\ntypedef umat::fixed<3,3> umat33;\ntypedef umat::fixed<4,4> umat44;\ntypedef umat::fixed<5,5> umat55;\ntypedef umat::fixed<6,6> umat66;\ntypedef umat::fixed<7,7> umat77;\ntypedef umat::fixed<8,8> umat88;\ntypedef umat::fixed<9,9> umat99;\n\ntypedef imat::fixed<2,2> imat22;\ntypedef imat::fixed<3,3> imat33;\ntypedef imat::fixed<4,4> imat44;\ntypedef imat::fixed<5,5> imat55;\ntypedef imat::fixed<6,6> imat66;\ntypedef imat::fixed<7,7> imat77;\ntypedef imat::fixed<8,8> imat88;\ntypedef imat::fixed<9,9> imat99;\n\ntypedef fmat::fixed<2,2> fmat22;\ntypedef fmat::fixed<3,3> fmat33;\ntypedef fmat::fixed<4,4> fmat44;\ntypedef fmat::fixed<5,5> fmat55;\ntypedef fmat::fixed<6,6> fmat66;\ntypedef fmat::fixed<7,7> fmat77;\ntypedef fmat::fixed<8,8> fmat88;\ntypedef fmat::fixed<9,9> fmat99;\n\ntypedef mat::fixed<2,2> mat22;\ntypedef mat::fixed<3,3> mat33;\ntypedef mat::fixed<4,4> mat44;\ntypedef mat::fixed<5,5> mat55;\ntypedef mat::fixed<6,6> mat66;\ntypedef mat::fixed<7,7> mat77;\ntypedef mat::fixed<8,8> mat88;\ntypedef mat::fixed<9,9> mat99;\n\ntypedef cx_fmat::fixed<2,2> cx_fmat22;\ntypedef cx_fmat::fixed<3,3> cx_fmat33;\ntypedef cx_fmat::fixed<4,4> cx_fmat44;\ntypedef cx_fmat::fixed<5,5> cx_fmat55;\ntypedef cx_fmat::fixed<6,6> cx_fmat66;\ntypedef cx_fmat::fixed<7,7> cx_fmat77;\ntypedef cx_fmat::fixed<8,8> cx_fmat88;\ntypedef cx_fmat::fixed<9,9> cx_fmat99;\n\ntypedef cx_mat::fixed<2,2> cx_mat22;\ntypedef cx_mat::fixed<3,3> cx_mat33;\ntypedef cx_mat::fixed<4,4> cx_mat44;\ntypedef cx_mat::fixed<5,5> cx_mat55;\ntypedef cx_mat::fixed<6,6> cx_mat66;\ntypedef cx_mat::fixed<7,7> cx_mat77;\ntypedef cx_mat::fixed<8,8> cx_mat88;\ntypedef cx_mat::fixed<9,9> cx_mat99;\n\n\n//\n\n\ntypedef uvec::fixed<2> uvec2;\ntypedef uvec::fixed<3> uvec3;\ntypedef uvec::fixed<4> uvec4;\ntypedef uvec::fixed<5> uvec5;\ntypedef uvec::fixed<6> uvec6;\ntypedef uvec::fixed<7> uvec7;\ntypedef uvec::fixed<8> uvec8;\ntypedef uvec::fixed<9> uvec9;\n\ntypedef ivec::fixed<2> ivec2;\ntypedef ivec::fixed<3> ivec3;\ntypedef ivec::fixed<4> ivec4;\ntypedef ivec::fixed<5> ivec5;\ntypedef ivec::fixed<6> ivec6;\ntypedef ivec::fixed<7> ivec7;\ntypedef ivec::fixed<8> ivec8;\ntypedef ivec::fixed<9> ivec9;\n\ntypedef fvec::fixed<2> fvec2;\ntypedef fvec::fixed<3> fvec3;\ntypedef fvec::fixed<4> fvec4;\ntypedef fvec::fixed<5> fvec5;\ntypedef fvec::fixed<6> fvec6;\ntypedef fvec::fixed<7> fvec7;\ntypedef fvec::fixed<8> fvec8;\ntypedef fvec::fixed<9> fvec9;\n\ntypedef vec::fixed<2> vec2;\ntypedef vec::fixed<3> vec3;\ntypedef vec::fixed<4> vec4;\ntypedef vec::fixed<5> vec5;\ntypedef vec::fixed<6> vec6;\ntypedef vec::fixed<7> vec7;\ntypedef vec::fixed<8> vec8;\ntypedef vec::fixed<9> vec9;\n\ntypedef cx_fvec::fixed<2> cx_fvec2;\ntypedef cx_fvec::fixed<3> cx_fvec3;\ntypedef cx_fvec::fixed<4> cx_fvec4;\ntypedef cx_fvec::fixed<5> cx_fvec5;\ntypedef cx_fvec::fixed<6> cx_fvec6;\ntypedef cx_fvec::fixed<7> cx_fvec7;\ntypedef cx_fvec::fixed<8> cx_fvec8;\ntypedef cx_fvec::fixed<9> cx_fvec9;\n\ntypedef cx_vec::fixed<2> cx_vec2;\ntypedef cx_vec::fixed<3> cx_vec3;\ntypedef cx_vec::fixed<4> cx_vec4;\ntypedef cx_vec::fixed<5> cx_vec5;\ntypedef cx_vec::fixed<6> cx_vec6;\ntypedef cx_vec::fixed<7> cx_vec7;\ntypedef cx_vec::fixed<8> cx_vec8;\ntypedef cx_vec::fixed<9> cx_vec9;\n\n\n//\n\n\ntypedef ucolvec::fixed<2> ucolvec2;\ntypedef ucolvec::fixed<3> ucolvec3;\ntypedef ucolvec::fixed<4> ucolvec4;\ntypedef ucolvec::fixed<5> ucolvec5;\ntypedef ucolvec::fixed<6> ucolvec6;\ntypedef ucolvec::fixed<7> ucolvec7;\ntypedef ucolvec::fixed<8> ucolvec8;\ntypedef ucolvec::fixed<9> ucolvec9;\n\ntypedef icolvec::fixed<2> icolvec2;\ntypedef icolvec::fixed<3> icolvec3;\ntypedef icolvec::fixed<4> icolvec4;\ntypedef icolvec::fixed<5> icolvec5;\ntypedef icolvec::fixed<6> icolvec6;\ntypedef icolvec::fixed<7> icolvec7;\ntypedef icolvec::fixed<8> icolvec8;\ntypedef icolvec::fixed<9> icolvec9;\n\ntypedef fcolvec::fixed<2> fcolvec2;\ntypedef fcolvec::fixed<3> fcolvec3;\ntypedef fcolvec::fixed<4> fcolvec4;\ntypedef fcolvec::fixed<5> fcolvec5;\ntypedef fcolvec::fixed<6> fcolvec6;\ntypedef fcolvec::fixed<7> fcolvec7;\ntypedef fcolvec::fixed<8> fcolvec8;\ntypedef fcolvec::fixed<9> fcolvec9;\n\ntypedef colvec::fixed<2> colvec2;\ntypedef colvec::fixed<3> colvec3;\ntypedef colvec::fixed<4> colvec4;\ntypedef colvec::fixed<5> colvec5;\ntypedef colvec::fixed<6> colvec6;\ntypedef colvec::fixed<7> colvec7;\ntypedef colvec::fixed<8> colvec8;\ntypedef colvec::fixed<9> colvec9;\n\ntypedef cx_fcolvec::fixed<2> cx_fcolvec2;\ntypedef cx_fcolvec::fixed<3> cx_fcolvec3;\ntypedef cx_fcolvec::fixed<4> cx_fcolvec4;\ntypedef cx_fcolvec::fixed<5> cx_fcolvec5;\ntypedef cx_fcolvec::fixed<6> cx_fcolvec6;\ntypedef cx_fcolvec::fixed<7> cx_fcolvec7;\ntypedef cx_fcolvec::fixed<8> cx_fcolvec8;\ntypedef cx_fcolvec::fixed<9> cx_fcolvec9;\n\ntypedef cx_colvec::fixed<2> cx_colvec2;\ntypedef cx_colvec::fixed<3> cx_colvec3;\ntypedef cx_colvec::fixed<4> cx_colvec4;\ntypedef cx_colvec::fixed<5> cx_colvec5;\ntypedef cx_colvec::fixed<6> cx_colvec6;\ntypedef cx_colvec::fixed<7> cx_colvec7;\ntypedef cx_colvec::fixed<8> cx_colvec8;\ntypedef cx_colvec::fixed<9> cx_colvec9;\n\n\n//\n\n\ntypedef urowvec::fixed<2> urowvec2;\ntypedef urowvec::fixed<3> urowvec3;\ntypedef urowvec::fixed<4> urowvec4;\ntypedef urowvec::fixed<5> urowvec5;\ntypedef urowvec::fixed<6> urowvec6;\ntypedef urowvec::fixed<7> urowvec7;\ntypedef urowvec::fixed<8> urowvec8;\ntypedef urowvec::fixed<9> urowvec9;\n\ntypedef irowvec::fixed<2> irowvec2;\ntypedef irowvec::fixed<3> irowvec3;\ntypedef irowvec::fixed<4> irowvec4;\ntypedef irowvec::fixed<5> irowvec5;\ntypedef irowvec::fixed<6> irowvec6;\ntypedef irowvec::fixed<7> irowvec7;\ntypedef irowvec::fixed<8> irowvec8;\ntypedef irowvec::fixed<9> irowvec9;\n\ntypedef frowvec::fixed<2> frowvec2;\ntypedef frowvec::fixed<3> frowvec3;\ntypedef frowvec::fixed<4> frowvec4;\ntypedef frowvec::fixed<5> frowvec5;\ntypedef frowvec::fixed<6> frowvec6;\ntypedef frowvec::fixed<7> frowvec7;\ntypedef frowvec::fixed<8> frowvec8;\ntypedef frowvec::fixed<9> frowvec9;\n\ntypedef rowvec::fixed<2> rowvec2;\ntypedef rowvec::fixed<3> rowvec3;\ntypedef rowvec::fixed<4> rowvec4;\ntypedef rowvec::fixed<5> rowvec5;\ntypedef rowvec::fixed<6> rowvec6;\ntypedef rowvec::fixed<7> rowvec7;\ntypedef rowvec::fixed<8> rowvec8;\ntypedef rowvec::fixed<9> rowvec9;\n\ntypedef cx_frowvec::fixed<2> cx_frowvec2;\ntypedef cx_frowvec::fixed<3> cx_frowvec3;\ntypedef cx_frowvec::fixed<4> cx_frowvec4;\ntypedef cx_frowvec::fixed<5> cx_frowvec5;\ntypedef cx_frowvec::fixed<6> cx_frowvec6;\ntypedef cx_frowvec::fixed<7> cx_frowvec7;\ntypedef cx_frowvec::fixed<8> cx_frowvec8;\ntypedef cx_frowvec::fixed<9> cx_frowvec9;\n\ntypedef cx_rowvec::fixed<2> cx_rowvec2;\ntypedef cx_rowvec::fixed<3> cx_rowvec3;\ntypedef cx_rowvec::fixed<4> cx_rowvec4;\ntypedef cx_rowvec::fixed<5> cx_rowvec5;\ntypedef cx_rowvec::fixed<6> cx_rowvec6;\ntypedef cx_rowvec::fixed<7> cx_rowvec7;\ntypedef cx_rowvec::fixed<8> cx_rowvec8;\ntypedef cx_rowvec::fixed<9> cx_rowvec9;\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/unwrap.hpp",
    "content": "// Copyright (C) 2008-2015 Conrad Sanderson\n// Copyright (C) 2008-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup unwrap\n//! @{\n\n\n\ntemplate<typename T1>\nstruct unwrap_default\n  {\n  typedef typename T1::elem_type eT;\n  typedef Mat<eT>                stored_type;\n  \n  inline\n  unwrap_default(const T1& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const Mat<eT> M;\n  };\n\n\n\ntemplate<typename T1>\nstruct unwrap_fixed\n  {\n  typedef T1 stored_type;\n  \n  inline explicit\n  unwrap_fixed(const T1& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const T1& M;\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct unwrap_redirect {};\n\ntemplate<typename T1>\nstruct unwrap_redirect<T1, false> { typedef unwrap_default<T1> result; };\n\ntemplate<typename T1>\nstruct unwrap_redirect<T1, true>  { typedef unwrap_fixed<T1>   result; };\n\n\ntemplate<typename T1>\nstruct unwrap : public unwrap_redirect<T1, is_Mat_fixed<T1>::value >::result\n  {\n  inline\n  unwrap(const T1& A)\n    : unwrap_redirect< T1, is_Mat_fixed<T1>::value >::result(A)\n    {\n    }\n  };\n\n\n\ntemplate<typename eT>\nstruct unwrap< Mat<eT> >\n  {\n  typedef Mat<eT> stored_type;\n  \n  inline\n  unwrap(const Mat<eT>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const Mat<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct unwrap< Row<eT> >\n  {\n  typedef Row<eT> stored_type;\n  \n  inline\n  unwrap(const Row<eT>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const Row<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct unwrap< Col<eT> >\n  {\n  typedef Col<eT> stored_type;\n\n  inline\n  unwrap(const Col<eT>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const Col<eT>& M;\n  };\n\n\n\ntemplate<typename out_eT, typename T1, typename T2, typename glue_type>\nstruct unwrap< mtGlue<out_eT, T1, T2, glue_type> >\n  {\n  typedef Mat<out_eT> stored_type;\n  \n  inline\n  unwrap(const mtGlue<out_eT, T1, T2, glue_type>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const Mat<out_eT> M;\n  };\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\nstruct unwrap< mtOp<out_eT, T1, op_type> >\n  {\n  typedef Mat<out_eT> stored_type;\n  \n  inline\n  unwrap(const mtOp<out_eT, T1, op_type>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const Mat<out_eT> M;\n  };\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename T1>\nstruct quasi_unwrap_default\n  {\n  typedef typename T1::elem_type eT;\n  \n  static const bool has_subview = false;\n  \n  inline\n  quasi_unwrap_default(const T1& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  // NOTE: DO NOT DIRECTLY CHECK FOR ALIASING BY TAKING THE ADDRESS OF THE \"M\" OBJECT IN ANY quasi_unwrap CLASS !!!\n  const Mat<eT> M;\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>&) const { return false; }\n  };\n\n\n\ntemplate<typename T1>\nstruct quasi_unwrap_fixed\n  {\n  typedef typename T1::elem_type eT;\n  \n  static const bool has_subview = false;\n  \n  inline explicit\n  quasi_unwrap_fixed(const T1& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const Mat<eT>& M;\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&M) == void_ptr(&X)); }\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct quasi_unwrap_redirect {};\n\ntemplate<typename T1>\nstruct quasi_unwrap_redirect<T1, false> { typedef quasi_unwrap_default<T1> result; };\n\ntemplate<typename T1>\nstruct quasi_unwrap_redirect<T1, true>  { typedef quasi_unwrap_fixed<T1>   result; };\n\n\ntemplate<typename T1>\nstruct quasi_unwrap : public quasi_unwrap_redirect<T1, is_Mat_fixed<T1>::value >::result\n  {\n  typedef typename quasi_unwrap_redirect<T1, is_Mat_fixed<T1>::value >::result quasi_unwrap_extra;\n  \n  static const bool has_subview = quasi_unwrap_extra::has_subview;\n  \n  inline\n  quasi_unwrap(const T1& A)\n    : quasi_unwrap_extra(A)\n    {\n    }\n  \n  using quasi_unwrap_extra::M;\n  using quasi_unwrap_extra::is_alias;\n  };\n\n\n\ntemplate<typename eT>\nstruct quasi_unwrap< Mat<eT> >\n  {\n  static const bool has_subview = false;\n  \n  inline\n  quasi_unwrap(const Mat<eT>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const Mat<eT>& M;\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&M) == void_ptr(&X)); }\n  };\n\n\n\ntemplate<typename eT>\nstruct quasi_unwrap< Row<eT> >\n  {\n  static const bool has_subview = false;\n  \n  inline\n  quasi_unwrap(const Row<eT>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const Row<eT>& M;\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&M) == void_ptr(&X)); }\n  };\n\n\n\ntemplate<typename eT>\nstruct quasi_unwrap< Col<eT> >\n  {\n  static const bool has_subview = false;\n  \n  inline\n  quasi_unwrap(const Col<eT>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const Col<eT>& M;\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&M) == void_ptr(&X)); }\n  };\n\n\n\ntemplate<typename eT>\nstruct quasi_unwrap< subview_col<eT> >\n  {\n  static const bool has_subview = true;\n  \n  inline\n  quasi_unwrap(const subview_col<eT>& A)\n    : M  ( const_cast<eT*>( A.colptr(0) ), A.n_rows, 1, false, false )\n    , src( A.m )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const Mat<eT>  M;\n  const Mat<eT>& src;\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&src) == void_ptr(&X)); }\n  };\n\n\n\ntemplate<typename out_eT, typename T1, typename T2, typename glue_type>\nstruct quasi_unwrap< mtGlue<out_eT, T1, T2, glue_type> >\n  {\n  static const bool has_subview = false;\n  \n  inline\n  quasi_unwrap(const mtGlue<out_eT, T1, T2, glue_type>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const Mat<out_eT> M;\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>&) const { return false; }\n  };\n\n\n\ntemplate<typename out_eT, typename T1, typename op_type>\nstruct quasi_unwrap< mtOp<out_eT, T1, op_type> >\n  {\n  static const bool has_subview = false;\n  \n  inline\n  quasi_unwrap(const mtOp<out_eT, T1, op_type>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const Mat<out_eT> M;\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>&) const { return false; }\n  };\n\n\n\ntemplate<typename T1>\nstruct quasi_unwrap< Op<T1, op_vectorise_col> >\n  {\n  static const bool has_subview = true;\n  \n  typedef typename T1::elem_type eT;\n  \n  inline\n  quasi_unwrap(const Op<T1, op_vectorise_col>& A)\n    : U( A.m )\n    , M( const_cast<eT*>(U.M.memptr()), U.M.n_elem, 1, false, false )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const unwrap<T1> U;\n  const Mat<eT>    M;\n  \n  template<typename eT2>\n  arma_inline bool is_alias(const Mat<eT2>& X) const { return (void_ptr(&(U.M)) == void_ptr(&X)); }\n  };\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename T1>\nstruct unwrap_check_default\n  {\n  typedef typename T1::elem_type eT;\n  typedef Mat<eT>                stored_type;\n  \n  inline\n  unwrap_check_default(const T1& A, const Mat<eT>&)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  unwrap_check_default(const T1& A, const bool)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const Mat<eT> M;\n  };\n\n\n\ntemplate<typename T1>\nstruct unwrap_check_fixed\n  {\n  typedef typename T1::elem_type eT;\n  typedef T1                     stored_type;\n  \n  inline\n  unwrap_check_fixed(const T1& A, const Mat<eT>& B)\n    : M_local( (&A == &B) ? new T1(A) : 0 )\n    , M      ( (&A == &B) ? *M_local  : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  unwrap_check_fixed(const T1& A, const bool is_alias)\n    : M_local( is_alias ? new T1(A) : 0 )\n    , M      ( is_alias ? *M_local  : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~unwrap_check_fixed()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  \n  // the order below is important\n  const T1* M_local;\n  const T1& M;\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct unwrap_check_redirect {};\n\ntemplate<typename T1>\nstruct unwrap_check_redirect<T1, false> { typedef unwrap_check_default<T1> result; };\n\ntemplate<typename T1>\nstruct unwrap_check_redirect<T1, true>  { typedef unwrap_check_fixed<T1>   result; };\n\n\ntemplate<typename T1>\nstruct unwrap_check : public unwrap_check_redirect<T1, is_Mat_fixed<T1>::value >::result\n  {\n  inline unwrap_check(const T1& A, const Mat<typename T1::elem_type>& B)\n    : unwrap_check_redirect< T1, is_Mat_fixed<T1>::value >::result(A, B)\n    {\n    }\n  \n  inline unwrap_check(const T1& A, const bool is_alias)\n    : unwrap_check_redirect< T1, is_Mat_fixed<T1>::value >::result(A, is_alias)\n    {\n    }\n  };\n\n\n\ntemplate<typename eT>\nstruct unwrap_check< Mat<eT> >\n  {\n  typedef Mat<eT> stored_type;\n  \n  inline\n  unwrap_check(const Mat<eT>& A, const Mat<eT>& B)\n    : M_local( (&A == &B) ? new Mat<eT>(A) : 0 )\n    , M      ( (&A == &B) ? (*M_local)     : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  unwrap_check(const Mat<eT>& A, const bool is_alias)\n    : M_local( is_alias ? new Mat<eT>(A) : 0 )\n    , M      ( is_alias ? (*M_local)     : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  \n  // the order below is important\n  const Mat<eT>* M_local;\n  const Mat<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct unwrap_check< Row<eT> >\n  {\n  typedef Row<eT> stored_type;\n  \n  inline\n  unwrap_check(const Row<eT>& A, const Mat<eT>& B)\n    : M_local( (&A == &B) ? new Row<eT>(A) : 0 )\n    , M      ( (&A == &B) ? (*M_local)     : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  unwrap_check(const Row<eT>& A, const bool is_alias)\n    : M_local( is_alias ? new Row<eT>(A) : 0 )\n    , M      ( is_alias ? (*M_local)     : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  \n  // the order below is important\n  const Row<eT>* M_local;\n  const Row<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct unwrap_check< Col<eT> >\n  {\n  typedef Col<eT> stored_type;\n  \n  inline\n  unwrap_check(const Col<eT>& A, const Mat<eT>& B)\n    : M_local( (&A == &B) ? new Col<eT>(A) : 0 )\n    , M      ( (&A == &B) ? (*M_local)     : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  unwrap_check(const Col<eT>& A, const bool is_alias)\n    : M_local( is_alias ? new Col<eT>(A) : 0 )\n    , M      ( is_alias ? (*M_local)     : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  \n  // the order below is important\n  const Col<eT>* M_local;\n  const Col<eT>& M;\n  };\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename T1>\nstruct unwrap_check_mixed\n  {\n  typedef typename T1::elem_type eT1;\n  \n  template<typename eT2>\n  inline\n  unwrap_check_mixed(const T1& A, const Mat<eT2>&)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  //template<typename eT2>\n  inline\n  unwrap_check_mixed(const T1& A, const bool)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const Mat<eT1> M;\n  };\n\n\n\ntemplate<typename eT1>\nstruct unwrap_check_mixed< Mat<eT1> >\n  {\n  template<typename eT2>\n  inline\n  unwrap_check_mixed(const Mat<eT1>& A, const Mat<eT2>& B)\n    : M_local( (void_ptr(&A) == void_ptr(&B)) ? new Mat<eT1>(A) : 0 )\n    , M      ( (void_ptr(&A) == void_ptr(&B)) ? (*M_local)      : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  //template<typename eT2>\n  inline\n  unwrap_check_mixed(const Mat<eT1>& A, const bool is_alias)\n    : M_local( is_alias ? new Mat<eT1>(A) : 0 )\n    , M      ( is_alias ? (*M_local)      : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~unwrap_check_mixed()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  \n  // the order below is important\n  const Mat<eT1>* M_local;\n  const Mat<eT1>& M;\n  };\n\n\n\ntemplate<typename eT1>\nstruct unwrap_check_mixed< Row<eT1> >\n  {\n  template<typename eT2>\n  inline\n  unwrap_check_mixed(const Row<eT1>& A, const Mat<eT2>& B)\n    : M_local( (void_ptr(&A) == void_ptr(&B)) ? new Row<eT1>(A) : 0 )\n    , M      ( (void_ptr(&A) == void_ptr(&B)) ? (*M_local)      : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  \n  //template<typename eT2>\n  inline\n  unwrap_check_mixed(const Row<eT1>& A, const bool is_alias)\n    : M_local( is_alias ? new Row<eT1>(A) : 0 )\n    , M      ( is_alias ? (*M_local)      : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~unwrap_check_mixed()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  \n  // the order below is important\n  const Row<eT1>* M_local;\n  const Row<eT1>& M;\n  };\n\n\n\ntemplate<typename eT1>\nstruct unwrap_check_mixed< Col<eT1> >\n  {\n  template<typename eT2>\n  inline\n  unwrap_check_mixed(const Col<eT1>& A, const Mat<eT2>& B)\n    : M_local( (void_ptr(&A) == void_ptr(&B)) ? new Col<eT1>(A) : 0 )\n    , M      ( (void_ptr(&A) == void_ptr(&B)) ? (*M_local)      : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  //template<typename eT2>\n  inline\n  unwrap_check_mixed(const Col<eT1>& A, const bool is_alias)\n    : M_local( is_alias ? new Col<eT1>(A) : 0 )\n    , M      ( is_alias ? (*M_local)      : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~unwrap_check_mixed()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  \n  // the order below is important\n  const Col<eT1>* M_local;\n  const Col<eT1>& M;\n  };\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename T1>\nstruct partial_unwrap_default\n  {\n  typedef typename T1::elem_type eT;\n  typedef Mat<eT>                stored_type;\n  \n  inline\n  partial_unwrap_default(const T1& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  arma_inline bool is_alias(const Mat<eT>&) const { return false; }\n  \n  static const bool do_trans = false;\n  static const bool do_times = false;\n  \n  const Mat<eT> M;\n  };\n\n\ntemplate<typename T1>\nstruct partial_unwrap_fixed\n  {\n  typedef typename T1::elem_type eT;\n  typedef T1                     stored_type;\n  \n  inline explicit\n  partial_unwrap_fixed(const T1& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = false;\n  \n  const T1& M;\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct partial_unwrap_redirect {};\n\ntemplate<typename T1>\nstruct partial_unwrap_redirect<T1, false> { typedef partial_unwrap_default<T1> result; };\n\ntemplate<typename T1>\nstruct partial_unwrap_redirect<T1, true>  { typedef partial_unwrap_fixed<T1>   result; };\n\ntemplate<typename T1>\nstruct partial_unwrap : public partial_unwrap_redirect<T1, is_Mat_fixed<T1>::value >::result\n  {\n  inline\n  partial_unwrap(const T1& A)\n    : partial_unwrap_redirect< T1, is_Mat_fixed<T1>::value >::result(A)\n    {\n    }\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< Mat<eT> >\n  {\n  typedef Mat<eT> stored_type;\n  \n  inline\n  partial_unwrap(const Mat<eT>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return ((&X) == (&M)); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = false;\n  \n  const Mat<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< Row<eT> >\n  {\n  typedef Row<eT> stored_type;\n  \n  inline\n  partial_unwrap(const Row<eT>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = false;\n  \n  const Row<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< Col<eT> >\n  {\n  typedef Col<eT> stored_type;\n  \n  inline\n  partial_unwrap(const Col<eT>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = false;\n  \n  const Col<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< subview_col<eT> >\n  {\n  typedef Col<eT> stored_type;\n  \n  inline\n  partial_unwrap(const subview_col<eT>& A)\n    : orig( A.m )\n    , M   ( const_cast<eT*>( A.colptr(0) ), A.n_rows, false, false )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&orig)); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = false;\n  \n  const Mat<eT>& orig;\n  const Col<eT>  M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< subview_row<eT> >\n  {\n  typedef Row<eT> stored_type;\n  \n  inline\n  partial_unwrap(const subview_row<eT>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  arma_inline bool is_alias(const Mat<eT>&) const { return false; }\n  \n  static const bool do_trans = false;\n  static const bool do_times = false;\n  \n  const Row<eT> M;\n  };\n\n\n\ntemplate<typename T1>\nstruct partial_unwrap_htrans_default\n  {\n  typedef typename T1::elem_type eT;\n  typedef Mat<eT>                stored_type;\n  \n  inline\n  partial_unwrap_htrans_default(const Op<T1, op_htrans>& A)\n    : M(A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  arma_inline bool is_alias(const Mat<eT>&) const { return false; }\n  \n  static const bool do_trans = true;\n  static const bool do_times = false;\n  \n  const Mat<eT> M;\n  };\n\n\ntemplate<typename T1>\nstruct partial_unwrap_htrans_fixed\n  {\n  typedef typename T1::elem_type eT;\n  typedef T1                     stored_type;\n  \n  inline explicit\n  partial_unwrap_htrans_fixed(const Op<T1, op_htrans>& A)\n    : M(A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = true;\n  static const bool do_times = false;\n  \n  const T1& M;\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct partial_unwrap_htrans_redirect {};\n\ntemplate<typename T1>\nstruct partial_unwrap_htrans_redirect<T1, false> { typedef partial_unwrap_htrans_default<T1> result; };\n\ntemplate<typename T1>\nstruct partial_unwrap_htrans_redirect<T1, true>  { typedef partial_unwrap_htrans_fixed<T1>   result; };\n\ntemplate<typename T1>\nstruct partial_unwrap< Op<T1, op_htrans> > : public partial_unwrap_htrans_redirect<T1, is_Mat_fixed<T1>::value >::result\n  {\n  inline partial_unwrap(const Op<T1, op_htrans>& A)\n    : partial_unwrap_htrans_redirect< T1, is_Mat_fixed<T1>::value >::result(A)\n    {\n    }\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< Op< Mat<eT>, op_htrans> >\n  {\n  typedef Mat<eT> stored_type;\n  \n  inline\n  partial_unwrap(const Op< Mat<eT>, op_htrans>& A)\n    : M(A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = true;\n  static const bool do_times = false;\n  \n  const Mat<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< Op< Row<eT>, op_htrans> >\n  {\n  typedef Row<eT> stored_type;\n  \n  inline\n  partial_unwrap(const Op< Row<eT>, op_htrans>& A)\n    : M(A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = true;\n  static const bool do_times = false;\n  \n  const Row<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< Op< Col<eT>, op_htrans> >\n  {\n  typedef Col<eT> stored_type;\n  \n  inline\n  partial_unwrap(const Op< Col<eT>, op_htrans>& A)\n    : M(A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = true;\n  static const bool do_times = false;\n  \n  const Col<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< Op< subview_col<eT>, op_htrans> >\n  {\n  typedef Col<eT> stored_type;\n  \n  inline\n  partial_unwrap(const Op< subview_col<eT>, op_htrans>& A)\n    : orig( A.m.m )\n    , M   ( const_cast<eT*>( A.m.colptr(0) ), A.m.n_rows, false, false )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&orig)); }\n  \n  static const bool do_trans = true;\n  static const bool do_times = false;\n  \n  const Mat<eT>& orig;\n  const Col<eT>  M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< Op< subview_row<eT>, op_htrans> >\n  {\n  typedef Row<eT> stored_type;\n  \n  inline\n  partial_unwrap(const Op< subview_row<eT>, op_htrans>& A)\n    : M(A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  arma_inline bool is_alias(const Mat<eT>&) const { return false; }\n  \n  static const bool do_trans = true;\n  static const bool do_times = false;\n  \n  const Row<eT> M;\n  };\n\n\n\ntemplate<typename T1>\nstruct partial_unwrap_htrans2_default\n  {\n  typedef typename T1::elem_type eT;\n  typedef Mat<eT>                stored_type;\n  \n  inline\n  partial_unwrap_htrans2_default(const Op<T1, op_htrans2>& A)\n    : val(A.aux)\n    , M  (A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return val; }\n  \n  arma_inline bool is_alias(const Mat<eT>&) const { return false; }\n  \n  static const bool do_trans = true;\n  static const bool do_times = true;\n  \n  const eT      val;\n  const Mat<eT> M;\n  };\n\n\ntemplate<typename T1>\nstruct partial_unwrap_htrans2_fixed\n  {\n  typedef typename T1::elem_type eT;\n  typedef T1                     stored_type;\n  \n  inline explicit\n  partial_unwrap_htrans2_fixed(const Op<T1, op_htrans2>& A)\n    : val(A.aux)\n    , M  (A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return val; }\n  \n  arma_hot arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = true;\n  static const bool do_times = true;\n  \n  const eT  val;\n  const T1& M;\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct partial_unwrap_htrans2_redirect {};\n\ntemplate<typename T1>\nstruct partial_unwrap_htrans2_redirect<T1, false> { typedef partial_unwrap_htrans2_default<T1> result; };\n\ntemplate<typename T1>\nstruct partial_unwrap_htrans2_redirect<T1, true>  { typedef partial_unwrap_htrans2_fixed<T1>   result; };\n\ntemplate<typename T1>\nstruct partial_unwrap< Op<T1, op_htrans2> > : public partial_unwrap_htrans2_redirect<T1, is_Mat_fixed<T1>::value >::result\n  {\n  inline partial_unwrap(const Op<T1, op_htrans2>& A)\n    : partial_unwrap_htrans2_redirect< T1, is_Mat_fixed<T1>::value >::result(A)\n    {\n    }\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< Op< Mat<eT>, op_htrans2> >\n  {\n  typedef Mat<eT> stored_type;\n  \n  inline\n  partial_unwrap(const Op< Mat<eT>, op_htrans2>& A)\n    : val(A.aux)\n    , M  (A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline eT get_val() const { return val; }\n  \n  arma_hot arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = true;\n  static const bool do_times = true;\n  \n  const eT       val;\n  const Mat<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< Op< Row<eT>, op_htrans2> >\n  {\n  typedef Row<eT> stored_type;\n  \n  inline\n  partial_unwrap(const Op< Row<eT>, op_htrans2>& A)\n    : val(A.aux)\n    , M  (A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline eT get_val() const { return val; }\n  \n  arma_hot arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = true;\n  static const bool do_times = true;\n  \n  const eT       val;\n  const Row<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< Op< Col<eT>, op_htrans2> >\n  {\n  typedef Col<eT> stored_type;\n  \n  inline\n  partial_unwrap(const Op< Col<eT>, op_htrans2>& A)\n    : val(A.aux)\n    , M  (A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline eT get_val() const { return val; }\n  \n  arma_hot arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = true;\n  static const bool do_times = true;\n  \n  const eT       val;\n  const Col<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< Op< subview_col<eT>, op_htrans2> >\n  {\n  typedef Col<eT> stored_type;\n  \n  inline\n  partial_unwrap(const Op< subview_col<eT>, op_htrans2>& A)\n    : orig( A.m.m )\n    , val ( A.aux )\n    , M   ( const_cast<eT*>( A.m.colptr(0) ), A.m.n_rows, false, false )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline eT get_val() const { return val; }\n  \n  arma_hot arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&orig)); }\n  \n  static const bool do_trans = true;\n  static const bool do_times = true;\n  \n  const Mat<eT>& orig;\n  \n  const eT      val;\n  const Col<eT> M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< Op< subview_row<eT>, op_htrans2> >\n  {\n  typedef Row<eT> stored_type;\n  \n  inline\n  partial_unwrap(const Op< subview_row<eT>, op_htrans2>& A)\n    : val(A.aux)\n    , M  (A.m  )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return val; }\n  \n  arma_inline bool is_alias(const Mat<eT>&) const { return false; }\n  \n  static const bool do_trans = true;\n  static const bool do_times = true;\n  \n  const eT      val;\n  const Row<eT> M;\n  };\n\n\n\ntemplate<typename T1>\nstruct partial_unwrap_scalar_times_default\n  {\n  typedef typename T1::elem_type eT;\n  typedef Mat<eT>                stored_type;\n  \n  inline\n  partial_unwrap_scalar_times_default(const eOp<T1, eop_scalar_times>& A)\n    : val(A.aux)\n    , M  (A.P.Q)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return val; }\n  \n  arma_inline bool is_alias(const Mat<eT>&) const { return false; }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const eT      val;\n  const Mat<eT> M;\n  };\n\n\n\ntemplate<typename T1>\nstruct partial_unwrap_scalar_times_fixed\n  {\n  typedef typename T1::elem_type eT;\n  typedef T1                     stored_type;\n  \n  inline explicit\n  partial_unwrap_scalar_times_fixed(const eOp<T1, eop_scalar_times>& A)\n    : val(A.aux)\n    , M  (A.P.Q)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_hot arma_inline eT get_val() const { return val; }\n  \n  arma_hot arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const eT  val;\n  const T1& M;\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct partial_unwrap_scalar_times_redirect {};\n\ntemplate<typename T1>\nstruct partial_unwrap_scalar_times_redirect<T1, false> { typedef partial_unwrap_scalar_times_default<T1> result; };\n\ntemplate<typename T1>\nstruct partial_unwrap_scalar_times_redirect<T1, true>  { typedef partial_unwrap_scalar_times_fixed<T1>   result; };\n\n\ntemplate<typename T1>\nstruct partial_unwrap< eOp<T1, eop_scalar_times> > : public partial_unwrap_scalar_times_redirect<T1, is_Mat_fixed<T1>::value >::result\n  {\n  typedef typename T1::elem_type eT;\n  \n  inline\n  partial_unwrap(const eOp<T1, eop_scalar_times>& A)\n    : partial_unwrap_scalar_times_redirect< T1, is_Mat_fixed<T1>::value >::result(A)\n    {\n    }\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< eOp<Mat<eT>, eop_scalar_times> >\n  {\n  typedef Mat<eT> stored_type;\n  \n  inline\n  partial_unwrap(const eOp<Mat<eT>,eop_scalar_times>& A)\n    : val(A.aux)\n    , M  (A.P.Q)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline eT get_val() const { return val; }\n  \n  arma_hot arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const eT       val;\n  const Mat<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< eOp<Row<eT>, eop_scalar_times> >\n  {\n  typedef Row<eT> stored_type;\n  \n  inline\n  partial_unwrap(const eOp<Row<eT>,eop_scalar_times>& A)\n    : val(A.aux)\n    , M  (A.P.Q)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline eT get_val() const { return val; }\n  \n  arma_hot arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const eT       val;\n  const Row<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< eOp<Col<eT>, eop_scalar_times> >\n  {\n  typedef Col<eT> stored_type;\n  \n  inline\n  partial_unwrap(const eOp<Col<eT>,eop_scalar_times>& A)\n    : val(A.aux)\n    , M  (A.P.Q)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline eT get_val() const { return val; }\n  \n  arma_hot arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const eT       val;\n  const Col<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< eOp<subview_col<eT>, eop_scalar_times> >\n  {\n  typedef Col<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap(const eOp<subview_col<eT>,eop_scalar_times>& A)\n    : orig( A.P.Q.m )\n    , val ( A.aux   )\n    , M   ( const_cast<eT*>( A.P.Q.colptr(0) ), A.P.Q.n_rows, false, false )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_hot arma_inline eT get_val() const { return val; }\n  \n  arma_hot arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&orig)); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const Mat<eT>& orig;\n  \n  const eT      val;\n  const Col<eT> M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< eOp<subview_row<eT>, eop_scalar_times> >\n  {\n  typedef Row<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap(const eOp<subview_row<eT>,eop_scalar_times>& A)\n    : val(A.aux)\n    , M  (A.P.Q)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return val; }\n  \n  arma_inline bool is_alias(const Mat<eT>&) const { return false; }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const eT      val;\n  const Row<eT> M;\n  };\n\n\n\ntemplate<typename T1>\nstruct partial_unwrap_neg_default\n  {\n  typedef typename T1::elem_type eT;\n  typedef Mat<eT>                stored_type;\n  \n  inline\n  partial_unwrap_neg_default(const eOp<T1, eop_neg>& A)\n    : M(A.P.Q)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(-1); }\n  \n  arma_inline bool is_alias(const Mat<eT>&) const { return false; }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const Mat<eT> M;\n  };\n\n\n\ntemplate<typename T1>\nstruct partial_unwrap_neg_fixed\n  {\n  typedef typename T1::elem_type eT;\n  typedef T1                     stored_type;\n  \n  inline explicit\n  partial_unwrap_neg_fixed(const eOp<T1, eop_neg>& A)\n    : M(A.P.Q)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(-1); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const T1& M;\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct partial_unwrap_neg_redirect {};\n\ntemplate<typename T1>\nstruct partial_unwrap_neg_redirect<T1, false> { typedef partial_unwrap_neg_default<T1> result; };\n\ntemplate<typename T1>\nstruct partial_unwrap_neg_redirect<T1, true>  { typedef partial_unwrap_neg_fixed<T1>   result; };\n\n\ntemplate<typename T1>\nstruct partial_unwrap< eOp<T1, eop_neg> > : public partial_unwrap_neg_redirect<T1, is_Mat_fixed<T1>::value >::result\n  {\n  typedef typename T1::elem_type eT;\n  \n  inline\n  partial_unwrap(const eOp<T1, eop_neg>& A)\n    : partial_unwrap_neg_redirect< T1, is_Mat_fixed<T1>::value >::result(A)\n    {\n    }\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< eOp<Mat<eT>, eop_neg> >\n  {\n  typedef Mat<eT> stored_type;\n  \n  inline\n  partial_unwrap(const eOp<Mat<eT>,eop_neg>& A)\n    : M(A.P.Q)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(-1); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const Mat<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< eOp<Row<eT>, eop_neg> >\n  {\n  typedef Row<eT> stored_type;\n  \n  inline\n  partial_unwrap(const eOp<Row<eT>,eop_neg>& A)\n    : M(A.P.Q)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(-1); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const Row<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< eOp<Col<eT>, eop_neg> >\n  {\n  typedef Col<eT> stored_type;\n  \n  inline\n  partial_unwrap(const eOp<Col<eT>,eop_neg>& A)\n    : M(A.P.Q)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(-1); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&M)); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const Col<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< eOp<subview_col<eT>, eop_neg> >\n  {\n  typedef Col<eT> stored_type;\n  \n  inline\n  partial_unwrap(const eOp<subview_col<eT>,eop_neg>& A)\n    : orig( A.P.Q.m )\n    , M   ( const_cast<eT*>( A.P.Q.colptr(0) ), A.P.Q.n_rows, false, false )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(-1); }\n  \n  arma_inline bool is_alias(const Mat<eT>& X) const { return (void_ptr(&X) == void_ptr(&orig)); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const Mat<eT>& orig;\n  const Col<eT>  M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap< eOp<subview_row<eT>, eop_neg> >\n  {\n  typedef Row<eT> stored_type;\n  \n  inline\n  partial_unwrap(const eOp<subview_row<eT>,eop_neg>& A)\n    : M(A.P.Q)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(-1); }\n  \n  arma_inline bool is_alias(const Mat<eT>&) const { return false; }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const Row<eT> M;\n  };\n\n\n\n//\n\n\n\ntemplate<typename T1>\nstruct partial_unwrap_check_default\n  {\n  typedef typename T1::elem_type eT;\n  typedef Mat<eT>                stored_type;\n  \n  inline\n  partial_unwrap_check_default(const T1& A, const Mat<eT>&)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = false;\n  \n  const Mat<eT> M;\n  };\n\n\ntemplate<typename T1>\nstruct partial_unwrap_check_fixed\n  {\n  typedef typename T1::elem_type eT;\n  typedef T1                     stored_type;\n  \n  inline explicit\n  partial_unwrap_check_fixed(const T1& A, const Mat<eT>& B)\n    : M_local( (&A == &B) ? new T1(A)  : 0 )\n    , M      ( (&A == &B) ? (*M_local) : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check_fixed()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = false;\n  \n  const T1* M_local;\n  const T1& M;\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct partial_unwrap_check_redirect {};\n\ntemplate<typename T1>\nstruct partial_unwrap_check_redirect<T1, false> { typedef partial_unwrap_check_default<T1> result; };\n\ntemplate<typename T1>\nstruct partial_unwrap_check_redirect<T1, true>  { typedef partial_unwrap_check_fixed<T1>   result; };\n\ntemplate<typename T1>\nstruct partial_unwrap_check : public partial_unwrap_check_redirect<T1, is_Mat_fixed<T1>::value >::result\n  {\n  typedef typename T1::elem_type eT;\n  \n  inline partial_unwrap_check(const T1& A, const Mat<eT>& B)\n    : partial_unwrap_check_redirect< T1, is_Mat_fixed<T1>::value >::result(A, B)\n    {\n    }\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap_check< Mat<eT> >\n  {\n  typedef Mat<eT> stored_type;\n\n  arma_hot inline\n  partial_unwrap_check(const Mat<eT>& A, const Mat<eT>& B)\n    : M_local ( (&A == &B) ? new Mat<eT>(A) : 0 )\n    , M       ( (&A == &B) ? (*M_local)     : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  \n  inline\n  ~partial_unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = false;\n  \n  // the order below is important\n  const Mat<eT>* M_local;\n  const Mat<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap_check< Row<eT> >\n  {\n  typedef Row<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const Row<eT>& A, const Mat<eT>& B)\n    : M_local ( (&A == &B) ? new Row<eT>(A) : 0 )\n    , M       ( (&A == &B) ? (*M_local)     : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  \n  inline\n  ~partial_unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = false;\n  \n  // the order below is important\n  const Row<eT>* M_local;\n  const Row<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap_check< Col<eT> >\n  {\n  typedef Col<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const Col<eT>& A, const Mat<eT>& B)\n    : M_local ( (&A == &B) ? new Col<eT>(A) : 0 )\n    , M       ( (&A == &B) ? (*M_local)     : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  \n  inline\n  ~partial_unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = false;\n  \n  // the order below is important\n  const Col<eT>* M_local;\n  const Col<eT>& M;\n  };\n\n\n\n// NOTE: we can get away with this shortcut as the partial_unwrap_check class is only used by the glue_times class,\n// NOTE: which relies on partial_unwrap_check to check for aliasing\ntemplate<typename eT>\nstruct partial_unwrap_check< subview_col<eT> >\n  {\n  typedef Col<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const subview_col<eT>& A, const Mat<eT>& B)\n    : M  ( const_cast<eT*>( A.colptr(0) ), A.n_rows, (&(A.m) == &B), false )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = false;\n  \n  const Col<eT> M;\n  };\n\n\n\ntemplate<typename T1>\nstruct partial_unwrap_check_htrans_default\n  {\n  typedef typename T1::elem_type eT;\n  typedef Mat<eT>                stored_type;\n  \n  inline\n  partial_unwrap_check_htrans_default(const Op<T1, op_htrans>& A, const Mat<eT>&)\n    : M(A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  static const bool do_trans = true;\n  static const bool do_times = false;\n  \n  const Mat<eT> M;\n  };\n\n\ntemplate<typename T1>\nstruct partial_unwrap_check_htrans_fixed\n  {\n  typedef typename T1::elem_type eT;\n  typedef T1                     stored_type;\n  \n  inline explicit\n  partial_unwrap_check_htrans_fixed(const Op<T1, op_htrans>& A, const Mat<eT>& B)\n    : M_local( (&(A.m) == &B) ? new T1(A.m) : 0   )\n    , M      ( (&(A.m) == &B) ? (*M_local)  : A.m )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check_htrans_fixed()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  static const bool do_trans = true;\n  static const bool do_times = false;\n  \n  const T1* M_local;\n  const T1& M;\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct partial_unwrap_check_htrans_redirect {};\n\ntemplate<typename T1>\nstruct partial_unwrap_check_htrans_redirect<T1, false> { typedef partial_unwrap_check_htrans_default<T1> result; };\n\ntemplate<typename T1>\nstruct partial_unwrap_check_htrans_redirect<T1, true>  { typedef partial_unwrap_check_htrans_fixed<T1>   result; };\n\n\ntemplate<typename T1>\nstruct partial_unwrap_check< Op<T1, op_htrans> > : public partial_unwrap_check_htrans_redirect<T1, is_Mat_fixed<T1>::value >::result\n  {\n  typedef typename T1::elem_type eT;\n  \n  inline partial_unwrap_check(const Op<T1, op_htrans>& A, const Mat<eT>& B)\n    : partial_unwrap_check_htrans_redirect< T1, is_Mat_fixed<T1>::value >::result(A, B)\n    {\n    }\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap_check< Op< Mat<eT>, op_htrans> >\n  {\n  typedef Mat<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const Op< Mat<eT>, op_htrans>& A, const Mat<eT>& B)\n    : M_local ( (&A.m == &B) ? new Mat<eT>(A.m) : 0   )\n    , M       ( (&A.m == &B) ? (*M_local)       : A.m )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  static const bool do_trans = true;\n  static const bool do_times = false;\n  \n  // the order below is important\n  const Mat<eT>* M_local;\n  const Mat<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap_check< Op< Row<eT>, op_htrans> >\n  {\n  typedef Row<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const Op< Row<eT>, op_htrans>& A, const Mat<eT>& B)\n    : M_local ( (&A.m == &B) ? new Row<eT>(A.m) : 0   )\n    , M       ( (&A.m == &B) ? (*M_local)       : A.m )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  static const bool do_trans = true;\n  static const bool do_times = false;\n  \n  // the order below is important\n  const Row<eT>* M_local;\n  const Row<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap_check< Op< Col<eT>, op_htrans> >\n  {\n  typedef Col<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const Op< Col<eT>, op_htrans>& A, const Mat<eT>& B)\n    : M_local ( (&A.m == &B) ? new Col<eT>(A.m) : 0   )\n    , M       ( (&A.m == &B) ? (*M_local)       : A.m )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  static const bool do_trans = true;\n  static const bool do_times = false;\n  \n  // the order below is important\n  const Col<eT>* M_local;\n  const Col<eT>& M;\n  };\n\n\n\n// NOTE: we can get away with this shortcut as the partial_unwrap_check class is only used by the glue_times class,\n// NOTE: which relies on partial_unwrap_check to check for aliasing\ntemplate<typename eT>\nstruct partial_unwrap_check< Op< subview_col<eT>, op_htrans> >\n  {\n  typedef Col<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const Op< subview_col<eT>, op_htrans>& A, const Mat<eT>& B)\n    : M  ( const_cast<eT*>( A.m.colptr(0) ), A.m.n_rows, (&(A.m.m) == &B), false )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(1); }\n  \n  static const bool do_trans = true;\n  static const bool do_times = false;\n  \n  const Col<eT> M;\n  };\n\n\n\ntemplate<typename T1>\nstruct partial_unwrap_check_htrans2_default\n  {\n  typedef typename T1::elem_type eT;\n  typedef Mat<eT>                stored_type;\n  \n  inline\n  partial_unwrap_check_htrans2_default(const Op<T1, op_htrans2>& A, const Mat<eT>&)\n    : val(A.aux)\n    , M  (A.m)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_hot arma_inline eT get_val() const { return val; }\n  \n  static const bool do_trans = true;\n  static const bool do_times = true;\n  \n  const eT      val;\n  const Mat<eT> M;\n  };\n\n\n\ntemplate<typename T1>\nstruct partial_unwrap_check_htrans2_fixed\n  {\n  typedef typename T1::elem_type eT;\n  typedef T1                     stored_type;\n  \n  inline explicit\n  partial_unwrap_check_htrans2_fixed(const Op<T1, op_htrans2>& A, const Mat<eT>& B)\n    : val    (A.aux)\n    , M_local( (&(A.m) == &B) ? new T1(A.m) : 0   )\n    , M      ( (&(A.m) == &B) ? (*M_local)  : A.m )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check_htrans2_fixed()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_hot arma_inline eT get_val() const { return val; }\n  \n  static const bool do_trans = true;\n  static const bool do_times = true;\n  \n  const eT  val;\n  const T1* M_local;\n  const T1& M;\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct partial_unwrap_check_htrans2_redirect {};\n\ntemplate<typename T1>\nstruct partial_unwrap_check_htrans2_redirect<T1, false> { typedef partial_unwrap_check_htrans2_default<T1> result; };\n\ntemplate<typename T1>\nstruct partial_unwrap_check_htrans2_redirect<T1, true>  { typedef partial_unwrap_check_htrans2_fixed<T1>   result; };\n\n\ntemplate<typename T1>\nstruct partial_unwrap_check< Op<T1, op_htrans2> > : public partial_unwrap_check_htrans2_redirect<T1, is_Mat_fixed<T1>::value >::result\n  {\n  typedef typename T1::elem_type eT;\n  \n  inline partial_unwrap_check(const Op<T1, op_htrans2>& A, const Mat<eT>& B)\n    : partial_unwrap_check_htrans2_redirect< T1, is_Mat_fixed<T1>::value >::result(A, B)\n    {\n    }\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap_check< Op< Mat<eT>, op_htrans2> >\n  {\n  typedef Mat<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const Op< Mat<eT>, op_htrans2>& A, const Mat<eT>& B)\n    : val     (A.aux)\n    , M_local ( (&A.m == &B) ? new Mat<eT>(A.m) : 0   )\n    , M       ( (&A.m == &B) ? (*M_local)       : A.m )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_hot arma_inline eT get_val() const { return val; }\n  \n  static const bool do_trans = true;\n  static const bool do_times = true;\n  \n  // the order below is important\n  const eT       val;\n  const Mat<eT>* M_local;\n  const Mat<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap_check< Op< Row<eT>, op_htrans2> >\n  {\n  typedef Row<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const Op< Row<eT>, op_htrans2>& A, const Mat<eT>& B)\n    : val     (A.aux)\n    , M_local ( (&A.m == &B) ? new Row<eT>(A.m) : 0   )\n    , M       ( (&A.m == &B) ? (*M_local)       : A.m )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_hot arma_inline eT get_val() const { return val; }\n  \n  static const bool do_trans = true;\n  static const bool do_times = true;\n  \n  // the order below is important\n  const eT       val;\n  const Row<eT>* M_local;\n  const Row<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap_check< Op< Col<eT>, op_htrans2> >\n  {\n  typedef Col<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const Op< Col<eT>, op_htrans2>& A, const Mat<eT>& B)\n    : val     (A.aux)\n    , M_local ( (&A.m == &B) ? new Col<eT>(A.m) : 0   )\n    , M       ( (&A.m == &B) ? (*M_local)       : A.m )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_hot arma_inline eT get_val() const { return val; }\n  \n  static const bool do_trans = true;\n  static const bool do_times = true;\n  \n  // the order below is important\n  const eT       val;\n  const Col<eT>* M_local;\n  const Col<eT>& M;\n  };\n\n\n\n// NOTE: we can get away with this shortcut as the partial_unwrap_check class is only used by the glue_times class,\n// NOTE: which relies on partial_unwrap_check to check for aliasing\ntemplate<typename eT>\nstruct partial_unwrap_check< Op< subview_col<eT>, op_htrans2> >\n  {\n  typedef Col<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const Op< subview_col<eT>, op_htrans2>& A, const Mat<eT>& B)\n    : val( A.aux )\n    , M  ( const_cast<eT*>( A.m.colptr(0) ), A.m.n_rows, (&(A.m.m) == &B), false )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_hot arma_inline eT get_val() const { return val; }\n  \n  static const bool do_trans = true;\n  static const bool do_times = true;\n  \n  const eT      val;\n  const Col<eT> M;\n  };\n\n\n\ntemplate<typename T1>\nstruct partial_unwrap_check_scalar_times_default\n  {\n  typedef typename T1::elem_type eT;\n  typedef Mat<eT>                stored_type;\n  \n  inline\n  partial_unwrap_check_scalar_times_default(const eOp<T1, eop_scalar_times>& A, const Mat<eT>&)\n    : val(A.aux)\n    , M  (A.P.Q)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_hot arma_inline eT get_val() const { return val; }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const eT      val;\n  const Mat<eT> M;\n  };\n\n\n\ntemplate<typename T1>\nstruct partial_unwrap_check_scalar_times_fixed\n  {\n  typedef typename T1::elem_type eT;\n  typedef T1                     stored_type;\n  \n  inline explicit\n  partial_unwrap_check_scalar_times_fixed(const eOp<T1, eop_scalar_times>& A, const Mat<eT>& B)\n    : val    ( A.aux )\n    , M_local( (&(A.P.Q) == &B) ? new T1(A.P.Q) : 0     )\n    , M      ( (&(A.P.Q) == &B) ? (*M_local)    : A.P.Q )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check_scalar_times_fixed()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_hot arma_inline eT get_val() const { return val; }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const eT  val;\n  const T1* M_local;\n  const T1& M;\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct partial_unwrap_check_scalar_times_redirect {};\n\ntemplate<typename T1>\nstruct partial_unwrap_check_scalar_times_redirect<T1, false> { typedef partial_unwrap_check_scalar_times_default<T1> result; };\n\ntemplate<typename T1>\nstruct partial_unwrap_check_scalar_times_redirect<T1, true>  { typedef partial_unwrap_check_scalar_times_fixed<T1>   result; };\n\n\ntemplate<typename T1>\nstruct partial_unwrap_check< eOp<T1, eop_scalar_times> > : public partial_unwrap_check_scalar_times_redirect<T1, is_Mat_fixed<T1>::value >::result\n  {\n  typedef typename T1::elem_type eT;\n  \n  inline partial_unwrap_check(const eOp<T1, eop_scalar_times>& A, const Mat<eT>& B)\n    : partial_unwrap_check_scalar_times_redirect< T1, is_Mat_fixed<T1>::value >::result(A, B)\n    {\n    }\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap_check< eOp<Mat<eT>, eop_scalar_times> >\n  {\n  typedef Mat<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const eOp<Mat<eT>,eop_scalar_times>& A, const Mat<eT>& B)\n    : val    (A.aux)\n    , M_local( (&(A.P.Q) == &B) ? new Mat<eT>(A.P.Q) : 0     )\n    , M      ( (&(A.P.Q) == &B) ? *M_local           : A.P.Q )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_hot arma_inline eT get_val() const { return val; }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const eT       val;\n  const Mat<eT>* M_local;\n  const Mat<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap_check< eOp<Row<eT>, eop_scalar_times> >\n  {\n  typedef Row<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const eOp<Row<eT>,eop_scalar_times>& A, const Mat<eT>& B)\n    : val(A.aux)\n    , M_local( (&(A.P.Q) == &B) ? new Row<eT>(A.P.Q) : 0     )\n    , M      ( (&(A.P.Q) == &B) ? *M_local           : A.P.Q )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_hot arma_inline eT get_val() const { return val; }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const eT       val;\n  const Row<eT>* M_local;\n  const Row<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap_check< eOp<Col<eT>, eop_scalar_times> >\n  {\n  typedef Col<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const eOp<Col<eT>,eop_scalar_times>& A, const Mat<eT>& B)\n    : val    ( A.aux )\n    , M_local( (&(A.P.Q) == &B) ? new Col<eT>(A.P.Q) : 0     )\n    , M      ( (&(A.P.Q) == &B) ? *M_local           : A.P.Q )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_hot arma_inline eT get_val() const { return val; }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const eT       val;\n  const Col<eT>* M_local;\n  const Col<eT>& M;\n  };\n\n\n\n// NOTE: we can get away with this shortcut as the partial_unwrap_check class is only used by the glue_times class,\n// NOTE: which relies on partial_unwrap_check to check for aliasing\ntemplate<typename eT>\nstruct partial_unwrap_check< eOp<subview_col<eT>, eop_scalar_times> >\n  {\n  typedef Col<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const eOp<subview_col<eT>,eop_scalar_times>& A, const Mat<eT>& B)\n    : val( A.aux )\n    , M  ( const_cast<eT*>( A.P.Q.colptr(0) ), A.P.Q.n_rows, (&(A.P.Q.m) == &B), false )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_hot arma_inline eT get_val() const { return val; }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const eT      val;\n  const Col<eT> M;\n  };\n\n\n\ntemplate<typename T1>\nstruct partial_unwrap_check_neg_default\n  {\n  typedef typename T1::elem_type eT;\n  typedef Mat<eT>                stored_type;\n  \n  inline\n  partial_unwrap_check_neg_default(const eOp<T1, eop_neg>& A, const Mat<eT>&)\n    : M(A.P.Q)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(-1); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const Mat<eT> M;\n  };\n\n\n\ntemplate<typename T1>\nstruct partial_unwrap_check_neg_fixed\n  {\n  typedef typename T1::elem_type eT;\n  typedef T1                     stored_type;\n  \n  inline explicit\n  partial_unwrap_check_neg_fixed(const eOp<T1, eop_neg>& A, const Mat<eT>& B)\n    : M_local( (&(A.P.Q) == &B) ? new T1(A.P.Q) : 0     )\n    , M      ( (&(A.P.Q) == &B) ? (*M_local)    : A.P.Q )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check_neg_fixed()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_inline eT get_val() const { return eT(-1); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const T1* M_local;\n  const T1& M;\n  };\n\n\n\ntemplate<typename T1, bool condition>\nstruct partial_unwrap_check_neg_redirect {};\n\ntemplate<typename T1>\nstruct partial_unwrap_check_neg_redirect<T1, false> { typedef partial_unwrap_check_neg_default<T1> result; };\n\ntemplate<typename T1>\nstruct partial_unwrap_check_neg_redirect<T1, true>  { typedef partial_unwrap_check_neg_fixed<T1>   result; };\n\n\ntemplate<typename T1>\nstruct partial_unwrap_check< eOp<T1, eop_neg> > : public partial_unwrap_check_neg_redirect<T1, is_Mat_fixed<T1>::value >::result\n  {\n  typedef typename T1::elem_type eT;\n  \n  inline partial_unwrap_check(const eOp<T1, eop_neg>& A, const Mat<eT>& B)\n    : partial_unwrap_check_neg_redirect< T1, is_Mat_fixed<T1>::value >::result(A, B)\n    {\n    }\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap_check< eOp<Mat<eT>, eop_neg> >\n  {\n  typedef Mat<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const eOp<Mat<eT>,eop_neg>& A, const Mat<eT>& B)\n    : M_local( (&(A.P.Q) == &B) ? new Mat<eT>(A.P.Q) : 0     )\n    , M      ( (&(A.P.Q) == &B) ? *M_local           : A.P.Q )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_inline eT get_val() const { return eT(-1); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const Mat<eT>* M_local;\n  const Mat<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap_check< eOp<Row<eT>, eop_neg> >\n  {\n  typedef Row<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const eOp<Row<eT>,eop_neg>& A, const Mat<eT>& B)\n    : M_local( (&(A.P.Q) == &B) ? new Row<eT>(A.P.Q) : 0     )\n    , M      ( (&(A.P.Q) == &B) ? *M_local           : A.P.Q )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_inline eT get_val() const { return eT(-1); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const Row<eT>* M_local;\n  const Row<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct partial_unwrap_check< eOp<Col<eT>, eop_neg> >\n  {\n  typedef Col<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const eOp<Col<eT>,eop_neg>& A, const Mat<eT>& B)\n    : M_local( (&(A.P.Q) == &B) ? new Col<eT>(A.P.Q) : 0     )\n    , M      ( (&(A.P.Q) == &B) ? *M_local           : A.P.Q )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  inline\n  ~partial_unwrap_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local) { delete M_local; }\n    }\n  \n  arma_inline eT get_val() const { return eT(-1); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const Col<eT>* M_local;\n  const Col<eT>& M;\n  };\n\n\n\n// NOTE: we can get away with this shortcut as the partial_unwrap_check class is only used by the glue_times class,\n// NOTE: which relies on partial_unwrap_check to check for aliasing\ntemplate<typename eT>\nstruct partial_unwrap_check< eOp<subview_col<eT>, eop_neg> >\n  {\n  typedef Col<eT> stored_type;\n  \n  arma_hot inline\n  partial_unwrap_check(const eOp<subview_col<eT>,eop_neg>& A, const Mat<eT>& B)\n    : M  ( const_cast<eT*>( A.P.Q.colptr(0) ), A.P.Q.n_rows, (&(A.P.Q.m) == &B), false )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  arma_inline eT get_val() const { return eT(-1); }\n  \n  static const bool do_trans = false;\n  static const bool do_times = true;\n  \n  const Col<eT> M;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/unwrap_cube.hpp",
    "content": "// Copyright (C) 2008-2010 Conrad Sanderson\n// Copyright (C) 2008-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup unwrap_cube\n//! @{\n\n\n\ntemplate<typename T1>\nclass unwrap_cube\n  {\n  public:\n  \n  typedef typename T1::elem_type eT;\n  \n  inline\n  unwrap_cube(const T1& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const Cube<eT> M;\n  };\n\n\n\ntemplate<typename eT>\nclass unwrap_cube< Cube<eT> >\n  {\n  public:\n\n  inline\n  unwrap_cube(const Cube<eT>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n\n  const Cube<eT>& M;\n  };\n\n\n\n//\n//\n//\n\n\n\ntemplate<typename T1>\nclass unwrap_cube_check\n  {\n  public:\n  \n  typedef typename T1::elem_type eT;\n  \n  inline\n  unwrap_cube_check(const T1& A, const Cube<eT>&)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    \n    arma_type_check(( is_arma_cube_type<T1>::value == false ));\n    }\n  \n  const Cube<eT> M;\n  };\n\n\n\ntemplate<typename eT>\nclass unwrap_cube_check< Cube<eT> >\n  {\n  public:\n\n  inline\n  unwrap_cube_check(const Cube<eT>& A, const Cube<eT>& B)\n    : M_local( (&A == &B) ? new Cube<eT>(A) : 0 )\n    , M      ( (&A == &B) ? (*M_local)      : A )\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  \n  inline\n  ~unwrap_cube_check()\n    {\n    arma_extra_debug_sigprint();\n    \n    if(M_local)\n      {\n      delete M_local;\n      }\n    }\n  \n  \n  // the order below is important\n  const Cube<eT>* M_local;\n  const Cube<eT>& M;\n  \n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/unwrap_spmat.hpp",
    "content": "// Copyright (C) 2012-2015 Conrad Sanderson\n// Copyright (C) 2012-2015 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup unwrap_spmat\n//! @{\n\n\n\ntemplate<typename T1>\nstruct unwrap_spmat\n  {\n  typedef typename T1::elem_type eT;\n  \n  typedef SpMat<eT> stored_type;\n  \n  inline\n  unwrap_spmat(const T1& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const SpMat<eT> M;\n  };\n\n\n\ntemplate<typename eT>\nstruct unwrap_spmat< SpMat<eT> >\n  {\n  typedef SpMat<eT> stored_type;\n  \n  inline\n  unwrap_spmat(const SpMat<eT>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const SpMat<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct unwrap_spmat< SpRow<eT> >\n  {\n  typedef SpRow<eT> stored_type;\n  \n  inline\n  unwrap_spmat(const SpRow<eT>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const SpRow<eT>& M;\n  };\n\n\n\ntemplate<typename eT>\nstruct unwrap_spmat< SpCol<eT> >\n  {\n  typedef SpCol<eT> stored_type;\n  \n  inline\n  unwrap_spmat(const SpCol<eT>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const SpCol<eT>& M;\n  };\n\n\n\ntemplate<typename T1, typename spop_type>\nstruct unwrap_spmat< SpOp<T1, spop_type> >\n  {\n  typedef typename T1::elem_type eT;\n  \n  typedef SpMat<eT> stored_type;\n  \n  inline\n  unwrap_spmat(const SpOp<T1, spop_type>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const SpMat<eT> M;\n  };\n\n\n\ntemplate<typename T1, typename T2, typename spglue_type>\nstruct unwrap_spmat< SpGlue<T1, T2, spglue_type> >\n  {\n  typedef typename T1::elem_type eT;\n  \n  typedef SpMat<eT> stored_type;\n  \n  inline\n  unwrap_spmat(const SpGlue<T1, T2, spglue_type>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const SpMat<eT> M;\n  };\n\n\n\ntemplate<typename out_eT, typename T1, typename spop_type>\nstruct unwrap_spmat< mtSpOp<out_eT, T1, spop_type> >\n  {\n  typedef SpMat<out_eT> stored_type;\n  \n  inline\n  unwrap_spmat(const mtSpOp<out_eT, T1, spop_type>& A)\n    : M(A)\n    {\n    arma_extra_debug_sigprint();\n    }\n  \n  const SpMat<out_eT> M;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/upgrade_val.hpp",
    "content": "// Copyright (C) 2009-2010 Conrad Sanderson\n// Copyright (C) 2009-2010 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup upgrade_val\n//! @{\n\n\n\n//! upgrade_val is used to ensure an operation such as multiplication is possible between two types.\n//! values are upgraded only where necessary.\n\ntemplate<typename T1, typename T2>\nstruct upgrade_val\n  {\n  typedef typename promote_type<T1,T2>::result T1_result;\n  typedef typename promote_type<T1,T2>::result T2_result;\n  \n  arma_inline\n  static\n  typename promote_type<T1,T2>::result\n  apply(const T1 x)\n    {\n    typedef typename promote_type<T1,T2>::result out_type;\n    return out_type(x);\n    }\n  \n  arma_inline\n  static\n  typename promote_type<T1,T2>::result\n  apply(const T2 x)\n    {\n    typedef typename promote_type<T1,T2>::result out_type;\n    return out_type(x);\n    }\n  \n  };\n\n\n// template<>\ntemplate<typename T>\nstruct upgrade_val<T,T>\n  {\n  typedef T T1_result;\n  typedef T T2_result;\n  \n  arma_inline static const T& apply(const T& x) { return x; }\n  };\n\n\n//! upgrade a type to allow multiplication with a complex type\n//! e.g. the int in \"int * complex<double>\" is upgraded to a double\n// template<>\ntemplate<typename T, typename T2>\nstruct upgrade_val< std::complex<T>, T2 >\n  {\n  typedef std::complex<T> T1_result;\n  typedef T               T2_result;\n  \n  arma_inline static const std::complex<T>& apply(const std::complex<T>& x) { return x;    }\n  arma_inline static       T                apply(const T2 x)               { return T(x); }\n  };\n\n\n// template<>\ntemplate<typename T1, typename T>\nstruct upgrade_val< T1, std::complex<T> >\n  {\n  typedef T               T1_result;\n  typedef std::complex<T> T2_result;\n  \n  arma_inline static       T                apply(const T1 x)               { return T(x); }\n  arma_inline static const std::complex<T>& apply(const std::complex<T>& x) { return x;    }\n  };\n\n\n//! ensure we don't lose precision when multiplying a complex number with a higher precision real number\ntemplate<>\nstruct upgrade_val< std::complex<float>, double >\n  {\n  typedef std::complex<double> T1_result;\n  typedef double               T2_result;\n  \n  arma_inline static const std::complex<double> apply(const std::complex<float>& x) { return std::complex<double>(x); }\n  arma_inline static       double               apply(const double x)               { return x; }\n  };\n\n\ntemplate<>\nstruct upgrade_val< double, std::complex<float> >\n  {\n  typedef double              T1_result;\n  typedef std::complex<float> T2_result;\n  \n  arma_inline static       double               apply(const double x)               { return x; }\n  arma_inline static const std::complex<double> apply(const std::complex<float>& x) { return std::complex<double>(x); }\n  };\n\n\n//! ensure we don't lose precision when multiplying complex numbers with different underlying types\ntemplate<>\nstruct upgrade_val< std::complex<float>, std::complex<double> >\n  {\n  typedef std::complex<double> T1_result;\n  typedef std::complex<double> T2_result;\n  \n  arma_inline static const std::complex<double>  apply(const std::complex<float>&  x) { return std::complex<double>(x); }\n  arma_inline static const std::complex<double>& apply(const std::complex<double>& x) { return x; }\n  };\n\n\ntemplate<>\nstruct upgrade_val< std::complex<double>, std::complex<float> >\n  {\n  typedef std::complex<double> T1_result;\n  typedef std::complex<double> T2_result;\n  \n  arma_inline static const std::complex<double>& apply(const std::complex<double>& x) { return x; }\n  arma_inline static const std::complex<double>  apply(const std::complex<float>&  x) { return std::complex<double>(x); }\n  };\n\n\n//! work around limitations in the complex class (at least as present in gcc 4.1 & 4.3)\ntemplate<>\nstruct upgrade_val< std::complex<double>, float >\n  {\n  typedef std::complex<double> T1_result;\n  typedef double               T2_result;\n  \n  arma_inline static const std::complex<double>& apply(const std::complex<double>& x) { return x; }\n  arma_inline static       double                apply(const float x)                 { return double(x); }\n  };\n\n\ntemplate<>\nstruct upgrade_val< float, std::complex<double> >\n  {\n  typedef double               T1_result;\n  typedef std::complex<double> T2_result;\n  \n  arma_inline static       double                apply(const float x)                 { return double(x); }\n  arma_inline static const std::complex<double>& apply(const std::complex<double>& x) { return x; }\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/wall_clock_bones.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup wall_clock\n//! @{\n\n\n//! Class for measuring time intervals\nclass wall_clock\n  {\n  public:\n  \n  inline  wall_clock();\n  inline ~wall_clock();\n  \n  inline void   tic();  //!< start the timer\n  inline double toc();  //!< return the number of seconds since the last call to tic()\n  \n  \n  private:\n  \n  bool valid;\n  \n  #if defined(ARMA_USE_CXX11) && !defined(ARMA_DONT_USE_CXX11_CHRONO)\n    std::chrono::steady_clock::time_point chrono_time1;\n  #elif defined(ARMA_HAVE_GETTIMEOFDAY)\n    struct timeval posix_time1;\n    struct timeval posix_time2;\n  #else\n    clock_t time1;\n  #endif\n  };\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/wall_clock_meat.hpp",
    "content": "// Copyright (C) 2008-2013 Conrad Sanderson\n// Copyright (C) 2008-2013 NICTA (www.nicta.com.au)\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup wall_clock\n//! @{\n\n\ninline\nwall_clock::wall_clock()\n  : valid(false)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ninline\nwall_clock::~wall_clock()\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ninline\nvoid\nwall_clock::tic()\n  {\n  arma_extra_debug_sigprint();\n  \n  #if defined(ARMA_USE_CXX11) && !defined(ARMA_DONT_USE_CXX11_CHRONO)\n    {\n    chrono_time1 = std::chrono::steady_clock::now();\n    valid = true;\n    }\n  #elif defined(ARMA_HAVE_GETTIMEOFDAY)\n    {\n    gettimeofday(&posix_time1, 0);\n    valid = true;\n    }\n  #else\n    {\n    time1 = clock();\n    valid = true;\n    }\n  #endif\n  }\n\n\n\ninline\ndouble\nwall_clock::toc()\n  {\n  arma_extra_debug_sigprint();\n  \n  if(valid)\n    {\n    #if defined(ARMA_USE_CXX11) && !defined(ARMA_DONT_USE_CXX11_CHRONO)\n      {\n      const std::chrono::steady_clock::time_point chrono_time2 = std::chrono::steady_clock::now();\n      \n      typedef std::chrono::duration<double> duration_type;\n      \n      const duration_type chrono_span = std::chrono::duration_cast< duration_type >(chrono_time2 - chrono_time1);\n      \n      return chrono_span.count();\n      }\n    #elif defined(ARMA_HAVE_GETTIMEOFDAY)\n      {\n      gettimeofday(&posix_time2, 0);\n      \n      const double tmp_time1 = posix_time1.tv_sec + posix_time1.tv_usec * 1.0e-6;\n      const double tmp_time2 = posix_time2.tv_sec + posix_time2.tv_usec * 1.0e-6;\n      \n      return tmp_time2 - tmp_time1;\n      }\n    #else\n      {\n      clock_t time2 = clock();\n      \n      clock_t diff = time2 - time1;\n      \n      return double(diff) / double(CLOCKS_PER_SEC);\n      }\n    #endif\n    }\n  else\n    {  \n    return 0.0;\n    }\n  }\n\n\n\n//! @}\n\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/xtrans_mat_bones.hpp",
    "content": "// Copyright (C) 2014 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup xtrans_mat\n//! @{\n\n\ntemplate<typename eT, bool do_conj>\nclass xtrans_mat : public Base<eT, xtrans_mat<eT, do_conj> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool is_row = false;\n  static const bool is_col = false;\n  \n  arma_aligned const   Mat<eT>& X;\n  arma_aligned mutable Mat<eT>  Y;\n  \n  arma_aligned const uword n_rows;\n  arma_aligned const uword n_cols;\n  arma_aligned const uword n_elem;\n  \n  inline explicit xtrans_mat(const Mat<eT>& in_X);\n  \n  inline void extract(Mat<eT>& out) const;\n  \n  inline eT operator[](const uword ii) const;\n  inline eT at_alt    (const uword ii) const;\n  \n  arma_inline eT at(const uword in_row, const uword in_col) const;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/xtrans_mat_meat.hpp",
    "content": "// Copyright (C) 2014 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup xtrans_mat\n//! @{\n\n\ntemplate<typename eT, bool do_conj>\ninline\nxtrans_mat<eT,do_conj>::xtrans_mat(const Mat<eT>& in_X)\n  : X     (in_X       )\n  , n_rows(in_X.n_cols)  // deliberately swapped\n  , n_cols(in_X.n_rows)\n  , n_elem(in_X.n_elem)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT, bool do_conj>\ninline\nvoid\nxtrans_mat<eT,do_conj>::extract(Mat<eT>& out) const\n  {\n  arma_extra_debug_sigprint();\n  \n  do_conj ? op_htrans::apply_mat(out, X) : op_strans::apply_mat(out, X);\n  }\n\n\n\ntemplate<typename eT, bool do_conj>\ninline\neT\nxtrans_mat<eT,do_conj>::operator[](const uword ii) const\n  {\n  if(Y.n_elem > 0)\n    {\n    return Y[ii];\n    }\n  else\n    {\n    do_conj ? op_htrans::apply_mat(Y, X) : op_strans::apply_mat(Y, X);\n    return Y[ii];\n    }\n  }\n\n\n\ntemplate<typename eT, bool do_conj>\ninline\neT\nxtrans_mat<eT,do_conj>::at_alt(const uword ii) const\n  {\n  return (*this).operator[](ii);\n  }\n\n\n\ntemplate<typename eT, bool do_conj>\narma_inline\neT\nxtrans_mat<eT,do_conj>::at(const uword in_row, const uword in_col) const\n  {\n  if(do_conj)\n    {\n    return access::alt_conj( X.at(in_col, in_row) ); // deliberately swapped\n    }\n  else\n    {\n    return X.at(in_col, in_row); // deliberately swapped\n    }\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/xvec_htrans_bones.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup xvec_htrans\n//! @{\n\n\ntemplate<typename eT>\nclass xvec_htrans : public Base<eT, xvec_htrans<eT> >\n  {\n  public:\n  \n  typedef eT                                       elem_type;\n  typedef typename get_pod_type<elem_type>::result pod_type;\n  \n  static const bool is_row = false;\n  static const bool is_col = false;\n  \n  arma_aligned const eT* const mem;\n  \n  const uword n_rows;\n  const uword n_cols;\n  const uword n_elem;\n  \n  \n  inline explicit xvec_htrans(const eT* const in_mem, const uword in_n_rows, const uword in_n_cols);\n  \n  inline void extract(Mat<eT>& out) const;\n  \n  inline eT operator[](const uword ii) const;\n  inline eT at_alt    (const uword ii) const;\n  \n  inline eT at        (const uword in_row, const uword in_col) const;\n  };\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/include/armadillo_bits/xvec_htrans_meat.hpp",
    "content": "// Copyright (C) 2013 Conrad Sanderson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public\n// License, v. 2.0. If a copy of the MPL was not distributed with this\n// file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n//! \\addtogroup xvec_htrans\n//! @{\n\n\ntemplate<typename eT>\ninline\nxvec_htrans<eT>::xvec_htrans(const eT* const in_mem, const uword in_n_rows, const uword in_n_cols)\n  : mem   (in_mem             )\n  , n_rows(in_n_cols          )  // deliberately swapped\n  , n_cols(in_n_rows          )\n  , n_elem(in_n_rows*in_n_cols)\n  {\n  arma_extra_debug_sigprint();\n  }\n\n\n\ntemplate<typename eT>\ninline\nvoid\nxvec_htrans<eT>::extract(Mat<eT>& out) const\n  {\n  arma_extra_debug_sigprint();\n  \n  // NOTE: this function assumes that matrix 'out' has already been set to the correct size\n  \n  const eT*  in_mem = mem;\n        eT* out_mem = out.memptr();\n  \n  const uword N = n_elem;\n  \n  for(uword ii=0; ii < N; ++ii)\n    {\n    out_mem[ii] = access::alt_conj( in_mem[ii] );\n    }\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nxvec_htrans<eT>::operator[](const uword ii) const\n  {\n  return access::alt_conj( mem[ii] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nxvec_htrans<eT>::at_alt(const uword ii) const\n  {\n  return access::alt_conj( mem[ii] );\n  }\n\n\n\ntemplate<typename eT>\ninline\neT\nxvec_htrans<eT>::at(const uword in_row, const uword in_col) const\n  {\n  //return (n_rows == 1) ? access::alt_conj( mem[in_col] ) : access::alt_conj( mem[in_row] );\n  \n  return access::alt_conj( mem[in_row + in_col] );  // either in_row or in_col must be zero, as we're storing a vector\n  }\n\n\n\n//! @}\n"
  },
  {
    "path": "OptolithiumC/libs/armadillo/src/wrapper.cpp",
    "content": "#include <climits>\n#include <limits>\n#include <complex>\n\n#if (__cplusplus >= 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X__)\n  #undef  ARMA_USE_CXX11\n  #define ARMA_USE_CXX11\n#endif\n\n#include \"armadillo_bits/config.hpp\"\n#undef ARMA_USE_WRAPPER\n\n#include \"armadillo_bits/compiler_setup.hpp\"\n#include \"armadillo_bits/typedef_elem.hpp\"\n#include \"armadillo_bits/include_atlas.hpp\"\n#include \"armadillo_bits/include_superlu.hpp\"\n\n\n#if defined(ARMA_USE_EXTERN_CXX11_RNG)\n  #include <random>\n  #include <ctime>\n  \n  #if defined(ARMA_HAVE_GETTIMEOFDAY)\n    #include <sys/time.h>\n  #endif\n  \n  namespace arma\n    {\n    #include \"armadillo_bits/arma_rng_cxx11.hpp\"\n    thread_local arma_rng_cxx11 arma_rng_cxx11_instance;\n    }\n#endif\n\n#if defined(ARMA_USE_HDF5_ALT)\n  #include <hdf5.h>\n  \n  #if defined(H5_USE_16_API_DEFAULT) || defined(H5_USE_16_API)\n    // #pragma message (\"disabling use of HDF5 due to its incompatible configuration\")\n    #undef ARMA_USE_HDF5_ALT\n  #endif\n\n#endif\n\nnamespace arma\n{\n\n#include \"armadillo_bits/blas_bones.hpp\"\n#include \"armadillo_bits/lapack_bones.hpp\"\n#include \"armadillo_bits/arpack_bones.hpp\"\n#include \"armadillo_bits/superlu_bones.hpp\"\n// no need to include hdf5_bones.hpp -- it only contains #defines for when ARMA_USE_HDF5_ALT is not defined.\n\n\n#if defined(ARMA_USE_HDF5_ALT)\n  // Wrapper functions: arma::H5open() and arma::H5check_version(), to hijack\n  // calls to H5open() and H5check_version().\n  herr_t H5open()\n    {\n    return ::H5open();\n    }\n  \n  herr_t H5check_version(unsigned majnum, unsigned minnum, unsigned relnum)\n    {\n    return ::H5check_version(majnum, minnum, relnum);\n    }\n#endif\n\n\n\n// at this stage we have prototypes for the real blas, lapack and atlas functions\n\n// now we make the wrapper functions\n\n\nextern \"C\"\n  {\n  #if defined(ARMA_USE_BLAS)\n    \n    float arma_fortran_prefix(arma_sdot)(blas_int* n, const float*  x, blas_int* incx, const float*  y, blas_int* incy)\n      {\n      return arma_fortran_noprefix(arma_sdot)(n, x, incx, y, incy);\n      }\n    \n    double arma_fortran_prefix(arma_ddot)(blas_int* n, const double* x, blas_int* incx, const double* y, blas_int* incy)\n      {\n      return arma_fortran_noprefix(arma_ddot)(n, x, incx, y, incy);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_sgemv)(const char* transA, const blas_int* m, const blas_int* n, const float*  alpha, const float*  A, const blas_int* ldA, const float*  x, const blas_int* incx, const float*  beta, float*  y, const blas_int* incy)\n      {\n      arma_fortran_noprefix(arma_sgemv)(transA, m, n, alpha, A, ldA, x, incx, beta, y, incy);\n      }\n    \n    void arma_fortran_prefix(arma_dgemv)(const char* transA, const blas_int* m, const blas_int* n, const double* alpha, const double* A, const blas_int* ldA, const double* x, const blas_int* incx, const double* beta, double* y, const blas_int* incy)\n      {\n      arma_fortran_noprefix(arma_dgemv)(transA, m, n, alpha, A, ldA, x, incx, beta, y, incy);\n      }\n    \n    void arma_fortran_prefix(arma_cgemv)(const char* transA, const blas_int* m, const blas_int* n, const void*   alpha, const void*   A, const blas_int* ldA, const void*   x, const blas_int* incx, const void*   beta, void*   y, const blas_int* incy)\n      {\n      arma_fortran_noprefix(arma_cgemv)(transA, m, n, alpha, A, ldA, x, incx, beta, y, incy);\n      }\n    \n    void arma_fortran_prefix(arma_zgemv)(const char* transA, const blas_int* m, const blas_int* n, const void*   alpha, const void*   A, const blas_int* ldA, const void*   x, const blas_int* incx, const void*   beta, void*   y, const blas_int* incy)\n      {\n      arma_fortran_noprefix(arma_zgemv)(transA, m, n, alpha, A, ldA, x, incx, beta, y, incy);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_sgemm)(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const float*  alpha, const float*  A, const blas_int* ldA, const float*  B, const blas_int* ldB, const float*  beta, float*  C, const blas_int* ldC)\n      {\n      arma_fortran_noprefix(arma_sgemm)(transA, transB, m, n, k, alpha, A, ldA, B, ldB, beta, C, ldC);\n      }\n    \n    void arma_fortran_prefix(arma_dgemm)(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const double* alpha, const double* A, const blas_int* ldA, const double* B, const blas_int* ldB, const double* beta, double* C, const blas_int* ldC)\n      {\n      arma_fortran_noprefix(arma_dgemm)(transA, transB, m, n, k, alpha, A, ldA, B, ldB, beta, C, ldC);\n      }\n    \n    void arma_fortran_prefix(arma_cgemm)(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const void*   alpha, const void*   A, const blas_int* ldA, const void*   B, const blas_int* ldB, const void*   beta, void*   C, const blas_int* ldC)\n      {\n      arma_fortran_noprefix(arma_cgemm)(transA, transB, m, n, k, alpha, A, ldA, B, ldB, beta, C, ldC);\n      }\n    \n    void arma_fortran_prefix(arma_zgemm)(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const void*   alpha, const void*   A, const blas_int* ldA, const void*   B, const blas_int* ldB, const void*   beta, void*   C, const blas_int* ldC)\n      {\n      arma_fortran_noprefix(arma_zgemm)(transA, transB, m, n, k, alpha, A, ldA, B, ldB, beta, C, ldC);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_ssyrk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const  float* alpha, const  float* A, const blas_int* ldA, const  float* beta,  float* C, const blas_int* ldC)\n      {\n      arma_fortran_noprefix(arma_ssyrk)(uplo, transA, n, k, alpha, A, ldA, beta, C, ldC);\n      }\n    \n    void arma_fortran_prefix(arma_dsyrk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const double* alpha, const double* A, const blas_int* ldA, const double* beta, double* C, const blas_int* ldC)\n      {\n      arma_fortran_noprefix(arma_dsyrk)(uplo, transA, n, k, alpha, A, ldA, beta, C, ldC);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_cherk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const  float* alpha, const void* A, const blas_int* ldA, const  float* beta, void* C, const blas_int* ldC)\n      {\n      arma_fortran_noprefix(arma_cherk)(uplo, transA, n, k, alpha, A, ldA, beta, C, ldC);\n      }\n    \n    void arma_fortran_prefix(arma_zherk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const double* alpha, const void* A, const blas_int* ldA, const double* beta, void* C, const blas_int* ldC)\n      {\n      arma_fortran_noprefix(arma_zherk)(uplo, transA, n, k, alpha, A, ldA, beta, C, ldC);\n      }\n    \n  #endif\n  \n  \n  \n  #if defined(ARMA_USE_LAPACK)\n    \n    void arma_fortran_prefix(arma_sgetrf)(blas_int* m, blas_int* n,  float* a, blas_int* lda, blas_int* ipiv, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_sgetrf)(m, n, a, lda, ipiv, info);\n      }\n    \n    void arma_fortran_prefix(arma_dgetrf)(blas_int* m, blas_int* n, double* a, blas_int* lda, blas_int* ipiv, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dgetrf)(m, n, a, lda, ipiv, info);\n      }\n\n    void arma_fortran_prefix(arma_cgetrf)(blas_int* m, blas_int* n,   void* a, blas_int* lda, blas_int* ipiv, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cgetrf)(m, n, a, lda, ipiv, info);\n      }\n    \n    void arma_fortran_prefix(arma_zgetrf)(blas_int* m, blas_int* n,   void* a, blas_int* lda, blas_int* ipiv, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zgetrf)(m, n, a, lda, ipiv, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_sgetri)(blas_int* n,  float* a, blas_int* lda, blas_int* ipiv,  float* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_sgetri)(n, a, lda, ipiv, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_dgetri)(blas_int* n, double* a, blas_int* lda, blas_int* ipiv, double* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dgetri)(n, a, lda, ipiv, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_cgetri)(blas_int* n,  void*  a, blas_int* lda, blas_int* ipiv,   void* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cgetri)(n, a, lda, ipiv, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_zgetri)(blas_int* n,  void*  a, blas_int* lda, blas_int* ipiv,   void* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zgetri)(n, a, lda, ipiv, work, lwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_strtri)(char* uplo, char* diag, blas_int* n,  float* a, blas_int* lda, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_strtri)(uplo, diag, n, a, lda, info);\n      }\n    \n    void arma_fortran_prefix(arma_dtrtri)(char* uplo, char* diag, blas_int* n, double* a, blas_int* lda, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dtrtri)(uplo, diag, n, a, lda, info);\n      }\n    \n    void arma_fortran_prefix(arma_ctrtri)(char* uplo, char* diag, blas_int* n,   void* a, blas_int* lda, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_ctrtri)(uplo, diag, n, a, lda, info);\n      }\n    \n    void arma_fortran_prefix(arma_ztrtri)(char* uplo, char* diag, blas_int* n,   void* a, blas_int* lda, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_ztrtri)(uplo, diag, n, a, lda, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_ssyev)(char* jobz, char* uplo, blas_int* n,  float* a, blas_int* lda,  float* w,  float* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_ssyev)(jobz, uplo, n, a, lda, w, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_dsyev)(char* jobz, char* uplo, blas_int* n, double* a, blas_int* lda, double* w, double* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dsyev)(jobz, uplo, n, a, lda, w, work, lwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_cheev)(char* jobz, char* uplo, blas_int* n,   void* a, blas_int* lda,  float* w,   void* work, blas_int* lwork,  float* rwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cheev)(jobz, uplo, n, a, lda, w, work, lwork, rwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_zheev)(char* jobz, char* uplo, blas_int* n,   void* a, blas_int* lda, double* w,   void* work, blas_int* lwork, double* rwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zheev)(jobz, uplo, n, a, lda, w, work, lwork, rwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_ssyevd)(char* jobz, char* uplo, blas_int* n,  float* a, blas_int* lda,  float* w,  float* work, blas_int* lwork, blas_int* iwork, blas_int* liwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_ssyevd)(jobz, uplo, n, a, lda, w, work, lwork, iwork, liwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_dsyevd)(char* jobz, char* uplo, blas_int* n, double* a, blas_int* lda, double* w, double* work, blas_int* lwork, blas_int* iwork, blas_int* liwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dsyevd)(jobz, uplo, n, a, lda, w, work, lwork, iwork, liwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_cheevd)(char* jobz, char* uplo, blas_int* n,   void* a, blas_int* lda,  float* w,   void* work, blas_int* lwork,  float* rwork, blas_int* lrwork, blas_int* iwork, blas_int* liwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cheevd)(jobz, uplo, n, a, lda, w, work, lwork, rwork, lrwork, iwork, liwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_zheevd)(char* jobz, char* uplo, blas_int* n,   void* a, blas_int* lda, double* w,   void* work, blas_int* lwork, double* rwork, blas_int* lrwork, blas_int* iwork, blas_int* liwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zheevd)(jobz, uplo, n, a, lda, w, work, lwork, rwork, lrwork, iwork, liwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_sgeev)(char* jobvl, char* jobvr, blas_int* n,  float* a, blas_int* lda,  float* wr,  float* wi,  float* vl, blas_int* ldvl,  float* vr, blas_int* ldvr,  float* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_sgeev)(jobvl, jobvr, n, a, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_dgeev)(char* jobvl, char* jobvr, blas_int* n, double* a, blas_int* lda, double* wr, double* wi, double* vl, blas_int* ldvl, double* vr, blas_int* ldvr, double* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dgeev)(jobvl, jobvr, n, a, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_cgeev)(char* jobvl, char* jobvr, blas_int* n, void* a, blas_int* lda, void* w, void* vl, blas_int* ldvl, void* vr, blas_int* ldvr, void* work, blas_int* lwork,  float* rwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cgeev)(jobvl, jobvr, n, a, lda, w, vl, ldvl, vr, ldvr, work, lwork, rwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_zgeev)(char* jobvl, char* jobvr, blas_int* n, void* a, blas_int* lda, void* w, void* vl, blas_int* ldvl, void* vr, blas_int* ldvr, void* work, blas_int* lwork, double* rwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zgeev)(jobvl, jobvr, n, a, lda, w, vl, ldvl, vr, ldvr, work, lwork, rwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_sggev)(char* jobvl, char* jobvr, blas_int* n,  float* a, blas_int* lda,  float* b, blas_int* ldb,  float* alphar,  float* alphai,  float* beta,  float* vl, blas_int* ldvl,  float* vr, blas_int* ldvr,  float* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_sggev)(jobvl, jobvr, n, a, lda, b, ldb, alphar, alphai, beta, vl, ldvl, vr, ldvr, work, lwork, info);\n      }\n      \n    void arma_fortran_prefix(arma_dggev)(char* jobvl, char* jobvr, blas_int* n, double* a, blas_int* lda, double* b, blas_int* ldb, double* alphar, double* alphai, double* beta, double* vl, blas_int* ldvl, double* vr, blas_int* ldvr, double* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dggev)(jobvl, jobvr, n, a, lda, b, ldb, alphar, alphai, beta, vl, ldvl, vr, ldvr, work, lwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_cggev)(char* jobvl, char* jobvr, blas_int* n, void* a, blas_int* lda, void* b, blas_int* ldb, void* alpha, void* beta, void* vl, blas_int* ldvl, void* vr, blas_int* ldvr, void* work, blas_int* lwork,  float* rwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cggev)(jobvl, jobvr, n, a, lda, b, ldb, alpha, beta, vl, ldvl, vr, ldvr, work, lwork, rwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_zggev)(char* jobvl, char* jobvr, blas_int* n, void* a, blas_int* lda, void* b, blas_int* ldb, void* alpha, void* beta, void* vl, blas_int* ldvl, void* vr, blas_int* ldvr, void* work, blas_int* lwork, double* rwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zggev)(jobvl, jobvr, n, a, lda, b, ldb, alpha, beta, vl, ldvl, vr, ldvr, work, lwork, rwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_spotrf)(char* uplo, blas_int* n,  float* a, blas_int* lda, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_spotrf)(uplo, n, a, lda, info);\n      }\n    \n    void arma_fortran_prefix(arma_dpotrf)(char* uplo, blas_int* n, double* a, blas_int* lda, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dpotrf)(uplo, n, a, lda, info);\n      }\n    \n    void arma_fortran_prefix(arma_cpotrf)(char* uplo, blas_int* n,   void* a, blas_int* lda, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cpotrf)(uplo, n, a, lda, info);\n      }\n    \n    void arma_fortran_prefix(arma_zpotrf)(char* uplo, blas_int* n,   void* a, blas_int* lda, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zpotrf)(uplo, n, a, lda, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_spotri)(char* uplo, blas_int* n,  float* a, blas_int* lda, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_spotri)(uplo, n, a, lda, info);\n      }\n    \n    void arma_fortran_prefix(arma_dpotri)(char* uplo, blas_int* n, double* a, blas_int* lda, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dpotri)(uplo, n, a, lda, info);\n      }\n    \n    void arma_fortran_prefix(arma_cpotri)(char* uplo, blas_int* n,   void* a, blas_int* lda, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cpotri)(uplo, n, a, lda, info);\n      }\n    \n    void arma_fortran_prefix(arma_zpotri)(char* uplo, blas_int* n,   void* a, blas_int* lda, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zpotri)(uplo, n, a, lda, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_sgeqrf)(blas_int* m, blas_int* n,  float* a, blas_int* lda,  float* tau,  float* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_sgeqrf)(m, n, a, lda, tau, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_dgeqrf)(blas_int* m, blas_int* n, double* a, blas_int* lda, double* tau, double* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dgeqrf)(m, n, a, lda, tau, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_cgeqrf)(blas_int* m, blas_int* n,   void* a, blas_int* lda,   void* tau,   void* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cgeqrf)(m, n, a, lda, tau, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_zgeqrf)(blas_int* m, blas_int* n,   void* a, blas_int* lda,   void* tau,   void* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zgeqrf)(m, n, a, lda, tau, work, lwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_sorgqr)(blas_int* m, blas_int* n, blas_int* k,  float* a, blas_int* lda,  float* tau,  float* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_sorgqr)(m, n, k, a, lda, tau, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_dorgqr)(blas_int* m, blas_int* n, blas_int* k, double* a, blas_int* lda, double* tau, double* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dorgqr)(m, n, k, a, lda, tau, work, lwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_cungqr)(blas_int* m, blas_int* n, blas_int* k,   void* a, blas_int* lda,   void* tau,   void* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cungqr)(m, n, k, a, lda, tau, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_zungqr)(blas_int* m, blas_int* n, blas_int* k,   void* a, blas_int* lda,   void* tau,   void* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zungqr)(m, n, k, a, lda, tau, work, lwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_sgesvd)(char* jobu, char* jobvt, blas_int* m, blas_int* n, float*  a, blas_int* lda, float*  s, float*  u, blas_int* ldu, float*  vt, blas_int* ldvt, float*  work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_sgesvd)(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_dgesvd)(char* jobu, char* jobvt, blas_int* m, blas_int* n, double* a, blas_int* lda, double* s, double* u, blas_int* ldu, double* vt, blas_int* ldvt, double* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dgesvd)(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, work, lwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_cgesvd)(char* jobu, char* jobvt, blas_int* m, blas_int* n, void*   a, blas_int* lda, float*  s, void*   u, blas_int* ldu, void*   vt, blas_int* ldvt, void*   work, blas_int* lwork, float*  rwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cgesvd)(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, work, lwork, rwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_zgesvd)(char* jobu, char* jobvt, blas_int* m, blas_int* n, void*   a, blas_int* lda, double* s, void*   u, blas_int* ldu, void*   vt, blas_int* ldvt, void*   work, blas_int* lwork, double* rwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zgesvd)(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, work, lwork, rwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_sgesdd)(char* jobz, blas_int* m, blas_int* n, float*  a, blas_int* lda, float*  s, float*  u, blas_int* ldu, float*  vt, blas_int* ldvt, float*  work, blas_int* lwork, blas_int* iwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_sgesdd)(jobz, m, n, a, lda, s, u, ldu, vt, ldvt, work, lwork, iwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_dgesdd)(char* jobz, blas_int* m, blas_int* n, double* a, blas_int* lda, double* s, double* u, blas_int* ldu, double* vt, blas_int* ldvt, double* work, blas_int* lwork, blas_int* iwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dgesdd)(jobz, m, n, a, lda, s, u, ldu, vt, ldvt, work, lwork, iwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_cgesdd)(char* jobz, blas_int* m, blas_int* n, void* a, blas_int* lda, float*  s, void* u, blas_int* ldu, void* vt, blas_int* ldvt, void* work, blas_int* lwork, float*  rwork, blas_int* iwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cgesdd)(jobz, m, n, a, lda, s, u, ldu, vt, ldvt, work, lwork, rwork, iwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_zgesdd)(char* jobz, blas_int* m, blas_int* n, void* a, blas_int* lda, double* s, void* u, blas_int* ldu, void* vt, blas_int* ldvt, void* work, blas_int* lwork, double* rwork, blas_int* iwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zgesdd)(jobz, m, n, a, lda, s, u, ldu, vt, ldvt, work, lwork, rwork, iwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_sgesv)(blas_int* n, blas_int* nrhs, float*  a, blas_int* lda, blas_int* ipiv, float*  b, blas_int* ldb, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_sgesv)(n, nrhs, a, lda, ipiv, b, ldb, info);\n      }\n    \n    void arma_fortran_prefix(arma_dgesv)(blas_int* n, blas_int* nrhs, double* a, blas_int* lda, blas_int* ipiv, double* b, blas_int* ldb, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dgesv)(n, nrhs, a, lda, ipiv, b, ldb, info);\n      }\n    \n    void arma_fortran_prefix(arma_cgesv)(blas_int* n, blas_int* nrhs, void*   a, blas_int* lda, blas_int* ipiv, void*   b, blas_int* ldb, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cgesv)(n, nrhs, a, lda, ipiv, b, ldb, info);\n      }\n    \n    void arma_fortran_prefix(arma_zgesv)(blas_int* n, blas_int* nrhs, void*   a, blas_int* lda, blas_int* ipiv, void*   b, blas_int* ldb, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zgesv)(n, nrhs, a, lda, ipiv, b, ldb, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_sgels)(char* trans, blas_int* m, blas_int* n, blas_int* nrhs, float*  a, blas_int* lda, float*  b, blas_int* ldb, float*  work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_sgels)(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_dgels)(char* trans, blas_int* m, blas_int* n, blas_int* nrhs, double* a, blas_int* lda, double* b, blas_int* ldb, double* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dgels)(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_cgels)(char* trans, blas_int* m, blas_int* n, blas_int* nrhs, void*   a, blas_int* lda, void*   b, blas_int* ldb, void*   work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cgels)(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_zgels)(char* trans, blas_int* m, blas_int* n, blas_int* nrhs, void*   a, blas_int* lda, void*   b, blas_int* ldb, void*   work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zgels)(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, info);\n      }\n    \n    \n    \n    \n    void arma_fortran_prefix(arma_strtrs)(char* uplo, char* trans, char* diag, blas_int* n, blas_int* nrhs, const float*  a, blas_int* lda, float*  b, blas_int* ldb, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_strtrs)(uplo, trans, diag, n, nrhs, a, lda, b, ldb, info);\n      }\n    \n    void arma_fortran_prefix(arma_dtrtrs)(char* uplo, char* trans, char* diag, blas_int* n, blas_int* nrhs, const double* a, blas_int* lda, double* b, blas_int* ldb, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dtrtrs)(uplo, trans, diag, n, nrhs, a, lda, b, ldb, info);\n      }\n    \n    void arma_fortran_prefix(arma_ctrtrs)(char* uplo, char* trans, char* diag, blas_int* n, blas_int* nrhs, const void*   a, blas_int* lda, void*   b, blas_int* ldb, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_ctrtrs)(uplo, trans, diag, n, nrhs, a, lda, b, ldb, info);\n      }\n    \n    void arma_fortran_prefix(arma_ztrtrs)(char* uplo, char* trans, char* diag, blas_int* n, blas_int* nrhs, const void*   a, blas_int* lda, void*   b, blas_int* ldb, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_ztrtrs)(uplo, trans, diag, n, nrhs, a, lda, b, ldb, info);\n      }\n    \n    \n    \n    \n    void arma_fortran_prefix(arma_sgees)(char* jobvs, char* sort, blas_int* select, blas_int* n, float*  a, blas_int* lda, blas_int* sdim, float*  wr, float*  wi, float*  vs, blas_int* ldvs, float*  work, blas_int* lwork, blas_int* bwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_sgees)(jobvs, sort, select, n, a, lda, sdim, wr, wi, vs, ldvs, work, lwork, bwork, info);\n      }\n      \n    void arma_fortran_prefix(arma_dgees)(char* jobvs, char* sort, blas_int* select, blas_int* n, double* a, blas_int* lda, blas_int* sdim, double* wr, double* wi, double* vs, blas_int* ldvs, double* work, blas_int* lwork, blas_int* bwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dgees)(jobvs, sort, select, n, a, lda, sdim, wr, wi, vs, ldvs, work, lwork, bwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_cgees)(char* jobvs, char* sort, blas_int* select, blas_int* n, void* a, blas_int* lda, blas_int* sdim, void* w, void* vs, blas_int* ldvs, void* work, blas_int* lwork, float*  rwork, blas_int* bwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cgees)(jobvs, sort, select, n, a, lda, sdim, w, vs, ldvs, work, lwork, rwork, bwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_zgees)(char* jobvs, char* sort, blas_int* select, blas_int* n, void* a, blas_int* lda, blas_int* sdim, void* w, void* vs, blas_int* ldvs, void* work, blas_int* lwork, double* rwork, blas_int* bwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zgees)(jobvs, sort, select, n, a, lda, sdim, w, vs, ldvs, work, lwork, rwork, bwork, info);\n      }\n    \n    \n    \n    void arma_fortran_prefix(arma_strsyl)(char* transa, char* transb, blas_int* isgn, blas_int* m, blas_int* n, const float*  a, blas_int* lda, const float*  b, blas_int* ldb, float*  c, blas_int* ldc, float*  scale, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_strsyl)(transa, transb, isgn, m, n, a, lda, b, ldb, c, ldc, scale, info);\n      }\n    \n    void arma_fortran_prefix(arma_dtrsyl)(char* transa, char* transb, blas_int* isgn, blas_int* m, blas_int* n, const double* a, blas_int* lda, const double* b, blas_int* ldb, double* c, blas_int* ldc, double* scale, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dtrsyl)(transa, transb, isgn, m, n, a, lda, b, ldb, c, ldc, scale, info);\n      }\n    \n    void arma_fortran_prefix(arma_ctrsyl)(char* transa, char* transb, blas_int* isgn, blas_int* m, blas_int* n, const void*   a, blas_int* lda, const void*   b, blas_int* ldb, void*   c, blas_int* ldc, float*  scale, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_ctrsyl)(transa, transb, isgn, m, n, a, lda, b, ldb, c, ldc, scale, info);\n      }\n    \n    void arma_fortran_prefix(arma_ztrsyl)(char* transa, char* transb, blas_int* isgn, blas_int* m, blas_int* n, const void*   a, blas_int* lda, const void*   b, blas_int* ldb, void*   c, blas_int* ldc, double* scale, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_ztrsyl)(transa, transb, isgn, m, n, a, lda, b, ldb, c, ldc, scale, info);\n      }\n    \n    \n    \n    \n    void arma_fortran_prefix(arma_ssytrf)(char* uplo, blas_int* n, float*  a, blas_int* lda, blas_int* ipiv, float*  work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_ssytrf)(uplo, n, a, lda, ipiv, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_dsytrf)(char* uplo, blas_int* n, double* a, blas_int* lda, blas_int* ipiv, double* work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dsytrf)(uplo, n, a, lda, ipiv, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_csytrf)(char* uplo, blas_int* n, void*   a, blas_int* lda, blas_int* ipiv, void*   work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_csytrf)(uplo, n, a, lda, ipiv, work, lwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_zsytrf)(char* uplo, blas_int* n, void*   a, blas_int* lda, blas_int* ipiv, void*   work, blas_int* lwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zsytrf)(uplo, n, a, lda, ipiv, work, lwork, info);\n      }\n    \n    \n    \n    \n    void arma_fortran_prefix(arma_ssytri)(char* uplo, blas_int* n, float*  a, blas_int* lda, blas_int* ipiv, float*  work, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_ssytri)(uplo, n, a, lda, ipiv, work, info);\n      }\n    \n    void arma_fortran_prefix(arma_dsytri)(char* uplo, blas_int* n, double* a, blas_int* lda, blas_int* ipiv, double* work, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dsytri)(uplo, n, a, lda, ipiv, work, info);\n      }\n    \n    void arma_fortran_prefix(arma_csytri)(char* uplo, blas_int* n, void*   a, blas_int* lda, blas_int* ipiv, void*   work, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_csytri)(uplo, n, a, lda, ipiv, work, info);\n      }\n    \n    void arma_fortran_prefix(arma_zsytri)(char* uplo, blas_int* n, void*   a, blas_int* lda, blas_int* ipiv, void*   work, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zsytri)(uplo, n, a, lda, ipiv, work, info);\n      }\n  \n  \n  \n  \n    void arma_fortran_prefix(arma_sgges)(char* jobvsl, char* jobvsr, char* sort, char* selctg, blas_int* n,  float* a, blas_int* lda,  float* b, blas_int* ldb, blas_int* sdim,  float* alphar,  float* alphai,  float* beta,  float* vsl, blas_int* ldvsl,  float* vsr, blas_int* ldvsr,  float* work, blas_int* lwork,  float* bwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_sgges)(jobvsl, jobvsr, sort, selctg, n, a, lda, b, ldb, sdim, alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr, work, lwork, bwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_dgges)(char* jobvsl, char* jobvsr, char* sort, char* selctg, blas_int* n, double* a, blas_int* lda, double* b, blas_int* ldb, blas_int* sdim, double* alphar, double* alphai, double* beta, double* vsl, blas_int* ldvsl, double* vsr, blas_int* ldvsr, double* work, blas_int* lwork, double* bwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dgges)(jobvsl, jobvsr, sort, selctg, n, a, lda, b, ldb, sdim, alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr, work, lwork, bwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_cgges)(char* jobvsl, char* jobvsr, char* sort, char* selctg, blas_int* n, void* a, blas_int* lda, void* b, blas_int* ldb, blas_int* sdim, void* alpha, void* beta, void* vsl, blas_int* ldvsl, void* vsr, blas_int* ldvsr, void* work, blas_int* lwork,  float* rwork,  float* bwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cgges)(jobvsl, jobvsr, sort, selctg, n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, work, lwork, rwork, bwork, info);\n      }\n    \n    void arma_fortran_prefix(arma_zgges)(char* jobvsl, char* jobvsr, char* sort, char* selctg, blas_int* n, void* a, blas_int* lda, void* b, blas_int* ldb, blas_int* sdim, void* alpha, void* beta, void* vsl, blas_int* ldvsl, void* vsr, blas_int* ldvsr, void* work, blas_int* lwork, double* rwork, double* bwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zgges)(jobvsl, jobvsr, sort, selctg, n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, work, lwork, rwork, bwork, info);\n      }\n    \n  #endif\n  \n  \n  \n  #if defined(ARMA_USE_ATLAS)\n    \n    float wrapper_cblas_sdot(const int N, const float  *X, const int incX, const float  *Y, const int incY)\n      {\n      return      cblas_sdot(N, X, incX, Y, incY);\n      }\n    \n    double wrapper_cblas_ddot(const int N, const double *X, const int incX, const double *Y, const int incY)\n      {\n      return       cblas_ddot(N, X, incX, Y, incY);\n      }\n    \n    void wrapper_cblas_cdotu_sub(const int N, const void *X, const int incX, const void *Y, const int incY, void *dotu)\n      {\n                 cblas_cdotu_sub(N, X, incX, Y, incY, dotu);\n      }\n    \n    void wrapper_cblas_zdotu_sub(const int N, const void *X, const int incX, const void *Y, const int incY, void *dotu)\n      {\n                 cblas_zdotu_sub(N, X, incX, Y, incY, dotu);\n      }\n    \n    \n    \n    void wrapper_cblas_sgemv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const float alpha,\n                             const float *A, const int lda, const float *X, const int incX, const float beta, float *Y, const int incY)\n      {\n                 cblas_sgemv(Order, TransA, M, N, alpha, A, lda, X, incX, beta, Y, incY);\n      }\n    \n    void wrapper_cblas_dgemv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const double alpha,\n                             const double *A, const int lda, const double *X, const int incX, const double beta, double *Y, const int incY)\n      {\n                 cblas_dgemv(Order, TransA, M, N, alpha, A, lda, X, incX, beta, Y, incY);\n      }\n    \n    void wrapper_cblas_cgemv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const void *alpha,\n                             const void *A, const int lda, const void *X, const int incX, const void *beta, void *Y, const int incY)\n      {\n                 cblas_cgemv(Order, TransA, M, N, alpha, A, lda, X, incX, beta, Y, incY);\n      }\n    \n    void wrapper_cblas_zgemv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const void *alpha,\n                             const void *A, const int lda, const void *X, const int incX, const void *beta, void *Y, const int incY)\n      {\n                 cblas_zgemv(Order, TransA, M, N, alpha, A, lda, X, incX, beta, Y, incY);\n      }\n    \n    \n    \n    void wrapper_cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB,\n                             const int M, const int N, const int K, const float alpha,\n                             const float *A, const int lda, const float *B, const int ldb, const float beta, float *C, const int ldc)\n      {\n                 cblas_sgemm(Order, TransA, TransB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);\n      }\n    \n    void wrapper_cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB,\n                             const int M, const int N, const int K, const double alpha,\n                             const double *A, const int lda, const double *B, const int ldb, const double beta, double *C, const int ldc)\n      {\n                 cblas_dgemm(Order, TransA, TransB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);\n      }\n    \n    void wrapper_cblas_cgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB,\n                             const int M, const int N, const int K, const void *alpha,\n                             const void *A, const int lda, const void *B, const int ldb, const void *beta, void *C, const int ldc)\n      {\n                 cblas_cgemm(Order, TransA, TransB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);\n      }\n    \n    void wrapper_cblas_zgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB,\n                             const int M, const int N, const int K, const void *alpha,\n                             const void *A, const int lda, const void *B, const int ldb, const void *beta, void *C, const int ldc)\n      {\n                 cblas_zgemm(Order, TransA, TransB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);\n      }\n    \n    \n    \n    void wrapper_cblas_ssyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans,\n                             const int N, const int K, const float alpha,\n                             const float *A, const int lda, const float beta, float *C, const int ldc)\n      {\n                 cblas_ssyrk(Order, Uplo, Trans, N, K, alpha, A, lda, beta, C, ldc);\n      }\n    \n    void wrapper_cblas_dsyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans,\n                             const int N, const int K, const double alpha,\n                             const double *A, const int lda, const double beta, double *C, const int ldc)\n      {\n                 cblas_dsyrk(Order, Uplo, Trans, N, K, alpha, A, lda, beta, C, ldc);\n      }\n    \n    \n    \n    void wrapper_cblas_cherk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans,\n                             const int N, const int K, const float alpha,\n                             const void *A, const int lda, const float beta, void *C, const int ldc)\n      {\n                 cblas_cherk(Order, Uplo, Trans, N, K, alpha, A, lda, beta, C, ldc);\n      }\n    \n    void wrapper_cblas_zherk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans,\n                             const int N, const int K, const double alpha,\n                             const void *A, const int lda, const double beta, void *C, const int ldc)\n      {\n                 cblas_zherk(Order, Uplo, Trans, N, K, alpha, A, lda, beta, C, ldc);\n      }\n    \n    \n    \n    int wrapper_clapack_sgetrf(const enum CBLAS_ORDER Order, const int M, const int N, float  *A, const int lda, int *ipiv)\n      {\n      return    clapack_sgetrf(Order, M, N, A, lda, ipiv);\n      }\n    \n    int wrapper_clapack_dgetrf(const enum CBLAS_ORDER Order, const int M, const int N, double *A, const int lda, int *ipiv)\n      {\n      return    clapack_dgetrf(Order, M, N, A, lda, ipiv);\n      }\n    \n    int wrapper_clapack_cgetrf(const enum CBLAS_ORDER Order, const int M, const int N, void   *A, const int lda, int *ipiv)\n      {\n      return    clapack_cgetrf(Order, M, N, A, lda, ipiv);\n      }\n    \n    int wrapper_clapack_zgetrf(const enum CBLAS_ORDER Order, const int M, const int N, void   *A, const int lda, int *ipiv)\n      {\n      return    clapack_zgetrf(Order, M, N, A, lda, ipiv);\n      }\n    \n    \n    \n    int wrapper_clapack_sgetri(const enum CBLAS_ORDER Order, const int N, float  *A, const int lda, const int *ipiv)\n      {\n      return    clapack_sgetri(Order, N, A, lda, ipiv);\n      }\n    \n    int wrapper_clapack_dgetri(const enum CBLAS_ORDER Order, const int N, double *A, const int lda, const int *ipiv)\n      {\n      return    clapack_dgetri(Order, N, A, lda, ipiv);\n      }\n    \n    int wrapper_clapack_cgetri(const enum CBLAS_ORDER Order, const int N, void   *A, const int lda, const int *ipiv)\n      {\n      return    clapack_cgetri(Order, N, A, lda, ipiv);\n      }\n    \n    int wrapper_clapack_zgetri(const enum CBLAS_ORDER Order, const int N, void   *A, const int lda, const int *ipiv)\n      {\n      return    clapack_zgetri(Order, N, A, lda, ipiv);\n      }\n    \n    \n    \n    int wrapper_clapack_sgesv(const enum CBLAS_ORDER Order, const int N, const int NRHS, float  *A, const int lda, int *ipiv, float  *B, const int ldb)\n      {\n      return    clapack_sgesv(Order, N, NRHS, A, lda, ipiv, B, ldb);\n      }\n    \n    int wrapper_clapack_dgesv(const enum CBLAS_ORDER Order, const int N, const int NRHS, double *A, const int lda, int *ipiv, double *B, const int ldb)\n      {\n      return    clapack_dgesv(Order, N, NRHS, A, lda, ipiv, B, ldb);\n      }\n    \n    int wrapper_clapack_cgesv(const enum CBLAS_ORDER Order, const int N, const int NRHS, void   *A, const int lda, int *ipiv, void   *B, const int ldb)\n      {\n      return    clapack_cgesv(Order, N, NRHS, A, lda, ipiv, B, ldb);\n      }\n    \n    int wrapper_clapack_zgesv(const enum CBLAS_ORDER Order, const int N, const int NRHS, void   *A, const int lda, int *ipiv, void   *B, const int ldb)\n      {\n      return    clapack_zgesv(Order, N, NRHS, A, lda, ipiv, B, ldb);\n      }\n    \n  #endif\n\n\n\n  #if defined(ARMA_USE_ARPACK)\n\n    void arma_fortran_prefix(arma_snaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, float* resid, blas_int* ncv, float* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, float* workd, float* workl, blas_int* lworkl, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_snaupd)(ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, info);\n      }\n\n    void arma_fortran_prefix(arma_dnaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, double* resid, blas_int* ncv, double* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, double* workd, double* workl, blas_int* lworkl, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dnaupd)(ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, info);\n      }\n\n    void arma_fortran_prefix(arma_cnaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, void* resid, blas_int* ncv, void* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, void* workd, void* workl, blas_int* lworkl, float* rwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cnaupd)(ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, rwork, info);\n      }\n\n    void arma_fortran_prefix(arma_znaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, void* resid, blas_int* ncv, void* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, void* workd, void* workl, blas_int* lworkl, double* rwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_znaupd)(ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, rwork, info);\n      }\n\n\n    void arma_fortran_prefix(arma_sneupd)(blas_int* rvec, char* howmny, blas_int* select, float* dr, float* di, float* z, blas_int* ldz, float* sigmar, float* sigmai, float* workev, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, float* resid, blas_int* ncv, float* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, float* workd, float* workl, blas_int* lworkl, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_sneupd)(rvec, howmny, select, dr, di, z, ldz, sigmar, sigmai, workev, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, info);\n      }\n\n    void arma_fortran_prefix(arma_dneupd)(blas_int* rvec, char* howmny, blas_int* select, double* dr, double* di, double* z, blas_int* ldz, double* sigmar, double* sigmai, double* workev, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, double* resid, blas_int* ncv, double* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, double* workd, double* workl, blas_int* lworkl, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dneupd)(rvec, howmny, select, dr, di, z, ldz, sigmar, sigmai, workev, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, info);\n      }\n\n    void arma_fortran_prefix(arma_cneupd)(blas_int* rvec, char* howmny, blas_int* select, void* d, void* z, blas_int* ldz, void* sigma, void* workev, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, void* resid, blas_int* ncv, void* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, void* workd, void* workl, blas_int* lworkl, float* rwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_cneupd)(rvec, howmny, select, d, z, ldz, sigma, workev, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, rwork, info);\n      }\n\n    void arma_fortran_prefix(arma_zneupd)(blas_int* rvec, char* howmny, blas_int* select, void* d, void* z, blas_int* ldz, void* sigma, void* workev, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, void* resid, blas_int* ncv, void* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, void* workd, void* workl, blas_int* lworkl, double* rwork, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_zneupd)(rvec, howmny, select, d, z, ldz, sigma, workev, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, rwork, info);\n      }\n\n\n    void arma_fortran_prefix(arma_ssaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, float* resid, blas_int* ncv, float* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, float* workd, float* workl, blas_int* lworkl, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_ssaupd)(ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, info);\n      }\n\n    void arma_fortran_prefix(arma_dsaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, double* resid, blas_int* ncv, double* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, double* workd, double* workl, blas_int* lworkl, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dsaupd)(ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, info);\n      }\n\n\n    void arma_fortran_prefix(arma_sseupd)(blas_int* rvec, char* howmny, blas_int* select, float* d, float* z, blas_int* ldz, float* sigma, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, float* resid, blas_int* ncv, float* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, float* workd, float* workl, blas_int* lworkl, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_sseupd)(rvec, howmny, select, d, z, ldz, sigma, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, info);\n      }\n\n    void arma_fortran_prefix(arma_dseupd)(blas_int* rvec, char* howmny, blas_int* select, double* d, double* z, blas_int* ldz, double* sigma, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, double* resid, blas_int* ncv, double* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, double* workd, double* workl, blas_int* lworkl, blas_int* info)\n      {\n      arma_fortran_noprefix(arma_dseupd)(rvec, howmny, select, d, z, ldz, sigma, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, info);\n      }\n\n  #endif\n  \n  \n  \n  #if defined(ARMA_USE_SUPERLU)\n    \n    void wrapper_sgssv(superlu::superlu_options_t* a, superlu::SuperMatrix* b, int* c, int* d, superlu::SuperMatrix* e, superlu::SuperMatrix* f, superlu::SuperMatrix* g, superlu::SuperLUStat_t* h, int* i)\n      {\n      sgssv(a,b,c,d,e,f,g,h,i);\n      }\n    \n    void wrapper_dgssv(superlu::superlu_options_t* a, superlu::SuperMatrix* b, int* c, int* d, superlu::SuperMatrix* e, superlu::SuperMatrix* f, superlu::SuperMatrix* g, superlu::SuperLUStat_t* h, int* i)\n      {\n      dgssv(a,b,c,d,e,f,g,h,i);\n      }\n    \n    void wrapper_cgssv(superlu::superlu_options_t* a, superlu::SuperMatrix* b, int* c, int* d, superlu::SuperMatrix* e, superlu::SuperMatrix* f, superlu::SuperMatrix* g, superlu::SuperLUStat_t* h, int* i)\n      {\n      cgssv(a,b,c,d,e,f,g,h,i);\n      }\n    \n    void wrapper_zgssv(superlu::superlu_options_t* a, superlu::SuperMatrix* b, int* c, int* d, superlu::SuperMatrix* e, superlu::SuperMatrix* f, superlu::SuperMatrix* g, superlu::SuperLUStat_t* h, int* i)\n      {\n      zgssv(a,b,c,d,e,f,g,h,i);\n      }\n    \n    void wrapper_StatInit(superlu::SuperLUStat_t* a)\n      {\n      StatInit(a);\n      }\n\n    void wrapper_StatFree(superlu::SuperLUStat_t* a)\n      {\n      StatFree(a);\n      }\n      \n    void wrapper_set_default_options(superlu::superlu_options_t* a)\n      {\n      set_default_options(a);\n      }\n    \n    void wrapper_Destroy_SuperNode_Matrix(superlu::SuperMatrix* a)\n      {\n      Destroy_SuperNode_Matrix(a);\n      }\n\n    void wrapper_Destroy_CompCol_Matrix(superlu::SuperMatrix* a)\n      {\n      Destroy_CompCol_Matrix(a);\n      }\n\n    void wrapper_Destroy_SuperMatrix_Store(superlu::SuperMatrix* a)\n      {\n      Destroy_SuperMatrix_Store(a);\n      }\n    \n    void* wrapper_superlu_malloc(size_t a)\n      {\n      return superlu_malloc(a);\n      }\n    \n    void wrapper_superlu_free(void* a)\n      {\n      superlu_free(a);\n      }\n    \n  #endif\n  \n  \n  \n  #if defined(ARMA_USE_HDF5_ALT)\n  \n    hid_t arma_H5Tcopy(hid_t dtype_id)\n      {\n      return H5Tcopy(dtype_id);\n      }\n    \n    hid_t arma_H5Tcreate(H5T_class_t cl, size_t size)\n      {\n      return H5Tcreate(cl, size);\n      }\n    \n    herr_t arma_H5Tinsert(hid_t dtype_id, const char* name, size_t offset, hid_t field_id)\n      {\n      return H5Tinsert(dtype_id, name, offset, field_id);\n      }\n    \n    htri_t arma_H5Tequal(hid_t dtype_id1, hid_t dtype_id2)\n      {\n      return H5Tequal(dtype_id1, dtype_id2);\n      }\n    \n    herr_t arma_H5Tclose(hid_t dtype_id)\n      {\n      return H5Tclose(dtype_id);\n      }\n    \n    hid_t arma_H5Dopen(hid_t loc_id, const char* name, hid_t dapl_id)\n      {\n      return H5Dopen(loc_id, name, dapl_id);\n      }\n    \n    hid_t arma_H5Dget_type(hid_t dataset_id)\n      {\n      return H5Dget_type(dataset_id);\n      }\n    \n    hid_t arma_H5Dcreate(hid_t loc_id, const char* name, hid_t dtype_id, hid_t space_id, hid_t lcpl_id, hid_t dcpl_id, hid_t dapl_id)\n      {\n      return H5Dcreate(loc_id, name, dtype_id, space_id, lcpl_id, dcpl_id, dapl_id);\n      }\n    \n    herr_t arma_H5Dwrite(hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id, hid_t xfer_plist_id, const void* buf)\n      {\n      return H5Dwrite(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf);\n      }\n    \n    herr_t arma_H5Dclose(hid_t dataset_id)\n      {\n      return H5Dclose(dataset_id);\n      }\n    \n    hid_t arma_H5Dget_space(hid_t dataset_id)\n      {\n      return H5Dget_space(dataset_id);\n      }\n    \n    herr_t arma_H5Dread(hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id, hid_t xfer_plist_id, void* buf)\n      {\n      return H5Dread(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf);\n      }\n    \n    int arma_H5Sget_simple_extent_ndims(hid_t space_id)\n      {\n      return H5Sget_simple_extent_ndims(space_id);\n      }\n    \n    int arma_H5Sget_simple_extent_dims(hid_t space_id, hsize_t* dims, hsize_t* maxdims)\n      {\n      return H5Sget_simple_extent_dims(space_id, dims, maxdims);\n      }\n    \n    herr_t arma_H5Sclose(hid_t space_id)\n      {\n      return H5Sclose(space_id);\n      }\n    \n    hid_t arma_H5Screate_simple(int rank, const hsize_t* current_dims, const hsize_t* maximum_dims)\n      {\n      return H5Screate_simple(rank, current_dims, maximum_dims);\n      }\n    \n    herr_t arma_H5Ovisit(hid_t object_id, H5_index_t index_type, H5_iter_order_t order, H5O_iterate_t op, void* op_data)\n      {\n      return H5Ovisit(object_id, index_type, order, op, op_data);\n      }\n    \n    herr_t arma_H5Eset_auto(hid_t estack_id, H5E_auto_t func, void* client_data)\n      {\n      return H5Eset_auto(estack_id, func, client_data);\n      }\n    \n    herr_t arma_H5Eget_auto(hid_t estack_id, H5E_auto_t* func, void** client_data)\n      {\n      return H5Eget_auto(estack_id, func, client_data);\n      }\n    \n    hid_t arma_H5Fopen(const char* name, unsigned flags, hid_t fapl_id)\n      {\n      return H5Fopen(name, flags, fapl_id);\n      }\n    \n    hid_t arma_H5Fcreate(const char* name, unsigned flags, hid_t fcpl_id, hid_t fapl_id)\n      {\n      return H5Fcreate(name, flags, fcpl_id, fapl_id);\n      }\n    \n    herr_t arma_H5Fclose(hid_t file_id)\n      {\n      return H5Fclose(file_id);\n      }\n    \n    htri_t arma_H5Fis_hdf5(const char* name)\n      {\n      return H5Fis_hdf5(name);\n      }\n    \n    // H5T_NATIVE_* types.  The rhs here expands to some macros.\n    hid_t arma_H5T_NATIVE_UCHAR  = H5T_NATIVE_UCHAR;\n    hid_t arma_H5T_NATIVE_CHAR   = H5T_NATIVE_CHAR;\n    hid_t arma_H5T_NATIVE_SHORT  = H5T_NATIVE_SHORT;\n    hid_t arma_H5T_NATIVE_USHORT = H5T_NATIVE_USHORT;\n    hid_t arma_H5T_NATIVE_INT    = H5T_NATIVE_INT;\n    hid_t arma_H5T_NATIVE_UINT   = H5T_NATIVE_UINT;\n    hid_t arma_H5T_NATIVE_LONG   = H5T_NATIVE_LONG;\n    hid_t arma_H5T_NATIVE_ULONG  = H5T_NATIVE_ULONG;\n    hid_t arma_H5T_NATIVE_LLONG  = H5T_NATIVE_LLONG;\n    hid_t arma_H5T_NATIVE_ULLONG = H5T_NATIVE_ULLONG;\n    hid_t arma_H5T_NATIVE_FLOAT  = H5T_NATIVE_FLOAT;\n    hid_t arma_H5T_NATIVE_DOUBLE = H5T_NATIVE_DOUBLE;\n\n  #endif\n  \n  \n  }  // end of extern \"C\"\n\n\n}  // end of namespace arma\n"
  },
  {
    "path": "OptolithiumC/libs/armanpy/example/CMakeLists.txt",
    "content": "# cmake -G \"MSYS Makefiles\" \n#       -DCMAKE_BUILD_TYPE=Release \n#       -DARMADILLO_INCLUDE_DIR=d:\\Gladkikh\\Python\\Lithography\\ThirdParty\\armadillo\\include\\ \n#       -DARMANPY_INCLUDE_DIR=d:\\Gladkikh\\temp\\armanpy-0.1.3\\include\\ \n#       CMakeLists.txt \n# cmake --build . --config Release\n\nSET( CMAKE_CXX_FLAGS \"-D__NO_MINGW_LFS -include cmath -std=c++11 ${CMAKE_CXX_FLAGS}\" )\n\ncmake_minimum_required(VERSION 3.0)\n\nSET( CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR} )\nSET( THIRDPARTY_DIR \"d:/Gladkikh/Python/Lithography/ThirdParty/\" )\nSET( ARMADILLO_INCLUDE_DIR \"${THIRDPARTY_DIR}/armadillo/include/\" )\nSET( ARMANPY_INCLUDE_DIR \"${THIRDPARTY_DIR}/armanpy/include\" )\n\nFIND_PACKAGE(SWIG REQUIRED)\nFIND_PACKAGE(PythonLibs REQUIRED)\nFIND_PACKAGE(NumPy REQUIRED)\n\nINCLUDE(${SWIG_USE_FILE})\nINCLUDE_DIRECTORIES(\"${PYTHON_INCLUDE_DIR}\")\nINCLUDE_DIRECTORIES(\"${ARMADILLO_INCLUDE_DIR}\")\nINCLUDE_DIRECTORIES(\"${ARMANPY_INCLUDE_DIR}\")\nINCLUDE_DIRECTORIES(\"${PROJECT_BINARY_DIR}\")\nINCLUDE_DIRECTORIES(\"${NUMPY_INCLUDE_DIRS}\")\n\n# INCLUDE_DIRECTORIES(\"C:\\\\Python27\\\\lib\\\\site-packages\\\\numpy\\\\core\\\\include\")\n\n# build the example library\nadd_library( examplelib SHARED example.cpp example.hpp )\n\n##\n## Set up the swig wrapper\n##\n\n# Swig shall but all stuff to the same directory where the *.so or *.pyd are placed\nSET( CMAKE_SWIG_OUTDIR \"${PROJECT_BINARY_DIR}/bin\" )\n\n# We need to say that we deal with C++ and do not care about missing include files and declarations\nset_source_files_properties( example.i PROPERTIES CPLUSPLUS ON)\nset_source_files_properties( example.i PROPERTIES SWIG_FLAGS \"-ignoremissing;-w509\" )\n\nSWIG_ADD_MODULE    ( armanpyexample python example.i )\nSWIG_LINK_LIBRARIES( armanpyexample examplelib ${PYTHON_LIBRARIES} )\n\nconfigure_file( example.py \"${CMAKE_SWIG_OUTDIR}/example.py\" COPYONLY )\n\nadd_test( NAME example COMMAND ${PYTHON_EXECUTABLE} example.py WORKING_DIRECTORY ${CMAKE_SWIG_OUTDIR} )\n"
  },
  {
    "path": "OptolithiumC/libs/armanpy/example/FindNumPy.cmake",
    "content": "# - Find the NumPy libraries\r\n# This module finds if NumPy is installed, and sets the following variables\r\n# indicating where it is.\r\n#\r\n# TODO: Update to provide the libraries and paths for linking npymath lib.\r\n#\r\n#  NUMPY_FOUND               - was NumPy found\r\n#  NUMPY_VERSION             - the version of NumPy found as a string\r\n#  NUMPY_VERSION_MAJOR       - the major version number of NumPy\r\n#  NUMPY_VERSION_MINOR       - the minor version number of NumPy\r\n#  NUMPY_VERSION_PATCH       - the patch version number of NumPy\r\n#  NUMPY_VERSION_DECIMAL     - e.g. version 1.6.1 is 10601\r\n#  NUMPY_INCLUDE_DIRS        - path to the NumPy include files\r\n\r\n#============================================================================\r\n# Copyright 2012 Continuum Analytics, Inc.\r\n#\r\n# MIT License\r\n#\r\n# Permission is hereby granted, free of charge, to any person obtaining\r\n# a copy of this software and associated documentation files\r\n# (the \"Software\"), to deal in the Software without restriction, including\r\n# without limitation the rights to use, copy, modify, merge, publish,\r\n# distribute, sublicense, and/or sell copies of the Software, and to permit\r\n# persons to whom the Software is furnished to do so, subject to\r\n# the following conditions:\r\n#\r\n# The above copyright notice and this permission notice shall be included\r\n# in all copies or substantial portions of the Software.\r\n#\r\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r\n# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\n# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR\r\n# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\r\n# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r\n# OTHER DEALINGS IN THE SOFTWARE.\r\n#\r\n#============================================================================\r\n\r\n# Finding NumPy involves calling the Python interpreter\r\nif(NumPy_FIND_REQUIRED)\r\n    find_package(PythonInterp REQUIRED)\r\nelse()\r\n    find_package(PythonInterp)\r\nendif()\r\n\r\nif(NOT PYTHONINTERP_FOUND)\r\n    set(NUMPY_FOUND FALSE)\r\n    return()\r\nendif()\r\n\r\nexecute_process(COMMAND \"${PYTHON_EXECUTABLE}\" \"-c\"\r\n    \"import numpy as n; print(n.__version__); print(n.get_include());\"\r\n    RESULT_VARIABLE _NUMPY_SEARCH_SUCCESS\r\n    OUTPUT_VARIABLE _NUMPY_VALUES_OUTPUT\r\n    ERROR_VARIABLE _NUMPY_ERROR_VALUE\r\n    OUTPUT_STRIP_TRAILING_WHITESPACE)\r\n\r\nif(NOT _NUMPY_SEARCH_SUCCESS MATCHES 0)\r\n    if(NumPy_FIND_REQUIRED)\r\n        message(FATAL_ERROR\r\n            \"NumPy import failure:\\n${_NUMPY_ERROR_VALUE}\")\r\n    endif()\r\n    set(NUMPY_FOUND FALSE)\r\n    return()\r\nendif()\r\n\r\n# Convert the process output into a list\r\nstring(REGEX REPLACE \";\" \"\\\\\\\\;\" _NUMPY_VALUES ${_NUMPY_VALUES_OUTPUT})\r\nstring(REGEX REPLACE \"\\n\" \";\" _NUMPY_VALUES ${_NUMPY_VALUES})\r\n# Just in case there is unexpected output from the Python command.\r\nlist(GET _NUMPY_VALUES -2 NUMPY_VERSION)\r\nlist(GET _NUMPY_VALUES -1 NUMPY_INCLUDE_DIRS)\r\n\r\nstring(REGEX MATCH \"^[0-9]+\\\\.[0-9]+\\\\.[0-9]+\" _VER_CHECK \"${NUMPY_VERSION}\")\r\nif(\"${_VER_CHECK}\" STREQUAL \"\")\r\n    # The output from Python was unexpected. Raise an error always\r\n    # here, because we found NumPy, but it appears to be corrupted somehow.\r\n    message(FATAL_ERROR\r\n        \"Requested version and include path from NumPy, got instead:\\n${_NUMPY_VALUES_OUTPUT}\\n\")\r\n    return()\r\nendif()\r\n\r\n# Make sure all directory separators are '/'\r\nstring(REGEX REPLACE \"\\\\\\\\\" \"/\" NUMPY_INCLUDE_DIRS ${NUMPY_INCLUDE_DIRS})\r\n\r\n# Get the major and minor version numbers\r\nstring(REGEX REPLACE \"\\\\.\" \";\" _NUMPY_VERSION_LIST ${NUMPY_VERSION})\r\nlist(GET _NUMPY_VERSION_LIST 0 NUMPY_VERSION_MAJOR)\r\nlist(GET _NUMPY_VERSION_LIST 1 NUMPY_VERSION_MINOR)\r\nlist(GET _NUMPY_VERSION_LIST 2 NUMPY_VERSION_PATCH)\r\nstring(REGEX MATCH \"[0-9]*\" NUMPY_VERSION_PATCH ${NUMPY_VERSION_PATCH})\r\nmath(EXPR NUMPY_VERSION_DECIMAL\r\n    \"(${NUMPY_VERSION_MAJOR} * 10000) + (${NUMPY_VERSION_MINOR} * 100) + ${NUMPY_VERSION_PATCH}\")\r\n\r\nfind_package_message(NUMPY\r\n    \"Found NumPy: version \\\"${NUMPY_VERSION}\\\" ${NUMPY_INCLUDE_DIRS}\"\r\n    \"${NUMPY_INCLUDE_DIRS}${NUMPY_VERSION}\")\r\n\r\nset(NUMPY_FOUND TRUE)\r\n\r\n"
  },
  {
    "path": "OptolithiumC/libs/armanpy/example/example.cpp",
    "content": "// Copyright (C) 2012 thomas.natschlaeger@gmail.com\n// \n// This file is part of the ArmaNpy library.\n// It is provided without any warranty of fitness\n// for any purpose. You can redistribute this file\n// and/or modify it under the terms of the GNU\n// Lesser General Public License (LGPL) as published\n// by the Free Software Foundation, either version 3\n// of the License or (at your option) any later version.\n// (see http://www.opensource.org/licenses for more info)\n\n#include \"example.hpp\"\n"
  },
  {
    "path": "OptolithiumC/libs/armanpy/example/example.hpp",
    "content": "// Copyright (C) 2012 thomas.natschlaeger@gmail.com\n// \n// This file is part of the ArmaNpy library.\n// It is provided without any warranty of fitness\n// for any purpose. You can redistribute this file\n// and/or modify it under the terms of the GNU\n// Lesser General Public License (LGPL) as published\n// by the Free Software Foundation, either version 3\n// of the License or (at your option) any later version.\n// (see http://www.opensource.org/licenses for more info)\n\n#ifndef _EXAMPLE_HPP_\n#define _EXAMPLE_HPP_\n\n/* Cmake will define ${LIBRARY_NAME}_EXPORTS on Windows when it\nconfigures to build a shared library. If you are going to use\nanother build system on windows or create the visual studio\nprojects by hand you need to define ${LIBRARY_NAME}_EXPORTS when\nbuilding a DLL on windows.\n*/\n// We are using the Visual Studio Compiler and building Shared libraries\n\n#if defined (_WIN32)\n\t#if defined(examplelib_EXPORTS)\n\t\t#define DLLEXPORT __declspec(dllexport)\n\t#else\n\t\t#define DLLEXPORT __declspec(dllimport)\n\t#endif\n#else\n\t#define DLLEXPORT\n#endif\n\n#if !defined( SWIG )\n    // SWIG should not see #inlcude<armadillo> as it can not handle it\n\t#include <armadillo>\n\t//#include <boost/shared_ptr.hpp>\n#endif\n\n#pragma warning(disable:4251)\n\nclass DLLEXPORT Example\n {\n\npublic:\n    Example( int sz ) {\n        m.randn(sz, sz);\n    };\n\n    arma::cx_mat get(void) {\n        return m;\n    };\n\n//    boost::shared_ptr< arma::cx_mat > get_sptr(void) {\n//        boost::shared_ptr< arma::cx_mat > p( new arma::cx_mat( m ) );\n//        return p;\n//    };\n\n    void set( const arma::cx_mat& m ) {\n        this->m = m;\n    };\n\n    void rnd( unsigned s) {\n        this->m.randn(s,s);\n    };\n\n    void modify( arma::cx_mat& A, unsigned r, unsigned c ) {\n        A.resize( r, c );\n        A.randn( r, c );\n        for( unsigned i=0; i<r; i++ ) {\n            for( unsigned j=0; j<c; j++ ) {\n                A(i,j) = 10.0*i+j;\n            }\n        }\n    };\n\nprivate:\n    arma::cx_mat m;\n};\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armanpy/example/example.i",
    "content": "// Copyright (C) 2012 thomas.natschlaeger@gmail.com\n// \n// This file is part of the ArmaNpy library.\n// It is provided without any warranty of fitness\n// for any purpose. You can redistribute this file\n// and/or modify it under the terms of the GNU\n// Lesser General Public License (LGPL) as published\n// by the Free Software Foundation, either version 3\n// of the License or (at your option) any later version.\n// (see http://www.opensource.org/licenses for more info)\n\n%module armanpyexample\n%{\n#define SWIG_FILE_WITH_INIT\n\n/* Includes the header in the wrapper code */\n#include \"example.hpp\"\n%}\n\n/* We need this for boost_shared::ptr support */\n%include <boost_shared_ptr.i>\n\n/* Now include ArmaNpy typemaps */\n%include \"armanpy.i\"\n\n/* Some minimal excpetion handling */\n%exception {\n    try {\n        $action\n    } catch( char * str ) {\n        PyErr_SetString( PyExc_IndexError, str );\n        SWIG_fail;\n    } \n}\n\n/* Parse the header file to generate wrappers */\n%include \"example.hpp\"\n"
  },
  {
    "path": "OptolithiumC/libs/armanpy/example/example.py",
    "content": "# Copyright (C) 2012 thomas.natschlaeger@gmail.com\n# \n# This file is part of the ArmaNpy library.\n# It is provided without any warranty of fitness\n# for any purpose. You can redistribute this file\n# and/or modify it under the terms of the GNU\n# Lesser General Public License (LGPL) as published\n# by the Free Software Foundation, either version 3\n# of the License or (at your option) any later version.\n# (see http://www.opensource.org/licenses for more info)\n\nimport os, sys, warnings\nimport numpy as N\n\nsys.path.append( \"./build/bin\" )\nfrom armanpyexample import *\n\ndef example_usage():\n\n    # New instance of class using arma::mat\n    ex = Example( 5 )\n\n    \n    # return values with and without boost:shared_ptr\n    m1 = ex.get()\n    print m1\n        \n    m2 = ex.get_sptr()\n    print N.all( N.all( m1 == m2 ) )\n\n    # Input arguments must have FORTRAN odering: i.e. order=\"F\"\n    ex.set( N.array( [ [1.,2.,3.], [4.,5.,0.6] ], order=\"F\" ) )\n    print ex.get()\n    \n\n    \n    # The following would cause an exception\n    # ex.set_m( N.array( [ [1.,2.,3.], [4.,5.,.6] ], order=\"C\" ) )\n    # --> TypeError: Array must be FORTRAN contiguous. A non-FORTRAN-contiguous array was given.\n    \n    # In the following the size and content of a matrix is modified\n    m = N.array( [ [1.,2.,3.], [4.,5.,0.6] ], order=\"F\" )\n    ex.modify( m, 9, 9 )\n    print m\n    \n    # Note that after the matrix was modifed by this function it does not\n    # own its memory. So one can e.g. not resize it\n    # m.resize( 81, 1 ) ---> ValueError: cannot resize this array: it does not own its data\n    # But it is easy to copy it and work with it\n    m = N.array( m )\n    m.resize(81,1)\n    print m.shape\n    \n    \nif __name__ == '__main__':\n    example_usage()\n"
  },
  {
    "path": "OptolithiumC/libs/armanpy/include/armanpy.hpp",
    "content": "// Copyright (C) 2012 thomas.natschlaeger@gmail.com\n// \n// This file is part of the ArmaNpy library.\n// It is provided without any warranty of fitness\n// for any purpose. You can redistribute this file\n// and/or modify it under the terms of the GNU\n// Lesser General Public License (LGPL) as published\n// by the Free Software Foundation, either version 3\n// of the License or (at your option) any later version.\n// (see http://www.opensource.org/licenses for more info)\n\n///////////////////////////////////////////////////////////////////////////////\n// Define types (templated) to allow wrapping of armadillo types as Python\n// objects such that they can be used as base objects of numpy arrays\n//\n\n#define INIT_ARMA_CAPSULE( MatT )  \\\n    ArmaCapsulePyType< MatT >::object.tp_new = PyType_GenericNew; \\\n    if (PyType_Ready(&ArmaCapsulePyType< MatT >::object) < 0) return;\n\ntemplate< typename MatT >\nstruct ArmaCapsule {\n    PyObject_HEAD\n    MatT *mat;\n} ;\n\ntemplate< typename MatT >\nstatic void ArmaMat_dealloc( PyObject *self )\n{\n    //std::cerr << \"ArmaMat_dealloc( \" << self << \" )\"<< std::endl;\n    //((ArmaMat_Capsule *)self)->mat->print(\"mat\");\n    delete ((ArmaCapsule<MatT> *)self)->mat;\n    self->ob_type->tp_free( self );\n};\n\ntemplate<typename MatT >\nclass ArmaCapsulePyType {\npublic:\n    static PyTypeObject object;\nprivate:\n    MatT _dummy;\n};\n\n\ntemplate< typename MatT > PyTypeObject ArmaCapsulePyType<MatT>::object = { \\\n    PyObject_HEAD_INIT(NULL)   \\\n    0, /*ob_size*/             \\\n    \"ArmaCapsule\", /*tp_name*/ \\\n    sizeof( ArmaCapsule< MatT > ), /*tp_basicsize*/ \\\n    0, /*tp_itemsize*/ \\\n    ArmaMat_dealloc< MatT >, /*tp_dealloc*/ \\\n    0, /*tp_print*/ \\\n    0, /*tp_getattr*/ \\\n    0, /*tp_setattr*/ \\\n    0, /*tp_compare*/ \\\n    0, /*tp_repr*/ \\\n    0, /*tp_as_number*/ \\\n    0, /*tp_as_sequence*/ \\\n    0, /*tp_as_mapping*/ \\\n    0, /*tp_hash */ \\\n    0, /*tp_call*/ \\\n    0, /*tp_str*/ \\\n    0, /*tp_getattro*/ \\\n    0, /*tp_setattro*/ \\\n    0, /*tp_as_buffer*/ \\\n    Py_TPFLAGS_DEFAULT, /*tp_flags*/ \\\n    \"Internal armadillo capsulation object\", /* tp_doc */ \\\n    };\n\n///////////////////////////////////////////////////////////////////////////////\n// Define types (templated) to allow wrapping of std::shared_ptr< arma::... >\n// types as Python objects such that they can be used as base objects of numpy\n// arrays.\n// This is mainly used for return values of the type std::shared_ptr< arma::... >\n//\n\n#if defined( ARMANPY_SHARED_PTR )\n\n#define INIT_ARMA_BSPTR_CAPSULE( MatT )  \\\n    ArmaBsptrCapsulePyType< MatT >::object.tp_new = PyType_GenericNew; \\\n    if (PyType_Ready(&ArmaBsptrCapsulePyType< MatT >::object) < 0) return;\n\ntemplate< typename MatT >\nstruct ArmaBsptrCapsule {\n    PyObject_HEAD\n    std::shared_ptr< MatT > *mat;\n} ;\n\ntemplate< typename MatT >\nstatic void ArmaBsptrMat_dealloc( PyObject *self )\n{\n    //std::cerr << \"ArmaBsptrMat_dealloc( \" << self << \" )\"<< std::endl;\n    //(*(((ArmaBsptrCapsule<MatT> *)self)->mat))->print(\"mat\");\n    delete ((ArmaBsptrCapsule<MatT> *)self)->mat;\n    self->ob_type->tp_free( self );\n};\n\ntemplate<typename MatT >\nclass ArmaBsptrCapsulePyType {\npublic:\n    static PyTypeObject object;\nprivate:\n    MatT _dummy;\n};\n\n\ntemplate< typename MatT > PyTypeObject ArmaBsptrCapsulePyType<MatT>::object = { \\\n    PyObject_HEAD_INIT(NULL)   \\\n    0, /*ob_size*/             \\\n    \"ArmaBsptrCapsule\", /*tp_name*/ \\\n    sizeof( ArmaBsptrCapsule< MatT > ), /*tp_basicsize*/ \\\n    0, /*tp_itemsize*/ \\\n    ArmaBsptrMat_dealloc< MatT >, /*tp_dealloc*/ \\\n    0, /*tp_print*/ \\\n    0, /*tp_getattr*/ \\\n    0, /*tp_setattr*/ \\\n    0, /*tp_compare*/ \\\n    0, /*tp_repr*/ \\\n    0, /*tp_as_number*/ \\\n    0, /*tp_as_sequence*/ \\\n    0, /*tp_as_mapping*/ \\\n    0, /*tp_hash */ \\\n    0, /*tp_call*/ \\\n    0, /*tp_str*/ \\\n    0, /*tp_getattro*/ \\\n    0, /*tp_setattro*/ \\\n    0, /*tp_as_buffer*/ \\\n    Py_TPFLAGS_DEFAULT, /*tp_flags*/ \\\n    \"Internal armadillo capsulation object\", /* tp_doc */ \\\n    };\n\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n// Define a template NumpyType which associates the element types like double,\n// float, int, etc. with the accoring numpy enums NPY_DOUBLE, NPY_FLOAT and so\n// on.\n//\n// #include <numpy/ndarraytypes.h>\n#include <numpy/arrayobject.h>\n\ntemplate< typename elem_type > struct NumpyType { private: elem_type _d; };\n\n#define ASSOCIATE_NUMPY_TYPE( elem_type, npy ) \\\n    template<> struct NumpyType< elem_type > { static int val; }; \\\n    int NumpyType< elem_type >::val=npy;\n\nASSOCIATE_NUMPY_TYPE( double,   NPY_DOUBLE )\nASSOCIATE_NUMPY_TYPE( float,    NPY_FLOAT )\nASSOCIATE_NUMPY_TYPE( int,      NPY_INT )\nASSOCIATE_NUMPY_TYPE( unsigned, NPY_UINT )\nASSOCIATE_NUMPY_TYPE( unsigned char, NPY_UBYTE )\n#if defined(ARMA_64BIT_WORD)\nASSOCIATE_NUMPY_TYPE( arma::sword, NPY_INT64 )\nASSOCIATE_NUMPY_TYPE( arma::uword, NPY_UINT64 )\n#endif\nASSOCIATE_NUMPY_TYPE( std::complex< double >, NPY_COMPLEX128 )\nASSOCIATE_NUMPY_TYPE( std::complex< float >,  NPY_COMPLEX64 )\n\ntemplate< typename MatT > struct ArmaTypeInfo { private: MatT _d; };\n#define ARMA_TYPE_INFO( MatT, nd ) \\\n    template<> struct ArmaTypeInfo< MatT > { static int type; static int numdim; }; \\\n    int ArmaTypeInfo< MatT >::type=NumpyType< MatT::elem_type >::val; \\\n    int ArmaTypeInfo< MatT >::numdim=nd;\n\nARMA_TYPE_INFO( arma::vec,          1 )\nARMA_TYPE_INFO( arma::fvec,         1 )\nARMA_TYPE_INFO( arma::ivec,         1 )\nARMA_TYPE_INFO( arma::uvec,         1 )\nARMA_TYPE_INFO( arma::uchar_vec,    1 )\n#if defined(ARMA_64BIT_WORD)\nARMA_TYPE_INFO( arma::u32_vec,      1 )\nARMA_TYPE_INFO( arma::s32_vec,      1 )\n#endif\nARMA_TYPE_INFO( arma::cx_vec,       1 )\nARMA_TYPE_INFO( arma::cx_fvec,      1 )\n\nARMA_TYPE_INFO( arma::rowvec,       1 )\nARMA_TYPE_INFO( arma::frowvec,      1 )\nARMA_TYPE_INFO( arma::irowvec,      1 )\nARMA_TYPE_INFO( arma::urowvec,      1 )\nARMA_TYPE_INFO( arma::uchar_rowvec, 1 )\n#if defined(ARMA_64BIT_WORD)\nARMA_TYPE_INFO( arma::u32_rowvec,   1 )\nARMA_TYPE_INFO( arma::s32_rowvec,   1 )\n#endif\nARMA_TYPE_INFO( arma::cx_rowvec,    1 )\nARMA_TYPE_INFO( arma::cx_frowvec,   1 )\n\nARMA_TYPE_INFO( arma::mat,       2 )\nARMA_TYPE_INFO( arma::fmat,      2 )\nARMA_TYPE_INFO( arma::imat,      2 )\nARMA_TYPE_INFO( arma::umat,      2 )\nARMA_TYPE_INFO( arma::uchar_mat, 2 )\n#if defined(ARMA_64BIT_WORD)\nARMA_TYPE_INFO( arma::u32_mat,   2 )\nARMA_TYPE_INFO( arma::s32_mat,   2 )\n#endif\nARMA_TYPE_INFO( arma::cx_mat,    2 )\nARMA_TYPE_INFO( arma::cx_fmat,   2 )\n\nARMA_TYPE_INFO( arma::cube,       3 )\nARMA_TYPE_INFO( arma::fcube,      3 )\nARMA_TYPE_INFO( arma::icube,      3 )\nARMA_TYPE_INFO( arma::ucube,      3 )\nARMA_TYPE_INFO( arma::uchar_cube, 3 )\n#if defined(ARMA_64BIT_WORD)\nARMA_TYPE_INFO( arma::u32_cube,   3 )\nARMA_TYPE_INFO( arma::s32_cube,   3 )\n#endif\nARMA_TYPE_INFO( arma::cx_cube,    3 )\nARMA_TYPE_INFO( arma::cx_fcube,   3 )\n\n///////////////////////////////////////////////////////////////////////////////\n// Function to modify conversion and warning behaviour.\n//\n\nstatic bool armanpy_allow_conversion_flag   = false;\nstatic bool armanpy_warn_on_conversion_flag = true;\n\n/*\nvoid armanpy_conversion( bool allowed =false, bool warnings = true ) {\n    armanpy_allow_conversion_flag   = allowed;\n    armanpy_warn_on_conversion_flag = warnings;\n};\n*/\n\n///////////////////////////////////////////////////////////////////////////////\n// Code for typechecks, typemaps etc.\n//\n\n//#include \"armanpy_1d.hpp\"\n"
  },
  {
    "path": "OptolithiumC/libs/armanpy/include/armanpy.i",
    "content": "// -*- mode: c++; fill-column: 80 -*-\n\n// Copyright (C) 2012 thomas.natschlaeger@gmail.com\n// \n// This file is part of the ArmaNpy library.\n// It is provided without any warranty of fitness\n// for any purpose. You can redistribute this file\n// and/or modify it under the terms of the GNU\n// Lesser General Public License (LGPL) as published\n// by the Free Software Foundation, either version 3\n// of the License or (at your option) any later version.\n// (see http://www.opensource.org/licenses for more info)\n\n// Typemaps for converting between armadillo and numpy arrays.\n\n// numpy.i is from https://github.com/numpy/numpy/tree/master/doc/swig\n%include \"numpy.i\"\n\n%fragment(\"ArmaNumPy_Backward_Compatibility\", \"header\")\n{\n%#if NPY_API_VERSION < 0x00000007\n%#define NPY_ARRAY_OWNDATA               NPY_OWNDATA\n%#define array_set_base_object(arr, obj) ( PyArray_BASE(arr) = (PyObject *)obj )\n%#define array_set_data( arr, mem )      ( ((PyArrayObject*)arr)->data = (char*)mem )\n%#define array_clear_flags( arr, flg )   (((PyArrayObject*)arr)->flags) = ( (((PyArrayObject*)arr)->flags) & ~( flg ) )\n%#define array_free_data( arr )          PyArray_free( arr )\n%#else\n%#define array_set_base_object(arr, obj) PyArray_SetBaseObject(arr, (PyObject *)obj )\n%#define array_set_data( arr, mem )      ( ((PyArrayObject_fields*)arr)->data = (char*)mem )\n%#define array_clear_flags( arr, flg )   PyArray_CLEARFLAGS( arr, flg )\n%#define array_free_data( arr )          PyArray_free( arr )\n%#endif\n}\n\n%fragment( \"armanpy_typemaps\", \"header\", fragment=\"NumPy_Fragments\", fragment=\"ArmaNumPy_Backward_Compatibility\" )\n{\n\n    template< typename ArmaT >\n    bool armanpy_basic_typecheck( PyObject* input, bool raise, bool check_own_data = false )\n    {\n        /***/\n        if( armanpy_allow_conversion_flag ) {\n            PyErr_SetString( PyExc_TypeError, \"Conversion not supported anymore. Please wrap your data using numpy.array( ... ) and call armanpy_conversion( false ).\" );\n            return false;\n        } else {\n            const int req_type = ArmaTypeInfo<ArmaT>::type;\n            if( ! is_array( input ) ) {\n                const char * required = typecode_string( req_type );\n                const char * actual   = pytype_string( input );\n                if( raise ) PyErr_Format( PyExc_TypeError, \"Array of type '%s' required. A '%s' was given.\", required, actual );\n                return false;\n            }\n            PyArrayObject* array = (PyArrayObject*)input;\n            if( ! PyArray_EquivTypenums( array_type( array ), req_type ) ) {\n                const char * required = typecode_string( req_type );\n                const char * actual   = typecode_string( array_type(array) );\n                if( raise ) PyErr_Format( PyExc_TypeError, \"Array of type '%s' required. Array of type '%s' was given.\", required, actual );\n                return false;                \n            }\n            if( ! require_dimensions( array, ArmaTypeInfo<ArmaT>::numdim ) ) {\n                if( raise ) PyErr_Format( PyExc_TypeError, \"Array with %i dimension required. A %i-dimensional array was given.\", ArmaTypeInfo<ArmaT>::numdim, array_numdims( array ) );\n                return false;\n            }\n            if( ArmaTypeInfo<ArmaT>::numdim < 2 ) {\n                if( ! ( array_is_fortran(array) || array_is_contiguous(array) ) ) {\n                    if( raise ) PyErr_SetString( PyExc_TypeError, \"Array must be contiguous. A non-contiguous array was given.\" );\n                    return false;\n                }\n            } else {\n                if( ! array_is_fortran(array) ) {\n                    if( raise ) PyErr_SetString( PyExc_TypeError, \"Array must be FORTRAN contiguous. A non-FORTRAN-contiguous array was given.\" );\n                    return false;\n                }\n            }\n            if( check_own_data && ( ! ( PyArray_FLAGS(array) & NPY_ARRAY_OWNDATA ) ) ) {\n                if( raise ) PyErr_SetString( PyExc_TypeError, \"Array must own its data. Please wrap your data using numpy.array( ... ).\");\n                return false;\n            }\n            if( sizeof(npy_intp) > sizeof(arma::uword) ) {\n                npy_intp  ndim = array_numdims(array);\n                npy_intp *dims = array_dimensions(array);\n                npy_intp max_arma_uword = npy_intp( std::numeric_limits< arma::uword >::max() ); // As there are more byte for npy_intp this is no problem\n                for( npy_intp i=0; i < ndim; i++ ) {\n                    if( dims[i] > max_arma_uword ) {\n                        if( raise ) PyErr_Format( PyExc_TypeError, \"Dimension %li of array to large (%li). Only %li elements per dimension supported.\", i, dims[i], max_arma_uword );\n                        return false;\n                    };\n                }\n            }\n            return true;\n        }\n    }\n}\n\n#define ARMANPY_SHARED_PTR\n\n%header %{\n    #include <algorithm>\n    #include <armadillo>\n    #include <iostream>\n    #include <stdio.h>\n    #include <string.h>\n    #include <complex>\n%}\n\n#if defined( ARMANPY_SHARED_PTR )\n    %header %{\n        #include <memory>\n        #define ARMANPY_SHARED_PTR\n    %}\n#else\n    %header %{\n        #undef ARMANPY_SHARED_PTR\n    %}\n#endif\n\n%header %{\n    #include \"armanpy.hpp\"\n%}\n\n%init %{\n\n// This must be called at the start of each module to import numpy.\nimport_array();\n\nINIT_ARMA_CAPSULE( arma::Col< double >      )\nINIT_ARMA_CAPSULE( arma::Col< float >       )\nINIT_ARMA_CAPSULE( arma::Col< int >         )\nINIT_ARMA_CAPSULE( arma::Col< unsigned >    )\n#if defined(ARMA_64BIT_WORD)\n    INIT_ARMA_CAPSULE( arma::Col< arma::sword > )\n    INIT_ARMA_CAPSULE( arma::Col< arma::uword > )\n#endif\nINIT_ARMA_CAPSULE( arma::Col< std::complex< double > > )\nINIT_ARMA_CAPSULE( arma::Col< std::complex< float > >  )\n\n\nINIT_ARMA_CAPSULE( arma::Row< double >      )\nINIT_ARMA_CAPSULE( arma::Row< float >       )\nINIT_ARMA_CAPSULE( arma::Row< int >         )\nINIT_ARMA_CAPSULE( arma::Row< unsigned >    )\n#if defined(ARMA_64BIT_WORD)\n    INIT_ARMA_CAPSULE( arma::Row< arma::sword > )\n    INIT_ARMA_CAPSULE( arma::Row< arma::uword > )\n#endif\nINIT_ARMA_CAPSULE( arma::Row< std::complex< double > > )\nINIT_ARMA_CAPSULE( arma::Row< std::complex< float > >  )\n\n\nINIT_ARMA_CAPSULE( arma::Mat< double >      )\nINIT_ARMA_CAPSULE( arma::Mat< float >       )\nINIT_ARMA_CAPSULE( arma::Mat< int >         )\nINIT_ARMA_CAPSULE( arma::Mat< unsigned >    )\n#if defined(ARMA_64BIT_WORD)\n    INIT_ARMA_CAPSULE( arma::Mat< arma::sword > )\n    INIT_ARMA_CAPSULE( arma::Mat< arma::uword > )\n#endif\nINIT_ARMA_CAPSULE( arma::Mat< std::complex< double > > )\nINIT_ARMA_CAPSULE( arma::Mat< std::complex< float > >  )\n\nINIT_ARMA_CAPSULE( arma::Cube< double >      )\nINIT_ARMA_CAPSULE( arma::Cube< float >       )\nINIT_ARMA_CAPSULE( arma::Cube< int >         )\nINIT_ARMA_CAPSULE( arma::Cube< unsigned >    )\n#if defined(ARMA_64BIT_WORD)\n    INIT_ARMA_CAPSULE( arma::Cube< arma::sword > )\n    INIT_ARMA_CAPSULE( arma::Cube< arma::uword > )\n#endif\nINIT_ARMA_CAPSULE( arma::Cube< std::complex< double > > )\nINIT_ARMA_CAPSULE( arma::Cube< std::complex< float > >  )\n\n/////////////////////////////////////////////////////////////\n\n#if defined( ARMANPY_SHARED_PTR )\n\nINIT_ARMA_BSPTR_CAPSULE( arma::Col< double >      )\nINIT_ARMA_BSPTR_CAPSULE( arma::Col< float >       )\nINIT_ARMA_BSPTR_CAPSULE( arma::Col< int >         )\nINIT_ARMA_BSPTR_CAPSULE( arma::Col< unsigned >    )\n#if defined(ARMA_64BIT_WORD)\n    INIT_ARMA_BSPTR_CAPSULE( arma::Col< arma::sword > )\n    INIT_ARMA_BSPTR_CAPSULE( arma::Col< arma::uword > )\n#endif\nINIT_ARMA_BSPTR_CAPSULE( arma::Col< std::complex< double > > )\nINIT_ARMA_BSPTR_CAPSULE( arma::Col< std::complex< float > >  )\n\n\nINIT_ARMA_BSPTR_CAPSULE( arma::Row< double >      )\nINIT_ARMA_BSPTR_CAPSULE( arma::Row< float >       )\nINIT_ARMA_BSPTR_CAPSULE( arma::Row< int >         )\nINIT_ARMA_BSPTR_CAPSULE( arma::Row< unsigned >    )\n#if defined(ARMA_64BIT_WORD)\n    INIT_ARMA_BSPTR_CAPSULE( arma::Row< arma::sword > )\n    INIT_ARMA_BSPTR_CAPSULE( arma::Row< arma::uword > )\n#endif\nINIT_ARMA_BSPTR_CAPSULE( arma::Row< std::complex< double > > )\nINIT_ARMA_BSPTR_CAPSULE( arma::Row< std::complex< float > >  )\n\n\nINIT_ARMA_BSPTR_CAPSULE( arma::Mat< double >      )\nINIT_ARMA_BSPTR_CAPSULE( arma::Mat< float >       )\nINIT_ARMA_BSPTR_CAPSULE( arma::Mat< int >         )\nINIT_ARMA_BSPTR_CAPSULE( arma::Mat< unsigned >    )\n#if defined(ARMA_64BIT_WORD)\n    INIT_ARMA_BSPTR_CAPSULE( arma::Mat< arma::sword > )\n    INIT_ARMA_BSPTR_CAPSULE( arma::Mat< arma::uword > )\n#endif\nINIT_ARMA_BSPTR_CAPSULE( arma::Mat< std::complex< double > > )\nINIT_ARMA_BSPTR_CAPSULE( arma::Mat< std::complex< float > >  )\n\nINIT_ARMA_BSPTR_CAPSULE( arma::Cube< double >      )\nINIT_ARMA_BSPTR_CAPSULE( arma::Cube< float >       )\nINIT_ARMA_BSPTR_CAPSULE( arma::Cube< int >         )\nINIT_ARMA_BSPTR_CAPSULE( arma::Cube< unsigned >    )\n#if defined(ARMA_64BIT_WORD)\n    INIT_ARMA_BSPTR_CAPSULE( arma::Cube< arma::sword > )\n    INIT_ARMA_BSPTR_CAPSULE( arma::Cube< arma::uword > )\n#endif\nINIT_ARMA_BSPTR_CAPSULE( arma::Cube< std::complex< double > > )\nINIT_ARMA_BSPTR_CAPSULE( arma::Cube< std::complex< float > >  )\n\n#endif\n\n%}\n\n%include \"armanpy_1d.i\"\n%include \"armanpy_2d.i\"\n%include \"armanpy_3d.i\"\n\n\n\n\n\n"
  },
  {
    "path": "OptolithiumC/libs/armanpy/include/armanpy_1d.i",
    "content": "// Copyright (C) 2012 thomas.natschlaeger@gmail.com\n//\n// This file is part of the ArmaNpy library.\n// It is provided without any warranty of fitness\n// for any purpose. You can redistribute this file\n// and/or modify it under the terms of the GNU\n// Lesser General Public License (LGPL) as published\n// by the Free Software Foundation, either version 3\n// of the License or (at your option) any later version.\n// (see http://www.opensource.org/licenses for more info)\n\n%fragment( \"armanpy_vec_typemaps\", \"header\", fragment=\"armanpy_typemaps\" )\n{\n\n    ///////////////////////////////////////// numpy -> arma ////////////////////////////////////////\n\n    template< typename VecT >\n    bool armanpy_numpy_as_vec_with_shared_memory( PyObject* input, VecT **m )\n    {\n        typedef typename VecT::elem_type eT;\n        PyArrayObject* array = obj_to_array_no_conversion( input, NumpyType<eT>::val );\n        if ( !array || !require_dimensions(array, 1) ) return false;\n        if( ! ( PyArray_FLAGS(array) & NPY_ARRAY_OWNDATA ) ) {\n            PyErr_SetString(PyExc_TypeError, \"Array must own its data.\");\n            return false;\n        }\n        if ( !array_is_contiguous(array) ) {\n            PyErr_SetString(PyExc_TypeError,\n                \"Array must be FORTRAN contiguous.  A non-FORTRAN-contiguous array was given\");\n            return false;\n        }\n        arma::uword p = arma::uword( array_dimensions(array)[0] );\n        *m = new VecT( (eT *)array_data(array), p, false, false );\n        return true;\n    }\n\n    /////////////////////////////////////// arma -> numpy ////////////////////////////////////////////\n\n    template< typename VecT >\n    void armanpy_vec_as_numpy_with_shared_memory( VecT *m, PyObject* input )\n    {\n        typedef typename VecT::elem_type eT;\n        PyArrayObject* ary= (PyArrayObject*)input;\n        array_dimensions(ary)[0] = m->n_elem;\n        array_strides(ary)[0]    = sizeof(eT);\n        if(  m->mem != ( eT *)array_data(ary) ) {\n            // if( ! m->uses_local_mem() ) {\n                // 1. We do not need the memory at array_data(ary) anymore\n                //    This can be simply removed by PyArray_free( array_data(ary) );\n                array_free_data( array_data(ary) );\n\n                // 2. We should \"implant\" the m->mem into array_data(ary)\n                //    Here we use the trick from http://blog.enthought.com/?p=62\n                array_clear_flags( ary, NPY_ARRAY_OWNDATA );\n                ArmaCapsule< VecT > *capsule;\n                capsule      = PyObject_New( ArmaCapsule< VecT >, &ArmaCapsulePyType< VecT >::object );\n                capsule->mat = m;\n                array_set_data( ary, capsule->mat->mem );\n                array_set_base_object( ary, capsule );\n            //} else {\n                // Here we just copy a few bytes, as local memory of arma is typically small\n            //    memcpy ( array_data(ary), m->mem, sizeof( eT ) * m->n_elem );\n            //    delete m;\n            //}\n        } else {\n            // Memory was not changed at all; i.e. all modifications were done on the original\n            // memory brought by the input numpy array. So we just delete the arma array\n            // which does not free the memory as it was constructed with the aux memory constructor\n            delete m;\n        }\n    }\n\n    template< typename VecT >\n    PyObject* armanpy_vec_copy_to_numpy( VecT * m )\n    {\n        typedef typename VecT::elem_type eT;\n        npy_intp dims[1] = { npy_intp(m->n_elem) };\n        PyObject* array = PyArray_EMPTY( ArmaTypeInfo< VecT >::numdim, dims, ArmaTypeInfo< VecT >::type, true);\n        if ( !array || !array_is_contiguous( array ) ) {\n            PyErr_SetString( PyExc_TypeError, \"Creation of 1-dimensional return array failed\" );\n            return NULL;\n        }\n        std::copy( m->begin(), m->end(), reinterpret_cast< eT *>(array_data(array)) );\n        return array;\n     }\n\n#if defined(ARMANPY_SHARED_PTR)\n\n    template< typename VecT >\n    PyObject* armanpy_vec_bsptr_as_numpy_with_shared_memory( std::shared_ptr< VecT > m )\n    { \n        typedef typename VecT::elem_type eT;\n        npy_intp dims[1] = { 1 };\n        PyArrayObject* ary = (PyArrayObject*)PyArray_EMPTY(1, dims, NumpyType< eT >::val, true);\n        if ( !ary || !array_is_contiguous(ary) ) { return NULL; }\n\n        array_dimensions(ary)[0] = m->n_elem;\n        array_strides(ary)[0]    = sizeof(  eT  );\n\n        // 1. We do not need the memory at array_data(ary) anymore\n        //    This can be simply removed by PyArray_free( array_data(ary) );\n        array_free_data( array_data(ary) );\n\n        // 2. We should \"implant\" the m->mem into array_data(ary)\n        //    Here we use the trick from http://blog.enthought.com/?p=62\n        array_clear_flags( ary, NPY_ARRAY_OWNDATA );\n        ArmaBsptrCapsule< VecT > *capsule;\n        capsule      = PyObject_New( ArmaBsptrCapsule< VecT >, &ArmaBsptrCapsulePyType< VecT >::object );\n        capsule->mat = new std::shared_ptr< VecT >();\n        array_set_data( ary, m->mem );\n        (*(capsule->mat)) = m;\n        array_set_base_object( ary, capsule );\n        return (PyObject*)ary;\n    }\n\n#endif\n\n}\n//////////////////////////////////////////////////////////////////////////\n// BY VALUE ARGs for 1D arrays\n//////////////////////////////////////////////////////////////////////////\n\n%define %armanpy_vec_byvalue_typemaps( ARMA_MAT_TYPE )\n\n    %typemap( typecheck, precedence=SWIG_TYPECHECK_FLOAT_ARRAY )\n        ( const ARMA_MAT_TYPE   ),\n        (       ARMA_MAT_TYPE   )\n    {\n        $1 = armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, false );\n    }\n\n    %typemap( in, fragment=\"armanpy_vec_typemaps\" )\n        ( const ARMA_MAT_TYPE   ) ( PyArrayObject* array=NULL ),\n        (       ARMA_MAT_TYPE   ) ( PyArrayObject* array=NULL )\n    {\n        if( ! armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, true ) ) SWIG_fail;\n        array = obj_to_array_no_conversion( $input, ArmaTypeInfo< ARMA_MAT_TYPE >::type );\n        if( !array ) SWIG_fail;\n        $1 = ARMA_MAT_TYPE( ( ARMA_MAT_TYPE::elem_type *)array_data(array), arma::uword( array_dimensions(array)[0] ), false );\n    }\n\n    %typemap( argout )\n        ( const ARMA_MAT_TYPE   ),\n        (       ARMA_MAT_TYPE   )\n    {\n    }\n\n    %typemap( freearg )\n        ( const ARMA_MAT_TYPE   ),\n        (       ARMA_MAT_TYPE   )\n    {\n    }\n\n%enddef\n\n%armanpy_vec_byvalue_typemaps( arma::Col< double > )\n%armanpy_vec_byvalue_typemaps( arma::Col< float >  )\n%armanpy_vec_byvalue_typemaps( arma::Col< int > )\n%armanpy_vec_byvalue_typemaps( arma::Col< unsigned >  )\n%armanpy_vec_byvalue_typemaps( arma::Col< arma::sword >  )\n%armanpy_vec_byvalue_typemaps( arma::Col< arma::uword >  )\n%armanpy_vec_byvalue_typemaps( arma::Col< arma::cx_double >  )\n%armanpy_vec_byvalue_typemaps( arma::Col< arma::cx_float >  )\n%armanpy_vec_byvalue_typemaps( arma::Col< std::complex< double > > )\n%armanpy_vec_byvalue_typemaps( arma::Col< std::complex< float > > )\n%armanpy_vec_byvalue_typemaps( arma::vec )\n%armanpy_vec_byvalue_typemaps( arma::fvec )\n%armanpy_vec_byvalue_typemaps( arma::ivec )\n%armanpy_vec_byvalue_typemaps( arma::uvec )\n%armanpy_vec_byvalue_typemaps( arma::uchar_vec )\n%armanpy_vec_byvalue_typemaps( arma::u32_vec )\n%armanpy_vec_byvalue_typemaps( arma::s32_vec )\n%armanpy_vec_byvalue_typemaps( arma::cx_vec )\n%armanpy_vec_byvalue_typemaps( arma::cx_fvec )\n%armanpy_vec_byvalue_typemaps( arma::colvec )\n%armanpy_vec_byvalue_typemaps( arma::fcolvec )\n%armanpy_vec_byvalue_typemaps( arma::icolvec )\n%armanpy_vec_byvalue_typemaps( arma::ucolvec )\n%armanpy_vec_byvalue_typemaps( arma::uchar_colvec )\n%armanpy_vec_byvalue_typemaps( arma::u32_colvec )\n%armanpy_vec_byvalue_typemaps( arma::s32_colvec )\n%armanpy_vec_byvalue_typemaps( arma::cx_colvec )\n%armanpy_vec_byvalue_typemaps( arma::cx_fcolvec )\n\n%armanpy_vec_byvalue_typemaps( arma::Row< double > )\n%armanpy_vec_byvalue_typemaps( arma::Row< float >  )\n%armanpy_vec_byvalue_typemaps( arma::Row< int > )\n%armanpy_vec_byvalue_typemaps( arma::Row< unsigned >  )\n%armanpy_vec_byvalue_typemaps( arma::Row< arma::sword >  )\n%armanpy_vec_byvalue_typemaps( arma::Row< arma::uword >  )\n%armanpy_vec_byvalue_typemaps( arma::Row< std::complex< double > > )\n%armanpy_vec_byvalue_typemaps( arma::Row< std::complex< float > > )\n%armanpy_vec_byvalue_typemaps( arma::Row< arma::cx_double >  )\n%armanpy_vec_byvalue_typemaps( arma::Row< arma::cx_float >  )\n%armanpy_vec_byvalue_typemaps( arma::rowvec )\n%armanpy_vec_byvalue_typemaps( arma::frowvec )\n%armanpy_vec_byvalue_typemaps( arma::irowvec )\n%armanpy_vec_byvalue_typemaps( arma::urowvec )\n%armanpy_vec_byvalue_typemaps( arma::uchar_rowvec )\n%armanpy_vec_byvalue_typemaps( arma::u32_rowvec )\n%armanpy_vec_byvalue_typemaps( arma::s32_rowvec )\n%armanpy_vec_byvalue_typemaps( arma::cx_rowvec )\n%armanpy_vec_byvalue_typemaps( arma::cx_frowvec )\n\n//////////////////////////////////////////////////////////////////////////\n// CONST REF/PTR ARGs for 1D arrays\n//////////////////////////////////////////////////////////////////////////\n\n%define %armanpy_vec_const_ref_typemaps( ARMA_MAT_TYPE )\n\n    %typemap( typecheck, precedence=SWIG_TYPECHECK_FLOAT_ARRAY )\n        ( const ARMA_MAT_TYPE & ) ( PyArrayObject* array=NULL ),\n        ( const ARMA_MAT_TYPE * ) ( PyArrayObject* array=NULL )\n    {\n        $1 = armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, false );\n    }\n\n    %typemap( in, fragment=\"armanpy_vec_typemaps\" )\n        ( const ARMA_MAT_TYPE & ) ( PyArrayObject* array=NULL ),\n        ( const ARMA_MAT_TYPE * ) ( PyArrayObject* array=NULL )\n    {\n        if( ! armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, true ) ) SWIG_fail;\n        array = obj_to_array_no_conversion( $input, ArmaTypeInfo< ARMA_MAT_TYPE >::type );\n        if( !array ) SWIG_fail;\n        $1 = new ARMA_MAT_TYPE( ( ARMA_MAT_TYPE::elem_type *)array_data(array),\n                                arma::uword( array_dimensions(array)[0] ), false );\n    }\n\n    %typemap( argout )\n        ( const ARMA_MAT_TYPE & ),\n        ( const ARMA_MAT_TYPE * )\n    {\n    // NOOP\n    }\n\n    %typemap( freearg )\n        ( const ARMA_MAT_TYPE & ),\n        ( const ARMA_MAT_TYPE * )\n    {\n        if( array$argnum ) {\n            delete $1;\n        }\n    }\n\n%enddef\n\n%armanpy_vec_const_ref_typemaps( arma::Col< double > )\n%armanpy_vec_const_ref_typemaps( arma::Col< float >  )\n%armanpy_vec_const_ref_typemaps( arma::Col< int > )\n%armanpy_vec_const_ref_typemaps( arma::Col< unsigned >  )\n%armanpy_vec_const_ref_typemaps( arma::Col< arma::sword >  )\n%armanpy_vec_const_ref_typemaps( arma::Col< arma::uword >  )\n%armanpy_vec_const_ref_typemaps( arma::Col< arma::cx_double >  )\n%armanpy_vec_const_ref_typemaps( arma::Col< arma::cx_float >  )\n%armanpy_vec_const_ref_typemaps( arma::Col< std::complex< double > > )\n%armanpy_vec_const_ref_typemaps( arma::Col< std::complex< float > > )\n%armanpy_vec_const_ref_typemaps( arma::vec )\n%armanpy_vec_const_ref_typemaps( arma::fvec )\n%armanpy_vec_const_ref_typemaps( arma::ivec )\n%armanpy_vec_const_ref_typemaps( arma::uvec )\n%armanpy_vec_const_ref_typemaps( arma::uchar_vec )\n%armanpy_vec_const_ref_typemaps( arma::u32_vec )\n%armanpy_vec_const_ref_typemaps( arma::s32_vec )\n%armanpy_vec_const_ref_typemaps( arma::cx_vec )\n%armanpy_vec_const_ref_typemaps( arma::cx_fvec )\n%armanpy_vec_const_ref_typemaps( arma::colvec )\n%armanpy_vec_const_ref_typemaps( arma::fcolvec )\n%armanpy_vec_const_ref_typemaps( arma::icolvec )\n%armanpy_vec_const_ref_typemaps( arma::ucolvec )\n%armanpy_vec_const_ref_typemaps( arma::uchar_colvec )\n%armanpy_vec_const_ref_typemaps( arma::u32_colvec )\n%armanpy_vec_const_ref_typemaps( arma::s32_colvec )\n%armanpy_vec_const_ref_typemaps( arma::cx_colvec )\n%armanpy_vec_const_ref_typemaps( arma::cx_fcolvec )\n\n%armanpy_vec_const_ref_typemaps( arma::Row< double > )\n%armanpy_vec_const_ref_typemaps( arma::Row< float >  )\n%armanpy_vec_const_ref_typemaps( arma::Row< int > )\n%armanpy_vec_const_ref_typemaps( arma::Row< unsigned >  )\n%armanpy_vec_const_ref_typemaps( arma::Row< arma::sword >  )\n%armanpy_vec_const_ref_typemaps( arma::Row< arma::uword >  )\n%armanpy_vec_const_ref_typemaps( arma::Row< std::complex< double > > )\n%armanpy_vec_const_ref_typemaps( arma::Row< std::complex< float > > )\n%armanpy_vec_const_ref_typemaps( arma::Row< arma::cx_double >  )\n%armanpy_vec_const_ref_typemaps( arma::Row< arma::cx_float >  )\n%armanpy_vec_const_ref_typemaps( arma::rowvec )\n%armanpy_vec_const_ref_typemaps( arma::frowvec )\n%armanpy_vec_const_ref_typemaps( arma::irowvec )\n%armanpy_vec_const_ref_typemaps( arma::urowvec )\n%armanpy_vec_const_ref_typemaps( arma::uchar_rowvec )\n%armanpy_vec_const_ref_typemaps( arma::u32_rowvec )\n%armanpy_vec_const_ref_typemaps( arma::s32_rowvec )\n%armanpy_vec_const_ref_typemaps( arma::cx_rowvec )\n%armanpy_vec_const_ref_typemaps( arma::cx_frowvec )\n\n//////////////////////////////////////////////////////////////////////////\n// Typemaps for input-output arguments. That is for arguments which are\n// potentialliy modified in place.\n//////////////////////////////////////////////////////////////////////////\n\n// A macor for generating the typemaps for one matrix type\n%define %armanpy_vec_ref_typemaps( ARMA_MAT_TYPE )\n\n    %typemap( typecheck, precedence=SWIG_TYPECHECK_FLOAT_ARRAY )\n        ( ARMA_MAT_TYPE &)\n    {\n        $1 = armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, false, true );\n    }\n\n    %typemap( in, fragment=\"armanpy_vec_typemaps\" )\n        ( ARMA_MAT_TYPE &)\n    {\n        if( ! armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, true, true )            ) SWIG_fail;\n        if( ! armanpy_numpy_as_vec_with_shared_memory< ARMA_MAT_TYPE >( $input, &($1) ) ) SWIG_fail;\n    }\n\n    %typemap( argout, fragment=\"armanpy_vec_typemaps\" )\n        ( ARMA_MAT_TYPE & )\n    {\n        armanpy_vec_as_numpy_with_shared_memory( $1, $input );\n    }\n\n    %typemap( freearg )\n        ( ARMA_MAT_TYPE & )\n    {\n       // NOOP\n    }\n\n%enddef\n\n%armanpy_vec_ref_typemaps( arma::Col< double > )\n%armanpy_vec_ref_typemaps( arma::Col< float >  )\n%armanpy_vec_ref_typemaps( arma::Col< int > )\n%armanpy_vec_ref_typemaps( arma::Col< unsigned >  )\n%armanpy_vec_ref_typemaps( arma::Col< arma::sword >  )\n%armanpy_vec_ref_typemaps( arma::Col< arma::uword >  )\n%armanpy_vec_ref_typemaps( arma::Col< arma::cx_double >  )\n%armanpy_vec_ref_typemaps( arma::Col< arma::cx_float >  )\n%armanpy_vec_ref_typemaps( arma::Col< std::complex< double > > )\n%armanpy_vec_ref_typemaps( arma::Col< std::complex< float > > )\n%armanpy_vec_ref_typemaps( arma::vec )\n%armanpy_vec_ref_typemaps( arma::fvec )\n%armanpy_vec_ref_typemaps( arma::ivec )\n%armanpy_vec_ref_typemaps( arma::uvec )\n%armanpy_vec_ref_typemaps( arma::uchar_vec )\n%armanpy_vec_ref_typemaps( arma::u32_vec )\n%armanpy_vec_ref_typemaps( arma::s32_vec )\n%armanpy_vec_ref_typemaps( arma::cx_vec )\n%armanpy_vec_ref_typemaps( arma::cx_fvec )\n%armanpy_vec_ref_typemaps( arma::colvec )\n%armanpy_vec_ref_typemaps( arma::fcolvec )\n%armanpy_vec_ref_typemaps( arma::icolvec )\n%armanpy_vec_ref_typemaps( arma::ucolvec )\n%armanpy_vec_ref_typemaps( arma::uchar_colvec )\n%armanpy_vec_ref_typemaps( arma::u32_colvec )\n%armanpy_vec_ref_typemaps( arma::s32_colvec )\n%armanpy_vec_ref_typemaps( arma::cx_colvec )\n%armanpy_vec_ref_typemaps( arma::cx_fcolvec )\n\n\n%armanpy_vec_ref_typemaps( arma::Row< double > )\n%armanpy_vec_ref_typemaps( arma::Row< float >  )\n%armanpy_vec_ref_typemaps( arma::Row< int > )\n%armanpy_vec_ref_typemaps( arma::Row< unsigned >  )\n%armanpy_vec_ref_typemaps( arma::Row< arma::sword >  )\n%armanpy_vec_ref_typemaps( arma::Row< arma::uword >  )\n%armanpy_vec_ref_typemaps( arma::Row< arma::cx_double >  )\n%armanpy_vec_ref_typemaps( arma::Row< arma::cx_float >  )\n%armanpy_vec_ref_typemaps( arma::Row< std::complex< double > > )\n%armanpy_vec_ref_typemaps( arma::Row< std::complex< float > > )\n%armanpy_vec_ref_typemaps( arma::rowvec )\n%armanpy_vec_ref_typemaps( arma::frowvec )\n%armanpy_vec_ref_typemaps( arma::irowvec )\n%armanpy_vec_ref_typemaps( arma::urowvec )\n%armanpy_vec_ref_typemaps( arma::uchar_rowvec )\n%armanpy_vec_ref_typemaps( arma::u32_rowvec )\n%armanpy_vec_ref_typemaps( arma::s32_rowvec )\n%armanpy_vec_ref_typemaps( arma::cx_rowvec )\n%armanpy_vec_ref_typemaps( arma::cx_frowvec )\n\n//////////////////////////////////////////////////////////////////////////\n// Typemaps for return by value functions/methods\n//////////////////////////////////////////////////////////////////////////\n\n%define %armanpy_vec_return_by_value_typemaps( ARMA_MAT_TYPE )\n    %typemap( out )\n        ( ARMA_MAT_TYPE )\n    {\n      PyObject* array = armanpy_vec_copy_to_numpy< ARMA_MAT_TYPE >( &$1 );\n      if ( !array ) SWIG_fail;\n      $result = SWIG_Python_AppendOutput($result, array);\n    }\n%enddef\n\n%armanpy_vec_return_by_value_typemaps( arma::Col< double > )\n%armanpy_vec_return_by_value_typemaps( arma::Col< float >  )\n%armanpy_vec_return_by_value_typemaps( arma::Col< int > )\n%armanpy_vec_return_by_value_typemaps( arma::Col< unsigned >  )\n%armanpy_vec_return_by_value_typemaps( arma::Col< arma::sword >  )\n%armanpy_vec_return_by_value_typemaps( arma::Col< arma::uword >  )\n%armanpy_vec_return_by_value_typemaps( arma::Col< arma::cx_double >  )\n%armanpy_vec_return_by_value_typemaps( arma::Col< arma::cx_float >  )\n%armanpy_vec_return_by_value_typemaps( arma::Col< std::complex< double > > )\n%armanpy_vec_return_by_value_typemaps( arma::Col< std::complex< float > > )\n%armanpy_vec_return_by_value_typemaps( arma::vec )\n%armanpy_vec_return_by_value_typemaps( arma::fvec )\n%armanpy_vec_return_by_value_typemaps( arma::ivec )\n%armanpy_vec_return_by_value_typemaps( arma::uvec )\n%armanpy_vec_return_by_value_typemaps( arma::uchar_vec )\n%armanpy_vec_return_by_value_typemaps( arma::u32_vec )\n%armanpy_vec_return_by_value_typemaps( arma::s32_vec )\n%armanpy_vec_return_by_value_typemaps( arma::cx_vec )\n%armanpy_vec_return_by_value_typemaps( arma::cx_fvec )\n%armanpy_vec_return_by_value_typemaps( arma::colvec )\n%armanpy_vec_return_by_value_typemaps( arma::fcolvec )\n%armanpy_vec_return_by_value_typemaps( arma::icolvec )\n%armanpy_vec_return_by_value_typemaps( arma::ucolvec )\n%armanpy_vec_return_by_value_typemaps( arma::uchar_colvec )\n%armanpy_vec_return_by_value_typemaps( arma::u32_colvec )\n%armanpy_vec_return_by_value_typemaps( arma::s32_colvec )\n%armanpy_vec_return_by_value_typemaps( arma::cx_colvec )\n%armanpy_vec_return_by_value_typemaps( arma::cx_fcolvec )\n\n%armanpy_vec_return_by_value_typemaps( arma::Row< double > )\n%armanpy_vec_return_by_value_typemaps( arma::Row< float >  )\n%armanpy_vec_return_by_value_typemaps( arma::Row< int > )\n%armanpy_vec_return_by_value_typemaps( arma::Row< unsigned >  )\n%armanpy_vec_return_by_value_typemaps( arma::Row< arma::sword >  )\n%armanpy_vec_return_by_value_typemaps( arma::Row< arma::uword >  )\n%armanpy_vec_return_by_value_typemaps( arma::Row< arma::cx_double >  )\n%armanpy_vec_return_by_value_typemaps( arma::Row< arma::cx_float >  )\n%armanpy_vec_return_by_value_typemaps( arma::Row< std::complex< double > > )\n%armanpy_vec_return_by_value_typemaps( arma::Row< std::complex< float > > )\n%armanpy_vec_return_by_value_typemaps( arma::rowvec )\n%armanpy_vec_return_by_value_typemaps( arma::frowvec )\n%armanpy_vec_return_by_value_typemaps( arma::irowvec )\n%armanpy_vec_return_by_value_typemaps( arma::urowvec )\n%armanpy_vec_return_by_value_typemaps( arma::uchar_rowvec )\n%armanpy_vec_return_by_value_typemaps( arma::u32_rowvec )\n%armanpy_vec_return_by_value_typemaps( arma::s32_rowvec )\n%armanpy_vec_return_by_value_typemaps( arma::cx_rowvec )\n%armanpy_vec_return_by_value_typemaps( arma::cx_frowvec )\n\n%define %armanpy_vec_return_by_reference_typemaps( ARMA_MAT_TYPE )\n    %typemap( out )\n        ( const ARMA_MAT_TYPE & ),\n        (       ARMA_MAT_TYPE & )\n    {\n      PyObject* array = armanpy_vec_copy_to_numpy< ARMA_MAT_TYPE >( $1 );\n      if ( !array ) SWIG_fail;\n      $result = SWIG_Python_AppendOutput($result, array);\n    }\n%enddef\n\n%armanpy_vec_return_by_reference_typemaps( arma::Col< double > )\n%armanpy_vec_return_by_reference_typemaps( arma::Col< float >  )\n%armanpy_vec_return_by_reference_typemaps( arma::Col< int > )\n%armanpy_vec_return_by_reference_typemaps( arma::Col< unsigned >  )\n%armanpy_vec_return_by_reference_typemaps( arma::Col< arma::sword >  )\n%armanpy_vec_return_by_reference_typemaps( arma::Col< arma::uword >  )\n%armanpy_vec_return_by_reference_typemaps( arma::Col< arma::cx_double >  )\n%armanpy_vec_return_by_reference_typemaps( arma::Col< arma::cx_float >  )\n%armanpy_vec_return_by_reference_typemaps( arma::Col< std::complex< double > > )\n%armanpy_vec_return_by_reference_typemaps( arma::Col< std::complex< float > > )\n%armanpy_vec_return_by_reference_typemaps( arma::vec )\n%armanpy_vec_return_by_reference_typemaps( arma::fvec )\n%armanpy_vec_return_by_reference_typemaps( arma::ivec )\n%armanpy_vec_return_by_reference_typemaps( arma::uvec )\n%armanpy_vec_return_by_reference_typemaps( arma::uchar_vec )\n%armanpy_vec_return_by_reference_typemaps( arma::u32_vec )\n%armanpy_vec_return_by_reference_typemaps( arma::s32_vec )\n%armanpy_vec_return_by_reference_typemaps( arma::cx_vec )\n%armanpy_vec_return_by_reference_typemaps( arma::cx_fvec )\n%armanpy_vec_return_by_reference_typemaps( arma::colvec )\n%armanpy_vec_return_by_reference_typemaps( arma::fcolvec )\n%armanpy_vec_return_by_reference_typemaps( arma::icolvec )\n%armanpy_vec_return_by_reference_typemaps( arma::ucolvec )\n%armanpy_vec_return_by_reference_typemaps( arma::uchar_colvec )\n%armanpy_vec_return_by_reference_typemaps( arma::u32_colvec )\n%armanpy_vec_return_by_reference_typemaps( arma::s32_colvec )\n%armanpy_vec_return_by_reference_typemaps( arma::cx_colvec )\n%armanpy_vec_return_by_reference_typemaps( arma::cx_fcolvec )\n\n%armanpy_vec_return_by_reference_typemaps( arma::Row< double > )\n%armanpy_vec_return_by_reference_typemaps( arma::Row< float >  )\n%armanpy_vec_return_by_reference_typemaps( arma::Row< int > )\n%armanpy_vec_return_by_reference_typemaps( arma::Row< unsigned >  )\n%armanpy_vec_return_by_reference_typemaps( arma::Row< arma::sword >  )\n%armanpy_vec_return_by_reference_typemaps( arma::Row< arma::uword >  )\n%armanpy_vec_return_by_reference_typemaps( arma::Row< arma::cx_double >  )\n%armanpy_vec_return_by_reference_typemaps( arma::Row< arma::cx_float >  )\n%armanpy_vec_return_by_reference_typemaps( arma::Row< std::complex< double > > )\n%armanpy_vec_return_by_reference_typemaps( arma::Row< std::complex< float > > )\n%armanpy_vec_return_by_reference_typemaps( arma::rowvec )\n%armanpy_vec_return_by_reference_typemaps( arma::frowvec )\n%armanpy_vec_return_by_reference_typemaps( arma::irowvec )\n%armanpy_vec_return_by_reference_typemaps( arma::urowvec )\n%armanpy_vec_return_by_reference_typemaps( arma::uchar_rowvec )\n%armanpy_vec_return_by_reference_typemaps( arma::u32_rowvec )\n%armanpy_vec_return_by_reference_typemaps( arma::s32_rowvec )\n%armanpy_vec_return_by_reference_typemaps( arma::cx_rowvec )\n%armanpy_vec_return_by_reference_typemaps( arma::cx_frowvec )\n\n//////////////////////////////////////////////////////////////////////////\n// Typemaps for return by std::shared_ptr< ... > functions/methods\n//////////////////////////////////////////////////////////////////////////\n\n#if defined(ARMANPY_SHARED_PTR)\n\n%define %armanpy_vec_return_by_bsptr_typemaps( ARMA_MAT_TYPE )\n    %typemap( out , fragment=\"armanpy_vec_typemaps\" )\n        ( std::shared_ptr< ARMA_MAT_TYPE > )\n    {\n      PyObject* array = armanpy_vec_bsptr_as_numpy_with_shared_memory< ARMA_MAT_TYPE >( $1 );\n      if ( !array ) SWIG_fail;\n      $result = SWIG_Python_AppendOutput($result, array);\n    }\n%enddef\n\n%armanpy_vec_return_by_bsptr_typemaps( arma::Col< double > )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Col< float >  )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Col< int > )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Col< unsigned >  )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Col< arma::sword >  )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Col< arma::uword >  )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Col< arma::cx_double >  )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Col< arma::cx_float >  )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Col< std::complex< double > > )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Col< std::complex< float > > )\n%armanpy_vec_return_by_bsptr_typemaps( arma::vec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::fvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::ivec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::uvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::uchar_vec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::u32_vec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::s32_vec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::cx_vec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::cx_fvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::colvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::fcolvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::icolvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::ucolvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::uchar_colvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::u32_colvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::s32_colvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::cx_colvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::cx_fcolvec )\n\n%armanpy_vec_return_by_bsptr_typemaps( arma::Row< double > )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Row< float >  )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Row< int > )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Row< unsigned >  )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Row< arma::sword >  )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Row< arma::uword >  )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Row< arma::cx_double >  )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Row< arma::cx_float >  )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Row< std::complex< double > > )\n%armanpy_vec_return_by_bsptr_typemaps( arma::Row< std::complex< float > > )\n%armanpy_vec_return_by_bsptr_typemaps( arma::rowvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::frowvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::irowvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::urowvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::uchar_rowvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::u32_rowvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::s32_rowvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::cx_rowvec )\n%armanpy_vec_return_by_bsptr_typemaps( arma::cx_frowvec )\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armanpy/include/armanpy_2d.i",
    "content": "// Copyright (C) 2012 thomas.natschlaeger@gmail.com\n//\n// This file is part of the ArmaNpy library.\n// It is provided without any warranty of fitness\n// for any purpose. You can redistribute this file\n// and/or modify it under the terms of the GNU\n// Lesser General Public License (LGPL) as published\n// by the Free Software Foundation, either version 3\n// of the License or (at your option) any later version.\n// (see http://www.opensource.org/licenses for more info)\n\n%fragment( \"armanpy_mat_typemaps\", \"header\", fragment=\"armanpy_typemaps\" )\n{\n    template< typename MatT >\n    bool armanpy_typecheck_mat_with_conversion( PyObject* input , int nd )\n    {\n        typedef typename MatT::elem_type eT;\n        PyArrayObject* array=NULL;\n        int is_new_object=0;\n        if( armanpy_allow_conversion_flag ) {\n            array = obj_to_array_fortran_allow_conversion( input, NumpyType<eT>::val, &is_new_object );\n            if ( !array || !require_dimensions( array, nd ) ) return false;\n            return true;\n        } else {\n            array = obj_to_array_no_conversion( input, NumpyType<eT>::val );\n            if( !array )                           return false;\n            if( !require_dimensions( array, nd ) ) return false;\n            if( !array_is_fortran(array) )         return false;\n            return true;\n        }\n    }\n\n    template< typename MatT >\n    PyArrayObject* armanpy_to_mat_with_conversion( PyObject* input , int nd )\n    {\n        typedef typename MatT::elem_type eT;\n        PyArrayObject* array=NULL;\n        int is_new_object=0;\n        if( armanpy_allow_conversion_flag ) {\n            array = obj_to_array_fortran_allow_conversion( input, NumpyType<eT>::val, &is_new_object );\n            if ( !array || !require_dimensions( array, nd ) ) return NULL;\n            if( armanpy_warn_on_conversion_flag && is_new_object ) {\n                PyErr_WarnEx( PyExc_RuntimeWarning,\n                    \"Argument converted (copied) to FORTRAN-contiguous array.\", 1 );\n            }\n            return array;\n        } else {\n            array = obj_to_array_no_conversion( input, NumpyType<eT>::val );\n            if ( !array || !require_dimensions( array, nd ) )return NULL;\n                if( !array_is_fortran(array) ) {\n                    PyErr_SetString(PyExc_TypeError,\n                        \"Array must be FORTRAN contiguous.\"\\\n                        \"  A non-FORTRAN-contiguous array was given\");\n                    return NULL;\n               }\n            return array;\n        }\n    }\n\n    template< typename MatT >\n    void armanpy_mat_as_numpy_with_shared_memory( MatT *m, PyObject* input )\n    {\n        typedef typename MatT::elem_type eT;\n        PyArrayObject* ary= (PyArrayObject*)input;\n        array_dimensions(ary)[0] = m->n_rows;\n        array_dimensions(ary)[1] = m->n_cols;\n        array_strides(ary)[0]    = sizeof( eT );\n        array_strides(ary)[1]    = sizeof( eT ) * m->n_rows;\n        if(  m->mem != (eT*)array_data(ary) ) {\n            // if( ! m->uses_local_mem() ) {\n                // 1. We do not need the memory at array_data(ary) anymore\n                //    This can be simply removed by PyArray_free( array_data(ary) );\n                array_free_data( array_data(ary) );\n\n                // 2. We should \"implant\" the m->mem into array_data(ary)\n                //    Here we use the trick from http://blog.enthought.com/?p=62\n                // array_flags(ary) = array_flags(ary) & ~( NPY_ARRAY_OWNDATA );\n                array_clear_flags( ary, NPY_ARRAY_OWNDATA );\n                ArmaCapsule< MatT > *capsule;\n                capsule      = PyObject_New( ArmaCapsule< MatT >, &ArmaCapsulePyType< MatT >::object );\n                capsule->mat = m;\n                //ary->data = (char *)capsule->mat->mem;\n                array_set_data( ary, capsule->mat->mem );\n                array_set_base_object( ary, capsule );\n            //} else {\n                // Here we just copy a few bytes, as local memory of arma is typically small\n            //    memcpy ( array_data(ary), m->mem, sizeof(eT) * m->n_elem );\n            //    delete m;\n            //}\n        } else {\n            // Memory was not changed at all; i.e. all modifications were done on the original\n            // memory brought by the input numpy array. So we just delete the arma array\n            // which does not free the memory as it was constructed with the aux memory constructor\n            delete m;\n        }\n    }\n\n    template< typename MatT >\n    bool armanpy_numpy_as_mat_with_shared_memory( PyObject* input, MatT **m )\n    {\n        typedef typename MatT::elem_type eT;\n        PyArrayObject* array = obj_to_array_no_conversion( input, NumpyType<eT>::val );\n        if ( !array || !require_dimensions(array, 2) ) return false;\n        if( ! ( PyArray_FLAGS(array) & NPY_ARRAY_OWNDATA ) ) {\n            PyErr_SetString(PyExc_TypeError, \"Array must own its data.\");\n            return false;\n        }\n        if ( !array_is_fortran(array) ) {\n            PyErr_SetString(PyExc_TypeError,\n                \"Array must be FORTRAN contiguous.  A non-FORTRAN-contiguous array was given\");\n            return false;\n        }\n        arma::uword r = arma::uword( array_dimensions(array)[0] );\n        arma::uword c = arma::uword( array_dimensions(array)[1] );\n        *m = new MatT( (eT*)array_data(array), r, c, false, false );\n        return true;\n    }\n\n    template< typename MatT >\n    PyObject* armanpy_mat_copy_to_numpy( MatT * m )\n    {\n        typedef typename MatT::elem_type eT;\n        npy_intp dims[2] = { npy_intp(m->n_rows), npy_intp(m->n_cols) };\n        PyObject* array = PyArray_EMPTY( ArmaTypeInfo< MatT >::numdim, dims, ArmaTypeInfo< MatT >::type, true);\n        if ( !array || !array_is_fortran( array ) ) {\n            PyErr_SetString( PyExc_TypeError, \"Creation of 2-dimensional return array failed\" );\n            return NULL;\n        }\n        std::copy( m->begin(), m->end(), reinterpret_cast<eT*>(array_data(array)) );\n        return array;\n     }\n\n#if defined(ARMANPY_SHARED_PTR)\n\n    template< typename MatT >\n    PyObject* armanpy_mat_bsptr_as_numpy_with_shared_memory( std::shared_ptr< MatT > m )\n    {\n        typedef typename MatT::elem_type eT;\n        npy_intp dims[2] = { 1, 1 };\n        PyArrayObject* ary = (PyArrayObject*)PyArray_EMPTY(2, dims, NumpyType<eT>::val, true);\n        if ( !ary || !array_is_fortran(ary) ) { return NULL; }\n\n        array_dimensions(ary)[0] = m->n_rows;\n        array_dimensions(ary)[1] = m->n_cols;\n        array_strides(ary)[0]    = sizeof(eT);\n        array_strides(ary)[1]    = sizeof(eT) * m->n_rows;\n\n        // 1. We do not need the memory at array_data(ary) anymore\n        //    This can be simply removed by PyArray_free( array_data(ary) );\n        array_free_data( array_data(ary) );\n\n        // 2. We should \"implant\" the m->mem into array_data(ary)\n        //    Here we use the trick from http://blog.enthought.com/?p=62\n        // array_flags(ary) = array_flags(ary) & ~( NPY_ARRAY_OWNDATA );\n        array_clear_flags( ary, NPY_ARRAY_OWNDATA );\n\n        ArmaBsptrCapsule< MatT > *capsule;\n        capsule      = PyObject_New( ArmaBsptrCapsule< MatT >, &ArmaBsptrCapsulePyType< MatT >::object );\n        capsule->mat = new std::shared_ptr< MatT >();\n        // This currently works, but this may break with future versions of numpy\n        // ary->data = (char *)( m->mem );\n        array_set_data( ary, m->mem );\n        (*(capsule->mat)) = m;\n        array_set_base_object( ary, capsule );\n        return (PyObject*)ary;\n    }\n\n#endif\n\n}\n\n//////////////////////////////////////////////////////////////////////////\n// BY VALUE ARGs for 2D arrays\n//////////////////////////////////////////////////////////////////////////\n\n%define %armanpy_mat_byvalue_typemaps( ARMA_MAT_TYPE )\n\n    %typemap( typecheck, precedence=SWIG_TYPECHECK_FLOAT_ARRAY )\n        ( const ARMA_MAT_TYPE   ) ( PyArrayObject* array=NULL ),\n        (       ARMA_MAT_TYPE   ) ( PyArrayObject* array=NULL )\n    {\n        $1 = armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, false );\n    }\n\n    %typemap( in, fragment=\"armanpy_mat_typemaps\" )\n        ( const ARMA_MAT_TYPE   ) ( PyArrayObject* array=NULL ),\n        (       ARMA_MAT_TYPE   ) ( PyArrayObject* array=NULL )\n    {\n        if( ! armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, true ) ) SWIG_fail;\n        array = obj_to_array_no_conversion( $input, ArmaTypeInfo< ARMA_MAT_TYPE >::type );\n        if( !array ) SWIG_fail;\n        $1 = ARMA_MAT_TYPE( ( ARMA_MAT_TYPE::elem_type *)array_data(array), array_dimensions(array)[0], array_dimensions(array)[1], false );\n    }\n\n    %typemap( argout )\n        ( const ARMA_MAT_TYPE   ),\n        (       ARMA_MAT_TYPE   )\n    {\n    }\n\n    %typemap( freearg )\n        ( const ARMA_MAT_TYPE   ),\n        (       ARMA_MAT_TYPE   )\n    {\n    }\n\n%enddef\n\n%armanpy_mat_byvalue_typemaps( arma::Mat< double > )\n%armanpy_mat_byvalue_typemaps( arma::Mat< float >  )\n%armanpy_mat_byvalue_typemaps( arma::Mat< int > )\n%armanpy_mat_byvalue_typemaps( arma::Mat< unsigned >  )\n%armanpy_mat_byvalue_typemaps( arma::Mat< arma::sword >  )\n%armanpy_mat_byvalue_typemaps( arma::Mat< arma::uword >  )\n%armanpy_mat_byvalue_typemaps( arma::Mat< arma::cx_double >  )\n%armanpy_mat_byvalue_typemaps( arma::Mat< arma::cx_float >  )\n%armanpy_mat_byvalue_typemaps( arma::Mat< std::complex< double > >  )\n%armanpy_mat_byvalue_typemaps( arma::Mat< std::complex< float > >  )\n%armanpy_mat_byvalue_typemaps( arma::mat )\n%armanpy_mat_byvalue_typemaps( arma::fmat )\n%armanpy_mat_byvalue_typemaps( arma::imat )\n%armanpy_mat_byvalue_typemaps( arma::umat )\n%armanpy_mat_byvalue_typemaps( arma::uchar_mat )\n%armanpy_mat_byvalue_typemaps( arma::u32_mat )\n%armanpy_mat_byvalue_typemaps( arma::s32_mat )\n%armanpy_mat_byvalue_typemaps( arma::cx_mat )\n%armanpy_mat_byvalue_typemaps( arma::cx_fmat )\n\n//////////////////////////////////////////////////////////////////////////\n// CONST REF/PTR ARGs for 2D arrays\n//////////////////////////////////////////////////////////////////////////\n\n%define %armanpy_mat_const_ref_typemaps( ARMA_MAT_TYPE )\n\n    %typemap( typecheck, precedence=SWIG_TYPECHECK_FLOAT_ARRAY )\n        ( const ARMA_MAT_TYPE & ) ( PyArrayObject* array=NULL ),\n        ( const ARMA_MAT_TYPE * ) ( PyArrayObject* array=NULL )\n    {\n        $1 = armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, false );\n    }\n\n    %typemap( in, fragment=\"armanpy_mat_typemaps\" )\n        ( const ARMA_MAT_TYPE & ) ( PyArrayObject* array=NULL ),\n        ( const ARMA_MAT_TYPE * ) ( PyArrayObject* array=NULL )\n    {\n        if( ! armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, true ) ) SWIG_fail;\n        array = obj_to_array_no_conversion( $input, ArmaTypeInfo< ARMA_MAT_TYPE >::type );\n        if( !array ) SWIG_fail;\n        $1 = new ARMA_MAT_TYPE( ( ARMA_MAT_TYPE::elem_type *)array_data(array),\n                                arma::uword( array_dimensions(array)[0] ), arma::uword( array_dimensions(array)[1] ), false );\n    }\n\n    %typemap( argout )\n        ( const ARMA_MAT_TYPE & ),\n        ( const ARMA_MAT_TYPE * )\n    {\n    // NOOP\n    }\n\n    %typemap( freearg )\n        ( const ARMA_MAT_TYPE & ),\n        ( const ARMA_MAT_TYPE * )\n    {\n        if( array$argnum ) {\n            delete $1;\n        }\n    }\n\n%enddef\n\n%armanpy_mat_const_ref_typemaps( arma::Mat< double > )\n%armanpy_mat_const_ref_typemaps( arma::Mat< float >  )\n%armanpy_mat_const_ref_typemaps( arma::Mat< int > )\n%armanpy_mat_const_ref_typemaps( arma::Mat< unsigned >  )\n%armanpy_mat_const_ref_typemaps( arma::Mat< arma::sword >  )\n%armanpy_mat_const_ref_typemaps( arma::Mat< arma::uword >  )\n%armanpy_mat_const_ref_typemaps( arma::Mat< arma::cx_double >  )\n%armanpy_mat_const_ref_typemaps( arma::Mat< arma::cx_float >  )\n%armanpy_mat_const_ref_typemaps( arma::Mat< std::complex< double > >  )\n%armanpy_mat_const_ref_typemaps( arma::Mat< std::complex< float > >  )\n%armanpy_mat_const_ref_typemaps( arma::mat )\n%armanpy_mat_const_ref_typemaps( arma::fmat )\n%armanpy_mat_const_ref_typemaps( arma::imat )\n%armanpy_mat_const_ref_typemaps( arma::umat )\n%armanpy_mat_const_ref_typemaps( arma::uchar_mat )\n%armanpy_mat_const_ref_typemaps( arma::u32_mat )\n%armanpy_mat_const_ref_typemaps( arma::s32_mat )\n%armanpy_mat_const_ref_typemaps( arma::cx_mat )\n%armanpy_mat_const_ref_typemaps( arma::cx_fmat )\n\n//////////////////////////////////////////////////////////////////////////\n// Typemaps for input-output arguments. That is for arguments which are\n// potentialliy modified in place.\n//////////////////////////////////////////////////////////////////////////\n\n// A macor for generating the typemaps for one matrix type\n%define %armanpy_mat_ref_typemaps( ARMA_MAT_TYPE )\n\n    %typemap( typecheck, precedence=SWIG_TYPECHECK_FLOAT_ARRAY )\n        ( ARMA_MAT_TYPE &)\n    {\n        $1 = armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, false, true );\n    }\n\n    %typemap( in, fragment=\"armanpy_mat_typemaps\" )\n        ( ARMA_MAT_TYPE &)\n    {\n        if( ! armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, true, true )            ) SWIG_fail;\n        if( ! armanpy_numpy_as_mat_with_shared_memory< ARMA_MAT_TYPE >( $input, &($1) ) ) SWIG_fail;\n    }\n\n    %typemap( argout, fragment=\"armanpy_mat_typemaps\" )\n        ( ARMA_MAT_TYPE & )\n    {\n        armanpy_mat_as_numpy_with_shared_memory( $1, $input );\n    }\n\n    %typemap( freearg )\n        ( ARMA_MAT_TYPE & )\n    {\n       // NOOP\n    }\n\n%enddef\n\n%armanpy_mat_ref_typemaps( arma::Mat< double > )\n%armanpy_mat_ref_typemaps( arma::Mat< float >  )\n%armanpy_mat_ref_typemaps( arma::Mat< int > )\n%armanpy_mat_ref_typemaps( arma::Mat< unsigned >  )\n%armanpy_mat_ref_typemaps( arma::Mat< arma::sword >  )\n%armanpy_mat_ref_typemaps( arma::Mat< arma::uword >  )\n%armanpy_mat_ref_typemaps( arma::Mat< arma::cx_double >  )\n%armanpy_mat_ref_typemaps( arma::Mat< arma::cx_float >  )\n%armanpy_mat_ref_typemaps( arma::Mat< std::complex< double > >  )\n%armanpy_mat_ref_typemaps( arma::Mat< std::complex< float > >  )\n%armanpy_mat_ref_typemaps( arma::mat )\n%armanpy_mat_ref_typemaps( arma::fmat )\n%armanpy_mat_ref_typemaps( arma::imat )\n%armanpy_mat_ref_typemaps( arma::umat )\n%armanpy_mat_ref_typemaps( arma::uchar_mat )\n%armanpy_mat_ref_typemaps( arma::u32_mat )\n%armanpy_mat_ref_typemaps( arma::s32_mat )\n%armanpy_mat_ref_typemaps( arma::cx_mat )\n%armanpy_mat_ref_typemaps( arma::cx_fmat )\n\n//////////////////////////////////////////////////////////////////////////\n// Typemaps for return by value functions/methods\n//////////////////////////////////////////////////////////////////////////\n\n%define %armanpy_mat_return_by_value_typemaps( ARMA_MAT_TYPE )\n    %typemap( out )\n        ( ARMA_MAT_TYPE )\n    {\n      PyObject* array = armanpy_mat_copy_to_numpy< ARMA_MAT_TYPE >( &$1 );\n      if ( !array ) SWIG_fail;\n      $result = SWIG_Python_AppendOutput($result, array);\n    }\n%enddef\n\n%armanpy_mat_return_by_value_typemaps( arma::Mat< double > )\n%armanpy_mat_return_by_value_typemaps( arma::Mat< float >  )\n%armanpy_mat_return_by_value_typemaps( arma::Mat< int > )\n%armanpy_mat_return_by_value_typemaps( arma::Mat< unsigned >  )\n%armanpy_mat_return_by_value_typemaps( arma::Mat< arma::sword >  )\n%armanpy_mat_return_by_value_typemaps( arma::Mat< arma::uword >  )\n%armanpy_mat_return_by_value_typemaps( arma::Mat< arma::cx_double >  )\n%armanpy_mat_return_by_value_typemaps( arma::Mat< arma::cx_float >  )\n%armanpy_mat_return_by_value_typemaps( arma::Mat< std::complex< double > >  )\n%armanpy_mat_return_by_value_typemaps( arma::Mat< std::complex< float > >  )\n%armanpy_mat_return_by_value_typemaps( arma::mat )\n%armanpy_mat_return_by_value_typemaps( arma::fmat )\n%armanpy_mat_return_by_value_typemaps( arma::imat )\n%armanpy_mat_return_by_value_typemaps( arma::umat )\n%armanpy_mat_return_by_value_typemaps( arma::uchar_mat )\n%armanpy_mat_return_by_value_typemaps( arma::u32_mat )\n%armanpy_mat_return_by_value_typemaps( arma::s32_mat )\n%armanpy_mat_return_by_value_typemaps( arma::cx_mat )\n%armanpy_mat_return_by_value_typemaps( arma::cx_fmat )\n\n%define %armanpy_mat_return_by_reference_typemaps( ARMA_MAT_TYPE )\n    %typemap( out )\n        ( const ARMA_MAT_TYPE & ),\n        (       ARMA_MAT_TYPE & )\n    {\n      PyObject* array = armanpy_mat_copy_to_numpy< ARMA_MAT_TYPE >( $1 );\n      if ( !array ) SWIG_fail;\n      $result = SWIG_Python_AppendOutput($result, array);\n    }\n%enddef\n\n%armanpy_mat_return_by_reference_typemaps( arma::Mat< double > )\n%armanpy_mat_return_by_reference_typemaps( arma::Mat< float >  )\n%armanpy_mat_return_by_reference_typemaps( arma::Mat< int > )\n%armanpy_mat_return_by_reference_typemaps( arma::Mat< unsigned >  )\n%armanpy_mat_return_by_reference_typemaps( arma::Mat< arma::sword >  )\n%armanpy_mat_return_by_reference_typemaps( arma::Mat< arma::uword >  )\n%armanpy_mat_return_by_reference_typemaps( arma::Mat< arma::cx_double >  )\n%armanpy_mat_return_by_reference_typemaps( arma::Mat< arma::cx_float >  )\n%armanpy_mat_return_by_reference_typemaps( arma::Mat< std::complex< double > >  )\n%armanpy_mat_return_by_reference_typemaps( arma::Mat< std::complex< float > >  )\n%armanpy_mat_return_by_reference_typemaps( arma::mat )\n%armanpy_mat_return_by_reference_typemaps( arma::fmat )\n%armanpy_mat_return_by_reference_typemaps( arma::imat )\n%armanpy_mat_return_by_reference_typemaps( arma::umat )\n%armanpy_mat_return_by_reference_typemaps( arma::uchar_mat )\n%armanpy_mat_return_by_reference_typemaps( arma::u32_mat )\n%armanpy_mat_return_by_reference_typemaps( arma::s32_mat )\n%armanpy_mat_return_by_reference_typemaps( arma::cx_mat )\n%armanpy_mat_return_by_reference_typemaps( arma::cx_fmat )\n\n//////////////////////////////////////////////////////////////////////////\n// Typemaps for return by std::shared_ptr< ... > functions/methods\n//////////////////////////////////////////////////////////////////////////\n\n#if defined(ARMANPY_SHARED_PTR)\n\n%define %armanpy_mat_return_by_bsptr_typemaps( ARMA_MAT_TYPE )\n    %typemap( out , fragment=\"armanpy_mat_typemaps\" )\n        ( std::shared_ptr< ARMA_MAT_TYPE > )\n    {\n      PyObject* array = armanpy_mat_bsptr_as_numpy_with_shared_memory< ARMA_MAT_TYPE >( $1 );\n      if ( !array ) { SWIG_fail; }\n      $result = SWIG_Python_AppendOutput($result, array);\n    }\n%enddef\n\n%armanpy_mat_return_by_bsptr_typemaps( arma::Mat< double > )\n%armanpy_mat_return_by_bsptr_typemaps( arma::Mat< float >  )\n%armanpy_mat_return_by_bsptr_typemaps( arma::Mat< int > )\n%armanpy_mat_return_by_bsptr_typemaps( arma::Mat< unsigned >  )\n%armanpy_mat_return_by_bsptr_typemaps( arma::Mat< arma::sword >  )\n%armanpy_mat_return_by_bsptr_typemaps( arma::Mat< arma::uword >  )\n%armanpy_mat_return_by_bsptr_typemaps( arma::Mat< arma::cx_double >  )\n%armanpy_mat_return_by_bsptr_typemaps( arma::Mat< arma::cx_float >  )\n%armanpy_mat_return_by_bsptr_typemaps( arma::Mat< std::complex< double > >  )\n%armanpy_mat_return_by_bsptr_typemaps( arma::Mat< std::complex< float > >  )\n%armanpy_mat_return_by_bsptr_typemaps( arma::mat )\n%armanpy_mat_return_by_bsptr_typemaps( arma::fmat )\n%armanpy_mat_return_by_bsptr_typemaps( arma::imat )\n%armanpy_mat_return_by_bsptr_typemaps( arma::umat )\n%armanpy_mat_return_by_bsptr_typemaps( arma::uchar_mat )\n%armanpy_mat_return_by_bsptr_typemaps( arma::u32_mat )\n%armanpy_mat_return_by_bsptr_typemaps( arma::s32_mat )\n%armanpy_mat_return_by_bsptr_typemaps( arma::cx_mat )\n%armanpy_mat_return_by_bsptr_typemaps( arma::cx_fmat )\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armanpy/include/armanpy_3d.i",
    "content": "// Copyright (C) 2012 thomas.natschlaeger@gmail.com\n//\n// This file is part of the ArmaNpy library.\n// It is provided without any warranty of fitness\n// for any purpose. You can redistribute this file\n// and/or modify it under the terms of the GNU\n// Lesser General Public License (LGPL) as published\n// by the Free Software Foundation, either version 3\n// of the License or (at your option) any later version.\n// (see http://www.opensource.org/licenses for more info)\n\n%fragment( \"armanpy_cube_typemaps\", \"header\", fragment=\"armanpy_typemaps\" )\n{\n\n    template< typename MatT >\n    bool armanpy_typecheck_cube_with_conversion( PyObject* input , int nd )\n    {\n        typedef typename MatT::elem_type eT;\n        PyArrayObject* array=NULL;\n        int is_new_object=0;\n        if( armanpy_allow_conversion_flag ) {\n            array = obj_to_array_fortran_allow_conversion( input, NumpyType<eT>::val, &is_new_object );\n            if ( !array || !require_dimensions( array, nd ) ) return false;\n            return true;\n        } else {\n            array = obj_to_array_no_conversion( input, NumpyType<eT>::val );\n            if( !array )                           return false;\n            if( !require_dimensions( array, nd ) ) return false;\n            if( !array_is_fortran(array) )         return false;\n            return true;\n        }\n    }\n\n    template< typename MatT >\n    PyArrayObject* armanpy_to_cube_with_conversion( PyObject* input , int nd )\n    {\n        typedef typename MatT::elem_type eT;\n        PyArrayObject* array=NULL;\n        int is_new_object=0;\n        if( armanpy_allow_conversion_flag ) {\n            array = obj_to_array_fortran_allow_conversion( input, NumpyType<eT>::val, &is_new_object );\n            if ( !array || !require_dimensions( array, nd ) ) return NULL;\n            if( armanpy_warn_on_conversion_flag && is_new_object ) {\n                PyErr_WarnEx( PyExc_RuntimeWarning,\n                    \"Argument converted (copied) to FORTRAN-contiguous array.\", 1 );\n            }\n            return array;\n        } else {\n            array = obj_to_array_no_conversion( input, NumpyType<eT>::val );\n            if ( !array || !require_dimensions( array, nd ) )return NULL;\n                if( !array_is_fortran(array) ) {\n                    PyErr_SetString(PyExc_TypeError,\n                        \"Array must be FORTRAN contiguous.\"\\\n                        \"  A non-FORTRAN-contiguous array was given\");\n                    return NULL;\n               }\n            return array;\n        }\n    }\n\n    template< typename MatT >\n    void armanpy_cube_as_numpy_with_shared_memory( MatT *m, PyObject* input )\n    {\n        typedef typename MatT::elem_type eT;\n        PyArrayObject* ary= (PyArrayObject*)input;\n        array_dimensions(ary)[0] = m->n_rows;\n        array_dimensions(ary)[1] = m->n_cols;\n        array_dimensions(ary)[2] = m->n_slices;\n        array_strides(ary)[0]    = sizeof(eT);\n        array_strides(ary)[1]    = sizeof(eT) * m->n_rows;\n        array_strides(ary)[2]    = sizeof(eT) * m->n_rows * m->n_cols;\n        if(  m->mem != (eT*)array_data(ary) ) {\n            // if( ! m->uses_local_mem() ) {\n                // 1. We do not need the memory at array_data(ary) anymore\n                //    This can be simply removed by PyArray_free( array_data(ary) );\n                array_free_data( array_data(ary) );\n\n                // 2. We should \"implant\" the m->mem into array_data(ary)\n                //    Here we use the trick from http://blog.enthought.com/?p=62\n                 array_clear_flags( ary, NPY_ARRAY_OWNDATA );\n                ArmaCapsule< MatT > *capsule;\n                capsule      = PyObject_New( ArmaCapsule< MatT >, &ArmaCapsulePyType< MatT >::object );\n                capsule->mat = m;\n                array_set_data( ary, capsule->mat->mem );\n                array_set_base_object( ary, capsule );\n        } else {\n            // Memory was not changed at all; i.e. all modifications were done on the original\n            // memory brought by the input numpy array. So we just delete the arma array\n            // which does not free the memory as it was constructed with the aux memory constructor\n            delete m;\n        }\n    }\n\n    template< typename MatT >\n    bool armanpy_numpy_as_cube_with_shared_memory( PyObject* input, MatT **m )\n    {\n        typedef typename MatT::elem_type eT;\n        PyArrayObject* array = obj_to_array_no_conversion( input, NumpyType<eT>::val );\n        if ( !array || !require_dimensions( array, 3) ) return false;\n        if( ! ( PyArray_FLAGS(array) & NPY_ARRAY_OWNDATA ) ) {\n            PyErr_SetString(PyExc_TypeError, \"Array must own its data.\");\n            return false;\n        }\n        if ( !array_is_fortran(array) ) {\n            PyErr_SetString(PyExc_TypeError,\n                \"Array must be FORTRAN contiguous.  A non-FORTRAN-contiguous array was given\");\n            return false;\n        }\n        arma::uword r = arma::uword( array_dimensions(array)[0] );\n        arma::uword c = arma::uword( array_dimensions(array)[1] );\n        arma::uword s = arma::uword( array_dimensions(array)[2] );\n        *m = new MatT( (eT*)array_data(array), r, c, s, false, false );\n        return true;\n    }\n\n    template< typename MatT >\n    PyObject* armanpy_cube_copy_to_numpy( MatT * m )\n    {\n        typedef typename MatT::elem_type eT;\n        npy_intp dims[3] = { npy_intp(m->n_rows), npy_intp(m->n_cols), npy_intp(m->n_slices) };\n        PyObject* array = PyArray_EMPTY( ArmaTypeInfo< MatT >::numdim, dims, ArmaTypeInfo< MatT >::type, true);\n        if ( !array || !array_is_fortran( array ) ) {\n            PyErr_SetString( PyExc_TypeError, \"Creation of 3-dimensional return array failed\" );\n            return NULL;\n        }\n        std::copy( m->begin(), m->end(), reinterpret_cast<eT*>(array_data(array)) );\n        return array;\n     }\n\n#if defined(ARMANPY_SHARED_PTR)\n\n    template< typename MatT >\n    PyObject* armanpy_cube_bsptr_as_numpy_with_shared_memory( std::shared_ptr< MatT > m )\n    {\n        typedef typename MatT::elem_type eT;\n        npy_intp dims[3] = { 1, 1, 1 };\n        PyArrayObject* ary = (PyArrayObject*)PyArray_EMPTY(3, dims, NumpyType<eT>::val, true);\n        if ( !ary || !array_is_fortran(ary) ) { return NULL; }\n\n        array_dimensions(ary)[0] = m->n_rows;\n        array_dimensions(ary)[1] = m->n_cols;\n        array_dimensions(ary)[2] = m->n_slices;\n        array_strides(ary)[0]    = sizeof(eT);\n        array_strides(ary)[1]    = sizeof(eT) * m->n_rows;\n        array_strides(ary)[2]    = sizeof(eT) * m->n_rows * m->n_cols;\n\n        // 1. We do not need the memory at array_data(ary) anymore\n        //    This can be simply removed by PyArray_free( array_data(ary) );\n        array_free_data( array_data(ary) );\n\n        // 2. We should \"implant\" the m->mem into array_data(ary)\n        //    Here we use the trick from http://blog.enthought.com/?p=62\n        array_clear_flags( ary, NPY_ARRAY_OWNDATA );\n        ArmaBsptrCapsule< MatT > *capsule;\n        capsule      = PyObject_New( ArmaBsptrCapsule< MatT >, &ArmaBsptrCapsulePyType< MatT >::object );\n        capsule->mat = new std::shared_ptr< MatT >();\n        array_set_data( ary, m->mem );\n        (*(capsule->mat)) = m;\n        array_set_base_object( ary, capsule );\n        return (PyObject*)ary;\n    }\n\n#endif\n\n}\n\n//////////////////////////////////////////////////////////////////////////\n// BY VALUE ARGs for 3D arrays\n//////////////////////////////////////////////////////////////////////////\n\n%define %armanpy_cube_byvalue_typemaps( ARMA_MAT_TYPE )\n\n    %typemap( typecheck, precedence=SWIG_TYPECHECK_FLOAT_ARRAY )\n        ( const ARMA_MAT_TYPE ) ( PyArrayObject* array=NULL ),\n        (       ARMA_MAT_TYPE ) ( PyArrayObject* array=NULL )\n    {\n        $1 = armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, false );\n    }\n\n    %typemap( in, fragment=\"armanpy_cube_typemaps\" )\n        ( const ARMA_MAT_TYPE ) ( PyArrayObject* array=NULL ),\n        (       ARMA_MAT_TYPE ) ( PyArrayObject* array=NULL )\n    {\n        if( ! armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, true ) ) SWIG_fail;\n        array = obj_to_array_no_conversion( $input, ArmaTypeInfo< ARMA_MAT_TYPE >::type );\n        if( !array ) SWIG_fail;\n        $1 = ARMA_MAT_TYPE( ( ARMA_MAT_TYPE::elem_type *)array_data(array),\n                                arma::uword( array_dimensions(array)[0] ), arma::uword( array_dimensions(array)[1] ), arma::uword( array_dimensions(array)[2] ), false );\n    }\n\n    %typemap( argout )\n        ( const ARMA_MAT_TYPE ),\n        (       ARMA_MAT_TYPE )\n    {\n    }\n\n    %typemap( freearg )\n        ( const ARMA_MAT_TYPE ),\n        (       ARMA_MAT_TYPE )\n    {\n    }\n\n%enddef\n\n%armanpy_cube_byvalue_typemaps( arma::Cube< double > )\n%armanpy_cube_byvalue_typemaps( arma::Cube< float >  )\n%armanpy_cube_byvalue_typemaps( arma::Cube< int > )\n%armanpy_cube_byvalue_typemaps( arma::Cube< unsigned >  )\n%armanpy_cube_byvalue_typemaps( arma::Cube< arma::sword >  )\n%armanpy_cube_byvalue_typemaps( arma::Cube< arma::uword >  )\n%armanpy_cube_byvalue_typemaps( arma::Cube< arma::cx_double >  )\n%armanpy_cube_byvalue_typemaps( arma::Cube< arma::cx_float >  )\n%armanpy_cube_byvalue_typemaps( arma::Cube< std::complex< double > >  )\n%armanpy_cube_byvalue_typemaps( arma::Cube< std::complex< float > >  )\n%armanpy_cube_byvalue_typemaps( arma::cube )\n%armanpy_cube_byvalue_typemaps( arma::fcube )\n%armanpy_cube_byvalue_typemaps( arma::icube )\n%armanpy_cube_byvalue_typemaps( arma::ucube )\n%armanpy_cube_byvalue_typemaps( arma::uchar_cube )\n%armanpy_cube_byvalue_typemaps( arma::u32_cube )\n%armanpy_cube_byvalue_typemaps( arma::s32_cube )\n%armanpy_cube_byvalue_typemaps( arma::cx_cube )\n%armanpy_cube_byvalue_typemaps( arma::cx_fcube )\n\n//////////////////////////////////////////////////////////////////////////\n// CONST REF/PTR ARGs for 3D arrays\n//////////////////////////////////////////////////////////////////////////\n\n%define %armanpy_cube_const_ref_typemaps( ARMA_MAT_TYPE )\n\n    %typemap( typecheck, precedence=SWIG_TYPECHECK_FLOAT_ARRAY )\n        ( const ARMA_MAT_TYPE & ) ( PyArrayObject* array=NULL ),\n        ( const ARMA_MAT_TYPE * ) ( PyArrayObject* array=NULL )\n    {\n        $1 = armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, false );\n    }\n\n    %typemap( in, fragment=\"armanpy_cube_typemaps\" )\n        ( const ARMA_MAT_TYPE & ) ( PyArrayObject* array=NULL ),\n        ( const ARMA_MAT_TYPE * ) ( PyArrayObject* array=NULL )\n    {\n        if( ! armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, true ) ) SWIG_fail;\n        array = obj_to_array_no_conversion( $input, ArmaTypeInfo< ARMA_MAT_TYPE >::type );\n        if( !array ) SWIG_fail;\n        $1 = new ARMA_MAT_TYPE( ( ARMA_MAT_TYPE::elem_type *)array_data(array),\n                                arma::uword( array_dimensions(array)[0] ), arma::uword( array_dimensions(array)[1] ), arma::uword( array_dimensions(array)[2] ), false );\n    }\n\n    %typemap( argout )\n        ( const ARMA_MAT_TYPE & ),\n        ( const ARMA_MAT_TYPE * )\n    {\n    // NOOP\n    }\n\n    %typemap( freearg )\n        ( const ARMA_MAT_TYPE & ),\n        ( const ARMA_MAT_TYPE * )\n    {\n        if( array$argnum ) {\n            delete $1;\n        }\n    }\n\n%enddef\n\n%armanpy_cube_const_ref_typemaps( arma::Cube< double > )\n%armanpy_cube_const_ref_typemaps( arma::Cube< float >  )\n%armanpy_cube_const_ref_typemaps( arma::Cube< int > )\n%armanpy_cube_const_ref_typemaps( arma::Cube< unsigned >  )\n%armanpy_cube_const_ref_typemaps( arma::Cube< arma::sword >  )\n%armanpy_cube_const_ref_typemaps( arma::Cube< arma::uword >  )\n%armanpy_cube_const_ref_typemaps( arma::Cube< arma::cx_double >  )\n%armanpy_cube_const_ref_typemaps( arma::Cube< arma::cx_float >  )\n%armanpy_cube_const_ref_typemaps( arma::Cube< std::complex< double > >  )\n%armanpy_cube_const_ref_typemaps( arma::Cube< std::complex< float > >  )\n%armanpy_cube_const_ref_typemaps( arma::cube )\n%armanpy_cube_const_ref_typemaps( arma::fcube )\n%armanpy_cube_const_ref_typemaps( arma::icube )\n%armanpy_cube_const_ref_typemaps( arma::ucube )\n%armanpy_cube_const_ref_typemaps( arma::uchar_cube )\n%armanpy_cube_const_ref_typemaps( arma::u32_cube )\n%armanpy_cube_const_ref_typemaps( arma::s32_cube )\n%armanpy_cube_const_ref_typemaps( arma::cx_cube )\n%armanpy_cube_const_ref_typemaps( arma::cx_fcube )\n\n//////////////////////////////////////////////////////////////////////////\n// Typemaps for input-output arguments. That is for arguments which are\n// potentialliy modified in place.\n//////////////////////////////////////////////////////////////////////////\n\n// A macor for generating the typemaps for one matrix type\n%define %armanpy_cube_ref_typemaps( ARMA_MAT_TYPE )\n\n    %typemap( typecheck, precedence=SWIG_TYPECHECK_FLOAT_ARRAY )\n        ( ARMA_MAT_TYPE &)\n    {\n        $1 = armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, false, true );\n    }\n\n    %typemap( in, fragment=\"armanpy_cube_typemaps\" )\n        ( ARMA_MAT_TYPE &)\n    {\n        if( ! armanpy_basic_typecheck< ARMA_MAT_TYPE >( $input, true, true )             ) SWIG_fail;\n        if( ! armanpy_numpy_as_cube_with_shared_memory< ARMA_MAT_TYPE >( $input, &($1) ) ) SWIG_fail;\n    }\n\n    %typemap( argout, fragment=\"armanpy_cube_typemaps\" )\n        ( ARMA_MAT_TYPE & )\n    {\n        armanpy_cube_as_numpy_with_shared_memory( $1, $input );\n    }\n\n    %typemap( freearg )\n        ( ARMA_MAT_TYPE & )\n    {\n       // NOOP\n    }\n\n%enddef\n\n%armanpy_cube_ref_typemaps( arma::Cube< double > )\n%armanpy_cube_ref_typemaps( arma::Cube< float >  )\n%armanpy_cube_ref_typemaps( arma::Cube< int > )\n%armanpy_cube_ref_typemaps( arma::Cube< unsigned >  )\n%armanpy_cube_ref_typemaps( arma::Cube< arma::sword >  )\n%armanpy_cube_ref_typemaps( arma::Cube< arma::uword >  )\n%armanpy_cube_ref_typemaps( arma::Cube< arma::cx_double >  )\n%armanpy_cube_ref_typemaps( arma::Cube< arma::cx_float >  )\n%armanpy_cube_ref_typemaps( arma::Cube< std::complex< double > >  )\n%armanpy_cube_ref_typemaps( arma::Cube< std::complex< float > >  )\n%armanpy_cube_ref_typemaps( arma::cube )\n%armanpy_cube_ref_typemaps( arma::fcube )\n%armanpy_cube_ref_typemaps( arma::icube )\n%armanpy_cube_ref_typemaps( arma::ucube )\n%armanpy_cube_ref_typemaps( arma::uchar_cube )\n%armanpy_cube_ref_typemaps( arma::u32_cube )\n%armanpy_cube_ref_typemaps( arma::s32_cube )\n%armanpy_cube_ref_typemaps( arma::cx_cube )\n%armanpy_cube_ref_typemaps( arma::cx_fcube )\n\n//////////////////////////////////////////////////////////////////////////\n// Typemaps for return by value functions/methods\n//////////////////////////////////////////////////////////////////////////\n\n%define %armanpy_cube_return_by_value_typemaps( ARMA_MAT_TYPE )\n    %typemap( out )\n        ( ARMA_MAT_TYPE )\n    {\n      PyObject* array = armanpy_cube_copy_to_numpy< ARMA_MAT_TYPE >( &$1 );\n      if ( !array ) SWIG_fail;\n      $result = SWIG_Python_AppendOutput($result, array);\n    }\n%enddef\n\n%armanpy_cube_return_by_value_typemaps( arma::Cube< double > )\n%armanpy_cube_return_by_value_typemaps( arma::Cube< float >  )\n%armanpy_cube_return_by_value_typemaps( arma::Cube< int > )\n%armanpy_cube_return_by_value_typemaps( arma::Cube< unsigned >  )\n%armanpy_cube_return_by_value_typemaps( arma::Cube< arma::sword >  )\n%armanpy_cube_return_by_value_typemaps( arma::Cube< arma::uword >  )\n%armanpy_cube_return_by_value_typemaps( arma::Cube< arma::cx_double >  )\n%armanpy_cube_return_by_value_typemaps( arma::Cube< arma::cx_float >  )\n%armanpy_cube_return_by_value_typemaps( arma::Cube< std::complex< double > >  )\n%armanpy_cube_return_by_value_typemaps( arma::Cube< std::complex< float > >  )\n%armanpy_cube_return_by_value_typemaps( arma::cube )\n%armanpy_cube_return_by_value_typemaps( arma::fcube )\n%armanpy_cube_return_by_value_typemaps( arma::icube )\n%armanpy_cube_return_by_value_typemaps( arma::ucube )\n%armanpy_cube_return_by_value_typemaps( arma::uchar_cube )\n%armanpy_cube_return_by_value_typemaps( arma::u32_cube )\n%armanpy_cube_return_by_value_typemaps( arma::s32_cube )\n%armanpy_cube_return_by_value_typemaps( arma::cx_cube )\n%armanpy_cube_return_by_value_typemaps( arma::cx_fcube )\n\n%define %armanpy_cube_return_by_reference_typemaps( ARMA_MAT_TYPE )\n    %typemap( out )\n        ( const ARMA_MAT_TYPE & ),\n        (       ARMA_MAT_TYPE & )\n    {\n      PyObject* array = armanpy_cube_copy_to_numpy< ARMA_MAT_TYPE >( $1 );\n      if ( !array ) SWIG_fail;\n      $result = SWIG_Python_AppendOutput($result, array);\n    }\n%enddef\n\n%armanpy_cube_return_by_reference_typemaps( arma::Cube< double > )\n%armanpy_cube_return_by_reference_typemaps( arma::Cube< float >  )\n%armanpy_cube_return_by_reference_typemaps( arma::Cube< int > )\n%armanpy_cube_return_by_reference_typemaps( arma::Cube< unsigned >  )\n%armanpy_cube_return_by_reference_typemaps( arma::Cube< arma::sword >  )\n%armanpy_cube_return_by_reference_typemaps( arma::Cube< arma::uword >  )\n%armanpy_cube_return_by_reference_typemaps( arma::Cube< arma::cx_double >  )\n%armanpy_cube_return_by_reference_typemaps( arma::Cube< arma::cx_float >  )\n%armanpy_cube_return_by_reference_typemaps( arma::Cube< std::complex< double > >  )\n%armanpy_cube_return_by_reference_typemaps( arma::Cube< std::complex< float > >  )\n%armanpy_cube_return_by_reference_typemaps( arma::cube )\n%armanpy_cube_return_by_reference_typemaps( arma::fcube )\n%armanpy_cube_return_by_reference_typemaps( arma::icube )\n%armanpy_cube_return_by_reference_typemaps( arma::ucube )\n%armanpy_cube_return_by_reference_typemaps( arma::uchar_cube )\n%armanpy_cube_return_by_reference_typemaps( arma::u32_cube )\n%armanpy_cube_return_by_reference_typemaps( arma::s32_cube )\n%armanpy_cube_return_by_reference_typemaps( arma::cx_cube )\n%armanpy_cube_return_by_reference_typemaps( arma::cx_fcube )\n\n\n//////////////////////////////////////////////////////////////////////////\n// Typemaps for return by std::shared_ptr< ... > functions/methods\n//////////////////////////////////////////////////////////////////////////\n\n#if defined(ARMANPY_SHARED_PTR)\n\n%define %armanpy_cube_return_by_bsptr_typemaps( ARMA_MAT_TYPE )\n    %typemap( out , fragment=\"armanpy_cube_typemaps\" )\n        ( std::shared_ptr< ARMA_MAT_TYPE > )\n    {\n      PyObject* array = armanpy_cube_bsptr_as_numpy_with_shared_memory< ARMA_MAT_TYPE >( $1 );\n      if ( !array ) { SWIG_fail; }\n      $result = SWIG_Python_AppendOutput($result, array);\n    }\n%enddef\n\n%armanpy_cube_return_by_bsptr_typemaps( arma::Cube< double > )\n%armanpy_cube_return_by_bsptr_typemaps( arma::Cube< float >  )\n%armanpy_cube_return_by_bsptr_typemaps( arma::Cube< int > )\n%armanpy_cube_return_by_bsptr_typemaps( arma::Cube< unsigned >  )\n%armanpy_cube_return_by_bsptr_typemaps( arma::Cube< arma::sword >  )\n%armanpy_cube_return_by_bsptr_typemaps( arma::Cube< arma::uword >  )\n%armanpy_cube_return_by_bsptr_typemaps( arma::Cube< arma::cx_double >  )\n%armanpy_cube_return_by_bsptr_typemaps( arma::Cube< arma::cx_float >  )\n%armanpy_cube_return_by_bsptr_typemaps( arma::Cube< std::complex< double > >  )\n%armanpy_cube_return_by_bsptr_typemaps( arma::Cube< std::complex< float > >  )\n%armanpy_cube_return_by_bsptr_typemaps( arma::cube )\n%armanpy_cube_return_by_bsptr_typemaps( arma::fcube )\n%armanpy_cube_return_by_bsptr_typemaps( arma::icube )\n%armanpy_cube_return_by_bsptr_typemaps( arma::ucube )\n%armanpy_cube_return_by_bsptr_typemaps( arma::uchar_cube )\n%armanpy_cube_return_by_bsptr_typemaps( arma::u32_cube )\n%armanpy_cube_return_by_bsptr_typemaps( arma::s32_cube )\n%armanpy_cube_return_by_bsptr_typemaps( arma::cx_cube )\n%armanpy_cube_return_by_bsptr_typemaps( arma::cx_fcube )\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/armanpy/include/numpy.i",
    "content": "/* -*- C -*-  (not really, but good for syntax highlighting) */\n\n/* This file is included for convinience.\n   It is taken from https://github.com/numpy/numpy/tree/master/doc/swig */\n\n#ifdef SWIGPYTHON\n\n%{\n#ifndef SWIG_FILE_WITH_INIT\n#define NO_IMPORT_ARRAY\n#endif\n#include \"stdio.h\"\n#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\n#include <numpy/arrayobject.h>\n%}\n\n/**********************************************************************/\n\n%fragment(\"NumPy_Backward_Compatibility\", \"header\")\n{\n%#if NPY_API_VERSION < 0x00000007\n%#define NPY_ARRAY_DEFAULT NPY_DEFAULT\n%#define NPY_ARRAY_FARRAY  NPY_FARRAY\n%#define NPY_FORTRANORDER  NPY_FORTRAN\n%#endif\n}\n\n/**********************************************************************/\n\n/* The following code originally appeared in\n * enthought/kiva/agg/src/numeric.i written by Eric Jones.  It was\n * translated from C++ to C by John Hunter.  Bill Spotz has modified\n * it to fix some minor bugs, upgrade from Numeric to numpy (all\n * versions), add some comments and functionality, and convert from\n * direct code insertion to SWIG fragments.\n */\n\n%fragment(\"NumPy_Macros\", \"header\")\n{\n/* Macros to extract array attributes.\n */\n%#if NPY_API_VERSION < 0x00000007\n%#define is_array(a)            ((a) && PyArray_Check((PyArrayObject*)a))\n%#define array_type(a)          (int)(PyArray_TYPE((PyArrayObject*)a))\n%#define array_numdims(a)       (((PyArrayObject*)a)->nd)\n%#define array_dimensions(a)    (((PyArrayObject*)a)->dimensions)\n%#define array_size(a,i)        (((PyArrayObject*)a)->dimensions[i])\n%#define array_strides(a)       (((PyArrayObject*)a)->strides)\n%#define array_stride(a,i)      (((PyArrayObject*)a)->strides[i])\n%#define array_data(a)          (((PyArrayObject*)a)->data)\n%#define array_descr(a)         (((PyArrayObject*)a)->descr)\n%#define array_flags(a)         (((PyArrayObject*)a)->flags)\n%#define array_enableflags(a,f) (((PyArrayObject*)a)->flags) = f\n%#else\n%#define is_array(a)            ((a) && PyArray_Check(a))\n%#define array_type(a)          PyArray_TYPE((PyArrayObject*)a)\n%#define array_numdims(a)       PyArray_NDIM((PyArrayObject*)a)\n%#define array_dimensions(a)    PyArray_DIMS((PyArrayObject*)a)\n%#define array_strides(a)       PyArray_STRIDES((PyArrayObject*)a)\n%#define array_stride(a,i)      PyArray_STRIDE((PyArrayObject*)a,i)\n%#define array_size(a,i)        PyArray_DIM((PyArrayObject*)a,i)\n%#define array_data(a)          PyArray_DATA((PyArrayObject*)a)\n%#define array_descr(a)         PyArray_DESCR((PyArrayObject*)a)\n%#define array_flags(a)         PyArray_FLAGS((PyArrayObject*)a)\n%#define array_enableflags(a,f) PyArray_ENABLEFLAGS((PyArrayObject*)a,f)\n%#endif\n%#define array_is_contiguous(a) (PyArray_ISCONTIGUOUS((PyArrayObject*)a))\n%#define array_is_native(a)     (PyArray_ISNOTSWAPPED((PyArrayObject*)a))\n%#define array_is_fortran(a)    (PyArray_ISFORTRAN((PyArrayObject*)a))\n}\n\n/**********************************************************************/\n\n%fragment(\"NumPy_Utilities\",\n          \"header\")\n{\n  /* Given a PyObject, return a string describing its type.\n   */\n  const char* pytype_string(PyObject* py_obj)\n  {\n    if (py_obj == NULL          ) return \"C NULL value\";\n    if (py_obj == Py_None       ) return \"Python None\" ;\n    if (PyCallable_Check(py_obj)) return \"callable\"    ;\n    if (PyString_Check(  py_obj)) return \"string\"      ;\n    if (PyInt_Check(     py_obj)) return \"int\"         ;\n    if (PyFloat_Check(   py_obj)) return \"float\"       ;\n    if (PyDict_Check(    py_obj)) return \"dict\"        ;\n    if (PyList_Check(    py_obj)) return \"list\"        ;\n    if (PyTuple_Check(   py_obj)) return \"tuple\"       ;\n%#if PY_MAJOR_VERSION < 3\n    if (PyFile_Check(    py_obj)) return \"file\"        ;\n    if (PyModule_Check(  py_obj)) return \"module\"      ;\n    if (PyInstance_Check(py_obj)) return \"instance\"    ;\n%#endif\n\n    return \"unkown type\";\n  }\n\n  /* Given a NumPy typecode, return a string describing the type.\n   */\n  const char* typecode_string(int typecode)\n  {\n    static const char* type_names[25] = {\"bool\",\n                                         \"byte\",\n                                         \"unsigned byte\",\n                                         \"short\",\n                                         \"unsigned short\",\n                                         \"int\",\n                                         \"unsigned int\",\n                                         \"long\",\n                                         \"unsigned long\",\n                                         \"long long\",\n                                         \"unsigned long long\",\n                                         \"float\",\n                                         \"double\",\n                                         \"long double\",\n                                         \"complex float\",\n                                         \"complex double\",\n                                         \"complex long double\",\n                                         \"object\",\n                                         \"string\",\n                                         \"unicode\",\n                                         \"void\",\n                                         \"ntypes\",\n                                         \"notype\",\n                                         \"char\",\n                                         \"unknown\"};\n    return typecode < 24 ? type_names[typecode] : type_names[24];\n  }\n\n  /* Make sure input has correct numpy type.  This now just calls\n     PyArray_EquivTypenums().\n   */\n  int type_match(int actual_type,\n                 int desired_type)\n  {\n    return PyArray_EquivTypenums(actual_type, desired_type);\n  }\n\n%#ifdef SWIGPY_USE_CAPSULE\n  void free_cap(PyObject * cap)\n  {\n    void* array = (void*) PyCapsule_GetPointer(cap,SWIGPY_CAPSULE_NAME);\n    if (array != NULL) free(array);\n  }\n%#endif\n\n\n}\n\n/**********************************************************************/\n\n%fragment(\"NumPy_Object_to_Array\",\n          \"header\",\n          fragment=\"NumPy_Backward_Compatibility\",\n          fragment=\"NumPy_Macros\",\n          fragment=\"NumPy_Utilities\")\n{\n  /* Given a PyObject pointer, cast it to a PyArrayObject pointer if\n   * legal.  If not, set the python error string appropriately and\n   * return NULL.\n   */\n  PyArrayObject* obj_to_array_no_conversion(PyObject* input,\n                                            int        typecode)\n  {\n    PyArrayObject* ary = NULL;\n    if (is_array(input) && (typecode == NPY_NOTYPE ||\n                            PyArray_EquivTypenums(array_type(input), typecode)))\n    {\n      ary = (PyArrayObject*) input;\n    }\n    else if is_array(input)\n    {\n      const char* desired_type = typecode_string(typecode);\n      const char* actual_type  = typecode_string(array_type(input));\n      PyErr_Format(PyExc_TypeError,\n                   \"Array of type '%s' required.  Array of type '%s' given\",\n                   desired_type, actual_type);\n      ary = NULL;\n    }\n    else\n    {\n      const char* desired_type = typecode_string(typecode);\n      const char* actual_type  = pytype_string(input);\n      PyErr_Format(PyExc_TypeError,\n                   \"Array of type '%s' required.  A '%s' was given\",\n                   desired_type,\n                   actual_type);\n      ary = NULL;\n    }\n    return ary;\n  }\n\n  /* Convert the given PyObject to a NumPy array with the given\n   * typecode.  On success, return a valid PyArrayObject* with the\n   * correct type.  On failure, the python error string will be set and\n   * the routine returns NULL.\n   */\n  PyArrayObject* obj_to_array_allow_conversion(PyObject* input,\n                                               int       typecode,\n                                               int*      is_new_object)\n  {\n    PyArrayObject* ary = NULL;\n    PyObject*      py_obj;\n    if (is_array(input) && (typecode == NPY_NOTYPE ||\n                            PyArray_EquivTypenums(array_type(input),typecode)))\n    {\n      ary = (PyArrayObject*) input;\n      *is_new_object = 0;\n    }\n    else\n    {\n      py_obj = PyArray_FROMANY(input, typecode, 0, 0, NPY_ARRAY_DEFAULT);\n      /* If NULL, PyArray_FromObject will have set python error value.*/\n      ary = (PyArrayObject*) py_obj;\n      *is_new_object = 1;\n    }\n    return ary;\n  }\n\n  /* Given a PyArrayObject, check to see if it is contiguous.  If so,\n   * return the input pointer and flag it as not a new object.  If it is\n   * not contiguous, create a new PyArrayObject using the original data,\n   * flag it as a new object and return the pointer.\n   */\n  PyArrayObject* make_contiguous(PyArrayObject* ary,\n                                 int*           is_new_object,\n                                 int            min_dims,\n                                 int            max_dims)\n  {\n    PyArrayObject* result;\n    if (array_is_contiguous(ary))\n    {\n      result = ary;\n      *is_new_object = 0;\n    }\n    else\n    {\n      result = (PyArrayObject*) PyArray_ContiguousFromObject((PyObject*)ary,\n                                                              array_type(ary),\n                                                              min_dims,\n                                                              max_dims);\n      *is_new_object = 1;\n    }\n    return result;\n  }\n\n  /* Given a PyArrayObject, check to see if it is Fortran-contiguous.\n   * If so, return the input pointer, but do not flag it as not a new\n   * object.  If it is not Fortran-contiguous, create a new\n   * PyArrayObject using the original data, flag it as a new object\n   * and return the pointer.\n   */\n  PyArrayObject* make_fortran(PyArrayObject* ary,\n                              int*           is_new_object)\n  {\n    PyArrayObject* result;\n    if (array_is_fortran(ary))\n    {\n      result = ary;\n      *is_new_object = 0;\n    }\n    else\n    {\n      Py_INCREF(array_descr(ary));\n      result = (PyArrayObject*) PyArray_FromArray(ary,\n                                                  array_descr(ary),\n                                                  NPY_FORTRANORDER);\n      *is_new_object = 1;\n    }\n    return result;\n  }\n\n  /* Convert a given PyObject to a contiguous PyArrayObject of the\n   * specified type.  If the input object is not a contiguous\n   * PyArrayObject, a new one will be created and the new object flag\n   * will be set.\n   */\n  PyArrayObject* obj_to_array_contiguous_allow_conversion(PyObject* input,\n                                                          int       typecode,\n                                                          int*      is_new_object)\n  {\n    int is_new1 = 0;\n    int is_new2 = 0;\n    PyArrayObject* ary2;\n    PyArrayObject* ary1 = obj_to_array_allow_conversion(input,\n                                                        typecode,\n                                                        &is_new1);\n    if (ary1)\n    {\n      ary2 = make_contiguous(ary1, &is_new2, 0, 0);\n      if ( is_new1 && is_new2)\n      {\n        Py_DECREF(ary1);\n      }\n      ary1 = ary2;\n    }\n    *is_new_object = is_new1 || is_new2;\n    return ary1;\n  }\n\n  /* Convert a given PyObject to a Fortran-ordered PyArrayObject of the\n   * specified type.  If the input object is not a Fortran-ordered\n   * PyArrayObject, a new one will be created and the new object flag\n   * will be set.\n   */\n  PyArrayObject* obj_to_array_fortran_allow_conversion(PyObject* input,\n                                                       int       typecode,\n                                                       int*      is_new_object)\n  {\n    int is_new1 = 0;\n    int is_new2 = 0;\n    PyArrayObject* ary2;\n    PyArrayObject* ary1 = obj_to_array_allow_conversion(input,\n                                                        typecode,\n                                                        &is_new1);\n    if (ary1)\n    {\n      ary2 = make_fortran(ary1, &is_new2);\n      if (is_new1 && is_new2)\n      {\n        Py_DECREF(ary1);\n      }\n      ary1 = ary2;\n    }\n    *is_new_object = is_new1 || is_new2;\n    return ary1;\n  }\n} /* end fragment */\n\n/**********************************************************************/\n\n%fragment(\"NumPy_Array_Requirements\",\n          \"header\",\n          fragment=\"NumPy_Backward_Compatibility\",\n          fragment=\"NumPy_Macros\")\n{\n  /* Test whether a python object is contiguous.  If array is\n   * contiguous, return 1.  Otherwise, set the python error string and\n   * return 0.\n   */\n  int require_contiguous(PyArrayObject* ary)\n  {\n    int contiguous = 1;\n    if (!array_is_contiguous(ary))\n    {\n      PyErr_SetString(PyExc_TypeError,\n                      \"Array must be contiguous.  A non-contiguous array was given\");\n      contiguous = 0;\n    }\n    return contiguous;\n  }\n\n  /* Require that a numpy array is not byte-swapped.  If the array is\n   * not byte-swapped, return 1.  Otherwise, set the python error string\n   * and return 0.\n   */\n  int require_native(PyArrayObject* ary)\n  {\n    int native = 1;\n    if (!array_is_native(ary))\n    {\n      PyErr_SetString(PyExc_TypeError,\n                      \"Array must have native byteorder.  \"\n                      \"A byte-swapped array was given\");\n      native = 0;\n    }\n    return native;\n  }\n\n  /* Require the given PyArrayObject to have a specified number of\n   * dimensions.  If the array has the specified number of dimensions,\n   * return 1.  Otherwise, set the python error string and return 0.\n   */\n  int require_dimensions(PyArrayObject* ary,\n                         int            exact_dimensions)\n  {\n    int success = 1;\n    if (array_numdims(ary) != exact_dimensions)\n    {\n      PyErr_Format(PyExc_TypeError,\n                   \"Array must have %d dimensions.  Given array has %d dimensions\",\n                   exact_dimensions,\n                   array_numdims(ary));\n      success = 0;\n    }\n    return success;\n  }\n\n  /* Require the given PyArrayObject to have one of a list of specified\n   * number of dimensions.  If the array has one of the specified number\n   * of dimensions, return 1.  Otherwise, set the python error string\n   * and return 0.\n   */\n  int require_dimensions_n(PyArrayObject* ary,\n                           int*           exact_dimensions,\n                           int            n)\n  {\n    int success = 0;\n    int i;\n    char dims_str[255] = \"\";\n    char s[255];\n    for (i = 0; i < n && !success; i++)\n    {\n      if (array_numdims(ary) == exact_dimensions[i])\n      {\n        success = 1;\n      }\n    }\n    if (!success)\n    {\n      for (i = 0; i < n-1; i++)\n      {\n        sprintf(s, \"%d, \", exact_dimensions[i]);\n        strcat(dims_str,s);\n      }\n      sprintf(s, \" or %d\", exact_dimensions[n-1]);\n      strcat(dims_str,s);\n      PyErr_Format(PyExc_TypeError,\n                   \"Array must have %s dimensions.  Given array has %d dimensions\",\n                   dims_str,\n                   array_numdims(ary));\n    }\n    return success;\n  }\n\n  /* Require the given PyArrayObject to have a specified shape.  If the\n   * array has the specified shape, return 1.  Otherwise, set the python\n   * error string and return 0.\n   */\n  int require_size(PyArrayObject* ary,\n                   npy_intp*      size,\n                   int            n)\n  {\n    int i;\n    int success = 1;\n    size_t len;\n    char desired_dims[255] = \"[\";\n    char s[255];\n    char actual_dims[255] = \"[\";\n    for(i=0; i < n;i++)\n    {\n      if (size[i] != -1 &&  size[i] != array_size(ary,i))\n      {\n        success = 0;\n      }\n    }\n    if (!success)\n    {\n      for (i = 0; i < n; i++)\n      {\n        if (size[i] == -1)\n        {\n          sprintf(s, \"*,\");\n        }\n        else\n        {\n          sprintf(s, \"%ld,\", (long int)size[i]);\n        }\n        strcat(desired_dims,s);\n      }\n      len = strlen(desired_dims);\n      desired_dims[len-1] = ']';\n      for (i = 0; i < n; i++)\n      {\n        sprintf(s, \"%ld,\", (long int)array_size(ary,i));\n        strcat(actual_dims,s);\n      }\n      len = strlen(actual_dims);\n      actual_dims[len-1] = ']';\n      PyErr_Format(PyExc_TypeError,\n                   \"Array must have shape of %s.  Given array has shape of %s\",\n                   desired_dims,\n                   actual_dims);\n    }\n    return success;\n  }\n\n  /* Require the given PyArrayObject to to be Fortran ordered.  If the\n   * the PyArrayObject is already Fortran ordered, do nothing.  Else,\n   * set the Fortran ordering flag and recompute the strides.\n   */\n  int require_fortran(PyArrayObject* ary)\n  {\n    int success = 1;\n    int nd = array_numdims(ary);\n    int i;\n    npy_intp * strides = array_strides(ary);\n    if (array_is_fortran(ary)) return success;\n    /* Set the Fortran ordered flag */\n    array_enableflags(ary,NPY_ARRAY_FARRAY);\n    /* Recompute the strides */\n    strides[0] = strides[nd-1];\n    for (i=1; i < nd; ++i)\n      strides[i] = strides[i-1] * array_size(ary,i-1);\n    return success;\n  }\n}\n\n/* Combine all NumPy fragments into one for convenience */\n%fragment(\"NumPy_Fragments\",\n          \"header\",\n          fragment=\"NumPy_Backward_Compatibility\",\n          fragment=\"NumPy_Macros\",\n          fragment=\"NumPy_Utilities\",\n          fragment=\"NumPy_Object_to_Array\",\n          fragment=\"NumPy_Array_Requirements\")\n{\n}\n\n/* End John Hunter translation (with modifications by Bill Spotz)\n */\n\n/* %numpy_typemaps() macro\n *\n * This macro defines a family of 74 typemaps that allow C arguments\n * of the form\n *\n *    1. (DATA_TYPE IN_ARRAY1[ANY])\n *    2. (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1)\n *    3. (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1)\n *\n *    4. (DATA_TYPE IN_ARRAY2[ANY][ANY])\n *    5. (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n *    6. (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2)\n *    7. (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n *    8. (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2)\n *\n *    9. (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY])\n *   10. (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n *   11. (DATA_TYPE** IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n *   12. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3)\n *   13. (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n *   14. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_FARRAY3)\n *\n *   15. (DATA_TYPE IN_ARRAY4[ANY][ANY][ANY][ANY])\n *   16. (DATA_TYPE* IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n *   17. (DATA_TYPE** IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n *   18. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, , DIM_TYPE DIM4, DATA_TYPE* IN_ARRAY4)\n *   19. (DATA_TYPE* IN_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n *   20. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_FARRAY4)\n *\n *   21. (DATA_TYPE INPLACE_ARRAY1[ANY])\n *   22. (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1)\n *   23. (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1)\n *\n *   24. (DATA_TYPE INPLACE_ARRAY2[ANY][ANY])\n *   25. (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n *   26. (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2)\n *   27. (DATA_TYPE* INPLACE_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n *   28. (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_FARRAY2)\n *\n *   29. (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY])\n *   30. (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n *   31. (DATA_TYPE** INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n *   32. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_ARRAY3)\n *   33. (DATA_TYPE* INPLACE_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n *   34. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_FARRAY3)\n *\n *   35. (DATA_TYPE INPLACE_ARRAY4[ANY][ANY][ANY][ANY])\n *   36. (DATA_TYPE* INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n *   37. (DATA_TYPE** INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n *   38. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_ARRAY4)\n *   39. (DATA_TYPE* INPLACE_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n *   40. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_FARRAY4)\n *\n *   41. (DATA_TYPE ARGOUT_ARRAY1[ANY])\n *   42. (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1)\n *   43. (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1)\n *\n *   44. (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY])\n *\n *   45. (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY])\n *\n *   46. (DATA_TYPE ARGOUT_ARRAY4[ANY][ANY][ANY][ANY])\n *\n *   47. (DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1)\n *   48. (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEW_ARRAY1)\n *\n *   49. (DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)\n *   50. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_ARRAY2)\n *   51. (DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)\n *   52. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_FARRAY2)\n *\n *   53. (DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)\n *   54. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_ARRAY3)\n *   55. (DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)\n *   56. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_FARRAY3)\n *\n *   57. (DATA_TYPE** ARGOUTVIEW_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)\n *   58. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEW_ARRAY4)\n *   59. (DATA_TYPE** ARGOUTVIEW_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)\n *   60. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEW_FARRAY4)\n *\n *   61. (DATA_TYPE** ARGOUTVIEWM_ARRAY1, DIM_TYPE* DIM1)\n *   62. (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEWM_ARRAY1)\n *\n *   63. (DATA_TYPE** ARGOUTVIEWM_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)\n *   64. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_ARRAY2)\n *   65. (DATA_TYPE** ARGOUTVIEWM_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)\n *   66. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_FARRAY2)\n *\n *   67. (DATA_TYPE** ARGOUTVIEWM_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)\n *   68. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEWM_ARRAY3)\n *   69. (DATA_TYPE** ARGOUTVIEWM_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)\n *   70. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEWM_FARRAY3)\n *\n *   71. (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)\n *   72. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_ARRAY4)\n *   73. (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)\n *   74. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_FARRAY4)\n *\n * where \"DATA_TYPE\" is any type supported by the NumPy module, and\n * \"DIM_TYPE\" is any int-like type suitable for specifying dimensions.\n * The difference between \"ARRAY\" typemaps and \"FARRAY\" typemaps is\n * that the \"FARRAY\" typemaps expect Fortran ordering of\n * multidimensional arrays.  In python, the dimensions will not need\n * to be specified (except for the \"DATA_TYPE* ARGOUT_ARRAY1\"\n * typemaps).  The IN_ARRAYs can be a numpy array or any sequence that\n * can be converted to a numpy array of the specified type.  The\n * INPLACE_ARRAYs must be numpy arrays of the appropriate type.  The\n * ARGOUT_ARRAYs will be returned as new numpy arrays of the\n * appropriate type.\n *\n * These typemaps can be applied to existing functions using the\n * %apply directive.  For example:\n *\n *     %apply (double* IN_ARRAY1, int DIM1) {(double* series, int length)};\n *     double prod(double* series, int length);\n *\n *     %apply (int DIM1, int DIM2, double* INPLACE_ARRAY2)\n *           {(int rows, int cols, double* matrix        )};\n *     void floor(int rows, int cols, double* matrix, double f);\n *\n *     %apply (double IN_ARRAY3[ANY][ANY][ANY])\n *           {(double tensor[2][2][2]         )};\n *     %apply (double ARGOUT_ARRAY3[ANY][ANY][ANY])\n *           {(double low[2][2][2]                )};\n *     %apply (double ARGOUT_ARRAY3[ANY][ANY][ANY])\n *           {(double upp[2][2][2]                )};\n *     void luSplit(double tensor[2][2][2],\n *                  double low[2][2][2],\n *                  double upp[2][2][2]    );\n *\n * or directly with\n *\n *     double prod(double* IN_ARRAY1, int DIM1);\n *\n *     void floor(int DIM1, int DIM2, double* INPLACE_ARRAY2, double f);\n *\n *     void luSplit(double IN_ARRAY3[ANY][ANY][ANY],\n *                  double ARGOUT_ARRAY3[ANY][ANY][ANY],\n *                  double ARGOUT_ARRAY3[ANY][ANY][ANY]);\n */\n\n%define %numpy_typemaps(DATA_TYPE, DATA_TYPECODE, DIM_TYPE)\n\n/************************/\n/* Input Array Typemaps */\n/************************/\n\n/* Typemap suite for (DATA_TYPE IN_ARRAY1[ANY])\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE IN_ARRAY1[ANY])\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE IN_ARRAY1[ANY])\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[1] = { $1_dim0 };\n  array = obj_to_array_contiguous_allow_conversion($input,\n                                                   DATA_TYPECODE,\n                                                   &is_new_object);\n  if (!array || !require_dimensions(array, 1) ||\n      !require_size(array, size, 1)) SWIG_fail;\n  $1 = ($1_ltype) array_data(array);\n}\n%typemap(freearg)\n  (DATA_TYPE IN_ARRAY1[ANY])\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1)\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1)\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[1] = { -1 };\n  array = obj_to_array_contiguous_allow_conversion($input,\n                                                   DATA_TYPECODE,\n                                                   &is_new_object);\n  if (!array || !require_dimensions(array, 1) ||\n      !require_size(array, size, 1)) SWIG_fail;\n  $1 = (DATA_TYPE*) array_data(array);\n  $2 = (DIM_TYPE) array_size(array,0);\n}\n%typemap(freearg)\n  (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1)\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1)\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1)\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[1] = {-1};\n  array = obj_to_array_contiguous_allow_conversion($input,\n                                                   DATA_TYPECODE,\n                                                   &is_new_object);\n  if (!array || !require_dimensions(array, 1) ||\n      !require_size(array, size, 1)) SWIG_fail;\n  $1 = (DIM_TYPE) array_size(array,0);\n  $2 = (DATA_TYPE*) array_data(array);\n}\n%typemap(freearg)\n  (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1)\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DATA_TYPE IN_ARRAY2[ANY][ANY])\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE IN_ARRAY2[ANY][ANY])\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE IN_ARRAY2[ANY][ANY])\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[2] = { $1_dim0, $1_dim1 };\n  array = obj_to_array_contiguous_allow_conversion($input,\n                                                   DATA_TYPECODE,\n                                                   &is_new_object);\n  if (!array || !require_dimensions(array, 2) ||\n      !require_size(array, size, 2)) SWIG_fail;\n  $1 = ($1_ltype) array_data(array);\n}\n%typemap(freearg)\n  (DATA_TYPE IN_ARRAY2[ANY][ANY])\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[2] = { -1, -1 };\n  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,\n                                                   &is_new_object);\n  if (!array || !require_dimensions(array, 2) ||\n      !require_size(array, size, 2)) SWIG_fail;\n  $1 = (DATA_TYPE*) array_data(array);\n  $2 = (DIM_TYPE) array_size(array,0);\n  $3 = (DIM_TYPE) array_size(array,1);\n}\n%typemap(freearg)\n  (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2)\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2)\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[2] = { -1, -1 };\n  array = obj_to_array_contiguous_allow_conversion($input,\n                                                   DATA_TYPECODE,\n                                                   &is_new_object);\n  if (!array || !require_dimensions(array, 2) ||\n      !require_size(array, size, 2)) SWIG_fail;\n  $1 = (DIM_TYPE) array_size(array,0);\n  $2 = (DIM_TYPE) array_size(array,1);\n  $3 = (DATA_TYPE*) array_data(array);\n}\n%typemap(freearg)\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2)\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[2] = { -1, -1 };\n  array = obj_to_array_fortran_allow_conversion($input,\n                                                DATA_TYPECODE,\n                                                &is_new_object);\n  if (!array || !require_dimensions(array, 2) ||\n      !require_size(array, size, 2) || !require_fortran(array)) SWIG_fail;\n  $1 = (DATA_TYPE*) array_data(array);\n  $2 = (DIM_TYPE) array_size(array,0);\n  $3 = (DIM_TYPE) array_size(array,1);\n}\n%typemap(freearg)\n  (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2)\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2)\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[2] = { -1, -1 };\n  array = obj_to_array_contiguous_allow_conversion($input,\n                                                   DATA_TYPECODE,\n                                                   &is_new_object);\n  if (!array || !require_dimensions(array, 2) ||\n      !require_size(array, size, 2) || !require_fortran(array)) SWIG_fail;\n  $1 = (DIM_TYPE) array_size(array,0);\n  $2 = (DIM_TYPE) array_size(array,1);\n  $3 = (DATA_TYPE*) array_data(array);\n}\n%typemap(freearg)\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2)\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY])\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY])\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY])\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[3] = { $1_dim0, $1_dim1, $1_dim2 };\n  array = obj_to_array_contiguous_allow_conversion($input,\n                                                   DATA_TYPECODE,\n                                                   &is_new_object);\n  if (!array || !require_dimensions(array, 3) ||\n      !require_size(array, size, 3)) SWIG_fail;\n  $1 = ($1_ltype) array_data(array);\n}\n%typemap(freearg)\n  (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY])\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2,\n *                    DIM_TYPE DIM3)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[3] = { -1, -1, -1 };\n  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,\n                                                   &is_new_object);\n  if (!array || !require_dimensions(array, 3) ||\n      !require_size(array, size, 3)) SWIG_fail;\n  $1 = (DATA_TYPE*) array_data(array);\n  $2 = (DIM_TYPE) array_size(array,0);\n  $3 = (DIM_TYPE) array_size(array,1);\n  $4 = (DIM_TYPE) array_size(array,2);\n}\n%typemap(freearg)\n  (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DATA_TYPE** IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2,\n *                    DIM_TYPE DIM3)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE** IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n{\n  /* for now, only concerned with lists */\n  $1 = PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE** IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n  (DATA_TYPE** array=NULL, PyArrayObject** object_array=NULL, int* is_new_object_array=NULL)\n{\n  npy_intp size[2] = { -1, -1 };\n  PyArrayObject* temp_array;\n  Py_ssize_t i;\n  int is_new_object;\n\n  /* length of the list */\n  $2 = PyList_Size($input);\n\n  /* the arrays */\n  array = (DATA_TYPE **)malloc($2*sizeof(DATA_TYPE *));\n  object_array = (PyArrayObject **)calloc($2,sizeof(PyArrayObject *));\n  is_new_object_array = (int *)calloc($2,sizeof(int));\n\n  if (array == NULL || object_array == NULL || is_new_object_array == NULL)\n  {\n    SWIG_fail;\n  }\n\n  for (i=0; i<$2; i++)\n  {\n    temp_array = obj_to_array_contiguous_allow_conversion(PySequence_GetItem($input,i), DATA_TYPECODE, &is_new_object);\n\n    /* the new array must be stored so that it can be destroyed in freearg */\n    object_array[i] = temp_array;\n    is_new_object_array[i] = is_new_object;\n\n    if (!temp_array || !require_dimensions(temp_array, 2)) SWIG_fail;\n\n    /* store the size of the first array in the list, then use that for comparison. */\n    if (i == 0)\n    {\n      size[0] = array_size(temp_array,0);\n      size[1] = array_size(temp_array,1);\n    }\n    \n    if (!require_size(temp_array, size, 2)) SWIG_fail;\n\n    array[i] = (DATA_TYPE*) array_data(temp_array);\n  }\n\n  $1 = (DATA_TYPE**) array;\n  $3 = (DIM_TYPE) size[0];\n  $4 = (DIM_TYPE) size[1];\n}\n%typemap(freearg)\n  (DATA_TYPE** IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n{\n  Py_ssize_t i;\n\n  if (array$argnum!=NULL) free(array$argnum);\n\n  /*freeing the individual arrays if needed */\n  if (object_array$argnum!=NULL)\n  {\n    if (is_new_object_array$argnum!=NULL)\n    {\n      for (i=0; i<$2; i++)\n      {\n        if (object_array$argnum[i] != NULL && is_new_object_array$argnum[i])\n        { Py_DECREF(object_array$argnum[i]); }\n      }\n      free(is_new_object_array$argnum);\n    }\n    free(object_array$argnum);\n  }\n}\n\n/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3,\n *                    DATA_TYPE* IN_ARRAY3)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3)\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3)\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[3] = { -1, -1, -1 };\n  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,\n                                                   &is_new_object);\n  if (!array || !require_dimensions(array, 3) ||\n      !require_size(array, size, 3)) SWIG_fail;\n  $1 = (DIM_TYPE) array_size(array,0);\n  $2 = (DIM_TYPE) array_size(array,1);\n  $3 = (DIM_TYPE) array_size(array,2);\n  $4 = (DATA_TYPE*) array_data(array);\n}\n%typemap(freearg)\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3)\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2,\n *                    DIM_TYPE DIM3)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[3] = { -1, -1, -1 };\n  array = obj_to_array_fortran_allow_conversion($input, DATA_TYPECODE,\n                                                &is_new_object);\n  if (!array || !require_dimensions(array, 3) ||\n      !require_size(array, size, 3) | !require_fortran(array)) SWIG_fail;\n  $1 = (DATA_TYPE*) array_data(array);\n  $2 = (DIM_TYPE) array_size(array,0);\n  $3 = (DIM_TYPE) array_size(array,1);\n  $4 = (DIM_TYPE) array_size(array,2);\n}\n%typemap(freearg)\n  (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3,\n *                    DATA_TYPE* IN_FARRAY3)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_FARRAY3)\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_FARRAY3)\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[3] = { -1, -1, -1 };\n  array = obj_to_array_contiguous_allow_conversion($input,\n                                                   DATA_TYPECODE,\n                                                   &is_new_object);\n  if (!array || !require_dimensions(array, 3) ||\n      !require_size(array, size, 3) || !require_fortran(array)) SWIG_fail;\n  $1 = (DIM_TYPE) array_size(array,0);\n  $2 = (DIM_TYPE) array_size(array,1);\n  $3 = (DIM_TYPE) array_size(array,2);\n  $4 = (DATA_TYPE*) array_data(array);\n}\n%typemap(freearg)\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_FARRAY3)\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DATA_TYPE IN_ARRAY4[ANY][ANY][ANY][ANY])\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE IN_ARRAY4[ANY][ANY][ANY][ANY])\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE IN_ARRAY4[ANY][ANY][ANY][ANY])\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[4] = { $1_dim0, $1_dim1, $1_dim2 , $1_dim3};\n  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,\n                                                   &is_new_object);\n  if (!array || !require_dimensions(array, 4) ||\n      !require_size(array, size, 4)) SWIG_fail;\n  $1 = ($1_ltype) array_data(array);\n}\n%typemap(freearg)\n  (DATA_TYPE IN_ARRAY4[ANY][ANY][ANY][ANY])\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DATA_TYPE* IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2,\n *                    DIM_TYPE DIM3, DIM_TYPE DIM4)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE* IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE* IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[4] = { -1, -1, -1, -1 };\n  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,\n                                                   &is_new_object);\n  if (!array || !require_dimensions(array, 4) ||\n      !require_size(array, size, 4)) SWIG_fail;\n  $1 = (DATA_TYPE*) array_data(array);\n  $2 = (DIM_TYPE) array_size(array,0);\n  $3 = (DIM_TYPE) array_size(array,1);\n  $4 = (DIM_TYPE) array_size(array,2);\n  $5 = (DIM_TYPE) array_size(array,3);\n}\n%typemap(freearg)\n  (DATA_TYPE* IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DATA_TYPE** IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2,\n *                    DIM_TYPE DIM3, DIM_TYPE DIM4)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE** IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n{\n  /* for now, only concerned with lists */\n  $1 = PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE** IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n  (DATA_TYPE** array=NULL, PyArrayObject** object_array=NULL, int* is_new_object_array=NULL)\n{\n  npy_intp size[3] = { -1, -1, -1 };\n  PyArrayObject* temp_array;\n  Py_ssize_t i;\n  int is_new_object;\n\n  /* length of the list */\n  $2 = PyList_Size($input);\n\n  /* the arrays */\n  array = (DATA_TYPE **)malloc($2*sizeof(DATA_TYPE *));\n  object_array = (PyArrayObject **)calloc($2,sizeof(PyArrayObject *));\n  is_new_object_array = (int *)calloc($2,sizeof(int));\n\n  if (array == NULL || object_array == NULL || is_new_object_array == NULL)\n  {\n    SWIG_fail;\n  }\n\n  for (i=0; i<$2; i++)\n  {\n    temp_array = obj_to_array_contiguous_allow_conversion(PySequence_GetItem($input,i), DATA_TYPECODE, &is_new_object);\n\n    /* the new array must be stored so that it can be destroyed in freearg */\n    object_array[i] = temp_array;\n    is_new_object_array[i] = is_new_object;\n\n    if (!temp_array || !require_dimensions(temp_array, 3)) SWIG_fail;\n\n    /* store the size of the first array in the list, then use that for comparison. */\n    if (i == 0)\n    {\n      size[0] = array_size(temp_array,0);\n      size[1] = array_size(temp_array,1);\n      size[2] = array_size(temp_array,2);\n    }\n    \n    if (!require_size(temp_array, size, 3)) SWIG_fail;\n\n    array[i] = (DATA_TYPE*) array_data(temp_array);\n  }\n\n  $1 = (DATA_TYPE**) array;\n  $3 = (DIM_TYPE) size[0];\n  $4 = (DIM_TYPE) size[1];\n  $5 = (DIM_TYPE) size[2];\n}\n%typemap(freearg)\n  (DATA_TYPE** IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n{\n  Py_ssize_t i;\n\n  if (array$argnum!=NULL) free(array$argnum);\n\n  /*freeing the individual arrays if needed */\n  if (object_array$argnum!=NULL)\n  {\n    if (is_new_object_array$argnum!=NULL)\n    {\n      for (i=0; i<$2; i++)\n      {\n        if (object_array$argnum[i] != NULL && is_new_object_array$argnum[i])\n        { Py_DECREF(object_array$argnum[i]); }\n      }\n      free(is_new_object_array$argnum);\n    }\n    free(object_array$argnum);\n  }\n}\n\n/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4,\n *                    DATA_TYPE* IN_ARRAY4)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_ARRAY4)\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_ARRAY4)\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[4] = { -1, -1, -1 , -1};\n  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,\n                                                   &is_new_object);\n  if (!array || !require_dimensions(array, 4) ||\n      !require_size(array, size, 4)) SWIG_fail;\n  $1 = (DIM_TYPE) array_size(array,0);\n  $2 = (DIM_TYPE) array_size(array,1);\n  $3 = (DIM_TYPE) array_size(array,2);\n  $4 = (DIM_TYPE) array_size(array,3);\n  $5 = (DATA_TYPE*) array_data(array);\n}\n%typemap(freearg)\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_ARRAY4)\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DATA_TYPE* IN_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2,\n *                    DIM_TYPE DIM3, DIM_TYPE DIM4)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE* IN_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE* IN_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[4] = { -1, -1, -1, -1 };\n  array = obj_to_array_fortran_allow_conversion($input, DATA_TYPECODE,\n                                                &is_new_object);\n  if (!array || !require_dimensions(array, 4) ||\n      !require_size(array, size, 4) | !require_fortran(array)) SWIG_fail;\n  $1 = (DATA_TYPE*) array_data(array);\n  $2 = (DIM_TYPE) array_size(array,0);\n  $3 = (DIM_TYPE) array_size(array,1);\n  $4 = (DIM_TYPE) array_size(array,2);\n  $5 = (DIM_TYPE) array_size(array,3);\n}\n%typemap(freearg)\n  (DATA_TYPE* IN_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4,\n *                    DATA_TYPE* IN_FARRAY4)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_FARRAY4)\n{\n  $1 = is_array($input) || PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_FARRAY4)\n  (PyArrayObject* array=NULL, int is_new_object=0)\n{\n  npy_intp size[4] = { -1, -1, -1 , -1 };\n  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,\n                                                   &is_new_object);\n  if (!array || !require_dimensions(array, 4) ||\n      !require_size(array, size, 4) || !require_fortran(array)) SWIG_fail;\n  $1 = (DIM_TYPE) array_size(array,0);\n  $2 = (DIM_TYPE) array_size(array,1);\n  $3 = (DIM_TYPE) array_size(array,2);\n  $4 = (DIM_TYPE) array_size(array,3);\n  $5 = (DATA_TYPE*) array_data(array);\n}\n%typemap(freearg)\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_FARRAY4)\n{\n  if (is_new_object$argnum && array$argnum)\n    { Py_DECREF(array$argnum); }\n}\n\n/***************************/\n/* In-Place Array Typemaps */\n/***************************/\n\n/* Typemap suite for (DATA_TYPE INPLACE_ARRAY1[ANY])\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE INPLACE_ARRAY1[ANY])\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE INPLACE_ARRAY1[ANY])\n  (PyArrayObject* array=NULL)\n{\n  npy_intp size[1] = { $1_dim0 };\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,1) || !require_size(array, size, 1) ||\n      !require_contiguous(array) || !require_native(array)) SWIG_fail;\n  $1 = ($1_ltype) array_data(array);\n}\n\n/* Typemap suite for (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1)\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1)\n  (PyArrayObject* array=NULL, int i=1)\n{\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,1) || !require_contiguous(array)\n      || !require_native(array)) SWIG_fail;\n  $1 = (DATA_TYPE*) array_data(array);\n  $2 = 1;\n  for (i=0; i < array_numdims(array); ++i) $2 *= array_size(array,i);\n}\n\n/* Typemap suite for (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1)\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1)\n  (PyArrayObject* array=NULL, int i=0)\n{\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,1) || !require_contiguous(array)\n      || !require_native(array)) SWIG_fail;\n  $1 = 1;\n  for (i=0; i < array_numdims(array); ++i) $1 *= array_size(array,i);\n  $2 = (DATA_TYPE*) array_data(array);\n}\n\n/* Typemap suite for (DATA_TYPE INPLACE_ARRAY2[ANY][ANY])\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE INPLACE_ARRAY2[ANY][ANY])\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE INPLACE_ARRAY2[ANY][ANY])\n  (PyArrayObject* array=NULL)\n{\n  npy_intp size[2] = { $1_dim0, $1_dim1 };\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,2) || !require_size(array, size, 2) ||\n      !require_contiguous(array) || !require_native(array)) SWIG_fail;\n  $1 = ($1_ltype) array_data(array);\n}\n\n/* Typemap suite for (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n  (PyArrayObject* array=NULL)\n{\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,2) || !require_contiguous(array)\n      || !require_native(array)) SWIG_fail;\n  $1 = (DATA_TYPE*) array_data(array);\n  $2 = (DIM_TYPE) array_size(array,0);\n  $3 = (DIM_TYPE) array_size(array,1);\n}\n\n/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2)\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2)\n  (PyArrayObject* array=NULL)\n{\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,2) || !require_contiguous(array) ||\n      !require_native(array)) SWIG_fail;\n  $1 = (DIM_TYPE) array_size(array,0);\n  $2 = (DIM_TYPE) array_size(array,1);\n  $3 = (DATA_TYPE*) array_data(array);\n}\n\n/* Typemap suite for (DATA_TYPE* INPLACE_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE* INPLACE_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE* INPLACE_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)\n  (PyArrayObject* array=NULL)\n{\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,2) || !require_contiguous(array)\n      || !require_native(array) || !require_fortran(array)) SWIG_fail;\n  $1 = (DATA_TYPE*) array_data(array);\n  $2 = (DIM_TYPE) array_size(array,0);\n  $3 = (DIM_TYPE) array_size(array,1);\n}\n\n/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_FARRAY2)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_FARRAY2)\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_FARRAY2)\n  (PyArrayObject* array=NULL)\n{\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,2) || !require_contiguous(array) ||\n      !require_native(array) || !require_fortran(array)) SWIG_fail;\n  $1 = (DIM_TYPE) array_size(array,0);\n  $2 = (DIM_TYPE) array_size(array,1);\n  $3 = (DATA_TYPE*) array_data(array);\n}\n\n/* Typemap suite for (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY])\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY])\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY])\n  (PyArrayObject* array=NULL)\n{\n  npy_intp size[3] = { $1_dim0, $1_dim1, $1_dim2 };\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,3) || !require_size(array, size, 3) ||\n      !require_contiguous(array) || !require_native(array)) SWIG_fail;\n  $1 = ($1_ltype) array_data(array);\n}\n\n/* Typemap suite for (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2,\n *                    DIM_TYPE DIM3)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n  (PyArrayObject* array=NULL)\n{\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,3) || !require_contiguous(array) ||\n      !require_native(array)) SWIG_fail;\n  $1 = (DATA_TYPE*) array_data(array);\n  $2 = (DIM_TYPE) array_size(array,0);\n  $3 = (DIM_TYPE) array_size(array,1);\n  $4 = (DIM_TYPE) array_size(array,2);\n}\n\n/* Typemap suite for (DATA_TYPE** INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2,\n *                    DIM_TYPE DIM3)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE** INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n{\n  $1 = PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE** INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n  (DATA_TYPE** array=NULL, PyArrayObject** object_array=NULL)\n{\n  npy_intp size[2] = { -1, -1 };\n  PyArrayObject* temp_array;\n  Py_ssize_t i;\n\n  /* length of the list */\n  $2 = PyList_Size($input);\n\n  /* the arrays */\n  array = (DATA_TYPE **)malloc($2*sizeof(DATA_TYPE *));\n  object_array = (PyArrayObject **)calloc($2,sizeof(PyArrayObject *));\n\n  if (array == NULL || object_array == NULL)\n  {\n    SWIG_fail;\n  }\n\n  for (i=0; i<$2; i++)\n  {\n    temp_array = obj_to_array_no_conversion(PySequence_GetItem($input,i), DATA_TYPECODE);\n\n    /* the new array must be stored so that it can be destroyed in freearg */\n    object_array[i] = temp_array;\n\n    if ( !temp_array || !require_dimensions(temp_array, 2) ||\n      !require_contiguous(temp_array) ||\n      !require_native(temp_array) ||\n      !PyArray_EquivTypenums(array_type(temp_array), DATA_TYPECODE)\n    ) SWIG_fail;\n\n    /* store the size of the first array in the list, then use that for comparison. */\n    if (i == 0)\n    {\n      size[0] = array_size(temp_array,0);\n      size[1] = array_size(temp_array,1);\n    }\n    \n    if (!require_size(temp_array, size, 2)) SWIG_fail;\n\n    array[i] = (DATA_TYPE*) array_data(temp_array);\n  }\n\n  $1 = (DATA_TYPE**) array;\n  $3 = (DIM_TYPE) size[0];\n  $4 = (DIM_TYPE) size[1];\n}\n%typemap(freearg)\n  (DATA_TYPE** INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n{\n  if (array$argnum!=NULL) free(array$argnum);\n  if (object_array$argnum!=NULL) free(object_array$argnum);\n}\n\n/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3,\n *                    DATA_TYPE* INPLACE_ARRAY3)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_ARRAY3)\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_ARRAY3)\n  (PyArrayObject* array=NULL)\n{\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,3) || !require_contiguous(array)\n      || !require_native(array)) SWIG_fail;\n  $1 = (DIM_TYPE) array_size(array,0);\n  $2 = (DIM_TYPE) array_size(array,1);\n  $3 = (DIM_TYPE) array_size(array,2);\n  $4 = (DATA_TYPE*) array_data(array);\n}\n\n/* Typemap suite for (DATA_TYPE* INPLACE_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2,\n *                    DIM_TYPE DIM3)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE* INPLACE_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE* INPLACE_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)\n  (PyArrayObject* array=NULL)\n{\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,3) || !require_contiguous(array) ||\n      !require_native(array) || !require_fortran(array)) SWIG_fail;\n  $1 = (DATA_TYPE*) array_data(array);\n  $2 = (DIM_TYPE) array_size(array,0);\n  $3 = (DIM_TYPE) array_size(array,1);\n  $4 = (DIM_TYPE) array_size(array,2);\n}\n\n/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3,\n *                    DATA_TYPE* INPLACE_FARRAY3)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_FARRAY3)\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_FARRAY3)\n  (PyArrayObject* array=NULL)\n{\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,3) || !require_contiguous(array)\n      || !require_native(array) || !require_fortran(array)) SWIG_fail;\n  $1 = (DIM_TYPE) array_size(array,0);\n  $2 = (DIM_TYPE) array_size(array,1);\n  $3 = (DIM_TYPE) array_size(array,2);\n  $4 = (DATA_TYPE*) array_data(array);\n}\n\n/* Typemap suite for (DATA_TYPE INPLACE_ARRAY4[ANY][ANY][ANY][ANY])\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE INPLACE_ARRAY4[ANY][ANY][ANY][ANY])\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE INPLACE_ARRAY4[ANY][ANY][ANY][ANY])\n  (PyArrayObject* array=NULL)\n{\n  npy_intp size[4] = { $1_dim0, $1_dim1, $1_dim2 , $1_dim3 };\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,4) || !require_size(array, size, 4) ||\n      !require_contiguous(array) || !require_native(array)) SWIG_fail;\n  $1 = ($1_ltype) array_data(array);\n}\n\n/* Typemap suite for (DATA_TYPE* INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2,\n *                    DIM_TYPE DIM3, DIM_TYPE DIM4)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE* INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE* INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n  (PyArrayObject* array=NULL)\n{\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,4) || !require_contiguous(array) ||\n      !require_native(array)) SWIG_fail;\n  $1 = (DATA_TYPE*) array_data(array);\n  $2 = (DIM_TYPE) array_size(array,0);\n  $3 = (DIM_TYPE) array_size(array,1);\n  $4 = (DIM_TYPE) array_size(array,2);\n  $5 = (DIM_TYPE) array_size(array,3);\n}\n\n/* Typemap suite for (DATA_TYPE** INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2,\n *                    DIM_TYPE DIM3, DIM_TYPE DIM4)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE** INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n{\n  $1 = PySequence_Check($input);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE** INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n  (DATA_TYPE** array=NULL, PyArrayObject** object_array=NULL)\n{\n  npy_intp size[3] = { -1, -1, -1 };\n  PyArrayObject* temp_array;\n  Py_ssize_t i;\n\n  /* length of the list */\n  $2 = PyList_Size($input);\n\n  /* the arrays */\n  array = (DATA_TYPE **)malloc($2*sizeof(DATA_TYPE *));\n  object_array = (PyArrayObject **)calloc($2,sizeof(PyArrayObject *));\n\n  if (array == NULL || object_array == NULL)\n  {\n    SWIG_fail;\n  }\n\n  for (i=0; i<$2; i++)\n  {\n    temp_array = obj_to_array_no_conversion(PySequence_GetItem($input,i), DATA_TYPECODE);\n\n    /* the new array must be stored so that it can be destroyed in freearg */\n    object_array[i] = temp_array;\n\n    if ( !temp_array || !require_dimensions(temp_array, 3) ||\n      !require_contiguous(temp_array) ||\n      !require_native(temp_array) ||\n      !PyArray_EquivTypenums(array_type(temp_array), DATA_TYPECODE)\n    ) SWIG_fail;\n\n    /* store the size of the first array in the list, then use that for comparison. */\n    if (i == 0)\n    {\n      size[0] = array_size(temp_array,0);\n      size[1] = array_size(temp_array,1);\n      size[2] = array_size(temp_array,2);\n    }\n    \n    if (!require_size(temp_array, size, 3)) SWIG_fail;\n\n    array[i] = (DATA_TYPE*) array_data(temp_array);\n  }\n\n  $1 = (DATA_TYPE**) array;\n  $3 = (DIM_TYPE) size[0];\n  $4 = (DIM_TYPE) size[1];\n  $5 = (DIM_TYPE) size[2];\n}\n%typemap(freearg)\n  (DATA_TYPE** INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n{\n  if (array$argnum!=NULL) free(array$argnum);\n  if (object_array$argnum!=NULL) free(object_array$argnum);\n}\n\n/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4,\n *                    DATA_TYPE* INPLACE_ARRAY4)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_ARRAY4)\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_ARRAY4)\n  (PyArrayObject* array=NULL)\n{\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,4) || !require_contiguous(array)\n      || !require_native(array)) SWIG_fail;\n  $1 = (DIM_TYPE) array_size(array,0);\n  $2 = (DIM_TYPE) array_size(array,1);\n  $3 = (DIM_TYPE) array_size(array,2);\n  $4 = (DIM_TYPE) array_size(array,3);\n  $5 = (DATA_TYPE*) array_data(array);\n}\n\n/* Typemap suite for (DATA_TYPE* INPLACE_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2,\n *                    DIM_TYPE DIM3, DIM_TYPE DIM4)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DATA_TYPE* INPLACE_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE* INPLACE_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)\n  (PyArrayObject* array=NULL)\n{\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,4) || !require_contiguous(array) ||\n      !require_native(array) || !require_fortran(array)) SWIG_fail;\n  $1 = (DATA_TYPE*) array_data(array);\n  $2 = (DIM_TYPE) array_size(array,0);\n  $3 = (DIM_TYPE) array_size(array,1);\n  $4 = (DIM_TYPE) array_size(array,2);\n  $5 = (DIM_TYPE) array_size(array,3);\n}\n\n/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3,\n *                    DATA_TYPE* INPLACE_FARRAY4)\n */\n%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,\n           fragment=\"NumPy_Macros\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_FARRAY4)\n{\n  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),\n                                                 DATA_TYPECODE);\n}\n%typemap(in,\n         fragment=\"NumPy_Fragments\")\n  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_FARRAY4)\n  (PyArrayObject* array=NULL)\n{\n  array = obj_to_array_no_conversion($input, DATA_TYPECODE);\n  if (!array || !require_dimensions(array,4) || !require_contiguous(array)\n      || !require_native(array) || !require_fortran(array)) SWIG_fail;\n  $1 = (DIM_TYPE) array_size(array,0);\n  $2 = (DIM_TYPE) array_size(array,1);\n  $3 = (DIM_TYPE) array_size(array,2);\n  $4 = (DIM_TYPE) array_size(array,3);\n  $5 = (DATA_TYPE*) array_data(array);\n}\n\n/*************************/\n/* Argout Array Typemaps */\n/*************************/\n\n/* Typemap suite for (DATA_TYPE ARGOUT_ARRAY1[ANY])\n */\n%typemap(in,numinputs=0,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Macros\")\n  (DATA_TYPE ARGOUT_ARRAY1[ANY])\n  (PyObject* array = NULL)\n{\n  npy_intp dims[1] = { $1_dim0 };\n  array = PyArray_SimpleNew(1, dims, DATA_TYPECODE);\n  if (!array) SWIG_fail;\n  $1 = ($1_ltype) array_data(array);\n}\n%typemap(argout)\n  (DATA_TYPE ARGOUT_ARRAY1[ANY])\n{\n  $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum);\n}\n\n/* Typemap suite for (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1)\n */\n%typemap(in,numinputs=1,\n         fragment=\"NumPy_Fragments\")\n  (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1)\n  (PyObject* array = NULL)\n{\n  npy_intp dims[1];\n  if (!PyInt_Check($input))\n  {\n    const char* typestring = pytype_string($input);\n    PyErr_Format(PyExc_TypeError,\n                 \"Int dimension expected.  '%s' given.\",\n                 typestring);\n    SWIG_fail;\n  }\n  $2 = (DIM_TYPE) PyInt_AsLong($input);\n  dims[0] = (npy_intp) $2;\n  array = PyArray_SimpleNew(1, dims, DATA_TYPECODE);\n  if (!array) SWIG_fail;\n  $1 = (DATA_TYPE*) array_data(array);\n}\n%typemap(argout)\n  (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1)\n{\n  $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum);\n}\n\n/* Typemap suite for (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1)\n */\n%typemap(in,numinputs=1,\n         fragment=\"NumPy_Fragments\")\n  (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1)\n  (PyObject* array = NULL)\n{\n  npy_intp dims[1];\n  if (!PyInt_Check($input))\n  {\n    const char* typestring = pytype_string($input);\n    PyErr_Format(PyExc_TypeError,\n                 \"Int dimension expected.  '%s' given.\",\n                 typestring);\n    SWIG_fail;\n  }\n  $1 = (DIM_TYPE) PyInt_AsLong($input);\n  dims[0] = (npy_intp) $1;\n  array = PyArray_SimpleNew(1, dims, DATA_TYPECODE);\n  if (!array) SWIG_fail;\n  $2 = (DATA_TYPE*) array_data(array);\n}\n%typemap(argout)\n  (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1)\n{\n  $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum);\n}\n\n/* Typemap suite for (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY])\n */\n%typemap(in,numinputs=0,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Macros\")\n  (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY])\n  (PyObject* array = NULL)\n{\n  npy_intp dims[2] = { $1_dim0, $1_dim1 };\n  array = PyArray_SimpleNew(2, dims, DATA_TYPECODE);\n  if (!array) SWIG_fail;\n  $1 = ($1_ltype) array_data(array);\n}\n%typemap(argout)\n  (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY])\n{\n  $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum);\n}\n\n/* Typemap suite for (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY])\n */\n%typemap(in,numinputs=0,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Macros\")\n  (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY])\n  (PyObject* array = NULL)\n{\n  npy_intp dims[3] = { $1_dim0, $1_dim1, $1_dim2 };\n  array = PyArray_SimpleNew(3, dims, DATA_TYPECODE);\n  if (!array) SWIG_fail;\n  $1 = ($1_ltype) array_data(array);\n}\n%typemap(argout)\n  (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY])\n{\n  $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum);\n}\n\n/* Typemap suite for (DATA_TYPE ARGOUT_ARRAY4[ANY][ANY][ANY][ANY])\n */\n%typemap(in,numinputs=0,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Macros\")\n  (DATA_TYPE ARGOUT_ARRAY4[ANY][ANY][ANY][ANY])\n  (PyObject* array = NULL)\n{\n  npy_intp dims[4] = { $1_dim0, $1_dim1, $1_dim2, $1_dim3 };\n  array = PyArray_SimpleNew(4, dims, DATA_TYPECODE);\n  if (!array) SWIG_fail;\n  $1 = ($1_ltype) array_data(array);\n}\n%typemap(argout)\n  (DATA_TYPE ARGOUT_ARRAY4[ANY][ANY][ANY][ANY])\n{\n  $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum);\n}\n\n/*****************************/\n/* Argoutview Array Typemaps */\n/*****************************/\n\n/* Typemap suite for (DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1)\n */\n%typemap(in,numinputs=0)\n  (DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1    )\n  (DATA_TYPE*  data_temp = NULL , DIM_TYPE  dim_temp)\n{\n  $1 = &data_temp;\n  $2 = &dim_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1)\n{\n  npy_intp dims[1] = { *$2 };\n  PyObject* obj = PyArray_SimpleNewFromData(1, dims, DATA_TYPECODE, (void*)(*$1));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEW_ARRAY1)\n */\n%typemap(in,numinputs=0)\n  (DIM_TYPE* DIM1    , DATA_TYPE** ARGOUTVIEW_ARRAY1)\n  (DIM_TYPE  dim_temp, DATA_TYPE*  data_temp = NULL )\n{\n  $1 = &dim_temp;\n  $2 = &data_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEW_ARRAY1)\n{\n  npy_intp dims[1] = { *$1 };\n  PyObject* obj = PyArray_SimpleNewFromData(1, dims, DATA_TYPECODE, (void*)(*$2));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)\n */\n%typemap(in,numinputs=0)\n  (DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1     , DIM_TYPE* DIM2     )\n  (DATA_TYPE*  data_temp = NULL , DIM_TYPE  dim1_temp, DIM_TYPE  dim2_temp)\n{\n  $1 = &data_temp;\n  $2 = &dim1_temp;\n  $3 = &dim2_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)\n{\n  npy_intp dims[2] = { *$2, *$3 };\n  PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$1));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_ARRAY2)\n */\n%typemap(in,numinputs=0)\n  (DIM_TYPE* DIM1     , DIM_TYPE* DIM2     , DATA_TYPE** ARGOUTVIEW_ARRAY2)\n  (DIM_TYPE  dim1_temp, DIM_TYPE  dim2_temp, DATA_TYPE*  data_temp = NULL )\n{\n  $1 = &dim1_temp;\n  $2 = &dim2_temp;\n  $3 = &data_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_ARRAY2)\n{\n  npy_intp dims[2] = { *$1, *$2 };\n  PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$3));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)\n */\n%typemap(in,numinputs=0)\n  (DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1     , DIM_TYPE* DIM2     )\n  (DATA_TYPE*  data_temp = NULL  , DIM_TYPE  dim1_temp, DIM_TYPE  dim2_temp)\n{\n  $1 = &data_temp;\n  $2 = &dim1_temp;\n  $3 = &dim2_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Array_Requirements\")\n  (DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)\n{\n  npy_intp dims[2] = { *$2, *$3 };\n  PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$1));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array || !require_fortran(array)) SWIG_fail;\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_FARRAY2)\n */\n%typemap(in,numinputs=0)\n  (DIM_TYPE* DIM1     , DIM_TYPE* DIM2     , DATA_TYPE** ARGOUTVIEW_FARRAY2)\n  (DIM_TYPE  dim1_temp, DIM_TYPE  dim2_temp, DATA_TYPE*  data_temp = NULL  )\n{\n  $1 = &dim1_temp;\n  $2 = &dim2_temp;\n  $3 = &data_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Array_Requirements\")\n  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_FARRAY2)\n{\n  npy_intp dims[2] = { *$1, *$2 };\n  PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$3));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array || !require_fortran(array)) SWIG_fail;\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2,\n                      DIM_TYPE* DIM3)\n */\n%typemap(in,numinputs=0)\n  (DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    )\n  (DATA_TYPE* data_temp = NULL  , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp)\n{\n  $1 = &data_temp;\n  $2 = &dim1_temp;\n  $3 = &dim2_temp;\n  $4 = &dim3_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)\n{\n  npy_intp dims[3] = { *$2, *$3, *$4 };\n  PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$1));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3,\n                      DATA_TYPE** ARGOUTVIEW_ARRAY3)\n */\n%typemap(in,numinputs=0)\n  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_ARRAY3)\n  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DATA_TYPE* data_temp = NULL)\n{\n  $1 = &dim1_temp;\n  $2 = &dim2_temp;\n  $3 = &dim3_temp;\n  $4 = &data_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_ARRAY3)\n{\n  npy_intp dims[3] = { *$1, *$2, *$3 };\n  PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$4));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2,\n                      DIM_TYPE* DIM3)\n */\n%typemap(in,numinputs=0)\n  (DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    )\n  (DATA_TYPE* data_temp = NULL   , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp)\n{\n  $1 = &data_temp;\n  $2 = &dim1_temp;\n  $3 = &dim2_temp;\n  $4 = &dim3_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Array_Requirements\")\n  (DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)\n{\n  npy_intp dims[3] = { *$2, *$3, *$4 };\n  PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$1));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array || require_fortran(array)) SWIG_fail;\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3,\n                      DATA_TYPE** ARGOUTVIEW_FARRAY3)\n */\n%typemap(in,numinputs=0)\n  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DATA_TYPE** ARGOUTVIEW_FARRAY3)\n  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DATA_TYPE* data_temp = NULL   )\n{\n  $1 = &dim1_temp;\n  $2 = &dim2_temp;\n  $3 = &dim3_temp;\n  $4 = &data_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Array_Requirements\")\n  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_FARRAY3)\n{\n  npy_intp dims[3] = { *$1, *$2, *$3 };\n  PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$4));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array || require_fortran(array)) SWIG_fail;\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DATA_TYPE** ARGOUTVIEW_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2,\n                      DIM_TYPE* DIM3, DIM_TYPE* DIM4)\n */\n%typemap(in,numinputs=0)\n  (DATA_TYPE** ARGOUTVIEW_ARRAY4, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    )\n  (DATA_TYPE* data_temp = NULL  , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp)\n{\n  $1 = &data_temp;\n  $2 = &dim1_temp;\n  $3 = &dim2_temp;\n  $4 = &dim3_temp;\n  $5 = &dim4_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DATA_TYPE** ARGOUTVIEW_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)\n{\n  npy_intp dims[4] = { *$2, *$3, *$4 , *$5 };\n  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$1));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4,\n                      DATA_TYPE** ARGOUTVIEW_ARRAY4)\n */\n%typemap(in,numinputs=0)\n  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    , DATA_TYPE** ARGOUTVIEW_ARRAY4)\n  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp, DATA_TYPE* data_temp = NULL  )\n{\n  $1 = &dim1_temp;\n  $2 = &dim2_temp;\n  $3 = &dim3_temp;\n  $4 = &dim4_temp;\n  $5 = &data_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEW_ARRAY4)\n{\n  npy_intp dims[4] = { *$1, *$2, *$3 , *$4 };\n  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$5));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DATA_TYPE** ARGOUTVIEW_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2,\n                      DIM_TYPE* DIM3, DIM_TYPE* DIM4)\n */\n%typemap(in,numinputs=0)\n  (DATA_TYPE** ARGOUTVIEW_FARRAY4, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    )\n  (DATA_TYPE* data_temp = NULL   , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp)\n{\n  $1 = &data_temp;\n  $2 = &dim1_temp;\n  $3 = &dim2_temp;\n  $4 = &dim3_temp;\n  $5 = &dim4_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Array_Requirements\")\n  (DATA_TYPE** ARGOUTVIEW_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)\n{\n  npy_intp dims[4] = { *$2, *$3, *$4 , *$5 };\n  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$1));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array || require_fortran(array)) SWIG_fail;\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4,\n                      DATA_TYPE** ARGOUTVIEW_FARRAY4)\n */\n%typemap(in,numinputs=0)\n  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    , DATA_TYPE** ARGOUTVIEW_FARRAY4)\n  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp, DATA_TYPE* data_temp = NULL   )\n{\n  $1 = &dim1_temp;\n  $2 = &dim2_temp;\n  $3 = &dim3_temp;\n  $4 = &dim4_temp;\n  $5 = &data_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Array_Requirements\")\n  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEW_FARRAY4)\n{\n  npy_intp dims[4] = { *$1, *$2, *$3 , *$4 };\n  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$5));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array || require_fortran(array)) SWIG_fail;\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/*************************************/\n/* Managed Argoutview Array Typemaps */\n/*************************************/\n\n/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_ARRAY1, DIM_TYPE* DIM1)\n */\n%typemap(in,numinputs=0)\n  (DATA_TYPE** ARGOUTVIEWM_ARRAY1, DIM_TYPE* DIM1    )\n  (DATA_TYPE*  data_temp = NULL  , DIM_TYPE  dim_temp)\n{\n  $1 = &data_temp;\n  $2 = &dim_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DATA_TYPE** ARGOUTVIEWM_ARRAY1, DIM_TYPE* DIM1)\n{\n  npy_intp dims[1] = { *$2 };\n  PyObject* obj = PyArray_SimpleNewFromData(1, dims, DATA_TYPECODE, (void*)(*$1));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n  \n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEWM_ARRAY1)\n */\n%typemap(in,numinputs=0)\n  (DIM_TYPE* DIM1    , DATA_TYPE** ARGOUTVIEWM_ARRAY1)\n  (DIM_TYPE  dim_temp, DATA_TYPE*  data_temp = NULL  )\n{\n  $1 = &dim_temp;\n  $2 = &data_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEWM_ARRAY1)\n{\n  npy_intp dims[1] = { *$1 };\n  PyObject* obj = PyArray_SimpleNewFromData(1, dims, DATA_TYPECODE, (void*)(*$2));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n  \n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)\n */\n%typemap(in,numinputs=0)\n  (DATA_TYPE** ARGOUTVIEWM_ARRAY2, DIM_TYPE* DIM1     , DIM_TYPE* DIM2     )\n  (DATA_TYPE*  data_temp = NULL  , DIM_TYPE  dim1_temp, DIM_TYPE  dim2_temp)\n{\n  $1 = &data_temp;\n  $2 = &dim1_temp;\n  $3 = &dim2_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DATA_TYPE** ARGOUTVIEWM_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)\n{\n  npy_intp dims[2] = { *$2, *$3 };\n  PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$1));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n\n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_ARRAY2)\n */\n%typemap(in,numinputs=0)\n  (DIM_TYPE* DIM1     , DIM_TYPE* DIM2     , DATA_TYPE** ARGOUTVIEWM_ARRAY2)\n  (DIM_TYPE  dim1_temp, DIM_TYPE  dim2_temp, DATA_TYPE*  data_temp = NULL  )\n{\n  $1 = &dim1_temp;\n  $2 = &dim2_temp;\n  $3 = &data_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_ARRAY2)\n{\n  npy_intp dims[2] = { *$1, *$2 };\n  PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$3));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n\n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)\n */\n%typemap(in,numinputs=0)\n  (DATA_TYPE** ARGOUTVIEWM_FARRAY2, DIM_TYPE* DIM1     , DIM_TYPE* DIM2     )\n  (DATA_TYPE*  data_temp = NULL   , DIM_TYPE  dim1_temp, DIM_TYPE  dim2_temp)\n{\n  $1 = &data_temp;\n  $2 = &dim1_temp;\n  $3 = &dim2_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Array_Requirements\")\n  (DATA_TYPE** ARGOUTVIEWM_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)\n{\n  npy_intp dims[2] = { *$2, *$3 };\n  PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$1));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array || !require_fortran(array)) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n\n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_FARRAY2)\n */\n%typemap(in,numinputs=0)\n  (DIM_TYPE* DIM1     , DIM_TYPE* DIM2     , DATA_TYPE** ARGOUTVIEWM_FARRAY2)\n  (DIM_TYPE  dim1_temp, DIM_TYPE  dim2_temp, DATA_TYPE*  data_temp = NULL   )\n{\n  $1 = &dim1_temp;\n  $2 = &dim2_temp;\n  $3 = &data_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Array_Requirements\")\n  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_FARRAY2)\n{\n  npy_intp dims[2] = { *$1, *$2 };\n  PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$3));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array || !require_fortran(array)) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n\n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2,\n                      DIM_TYPE* DIM3)\n */\n%typemap(in,numinputs=0)\n  (DATA_TYPE** ARGOUTVIEWM_ARRAY3, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    )\n  (DATA_TYPE* data_temp = NULL   , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp)\n{\n  $1 = &data_temp;\n  $2 = &dim1_temp;\n  $3 = &dim2_temp;\n  $4 = &dim3_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DATA_TYPE** ARGOUTVIEWM_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)\n{\n  npy_intp dims[3] = { *$2, *$3, *$4 };\n  PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$1));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n\n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3,\n                      DATA_TYPE** ARGOUTVIEWM_ARRAY3)\n */\n%typemap(in,numinputs=0)\n  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DATA_TYPE** ARGOUTVIEWM_ARRAY3)\n  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DATA_TYPE* data_temp = NULL   )\n{\n  $1 = &dim1_temp;\n  $2 = &dim2_temp;\n  $3 = &dim3_temp;\n  $4 = &data_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEWM_ARRAY3)\n{\n  npy_intp dims[3] = { *$1, *$2, *$3 };\n  PyObject* obj= PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$4));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n\n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2,\n                      DIM_TYPE* DIM3)\n */\n%typemap(in,numinputs=0)\n  (DATA_TYPE** ARGOUTVIEWM_FARRAY3, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    )\n  (DATA_TYPE* data_temp = NULL    , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp)\n{\n  $1 = &data_temp;\n  $2 = &dim1_temp;\n  $3 = &dim2_temp;\n  $4 = &dim3_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Array_Requirements\")\n  (DATA_TYPE** ARGOUTVIEWM_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)\n{\n  npy_intp dims[3] = { *$2, *$3, *$4 };\n  PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$1));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array || require_fortran(array)) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n\n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3,\n                      DATA_TYPE** ARGOUTVIEWM_FARRAY3)\n */\n%typemap(in,numinputs=0)\n  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DATA_TYPE** ARGOUTVIEWM_FARRAY3)\n  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DATA_TYPE* data_temp = NULL    )\n{\n  $1 = &dim1_temp;\n  $2 = &dim2_temp;\n  $3 = &dim3_temp;\n  $4 = &data_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Array_Requirements\")\n  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEWM_FARRAY3)\n{\n  npy_intp dims[3] = { *$1, *$2, *$3 };\n  PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$4));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array || require_fortran(array)) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n\n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2,\n                      DIM_TYPE* DIM3, DIM_TYPE* DIM4)\n */\n%typemap(in,numinputs=0)\n  (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    )\n  (DATA_TYPE* data_temp = NULL   , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp)\n{\n  $1 = &data_temp;\n  $2 = &dim1_temp;\n  $3 = &dim2_temp;\n  $4 = &dim3_temp;\n  $5 = &dim4_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)\n{\n  npy_intp dims[4] = { *$2, *$3, *$4 , *$5 };\n  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$1));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n\n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4,\n                      DATA_TYPE** ARGOUTVIEWM_ARRAY4)\n */\n%typemap(in,numinputs=0)\n  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    , DATA_TYPE** ARGOUTVIEWM_ARRAY4)\n  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp, DATA_TYPE* data_temp = NULL   )\n{\n  $1 = &dim1_temp;\n  $2 = &dim2_temp;\n  $3 = &dim3_temp;\n  $4 = &dim4_temp;\n  $5 = &data_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_ARRAY4)\n{\n  npy_intp dims[4] = { *$1, *$2, *$3 , *$4 };\n  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$5));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n\n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2,\n                      DIM_TYPE* DIM3, DIM_TYPE* DIM4)\n */\n%typemap(in,numinputs=0)\n  (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    )\n  (DATA_TYPE* data_temp = NULL    , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp)\n{\n  $1 = &data_temp;\n  $2 = &dim1_temp;\n  $3 = &dim2_temp;\n  $4 = &dim3_temp;\n  $5 = &dim4_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Array_Requirements\")\n  (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)\n{\n  npy_intp dims[4] = { *$2, *$3, *$4 , *$5 };\n  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$1));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array || require_fortran(array)) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n\n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4,\n                      DATA_TYPE** ARGOUTVIEWM_FARRAY4)\n */\n%typemap(in,numinputs=0)\n  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    , DATA_TYPE** ARGOUTVIEWM_FARRAY4)\n  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp, DATA_TYPE* data_temp = NULL    )\n{\n  $1 = &dim1_temp;\n  $2 = &dim2_temp;\n  $3 = &dim3_temp;\n  $4 = &dim4_temp;\n  $5 = &data_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Array_Requirements\")\n  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_FARRAY4)\n{\n  npy_intp dims[4] = { *$1, *$2, *$3 , *$4 };\n  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$5));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array || require_fortran(array)) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n\n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2,\n                      DIM_TYPE* DIM3, DIM_TYPE* DIM4)\n */\n%typemap(in,numinputs=0)\n  (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    )\n  (DATA_TYPE* data_temp = NULL   , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp)\n{\n  $1 = &data_temp;\n  $2 = &dim1_temp;\n  $3 = &dim2_temp;\n  $4 = &dim3_temp;\n  $5 = &dim4_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)\n{\n  npy_intp dims[4] = { *$2, *$3, *$4 , *$5 };\n  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$1));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n\n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4,\n                      DATA_TYPE** ARGOUTVIEWM_ARRAY4)\n */\n%typemap(in,numinputs=0)\n  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    , DATA_TYPE** ARGOUTVIEWM_ARRAY4)\n  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp, DATA_TYPE* data_temp = NULL   )\n{\n  $1 = &dim1_temp;\n  $2 = &dim2_temp;\n  $3 = &dim3_temp;\n  $4 = &dim4_temp;\n  $5 = &data_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility\")\n  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_ARRAY4)\n{\n  npy_intp dims[4] = { *$1, *$2, *$3 , *$4 };\n  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$5));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n\n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2,\n                      DIM_TYPE* DIM3, DIM_TYPE* DIM4)\n */\n%typemap(in,numinputs=0)\n  (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    )\n  (DATA_TYPE* data_temp = NULL    , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp)\n{\n  $1 = &data_temp;\n  $2 = &dim1_temp;\n  $3 = &dim2_temp;\n  $4 = &dim3_temp;\n  $5 = &dim4_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Array_Requirements\")\n  (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)\n{\n  npy_intp dims[4] = { *$2, *$3, *$4 , *$5 };\n  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$1));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array || require_fortran(array)) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n\n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4,\n                      DATA_TYPE** ARGOUTVIEWM_FARRAY4)\n */\n%typemap(in,numinputs=0)\n  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    , DATA_TYPE** ARGOUTVIEWM_FARRAY4)\n  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp, DATA_TYPE* data_temp = NULL    )\n{\n  $1 = &dim1_temp;\n  $2 = &dim2_temp;\n  $3 = &dim3_temp;\n  $4 = &dim4_temp;\n  $5 = &data_temp;\n}\n%typemap(argout,\n         fragment=\"NumPy_Backward_Compatibility,NumPy_Array_Requirements\")\n  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_FARRAY4)\n{\n  npy_intp dims[4] = { *$1, *$2, *$3 , *$4 };\n  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$5));\n  PyArrayObject* array = (PyArrayObject*) obj;\n\n  if (!array || require_fortran(array)) SWIG_fail;\n\n%#ifdef SWIGPY_USE_CAPSULE\n    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);\n%#else\n    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);\n%#endif\n\n%#if NPY_API_VERSION < 0x00000007\n  PyArray_BASE(array) = cap;\n%#else\n  PyArray_SetBaseObject(array,cap);\n%#endif\n\n  $result = SWIG_Python_AppendOutput($result,obj);\n}\n\n%enddef    /* %numpy_typemaps() macro */\n/* *************************************************************** */\n\n/* Concrete instances of the %numpy_typemaps() macro: Each invocation\n * below applies all of the typemaps above to the specified data type.\n */\n%numpy_typemaps(signed char       , NPY_BYTE     , int)\n%numpy_typemaps(unsigned char     , NPY_UBYTE    , int)\n%numpy_typemaps(short             , NPY_SHORT    , int)\n%numpy_typemaps(unsigned short    , NPY_USHORT   , int)\n%numpy_typemaps(int               , NPY_INT      , int)\n%numpy_typemaps(unsigned int      , NPY_UINT     , int)\n%numpy_typemaps(long              , NPY_LONG     , int)\n%numpy_typemaps(unsigned long     , NPY_ULONG    , int)\n%numpy_typemaps(long long         , NPY_LONGLONG , int)\n%numpy_typemaps(unsigned long long, NPY_ULONGLONG, int)\n%numpy_typemaps(float             , NPY_FLOAT    , int)\n%numpy_typemaps(double            , NPY_DOUBLE   , int)\n\n/* ***************************************************************\n * The follow macro expansion does not work, because C++ bool is 4\n * bytes and NPY_BOOL is 1 byte\n *\n *    %numpy_typemaps(bool, NPY_BOOL, int)\n */\n\n/* ***************************************************************\n * On my Mac, I get the following warning for this macro expansion:\n * 'swig/python detected a memory leak of type 'long double *', no destructor found.'\n *\n *    %numpy_typemaps(long double, NPY_LONGDOUBLE, int)\n */\n\n/* ***************************************************************\n * Swig complains about a syntax error for the following macro\n * expansions:\n *\n *    %numpy_typemaps(complex float,  NPY_CFLOAT , int)\n *\n *    %numpy_typemaps(complex double, NPY_CDOUBLE, int)\n *\n *    %numpy_typemaps(complex long double, NPY_CLONGDOUBLE, int)\n */\n\n#endif /* SWIGPYTHON */\n"
  },
  {
    "path": "OptolithiumC/libs/clipper/CMakeLists.txt",
    "content": "CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0)\r\nPROJECT(polyclipping)\r\n\r\nSET(CMAKE_USE_RELATIVE_PATHS ON)\r\nSET(CMAKE_SKIP_RPATH TRUE)\r\n\r\nSET(CMAKE_BUILD_TYPE \"Release\")\r\n\r\nINCLUDE_DIRECTORIES(\"${CMAKE_CURRENT_SOURCE_DIR}/include\")\r\n\r\nADD_LIBRARY(polyclipping STATIC \"src/clipper.cpp\")"
  },
  {
    "path": "OptolithiumC/libs/clipper/include/clipper.hpp",
    "content": "/*******************************************************************************\r\n*                                                                              *\r\n* Author    :  Angus Johnson                                                   *\r\n* Version   :  6.2.1                                                           *\r\n* Date      :  31 October 2014                                                 *\r\n* Website   :  http://www.angusj.com                                           *\r\n* Copyright :  Angus Johnson 2010-2014                                         *\r\n*                                                                              *\r\n* License:                                                                     *\r\n* Use, modification & distribution is subject to Boost Software License Ver 1. *\r\n* http://www.boost.org/LICENSE_1_0.txt                                         *\r\n*                                                                              *\r\n* Attributions:                                                                *\r\n* The code in this library is an extension of Bala Vatti's clipping algorithm: *\r\n* \"A generic solution to polygon clipping\"                                     *\r\n* Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63.             *\r\n* http://portal.acm.org/citation.cfm?id=129906                                 *\r\n*                                                                              *\r\n* Computer graphics and geometric modeling: implementation and algorithms      *\r\n* By Max K. Agoston                                                            *\r\n* Springer; 1 edition (January 4, 2005)                                        *\r\n* http://books.google.com/books?q=vatti+clipping+agoston                       *\r\n*                                                                              *\r\n* See also:                                                                    *\r\n* \"Polygon Offsetting by Computing Winding Numbers\"                            *\r\n* Paper no. DETC2005-85513 pp. 565-575                                         *\r\n* ASME 2005 International Design Engineering Technical Conferences             *\r\n* and Computers and Information in Engineering Conference (IDETC/CIE2005)      *\r\n* September 24-28, 2005 , Long Beach, California, USA                          *\r\n* http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf              *\r\n*                                                                              *\r\n*******************************************************************************/\r\n\r\n#ifndef clipper_hpp\r\n#define clipper_hpp\r\n\r\n#define CLIPPER_VERSION \"6.2.0\"\r\n\r\n//use_int32: When enabled 32bit ints are used instead of 64bit ints. This\r\n//improve performance but coordinate values are limited to the range +/- 46340\r\n//#define use_int32\r\n\r\n//use_xyz: adds a Z member to IntPoint. Adds a minor cost to perfomance.\r\n//#define use_xyz\r\n\r\n//use_lines: Enables line clipping. Adds a very minor cost to performance.\r\n//#define use_lines\r\n  \r\n//use_deprecated: Enables temporary support for the obsolete functions\r\n//#define use_deprecated  \r\n\r\n#include <vector>\r\n#include <set>\r\n#include <stdexcept>\r\n#include <cstring>\r\n#include <cstdlib>\r\n#include <ostream>\r\n#include <functional>\r\n#include <queue>\r\n\r\nnamespace ClipperLib {\r\n\r\nenum ClipType { ctIntersection, ctUnion, ctDifference, ctXor };\r\nenum PolyType { ptSubject, ptClip };\r\n//By far the most widely used winding rules for polygon filling are\r\n//EvenOdd & NonZero (GDI, GDI+, XLib, OpenGL, Cairo, AGG, Quartz, SVG, Gr32)\r\n//Others rules include Positive, Negative and ABS_GTR_EQ_TWO (only in OpenGL)\r\n//see http://glprogramming.com/red/chapter11.html\r\nenum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative };\r\n\r\n#ifdef use_int32\r\n  typedef int cInt;\r\n  static cInt const loRange = 0x7FFF;\r\n  static cInt const hiRange = 0x7FFF;\r\n#else\r\n  typedef signed long long cInt;\r\n  static cInt const loRange = 0x3FFFFFFF;\r\n  static cInt const hiRange = 0x3FFFFFFFFFFFFFFFLL;\r\n  typedef signed long long long64;     //used by Int128 class\r\n  typedef unsigned long long ulong64;\r\n\r\n#endif\r\n\r\nstruct IntPoint {\r\n  cInt X;\r\n  cInt Y;\r\n#ifdef use_xyz\r\n  cInt Z;\r\n  IntPoint(cInt x = 0, cInt y = 0, cInt z = 0): X(x), Y(y), Z(z) {};\r\n#else\r\n  IntPoint(cInt x = 0, cInt y = 0): X(x), Y(y) {};\r\n#endif\r\n\r\n  friend inline bool operator== (const IntPoint& a, const IntPoint& b)\r\n  {\r\n    return a.X == b.X && a.Y == b.Y;\r\n  }\r\n  friend inline bool operator!= (const IntPoint& a, const IntPoint& b)\r\n  {\r\n    return a.X != b.X  || a.Y != b.Y; \r\n  }\r\n};\r\n//------------------------------------------------------------------------------\r\n\r\ntypedef std::vector< IntPoint > Path;\r\ntypedef std::vector< Path > Paths;\r\n\r\n//inline Path& operator <<(Path& poly, const IntPoint& p) {poly.push_back(p); return poly;}\r\n//inline Paths& operator <<(Paths& polys, const Path& p) {polys.push_back(p); return polys;}\r\n//\r\n//std::ostream& operator <<(std::ostream &s, const IntPoint &p);\r\n//std::ostream& operator <<(std::ostream &s, const Path &p);\r\n//std::ostream& operator <<(std::ostream &s, const Paths &p);\r\n\r\nstruct DoublePoint\r\n{\r\n  double X;\r\n  double Y;\r\n  DoublePoint(double x = 0, double y = 0) : X(x), Y(y) {}\r\n  DoublePoint(IntPoint ip) : X((double)ip.X), Y((double)ip.Y) {}\r\n};\r\n//------------------------------------------------------------------------------\r\n\r\n#ifdef use_xyz\r\ntypedef void (*ZFillCallback)(IntPoint& e1bot, IntPoint& e1top, IntPoint& e2bot, IntPoint& e2top, IntPoint& pt);\r\n#endif\r\n\r\nenum InitOptions {ioReverseSolution = 1, ioStrictlySimple = 2, ioPreserveCollinear = 4};\r\nenum JoinType {jtSquare, jtRound, jtMiter};\r\nenum EndType {etClosedPolygon, etClosedLine, etOpenButt, etOpenSquare, etOpenRound};\r\n\r\nclass PolyNode;\r\ntypedef std::vector< PolyNode* > PolyNodes;\r\n\r\nclass PolyNode \r\n{ \r\npublic:\r\n    PolyNode();\r\n    virtual ~PolyNode(){};\r\n    Path Contour;\r\n    PolyNodes Childs;\r\n    PolyNode* Parent;\r\n    PolyNode* GetNext() const;\r\n    bool IsHole() const;\r\n    bool IsOpen() const;\r\n    int ChildCount() const;\r\nprivate:\r\n    unsigned Index; //node index in Parent.Childs\r\n    bool m_IsOpen;\r\n    JoinType m_jointype;\r\n    EndType m_endtype;\r\n    PolyNode* GetNextSiblingUp() const;\r\n    void AddChild(PolyNode& child);\r\n    friend class Clipper; //to access Index\r\n    friend class ClipperOffset; \r\n};\r\n\r\nclass PolyTree: public PolyNode\r\n{ \r\npublic:\r\n    ~PolyTree(){Clear();};\r\n    PolyNode* GetFirst() const;\r\n    void Clear();\r\n    int Total() const;\r\nprivate:\r\n    PolyNodes AllNodes;\r\n    friend class Clipper; //to access AllNodes\r\n};\r\n\r\nbool Orientation(const Path &poly);\r\ndouble Area(const Path &poly);\r\nint PointInPolygon(const IntPoint &pt, const Path &path);\r\n\r\nvoid SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType = pftEvenOdd);\r\nvoid SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType = pftEvenOdd);\r\nvoid SimplifyPolygons(Paths &polys, PolyFillType fillType = pftEvenOdd);\r\n\r\nvoid CleanPolygon(const Path& in_poly, Path& out_poly, double distance = 1.415);\r\nvoid CleanPolygon(Path& poly, double distance = 1.415);\r\nvoid CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance = 1.415);\r\nvoid CleanPolygons(Paths& polys, double distance = 1.415);\r\n\r\nvoid MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed);\r\nvoid MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed);\r\nvoid MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution);\r\n\r\nvoid PolyTreeToPaths(const PolyTree& polytree, Paths& paths);\r\nvoid ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths);\r\nvoid OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths);\r\n\r\nvoid ReversePath(Path& p);\r\nvoid ReversePaths(Paths& p);\r\n\r\n    Paths CutHoles(const Paths &polygons);\r\n//    void CutHoles(Paths &polygons);\r\n\r\nstruct IntRect { cInt left; cInt top; cInt right; cInt bottom; };\r\n\r\n//enums that are used internally ...\r\nenum EdgeSide { esLeft = 1, esRight = 2};\r\n\r\n//forward declarations (for stuff used internally) ...\r\nstruct TEdge;\r\nstruct IntersectNode;\r\nstruct LocalMinimum;\r\nstruct Scanbeam;\r\nstruct OutPt;\r\nstruct OutRec;\r\nstruct Join;\r\n\r\ntypedef std::vector < OutRec* > PolyOutList;\r\ntypedef std::vector < TEdge* > EdgeList;\r\ntypedef std::vector < Join* > JoinList;\r\ntypedef std::vector < IntersectNode* > IntersectList;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\n//ClipperBase is the ancestor to the Clipper class. It should not be\r\n//instantiated directly. This class simply abstracts the conversion of sets of\r\n//polygon coordinates into edge objects that are stored in a LocalMinima list.\r\nclass ClipperBase\r\n{\r\npublic:\r\n  ClipperBase();\r\n  virtual ~ClipperBase();\r\n  bool AddPath(const Path &pg, PolyType PolyTyp, bool Closed);\r\n  bool AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed);\r\n  virtual void Clear();\r\n  IntRect GetBounds();\r\n  bool PreserveCollinear() {return m_PreserveCollinear;};\r\n  void PreserveCollinear(bool value) {m_PreserveCollinear = value;};\r\nprotected:\r\n  void DisposeLocalMinimaList();\r\n  TEdge* AddBoundsToLML(TEdge *e, bool IsClosed);\r\n  void PopLocalMinima();\r\n  virtual void Reset();\r\n  TEdge* ProcessBound(TEdge* E, bool IsClockwise);\r\n  void DoMinimaLML(TEdge* E1, TEdge* E2, bool IsClosed);\r\n  TEdge* DescendToMin(TEdge *&E);\r\n  void AscendToMax(TEdge *&E, bool Appending, bool IsClosed);\r\n\r\n  typedef std::vector<LocalMinimum> MinimaList;\r\n  MinimaList::iterator m_CurrentLM;\r\n  MinimaList           m_MinimaList;\r\n\r\n  bool              m_UseFullRange;\r\n  EdgeList          m_edges;\r\n  bool             m_PreserveCollinear;\r\n  bool             m_HasOpenPaths;\r\n};\r\n//------------------------------------------------------------------------------\r\n\r\nclass Clipper : public virtual ClipperBase\r\n{\r\npublic:\r\n  Clipper(int initOptions = 0);\r\n  ~Clipper();\r\n  bool Execute(ClipType clipType,\r\n    Paths &solution,\r\n    PolyFillType subjFillType = pftEvenOdd,\r\n    PolyFillType clipFillType = pftEvenOdd);\r\n  bool Execute(ClipType clipType,\r\n    PolyTree &polytree,\r\n    PolyFillType subjFillType = pftEvenOdd,\r\n    PolyFillType clipFillType = pftEvenOdd);\r\n  bool ReverseSolution() {return m_ReverseOutput;};\r\n  void ReverseSolution(bool value) {m_ReverseOutput = value;};\r\n  bool StrictlySimple() {return m_StrictSimple;};\r\n  void StrictlySimple(bool value) {m_StrictSimple = value;};\r\n  //set the callback function for z value filling on intersections (otherwise Z is 0)\r\n#ifdef use_xyz\r\n  void ZFillFunction(ZFillCallback zFillFunc);\r\n#endif\r\nprotected:\r\n  void Reset();\r\n  virtual bool ExecuteInternal();\r\nprivate:\r\n  PolyOutList       m_PolyOuts;\r\n  JoinList          m_Joins;\r\n  JoinList          m_GhostJoins;\r\n  IntersectList     m_IntersectList;\r\n  ClipType          m_ClipType;\r\n  typedef std::priority_queue<cInt> ScanbeamList;\r\n  ScanbeamList      m_Scanbeam;\r\n  TEdge           *m_ActiveEdges;\r\n  TEdge           *m_SortedEdges;\r\n  bool             m_ExecuteLocked;\r\n  PolyFillType     m_ClipFillType;\r\n  PolyFillType     m_SubjFillType;\r\n  bool             m_ReverseOutput;\r\n  bool             m_UsingPolyTree; \r\n  bool             m_StrictSimple;\r\n#ifdef use_xyz\r\n  ZFillCallback   m_ZFill; //custom callback \r\n#endif\r\n  void SetWindingCount(TEdge& edge);\r\n  bool IsEvenOddFillType(const TEdge& edge) const;\r\n  bool IsEvenOddAltFillType(const TEdge& edge) const;\r\n  void InsertScanbeam(const cInt Y);\r\n  cInt PopScanbeam();\r\n  void InsertLocalMinimaIntoAEL(const cInt botY);\r\n  void InsertEdgeIntoAEL(TEdge *edge, TEdge* startEdge);\r\n  void AddEdgeToSEL(TEdge *edge);\r\n  void CopyAELToSEL();\r\n  void DeleteFromSEL(TEdge *e);\r\n  void DeleteFromAEL(TEdge *e);\r\n  void UpdateEdgeIntoAEL(TEdge *&e);\r\n  void SwapPositionsInSEL(TEdge *edge1, TEdge *edge2);\r\n  bool IsContributing(const TEdge& edge) const;\r\n  bool IsTopHorz(const cInt XPos);\r\n  void SwapPositionsInAEL(TEdge *edge1, TEdge *edge2);\r\n  void DoMaxima(TEdge *e);\r\n  void ProcessHorizontals(bool IsTopOfScanbeam);\r\n  void ProcessHorizontal(TEdge *horzEdge, bool isTopOfScanbeam);\r\n  void AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &pt);\r\n  OutPt* AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &pt);\r\n  OutRec* GetOutRec(int idx);\r\n  void AppendPolygon(TEdge *e1, TEdge *e2);\r\n  void IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &pt);\r\n  OutRec* CreateOutRec();\r\n  OutPt* AddOutPt(TEdge *e, const IntPoint &pt);\r\n  void DisposeAllOutRecs();\r\n  void DisposeOutRec(PolyOutList::size_type index);\r\n  bool ProcessIntersections(const cInt topY);\r\n  void BuildIntersectList(const cInt topY);\r\n  void ProcessIntersectList();\r\n  void ProcessEdgesAtTopOfScanbeam(const cInt topY);\r\n  void BuildResult(Paths& polys);\r\n  void BuildResult2(PolyTree& polytree);\r\n  void SetHoleState(TEdge *e, OutRec *outrec);\r\n  void DisposeIntersectNodes();\r\n  bool FixupIntersectionOrder();\r\n  void FixupOutPolygon(OutRec &outrec);\r\n  bool IsHole(TEdge *e);\r\n  bool FindOwnerFromSplitRecs(OutRec &outRec, OutRec *&currOrfl);\r\n  void FixHoleLinkage(OutRec &outrec);\r\n  void AddJoin(OutPt *op1, OutPt *op2, const IntPoint offPt);\r\n  void ClearJoins();\r\n  void ClearGhostJoins();\r\n  void AddGhostJoin(OutPt *op, const IntPoint offPt);\r\n  bool JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2);\r\n  void JoinCommonEdges();\r\n  void DoSimplePolygons();\r\n  void FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec);\r\n  void FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec);\r\n#ifdef use_xyz\r\n  void SetZ(IntPoint& pt, TEdge& e1, TEdge& e2);\r\n#endif\r\n};\r\n//------------------------------------------------------------------------------\r\n\r\nclass ClipperOffset \r\n{\r\npublic:\r\n  ClipperOffset(double miterLimit = 2.0, double roundPrecision = 0.25);\r\n  ~ClipperOffset();\r\n  void AddPath(const Path& path, JoinType joinType, EndType endType);\r\n  void AddPaths(const Paths& paths, JoinType joinType, EndType endType);\r\n  void Execute(Paths& solution, double delta);\r\n  void Execute(PolyTree& solution, double delta);\r\n  void Clear();\r\n  double MiterLimit;\r\n  double ArcTolerance;\r\nprivate:\r\n  Paths m_destPolys;\r\n  Path m_srcPoly;\r\n  Path m_destPoly;\r\n  std::vector<DoublePoint> m_normals;\r\n  double m_delta, m_sinA, m_sin, m_cos;\r\n  double m_miterLim, m_StepsPerRad;\r\n  IntPoint m_lowest;\r\n  PolyNode m_polyNodes;\r\n\r\n  void FixOrientations();\r\n  void DoOffset(double delta);\r\n  void OffsetPoint(int j, int& k, JoinType jointype);\r\n  void DoSquare(int j, int k);\r\n  void DoMiter(int j, int k, double r);\r\n  void DoRound(int j, int k);\r\n};\r\n//------------------------------------------------------------------------------\r\n\r\nclass clipperException : public std::exception\r\n{\r\n  public:\r\n    clipperException(const char* description): m_descr(description) {}\r\n    virtual ~clipperException() throw() {}\r\n    virtual const char* what() const throw() {return m_descr.c_str();}\r\n  private:\r\n    std::string m_descr;\r\n};\r\n//------------------------------------------------------------------------------\r\n\r\n} //ClipperLib namespace\r\n\r\n#endif //clipper_hpp\r\n\r\n\r\n"
  },
  {
    "path": "OptolithiumC/libs/clipper/src/clipper.cpp",
    "content": "/*******************************************************************************\r\n*                                                                              *\r\n* Author    :  Angus Johnson                                                   *\r\n* Version   :  6.2.1                                                           *\r\n* Date      :  31 October 2014                                                 *\r\n* Website   :  http://www.angusj.com                                           *\r\n* Copyright :  Angus Johnson 2010-2014                                         *\r\n*                                                                              *\r\n* License:                                                                     *\r\n* Use, modification & distribution is subject to Boost Software License Ver 1. *\r\n* http://www.boost.org/LICENSE_1_0.txt                                         *\r\n*                                                                              *\r\n* Attributions:                                                                *\r\n* The code in this library is an extension of Bala Vatti's clipping algorithm: *\r\n* \"A generic solution to polygon clipping\"                                     *\r\n* Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63.             *\r\n* http://portal.acm.org/citation.cfm?id=129906                                 *\r\n*                                                                              *\r\n* Computer graphics and geometric modeling: implementation and algorithms      *\r\n* By Max K. Agoston                                                            *\r\n* Springer; 1 edition (January 4, 2005)                                        *\r\n* http://books.google.com/books?q=vatti+clipping+agoston                       *\r\n*                                                                              *\r\n* See also:                                                                    *\r\n* \"Polygon Offsetting by Computing Winding Numbers\"                            *\r\n* Paper no. DETC2005-85513 pp. 565-575                                         *\r\n* ASME 2005 International Design Engineering Technical Conferences             *\r\n* and Computers and Information in Engineering Conference (IDETC/CIE2005)      *\r\n* September 24-28, 2005 , Long Beach, California, USA                          *\r\n* http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf              *\r\n*                                                                              *\r\n*******************************************************************************/\r\n\r\n/*******************************************************************************\r\n*                                                                              *\r\n* This is a translation of the Delphi Clipper library and the naming style     *\r\n* used has retained a Delphi flavour.                                          *\r\n*                                                                              *\r\n*******************************************************************************/\r\n\r\n#include \"clipper.hpp\"\r\n#include <cmath>\r\n#include <vector>\r\n#include <algorithm>\r\n#include <stdexcept>\r\n#include <cstring>\r\n#include <cstdlib>\r\n#include <ostream>\r\n#include <functional>\r\n\r\n\r\nnamespace ClipperLib {\r\n\r\n    static double const pi = 3.141592653589793238;\r\n    static double const two_pi = pi * 2;\r\n    static double const def_arc_tolerance = 0.25;\r\n\r\n    enum Direction {dRightToLeft, dLeftToRight};\r\n\r\n    static int const Unassigned = -1;  //edge not currently 'owning' a solution\r\n    static int const Skip = -2;        //edge that would otherwise close a path\r\n\r\n#define HORIZONTAL (-1.0E+40)\r\n#define TOLERANCE (1.0e-20)\r\n#define NEAR_ZERO(val) (((val) > -TOLERANCE) && ((val) < TOLERANCE))\r\n\r\n    struct TEdge {\r\n        IntPoint Bot;\r\n        IntPoint Curr;\r\n        IntPoint Top;\r\n        IntPoint Delta;\r\n        double Dx;\r\n        PolyType PolyTyp;\r\n        EdgeSide Side;\r\n        int WindDelta; //1 or -1 depending on winding direction\r\n        int WindCnt;\r\n        int WindCnt2; //winding count of the opposite polytype\r\n        int OutIdx;\r\n        TEdge *Next;\r\n        TEdge *Prev;\r\n        TEdge *NextInLML;\r\n        TEdge *NextInAEL;\r\n        TEdge *PrevInAEL;\r\n        TEdge *NextInSEL;\r\n        TEdge *PrevInSEL;\r\n    };\r\n\r\n    struct IntersectNode {\r\n        TEdge *Edge1;\r\n        TEdge *Edge2;\r\n        IntPoint Pt;\r\n    };\r\n\r\n    struct LocalMinimum {\r\n        cInt Y;\r\n        TEdge *LeftBound;\r\n        TEdge *RightBound;\r\n    };\r\n\r\n    struct OutPt;\r\n\r\n    struct OutRec {\r\n        int Idx;\r\n        bool IsHole;\r\n        bool IsOpen;\r\n        OutRec *FirstLeft;  //see comments in clipper.pas\r\n        PolyNode *PolyNd;\r\n        OutPt *Pts;\r\n        OutPt *BottomPt;\r\n    };\r\n\r\n    struct OutPt {\r\n        int Idx;\r\n        IntPoint Pt;\r\n        OutPt *Next;\r\n        OutPt *Prev;\r\n    };\r\n\r\n    struct Join {\r\n        OutPt *OutPt1;\r\n        OutPt *OutPt2;\r\n        IntPoint OffPt;\r\n    };\r\n\r\n    struct LocMinSorter {\r\n        inline bool operator()(const LocalMinimum &locMin1, const LocalMinimum &locMin2) {\r\n            return locMin2.Y < locMin1.Y;\r\n        }\r\n    };\r\n\r\n//------------------------------------------------------------------------------\r\n//------------------------------------------------------------------------------\r\n\r\n    inline cInt Round(double val) {\r\n        if ((val < 0)) {\r\n            return static_cast<cInt>(val - 0.5);\r\n        } else {\r\n            return static_cast<cInt>(val + 0.5);\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    inline cInt Abs(cInt val) {\r\n        return val < 0 ? -val : val;\r\n    }\r\n\r\n//------------------------------------------------------------------------------\r\n// PolyTree methods ...\r\n//------------------------------------------------------------------------------\r\n\r\n    void PolyTree::Clear() {\r\n        for (PolyNodes::size_type i = 0; i < AllNodes.size(); ++i) {\r\n            delete AllNodes[i];\r\n        }\r\n        AllNodes.resize(0);\r\n        Childs.resize(0);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    PolyNode *PolyTree::GetFirst() const {\r\n        if (!Childs.empty()) {\r\n            return Childs[0];\r\n        } else {\r\n            return 0;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    int PolyTree::Total() const {\r\n        int result = (int) AllNodes.size();\r\n        //with negative offsets, ignore the hidden outer polygon ...\r\n        if (result > 0 && Childs[0] != AllNodes[0]) {\r\n            result--;\r\n        }\r\n        return result;\r\n    }\r\n\r\n//------------------------------------------------------------------------------\r\n// PolyNode methods ...\r\n//------------------------------------------------------------------------------\r\n\r\n    PolyNode::PolyNode() : Childs(), Parent(0), Index(0), m_IsOpen(false) {\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    int PolyNode::ChildCount() const {\r\n        return (int) Childs.size();\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void PolyNode::AddChild(PolyNode &child) {\r\n        unsigned cnt = (unsigned) Childs.size();\r\n        Childs.push_back(&child);\r\n        child.Parent = this;\r\n        child.Index = cnt;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    PolyNode *PolyNode::GetNext() const {\r\n        if (!Childs.empty()) {\r\n            return Childs[0];\r\n        } else {\r\n            return GetNextSiblingUp();\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    PolyNode *PolyNode::GetNextSiblingUp() const {\r\n        if (!Parent) { //protects against PolyTree.GetNextSiblingUp()\r\n            return 0;\r\n        } else if (Index == Parent->Childs.size() - 1) {\r\n            return Parent->GetNextSiblingUp();\r\n        } else {\r\n            return Parent->Childs[Index + 1];\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool PolyNode::IsHole() const {\r\n        bool result = true;\r\n        PolyNode *node = Parent;\r\n        while (node) {\r\n            result = !result;\r\n            node = node->Parent;\r\n        }\r\n        return result;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool PolyNode::IsOpen() const {\r\n        return m_IsOpen;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n#ifndef use_int32\r\n\r\n//------------------------------------------------------------------------------\r\n// Int128 class (enables safe math on signed 64bit integers)\r\n// eg Int128 val1((long64)9223372036854775807); //ie 2^63 -1\r\n//    Int128 val2((long64)9223372036854775807);\r\n//    Int128 val3 = val1 * val2;\r\n//    val3.AsString => \"85070591730234615847396907784232501249\" (8.5e+37)\r\n//------------------------------------------------------------------------------\r\n\r\n    class Int128 {\r\n    public:\r\n        ulong64 lo;\r\n        long64 hi;\r\n\r\n        Int128(long64 _lo = 0) {\r\n            lo = (ulong64) _lo;\r\n            if (_lo < 0) {\r\n                hi = -1;\r\n            } else {\r\n                hi = 0;\r\n            }\r\n        }\r\n\r\n\r\n        Int128(const Int128 &val) : lo(val.lo), hi(val.hi) {\r\n        }\r\n\r\n        Int128(const long64 &_hi, const ulong64 &_lo) : lo(_lo), hi(_hi) {\r\n        }\r\n\r\n        Int128 &operator=(const long64 &val) {\r\n            lo = (ulong64) val;\r\n            if (val < 0) {\r\n                hi = -1;\r\n            } else {\r\n                hi = 0;\r\n            }\r\n            return *this;\r\n        }\r\n\r\n        bool operator==(const Int128 &val) const {\r\n            return (hi == val.hi && lo == val.lo);\r\n        }\r\n\r\n        bool operator!=(const Int128 &val) const {\r\n            return !(*this == val);\r\n        }\r\n\r\n        bool operator>(const Int128 &val) const {\r\n            if (hi != val.hi) {\r\n                return hi > val.hi;\r\n            } else {\r\n                return lo > val.lo;\r\n            }\r\n        }\r\n\r\n        bool operator<(const Int128 &val) const {\r\n            if (hi != val.hi) {\r\n                return hi < val.hi;\r\n            } else {\r\n                return lo < val.lo;\r\n            }\r\n        }\r\n\r\n        bool operator>=(const Int128 &val) const {\r\n            return !(*this < val);\r\n        }\r\n\r\n        bool operator<=(const Int128 &val) const {\r\n            return !(*this > val);\r\n        }\r\n\r\n        Int128 &operator+=(const Int128 &rhs) {\r\n            hi += rhs.hi;\r\n            lo += rhs.lo;\r\n            if (lo < rhs.lo) {\r\n                hi++;\r\n            }\r\n            return *this;\r\n        }\r\n\r\n        Int128 operator+(const Int128 &rhs) const {\r\n            Int128 result(*this);\r\n            result += rhs;\r\n            return result;\r\n        }\r\n\r\n        Int128 &operator-=(const Int128 &rhs) {\r\n            *this += -rhs;\r\n            return *this;\r\n        }\r\n\r\n        Int128 operator-(const Int128 &rhs) const {\r\n            Int128 result(*this);\r\n            result -= rhs;\r\n            return result;\r\n        }\r\n\r\n        Int128 operator-() const //unary negation\r\n        {\r\n            if (lo == 0) {\r\n                return Int128(-hi, 0);\r\n            } else {\r\n                return Int128(~hi, ~lo + 1);\r\n            }\r\n        }\r\n\r\n        operator double() const {\r\n            const double shift64 = 18446744073709551616.0; //2^64\r\n            if (hi < 0) {\r\n                if (lo == 0) {\r\n                    return (double) hi * shift64;\r\n                } else {\r\n                    return -(double) (~lo + ~hi * shift64);\r\n                }\r\n            } else {\r\n                return (double) (lo + hi * shift64);\r\n            }\r\n        }\r\n\r\n    };\r\n//------------------------------------------------------------------------------\r\n\r\n    Int128 Int128Mul(long64 lhs, long64 rhs) {\r\n        bool negate = (lhs < 0) != (rhs < 0);\r\n\r\n        if (lhs < 0) {\r\n            lhs = -lhs;\r\n        }\r\n        ulong64 int1Hi = ulong64(lhs) >> 32;\r\n        ulong64 int1Lo = ulong64(lhs & 0xFFFFFFFF);\r\n\r\n        if (rhs < 0) {\r\n            rhs = -rhs;\r\n        }\r\n        ulong64 int2Hi = ulong64(rhs) >> 32;\r\n        ulong64 int2Lo = ulong64(rhs & 0xFFFFFFFF);\r\n\r\n        //nb: see comments in clipper.pas\r\n        ulong64 a = int1Hi * int2Hi;\r\n        ulong64 b = int1Lo * int2Lo;\r\n        ulong64 c = int1Hi * int2Lo + int1Lo * int2Hi;\r\n\r\n        Int128 tmp;\r\n        tmp.hi = long64(a + (c >> 32));\r\n        tmp.lo = long64(c << 32);\r\n        tmp.lo += long64(b);\r\n        if (tmp.lo < b) {\r\n            tmp.hi++;\r\n        }\r\n        if (negate) {\r\n            tmp = -tmp;\r\n        }\r\n        return tmp;\r\n    };\r\n#endif\r\n\r\n//------------------------------------------------------------------------------\r\n// Miscellaneous global functions\r\n//------------------------------------------------------------------------------\r\n\r\n    void Swap(cInt &val1, cInt &val2) {\r\n        cInt tmp = val1;\r\n        val1 = val2;\r\n        val2 = tmp;\r\n    }\r\n\r\n//------------------------------------------------------------------------------\r\n    bool Orientation(const Path &poly) {\r\n        return Area(poly) >= 0;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    double Area(const Path &poly) {\r\n        int size = (int) poly.size();\r\n        if (size < 3) {\r\n            return 0;\r\n        }\r\n\r\n        double a = 0;\r\n        for (int i = 0, j = size - 1; i < size; ++i) {\r\n            a += ((double) poly[j].X + poly[i].X) * ((double) poly[j].Y - poly[i].Y);\r\n            j = i;\r\n        }\r\n        return -a * 0.5;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    double Area(const OutRec &outRec) {\r\n        OutPt *op = outRec.Pts;\r\n        if (!op) {\r\n            return 0;\r\n        }\r\n        double a = 0;\r\n        do {\r\n            a += (double) (op->Prev->Pt.X + op->Pt.X) * (double) (op->Prev->Pt.Y - op->Pt.Y);\r\n            op = op->Next;\r\n        } while (op != outRec.Pts);\r\n        return a * 0.5;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool PointIsVertex(const IntPoint &Pt, OutPt *pp) {\r\n        OutPt *pp2 = pp;\r\n        do {\r\n            if (pp2->Pt == Pt) {\r\n                return true;\r\n            }\r\n            pp2 = pp2->Next;\r\n        } while (pp2 != pp);\r\n        return false;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    int PointInPolygon(const IntPoint &pt, const Path &path) {\r\n        //returns 0 if false, +1 if true, -1 if pt ON polygon boundary\r\n        //See \"The Point in Polygon Problem for Arbitrary Polygons\" by Hormann & Agathos\r\n        //http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf\r\n        int result = 0;\r\n        size_t cnt = path.size();\r\n        if (cnt < 3) {\r\n            return 0;\r\n        }\r\n        IntPoint ip = path[0];\r\n        for (size_t i = 1; i <= cnt; ++i) {\r\n            IntPoint ipNext = (i == cnt ? path[0] : path[i]);\r\n            if (ipNext.Y == pt.Y) {\r\n                if ((ipNext.X == pt.X) || (ip.Y == pt.Y && ((ipNext.X > pt.X) == (ip.X < pt.X)))) {\r\n                    return -1;\r\n                }\r\n            }\r\n            if ((ip.Y < pt.Y) != (ipNext.Y < pt.Y)) {\r\n                if (ip.X >= pt.X) {\r\n                    if (ipNext.X > pt.X) {\r\n                        result = 1 - result;\r\n                    } else {\r\n                        double d = (double) (ip.X - pt.X) * (ipNext.Y - pt.Y) - (double) (ipNext.X - pt.X) * (ip.Y - pt.Y);\r\n                        if (!d) {\r\n                            return -1;\r\n                        }\r\n                        if ((d > 0) == (ipNext.Y > ip.Y)) {\r\n                            result = 1 - result;\r\n                        }\r\n                    }\r\n                } else {\r\n                    if (ipNext.X > pt.X) {\r\n                        double d = (double) (ip.X - pt.X) * (ipNext.Y - pt.Y) - (double) (ipNext.X - pt.X) * (ip.Y - pt.Y);\r\n                        if (!d) {\r\n                            return -1;\r\n                        }\r\n                        if ((d > 0) == (ipNext.Y > ip.Y)) {\r\n                            result = 1 - result;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            ip = ipNext;\r\n        }\r\n        return result;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    int PointInPolygon(const IntPoint &pt, OutPt *op) {\r\n        //returns 0 if false, +1 if true, -1 if pt ON polygon boundary\r\n        int result = 0;\r\n        OutPt *startOp = op;\r\n        for (; ;) {\r\n            if (op->Next->Pt.Y == pt.Y) {\r\n                if ((op->Next->Pt.X == pt.X) || (op->Pt.Y == pt.Y && ((op->Next->Pt.X > pt.X) == (op->Pt.X < pt.X)))) {\r\n                    return -1;\r\n                }\r\n            }\r\n            if ((op->Pt.Y < pt.Y) != (op->Next->Pt.Y < pt.Y)) {\r\n                if (op->Pt.X >= pt.X) {\r\n                    if (op->Next->Pt.X > pt.X) {\r\n                        result = 1 - result;\r\n                    } else {\r\n                        double d = (double) (op->Pt.X - pt.X) * (op->Next->Pt.Y - pt.Y) - (double) (op->Next->Pt.X - pt.X) * (op->Pt.Y - pt.Y);\r\n                        if (!d) {\r\n                            return -1;\r\n                        }\r\n                        if ((d > 0) == (op->Next->Pt.Y > op->Pt.Y)) {\r\n                            result = 1 - result;\r\n                        }\r\n                    }\r\n                } else {\r\n                    if (op->Next->Pt.X > pt.X) {\r\n                        double d = (double) (op->Pt.X - pt.X) * (op->Next->Pt.Y - pt.Y) - (double) (op->Next->Pt.X - pt.X) * (op->Pt.Y - pt.Y);\r\n                        if (!d) {\r\n                            return -1;\r\n                        }\r\n                        if ((d > 0) == (op->Next->Pt.Y > op->Pt.Y)) {\r\n                            result = 1 - result;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            op = op->Next;\r\n            if (startOp == op) {\r\n                break;\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool Poly2ContainsPoly1(OutPt *OutPt1, OutPt *OutPt2) {\r\n        OutPt *op = OutPt1;\r\n        do {\r\n            //nb: PointInPolygon returns 0 if false, +1 if true, -1 if pt on polygon\r\n            int res = PointInPolygon(op->Pt, OutPt2);\r\n            if (res >= 0) {\r\n                return res > 0;\r\n            }\r\n            op = op->Next;\r\n        } while (op != OutPt1);\r\n        return true;\r\n    }\r\n//----------------------------------------------------------------------\r\n\r\n    bool SlopesEqual(const TEdge &e1, const TEdge &e2, bool UseFullInt64Range) {\r\n#ifndef use_int32\r\n        if (UseFullInt64Range) {\r\n            return Int128Mul(e1.Delta.Y, e2.Delta.X) == Int128Mul(e1.Delta.X, e2.Delta.Y);\r\n        } else\r\n#endif\r\n        {\r\n            return e1.Delta.Y * e2.Delta.X == e1.Delta.X * e2.Delta.Y;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool SlopesEqual(const IntPoint pt1, const IntPoint pt2, const IntPoint pt3, bool UseFullInt64Range) {\r\n#ifndef use_int32\r\n        if (UseFullInt64Range) {\r\n            return Int128Mul(pt1.Y - pt2.Y, pt2.X - pt3.X) == Int128Mul(pt1.X - pt2.X, pt2.Y - pt3.Y);\r\n        } else\r\n#endif\r\n        {\r\n            return (pt1.Y - pt2.Y) * (pt2.X - pt3.X) == (pt1.X - pt2.X) * (pt2.Y - pt3.Y);\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool SlopesEqual(const IntPoint pt1, const IntPoint pt2, const IntPoint pt3, const IntPoint pt4, bool UseFullInt64Range) {\r\n#ifndef use_int32\r\n        if (UseFullInt64Range) {\r\n            return Int128Mul(pt1.Y - pt2.Y, pt3.X - pt4.X) == Int128Mul(pt1.X - pt2.X, pt3.Y - pt4.Y);\r\n        } else\r\n#endif\r\n        {\r\n            return (pt1.Y - pt2.Y) * (pt3.X - pt4.X) == (pt1.X - pt2.X) * (pt3.Y - pt4.Y);\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    inline bool IsHorizontal(TEdge &e) {\r\n        return e.Delta.Y == 0;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    inline double GetDx(const IntPoint pt1, const IntPoint pt2) {\r\n        return (pt1.Y == pt2.Y) ? HORIZONTAL : (double) (pt2.X - pt1.X) / (pt2.Y - pt1.Y);\r\n    }\r\n//---------------------------------------------------------------------------\r\n\r\n    inline void SetDx(TEdge &e) {\r\n        e.Delta.X = (e.Top.X - e.Bot.X);\r\n        e.Delta.Y = (e.Top.Y - e.Bot.Y);\r\n\r\n        if (e.Delta.Y == 0) {\r\n            e.Dx = HORIZONTAL;\r\n        } else {\r\n            e.Dx = (double) (e.Delta.X) / e.Delta.Y;\r\n        }\r\n    }\r\n//---------------------------------------------------------------------------\r\n\r\n    inline void SwapSides(TEdge &Edge1, TEdge &Edge2) {\r\n        EdgeSide Side = Edge1.Side;\r\n        Edge1.Side = Edge2.Side;\r\n        Edge2.Side = Side;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    inline void SwapPolyIndexes(TEdge &Edge1, TEdge &Edge2) {\r\n        int OutIdx = Edge1.OutIdx;\r\n        Edge1.OutIdx = Edge2.OutIdx;\r\n        Edge2.OutIdx = OutIdx;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    inline cInt TopX(TEdge &edge, const cInt currentY) {\r\n        return (currentY == edge.Top.Y) ? edge.Top.X : edge.Bot.X + Round(edge.Dx * (currentY - edge.Bot.Y));\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void IntersectPoint(TEdge &Edge1, TEdge &Edge2, IntPoint &ip) {\r\n#ifdef use_xyz  \r\n  ip.Z = 0;\r\n#endif\r\n\r\n        double b1, b2;\r\n        if (Edge1.Dx == Edge2.Dx) {\r\n            ip.Y = Edge1.Curr.Y;\r\n            ip.X = TopX(Edge1, ip.Y);\r\n            return;\r\n        } else if (Edge1.Delta.X == 0) {\r\n            ip.X = Edge1.Bot.X;\r\n            if (IsHorizontal(Edge2)) {\r\n                ip.Y = Edge2.Bot.Y;\r\n            } else {\r\n                b2 = Edge2.Bot.Y - (Edge2.Bot.X / Edge2.Dx);\r\n                ip.Y = Round(ip.X / Edge2.Dx + b2);\r\n            }\r\n        } else if (Edge2.Delta.X == 0) {\r\n            ip.X = Edge2.Bot.X;\r\n            if (IsHorizontal(Edge1)) {\r\n                ip.Y = Edge1.Bot.Y;\r\n            } else {\r\n                b1 = Edge1.Bot.Y - (Edge1.Bot.X / Edge1.Dx);\r\n                ip.Y = Round(ip.X / Edge1.Dx + b1);\r\n            }\r\n        } else {\r\n            b1 = Edge1.Bot.X - Edge1.Bot.Y * Edge1.Dx;\r\n            b2 = Edge2.Bot.X - Edge2.Bot.Y * Edge2.Dx;\r\n            double q = (b2 - b1) / (Edge1.Dx - Edge2.Dx);\r\n            ip.Y = Round(q);\r\n            if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx)) {\r\n                ip.X = Round(Edge1.Dx * q + b1);\r\n            } else {\r\n                ip.X = Round(Edge2.Dx * q + b2);\r\n            }\r\n        }\r\n\r\n        if (ip.Y < Edge1.Top.Y || ip.Y < Edge2.Top.Y) {\r\n            if (Edge1.Top.Y > Edge2.Top.Y) {\r\n                ip.Y = Edge1.Top.Y;\r\n            } else {\r\n                ip.Y = Edge2.Top.Y;\r\n            }\r\n            if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx)) {\r\n                ip.X = TopX(Edge1, ip.Y);\r\n            } else {\r\n                ip.X = TopX(Edge2, ip.Y);\r\n            }\r\n        }\r\n        //finally, don't allow 'ip' to be BELOW curr.Y (ie bottom of scanbeam) ...\r\n        if (ip.Y > Edge1.Curr.Y) {\r\n            ip.Y = Edge1.Curr.Y;\r\n            //use the more vertical edge to derive X ...\r\n            if (std::fabs(Edge1.Dx) > std::fabs(Edge2.Dx)) {\r\n                ip.X = TopX(Edge2, ip.Y);\r\n            } else {\r\n                ip.X = TopX(Edge1, ip.Y);\r\n            }\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ReversePolyPtLinks(OutPt *pp) {\r\n        if (!pp) {\r\n            return;\r\n        }\r\n        OutPt *pp1, *pp2;\r\n        pp1 = pp;\r\n        do {\r\n            pp2 = pp1->Next;\r\n            pp1->Next = pp1->Prev;\r\n            pp1->Prev = pp2;\r\n            pp1 = pp2;\r\n        } while (pp1 != pp);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void DisposeOutPts(OutPt *&pp) {\r\n        if (pp == 0) {\r\n            return;\r\n        }\r\n        pp->Prev->Next = 0;\r\n        while (pp) {\r\n            OutPt *tmpPp = pp;\r\n            pp = pp->Next;\r\n            delete tmpPp;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    inline void InitEdge(TEdge *e, TEdge *eNext, TEdge *ePrev, const IntPoint &Pt) {\r\n        std::memset(e, 0, sizeof(TEdge));\r\n        e->Next = eNext;\r\n        e->Prev = ePrev;\r\n        e->Curr = Pt;\r\n        e->OutIdx = Unassigned;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void InitEdge2(TEdge &e, PolyType Pt) {\r\n        if (e.Curr.Y >= e.Next->Curr.Y) {\r\n            e.Bot = e.Curr;\r\n            e.Top = e.Next->Curr;\r\n        } else {\r\n            e.Top = e.Curr;\r\n            e.Bot = e.Next->Curr;\r\n        }\r\n        SetDx(e);\r\n        e.PolyTyp = Pt;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    TEdge *RemoveEdge(TEdge *e) {\r\n        //removes e from double_linked_list (but without removing from memory)\r\n        e->Prev->Next = e->Next;\r\n        e->Next->Prev = e->Prev;\r\n        TEdge *result = e->Next;\r\n        e->Prev = 0; //flag as removed (see ClipperBase.Clear)\r\n        return result;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    inline void ReverseHorizontal(TEdge &e) {\r\n        //swap horizontal edges' Top and Bottom x's so they follow the natural\r\n        //progression of the bounds - ie so their xbots will align with the\r\n        //adjoining lower edge. [Helpful in the ProcessHorizontal() method.]\r\n        Swap(e.Top.X, e.Bot.X);\r\n#ifdef use_xyz  \r\n  Swap(e.Top.Z, e.Bot.Z);\r\n#endif\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void SwapPoints(IntPoint &pt1, IntPoint &pt2) {\r\n        IntPoint tmp = pt1;\r\n        pt1 = pt2;\r\n        pt2 = tmp;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool GetOverlapSegment(IntPoint pt1a, IntPoint pt1b, IntPoint pt2a, IntPoint pt2b, IntPoint &pt1, IntPoint &pt2) {\r\n        //precondition: segments are Collinear.\r\n        if (Abs(pt1a.X - pt1b.X) > Abs(pt1a.Y - pt1b.Y)) {\r\n            if (pt1a.X > pt1b.X) {\r\n                SwapPoints(pt1a, pt1b);\r\n            }\r\n            if (pt2a.X > pt2b.X) {\r\n                SwapPoints(pt2a, pt2b);\r\n            }\r\n            if (pt1a.X > pt2a.X) {\r\n                pt1 = pt1a;\r\n            } else {\r\n                pt1 = pt2a;\r\n            }\r\n            if (pt1b.X < pt2b.X) {\r\n                pt2 = pt1b;\r\n            } else {\r\n                pt2 = pt2b;\r\n            }\r\n            return pt1.X < pt2.X;\r\n        } else {\r\n            if (pt1a.Y < pt1b.Y) {\r\n                SwapPoints(pt1a, pt1b);\r\n            }\r\n            if (pt2a.Y < pt2b.Y) {\r\n                SwapPoints(pt2a, pt2b);\r\n            }\r\n            if (pt1a.Y < pt2a.Y) {\r\n                pt1 = pt1a;\r\n            } else {\r\n                pt1 = pt2a;\r\n            }\r\n            if (pt1b.Y > pt2b.Y) {\r\n                pt2 = pt1b;\r\n            } else {\r\n                pt2 = pt2b;\r\n            }\r\n            return pt1.Y > pt2.Y;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool FirstIsBottomPt(const OutPt *btmPt1, const OutPt *btmPt2) {\r\n        OutPt *p = btmPt1->Prev;\r\n        while ((p->Pt == btmPt1->Pt) && (p != btmPt1)) {\r\n            p = p->Prev;\r\n        }\r\n        double dx1p = std::fabs(GetDx(btmPt1->Pt, p->Pt));\r\n        p = btmPt1->Next;\r\n        while ((p->Pt == btmPt1->Pt) && (p != btmPt1)) {\r\n            p = p->Next;\r\n        }\r\n        double dx1n = std::fabs(GetDx(btmPt1->Pt, p->Pt));\r\n\r\n        p = btmPt2->Prev;\r\n        while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) {\r\n            p = p->Prev;\r\n        }\r\n        double dx2p = std::fabs(GetDx(btmPt2->Pt, p->Pt));\r\n        p = btmPt2->Next;\r\n        while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) {\r\n            p = p->Next;\r\n        }\r\n        double dx2n = std::fabs(GetDx(btmPt2->Pt, p->Pt));\r\n        return (dx1p >= dx2p && dx1p >= dx2n) || (dx1n >= dx2p && dx1n >= dx2n);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    OutPt *GetBottomPt(OutPt *pp) {\r\n        OutPt *dups = 0;\r\n        OutPt *p = pp->Next;\r\n        while (p != pp) {\r\n            if (p->Pt.Y > pp->Pt.Y) {\r\n                pp = p;\r\n                dups = 0;\r\n            } else if (p->Pt.Y == pp->Pt.Y && p->Pt.X <= pp->Pt.X) {\r\n                if (p->Pt.X < pp->Pt.X) {\r\n                    dups = 0;\r\n                    pp = p;\r\n                } else {\r\n                    if (p->Next != pp && p->Prev != pp) {\r\n                        dups = p;\r\n                    }\r\n                }\r\n            }\r\n            p = p->Next;\r\n        }\r\n        if (dups) {\r\n            //there appears to be at least 2 vertices at BottomPt so ...\r\n            while (dups != p) {\r\n                if (!FirstIsBottomPt(p, dups)) {\r\n                    pp = dups;\r\n                }\r\n                dups = dups->Next;\r\n                while (dups->Pt != pp->Pt) {\r\n                    dups = dups->Next;\r\n                }\r\n            }\r\n        }\r\n        return pp;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool Pt2IsBetweenPt1AndPt3(const IntPoint pt1, const IntPoint pt2, const IntPoint pt3) {\r\n        if ((pt1 == pt3) || (pt1 == pt2) || (pt3 == pt2)) {\r\n            return false;\r\n        } else if (pt1.X != pt3.X) {\r\n            return (pt2.X > pt1.X) == (pt2.X < pt3.X);\r\n        } else {\r\n            return (pt2.Y > pt1.Y) == (pt2.Y < pt3.Y);\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b) {\r\n        if (seg1a > seg1b) {\r\n            Swap(seg1a, seg1b);\r\n        }\r\n        if (seg2a > seg2b) {\r\n            Swap(seg2a, seg2b);\r\n        }\r\n        return (seg1a < seg2b) && (seg2a < seg1b);\r\n    }\r\n\r\n//------------------------------------------------------------------------------\r\n// ClipperBase class methods ...\r\n//------------------------------------------------------------------------------\r\n\r\n    ClipperBase::ClipperBase() //constructor\r\n    {\r\n        m_CurrentLM = m_MinimaList.begin(); //begin() == end() here\r\n        m_UseFullRange = false;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    ClipperBase::~ClipperBase() //destructor\r\n    {\r\n        Clear();\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void RangeTest(const IntPoint &Pt, bool &useFullRange) {\r\n        if (useFullRange) {\r\n            if (Pt.X > hiRange || Pt.Y > hiRange || -Pt.X > hiRange || -Pt.Y > hiRange) {\r\n                throw \"Coordinate outside allowed range\";\r\n            }\r\n        } else if (Pt.X > loRange || Pt.Y > loRange || -Pt.X > loRange || -Pt.Y > loRange) {\r\n            useFullRange = true;\r\n            RangeTest(Pt, useFullRange);\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    TEdge *FindNextLocMin(TEdge *E) {\r\n        for (; ;) {\r\n            while (E->Bot != E->Prev->Bot || E->Curr == E->Top) {\r\n                E = E->Next;\r\n            }\r\n            if (!IsHorizontal(*E) && !IsHorizontal(*E->Prev)) {\r\n                break;\r\n            }\r\n            while (IsHorizontal(*E->Prev)) {\r\n                E = E->Prev;\r\n            }\r\n            TEdge *E2 = E;\r\n            while (IsHorizontal(*E)) {\r\n                E = E->Next;\r\n            }\r\n            if (E->Top.Y == E->Prev->Bot.Y) {\r\n                continue;\r\n            } //ie just an intermediate horz.\r\n            if (E2->Prev->Bot.X < E->Bot.X) {\r\n                E = E2;\r\n            }\r\n            break;\r\n        }\r\n        return E;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    TEdge *ClipperBase::ProcessBound(TEdge *E, bool NextIsForward) {\r\n        TEdge *Result = E;\r\n        TEdge *Horz = 0;\r\n\r\n        if (E->OutIdx == Skip) {\r\n            //if edges still remain in the current bound beyond the skip edge then\r\n            //create another LocMin and call ProcessBound once more\r\n            if (NextIsForward) {\r\n                while (E->Top.Y == E->Next->Bot.Y) {\r\n                    E = E->Next;\r\n                }\r\n                //don't include top horizontals when parsing a bound a second time,\r\n                //they will be contained in the opposite bound ...\r\n                while (E != Result && IsHorizontal(*E)) {\r\n                    E = E->Prev;\r\n                }\r\n            } else {\r\n                while (E->Top.Y == E->Prev->Bot.Y) {\r\n                    E = E->Prev;\r\n                }\r\n                while (E != Result && IsHorizontal(*E)) {\r\n                    E = E->Next;\r\n                }\r\n            }\r\n\r\n            if (E == Result) {\r\n                if (NextIsForward) {\r\n                    Result = E->Next;\r\n                } else {\r\n                    Result = E->Prev;\r\n                }\r\n            } else {\r\n                //there are more edges in the bound beyond result starting with E\r\n                if (NextIsForward) {\r\n                    E = Result->Next;\r\n                } else {\r\n                    E = Result->Prev;\r\n                }\r\n                MinimaList::value_type locMin;\r\n                locMin.Y = E->Bot.Y;\r\n                locMin.LeftBound = 0;\r\n                locMin.RightBound = E;\r\n                E->WindDelta = 0;\r\n                Result = ProcessBound(E, NextIsForward);\r\n                m_MinimaList.push_back(locMin);\r\n            }\r\n            return Result;\r\n        }\r\n\r\n        TEdge *EStart;\r\n\r\n        if (IsHorizontal(*E)) {\r\n            //We need to be careful with open paths because this may not be a\r\n            //true local minima (ie E may be following a skip edge).\r\n            //Also, consecutive horz. edges may start heading left before going right.\r\n            if (NextIsForward) {\r\n                EStart = E->Prev;\r\n            } else {\r\n                EStart = E->Next;\r\n            }\r\n            if (EStart->OutIdx != Skip) {\r\n                if (IsHorizontal(*EStart)) //ie an adjoining horizontal skip edge\r\n                {\r\n                    if (EStart->Bot.X != E->Bot.X && EStart->Top.X != E->Bot.X) {\r\n                        ReverseHorizontal(*E);\r\n                    }\r\n                } else if (EStart->Bot.X != E->Bot.X) {\r\n                    ReverseHorizontal(*E);\r\n                }\r\n            }\r\n        }\r\n\r\n        EStart = E;\r\n        if (NextIsForward) {\r\n            while (Result->Top.Y == Result->Next->Bot.Y && Result->Next->OutIdx != Skip) {\r\n                Result = Result->Next;\r\n            }\r\n            if (IsHorizontal(*Result) && Result->Next->OutIdx != Skip) {\r\n                //nb: at the top of a bound, horizontals are added to the bound\r\n                //only when the preceding edge attaches to the horizontal's left vertex\r\n                //unless a Skip edge is encountered when that becomes the top divide\r\n                Horz = Result;\r\n                while (IsHorizontal(*Horz->Prev)) {\r\n                    Horz = Horz->Prev;\r\n                }\r\n                if (Horz->Prev->Top.X == Result->Next->Top.X) {\r\n                    if (!NextIsForward) {\r\n                        Result = Horz->Prev;\r\n                    }\r\n                } else if (Horz->Prev->Top.X > Result->Next->Top.X) {\r\n                    Result = Horz->Prev;\r\n                }\r\n            }\r\n            while (E != Result) {\r\n                E->NextInLML = E->Next;\r\n                if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Prev->Top.X) {\r\n                    ReverseHorizontal(*E);\r\n                }\r\n                E = E->Next;\r\n            }\r\n            if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Prev->Top.X) {\r\n                ReverseHorizontal(*E);\r\n            }\r\n            Result = Result->Next; //move to the edge just beyond current bound\r\n        } else {\r\n            while (Result->Top.Y == Result->Prev->Bot.Y && Result->Prev->OutIdx != Skip) {\r\n                Result = Result->Prev;\r\n            }\r\n            if (IsHorizontal(*Result) && Result->Prev->OutIdx != Skip) {\r\n                Horz = Result;\r\n                while (IsHorizontal(*Horz->Next)) {\r\n                    Horz = Horz->Next;\r\n                }\r\n                if (Horz->Next->Top.X == Result->Prev->Top.X) {\r\n                    if (!NextIsForward) {\r\n                        Result = Horz->Next;\r\n                    }\r\n                } else if (Horz->Next->Top.X > Result->Prev->Top.X) {\r\n                    Result = Horz->Next;\r\n                }\r\n            }\r\n\r\n            while (E != Result) {\r\n                E->NextInLML = E->Prev;\r\n                if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) {\r\n                    ReverseHorizontal(*E);\r\n                }\r\n                E = E->Prev;\r\n            }\r\n            if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) {\r\n                ReverseHorizontal(*E);\r\n            }\r\n            Result = Result->Prev; //move to the edge just beyond current bound\r\n        }\r\n\r\n        return Result;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed) {\r\n#ifdef use_lines\r\n  if (!Closed && PolyTyp == ptClip)\r\n    throw clipperException(\"AddPath: Open paths must be subject.\");\r\n#else\r\n        if (!Closed) {\r\n            throw clipperException(\"AddPath: Open paths have been disabled.\");\r\n        }\r\n#endif\r\n\r\n        int highI = (int) pg.size() - 1;\r\n        if (Closed) {\r\n            while (highI > 0 && (pg[highI] == pg[0])) {\r\n                --highI;\r\n            }\r\n        }\r\n        while (highI > 0 && (pg[highI] == pg[highI - 1])) {\r\n            --highI;\r\n        }\r\n        if ((Closed && highI < 2) || (!Closed && highI < 1)) {\r\n            return false;\r\n        }\r\n\r\n        //create a new edge array ...\r\n        TEdge *edges = new TEdge[highI + 1];\r\n\r\n        bool IsFlat = true;\r\n        //1. Basic (first) edge initialization ...\r\n        try {\r\n            edges[1].Curr = pg[1];\r\n            RangeTest(pg[0], m_UseFullRange);\r\n            RangeTest(pg[highI], m_UseFullRange);\r\n            InitEdge(&edges[0], &edges[1], &edges[highI], pg[0]);\r\n            InitEdge(&edges[highI], &edges[0], &edges[highI - 1], pg[highI]);\r\n            for (int i = highI - 1; i >= 1; --i) {\r\n                RangeTest(pg[i], m_UseFullRange);\r\n                InitEdge(&edges[i], &edges[i + 1], &edges[i - 1], pg[i]);\r\n            }\r\n        } catch (...) {\r\n            delete[] edges;\r\n            throw; //range test fails\r\n        }\r\n        TEdge *eStart = &edges[0];\r\n\r\n        //2. Remove duplicate vertices, and (when closed) collinear edges ...\r\n        TEdge *E = eStart, *eLoopStop = eStart;\r\n        for (; ;) {\r\n            //nb: allows matching start and end points when not Closed ...\r\n            if (E->Curr == E->Next->Curr && (Closed || E->Next != eStart)) {\r\n                if (E == E->Next) {\r\n                    break;\r\n                }\r\n                if (E == eStart) {\r\n                    eStart = E->Next;\r\n                }\r\n                E = RemoveEdge(E);\r\n                eLoopStop = E;\r\n                continue;\r\n            }\r\n            if (E->Prev == E->Next) {\r\n                break; //only two vertices\r\n            } else if (Closed && SlopesEqual(\r\n                    E->Prev->Curr,\r\n                    E->Curr,\r\n                    E->Next->Curr,\r\n                    m_UseFullRange\r\n            ) && (!m_PreserveCollinear || !Pt2IsBetweenPt1AndPt3(E->Prev->Curr, E->Curr, E->Next->Curr))) {\r\n                //Collinear edges are allowed for open paths but in closed paths\r\n                //the default is to merge adjacent collinear edges into a single edge.\r\n                //However, if the PreserveCollinear property is enabled, only overlapping\r\n                //collinear edges (ie spikes) will be removed from closed paths.\r\n                if (E == eStart) {\r\n                    eStart = E->Next;\r\n                }\r\n                E = RemoveEdge(E);\r\n                E = E->Prev;\r\n                eLoopStop = E;\r\n                continue;\r\n            }\r\n            E = E->Next;\r\n            if ((E == eLoopStop) || (!Closed && E->Next == eStart)) {\r\n                break;\r\n            }\r\n        }\r\n\r\n        if ((!Closed && (E == E->Next)) || (Closed && (E->Prev == E->Next))) {\r\n            delete[] edges;\r\n            return false;\r\n        }\r\n\r\n        if (!Closed) {\r\n            m_HasOpenPaths = true;\r\n            eStart->Prev->OutIdx = Skip;\r\n        }\r\n\r\n        //3. Do second stage of edge initialization ...\r\n        E = eStart;\r\n        do {\r\n            InitEdge2(*E, PolyTyp);\r\n            E = E->Next;\r\n            if (IsFlat && E->Curr.Y != eStart->Curr.Y) {\r\n                IsFlat = false;\r\n            }\r\n        } while (E != eStart);\r\n\r\n        //4. Finally, add edge bounds to LocalMinima list ...\r\n\r\n        //Totally flat paths must be handled differently when adding them\r\n        //to LocalMinima list to avoid endless loops etc ...\r\n        if (IsFlat) {\r\n            if (Closed) {\r\n                delete[] edges;\r\n                return false;\r\n            }\r\n            E->Prev->OutIdx = Skip;\r\n            if (E->Prev->Bot.X < E->Prev->Top.X) {\r\n                ReverseHorizontal(*E->Prev);\r\n            }\r\n            MinimaList::value_type locMin;\r\n            locMin.Y = E->Bot.Y;\r\n            locMin.LeftBound = 0;\r\n            locMin.RightBound = E;\r\n            locMin.RightBound->Side = esRight;\r\n            locMin.RightBound->WindDelta = 0;\r\n            while (E->Next->OutIdx != Skip) {\r\n                E->NextInLML = E->Next;\r\n                if (E->Bot.X != E->Prev->Top.X) {\r\n                    ReverseHorizontal(*E);\r\n                }\r\n                E = E->Next;\r\n            }\r\n            m_MinimaList.push_back(locMin);\r\n            m_edges.push_back(edges);\r\n            return true;\r\n        }\r\n\r\n        m_edges.push_back(edges);\r\n        bool leftBoundIsForward;\r\n        TEdge *EMin = 0;\r\n\r\n        //workaround to avoid an endless loop in the while loop below when\r\n        //open paths have matching start and end points ...\r\n        if (E->Prev->Bot == E->Prev->Top) {\r\n            E = E->Next;\r\n        }\r\n\r\n        for (; ;) {\r\n            E = FindNextLocMin(E);\r\n            if (E == EMin) {\r\n                break;\r\n            } else if (!EMin) {\r\n                EMin = E;\r\n            }\r\n\r\n            //E and E.Prev now share a local minima (left aligned if horizontal).\r\n            //Compare their slopes to find which starts which bound ...\r\n            MinimaList::value_type locMin;\r\n            locMin.Y = E->Bot.Y;\r\n            if (E->Dx < E->Prev->Dx) {\r\n                locMin.LeftBound = E->Prev;\r\n                locMin.RightBound = E;\r\n                leftBoundIsForward = false; //Q.nextInLML = Q.prev\r\n            } else {\r\n                locMin.LeftBound = E;\r\n                locMin.RightBound = E->Prev;\r\n                leftBoundIsForward = true; //Q.nextInLML = Q.next\r\n            }\r\n            locMin.LeftBound->Side = esLeft;\r\n            locMin.RightBound->Side = esRight;\r\n\r\n            if (!Closed) {\r\n                locMin.LeftBound->WindDelta = 0;\r\n            } else if (locMin.LeftBound->Next == locMin.RightBound) {\r\n                locMin.LeftBound->WindDelta = -1;\r\n            } else {\r\n                locMin.LeftBound->WindDelta = 1;\r\n            }\r\n            locMin.RightBound->WindDelta = -locMin.LeftBound->WindDelta;\r\n\r\n            E = ProcessBound(locMin.LeftBound, leftBoundIsForward);\r\n            if (E->OutIdx == Skip) {\r\n                E = ProcessBound(E, leftBoundIsForward);\r\n            }\r\n\r\n            TEdge *E2 = ProcessBound(locMin.RightBound, !leftBoundIsForward);\r\n            if (E2->OutIdx == Skip) {\r\n                E2 = ProcessBound(E2, !leftBoundIsForward);\r\n            }\r\n\r\n            if (locMin.LeftBound->OutIdx == Skip) {\r\n                locMin.LeftBound = 0;\r\n            } else if (locMin.RightBound->OutIdx == Skip) {\r\n                locMin.RightBound = 0;\r\n            }\r\n            m_MinimaList.push_back(locMin);\r\n            if (!leftBoundIsForward) {\r\n                E = E2;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool ClipperBase::AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed) {\r\n        bool result = false;\r\n        for (Paths::size_type i = 0; i < ppg.size(); ++i) {\r\n            if (AddPath(ppg[i], PolyTyp, Closed)) {\r\n                result = true;\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ClipperBase::Clear() {\r\n        DisposeLocalMinimaList();\r\n        for (EdgeList::size_type i = 0; i < m_edges.size(); ++i) {\r\n            //for each edge array in turn, find the first used edge and \r\n            //check for and remove any hiddenPts in each edge in the array.\r\n            TEdge *edges = m_edges[i];\r\n            delete[] edges;\r\n        }\r\n        m_edges.clear();\r\n        m_UseFullRange = false;\r\n        m_HasOpenPaths = false;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ClipperBase::Reset() {\r\n        m_CurrentLM = m_MinimaList.begin();\r\n        if (m_CurrentLM == m_MinimaList.end()) {\r\n            return;\r\n        } //ie nothing to process\r\n        std::sort(m_MinimaList.begin(), m_MinimaList.end(), LocMinSorter());\r\n\r\n        //reset all edges ...\r\n        for (MinimaList::iterator lm = m_MinimaList.begin(); lm != m_MinimaList.end(); ++lm) {\r\n            TEdge *e = lm->LeftBound;\r\n            if (e) {\r\n                e->Curr = e->Bot;\r\n                e->Side = esLeft;\r\n                e->OutIdx = Unassigned;\r\n            }\r\n\r\n            e = lm->RightBound;\r\n            if (e) {\r\n                e->Curr = e->Bot;\r\n                e->Side = esRight;\r\n                e->OutIdx = Unassigned;\r\n            }\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ClipperBase::DisposeLocalMinimaList() {\r\n        m_MinimaList.clear();\r\n        m_CurrentLM = m_MinimaList.begin();\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ClipperBase::PopLocalMinima() {\r\n        if (m_CurrentLM == m_MinimaList.end()) {\r\n            return;\r\n        }\r\n        ++m_CurrentLM;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    IntRect ClipperBase::GetBounds() {\r\n        IntRect result;\r\n        MinimaList::iterator lm = m_MinimaList.begin();\r\n        if (lm == m_MinimaList.end()) {\r\n            result.left = result.top = result.right = result.bottom = 0;\r\n            return result;\r\n        }\r\n        result.left = lm->LeftBound->Bot.X;\r\n        result.top = lm->LeftBound->Bot.Y;\r\n        result.right = lm->LeftBound->Bot.X;\r\n        result.bottom = lm->LeftBound->Bot.Y;\r\n        while (lm != m_MinimaList.end()) {\r\n            result.bottom = std::max(result.bottom, lm->LeftBound->Bot.Y);\r\n            TEdge *e = lm->LeftBound;\r\n            for (; ;) {\r\n                TEdge *bottomE = e;\r\n                while (e->NextInLML) {\r\n                    if (e->Bot.X < result.left) {\r\n                        result.left = e->Bot.X;\r\n                    }\r\n                    if (e->Bot.X > result.right) {\r\n                        result.right = e->Bot.X;\r\n                    }\r\n                    e = e->NextInLML;\r\n                }\r\n                result.left = std::min(result.left, e->Bot.X);\r\n                result.right = std::max(result.right, e->Bot.X);\r\n                result.left = std::min(result.left, e->Top.X);\r\n                result.right = std::max(result.right, e->Top.X);\r\n                result.top = std::min(result.top, e->Top.Y);\r\n                if (bottomE == lm->LeftBound) {\r\n                    e = lm->RightBound;\r\n                } else {\r\n                    break;\r\n                }\r\n            }\r\n            ++lm;\r\n        }\r\n        return result;\r\n    }\r\n\r\n//------------------------------------------------------------------------------\r\n// TClipper methods ...\r\n//------------------------------------------------------------------------------\r\n\r\n    Clipper::Clipper(int initOptions) : ClipperBase() //constructor\r\n    {\r\n        m_ActiveEdges = 0;\r\n        m_SortedEdges = 0;\r\n        m_ExecuteLocked = false;\r\n        m_UseFullRange = false;\r\n        m_ReverseOutput = ((initOptions & ioReverseSolution) != 0);\r\n        m_StrictSimple = ((initOptions & ioStrictlySimple) != 0);\r\n        m_PreserveCollinear = ((initOptions & ioPreserveCollinear) != 0);\r\n        m_HasOpenPaths = false;\r\n#ifdef use_xyz  \r\n  m_ZFill = 0;\r\n#endif\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    Clipper::~Clipper() //destructor\r\n    {\r\n        Clear();\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n#ifdef use_xyz  \r\nvoid Clipper::ZFillFunction(ZFillCallback zFillFunc)\r\n{  \r\n  m_ZFill = zFillFunc;\r\n}\r\n//------------------------------------------------------------------------------\r\n#endif\r\n\r\n    void Clipper::Reset() {\r\n        ClipperBase::Reset();\r\n        m_Scanbeam = ScanbeamList();\r\n        m_ActiveEdges = 0;\r\n        m_SortedEdges = 0;\r\n        for (MinimaList::iterator lm = m_MinimaList.begin(); lm != m_MinimaList.end(); ++lm) {\r\n            InsertScanbeam(lm->Y);\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool Clipper::Execute(ClipType clipType, Paths &solution, PolyFillType subjFillType, PolyFillType clipFillType) {\r\n        if (m_ExecuteLocked) {\r\n            return false;\r\n        }\r\n        if (m_HasOpenPaths) {\r\n            throw clipperException(\"Error: PolyTree struct is need for open path clipping.\");\r\n        }\r\n        m_ExecuteLocked = true;\r\n        solution.resize(0);\r\n        m_SubjFillType = subjFillType;\r\n        m_ClipFillType = clipFillType;\r\n        m_ClipType = clipType;\r\n        m_UsingPolyTree = false;\r\n        bool succeeded = ExecuteInternal();\r\n        if (succeeded) {\r\n            BuildResult(solution);\r\n        }\r\n        DisposeAllOutRecs();\r\n        m_ExecuteLocked = false;\r\n        return succeeded;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool Clipper::Execute(ClipType clipType, PolyTree &polytree, PolyFillType subjFillType, PolyFillType clipFillType) {\r\n        if (m_ExecuteLocked) {\r\n            return false;\r\n        }\r\n        m_ExecuteLocked = true;\r\n        m_SubjFillType = subjFillType;\r\n        m_ClipFillType = clipFillType;\r\n        m_ClipType = clipType;\r\n        m_UsingPolyTree = true;\r\n        bool succeeded = ExecuteInternal();\r\n        if (succeeded) {\r\n            BuildResult2(polytree);\r\n        }\r\n        DisposeAllOutRecs();\r\n        m_ExecuteLocked = false;\r\n        return succeeded;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::FixHoleLinkage(OutRec &outrec) {\r\n        //skip OutRecs that (a) contain outermost polygons or\r\n        //(b) already have the correct owner/child linkage ...\r\n        if (!outrec.FirstLeft || (outrec.IsHole != outrec.FirstLeft->IsHole && outrec.FirstLeft->Pts)) {\r\n            return;\r\n        }\r\n\r\n        OutRec *orfl = outrec.FirstLeft;\r\n        while (orfl && ((orfl->IsHole == outrec.IsHole) || !orfl->Pts)) {\r\n            orfl = orfl->FirstLeft;\r\n        }\r\n        outrec.FirstLeft = orfl;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool Clipper::ExecuteInternal() {\r\n        bool succeeded = true;\r\n        try {\r\n            Reset();\r\n            if (m_CurrentLM == m_MinimaList.end()) {\r\n                return true;\r\n            }\r\n            cInt botY = PopScanbeam();\r\n            do {\r\n                InsertLocalMinimaIntoAEL(botY);\r\n                ClearGhostJoins();\r\n                ProcessHorizontals(false);\r\n                if (m_Scanbeam.empty()) {\r\n                    break;\r\n                }\r\n                cInt topY = PopScanbeam();\r\n                succeeded = ProcessIntersections(topY);\r\n                if (!succeeded) {\r\n                    break;\r\n                }\r\n                ProcessEdgesAtTopOfScanbeam(topY);\r\n                botY = topY;\r\n            } while (!m_Scanbeam.empty() || m_CurrentLM != m_MinimaList.end());\r\n        } catch (...) {\r\n            succeeded = false;\r\n        }\r\n\r\n        if (succeeded) {\r\n//            printf(\"Fix orientations\\n\");\r\n            //fix orientations ...\r\n            for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) {\r\n                OutRec *outRec = m_PolyOuts[i];\r\n                if (!outRec->Pts || outRec->IsOpen) {\r\n                    continue;\r\n                }\r\n                if ((outRec->IsHole ^ m_ReverseOutput) == (Area(*outRec) > 0)) {\r\n                    ReversePolyPtLinks(outRec->Pts);\r\n                }\r\n            }\r\n\r\n            if (!m_Joins.empty()) {\r\n                JoinCommonEdges();\r\n            }\r\n\r\n            //unfortunately FixupOutPolygon() must be done after JoinCommonEdges()\r\n            for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) {\r\n                OutRec *outRec = m_PolyOuts[i];\r\n                if (outRec->Pts && !outRec->IsOpen) {\r\n                    FixupOutPolygon(*outRec);\r\n                }\r\n            }\r\n\r\n            if (m_StrictSimple) {\r\n                DoSimplePolygons();\r\n            }\r\n        }\r\n\r\n        ClearJoins();\r\n        ClearGhostJoins();\r\n        return succeeded;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::InsertScanbeam(const cInt Y) {\r\n        //if (!m_Scanbeam.empty() && Y == m_Scanbeam.top()) return;// avoid duplicates.\r\n        m_Scanbeam.push(Y);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    cInt Clipper::PopScanbeam() {\r\n        const cInt Y = m_Scanbeam.top();\r\n        m_Scanbeam.pop();\r\n        while (!m_Scanbeam.empty() && Y == m_Scanbeam.top()) {\r\n            m_Scanbeam.pop();\r\n        } // Pop duplicates.\r\n        return Y;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::DisposeAllOutRecs() {\r\n        for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) {\r\n            DisposeOutRec(i);\r\n        }\r\n        m_PolyOuts.clear();\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::DisposeOutRec(PolyOutList::size_type index) {\r\n        OutRec *outRec = m_PolyOuts[index];\r\n        if (outRec->Pts) {\r\n            DisposeOutPts(outRec->Pts);\r\n        }\r\n        delete outRec;\r\n        m_PolyOuts[index] = 0;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::SetWindingCount(TEdge &edge) {\r\n        TEdge *e = edge.PrevInAEL;\r\n        //find the edge of the same polytype that immediately preceeds 'edge' in AEL\r\n        while (e && ((e->PolyTyp != edge.PolyTyp) || (e->WindDelta == 0))) {\r\n            e = e->PrevInAEL;\r\n        }\r\n        if (!e) {\r\n            edge.WindCnt = (edge.WindDelta == 0 ? 1 : edge.WindDelta);\r\n            edge.WindCnt2 = 0;\r\n            e = m_ActiveEdges; //ie get ready to calc WindCnt2\r\n        } else if (edge.WindDelta == 0 && m_ClipType != ctUnion) {\r\n            edge.WindCnt = 1;\r\n            edge.WindCnt2 = e->WindCnt2;\r\n            e = e->NextInAEL; //ie get ready to calc WindCnt2\r\n        } else if (IsEvenOddFillType(edge)) {\r\n            //EvenOdd filling ...\r\n            if (edge.WindDelta == 0) {\r\n                //are we inside a subj polygon ...\r\n                bool Inside = true;\r\n                TEdge *e2 = e->PrevInAEL;\r\n                while (e2) {\r\n                    if (e2->PolyTyp == e->PolyTyp && e2->WindDelta != 0) {\r\n                        Inside = !Inside;\r\n                    }\r\n                    e2 = e2->PrevInAEL;\r\n                }\r\n                edge.WindCnt = (Inside ? 0 : 1);\r\n            } else {\r\n                edge.WindCnt = edge.WindDelta;\r\n            }\r\n            edge.WindCnt2 = e->WindCnt2;\r\n            e = e->NextInAEL; //ie get ready to calc WindCnt2\r\n        } else {\r\n            //nonZero, Positive or Negative filling ...\r\n            if (e->WindCnt * e->WindDelta < 0) {\r\n                //prev edge is 'decreasing' WindCount (WC) toward zero\r\n                //so we're outside the previous polygon ...\r\n                if (Abs(e->WindCnt) > 1) {\r\n                    //outside prev poly but still inside another.\r\n                    //when reversing direction of prev poly use the same WC \r\n                    if (e->WindDelta * edge.WindDelta < 0) {\r\n                        edge.WindCnt = e->WindCnt;\r\n                        //otherwise continue to 'decrease' WC ...\r\n                    } else {\r\n                        edge.WindCnt = e->WindCnt + edge.WindDelta;\r\n                    }\r\n                } else {\r\n                    //now outside all polys of same polytype so set own WC ...\r\n                    edge.WindCnt = (edge.WindDelta == 0 ? 1 : edge.WindDelta);\r\n                }\r\n            } else {\r\n                //prev edge is 'increasing' WindCount (WC) away from zero\r\n                //so we're inside the previous polygon ...\r\n                if (edge.WindDelta == 0) {\r\n                    edge.WindCnt = (e->WindCnt < 0 ? e->WindCnt - 1 : e->WindCnt + 1);\r\n                    //if wind direction is reversing prev then use same WC\r\n                } else if (e->WindDelta * edge.WindDelta < 0) {\r\n                    edge.WindCnt = e->WindCnt;\r\n                    //otherwise add to WC ...\r\n                } else {\r\n                    edge.WindCnt = e->WindCnt + edge.WindDelta;\r\n                }\r\n            }\r\n            edge.WindCnt2 = e->WindCnt2;\r\n            e = e->NextInAEL; //ie get ready to calc WindCnt2\r\n        }\r\n\r\n        //update WindCnt2 ...\r\n        if (IsEvenOddAltFillType(edge)) {\r\n            //EvenOdd filling ...\r\n            while (e != &edge) {\r\n                if (e->WindDelta != 0) {\r\n                    edge.WindCnt2 = (edge.WindCnt2 == 0 ? 1 : 0);\r\n                }\r\n                e = e->NextInAEL;\r\n            }\r\n        } else {\r\n            //nonZero, Positive or Negative filling ...\r\n            while (e != &edge) {\r\n                edge.WindCnt2 += e->WindDelta;\r\n                e = e->NextInAEL;\r\n            }\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool Clipper::IsEvenOddFillType(const TEdge &edge) const {\r\n        if (edge.PolyTyp == ptSubject) {\r\n            return m_SubjFillType == pftEvenOdd;\r\n        } else {\r\n            return m_ClipFillType == pftEvenOdd;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool Clipper::IsEvenOddAltFillType(const TEdge &edge) const {\r\n        if (edge.PolyTyp == ptSubject) {\r\n            return m_ClipFillType == pftEvenOdd;\r\n        } else {\r\n            return m_SubjFillType == pftEvenOdd;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool Clipper::IsContributing(const TEdge &edge) const {\r\n        PolyFillType pft, pft2;\r\n        if (edge.PolyTyp == ptSubject) {\r\n            pft = m_SubjFillType;\r\n            pft2 = m_ClipFillType;\r\n        } else {\r\n            pft = m_ClipFillType;\r\n            pft2 = m_SubjFillType;\r\n        }\r\n\r\n        switch (pft) {\r\n            case pftEvenOdd:\r\n                //return false if a subj line has been flagged as inside a subj polygon\r\n                if (edge.WindDelta == 0 && edge.WindCnt != 1) {\r\n                    return false;\r\n                }\r\n                break;\r\n            case pftNonZero:\r\n                if (Abs(edge.WindCnt) != 1) {\r\n                    return false;\r\n                }\r\n                break;\r\n            case pftPositive:\r\n                if (edge.WindCnt != 1) {\r\n                    return false;\r\n                }\r\n                break;\r\n            default: //pftNegative\r\n                if (edge.WindCnt != -1) {\r\n                    return false;\r\n                }\r\n        }\r\n\r\n        switch (m_ClipType) {\r\n            case ctIntersection:\r\n                switch (pft2) {\r\n                    case pftEvenOdd:\r\n                    case pftNonZero:\r\n                        return (edge.WindCnt2 != 0);\r\n                    case pftPositive:\r\n                        return (edge.WindCnt2 > 0);\r\n                    default:\r\n                        return (edge.WindCnt2 < 0);\r\n                }\r\n                break;\r\n            case ctUnion:\r\n                switch (pft2) {\r\n                    case pftEvenOdd:\r\n                    case pftNonZero:\r\n                        return (edge.WindCnt2 == 0);\r\n                    case pftPositive:\r\n                        return (edge.WindCnt2 <= 0);\r\n                    default:\r\n                        return (edge.WindCnt2 >= 0);\r\n                }\r\n                break;\r\n            case ctDifference:\r\n                if (edge.PolyTyp == ptSubject) {\r\n                    switch (pft2) {\r\n                        case pftEvenOdd:\r\n                        case pftNonZero:\r\n                            return (edge.WindCnt2 == 0);\r\n                        case pftPositive:\r\n                            return (edge.WindCnt2 <= 0);\r\n                        default:\r\n                            return (edge.WindCnt2 >= 0);\r\n                    }\r\n                } else {\r\n                    switch (pft2) {\r\n                        case pftEvenOdd:\r\n                        case pftNonZero:\r\n                            return (edge.WindCnt2 != 0);\r\n                        case pftPositive:\r\n                            return (edge.WindCnt2 > 0);\r\n                        default:\r\n                            return (edge.WindCnt2 < 0);\r\n                    }\r\n                }\r\n                break;\r\n            case ctXor:\r\n                if (edge.WindDelta == 0) { //XOr always contributing unless open\r\n                    switch (pft2) {\r\n                        case pftEvenOdd:\r\n                        case pftNonZero:\r\n                            return (edge.WindCnt2 == 0);\r\n                        case pftPositive:\r\n                            return (edge.WindCnt2 <= 0);\r\n                        default:\r\n                            return (edge.WindCnt2 >= 0);\r\n                    }\r\n                } else {\r\n                    return true;\r\n                }\r\n                break;\r\n            default:\r\n                return true;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    OutPt *Clipper::AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt) {\r\n        OutPt *result;\r\n        TEdge *e, *prevE;\r\n        if (IsHorizontal(*e2) || (e1->Dx > e2->Dx)) {\r\n            result = AddOutPt(e1, Pt);\r\n            e2->OutIdx = e1->OutIdx;\r\n            e1->Side = esLeft;\r\n            e2->Side = esRight;\r\n            e = e1;\r\n            if (e->PrevInAEL == e2) {\r\n                prevE = e2->PrevInAEL;\r\n            } else {\r\n                prevE = e->PrevInAEL;\r\n            }\r\n        } else {\r\n            result = AddOutPt(e2, Pt);\r\n            e1->OutIdx = e2->OutIdx;\r\n            e1->Side = esRight;\r\n            e2->Side = esLeft;\r\n            e = e2;\r\n            if (e->PrevInAEL == e1) {\r\n                prevE = e1->PrevInAEL;\r\n            } else {\r\n                prevE = e->PrevInAEL;\r\n            }\r\n        }\r\n\r\n        if (prevE && prevE->OutIdx >= 0 && (TopX(*prevE, Pt.Y) == TopX(*e, Pt.Y)) && SlopesEqual(\r\n                *e,\r\n                *prevE,\r\n                m_UseFullRange\r\n        ) && (e->WindDelta != 0) && (prevE->WindDelta != 0)) {\r\n            OutPt *outPt = AddOutPt(prevE, Pt);\r\n            AddJoin(result, outPt, e->Top);\r\n        }\r\n        return result;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt) {\r\n        AddOutPt(e1, Pt);\r\n        if (e2->WindDelta == 0) {\r\n            AddOutPt(e2, Pt);\r\n        }\r\n        if (e1->OutIdx == e2->OutIdx) {\r\n            e1->OutIdx = Unassigned;\r\n            e2->OutIdx = Unassigned;\r\n        } else if (e1->OutIdx < e2->OutIdx) {\r\n            AppendPolygon(e1, e2);\r\n        } else {\r\n            AppendPolygon(e2, e1);\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::AddEdgeToSEL(TEdge *edge) {\r\n        //SEL pointers in PEdge are reused to build a list of horizontal edges.\r\n        //However, we don't need to worry about order with horizontal edge processing.\r\n        if (!m_SortedEdges) {\r\n            m_SortedEdges = edge;\r\n            edge->PrevInSEL = 0;\r\n            edge->NextInSEL = 0;\r\n        } else {\r\n            edge->NextInSEL = m_SortedEdges;\r\n            edge->PrevInSEL = 0;\r\n            m_SortedEdges->PrevInSEL = edge;\r\n            m_SortedEdges = edge;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::CopyAELToSEL() {\r\n        TEdge *e = m_ActiveEdges;\r\n        m_SortedEdges = e;\r\n        while (e) {\r\n            e->PrevInSEL = e->PrevInAEL;\r\n            e->NextInSEL = e->NextInAEL;\r\n            e = e->NextInAEL;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::AddJoin(OutPt *op1, OutPt *op2, const IntPoint OffPt) {\r\n        Join *j = new Join;\r\n        j->OutPt1 = op1;\r\n        j->OutPt2 = op2;\r\n        j->OffPt = OffPt;\r\n        m_Joins.push_back(j);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::ClearJoins() {\r\n        for (JoinList::size_type i = 0; i < m_Joins.size(); i++) {\r\n            delete m_Joins[i];\r\n        }\r\n        m_Joins.resize(0);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::ClearGhostJoins() {\r\n        for (JoinList::size_type i = 0; i < m_GhostJoins.size(); i++) {\r\n            delete m_GhostJoins[i];\r\n        }\r\n        m_GhostJoins.resize(0);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::AddGhostJoin(OutPt *op, const IntPoint OffPt) {\r\n        Join *j = new Join;\r\n        j->OutPt1 = op;\r\n        j->OutPt2 = 0;\r\n        j->OffPt = OffPt;\r\n        m_GhostJoins.push_back(j);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::InsertLocalMinimaIntoAEL(const cInt botY) {\r\n        while (m_CurrentLM != m_MinimaList.end() && (m_CurrentLM->Y == botY)) {\r\n            TEdge *lb = m_CurrentLM->LeftBound;\r\n            TEdge *rb = m_CurrentLM->RightBound;\r\n            PopLocalMinima();\r\n            OutPt *Op1 = 0;\r\n            if (!lb) {\r\n                //nb: don't insert LB into either AEL or SEL\r\n                InsertEdgeIntoAEL(rb, 0);\r\n                SetWindingCount(*rb);\r\n                if (IsContributing(*rb)) {\r\n                    Op1 = AddOutPt(rb, rb->Bot);\r\n                }\r\n            } else if (!rb) {\r\n                InsertEdgeIntoAEL(lb, 0);\r\n                SetWindingCount(*lb);\r\n                if (IsContributing(*lb)) {\r\n                    Op1 = AddOutPt(lb, lb->Bot);\r\n                }\r\n                InsertScanbeam(lb->Top.Y);\r\n            } else {\r\n                InsertEdgeIntoAEL(lb, 0);\r\n                InsertEdgeIntoAEL(rb, lb);\r\n                SetWindingCount(*lb);\r\n                rb->WindCnt = lb->WindCnt;\r\n                rb->WindCnt2 = lb->WindCnt2;\r\n                if (IsContributing(*lb)) {\r\n                    Op1 = AddLocalMinPoly(lb, rb, lb->Bot);\r\n                }\r\n                InsertScanbeam(lb->Top.Y);\r\n            }\r\n\r\n            if (rb) {\r\n                if (IsHorizontal(*rb)) {\r\n                    AddEdgeToSEL(rb);\r\n                } else {\r\n                    InsertScanbeam(rb->Top.Y);\r\n                }\r\n            }\r\n\r\n            if (!lb || !rb) {\r\n                continue;\r\n            }\r\n\r\n            //if any output polygons share an edge, they'll need joining later ...\r\n            if (Op1 && IsHorizontal(*rb) && m_GhostJoins.size() > 0 && (rb->WindDelta != 0)) {\r\n                for (JoinList::size_type i = 0; i < m_GhostJoins.size(); ++i) {\r\n                    Join *jr = m_GhostJoins[i];\r\n                    //if the horizontal Rb and a 'ghost' horizontal overlap, then convert\r\n                    //the 'ghost' join to a real join ready for later ...\r\n                    if (HorzSegmentsOverlap(jr->OutPt1->Pt.X, jr->OffPt.X, rb->Bot.X, rb->Top.X)) {\r\n                        AddJoin(jr->OutPt1, Op1, jr->OffPt);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (lb->OutIdx >= 0 && lb->PrevInAEL && lb->PrevInAEL->Curr.X == lb->Bot.X && lb->PrevInAEL->OutIdx >= 0 && SlopesEqual(\r\n                    *lb->PrevInAEL,\r\n                    *lb,\r\n                    m_UseFullRange\r\n            ) && (lb->WindDelta != 0) && (lb->PrevInAEL->WindDelta != 0)) {\r\n                OutPt *Op2 = AddOutPt(lb->PrevInAEL, lb->Bot);\r\n                AddJoin(Op1, Op2, lb->Top);\r\n            }\r\n\r\n            if (lb->NextInAEL != rb) {\r\n\r\n                if (rb->OutIdx >= 0 && rb->PrevInAEL->OutIdx >= 0 && SlopesEqual(\r\n                        *rb->PrevInAEL,\r\n                        *rb,\r\n                        m_UseFullRange\r\n                ) && (rb->WindDelta != 0) && (rb->PrevInAEL->WindDelta != 0)) {\r\n                    OutPt *Op2 = AddOutPt(rb->PrevInAEL, rb->Bot);\r\n                    AddJoin(Op1, Op2, rb->Top);\r\n                }\r\n\r\n                TEdge *e = lb->NextInAEL;\r\n                if (e) {\r\n                    while (e != rb) {\r\n                        //nb: For calculating winding counts etc, IntersectEdges() assumes\r\n                        //that param1 will be to the Right of param2 ABOVE the intersection ...\r\n                        IntersectEdges(rb, e, lb->Curr); //order important here\r\n                        e = e->NextInAEL;\r\n                    }\r\n                }\r\n            }\r\n\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::DeleteFromAEL(TEdge *e) {\r\n        TEdge *AelPrev = e->PrevInAEL;\r\n        TEdge *AelNext = e->NextInAEL;\r\n        if (!AelPrev && !AelNext && (e != m_ActiveEdges)) {\r\n            return;\r\n        } //already deleted\r\n        if (AelPrev) {\r\n            AelPrev->NextInAEL = AelNext;\r\n        } else {\r\n            m_ActiveEdges = AelNext;\r\n        }\r\n        if (AelNext) {\r\n            AelNext->PrevInAEL = AelPrev;\r\n        }\r\n        e->NextInAEL = 0;\r\n        e->PrevInAEL = 0;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::DeleteFromSEL(TEdge *e) {\r\n        TEdge *SelPrev = e->PrevInSEL;\r\n        TEdge *SelNext = e->NextInSEL;\r\n        if (!SelPrev && !SelNext && (e != m_SortedEdges)) {\r\n            return;\r\n        } //already deleted\r\n        if (SelPrev) {\r\n            SelPrev->NextInSEL = SelNext;\r\n        } else {\r\n            m_SortedEdges = SelNext;\r\n        }\r\n        if (SelNext) {\r\n            SelNext->PrevInSEL = SelPrev;\r\n        }\r\n        e->NextInSEL = 0;\r\n        e->PrevInSEL = 0;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n#ifdef use_xyz\r\nvoid Clipper::SetZ(IntPoint& pt, TEdge& e1, TEdge& e2)\r\n{\r\n  if (pt.Z != 0 || !m_ZFill) return;\r\n  else if (pt == e1.Bot) pt.Z = e1.Bot.Z;\r\n  else if (pt == e1.Top) pt.Z = e1.Top.Z;\r\n  else if (pt == e2.Bot) pt.Z = e2.Bot.Z;\r\n  else if (pt == e2.Top) pt.Z = e2.Top.Z;\r\n  else (*m_ZFill)(e1.Bot, e1.Top, e2.Bot, e2.Top, pt); \r\n}\r\n//------------------------------------------------------------------------------\r\n#endif\r\n\r\n\r\n    void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &Pt) {\r\n\r\n        bool e1Contributing = (e1->OutIdx >= 0);\r\n        bool e2Contributing = (e2->OutIdx >= 0);\r\n\r\n#ifdef use_xyz\r\n        SetZ(Pt, *e1, *e2);\r\n#endif\r\n\r\n#ifdef use_lines\r\n  //if either edge is on an OPEN path ...\r\n  if (e1->WindDelta == 0 || e2->WindDelta == 0)\r\n  {\r\n    //ignore subject-subject open path intersections UNLESS they\r\n    //are both open paths, AND they are both 'contributing maximas' ...\r\n\tif (e1->WindDelta == 0 && e2->WindDelta == 0) return;\r\n\r\n    //if intersecting a subj line with a subj poly ...\r\n    else if (e1->PolyTyp == e2->PolyTyp && \r\n      e1->WindDelta != e2->WindDelta && m_ClipType == ctUnion)\r\n    {\r\n      if (e1->WindDelta == 0)\r\n      {\r\n        if (e2Contributing)\r\n        {\r\n          AddOutPt(e1, Pt);\r\n          if (e1Contributing) e1->OutIdx = Unassigned;\r\n        }\r\n      }\r\n      else\r\n      {\r\n        if (e1Contributing)\r\n        {\r\n          AddOutPt(e2, Pt);\r\n          if (e2Contributing) e2->OutIdx = Unassigned;\r\n        }\r\n      }\r\n    }\r\n    else if (e1->PolyTyp != e2->PolyTyp)\r\n    {\r\n      //toggle subj open path OutIdx on/off when Abs(clip.WndCnt) == 1 ...\r\n      if ((e1->WindDelta == 0) && abs(e2->WindCnt) == 1 && \r\n        (m_ClipType != ctUnion || e2->WindCnt2 == 0))\r\n      {\r\n        AddOutPt(e1, Pt);\r\n        if (e1Contributing) e1->OutIdx = Unassigned;\r\n      }\r\n      else if ((e2->WindDelta == 0) && (abs(e1->WindCnt) == 1) && \r\n        (m_ClipType != ctUnion || e1->WindCnt2 == 0))\r\n      {\r\n        AddOutPt(e2, Pt);\r\n        if (e2Contributing) e2->OutIdx = Unassigned;\r\n      }\r\n    }\r\n    return;\r\n  }\r\n#endif\r\n\r\n//        printf(\"-----------------------------------------------------------------------------------------\\n\");\r\n//        printf(\"Edges: e1s=(%lli,%lli) e1d=(%lli,%lli) e2s=(%lli,%lli) e2d=(%lli,%lli)\\n\",\r\n//               e1->Bot.X, e1->Bot.Y, e1->Top.X, e1->Top.Y, e2->Bot.X, e2->Bot.Y, e2->Top.X, e2->Top.Y);\r\n//        printf(\"OutIdx: e1=%i, e2=%i\\n\", e1->OutIdx, e2->OutIdx);\r\n//        printf(\"Point: (%lli,%lli)\\n\", Pt.X, Pt.Y);\r\n\r\n        //update winding counts...\r\n        //assumes that e1 will be to the Right of e2 ABOVE the intersection\r\n        if (e1->PolyTyp == e2->PolyTyp) {\r\n            if (IsEvenOddFillType(*e1)) {\r\n                int oldE1WindCnt = e1->WindCnt;\r\n                e1->WindCnt = e2->WindCnt;\r\n                e2->WindCnt = oldE1WindCnt;\r\n            } else {\r\n                if (e1->WindCnt + e2->WindDelta == 0) {\r\n                    e1->WindCnt = -e1->WindCnt;\r\n                } else {\r\n                    e1->WindCnt += e2->WindDelta;\r\n                }\r\n                if (e2->WindCnt - e1->WindDelta == 0) {\r\n                    e2->WindCnt = -e2->WindCnt;\r\n                } else {\r\n                    e2->WindCnt -= e1->WindDelta;\r\n                }\r\n            }\r\n        } else {\r\n            if (!IsEvenOddFillType(*e2)) {\r\n                e1->WindCnt2 += e2->WindDelta;\r\n            } else {\r\n                e1->WindCnt2 = (e1->WindCnt2 == 0) ? 1 : 0;\r\n            }\r\n            if (!IsEvenOddFillType(*e1)) {\r\n                e2->WindCnt2 -= e1->WindDelta;\r\n            } else {\r\n                e2->WindCnt2 = (e2->WindCnt2 == 0) ? 1 : 0;\r\n            }\r\n        }\r\n\r\n//        printf(\"WindCount: e1=%i/%i, e2=%i/%i\\n\", e1->WindCnt, e1->WindCnt2, e2->WindCnt, e2->WindCnt2);\r\n\r\n        PolyFillType e1FillType, e2FillType, e1FillType2, e2FillType2;\r\n        if (e1->PolyTyp == ptSubject) {\r\n            e1FillType = m_SubjFillType;\r\n            e1FillType2 = m_ClipFillType;\r\n        } else {\r\n            e1FillType = m_ClipFillType;\r\n            e1FillType2 = m_SubjFillType;\r\n        }\r\n        if (e2->PolyTyp == ptSubject) {\r\n            e2FillType = m_SubjFillType;\r\n            e2FillType2 = m_ClipFillType;\r\n        } else {\r\n            e2FillType = m_ClipFillType;\r\n            e2FillType2 = m_SubjFillType;\r\n        }\r\n\r\n        cInt e1Wc, e2Wc;\r\n        switch (e1FillType) {\r\n            case pftPositive:\r\n                e1Wc = e1->WindCnt;\r\n                break;\r\n            case pftNegative:\r\n                e1Wc = -e1->WindCnt;\r\n                break;\r\n            default:\r\n                e1Wc = Abs(e1->WindCnt);\r\n        }\r\n        switch (e2FillType) {\r\n            case pftPositive:\r\n                e2Wc = e2->WindCnt;\r\n                break;\r\n            case pftNegative:\r\n                e2Wc = -e2->WindCnt;\r\n                break;\r\n            default:\r\n                e2Wc = Abs(e2->WindCnt);\r\n        }\r\n\r\n        if (e1Contributing && e2Contributing) {\r\n            if ((e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) || (e1->PolyTyp != e2->PolyTyp && m_ClipType != ctXor)) {\r\n                AddLocalMaxPoly(e1, e2, Pt);\r\n            } else {\r\n                AddOutPt(e1, Pt);\r\n                AddOutPt(e2, Pt);\r\n                SwapSides(*e1, *e2);\r\n                SwapPolyIndexes(*e1, *e2);\r\n            }\r\n        } else if (e1Contributing) {\r\n            if (e2Wc == 0 || e2Wc == 1) {\r\n                AddOutPt(e1, Pt);\r\n                SwapSides(*e1, *e2);\r\n                SwapPolyIndexes(*e1, *e2);\r\n            }\r\n        } else if (e2Contributing) {\r\n            if (e1Wc == 0 || e1Wc == 1) {\r\n                AddOutPt(e2, Pt);\r\n                SwapSides(*e1, *e2);\r\n                SwapPolyIndexes(*e1, *e2);\r\n            }\r\n        } else if ((e1Wc == 0 || e1Wc == 1) && (e2Wc == 0 || e2Wc == 1)) {\r\n            //neither edge is currently contributing ...\r\n\r\n            cInt e1Wc2, e2Wc2;\r\n            switch (e1FillType2) {\r\n                case pftPositive:\r\n                    e1Wc2 = e1->WindCnt2;\r\n                    break;\r\n                case pftNegative :\r\n                    e1Wc2 = -e1->WindCnt2;\r\n                    break;\r\n                default:\r\n                    e1Wc2 = Abs(e1->WindCnt2);\r\n            }\r\n            switch (e2FillType2) {\r\n                case pftPositive:\r\n                    e2Wc2 = e2->WindCnt2;\r\n                    break;\r\n                case pftNegative:\r\n                    e2Wc2 = -e2->WindCnt2;\r\n                    break;\r\n                default:\r\n                    e2Wc2 = Abs(e2->WindCnt2);\r\n            }\r\n\r\n            if (e1->PolyTyp != e2->PolyTyp) {\r\n                AddLocalMinPoly(e1, e2, Pt);\r\n            } else if (e1Wc == 1 && e2Wc == 1) {\r\n                switch (m_ClipType) {\r\n                    case ctIntersection:\r\n                        if (e1Wc2 > 0 && e2Wc2 > 0) {\r\n                            AddLocalMinPoly(e1, e2, Pt);\r\n                        }\r\n                        break;\r\n                    case ctUnion:\r\n                        if (e1Wc2 <= 0 && e2Wc2 <= 0) {\r\n                            AddLocalMinPoly(e1, e2, Pt);\r\n                        }\r\n                        break;\r\n                    case ctDifference:\r\n                        if (((e1->PolyTyp == ptClip) && (e1Wc2 > 0) && (e2Wc2 > 0)) || ((e1->PolyTyp == ptSubject) && (e1Wc2 <= 0) && (e2Wc2 <= 0))) {\r\n                            AddLocalMinPoly(e1, e2, Pt);\r\n                        }\r\n                        break;\r\n                    case ctXor:\r\n                        AddLocalMinPoly(e1, e2, Pt);\r\n                }\r\n            } else {\r\n                SwapSides(*e1, *e2);\r\n            }\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::SetHoleState(TEdge *e, OutRec *outrec) {\r\n//        printf(\"Set hole state\\n\");\r\n        bool IsHole = false;\r\n        TEdge *e2 = e->PrevInAEL;\r\n        while (e2) {\r\n            if (e2->OutIdx >= 0 && e2->WindDelta != 0) {\r\n                IsHole = !IsHole;\r\n                if (!outrec->FirstLeft) {\r\n                    outrec->FirstLeft = m_PolyOuts[e2->OutIdx];\r\n                }\r\n            }\r\n            e2 = e2->PrevInAEL;\r\n        }\r\n        if (IsHole) {\r\n//            printf(\"Hole is true\\n\");\r\n            outrec->IsHole = true;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    OutRec *GetLowermostRec(OutRec *outRec1, OutRec *outRec2) {\r\n        //work out which polygon fragment has the correct hole state ...\r\n        if (!outRec1->BottomPt) {\r\n            outRec1->BottomPt = GetBottomPt(outRec1->Pts);\r\n        }\r\n        if (!outRec2->BottomPt) {\r\n            outRec2->BottomPt = GetBottomPt(outRec2->Pts);\r\n        }\r\n        OutPt *OutPt1 = outRec1->BottomPt;\r\n        OutPt *OutPt2 = outRec2->BottomPt;\r\n        if (OutPt1->Pt.Y > OutPt2->Pt.Y) {\r\n            return outRec1;\r\n        } else if (OutPt1->Pt.Y < OutPt2->Pt.Y) {\r\n            return outRec2;\r\n        } else if (OutPt1->Pt.X < OutPt2->Pt.X) {\r\n            return outRec1;\r\n        } else if (OutPt1->Pt.X > OutPt2->Pt.X) {\r\n            return outRec2;\r\n        } else if (OutPt1->Next == OutPt1) {\r\n            return outRec2;\r\n        } else if (OutPt2->Next == OutPt2) {\r\n            return outRec1;\r\n        } else if (FirstIsBottomPt(OutPt1, OutPt2)) {\r\n            return outRec1;\r\n        } else {\r\n            return outRec2;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool Param1RightOfParam2(OutRec *outRec1, OutRec *outRec2) {\r\n        do {\r\n            outRec1 = outRec1->FirstLeft;\r\n            if (outRec1 == outRec2) {\r\n                return true;\r\n            }\r\n        } while (outRec1);\r\n        return false;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    OutRec *Clipper::GetOutRec(int Idx) {\r\n        OutRec *outrec = m_PolyOuts[Idx];\r\n        while (outrec != m_PolyOuts[outrec->Idx]) {\r\n            outrec = m_PolyOuts[outrec->Idx];\r\n        }\r\n        return outrec;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::AppendPolygon(TEdge *e1, TEdge *e2) {\r\n        //get the start and ends of both output polygons ...\r\n        OutRec *outRec1 = m_PolyOuts[e1->OutIdx];\r\n        OutRec *outRec2 = m_PolyOuts[e2->OutIdx];\r\n\r\n        OutRec *holeStateRec;\r\n        if (Param1RightOfParam2(outRec1, outRec2)) {\r\n            holeStateRec = outRec2;\r\n        } else if (Param1RightOfParam2(outRec2, outRec1)) {\r\n            holeStateRec = outRec1;\r\n        } else {\r\n            holeStateRec = GetLowermostRec(outRec1, outRec2);\r\n        }\r\n\r\n        //get the start and ends of both output polygons and\r\n        //join e2 poly onto e1 poly and delete pointers to e2 ...\r\n\r\n        OutPt *p1_lft = outRec1->Pts;\r\n        OutPt *p1_rt = p1_lft->Prev;\r\n        OutPt *p2_lft = outRec2->Pts;\r\n        OutPt *p2_rt = p2_lft->Prev;\r\n\r\n        EdgeSide Side;\r\n        //join e2 poly onto e1 poly and delete pointers to e2 ...\r\n        if (e1->Side == esLeft) {\r\n            if (e2->Side == esLeft) {\r\n                //z y x a b c\r\n                ReversePolyPtLinks(p2_lft);\r\n                p2_lft->Next = p1_lft;\r\n                p1_lft->Prev = p2_lft;\r\n                p1_rt->Next = p2_rt;\r\n                p2_rt->Prev = p1_rt;\r\n                outRec1->Pts = p2_rt;\r\n            } else {\r\n                //x y z a b c\r\n                p2_rt->Next = p1_lft;\r\n                p1_lft->Prev = p2_rt;\r\n                p2_lft->Prev = p1_rt;\r\n                p1_rt->Next = p2_lft;\r\n                outRec1->Pts = p2_lft;\r\n            }\r\n            Side = esLeft;\r\n        } else {\r\n            if (e2->Side == esRight) {\r\n                //a b c z y x\r\n                ReversePolyPtLinks(p2_lft);\r\n                p1_rt->Next = p2_rt;\r\n                p2_rt->Prev = p1_rt;\r\n                p2_lft->Next = p1_lft;\r\n                p1_lft->Prev = p2_lft;\r\n            } else {\r\n                //a b c x y z\r\n                p1_rt->Next = p2_lft;\r\n                p2_lft->Prev = p1_rt;\r\n                p1_lft->Prev = p2_rt;\r\n                p2_rt->Next = p1_lft;\r\n            }\r\n            Side = esRight;\r\n        }\r\n\r\n        outRec1->BottomPt = 0;\r\n        if (holeStateRec == outRec2) {\r\n            if (outRec2->FirstLeft != outRec1) {\r\n                outRec1->FirstLeft = outRec2->FirstLeft;\r\n            }\r\n            outRec1->IsHole = outRec2->IsHole;\r\n        }\r\n        outRec2->Pts = 0;\r\n        outRec2->BottomPt = 0;\r\n        outRec2->FirstLeft = outRec1;\r\n\r\n        int OKIdx = e1->OutIdx;\r\n        int ObsoleteIdx = e2->OutIdx;\r\n\r\n        e1->OutIdx = Unassigned; //nb: safe because we only get here via AddLocalMaxPoly\r\n        e2->OutIdx = Unassigned;\r\n\r\n        TEdge *e = m_ActiveEdges;\r\n        while (e) {\r\n            if (e->OutIdx == ObsoleteIdx) {\r\n                e->OutIdx = OKIdx;\r\n                e->Side = Side;\r\n                break;\r\n            }\r\n            e = e->NextInAEL;\r\n        }\r\n\r\n        outRec2->Idx = outRec1->Idx;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    OutRec *Clipper::CreateOutRec() {\r\n        OutRec *result = new OutRec;\r\n        result->IsHole = false;\r\n        result->IsOpen = false;\r\n        result->FirstLeft = 0;\r\n        result->Pts = 0;\r\n        result->BottomPt = 0;\r\n        result->PolyNd = 0;\r\n        m_PolyOuts.push_back(result);\r\n        result->Idx = (int) m_PolyOuts.size() - 1;\r\n        return result;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    OutPt *Clipper::AddOutPt(TEdge *e, const IntPoint &pt) {\r\n        bool ToFront = (e->Side == esLeft);\r\n        if (e->OutIdx < 0) {\r\n            OutRec *outRec = CreateOutRec();\r\n            outRec->IsOpen = (e->WindDelta == 0);\r\n            OutPt *newOp = new OutPt;\r\n            outRec->Pts = newOp;\r\n            newOp->Idx = outRec->Idx;\r\n            newOp->Pt = pt;\r\n            newOp->Next = newOp;\r\n            newOp->Prev = newOp;\r\n            if (!outRec->IsOpen) {\r\n                SetHoleState(e, outRec);\r\n            }\r\n            e->OutIdx = outRec->Idx;\r\n            return newOp;\r\n        } else {\r\n            OutRec *outRec = m_PolyOuts[e->OutIdx];\r\n            //OutRec.Pts is the 'Left-most' point & OutRec.Pts.Prev is the 'Right-most'\r\n            OutPt *op = outRec->Pts;\r\n\r\n            if (ToFront && (pt == op->Pt)) {\r\n                return op;\r\n            } else if (!ToFront && (pt == op->Prev->Pt)) {\r\n                return op->Prev;\r\n            }\r\n\r\n            OutPt *newOp = new OutPt;\r\n            newOp->Idx = outRec->Idx;\r\n            newOp->Pt = pt;\r\n            newOp->Next = op;\r\n            newOp->Prev = op->Prev;\r\n            newOp->Prev->Next = newOp;\r\n            op->Prev = newOp;\r\n            if (ToFront) {\r\n                outRec->Pts = newOp;\r\n            }\r\n            return newOp;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::ProcessHorizontals(bool IsTopOfScanbeam) {\r\n        TEdge *horzEdge = m_SortedEdges;\r\n        while (horzEdge) {\r\n            DeleteFromSEL(horzEdge);\r\n            ProcessHorizontal(horzEdge, IsTopOfScanbeam);\r\n            horzEdge = m_SortedEdges;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    inline bool IsMinima(TEdge *e) {\r\n        return e && (e->Prev->NextInLML != e) && (e->Next->NextInLML != e);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    inline bool IsMaxima(TEdge *e, const cInt Y) {\r\n        return e && e->Top.Y == Y && !e->NextInLML;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    inline bool IsIntermediate(TEdge *e, const cInt Y) {\r\n        return e->Top.Y == Y && e->NextInLML;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    TEdge *GetMaximaPair(TEdge *e) {\r\n        TEdge *result = 0;\r\n        if ((e->Next->Top == e->Top) && !e->Next->NextInLML) {\r\n            result = e->Next;\r\n        } else if ((e->Prev->Top == e->Top) && !e->Prev->NextInLML) {\r\n            result = e->Prev;\r\n        }\r\n\r\n        if (result && (result->OutIdx == Skip ||\r\n                //result is false if both NextInAEL & PrevInAEL are nil & not horizontal ...\r\n                        (result->NextInAEL == result->PrevInAEL && !IsHorizontal(*result)))) {\r\n            return 0;\r\n        }\r\n        return result;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::SwapPositionsInAEL(TEdge *Edge1, TEdge *Edge2) {\r\n        //check that one or other edge hasn't already been removed from AEL ...\r\n        if (Edge1->NextInAEL == Edge1->PrevInAEL || Edge2->NextInAEL == Edge2->PrevInAEL) {\r\n            return;\r\n        }\r\n\r\n        if (Edge1->NextInAEL == Edge2) {\r\n            TEdge *Next = Edge2->NextInAEL;\r\n            if (Next) {\r\n                Next->PrevInAEL = Edge1;\r\n            }\r\n            TEdge *Prev = Edge1->PrevInAEL;\r\n            if (Prev) {\r\n                Prev->NextInAEL = Edge2;\r\n            }\r\n            Edge2->PrevInAEL = Prev;\r\n            Edge2->NextInAEL = Edge1;\r\n            Edge1->PrevInAEL = Edge2;\r\n            Edge1->NextInAEL = Next;\r\n        } else if (Edge2->NextInAEL == Edge1) {\r\n            TEdge *Next = Edge1->NextInAEL;\r\n            if (Next) {\r\n                Next->PrevInAEL = Edge2;\r\n            }\r\n            TEdge *Prev = Edge2->PrevInAEL;\r\n            if (Prev) {\r\n                Prev->NextInAEL = Edge1;\r\n            }\r\n            Edge1->PrevInAEL = Prev;\r\n            Edge1->NextInAEL = Edge2;\r\n            Edge2->PrevInAEL = Edge1;\r\n            Edge2->NextInAEL = Next;\r\n        } else {\r\n            TEdge *Next = Edge1->NextInAEL;\r\n            TEdge *Prev = Edge1->PrevInAEL;\r\n            Edge1->NextInAEL = Edge2->NextInAEL;\r\n            if (Edge1->NextInAEL) {\r\n                Edge1->NextInAEL->PrevInAEL = Edge1;\r\n            }\r\n            Edge1->PrevInAEL = Edge2->PrevInAEL;\r\n            if (Edge1->PrevInAEL) {\r\n                Edge1->PrevInAEL->NextInAEL = Edge1;\r\n            }\r\n            Edge2->NextInAEL = Next;\r\n            if (Edge2->NextInAEL) {\r\n                Edge2->NextInAEL->PrevInAEL = Edge2;\r\n            }\r\n            Edge2->PrevInAEL = Prev;\r\n            if (Edge2->PrevInAEL) {\r\n                Edge2->PrevInAEL->NextInAEL = Edge2;\r\n            }\r\n        }\r\n\r\n        if (!Edge1->PrevInAEL) {\r\n            m_ActiveEdges = Edge1;\r\n        } else if (!Edge2->PrevInAEL) {\r\n            m_ActiveEdges = Edge2;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::SwapPositionsInSEL(TEdge *Edge1, TEdge *Edge2) {\r\n        if (!(Edge1->NextInSEL) && !(Edge1->PrevInSEL)) {\r\n            return;\r\n        }\r\n        if (!(Edge2->NextInSEL) && !(Edge2->PrevInSEL)) {\r\n            return;\r\n        }\r\n\r\n        if (Edge1->NextInSEL == Edge2) {\r\n            TEdge *Next = Edge2->NextInSEL;\r\n            if (Next) {\r\n                Next->PrevInSEL = Edge1;\r\n            }\r\n            TEdge *Prev = Edge1->PrevInSEL;\r\n            if (Prev) {\r\n                Prev->NextInSEL = Edge2;\r\n            }\r\n            Edge2->PrevInSEL = Prev;\r\n            Edge2->NextInSEL = Edge1;\r\n            Edge1->PrevInSEL = Edge2;\r\n            Edge1->NextInSEL = Next;\r\n        } else if (Edge2->NextInSEL == Edge1) {\r\n            TEdge *Next = Edge1->NextInSEL;\r\n            if (Next) {\r\n                Next->PrevInSEL = Edge2;\r\n            }\r\n            TEdge *Prev = Edge2->PrevInSEL;\r\n            if (Prev) {\r\n                Prev->NextInSEL = Edge1;\r\n            }\r\n            Edge1->PrevInSEL = Prev;\r\n            Edge1->NextInSEL = Edge2;\r\n            Edge2->PrevInSEL = Edge1;\r\n            Edge2->NextInSEL = Next;\r\n        } else {\r\n            TEdge *Next = Edge1->NextInSEL;\r\n            TEdge *Prev = Edge1->PrevInSEL;\r\n            Edge1->NextInSEL = Edge2->NextInSEL;\r\n            if (Edge1->NextInSEL) {\r\n                Edge1->NextInSEL->PrevInSEL = Edge1;\r\n            }\r\n            Edge1->PrevInSEL = Edge2->PrevInSEL;\r\n            if (Edge1->PrevInSEL) {\r\n                Edge1->PrevInSEL->NextInSEL = Edge1;\r\n            }\r\n            Edge2->NextInSEL = Next;\r\n            if (Edge2->NextInSEL) {\r\n                Edge2->NextInSEL->PrevInSEL = Edge2;\r\n            }\r\n            Edge2->PrevInSEL = Prev;\r\n            if (Edge2->PrevInSEL) {\r\n                Edge2->PrevInSEL->NextInSEL = Edge2;\r\n            }\r\n        }\r\n\r\n        if (!Edge1->PrevInSEL) {\r\n            m_SortedEdges = Edge1;\r\n        } else if (!Edge2->PrevInSEL) {\r\n            m_SortedEdges = Edge2;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    TEdge *GetNextInAEL(TEdge *e, Direction dir) {\r\n        return dir == dLeftToRight ? e->NextInAEL : e->PrevInAEL;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void GetHorzDirection(TEdge &HorzEdge, Direction &Dir, cInt &Left, cInt &Right) {\r\n        if (HorzEdge.Bot.X < HorzEdge.Top.X) {\r\n            Left = HorzEdge.Bot.X;\r\n            Right = HorzEdge.Top.X;\r\n            Dir = dLeftToRight;\r\n        } else {\r\n            Left = HorzEdge.Top.X;\r\n            Right = HorzEdge.Bot.X;\r\n            Dir = dRightToLeft;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------\r\n\r\n/*******************************************************************************\r\n* Notes: Horizontal edges (HEs) at scanline intersections (ie at the Top or    *\r\n* Bottom of a scanbeam) are processed as if layered. The order in which HEs    *\r\n* are processed doesn't matter. HEs intersect with other HE Bot.Xs only [#]    *\r\n* (or they could intersect with Top.Xs only, ie EITHER Bot.Xs OR Top.Xs),      *\r\n* and with other non-horizontal edges [*]. Once these intersections are        *\r\n* processed, intermediate HEs then 'promote' the Edge above (NextInLML) into   *\r\n* the AEL. These 'promoted' edges may in turn intersect [%] with other HEs.    *\r\n*******************************************************************************/\r\n\r\n    void Clipper::ProcessHorizontal(TEdge *horzEdge, bool isTopOfScanbeam) {\r\n        Direction dir;\r\n        cInt horzLeft, horzRight;\r\n\r\n        GetHorzDirection(*horzEdge, dir, horzLeft, horzRight);\r\n\r\n        TEdge *eLastHorz = horzEdge, *eMaxPair = 0;\r\n        while (eLastHorz->NextInLML && IsHorizontal(*eLastHorz->NextInLML)) {\r\n            eLastHorz = eLastHorz->NextInLML;\r\n        }\r\n        if (!eLastHorz->NextInLML) {\r\n            eMaxPair = GetMaximaPair(eLastHorz);\r\n        }\r\n\r\n        for (; ;) {\r\n            bool IsLastHorz = (horzEdge == eLastHorz);\r\n            TEdge *e = GetNextInAEL(horzEdge, dir);\r\n            while (e) {\r\n                //Break if we've got to the end of an intermediate horizontal edge ...\r\n                //nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal.\r\n                if (e->Curr.X == horzEdge->Top.X && horzEdge->NextInLML && e->Dx < horzEdge->NextInLML->Dx) {\r\n                    break;\r\n                }\r\n\r\n                TEdge *eNext = GetNextInAEL(e, dir); //saves eNext for later\r\n\r\n                if ((dir == dLeftToRight && e->Curr.X <= horzRight) || (dir == dRightToLeft && e->Curr.X >= horzLeft)) {\r\n                    //so far we're still in range of the horizontal Edge  but make sure\r\n                    //we're at the last of consec. horizontals when matching with eMaxPair\r\n                    if (e == eMaxPair && IsLastHorz) {\r\n\r\n                        if (horzEdge->OutIdx >= 0) {\r\n                            OutPt *op1 = AddOutPt(horzEdge, horzEdge->Top);\r\n                            TEdge *eNextHorz = m_SortedEdges;\r\n                            while (eNextHorz) {\r\n                                if (eNextHorz->OutIdx >= 0 && HorzSegmentsOverlap(\r\n                                        horzEdge->Bot.X,\r\n                                        horzEdge->Top.X,\r\n                                        eNextHorz->Bot.X,\r\n                                        eNextHorz->Top.X\r\n                                )) {\r\n                                    OutPt *op2 = AddOutPt(eNextHorz, eNextHorz->Bot);\r\n                                    AddJoin(op2, op1, eNextHorz->Top);\r\n                                }\r\n                                eNextHorz = eNextHorz->NextInSEL;\r\n                            }\r\n                            AddGhostJoin(op1, horzEdge->Bot);\r\n                            AddLocalMaxPoly(horzEdge, eMaxPair, horzEdge->Top);\r\n                        }\r\n                        DeleteFromAEL(horzEdge);\r\n                        DeleteFromAEL(eMaxPair);\r\n                        return;\r\n                    } else if (dir == dLeftToRight) {\r\n                        IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y);\r\n                        IntersectEdges(horzEdge, e, Pt);\r\n                    } else {\r\n                        IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y);\r\n                        IntersectEdges(e, horzEdge, Pt);\r\n                    }\r\n                    SwapPositionsInAEL(horzEdge, e);\r\n                } else if ((dir == dLeftToRight && e->Curr.X >= horzRight) || (dir == dRightToLeft && e->Curr.X <= horzLeft)) {\r\n                    break;\r\n                }\r\n                e = eNext;\r\n            } //end while\r\n\r\n            if (horzEdge->NextInLML && IsHorizontal(*horzEdge->NextInLML)) {\r\n                UpdateEdgeIntoAEL(horzEdge);\r\n                if (horzEdge->OutIdx >= 0) {\r\n                    AddOutPt(horzEdge, horzEdge->Bot);\r\n                }\r\n                GetHorzDirection(*horzEdge, dir, horzLeft, horzRight);\r\n            } else {\r\n                break;\r\n            }\r\n        } //end for (;;)\r\n\r\n        if (horzEdge->NextInLML) {\r\n            if (horzEdge->OutIdx >= 0) {\r\n                OutPt *op1 = AddOutPt(horzEdge, horzEdge->Top);\r\n                if (isTopOfScanbeam) {\r\n                    AddGhostJoin(op1, horzEdge->Bot);\r\n                }\r\n                UpdateEdgeIntoAEL(horzEdge);\r\n                if (horzEdge->WindDelta == 0) {\r\n                    return;\r\n                }\r\n                //nb: HorzEdge is no longer horizontal here\r\n                TEdge *ePrev = horzEdge->PrevInAEL;\r\n                TEdge *eNext = horzEdge->NextInAEL;\r\n                if (ePrev && ePrev->Curr.X == horzEdge->Bot.X && ePrev->Curr.Y == horzEdge->Bot.Y && ePrev->WindDelta != 0 && (ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y && SlopesEqual(\r\n                        *horzEdge,\r\n                        *ePrev,\r\n                        m_UseFullRange\r\n                ))) {\r\n                    OutPt *op2 = AddOutPt(ePrev, horzEdge->Bot);\r\n                    AddJoin(op1, op2, horzEdge->Top);\r\n                } else if (eNext && eNext->Curr.X == horzEdge->Bot.X && eNext->Curr.Y == horzEdge->Bot.Y && eNext->WindDelta != 0 && eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y && SlopesEqual(\r\n                        *horzEdge,\r\n                        *eNext,\r\n                        m_UseFullRange\r\n                )) {\r\n                    OutPt *op2 = AddOutPt(eNext, horzEdge->Bot);\r\n                    AddJoin(op1, op2, horzEdge->Top);\r\n                }\r\n            } else {\r\n                UpdateEdgeIntoAEL(horzEdge);\r\n            }\r\n        } else {\r\n            if (horzEdge->OutIdx >= 0) {\r\n                AddOutPt(horzEdge, horzEdge->Top);\r\n            }\r\n            DeleteFromAEL(horzEdge);\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::UpdateEdgeIntoAEL(TEdge *&e) {\r\n        if (!e->NextInLML) {\r\n            throw\r\n                    clipperException(\"UpdateEdgeIntoAEL: invalid call\");\r\n        }\r\n\r\n        e->NextInLML->OutIdx = e->OutIdx;\r\n        TEdge *AelPrev = e->PrevInAEL;\r\n        TEdge *AelNext = e->NextInAEL;\r\n        if (AelPrev) {\r\n            AelPrev->NextInAEL = e->NextInLML;\r\n        } else {\r\n            m_ActiveEdges = e->NextInLML;\r\n        }\r\n        if (AelNext) {\r\n            AelNext->PrevInAEL = e->NextInLML;\r\n        }\r\n        e->NextInLML->Side = e->Side;\r\n        e->NextInLML->WindDelta = e->WindDelta;\r\n        e->NextInLML->WindCnt = e->WindCnt;\r\n        e->NextInLML->WindCnt2 = e->WindCnt2;\r\n        e = e->NextInLML;\r\n        e->Curr = e->Bot;\r\n        e->PrevInAEL = AelPrev;\r\n        e->NextInAEL = AelNext;\r\n        if (!IsHorizontal(*e)) {\r\n            InsertScanbeam(e->Top.Y);\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool Clipper::ProcessIntersections(const cInt topY) {\r\n        if (!m_ActiveEdges) {\r\n            return true;\r\n        }\r\n        try {\r\n            BuildIntersectList(topY);\r\n            size_t IlSize = m_IntersectList.size();\r\n            if (IlSize == 0) {\r\n                return true;\r\n            }\r\n            if (IlSize == 1 || FixupIntersectionOrder()) {\r\n                ProcessIntersectList();\r\n            } else {\r\n                return false;\r\n            }\r\n        } catch (...) {\r\n            m_SortedEdges = 0;\r\n            DisposeIntersectNodes();\r\n            throw clipperException(\"ProcessIntersections error\");\r\n        }\r\n        m_SortedEdges = 0;\r\n        return true;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::DisposeIntersectNodes() {\r\n        for (size_t i = 0; i < m_IntersectList.size(); ++i) {\r\n            delete m_IntersectList[i];\r\n        }\r\n        m_IntersectList.clear();\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::BuildIntersectList(const cInt topY) {\r\n        if (!m_ActiveEdges) {\r\n            return;\r\n        }\r\n\r\n        //prepare for sorting ...\r\n        TEdge *e = m_ActiveEdges;\r\n        m_SortedEdges = e;\r\n        while (e) {\r\n            e->PrevInSEL = e->PrevInAEL;\r\n            e->NextInSEL = e->NextInAEL;\r\n            e->Curr.X = TopX(*e, topY);\r\n            e = e->NextInAEL;\r\n        }\r\n\r\n        //bubblesort ...\r\n        bool isModified;\r\n        do {\r\n            isModified = false;\r\n            e = m_SortedEdges;\r\n            while (e->NextInSEL) {\r\n                TEdge *eNext = e->NextInSEL;\r\n                IntPoint Pt;\r\n                if (e->Curr.X > eNext->Curr.X) {\r\n                    IntersectPoint(*e, *eNext, Pt);\r\n                    IntersectNode *newNode = new IntersectNode;\r\n                    newNode->Edge1 = e;\r\n                    newNode->Edge2 = eNext;\r\n                    newNode->Pt = Pt;\r\n                    m_IntersectList.push_back(newNode);\r\n\r\n                    SwapPositionsInSEL(e, eNext);\r\n                    isModified = true;\r\n                } else {\r\n                    e = eNext;\r\n                }\r\n            }\r\n            if (e->PrevInSEL) {\r\n                e->PrevInSEL->NextInSEL = 0;\r\n            } else {\r\n                break;\r\n            }\r\n        } while (isModified);\r\n        m_SortedEdges = 0; //important\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n\r\n    void Clipper::ProcessIntersectList() {\r\n        for (size_t i = 0; i < m_IntersectList.size(); ++i) {\r\n            IntersectNode *iNode = m_IntersectList[i];\r\n            {\r\n                IntersectEdges(iNode->Edge1, iNode->Edge2, iNode->Pt);\r\n                SwapPositionsInAEL(iNode->Edge1, iNode->Edge2);\r\n            }\r\n            delete iNode;\r\n        }\r\n        m_IntersectList.clear();\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool IntersectListSort(IntersectNode *node1, IntersectNode *node2) {\r\n        return node2->Pt.Y < node1->Pt.Y;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    inline bool EdgesAdjacent(const IntersectNode &inode) {\r\n        return (inode.Edge1->NextInSEL == inode.Edge2) || (inode.Edge1->PrevInSEL == inode.Edge2);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool Clipper::FixupIntersectionOrder() {\r\n        //pre-condition: intersections are sorted Bottom-most first.\r\n        //Now it's crucial that intersections are made only between adjacent edges,\r\n        //so to ensure this the order of intersections may need adjusting ...\r\n        CopyAELToSEL();\r\n        std::sort(m_IntersectList.begin(), m_IntersectList.end(), IntersectListSort);\r\n        size_t cnt = m_IntersectList.size();\r\n        for (size_t i = 0; i < cnt; ++i) {\r\n            if (!EdgesAdjacent(*m_IntersectList[i])) {\r\n                size_t j = i + 1;\r\n                while (j < cnt && !EdgesAdjacent(*m_IntersectList[j])) {\r\n                    j++;\r\n                }\r\n                if (j == cnt) {\r\n                    return false;\r\n                }\r\n                std::swap(m_IntersectList[i], m_IntersectList[j]);\r\n            }\r\n            SwapPositionsInSEL(m_IntersectList[i]->Edge1, m_IntersectList[i]->Edge2);\r\n        }\r\n        return true;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::DoMaxima(TEdge *e) {\r\n        TEdge *eMaxPair = GetMaximaPair(e);\r\n        if (!eMaxPair) {\r\n            if (e->OutIdx >= 0) {\r\n                AddOutPt(e, e->Top);\r\n            }\r\n            DeleteFromAEL(e);\r\n            return;\r\n        }\r\n\r\n        TEdge *eNext = e->NextInAEL;\r\n        while (eNext && eNext != eMaxPair) {\r\n            IntersectEdges(e, eNext, e->Top);\r\n            SwapPositionsInAEL(e, eNext);\r\n            eNext = e->NextInAEL;\r\n        }\r\n\r\n        if (e->OutIdx == Unassigned && eMaxPair->OutIdx == Unassigned) {\r\n            DeleteFromAEL(e);\r\n            DeleteFromAEL(eMaxPair);\r\n        } else if (e->OutIdx >= 0 && eMaxPair->OutIdx >= 0) {\r\n            if (e->OutIdx >= 0) {\r\n                AddLocalMaxPoly(e, eMaxPair, e->Top);\r\n            }\r\n            DeleteFromAEL(e);\r\n            DeleteFromAEL(eMaxPair);\r\n        }\r\n#ifdef use_lines\r\n  else if (e->WindDelta == 0)\r\n  {\r\n    if (e->OutIdx >= 0) \r\n    {\r\n      AddOutPt(e, e->Top);\r\n      e->OutIdx = Unassigned;\r\n    }\r\n    DeleteFromAEL(e);\r\n\r\n    if (eMaxPair->OutIdx >= 0)\r\n    {\r\n      AddOutPt(eMaxPair, e->Top);\r\n      eMaxPair->OutIdx = Unassigned;\r\n    }\r\n    DeleteFromAEL(eMaxPair);\r\n  } \r\n#endif\r\n        else {\r\n            throw clipperException(\"DoMaxima error\");\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY) {\r\n        TEdge *e = m_ActiveEdges;\r\n        while (e) {\r\n            //1. process maxima, treating them as if they're 'bent' horizontal edges,\r\n            //   but exclude maxima with horizontal edges. nb: e can't be a horizontal.\r\n            bool IsMaximaEdge = IsMaxima(e, topY);\r\n\r\n            if (IsMaximaEdge) {\r\n                TEdge *eMaxPair = GetMaximaPair(e);\r\n                IsMaximaEdge = (!eMaxPair || !IsHorizontal(*eMaxPair));\r\n            }\r\n\r\n            if (IsMaximaEdge) {\r\n                TEdge *ePrev = e->PrevInAEL;\r\n                DoMaxima(e);\r\n                if (!ePrev) {\r\n                    e = m_ActiveEdges;\r\n                } else {\r\n                    e = ePrev->NextInAEL;\r\n                }\r\n            } else {\r\n                //2. promote horizontal edges, otherwise update Curr.X and Curr.Y ...\r\n                if (IsIntermediate(e, topY) && IsHorizontal(*e->NextInLML)) {\r\n                    UpdateEdgeIntoAEL(e);\r\n                    if (e->OutIdx >= 0) {\r\n                        AddOutPt(e, e->Bot);\r\n                    }\r\n                    AddEdgeToSEL(e);\r\n                } else {\r\n                    e->Curr.X = TopX(*e, topY);\r\n                    e->Curr.Y = topY;\r\n                }\r\n\r\n                if (m_StrictSimple) {\r\n                    TEdge *ePrev = e->PrevInAEL;\r\n                    if ((e->OutIdx >= 0) && (e->WindDelta != 0) && ePrev && (ePrev->OutIdx >= 0) && (ePrev->Curr.X == e->Curr.X) && (ePrev->WindDelta != 0)) {\r\n                        IntPoint pt = e->Curr;\r\n#ifdef use_xyz\r\n          SetZ(pt, *ePrev, *e);\r\n#endif\r\n                        OutPt *op = AddOutPt(ePrev, pt);\r\n                        OutPt *op2 = AddOutPt(e, pt);\r\n                        AddJoin(op, op2, pt); //StrictlySimple (type-3) join\r\n                    }\r\n                }\r\n\r\n                e = e->NextInAEL;\r\n            }\r\n        }\r\n\r\n        //3. Process horizontals at the Top of the scanbeam ...\r\n        ProcessHorizontals(true);\r\n\r\n        //4. Promote intermediate vertices ...\r\n        e = m_ActiveEdges;\r\n        while (e) {\r\n            if (IsIntermediate(e, topY)) {\r\n                OutPt *op = 0;\r\n                if (e->OutIdx >= 0) {\r\n                    op = AddOutPt(e, e->Top);\r\n                }\r\n                UpdateEdgeIntoAEL(e);\r\n\r\n                //if output polygons share an edge, they'll need joining later ...\r\n                TEdge *ePrev = e->PrevInAEL;\r\n                TEdge *eNext = e->NextInAEL;\r\n                if (ePrev && ePrev->Curr.X == e->Bot.X && ePrev->Curr.Y == e->Bot.Y && op && ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y && SlopesEqual(\r\n                        *e,\r\n                        *ePrev,\r\n                        m_UseFullRange\r\n                ) && (e->WindDelta != 0) && (ePrev->WindDelta != 0)) {\r\n                    OutPt *op2 = AddOutPt(ePrev, e->Bot);\r\n                    AddJoin(op, op2, e->Top);\r\n                } else if (eNext && eNext->Curr.X == e->Bot.X && eNext->Curr.Y == e->Bot.Y && op && eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y && SlopesEqual(\r\n                        *e,\r\n                        *eNext,\r\n                        m_UseFullRange\r\n                ) && (e->WindDelta != 0) && (eNext->WindDelta != 0)) {\r\n                    OutPt *op2 = AddOutPt(eNext, e->Bot);\r\n                    AddJoin(op, op2, e->Top);\r\n                }\r\n            }\r\n            e = e->NextInAEL;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::FixupOutPolygon(OutRec &outrec) {\r\n        //FixupOutPolygon() - removes duplicate points and simplifies consecutive\r\n        //parallel edges by removing the middle vertex.\r\n        OutPt *lastOK = 0;\r\n        outrec.BottomPt = 0;\r\n        OutPt *pp = outrec.Pts;\r\n\r\n        for (; ;) {\r\n            if (pp->Prev == pp || pp->Prev == pp->Next) {\r\n                DisposeOutPts(pp);\r\n                outrec.Pts = 0;\r\n                return;\r\n            }\r\n\r\n            //test for duplicate points and collinear edges ...\r\n            if ((pp->Pt == pp->Next->Pt) || (pp->Pt == pp->Prev->Pt) || (SlopesEqual(\r\n                    pp->Prev->Pt,\r\n                    pp->Pt,\r\n                    pp->Next->Pt,\r\n                    m_UseFullRange\r\n            ) && (!m_PreserveCollinear || !Pt2IsBetweenPt1AndPt3(pp->Prev->Pt, pp->Pt, pp->Next->Pt)))) {\r\n                lastOK = 0;\r\n                OutPt *tmp = pp;\r\n                pp->Prev->Next = pp->Next;\r\n                pp->Next->Prev = pp->Prev;\r\n                pp = pp->Prev;\r\n                delete tmp;\r\n            } else if (pp == lastOK) {\r\n                break;\r\n            } else {\r\n                if (!lastOK) {\r\n                    lastOK = pp;\r\n                }\r\n                pp = pp->Next;\r\n            }\r\n        }\r\n        outrec.Pts = pp;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    int PointCount(OutPt *Pts) {\r\n        if (!Pts) {\r\n            return 0;\r\n        }\r\n        int result = 0;\r\n        OutPt *p = Pts;\r\n        do {\r\n            result++;\r\n            p = p->Next;\r\n        } while (p != Pts);\r\n        return result;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::BuildResult(Paths &polys) {\r\n        polys.reserve(m_PolyOuts.size());\r\n        for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) {\r\n            if (!m_PolyOuts[i]->Pts) {\r\n                continue;\r\n            }\r\n            Path pg;\r\n            OutPt *p = m_PolyOuts[i]->Pts->Prev;\r\n            int cnt = PointCount(p);\r\n            if (cnt < 2) {\r\n                continue;\r\n            }\r\n            pg.reserve(cnt);\r\n            for (int i = 0; i < cnt; ++i) {\r\n                pg.push_back(p->Pt);\r\n                p = p->Prev;\r\n            }\r\n            polys.push_back(pg);\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::BuildResult2(PolyTree &polytree) {\r\n        polytree.Clear();\r\n        polytree.AllNodes.reserve(m_PolyOuts.size());\r\n        //add each output polygon/contour to polytree ...\r\n        for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) {\r\n            OutRec *outRec = m_PolyOuts[i];\r\n            int cnt = PointCount(outRec->Pts);\r\n            if ((outRec->IsOpen && cnt < 2) || (!outRec->IsOpen && cnt < 3)) {\r\n                continue;\r\n            }\r\n            FixHoleLinkage(*outRec);\r\n            PolyNode *pn = new PolyNode();\r\n            //nb: polytree takes ownership of all the PolyNodes\r\n            polytree.AllNodes.push_back(pn);\r\n            outRec->PolyNd = pn;\r\n            pn->Parent = 0;\r\n            pn->Index = 0;\r\n            pn->Contour.reserve(cnt);\r\n            OutPt *op = outRec->Pts->Prev;\r\n            for (int j = 0; j < cnt; j++) {\r\n                pn->Contour.push_back(op->Pt);\r\n                op = op->Prev;\r\n            }\r\n        }\r\n\r\n        //fixup PolyNode links etc ...\r\n        polytree.Childs.reserve(m_PolyOuts.size());\r\n        for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) {\r\n            OutRec *outRec = m_PolyOuts[i];\r\n            if (!outRec->PolyNd) {\r\n                continue;\r\n            }\r\n            if (outRec->IsOpen) {\r\n                outRec->PolyNd->m_IsOpen = true;\r\n                polytree.AddChild(*outRec->PolyNd);\r\n            } else if (outRec->FirstLeft && outRec->FirstLeft->PolyNd) {\r\n                outRec->FirstLeft->PolyNd->AddChild(*outRec->PolyNd);\r\n            } else {\r\n                polytree.AddChild(*outRec->PolyNd);\r\n            }\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void SwapIntersectNodes(IntersectNode &int1, IntersectNode &int2) {\r\n        //just swap the contents (because fIntersectNodes is a single-linked-list)\r\n        IntersectNode inode = int1; //gets a copy of Int1\r\n        int1.Edge1 = int2.Edge1;\r\n        int1.Edge2 = int2.Edge2;\r\n        int1.Pt = int2.Pt;\r\n        int2.Edge1 = inode.Edge1;\r\n        int2.Edge2 = inode.Edge2;\r\n        int2.Pt = inode.Pt;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    inline bool E2InsertsBeforeE1(TEdge &e1, TEdge &e2) {\r\n        if (e2.Curr.X == e1.Curr.X) {\r\n            if (e2.Top.Y > e1.Top.Y) {\r\n                return e2.Top.X < TopX(e1, e2.Top.Y);\r\n            } else {\r\n                return e1.Top.X > TopX(e2, e1.Top.Y);\r\n            }\r\n        } else {\r\n            return e2.Curr.X < e1.Curr.X;\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool GetOverlap(const cInt a1, const cInt a2, const cInt b1, const cInt b2, cInt &Left, cInt &Right) {\r\n        if (a1 < a2) {\r\n            if (b1 < b2) {\r\n                Left = std::max(a1, b1);\r\n                Right = std::min(a2, b2);\r\n            } else {\r\n                Left = std::max(a1, b2);\r\n                Right = std::min(a2, b1);\r\n            }\r\n        } else {\r\n            if (b1 < b2) {\r\n                Left = std::max(a2, b1);\r\n                Right = std::min(a1, b2);\r\n            } else {\r\n                Left = std::max(a2, b2);\r\n                Right = std::min(a1, b1);\r\n            }\r\n        }\r\n        return Left < Right;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    inline void UpdateOutPtIdxs(OutRec &outrec) {\r\n        OutPt *op = outrec.Pts;\r\n        do {\r\n            op->Idx = outrec.Idx;\r\n            op = op->Prev;\r\n        } while (op != outrec.Pts);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::InsertEdgeIntoAEL(TEdge *edge, TEdge *startEdge) {\r\n        if (!m_ActiveEdges) {\r\n            edge->PrevInAEL = 0;\r\n            edge->NextInAEL = 0;\r\n            m_ActiveEdges = edge;\r\n        } else if (!startEdge && E2InsertsBeforeE1(*m_ActiveEdges, *edge)) {\r\n            edge->PrevInAEL = 0;\r\n            edge->NextInAEL = m_ActiveEdges;\r\n            m_ActiveEdges->PrevInAEL = edge;\r\n            m_ActiveEdges = edge;\r\n        } else {\r\n            if (!startEdge) {\r\n                startEdge = m_ActiveEdges;\r\n            }\r\n            while (startEdge->NextInAEL && !E2InsertsBeforeE1(*startEdge->NextInAEL, *edge)) {\r\n                startEdge = startEdge->NextInAEL;\r\n            }\r\n            edge->NextInAEL = startEdge->NextInAEL;\r\n            if (startEdge->NextInAEL) {\r\n                startEdge->NextInAEL->PrevInAEL = edge;\r\n            }\r\n            edge->PrevInAEL = startEdge;\r\n            startEdge->NextInAEL = edge;\r\n        }\r\n    }\r\n//----------------------------------------------------------------------\r\n\r\n    OutPt *DupOutPt(OutPt *outPt, bool InsertAfter) {\r\n        OutPt *result = new OutPt;\r\n        result->Pt = outPt->Pt;\r\n        result->Idx = outPt->Idx;\r\n        if (InsertAfter) {\r\n            result->Next = outPt->Next;\r\n            result->Prev = outPt;\r\n            outPt->Next->Prev = result;\r\n            outPt->Next = result;\r\n        } else {\r\n            result->Prev = outPt->Prev;\r\n            result->Next = outPt;\r\n            outPt->Prev->Next = result;\r\n            outPt->Prev = result;\r\n        }\r\n        return result;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool JoinHorz(OutPt *op1, OutPt *op1b, OutPt *op2, OutPt *op2b, const IntPoint Pt, bool DiscardLeft) {\r\n        Direction Dir1 = (op1->Pt.X > op1b->Pt.X ? dRightToLeft : dLeftToRight);\r\n        Direction Dir2 = (op2->Pt.X > op2b->Pt.X ? dRightToLeft : dLeftToRight);\r\n        if (Dir1 == Dir2) {\r\n            return false;\r\n        }\r\n\r\n        //When DiscardLeft, we want Op1b to be on the Left of Op1, otherwise we\r\n        //want Op1b to be on the Right. (And likewise with Op2 and Op2b.)\r\n        //So, to facilitate this while inserting Op1b and Op2b ...\r\n        //when DiscardLeft, make sure we're AT or RIGHT of Pt before adding Op1b,\r\n        //otherwise make sure we're AT or LEFT of Pt. (Likewise with Op2b.)\r\n        if (Dir1 == dLeftToRight) {\r\n            while (op1->Next->Pt.X <= Pt.X && op1->Next->Pt.X >= op1->Pt.X && op1->Next->Pt.Y == Pt.Y) {\r\n                op1 = op1->Next;\r\n            }\r\n            if (DiscardLeft && (op1->Pt.X != Pt.X)) {\r\n                op1 = op1->Next;\r\n            }\r\n            op1b = DupOutPt(op1, !DiscardLeft);\r\n            if (op1b->Pt != Pt) {\r\n                op1 = op1b;\r\n                op1->Pt = Pt;\r\n                op1b = DupOutPt(op1, !DiscardLeft);\r\n            }\r\n        } else {\r\n            while (op1->Next->Pt.X >= Pt.X && op1->Next->Pt.X <= op1->Pt.X && op1->Next->Pt.Y == Pt.Y) {\r\n                op1 = op1->Next;\r\n            }\r\n            if (!DiscardLeft && (op1->Pt.X != Pt.X)) {\r\n                op1 = op1->Next;\r\n            }\r\n            op1b = DupOutPt(op1, DiscardLeft);\r\n            if (op1b->Pt != Pt) {\r\n                op1 = op1b;\r\n                op1->Pt = Pt;\r\n                op1b = DupOutPt(op1, DiscardLeft);\r\n            }\r\n        }\r\n\r\n        if (Dir2 == dLeftToRight) {\r\n            while (op2->Next->Pt.X <= Pt.X && op2->Next->Pt.X >= op2->Pt.X && op2->Next->Pt.Y == Pt.Y) {\r\n                op2 = op2->Next;\r\n            }\r\n            if (DiscardLeft && (op2->Pt.X != Pt.X)) {\r\n                op2 = op2->Next;\r\n            }\r\n            op2b = DupOutPt(op2, !DiscardLeft);\r\n            if (op2b->Pt != Pt) {\r\n                op2 = op2b;\r\n                op2->Pt = Pt;\r\n                op2b = DupOutPt(op2, !DiscardLeft);\r\n            };\r\n        } else {\r\n            while (op2->Next->Pt.X >= Pt.X && op2->Next->Pt.X <= op2->Pt.X && op2->Next->Pt.Y == Pt.Y) {\r\n                op2 = op2->Next;\r\n            }\r\n            if (!DiscardLeft && (op2->Pt.X != Pt.X)) {\r\n                op2 = op2->Next;\r\n            }\r\n            op2b = DupOutPt(op2, DiscardLeft);\r\n            if (op2b->Pt != Pt) {\r\n                op2 = op2b;\r\n                op2->Pt = Pt;\r\n                op2b = DupOutPt(op2, DiscardLeft);\r\n            };\r\n        };\r\n\r\n        if ((Dir1 == dLeftToRight) == DiscardLeft) {\r\n            op1->Prev = op2;\r\n            op2->Next = op1;\r\n            op1b->Next = op2b;\r\n            op2b->Prev = op1b;\r\n        } else {\r\n            op1->Next = op2;\r\n            op2->Prev = op1;\r\n            op1b->Prev = op2b;\r\n            op2b->Next = op1b;\r\n        }\r\n        return true;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool Clipper::JoinPoints(Join *j, OutRec *outRec1, OutRec *outRec2) {\r\n        OutPt *op1 = j->OutPt1, *op1b;\r\n        OutPt *op2 = j->OutPt2, *op2b;\r\n\r\n        //There are 3 kinds of joins for output polygons ...\r\n        //1. Horizontal joins where Join.OutPt1 & Join.OutPt2 are a vertices anywhere\r\n        //along (horizontal) collinear edges (& Join.OffPt is on the same horizontal).\r\n        //2. Non-horizontal joins where Join.OutPt1 & Join.OutPt2 are at the same\r\n        //location at the Bottom of the overlapping segment (& Join.OffPt is above).\r\n        //3. StrictSimple joins where edges touch but are not collinear and where\r\n        //Join.OutPt1, Join.OutPt2 & Join.OffPt all share the same point.\r\n        bool isHorizontal = (j->OutPt1->Pt.Y == j->OffPt.Y);\r\n\r\n        if (isHorizontal && (j->OffPt == j->OutPt1->Pt) && (j->OffPt == j->OutPt2->Pt)) {\r\n            //Strictly Simple join ...\r\n            if (outRec1 != outRec2) {\r\n                return false;\r\n            }\r\n            op1b = j->OutPt1->Next;\r\n            while (op1b != op1 && (op1b->Pt == j->OffPt)) {\r\n                op1b = op1b->Next;\r\n            }\r\n            bool reverse1 = (op1b->Pt.Y > j->OffPt.Y);\r\n            op2b = j->OutPt2->Next;\r\n            while (op2b != op2 && (op2b->Pt == j->OffPt)) {\r\n                op2b = op2b->Next;\r\n            }\r\n            bool reverse2 = (op2b->Pt.Y > j->OffPt.Y);\r\n            if (reverse1 == reverse2) {\r\n                return false;\r\n            }\r\n            if (reverse1) {\r\n                op1b = DupOutPt(op1, false);\r\n                op2b = DupOutPt(op2, true);\r\n                op1->Prev = op2;\r\n                op2->Next = op1;\r\n                op1b->Next = op2b;\r\n                op2b->Prev = op1b;\r\n                j->OutPt1 = op1;\r\n                j->OutPt2 = op1b;\r\n                return true;\r\n            } else {\r\n                op1b = DupOutPt(op1, true);\r\n                op2b = DupOutPt(op2, false);\r\n                op1->Next = op2;\r\n                op2->Prev = op1;\r\n                op1b->Prev = op2b;\r\n                op2b->Next = op1b;\r\n                j->OutPt1 = op1;\r\n                j->OutPt2 = op1b;\r\n                return true;\r\n            }\r\n        } else if (isHorizontal) {\r\n            //treat horizontal joins differently to non-horizontal joins since with\r\n            //them we're not yet sure where the overlapping is. OutPt1.Pt & OutPt2.Pt\r\n            //may be anywhere along the horizontal edge.\r\n            op1b = op1;\r\n            while (op1->Prev->Pt.Y == op1->Pt.Y && op1->Prev != op1b && op1->Prev != op2) {\r\n                op1 = op1->Prev;\r\n            }\r\n            while (op1b->Next->Pt.Y == op1b->Pt.Y && op1b->Next != op1 && op1b->Next != op2) {\r\n                op1b = op1b->Next;\r\n            }\r\n            if (op1b->Next == op1 || op1b->Next == op2) {\r\n                return false;\r\n            } //a flat 'polygon'\r\n\r\n            op2b = op2;\r\n            while (op2->Prev->Pt.Y == op2->Pt.Y && op2->Prev != op2b && op2->Prev != op1b) {\r\n                op2 = op2->Prev;\r\n            }\r\n            while (op2b->Next->Pt.Y == op2b->Pt.Y && op2b->Next != op2 && op2b->Next != op1) {\r\n                op2b = op2b->Next;\r\n            }\r\n            if (op2b->Next == op2 || op2b->Next == op1) {\r\n                return false;\r\n            } //a flat 'polygon'\r\n\r\n            cInt Left, Right;\r\n            //Op1 --> Op1b & Op2 --> Op2b are the extremites of the horizontal edges\r\n            if (!GetOverlap(op1->Pt.X, op1b->Pt.X, op2->Pt.X, op2b->Pt.X, Left, Right)) {\r\n                return false;\r\n            }\r\n\r\n            //DiscardLeftSide: when overlapping edges are joined, a spike will created\r\n            //which needs to be cleaned up. However, we don't want Op1 or Op2 caught up\r\n            //on the discard Side as either may still be needed for other joins ...\r\n            IntPoint Pt;\r\n            bool DiscardLeftSide;\r\n            if (op1->Pt.X >= Left && op1->Pt.X <= Right) {\r\n                Pt = op1->Pt;\r\n                DiscardLeftSide = (op1->Pt.X > op1b->Pt.X);\r\n            } else if (op2->Pt.X >= Left && op2->Pt.X <= Right) {\r\n                Pt = op2->Pt;\r\n                DiscardLeftSide = (op2->Pt.X > op2b->Pt.X);\r\n            } else if (op1b->Pt.X >= Left && op1b->Pt.X <= Right) {\r\n                Pt = op1b->Pt;\r\n                DiscardLeftSide = op1b->Pt.X > op1->Pt.X;\r\n            } else {\r\n                Pt = op2b->Pt;\r\n                DiscardLeftSide = (op2b->Pt.X > op2->Pt.X);\r\n            }\r\n            j->OutPt1 = op1;\r\n            j->OutPt2 = op2;\r\n            return JoinHorz(op1, op1b, op2, op2b, Pt, DiscardLeftSide);\r\n        } else {\r\n            //nb: For non-horizontal joins ...\r\n            //    1. Jr.OutPt1.Pt.Y == Jr.OutPt2.Pt.Y\r\n            //    2. Jr.OutPt1.Pt > Jr.OffPt.Y\r\n\r\n            //make sure the polygons are correctly oriented ...\r\n            op1b = op1->Next;\r\n            while ((op1b->Pt == op1->Pt) && (op1b != op1)) {\r\n                op1b = op1b->Next;\r\n            }\r\n            bool Reverse1 = ((op1b->Pt.Y > op1->Pt.Y) || !SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange));\r\n            if (Reverse1) {\r\n                op1b = op1->Prev;\r\n                while ((op1b->Pt == op1->Pt) && (op1b != op1)) {\r\n                    op1b = op1b->Prev;\r\n                }\r\n                if ((op1b->Pt.Y > op1->Pt.Y) || !SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange)) {\r\n                    return false;\r\n                }\r\n            };\r\n            op2b = op2->Next;\r\n            while ((op2b->Pt == op2->Pt) && (op2b != op2)) {\r\n                op2b = op2b->Next;\r\n            }\r\n            bool Reverse2 = ((op2b->Pt.Y > op2->Pt.Y) || !SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange));\r\n            if (Reverse2) {\r\n                op2b = op2->Prev;\r\n                while ((op2b->Pt == op2->Pt) && (op2b != op2)) {\r\n                    op2b = op2b->Prev;\r\n                }\r\n                if ((op2b->Pt.Y > op2->Pt.Y) || !SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange)) {\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            if ((op1b == op1) || (op2b == op2) || (op1b == op2b) || ((outRec1 == outRec2) && (Reverse1 == Reverse2))) {\r\n                return false;\r\n            }\r\n\r\n            if (Reverse1) {\r\n                op1b = DupOutPt(op1, false);\r\n                op2b = DupOutPt(op2, true);\r\n                op1->Prev = op2;\r\n                op2->Next = op1;\r\n                op1b->Next = op2b;\r\n                op2b->Prev = op1b;\r\n                j->OutPt1 = op1;\r\n                j->OutPt2 = op1b;\r\n                return true;\r\n            } else {\r\n                op1b = DupOutPt(op1, true);\r\n                op2b = DupOutPt(op2, false);\r\n                op1->Next = op2;\r\n                op2->Prev = op1;\r\n                op1b->Prev = op2b;\r\n                op2b->Next = op1b;\r\n                j->OutPt1 = op1;\r\n                j->OutPt2 = op1b;\r\n                return true;\r\n            }\r\n        }\r\n    }\r\n//----------------------------------------------------------------------\r\n\r\n    static OutRec *ParseFirstLeft(OutRec *FirstLeft) {\r\n        while (FirstLeft && !FirstLeft->Pts) {\r\n            FirstLeft = FirstLeft->FirstLeft;\r\n        }\r\n        return FirstLeft;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::FixupFirstLefts1(OutRec *OldOutRec, OutRec *NewOutRec) {\r\n        //tests if NewOutRec contains the polygon before reassigning FirstLeft\r\n        for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) {\r\n            OutRec *outRec = m_PolyOuts[i];\r\n            if (!outRec->Pts || !outRec->FirstLeft) {\r\n                continue;\r\n            }\r\n            OutRec *firstLeft = ParseFirstLeft(outRec->FirstLeft);\r\n            if (firstLeft == OldOutRec) {\r\n                if (Poly2ContainsPoly1(outRec->Pts, NewOutRec->Pts)) {\r\n                    outRec->FirstLeft = NewOutRec;\r\n                }\r\n            }\r\n        }\r\n    }\r\n//----------------------------------------------------------------------\r\n\r\n    void Clipper::FixupFirstLefts2(OutRec *OldOutRec, OutRec *NewOutRec) {\r\n        //reassigns FirstLeft WITHOUT testing if NewOutRec contains the polygon\r\n        for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) {\r\n            OutRec *outRec = m_PolyOuts[i];\r\n            if (outRec->FirstLeft == OldOutRec) {\r\n                outRec->FirstLeft = NewOutRec;\r\n            }\r\n        }\r\n    }\r\n//----------------------------------------------------------------------\r\n\r\n    void Clipper::JoinCommonEdges() {\r\n        for (JoinList::size_type i = 0; i < m_Joins.size(); i++) {\r\n            Join *join = m_Joins[i];\r\n\r\n            OutRec *outRec1 = GetOutRec(join->OutPt1->Idx);\r\n            OutRec *outRec2 = GetOutRec(join->OutPt2->Idx);\r\n\r\n            if (!outRec1->Pts || !outRec2->Pts) {\r\n                continue;\r\n            }\r\n\r\n            //get the polygon fragment with the correct hole state (FirstLeft)\r\n            //before calling JoinPoints() ...\r\n            OutRec *holeStateRec;\r\n            if (outRec1 == outRec2) {\r\n                holeStateRec = outRec1;\r\n            } else if (Param1RightOfParam2(outRec1, outRec2)) {\r\n                holeStateRec = outRec2;\r\n            } else if (Param1RightOfParam2(outRec2, outRec1)) {\r\n                holeStateRec = outRec1;\r\n            } else {\r\n                holeStateRec = GetLowermostRec(outRec1, outRec2);\r\n            }\r\n\r\n            if (!JoinPoints(join, outRec1, outRec2)) {\r\n                continue;\r\n            }\r\n\r\n            if (outRec1 == outRec2) {\r\n                //instead of joining two polygons, we've just created a new one by\r\n                //splitting one polygon into two.\r\n                outRec1->Pts = join->OutPt1;\r\n                outRec1->BottomPt = 0;\r\n                outRec2 = CreateOutRec();\r\n                outRec2->Pts = join->OutPt2;\r\n\r\n                //update all OutRec2.Pts Idx's ...\r\n                UpdateOutPtIdxs(*outRec2);\r\n\r\n                //We now need to check every OutRec.FirstLeft pointer. If it points\r\n                //to OutRec1 it may need to point to OutRec2 instead ...\r\n                if (m_UsingPolyTree) {\r\n                    for (PolyOutList::size_type j = 0; j < m_PolyOuts.size() - 1; j++) {\r\n                        OutRec *oRec = m_PolyOuts[j];\r\n                        if (!oRec->Pts || ParseFirstLeft(oRec->FirstLeft) != outRec1 || oRec->IsHole == outRec1->IsHole) {\r\n                            continue;\r\n                        }\r\n                        if (Poly2ContainsPoly1(oRec->Pts, join->OutPt2)) {\r\n                            oRec->FirstLeft = outRec2;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (Poly2ContainsPoly1(outRec2->Pts, outRec1->Pts)) {\r\n                    //outRec2 is contained by outRec1 ...\r\n                    outRec2->IsHole = !outRec1->IsHole;\r\n                    outRec2->FirstLeft = outRec1;\r\n\r\n                    //fixup FirstLeft pointers that may need reassigning to OutRec1\r\n                    if (m_UsingPolyTree) {\r\n                        FixupFirstLefts2(outRec2, outRec1);\r\n                    }\r\n\r\n                    if ((outRec2->IsHole ^ m_ReverseOutput) == (Area(*outRec2) > 0)) {\r\n                        ReversePolyPtLinks(outRec2->Pts);\r\n                    }\r\n\r\n                } else if (Poly2ContainsPoly1(outRec1->Pts, outRec2->Pts)) {\r\n                    //outRec1 is contained by outRec2 ...\r\n                    outRec2->IsHole = outRec1->IsHole;\r\n                    outRec1->IsHole = !outRec2->IsHole;\r\n                    outRec2->FirstLeft = outRec1->FirstLeft;\r\n                    outRec1->FirstLeft = outRec2;\r\n\r\n                    //fixup FirstLeft pointers that may need reassigning to OutRec1\r\n                    if (m_UsingPolyTree) {\r\n                        FixupFirstLefts2(outRec1, outRec2);\r\n                    }\r\n\r\n                    if ((outRec1->IsHole ^ m_ReverseOutput) == (Area(*outRec1) > 0)) {\r\n                        ReversePolyPtLinks(outRec1->Pts);\r\n                    }\r\n                } else {\r\n                    //the 2 polygons are completely separate ...\r\n                    outRec2->IsHole = outRec1->IsHole;\r\n                    outRec2->FirstLeft = outRec1->FirstLeft;\r\n\r\n                    //fixup FirstLeft pointers that may need reassigning to OutRec2\r\n                    if (m_UsingPolyTree) {\r\n                        FixupFirstLefts1(outRec1, outRec2);\r\n                    }\r\n                }\r\n\r\n            } else {\r\n                //joined 2 polygons together ...\r\n\r\n                outRec2->Pts = 0;\r\n                outRec2->BottomPt = 0;\r\n                outRec2->Idx = outRec1->Idx;\r\n\r\n                outRec1->IsHole = holeStateRec->IsHole;\r\n                if (holeStateRec == outRec2) {\r\n                    outRec1->FirstLeft = outRec2->FirstLeft;\r\n                }\r\n                outRec2->FirstLeft = outRec1;\r\n\r\n                //fixup FirstLeft pointers that may need reassigning to OutRec1\r\n                if (m_UsingPolyTree) {\r\n                    FixupFirstLefts2(outRec2, outRec1);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n//------------------------------------------------------------------------------\r\n// ClipperOffset support functions ...\r\n//------------------------------------------------------------------------------\r\n\r\n    DoublePoint GetUnitNormal(const IntPoint &pt1, const IntPoint &pt2) {\r\n        if (pt2.X == pt1.X && pt2.Y == pt1.Y) {\r\n            return DoublePoint(0, 0);\r\n        }\r\n\r\n        double Dx = (double) (pt2.X - pt1.X);\r\n        double dy = (double) (pt2.Y - pt1.Y);\r\n        double f = 1 * 1.0 / std::sqrt(Dx * Dx + dy * dy);\r\n        Dx *= f;\r\n        dy *= f;\r\n        return DoublePoint(dy, -Dx);\r\n    }\r\n\r\n//------------------------------------------------------------------------------\r\n// ClipperOffset class\r\n//------------------------------------------------------------------------------\r\n\r\n    ClipperOffset::ClipperOffset(double miterLimit, double arcTolerance) {\r\n        this->MiterLimit = miterLimit;\r\n        this->ArcTolerance = arcTolerance;\r\n        m_lowest.X = -1;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    ClipperOffset::~ClipperOffset() {\r\n        Clear();\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ClipperOffset::Clear() {\r\n        for (int i = 0; i < m_polyNodes.ChildCount(); ++i) {\r\n            delete m_polyNodes.Childs[i];\r\n        }\r\n        m_polyNodes.Childs.clear();\r\n        m_lowest.X = -1;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ClipperOffset::AddPath(const Path &path, JoinType joinType, EndType endType) {\r\n        int highI = (int) path.size() - 1;\r\n        if (highI < 0) {\r\n            return;\r\n        }\r\n        PolyNode *newNode = new PolyNode();\r\n        newNode->m_jointype = joinType;\r\n        newNode->m_endtype = endType;\r\n\r\n        //strip duplicate points from path and also get index to the lowest point ...\r\n        if (endType == etClosedLine || endType == etClosedPolygon) {\r\n            while (highI > 0 && path[0] == path[highI]) {\r\n                highI--;\r\n            }\r\n        }\r\n        newNode->Contour.reserve(highI + 1);\r\n        newNode->Contour.push_back(path[0]);\r\n        int j = 0, k = 0;\r\n        for (int i = 1; i <= highI; i++) {\r\n            if (newNode->Contour[j] != path[i]) {\r\n                j++;\r\n                newNode->Contour.push_back(path[i]);\r\n                if (path[i].Y > newNode->Contour[k].Y || (path[i].Y == newNode->Contour[k].Y && path[i].X < newNode->Contour[k].X)) {\r\n                    k = j;\r\n                }\r\n            }\r\n        }\r\n        if (endType == etClosedPolygon && j < 2) {\r\n            delete newNode;\r\n            return;\r\n        }\r\n        m_polyNodes.AddChild(*newNode);\r\n\r\n        //if this path's lowest pt is lower than all the others then update m_lowest\r\n        if (endType != etClosedPolygon) {\r\n            return;\r\n        }\r\n        if (m_lowest.X < 0) {\r\n            m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k);\r\n        } else {\r\n            IntPoint ip = m_polyNodes.Childs[(int) m_lowest.X]->Contour[(int) m_lowest.Y];\r\n            if (newNode->Contour[k].Y > ip.Y || (newNode->Contour[k].Y == ip.Y && newNode->Contour[k].X < ip.X)) {\r\n                m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k);\r\n            }\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ClipperOffset::AddPaths(const Paths &paths, JoinType joinType, EndType endType) {\r\n        for (Paths::size_type i = 0; i < paths.size(); ++i) {\r\n            AddPath(paths[i], joinType, endType);\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ClipperOffset::FixOrientations() {\r\n        //fixup orientations of all closed paths if the orientation of the\r\n        //closed path with the lowermost vertex is wrong ...\r\n        if (m_lowest.X >= 0 && !Orientation(m_polyNodes.Childs[(int) m_lowest.X]->Contour)) {\r\n            for (int i = 0; i < m_polyNodes.ChildCount(); ++i) {\r\n                PolyNode &node = *m_polyNodes.Childs[i];\r\n                if (node.m_endtype == etClosedPolygon || (node.m_endtype == etClosedLine && Orientation(node.Contour))) {\r\n                    ReversePath(node.Contour);\r\n                }\r\n            }\r\n        } else {\r\n            for (int i = 0; i < m_polyNodes.ChildCount(); ++i) {\r\n                PolyNode &node = *m_polyNodes.Childs[i];\r\n                if (node.m_endtype == etClosedLine && !Orientation(node.Contour)) {\r\n                    ReversePath(node.Contour);\r\n                }\r\n            }\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ClipperOffset::Execute(Paths &solution, double delta) {\r\n        solution.clear();\r\n        FixOrientations();\r\n        DoOffset(delta);\r\n\r\n        //now clean up 'corners' ...\r\n        Clipper clpr;\r\n        clpr.AddPaths(m_destPolys, ptSubject, true);\r\n        if (delta > 0) {\r\n            clpr.Execute(ctUnion, solution, pftPositive, pftPositive);\r\n        } else {\r\n            IntRect r = clpr.GetBounds();\r\n            Path outer(4);\r\n            outer[0] = IntPoint(r.left - 10, r.bottom + 10);\r\n            outer[1] = IntPoint(r.right + 10, r.bottom + 10);\r\n            outer[2] = IntPoint(r.right + 10, r.top - 10);\r\n            outer[3] = IntPoint(r.left - 10, r.top - 10);\r\n\r\n            clpr.AddPath(outer, ptSubject, true);\r\n            clpr.ReverseSolution(true);\r\n            clpr.Execute(ctUnion, solution, pftNegative, pftNegative);\r\n            if (solution.size() > 0) {\r\n                solution.erase(solution.begin());\r\n            }\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ClipperOffset::Execute(PolyTree &solution, double delta) {\r\n        solution.Clear();\r\n        FixOrientations();\r\n        DoOffset(delta);\r\n\r\n        //now clean up 'corners' ...\r\n        Clipper clpr;\r\n        clpr.AddPaths(m_destPolys, ptSubject, true);\r\n        if (delta > 0) {\r\n            clpr.Execute(ctUnion, solution, pftPositive, pftPositive);\r\n        } else {\r\n            IntRect r = clpr.GetBounds();\r\n            Path outer(4);\r\n            outer[0] = IntPoint(r.left - 10, r.bottom + 10);\r\n            outer[1] = IntPoint(r.right + 10, r.bottom + 10);\r\n            outer[2] = IntPoint(r.right + 10, r.top - 10);\r\n            outer[3] = IntPoint(r.left - 10, r.top - 10);\r\n\r\n            clpr.AddPath(outer, ptSubject, true);\r\n            clpr.ReverseSolution(true);\r\n            clpr.Execute(ctUnion, solution, pftNegative, pftNegative);\r\n            //remove the outer PolyNode rectangle ...\r\n            if (solution.ChildCount() == 1 && solution.Childs[0]->ChildCount() > 0) {\r\n                PolyNode *outerNode = solution.Childs[0];\r\n                solution.Childs.reserve(outerNode->ChildCount());\r\n                solution.Childs[0] = outerNode->Childs[0];\r\n                solution.Childs[0]->Parent = outerNode->Parent;\r\n                for (int i = 1; i < outerNode->ChildCount(); ++i) {\r\n                    solution.AddChild(*outerNode->Childs[i]);\r\n                }\r\n            } else {\r\n                solution.Clear();\r\n            }\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ClipperOffset::DoOffset(double delta) {\r\n        m_destPolys.clear();\r\n        m_delta = delta;\r\n\r\n        //if Zero offset, just copy any CLOSED polygons to m_p and return ...\r\n        if (NEAR_ZERO(delta)) {\r\n            m_destPolys.reserve(m_polyNodes.ChildCount());\r\n            for (int i = 0; i < m_polyNodes.ChildCount(); i++) {\r\n                PolyNode &node = *m_polyNodes.Childs[i];\r\n                if (node.m_endtype == etClosedPolygon) {\r\n                    m_destPolys.push_back(node.Contour);\r\n                }\r\n            }\r\n            return;\r\n        }\r\n\r\n        //see offset_triginometry3.svg in the documentation folder ...\r\n        if (MiterLimit > 2) {\r\n            m_miterLim = 2 / (MiterLimit * MiterLimit);\r\n        } else {\r\n            m_miterLim = 0.5;\r\n        }\r\n\r\n        double y;\r\n        if (ArcTolerance <= 0.0) {\r\n            y = def_arc_tolerance;\r\n        } else if (ArcTolerance > std::fabs(delta) * def_arc_tolerance) {\r\n            y = std::fabs(delta) * def_arc_tolerance;\r\n        } else {\r\n            y = ArcTolerance;\r\n        }\r\n        //see offset_triginometry2.svg in the documentation folder ...\r\n        double steps = pi / std::acos(1 - y / std::fabs(delta));\r\n        if (steps > std::fabs(delta) * pi) {\r\n            steps = std::fabs(delta) * pi;\r\n        }  //ie excessive precision check\r\n        m_sin = std::sin(two_pi / steps);\r\n        m_cos = std::cos(two_pi / steps);\r\n        m_StepsPerRad = steps / two_pi;\r\n        if (delta < 0.0) {\r\n            m_sin = -m_sin;\r\n        }\r\n\r\n        m_destPolys.reserve(m_polyNodes.ChildCount() * 2);\r\n        for (int i = 0; i < m_polyNodes.ChildCount(); i++) {\r\n            PolyNode &node = *m_polyNodes.Childs[i];\r\n            m_srcPoly = node.Contour;\r\n\r\n            int len = (int) m_srcPoly.size();\r\n            if (len == 0 || (delta <= 0 && (len < 3 || node.m_endtype != etClosedPolygon))) {\r\n                continue;\r\n            }\r\n\r\n            m_destPoly.clear();\r\n            if (len == 1) {\r\n                if (node.m_jointype == jtRound) {\r\n                    double X = 1.0, Y = 0.0;\r\n                    for (cInt j = 1; j <= steps; j++) {\r\n                        m_destPoly.push_back(\r\n                                IntPoint(\r\n                                        Round(m_srcPoly[0].X + X * delta),\r\n                                        Round(m_srcPoly[0].Y + Y * delta)\r\n                                )\r\n                        );\r\n                        double X2 = X;\r\n                        X = X * m_cos - m_sin * Y;\r\n                        Y = X2 * m_sin + Y * m_cos;\r\n                    }\r\n                } else {\r\n                    double X = -1.0, Y = -1.0;\r\n                    for (int j = 0; j < 4; ++j) {\r\n                        m_destPoly.push_back(\r\n                                IntPoint(\r\n                                        Round(m_srcPoly[0].X + X * delta),\r\n                                        Round(m_srcPoly[0].Y + Y * delta)\r\n                                )\r\n                        );\r\n                        if (X < 0) {\r\n                            X = 1;\r\n                        } else if (Y < 0) {\r\n                            Y = 1;\r\n                        } else {\r\n                            X = -1;\r\n                        }\r\n                    }\r\n                }\r\n                m_destPolys.push_back(m_destPoly);\r\n                continue;\r\n            }\r\n            //build m_normals ...\r\n            m_normals.clear();\r\n            m_normals.reserve(len);\r\n            for (int j = 0; j < len - 1; ++j) {\r\n                m_normals.push_back(GetUnitNormal(m_srcPoly[j], m_srcPoly[j + 1]));\r\n            }\r\n            if (node.m_endtype == etClosedLine || node.m_endtype == etClosedPolygon) {\r\n                m_normals.push_back(GetUnitNormal(m_srcPoly[len - 1], m_srcPoly[0]));\r\n            } else {\r\n                m_normals.push_back(DoublePoint(m_normals[len - 2]));\r\n            }\r\n\r\n            if (node.m_endtype == etClosedPolygon) {\r\n                int k = len - 1;\r\n                for (int j = 0; j < len; ++j) {\r\n                    OffsetPoint(j, k, node.m_jointype);\r\n                }\r\n                m_destPolys.push_back(m_destPoly);\r\n            } else if (node.m_endtype == etClosedLine) {\r\n                int k = len - 1;\r\n                for (int j = 0; j < len; ++j) {\r\n                    OffsetPoint(j, k, node.m_jointype);\r\n                }\r\n                m_destPolys.push_back(m_destPoly);\r\n                m_destPoly.clear();\r\n                //re-build m_normals ...\r\n                DoublePoint n = m_normals[len - 1];\r\n                for (int j = len - 1; j > 0; j--) {\r\n                    m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y);\r\n                }\r\n                m_normals[0] = DoublePoint(-n.X, -n.Y);\r\n                k = 0;\r\n                for (int j = len - 1; j >= 0; j--) {\r\n                    OffsetPoint(j, k, node.m_jointype);\r\n                }\r\n                m_destPolys.push_back(m_destPoly);\r\n            } else {\r\n                int k = 0;\r\n                for (int j = 1; j < len - 1; ++j) {\r\n                    OffsetPoint(j, k, node.m_jointype);\r\n                }\r\n\r\n                IntPoint pt1;\r\n                if (node.m_endtype == etOpenButt) {\r\n                    int j = len - 1;\r\n                    pt1 = IntPoint(\r\n                            (cInt) Round(m_srcPoly[j].X + m_normals[j].X * delta),\r\n                            (cInt) Round(m_srcPoly[j].Y + m_normals[j].Y * delta)\r\n                    );\r\n                    m_destPoly.push_back(pt1);\r\n                    pt1 = IntPoint(\r\n                            (cInt) Round(m_srcPoly[j].X - m_normals[j].X * delta),\r\n                            (cInt) Round(m_srcPoly[j].Y - m_normals[j].Y * delta)\r\n                    );\r\n                    m_destPoly.push_back(pt1);\r\n                } else {\r\n                    int j = len - 1;\r\n                    k = len - 2;\r\n                    m_sinA = 0;\r\n                    m_normals[j] = DoublePoint(-m_normals[j].X, -m_normals[j].Y);\r\n                    if (node.m_endtype == etOpenSquare) {\r\n                        DoSquare(j, k);\r\n                    } else {\r\n                        DoRound(j, k);\r\n                    }\r\n                }\r\n\r\n                //re-build m_normals ...\r\n                for (int j = len - 1; j > 0; j--) {\r\n                    m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y);\r\n                }\r\n                m_normals[0] = DoublePoint(-m_normals[1].X, -m_normals[1].Y);\r\n\r\n                k = len - 1;\r\n                for (int j = k - 1; j > 0; --j) {\r\n                    OffsetPoint(j, k, node.m_jointype);\r\n                }\r\n\r\n                if (node.m_endtype == etOpenButt) {\r\n                    pt1 = IntPoint(\r\n                            (cInt) Round(m_srcPoly[0].X - m_normals[0].X * delta),\r\n                            (cInt) Round(m_srcPoly[0].Y - m_normals[0].Y * delta)\r\n                    );\r\n                    m_destPoly.push_back(pt1);\r\n                    pt1 = IntPoint(\r\n                            (cInt) Round(m_srcPoly[0].X + m_normals[0].X * delta),\r\n                            (cInt) Round(m_srcPoly[0].Y + m_normals[0].Y * delta)\r\n                    );\r\n                    m_destPoly.push_back(pt1);\r\n                } else {\r\n                    k = 1;\r\n                    m_sinA = 0;\r\n                    if (node.m_endtype == etOpenSquare) {\r\n                        DoSquare(0, 1);\r\n                    } else {\r\n                        DoRound(0, 1);\r\n                    }\r\n                }\r\n                m_destPolys.push_back(m_destPoly);\r\n            }\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ClipperOffset::OffsetPoint(int j, int &k, JoinType jointype) {\r\n        //cross product ...\r\n        m_sinA = (m_normals[k].X * m_normals[j].Y - m_normals[j].X * m_normals[k].Y);\r\n        if (std::fabs(m_sinA * m_delta) < 1.0) {\r\n            //dot product ...\r\n            double cosA = (m_normals[k].X * m_normals[j].X + m_normals[j].Y * m_normals[k].Y);\r\n            if (cosA > 0) // angle => 0 degrees\r\n            {\r\n                m_destPoly.push_back(\r\n                        IntPoint(\r\n                                Round(m_srcPoly[j].X + m_normals[k].X * m_delta),\r\n                                Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta)\r\n                        )\r\n                );\r\n                return;\r\n            }\r\n            //else angle => 180 degrees   \r\n        } else if (m_sinA > 1.0) {\r\n            m_sinA = 1.0;\r\n        } else if (m_sinA < -1.0) {\r\n            m_sinA = -1.0;\r\n        }\r\n\r\n        if (m_sinA * m_delta < 0) {\r\n            m_destPoly.push_back(\r\n                    IntPoint(\r\n                            Round(m_srcPoly[j].X + m_normals[k].X * m_delta),\r\n                            Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta)\r\n                    )\r\n            );\r\n            m_destPoly.push_back(m_srcPoly[j]);\r\n            m_destPoly.push_back(\r\n                    IntPoint(\r\n                            Round(m_srcPoly[j].X + m_normals[j].X * m_delta),\r\n                            Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta)\r\n                    )\r\n            );\r\n        } else {\r\n            switch (jointype) {\r\n                case jtMiter: {\r\n                    double r = 1 + (m_normals[j].X * m_normals[k].X + m_normals[j].Y * m_normals[k].Y);\r\n                    if (r >= m_miterLim) {\r\n                        DoMiter(j, k, r);\r\n                    } else {\r\n                        DoSquare(j, k);\r\n                    }\r\n                    break;\r\n                }\r\n                case jtSquare:\r\n                    DoSquare(j, k);\r\n                    break;\r\n                case jtRound:\r\n                    DoRound(j, k);\r\n                    break;\r\n            }\r\n        }\r\n        k = j;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ClipperOffset::DoSquare(int j, int k) {\r\n        double dx = std::tan(std::atan2(m_sinA, m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y) / 4);\r\n        m_destPoly.push_back(\r\n                IntPoint(\r\n                        Round(m_srcPoly[j].X + m_delta * (m_normals[k].X - m_normals[k].Y * dx)),\r\n                        Round(m_srcPoly[j].Y + m_delta * (m_normals[k].Y + m_normals[k].X * dx))\r\n                )\r\n        );\r\n        m_destPoly.push_back(\r\n                IntPoint(\r\n                        Round(m_srcPoly[j].X + m_delta * (m_normals[j].X + m_normals[j].Y * dx)),\r\n                        Round(m_srcPoly[j].Y + m_delta * (m_normals[j].Y - m_normals[j].X * dx))\r\n                )\r\n        );\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ClipperOffset::DoMiter(int j, int k, double r) {\r\n        double q = m_delta / r;\r\n        m_destPoly.push_back(\r\n                IntPoint(\r\n                        Round(m_srcPoly[j].X + (m_normals[k].X + m_normals[j].X) * q),\r\n                        Round(m_srcPoly[j].Y + (m_normals[k].Y + m_normals[j].Y) * q)\r\n                )\r\n        );\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ClipperOffset::DoRound(int j, int k) {\r\n        double a = std::atan2(m_sinA, m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y);\r\n        int steps = std::max((int) Round(m_StepsPerRad * std::fabs(a)), 1);\r\n\r\n        double X = m_normals[k].X, Y = m_normals[k].Y, X2;\r\n        for (int i = 0; i < steps; ++i) {\r\n            m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + X * m_delta), Round(m_srcPoly[j].Y + Y * m_delta)));\r\n            X2 = X;\r\n            X = X * m_cos - m_sin * Y;\r\n            Y = X2 * m_sin + Y * m_cos;\r\n        }\r\n        m_destPoly.push_back(\r\n                IntPoint(\r\n                        Round(m_srcPoly[j].X + m_normals[j].X * m_delta),\r\n                        Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta)\r\n                )\r\n        );\r\n    }\r\n\r\n//------------------------------------------------------------------------------\r\n// Miscellaneous public functions\r\n//------------------------------------------------------------------------------\r\n\r\n    void Clipper::DoSimplePolygons() {\r\n        PolyOutList::size_type i = 0;\r\n        while (i < m_PolyOuts.size()) {\r\n            OutRec *outrec = m_PolyOuts[i++];\r\n            OutPt *op = outrec->Pts;\r\n            if (!op || outrec->IsOpen) {\r\n                continue;\r\n            }\r\n            do //for each Pt in Polygon until duplicate found do ...\r\n            {\r\n                OutPt *op2 = op->Next;\r\n                while (op2 != outrec->Pts) {\r\n                    if ((op->Pt == op2->Pt) && op2->Next != op && op2->Prev != op) {\r\n                        //split the polygon into two ...\r\n                        OutPt *op3 = op->Prev;\r\n                        OutPt *op4 = op2->Prev;\r\n                        op->Prev = op4;\r\n                        op4->Next = op;\r\n                        op2->Prev = op3;\r\n                        op3->Next = op2;\r\n\r\n                        outrec->Pts = op;\r\n                        OutRec *outrec2 = CreateOutRec();\r\n                        outrec2->Pts = op2;\r\n                        UpdateOutPtIdxs(*outrec2);\r\n                        if (Poly2ContainsPoly1(outrec2->Pts, outrec->Pts)) {\r\n                            //OutRec2 is contained by OutRec1 ...\r\n                            outrec2->IsHole = !outrec->IsHole;\r\n                            outrec2->FirstLeft = outrec;\r\n                            if (m_UsingPolyTree) {\r\n                                FixupFirstLefts2(outrec2, outrec);\r\n                            }\r\n                        } else if (Poly2ContainsPoly1(outrec->Pts, outrec2->Pts)) {\r\n                            //OutRec1 is contained by OutRec2 ...\r\n                            outrec2->IsHole = outrec->IsHole;\r\n                            outrec->IsHole = !outrec2->IsHole;\r\n                            outrec2->FirstLeft = outrec->FirstLeft;\r\n                            outrec->FirstLeft = outrec2;\r\n                            if (m_UsingPolyTree) {\r\n                                FixupFirstLefts2(outrec, outrec2);\r\n                            }\r\n                        } else {\r\n                            //the 2 polygons are separate ...\r\n                            outrec2->IsHole = outrec->IsHole;\r\n                            outrec2->FirstLeft = outrec->FirstLeft;\r\n                            if (m_UsingPolyTree) {\r\n                                FixupFirstLefts1(outrec, outrec2);\r\n                            }\r\n                        }\r\n                        op2 = op; //ie get ready for the Next iteration\r\n                    }\r\n                    op2 = op2->Next;\r\n                }\r\n                op = op->Next;\r\n            } while (op != outrec->Pts);\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ReversePath(Path &p) {\r\n        std::reverse(p.begin(), p.end());\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void ReversePaths(Paths &p) {\r\n        for (Paths::size_type i = 0; i < p.size(); ++i) {\r\n            ReversePath(p[i]);\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType) {\r\n        Clipper c;\r\n        c.StrictlySimple(true);\r\n        c.AddPath(in_poly, ptSubject, true);\r\n        c.Execute(ctUnion, out_polys, fillType, fillType);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType) {\r\n        Clipper c;\r\n        c.StrictlySimple(true);\r\n        c.AddPaths(in_polys, ptSubject, true);\r\n        c.Execute(ctUnion, out_polys, fillType, fillType);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void SimplifyPolygons(Paths &polys, PolyFillType fillType) {\r\n        SimplifyPolygons(polys, polys, fillType);\r\n    }\r\n\r\n    inline double DistanceSqrd(const IntPoint &pt1, const IntPoint &pt2) {\r\n        double Dx = ((double) pt1.X - pt2.X);\r\n        double dy = ((double) pt1.Y - pt2.Y);\r\n        return (Dx * Dx + dy * dy);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    double DistanceFromLineSqrd(const IntPoint &pt, const IntPoint &ln1, const IntPoint &ln2) {\r\n        //The equation of a line in general form (Ax + By + C = 0)\r\n        //given 2 points (x�,y�) & (x�,y�) is ...\r\n        //(y� - y�)x + (x� - x�)y + (y� - y�)x� - (x� - x�)y� = 0\r\n        //A = (y� - y�); B = (x� - x�); C = (y� - y�)x� - (x� - x�)y�\r\n        //perpendicular distance of point (x�,y�) = (Ax� + By� + C)/Sqrt(A� + B�)\r\n        //see http://en.wikipedia.org/wiki/Perpendicular_distance\r\n        double A = double(ln1.Y - ln2.Y);\r\n        double B = double(ln2.X - ln1.X);\r\n        double C = A * ln1.X + B * ln1.Y;\r\n        C = A * pt.X + B * pt.Y - C;\r\n        return (C * C) / (A * A + B * B);\r\n    }\r\n\r\n//---------------------------------------------------------------------------\r\n\r\n    bool SlopesNearCollinear(const IntPoint &pt1, const IntPoint &pt2, const IntPoint &pt3, double distSqrd) {\r\n        //this function is more accurate when the point that's geometrically\r\n        //between the other 2 points is the one that's tested for distance.\r\n        //ie makes it more likely to pick up 'spikes' ...\r\n        if (Abs(pt1.X - pt2.X) > Abs(pt1.Y - pt2.Y)) {\r\n            if ((pt1.X > pt2.X) == (pt1.X < pt3.X)) {\r\n                return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd;\r\n            } else if ((pt2.X > pt1.X) == (pt2.X < pt3.X)) {\r\n                return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd;\r\n            } else {\r\n                return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd;\r\n            }\r\n        } else {\r\n            if ((pt1.Y > pt2.Y) == (pt1.Y < pt3.Y)) {\r\n                return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd;\r\n            } else if ((pt2.Y > pt1.Y) == (pt2.Y < pt3.Y)) {\r\n                return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd;\r\n            } else {\r\n                return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd;\r\n            }\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    bool PointsAreClose(IntPoint pt1, IntPoint pt2, double distSqrd) {\r\n        double Dx = (double) pt1.X - pt2.X;\r\n        double dy = (double) pt1.Y - pt2.Y;\r\n        return ((Dx * Dx) + (dy * dy) <= distSqrd);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    OutPt *ExcludeOp(OutPt *op) {\r\n        OutPt *result = op->Prev;\r\n        result->Next = op->Next;\r\n        op->Next->Prev = result;\r\n        result->Idx = 0;\r\n        return result;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void CleanPolygon(const Path &in_poly, Path &out_poly, double distance) {\r\n        //distance = proximity in units/pixels below which vertices\r\n        //will be stripped. Default ~= sqrt(2).\r\n\r\n        size_t size = in_poly.size();\r\n\r\n        if (size == 0) {\r\n            out_poly.clear();\r\n            return;\r\n        }\r\n\r\n        OutPt *outPts = new OutPt[size];\r\n        for (size_t i = 0; i < size; ++i) {\r\n            outPts[i].Pt = in_poly[i];\r\n            outPts[i].Next = &outPts[(i + 1) % size];\r\n            outPts[i].Next->Prev = &outPts[i];\r\n            outPts[i].Idx = 0;\r\n        }\r\n\r\n        double distSqrd = distance * distance;\r\n        OutPt *op = &outPts[0];\r\n        while (op->Idx == 0 && op->Next != op->Prev) {\r\n            if (PointsAreClose(op->Pt, op->Prev->Pt, distSqrd)) {\r\n                op = ExcludeOp(op);\r\n                size--;\r\n            } else if (PointsAreClose(op->Prev->Pt, op->Next->Pt, distSqrd)) {\r\n                ExcludeOp(op->Next);\r\n                op = ExcludeOp(op);\r\n                size -= 2;\r\n            } else if (SlopesNearCollinear(op->Prev->Pt, op->Pt, op->Next->Pt, distSqrd)) {\r\n                op = ExcludeOp(op);\r\n                size--;\r\n            } else {\r\n                op->Idx = 1;\r\n                op = op->Next;\r\n            }\r\n        }\r\n\r\n        if (size < 3) {\r\n            size = 0;\r\n        }\r\n        out_poly.resize(size);\r\n        for (size_t i = 0; i < size; ++i) {\r\n            out_poly[i] = op->Pt;\r\n            op = op->Next;\r\n        }\r\n        delete[] outPts;\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void CleanPolygon(Path &poly, double distance) {\r\n        CleanPolygon(poly, poly, distance);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void CleanPolygons(const Paths &in_polys, Paths &out_polys, double distance) {\r\n        for (Paths::size_type i = 0; i < in_polys.size(); ++i) {\r\n            CleanPolygon(in_polys[i], out_polys[i], distance);\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void CleanPolygons(Paths &polys, double distance) {\r\n        CleanPolygons(polys, polys, distance);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void Minkowski(const Path &poly, const Path &path, Paths &solution, bool isSum, bool isClosed) {\r\n        int delta = (isClosed ? 1 : 0);\r\n        size_t polyCnt = poly.size();\r\n        size_t pathCnt = path.size();\r\n        Paths pp;\r\n        pp.reserve(pathCnt);\r\n        if (isSum) {\r\n            for (size_t i = 0; i < pathCnt; ++i) {\r\n                Path p;\r\n                p.reserve(polyCnt);\r\n                for (size_t j = 0; j < poly.size(); ++j) {\r\n                    p.push_back(IntPoint(path[i].X + poly[j].X, path[i].Y + poly[j].Y));\r\n                }\r\n                pp.push_back(p);\r\n            }\r\n        } else {\r\n            for (size_t i = 0; i < pathCnt; ++i) {\r\n                Path p;\r\n                p.reserve(polyCnt);\r\n                for (size_t j = 0; j < poly.size(); ++j) {\r\n                    p.push_back(IntPoint(path[i].X - poly[j].X, path[i].Y - poly[j].Y));\r\n                }\r\n                pp.push_back(p);\r\n            }\r\n        }\r\n\r\n        solution.clear();\r\n        solution.reserve((pathCnt + delta) * (polyCnt + 1));\r\n        for (size_t i = 0; i < pathCnt - 1 + delta; ++i) {\r\n            for (size_t j = 0; j < polyCnt; ++j) {\r\n                Path quad;\r\n                quad.reserve(4);\r\n                quad.push_back(pp[i % pathCnt][j % polyCnt]);\r\n                quad.push_back(pp[(i + 1) % pathCnt][j % polyCnt]);\r\n                quad.push_back(pp[(i + 1) % pathCnt][(j + 1) % polyCnt]);\r\n                quad.push_back(pp[i % pathCnt][(j + 1) % polyCnt]);\r\n                if (!Orientation(quad)) {\r\n                    ReversePath(quad);\r\n                }\r\n                solution.push_back(quad);\r\n            }\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void MinkowskiSum(const Path &pattern, const Path &path, Paths &solution, bool pathIsClosed) {\r\n        Minkowski(pattern, path, solution, true, pathIsClosed);\r\n        Clipper c;\r\n        c.AddPaths(solution, ptSubject, true);\r\n        c.Execute(ctUnion, solution, pftNonZero, pftNonZero);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void TranslatePath(const Path &input, Path &output, IntPoint delta) {\r\n        //precondition: input != output\r\n        output.resize(input.size());\r\n        for (size_t i = 0; i < input.size(); ++i) {\r\n            output[i] = IntPoint(input[i].X + delta.X, input[i].Y + delta.Y);\r\n        }\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void MinkowskiSum(const Path &pattern, const Paths &paths, Paths &solution, bool pathIsClosed) {\r\n        Clipper c;\r\n        for (size_t i = 0; i < paths.size(); ++i) {\r\n            Paths tmp;\r\n            Minkowski(pattern, paths[i], tmp, true, pathIsClosed);\r\n            c.AddPaths(tmp, ptSubject, true);\r\n            if (pathIsClosed) {\r\n                Path tmp2;\r\n                TranslatePath(paths[i], tmp2, pattern[0]);\r\n                c.AddPath(tmp2, ptClip, true);\r\n            }\r\n        }\r\n        c.Execute(ctUnion, solution, pftNonZero, pftNonZero);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    void MinkowskiDiff(const Path &poly1, const Path &poly2, Paths &solution) {\r\n        Minkowski(poly1, poly2, solution, false, true);\r\n        Clipper c;\r\n        c.AddPaths(solution, ptSubject, true);\r\n        c.Execute(ctUnion, solution, pftNonZero, pftNonZero);\r\n    }\r\n//------------------------------------------------------------------------------\r\n\r\n    enum NodeType {ntAny, ntOpen, ntClosed};\r\n\r\n    void AddPolyNodeToPaths(const PolyNode &polynode, NodeType nodetype, Paths &paths) {\r\n        bool match = true;\r\n        if (nodetype == ntClosed) {\r\n            match = !polynode.IsOpen();\r\n        } else if (nodetype == ntOpen) {\r\n            return;\r\n        }\r\n\r\n        if (!polynode.Contour.empty() && match) {\r\n            paths.push_back(polynode.Contour);\r\n        }\r\n        for (int i = 0; i < polynode.ChildCount(); ++i) {\r\n            AddPolyNodeToPaths(*polynode.Childs[i], nodetype, paths);\r\n        }\r\n    }\r\n    //------------------------------------------------------------------------------\r\n\r\n    void PolyTreeToPaths(const PolyTree& polytree, Paths& paths) {\r\n        paths.resize(0);\r\n        paths.reserve(polytree.Total());\r\n        AddPolyNodeToPaths(polytree, ntAny, paths);\r\n    }\r\n    //------------------------------------------------------------------------------\r\n\r\n    void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths) {\r\n        paths.resize(0);\r\n        paths.reserve(polytree.Total());\r\n        AddPolyNodeToPaths(polytree, ntClosed, paths);\r\n    }\r\n    //------------------------------------------------------------------------------\r\n\r\n    void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths) {\r\n        paths.resize(0);\r\n        paths.reserve(polytree.Total());\r\n        //Open paths are top level only, so ...\r\n        for (int i = 0; i < polytree.ChildCount(); ++i)\r\n            if (polytree.Childs[i]->IsOpen())\r\n                paths.push_back(polytree.Childs[i]->Contour);\r\n    }\r\n    //------------------------------------------------------------------------------\r\n\r\n\r\n    //------------------------------------------------------------------------------\r\n    void _get_bounds_holes(Paths& bounds, Paths& holes, Paths polygons) {\r\n        for (Path polygon : polygons) {\r\n            if (Orientation(polygon)) {\r\n                bounds.push_back(polygon);\r\n            } else {\r\n                holes.push_back(polygon);\r\n            }\r\n        }\r\n    }\r\n\r\n    Paths _get_holes_of_bound(const Path& bound, const Paths& bounds, const Paths& holes) {\r\n        Paths result;\r\n        for (Path hole : holes) {\r\n            if (PointInPolygon(hole[0], bound)) {\r\n                bool flag = false;\r\n\r\n                for (Path other_bound : bounds) {\r\n                    if ((bound != other_bound) &&\r\n                            PointInPolygon(hole[0], other_bound) &&\r\n                            PointInPolygon(other_bound[0], bound)) {\r\n                        flag = true;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if (!flag) {\r\n                    result.push_back(hole);\r\n                }\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n\r\n    inline IntPoint CrossPoint(const IntPoint &pt, const IntPoint &ln1, const IntPoint &ln2) {\r\n        if (ln1.X == ln2.X && ln1.Y == ln2.Y) {\r\n            return ln1;\r\n        } else {\r\n            double dx = (double) (ln2.X - ln1.X);\r\n            double dy = (double) (ln2.Y - ln1.Y);\r\n            double dx2 = dx * dx;\r\n            double dy2 = dy * dy;\r\n            double t = (dx * (pt.X - ln1.X) + dy * (pt.Y - ln1.Y)) / (dx2 + dy2);\r\n            IntPoint result;\r\n            result.X = ln1.X + (cInt) (t * (ln2.X - ln1.X));\r\n            result.Y = ln1.Y + (cInt) (t * (ln2.Y - ln1.Y));\r\n            return result;\r\n        }\r\n    }\r\n\r\n    inline cInt DotProduct(const IntPoint& A, const IntPoint& B) {\r\n        return A.X * B.X + A.Y * B.Y;\r\n    }\r\n\r\n    inline cInt DotProduct(const IntPoint& e1s, const IntPoint& e1d, const IntPoint& e2s, const IntPoint& e2d) {\r\n        return DotProduct(IntPoint(e1d.X - e1s.X, e1d.Y - e1s.Y), IntPoint(e2d.X - e2s.X, e2d.Y - e2s.Y));\r\n    }\r\n\r\n    inline bool PointAtSegment(const IntPoint& pt, const IntPoint& src, const IntPoint& dst) {\r\n        // Point pt must be on line with direction vector (src, dst)\r\n\r\n        cInt kp = DotProduct(src, pt, src, dst);\r\n        if (kp < 0) {\r\n            return false;\r\n        } else if (kp == 0) {\r\n            return true; // point at src\r\n        } else {\r\n            cInt ke = DotProduct(src, dst, src, dst);\r\n            if (kp > ke) {\r\n                return false;\r\n            } else if (kp == ke) {\r\n                return true; // point at dst\r\n            } else {\r\n                return true; // point between src and dst\r\n            }\r\n        }\r\n    }\r\n\r\n    inline bool IsHorizontal(const IntPoint& src, const IntPoint& dst) {\r\n        return  (src.Y - dst.Y) == 0;\r\n    }\r\n\r\n    inline bool IsVertical(const IntPoint& src, const IntPoint& dst) {\r\n        return  (src.X - dst.X) == 0;\r\n    }\r\n\r\n    inline bool IsDiagonal(const IntPoint& src, const IntPoint& dst) {\r\n        return  (src.X - dst.X) == (src.Y - dst.Y);\r\n    }\r\n\r\n    inline bool IsStdDirection(const IntPoint& src, const IntPoint& dst) {\r\n        return IsDiagonal(src, dst) || IsHorizontal(src, dst) || IsVertical(src, dst);\r\n    }\r\n\r\n    Path _merge_paths(const Path& p, const Path& q) {\r\n        Path result;\r\n\r\n        size_t point_idx = 0, edge_idx[2];\r\n        double min_dist = -1.0;\r\n\r\n//        ReversePath(q);\r\n\r\n        for (size_t i = 0; i < p.size(); i++) {\r\n            for (size_t j = 0; j < q.size(); j++) {\r\n                IntPoint v1 = q[j], v2 = q[(j+1) % q.size()];\r\n                IntPoint cross_point = CrossPoint(p[i], v1, v2);\r\n                if (PointAtSegment(cross_point, v1, v2) && IsStdDirection(v1, v2)) {\r\n                    double d = DistanceSqrd(cross_point, p[i]);\r\n                    if (min_dist < 0.0 || (d < min_dist && d > 1.0)) {\r\n                        edge_idx[0] = j;\r\n                        edge_idx[1] = (j + 1) % q.size();\r\n                        point_idx = i;\r\n                        min_dist = d;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        IntPoint v1 = q[edge_idx[0]];\r\n        IntPoint v2 = q[edge_idx[1]];\r\n        IntPoint cross_point = CrossPoint(p[point_idx], v1, v2);\r\n\r\n        double v = DistanceSqrd(p[point_idx], cross_point);\r\n\r\n//        printf(\"Point: %lli, %lli, distance = %.3f\\n\", p[point_idx].X, p[point_idx].Y, min_dist);\r\n//        printf(\"Vector: (%lli, %lli) -> (%lli, %lli)\\n\", v1.X, v1.Y, v2.X, v2.Y);\r\n//        printf(\"Cross point: %lli, %lli, distance = %.3f\\n\", cross_point.X, cross_point.Y, v);\r\n\r\n        for (size_t k = 0; k < point_idx; k++) {\r\n            result.push_back(p[k]);\r\n        }\r\n\r\n        result.push_back(p[point_idx]);\r\n        result.push_back(cross_point);\r\n\r\n        for (size_t k = edge_idx[1]; k != edge_idx[0]; k = (k + 1) % q.size()) {\r\n            result.push_back(q[k]);\r\n        }\r\n\r\n        result.push_back(q[edge_idx[0]]);\r\n        result.push_back(cross_point);\r\n        result.push_back(p[point_idx]);\r\n\r\n        for (size_t k = (point_idx + 1) % p.size(); k != 0; k = (k + 1) % p.size()) {\r\n            result.push_back(p[k]);\r\n        }\r\n\r\n        return result;\r\n    }\r\n\r\n    Paths CutHoles(const Paths &polygons) {\r\n        Paths result, bounds, all_holes;\r\n        _get_bounds_holes(bounds, all_holes, polygons);\r\n        for (Path bound : bounds) {\r\n            Paths holes = _get_holes_of_bound(bound, bounds, all_holes);\r\n            Path merged = bound;\r\n            if (!holes.empty()) {\r\n                for (size_t k = 0; k < holes.size(); k++) {\r\n                    merged = _merge_paths(holes[k], merged);\r\n                }\r\n            }\r\n            result.push_back(merged);\r\n        }\r\n\r\n        return result;\r\n    }\r\n} //ClipperLib namespace\r\n"
  },
  {
    "path": "OptolithiumC/libs/easylogging/easylogging++.h",
    "content": "//\n//  Easylogging++ v9.73\n//  Single-header only, cross-platform logging library for C++ applications\n//\n//  Copyright (c) 2014 Majid Khan\n//\n//  This library is released under the MIT Licence.\n//  http://www.easylogging.org/licence.php\n//\n//  support@easylogging.org\n//  http://easylogging.org\n//  https://github.com/easylogging/easyloggingpp\n//\n#ifndef EASYLOGGINGPP_H  // NOLINT\n#define EASYLOGGINGPP_H\n// Compilers and C++0x/C++11 Evaluation\n#if defined(__GNUC__)\n#   define _ELPP_COMPILER_GCC 1\n#   define _ELPP_GCC_VERSION (__GNUC__ * 10000 \\\n                               + __GNUC_MINOR__ * 100 \\\n                               + __GNUC_PATCHLEVEL__)\n#   if defined(__GXX_EXPERIMENTAL_CXX0X__)\n#      define _ELPP_CXX0X 1\n#   elif(_ELPP_GCC_VERSION >= 40801)\n#      define _ELPP_CXX11 1\n#   endif  // defined(__GXX_EXPERIMENTAL_CXX0X__)\n#endif  // defined(__GNUC__)\n// Visual C++\n#if defined(_MSC_VER)\n#   define _ELPP_COMPILER_MSVC 1\n#   define _ELPP_CRT_DBG_WARNINGS 1\n#   if (_MSC_VER == 1600)\n#      define _ELPP_CXX0X 1\n#   elif(_MSC_VER >= 1700)\n#      define _ELPP_CXX11 1\n#   endif  // (_MSC_VER == 1600)\n#endif  // defined(_MSC_VER)\n// Clang++\n#if defined(__clang__) && (__clang__ == 1)\n#   define _ELPP_COMPILER_CLANG 1\n#   define _ELPP_CLANG_VERSION (__clang_major__ * 10000 \\\n                                + __clang_minor__ * 100 \\\n                                + __clang_patchlevel__)\n#   if (_ELPP_CLANG_VERSION >= 30300)\n#      define _ELPP_CXX11 1\n#   endif  // (_ELPP_CLANG_VERSION >= 30300)\n#endif  // defined(__clang__) && (__clang__ == 1)\n// MinGW\n#if defined(__MINGW32__) || defined(__MINGW64__)\n#   define _ELPP_MINGW 1\n#endif  // defined(__MINGW32__) || defined(__MINGW64__)\n// Cygwin\n#if defined(__CYGWIN__) && (__CYGWIN__ == 1)\n#   define _ELPP_CYGWIN 1\n#endif  // defined(__CYGWIN__) && (__CYGWIN__ == 1)\n// Intel C++\n#if defined(__INTEL_COMPILER)\n#   define _ELPP_COMPILER_INTEL 1\n#endif\n// Operating System Evaluation\n// Windows\n#if defined(_WIN32) || defined(_WIN64)\n#   define _ELPP_OS_WINDOWS 1\n#endif  // defined(_WIN32) || defined(_WIN64)\n// Linux\n#if (defined(__linux) || defined(__linux__))\n#   define _ELPP_OS_LINUX 1\n#endif  // (defined(__linux) || defined(__linux__))\n// Mac\n#if defined(__APPLE__)\n#   define _ELPP_OS_MAC 1\n#endif  // defined(__APPLE__)\n// FreeBSD\n#if defined(__FreeBSD__)\n#   define _ELPP_OS_FREEBSD 1\n#endif\n// Unix\n#if ((_ELPP_OS_LINUX || _ELPP_OS_MAC || _ELPP_OS_FREEBSD) && (!_ELPP_OS_WINDOWS))\n#   define _ELPP_OS_UNIX 1\n#endif  // ((_ELPP_OS_LINUX || _ELPP_OS_MAC || _ELPP_OS_FREEBSD) && (!_ELPP_OS_WINDOWS))\n// Android\n#if defined(__ANDROID__)\n#   define _ELPP_OS_ANDROID 1\n#endif  // defined(__ANDROID__)\n// Evaluating Cygwin as *nix OS\n#if !_ELPP_OS_UNIX && !_ELPP_OS_WINDOWS && _ELPP_CYGWIN\n#   undef _ELPP_OS_UNIX\n#   undef _ELPP_OS_LINUX\n#   define _ELPP_OS_UNIX 1\n#   define _ELPP_OS_LINUX 1\n#endif //  !_ELPP_OS_UNIX && !_ELPP_OS_WINDOWS && _ELPP_CYGWIN\n#if !defined(_ELPP_INTERNAL_DEBUGGING_OUT_INFO)\n#   define _ELPP_INTERNAL_DEBUGGING_OUT_INFO std::cout\n#endif // !defined(_ELPP_INTERNAL_DEBUGGING_OUT)\n#if !defined(_ELPP_INTERNAL_DEBUGGING_OUT_ERROR)\n#   define _ELPP_INTERNAL_DEBUGGING_OUT_ERROR std::cerr\n#endif // !defined(_ELPP_INTERNAL_DEBUGGING_OUT)\n#if !defined(_ELPP_INTERNAL_DEBUGGING_ENDL)\n#   define _ELPP_INTERNAL_DEBUGGING_ENDL std::endl\n#endif // !defined(_ELPP_INTERNAL_DEBUGGING_OUT)\n#if !defined(_ELPP_INTERNAL_DEBUGGING_MSG)\n#   define _ELPP_INTERNAL_DEBUGGING_MSG(msg) msg\n#endif // !defined(_ELPP_INTERNAL_DEBUGGING_OUT)\n// Internal Assertions and errors\n#if !defined(_ELPP_DISABLE_ASSERT)\n#   if (defined(_ELPP_DEBUG_ASSERT_FAILURE))\n#      define ELPP_ASSERT(expr, msg) if (!(expr)) { \\\n          std::stringstream internalInfoStream; internalInfoStream << msg; \\\n          _ELPP_INTERNAL_DEBUGGING_OUT_ERROR \\\n              << \"EASYLOGGING++ ASSERTION FAILED (LINE: \" << __LINE__ << \") [\" #expr << \"] WITH MESSAGE \\\"\" \\\n              << _ELPP_INTERNAL_DEBUGGING_MSG(internalInfoStream.str()) << \"\\\"\" << _ELPP_INTERNAL_DEBUGGING_ENDL; base::utils::abort(1, \\\n                  \"ELPP Assertion failure, please define _ELPP_DEBUG_ASSERT_FAILURE\"); }\n#   else\n#      define ELPP_ASSERT(expr, msg) if (!(expr)) { \\\n          std::stringstream internalInfoStream; internalInfoStream << msg; \\\n          _ELPP_INTERNAL_DEBUGGING_OUT_ERROR\\\n             << \"ASSERTION FAILURE FROM EASYLOGGING++ (LINE: \" \\\n             << __LINE__ << \") [\" #expr << \"] WITH MESSAGE \\\"\" << _ELPP_INTERNAL_DEBUGGING_MSG(internalInfoStream.str()) << \"\\\"\" \\\n             << _ELPP_INTERNAL_DEBUGGING_ENDL; }\n#   endif  // (defined(_ELPP_DEBUG_ASSERT_FAILURE))\n#else\n#   define ELPP_ASSERT(x, y)\n#endif  //(!defined(_ELPP_DISABLE_ASSERT)\n#if _ELPP_COMPILER_MSVC\n#   define _ELPP_INTERNAL_DEBUGGING_WRITE_PERROR \\\n       { char buff[256]; strerror_s(buff, 256, errno); \\\n       _ELPP_INTERNAL_DEBUGGING_OUT_ERROR << \": \" << buff << \" [\" << errno << \"]\";} (void)0\n#else\n#   define _ELPP_INTERNAL_DEBUGGING_WRITE_PERROR \\\n        _ELPP_INTERNAL_DEBUGGING_OUT_ERROR << \": \" << strerror(errno) << \" [\" << errno << \"]\"; (void)0\n#endif  // _ELPP_COMPILER_MSVC\n#if defined(_ELPP_DEBUG_ERRORS)\n#   if !defined(ELPP_INTERNAL_ERROR)\n#      define ELPP_INTERNAL_ERROR(msg, pe) { \\\n          std::stringstream internalInfoStream; internalInfoStream << \"<ERROR> \" << msg; \\\n          _ELPP_INTERNAL_DEBUGGING_OUT_ERROR \\\n          << \"ERROR FROM EASYLOGGING++ (LINE: \" << __LINE__ << \") \" \\\n          << _ELPP_INTERNAL_DEBUGGING_MSG(internalInfoStream.str()) << _ELPP_INTERNAL_DEBUGGING_ENDL; \\\n          if (pe) { _ELPP_INTERNAL_DEBUGGING_OUT_ERROR << \"    \"; _ELPP_INTERNAL_DEBUGGING_WRITE_PERROR; }} (void)0\n#   endif\n#else\n#   undef ELPP_INTERNAL_INFO\n#   define ELPP_INTERNAL_ERROR(msg, pe)\n#endif  // defined(_ELPP_DEBUG_ERRORS)\n#if (defined(_ELPP_DEBUG_INFO))\n#   if !(defined(_ELPP_INTERNAL_INFO_LEVEL))\n#      define _ELPP_INTERNAL_INFO_LEVEL 9\n#   endif  // !(defined(_ELPP_INTERNAL_INFO_LEVEL))\n#   if !defined(ELPP_INTERNAL_INFO)\n#      define ELPP_INTERNAL_INFO(lvl, msg) { if (lvl <= _ELPP_INTERNAL_INFO_LEVEL) { \\\n          std::stringstream internalInfoStream; internalInfoStream << \"<INFO> \" << msg; \\\n          _ELPP_INTERNAL_DEBUGGING_OUT_INFO << _ELPP_INTERNAL_DEBUGGING_MSG(internalInfoStream.str()) \\\n             << _ELPP_INTERNAL_DEBUGGING_ENDL; }}\n#   endif\n#else\n#   undef ELPP_INTERNAL_INFO\n#   define ELPP_INTERNAL_INFO(lvl, msg)\n#endif  // (defined(_ELPP_DEBUG_INFO))\n#if defined(_ELPP_STACKTRACE_ON_CRASH)\n#   if (_ELPP_COMPILER_GCC && !_ELPP_MINGW)\n#      define _ELPP_STACKTRACE 1\n#   else\n#      if _ELPP_COMPILER_MSVC\n#         pragma message(\"Stack trace not available for this compiler\")\n#      else\n#         warning \"Stack trace not available for this compiler\";\n#      endif  // _ELPP_COMPILER_MSVC\n#   endif  // _ELPP_COMPILER_GCC\n#endif  // (defined(_ELPP_STACKTRACE_ON_CRASH))\n// Miscellaneous macros\n#define _ELPP_UNUSED(x) (void)x\n#if _ELPP_OS_UNIX\n// Log file permissions for unix-based systems\n#   define _ELPP_LOG_PERMS S_IRUSR | S_IWUSR | S_IXUSR | S_IWGRP | S_IRGRP | S_IXGRP | S_IWOTH | S_IXOTH\n#endif  // _ELPP_OS_UNIX\n#if defined(_ELPP_AS_DLL) && _ELPP_COMPILER_MSVC\n#   if defined(_ELPP_EXPORT_SYMBOLS)\n#      define _ELPP_EXPORT __declspec(dllexport)\n#   else\n#      define _ELPP_EXPORT __declspec(dllimport)\n#   endif  // defined(_ELPP_EXPORT_SYMBOLS)\n#else\n#   define _ELPP_EXPORT\n#endif  // defined(_ELPP_AS_DLL) && _ELPP_COMPILER_MSVC\n// Some special functions that are VC++ specific\n#undef STRTOK\n#undef STRERROR\n#undef STRCAT\n#undef STRCPY\n#if _ELPP_CRT_DBG_WARNINGS\n#   define STRTOK(a, b, c) strtok_s(a, b, c)\n#   define STRERROR(a, b, c) strerror_s(a, b, c)\n#   define STRCAT(a, b, len) strcat_s(a, len, b)\n#   define STRCPY(a, b, len) strcpy_s(a, len, b)\n#else\n#   define STRTOK(a, b, c) strtok(a, b)  // NOLINT\n#   define STRERROR(a, b, c) strerror(c)\n#   define STRCAT(a, b, len) strcat(a, b)  // NOLINT\n#   define STRCPY(a, b, len) strcpy(a, b)  // NOLINT\n#endif\n// Compiler specific support evaluations\n#if (!_ELPP_MINGW && !_ELPP_COMPILER_CLANG) || defined(_ELPP_FORCE_USE_STD_THREAD)\n#   define _ELPP_USE_STD_THREADING 1\n#endif  // (!_ELPP_MINGW && !_ELPP_COMPILER_CLANG) || defined(_ELPP_FORCE_USE_STD_THREAD)\n#undef ELPP_FINAL\n#if _ELPP_COMPILER_INTEL || (_ELPP_GCC_VERSION < 40702)\n#   define ELPP_FINAL\n#else\n#   define ELPP_FINAL final\n#endif  // _ELPP_COMPILER_INTEL || (_ELPP_GCC_VERSION < 40702)\n#if defined(_ELPP_THREAD_SAFE)\n#   define _ELPP_THREADING_ENABLED 1\n#endif  // defined(_ELPP_THREAD_SAFE)\n// Function macro _ELPP_FUNC\n#undef _ELPP_FUNC\n#if _ELPP_COMPILER_MSVC  // Visual C++\n#   define _ELPP_FUNC __FUNCSIG__\n#elif _ELPP_COMPILER_GCC  // GCC\n#   define _ELPP_FUNC __PRETTY_FUNCTION__\n#elif _ELPP_COMPILER_INTEL  // Intel C++\n#   define _ELPP_FUNC __PRETTY_FUNCTION__\n#elif _ELPP_COMPILER_CLANG  // Clang++\n#   define _ELPP_FUNC __PRETTY_FUNCTION__\n#else\n#   if defined(__func__)\n#      define _ELPP_FUNC __func__\n#   else\n#      define _ELPP_FUNC \"\"\n#   endif  // defined(__func__)\n#endif  // defined(_MSC_VER)\n#undef _ELPP_VARIADIC_TEMPLATES_SUPPORTED\n// Keep following line commented until features are fixed\n#if _ELPP_COMPILER_GCC || _ELPP_COMPILER_CLANG || _ELPP_COMPILER_INTEL || (_ELPP_COMPILER_MSVC && _MSC_VER >= 1800)\n#   define _ELPP_VARIADIC_TEMPLATES_SUPPORTED 1\n#endif  // _ELPP_COMPILER_GCC || _ELPP_COMPILER_CLANG || _ELPP_COMPILER_INTEL || (_ELPP_COMPILER_MSVC && _MSC_VER >= 1800)\n// Logging Enable/Disable macros\n#if (!defined(_ELPP_DISABLE_LOGS))\n#   define _ELPP_LOGGING_ENABLED 1\n#endif  // (!defined(_ELPP_DISABLE_LOGS))\n#if (!defined(_ELPP_DISABLE_DEBUG_LOGS) && (_ELPP_LOGGING_ENABLED) && ((defined(_DEBUG)) || (!defined(NDEBUG))))\n#   define _ELPP_DEBUG_LOG 1\n#else\n#   define _ELPP_DEBUG_LOG 0\n#endif  // (!defined(_ELPP_DISABLE_DEBUG_LOGS) && (_ELPP_LOGGING_ENABLED) && ((defined(_DEBUG)) || (!defined(NDEBUG))))\n#if (!defined(_ELPP_DISABLE_INFO_LOGS) && (_ELPP_LOGGING_ENABLED))\n#   define _ELPP_INFO_LOG 1\n#else\n#   define _ELPP_INFO_LOG 0\n#endif  // (!defined(_ELPP_DISABLE_INFO_LOGS) && (_ELPP_LOGGING_ENABLED))\n#if (!defined(_ELPP_DISABLE_WARNING_LOGS) && (_ELPP_LOGGING_ENABLED))\n#   define _ELPP_WARNING_LOG 1\n#else\n#   define _ELPP_WARNING_LOG 0\n#endif  // (!defined(_ELPP_DISABLE_WARNING_LOGS) && (_ELPP_LOGGING_ENABLED))\n#if (!defined(_ELPP_DISABLE_ERROR_LOGS) && (_ELPP_LOGGING_ENABLED))\n#   define _ELPP_ERROR_LOG 1\n#else\n#   define _ELPP_ERROR_LOG 0\n#endif  // (!defined(_ELPP_DISABLE_ERROR_LOGS) && (_ELPP_LOGGING_ENABLED))\n#if (!defined(_ELPP_DISABLE_FATAL_LOGS) && (_ELPP_LOGGING_ENABLED))\n#   define _ELPP_FATAL_LOG 1\n#else\n#   define _ELPP_FATAL_LOG 0\n#endif  // (!defined(_ELPP_DISABLE_FATAL_LOGS) && (_ELPP_LOGGING_ENABLED))\n#if (!defined(_ELPP_DISABLE_TRACE_LOGS) && (_ELPP_LOGGING_ENABLED))\n#   define _ELPP_TRACE_LOG 1\n#else\n#   define _ELPP_TRACE_LOG 0\n#endif  // (!defined(_ELPP_DISABLE_TRACE_LOGS) && (_ELPP_LOGGING_ENABLED))\n#if (!defined(_ELPP_DISABLE_VERBOSE_LOGS) && (_ELPP_LOGGING_ENABLED))\n#   define _ELPP_VERBOSE_LOG 1\n#else\n#   define _ELPP_VERBOSE_LOG 0\n#endif  // (!defined(_ELPP_DISABLE_VERBOSE_LOGS) && (_ELPP_LOGGING_ENABLED))\n#if (!(_ELPP_CXX0X || _ELPP_CXX11))\n#   error \"Easylogging++ 9.0+ is only compatible with C++0x (or higher) compliant compiler\"\n#endif  // (!(_ELPP_CXX0X || _ELPP_CXX11))\n// Headers\n#if defined(_ELPP_SYSLOG)\n#   include <syslog.h>\n#endif  // defined(_ELPP_SYSLOG)\n#include <ctime>\n#include <cstring>\n#include <cstdlib>\n#include <cctype>\n#include <cwchar>\n#include <csignal>\n#include <cerrno>\n#include <cstdarg>\n#if defined(_ELPP_UNICODE)\n#   include <locale>\n#endif  // defined(_ELPP_UNICODE)\n#if _ELPP_STACKTRACE\n#   include <cxxabi.h>\n#   include <execinfo.h>\n#endif  // _ELPP_STACKTRACE\n#if _ELPP_OS_ANDROID\n#   include <sys/system_properties.h>\n#endif  // _ELPP_OS_ANDROID\n#if _ELPP_OS_UNIX\n#   include <sys/stat.h>\n#   include <sys/time.h>\n#elif _ELPP_OS_WINDOWS\n#   include <direct.h>\n#   include <Windows.h>\n#   if defined(WIN32_LEAN_AND_MEAN)\n#      include <winsock.h>\n#   endif // defined(WIN32_LEAN_AND_MEAN)\n#endif  // _ELPP_OS_UNIX\n#include <string>\n#include <vector>\n#include <map>\n#include <utility>\n#include <functional>\n#include <algorithm>\n#include <fstream>  // NOLINT\n#include <iostream>  // NOLINT\n#include <sstream>\n#include <memory>\n#include <type_traits>\n#if _ELPP_THREADING_ENABLED\n#   if _ELPP_USE_STD_THREADING\n#      include <mutex>\n#      include <thread>\n#   else\n#      if _ELPP_OS_UNIX\n#         include <pthread.h>\n#      endif  // _ELPP_OS_UNIX\n#   endif  // _ELPP_USE_STD_THREADING\n#endif  // _ELPP_THREADING_ENABLED\n#if defined(_ELPP_STL_LOGGING)\n// For logging STL based templates\n#   include <list>\n#   include <queue>\n#   include <deque>\n#   include <set>\n#   include <bitset>\n#   include <stack>\n#   if defined(_ELPP_LOG_STD_ARRAY)\n#      include <array>\n#   endif  // defined(_ELPP_LOG_STD_ARRAY)\n#   if defined(_ELPP_LOG_UNORDERED_MAP)\n#      include <unordered_map>\n#   endif  // defined(_ELPP_LOG_UNORDERED_MAP)\n#   if defined(_ELPP_LOG_UNORDERED_SET)\n#      include <unordered_set>\n#   endif  // defined(_ELPP_UNORDERED_SET)\n#endif  // defined(_ELPP_STL_LOGGING)\n#if defined(_ELPP_QT_LOGGING)\n// For logging Qt based classes & templates\n#   include <QString>\n#   include <QByteArray>\n#   include <QVector>\n#   include <QList>\n#   include <QPair>\n#   include <QMap>\n#   include <QQueue>\n#   include <QSet>\n#   include <QLinkedList>\n#   include <QHash>\n#   include <QMultiHash>\n#   include <QStack>\n#endif  // defined(_ELPP_QT_LOGGING)\n#if defined(_ELPP_BOOST_LOGGING)\n// For logging boost based classes & templates\n#   include <boost/container/vector.hpp>\n#   include <boost/container/stable_vector.hpp>\n#   include <boost/container/list.hpp>\n#   include <boost/container/deque.hpp>\n#   include <boost/container/map.hpp>\n#   include <boost/container/flat_map.hpp>\n#   include <boost/container/set.hpp>\n#   include <boost/container/flat_set.hpp>\n#endif  // defined(_ELPP_BOOST_LOGGING)\n#if defined(_ELPP_WXWIDGETS_LOGGING)\n// For logging wxWidgets based classes & templates\n#   include <wx/vector.h>\n#endif  // defined(_ELPP_WXWIDGETS_LOGGING)\n// Forward declarations\nnamespace el {\nclass Logger;\nclass LogMessage;\nclass PerformanceTrackingData;\nclass Loggers;\nclass Helpers;\ntemplate <typename T> class Callback;\nclass LogDispatchCallback;\nclass PerformanceTrackingCallback;\nclass LogDispatchData;\nnamespace base {\nclass Storage;\nclass RegisteredLoggers;\nclass PerformanceTracker;\nclass MessageBuilder;\nclass Writer;\nclass PErrorWriter;\nclass LogDispatcher;\nclass DefaultLogBuilder;\nclass DefaultLogDispatchCallback;\nclass DefaultPerformanceTrackingCallback;\n}  // namespace base\n}  // namespace el\n/// @brief Easylogging++ entry namespace\nnamespace el {\n/// @brief Namespace containing base/internal functionality used by Easylogging++\nnamespace base {\n/// @brief Data types used by Easylogging++\nnamespace type {\n#undef ELPP_LITERAL\n#undef ELPP_STRLEN\n#undef ELPP_COUT\n#if defined(_ELPP_UNICODE)\n#   define ELPP_LITERAL(txt) L##txt\n#   define ELPP_STRLEN wcslen\n#   if defined ELPP_CUSTOM_COUT\n#      define ELPP_COUT ELPP_CUSTOM_COUT\n#   else\n#      define ELPP_COUT std::wcout\n#   endif  // defined ELPP_CUSTOM_COUT\ntypedef wchar_t char_t;\ntypedef std::wstring string_t;\ntypedef std::wstringstream stringstream_t;\ntypedef std::wfstream fstream_t;\ntypedef std::wostream ostream_t;\n#else\n#   define ELPP_LITERAL(txt) txt\n#   define ELPP_STRLEN strlen\n#   if defined ELPP_CUSTOM_COUT\n#      define ELPP_COUT ELPP_CUSTOM_COUT\n#   else\n#      define ELPP_COUT std::cout\n#   endif  // defined ELPP_CUSTOM_COUT\ntypedef char char_t;\ntypedef std::string string_t;\ntypedef std::stringstream stringstream_t;\ntypedef std::fstream fstream_t;\ntypedef std::ostream ostream_t;\n#endif  // defined(_ELPP_UNICODE)\n#if defined(ELPP_CUSTOM_COUT_LINE)\n#   define ELPP_COUT_LINE(logLine) ELPP_CUSTOM_COUT_LINE(logLine)\n#else\n#   define ELPP_COUT_LINE(logLine) logLine << std::flush\n#endif // defined(ELPP_CUSTOM_COUT_LINE)\ntypedef unsigned short EnumType;  // NOLINT\ntypedef std::shared_ptr<base::Storage> StoragePointer;\ntypedef int VerboseLevel;\ntypedef std::shared_ptr<LogDispatchCallback> LogDispatchCallbackPtr;\ntypedef std::shared_ptr<PerformanceTrackingCallback> PerformanceTrackingCallbackPtr;\n}  // namespace type\n/// @brief Internal helper class that prevent copy constructor for class\n///\n/// @detail When using this class simply inherit it privately\nclass NoCopy {\nprotected:\n    NoCopy(void) {}\nprivate:\n    NoCopy(const NoCopy&);\n    NoCopy& operator=(const NoCopy&);\n};\n/// @brief Internal helper class that makes all default constructors private.\n///\n/// @detail This prevents initializing class making it static unless an explicit constructor is declared.\n/// When using this class simply inherit it privately\nclass StaticClass {\nprivate:\n    StaticClass(void);\n    StaticClass(const StaticClass&);\n    StaticClass& operator=(const StaticClass&);\n};\n}  // namespace base\n/// @brief Represents enumeration for severity level used to determine level of logging\n///\n/// @detail With Easylogging++, developers may disable or enable any level regardless of\n/// what the severity is. Or they can choose to log using hierarchical logging flag\nenum class Level : base::type::EnumType {\n        /// @brief Generic level that represents all the levels. Useful when setting global configuration for all levels\n        Global = 1,\n        /// @brief Information that can be useful to back-trace certain events - mostly useful than debug logs.\n        Trace = 2,\n        /// @brief Informational events most useful for developers to debug application\n        Debug = 4,\n        /// @brief Severe error information that will presumably abort application\n        Fatal = 8, \n        /// @brief Information representing errors in application but application will keep running\n        Error = 16,\n        /// @brief Useful when application has potentially harmful situtaions\n        Warning = 32, \n        /// @brief Information that can be highly useful and vary with verbose logging level.\n        Verbose = 64,\n        /// @brief Mainly useful to represent current progress of application\n        Info = 128, \n        /// @brief Represents unknown level\n        Unknown = 1010\n};\n/// @brief Static class that contains helper functions for el::Level\nclass LevelHelper : base::StaticClass {\npublic:\n    /// @brief Represents minimum valid level. Useful when iterating through enum.\n    static const base::type::EnumType kMinValid = static_cast<base::type::EnumType>(Level::Trace);\n    /// @brief Represents maximum valid level. This is used internally and you should not need it.\n    static const base::type::EnumType kMaxValid = static_cast<base::type::EnumType>(Level::Info);\n    /// @brief Casts level to int, useful for iterating through enum.\n    static base::type::EnumType castToInt(Level level) {\n        return static_cast<base::type::EnumType>(level);\n    }\n    /// @brief Casts int(ushort) to level, useful for iterating through enum.\n    static Level castFromInt(base::type::EnumType l) {\n        return static_cast<Level>(l);\n    }\n    /// @brief Converts level to associated const char*\n    /// @return Upper case string based level.\n    static const char* convertToString(Level level) {\n       // Do not use switch over strongly typed enums because Intel C++ compilers dont support them yet.\n        if (level == Level::Global) return \"GLOBAL\";\n        if (level == Level::Debug) return \"DEBUG\";\n        if (level == Level::Info) return \"INFO\";\n        if (level == Level::Warning) return \"WARNING\";\n        if (level == Level::Error) return \"ERROR\";\n        if (level == Level::Fatal) return \"FATAL\";\n        if (level == Level::Verbose) return \"VERBOSE\";\n        if (level == Level::Trace) return \"TRACE\";\n        return \"UNKNOWN\";\n    }\n    /// @brief Converts from levelStr to Level\n    /// @param levelStr Upper case string based level.\n    ///        Lower case is also valid but providing upper case is recommended.\n    static Level convertFromString(const char* levelStr) {\n        if ((strcmp(levelStr, \"GLOBAL\") == 0) || (strcmp(levelStr, \"global\") == 0))\n            return Level::Global;\n        if ((strcmp(levelStr, \"DEBUG\") == 0) || (strcmp(levelStr, \"debug\") == 0))\n            return Level::Debug;\n        if ((strcmp(levelStr, \"INFO\") == 0) || (strcmp(levelStr, \"info\") == 0))\n            return Level::Info;\n        if ((strcmp(levelStr, \"WARNING\") == 0) || (strcmp(levelStr, \"warning\") == 0))\n            return Level::Warning;\n        if ((strcmp(levelStr, \"ERROR\") == 0) || (strcmp(levelStr, \"error\") == 0))\n            return Level::Error;\n        if ((strcmp(levelStr, \"FATAL\") == 0) || (strcmp(levelStr, \"fatal\") == 0))\n            return Level::Fatal;\n        if ((strcmp(levelStr, \"VERBOSE\") == 0) || (strcmp(levelStr, \"verbose\") == 0))\n            return Level::Verbose;\n        if ((strcmp(levelStr, \"TRACE\") == 0) || (strcmp(levelStr, \"trace\") == 0))\n            return Level::Trace;\n        return Level::Unknown;\n    }\n    /// @brief Applies specified function to each level starting from startIndex\n    /// @param startIndex initial value to start the iteration from. This is passed as pointer and \n    ///        is left-shifted so this can be used inside function (fn) to represent current level.\n    /// @param fn function to apply with each level. This bool represent whether or not to stop iterating through levels.\n    static inline void forEachLevel(base::type::EnumType* startIndex, const std::function<bool(void)>& fn) {\n        base::type::EnumType lIndexMax = LevelHelper::kMaxValid;\n        do {\n            if (fn()) {\n                break;\n            }\n            *startIndex = *startIndex << 1;\n        } while (*startIndex <= lIndexMax);\n    }\n};\n/// @brief Represents enumeration of ConfigurationType used to configure or access certain aspect\n/// of logging\nenum class ConfigurationType : base::type::EnumType {\n   /// @brief Determines whether or not corresponding level and logger of logging is enabled\n   /// You may disable all logs by using el::Level::Global\n    Enabled = 1,\n   /// @brief Whether or not to write corresponding log to log file\n    ToFile = 2,\n   /// @brief Whether or not to write corresponding level and logger log to standard output.\n   /// By standard output meaning termnal, command prompt etc\n    ToStandardOutput = 4,\n   /// @brief Determines format of logging corresponding level and logger.\n    Format = 8,\n   /// @brief Determines log file (full path) to write logs to for correponding level and logger\n    Filename = 16,\n   /// @brief Specifies milliseconds width. Width can be within range (1-6)\n    MillisecondsWidth = 32,\n   /// @brief Determines whether or not performance tracking is enabled.\n   ///\n   /// @detail This does not depend on logger or level. Performance tracking always uses 'performance' logger\n    PerformanceTracking = 64,\n   /// @brief Specifies log file max size.\n   ///\n   /// @detail If file size of corresponding log file (for corresponding level) is >= specified size, log file will \n   /// be truncated and re-initiated.\n    MaxLogFileSize = 128,\n   /// @brief Specifies number of log entries to hold until we flush pending log data\n    LogFlushThreshold = 256,\n   /// @brief Represents unknown configuration\n    Unknown = 1010\n};\n/// @brief Static class that contains helper functions for el::ConfigurationType\nclass ConfigurationTypeHelper : base::StaticClass {\npublic:\n    /// @brief Represents minimum valid configuration type. Useful when iterating through enum.\n    static const base::type::EnumType kMinValid = static_cast<base::type::EnumType>(ConfigurationType::Enabled);\n    /// @brief Represents maximum valid configuration type. This is used internally and you should not need it.\n    static const base::type::EnumType kMaxValid = static_cast<base::type::EnumType>(ConfigurationType::MaxLogFileSize);\n    /// @brief Casts configuration type to int, useful for iterating through enum.\n    static base::type::EnumType castToInt(ConfigurationType configurationType) {\n        return static_cast<base::type::EnumType>(configurationType);\n    }\n    /// @brief Casts int(ushort) to configurationt type, useful for iterating through enum.\n    static ConfigurationType castFromInt(base::type::EnumType c) {\n        return static_cast<ConfigurationType>(c);\n    }\n    /// @brief Converts configuration type to associated const char*\n    /// @returns Upper case string based configuration type.\n    static const char* convertToString(ConfigurationType configurationType) {\n        // Do not use switch over strongly typed enums because Intel C++ compilers dont support them yet.\n        if (configurationType == ConfigurationType::Enabled) return \"ENABLED\";\n        if (configurationType == ConfigurationType::Filename) return \"FILENAME\";\n        if (configurationType == ConfigurationType::Format) return \"FORMAT\";\n        if (configurationType == ConfigurationType::ToFile) return \"TO_FILE\";\n        if (configurationType == ConfigurationType::ToStandardOutput) return \"TO_STANDARD_OUTPUT\";\n        if (configurationType == ConfigurationType::MillisecondsWidth) return \"MILLISECONDS_WIDTH\";\n        if (configurationType == ConfigurationType::PerformanceTracking) return \"PERFORMANCE_TRACKING\";\n        if (configurationType == ConfigurationType::MaxLogFileSize) return \"MAX_LOG_FILE_SIZE\";\n        if (configurationType == ConfigurationType::LogFlushThreshold) return \"LOG_FLUSH_THRESHOLD\";\n        return \"UNKNOWN\";\n    }\n    /// @brief Converts from configStr to ConfigurationType\n    /// @param configStr Upper case string based configuration type.\n    ///        Lower case is also valid but providing upper case is recommended.\n    static ConfigurationType convertFromString(const char* configStr) {\n        if ((strcmp(configStr, \"ENABLED\") == 0) || (strcmp(configStr, \"enabled\") == 0))\n            return ConfigurationType::Enabled;\n        if ((strcmp(configStr, \"TO_FILE\") == 0) || (strcmp(configStr, \"to_file\") == 0))\n            return ConfigurationType::ToFile;\n        if ((strcmp(configStr, \"TO_STANDARD_OUTPUT\") == 0) || (strcmp(configStr, \"to_standard_output\") == 0))\n            return ConfigurationType::ToStandardOutput;\n        if ((strcmp(configStr, \"FORMAT\") == 0) || (strcmp(configStr, \"format\") == 0))\n            return ConfigurationType::Format;\n        if ((strcmp(configStr, \"FILENAME\") == 0) || (strcmp(configStr, \"filename\") == 0))\n            return ConfigurationType::Filename;\n        if ((strcmp(configStr, \"MILLISECONDS_WIDTH\") == 0) || (strcmp(configStr, \"milliseconds_width\") == 0))\n            return ConfigurationType::MillisecondsWidth;\n        if ((strcmp(configStr, \"PERFORMANCE_TRACKING\") == 0) || (strcmp(configStr, \"performance_tracking\") == 0))\n            return ConfigurationType::PerformanceTracking;\n        if ((strcmp(configStr, \"MAX_LOG_FILE_SIZE\") == 0) || (strcmp(configStr, \"max_log_file_size\") == 0))\n            return ConfigurationType::MaxLogFileSize;\n        if ((strcmp(configStr, \"LOG_FLUSH_THRESHOLD\") == 0) || (strcmp(configStr, \"log_flush_threshold\") == 0))\n            return ConfigurationType::LogFlushThreshold;\n        return ConfigurationType::Unknown;\n    }\n    /// @brief Applies specified function to each configuration type starting from startIndex\n    /// @param startIndex initial value to start the iteration from. This is passed by pointer and is left-shifted\n    ///        so this can be used inside function (fn) to represent current configuration type.\n    /// @param fn function to apply with each configuration type. \n    ///        This bool represent whether or not to stop iterating through configurations.\n    static inline void forEachConfigType(base::type::EnumType* startIndex, const std::function<bool(void)>& fn) {\n        base::type::EnumType cIndexMax = ConfigurationTypeHelper::kMaxValid;\n        do {\n            if (fn()) {\n                break;\n            }\n            *startIndex = *startIndex << 1;\n        } while (*startIndex <= cIndexMax);\n    }\n};\n/// @brief Flags used while writing logs. This flags are set by user\nenum class LoggingFlag : base::type::EnumType {\n    /// @brief Makes sure we have new line for each container log entry\n    NewLineForContainer = 1,\n    /// @brief Makes sure if -vmodule is used and does not specifies a module, then verbose\n    /// logging is allowed via that module.\n    AllowVerboseIfModuleNotSpecified = 2,\n    /// @brief When handling crashes by default, detailed crash reason will be logged as well\n    LogDetailedCrashReason = 4,\n    /// @brief Allows to disable application abortion when logged using FATAL level\n    DisableApplicationAbortOnFatalLog = 8,\n    /// @brief Flushes log with every log-entry (performance sensative) - Disabled by default\n    ImmediateFlush = 16,\n    /// @brief Enables strict file rolling\n    StrictLogFileSizeCheck = 32,\n    /// @brief Make terminal output colorful for supported terminals\n    ColoredTerminalOutput = 64,\n    /// @brief Supports use of multiple logging in same macro, e.g, CLOG(INFO, \"default\", \"network\")\n    MultiLoggerSupport = 128,\n    /// @brief Disables comparing performance tracker's checkpoints\n    DisablePerformanceTrackingCheckpointComparison = 256,\n    /// @brief Disable VModules\n    DisableVModules = 512,\n    /// @brief Disable VModules extensions\n    DisableVModulesExtensions = 1024,\n    /// @brief Enables hierarchical logging\n    HierarchicalLogging = 2048,\n    /// @brief Creates logger automatically when not available\n    CreateLoggerAutomatically = 4096,\n    /// @brief Adds spaces b/w logs that separated by left-shift operator\n    AutoSpacing = 8192\n};\nnamespace base {\n/// @brief Namespace containing constants used internally.\nnamespace consts {\n    // Level log values - These are values that are replaced in place of %level format specifier\n    static const base::type::char_t* kInfoLevelLogValue     =   ELPP_LITERAL(\"INFO \");\n    static const base::type::char_t* kDebugLevelLogValue    =   ELPP_LITERAL(\"DEBUG\");\n    static const base::type::char_t* kWarningLevelLogValue  =   ELPP_LITERAL(\"WARN \");\n    static const base::type::char_t* kErrorLevelLogValue    =   ELPP_LITERAL(\"ERROR\");\n    static const base::type::char_t* kFatalLevelLogValue    =   ELPP_LITERAL(\"FATAL\");\n    static const base::type::char_t* kVerboseLevelLogValue  =   ELPP_LITERAL(\"VER\");\n    static const base::type::char_t* kTraceLevelLogValue    =   ELPP_LITERAL(\"TRACE\");\n    // Format specifiers - These are used to define log format\n    static const base::type::char_t* kAppNameFormatSpecifier          =      ELPP_LITERAL(\"%app\");\n    static const base::type::char_t* kLoggerIdFormatSpecifier         =      ELPP_LITERAL(\"%logger\");\n    static const base::type::char_t* kThreadIdFormatSpecifier         =      ELPP_LITERAL(\"%thread\");\n    static const base::type::char_t* kSeverityLevelFormatSpecifier    =      ELPP_LITERAL(\"%level\");\n    static const base::type::char_t* kDateTimeFormatSpecifier         =      ELPP_LITERAL(\"%datetime\");\n    static const base::type::char_t* kLogFileFormatSpecifier          =      ELPP_LITERAL(\"%file\");\n    static const base::type::char_t* kLogLineFormatSpecifier          =      ELPP_LITERAL(\"%line\");\n    static const base::type::char_t* kLogLocationFormatSpecifier      =      ELPP_LITERAL(\"%loc\");\n    static const base::type::char_t* kLogFunctionFormatSpecifier      =      ELPP_LITERAL(\"%func\");\n    static const base::type::char_t* kCurrentUserFormatSpecifier      =      ELPP_LITERAL(\"%user\");\n    static const base::type::char_t* kCurrentHostFormatSpecifier      =      ELPP_LITERAL(\"%host\");\n    static const base::type::char_t* kMessageFormatSpecifier          =      ELPP_LITERAL(\"%msg\");\n    static const base::type::char_t* kVerboseLevelFormatSpecifier     =      ELPP_LITERAL(\"%vlevel\");\n    static const char* kDateTimeFormatSpecifierForFilename            =      \"%datetime\";\n    // Date/time\n    static const char* kDays[7]                         =      { \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" };\n    static const char* kDaysAbbrev[7]                   =      { \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" };\n    static const char* kMonths[12]                      =      { \"January\", \"February\", \"March\", \"Apri\", \"May\", \"June\", \"July\", \"August\",\n            \"September\", \"October\", \"November\", \"December\" };\n    static const char* kMonthsAbbrev[12]                =      { \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" };\n    static const char* kDefaultDateTimeFormat           =      \"%d/%M/%Y %H:%m:%s,%g\";\n    static const char* kDefaultDateTimeFormatInFilename =      \"%d-%M-%Y_%H-%m\";\n    static const int kYearBase                          =      1900;\n    static const char* kAm                              =      \"AM\";\n    static const char* kPm                              =      \"PM\";\n    // Miscellaneous constants\n    static const char* kDefaultLoggerId                        =      \"default\";\n    static const char* kPerformanceLoggerId                    =      \"performance\";\n    static const char* kSysLogLoggerId                         =      \"syslog\";\n    static const char* kNullPointer                            =      \"nullptr\";\n    static const char  kFormatSpecifierChar                    =      '%';\n#if _ELPP_VARIADIC_TEMPLATES_SUPPORTED\n    static const char  kFormatSpecifierCharValue               =      'v';\n#endif  // _ELPP_VARIADIC_TEMPLATES_SUPPORTED\n    static const unsigned int kMaxLogPerContainer              =      100;\n    static const unsigned int kMaxLogPerCounter                =      100000;\n    static const unsigned int  kDefaultMillisecondsWidth       =      3;\n    static const base::type::VerboseLevel kMaxVerboseLevel     =      9;\n    static const char* kUnknownUser                            =      \"user\";\n    static const char* kUnknownHost                            =      \"unknown-host\";\n#if defined(_ELPP_DEFAULT_LOG_FILE)\n    static const char* kDefaultLogFile                         =      _ELPP_DEFAULT_LOG_FILE;\n#else\n#   if _ELPP_OS_UNIX\n#      if _ELPP_OS_ANDROID\n    static const char* kDefaultLogFile                         =      \"logs/myeasylog.log\";\n#      else\n    static const char* kDefaultLogFile                         =      \"logs/myeasylog.log\";\n#      endif  // _ELPP_OS_ANDROID\n#   elif _ELPP_OS_WINDOWS\n    static const char* kDefaultLogFile                         =      \"logs\\\\myeasylog.log\";\n#   endif  // _ELPP_OS_UNIX\n#endif  // defined(_ELPP_DEFAULT_LOG_FILE)\n#if !defined(_ELPP_DISABLE_LOG_FILE_FROM_ARG)\n    static const char* kDefaultLogFileParam                    =      \"--default-log-file\";\n#endif  // !defined(_ELPP_DISABLE_LOG_FILE_FROM_ARG)\n#if defined(_ELPP_LOGGING_FLAGS_FROM_ARG)\n    static const char* kLoggingFlagsParam                      =      \"--logging-flags\";\n#endif  // defined(_ELPP_LOGGING_FLAGS_FROM_ARG)\n#if _ELPP_OS_WINDOWS\n    static const char* kFilePathSeperator                      =      \"\\\\\";\n#else\n    static const char* kFilePathSeperator                      =      \"/\";\n#endif  // _ELPP_OS_WINDOWS\n    static const char* kValidLoggerIdSymbols                   =      \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._\";\n    static const char* kConfigurationComment                   =      \"##\";\n    static const char* kConfigurationLevel                     =      \"*\";\n    static const char* kConfigurationLoggerId                  =      \"--\";\n    static const std::size_t kSourceFilenameMaxLength          =      100;\n    static const std::size_t kSourceLineMaxLength              =      10;\n    static const Level kPerformanceTrackerDefaultLevel         =      Level::Info;\n    const struct {\n        double value;\n        const base::type::char_t* unit;\n    } kTimeFormats[] = {\n       { 1000.0f, ELPP_LITERAL(\"mis\") },\n       { 1000.0f, ELPP_LITERAL(\"ms\") },\n       { 60.0f, ELPP_LITERAL(\"seconds\") },\n       { 60.0f, ELPP_LITERAL(\"minutes\") },\n       { 24.0f, ELPP_LITERAL(\"hours\") },\n       { 7.0f, ELPP_LITERAL(\"days\") }\n    };\n    static const int kTimeFormatsCount                           =      sizeof(kTimeFormats) / sizeof(kTimeFormats[0]);\n    const struct {\n        int numb;\n        const char* name;\n        const char* brief;\n        const char* detail;\n    } kCrashSignals[] = {\n        // NOTE: Do not re-order, if you do please check CrashHandler(bool) constructor and CrashHandler::setHandler(..)\n        { SIGABRT, \"SIGABRT\", \"Abnormal termination\",\n                \"Program was abnormally terminated.\" },\n        { SIGFPE, \"SIGFPE\", \"Erroneous arithmetic operation\",\n                \"Arithemetic operation issue such as division by zero or operation resulting in overflow.\" },\n        { SIGILL, \"SIGILL\", \"Illegal instruction\",\n                \"Generally due to a corruption in the code or to an attempt to execute data.\"},\n        { SIGSEGV, \"SIGSEGV\", \"Invalid access to memory\",\n                \"Program is trying to read an invalid (unallocated, deleted or corrupted) or inaccessible memory.\" },\n        { SIGINT, \"SIGINT\", \"Interactive attention signal\",\n                 \"Interruption generated (generally) by user or operating system.\" },\n    };\n    static const int kCrashSignalsCount                          =      sizeof(kCrashSignals) / sizeof(kCrashSignals[0]);\n}  // namespace consts\n}  // namespace base\ntypedef std::function<void(const char*, std::size_t)> PreRollOutCallback;\nnamespace base {\nstatic inline void defaultPreRollOutCallback(const char*, std::size_t) {}\n/// @brief Enum to represent timestamp unit\nenum class TimestampUnit : base::type::EnumType {\n    Microsecond = 0, Millisecond = 1, Second = 2, Minute = 3, Hour = 4, Day = 5\n};\n/// @brief Format flags used to determine specifiers that are active for performance improvements.\nenum class FormatFlags : base::type::EnumType {\n    DateTime = 2, LoggerId = 4, File = 8, Line = 16, Location = 32, Function = 64,\n    User = 128, Host = 256, LogMessage = 512, VerboseLevel = 1024, AppName = 2048, ThreadId = 4096,\n    Level = 8192\n};\n/// @brief A milliseconds width class containing actual width and offset for date/time\nclass MillisecondsWidth {\npublic:\n    MillisecondsWidth(void) { init(base::consts::kDefaultMillisecondsWidth); }\n    explicit MillisecondsWidth(int width) { init(width); }\n    bool operator==(const MillisecondsWidth& msWidth) { return m_width == msWidth.m_width && m_offset == msWidth.m_offset; }\n    int m_width; unsigned int m_offset;\nprivate:\n    void init(int width) {\n        if (width < 1 || width > 6) {\n            width = base::consts::kDefaultMillisecondsWidth;\n        }\n        m_width = width;\n        switch (m_width) {\n        case 3: m_offset = 1000; break;\n        case 4: m_offset = 100; break;\n        case 5: m_offset = 10; break;\n        case 6: m_offset = 1; break;\n        default: m_offset = 1000; break;\n        }\n    }\n};\n/// @brief Namespace containing utility functions/static classes used internally\nnamespace utils {\n/// @brief Deletes memory safely and points to null\ntemplate <typename T>\ntypename std::enable_if<std::is_pointer<T*>::value, void>::type\nstatic inline safeDelete(T*& pointer) {  // NOLINT\n    if (pointer == nullptr)\n        return;\n    delete pointer;\n    pointer = nullptr;\n}\n/// @brief Gets value of const char* but if it is nullptr, a string nullptr is returned\nstatic inline const char* charPtrVal(const char* pointer) {\n    return pointer == nullptr ? base::consts::kNullPointer : pointer;\n}\n/// @brief Aborts application due with user-defined status\nstatic inline void abort(int status, const std::string& reason = std::string()) {\n    // Both status and reason params are there for debugging with tools like gdb etc\n    _ELPP_UNUSED(status);\n    _ELPP_UNUSED(reason);\n#if defined(_ELPP_COMPILER_MSVC) && defined(_M_IX86) && defined(_DEBUG)\n   // Ignore msvc critical error dialog - break instead (on debug mode)\n    _asm int 3\n#else\n    ::abort();\n#endif  // defined(_ELPP_COMPILER_MSVC) && defined(_M_IX86) && defined(_DEBUG)\n}\n/// @brief Bitwise operations for C++11 strong enum class. This casts e into Flag_T and returns value after bitwise operation\n/// Use these function as <pre>flag = bitwise::Or<MyEnum>(MyEnum::val1, flag);</pre>\nnamespace bitwise {\ntemplate <typename Enum>\nstatic inline base::type::EnumType And(Enum e, base::type::EnumType flag) {\n    return static_cast<base::type::EnumType>(flag) & static_cast<base::type::EnumType>(e);\n}\ntemplate <typename Enum>\nstatic inline base::type::EnumType Not(Enum e, base::type::EnumType flag) {\n    return static_cast<base::type::EnumType>(flag) & ~(static_cast<base::type::EnumType>(e));\n}\ntemplate <typename Enum>\nstatic inline base::type::EnumType Or(Enum e, base::type::EnumType flag) {\n    return static_cast<base::type::EnumType>(flag) | static_cast<base::type::EnumType>(e);\n}\n}  // namespace bitwise\ntemplate <typename Enum>\nstatic inline void addFlag(Enum e, base::type::EnumType* flag) {\n    *flag = base::utils::bitwise::Or<Enum>(e, *flag);\n}\ntemplate <typename Enum>\nstatic inline void removeFlag(Enum e, base::type::EnumType* flag) {\n    *flag = base::utils::bitwise::Not<Enum>(e, *flag);\n}\ntemplate <typename Enum>\nstatic inline bool hasFlag(Enum e, base::type::EnumType flag) {\n    return base::utils::bitwise::And<Enum>(e, flag) > 0x0;\n}\n}  // namespace utils\nnamespace threading {\n#if _ELPP_THREADING_ENABLED\n#   if !_ELPP_USE_STD_THREADING\nnamespace internal {\n/// @brief A mutex wrapper for compiler that dont yet support std::mutex\nclass Mutex {\npublic:\n    Mutex(void) {\n#   if _ELPP_OS_UNIX\n        pthread_mutex_init(&m_underlyingMutex, nullptr);\n#   elif _ELPP_OS_WINDOWS\n        InitializeCriticalSection(&m_underlyingMutex);\n#   endif  // _ELPP_OS_UNIX\n    }\n\n    virtual ~Mutex(void) {\n#   if _ELPP_OS_UNIX\n        pthread_mutex_destroy(&m_underlyingMutex);\n#   elif _ELPP_OS_WINDOWS\n        DeleteCriticalSection(&m_underlyingMutex);\n#   endif  // _ELPP_OS_UNIX\n    }\n\n    inline void lock(void) {\n#   if _ELPP_OS_UNIX\n        pthread_mutex_lock(&m_underlyingMutex);\n#   elif _ELPP_OS_WINDOWS\n        EnterCriticalSection(&m_underlyingMutex);\n#   endif  // _ELPP_OS_UNIX\n    }\n\n    inline bool try_lock(void) {\n#   if _ELPP_OS_UNIX\n        return (pthread_mutex_trylock(&m_underlyingMutex) == 0);\n#   elif _ELPP_OS_WINDOWS\n        return TryEnterCriticalSection(&m_underlyingMutex);\n#   endif  // _ELPP_OS_UNIX\n    }\n\n    inline void unlock(void) {\n#   if _ELPP_OS_UNIX\n        pthread_mutex_unlock(&m_underlyingMutex);\n#   elif _ELPP_OS_WINDOWS\n        LeaveCriticalSection(&m_underlyingMutex);\n#   endif  // _ELPP_OS_UNIX\n    }\n\nprivate:\n#   if _ELPP_OS_UNIX\n    pthread_mutex_t m_underlyingMutex;\n#   elif _ELPP_OS_WINDOWS\n    CRITICAL_SECTION m_underlyingMutex;\n#   endif  // _ELPP_OS_UNIX\n};\n/// @brief Scoped lock for compiler that dont yet support std::lock_guard\ntemplate <typename M>\nclass ScopedLock : base::NoCopy {\npublic:\n    explicit ScopedLock(M& mutex) {  // NOLINT\n        m_mutex = &mutex;\n        m_mutex->lock();\n    }\n\n    virtual ~ScopedLock(void) {\n        m_mutex->unlock();\n    }\nprivate:\n    M* m_mutex;\n    ScopedLock(void);\n};\n} // namespace internal\n/// @brief Gets ID of currently running threading in windows systems. On unix, nothing is returned.\nstatic inline std::string getCurrentThreadId(void) {\n    std::stringstream ss;\n#      if (_ELPP_OS_WINDOWS)\n    ss << GetCurrentThreadId();\n#      endif  // (_ELPP_OS_WINDOWS)\n    return ss.str();\n}\ntypedef base::threading::internal::Mutex Mutex;\ntypedef base::threading::internal::ScopedLock<base::threading::Mutex> ScopedLock;\n#   else\n/// @brief Gets ID of currently running threading using std::this_thread::get_id()\nstatic inline std::string getCurrentThreadId(void) {\n    std::stringstream ss;\n    ss << std::this_thread::get_id();\n    return ss.str();\n}\ntypedef std::mutex Mutex;\ntypedef std::lock_guard<std::mutex> ScopedLock;\n#   endif  // !_ELPP_USE_STD_THREADING\n#else\nnamespace internal {\n/// @brief Mutex wrapper used when multi-threading is disabled.\nclass NoMutex {\npublic:\n    NoMutex(void) {}\n    inline void lock(void) {}\n    inline bool try_lock(void) { return true; }\n    inline void unlock(void) {}\n};\n/// @brief Lock guard wrapper used when multi-threading is disabled.\ntemplate <typename Mutex>\nclass NoScopedLock : base::NoCopy {\npublic:\n    explicit NoScopedLock(Mutex&) {\n    }\n    virtual ~NoScopedLock(void) {\n    }\nprivate:\n    NoScopedLock(void);\n};\n}  // namespace internal\nstatic inline std::string getCurrentThreadId(void) {\n    return std::string();\n}\ntypedef base::threading::internal::NoMutex Mutex;\ntypedef base::threading::internal::NoScopedLock<base::threading::Mutex> ScopedLock;\n#endif  // _ELPP_THREADING_ENABLED\n/// @brief Base of thread safe class, this class is inheritable-only\nclass ThreadSafe {\npublic:\n    virtual inline void acquireLock(void) ELPP_FINAL { m_mutex.lock(); }\n    virtual inline void releaseLock(void) ELPP_FINAL { m_mutex.unlock(); }\n    virtual inline base::threading::Mutex& lock(void) ELPP_FINAL { return m_mutex; }\nprotected:\n    ThreadSafe(void) {}\n    virtual ~ThreadSafe(void) {}\nprivate:\n    base::threading::Mutex m_mutex;\n};\n}  // namespace threading\nnamespace utils {\nclass File : base::StaticClass {\npublic:\n    /// @brief Creates new out file stream for specified filename.\n    /// @return Pointer to newly created fstream or nullptr\n    static base::type::fstream_t* newFileStream(const std::string& filename) {\n        base::type::fstream_t *fs = new base::type::fstream_t(filename.c_str(), \n            base::type::fstream_t::out | base::type::fstream_t::app);\n#if defined(_ELPP_UNICODE)\n        std::locale elppUnicodeLocale(\"\");\n        fs->imbue(elppUnicodeLocale);\n#endif  // defined(_ELPP_UNICODE)\n        if (fs->is_open()) {\n            fs->flush();\n        } else {\n            base::utils::safeDelete(fs);\n            ELPP_INTERNAL_ERROR(\"Bad file [\" << filename << \"]\", true);\n        }\n        return fs;\n    }\n\n    /// @brief Gets size of file provided in stream\n    static std::size_t getSizeOfFile(base::type::fstream_t* fs) {\n        if (fs == nullptr) {\n            return 0;\n        }\n        std::streampos currPos = fs->tellg();\n        fs->seekg(0, fs->end);\n        std::size_t size = static_cast<std::size_t>(fs->tellg());\n        fs->seekg(currPos);\n        return size;\n    }\n\n    /// @brief Determines whether or not provided path exist in current file system\n    static inline bool pathExists(const char* path, bool considerFile = false) {\n        if (path == nullptr) {\n            return false;\n        }\n#if _ELPP_OS_UNIX\n        _ELPP_UNUSED(considerFile);\n        struct stat st;\n        return (stat(path, &st) == 0);\n#elif _ELPP_OS_WINDOWS\n        DWORD fileType = GetFileAttributesA(path);\n        if (fileType == INVALID_FILE_ATTRIBUTES) {\n            return false;\n        }\n        return considerFile ? true : ((fileType & FILE_ATTRIBUTE_DIRECTORY) == 0 ? false : true);\n#endif  // _ELPP_OS_UNIX\n    }\n\n    /// @brief Creates specified path on file system\n    /// @param path Path to create.\n    static bool createPath(const std::string& path) {\n        if (path.empty()) {\n            return false;\n        }\n        if (base::utils::File::pathExists(path.c_str())) {\n            return true;\n        }\n        int status = -1;\n\n        char* currPath = const_cast<char*>(path.c_str());\n        std::string builtPath = std::string();\n#if _ELPP_OS_UNIX\n        if (path[0] == '/') {\n            builtPath = \"/\";\n        }\n        currPath = STRTOK(currPath, base::consts::kFilePathSeperator, 0);\n#elif _ELPP_OS_WINDOWS\n        // Use secure functions API\n        char* nextTok_;\n        currPath = STRTOK(currPath, base::consts::kFilePathSeperator, &nextTok_);\n        _ELPP_UNUSED(nextTok_);\n#endif  // _ELPP_OS_UNIX\n        while (currPath != nullptr) {\n            builtPath.append(currPath);\n            builtPath.append(base::consts::kFilePathSeperator);\n#if _ELPP_OS_UNIX\n            status = mkdir(builtPath.c_str(), _ELPP_LOG_PERMS);\n            currPath = STRTOK(nullptr, base::consts::kFilePathSeperator, 0);\n#elif _ELPP_OS_WINDOWS\n            status = _mkdir(builtPath.c_str());\n            currPath = STRTOK(nullptr, base::consts::kFilePathSeperator, &nextTok_);\n#endif  // _ELPP_OS_UNIX\n        }\n        if (status == -1) {\n            ELPP_INTERNAL_ERROR(\"Error while creating path [\" << path << \"]\", true);\n            return false;\n        }\n        return true;\n    }\n    /// @brief Extracts path of filename with leading slash\n    static std::string extractPathFromFilename(const std::string& fullPath,\n            const char* seperator = base::consts::kFilePathSeperator) {\n        if ((fullPath == \"\") || (fullPath.find(seperator) == std::string::npos)) {\n            return fullPath;\n        }\n        std::size_t lastSlashAt = fullPath.find_last_of(seperator);\n        if (lastSlashAt == 0) {\n            return std::string(seperator);\n        }\n        return fullPath.substr(0, lastSlashAt + 1);\n    }\n    /// @brief builds stripped filename and puts it in buff\n    static void buildStrippedFilename(const char* filename, char buff[], \n            std::size_t limit = base::consts::kSourceFilenameMaxLength) {\n        std::size_t sizeOfFilename = strlen(filename);\n//        if (sizeOfFilename >= limit) {\n//            filename += (sizeOfFilename - limit);\n//            if (filename[0] != '.' && filename[1] != '.') {  // prepend if not already\n//                filename += 3;  // 3 = '..'\n//                STRCAT(buff, \"..\", limit);\n//            }\n//        }\n        const char *p = &filename[sizeOfFilename-1];\n        while (*p != '/' && p != filename) --p;\n        if (p != filename) p++;\n        STRCAT(buff, p, limit);\n//        STRCAT(buff, filename, limit);\n    }\n};\n/// @brief String utilities helper class used internally. You should not use it.\nclass Str : base::StaticClass {\npublic:\n    /// @brief Checks if character is digit. Dont use libc implementation of it to prevent locale issues.\n    static inline bool isDigit(char c) {\n        return c >= '0' && c <= '9';\n    }\n\n    /// @brief Matches wildcards, '*' and '?' only supported.\n    static bool wildCardMatch(const char* str, const char* pattern) {\n        while (*pattern) {\n            switch (*pattern) {\n            case '?':\n                if (!*str)\n                    return false;\n                ++str;\n                ++pattern;\n                break;\n            case '*':\n                if (wildCardMatch(str, pattern + 1))\n                    return true;\n                if (*str && wildCardMatch(str + 1, pattern))\n                    return true;\n                return false;\n                break;\n            default:\n                if (*str++ != *pattern++)\n                    return false;\n                break;\n            }\n        }\n        return !*str && !*pattern;\n    }\n\n    /// @brief Trims string from start\n    /// @param [in,out] str String to trim\n    static inline std::string& ltrim(std::string& str) {  // NOLINT\n        str.erase(str.begin(), std::find_if(str.begin(), str.end(), std::not1(std::ptr_fun<int, int>(&std::isspace))));\n        return str;\n    }\n\n    /// @brief Trim string from end\n    /// @param [in,out] str String to trim\n    static inline std::string& rtrim(std::string& str) {  // NOLINT\n        str.erase(std::find_if(str.rbegin(), str.rend(), std::not1(std::ptr_fun<int, int>(&std::isspace))).base(), str.end());\n        return str;\n    }\n\n    /// @brief Trims string from left and right\n    /// @param [in,out] str String to trim\n    static inline std::string& trim(std::string& str) {  // NOLINT\n        return ltrim(rtrim(str));\n    }\n\n    /// @brief Determines whether or not str starts with specified string\n    /// @param str String to check\n    /// @param start String to check against\n    /// @return Returns true if starts with specified string, false otherwise\n    static inline bool startsWith(const std::string& str, const std::string& start) {\n        return (str.length() >= start.length()) && (str.compare(0, start.length(), start) == 0);\n    }\n\n    /// @brief Determines whether or not str ends with specified string\n    /// @param str String to check\n    /// @param end String to check against\n    /// @return Returns true if ends with specified string, false otherwise\n    static inline bool endsWith(const std::string& str, const std::string& end) {\n        return (str.length() >= end.length()) && (str.compare(str.length() - end.length(), end.length(), end) == 0);\n    }\n\n    /// @brief Replaces all instances of replaceWhat with 'replaceWith'. Original variable is changed for performance.\n    /// @param [in,out] str String to replace from\n    /// @param replaceWhat Character to replace\n    /// @param replaceWith Character to replace with\n    /// @return Modified version of str\n    static inline std::string& replaceAll(std::string& str, char replaceWhat, char replaceWith) {  // NOLINT\n        std::replace(str.begin(), str.end(), replaceWhat, replaceWith);\n        return str;\n    }\n\n    /// @brief Replaces all instances of 'replaceWhat' with 'replaceWith'. (String version) Replaces in place\n    /// @param str String to replace from\n    /// @param replaceWhat Character to replace\n    /// @param replaceWith Character to replace with\n    /// @return Modified (original) str\n    static inline std::string& replaceAll(std::string& str, const std::string& replaceWhat, // NOLINT\n            const std::string& replaceWith) {\n        if (replaceWhat == replaceWith)\n            return str;\n        std::size_t foundAt = std::string::npos;\n        while ((foundAt = str.find(replaceWhat, foundAt + 1)) != std::string::npos) {\n            str.replace(foundAt, replaceWhat.length(), replaceWith);\n        }\n        return str;\n    }\n\n    static void replaceFirstWithEscape(base::type::string_t& str, const base::type::string_t& replaceWhat, // NOLINT\n            const base::type::string_t& replaceWith) {\n        std::size_t foundAt = base::type::string_t::npos;\n        while ((foundAt = str.find(replaceWhat, foundAt + 1)) != base::type::string_t::npos) {\n            if (foundAt > 0 && str[foundAt - 1] == base::consts::kFormatSpecifierChar) {\n                str.erase(foundAt > 0 ? foundAt - 1 : 0, 1);\n                ++foundAt;\n            } else {\n                str.replace(foundAt, replaceWhat.length(), replaceWith);\n                return;\n            }\n        }\n    }\n#if defined(_ELPP_UNICODE)\n    static void replaceFirstWithEscape(base::type::string_t& str, const base::type::string_t& replaceWhat, // NOLINT\n            const std::string& replaceWith) {\n        replaceFirstWithEscape(str, replaceWhat, base::type::string_t(replaceWith.begin(), replaceWith.end()));\n    }\n#endif  // defined(_ELPP_UNICODE)\n    /// @brief Converts string to uppercase\n    /// @param str String to convert\n    /// @return Uppercase string\n    static inline std::string& toUpper(std::string& str) {  // NOLINT\n        std::transform(str.begin(), str.end(), str.begin(), ::toupper);\n        return str;\n    }\n\n    /// @brief Compares cstring equality - uses strcmp\n    static inline bool cStringEq(const char* s1, const char* s2) {\n        if (s1 == nullptr && s2 == nullptr) return true;\n        if (s1 == nullptr || s2 == nullptr) return false;\n        return strcmp(s1, s2) == 0;\n    }\n\n    /// @brief Compares cstring equality (case-insensitive) - uses toupper(char)\n    /// Dont use strcasecmp because of CRT (VC++)\n    static bool cStringCaseEq(const char* s1, const char* s2) {\n        if (s1 == nullptr && s2 == nullptr) return true;\n        if (s1 == nullptr || s2 == nullptr) return false;\n        if (strlen(s1) != strlen(s2)) return false;\n        while (*s1 != '\\0' && *s2 != '\\0') {\n            if (::toupper(*s1) != ::toupper(*s2)) return false;\n            ++s1;\n            ++s2;\n        }\n        return true;\n    }\n\n    /// @brief Returns true if c exist in str\n    static inline bool contains(const char* str, char c) {\n        for (; *str; ++str) {\n            if (*str == c)\n                return true;\n        }\n        return false;\n    }\n\n    static inline char* convertAndAddToBuff(std::size_t n, int len, char* buf, const char* bufLim, bool zeroPadded = true) {\n        char localBuff[10] = \"\";\n        char* p = localBuff + sizeof(localBuff) - 2;\n        if (n > 0) {\n            for (; n > 0 && p > localBuff && len > 0; n /= 10, --len)\n                *--p = static_cast<char>(n % 10 + '0');\n        } else {\n            *--p = '0';\n            --len;\n        }\n        if (zeroPadded)\n            while (p > localBuff && len-- > 0) *--p = static_cast<char>('0');\n        return addToBuff(p, buf, bufLim);\n    }\n\n    static inline char* addToBuff(const char* str, char* buf, const char* bufLim) {\n        while ((buf < bufLim) && ((*buf = *str++) != '\\0'))\n            ++buf;\n        return buf;\n    }\n\n    static inline char* clearBuff(char buff[], std::size_t lim) {\n        STRCPY(buff, \"\", lim);\n        _ELPP_UNUSED(lim);  // For *nix we dont have anything using lim in above STRCPY macro\n        return buff;\n    }\n\n    /// @brief Converst wchar* to char*\n    ///        NOTE: Need to free return value after use!\n    static char* wcharPtrToCharPtr(const wchar_t* line) {\n        std::size_t len_ = wcslen(line) + 1;\n        char* buff_ = static_cast<char*>(malloc(len_ + 1));\n#      if _ELPP_OS_UNIX || (_ELPP_OS_WINDOWS && !_ELPP_CRT_DBG_WARNINGS)\n        std::wcstombs(buff_, line, len_);\n#      elif _ELPP_OS_WINDOWS\n        std::size_t convCount_ = 0;\n        mbstate_t mbState_;\n        ::memset(static_cast<void*>(&mbState_), 0, sizeof(mbState_));\n        wcsrtombs_s(&convCount_, buff_, len_, &line, len_, &mbState_);\n#      endif  // _ELPP_OS_UNIX || (_ELPP_OS_WINDOWS && !_ELPP_CRT_DBG_WARNINGS)\n       return buff_;\n    }\n};\n/// @brief Operating System helper static class used internally. You should not use it.\nclass OS : base::StaticClass {\npublic:\n#if _ELPP_OS_WINDOWS\n    /// @brief Gets environment variables for Windows based OS. \n    ///        We are not using <code>getenv(const char*)</code> because of CRT deprecation\n    /// @param varname Variable name to get environment variable value for\n    /// @return If variable exist the value of it otherwise nullptr\n    static const char* getWindowsEnvironmentVariable(const char* varname) {\n        const DWORD bufferLen = 50;\n        static char buffer[bufferLen];\n        if (GetEnvironmentVariableA(varname, buffer, bufferLen)) {\n            return buffer;\n        }\n        return nullptr;\n    }\n#endif  // _ELPP_OS_WINDOWS\n#if _ELPP_OS_ANDROID\n    /// @brief Reads android property value\n    static inline std::string getProperty(const char* prop) {\n        char propVal[PROP_VALUE_MAX + 1];\n        int ret = __system_property_get(prop, propVal);\n        return ret == 0 ? std::string() : std::string(propVal);\n    }\n\n    /// @brief Reads android device name\n    static std::string getDeviceName(void) {\n        std::stringstream ss;\n        std::string manufacturer = getProperty(\"ro.product.manufacturer\");\n        std::string model = getProperty(\"ro.product.model\");\n        if (manufacturer.empty() || model.empty()) {\n            return std::string();\n        }\n        ss << manufacturer << \"-\" << model;\n        return ss.str();\n    }\n#endif  // _ELPP_OS_ANDROID\n\n    /// @brief Runs command on terminal and returns the output.\n    ///\n    /// @detail This is applicable only on unix based systems, for all other OS, an empty string is returned.\n    /// @param command Bash command\n    /// @return Result of bash output or empty string if no result found.\n    static const std::string getBashOutput(const char* command) {\n#if (_ELPP_OS_UNIX && !_ELPP_OS_ANDROID && !_ELPP_CYGWIN)\n        if (command == nullptr) {\n            return std::string();\n        }\n        FILE* proc = nullptr;\n        if ((proc = popen(command, \"r\")) == nullptr) {\n            ELPP_INTERNAL_ERROR(\"\\nUnable to run command [\" << command << \"]\", true);\n            return std::string();\n        }\n        char hBuff[4096];\n        if (fgets(hBuff, sizeof(hBuff), proc) != nullptr) {\n            pclose(proc);\n            if (hBuff[strlen(hBuff) - 1] == '\\n') {\n                hBuff[strlen(hBuff) - 1] = '\\0';\n            }\n            return std::string(hBuff);\n        }\n        return std::string();\n#else\n        _ELPP_UNUSED(command);\n        return std::string();\n#endif  // (_ELPP_OS_UNIX && !_ELPP_OS_ANDROID && !_ELPP_CYGWIN)\n    }\n\n    /// @brief Gets environment variable. This is cross-platform and CRT safe (for VC++)\n    /// @param variableName Environment variable name\n    /// @param defaultVal If no environment variable or value found the value to return by default\n    /// @param alternativeBashCommand If environment variable not found what would be alternative bash command\n    ///        in order to look for value user is looking for. E.g, for 'user' alternative command will 'whoami'\n    static std::string getEnvironmentVariable(const char* variableName, const char* defaultVal, const char* alternativeBashCommand = nullptr) {\n#if _ELPP_OS_UNIX\n        const char* val = getenv(variableName);\n#elif _ELPP_OS_WINDOWS\n        const char* val = getWindowsEnvironmentVariable(variableName);\n#endif  // _ELPP_OS_UNIX\n        if ((val == nullptr) || ((strcmp(val, \"\") == 0))) {\n#if _ELPP_OS_UNIX && defined(_ELPP_FORCE_ENV_VAR_FROM_BASH)\n           // Try harder on unix-based systems\n            std::string valBash = base::utils::OS::getBashOutput(alternativeBashCommand);\n            if (valBash.empty()) {\n                return std::string(defaultVal);\n            } else {\n                return valBash;\n            }\n#elif _ELPP_OS_WINDOWS || _ELPP_OS_UNIX\n            _ELPP_UNUSED(alternativeBashCommand);\n            return std::string(defaultVal);\n#endif  // _ELPP_OS_UNIX && defined(_ELPP_FORCE_ENV_VAR_FROM_BASH)\n        }\n        return std::string(val);\n    }\n   /// @brief Gets current username.\n    static inline std::string currentUser(void) {\n#if _ELPP_OS_UNIX && !_ELPP_OS_ANDROID\n        return getEnvironmentVariable(\"USER\", base::consts::kUnknownUser, \"whoami\");\n#elif _ELPP_OS_WINDOWS\n        return getEnvironmentVariable(\"USERNAME\", base::consts::kUnknownUser);\n#elif _ELPP_OS_ANDROID\n        _ELPP_UNUSED(base::consts::kUnknownUser);\n        return std::string(\"android\");\n#else\n        return std::string();\n#endif  // _ELPP_OS_UNIX && !_ELPP_OS_ANDROID\n    }\n\n    /// @brief Gets current host name or computer name.\n    ///\n    /// @detail For android systems this is device name with its manufacturer and model seperated by hyphen\n    static inline std::string currentHost(void) {\n#if _ELPP_OS_UNIX && !_ELPP_OS_ANDROID\n        return getEnvironmentVariable(\"HOSTNAME\", base::consts::kUnknownHost, \"hostname\");\n#elif _ELPP_OS_WINDOWS\n        return getEnvironmentVariable(\"COMPUTERNAME\", base::consts::kUnknownHost);\n#elif _ELPP_OS_ANDROID\n        _ELPP_UNUSED(base::consts::kUnknownHost);\n        return getDeviceName();\n#else\n        return std::string();\n#endif  // _ELPP_OS_UNIX && !_ELPP_OS_ANDROID\n    }\n    /// @brief Whether or not terminal supports colors\n    static inline bool termSupportsColor(void) {\n        std::string term = getEnvironmentVariable(\"TERM\", \"\");\n        return term == \"xterm\" || term == \"xterm-color\" || term == \"xterm-256color\" ||\n                              term == \"screen\" || term == \"linux\" || term == \"cygwin\";\n    }\n};\nextern std::string s_currentUser;\nextern std::string s_currentHost;\nextern bool s_termSupportsColor;\n#define _ELPP_INITI_BASIC_DECLR \\\n    namespace el {\\\n        namespace base {\\\n            namespace utils {\\\n                std::string s_currentUser = el::base::utils::OS::currentUser(); \\\n                std::string s_currentHost = el::base::utils::OS::currentHost(); \\\n                bool s_termSupportsColor = el::base::utils::OS::termSupportsColor(); \\\n            }\\\n        }\\\n   }\n/// @brief Contains utilities for cross-platform date/time. This class make use of el::base::utils::Str\nclass DateTime : base::StaticClass {\npublic:\n    /// @brief Cross platform gettimeofday for Windows and unix platform. This can be used to determine current millisecond.\n    ///\n    /// @detail For unix system it uses gettimeofday(timeval*, timezone*) and for Windows, a seperate implementation is provided\n    /// @param [in,out] tv Pointer that gets updated\n    static void gettimeofday(struct timeval* tv) {\n#if _ELPP_OS_WINDOWS\n        if (tv != nullptr) {\n#   if _ELPP_COMPILER_MSVC || defined(_MSC_EXTENSIONS)\n            const unsigned __int64 delta_ = 11644473600000000Ui64;\n#   else\n            const unsigned __int64 delta_ = 11644473600000000ULL;\n#   endif  // _ELPP_COMPILER_MSVC || defined(_MSC_EXTENSIONS)\n            const double secOffSet = 0.000001;\n            const unsigned long usecOffSet = 1000000;  // NOLINT\n            FILETIME fileTime;\n            GetSystemTimeAsFileTime(&fileTime);\n            unsigned __int64 present = 0;\n            present |= fileTime.dwHighDateTime;\n            present = present << 32;\n            present |= fileTime.dwLowDateTime;\n            present /= 10;  // mic-sec\n           // Subtract the difference\n            present -= delta_;\n            tv->tv_sec = static_cast<long>(present * secOffSet);  // NOLINT\n            tv->tv_usec = static_cast<long>(present % usecOffSet);  // NOLINT\n        }\n#else\n        ::gettimeofday(tv, nullptr);\n#endif  // _ELPP_OS_WINDOWS\n    }\n\n    /// @brief Gets current date and time with milliseconds.\n    /// @param format User provided date/time format\n    /// @param msWidth A pointer to base::MillisecondsWidth from configuration (non-null)\n    /// @returns string based date time in specified format.\n    static inline std::string getDateTime(const char* format, const base::MillisecondsWidth* msWidth) {\n        struct timeval currTime;\n        gettimeofday(&currTime);\n        struct ::tm timeInfo;\n        buildTimeInfo(&currTime, &timeInfo);\n        const int kBuffSize = 30;\n        char buff_[kBuffSize] = \"\";\n        parseFormat(buff_, kBuffSize, format, &timeInfo, static_cast<std::size_t>(currTime.tv_usec / msWidth->m_offset), msWidth);\n        return std::string(buff_);\n    }\n\n    /// @brief Formats time to get unit accordingly, units like second if > 1000 or minutes if > 60000 etc\n    static base::type::string_t formatTime(unsigned long long time, base::TimestampUnit timestampUnit) {  // NOLINT\n        double result = static_cast<double>(time);\n        base::type::EnumType start = static_cast<base::type::EnumType>(timestampUnit);\n        const base::type::char_t* unit = base::consts::kTimeFormats[start].unit;\n        for (base::type::EnumType i = start; i < base::consts::kTimeFormatsCount - 1; ++i) {\n            if (result <= base::consts::kTimeFormats[i].value) {\n                break;\n            }\n            result /= base::consts::kTimeFormats[i].value;\n            unit = base::consts::kTimeFormats[i + 1].unit;\n        }\n        base::type::stringstream_t ss;\n        ss << result << \" \" << unit;\n        return ss.str();\n    }\n\n    /// @brief Gets time difference in milli/micro second depending on timestampUnit\n    static inline unsigned long long getTimeDifference(const struct timeval& endTime, const struct timeval& startTime, base::TimestampUnit timestampUnit) {  // NOLINT\n        if (timestampUnit == base::TimestampUnit::Microsecond) {\n            return static_cast<unsigned long long>(static_cast<unsigned long long>(1000000 * endTime.tv_sec + endTime.tv_usec) -  // NOLINT\n                    static_cast<unsigned long long>(1000000 * startTime.tv_sec + startTime.tv_usec));  // NOLINT\n        } else {\n            return static_cast<unsigned long long>((((endTime.tv_sec - startTime.tv_sec) * 1000000) + (endTime.tv_usec - startTime.tv_usec)) / 1000);  // NOLINT\n        }\n    }\n\nprivate:\n    static inline struct ::tm* buildTimeInfo(struct timeval* currTime, struct ::tm* timeInfo) {\n#if _ELPP_OS_UNIX\n        time_t rawTime = currTime->tv_sec;\n        ::localtime_r(&rawTime, timeInfo);\n        return timeInfo;\n#else\n#   if _ELPP_COMPILER_MSVC\n        _ELPP_UNUSED(currTime);\n        time_t t;\n        _time64(&t);\n        localtime_s(timeInfo, &t);\n        return timeInfo;\n#   else\n        // For any other compilers that don't have CRT warnings issue e.g, MinGW or TDM GCC- we use different method\n        time_t rawTime = currTime->tv_sec;  // NOLINT\n        struct tm* tmInf = localtime(&rawTime);  // NOLINT\n        *timeInfo = *tmInf;\n        return timeInfo;\n#   endif  // _ELPP_COMPILER_MSVC\n#endif  // _ELPP_OS_UNIX\n    }\n    static char* parseFormat(char* buf, std::size_t bufSz, const char* format, const struct tm* tInfo,\n            std::size_t msec, const base::MillisecondsWidth* msWidth) {\n        const char* bufLim = buf + bufSz;\n        for (; *format; ++format) {\n            if (*format == base::consts::kFormatSpecifierChar) {\n                switch (*++format) {\n                case base::consts::kFormatSpecifierChar:  // Escape\n                    break;\n                case '\\0':  // End\n                    --format;\n                    break;\n                case 'd':  // Day\n                    buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_mday, 2, buf, bufLim);\n                    continue;\n                case 'a':  // Day of week (short)\n                    buf = base::utils::Str::addToBuff(base::consts::kDaysAbbrev[tInfo->tm_wday], buf, bufLim);\n                    continue;\n                case 'A':  // Day of week (long)\n                    buf = base::utils::Str::addToBuff(base::consts::kDays[tInfo->tm_wday], buf, bufLim);\n                    continue;\n                case 'M':  // month\n                    buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_mon + 1, 2, buf, bufLim);\n                    continue;\n                case 'b':  // month (short)\n                    buf = base::utils::Str::addToBuff(base::consts::kMonthsAbbrev[tInfo->tm_mon], buf, bufLim);\n                    continue;\n                case 'B':  // month (long)\n                    buf = base::utils::Str::addToBuff(base::consts::kMonths[tInfo->tm_mon], buf, bufLim);\n                    continue;\n                case 'y':  // year (two digits)\n                    buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_year + base::consts::kYearBase, 2, buf, bufLim);\n                    continue;\n                case 'Y':  // year (four digits)\n                    buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_year + base::consts::kYearBase, 4, buf, bufLim);\n                    continue;\n                case 'h':  // hour (12-hour)\n                    buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_hour % 12, 2, buf, bufLim);\n                    continue;\n                case 'H':  // hour (24-hour)\n                    buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_hour, 2, buf, bufLim);\n                    continue;\n                case 'm':  // minute\n                    buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_min, 2, buf, bufLim);\n                    continue;\n                case 's':  // second\n                    buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_sec, 2, buf, bufLim);\n                    continue;\n                case 'z':  // milliseconds\n                case 'g':\n                    buf = base::utils::Str::convertAndAddToBuff(msec, msWidth->m_width, buf, bufLim);\n                    continue;\n                case 'F':  // AM/PM\n                    buf = base::utils::Str::addToBuff((tInfo->tm_hour >= 12) ? base::consts::kPm : base::consts::kAm, buf, bufLim);\n                    continue;\n                default:\n                    continue;\n                }\n            }\n            if (buf == bufLim) break;\n            *buf++ = *format;\n        }\n        return buf;\n    }\n};\n/// @brief Command line arguments for application if specified using el::Helpers::setArgs(..) or _START_EASYLOGGINGPP(..)\nclass CommandLineArgs {\npublic:\n    CommandLineArgs(void) {\n        setArgs(0, static_cast<char**>(nullptr));\n    }\n    CommandLineArgs(int argc, const char** argv) {\n        setArgs(argc, argv);\n    }\n    CommandLineArgs(int argc, char** argv) {\n        setArgs(argc, argv);\n    }\n    virtual ~CommandLineArgs(void) {}\n    /// @brief Sets arguments and parses them\n    inline void setArgs(int argc, const char** argv) {\n        setArgs(argc, const_cast<char**>(argv));\n    }\n    /// @brief Sets arguments and parses them\n    inline void setArgs(int argc, char** argv) {\n        m_params.clear();\n        m_paramsWithValue.clear();\n        if (argc == 0 || argv == nullptr) {\n            return;\n        }\n        m_argc = argc;\n        m_argv = argv;\n        for (int i = 1; i < m_argc; ++i) {\n            const char* v = (strstr(m_argv[i], \"=\"));\n            if (v != nullptr && strlen(v) > 0) {\n                std::string key = std::string(m_argv[i]);\n                key = key.substr(0, key.find_first_of('='));\n                if (hasParamWithValue(key.c_str())) {\n                    ELPP_INTERNAL_INFO(1, \"Skipping [\" << key << \"] arg since it already has value [\" \n                        << getParamValue(key.c_str()) << \"]\");\n                } else {\n                    m_paramsWithValue.insert(std::make_pair(key, std::string(v + 1)));\n                }\n            }\n            if (v == nullptr) {\n                if (hasParam(m_argv[i])) {\n                    ELPP_INTERNAL_INFO(1, \"Skipping [\" << m_argv[i] << \"] arg since it already exists\");\n                } else {\n                    m_params.push_back(std::string(m_argv[i]));\n                }\n            }\n        }\n    }\n    /// @brief Returns true if arguments contain paramKey with a value (seperated by '=')\n    inline bool hasParamWithValue(const char* paramKey) const {\n        return m_paramsWithValue.find(std::string(paramKey)) != m_paramsWithValue.end();\n    }\n    /// @brief Returns value of arguments\n    /// @see hasParamWithValue(const char*)\n    inline const char* getParamValue(const char* paramKey) const {\n        return m_paramsWithValue.find(std::string(paramKey))->second.c_str();\n    }\n    /// @brief Return true if arguments has a param (not having a value) i,e without '='\n    inline bool hasParam(const char* paramKey) const {\n        return std::find(m_params.begin(), m_params.end(), std::string(paramKey)) != m_params.end();\n    }\n    /// @brief Returns true if no params available. This exclude argv[0]\n    inline bool empty(void) const {\n        return m_params.empty() && m_paramsWithValue.empty();\n    }\n    /// @brief Returns total number of arguments. This exclude argv[0]\n    inline std::size_t size(void) const {\n        return m_params.size() + m_paramsWithValue.size();\n    }\n    inline friend base::type::ostream_t& operator<<(base::type::ostream_t& os, const CommandLineArgs& c) {\n        for (int i = 1; i < c.m_argc; ++i) {\n            os << ELPP_LITERAL(\"[\") << c.m_argv[i] << ELPP_LITERAL(\"]\");\n            if (i < c.m_argc - 1) {\n                os << ELPP_LITERAL(\" \");\n            }\n        }\n        return os;\n    }\n\nprivate:\n    int m_argc;\n    char** m_argv;\n    std::map<std::string, std::string> m_paramsWithValue;\n    std::vector<std::string> m_params;\n};\n/// @brief Abstract registry (aka repository) that provides basic interface for pointer repository specified by T_Ptr type.\n///\n/// @detail Most of the functions are virtual final methods but anything implementing this abstract class should implement\n/// unregisterAll() and deepCopy(const AbstractRegistry<T_Ptr, Container>&) and write registerNew() method according to container\n/// and few more methods; get() to find element, unregister() to unregister single entry.\n/// Please note that this is thread-unsafe and should also implement thread-safety mechanisms in implementation.\ntemplate <typename T_Ptr, typename Container>\nclass AbstractRegistry : public base::threading::ThreadSafe {\npublic:\n    typedef typename Container::iterator iterator;\n    typedef typename Container::const_iterator const_iterator;\n\n    /// @brief Default constructor\n    AbstractRegistry(void) {}\n\n    /// @brief Move constructor that is useful for base classes\n    AbstractRegistry(AbstractRegistry&& sr) {\n        if (this == &sr) {\n            return;\n        }\n        unregisterAll();\n        m_list = std::move(sr.m_list);\n    }\n\n    bool operator==(const AbstractRegistry<T_Ptr, Container>& other) {\n        if (size() != other.size()) {\n            return false;\n        }\n        for (std::size_t i = 0; i < m_list.size(); ++i) {\n            if (m_list.at(i) != other.m_list.at(i)) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    bool operator!=(const AbstractRegistry<T_Ptr, Container>& other) {\n        if (size() != other.size()) {\n            return true;\n        }\n        for (std::size_t i = 0; i < m_list.size(); ++i) {\n            if (m_list.at(i) != other.m_list.at(i)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /// @brief Assignment move operator\n    AbstractRegistry& operator=(AbstractRegistry&& sr) {\n        if (this == &sr) {\n            return *this;\n        }\n        unregisterAll();\n        m_list = std::move(sr.m_list);\n        return *this;\n    }\n\n    virtual ~AbstractRegistry(void) {\n    }\n\n    /// @return Iterator pointer from start of repository\n    virtual inline iterator begin(void) ELPP_FINAL {\n        return m_list.begin();\n    }\n\n    /// @return Iterator pointer from end of repository\n    virtual inline iterator end(void) ELPP_FINAL {\n        return m_list.end();\n    }\n\n\n    /// @return Constant iterator pointer from start of repository\n    virtual inline const_iterator cbegin(void) const ELPP_FINAL {\n        return m_list.cbegin();\n    }\n\n    /// @return End of repository\n    virtual inline const_iterator cend(void) const ELPP_FINAL {\n        return m_list.cend();\n    }\n\n    /// @return Whether or not repository is empty\n    virtual inline bool empty(void) const ELPP_FINAL {\n        return m_list.empty();\n    }\n\n    /// @return Size of repository\n    virtual inline std::size_t size(void) const ELPP_FINAL {\n        return m_list.size();\n    }\n\n    /// @brief Returns underlying container by reference\n    virtual inline Container& list(void) ELPP_FINAL {\n        return m_list;\n    }\n\n    /// @brief Returns underlying container by constant reference.\n    virtual inline const Container& list(void) const ELPP_FINAL {\n        return m_list;\n    }\n\n    /// @brief Unregisters all the pointers from current repository.\n    virtual void unregisterAll(void) = 0;\n\nprotected:\n    virtual void deepCopy(const AbstractRegistry<T_Ptr, Container>&) = 0;\n    void reinitDeepCopy(const AbstractRegistry<T_Ptr, Container>& sr) {\n        unregisterAll();\n        deepCopy(sr);\n    }\n\nprivate:\n    Container m_list;\n};\n\n/// @brief A pointer registry mechanism to manage memory and provide search functionalities. (non-predicate version)\n///\n/// @detail NOTE: This is thread-unsafe implementation (although it contains lock function, it does not use these functions)\n///         of AbstractRegistry<T_Ptr, Container>. Any implementation of this class should be  \n///         explicitly (by using lock functions)\ntemplate <typename T_Ptr, typename T_Key = const char*>\nclass Registry : public AbstractRegistry<T_Ptr, std::map<T_Key, T_Ptr*>> {\npublic:\n    typedef typename Registry<T_Ptr, T_Key>::iterator iterator;\n    typedef typename Registry<T_Ptr, T_Key>::const_iterator const_iterator;\n\n    Registry(void) {}\n\n    /// @brief Copy constructor that is useful for base classes. Try to avoid this constructor, use move constructor.\n    Registry(const Registry& sr) : AbstractRegistry<T_Ptr, std::vector<T_Ptr*>>() {\n        if (this == &sr) {\n            return;\n        }\n        this->reinitDeepCopy(sr);\n    }\n\n    /// @brief Assignment operator that unregisters all the existing registeries and deeply copies each of repo element\n    /// @see unregisterAll()\n    /// @see deepCopy(const AbstractRegistry&)\n    Registry& operator=(const Registry& sr) {\n        if (this == &sr) {\n            return *this;\n        }\n        this->reinitDeepCopy(sr);\n        return *this;\n    }\n\n    virtual ~Registry(void) {\n        unregisterAll();\n    }\n\nprotected:\n    virtual inline void unregisterAll(void) ELPP_FINAL {\n        if (!this->empty()) {\n            for (auto&& curr : this->list()) {\n                base::utils::safeDelete(curr.second);\n            }\n            this->list().clear();\n        }\n    }\n\n    /// @brief Registers new registry to repository.\n    virtual inline void registerNew(const T_Key& uniqKey, T_Ptr* ptr) ELPP_FINAL {\n        unregister(uniqKey);\n        this->list().insert(std::make_pair(uniqKey, ptr));\n    }\n\n    /// @brief Unregisters single entry mapped to specified unique key\n    inline void unregister(const T_Key& uniqKey) {\n        T_Ptr* existing = get(uniqKey);\n        if (existing != nullptr) {\n            base::utils::safeDelete(existing);\n            this->list().erase(uniqKey);\n        }\n    }\n\n    /// @brief Gets pointer from repository. If none found, nullptr is returned.\n    inline T_Ptr* get(const T_Key& uniqKey) {\n        iterator it = this->list().find(uniqKey);\n        return it == this->list().end()\n                ? nullptr\n                : it->second;\n    }\n\nprivate:\n    virtual inline void deepCopy(const AbstractRegistry<T_Ptr, std::map<T_Key, T_Ptr*>>& sr) ELPP_FINAL {\n        for (const_iterator it = sr.cbegin(); it != sr.cend(); ++it) {\n            registerNew(it->first, new T_Ptr(*it->second));\n        }\n    }\n};\n\n/// @brief A pointer registry mechanism to manage memory and provide search functionalities. (predicate version)\n///\n/// @detail NOTE: This is thread-unsafe implementation of AbstractRegistry<T_Ptr, Container>. Any implementation of this class\n/// should be made thread-safe explicitly\ntemplate <typename T_Ptr, typename Pred>\nclass RegistryWithPred : public AbstractRegistry<T_Ptr, std::vector<T_Ptr*>> {\npublic:\n    typedef typename RegistryWithPred<T_Ptr, Pred>::iterator iterator;\n    typedef typename RegistryWithPred<T_Ptr, Pred>::const_iterator const_iterator;\n\n    RegistryWithPred(void) {\n    }\n\n    virtual ~RegistryWithPred(void) {\n        unregisterAll();\n    }\n\n    /// @brief Copy constructor that is useful for base classes. Try to avoid this constructor, use move constructor.\n    RegistryWithPred(const RegistryWithPred& sr) : AbstractRegistry<T_Ptr, std::vector<T_Ptr*>>() {\n        if (this == &sr) {\n            return;\n        }\n        this->reinitDeepCopy(sr);\n    }\n\n    /// @brief Assignment operator that unregisters all the existing registeries and deeply copies each of repo element\n    /// @see unregisterAll()\n    /// @see deepCopy(const AbstractRegistry&)\n    RegistryWithPred& operator=(const RegistryWithPred& sr) {\n        if (this == &sr) {\n            return *this;\n        }\n        this->reinitDeepCopy(sr);\n        return *this;\n    }\n\n    friend inline base::type::ostream_t& operator<<(base::type::ostream_t& os, const RegistryWithPred& sr) {\n        for (const_iterator it = sr.list().begin(); it != sr.list().end(); ++it) {\n            os << ELPP_LITERAL(\"    \") << **it << ELPP_LITERAL(\"\\n\");\n        }\n        return os;\n    }\n\nprotected:\n    virtual inline void unregisterAll(void) ELPP_FINAL {\n        if (!this->empty()) {\n            for (auto&& curr : this->list()) {\n                base::utils::safeDelete(curr);\n            }\n            this->list().clear();\n        }\n    }\n\n    virtual void unregister(T_Ptr*& ptr) ELPP_FINAL {  // NOLINT\n        if (ptr) {\n            iterator iter = this->begin();\n            for (; iter != this->end(); ++iter) {\n                if (ptr == *iter) {\n                    break;\n                }\n            }\n            if (iter != this->end() && *iter != nullptr) {\n                this->list().erase(iter);\n                base::utils::safeDelete(*iter);\n            }\n        }\n    }\n\n    virtual inline void registerNew(T_Ptr* ptr) ELPP_FINAL {\n        this->list().push_back(ptr);\n    }\n\n    /// @brief Gets pointer from repository with speicifed arguments. Arguments are passed to predicate\n    /// in order to validate pointer.\n    template <typename T, typename T2>\n    inline T_Ptr* get(const T& arg1, const T2 arg2) {\n        iterator iter = std::find_if(this->list().begin(), this->list().end(), Pred(arg1, arg2));\n        if (iter != this->list().end() && *iter != nullptr) {\n            return *iter;\n        }\n        return nullptr;\n    }\n\nprivate:\n    virtual inline void deepCopy(const AbstractRegistry<T_Ptr, std::vector<T_Ptr*>>& sr) {\n        for (const_iterator it = sr.list().begin(); it != sr.list().end(); ++it) {\n            registerNew(new T_Ptr(**it));\n        }\n    }\n};\n\n}  // namespace utils\n} // namespace base\n/// @brief Base of Easylogging++ friendly class\n///\n/// @detail After inheriting this class publicly, implement pure-virtual function `void log(std::ostream&) const`\nclass Loggable {\npublic:\n    virtual void log(el::base::type::ostream_t&) const = 0;\n\nprivate:\n    friend inline el::base::type::ostream_t& operator<<(el::base::type::ostream_t& os, const Loggable& loggable) {\n        loggable.log(os);\n        return os;\n    }\n};\nnamespace base {\n/// @brief Represents log format containing flags and date format. This is used internally to start initial log\nclass LogFormat : public Loggable {\npublic:\n    LogFormat(void) :\n        m_level(Level::Unknown),\n        m_userFormat(base::type::string_t()),\n        m_format(base::type::string_t()),\n        m_dateTimeFormat(std::string()),\n        m_flags(0x0) {\n    }\n\n    LogFormat(Level level, const base::type::string_t& format)\n            : m_level(level), m_userFormat(format) {\n        parseFromFormat(m_userFormat);\n    }\n\n    LogFormat(const LogFormat& logFormat) {\n        m_level = logFormat.m_level;\n        m_userFormat = logFormat.m_userFormat;\n        m_format = logFormat.m_format;\n        m_dateTimeFormat = logFormat.m_dateTimeFormat;\n        m_flags = logFormat.m_flags;\n    }\n\n    LogFormat(LogFormat&& logFormat) {\n        m_level = std::move(logFormat.m_level);\n        m_userFormat = std::move(logFormat.m_userFormat);\n        m_format = std::move(logFormat.m_format);\n        m_dateTimeFormat = std::move(logFormat.m_dateTimeFormat);\n        m_flags = std::move(logFormat.m_flags);\n    }\n\n    LogFormat& operator=(const LogFormat& logFormat) {\n        m_level = logFormat.m_level;\n        m_userFormat = logFormat.m_userFormat;\n        m_dateTimeFormat = logFormat.m_dateTimeFormat;\n        m_flags = logFormat.m_flags;\n        return *this;\n    }\n\n    virtual ~LogFormat(void) {\n    }\n\n    inline bool operator==(const LogFormat& other) {\n        return m_level == other.m_level && m_userFormat == other.m_userFormat && m_format == other.m_format &&\n                m_dateTimeFormat == other.m_dateTimeFormat && m_flags == other.m_flags;\n    }\n\n    /// @brief Updates format to be used while logging.\n    /// @param userFormat User provided format\n    void parseFromFormat(const base::type::string_t& userFormat) {\n        // We make copy because we will be changing the format\n        // i.e, removing user provided date format from original format\n        // and then storing it.\n        base::type::string_t formatCopy = userFormat;\n        m_flags = 0x0;\n        auto conditionalAddFlag = [&](const base::type::char_t* specifier, base::FormatFlags flag) {\n            std::size_t foundAt = base::type::string_t::npos;\n            while ((foundAt = formatCopy.find(specifier, foundAt + 1)) != base::type::string_t::npos){\n                if (foundAt > 0 && formatCopy[foundAt - 1] == base::consts::kFormatSpecifierChar) {\n                    if (hasFlag(flag)) {\n                        // If we already have flag we remove the escape chars so that '%%' is turned to '%'\n                        // even after specifier resolution - this is because we only replaceFirst specifier\n                        formatCopy.erase(foundAt > 0 ? foundAt - 1 : 0, 1);\n                        ++foundAt;\n                    }\n                } else {\n                    if (!hasFlag(flag)) addFlag(flag);\n                }\n            }\n        };  // NOLINT\n        conditionalAddFlag(base::consts::kAppNameFormatSpecifier, base::FormatFlags::AppName);\n        conditionalAddFlag(base::consts::kSeverityLevelFormatSpecifier, base::FormatFlags::Level);\n        conditionalAddFlag(base::consts::kLoggerIdFormatSpecifier, base::FormatFlags::LoggerId);\n        conditionalAddFlag(base::consts::kThreadIdFormatSpecifier, base::FormatFlags::ThreadId);\n        conditionalAddFlag(base::consts::kLogFileFormatSpecifier, base::FormatFlags::File);\n        conditionalAddFlag(base::consts::kLogLineFormatSpecifier, base::FormatFlags::Line);\n        conditionalAddFlag(base::consts::kLogLocationFormatSpecifier, base::FormatFlags::Location);\n        conditionalAddFlag(base::consts::kLogFunctionFormatSpecifier, base::FormatFlags::Function);\n        conditionalAddFlag(base::consts::kCurrentUserFormatSpecifier, base::FormatFlags::User);\n        conditionalAddFlag(base::consts::kCurrentHostFormatSpecifier, base::FormatFlags::Host);\n        conditionalAddFlag(base::consts::kMessageFormatSpecifier, base::FormatFlags::LogMessage);\n        conditionalAddFlag(base::consts::kVerboseLevelFormatSpecifier, base::FormatFlags::VerboseLevel);\n        // For date/time we need to extract user's date format first\n        std::size_t dateIndex = std::string::npos;\n        if ((dateIndex = formatCopy.find(base::consts::kDateTimeFormatSpecifier)) != std::string::npos) {\n            while (dateIndex > 0 && formatCopy[dateIndex - 1] == base::consts::kFormatSpecifierChar) {\n                dateIndex = formatCopy.find(base::consts::kDateTimeFormatSpecifier, dateIndex + 1);\n            }\n            if (dateIndex != std::string::npos) {\n                addFlag(base::FormatFlags::DateTime);\n                updateDateFormat(dateIndex, formatCopy);\n            }\n        }\n        m_format = formatCopy;\n        updateFormatSpec();\n    }\n\n    inline Level level(void) const {\n        return m_level;\n    }\n\n    inline const base::type::string_t& userFormat(void) const {\n        return m_userFormat;\n    }\n\n    inline const base::type::string_t& format(void) const {\n       return m_format;\n    }\n\n    inline const std::string& dateTimeFormat(void) const {\n       return m_dateTimeFormat;\n    }\n\n    inline base::type::EnumType flags(void) const {\n       return m_flags;\n    }\n\n    inline bool hasFlag(base::FormatFlags flag) const {\n        return base::utils::hasFlag(flag, m_flags);\n    }\n\n    virtual void log(el::base::type::ostream_t& os) const {\n        os << m_format;\n    }\n\nprotected:\n    /// @brief Updates date time format if available in currFormat.\n    /// @param index Index where %datetime, %date or %time was found\n    /// @param [in,out] currFormat current format that is being used to format\n    virtual void updateDateFormat(std::size_t index, base::type::string_t& currFormat) ELPP_FINAL {  // NOLINT\n        if (hasFlag(base::FormatFlags::DateTime)) {\n            index += ELPP_STRLEN(base::consts::kDateTimeFormatSpecifier);\n        }\n        const base::type::char_t* ptr = currFormat.c_str() + index;\n        if ((currFormat.size() > index) && (ptr[0] == '{')) {\n            // User has provided format for date/time\n            ++ptr;\n            int count = 1;  // Start by 1 in order to remove starting brace\n            std::stringstream ss;\n            for (; *ptr; ++ptr, ++count) {\n                if (*ptr == '}') {\n                    ++count;  // In order to remove ending brace\n                    break;\n                }\n                ss << *ptr;\n            }\n            currFormat.erase(index, count);\n            m_dateTimeFormat = ss.str();\n        } else {\n            // No format provided, use default\n            if (hasFlag(base::FormatFlags::DateTime)) {\n                m_dateTimeFormat = std::string(base::consts::kDefaultDateTimeFormat);\n            }\n        }\n    }\n\n    /// @brief Updates %level from format. This is so that we dont have to do it at log-writing-time. It uses m_format and m_level\n    virtual void updateFormatSpec(void) ELPP_FINAL {\n        // Do not use switch over strongly typed enums because Intel C++ compilers dont support them yet.\n        if (m_level == Level::Debug) {\n            base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier,\n                    base::consts::kDebugLevelLogValue);\n        } else if (m_level == Level::Info) {\n            base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier,\n                    base::consts::kInfoLevelLogValue);\n        } else if (m_level == Level::Warning) {\n            base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier,\n                    base::consts::kWarningLevelLogValue);\n        } else if (m_level == Level::Error) {\n            base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier,\n                    base::consts::kErrorLevelLogValue);\n        } else if (m_level == Level::Fatal) {\n            base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier,\n                    base::consts::kFatalLevelLogValue);\n        } else if (m_level == Level::Verbose) {\n            base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier,\n                    base::consts::kVerboseLevelLogValue);\n        } else if (m_level == Level::Trace) {\n            base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier,\n                    base::consts::kTraceLevelLogValue);\n        }\n        if (hasFlag(base::FormatFlags::User)) {\n            std::string s = base::utils::s_currentUser;\n            base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kCurrentUserFormatSpecifier,\n                    base::utils::s_currentUser);\n        }\n        if (hasFlag(base::FormatFlags::Host)) {\n            base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kCurrentHostFormatSpecifier,\n                    base::utils::s_currentHost);\n        }\n        // Ignore Level::Global and Level::Unknown\n    }\n\n    inline void addFlag(base::FormatFlags flag) {\n        base::utils::addFlag(flag, &m_flags);\n    }\n\nprivate:\n    Level m_level;\n    base::type::string_t m_userFormat;\n    base::type::string_t m_format;\n    std::string m_dateTimeFormat;\n    base::type::EnumType m_flags;\n    friend class el::Logger;  // To resolve loggerId format specifier easily\n};\n}  // namespace base\n/// @brief Resolving function for format specifier\ntypedef std::function<const char*(void)> FormatSpecifierValueResolver;\n/// @brief User-provided custom format specifier\n/// @see el::Helpers::installCustomFormatSpecifier\n/// @see FormatSpecifierValueResolver\nclass CustomFormatSpecifier {\npublic:\n    CustomFormatSpecifier(const char* formatSpecifier, const FormatSpecifierValueResolver& resolver) :\n        m_formatSpecifier(formatSpecifier), m_resolver(resolver) {}\n    inline const char* formatSpecifier(void) const { return m_formatSpecifier; }\n    inline const FormatSpecifierValueResolver& resolver(void) const { return m_resolver; }\n    inline bool operator==(const char* formatSpecifier) {\n        return strcmp(m_formatSpecifier, formatSpecifier) == 0;\n    }\n\nprivate:\n    const char* m_formatSpecifier;\n    FormatSpecifierValueResolver m_resolver;\n};\n/// @brief Represents single configuration that has representing level, configuration type and a string based value.\n///\n/// @detail String based value means any value either its boolean, integer or string itself, it will be embedded inside quotes\n/// and will be parsed later.\n///\n/// Consider some examples below:\n///   * el::Configuration confEnabledInfo(el::Level::Info, el::ConfigurationType::Enabled, \"true\");\n///   * el::Configuration confMaxLogFileSizeInfo(el::Level::Info, el::ConfigurationType::MaxLogFileSize, \"2048\");\n///   * el::Configuration confFilenameInfo(el::Level::Info, el::ConfigurationType::Filename, \"/var/log/my.log\");\nclass Configuration : public Loggable {\npublic:\n    Configuration(const Configuration& c) :\n            m_level(c.m_level),\n            m_configurationType(c.m_configurationType),\n            m_value(c.m_value) {\n    }\n\n    Configuration& operator=(const Configuration& c) {\n        m_level = c.m_level;\n        m_configurationType = c.m_configurationType;\n        m_value = c.m_value;\n        return *this;\n    }\n\n    virtual ~Configuration(void) {\n    }\n\n    /// @brief Full constructor used to sets value of configuration\n    Configuration(Level level, ConfigurationType configurationType, const std::string& value) :\n        m_level(level),\n        m_configurationType(configurationType),\n        m_value(value) {\n    }\n\n    /// @brief Gets level of current configuration\n    inline Level level(void) const {\n        return m_level;\n    }\n\n    /// @brief Gets configuration type of current configuration\n    inline ConfigurationType configurationType(void) const {\n        return m_configurationType;\n    }\n\n    /// @brief Gets string based configuration value\n    inline const std::string& value(void) const {\n        return m_value;\n    }\n\n    /// @brief Set string based configuration value\n    /// @param value Value to set. Values have to be std::string; For boolean values use \"true\", \"false\", for any integral values\n    ///        use them in quotes. They will be parsed when configuring\n    inline void setValue(const std::string& value) {\n        m_value = value;\n    }\n\n    virtual inline void log(el::base::type::ostream_t& os) const {\n        os << LevelHelper::convertToString(m_level)\n            << ELPP_LITERAL(\" \") << ConfigurationTypeHelper::convertToString(m_configurationType)\n            << ELPP_LITERAL(\" = \") << m_value.c_str();\n    }\n\n    /// @brief Used to find configuration from configuration (pointers) repository. Avoid using it.\n    class Predicate {\n    public:\n        Predicate(Level level, ConfigurationType configurationType) :\n            m_level(level),\n            m_configurationType(configurationType) {\n        }\n\n        inline bool operator()(const Configuration* conf) const {\n            return ((conf != nullptr) && (conf->level() == m_level) && (conf->configurationType() == m_configurationType));\n        }\n\n    private:\n        Level m_level;\n        ConfigurationType m_configurationType;\n    };\n\nprivate:\n    Level m_level;\n    ConfigurationType m_configurationType;\n    std::string m_value;\n};\n\n/// @brief Thread-safe Configuration repository\n///\n/// @detail This repository represents configurations for all the levels and configuration type mapped to a value.\nclass Configurations : public base::utils::RegistryWithPred<Configuration, Configuration::Predicate> {\npublic:\n    /// @brief Default constructor with empty repository\n    Configurations(void) :\n            m_configurationFile(std::string()),\n            m_isFromFile(false) {\n    }\n\n    /// @brief Constructor used to set configurations using configuration file.\n    /// @param configurationFile Full path to configuration file\n    /// @param useDefaultsForRemaining Lets you set the remaining configurations to default.\n    /// @param base If provided, this configuration will be based off existing repository that this argument is pointing to.\n    /// @see parseFromFile(const std::string&, Configurations* base)\n    /// @see setRemainingToDefault()\n    Configurations(const std::string& configurationFile, bool useDefaultsForRemaining = true, Configurations* base = nullptr) :\n            m_configurationFile(configurationFile),\n            m_isFromFile(false) {\n        parseFromFile(configurationFile, base);\n        if (useDefaultsForRemaining) {\n            setRemainingToDefault();\n        }\n    }\n\n    virtual ~Configurations(void) {\n    }\n\n    /// @brief Parses configuration from file.\n    /// @param configurationFile Full path to configuration file\n    /// @param base Configurations to base new configuration repository off. This value is used when you want to use\n    ///        existing Configurations to base all the values and then set rest of configuration via configuration file.\n    /// @return True if successfully parsed, false otherwise. You may define '_ELPP_DEBUG_ASSERT_FAILURE' to make sure you\n    ///         do not proceed without successful parse.\n    inline bool parseFromFile(const std::string& configurationFile, Configurations* base = nullptr) {\n        bool assertionPassed = false;\n        ELPP_ASSERT((assertionPassed = base::utils::File::pathExists(configurationFile.c_str(), true)),\n                \"Configuration file [\" << configurationFile << \"] does not exist!\");\n        if (!assertionPassed) {\n            return false;\n        }\n        bool success = Parser::parseFromFile(configurationFile, this, base);\n        m_isFromFile = success;\n        return success;\n    }\n\n    /// @brief Parse configurations from configuration string.\n    ///\n    /// @detail This configuration string has same syntax as configuration file contents. Make sure all the necessary\n    /// new line characters are provided.\n    /// @param base Configurations to base new configuration repository off. This value is used when you want to use\n    ///        existing Configurations to base all the values and then set rest of configuration via configuration text.\n    /// @return True if successfully parsed, false otherwise. You may define '_ELPP_DEBUG_ASSERT_FAILURE' to make sure you\n    ///         do not proceed without successful parse.\n    inline bool parseFromText(const std::string& configurationsString, Configurations* base = nullptr) {\n        bool success = Parser::parseFromText(configurationsString, this, base);\n        if (success) {\n            m_isFromFile = false;\n        }\n        return success;\n    }\n\n    /// @brief Sets configuration based-off an existing configurations.\n    /// @param base Pointer to existing configurations.\n    inline void setFromBase(Configurations* base) {\n        if (base == nullptr || base == this) {\n            return;\n        }\n        base::threading::ScopedLock scopedLock(base->lock());\n        for (Configuration*& conf : base->list()) {\n            set(conf);\n        }\n    }\n\n    /// @brief Determines whether or not specified configuration type exists in the repository.\n    ///\n    /// @detail Returns as soon as first level is found.\n    /// @param configurationType Type of configuration to check existence for.\n    bool hasConfiguration(ConfigurationType configurationType) {\n        base::type::EnumType lIndex = LevelHelper::kMinValid;\n        bool result = false;\n        LevelHelper::forEachLevel(&lIndex, [&](void) -> bool {\n            if (hasConfiguration(LevelHelper::castFromInt(lIndex), configurationType)) {\n                result = true;\n            }\n            return result;\n        });\n        return result;\n    }\n\n    /// @brief Determines whether or not specified configuration type exists for specified level\n    /// @param level Level to check\n    /// @param configurationType Type of configuration to check existence for.\n    inline bool hasConfiguration(Level level, ConfigurationType configurationType) {\n        base::threading::ScopedLock scopedLock(lock());\n#if _ELPP_COMPILER_INTEL\n        // We cant specify template types here, Intel C++ throws compilation error\n        // \"error: type name is not allowed\"\n        return RegistryWithPred::get(level, configurationType) != nullptr;\n#else\n        return RegistryWithPred<Configuration, Configuration::Predicate>::get(level, configurationType) != nullptr;\n#endif  // _ELPP_COMPILER_INTEL\n    }\n\n    /// @brief Sets value of configuration for specified level.\n    ///\n    /// @detail Any existing configuration for specified level will be replaced. Also note that configuration types\n    /// ConfigurationType::MillisecondsWidth and ConfigurationType::PerformanceTracking will be ignored if not set for\n    /// Level::Global because these configurations are not dependant on level.\n    /// @param level Level to set configuration for (el::Level).\n    /// @param configurationType Type of configuration (el::ConfigurationType)\n    /// @param value A string based value. Regardless of what the data type of configuration is, it will always be string\n    /// from users' point of view. This is then parsed later to be used internally.\n    /// @see Configuration::setValue(const std::string& value)\n    /// @see el::Level\n    /// @see el::ConfigurationType\n    inline void set(Level level, ConfigurationType configurationType, const std::string& value) {\n        base::threading::ScopedLock scopedLock(lock());\n        unsafeSet(level, configurationType, value);  // This is not unsafe anymore as we have locked mutex\n        if (level == Level::Global) {\n            unsafeSetGlobally(configurationType, value, false);  // Again this is not unsafe either\n        }\n    }\n\n    /// @brief Sets single configuration based on other single configuration.\n    /// @see set(Level level, ConfigurationType configurationType, const std::string& value)\n    inline void set(Configuration* conf) {\n        if (conf == nullptr) {\n            return;\n        }\n        set(conf->level(), conf->configurationType(), conf->value());\n    }\n\n    inline Configuration* get(Level level, ConfigurationType configurationType) {\n        base::threading::ScopedLock scopedLock(lock());\n        return RegistryWithPred<Configuration, Configuration::Predicate>::get(level, configurationType);\n    }\n\n    /// @brief Sets configuration for all levels.\n    /// @param configurationType Type of configuration\n    /// @param value String based value\n    /// @see Configurations::set(Level level, ConfigurationType configurationType, const std::string& value)\n    inline void setGlobally(ConfigurationType configurationType, const std::string& value) {\n        setGlobally(configurationType, value, false);\n    }\n\n    /// @brief Clears repository so that all the configurations are unset\n    inline void clear(void) {\n        base::threading::ScopedLock scopedLock(lock());\n        unregisterAll();\n    }\n\n    /// @brief Gets configuration file used in parsing this configurations.\n    ///\n    /// @detail If this repository was set manually or by text this returns empty string.\n    inline const std::string& configurationFile(void) const {\n        return m_configurationFile;\n    }\n\n    /// @brief Sets configurations to \"factory based\" configurations.\n    void setToDefault(void) {\n        setGlobally(ConfigurationType::Enabled, \"true\", true);\n#if !defined(_ELPP_NO_DEFAULT_LOG_FILE)\n        setGlobally(ConfigurationType::Filename, std::string(base::consts::kDefaultLogFile), true);\n#else\n        _ELPP_UNUSED(base::consts::kDefaultLogFile);\n#endif  // !defined(_ELPP_NO_DEFAULT_LOG_FILE)\n        setGlobally(ConfigurationType::ToFile, \"true\", true);\n        setGlobally(ConfigurationType::ToStandardOutput, \"true\", true);\n        setGlobally(ConfigurationType::MillisecondsWidth, \"3\", true);\n        setGlobally(ConfigurationType::PerformanceTracking, \"true\", true);\n        setGlobally(ConfigurationType::MaxLogFileSize, \"0\", true);\n        setGlobally(ConfigurationType::LogFlushThreshold, \"0\", true);\n\n        setGlobally(ConfigurationType::Format, \"%datetime %level [%logger] %msg\", true);\n        set(Level::Debug, ConfigurationType::Format, \"%datetime %level [%logger] [%user@%host] [%func] [%loc] %msg\");\n        // INFO and WARNING are set to default by Level::Global\n        set(Level::Error, ConfigurationType::Format, \"%datetime %level [%logger] %msg\");\n        set(Level::Fatal, ConfigurationType::Format, \"%datetime %level [%logger] %msg\");\n        set(Level::Verbose, ConfigurationType::Format, \"%datetime %level-%vlevel [%logger] %msg\");\n        set(Level::Trace, ConfigurationType::Format, \"%datetime %level [%logger] [%func] [%loc] %msg\");\n    }\n\n    /// @brief Lets you set the remaining configurations to default.\n    ///\n    /// @detail By remaining, it means that the level/type a configuration does not exist for.\n    /// This function is useful when you want to minimize chances of failures, e.g, if you have a configuration file that sets\n    /// configuration for all the configurations except for Enabled or not, we use this so that ENABLED is set to default i.e,\n    /// true. If you dont do this explicitley (either by calling this function or by using second param in Constructor\n    /// and try to access a value, an error is thrown\n    void setRemainingToDefault(void) {\n        base::threading::ScopedLock scopedLock(lock());\n        unsafeSetIfNotExist(Level::Global, ConfigurationType::Enabled, \"true\");\n#if !defined(_ELPP_NO_DEFAULT_LOG_FILE)\n        unsafeSetIfNotExist(Level::Global, ConfigurationType::Filename, std::string(base::consts::kDefaultLogFile));\n#endif  // !defined(_ELPP_NO_DEFAULT_LOG_FILE)\n        unsafeSetIfNotExist(Level::Global, ConfigurationType::ToFile, \"true\");\n        unsafeSetIfNotExist(Level::Global, ConfigurationType::ToStandardOutput, \"true\");\n        unsafeSetIfNotExist(Level::Global, ConfigurationType::MillisecondsWidth, \"3\");\n        unsafeSetIfNotExist(Level::Global, ConfigurationType::PerformanceTracking, \"true\");\n        unsafeSetIfNotExist(Level::Global, ConfigurationType::MaxLogFileSize, \"0\");\n        unsafeSetIfNotExist(Level::Global, ConfigurationType::Format, \"%datetime %level [%logger] %msg\");\n        unsafeSetIfNotExist(Level::Debug, ConfigurationType::Format, \n            \"%datetime %level [%logger] [%user@%host] [%func] [%loc] %msg\");\n        // INFO and WARNING are set to default by Level::Global\n        unsafeSetIfNotExist(Level::Error, ConfigurationType::Format, \"%datetime %level [%logger] %msg\");\n        unsafeSetIfNotExist(Level::Fatal, ConfigurationType::Format, \"%datetime %level [%logger] %msg\");\n        unsafeSetIfNotExist(Level::Verbose, ConfigurationType::Format, \"%datetime %level-%vlevel [%logger] %msg\");\n        unsafeSetIfNotExist(Level::Trace, ConfigurationType::Format, \"%datetime %level [%logger] [%func] [%loc] %msg\");\n    }\n\n    /// @brief Parser used internally to parse configurations from file or text.\n    ///\n    /// @detail This class makes use of base::utils::Str.\n    /// You should not need this unless you are working on some tool for Easylogging++\n    class Parser : base::StaticClass {\n    public:\n        /// @brief Parses configuration from file.\n        /// @param configurationFile Full path to configuration file\n        /// @param sender Sender configurations pointer. Usually 'this' is used from calling class\n        /// @param base Configurations to base new configuration repository off. This value is used when you want to use\n        ///        existing Configurations to base all the values and then set rest of configuration via configuration file.\n        /// @return True if successfully parsed, false otherwise. You may define '_STOP_ON_FIRST_ELPP_ASSERTION' to make sure you\n        ///         do not proceed without successful parse.\n        static bool parseFromFile(const std::string& configurationFile, Configurations* sender, Configurations* base = nullptr) {\n            sender->setFromBase(base);\n            std::ifstream fileStream_(configurationFile.c_str(), std::ifstream::in);\n            ELPP_ASSERT(fileStream_.is_open(), \"Unable to open configuration file [\" << configurationFile << \"] for parsing.\");\n            bool parsedSuccessfully = false;\n            std::string line = std::string();\n            Level currLevel = Level::Unknown;\n            std::string currConfigStr = std::string();\n            std::string currLevelStr = std::string();\n            while (fileStream_.good()) {\n                std::getline(fileStream_, line);\n                parsedSuccessfully = parseLine(&line, &currConfigStr, &currLevelStr, &currLevel, sender);\n                ELPP_ASSERT(parsedSuccessfully, \"Unable to parse configuration line: \" << line);\n            }\n            return parsedSuccessfully;\n        }\n\n        /// @brief Parse configurations from configuration string.\n        ///\n        /// @detail This configuration string has same syntax as configuration file contents. Make sure all the necessary\n        /// new line characters are provided. You may define '_STOP_ON_FIRST_ELPP_ASSERTION' to make sure you\n        /// do not proceed without successful parse (This is recommended)\n        /// @param configurationsString\n        /// @param sender Sender configurations pointer. Usually 'this' is used from calling class\n        /// @param base Configurations to base new configuration repository off. This value is used when you want to use\n        ///        existing Configurations to base all the values and then set rest of configuration via configuration text.\n        /// @return True if successfully parsed, false otherwise.\n        static bool parseFromText(const std::string& configurationsString, Configurations* sender, Configurations* base = nullptr) {\n            sender->setFromBase(base);\n            bool parsedSuccessfully = false;\n            std::stringstream ss(configurationsString);\n            std::string line = std::string();\n            Level currLevel = Level::Unknown;\n            std::string currConfigStr = std::string();\n            std::string currLevelStr = std::string();\n            while (std::getline(ss, line)) {\n                parsedSuccessfully = parseLine(&line, &currConfigStr, &currLevelStr, &currLevel, sender);\n                ELPP_ASSERT(parsedSuccessfully, \"Unable to parse configuration line: \" << line);\n            }\n            return parsedSuccessfully;\n        }\n\n    private:\n        friend class el::Loggers;\n        static void ignoreComments(std::string* line) {\n            std::size_t foundAt = 0;\n            std::size_t quotesStart = line->find(\"\\\"\");\n            std::size_t quotesEnd = std::string::npos;\n            if (quotesStart != std::string::npos) {\n                quotesEnd = line->find(\"\\\"\", quotesStart + 1);\n                while (quotesEnd != std::string::npos && line->at(quotesEnd - 1) == '\\\\') {\n                    // Do not erase slash yet - we will erase it in parseLine(..) while loop\n                    quotesEnd = line->find(\"\\\"\", quotesEnd + 2);\n                }\n            }\n            if ((foundAt = line->find(base::consts::kConfigurationComment)) != std::string::npos) {\n                if (foundAt < quotesEnd) {\n                    foundAt = line->find(base::consts::kConfigurationComment, quotesEnd + 1);\n                }\n                *line = line->substr(0, foundAt);\n            }\n        }\n        static inline bool isLevel(const std::string& line) {\n            return base::utils::Str::startsWith(line, base::consts::kConfigurationLevel);\n        }\n\n        static inline bool isComment(const std::string& line) {\n            return base::utils::Str::startsWith(line, base::consts::kConfigurationComment);\n        }\n\n        static inline bool isConfig(const std::string& line) {\n            std::size_t assignment = line.find('=');\n            return line != \"\" &&\n                    (line[0] >= 65 || line[0] <= 90 || line[0] >= 97 || line[0] <= 122) &&\n                    (assignment != std::string::npos) &&\n                    (line.size() > assignment);\n        }\n\n        static bool parseLine(std::string* line, std::string* currConfigStr, std::string* currLevelStr, Level* currLevel, Configurations* conf) {\n            ConfigurationType currConfig = ConfigurationType::Unknown;\n            std::string currValue = std::string();\n            *line = base::utils::Str::trim(*line);\n            if (isComment(*line)) return true;\n            ignoreComments(line);\n            *line = base::utils::Str::trim(*line);\n            if (line->empty()) {\n                // Comment ignored\n                return true;\n            }\n            if (isLevel(*line)) {\n                if (line->size() <= 2) {\n                    return true;\n                }\n                *currLevelStr = line->substr(1, line->size() - 2);\n                *currLevelStr = base::utils::Str::toUpper(*currLevelStr);\n                *currLevelStr = base::utils::Str::trim(*currLevelStr);\n                *currLevel = LevelHelper::convertFromString(currLevelStr->c_str());\n                return true;\n            }\n            if (isConfig(*line)) {\n                std::size_t assignment = line->find('=');\n                *currConfigStr = line->substr(0, assignment);\n                *currConfigStr = base::utils::Str::toUpper(*currConfigStr);\n                *currConfigStr = base::utils::Str::trim(*currConfigStr);\n                currConfig = ConfigurationTypeHelper::convertFromString(currConfigStr->c_str());\n                currValue = line->substr(assignment + 1);\n                currValue = base::utils::Str::trim(currValue);\n                std::size_t quotesStart = currValue.find(\"\\\"\", 0);\n                std::size_t quotesEnd = std::string::npos;\n                if (quotesStart != std::string::npos) {\n                    quotesEnd = currValue.find(\"\\\"\", quotesStart + 1);\n                    while (quotesEnd != std::string::npos && currValue.at(quotesEnd - 1) == '\\\\') {\n                        currValue = currValue.erase(quotesEnd - 1, 1);\n                        quotesEnd = currValue.find(\"\\\"\", quotesEnd + 2);\n                    }\n                }\n                if (quotesStart != std::string::npos && quotesEnd != std::string::npos) {\n                    // Quote provided - check and strip if valid\n                    ELPP_ASSERT((quotesStart < quotesEnd), \"Configuration error - No ending quote found in [\" \n                        << currConfigStr << \"]\");\n                    ELPP_ASSERT((quotesStart + 1 != quotesEnd), \"Empty configuration value for [\" << currConfigStr << \"]\");\n                    if ((quotesStart != quotesEnd) && (quotesStart + 1 != quotesEnd)) {\n                        // Explicit check in case if assertion is disabled\n                        currValue = currValue.substr(quotesStart + 1, quotesEnd - 1);\n                    }\n                }\n            }\n            ELPP_ASSERT(*currLevel != Level::Unknown, \"Unrecognized severity level [\" << *currLevelStr << \"]\");\n            ELPP_ASSERT(currConfig != ConfigurationType::Unknown, \"Unrecognized configuration [\" << *currConfigStr << \"]\");\n            if (*currLevel == Level::Unknown || currConfig == ConfigurationType::Unknown) {\n                return false;  // unrecognizable level or config\n            }\n            conf->set(*currLevel, currConfig, currValue);\n            return true;\n        }\n    };\n\nprivate:\n    std::string m_configurationFile;\n    bool m_isFromFile;\n    friend class el::Loggers;\n\n    /// @brief Unsafely sets configuration if does not already exist\n    void unsafeSetIfNotExist(Level level, ConfigurationType configurationType, const std::string& value) {\n        Configuration* conf = RegistryWithPred<Configuration, Configuration::Predicate>::get(level, configurationType);\n        if (conf == nullptr) {\n            unsafeSet(level, configurationType, value);\n        }\n    }\n\n    /// @brief Thread unsafe set\n    void unsafeSet(Level level, ConfigurationType configurationType, const std::string& value) {\n        Configuration* conf = RegistryWithPred<Configuration, Configuration::Predicate>::get(level, configurationType);\n        if (conf == nullptr) {\n            registerNew(new Configuration(level, configurationType, value));\n        } else {\n            conf->setValue(value);\n        }\n        if (level == Level::Global) {\n            unsafeSetGlobally(configurationType, value, false);\n        }\n    }\n\n    /// @brief Sets configurations for all levels including Level::Global if includeGlobalLevel is true\n    /// @see Configurations::setGlobally(ConfigurationType configurationType, const std::string& value)\n    void setGlobally(ConfigurationType configurationType, const std::string& value, bool includeGlobalLevel) {\n        if (includeGlobalLevel) {\n            set(Level::Global, configurationType, value);\n        }\n        base::type::EnumType lIndex = LevelHelper::kMinValid;\n        LevelHelper::forEachLevel(&lIndex, [&](void) -> bool {\n            set(LevelHelper::castFromInt(lIndex), configurationType, value);\n            return false;  // Do not break lambda function yet as we need to set all levels regardless\n        });\n    }\n\n    /// @brief Sets configurations (Unsafely) for all levels including Level::Global if includeGlobalLevel is true\n    /// @see Configurations::setGlobally(ConfigurationType configurationType, const std::string& value)\n    void unsafeSetGlobally(ConfigurationType configurationType, const std::string& value, bool includeGlobalLevel) {\n        if (includeGlobalLevel) {\n            unsafeSet(Level::Global, configurationType, value);\n        }\n        base::type::EnumType lIndex = LevelHelper::kMinValid;\n        LevelHelper::forEachLevel(&lIndex, [&](void) -> bool  {\n            unsafeSet(LevelHelper::castFromInt(lIndex), configurationType, value);\n            return false;  // Do not break lambda function yet as we need to set all levels regardless\n        });\n    }\n};\n\nnamespace base {\ntypedef std::shared_ptr<base::type::fstream_t> FileStreamPtr;\ntypedef std::map<std::string, FileStreamPtr> LogStreamsReferenceMap;\n/// @brief Configurations with data types.\n///\n/// @detail el::Configurations have string based values. This is whats used internally in order to read correct configurations.\n/// This is to perform faster while writing logs using correct configurations.\n///\n/// This is thread safe and final class containing non-virtual destructor (means nothing should inherit this class)\nclass TypedConfigurations : public base::threading::ThreadSafe {\npublic:\n    /// @brief Constructor to initialize (construct) the object off el::Configurations\n    /// @param configurations Configurations pointer/reference to base this typed configurations off.\n    /// @param logStreamsReference Use ELPP->registeredLoggers()->logStreamsReference()\n    TypedConfigurations(Configurations* configurations, base::LogStreamsReferenceMap* logStreamsReference) {\n        m_configurations = configurations;\n        m_logStreamsReference = logStreamsReference;\n        build(m_configurations);\n    }\n\n    TypedConfigurations(const TypedConfigurations& other) {\n        this->m_configurations = other.m_configurations;\n        this->m_logStreamsReference = other.m_logStreamsReference;\n        build(m_configurations);\n    }\n\n    virtual ~TypedConfigurations(void) {\n    }\n\n    const Configurations* configurations(void) const {\n        return m_configurations;\n    }\n\n    inline bool enabled(Level level) {\n        return getConfigByVal<bool>(level, &m_enabledMap, \"enabled\");\n    }\n\n    inline bool toFile(Level level) {\n        return getConfigByVal<bool>(level, &m_toFileMap, \"toFile\");\n    }\n\n    inline const std::string& filename(Level level) {\n        return getConfigByRef<std::string>(level, &m_filenameMap, \"filename\");\n    }\n\n    inline bool toStandardOutput(Level level) {\n        return getConfigByVal<bool>(level, &m_toStandardOutputMap, \"toStandardOutput\");\n    }\n\n    inline const base::LogFormat& logFormat(Level level) {\n        return getConfigByRef<base::LogFormat>(level, &m_logFormatMap, \"logFormat\");\n    }\n\n    inline const base::MillisecondsWidth& millisecondsWidth(Level level = Level::Global) {\n        return getConfigByRef<base::MillisecondsWidth>(level, &m_millisecondsWidthMap, \"millisecondsWidth\");\n    }\n\n    inline bool performanceTracking(Level level = Level::Global) {\n        return getConfigByVal<bool>(level, &m_performanceTrackingMap, \"performanceTracking\");\n    }\n\n    inline base::type::fstream_t* fileStream(Level level) {\n        return getConfigByRef<base::FileStreamPtr>(level, &m_fileStreamMap, \"fileStream\").get();\n    }\n\n    inline std::size_t maxLogFileSize(Level level) {\n        return getConfigByVal<std::size_t>(level, &m_maxLogFileSizeMap, \"maxLogFileSize\");\n    }\n\n    inline std::size_t logFlushThreshold(Level level) {\n        return getConfigByVal<std::size_t>(level, &m_logFlushThresholdMap, \"logFlushThreshold\");\n    }\n\nprivate:\n    Configurations* m_configurations;\n    std::map<Level, bool> m_enabledMap;\n    std::map<Level, bool> m_toFileMap;\n    std::map<Level, std::string> m_filenameMap;\n    std::map<Level, bool> m_toStandardOutputMap;\n    std::map<Level, base::LogFormat> m_logFormatMap;\n    std::map<Level, base::MillisecondsWidth> m_millisecondsWidthMap;\n    std::map<Level, bool> m_performanceTrackingMap;\n    std::map<Level, base::FileStreamPtr> m_fileStreamMap;\n    std::map<Level, std::size_t> m_maxLogFileSizeMap;\n    std::map<Level, std::size_t> m_logFlushThresholdMap;\n    base::LogStreamsReferenceMap* m_logStreamsReference;\n\n    friend class el::Helpers;\n    friend class el::base::MessageBuilder;\n    friend class el::base::Writer;\n    friend class el::base::DefaultLogDispatchCallback;\n    friend class el::base::LogDispatcher;\n\n    template <typename Conf_T>\n    inline Conf_T getConfigByVal(Level level, const std::map<Level, Conf_T>* confMap, const char* confName) {\n        base::threading::ScopedLock scopedLock(lock());\n        return unsafeGetConfigByVal(level, confMap, confName);  // This is not unsafe anymore - mutex locked in scope\n    }\n\n    template <typename Conf_T>\n    inline Conf_T& getConfigByRef(Level level, std::map<Level, Conf_T>* confMap, const char* confName) {\n        base::threading::ScopedLock scopedLock(lock());\n        return unsafeGetConfigByRef(level, confMap, confName);  // This is not unsafe anymore - mutex locked in scope\n    }\n\n    template <typename Conf_T>\n    inline Conf_T unsafeGetConfigByVal(Level level, const std::map<Level, Conf_T>* confMap, const char* confName) {\n        _ELPP_UNUSED(confName);\n        typename std::map<Level, Conf_T>::const_iterator it = confMap->find(level);\n        if (it == confMap->end()) {\n            try {\n                return confMap->at(Level::Global);\n            } catch (...) {\n                ELPP_INTERNAL_ERROR(\"Unable to get configuration [\" << confName << \"] for level [\" \n                    << LevelHelper::convertToString(level) << \"]\"\n                        << std::endl << \"Please ensure you have properly configured logger.\", false);\n                return Conf_T();\n            }\n        }\n        return it->second;\n    }\n\n    template <typename Conf_T>\n    inline Conf_T& unsafeGetConfigByRef(Level level, std::map<Level, Conf_T>* confMap, const char* confName) {\n        _ELPP_UNUSED(confName);\n        typename std::map<Level, Conf_T>::iterator it = confMap->find(level);\n        if (it == confMap->end()) {\n            try {\n                return confMap->at(Level::Global);\n            } catch (...) {\n                ELPP_INTERNAL_ERROR(\"Unable to get configuration [\" << confName << \"] for level [\" \n                    << LevelHelper::convertToString(level) << \"]\"\n                        << std::endl << \"Please ensure you have properly configured logger.\", false);\n            }\n        }\n        return it->second;\n    }\n\n    template <typename Conf_T>\n    void setValue(Level level, const Conf_T& value, std::map<Level, Conf_T>* confMap, bool includeGlobalLevel = true) {\n        // If map is empty and we are allowed to add into generic level (Level::Global), do it!\n        if (confMap->empty() && includeGlobalLevel) {\n            confMap->insert(std::make_pair(Level::Global, value));\n            return;\n        }\n        // If same value exist in generic level already, dont add it to explicit level\n        typename std::map<Level, Conf_T>::iterator it = confMap->find(Level::Global);\n        if (it != confMap->end() && it->second == value) {\n            return;\n        }\n        // Now make sure we dont double up values if we really need to add it to explicit level\n        it = confMap->find(level);\n        if (it == confMap->end()) {\n            // Value not found for level, add new\n            confMap->insert(std::make_pair(level, value));\n        } else {\n            // Value found, just update value\n            confMap->at(level) = value;\n        }\n    }\n\n    void build(Configurations* configurations) {\n        base::threading::ScopedLock scopedLock(lock());\n        auto getBool = [] (std::string boolStr) -> bool {  // Pass by value for trimming\n            base::utils::Str::trim(boolStr);\n            return (boolStr == \"TRUE\" || boolStr == \"true\" || boolStr == \"1\");\n        };\n        std::vector<Configuration*> withFileSizeLimit;\n        for (Configurations::const_iterator it = configurations->begin(); it != configurations->end(); ++it) {\n            Configuration* conf = *it;\n            // We cannot use switch on strong enums because Intel C++ dont support them yet\n            if (conf->configurationType() == ConfigurationType::Enabled) {\n                setValue(conf->level(), getBool(conf->value()), &m_enabledMap);\n            } else if (conf->configurationType() == ConfigurationType::ToFile) {\n                setValue(conf->level(), getBool(conf->value()), &m_toFileMap);\n            } else if (conf->configurationType() == ConfigurationType::ToStandardOutput) {\n                setValue(conf->level(), getBool(conf->value()), &m_toStandardOutputMap);\n            } else if (conf->configurationType() == ConfigurationType::Filename) {\n            // We do not yet configure filename but we will configure in another\n            // loop. This is because if file cannot be created, we will force ToFile\n            // to be false. Because configuring logger is not necessarily performance\n            // sensative operation, we can live with another loop; (by the way this loop\n            // is not very heavy either)\n            } else if (conf->configurationType() == ConfigurationType::Format) {\n                setValue(conf->level(), base::LogFormat(conf->level(), \n                    base::type::string_t(conf->value().begin(), conf->value().end())), &m_logFormatMap);\n            } else if (conf->configurationType() == ConfigurationType::MillisecondsWidth) {\n                setValue(Level::Global, \n                    base::MillisecondsWidth(static_cast<int>(getULong(conf->value()))), &m_millisecondsWidthMap);\n            } else if (conf->configurationType() == ConfigurationType::PerformanceTracking) {\n                setValue(Level::Global, getBool(conf->value()), &m_performanceTrackingMap);\n            } else if (conf->configurationType() == ConfigurationType::MaxLogFileSize) {\n                setValue(conf->level(), static_cast<std::size_t>(getULong(conf->value())), &m_maxLogFileSizeMap);\n#if !defined(_ELPP_NO_DEFAULT_LOG_FILE)\n                withFileSizeLimit.push_back(conf);\n#endif  // !defined(_ELPP_NO_DEFAULT_LOG_FILE)\n            } else if (conf->configurationType() == ConfigurationType::LogFlushThreshold) {\n                setValue(conf->level(), static_cast<std::size_t>(getULong(conf->value())), &m_logFlushThresholdMap);\n            }\n        }\n        // As mentioned early, we will now set filename configuration in separate loop to deal with non-existent files\n        for (Configurations::const_iterator it = configurations->begin(); it != configurations->end(); ++it) {\n            Configuration* conf = *it;\n            if (conf->configurationType() == ConfigurationType::Filename) {\n                insertFile(conf->level(), conf->value());\n            }\n        }\n        for (std::vector<Configuration*>::iterator conf = withFileSizeLimit.begin();\n                conf != withFileSizeLimit.end(); ++conf) {\n                // This is not unsafe as mutex is locked in currect scope\n                unsafeValidateFileRolling((*conf)->level(), base::defaultPreRollOutCallback);\n        }\n    }\n\n    unsigned long getULong(std::string confVal) {  // NOLINT\n        bool valid = true;\n        base::utils::Str::trim(confVal);\n        valid = !confVal.empty() && std::find_if(confVal.begin(), confVal.end(),\n                [](char c) { return !base::utils::Str::isDigit(c); }) == confVal.end();\n        if (!valid) {\n            valid = false;\n            ELPP_ASSERT(valid, \"Configuration value not a valid integer [\" << confVal << \"]\");\n            return 0;\n        }\n        return atol(confVal.c_str());\n    }\n\n    std::string resolveFilename(const std::string& filename) {\n        std::string resultingFilename = filename;\n        std::size_t dateIndex = std::string::npos;\n        std::string dateTimeFormatSpecifierStr = std::string(base::consts::kDateTimeFormatSpecifierForFilename);\n        if ((dateIndex = resultingFilename.find(dateTimeFormatSpecifierStr.c_str())) != std::string::npos) {\n            while (dateIndex > 0 && resultingFilename[dateIndex - 1] == base::consts::kFormatSpecifierChar) {\n                dateIndex = resultingFilename.find(dateTimeFormatSpecifierStr.c_str(), dateIndex + 1);\n            }\n            if (dateIndex != std::string::npos) {\n                const char* ptr = resultingFilename.c_str() + dateIndex;\n                // Goto end of specifier\n                ptr += dateTimeFormatSpecifierStr.size();\n                std::string fmt;\n                if ((resultingFilename.size() > dateIndex) && (ptr[0] == '{')) {\n                    // User has provided format for date/time\n                    ++ptr;\n                    int count = 1;  // Start by 1 in order to remove starting brace\n                    std::stringstream ss;\n                    for (; *ptr; ++ptr, ++count) {\n                        if (*ptr == '}') {\n                            ++count;  // In order to remove ending brace\n                            break;\n                        }\n                        ss << *ptr;\n                    }\n                    resultingFilename.erase(dateIndex + dateTimeFormatSpecifierStr.size(), count);\n                    fmt = ss.str();\n                } else {\n                    fmt = std::string(base::consts::kDefaultDateTimeFormatInFilename);\n                }\n                base::MillisecondsWidth msWidth(3);\n                std::string now = base::utils::DateTime::getDateTime(fmt.c_str(), &msWidth);\n                base::utils::Str::replaceAll(now, '/', '-'); // Replace path element since we are dealing with filename\n                base::utils::Str::replaceAll(resultingFilename, dateTimeFormatSpecifierStr, now);\n            }\n        }\n        return resultingFilename;\n    }\n\n    void insertFile(Level level, const std::string& fullFilename) {\n        std::string resolvedFilename = resolveFilename(fullFilename);\n        if (resolvedFilename.empty()) {\n            std::cerr << \"Could not load empty file for logging, please re-check your configurations for level [\"\n                    << LevelHelper::convertToString(level) << \"]\";\n        }\n        std::string filePath = base::utils::File::extractPathFromFilename(resolvedFilename, base::consts::kFilePathSeperator);\n        if (filePath.size() < resolvedFilename.size()) {\n            base::utils::File::createPath(filePath);\n        }\n        auto create = [&](Level level) {\n            base::LogStreamsReferenceMap::iterator filestreamIter = m_logStreamsReference->find(resolvedFilename);\n            base::type::fstream_t* fs = nullptr;\n            if (filestreamIter == m_logStreamsReference->end()) {\n                // We need a completely new stream, nothing to share with\n                fs = base::utils::File::newFileStream(resolvedFilename);\n                m_filenameMap.insert(std::make_pair(level, resolvedFilename));\n                m_fileStreamMap.insert(std::make_pair(level, base::FileStreamPtr(fs)));\n                m_logStreamsReference->insert(std::make_pair(resolvedFilename, base::FileStreamPtr(m_fileStreamMap.at(level))));\n            } else {\n                // Woops! we have an existing one, share it!\n                m_filenameMap.insert(std::make_pair(level, filestreamIter->first));\n                m_fileStreamMap.insert(std::make_pair(level, base::FileStreamPtr(filestreamIter->second)));\n                fs = filestreamIter->second.get();\n            }\n            if (fs == nullptr) {\n                // We display bad file error from newFileStream()\n                ELPP_INTERNAL_ERROR(\"Setting [TO_FILE] of [\" \n                    << LevelHelper::convertToString(level) << \"] to FALSE\", false);\n                setValue(level, false, &m_toFileMap);\n            }\n        };  // NOLINT\n        // If we dont have file conf for any level, create it for Level::Global first\n        // otherwise create for specified level\n        create(m_filenameMap.empty() && m_fileStreamMap.empty() ? Level::Global : level);\n    }\n\n    bool unsafeValidateFileRolling(Level level, const PreRollOutCallback& PreRollOutCallback) {\n        base::type::fstream_t* fs = unsafeGetConfigByRef(level, &m_fileStreamMap, \"fileStream\").get();\n        if (fs == nullptr) {\n            return true;\n        }\n        std::size_t maxLogFileSize = unsafeGetConfigByVal(level, &m_maxLogFileSizeMap, \"maxLogFileSize\");\n        std::size_t currFileSize = base::utils::File::getSizeOfFile(fs);\n        if (maxLogFileSize != 0 && currFileSize >= maxLogFileSize) {\n            std::string fname = unsafeGetConfigByRef(level, &m_filenameMap, \"filename\");\n            ELPP_INTERNAL_INFO(1, \"Truncating log file [\" << fname << \"] as a result of configurations for level [\"\n                    << LevelHelper::convertToString(level) << \"]\");\n            fs->close();\n            PreRollOutCallback(fname.c_str(), currFileSize);\n            fs->open(fname, std::fstream::out | std::fstream::trunc);\n            return true;\n        }\n        return false;\n    }\n\n    bool validateFileRolling(Level level, const PreRollOutCallback& PreRollOutCallback) {\n        base::threading::ScopedLock scopedLock(lock());\n        return unsafeValidateFileRolling(level, PreRollOutCallback);\n    }\n};\n/// @brief Class that keeps record of current line hit for occasional logging\nclass HitCounter {\npublic:\n    HitCounter(void) :\n        m_filename(\"\"),\n        m_lineNumber(0),\n        m_hitCounts(0) {\n    }\n\n    HitCounter(const char* filename, unsigned long int lineNumber) :  // NOLINT\n        m_filename(filename),\n        m_lineNumber(lineNumber),\n        m_hitCounts(0) {\n    }\n\n    HitCounter(const HitCounter& hitCounter) :\n        m_filename(hitCounter.m_filename),\n        m_lineNumber(hitCounter.m_lineNumber),\n        m_hitCounts(hitCounter.m_hitCounts) {\n    }\n\n    HitCounter& operator=(const HitCounter& hitCounter) {\n        m_filename = hitCounter.m_filename;\n        m_lineNumber = hitCounter.m_lineNumber;\n        m_hitCounts = hitCounter.m_hitCounts;\n        return *this;\n    }\n\n    virtual ~HitCounter(void) {\n    }\n\n    /// @brief Resets location of current hit counter\n    inline void resetLocation(const char* filename, unsigned long int lineNumber) {  // NOLINT\n        m_filename = filename;\n        m_lineNumber = lineNumber;\n    }\n\n    /// @brief Validates hit counts and resets it if necessary\n    inline void validateHitCounts(std::size_t n) {\n        if (m_hitCounts >= base::consts::kMaxLogPerCounter) {\n            m_hitCounts = (n >= 1 ? base::consts::kMaxLogPerCounter % n : 0);\n        }\n        ++m_hitCounts;\n    }\n\n    inline const char* filename(void) const {\n        return m_filename;\n    }\n\n    inline unsigned long int lineNumber(void) const {  // NOLINT\n        return m_lineNumber;\n    }\n\n    inline std::size_t hitCounts(void) const {\n        return m_hitCounts;\n    }\n\n    inline void increment(void) {\n        ++m_hitCounts;\n    }\n\n    class Predicate {\n    public:\n        Predicate(const char* filename, unsigned long int lineNumber)  // NOLINT\n            : m_filename(filename),\n              m_lineNumber(lineNumber) {\n        }\n        inline bool operator()(const HitCounter* counter) {\n            return ((counter != nullptr) &&\n                    (strcmp(counter->m_filename, m_filename) == 0) &&\n                    (counter->m_lineNumber == m_lineNumber));\n        }\n\n    private:\n        const char* m_filename;\n        unsigned long int m_lineNumber;  // NOLINT\n    };\n\nprivate:\n    const char* m_filename;\n    unsigned long int m_lineNumber;  // NOLINT\n    std::size_t m_hitCounts;\n};\n/// @brief Repository for hit counters used across the application\nclass RegisteredHitCounters : public base::utils::RegistryWithPred<base::HitCounter, base::HitCounter::Predicate> {\npublic:\n    /// @brief Validates counter for every N, i.e, registers new if does not exist otherwise updates original one\n    /// @return True if validation resulted in triggering hit. Meaning logs should be written everytime true is returned\n    bool validateEveryN(const char* filename, unsigned long int lineNumber, std::size_t n) {  // NOLINT\n        base::threading::ScopedLock scopedLock(lock());\n        base::HitCounter* counter = get(filename, lineNumber);\n        if (counter == nullptr) {\n            registerNew(counter = new base::HitCounter(filename, lineNumber));\n        }\n        counter->validateHitCounts(n);\n        bool result = (n >= 1 && counter->hitCounts() != 0 && counter->hitCounts() % n == 0);\n        return result;\n    }\n\n    /// @brief Validates counter for hits >= N, i.e, registers new if does not exist otherwise updates original one\n    /// @return True if validation resulted in triggering hit. Meaning logs should be written everytime true is returned\n    bool validateAfterN(const char* filename, unsigned long int lineNumber, std::size_t n) {  // NOLINT\n        base::threading::ScopedLock scopedLock(lock());\n        base::HitCounter* counter = get(filename, lineNumber);\n        if (counter == nullptr) {\n            registerNew(counter = new base::HitCounter(filename, lineNumber));\n        }\n        // Do not use validateHitCounts here since we do not want to reset counter here\n        // Note the >= instead of > because we are incrementing\n        // after this check\n        if (counter->hitCounts() >= n)\n            return true;\n        counter->increment();\n        return false;\n    }\n\n    /// @brief Validates counter for hits are <= n, i.e, registers new if does not exist otherwise updates original one\n    /// @return True if validation resulted in triggering hit. Meaning logs should be written everytime true is returned\n    bool validateNTimes(const char* filename, unsigned long int lineNumber, std::size_t n) {  // NOLINT\n        base::threading::ScopedLock scopedLock(lock());\n        base::HitCounter* counter = get(filename, lineNumber);\n        if (counter == nullptr) {\n            registerNew(counter = new base::HitCounter(filename, lineNumber));\n        }\n        counter->increment();\n        // Do not use validateHitCounts here since we do not want to reset counter here\n        if (counter->hitCounts() <= n)\n            return true;\n        return false;\n    }\n\n    /// @brief Gets hit counter registered at specified position\n    inline const base::HitCounter* getCounter(const char* filename, unsigned long int lineNumber) {  // NOLINT\n        base::threading::ScopedLock scopedLock(lock());\n        return get(filename, lineNumber);\n    }\n};\n/// @brief Action to be taken for dispatching\nenum class DispatchAction : base::type::EnumType {\n    None = 1, NormalLog = 2, SysLog = 4\n};\n}  // namespace base\ntemplate <typename T>\nclass Callback : protected base::threading::ThreadSafe {\npublic:\n    Callback(void) : m_enabled(true) {}\n    inline bool enabled(void) const { return m_enabled; }\n    inline void setEnabled(bool enabled) {\n        base::threading::ScopedLock scopedLock(lock());\n        m_enabled = enabled;\n    }\nprotected:\n    virtual void handle(const T* handlePtr) = 0;\nprivate:\n    bool m_enabled;\n};\nclass LogDispatchData {\npublic:\n    LogDispatchData() : m_logMessage(nullptr), m_dispatchAction(base::DispatchAction::None) {}\n    inline const LogMessage* logMessage(void) const { return m_logMessage; }\n    inline base::DispatchAction dispatchAction(void) const { return m_dispatchAction; }\nprivate:\n    LogMessage* m_logMessage;\n    base::DispatchAction m_dispatchAction;\n    friend class base::LogDispatcher;\n\n    inline void setLogMessage(LogMessage* logMessage) { m_logMessage = logMessage; }\n    inline void setDispatchAction(base::DispatchAction dispatchAction) { m_dispatchAction = dispatchAction; }\n};\nclass LogDispatchCallback : public Callback<LogDispatchData> {\nprivate:\n    friend class base::LogDispatcher;\n};\nclass PerformanceTrackingCallback : public Callback<PerformanceTrackingData> {\nprivate:\n    friend class base::PerformanceTracker;\n};\nclass LogBuilder : base::NoCopy {\npublic:\n    virtual ~LogBuilder(void) { ELPP_INTERNAL_INFO(3, \"Destroying log builder...\")}\n    virtual base::type::string_t build(const LogMessage* logMessage, bool appendNewLine) const = 0;\nprivate:\n    friend class el::base::DefaultLogDispatchCallback;\n\n    void convertToColoredOutput(base::type::string_t* logLine, Level level) {\n        if (!base::utils::s_termSupportsColor) return;\n        const base::type::char_t* resetColor = ELPP_LITERAL(\"\\x1b[0m\");\n        if (level == Level::Error || level == Level::Fatal)\n            *logLine = ELPP_LITERAL(\"\\x1b[31m\") + *logLine + resetColor;\n        else if (level == Level::Warning)\n            *logLine = ELPP_LITERAL(\"\\x1b[33m\") + *logLine + resetColor;\n    }\n};\ntypedef std::shared_ptr<LogBuilder> LogBuilderPtr;\n/// @brief Represents a logger holding ID and configurations we need to write logs\n///\n/// @detail This class does not write logs itself instead its used by writer to read configuations from.\nclass Logger : public base::threading::ThreadSafe, public Loggable {\npublic:\n    Logger(const std::string& id, base::LogStreamsReferenceMap* logStreamsReference) :\n            m_id(id),\n            m_typedConfigurations(nullptr),\n            m_parentApplicationName(std::string()),\n            m_isConfigured(false),\n            m_logStreamsReference(logStreamsReference) {\n        initUnflushedCount();\n    }\n\n    Logger(const std::string& id, const Configurations& configurations, base::LogStreamsReferenceMap* logStreamsReference) :\n            m_id(id),\n            m_typedConfigurations(nullptr),\n            m_parentApplicationName(std::string()),\n            m_isConfigured(false),\n            m_logStreamsReference(logStreamsReference) {\n        initUnflushedCount();\n        configure(configurations);\n    }\n\n    Logger(const Logger& logger) {\n        base::utils::safeDelete(m_typedConfigurations);\n        m_id = logger.m_id;\n        m_typedConfigurations = logger.m_typedConfigurations;\n        m_parentApplicationName = logger.m_parentApplicationName;\n        m_isConfigured = logger.m_isConfigured;\n        m_configurations = logger.m_configurations;\n        m_unflushedCount = logger.m_unflushedCount;\n        m_logStreamsReference = logger.m_logStreamsReference;\n    }\n\n    Logger& operator=(const Logger& logger) {\n        base::utils::safeDelete(m_typedConfigurations);\n        m_id = logger.m_id;\n        m_typedConfigurations = logger.m_typedConfigurations;\n        m_parentApplicationName = logger.m_parentApplicationName;\n        m_isConfigured = logger.m_isConfigured;\n        m_configurations = logger.m_configurations;\n        m_unflushedCount = logger.m_unflushedCount;\n        m_logStreamsReference = logger.m_logStreamsReference;\n        return *this;\n    }\n\n    virtual ~Logger(void) {\n        base::utils::safeDelete(m_typedConfigurations);\n    }\n\n    virtual inline void log(el::base::type::ostream_t& os) const {\n        os << m_id.c_str();\n    }\n\n    /// @brief Configures the logger using specified configurations.\n    void configure(const Configurations& configurations) {\n        m_isConfigured = false;  // we set it to false in case if we fail\n        initUnflushedCount();\n        if (m_typedConfigurations != nullptr) {\n            Configurations* c = const_cast<Configurations*>(m_typedConfigurations->configurations());\n            if (c->hasConfiguration(Level::Global, ConfigurationType::Filename)) {\n                // This check is definitely needed for cases like _ELPP_NO_DEFAULT_LOG_FILE\n                flush();\n            }\n        }\n        base::threading::ScopedLock scopedLock(lock());\n        if (m_configurations != configurations) {\n            m_configurations.setFromBase(const_cast<Configurations*>(&configurations));\n        }\n        base::utils::safeDelete(m_typedConfigurations);\n        m_typedConfigurations = new base::TypedConfigurations(&m_configurations, m_logStreamsReference);\n        resolveLoggerFormatSpec();\n        m_isConfigured = true;\n    }\n\n    /// @brief Reconfigures logger using existing configurations\n    inline void reconfigure(void) {\n        ELPP_INTERNAL_INFO(1, \"Reconfiguring logger [\" << m_id << \"]\");\n        configure(m_configurations);\n    }\n\n    inline const std::string& id(void) const {\n        return m_id;\n    }\n\n    inline const std::string& parentApplicationName(void) const {\n        return m_parentApplicationName;\n    }\n\n    inline void setParentApplicationName(const std::string& parentApplicationName) {\n        m_parentApplicationName = parentApplicationName;\n    }\n\n    inline Configurations* configurations(void) {\n        return &m_configurations;\n    }\n\n    inline base::TypedConfigurations* typedConfigurations(void) {\n        return m_typedConfigurations;\n    }\n\n    static inline bool isValidId(const std::string& id) {\n        for (std::string::const_iterator it = id.begin(); it != id.end(); ++it) {\n            if (!base::utils::Str::contains(base::consts::kValidLoggerIdSymbols, *it)) {\n                return false;\n            }\n        }\n        return true;\n    }\n    /// @brief Flushes logger to sync all log files for all levels\n    inline void flush(void) {\n        ELPP_INTERNAL_INFO(3, \"Flushing logger [\" << m_id << \"] all levels\");\n        base::threading::ScopedLock scopedLock(lock());\n        base::type::EnumType lIndex = LevelHelper::kMinValid;\n        LevelHelper::forEachLevel(&lIndex, [&](void) -> bool {\n            flush(LevelHelper::castFromInt(lIndex), nullptr);\n            return false;\n        });\n    }\n\n    inline LogBuilder* logBuilder(void) const {\n        return m_logBuilder.get();\n    }\n\n    inline void setLogBuilder(const LogBuilderPtr& logBuilder) {\n        m_logBuilder = logBuilder;\n    }\n\n    inline bool enabled(Level level) const {\n        return m_typedConfigurations->enabled(level);\n    }\n    \n#if _ELPP_VARIADIC_TEMPLATES_SUPPORTED\n#   define LOGGER_LEVEL_WRITERS_SIGNATURES(FUNCTION_NAME)\\\n    template <typename T, typename... Args>\\\n    inline void FUNCTION_NAME(const char*, const T&, const Args&...);\\\n    template <typename T>\\\n    inline void FUNCTION_NAME(const T&);\n\n    template <typename T, typename... Args> \n    inline void verbose(int, const char*, const T&, const Args&...);\n\n    template <typename T> \n    inline void verbose(int, const T&);\n\n    LOGGER_LEVEL_WRITERS_SIGNATURES(info)\n    LOGGER_LEVEL_WRITERS_SIGNATURES(debug)\n    LOGGER_LEVEL_WRITERS_SIGNATURES(warn)\n    LOGGER_LEVEL_WRITERS_SIGNATURES(error)\n    LOGGER_LEVEL_WRITERS_SIGNATURES(fatal)\n    LOGGER_LEVEL_WRITERS_SIGNATURES(trace)\n#   undef LOGGER_LEVEL_WRITERS_SIGNATURES\n#endif // _ELPP_VARIADIC_TEMPLATES_SUPPORTED\nprivate:\n    std::string m_id;\n    base::TypedConfigurations* m_typedConfigurations;\n    base::type::stringstream_t m_stream;\n    std::string m_parentApplicationName;\n    bool m_isConfigured;\n    Configurations m_configurations;\n    std::map<Level, unsigned int> m_unflushedCount;\n    base::LogStreamsReferenceMap* m_logStreamsReference;\n    LogBuilderPtr m_logBuilder;\n\n    friend class el::LogMessage;\n    friend class el::Loggers;\n    friend class el::Helpers;\n    friend class el::base::RegisteredLoggers;\n    friend class el::base::DefaultLogDispatchCallback;\n    friend class el::base::MessageBuilder;\n    friend class el::base::Writer;\n    friend class el::base::PErrorWriter;\n    friend class el::base::Storage;\n    friend class el::base::PerformanceTracker;\n    friend class el::base::LogDispatcher;\n\n    Logger(void);\n\n#if _ELPP_VARIADIC_TEMPLATES_SUPPORTED\n    template <typename T, typename... Args>\n    void log_(Level, int, const char*, const T&, const Args&...);\n\n    template <typename T>\n    inline void log_(Level, int, const T&);\n\n    template <typename T, typename... Args>\n    void log(Level, const char*, const T&, const Args&...);\n\n    template <typename T>\n    inline void log(Level, const T&);\n#endif // _ELPP_VARIADIC_TEMPLATES_SUPPORTED\n\n    void initUnflushedCount(void) {\n        m_unflushedCount.clear();\n        base::type::EnumType lIndex = LevelHelper::kMinValid;\n        LevelHelper::forEachLevel(&lIndex, [&](void) -> bool {\n            m_unflushedCount.insert(std::make_pair(LevelHelper::castFromInt(lIndex), 0));\n            return false;\n        });\n    }\n\n    inline base::type::stringstream_t& stream(void) {\n        return m_stream;\n    }\n\n    inline void flush(Level level, base::type::fstream_t* fs) {\n        if (fs == nullptr && m_typedConfigurations->toFile(level)) {\n            fs = m_typedConfigurations->fileStream(level);\n        }\n        if (fs != nullptr) {\n            fs->flush();\n            m_unflushedCount.find(level)->second = 0;\n        }\n    }\n\n    inline bool isFlushNeeded(Level level) {\n        return ++m_unflushedCount.find(level)->second >= m_typedConfigurations->logFlushThreshold(level);\n    }\n\n    void resolveLoggerFormatSpec(void) const {\n        base::type::EnumType lIndex = LevelHelper::kMinValid;\n        LevelHelper::forEachLevel(&lIndex, [&](void) -> bool {\n            base::LogFormat* logFormat = \n                const_cast<base::LogFormat*>(&m_typedConfigurations->logFormat(LevelHelper::castFromInt(lIndex)));\n            base::utils::Str::replaceFirstWithEscape(logFormat->m_format,\n                    base::consts::kLoggerIdFormatSpecifier, m_id);\n            return false;\n        });\n    }\n};\nnamespace base {\n/// @brief Loggers repository\nclass RegisteredLoggers : public base::utils::Registry<Logger, std::string> {\npublic:\n    explicit RegisteredLoggers(const LogBuilderPtr& defaultLogBuilder) :\n        m_defaultLogBuilder(defaultLogBuilder) {\n        m_defaultConfigurations.setToDefault();\n    }\n\n    virtual ~RegisteredLoggers(void) {\n        flushAll();\n    }\n\n    inline void setDefaultConfigurations(const Configurations& configurations) {\n        base::threading::ScopedLock scopedLock(lock());\n        m_defaultConfigurations.setFromBase(const_cast<Configurations*>(&configurations));\n    }\n\n    inline Configurations* defaultConfigurations(void) {\n        return &m_defaultConfigurations;\n    }\n\n    Logger* get(const std::string& id, bool forceCreation = true) {\n        base::threading::ScopedLock scopedLock(lock());\n        Logger* logger_ = base::utils::Registry<Logger, std::string>::get(id);\n        if (logger_ == nullptr && forceCreation) {\n            bool validId = Logger::isValidId(id);\n            if (!validId) {\n                ELPP_ASSERT(validId, \"Invalid logger ID [\" << id << \"]. Not registering this logger.\");\n                return nullptr;\n            }\n            logger_ = new Logger(id, m_defaultConfigurations, &m_logStreamsReference);\n            logger_->m_logBuilder = m_defaultLogBuilder;\n            registerNew(id, logger_);\n        }\n        return logger_;\n    }\n\n    bool remove(const std::string& id) {\n        if (id == \"default\") {\n            return false;\n        }\n        Logger* logger = base::utils::Registry<Logger, std::string>::get(id);\n        if (logger != nullptr) {\n            unregister(logger);\n        }\n        return true;\n    }\n\n    inline bool has(const std::string& id) {\n        return get(id, false) != nullptr;\n    }\n\n    inline void unregister(Logger*& logger) {  // NOLINT\n        base::threading::ScopedLock scopedLock(lock());\n        base::utils::Registry<Logger, std::string>::unregister(logger->id());\n    }\n\n    inline base::LogStreamsReferenceMap* logStreamsReference(void) {\n        return &m_logStreamsReference;\n    }\n\n    inline void flushAll(void) {\n        ELPP_INTERNAL_INFO(1, \"Flushing all log files\");\n        base::threading::ScopedLock scopedLock(lock());\n        for (base::LogStreamsReferenceMap::iterator it = m_logStreamsReference.begin();\n                it != m_logStreamsReference.end(); ++it) {\n            if (it->second.get() == nullptr) continue;\n            it->second->flush();\n        }\n    }\n\nprivate:\n    LogBuilderPtr m_defaultLogBuilder;\n    Configurations m_defaultConfigurations;\n    base::LogStreamsReferenceMap m_logStreamsReference;\n    friend class el::base::Storage;\n};\n/// @brief Represents registries for verbose logging\nclass VRegistry : base::NoCopy, public base::threading::ThreadSafe {\npublic:\n    explicit VRegistry(base::type::VerboseLevel level, base::type::EnumType* pFlags) : m_level(level), m_pFlags(pFlags) {\n    }\n\n    /// @brief Sets verbose level. Accepted range is 0-9\n    inline void setLevel(base::type::VerboseLevel level) {\n        base::threading::ScopedLock scopedLock(lock());\n        if (level < 0)\n            m_level = 0;\n        else if (level > 9)\n            m_level = base::consts::kMaxVerboseLevel;\n        else\n            m_level = level;\n    }\n\n    inline base::type::VerboseLevel level(void) const {\n        return m_level;\n    }\n\n    void setModules(const char* modules) {\n        base::threading::ScopedLock scopedLock(lock());\n        auto addSuffix = [](std::stringstream& ss, const char* sfx, const char* prev) {\n            if (prev != nullptr && base::utils::Str::endsWith(ss.str(), prev)) {\n                std::string chr(ss.str().substr(0, ss.str().size() - strlen(prev)));\n                ss.str(\"\");\n                ss << chr;\n            }\n            if (base::utils::Str::endsWith(ss.str(), sfx)) {\n                std::string chr(ss.str().substr(0, ss.str().size() - strlen(sfx)));\n                ss.str(\"\");\n                ss << chr;\n            }\n            ss << sfx;\n        };  // NOLINT\n        auto insert = [&](std::stringstream& ss, base::type::VerboseLevel level) {\n            if (!base::utils::hasFlag(LoggingFlag::DisableVModulesExtensions, *m_pFlags)) {\n                addSuffix(ss, \".h\", nullptr);\n                m_modules.insert(std::make_pair(ss.str(), level));\n                addSuffix(ss, \".c\", \".h\");\n                m_modules.insert(std::make_pair(ss.str(), level));\n                addSuffix(ss, \".cpp\", \".c\");\n                m_modules.insert(std::make_pair(ss.str(), level));\n                addSuffix(ss, \".cc\", \".cpp\");\n                m_modules.insert(std::make_pair(ss.str(), level));\n                addSuffix(ss, \".cxx\", \".cc\");\n                m_modules.insert(std::make_pair(ss.str(), level));\n                addSuffix(ss, \".-inl.h\", \".cxx\");\n                m_modules.insert(std::make_pair(ss.str(), level));\n                addSuffix(ss, \".hxx\", \".-inl.h\");\n                m_modules.insert(std::make_pair(ss.str(), level));\n                addSuffix(ss, \".hpp\", \".hxx\");\n                m_modules.insert(std::make_pair(ss.str(), level));\n                addSuffix(ss, \".hh\", \".hpp\");\n            }\n            m_modules.insert(std::make_pair(ss.str(), level));\n        };  // NOLINT\n        bool isMod = true;\n        bool isLevel = false;\n        std::stringstream ss;\n        int level = -1;\n        for (; *modules; ++modules) {\n            switch (*modules) {\n            case '=':\n                isLevel = true;\n                isMod = false;\n                break;\n            case ',':\n                isLevel = false;\n                isMod = true;\n                if (!ss.str().empty() && level != -1) {\n                    insert(ss, level);\n                    ss.str(\"\");\n                    level = -1;\n                }\n                break;\n            default:\n                if (isMod) {\n                    ss << *modules;\n                } else if (isLevel) {\n                    if (isdigit(*modules)) {\n                        level = static_cast<base::type::VerboseLevel>(*modules) - 48;\n                    }\n                }\n                break;\n            }\n        }\n        if (!ss.str().empty() && level != -1) {\n            insert(ss, level);\n        }\n    }\n\n    bool allowed(base::type::VerboseLevel vlevel, const char* file) {\n        base::threading::ScopedLock scopedLock(lock());\n        if (m_modules.empty() || file == nullptr) {\n            return vlevel <= m_level;\n        } else {\n            std::map<std::string, base::type::VerboseLevel>::iterator it = m_modules.begin();\n            for (; it != m_modules.end(); ++it) {\n                if (base::utils::Str::wildCardMatch(file, it->first.c_str())) {\n                    return vlevel <= it->second;\n                }\n            }\n            if (base::utils::hasFlag(LoggingFlag::AllowVerboseIfModuleNotSpecified, *m_pFlags)) {\n                return true;\n            }\n            return false;\n        }\n    }\n\n    inline const std::map<std::string, base::type::VerboseLevel>& modules(void) const {\n        return m_modules;\n    }\n\n    void setFromArgs(const base::utils::CommandLineArgs* commandLineArgs) {\n        if (commandLineArgs->hasParam(\"-v\") || commandLineArgs->hasParam(\"--verbose\") ||\n            commandLineArgs->hasParam(\"-V\") || commandLineArgs->hasParam(\"--VERBOSE\")) {\n            setLevel(base::consts::kMaxVerboseLevel);\n        } else if (commandLineArgs->hasParamWithValue(\"--v\")) {\n            setLevel(atoi(commandLineArgs->getParamValue(\"--v\")));\n        } else if (commandLineArgs->hasParamWithValue(\"--V\")) {\n            setLevel(atoi(commandLineArgs->getParamValue(\"--V\")));\n        } else if ((commandLineArgs->hasParamWithValue(\"-vmodule\"))\n                && (!base::utils::hasFlag(LoggingFlag::DisableVModules, *m_pFlags))) {\n            setModules(commandLineArgs->getParamValue(\"-vmodule\"));\n        } else if (commandLineArgs->hasParamWithValue(\"-VMODULE\") \n                && (!base::utils::hasFlag(LoggingFlag::DisableVModules, *m_pFlags))) {\n            setModules(commandLineArgs->getParamValue(\"-VMODULE\"));\n        }\n    }\n\nprivate:\n    base::type::VerboseLevel m_level;\n    base::type::EnumType* m_pFlags;\n    std::map<std::string, base::type::VerboseLevel> m_modules;\n};\n}  // namespace base\nclass LogMessage {\npublic:\n    LogMessage(Level level, const std::string& file, unsigned long int line, const std::string& func,  // NOLINT\n                          base::type::VerboseLevel verboseLevel, Logger* logger) :\n                  m_level(level), m_file(file), m_line(line), m_func(func),\n                  m_verboseLevel(verboseLevel), m_logger(logger), m_message(std::move(logger->stream().str())) {\n    }\n    inline Level level(void) const { return m_level; }\n    inline const std::string& file(void) const { return m_file; }\n    inline unsigned long int line(void) const { return m_line; } // NOLINT\n    inline const std::string& func(void) const { return m_func; }\n    inline base::type::VerboseLevel verboseLevel(void) const { return m_verboseLevel; }\n    inline Logger* logger(void) const { return m_logger; }\n    inline const base::type::string_t& message(void) const { return m_message; }\nprivate:\n    Level m_level;\n    std::string m_file;\n    unsigned long int m_line;  // NOLINT\n    std::string m_func;\n    base::type::VerboseLevel m_verboseLevel;\n    Logger* m_logger;\n    base::type::string_t m_message;\n};\nnamespace base {\n/// @brief Easylogging++ management storage\nclass Storage : base::NoCopy, public base::threading::ThreadSafe {\npublic:\n    explicit Storage(const LogBuilderPtr& defaultLogBuilder) :\n        m_registeredHitCounters(new base::RegisteredHitCounters()),\n        m_registeredLoggers(new base::RegisteredLoggers(defaultLogBuilder)),\n        m_flags(0x0),\n        m_vRegistry(new base::VRegistry(0, &m_flags)),\n        m_preRollOutCallback(base::defaultPreRollOutCallback) {\n        // Register default logger\n        m_registeredLoggers->get(std::string(base::consts::kDefaultLoggerId));\n        // Register performance logger and reconfigure format\n        Logger* performanceLogger = m_registeredLoggers->get(std::string(base::consts::kPerformanceLoggerId));\n        performanceLogger->configurations()->setGlobally(ConfigurationType::Format, \"%datetime %level %msg\");\n        performanceLogger->reconfigure();\n#if defined(_ELPP_SYSLOG)\n        // Register syslog logger and reconfigure format\n        Logger* sysLogLogger = m_registeredLoggers->get(std::string(base::consts::kSysLogLoggerId));\n        sysLogLogger->configurations()->setGlobally(ConfigurationType::Format, \"%level: %msg\");\n        sysLogLogger->reconfigure();\n#else\n        _ELPP_UNUSED(base::consts::kSysLogLoggerId);\n#endif  //  defined(_ELPP_SYSLOG)\n        addFlag(LoggingFlag::AllowVerboseIfModuleNotSpecified);\n        installLogDispatchCallback<base::DefaultLogDispatchCallback>(\"DefaultLogDispatchCallback\");\n        installPerformanceTrackingCallback<base::DefaultPerformanceTrackingCallback>(\"DefaultPerformanceTrackingCallback\");\n        ELPP_INTERNAL_INFO(1, \"Easylogging++ has been initialized\");\n    }\n\n    virtual ~Storage(void) {\n        base::utils::safeDelete(m_registeredHitCounters);\n        base::utils::safeDelete(m_registeredLoggers);\n        base::utils::safeDelete(m_vRegistry);\n    }\n\n    inline bool validateEveryNCounter(const char* filename, unsigned long int lineNumber, std::size_t occasion) {  // NOLINT\n        return hitCounters()->validateEveryN(filename, lineNumber, occasion);\n    }\n\n    inline bool validateAfterNCounter(const char* filename, unsigned long int lineNumber, std::size_t n) { // NOLINT\n        return hitCounters()->validateAfterN(filename, lineNumber, n);\n    }\n\n    inline bool validateNTimesCounter(const char* filename, unsigned long int lineNumber, std::size_t n) { // NOLINT\n        return hitCounters()->validateNTimes(filename, lineNumber, n);\n    }\n\n    inline base::RegisteredHitCounters* hitCounters(void) const {\n        return m_registeredHitCounters;\n    }\n\n    inline base::RegisteredLoggers* registeredLoggers(void) const {\n        return m_registeredLoggers;\n    }\n\n    inline base::VRegistry* vRegistry(void) const {\n        return m_vRegistry;\n    }\n\n    inline const base::utils::CommandLineArgs* commandLineArgs(void) const {\n        return &m_commandLineArgs;\n    }\n\n    inline void addFlag(LoggingFlag flag) {\n        base::utils::addFlag(flag, &m_flags);\n    }\n\n    inline void removeFlag(LoggingFlag flag) {\n        base::utils::removeFlag(flag, &m_flags);\n    }\n\n    inline bool hasFlag(LoggingFlag flag) const {\n        return base::utils::hasFlag(flag, m_flags);\n    }\n\n    inline base::type::EnumType flags(void) const {\n        return m_flags;\n    }\n\n    inline void setFlags(unsigned int flags) {\n        m_flags = flags;\n    }\n\n    inline void setPreRollOutCallback(const PreRollOutCallback& callback) {\n        m_preRollOutCallback = callback;\n    }\n\n    inline void unsetPreRollOutCallback(void) {\n        m_preRollOutCallback = base::defaultPreRollOutCallback;\n    }\n\n    inline PreRollOutCallback& preRollOutCallback(void) {\n        return m_preRollOutCallback;\n    }\n\n    inline bool hasCustomFormatSpecifier(const char* formatSpecifier) {\n        base::threading::ScopedLock scopedLock(lock());\n        return std::find(m_customFormatSpecifiers.begin(), m_customFormatSpecifiers.end(),\n                formatSpecifier) != m_customFormatSpecifiers.end();\n    }\n\n    inline void installCustomFormatSpecifier(const CustomFormatSpecifier& customFormatSpecifier) {\n        if (hasCustomFormatSpecifier(customFormatSpecifier.formatSpecifier())) {\n            return;\n        }\n        base::threading::ScopedLock scopedLock(lock());\n        m_customFormatSpecifiers.push_back(customFormatSpecifier);\n    }\n\n    inline bool uninstallCustomFormatSpecifier(const char* formatSpecifier) {\n        base::threading::ScopedLock scopedLock(lock());\n        std::vector<CustomFormatSpecifier>::iterator it = std::find(m_customFormatSpecifiers.begin(),\n                m_customFormatSpecifiers.end(), formatSpecifier);\n        if (it != m_customFormatSpecifiers.end() && strcmp(formatSpecifier, it->formatSpecifier()) == 0) {\n            m_customFormatSpecifiers.erase(it);\n            return true;\n        }\n        return false;\n    }\n\n    const std::vector<CustomFormatSpecifier>* customFormatSpecifiers(void) const {\n        return &m_customFormatSpecifiers;\n    }\n\n    inline void setLoggingLevel(Level level) {\n        m_loggingLevel = level;\n    }\n\n    template <typename T>\n    inline bool installLogDispatchCallback(const std::string& id) {\n        return installCallback<T, base::type::LogDispatchCallbackPtr>(id, &m_logDispatchCallbacks);\n    }\n\n    template <typename T>\n    inline void uninstallLogDispatchCallback(const std::string& id) {\n        uninstallCallback<T, base::type::LogDispatchCallbackPtr>(id, &m_logDispatchCallbacks);\n    }\n    template <typename T>\n    inline T* logDispatchCallback(const std::string& id) {\n        return callback<T, base::type::LogDispatchCallbackPtr>(id, &m_logDispatchCallbacks);\n    }\n\n    template <typename T>\n    inline bool installPerformanceTrackingCallback(const std::string& id) {\n        return installCallback<T, base::type::PerformanceTrackingCallbackPtr>(id, &m_performanceTrackingCallbacks);\n    }\n\n    template <typename T>\n    inline void uninstallPerformanceTrackingCallback(const std::string& id) {\n         uninstallCallback<T, base::type::PerformanceTrackingCallbackPtr>(id, &m_performanceTrackingCallbacks);\n    }\n\n    template <typename T>\n    inline T* performanceTrackingCallback(const std::string& id) {\n        return callback<T, base::type::PerformanceTrackingCallbackPtr>(id, &m_performanceTrackingCallbacks);\n    }\nprivate:\n    base::RegisteredHitCounters* m_registeredHitCounters;\n    base::RegisteredLoggers* m_registeredLoggers;\n    base::type::EnumType m_flags;\n    base::VRegistry* m_vRegistry;\n    base::utils::CommandLineArgs m_commandLineArgs;\n    PreRollOutCallback m_preRollOutCallback;\n    std::map<std::string, base::type::LogDispatchCallbackPtr> m_logDispatchCallbacks;\n    std::map<std::string, base::type::PerformanceTrackingCallbackPtr> m_performanceTrackingCallbacks;\n    std::vector<CustomFormatSpecifier> m_customFormatSpecifiers;\n    Level m_loggingLevel;\n\n    friend class el::Helpers;\n    friend class el::base::DefaultLogDispatchCallback;\n    friend class el::LogBuilder;\n    friend class el::base::MessageBuilder;\n    friend class el::base::Writer;\n    friend class el::base::PerformanceTracker;\n    friend class el::base::LogDispatcher;\n\n    void setApplicationArguments(int argc, char** argv) {\n        m_commandLineArgs.setArgs(argc, argv);\n        m_vRegistry->setFromArgs(commandLineArgs());\n        // default log file\n#if !defined(_ELPP_DISABLE_LOG_FILE_FROM_ARG)\n        if (m_commandLineArgs.hasParamWithValue(base::consts::kDefaultLogFileParam)) {\n            Configurations c;\n            c.setGlobally(ConfigurationType::Filename, m_commandLineArgs.getParamValue(base::consts::kDefaultLogFileParam));\n            registeredLoggers()->setDefaultConfigurations(c);\n            for (base::RegisteredLoggers::iterator it = registeredLoggers()->begin();\n                    it != registeredLoggers()->end(); ++it) {\n                it->second->configure(c);\n            }\n        }\n#endif  // !defined(_ELPP_DISABLE_LOG_FILE_FROM_ARG)\n#if defined(_ELPP_LOGGING_FLAGS_FROM_ARG)\n        if (m_commandLineArgs.hasParamWithValue(base::consts::kLoggingFlagsParam)) {\n            m_flags = atoi(m_commandLineArgs.getParamValue(base::consts::kLoggingFlagsParam));\n        }\n#endif  // defined(_ELPP_LOGGING_FLAGS_FROM_ARG)\n    }\n\n    inline void setApplicationArguments(int argc, const char** argv) {\n        setApplicationArguments(argc, const_cast<char**>(argv));\n    }\n\n    template <typename T, typename TPtr>\n    inline bool installCallback(const std::string& id, std::map<std::string, TPtr>* mapT) {\n        if (mapT->find(id) == mapT->end()) {\n            mapT->insert(std::make_pair(id, TPtr(new T())));\n            return true;\n        }\n        return false;\n    }\n\n    template <typename T, typename TPtr>\n    inline void uninstallCallback(const std::string& id, std::map<std::string, TPtr>* mapT) {\n        mapT->erase(id);\n    }\n\n    template <typename T, typename TPtr>\n    inline T* callback(const std::string& id, std::map<std::string, TPtr>* mapT) {\n        typename std::map<std::string, TPtr>::iterator iter = mapT->find(id);\n        if (iter != mapT->end()) {\n            return static_cast<T*>(iter->second.get());\n        }\n        return nullptr;\n    }\n};\nextern _ELPP_EXPORT base::type::StoragePointer elStorage;\n#define ELPP el::base::elStorage\nclass DefaultLogDispatchCallback : public LogDispatchCallback {\nprotected:\n    void handle(const LogDispatchData* data) {\n        m_data = data;\n        dispatch(std::move(m_data->logMessage()->logger()->logBuilder()->build(m_data->logMessage(), \n            m_data->dispatchAction() == base::DispatchAction::NormalLog)));\n    }\nprivate:\n    const LogDispatchData* m_data;\n    void dispatch(base::type::string_t&& logLine) {\n        if (m_data->dispatchAction() == base::DispatchAction::NormalLog) {\n            if (m_data->logMessage()->logger()->m_typedConfigurations->toFile(m_data->logMessage()->level())) {\n                base::type::fstream_t* fs = m_data->logMessage()->logger()->m_typedConfigurations->fileStream(m_data->logMessage()->level());\n                if (fs != nullptr) {\n                    fs->write(logLine.c_str(), logLine.size());\n                    if (fs->fail()) {\n                        ELPP_INTERNAL_ERROR(\"Unable to write log to file [\"\n                            << m_data->logMessage()->logger()->m_typedConfigurations->filename(m_data->logMessage()->level()) << \"].\\n\"\n                                << \"Few possible reasons (could be something else):\\n\" << \"      * Permission denied\\n\"\n                                << \"      * Disk full\\n\" << \"      * Disk is not writable\", true);\n                    } else {\n                        if (ELPP->hasFlag(LoggingFlag::ImmediateFlush) || (m_data->logMessage()->logger()->isFlushNeeded(m_data->logMessage()->level()))) {\n                            m_data->logMessage()->logger()->flush(m_data->logMessage()->level(), fs);\n                        }\n                    }\n                } else {\n                    ELPP_INTERNAL_ERROR(\"Log file for [\" << LevelHelper::convertToString(m_data->logMessage()->level()) << \"] \"\n                        << \"has not been configured but [TO_FILE] is configured to TRUE. [Logger ID: \" \n                        << m_data->logMessage()->logger()->id() << \"]\", false);\n                }\n            }\n            if (m_data->logMessage()->logger()->m_typedConfigurations->toStandardOutput(m_data->logMessage()->level())) {\n                if (ELPP->hasFlag(LoggingFlag::ColoredTerminalOutput))\n                    m_data->logMessage()->logger()->logBuilder()->convertToColoredOutput(&logLine, m_data->logMessage()->level());\n                ELPP_COUT << ELPP_COUT_LINE(logLine);\n             }\n        }\n#if defined(_ELPP_SYSLOG)\n        else if (m_data->dispatchAction() == base::DispatchAction::SysLog) {\n            // Determine syslog priority\n            int sysLogPriority = 0;\n            if (m_data->logMessage()->level() == Level::Fatal)\n                sysLogPriority = LOG_EMERG;\n            else if (m_data->logMessage()->level() == Level::Error)\n                sysLogPriority = LOG_ERR;\n            else if (m_data->logMessage()->level() == Level::Warning)\n                sysLogPriority = LOG_WARNING;\n            else if (m_data->logMessage()->level() == Level::Info)\n                sysLogPriority = LOG_INFO;\n            else if (m_data->logMessage()->level() == Level::Debug)\n                sysLogPriority = LOG_DEBUG;\n            else\n                sysLogPriority = LOG_NOTICE;\n#   if defined(_ELPP_UNICODE)\n            char* line = base::utils::Str::wcharPtrToCharPtr(logLine.c_str());\n            syslog(sysLogPriority, \"%s\", line);\n            free(line);\n#   else\n            syslog(sysLogPriority, \"%s\", logLine.c_str());\n#   endif\n        }\n#endif  // defined(_ELPP_SYSLOG)\n    }\n};\n}  // namespace base\nnamespace base {\nclass DefaultLogBuilder : public LogBuilder {\npublic:\n    base::type::string_t build(const LogMessage* logMessage, bool appendNewLine) const {\n        base::TypedConfigurations* tc = logMessage->logger()->typedConfigurations();\n        const base::LogFormat* logFormat = &tc->logFormat(logMessage->level());\n        base::type::string_t logLine = logFormat->format();\n        char buff[base::consts::kSourceFilenameMaxLength + base::consts::kSourceLineMaxLength] = \"\";\n        const char* bufLim = buff + sizeof(buff);\n        if (logFormat->hasFlag(base::FormatFlags::AppName)) {\n           // App name\n            base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kAppNameFormatSpecifier,\n                    logMessage->logger()->parentApplicationName());\n        }\n        if (logFormat->hasFlag(base::FormatFlags::ThreadId)) {\n           // Thread ID\n            base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kThreadIdFormatSpecifier,\n                    base::threading::getCurrentThreadId());\n        }\n        if (logFormat->hasFlag(base::FormatFlags::DateTime)) {\n           // DateTime\n            base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kDateTimeFormatSpecifier,\n                    base::utils::DateTime::getDateTime(logFormat->dateTimeFormat().c_str(), \n                        &tc->millisecondsWidth(logMessage->level())));\n        }\n        if (logFormat->hasFlag(base::FormatFlags::Function)) {\n           // Function\n            base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kLogFunctionFormatSpecifier, logMessage->func());\n        }\n        if (logFormat->hasFlag(base::FormatFlags::File)) {\n           // File\n            char* buf = base::utils::Str::clearBuff(buff, base::consts::kSourceFilenameMaxLength);\n            base::utils::File::buildStrippedFilename(logMessage->file().c_str(), buff);\n            buf = base::utils::Str::addToBuff(buff, buf, bufLim);\n            base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kLogFileFormatSpecifier, buff);\n        }\n        if (logFormat->hasFlag(base::FormatFlags::Line)) {\n           // Line\n            char* buf = base::utils::Str::clearBuff(buff, base::consts::kSourceLineMaxLength);\n            buf = base::utils::Str::convertAndAddToBuff(logMessage->line(), \n                base::consts::kSourceLineMaxLength, buf, bufLim, false);\n            base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kLogLineFormatSpecifier, buff);\n        }\n        if (logFormat->hasFlag(base::FormatFlags::Location)) {\n           // Location\n            char* buf = base::utils::Str::clearBuff(buff, \n                base::consts::kSourceFilenameMaxLength + base::consts::kSourceLineMaxLength);\n            base::utils::File::buildStrippedFilename(logMessage->file().c_str(), buff);\n            buf = base::utils::Str::addToBuff(buff, buf, bufLim);\n            buf = base::utils::Str::addToBuff(\":\", buf, bufLim);\n            buf = base::utils::Str::convertAndAddToBuff(logMessage->line(), \n                base::consts::kSourceLineMaxLength, buf, bufLim, false);\n            base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kLogLocationFormatSpecifier, buff);\n        }\n        if (logMessage->level() == Level::Verbose && logFormat->hasFlag(base::FormatFlags::VerboseLevel)) {\n           // Verbose level\n            char* buf = base::utils::Str::clearBuff(buff, 1);\n            buf = base::utils::Str::convertAndAddToBuff(logMessage->verboseLevel(), 1, buf, bufLim, false);\n            base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kVerboseLevelFormatSpecifier, buff);\n        }\n        if (logFormat->hasFlag(base::FormatFlags::LogMessage)) {\n           // Log message\n            base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kMessageFormatSpecifier, logMessage->message());\n        }\n#if !defined(_ELPP_DISABLE_CUSTOM_FORMAT_SPECIFIERS)\n        for (std::vector<CustomFormatSpecifier>::const_iterator it = ELPP->customFormatSpecifiers()->begin();\n                it != ELPP->customFormatSpecifiers()->end(); ++it) {\n            std::string fs(it->formatSpecifier());\n            base::type::string_t wcsFormatSpecifier(fs.begin(), fs.end());\n            base::utils::Str::replaceFirstWithEscape(logLine, wcsFormatSpecifier, it->resolver()());\n        }\n#endif  // !defined(_ELPP_DISABLE_CUSTOM_FORMAT_SPECIFIERS)\n        if (appendNewLine) logLine += ELPP_LITERAL(\"\\n\");\n        return logLine;\n    }\n};\n/// @brief Dispatches log messages\nclass LogDispatcher : base::NoCopy {\npublic:\n    LogDispatcher(bool proceed, LogMessage&& logMessage, base::DispatchAction dispatchAction) :\n        m_proceed(proceed),\n        m_logMessage(std::move(logMessage)),\n        m_dispatchAction(std::move(dispatchAction)) {\n    }\n\n    void dispatch(void) {\n        if (m_proceed && m_dispatchAction == base::DispatchAction::None) {\n            m_proceed = false;\n        }\n        if (!m_proceed) {\n            return;\n        }\n        // We minimize the time of ELPP's lock - this lock is released after log is written\n        base::threading::ScopedLock scopedLock(ELPP->lock());\n        base::TypedConfigurations* tc = m_logMessage.logger()->m_typedConfigurations;\n        if (ELPP->hasFlag(LoggingFlag::StrictLogFileSizeCheck)) {\n            tc->validateFileRolling(m_logMessage.level(), ELPP->preRollOutCallback());\n        }\n        LogDispatchCallback* callback = nullptr;\n        LogDispatchData data;\n        for (const std::pair<std::string, base::type::LogDispatchCallbackPtr>& h \n                : ELPP->m_logDispatchCallbacks) {\n            callback = h.second.get();\n            if (callback != nullptr && callback->enabled()) {\n                data.setLogMessage(&m_logMessage);\n                data.setDispatchAction(m_dispatchAction);\n                callback->acquireLock();\n                callback->handle(&data);\n                callback->releaseLock();\n            }\n        }\n    }\n\nprivate:\n    bool m_proceed;\n    LogMessage m_logMessage;\n    base::DispatchAction m_dispatchAction;\n};\n#if defined(_ELPP_STL_LOGGING)\n/// @brief Workarounds to write some STL logs\n///\n/// @detail There is workaround needed to loop through some stl containers. In order to do that, we need iterable containers\n/// of same type and provide iterator interface and pass it on to writeIterator().\n/// Remember, this is passed by value in constructor so that we dont change original containers.\n/// This operation is as expensive as Big-O(std::min(class_.size(), base::consts::kMaxLogPerContainer))\nnamespace workarounds {\n/// @brief Abstract IterableContainer template that provides interface for iterable classes of type T\ntemplate <typename T, typename Container>\nclass IterableContainer {\npublic:\n    typedef typename Container::iterator iterator;\n    typedef typename Container::const_iterator const_iterator;\n    IterableContainer(void) {}\n    virtual ~IterableContainer(void) {}\n    iterator begin(void) { return getContainer().begin(); }\n    iterator end(void) { return getContainer().end(); }\nprivate:\n    virtual Container& getContainer(void) = 0;\n};\n/// @brief Implements IterableContainer and provides iterable std::priority_queue class\ntemplate<typename T, typename Container = std::vector<T>, typename Comparator = std::less<typename Container::value_type>>\nclass IterablePriorityQueue : public IterableContainer<T, Container>, public std::priority_queue<T, Container, Comparator> {\npublic:\n    IterablePriorityQueue(std::priority_queue<T, Container, Comparator> queue_) {\n        std::size_t count_ = 0;\n        while (++count_ < base::consts::kMaxLogPerContainer && !queue_.empty()) {\n            this->push(queue_.top());\n            queue_.pop();\n        }\n    }\nprivate:\n    inline Container& getContainer(void) {\n        return this->c;\n    }\n};\n/// @brief Implements IterableContainer and provides iterable std::queue class\ntemplate<typename T, typename Container = std::deque<T>>\nclass IterableQueue : public IterableContainer<T, Container>, public std::queue<T, Container> {\npublic:\n    IterableQueue(std::queue<T, Container> queue_) {\n        std::size_t count_ = 0;\n        while (++count_ < base::consts::kMaxLogPerContainer && !queue_.empty()) {\n            this->push(queue_.front());\n            queue_.pop();\n        }\n    }\nprivate:\n    inline Container& getContainer(void) {\n        return this->c;\n    }\n};\n/// @brief Implements IterableContainer and provides iterable std::stack class\ntemplate<typename T, typename Container = std::deque<T>>\nclass IterableStack : public IterableContainer<T, Container>, public std::stack<T, Container> {\npublic:\n    IterableStack(std::stack<T, Container> stack_) {\n        std::size_t count_ = 0;\n        while (++count_ < base::consts::kMaxLogPerContainer && !stack_.empty()) {\n            this->push(stack_.top());\n            stack_.pop();\n        }\n    }\nprivate:\n    inline Container& getContainer(void) {\n        return this->c;\n    }\n};\n}  // namespace workarounds\n#endif  // defined(_ELPP_STL_LOGGING)\n// Log message builder\nclass MessageBuilder {\npublic:\n    MessageBuilder(void) : m_logger(nullptr), m_containerLogSeperator(ELPP_LITERAL(\"\")) {}\n    void initialize(Logger* logger) {\n        m_logger = logger;\n        m_containerLogSeperator = ELPP->hasFlag(LoggingFlag::NewLineForContainer) ? \n            ELPP_LITERAL(\"\\n    \") : ELPP_LITERAL(\", \");\n    }\n\n#   define ELPP_SIMPLE_LOG(LOG_TYPE)\\\n    inline MessageBuilder& operator<<(LOG_TYPE msg) {\\\n        m_logger->stream() << msg;\\\n        if (ELPP->hasFlag(LoggingFlag::AutoSpacing)) {\\\n            m_logger->stream() << \" \";\\\n        }\\\n        return *this;\\\n    }\n\n    inline MessageBuilder& operator<<(const std::string& msg) {\n        m_logger->stream() << msg.c_str();\n        return *this;\n    }\n    ELPP_SIMPLE_LOG(char)\n    ELPP_SIMPLE_LOG(bool)\n    ELPP_SIMPLE_LOG(signed short)  // NOLINT\n    ELPP_SIMPLE_LOG(unsigned short)  // NOLINT\n    ELPP_SIMPLE_LOG(signed int)\n    ELPP_SIMPLE_LOG(unsigned int)\n    ELPP_SIMPLE_LOG(signed long)\n    ELPP_SIMPLE_LOG(unsigned long)\n    ELPP_SIMPLE_LOG(float)\n    ELPP_SIMPLE_LOG(double)\n    ELPP_SIMPLE_LOG(char*)\n    ELPP_SIMPLE_LOG(const char*)\n    ELPP_SIMPLE_LOG(const void*)\n    ELPP_SIMPLE_LOG(long double)\n    inline MessageBuilder& operator<<(const std::wstring& msg) {\n        return operator<<(msg.c_str());\n    }\n    inline MessageBuilder& operator<<(const wchar_t* msg) {\n        if (msg == nullptr) {\n            m_logger->stream() << base::consts::kNullPointer;\n            return *this;\n        }\n#   if defined(_ELPP_UNICODE)\n        m_logger->stream() << msg;\n#   else\n        char* buff_ = base::utils::Str::wcharPtrToCharPtr(msg);\n        m_logger->stream() << buff_;\n        free(buff_);\n#   endif\n        return *this;\n    }\n    // ostream manipulators\n    inline MessageBuilder& operator<<(std::ostream& (*OStreamMani)(std::ostream&)) {\n        m_logger->stream() << OStreamMani;\n        return *this;\n    }\n#define ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(temp)                                                    \\\n    template <typename T>                                                                            \\\n    inline MessageBuilder& operator<<(const temp<T>& template_inst) {                                \\\n        return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size());      \\\n    }\n#define ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(temp)                                                    \\\n    template <typename T1, typename T2>                                                              \\\n    inline MessageBuilder& operator<<(const temp<T1, T2>& template_inst) {                           \\\n        return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size());      \\\n    }\n#define ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(temp)                                                  \\\n    template <typename T1, typename T2, typename T3>                                                 \\\n    inline MessageBuilder& operator<<(const temp<T1, T2, T3>& template_inst) {                       \\\n        return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size());      \\\n    }\n#define ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(temp)                                                   \\\n    template <typename T1, typename T2, typename T3, typename T4>                                    \\\n    inline MessageBuilder& operator<<(const temp<T1, T2, T3, T4>& template_inst) {                   \\\n        return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size());      \\\n    }\n#define ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG(temp)                                                   \\\n    template <typename T1, typename T2, typename T3, typename T4, typename T5>                       \\\n    inline MessageBuilder& operator<<(const temp<T1, T2, T3, T4, T5>& template_inst) {               \\\n        return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size());      \\\n    }\n\n#if defined(_ELPP_STL_LOGGING)\n    ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(std::vector)\n    ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(std::list)\n    ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(std::deque)\n    ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(std::set)\n    ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(std::multiset)\n    ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(std::map)\n    ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(std::multimap)\n    template <class T, class Container>\n    inline MessageBuilder& operator<<(const std::queue<T, Container>& queue_) {\n        base::workarounds::IterableQueue<T, Container> iterableQueue_ =\n                static_cast<base::workarounds::IterableQueue<T, Container> >(queue_);\n        return writeIterator(iterableQueue_.begin(), iterableQueue_.end(), iterableQueue_.size());\n    }\n    template <class T, class Container>\n    inline MessageBuilder& operator<<(const std::stack<T, Container>& stack_) {\n        base::workarounds::IterableStack<T, Container> iterableStack_ =\n                static_cast<base::workarounds::IterableStack<T, Container> >(stack_);\n        return writeIterator(iterableStack_.begin(), iterableStack_.end(), iterableStack_.size());\n    }\n    template <class T, class Container, class Comparator>\n    inline MessageBuilder& operator<<(const std::priority_queue<T, Container, Comparator>& priorityQueue_) {\n        base::workarounds::IterablePriorityQueue<T, Container, Comparator> iterablePriorityQueue_ =\n                static_cast<base::workarounds::IterablePriorityQueue<T, Container, Comparator> >(priorityQueue_);\n        return writeIterator(iterablePriorityQueue_.begin(), iterablePriorityQueue_.end(), iterablePriorityQueue_.size());\n    }\n    template <class First, class Second>\n    inline MessageBuilder& operator<<(const std::pair<First, Second>& pair_) {\n        m_logger->stream() << ELPP_LITERAL(\"(\");\n        operator << (static_cast<First>(pair_.first));\n        m_logger->stream() << ELPP_LITERAL(\", \");\n        operator << (static_cast<Second>(pair_.second));\n        m_logger->stream() << ELPP_LITERAL(\")\");\n        return *this;\n    }\n    template <std::size_t Size>\n    inline MessageBuilder& operator<<(const std::bitset<Size>& bitset_) {\n        m_logger->stream() << ELPP_LITERAL(\"[\");\n        operator << (bitset_.to_string());\n        m_logger->stream() << ELPP_LITERAL(\"]\");\n        return *this;\n    }\n#   if defined(_ELPP_LOG_STD_ARRAY)\n    template <class T, std::size_t Size>\n    inline MessageBuilder& operator<<(const std::array<T, Size>& array) {\n        return writeIterator(array.begin(), array.end(), array.size());\n    }\n#   endif  // defined(_ELPP_LOG_STD_ARRAY)\n#   if defined(_ELPP_LOG_UNORDERED_MAP)\n    ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG(std::unordered_map)\n    ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG(std::unordered_multimap)\n#   endif  // defined(_ELPP_LOG_UNORDERED_MAP)\n#   if defined(_ELPP_LOG_UNORDERED_SET)\n    ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(std::unordered_set)\n    ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(std::unordered_multiset)\n#   endif  // defined(_ELPP_LOG_UNORDERED_SET)\n#endif  // defined(_ELPP_STL_LOGGING)\n#if defined(_ELPP_QT_LOGGING)\n    inline MessageBuilder& operator<<(const QString& msg) {\n#   if defined(_ELPP_UNICODE)\n        m_logger->stream() << msg.toStdWString();\n#   else\n        m_logger->stream() << msg.toStdString();\n#   endif  // defined(_ELPP_UNICODE)\n        return *this;\n    }\n    inline MessageBuilder& operator<<(const QByteArray& msg) {\n        return operator << (QString(msg));\n    }\n    inline MessageBuilder& operator<<(const QStringRef& msg) {\n        return operator<<(msg.toString());\n    }\n    inline MessageBuilder& operator<<(qint64 msg) {\n#   if defined(_ELPP_UNICODE)\n        m_logger->stream() << QString::number(msg).toStdWString();\n#   else\n        m_logger->stream() << QString::number(msg).toStdString();\n#   endif  // defined(_ELPP_UNICODE)\n        return *this;\n    }\n    inline MessageBuilder& operator<<(quint64 msg) {\n#   if defined(_ELPP_UNICODE)\n        m_logger->stream() << QString::number(msg).toStdWString();\n#   else\n        m_logger->stream() << QString::number(msg).toStdString();\n#   endif  // defined(_ELPP_UNICODE)\n        return *this;\n    }\n    inline MessageBuilder& operator<<(QChar msg) {\n        m_logger->stream() << msg.toLatin1();\n        return *this;\n    }\n    inline MessageBuilder& operator<<(const QLatin1String& msg) {\n        m_logger->stream() << msg.latin1();\n        return *this;\n    }\n    ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QList)\n    ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QVector)\n    ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QQueue)\n    ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QSet)\n    ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QLinkedList)\n    ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QStack)\n    template <typename First, typename Second>\n    inline MessageBuilder& operator<<(const QPair<First, Second>& pair_) {\n        m_logger->stream() << ELPP_LITERAL(\"(\");\n        operator << (static_cast<First>(pair_.first));\n        m_logger->stream() << ELPP_LITERAL(\", \");\n        operator << (static_cast<Second>(pair_.second));\n        m_logger->stream() << ELPP_LITERAL(\")\");\n        return *this;\n    }\n    template <typename K, typename V>\n    inline MessageBuilder& operator<<(const QMap<K, V>& map_) {\n        m_logger->stream() << ELPP_LITERAL(\"[\");\n        QList<K> keys = map_.keys();\n        typename QList<K>::const_iterator begin = keys.begin();\n        typename QList<K>::const_iterator end = keys.end();\n        int max_ = static_cast<int>(base::consts::kMaxLogPerContainer);  // to prevent warning\n        for (int index_ = 0; begin != end && index_ < max_; ++index_, ++begin) {\n            m_logger->stream() << ELPP_LITERAL(\"(\");\n            operator << (static_cast<K>(*begin));\n            m_logger->stream() << ELPP_LITERAL(\", \");\n            operator << (static_cast<V>(map_.value(*begin)));\n            m_logger->stream() << ELPP_LITERAL(\")\");\n            m_logger->stream() << ((index_ < keys.size() -1) ? m_containerLogSeperator : ELPP_LITERAL(\"\"));\n        }\n        if (begin != end) {\n            m_logger->stream() << ELPP_LITERAL(\"...\");\n        }\n        m_logger->stream() << ELPP_LITERAL(\"]\");\n        return *this;\n    }\n    template <typename K, typename V>\n    inline MessageBuilder& operator<<(const QMultiMap<K, V>& map_) {\n        operator << (static_cast<QMap<K, V>>(map_));\n        return *this;\n    }\n    template <typename K, typename V>\n    inline MessageBuilder& operator<<(const QHash<K, V>& hash_) {\n        m_logger->stream() << ELPP_LITERAL(\"[\");\n        QList<K> keys = hash_.keys();\n        typename QList<K>::const_iterator begin = keys.begin();\n        typename QList<K>::const_iterator end = keys.end();\n        int max_ = static_cast<int>(base::consts::kMaxLogPerContainer);  // prevent type warning\n        for (int index_ = 0; begin != end && index_ < max_; ++index_, ++begin) {\n            m_logger->stream() << ELPP_LITERAL(\"(\");\n            operator << (static_cast<K>(*begin));\n            m_logger->stream() << ELPP_LITERAL(\", \");\n            operator << (static_cast<V>(hash_.value(*begin)));\n            m_logger->stream() << ELPP_LITERAL(\")\");\n            m_logger->stream() << ((index_ < keys.size() -1) ? m_containerLogSeperator : ELPP_LITERAL(\"\"));\n        }\n        if (begin != end) {\n            m_logger->stream() << ELPP_LITERAL(\"...\");\n        }\n        m_logger->stream() << ELPP_LITERAL(\"]\");\n        return *this;\n    }\n    template <typename K, typename V>\n    inline MessageBuilder& operator<<(const QMultiHash<K, V>& multiHash_) {\n        operator << (static_cast<QHash<K, V>>(multiHash_));\n        return *this;\n    }\n#endif  // defined(_ELPP_QT_LOGGING)\n#if defined(_ELPP_BOOST_LOGGING)\n    ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(boost::container::vector)\n    ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(boost::container::stable_vector)\n    ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(boost::container::list)\n    ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(boost::container::deque)\n    ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(boost::container::map)\n    ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(boost::container::flat_map)\n    ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(boost::container::set)\n    ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(boost::container::flat_set)\n#endif  // defined(_ELPP_BOOST_LOGGING)\n\n/// @brief Macro used internally that can be used externally to make containers easylogging++ friendly\n///\n/// @detail This macro expands to write an ostream& operator<< for container. This container is expected to\n///         have begin() and end() methods that return respective iterators\n/// @param ContainerType Type of container e.g, MyList from WX_DECLARE_LIST(int, MyList); in wxwidgets\n/// @param SizeMethod Method used to get size of container.\n/// @param ElementInstance Instance of element to be fed out. Insance name is \"elem\". See WX_ELPP_ENABLED macro\n///        for an example usage\n#define MAKE_CONTAINER_ELPP_FRIENDLY(ContainerType, SizeMethod, ElementInstance) \\\n    el::base::type::ostream_t& operator<<(el::base::type::ostream_t& ss, const ContainerType& container) {\\\n        const el::base::type::char_t* sep = ELPP->hasFlag(el::LoggingFlag::NewLineForContainer) ? \\\n            ELPP_LITERAL(\"\\n    \") : ELPP_LITERAL(\", \");\\\n        ContainerType::const_iterator elem = container.begin();\\\n        ContainerType::const_iterator endElem = container.end();\\\n        std::size_t size_ = container.SizeMethod; \\\n        ss << ELPP_LITERAL(\"[\");\\\n        for (std::size_t i = 0; elem != endElem && i < el::base::consts::kMaxLogPerContainer; ++i, ++elem) { \\\n            ss << ElementInstance;\\\n            ss << ((i < size_ - 1) ? sep : ELPP_LITERAL(\"\"));\\\n        }\\\n        if (elem != endElem) {\\\n            ss << ELPP_LITERAL(\"...\");\\\n        }\\\n        ss << ELPP_LITERAL(\"]\");\\\n        return ss;\\\n    }\n#if defined(_ELPP_WXWIDGETS_LOGGING)\n    ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(wxVector)\n#   define ELPP_WX_PTR_ENABLED(ContainerType) MAKE_CONTAINER_ELPP_FRIENDLY(ContainerType, size(), *(*elem))\n#   define ELPP_WX_ENABLED(ContainerType) MAKE_CONTAINER_ELPP_FRIENDLY(ContainerType, size(), (*elem))\n#   define ELPP_WX_HASH_MAP_ENABLED(ContainerType) MAKE_CONTAINER_ELPP_FRIENDLY(ContainerType, size(), \\\n        ELPP_LITERAL(\"(\") << elem->first << ELPP_LITERAL(\", \") << elem->second << ELPP_LITERAL(\")\")\n#else\n#   define ELPP_WX_PTR_ENABLED(ContainerType)\n#   define ELPP_WX_ENABLED(ContainerType)\n#   define ELPP_WX_HASH_MAP_ENABLED(ContainerType)\n#endif  // defined(_ELPP_WXWIDGETS_LOGGING)\n    // Other classes\n    template <class Class>\n    ELPP_SIMPLE_LOG(const Class&)\n#undef ELPP_SIMPLE_LOG\n#undef ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG\n#undef ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG\n#undef ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG\n#undef ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG\n#undef ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG\nprivate:\n    Logger* m_logger;\n    const base::type::char_t* m_containerLogSeperator;\n\n    template<class Iterator>\n    inline MessageBuilder& writeIterator(Iterator begin_, Iterator end_, std::size_t size_) {\n        m_logger->stream() << ELPP_LITERAL(\"[\");\n        for (std::size_t i = 0; begin_ != end_ && i < base::consts::kMaxLogPerContainer; ++i, ++begin_) {\n            operator << (*begin_);\n            m_logger->stream() << ((i < size_ - 1) ? m_containerLogSeperator : ELPP_LITERAL(\"\"));\n        }\n        if (begin_ != end_) {\n            m_logger->stream() << ELPP_LITERAL(\"...\");\n        }\n        m_logger->stream() << ELPP_LITERAL(\"]\");\n        return *this;\n    }\n};\n/// @brief Writes nothing - Used when certain log is disabled\nclass NullWriter : base::NoCopy {\npublic:\n    NullWriter(void) {}\n\n    // Null manipulator\n    inline NullWriter& operator<<(std::ostream& (*)(std::ostream&)) {\n        return *this;\n    }\n\n    template <typename T>\n    inline NullWriter& operator<<(const T&) {\n        return *this;\n    }\n};\n/// @brief Main entry point of each logging\nclass Writer : base::NoCopy {\npublic:\n    Writer(Level level, const char* file, unsigned long int line,  // NOLINT\n               const char* func, base::DispatchAction dispatchAction = base::DispatchAction::NormalLog,\n               base::type::VerboseLevel verboseLevel = 0) :\n                   m_level(level), m_file(file), m_line(line), m_func(func), m_verboseLevel(verboseLevel),\n                   m_proceed(false), m_dispatchAction(dispatchAction) {\n    }\n\n    virtual ~Writer(void) {\n        processDispatch();\n    }\n\n    template <typename T>\n    inline Writer& operator<<(const T& log) {\n#if _ELPP_LOGGING_ENABLED\n        if (m_proceed) {\n            m_messageBuilder << log;\n        }\n#endif  // _ELPP_LOGGING_ENABLED\n        return *this;\n    }\n\n    inline Writer& operator<<(std::ostream& (*log)(std::ostream&)) {\n#if _ELPP_LOGGING_ENABLED\n        if (m_proceed) {\n            m_messageBuilder << log;\n        }\n#endif  // _ELPP_LOGGING_ENABLED\n        return *this;\n    }\n\n    Writer& construct(Logger* logger, bool needLock = true) {\n        m_logger = logger;\n        initializeLogger(logger->id(), false, needLock);\n        m_messageBuilder.initialize(m_logger);\n        return *this;\n    }\n\n    Writer& construct(int count, const char* loggerIds, ...) {\n        if (ELPP->hasFlag(LoggingFlag::MultiLoggerSupport)) {\n            va_list loggersList;\n            va_start(loggersList, loggerIds);\n            const char* id = loggerIds;\n            for (int i = 0; i < count; ++i) {\n                m_loggerIds.push_back(std::string(id));\n                id = va_arg(loggersList, const char*);\n            }\n            va_end(loggersList);\n            initializeLogger(m_loggerIds.at(0));\n        } else {\n            initializeLogger(loggerIds);\n        }\n        m_messageBuilder.initialize(m_logger);\n        return *this;\n    }\nprotected:\n    Level m_level;\n    const char* m_file;\n    const unsigned long int m_line;  // NOLINT\n    const char* m_func;\n    base::type::VerboseLevel m_verboseLevel;\n    Logger* m_logger;\n    bool m_proceed;\n    base::MessageBuilder m_messageBuilder;\n    base::DispatchAction m_dispatchAction;\n    std::vector<std::string> m_loggerIds;\n    friend class el::Helpers;\n\n    void initializeLogger(const std::string& loggerId, bool lookup = true, bool needLock = true) {\n        if (lookup) {\n            m_logger = ELPP->registeredLoggers()->get(loggerId, ELPP->hasFlag(LoggingFlag::CreateLoggerAutomatically));\n        }\n        if (m_logger == nullptr) {\n            ELPP->acquireLock();\n            if (!ELPP->registeredLoggers()->has(std::string(base::consts::kDefaultLoggerId))) {\n                // Somehow default logger has been unregistered. Not good! Register again\n                ELPP->registeredLoggers()->get(std::string(base::consts::kDefaultLoggerId));\n            }\n            ELPP->releaseLock();  // Need to unlock it for next writer\n            Writer(Level::Debug, m_file, m_line, m_func).construct(1, base::consts::kDefaultLoggerId)\n                    << \"Logger [\" << loggerId << \"] is not registered yet!\";\n            m_proceed = false;\n        } else {\n            if (needLock) {\n                m_logger->acquireLock();  // This should not be unlocked by checking m_proceed because\n                                          // m_proceed can be changed by lines below\n            }\n            if (ELPP->hasFlag(LoggingFlag::HierarchicalLogging)) {\n                m_proceed = m_level == Level::Verbose ? m_logger->enabled(m_level) :\n                        LevelHelper::castToInt(m_level) >= LevelHelper::castToInt(ELPP->m_loggingLevel);\n            } else {\n                m_proceed = m_logger->enabled(m_level);\n            }\n        }\n    }\n    \n    void processDispatch() {\n#if _ELPP_LOGGING_ENABLED\n        if (ELPP->hasFlag(LoggingFlag::MultiLoggerSupport)) {\n            bool firstDispatched = false;\n            base::type::string_t logMessage;\n            std::size_t i = 0;\n            do {\n                if (m_proceed) {\n                    if (firstDispatched) {\n                        m_logger->stream() << logMessage;\n                    } else {\n                        firstDispatched = true;\n                        if (m_loggerIds.size() > 1) {\n                            logMessage = m_logger->stream().str();\n                        }\n                    }\n                    triggerDispatch();\n                } else if (m_logger != nullptr) {\n                    m_logger->stream().str(ELPP_LITERAL(\"\"));\n                    m_logger->releaseLock();\n                }\n                if (i + 1 < m_loggerIds.size()) {\n                    initializeLogger(m_loggerIds.at(i + 1));\n                }\n            } while (++i < m_loggerIds.size());\n        } else {\n            if (m_proceed) {\n                triggerDispatch();\n            } else if (m_logger != nullptr) {\n                m_logger->stream().str(ELPP_LITERAL(\"\"));\n                m_logger->releaseLock();\n            }\n        }\n#else\n        if (m_logger != nullptr) {\n            m_logger->stream().str(ELPP_LITERAL(\"\"));\n            m_logger->releaseLock();\n        }\n#endif // _ELPP_LOGGING_ENABLED\n    }\n\n    void triggerDispatch(void) {\n        if (m_proceed) {\n            base::LogDispatcher(m_proceed, LogMessage(m_level, m_file, m_line, m_func, m_verboseLevel,\n                          m_logger), m_dispatchAction).dispatch();\n        }\n        if (m_logger != nullptr) {\n            m_logger->stream().str(ELPP_LITERAL(\"\"));\n            m_logger->releaseLock();\n        }\n        if (m_proceed && m_level == Level::Fatal\n                && !ELPP->hasFlag(LoggingFlag::DisableApplicationAbortOnFatalLog)) {\n            base::Writer(Level::Warning, m_file, m_line, m_func).construct(1, base::consts::kDefaultLoggerId)\n                    << \"Aborting application. Reason: Fatal log at [\" << m_file << \":\" << m_line << \"]\";\n            std::stringstream reasonStream;\n            reasonStream << \"Fatal log at [\" << m_file << \":\" << m_line << \"]\"\n                << \" If you wish to disable 'abort on fatal log' please use \"\n                << \"el::Helpers::addFlag(el::LoggingFlag::DisableApplicationAbortOnFatalLog)\";\n            base::utils::abort(1, reasonStream.str());\n        }\n        m_proceed = false;\n    }\n};\nclass PErrorWriter : public base::Writer {\npublic:\n    PErrorWriter(Level level, const char* file, unsigned long int line,  // NOLINT\n               const char* func, base::DispatchAction dispatchAction = base::DispatchAction::NormalLog,\n               base::type::VerboseLevel verboseLevel = 0) :\n        base::Writer(level, file, line, func, dispatchAction, verboseLevel) {\n    }\n\n    virtual ~PErrorWriter(void) {\n        if (m_proceed) {\n#if _ELPP_COMPILER_MSVC\n            char buff[256];\n            strerror_s(buff, 256, errno);\n            m_logger->stream() << \": \" << buff << \" [\" << errno << \"]\";\n#else\n            m_logger->stream() << \": \" << strerror(errno) << \" [\" << errno << \"]\";\n#endif\n        }\n    }\n};\n}  // namespace base\n// Logging from Logger class. Why this is here? Because we have Storage and Writer class available\n#if _ELPP_VARIADIC_TEMPLATES_SUPPORTED\n    template <typename T, typename... Args>\n    void Logger::log_(Level level, int vlevel, const char* s, const T& value, const Args&... args) {\n        base::MessageBuilder b;\n        b.initialize(this);\n        while (*s) {\n            if (*s == base::consts::kFormatSpecifierChar) {\n                if (*(s + 1) == base::consts::kFormatSpecifierChar) {\n                    ++s;\n                } else {\n                    if (*(s + 1) == base::consts::kFormatSpecifierCharValue) {\n                        ++s;\n                        b << value;\n                        log_(level, vlevel, ++s, args...);\n                        return;\n                    }\n                }\n            }\n            b << *s++;\n        }\n        ELPP_INTERNAL_ERROR(\"Too many arguments provided. Unable to handle. Please provide more format specifiers\", false);\n    }\n    template <typename T> \n    inline void Logger::log_(Level level, int vlevel, const T& log) {\n        if (level == Level::Verbose) {\n            if (ELPP->vRegistry()->allowed(vlevel, __FILE__)) {\n                base::Writer(Level::Verbose, \"FILE\", 0, \"FUNCTION\", \n                    base::DispatchAction::NormalLog, vlevel).construct(this, false) << log;\n            } else {\n                stream().str(ELPP_LITERAL(\"\"));\n            }\n        } else {\n            base::Writer(level, \"FILE\", 0, \"FUNCTION\").construct(this, false) << log;\n        }\n    }\n    template <typename T, typename... Args>\n    void Logger::log(Level level, const char* s, const T& value, const Args&... args) {\n        base::threading::ScopedLock scopedLock(lock());\n        log_(level, 0, s, value, args...);\n    }\n    template <typename T> \n    inline void Logger::log(Level level, const T& log) { \n        base::threading::ScopedLock scopedLock(lock());\n        log_(level, 0, log);\n    }\n#   if _ELPP_VERBOSE_LOG\n    template <typename T, typename... Args>\n    inline void Logger::verbose(int vlevel, const char* s, const T& value, const Args&... args) {\n        base::threading::ScopedLock scopedLock(lock());\n        log_(el::Level::Verbose, vlevel, s, value, args...);\n    }\n    template <typename T>\n    inline void Logger::verbose(int vlevel, const T& log) {\n        base::threading::ScopedLock scopedLock(lock());\n        log_(el::Level::Verbose, vlevel, log);\n    }\n#   else\n    template <typename T, typename... Args>\n    inline void Logger::verbose(int, const char*, const T&, const Args&...) {\n        return;\n    }\n    template <typename T>\n    inline void Logger::verbose(int, const T&) {\n        return;\n    }\n#   endif  // _ELPP_VERBOSE_LOG\n#   define LOGGER_LEVEL_WRITERS(FUNCTION_NAME, LOG_LEVEL)\\\n    template <typename T, typename... Args>\\\n    inline void Logger::FUNCTION_NAME(const char* s, const T& value, const Args&... args) {\\\n        log(LOG_LEVEL, s, value, args...);\\\n    }\\\n    template <typename T>\\\n    inline void Logger::FUNCTION_NAME(const T& value) {\\\n        log(LOG_LEVEL, value);\\\n    }\n#   define LOGGER_LEVEL_WRITERS_DISABLED(FUNCTION_NAME, LOG_LEVEL)\\\n    template <typename T, typename... Args>\\\n    inline void Logger::FUNCTION_NAME(const char*, const T&, const Args&...) {\\\n        return;\\\n    }\\\n    template <typename T>\\\n    inline void Logger::FUNCTION_NAME(const T&) {\\\n        return;\\\n    }\n\n#   if _ELPP_INFO_LOG\n    LOGGER_LEVEL_WRITERS(info, Level::Info)\n#   else\n    LOGGER_LEVEL_WRITERS_DISABLED(info, Level::Info)\n#   endif // _ELPP_INFO_LOG\n#   if _ELPP_DEBUG_LOG\n    LOGGER_LEVEL_WRITERS(debug, Level::Debug)\n#   else\n    LOGGER_LEVEL_WRITERS_DISABLED(debug, Level::Debug)\n#   endif // _ELPP_DEBUG_LOG\n#   if _ELPP_WARNING_LOG\n    LOGGER_LEVEL_WRITERS(warn, Level::Warning)\n#   else\n    LOGGER_LEVEL_WRITERS_DISABLED(warn, Level::Warning)\n#   endif // _ELPP_WARNING_LOG\n#   if _ELPP_ERROR_LOG\n    LOGGER_LEVEL_WRITERS(error, Level::Error)\n#   else\n    LOGGER_LEVEL_WRITERS_DISABLED(error, Level::Error)\n#   endif // _ELPP_ERROR_LOG\n#   if _ELPP_FATAL_LOG\n    LOGGER_LEVEL_WRITERS(fatal, Level::Fatal)\n#   else\n    LOGGER_LEVEL_WRITERS_DISABLED(fatal, Level::Fatal)\n#   endif // _ELPP_FATAL_LOG\n#   if _ELPP_TRACE_LOG\n    LOGGER_LEVEL_WRITERS(trace, Level::Trace)\n#   else\n    LOGGER_LEVEL_WRITERS_DISABLED(trace, Level::Trace)\n#   endif // _ELPP_TRACE_LOG\n#   undef LOGGER_LEVEL_WRITERS\n#   undef LOGGER_LEVEL_WRITERS_DISABLED\n#endif // _ELPP_VARIADIC_TEMPLATES_SUPPORTED\n#if _ELPP_COMPILER_MSVC\n#   define ELPP_VARIADIC_FUNC_MSVC(variadicFunction, variadicArgs) variadicFunction variadicArgs\n#   define ELPP_VARIADIC_FUNC_MSVC_RUN(variadicFunction, ...) ELPP_VARIADIC_FUNC_MSVC(variadicFunction, (__VA_ARGS__))\n#   define el_getVALength(...) ELPP_VARIADIC_FUNC_MSVC_RUN(el_resolveVALength, 0, ## __VA_ARGS__,\\\n       10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)\n#else\n#   if _ELPP_COMPILER_CLANG\n#      define el_getVALength(...) el_resolveVALength(0, __VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)\n#   else\n#      define el_getVALength(...) el_resolveVALength(0, ## __VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)\n#   endif // _ELPP_COMPILER_CLANG\n#endif // _ELPP_COMPILER_MSVC\n#define el_resolveVALength(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N\n#define _ELPP_WRITE_LOG(writer, level, dispatchAction, ...) \\\n    writer(level, __FILE__, __LINE__, _ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)\n#define _ELPP_WRITE_LOG_IF(writer, condition, level, dispatchAction, ...) if (condition) \\\n    writer(level, __FILE__, __LINE__, _ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)\n#define _ELPP_WRITE_LOG_EVERY_N(writer, occasion, level, dispatchAction, ...) \\\n    if (ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion)) \\\n        writer(level, __FILE__, __LINE__, _ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)\n#define _ELPP_WRITE_LOG_AFTER_N(writer, n, level, dispatchAction, ...) \\\n    if (ELPP->validateAfterNCounter(__FILE__, __LINE__, n)) \\\n        writer(level, __FILE__, __LINE__, _ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)\n#define _ELPP_WRITE_LOG_N_TIMES(writer, n, level, dispatchAction, ...) \\\n    if (ELPP->validateNTimesCounter(__FILE__, __LINE__, n)) \\\n        writer(level, __FILE__, __LINE__, _ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)\n#undef _CURRENT_FILE_PERFORMANCE_LOGGER_ID\n#if defined(_PERFORMANCE_LOGGER)\n#   define _CURRENT_FILE_PERFORMANCE_LOGGER_ID _PERFORMANCE_LOGGER\n#else\n#   define _CURRENT_FILE_PERFORMANCE_LOGGER_ID el::base::consts::kPerformanceLoggerId\n#endif\nclass PerformanceTrackingData {\npublic:\n    enum class DataType : base::type::EnumType {\n        Checkpoint = 1, Complete = 2\n    };\n    // Do not use constructor, will run into multiple definition error, use init(PerformanceTracker*)\n    explicit PerformanceTrackingData(DataType dataType) : m_performanceTracker(nullptr), m_dataType(dataType) {}\n    inline const std::string* blockName(void) const;\n    inline const struct timeval* startTime(void) const;\n    inline const struct timeval* endTime(void) const;\n    inline const struct timeval* lastCheckpointTime(void) const;\n    inline const base::PerformanceTracker* performanceTracker(void) const { return m_performanceTracker; }\n    inline PerformanceTrackingData::DataType dataType(void) const { return m_dataType; }\n    inline bool firstCheckpoint(void) const { return m_firstCheckpoint; }\n    inline std::string checkpointId(void) const { return m_checkpointId; }\n    inline const char* file(void) const { return m_file; }\n    inline unsigned long int line(void) const { return m_line; }\n    inline const char* func(void) const { return m_func; }\n    inline const base::type::string_t* formattedTimeTaken() const { return &m_formattedTimeTaken; }\n    inline const std::string& loggerId(void) const;\nprivate:\n    base::PerformanceTracker* m_performanceTracker;\n    base::type::string_t m_formattedTimeTaken;\n    PerformanceTrackingData::DataType m_dataType;\n    bool m_firstCheckpoint;\n    std::string m_checkpointId;\n    const char* m_file;\n    unsigned long int m_line;\n    const char* m_func;    \n    inline void init(base::PerformanceTracker* performanceTracker, bool firstCheckpoint = false) {\n        m_performanceTracker = performanceTracker;\n        m_firstCheckpoint = firstCheckpoint;\n    }\n\n    friend class el::base::PerformanceTracker;\n};\nnamespace base {\n/// @brief Represents performanceTracker block of code that conditionally adds performance status to log\n///        either when goes outside the scope of when checkpoint() is called\nclass PerformanceTracker : public base::threading::ThreadSafe, public Loggable {\npublic:\n    PerformanceTracker(const std::string& blockName,\n            base::TimestampUnit timestampUnit = base::TimestampUnit::Millisecond,\n            const std::string& loggerId = _CURRENT_FILE_PERFORMANCE_LOGGER_ID, \n            bool scopedLog = true, Level level = base::consts::kPerformanceTrackerDefaultLevel) :\n        m_blockName(blockName), m_timestampUnit(timestampUnit), m_loggerId(loggerId), m_scopedLog(scopedLog),\n        m_level(level), m_hasChecked(false), m_lastCheckpointId(std::string()), m_enabled(false) {\n#if !defined(_ELPP_DISABLE_PERFORMANCE_TRACKING) && _ELPP_LOGGING_ENABLED\n        // We store it locally so that if user happen to change configuration by the end of scope\n        // or before calling checkpoint, we still depend on state of configuraton at time of construction\n        el::Logger* loggerPtr = ELPP->registeredLoggers()->get(loggerId, false);\n        m_enabled = loggerPtr != nullptr && loggerPtr->m_typedConfigurations->performanceTracking(m_level);\n        if (m_enabled) {\n            base::utils::DateTime::gettimeofday(&m_startTime);\n        }\n#endif  // !defined(_ELPP_DISABLE_PERFORMANCE_TRACKING) && _ELPP_LOGGING_ENABLED\n    }\n    /// @brief Copy constructor\n    PerformanceTracker(const PerformanceTracker& t) :\n        m_blockName(t.m_blockName), m_timestampUnit(t.m_timestampUnit), m_loggerId(t.m_loggerId), m_scopedLog(t.m_scopedLog),\n        m_level(t.m_level), m_hasChecked(t.m_hasChecked), m_lastCheckpointId(t.m_lastCheckpointId), m_enabled(t.m_enabled),\n        m_startTime(t.m_startTime), m_endTime(t.m_endTime), m_lastCheckpointTime(t.m_lastCheckpointTime) {\n    }\n    virtual ~PerformanceTracker(void) {\n#if !defined(_ELPP_DISABLE_PERFORMANCE_TRACKING) && _ELPP_LOGGING_ENABLED\n        if (m_enabled) {\n            base::threading::ScopedLock scopedLock(lock());\n            if (m_scopedLog) {\n                base::utils::DateTime::gettimeofday(&m_endTime);\n                base::type::string_t formattedTime = getFormattedTimeTaken();\n                PerformanceTrackingData data(PerformanceTrackingData::DataType::Complete);\n                data.init(this);\n                data.m_formattedTimeTaken = formattedTime;\n                PerformanceTrackingCallback* callback = nullptr;\n                for (const std::pair<std::string, base::type::PerformanceTrackingCallbackPtr>& h\n                        : ELPP->m_performanceTrackingCallbacks) {\n                    callback = h.second.get();\n                    if (callback != nullptr && callback->enabled()) {\n                        callback->acquireLock();\n                        callback->handle(&data);\n                        callback->releaseLock();\n                    }\n                }\n            }\n        }\n#endif  // !defined(_ELPP_DISABLE_PERFORMANCE_TRACKING)\n    }\n    /// @brief A checkpoint for current performanceTracker block.\n    void checkpoint(const std::string& id = std::string(), const char* file = __FILE__, unsigned long int line = __LINE__, const char* func = \"\") {  // NOLINT\n#if !defined(_ELPP_DISABLE_PERFORMANCE_TRACKING) && _ELPP_LOGGING_ENABLED\n        if (m_enabled) {\n            base::threading::ScopedLock scopedLock(lock());\n            base::utils::DateTime::gettimeofday(&m_endTime);            \n            base::type::string_t formattedTime = m_hasChecked ? base::utils::DateTime::formatTime(\n                    base::utils::DateTime::getTimeDifference(m_endTime, m_lastCheckpointTime, m_timestampUnit), \n                    m_timestampUnit) : ELPP_LITERAL(\"\");\n            PerformanceTrackingData data(PerformanceTrackingData::DataType::Checkpoint);\n            data.init(this);\n            data.m_checkpointId = id;\n            data.m_file = file;\n            data.m_line = line;\n            data.m_func = func;\n            data.m_formattedTimeTaken = formattedTime;\n            PerformanceTrackingCallback* callback = nullptr;\n            for (const std::pair<std::string, base::type::PerformanceTrackingCallbackPtr>& h\n                    : ELPP->m_performanceTrackingCallbacks) {\n                callback = h.second.get();\n                if (callback != nullptr && callback->enabled()) {\n                    callback->acquireLock();\n                    callback->handle(&data);\n                    callback->releaseLock();\n                }\n            }\n            base::utils::DateTime::gettimeofday(&m_lastCheckpointTime);\n            m_hasChecked = true;\n            m_lastCheckpointId = id;\n        }\n#endif  // !defined(_ELPP_DISABLE_PERFORMANCE_TRACKING) && _ELPP_LOGGING_ENABLED\n        _ELPP_UNUSED(id);\n        _ELPP_UNUSED(file);\n        _ELPP_UNUSED(line);\n        _ELPP_UNUSED(func);\n    }\n    inline Level level(void) const { return m_level; }\nprivate:\n    std::string m_blockName;\n    base::TimestampUnit m_timestampUnit;\n    std::string m_loggerId;\n    bool m_scopedLog;\n    Level m_level;\n    bool m_hasChecked;\n    std::string m_lastCheckpointId;\n    bool m_enabled;\n    struct timeval m_startTime, m_endTime, m_lastCheckpointTime;\n\n    PerformanceTracker(void);\n\n    friend class el::PerformanceTrackingData;\n    friend class base::DefaultPerformanceTrackingCallback;\n\n    const base::type::string_t getFormattedTimeTaken() const {\n        return base::utils::DateTime::formatTime(base::utils::DateTime::getTimeDifference(m_endTime,\n                m_startTime, m_timestampUnit), m_timestampUnit);\n    }\n\n    virtual inline void log(el::base::type::ostream_t& os) const {\n        os << getFormattedTimeTaken();\n    }\n};\nclass DefaultPerformanceTrackingCallback : public PerformanceTrackingCallback {\nprotected:\n    void handle(const PerformanceTrackingData* data) {\n        m_data = data;\n        if (data->dataType() == PerformanceTrackingData::DataType::Complete) {\n            _ELPP_WRITE_LOG(el::base::Writer, m_data->performanceTracker()->level(), base::DispatchAction::NormalLog, data->loggerId().c_str()) \n                << \"Executed [\" << *m_data->blockName() << \"] in [\" << *m_data->formattedTimeTaken() << \"]\";\n        } else {\n            base::type::stringstream_t ss;\n            ss << ELPP_LITERAL(\"Performance checkpoint\");\n            if (!m_data->checkpointId().empty()) {\n                ss << ELPP_LITERAL(\" [\") << m_data->checkpointId().c_str() << ELPP_LITERAL(\"]\");\n            }\n            ss << ELPP_LITERAL(\" for block [\") << m_data->blockName()->c_str() << ELPP_LITERAL(\"] : [\") << *data->performanceTracker();\n            if (!ELPP->hasFlag(LoggingFlag::DisablePerformanceTrackingCheckpointComparison) && data->performanceTracker()->m_hasChecked) {\n                ss << ELPP_LITERAL(\" ([\") << *m_data->formattedTimeTaken() << ELPP_LITERAL(\"] from \");\n                if (data->performanceTracker()->m_lastCheckpointId.empty()) {\n                    ss << ELPP_LITERAL(\"last checkpoint\");\n                } else {\n                    ss << ELPP_LITERAL(\"checkpoint '\") << data->performanceTracker()->m_lastCheckpointId.c_str() << ELPP_LITERAL(\"'\");\n                }\n                ss << ELPP_LITERAL(\")]\");\n            } else {\n                ss << ELPP_LITERAL(\"]\");\n            }\n            el::base::Writer(data->performanceTracker()->m_level, data->file(), data->line(), data->func()).construct(1, data->loggerId().c_str()) << ss.str();\n        }\n    }\nprivate:\n    const PerformanceTrackingData* m_data;\n};\n}  // namespace base\ninline const std::string* PerformanceTrackingData::blockName() const {\n    return const_cast<const std::string*>(&m_performanceTracker->m_blockName);\n}\ninline const struct timeval* PerformanceTrackingData::startTime() const {\n    return const_cast<const struct timeval*>(&m_performanceTracker->m_startTime);\n}\ninline const struct timeval* PerformanceTrackingData::endTime() const {\n    return const_cast<const struct timeval*>(&m_performanceTracker->m_endTime);\n}\ninline const struct timeval* PerformanceTrackingData::lastCheckpointTime() const {\n    return const_cast<const struct timeval*>(&m_performanceTracker->m_lastCheckpointTime);\n}\ninline const std::string& PerformanceTrackingData::loggerId(void) const { return m_performanceTracker->m_loggerId; }\nnamespace base {\n/// @brief Contains some internal debugging tools like crash handler and stack tracer\nnamespace debug {\nclass StackTrace : base::NoCopy {\npublic:\n    static const std::size_t kMaxStack = 64;\n    static const std::size_t kStackStart = 2;  // We want to skip c'tor and StackTrace::generateNew()\n    class StackTraceEntry {\n    public:\n        StackTraceEntry(std::size_t index, const char* loc, const char* demang, const char* hex, const char* addr) {\n            m_index = index;\n            m_location = std::string(loc);\n            m_demangled = std::string(demang);\n            m_hex = std::string(hex);\n            m_addr = std::string(addr);\n        }\n        StackTraceEntry(std::size_t index, char* loc) {\n            m_index = index;\n            m_location = std::string(loc);\n        }\n        std::size_t m_index;\n        std::string m_location;\n        std::string m_demangled;\n        std::string m_hex;\n        std::string m_addr;\n        friend std::ostream& operator<<(std::ostream& ss, const StackTraceEntry& si) {\n           ss << \"[\" << si.m_index << \"] \" << si.m_location << (si.m_demangled.empty() ? \"\" : \":\") << si.m_demangled\n                   << (si.m_hex.empty() ? \"\" : \"+\") << si.m_hex << si.m_addr;\n           return ss;\n        }\n\n    private:\n        StackTraceEntry(void);\n    };\n\n    StackTrace(void) {\n        generateNew();\n    }\n\n    virtual ~StackTrace(void) {\n    }\n\n    inline std::vector<StackTraceEntry>& getLatestStack(void) {\n        return m_stack;\n    }\n\n    friend inline std::ostream& operator<<(std::ostream& os, const StackTrace& st) {\n       std::vector<StackTraceEntry>::const_iterator it = st.m_stack.begin();\n       while (it != st.m_stack.end()) {\n           os << \"    \" << *it++ << \"\\n\";\n       }\n       return os;\n    }\n\nprivate:\n    std::vector<StackTraceEntry> m_stack;\n\n    void generateNew(void) {\n#if _ELPP_STACKTRACE\n        m_stack.clear();\n        void* stack[kMaxStack];\n        std::size_t size = backtrace(stack, kMaxStack);\n        char** strings = backtrace_symbols(stack, size);\n        if (size > kStackStart) {  // Skip StackTrace c'tor and generateNew\n            for (std::size_t i = kStackStart; i < size; ++i) {\n                char* mangName = nullptr;\n                char* hex = nullptr;\n                char* addr = nullptr;\n                for (char* c = strings[i]; *c; ++c) {\n                    switch (*c) {\n                    case '(':\n                        mangName = c;\n                        break;\n                    case '+':\n                        hex = c;\n                        break;\n                    case ')':\n                        addr = c;\n                        break;\n                    }\n                }\n                // Perform demangling if parsed properly\n                if (mangName != nullptr && hex != nullptr && addr != nullptr && mangName < hex) {\n                    *mangName++ = '\\0';\n                    *hex++ = '\\0';\n                    *addr++ = '\\0';\n                    int status = 0;\n                    char* demangName = abi::__cxa_demangle(mangName, 0, 0, &status);\n                    // if demangling is successful, output the demangled function name\n                    if (status == 0) {\n                        // Success (see http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01696.html)\n                        StackTraceEntry entry(i - 1, strings[i], demangName, hex, addr);\n                        m_stack.push_back(entry);\n                    } else {\n                        // Not successful - we will use mangled name\n                        StackTraceEntry entry(i - 1, strings[i], mangName, hex, addr);\n                        m_stack.push_back(entry);\n                    }\n                    free(demangName);\n                } else {\n                    StackTraceEntry entry(i - 1, strings[i]);\n                    m_stack.push_back(entry);\n                }\n            }\n        }\n        free(strings);\n#else\n        ELPP_INTERNAL_INFO(1, \"Stacktrace generation not supported for selected compiler\");\n#endif  // _ELPP_STACKTRACE\n    }\n};\nstatic std::string crashReason(int sig) {\n    std::stringstream ss;\n    bool foundReason = false;\n    for (int i = 0; i < base::consts::kCrashSignalsCount; ++i) {\n        if (base::consts::kCrashSignals[i].numb == sig) {\n            ss << \"Application has crashed due to [\" << base::consts::kCrashSignals[i].name << \"] signal\";\n            if (ELPP->hasFlag(el::LoggingFlag::LogDetailedCrashReason)) {\n                ss << std::endl <<\n                      \"    \" << base::consts::kCrashSignals[i].brief << std::endl <<\n                      \"    \" << base::consts::kCrashSignals[i].detail;\n                }\n            foundReason = true;\n        }\n    }\n    if (!foundReason) {\n        ss << \"Application has crashed due to unknown signal [\" << sig << \"]\";\n    }\n    return ss.str();\n}\n/// @brief Logs reason of crash from sig\nstatic void logCrashReason(int sig, bool stackTraceIfAvailable, Level level, const char* logger) {\n    std::stringstream ss;\n    ss << \"CRASH HANDLED; \";\n    ss << crashReason(sig);\n#if _ELPP_STACKTRACE\n    if (stackTraceIfAvailable) {\n        ss << std::endl << \"    ======= Backtrace: =========\" << std::endl << base::debug::StackTrace();\n    }\n#else\n    _ELPP_UNUSED(stackTraceIfAvailable);\n#endif  // _ELPP_STACKTRACE\n    _ELPP_WRITE_LOG(el::base::Writer, level, base::DispatchAction::NormalLog, logger) << ss.str();\n}\nstatic inline void crashAbort(int sig) {\n    base::utils::abort(sig);\n}\n/// @brief Default application crash handler\n///\n/// @detail This function writes log using 'default' logger, prints stack trace for GCC based compilers and aborts program.\nstatic inline void defaultCrashHandler(int sig) {\n    base::debug::logCrashReason(sig, true, Level::Fatal, base::consts::kDefaultLoggerId);\n    base::debug::crashAbort(sig);\n}\n/// @brief Handles unexpected crashes\nclass CrashHandler : base::NoCopy {\npublic:\n    typedef void (*Handler)(int);\n\n    explicit CrashHandler(bool useDefault) {\n        if (useDefault) {\n            setHandler(defaultCrashHandler);\n        }\n    }\n    explicit CrashHandler(const Handler& cHandler) {\n        setHandler(cHandler);\n    }\n    void setHandler(const Handler& cHandler) {\n        m_handler = cHandler;\n#if defined(_ELPP_HANDLE_SIGABRT)\n            int i = 0;  // SIGABRT is at base::consts::kCrashSignals[0]\n#else\n            int i = 1;\n#endif  // defined(_ELPP_HANDLE_SIGABRT)\n        for (; i < base::consts::kCrashSignalsCount; ++i) {\n            m_handler = signal(base::consts::kCrashSignals[i].numb, cHandler);\n        }\n    }\n\nprivate:\n    Handler m_handler;\n};\n}  // namespace debug\n}  // namespace base\nextern base::debug::CrashHandler elCrashHandler;\n#define MAKE_LOGGABLE(ClassType, ClassInstance, OutputStreamInstance) \\\n    el::base::type::ostream_t& operator<<(el::base::type::ostream_t& OutputStreamInstance, const ClassType& ClassInstance)\n/// @brief Initializes syslog with process ID, options and facility. calls closelog() on d'tor\nclass SysLogInitializer {\npublic:\n    SysLogInitializer(const char* processIdent, int options = 0, int facility = 0) {\n#if defined(_ELPP_SYSLOG)\n        openlog(processIdent, options, facility);\n#else\n        _ELPP_UNUSED(processIdent);\n        _ELPP_UNUSED(options);\n        _ELPP_UNUSED(facility);\n#endif  // defined(_ELPP_SYSLOG)\n    }\n    virtual ~SysLogInitializer(void) {\n#if defined(_ELPP_SYSLOG)\n        closelog();\n#endif  // defined(_ELPP_SYSLOG)\n    }\n};\n#define _INIT_SYSLOG(id, opt, fac) el::SysLogInitializer elSyslogInit(id, opt, fac)\n/// @brief Static helpers for developers\nclass Helpers : base::StaticClass {\npublic:\n    /// @brief Shares logging repository (base::Storage)\n    static inline void setStorage(base::type::StoragePointer storage) {\n        ELPP = storage;\n    }\n    /// @return Main storage repository\n    static inline base::type::StoragePointer storage() {\n        return ELPP;\n    }\n    /// @brief Sets application arguments and figures out whats active for logging and whats not.\n    static inline void setArgs(int argc, char** argv) {\n        ELPP->setApplicationArguments(argc, argv);\n    }\n    /// @copydoc setArgs(int argc, char** argv)\n    static inline void setArgs(int argc, const char** argv) {\n        ELPP->setApplicationArguments(argc, const_cast<char**>(argv));\n    }\n    /// @brief Overrides default crash handler and installs custom handler.\n    /// @param crashHandler A functor with no return type that takes single int argument.\n    ///        Handler is a typedef with specification: void (*Handler)(int)\n    static inline void setCrashHandler(const el::base::debug::CrashHandler::Handler& crashHandler) {\n        el::elCrashHandler.setHandler(crashHandler);\n    }\n    /// @brief Abort due to crash with signal in parameter\n    /// @param sig Crash signal\n    static inline void crashAbort(int sig, const char* sourceFile = \"\", unsigned int long line = 0) {  // NOLINT\n        std::stringstream ss;\n        ss << base::debug::crashReason(sig).c_str();\n        ss << \" - [Called el::Helpers::crashAbort(\" << sig << \")]\";\n        if (sourceFile != nullptr && strlen(sourceFile) > 0) {\n            ss << \" - Source: \" << sourceFile;\n            if (line > 0)\n                ss << \":\" << line;\n            else\n                ss << \" (line number not specified)\";\n        }\n        base::utils::abort(sig, ss.str().c_str());\n    }\n    /// @brief Logs reason of crash as per sig\n    /// @param sig Crash signal\n    /// @param stackTraceIfAvailable Includes stack trace if available\n    /// @param level Logging level\n    /// @param logger Logger to use for logging\n    static inline void logCrashReason(int sig, bool stackTraceIfAvailable = false,\n            Level level = Level::Fatal, const char* logger = base::consts::kDefaultLoggerId) {\n        el::base::debug::logCrashReason(sig, stackTraceIfAvailable, level, logger);\n    }\n    /// @brief Installs pre rollout callback, this callback is triggered when log file is about to be rolled out\n    ///        (can be useful for backing up)\n    static inline void installPreRollOutCallback(const PreRollOutCallback& callback) {\n        ELPP->setPreRollOutCallback(callback);\n    }\n    /// @brief Uninstalls pre rollout callback\n    static inline void uninstallPreRollOutCallback(void) {\n        ELPP->unsetPreRollOutCallback();\n    }\n    /// @brief Installs post log dispatch callback, this callback is triggered when log is dispatched\n    template <typename T>\n    static inline bool installLogDispatchCallback(const std::string& id) {\n        return ELPP->installLogDispatchCallback<T>(id);\n    }\n    /// @brief Uninstalls log dispatch callback\n    template <typename T>\n    static inline void uninstallLogDispatchCallback(const std::string& id) {\n        ELPP->uninstallLogDispatchCallback<T>(id);\n    }\n    template <typename T>\n    static inline T* logDispatchCallback(const std::string& id) {\n        return ELPP->logDispatchCallback<T>(id);\n    }\n    /// @brief Installs post performance tracking callback, this callback is triggered when performance tracking is finished\n    template <typename T>\n    static inline bool installPerformanceTrackingCallback(const std::string& id) {\n        return ELPP->installPerformanceTrackingCallback<T>(id);\n    }\n    /// @brief Uninstalls post performance tracking handler\n    template <typename T>\n    static inline void uninstallPerformanceTrackingCallback(const std::string& id) {\n        ELPP->uninstallPerformanceTrackingCallback<T>(id);\n    }\n    template <typename T>\n    static inline T* performanceTrackingCallback(const std::string& id) {\n        return ELPP->performanceTrackingCallback<T>(id);\n    }\n    /// @brief Converts template to std::string - useful for loggable classes to log containers within log(std::ostream&) const\n    template <typename T>\n    static std::string convertTemplateToStdString(const T& templ) {\n        el::Logger* logger = \n            ELPP->registeredLoggers()->get(el::base::consts::kDefaultLoggerId);\n        if (logger == nullptr) {\n            return std::string();\n        }\n        base::MessageBuilder b;\n        b.initialize(logger);\n        logger->acquireLock();\n        b << templ;\n#if defined(_ELPP_UNICODE)\n        std::string s = std::string(logger->stream().str().begin(), logger->stream().str().end());\n#else\n        std::string s = logger->stream().str();\n#endif  // defined(_ELPP_UNICODE)\n        logger->stream().str(ELPP_LITERAL(\"\"));\n        logger->releaseLock();\n        return s;\n    }\n    /// @brief Returns command line arguments (pointer) provided to easylogging++\n    static inline const el::base::utils::CommandLineArgs* commandLineArgs(void) {\n        return ELPP->commandLineArgs();\n    }\n    /// @brief Installs user defined format specifier and handler\n    static inline void installCustomFormatSpecifier(const CustomFormatSpecifier& customFormatSpecifier) {\n        ELPP->installCustomFormatSpecifier(customFormatSpecifier);\n    }\n    /// @brief Uninstalls user defined format specifier and handler\n    static inline bool uninstallCustomFormatSpecifier(const char* formatSpecifier) {\n        return ELPP->uninstallCustomFormatSpecifier(formatSpecifier);\n    }\n    /// @brief Returns true if custom format specifier is installed\n    static inline bool hasCustomFormatSpecifier(const char* formatSpecifier) {\n        return ELPP->hasCustomFormatSpecifier(formatSpecifier);\n    }\n    static inline void validateFileRolling(Logger* logger, Level level) {\n        if (logger == nullptr) return;\n        logger->m_typedConfigurations->validateFileRolling(level, ELPP->preRollOutCallback());\n    }\n};\n/// @brief Static helpers to deal with loggers and their configurations\nclass Loggers : base::StaticClass {\npublic:\n    /// @brief Gets existing or registers new logger\n    static inline Logger* getLogger(const std::string& identity, bool registerIfNotAvailable = true) {\n        base::threading::ScopedLock scopedLock(ELPP->lock());\n        return ELPP->registeredLoggers()->get(identity, registerIfNotAvailable);\n    }\n    /// @brief Unregisters logger - use it only when you know what you are doing, you may unregister\n    ///        loggers initialized / used by third-party libs.\n    static inline bool unregisterLogger(const std::string& identity) {\n        base::threading::ScopedLock scopedLock(ELPP->lock());\n        return ELPP->registeredLoggers()->remove(identity);\n    }\n    /// @brief Whether or not logger with id is registered\n    static inline bool hasLogger(const std::string& identity) {\n        base::threading::ScopedLock scopedLock(ELPP->lock());\n        return ELPP->registeredLoggers()->has(identity);\n    }\n    /// @brief Reconfigures specified logger with new configurations\n    static inline Logger* reconfigureLogger(Logger* logger, const Configurations& configurations) {\n        if (!logger) return nullptr;\n        logger->configure(configurations);\n        return logger;\n    }\n    /// @brief Reconfigures logger with new configurations after looking it up using identity\n    static inline Logger* reconfigureLogger(const std::string& identity, const Configurations& configurations) {\n        return Loggers::reconfigureLogger(Loggers::getLogger(identity), configurations);\n    }\n    /// @brief Reconfigures logger's single configuration\n    static inline Logger* reconfigureLogger(const std::string& identity, ConfigurationType configurationType,\n            const std::string& value) {\n        Logger* logger = Loggers::getLogger(identity);\n        if (logger == nullptr) {\n            return nullptr;\n        }\n        logger->configurations()->set(Level::Global, configurationType, value);\n        logger->reconfigure();\n        return logger;\n    }\n    /// @brief Reconfigures all the existing loggers with new configurations\n    static inline void reconfigureAllLoggers(const Configurations& configurations) {\n        for (base::RegisteredLoggers::iterator it = ELPP->registeredLoggers()->begin();\n                it != ELPP->registeredLoggers()->end(); ++it) {\n            Loggers::reconfigureLogger(it->second, configurations);\n        }\n    }\n    /// @brief Reconfigures single configuration for all the loggers\n    static inline void reconfigureAllLoggers(ConfigurationType configurationType, const std::string& value) {\n        reconfigureAllLoggers(Level::Global, configurationType, value);\n    }\n    /// @brief Reconfigures single configuration for all the loggers for specified level\n    static inline void reconfigureAllLoggers(Level level, ConfigurationType configurationType, \n            const std::string& value) {\n        for (base::RegisteredLoggers::iterator it = ELPP->registeredLoggers()->begin();\n                it != ELPP->registeredLoggers()->end(); ++it) {\n            Logger* logger = it->second;\n            logger->configurations()->set(level, configurationType, value);\n            logger->reconfigure();\n        }\n    }\n    /// @brief Sets default configurations. This configuration is used for future (and conditionally for existing) loggers\n    static inline void setDefaultConfigurations(const Configurations& configurations, bool reconfigureExistingLoggers = false) {\n        ELPP->registeredLoggers()->setDefaultConfigurations(configurations);\n        if (reconfigureExistingLoggers) {\n            Loggers::reconfigureAllLoggers(configurations);\n        }\n    }\n    /// @brief Returns current default\n    static inline const Configurations* defaultConfigurations(void) {\n        return ELPP->registeredLoggers()->defaultConfigurations();\n    }\n    /// @brief Returns log stream reference pointer if needed by user\n    static inline const base::LogStreamsReferenceMap* logStreamsReference(void) {\n        return ELPP->registeredLoggers()->logStreamsReference();\n    }\n    /// @brief Default typed configuration based on existing defaultConf\n    static base::TypedConfigurations defaultTypedConfigurations(void) {\n        return base::TypedConfigurations(\n            ELPP->registeredLoggers()->defaultConfigurations(),\n            ELPP->registeredLoggers()->logStreamsReference());\n    }\n    /// @brief Populates all logger IDs in current repository.\n    /// @param [out] targetList List of fill up.\n    static inline std::vector<std::string>* populateAllLoggerIds(std::vector<std::string>* targetList) {\n        targetList->clear();\n        for (base::RegisteredLoggers::iterator it = ELPP->registeredLoggers()->list().begin();\n                it != ELPP->registeredLoggers()->list().end(); ++it) {\n            targetList->push_back(it->first);\n        }\n        return targetList;\n    }\n    /// @brief Sets configurations from global configuration file.\n    static void configureFromGlobal(const char* globalConfigurationFilePath) {\n        std::ifstream gcfStream(globalConfigurationFilePath, std::ifstream::in);\n        ELPP_ASSERT(gcfStream.is_open(), \"Unable to open global configuration file [\" << globalConfigurationFilePath \n            << \"] for parsing.\");\n        std::string line = std::string();\n        std::stringstream ss;\n        Logger* logger = nullptr;\n        auto configure = [&](void) {\n            ELPP_INTERNAL_INFO(8, \"Configuring logger: '\" << logger->id() << \"' with configurations \\n\" << ss.str() \n                << \"\\n--------------\");\n            Configurations c;\n            c.parseFromText(ss.str());\n            logger->configure(c);\n        };  // NOLINT\n        while (gcfStream.good()) {\n           std::getline(gcfStream, line);\n           ELPP_INTERNAL_INFO(1, \"Parsing line: \" << line);\n           base::utils::Str::trim(line);\n           if (Configurations::Parser::isComment(line)) continue;\n           Configurations::Parser::ignoreComments(&line);\n           base::utils::Str::trim(line);\n           if (line.size() > 2 && base::utils::Str::startsWith(line, base::consts::kConfigurationLoggerId)) {\n               if (!ss.str().empty() && logger != nullptr) {\n                   configure();\n               }\n               ss.str(\"\");\n               line = line.substr(2);\n               base::utils::Str::trim(line);\n               if (line.size() > 1) {\n                   ELPP_INTERNAL_INFO(1, \"Getting logger: '\" << line << \"'\");\n                   logger = getLogger(line);\n               }\n            } else {\n               ss << line << \"\\n\";\n            }\n        }\n        if (!ss.str().empty() && logger != nullptr) {\n            configure();\n        }\n    }\n    /// @brief Configures loggers using command line arg. Ensure you have already set command line args, \n    /// @return False if invalid argument or argument with no value provided, true if attempted to configure logger.\n    ///         If true is returned that does not mean it has been configured successfully, it only means that it\n    ///         has attempeted to configure logger using configuration file provided in argument\n    static inline bool configureFromArg(const char* argKey) {\n#if defined(_ELPP_DISABLE_CONFIGURATION_FROM_PROGRAM_ARGS)\n        _ELPP_UNUSED(argKey);\n#else\n        if (!Helpers::commandLineArgs()->hasParamWithValue(argKey)) {\n            return false;\n        }\n        configureFromGlobal(Helpers::commandLineArgs()->getParamValue(argKey));\n#endif  // defined(_ELPP_DISABLE_CONFIGURATION_FROM_PROGRAM_ARGS)\n        return true;\n    }\n    /// @brief Flushes all loggers for all levels - Be careful if you dont know how many loggers are registered\n    static inline void flushAll(void) {\n        ELPP->registeredLoggers()->flushAll();\n    }\n    /// @brief Adds logging flag used internally.\n    static inline void addFlag(LoggingFlag flag) {\n        ELPP->addFlag(flag);\n    }\n    /// @brief Removes logging flag used internally.\n    static inline void removeFlag(LoggingFlag flag) {\n        ELPP->removeFlag(flag);\n    }\n    /// @brief Determines whether or not certain flag is active\n    static inline bool hasFlag(LoggingFlag flag) {\n        return ELPP->hasFlag(flag);\n    }\n    /// @brief Adds flag and removes it when scope goes out\n    class ScopedAddFlag {\n    public:\n        ScopedAddFlag(LoggingFlag flag) : m_flag(flag) { Loggers::addFlag(m_flag); }\n        ~ScopedAddFlag(void) { Loggers::removeFlag(m_flag); }\n    private:\n        LoggingFlag m_flag;\n    };\n    /// @brief Removes flag and add it when scope goes out\n    class ScopedRemoveFlag {\n    public:\n        ScopedRemoveFlag(LoggingFlag flag) : m_flag(flag) { Loggers::removeFlag(m_flag); }\n        ~ScopedRemoveFlag(void) { Loggers::addFlag(m_flag); }\n    private:\n        LoggingFlag m_flag;\n    };\n    /// @brief Sets hierarchy for logging. Needs to enable logging flag (HierarchicalLogging)\n    static inline void setLoggingLevel(Level level) {\n        ELPP->setLoggingLevel(level);\n    }\n};\nclass VersionInfo : base::StaticClass {\npublic:\n   /// @brief Current version number\n    static inline const std::string version(void) { return std::string(\"9.73\"); }\n   /// @brief Release date of current version\n    static inline const std::string releaseDate(void) { return std::string(\"18-06-2014 0825hrs\"); }\n};\n}  // namespace el\n#undef VLOG_IS_ON\n/// @brief Determines whether verbose logging is on for specified level current file.\n#define VLOG_IS_ON(verboseLevel) (ELPP->vRegistry()->allowed(verboseLevel, __FILE__))\n#undef TIMED_BLOCK\n#undef TIMED_SCOPE\n#undef TIMED_FUNC\n#undef _ELPP_MIN_UNIT\n#if defined(_ELPP_PERFORMANCE_MICROSECONDS)\n#   define _ELPP_MIN_UNIT el::base::TimestampUnit::Microsecond\n#else\n#   define _ELPP_MIN_UNIT el::base::TimestampUnit::Millisecond\n#endif  // (defined(_ELPP_PERFORMANCE_MICROSECONDS))\n/// @brief Performance tracked scope. Performance gets written when goes out of scope using\n///        'performance' logger.\n///\n/// @detail Please note in order to check the performance at a certain time you can use obj.checkpoint();\n/// @see el::base::PerformanceTracker\n/// @see el::base::PerformanceTracker::checkpoint\n// Note: Do not surround this definition with null macro because of obj instance\n#define TIMED_SCOPE(obj, blockname) el::base::PerformanceTracker obj(blockname, _ELPP_MIN_UNIT)\n#define TIMED_BLOCK(obj, blockName) for (struct { int i; el::base::PerformanceTracker timer; } obj = { 0, \\\n    el::base::PerformanceTracker(blockName, _ELPP_MIN_UNIT) }; obj.i < 1; ++obj.i)\n/// @brief Performance tracked function. Performance gets written when goes out of scope using\n///        'performance' logger.\n///\n/// @detail Please note in order to check the performance at a certain time you can use obj.checkpoint();\n/// @see el::base::PerformanceTracker\n/// @see el::base::PerformanceTracker::checkpoint\n#define TIMED_FUNC(obj) TIMED_SCOPE(obj, _ELPP_FUNC)\n#undef PERFORMANCE_CHECKPOINT\n#undef PERFORMANCE_CHECKPOINT_WITH_ID\n#define PERFORMANCE_CHECKPOINT(obj) obj.checkpoint(std::string(), __FILE__, __LINE__, _ELPP_FUNC)\n#define PERFORMANCE_CHECKPOINT_WITH_ID(obj, id) obj.checkpoint(id, __FILE__, __LINE__, _ELPP_FUNC)\n#undef ELPP_COUNTER\n#undef ELPP_COUNTER_POS\n/// @brief Gets hit counter for file/line\n#define ELPP_COUNTER (ELPP->hitCounters()->getCounter(__FILE__, __LINE__))\n/// @brief Gets hit counter position for file/line, -1 if not registered yet\n#define ELPP_COUNTER_POS (ELPP_COUNTER == nullptr ? -1 : ELPP_COUNTER->hitCounts())\n// Undef levels to support LOG(LEVEL)\n#undef INFO\n#undef WARNING\n#undef DEBUG\n#undef ERROR\n#undef FATAL\n#undef TRACE\n#undef VERBOSE\n// Undef existing\n#undef CINFO\n#undef CWARNING\n#undef CDEBUG\n#undef CFATAL\n#undef CERROR\n#undef CTRACE\n#undef CVERBOSE\n#undef CINFO_IF\n#undef CWARNING_IF\n#undef CDEBUG_IF\n#undef CERROR_IF\n#undef CFATAL_IF\n#undef CTRACE_IF\n#undef CVERBOSE_IF\n#undef CINFO_EVERY_N\n#undef CWARNING_EVERY_N\n#undef CDEBUG_EVERY_N\n#undef CERROR_EVERY_N\n#undef CFATAL_EVERY_N\n#undef CTRACE_EVERY_N\n#undef CVERBOSE_EVERY_N\n#undef CINFO_AFTER_N\n#undef CWARNING_AFTER_N\n#undef CDEBUG_AFTER_N\n#undef CERROR_AFTER_N\n#undef CFATAL_AFTER_N\n#undef CTRACE_AFTER_N\n#undef CVERBOSE_AFTER_N\n#undef CINFO_N_TIMES\n#undef CWARNING_N_TIMES\n#undef CDEBUG_N_TIMES\n#undef CERROR_N_TIMES\n#undef CFATAL_N_TIMES\n#undef CTRACE_N_TIMES\n#undef CVERBOSE_N_TIMES\n// Normal logs\n#if _ELPP_INFO_LOG\n#   define CINFO(writer, dispatchAction, ...) _ELPP_WRITE_LOG(writer, el::Level::Info, dispatchAction, __VA_ARGS__)\n#else\n#   define CINFO(writer, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_INFO_LOG\n#if _ELPP_WARNING_LOG\n#   define CWARNING(writer, dispatchAction, ...) _ELPP_WRITE_LOG(writer, el::Level::Warning, dispatchAction, __VA_ARGS__)\n#else\n#   define CWARNING(writer, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_WARNING_LOG\n#if _ELPP_DEBUG_LOG\n#   define CDEBUG(writer, dispatchAction, ...) _ELPP_WRITE_LOG(writer, el::Level::Debug, dispatchAction, __VA_ARGS__)\n#else\n#   define CDEBUG(writer, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_DEBUG_LOG\n#if _ELPP_ERROR_LOG\n#   define CERROR(writer, dispatchAction, ...) _ELPP_WRITE_LOG(writer, el::Level::Error, dispatchAction, __VA_ARGS__)\n#else\n#   define CERROR(writer, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_ERROR_LOG\n#if _ELPP_FATAL_LOG\n#   define CFATAL(writer, dispatchAction, ...) _ELPP_WRITE_LOG(writer, el::Level::Fatal, dispatchAction, __VA_ARGS__)\n#else\n#   define CFATAL(writer, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_FATAL_LOG\n#if _ELPP_TRACE_LOG\n#   define CTRACE(writer, dispatchAction, ...) _ELPP_WRITE_LOG(writer, el::Level::Trace, dispatchAction, __VA_ARGS__)\n#else\n#   define CTRACE(writer, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_TRACE_LOG\n#if _ELPP_VERBOSE_LOG\n#   define CVERBOSE(writer, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel)) writer(\\\n       el::Level::Verbose, __FILE__, __LINE__, _ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)\n#else\n#   define CVERBOSE(writer, vlevel, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_VERBOSE_LOG\n// Conditional logs\n#if _ELPP_INFO_LOG\n#   define CINFO_IF(writer, condition_, dispatchAction, ...) \\\n        _ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Info, dispatchAction, __VA_ARGS__)\n#else\n#   define CINFO_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_INFO_LOG\n#if _ELPP_WARNING_LOG\n#   define CWARNING_IF(writer, condition_, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Warning, dispatchAction, __VA_ARGS__)\n#else\n#   define CWARNING_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_WARNING_LOG\n#if _ELPP_DEBUG_LOG\n#   define CDEBUG_IF(writer, condition_, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Debug, dispatchAction, __VA_ARGS__)\n#else\n#   define CDEBUG_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_DEBUG_LOG\n#if _ELPP_ERROR_LOG\n#   define CERROR_IF(writer, condition_, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Error, dispatchAction, __VA_ARGS__)\n#else\n#   define CERROR_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_ERROR_LOG\n#if _ELPP_FATAL_LOG\n#   define CFATAL_IF(writer, condition_, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Fatal, dispatchAction, __VA_ARGS__)\n#else\n#   define CFATAL_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_FATAL_LOG\n#if _ELPP_TRACE_LOG\n#   define CTRACE_IF(writer, condition_, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Trace, dispatchAction, __VA_ARGS__)\n#else\n#   define CTRACE_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_TRACE_LOG\n#if _ELPP_VERBOSE_LOG\n#   define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel) && (condition_)) writer( \\\n       el::Level::Verbose, __FILE__, __LINE__, _ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)\n#else\n#   define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_VERBOSE_LOG\n// Occasional logs\n#if _ELPP_INFO_LOG\n#   define CINFO_EVERY_N(writer, occasion, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Info, dispatchAction, __VA_ARGS__)\n#else\n#   define CINFO_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_INFO_LOG\n#if _ELPP_WARNING_LOG\n#   define CWARNING_EVERY_N(writer, occasion, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Warning, dispatchAction, __VA_ARGS__)\n#else\n#   define CWARNING_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_WARNING_LOG\n#if _ELPP_DEBUG_LOG\n#   define CDEBUG_EVERY_N(writer, occasion, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Debug, dispatchAction, __VA_ARGS__)\n#else\n#   define CDEBUG_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_DEBUG_LOG\n#if _ELPP_ERROR_LOG\n#   define CERROR_EVERY_N(writer, occasion, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Error, dispatchAction, __VA_ARGS__)\n#else\n#   define CERROR_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_ERROR_LOG\n#if _ELPP_FATAL_LOG\n#   define CFATAL_EVERY_N(writer, occasion, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Fatal, dispatchAction, __VA_ARGS__)\n#else\n#   define CFATAL_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_FATAL_LOG\n#if _ELPP_TRACE_LOG\n#   define CTRACE_EVERY_N(writer, occasion, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Trace, dispatchAction, __VA_ARGS__)\n#else\n#   define CTRACE_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_TRACE_LOG\n#if _ELPP_VERBOSE_LOG\n#   define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, ...)\\\n        CVERBOSE_IF(writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion), vlevel, dispatchAction, __VA_ARGS__)\n#else\n#   define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_VERBOSE_LOG\n// After N logs\n#if _ELPP_INFO_LOG\n#   define CINFO_AFTER_N(writer, n, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Info, dispatchAction, __VA_ARGS__)\n#else\n#   define CINFO_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_INFO_LOG\n#if _ELPP_WARNING_LOG\n#   define CWARNING_AFTER_N(writer, n, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Warning, dispatchAction, __VA_ARGS__)\n#else\n#   define CWARNING_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_WARNING_LOG\n#if _ELPP_DEBUG_LOG\n#   define CDEBUG_AFTER_N(writer, n, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Debug, dispatchAction, __VA_ARGS__)\n#else\n#   define CDEBUG_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_DEBUG_LOG\n#if _ELPP_ERROR_LOG\n#   define CERROR_AFTER_N(writer, n, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Error, dispatchAction, __VA_ARGS__)\n#else\n#   define CERROR_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_ERROR_LOG\n#if _ELPP_FATAL_LOG\n#   define CFATAL_AFTER_N(writer, n, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Fatal, dispatchAction, __VA_ARGS__)\n#else\n#   define CFATAL_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_FATAL_LOG\n#if _ELPP_TRACE_LOG\n#   define CTRACE_AFTER_N(writer, n, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Trace, dispatchAction, __VA_ARGS__)\n#else\n#   define CTRACE_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_TRACE_LOG\n#if _ELPP_VERBOSE_LOG\n#   define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, ...)\\\n        CVERBOSE_IF(writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)\n#else\n#   define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_VERBOSE_LOG\n// N Times logs\n#if _ELPP_INFO_LOG\n#   define CINFO_N_TIMES(writer, n, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Info, dispatchAction, __VA_ARGS__)\n#else\n#   define CINFO_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_INFO_LOG\n#if _ELPP_WARNING_LOG\n#   define CWARNING_N_TIMES(writer, n, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Warning, dispatchAction, __VA_ARGS__)\n#else\n#   define CWARNING_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_WARNING_LOG\n#if _ELPP_DEBUG_LOG\n#   define CDEBUG_N_TIMES(writer, n, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Debug, dispatchAction, __VA_ARGS__)\n#else\n#   define CDEBUG_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_DEBUG_LOG\n#if _ELPP_ERROR_LOG\n#   define CERROR_N_TIMES(writer, n, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Error, dispatchAction, __VA_ARGS__)\n#else\n#   define CERROR_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_ERROR_LOG\n#if _ELPP_FATAL_LOG\n#   define CFATAL_N_TIMES(writer, n, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Fatal, dispatchAction, __VA_ARGS__)\n#else\n#   define CFATAL_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_FATAL_LOG\n#if _ELPP_TRACE_LOG\n#   define CTRACE_N_TIMES(writer, n, dispatchAction, ...)\\\n        _ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Trace, dispatchAction, __VA_ARGS__)\n#else\n#   define CTRACE_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_TRACE_LOG\n#if _ELPP_VERBOSE_LOG\n#   define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, ...)\\\n        CVERBOSE_IF(writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)\n#else\n#   define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, ...) el::base::NullWriter()\n#endif  // _ELPP_VERBOSE_LOG\n//\n// Custom Loggers - Requires (level, dispatchAction, loggerId/s)\n//\n// undef existing\n#undef CLOG\n#undef CLOG_VERBOSE\n#undef CVLOG\n#undef CLOG_IF\n#undef CLOG_VERBOSE_IF\n#undef CVLOG_IF\n#undef CLOG_EVERY_N\n#undef CVLOG_EVERY_N\n#undef CLOG_AFTER_N\n#undef CVLOG_AFTER_N\n#undef CLOG_N_TIMES\n#undef CVLOG_N_TIMES\n// Normal logs\n#define CLOG(LEVEL, ...)\\\n    C##LEVEL(el::base::Writer, el::base::DispatchAction::NormalLog, __VA_ARGS__)\n#define CVLOG(vlevel, ...) CVERBOSE(el::base::Writer, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)\n// Conditional logs\n#define CLOG_IF(condition, LEVEL, ...)\\\n    C##LEVEL##_IF(el::base::Writer, condition, el::base::DispatchAction::NormalLog, __VA_ARGS__)\n#define CVLOG_IF(condition, vlevel, ...)\\\n    CVERBOSE_IF(el::base::Writer, condition, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)\n// Hit counts based logs\n#define CLOG_EVERY_N(n, LEVEL, ...)\\\n    C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::NormalLog, __VA_ARGS__)\n#define CVLOG_EVERY_N(n, vlevel, ...)\\\n    CVERBOSE_EVERY_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)\n#define CLOG_AFTER_N(n, LEVEL, ...)\\\n    C##LEVEL##_AFTER_N(el::base::Writer, n, el::base::DispatchAction::NormalLog, __VA_ARGS__)\n#define CVLOG_AFTER_N(n, vlevel, ...)\\\n    CVERBOSE_AFTER_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)\n#define CLOG_N_TIMES(n, LEVEL, ...)\\\n    C##LEVEL##_N_TIMES(el::base::Writer, n, el::base::DispatchAction::NormalLog, __VA_ARGS__)\n#define CVLOG_N_TIMES(n, vlevel, ...)\\\n    CVERBOSE_N_TIMES(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)\n//\n// Default Loggers macro using CLOG(), CLOG_VERBOSE() and CVLOG() macros\n//\n// undef existing\n#undef LOG\n#undef VLOG\n#undef LOG_IF\n#undef VLOG_IF\n#undef LOG_EVERY_N\n#undef VLOG_EVERY_N\n#undef LOG_AFTER_N\n#undef VLOG_AFTER_N\n#undef LOG_N_TIMES\n#undef VLOG_N_TIMES\n#undef _CURRENT_FILE_LOGGER_ID\n#if defined(_LOGGER)\n#   define _CURRENT_FILE_LOGGER_ID _LOGGER\n#else\n#   define _CURRENT_FILE_LOGGER_ID el::base::consts::kDefaultLoggerId\n#endif\n#undef _TRACE\n#define _TRACE CLOG(TRACE, _CURRENT_FILE_LOGGER_ID)\n// Normal logs\n#define LOG(LEVEL) CLOG(LEVEL, _CURRENT_FILE_LOGGER_ID)\n#define VLOG(vlevel) CVLOG(vlevel, _CURRENT_FILE_LOGGER_ID)\n// Conditional logs\n#define LOG_IF(condition, LEVEL) CLOG_IF(condition, LEVEL, _CURRENT_FILE_LOGGER_ID)\n#define VLOG_IF(condition, vlevel) CVLOG_IF(condition, vlevel, _CURRENT_FILE_LOGGER_ID)\n// Hit counts based logs\n#define LOG_EVERY_N(n, LEVEL) CLOG_EVERY_N(n, LEVEL, _CURRENT_FILE_LOGGER_ID)\n#define VLOG_EVERY_N(n, vlevel) CVLOG_EVERY_N(n, vlevel, _CURRENT_FILE_LOGGER_ID)\n#define LOG_AFTER_N(n, LEVEL) CLOG_AFTER_N(n, LEVEL, _CURRENT_FILE_LOGGER_ID)\n#define VLOG_AFTER_N(n, vlevel) CVLOG_AFTER_N(n, vlevel, _CURRENT_FILE_LOGGER_ID)\n#define LOG_N_TIMES(n, LEVEL) CLOG_N_TIMES(n, LEVEL, _CURRENT_FILE_LOGGER_ID)\n#define VLOG_N_TIMES(n, vlevel) CVLOG_N_TIMES(n, vlevel, _CURRENT_FILE_LOGGER_ID)\n// Generic PLOG()\n#undef CPLOG\n#undef CPLOG_IF\n#undef PLOG\n#undef PLOG_IF\n#undef DCPLOG\n#undef DCPLOG_IF\n#undef DPLOG\n#undef DPLOG_IF\n#define CPLOG(LEVEL, ...)\\\n    C##LEVEL(el::base::PErrorWriter, el::base::DispatchAction::NormalLog, __VA_ARGS__)\n#define CPLOG_IF(condition, LEVEL, ...)\\\n    C##LEVEL##_IF(el::base::PErrorWriter, condition, el::base::DispatchAction::NormalLog, __VA_ARGS__)\n#define DCPLOG(LEVEL, ...)\\\n    if (_ELPP_DEBUG_LOG) C##LEVEL(el::base::PErrorWriter, el::base::DispatchAction::NormalLog, __VA_ARGS__)\n#define DCPLOG_IF(condition, LEVEL, ...)\\\n    C##LEVEL##_IF(el::base::PErrorWriter, (_ELPP_DEBUG_LOG) && (condition), el::base::DispatchAction::NormalLog, __VA_ARGS__)\n#define PLOG(LEVEL) CPLOG(LEVEL, _CURRENT_FILE_LOGGER_ID)\n#define PLOG_IF(condition, LEVEL) CPLOG_IF(condition, LEVEL, _CURRENT_FILE_LOGGER_ID)\n#define DPLOG(LEVEL) DCPLOG(LEVEL, _CURRENT_FILE_LOGGER_ID)\n#define DPLOG_IF(condition, LEVEL) DCPLOG_IF(condition, LEVEL, _CURRENT_FILE_LOGGER_ID)\n// Generic SYSLOG()\n#undef CSYSLOG\n#undef CSYSLOG_IF\n#undef CSYSLOG_EVERY_N\n#undef CSYSLOG_AFTER_N\n#undef CSYSLOG_N_TIMES\n#undef SYSLOG\n#undef SYSLOG_IF\n#undef SYSLOG_EVERY_N\n#undef SYSLOG_AFTER_N\n#undef SYSLOG_N_TIMES\n#undef DCSYSLOG\n#undef DCSYSLOG_IF\n#undef DCSYSLOG_EVERY_N\n#undef DCSYSLOG_AFTER_N\n#undef DCSYSLOG_N_TIMES\n#undef DSYSLOG\n#undef DSYSLOG_IF\n#undef DSYSLOG_EVERY_N\n#undef DSYSLOG_AFTER_N\n#undef DSYSLOG_N_TIMES\n#if defined(_ELPP_SYSLOG)\n#   define CSYSLOG(LEVEL, ...)\\\n        C##LEVEL(el::base::Writer, el::base::DispatchAction::SysLog, __VA_ARGS__)\n#   define CSYSLOG_IF(condition, LEVEL, ...)\\\n        C##LEVEL##_IF(el::base::Writer, condition, el::base::DispatchAction::SysLog, __VA_ARGS__)\n#   define CSYSLOG_EVERY_N(n, LEVEL, ...) C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)\n#   define CSYSLOG_AFTER_N(n, LEVEL, ...) C##LEVEL##_AFTER_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)\n#   define CSYSLOG_N_TIMES(n, LEVEL, ...) C##LEVEL##_N_TIMES(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)\n#   define SYSLOG(LEVEL) CSYSLOG(LEVEL, el::base::consts::kSysLogLoggerId)\n#   define SYSLOG_IF(condition, LEVEL) CSYSLOG_IF(condition, LEVEL, el::base::consts::kSysLogLoggerId)\n#   define SYSLOG_EVERY_N(n, LEVEL) CSYSLOG_EVERY_N(n, LEVEL, el::base::consts::kSysLogLoggerId)\n#   define SYSLOG_AFTER_N(n, LEVEL) CSYSLOG_AFTER_N(n, LEVEL, el::base::consts::kSysLogLoggerId)\n#   define SYSLOG_N_TIMES(n, LEVEL) CSYSLOG_N_TIMES(n, LEVEL, el::base::consts::kSysLogLoggerId)\n#   define DCSYSLOG(LEVEL, ...) if (_ELPP_DEBUG_LOG) C##LEVEL(el::base::Writer, el::base::DispatchAction::SysLog, __VA_ARGS__)\n#   define DCSYSLOG_IF(condition, LEVEL, ...)\\\n        C##LEVEL##_IF(el::base::Writer, (_ELPP_DEBUG_LOG) && (condition), el::base::DispatchAction::SysLog, __VA_ARGS__)\n#   define DCSYSLOG_EVERY_N(n, LEVEL, ...)\\\n        if (_ELPP_DEBUG_LOG) C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)\n#   define DCSYSLOG_AFTER_N(n, LEVEL, ...)\\\n        if (_ELPP_DEBUG_LOG) C##LEVEL##_AFTER_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)\n#   define DCSYSLOG_N_TIMES(n, LEVEL, ...)\\\n        if (_ELPP_DEBUG_LOG) C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)\n#   define DSYSLOG(LEVEL) DCSYSLOG(LEVEL, el::base::consts::kSysLogLoggerId)\n#   define DSYSLOG_IF(condition, LEVEL) DCSYSLOG_IF(condition, LEVEL, el::base::consts::kSysLogLoggerId)\n#   define DSYSLOG_EVERY_N(n, LEVEL) DCSYSLOG_EVERY_N(n, LEVEL, el::base::consts::kSysLogLoggerId)\n#   define DSYSLOG_AFTER_N(n, LEVEL) DCSYSLOG_AFTER_N(n, LEVEL, el::base::consts::kSysLogLoggerId)\n#   define DSYSLOG_N_TIMES(n, LEVEL) DCSYSLOG_N_TIMES(n, LEVEL, el::base::consts::kSysLogLoggerId)\n#else\n#   define CSYSLOG(LEVEL, ...) el::base::NullWriter()\n#   define CSYSLOG_IF(condition, LEVEL, ...) el::base::NullWriter()\n#   define CSYSLOG_EVERY_N(n, LEVEL, ...) el::base::NullWriter()\n#   define CSYSLOG_AFTER_N(n, LEVEL, ...) el::base::NullWriter()\n#   define CSYSLOG_N_TIMES(n, LEVEL, ...) el::base::NullWriter()\n#   define SYSLOG(LEVEL) el::base::NullWriter()\n#   define SYSLOG_IF(condition, LEVEL) el::base::NullWriter()\n#   define SYSLOG_EVERY_N(n, LEVEL) el::base::NullWriter()\n#   define SYSLOG_AFTER_N(n, LEVEL) el::base::NullWriter()\n#   define SYSLOG_N_TIMES(n, LEVEL) el::base::NullWriter()\n#   define DCSYSLOG(LEVEL, ...) el::base::NullWriter()\n#   define DCSYSLOG_IF(condition, LEVEL, ...) el::base::NullWriter()\n#   define DCSYSLOG_EVERY_N(n, LEVEL, ...) el::base::NullWriter()\n#   define DCSYSLOG_AFTER_N(n, LEVEL, ...) el::base::NullWriter()\n#   define DCSYSLOG_N_TIMES(n, LEVEL, ...) el::base::NullWriter()\n#   define DSYSLOG(LEVEL) el::base::NullWriter()\n#   define DSYSLOG_IF(condition, LEVEL) el::base::NullWriter()\n#   define DSYSLOG_EVERY_N(n, LEVEL) el::base::NullWriter()\n#   define DSYSLOG_AFTER_N(n, LEVEL) el::base::NullWriter()\n#   define DSYSLOG_N_TIMES(n, LEVEL) el::base::NullWriter()\n#endif  // defined(_ELPP_SYSLOG)\n//\n// Custom Debug Only Loggers - Requires (level, loggerId/s)\n//\n// undef existing\n#undef DCLOG\n#undef DCVLOG\n#undef DCLOG_IF\n#undef DCVLOG_IF\n#undef DCLOG_EVERY_N\n#undef DCVLOG_EVERY_N\n#undef DCLOG_AFTER_N\n#undef DCVLOG_AFTER_N\n#undef DCLOG_N_TIMES\n#undef DCVLOG_N_TIMES\n// Normal logs\n#define DCLOG(LEVEL, ...) if (_ELPP_DEBUG_LOG) CLOG(LEVEL, __VA_ARGS__)\n#define DCLOG_VERBOSE(vlevel, ...) if (_ELPP_DEBUG_LOG) CLOG_VERBOSE(vlevel, __VA_ARGS__)\n#define DCVLOG(vlevel, ...) if (_ELPP_DEBUG_LOG) CVLOG(vlevel, __VA_ARGS__)\n// Conditional logs\n#define DCLOG_IF(condition, LEVEL, ...) if (_ELPP_DEBUG_LOG) CLOG_IF(condition, LEVEL, __VA_ARGS__)\n#define DCVLOG_IF(condition, vlevel, ...) if (_ELPP_DEBUG_LOG) CVLOG_IF(condition, vlevel, __VA_ARGS__)\n// Hit counts based logs\n#define DCLOG_EVERY_N(n, LEVEL, ...) if (_ELPP_DEBUG_LOG) CLOG_EVERY_N(n, LEVEL, __VA_ARGS__)\n#define DCVLOG_EVERY_N(n, vlevel, ...) if (_ELPP_DEBUG_LOG) CVLOG_EVERY_N(n, vlevel, __VA_ARGS__)\n#define DCLOG_AFTER_N(n, LEVEL, ...) if (_ELPP_DEBUG_LOG) CLOG_AFTER_N(n, LEVEL, __VA_ARGS__)\n#define DCVLOG_AFTER_N(n, vlevel, ...) if (_ELPP_DEBUG_LOG) CVLOG_AFTER_N(n, vlevel, __VA_ARGS__)\n#define DCLOG_N_TIMES(n, LEVEL, ...) if (_ELPP_DEBUG_LOG) CLOG_N_TIMES(n, LEVEL, __VA_ARGS__)\n#define DCVLOG_N_TIMES(n, vlevel, ...) if (_ELPP_DEBUG_LOG) CVLOG_N_TIMES(n, vlevel, __VA_ARGS__)\n//\n// Default Debug Only Loggers macro using CLOG(), CLOG_VERBOSE() and CVLOG() macros\n//\n// undef existing\n#undef DLOG\n#undef DVLOG\n#undef DLOG_IF\n#undef DVLOG_IF\n#undef DLOG_EVERY_N\n#undef DVLOG_EVERY_N\n#undef DLOG_AFTER_N\n#undef DVLOG_AFTER_N\n#undef DLOG_N_TIMES\n#undef DVLOG_N_TIMES\n// Normal logs\n#define DLOG(LEVEL) DCLOG(LEVEL, _CURRENT_FILE_LOGGER_ID)\n#define DVLOG(vlevel) DCVLOG(vlevel, _CURRENT_FILE_LOGGER_ID)\n// Conditional logs\n#define DLOG_IF(condition, LEVEL) DCLOG_IF(condition, LEVEL, _CURRENT_FILE_LOGGER_ID)\n#define DVLOG_IF(condition, vlevel) DCVLOG_IF(condition, vlevel, _CURRENT_FILE_LOGGER_ID)\n// Hit counts based logs\n#define DLOG_EVERY_N(n, LEVEL) DCLOG_EVERY_N(n, LEVEL, _CURRENT_FILE_LOGGER_ID)\n#define DVLOG_EVERY_N(n, vlevel) DCVLOG_EVERY_N(n, vlevel, _CURRENT_FILE_LOGGER_ID)\n#define DLOG_AFTER_N(n, LEVEL) DCLOG_AFTER_N(n, LEVEL, _CURRENT_FILE_LOGGER_ID)\n#define DVLOG_AFTER_N(n, vlevel) DCVLOG_AFTER_N(n, vlevel, _CURRENT_FILE_LOGGER_ID)\n#define DLOG_N_TIMES(n, LEVEL) DCLOG_N_TIMES(n, LEVEL, _CURRENT_FILE_LOGGER_ID)\n#define DVLOG_N_TIMES(n, vlevel) DCVLOG_N_TIMES(n, vlevel, _CURRENT_FILE_LOGGER_ID)\n// Check macros\n#undef CCHECK\n#undef CPCHECK\n#undef CCHECK_EQ\n#undef CCHECK_NE\n#undef CCHECK_LT\n#undef CCHECK_GT\n#undef CCHECK_LE\n#undef CCHECK_GE\n#undef CCHECK_NOTNULL\n#undef CCHECK_STRCASEEQ\n#undef CCHECK_STRCASENE\n#undef CHECK\n#undef PCHECK\n#undef CHECK_EQ\n#undef CHECK_NE\n#undef CHECK_LT\n#undef CHECK_GT\n#undef CHECK_LE\n#undef CHECK_GE\n#undef CHECK_NOTNULL\n#undef CHECK_STRCASEEQ\n#undef CHECK_STRCASENE\n#define CCHECK(condition, ...) CLOG_IF(!(condition), FATAL, __VA_ARGS__) << \"Check failed: [\" << #condition << \"] \"\n#define CPCHECK(condition, ...) CPLOG_IF(!(condition), FATAL, __VA_ARGS__) << \"Check failed: [\" << #condition << \"] \"\n#define CHECK(condition) CCHECK(condition, _CURRENT_FILE_LOGGER_ID)\n#define PCHECK(condition) CPCHECK(condition, _CURRENT_FILE_LOGGER_ID)\n#define CCHECK_EQ(a, b, ...) CCHECK(a == b, __VA_ARGS__)\n#define CCHECK_NE(a, b, ...) CCHECK(a != b, __VA_ARGS__)\n#define CCHECK_LT(a, b, ...) CCHECK(a < b, __VA_ARGS__)\n#define CCHECK_GT(a, b, ...) CCHECK(a > b, __VA_ARGS__)\n#define CCHECK_LE(a, b, ...) CCHECK(a <= b, __VA_ARGS__)\n#define CCHECK_GE(a, b, ...) CCHECK(a >= b, __VA_ARGS__)\n#define CHECK_EQ(a, b) CCHECK_EQ(a, b, _CURRENT_FILE_LOGGER_ID)\n#define CHECK_NE(a, b) CCHECK_NE(a, b, _CURRENT_FILE_LOGGER_ID)\n#define CHECK_LT(a, b) CCHECK_LT(a, b, _CURRENT_FILE_LOGGER_ID)\n#define CHECK_GT(a, b) CCHECK_GT(a, b, _CURRENT_FILE_LOGGER_ID)\n#define CHECK_LE(a, b) CCHECK_LE(a, b, _CURRENT_FILE_LOGGER_ID)\n#define CHECK_GE(a, b) CCHECK_GE(a, b, _CURRENT_FILE_LOGGER_ID)\nnamespace el {\nnamespace base {\nnamespace utils {\ntemplate <typename T>\nstatic T* checkNotNull(T* ptr, const char* name, const char* loggers, ...) {\n    CLOG_IF(ptr == nullptr, FATAL, loggers) << \"Check failed: [\" << name << \" != nullptr]\";\n    return ptr;\n}\n}  // namespace utils\n}  // namespace base\n}  // namespace el\n#define CCHECK_NOTNULL(ptr, ...) el::base::utils::checkNotNull(ptr, #ptr, __VA_ARGS__)\n#define CCHECK_STREQ(str1, str2, ...) CLOG_IF(!el::base::utils::Str::cStringEq(str1, str2), FATAL, __VA_ARGS__) \\\n                        << \"Check failed: [\" << #str1 << \" == \" << #str2 << \"] \"\n#define CCHECK_STRNE(str1, str2, ...) CLOG_IF(el::base::utils::Str::cStringEq(str1, str2), FATAL, __VA_ARGS__) \\\n                        << \"Check failed: [\" << #str1 << \" != \" << #str2 << \"] \"\n#define CCHECK_STRCASEEQ(str1, str2, ...) CLOG_IF(!el::base::utils::Str::cStringCaseEq(str1, str2), FATAL, __VA_ARGS__) \\\n                        << \"Check failed: [\" << #str1 << \" == \" << #str2 << \"] \"\n#define CCHECK_STRCASENE(str1, str2, ...) CLOG_IF(el::base::utils::Str::cStringCaseEq(str1, str2), FATAL, __VA_ARGS__) \\\n                        << \"Check failed: [\" << #str1 << \" != \" << #str2 << \"] \"\n#define CHECK_NOTNULL(ptr) CCHECK_NOTNULL(ptr, _CURRENT_FILE_LOGGER_ID)\n#define CHECK_STREQ(str1, str2) CCHECK_STREQ(str1, str2, _CURRENT_FILE_LOGGER_ID)\n#define CHECK_STRNE(str1, str2) CCHECK_STRNE(str1, str2, _CURRENT_FILE_LOGGER_ID)\n#define CHECK_STRCASEEQ(str1, str2) CCHECK_STRCASEEQ(str1, str2, _CURRENT_FILE_LOGGER_ID)\n#define CHECK_STRCASENE(str1, str2) CCHECK_STRCASENE(str1, str2, _CURRENT_FILE_LOGGER_ID)\n#undef DCCHECK\n#undef DCCHECK_EQ\n#undef DCCHECK_NE\n#undef DCCHECK_LT\n#undef DCCHECK_GT\n#undef DCCHECK_LE\n#undef DCCHECK_GE\n#undef DCCHECK_NOTNULL\n#undef DCCHECK_STRCASEEQ\n#undef DCCHECK_STRCASENE\n#undef DCPCHECK\n#undef DCHECK\n#undef DCHECK_EQ\n#undef DCHECK_NE\n#undef DCHECK_LT\n#undef DCHECK_GT\n#undef DCHECK_LE\n#undef DCHECK_GE\n#undef DCHECK_NOTNULL\n#undef DCHECK_STRCASEEQ\n#undef DCHECK_STRCASENE\n#undef DPCHECK\n#define DCCHECK(condition, ...) if (_ELPP_DEBUG_LOG) CCHECK(condition, __VA_ARGS__)\n#define DCCHECK_EQ(a, b, ...) if (_ELPP_DEBUG_LOG) CCHECK_EQ(a, b, __VA_ARGS__)\n#define DCCHECK_NE(a, b, ...) if (_ELPP_DEBUG_LOG) CCHECK_NE(a, b, __VA_ARGS__)\n#define DCCHECK_LT(a, b, ...) if (_ELPP_DEBUG_LOG) CCHECK_LT(a, b, __VA_ARGS__)\n#define DCCHECK_GT(a, b, ...) if (_ELPP_DEBUG_LOG) CCHECK_GT(a, b, __VA_ARGS__)\n#define DCCHECK_LE(a, b, ...) if (_ELPP_DEBUG_LOG) CCHECK_LE(a, b, __VA_ARGS__)\n#define DCCHECK_GE(a, b, ...) if (_ELPP_DEBUG_LOG) CCHECK_GE(a, b, __VA_ARGS__)\n#define DCCHECK_NOTNULL(ptr, ...) if (_ELPP_DEBUG_LOG) CCHECK_NOTNULL(ptr, __VA_ARGS__)\n#define DCCHECK_STREQ(str1, str2, ...) if (_ELPP_DEBUG_LOG) CCHECK_STREQ(str1, str2, __VA_ARGS__)\n#define DCCHECK_STRNE(str1, str2, ...) if (_ELPP_DEBUG_LOG) CCHECK_STRNE(str1, str2, __VA_ARGS__)\n#define DCCHECK_STRCASEEQ(str1, str2, ...) if (_ELPP_DEBUG_LOG) CCHECK_STRCASEEQ(str1, str2, __VA_ARGS__)\n#define DCCHECK_STRCASENE(str1, str2, ...) if (_ELPP_DEBUG_LOG) CCHECK_STRCASENE(str1, str2, __VA_ARGS__)\n#define DCPCHECK(condition, ...) if (_ELPP_DEBUG_LOG) CPCHECK(condition, __VA_ARGS__)\n#define DCHECK(condition) DCCHECK(condition, _CURRENT_FILE_LOGGER_ID)\n#define DCHECK_EQ(a, b) DCCHECK_EQ(a, b, _CURRENT_FILE_LOGGER_ID)\n#define DCHECK_NE(a, b) DCCHECK_NE(a, b, _CURRENT_FILE_LOGGER_ID)\n#define DCHECK_LT(a, b) DCCHECK_LT(a, b, _CURRENT_FILE_LOGGER_ID)\n#define DCHECK_GT(a, b) DCCHECK_GT(a, b, _CURRENT_FILE_LOGGER_ID)\n#define DCHECK_LE(a, b) DCCHECK_LE(a, b, _CURRENT_FILE_LOGGER_ID)\n#define DCHECK_GE(a, b) DCCHECK_GE(a, b, _CURRENT_FILE_LOGGER_ID)\n#define DCHECK_NOTNULL(ptr) DCCHECK_NOTNULL(ptr, _CURRENT_FILE_LOGGER_ID)\n#define DCHECK_STREQ(str1, str2) DCCHECK_STREQ(str1, str2, _CURRENT_FILE_LOGGER_ID)\n#define DCHECK_STRNE(str1, str2) DCCHECK_STRNE(str1, str2, _CURRENT_FILE_LOGGER_ID)\n#define DCHECK_STRCASEEQ(str1, str2) DCCHECK_STRCASEEQ(str1, str2, _CURRENT_FILE_LOGGER_ID)\n#define DCHECK_STRCASENE(str1, str2) DCCHECK_STRCASENE(str1, str2, _CURRENT_FILE_LOGGER_ID)\n#define DPCHECK(condition) DCPCHECK(condition, _CURRENT_FILE_LOGGER_ID)\n#if defined(_ELPP_DISABLE_DEFAULT_CRASH_HANDLING)\n#   define _ELPP_USE_DEF_CRASH_HANDLER false\n#else\n#   define _ELPP_USE_DEF_CRASH_HANDLER true\n#endif  // defined(_ELPP_DISABLE_DEFAULT_CRASH_HANDLING)\n#define _ELPP_CRASH_HANDLER_INIT\n#define _ELPP_INIT_EASYLOGGINGPP(val)\\\n    _ELPP_INITI_BASIC_DECLR\\\n    namespace el {\\\n        namespace base {\\\n            el::base::type::StoragePointer elStorage(val);\\\n        }\\\n        el::base::debug::CrashHandler elCrashHandler(_ELPP_USE_DEF_CRASH_HANDLER);\\\n    }\n\n#define _INITIALIZE_EASYLOGGINGPP\\\n    _ELPP_INIT_EASYLOGGINGPP(new el::base::Storage(el::LogBuilderPtr(new el::base::DefaultLogBuilder())))\n#define _INITIALIZE_NULL_EASYLOGGINGPP\\\n    _ELPP_INITI_BASIC_DECLR\\\n    namespace el {\\\n        namespace base {\\\n            el::base::type::StoragePointer elStorage;\\\n        }\\\n        el::base::debug::CrashHandler elCrashHandler(_ELPP_USE_DEF_CRASH_HANDLER);\\\n    }\n// NOTE: no _ELPP_INITI_BASIC_DECLR when sharing - causes double free corruption on external symbols\n#define _SHARE_EASYLOGGINGPP(initializedStorage)\\\n    namespace el {\\\n        namespace base {\\\n            el::base::type::StoragePointer elStorage(initializedStorage);\\\n        }\\\n        el::base::debug::CrashHandler elCrashHandler(_ELPP_USE_DEF_CRASH_HANDLER);\\\n    }\n\n#if defined(_ELPP_UNICODE)\n#   define _START_EASYLOGGINGPP(argc, argv) el::Helpers::setArgs(argc, argv); std::locale::global(std::locale(\"\"))\n#else\n#   define _START_EASYLOGGINGPP(argc, argv) el::Helpers::setArgs(argc, argv)\n#endif  // defined(_ELPP_UNICODE)\n// For minimal backward compatibility\nnamespace easyloggingpp = el;\n#endif // EASYLOGGINGPP_H  // NOLINT\n"
  },
  {
    "path": "OptolithiumC/libs/eikonal/CMakeLists.txt",
    "content": "CMAKE_MINIMUM_REQUIRED(VERSION 2.8)\nCMAKE_POLICY(SET CMP0015 NEW)\n\nSET(CMAKE_USE_RELATIVE_PATHS ON)\nSET(CMAKE_SKIP_RPATH TRUE)\n\nINCLUDE_DIRECTORIES(\"${CMAKE_CURRENT_SOURCE_DIR}/include\")\n\nSET(CMAKE_BUILD_TYPE \"Release\")\n\nADD_LIBRARY( eikonal STATIC\n\t\"src/FMM_Core.c\"\n\t\"src/FMM_eikonal2d.c\"\n\t\"src/FMM_eikonal3d.c\"\n\t\"src/FMM_Heap.c\"\n)"
  },
  {
    "path": "OptolithiumC/libs/eikonal/include/FMM_API.h",
    "content": "/*\n * File:        FMM_API.h\n * Copyrights:  (c) 2005 The Trustees of Princeton University and Board of\n *                  Regents of the University of Texas.  All rights reserved.\n *              (c) 2009 Kevin T. Chu.  All rights reserved.\n * Revision:    $Revision: 149 $\n * Modified:    $Date: 2009-01-18 00:31:09 -0800 (Sun, 18 Jan 2009) $\n * Description: Header file for 2D and 3D Fast Marching Method Algorithms\n */\n \n#ifndef FMM_API_H_\n#define FMM_API_H_\n\n//#include \"FMM_Real.h\"\n\n\n/* Debugging macro */\n#ifndef LSMLIB_DEBUG_NO_INLINE\n/* #undef LSMLIB_DEBUG_NO_INLINE  */\n#endif\n\n/* Macro defined if double precision library is being built. */\n#ifndef LSMLIB_DOUBLE_PRECISION\n#define LSMLIB_DOUBLE_PRECISION 1\n#endif\n\n/* Floating-point precision for LSMLIB_REAL */\n#ifndef LSMLIB_REAL\n#define LSMLIB_REAL double\n#endif\n\n/* Zero tolerance */\n#ifndef LSMLIB_ZERO_TOL\n#define LSMLIB_ZERO_TOL 1.e-11\n#endif\n\n/* Maximum value for LSMLIB_REAL */\n#ifndef LSMLIB_REAL_MAX\n#define LSMLIB_REAL_MAX DBL_MAX\n#endif\n\n/* Minimum value for LSMLIB_REAL */\n#ifndef LSMLIB_REAL_MIN\n#define LSMLIB_REAL_MIN DBL_MIN\n#endif\n\n/* Machine epsilon value for LSMLIB_REAL */\n#ifndef LSMLIB_REAL_EPSILON\n#define LSMLIB_REAL_EPSILON DBL_EPSILON\n#endif\n\n\n\n/*============================= Constants ===========================*/\n#define LSM_FMM_TRUE                   (1)\n#define LSM_FMM_FALSE                  (0)\n#define LSM_FMM_DEFAULT_UPDATE_VALUE   (-1)\n\n\n/*========================== Error Codes ============================*/\n#define LSM_FMM_ERR_SUCCESS                                 (0)\n#define LSM_FMM_ERR_FMM_DATA_CREATION_ERROR                 (1)\n#define LSM_FMM_ERR_INVALID_SPATIAL_DISCRETIZATION_ORDER    (2)\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*! \\file FMM_API.h\n * \n * \\brief \n * @ref lsm_fast_marching_method.h provides support for basic fast \n * marching method calculations:  computing distance functions, \n * extensions of field variables (e.g. extension velocities, etc.) \n * off of the zero contour of a level set function, and solving the\n * Eikonal equation.\n *\n * The algorithm (and naming) closely follows the description in \n * \"Level Set Methods and Fast Marching Methods\" by J.A. Sethian\n * and \"The Fast Construction of Extension Velocities in Level Set\n * Methods\" by D. Adalsteinsson and J.A. Sethian (J. Comp. Phys, \n * vol 148, p 2-22, 1999).\n * \n * \n * <h3> NOTES </h3>\n * - The fast marching method library assumes that the field data\n *   are stored in Fortran order (i.e. column-major order).\n *\n * - Error Codes:  0 - successful computation,\n *                 1 - FMM_Data creation error,\n *                 2 - invalid spatial discretization order\n *\n * - While @ref lsm_fast_marching_method.h only provides functions \n *   for 2D and 3D FMM calculations, LSMLIB is capable of supporting higher \n *   dimensional calculations (currently as high as 8, set by \n *   FMM_HEAP_MAX_NDIM in @ref FMM_Heap.h).  To use LSMLIB to do \n *   higher dimensional fast marching method calculations, just modify \n *   lsm_FMM_field_extension*d.c and/or lsm_FMM_eikonal*d.c so that\n *   the data array sizes and index calculations are appropriate\n *   for the dimensionality of the problem of interest.\n *\n */\n\n\n/*!\n * computeExtensionFields2d uses the FMM algorithm to compute the \n * distance function and extension fields from the original level set\n * function, phi, and the specified source fields.  \n *\n * Arguments:\n *  - distance_function (out):            updated distance function\n *  - extension_fields (out):             extension fields\n *  - phi (in):                           original level set function\n *  - mask (in):                          mask for domain of problem;\n *                                        grid points outside of the domain\n *                                        of the problem should be set to a \n *                                        negative value.  \n *  - source_fields(in):                  source fields used to compute \n *                                        extension fields\n *  - num_extension_fields (in):          number of extension fields to compute\n *  - spatial_discretization_order (in):  order of finite differences used \n *                                        to compute spatial derivatives\n *  - grid_dims (in):                     array of index space extents for all \n *                                        fields \n *  - dx (in):                            array of grid cell sizes in each \n *                                        coordinate direction\n *\n * Return value:                          error code (see NOTES for translation)\n *\n *\n * NOTES:\n *  - When the second-order spatial discretization is requested, only\n *    the distance function is computed using the second-order scheme.\n *    The extension fields are computed using a first-order \n *    discretization of the gradient for the extension field and a \n *    second-order accurate discretization of the gradient for the \n *    distance function.  We use a first-order discretization when\n *    computing extension fields because the second-order \n *    discretization is \"unstable\" and leads to amplification of the\n *    errors introduced when initializing the extension fields in \n *    the region around the zero level set.\n *\n *  - The distance function computed when using a second-order spatial \n *    discretization are approximately second-order accurate in the \n *    L2 norm but are only first-order accurate in the L-infinity norm.  \n *    The reason for this behavior is that the current implementation \n *    uses only a first-order accurate scheme for initializing the grid \n *    points around the zero-level set.\n *\n *  - For grid points that are masked out, the distance function and\n *    extension fields are set to 0.\n *\n *  - It is assumed that the user has allocated the memory for the\n *    distance function, extension fields, phi, and source fields.\n *\n *  - It is assumed that the phi and mask data arrays are both of \n *    the same size.  That is, all data fields are assumed to have \n *    the same index space extents.\n *\n *  - If mask is set to a NULL pointer, then all grid points are treated\n *    as being in the interior of the domain.\n *\n *  - The number of extension fields is assumed to be equal to the\n *    number of source fields.\n *\n */\nint computeExtensionFields2d(\n  LSMLIB_REAL *distance_function,\n  LSMLIB_REAL **extension_fields,\n  LSMLIB_REAL *phi,\n  LSMLIB_REAL *mark,\n  LSMLIB_REAL **source_fields,\n  int num_extension_fields,\n  int spatial_discretization_order,\n  int *grid_dims,\n  LSMLIB_REAL *dx);\n\n/*!\n * computeDistanceFunction2d uses the FMM algorithm to compute the \n * a distance function from the original level set function, phi.\n *\n * Arguments:\n *  - distance_function (out):            updated distance function\n *  - phi (in):                           original level set function\n *  - mask (in):                          mask for domain of problem;\n *                                        grid points outside of the domain\n *                                        of the problem should be set to a \n *                                        negative value.\n *  - spatial_discretization_order (in):  order of finite differences used \n *                                        to compute spatial derivatives\n *  - grid_dims (in):                     array of index space extents for all \n *                                        fields \n *  - dx (in):                            array of grid cell sizes in each \n *                                        coordinate direction\n *\n * Return value:                          error code (see NOTES for translation)\n *\n *\n * NOTES:\n *  - The distance function computed when using a second-order spatial \n *    discretization are approximately second-order accurate in the \n *    L2 norm but are only first-order accurate in the L-infinity norm.  \n *    The reason for this behavior is that the current implementation \n *    uses only a first-order accurate scheme for initializing the grid \n *    points around the zero-level set.\n *\n *  - For grid points that are masked out, the distance function is\n *    set to 0.\n *\n *  - It is assumed that the user has allocated the memory for the\n *    distance function and phi fields.\n *\n *  - If mask is set to a NULL pointer, then all grid points are treated\n *    as being in the interior of the domain.\n *\n *  - It is assumed that the phi and mask data arrays are both of \n *    the same size.  That is, all data fields are assumed to have \n *    the same index space extents.\n *\n */\nint computeDistanceFunction2d(\n  LSMLIB_REAL *distance_function,\n  LSMLIB_REAL *phi,\n  LSMLIB_REAL *mark,\n  int spatial_discretization_order,\n  int *grid_dims,\n  LSMLIB_REAL *dx);\n\n/*!\n * solveEikonalEquation2d uses the FMM algorithm to solve the Eikonal\n * equation \n *\n *   |grad(phi)| = 1/speed(x,y)\n *\n * in two space dimensions with the specified boundary data and\n * speed function.  \n *\n * This function assumes that the solution phi is assumed to be \n * strictly non-negative with values in the interior of the domain \n * greater than the values on the boundaries.  For problems where \n * phi takes on negative values with interior values greater than \n * boundary values, this function can be used to solve for \n * psi = phi + C, where C is a constant offset that ensures that psi \n * is strictly non-negative.  For problems where interior values are \n * less than boundary values, this function can be used to solve for\n * psi = -phi.\n *\n *\n * Arguments:\n *  - phi (in/out):                       pointer to solution to Eikonal \n *                                        equation phi must be initialized as \n *                                        specified in the NOTES below. \n *  - speed (in):                         pointer to speed field\n *  - mask (in):                          mask for domain of problem;\n *                                        grid points outside of the domain\n *                                        of the problem should be set to a \n *                                        negative value.\n *  - spatial_discretization_order (in):  order of finite differences used \n *                                        to compute spatial derivatives\n *  - grid_dims (in):                     array of index space extents for all \n *                                        fields \n *  - dx (in):                            array of grid cell sizes in each \n *                                        coordinate direction\n *\n * Return value:                          error code (see NOTES for translation)\n *\n * \n * NOTES:\n *  - When using the second-order spatial discretization, the solution\n *    phi is second-order accurate in the L-infinity norm only if the \n *    \"boundary values\" of phi are specified in a layer of grid cells at \n *    least two deep near the mathematical/physical domain boundary.  \n *    Otherwise, the values of the solution near the boundary will only \n *    be first-order accurate.  Close to second-order convergence in the \n *    L2 norm is achieved using the second-order scheme even if only one \n *    layer of boundary values is specified.\n *\n *  - phi MUST be initialized so that the values for phi at grid points on \n *    or adjacent to the boundary of the domain for the Eikonal equation \n *    are correctly set.  All other grid points should be set to have\n *    negative values for phi.\n *\n *  - For grid points that are masked out or have speed equal to zero, phi \n *    is set to LSMLIB_REAL_MAX.\n *\n *  - It is assumed that the phi, speed, and mask data arrays are all of \n *    the same size.  That is, all data fields are assumed to have the \n *    same index space extents.\n *\n *  - Both phi and the speed function MUST be strictly non-negative.\n *\n *  - It is the user's responsibility to set the speed function.\n *\n *  - If mask is set to a NULL pointer, then all grid points are treated\n *    as being in the interior of the domain.\n *\n */\nint solveEikonalEquation2d(\n  LSMLIB_REAL *phi,\n  const LSMLIB_REAL *speed,\n  LSMLIB_REAL *mask,\n  const int spatial_discretization_order,\n  const int *grid_dims,\n  const LSMLIB_REAL *dx);\n\n/*!\n * computeExtensionFields3d uses the FMM algorithm to compute the \n * distance function and extension fields from the original level set\n * function, phi, and the specified source fields.  \n *\n * Arguments:\n *  - distance_function (out):            updated distance function\n *  - extension_fields (out):             extension fields\n *  - phi (in):                           original level set function\n *  - mask (in):                          mask for domain of problem;\n *                                        grid points outside of the domain\n *                                        of the problem should be set to a \n *                                        negative value.\n *  - source_fields(in):                  source fields used to compute \n *                                        extension fields\n *  - num_extension_fields (in):          number of extension fields to compute\n *  - spatial_discretization_order (in):  order of finite differences used \n *                                        to compute spatial derivatives\n *  - grid_dims (in):                     array of index space extents for all \n *                                        fields \n *  - dx (in):                            array of grid cell sizes in each \n *                                        coordinate direction\n *\n * Return value:                          error code (see NOTES for translation)\n *\n *\n * NOTES:\n *  - When the second-order spatial discretization is requested, only\n *    the distance function is computed using the second-order scheme.\n *    The extension fields are computed using a first-order \n *    discretization of the gradient for the extension field and a \n *    second-order accurate discretization of the gradient for the \n *    distance function.  We use a first-order discretization when\n *    computing extension fields because the second-order \n *    discretization is \"unstable\" and leads to amplification of the\n *    errors introduced when initializing the extension fields in \n *    the region around the zero level set.\n *\n * -  The distance function computed when using a second-order spatial \n *    discretization are approximately second-order accurate in the \n *    L2 norm but are only first-order accurate in the L-infinity norm.  \n *    The reason for this behavior is that the current implementation \n *    uses only a first-order accurate scheme for initializing the grid \n *    points around the zero-level set.\n *\n *  - For grid points that are masked out, the distance function and\n *    extension fields are set to 0.\n *\n *  - It is assumed that the user has allocated the memory for the\n *    distance function, extension fields, phi, and source fields.\n *\n *  - It is assumed that the phi and mask data arrays are both of \n *    the same size.  That is, all data fields are assumed to have \n *    the same index space extents.\n *\n *  - If mask is set to a NULL pointer, then all grid points are treated\n *    as being in the interior of the domain.\n *\n *  - The number of extension fields is assumed to be equal to the\n *    number of source fields.\n *\n */\nint computeExtensionFields3d(\n  LSMLIB_REAL *distance_function,\n  LSMLIB_REAL **extension_fields,\n  LSMLIB_REAL *phi,\n  LSMLIB_REAL *mask,\n  LSMLIB_REAL **source_fields,\n  int num_extension_fields,\n  int spatial_discretization_order,\n  int *grid_dims,\n  LSMLIB_REAL *dx);\n\n/*!\n * computeDistanceFunction3d uses the FMM algorithm to compute the \n * a distance function from the original level set function, phi.\n *\n * Arguments:\n *  - distance_function (out):            updated distance function\n *  - phi (in):                           original level set function\n *  - mask (in):                          mask for domain of problem;\n *                                        grid points outside of the domain\n *                                        of the problem should be set to a \n *                                        negative value.\n *  - spatial_discretization_order (in):  order of finite differences used \n *                                        to compute spatial derivatives\n *  - grid_dims (in):                     array of index space extents for all \n *                                        fields \n *  - dx (in):                            array of grid cell sizes in each \n *                                        coordinate direction\n *\n * Return value:                          error code (see NOTES for translation)\n *\n *\n * NOTES:\n *  - The distance function computed when using a second-order spatial \n *    discretization are approximately second-order accurate in the \n *    L2 norm but are only first-order accurate in the L-infinity norm.  \n *    The reason for this behavior is that the current implementation \n *    uses only a first-order accurate scheme for initializing the grid \n *    points around the zero-level set.\n *\n *  - For grid points that are masked out, the distance function is\n *    set to 0.\n *\n *  - It is assumed that the user has allocated the memory for the\n *    distance function and phi fields.\n *\n *  - If mask is set to a NULL pointer, then all grid points are treated\n *    as being in the interior of the domain.\n *\n *  - It is assumed that the phi and mask data arrays are both of \n *    the same size.  That is, all data fields are assumed to have \n *    the same index space extents.\n *\n */\nint computeDistanceFunction3d(\n  LSMLIB_REAL *distance_function,\n  LSMLIB_REAL *phi,\n  LSMLIB_REAL *mask,\n  int spatial_discretization_order,\n  int *grid_dims,\n  LSMLIB_REAL *dx);\n\n/*!\n * solveEikonalEquation3d uses the FMM algorithm to solve the Eikonal\n * equation \n *\n *   |grad(phi)| = 1/speed(x,y,z)\n *\n * in three space dimensions with the specified boundary data \n * and speed function. \n *\n * This function assumes that the solution phi is assumed to be \n * strictly non-negative with values in the interior of the domain \n * greater than the values on the boundaries.  For problems where \n * phi takes on negative values with interior values greater than \n * boundary values, this function can be used to solve for \n * psi = phi + C, where C is a constant offset that ensures that psi \n * is strictly non-negative.  For problems where interior values are \n * less than boundary values, this function can be used to solve for\n * psi = -phi.\n *\n *\n * Arguments:\n *  - phi (in/out):                       pointer to solution to Eikonal \n *                                        equation phi must be initialized as\n *                                        specified in the NOTES below. \n *  - speed (in):                         pointer to speed field\n *  - mask (in):                          mask for domain of problem;\n *                                        grid points outside of the domain\n *                                        of the problem should be set to a \n *                                        negative value.\n *  - spatial_discretization_order (in):  order of finite differences used \n *                                        to compute spatial derivatives\n *  - grid_dims (in):                     array of index space extents for all \n *                                        fields \n *  - dx (in):                            array of grid cell sizes in each \n *                                        coordinate direction\n *\n * Return value:                          error code (see NOTES for translation)\n *\n *\n * NOTES:\n *  - When using the second-order spatial discretization, the solution\n *    phi is second-order accurate in the L-infinity norm only if the \n *    \"boundary values\" of phi are specified in a layer of grid cells at \n *    least two deep near the mathematical/physical domain boundary.  \n *    Otherwise, the values of the solution near the boundary will only \n *    be first-order accurate.  Close to second-order convergence in the \n *    L2 norm is achieved using the second-order scheme even if only one \n *    layer of boundary values is specified.\n *\n *  - phi MUST be initialized so that the values for phi at grid points on \n *    or adjacent to the boundary of the domain for the Eikonal equation \n *    are correctly set.  All other grid points should be set to have\n *    negative values for phi.\n *\n *  - For grid points that are masked out or have speed equal to zero, phi \n *    is set to LSMLIB_REAL_MAX.\n *\n *  - It is assumed that the phi, speed, and mask data arrays are all of \n *    the same size.  That is, all data fields are assumed to have the \n *    same index space extents.\n *\n *  - Both phi and the speed function MUST be strictly non-negative.\n *\n *  - It is the user's responsibility to set the speed function.\n *\n *  - If mask is set to a NULL pointer, then all grid points are treated\n *    as being in the interior of the domain.\n *\n */\nint solveEikonalEquation3d(\n  LSMLIB_REAL *phi,\n  const LSMLIB_REAL *speed,\n  LSMLIB_REAL *mask,\n  const int spatial_discretization_order,\n  const int *grid_dims,\n  const LSMLIB_REAL *dx);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/eikonal/include/FMM_Config2d.h",
    "content": "/*\n * FMM_Config2d.h\n *\n *  Created on: Aug 16, 2014\n *      Author: batman\n */\n\n#ifndef FMM_CONFIG2D_H_\n#define FMM_CONFIG2D_H_\n\n\n/* Define required macros */\n#define FMM_NDIM                               2\n#define FMM_EIKONAL_SOLVE_EIKONAL_EQUATION     solveEikonalEquation2d\n#define FMM_EIKONAL_INITIALIZE_FRONT           FMM_initializeFront_Eikonal2d\n#define FMM_EIKONAL_UPDATE_GRID_POINT_ORDER1                              \\\n        FMM_updateGridPoint_Eikonal2d_Order1\n#define FMM_EIKONAL_UPDATE_GRID_POINT_ORDER2                              \\\n        FMM_updateGridPoint_Eikonal2d_Order2\n\n\n#endif /* FMM_CONFIG2D_H_ */\n"
  },
  {
    "path": "OptolithiumC/libs/eikonal/include/FMM_Config3d.h",
    "content": "/*\n * FMM_Config3d.h\n *\n *  Created on: Aug 16, 2014\n *      Author: batman\n */\n\n#ifndef FMM_CONFIG3D_H_\n#define FMM_CONFIG3D_H_\n\n\n/* Define required macros */\n#define FMM_NDIM                               3\n#define FMM_EIKONAL_SOLVE_EIKONAL_EQUATION     solveEikonalEquation3d\n#define FMM_EIKONAL_INITIALIZE_FRONT           FMM_initializeFront_Eikonal3d\n#define FMM_EIKONAL_UPDATE_GRID_POINT_ORDER1                              \\\n        FMM_updateGridPoint_Eikonal3d_Order1\n#define FMM_EIKONAL_UPDATE_GRID_POINT_ORDER2                              \\\n        FMM_updateGridPoint_Eikonal3d_Order2\n\n\n#endif /* FMM_CONFIG3D_H_ */\n"
  },
  {
    "path": "OptolithiumC/libs/eikonal/include/FMM_Core.h",
    "content": "/*\n * File:        FMM_Core.h\n * Copyrights:  (c) 2005 The Trustees of Princeton University and Board of\n *                  Regents of the University of Texas.  All rights reserved.\n *              (c) 2009 Kevin T. Chu.  All rights reserved.\n * Revision:    $Revision: 149 $\n * Modified:    $Date: 2009-01-18 00:31:09 -0800 (Sun, 18 Jan 2009) $\n * Description: Header file for core Fast Marching Method algorithm functions\n */\n\n#ifndef included_FMM_Core_h\n#define included_FMM_Core_h\n\n#include \"FMM_API.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*! \\file FMM_Core.h\n *\n * \\brief\n * @ref FMM_Core.h provides functionality for the numerics independent \n * aspects of the Fast Marching Method algorithm in two- and \n * three-dimensions.  \n *\n * Specific numerical calculations must be supplied by the user through \n * callback functions for detecting/initializing the front and updating \n * individual grid points.\n *\n * Dependencies:  @ref FMM_Heap.h and user-supplied callback routines\n *                                 \n * <h3> Usage: </h3>\n * \n * -# Provide implementations for the callback functions defined in \n *    @ref FMM_Callback_API.h.  \n * -# Create an FMM_CoreData structure using FMM_Core_createFMM_CoreData().\n * -# Initialize the front using FMM_Core_initializeFront().  \n * -# Mark grid points that are outside of the mathematical domain for \n *    the problem using the FMM_Core_markPointOutsideDomain() function.\n * -# Advance the front as far as desired using FMM_Core_advanceFront().\n *    Typically, the front is advanced until there are no more grid \n *    points to update.\n * -# Clean up the memory allocated for the FMM_CoreData using\n *    FMM_Core_destroyFMM_CoreData().\n *\n */\n\n\n/*================== FMM_Core Type Declarations ======================*/\n\n/*!\n * FMM_CoreData is a data structure that contains information about the \n * current state of a fast marching method calculation.\n */\ntypedef struct FMM_CoreData FMM_CoreData;\n\n/*!\n * FMM_FieldData is a user-defined data structure that contains the field \n * data for the fast marching method calculation (e.g. phi, distance \n * function, source fields, extension fields).\n */\ntypedef struct FMM_FieldData FMM_FieldData;\n\n/*!\n * PointStatus is an enumerated type that represents the status of a\n * grid point during the Fast Marching Method computation.\n */\ntypedef enum { KNOWN, TRIAL, FAR, OUTSIDE_DOMAIN } PointStatus;\n\n/*!\n * initializeFrontFuncPtr is a function pointer to one of the\n * callback functions defined in @ref FMM_Callback_API.h, which must be\n * defined in order to use the functions in @ref FMM_Core.h.\n */\ntypedef void (*initializeFrontFuncPtr)(\n  FMM_CoreData *fmm_core_data,\n  FMM_FieldData *fmm_field_data,\n  int num_dims,\n  int *grid_dims,\n  LSMLIB_REAL *dx);\n\n/*!\n * updateGridPointFuncPtr is a function pointer to one of the callback \n * functions defined in @ref FMM_Callback_API.h, which must be defined \n * in order to use the functions in @ref FMM_Core.h.\n */\ntypedef LSMLIB_REAL (*updateGridPointFuncPtr)(  \n  FMM_CoreData *fmm_core_data,\n  FMM_FieldData *fmm_field_data,\n  int *grid_idx,\n  int num_dims,\n  int *grid_dims,\n  LSMLIB_REAL *dx);\n\n\n/*================== FMM_Core Function Declarations ==================*/\n\n/*!\n * FMM_Core_createFMM_CoreData() allocates memory for an FMM_CoreData \n * structure and initializes it using the specified configuration information.\n *\n * Arguments:\n *  - fmm_field_data (in):          pointer to FMM_FieldData data structure\n *  - num_dims (in):                number of dimensions for FMM computation\n *  - grid_dims (in):               integer array of dimensions of computational\n *                                  grid\n *  - dx (in):                      LSMLIB_REAL array containing grid cell \n *                                  sizes in each of the coordinate directions\n *  - initializeFront (in):         callback function pointer that is \n *                                  used to find and initialize the front\n *                                  at the beginning of the FMM algorithm\n *                                  (see @ref FMM_Callback_API.h for more \n *                                  details)\n *  - updateGridPoint (in):         callback function pointer that is \n *                                  used to update individual grid points\n *                                  during the FMM algorithm\n *                                  (see @ref FMM_Callback_API.h for more \n *                                  details)\n *  - initial_front_mode (in):      integer indicating whether the values\n *                                  on the initial front are immutable or \n *                                  may be updated during the FMM computation.\n *\n * Return value:                    pointer to new FMM_CoreData structure\n *                                  containing the relevant information\n *                                  for an FMM calculation\n *\n * NOTES:\n *  - It is assumed that the user has allocated the memory and properly\n *    set up the FMM_FieldData.\n *\n *  - It is assumed that the grid_dims and dx arrays are at least \n *    num_dims in length.\n *\n *  - The updateGridPoint() and initializeFront() callback functions\n *    MUST follow the protocol described in @ref FMM_Callback_API.h.\n *\n */\nFMM_CoreData* FMM_Core_createFMM_CoreData(\n  FMM_FieldData *fmm_field_data,\n  const int num_dims,\n  const int *grid_dims,\n  const LSMLIB_REAL *dx,\n  initializeFrontFuncPtr initializeFront,\n  updateGridPointFuncPtr updateGridPoint);\n\n/*!\n * FMM_Core_destroyFMM_CoreData() frees the memory associated with an \n * FMM_CoreData structure.\n *\n * Arguments:\n *  - fmm_core_data (in):  FMM_CoreData \"object\" to be destroyed\n *\n * Return value:           none\n *\n */\nvoid FMM_Core_destroyFMM_CoreData(FMM_CoreData *fmm_core_data);\n\n/*!\n * FMM_Core_initializeFront() sets the initial set of \"known\" and \"trial\"\n * points.  It first initializes the list of \"known\" points by \n * calling the user-provided initializeFront() function to locate\n * the points that border the interface.  It then initializes the list \n * of \"trial\" points by updating and adding all of the neighbors of \n * \"known\" points.\n *\n * Arguments:\n *  - fmm_core_data (in):  FMM_CoreData \"object\" actively managing the \n *                         FMM computation\n *\n * Return value:           none\n *\n */\nvoid FMM_Core_initializeFront(FMM_CoreData *fmm_core_data);\n\n/*!\n * FMM_Core_setInitialFrontPoint() sets a grid point as being on the initial\n * front.\n *\n * Arguments:\n *  - fmm_core_data (in):  FMM_CoreData \"object\" actively managing the \n *                         FMM computation\n *  - grid_idx (in):       integer array containing the grid index of the \n *                         grid point to set as an initial front point\n *  - value (in):          value of initial front point from zero level \n *                         set (e.g. distance or arrival time)\n *\n * Return value:           none\n *\n * NOTES:\n *  - This function MUST be called during the user-defined \n *    initializeFrontFuncPtr() callback function to add grid points\n *    to the initial front.  Otherwise, the initial front will remain \n *    empty and the FMM calculation wll yield incorrect results.\n *\n *  - If the value of a grid point is set to LSMLIB_REAL_MAX, then \n *    it will be treated as being outside of the domain of the problem.\n *\n *  - It is assumed that the size of the grid_idx array is at least \n *    equal to the number of spatial dimensions of the problem. \n *\n */\nvoid FMM_Core_setInitialFrontPoint(\n  FMM_CoreData *fmm_core_data, \n  int *grid_idx, \n  LSMLIB_REAL value);\n\n/*!\n * FMM_Core_markPointOutsideDomain() sets a grid point as being outside of \n * the mathematical domain for the problem.\n *\n * Arguments:\n *  - fmm_core_data (in):  FMM_CoreData \"object\" actively managing the \n *                         FMM computation\n *  - grid_idx (in):       integer array containing the grid index of the \n *                         grid point to set outside of the domain\n *\n * Return value:           none\n *\n * NOTES:\n *  - This function MUST be called before FMM_Core_advanceFront() \n *    to set grid points as being outside of the mathematical domain \n *    for the problem.  Otherwise, all grid points will be treated as\n *    being in the interior of the domain.\n *\n *  - It is assumed that the size of the grid_idx array is at least \n *    equal to the number of spatial dimensions of the problem. \n *\n */\nvoid FMM_Core_markPointOutsideDomain(\n  FMM_CoreData *fmm_core_data, \n  int *grid_idx);\n\n/*!\n * FMM_Core_advanceFront() advances the front of \"known\" grid points by\n * a single grid point.  It basically carries out the main update\n * loop of the Fast Marching Method.\n *\n * Arguments:\n *  - fmm_core_data (in):  FMM_CoreData \"object\" actively managing the \n *                         FMM computation\n *\n * Return value:           none\n *\n */\nvoid FMM_Core_advanceFront(FMM_CoreData *fmm_core_data);\n\n/*!\n * FMM_Core_moreGridPointsToUpdate() determines whether there are more grid \n * points to update.\n *\n * Arguments:\n *  - fmm_core_data (in):  FMM_CoreData \"object\" actively managing the \n *                         FMM computation\n * \n * Return value:           true (1) if there are more grid points to update;\n *                         false (0) otherwise\n *\n */\nint FMM_Core_moreGridPointsToUpdate(FMM_CoreData *fmm_core_data);\n\n/*!\n * FMM_Core_getGridPointStatusData() is an accessor function for \n * the gridpoint_status data array managed by the FMM_CoreData structure.\n *\n * Arguments:\n *  - fmm_core_data (in):  FMM_CoreData \"object\" actively managing the \n *                         FMM computation\n * \n * Return value:           pointer to gridpoint_status data array\n *\n */\nint* FMM_Core_getGridPointStatusDataArray(FMM_CoreData *fmm_core_data);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/eikonal/include/FMM_Heap.h",
    "content": "/*\n * File:        FMM_Heap.h\n * Copyrights:  (c) 2005 The Trustees of Princeton University and Board of\n *                  Regents of the University of Texas.  All rights reserved.\n *              (c) 2009 Kevin T. Chu.  All rights reserved.\n * Revision:    $Revision: 149 $\n * Modified:    $Date: 2009-01-18 00:31:09 -0800 (Sun, 18 Jan 2009) $\n * Description: Header file for C heap library for supporting FMM algorithm\n */\n\n#ifndef included_FMM_Heap_h\n#define included_FMM_Heap_h\n \n#include \"FMM_API.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*! \\file FMM_Heap.h\n *\n * \\brief\n * @ref FMM_Heap.h provides the heap data structure required to implement \n * the Fast Marching Method.  \n * \n * In addition to the operations on a typical heap, FMM_Heap provides some \n * information on the movement of FMM_HeapNodes in the heap which is required \n * to maintain \"back pointers\" from the grid to the nodes in the heap.  For \n * details see \"Level Set Methods and Fast Marching Methods\" by J.A. Sethian. \n *\n * It is designed to minimize the number of updates of \"pointers\" \n * from the grid to the FMM_HeapNodes when the tentative values of the\n * distance function are updated.  This goal is achieved by storing \n * the FMM_HeapNodes separately from the array that represents the heap;\n * an auxilliary array of integer \"pointers\" to the array of FMM_HeapNodes \n * actually represents the heap. \n *\n *\n * <h3> NOTES: </h3>\n * - At this point in time, this library is only works for up\n *   to 8 spatial dimensions.   This source of this \n *   is the size of the grid_idx data member in \n *   of the FMM_HeapNode structure.  \n *\n */\n\n\n/*!\n * The Heap structure stores the internal data required to maintain\n * the state of the heap.\n */\ntypedef struct FMM_Heap FMM_Heap;\n\n\n/*! \n * maximum number of spatial dimensions in grid \n */\n#define FMM_HEAP_MAX_NDIM (8)\n\n/*!\n * The FMM_HeapNode structure stores the index of a grid cell, the value \n * of the function within that cell, and heap_pos that is used \n * internally to maintain the heap.\n */\ntypedef struct HeapNode {\n  int grid_idx[FMM_HEAP_MAX_NDIM];      /* grid index     */\n  LSMLIB_REAL value;                    /* function value */\n  int heap_pos;                         /* internal data  */\n} FMM_HeapNode;\n\n\n/*!\n * FMM_Heap_createHeap() dynamically allocates an empty heap with the \n * specified amount of memory allocated for the heap and the specified \n * growth factor.\n *\n * Arguments:\n *  - num_dims (in):       number of spatial dimensions for FMM calculation\n *  - heap_mem_size (in):  number of nodes to initially allocate memory for\n *  - growth_factor (in):  factor used to grow size of memory allocated for\n *                         heap when the heap exhausts its memory allocation\n *\n * Return value:           pointer to new heap\n *\n * NOTES:\n *  - To use the default amount of memory (64 FMM_HeapNodes), \n *    set heap_mem_size to 0. \n *\n *  - To use the default growth factor (2), set growth_factor = 0.\n *\n */\nFMM_Heap* FMM_Heap_createHeap(int num_dims, int heap_mem_size, \n  LSMLIB_REAL growth_factor);\n\n/*!\n * FMM_Heap_destroyHeap() frees the memory used to store the heap.\n *\n * Arguments:\n *  - heap (in):  pointer to heap to be destroyed\n *\n * Return value:  none\n *\n */\nvoid FMM_Heap_destroyHeap(FMM_Heap* heap);\n\n/*!\n * FMM_Heap_insertNode() inserts a new node into the heap and returns\n * an integer handle to the node.\n *\n * Arguments:\n *  - heap (in):      pointer to heap \n *  - grid_idx (in):  grid index of node to insert into heap\n *  - value (in):     value of node to insert into heap\n *\n * Return value:      integer handle to the FMM_HeapNode created for \n *                    the new node\n *\n * NOTE: the integer handle that is returned by this function\n *       may be changed by an FMM_Heap_extractMin() operation and need \n *       to be updated accordingly after calling FMM_Heap_extractMin().\n */\nint FMM_Heap_insertNode(FMM_Heap* heap, int *grid_idx, LSMLIB_REAL value);\n\n/*!\n * FMM_Heap_extractMin() removes the FMM_HeapNode with the minimum \n * function value from the heap and returns it as the return value.  \n * Additionally, this method may change the node handle for \n * one node in the heap.  Information about the node whose\n * handle is changed is optionally returned through the \n * moved_node and moved_handle arguments.  If no FMM_HeapNode needed \n * to be moved during the operation, (*moved_handle) is set \n * to -1 and (*moved_node) is given a very large value \n * (invalid state).\n *\n * Arguments:\n *  - heap (in):           pointer to heap \n *  - moved_node (out):    FMM_HeapNode of node in the heap that was moved\n *                         (if a node was actually moved)\n *  - moved_handle (out):  integer handle for FMM_HeapNode that was moved\n *                         (if a node was actually moved)\n *\n * Return value:           FMM_HeapNode possessing minimum value\n *\n * NOTES: \n *  - the user is responsible for providing the memory for\n *    moved_node and moved_handle.\n *\n *  - moved_node and moved_handle may be independently set\n *    to NULL if the moved node information is not needed.\n *\n */\nFMM_HeapNode FMM_Heap_extractMin(FMM_Heap* heap, FMM_HeapNode* moved_node, \n  int* moved_handle);\n\n/*!\n * FMM_Heap_updateNode() updates the value of function in the specified \n * node and moves it up or down the heap so that the heap-property \n * is preserved. \n *\n * Arguments:\n *  - heap (in):         pointer to heap \n *  - node_handle (in):  integer handle of node to update\n *  - value (in):        new value for updated node\n *\n * Return value:         none\n *\n */\nvoid FMM_Heap_updateNode(FMM_Heap* heap, int node_handle, LSMLIB_REAL value);\n\n/*!\n * FMM_Heap_clear() empties out the heap.\n *\n * Arguments:\n *  - heap (in):         pointer to heap \n *\n * Return value:         none\n *\n */\nvoid FMM_Heap_clear(FMM_Heap* heap);\n\n/*!\n * FMM_Heap_isEmpty() returns true (1) if the heap is empty and \n * false (0) otherwise.\n *\n * Arguments:\n *  - heap (in):         pointer to heap \n *\n * Return value:      true (1) if the heap is empty; false (0) otherwise\n *\n */\nint FMM_Heap_isEmpty(FMM_Heap* heap);\n\n/*!\n * FMM_Heap_getNode() returns the specified node\n *\n * Arguments:\n *  - heap (in):         pointer to heap \n *  - node_handle (in):  integer handle of requested node\n *\n * Return value:         requested FMM_HeapNode\n *\n */\nFMM_HeapNode FMM_Heap_getNode(FMM_Heap* heap,int node_handle);\n\n/*!\n * FMM_Heap_getHeapSize() returns the current number of nodes in the heap\n *\n * Arguments:\n *  - heap (in):         pointer to heap \n *\n * Return value:         current number of nodes in heap\n *\n */\nint FMM_Heap_getHeapSize(FMM_Heap* heap);\n\n/*!\n * FMM_Heap_getHeapMemSize() returns the current maximum number of nodes\n * that the heap can accomodate.\n *\n * Arguments:\n *  - heap (in):         pointer to heap \n *\n * Return value:         maximum number of nodes that the heap can currently\n *                       accomodate before requiring memory reallocation\n *\n */\nint FMM_Heap_getHeapMemSize(FMM_Heap* heap) ;\n\n/*!\n * FMM_Heap_prinHeapData() prints all data members for the specified \n * FMM_Heap structure.\n *\n * Arguments:\n *  - heap (in):         pointer to heap \n *\n * Return value:         none\n *\n */\nvoid FMM_Heap_printHeapData(FMM_Heap* heap); \n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/eikonal/include/FMM_Macros.h",
    "content": "/*\n * File:        FMM_Macros.h\n * Copyrights:  (c) 2005 The Trustees of Princeton University and Board of\n *                  Regents of the University of Texas.  All rights reserved.\n *              (c) 2009 Kevin T. Chu.  All rights reserved.\n * Revision:    $Revision: 149 $\n * Modified:    $Date: 2009-01-18 00:31:09 -0800 (Sun, 18 Jan 2009) $\n * Description: Header file that defines several common macros used \n *              for Fast Marching Method calculations\n */\n\n/*! \\file FMM_Macros.h\n *\n * \\brief\n * @ref FMM_Macros.h provides several macros used for Fast Marching\n *      Method calculations.\n *\n */\n\n#ifndef included_FMM_Macros_h\n#define included_FMM_Macros_h\n\n\n/*======================= Helper Functions ==========================*/\n/* LSM_FMM_ABS() computes the absolute value of its argument.        */\n/* This macro is defined so that LSMLIB does not have to rely on the */\n/* C math library.                                                   */\n#define LSM_FMM_ABS(x)            ((x) > 0 ? (x) : -1.0*(x))\n\n/*\n * LSM_FMM_IDX() computes the array index for the specified \n * grid index and grid dimensions.\n *\n * Arguments:\n *   idx (out):       array index\n *   grid_idx (in):   grid index\n *   grid_dims (in):  grid dimensions\n * \n * NOTES:\n *  (1) idx MUST be a valid l-value.\n *  (2) FMM_NDIM MUST be defined by user code.\n *\n */\n#define LSM_FMM_IDX(idx, grid_idx, grid_dims)                            \\\n{                                                                        \\\n  int lsm_fmm_dir;                                                       \\\n  int grid_size_lower_dims = 1;                                          \\\n  idx = 0;                                                               \\\n  for (lsm_fmm_dir = 0; lsm_fmm_dir < FMM_NDIM; lsm_fmm_dir++) {         \\\n    idx += grid_idx[lsm_fmm_dir]*grid_size_lower_dims;                   \\\n    grid_size_lower_dims *= grid_dims[lsm_fmm_dir];                      \\\n  }                                                                      \\\n}\n\n/*\n * LSM_FMM_IDX_OUT_OF_BOUNDS() determines whether the given \n * grid index lies in the computational domain.\n *\n * Arguments:\n *   result (out):    1 if grid index is out of bounds; 0 otherwise.\n *   grid_idx (in):   grid index\n *   grid_dims (in):  grid dimensions\n * \n * NOTES:\n *  (1) result MUST be a valid l-value.\n *  (2) FMM_NDIM MUST be defined by user code.\n *\n */\n#define LSM_FMM_IDX_OUT_OF_BOUNDS(result, grid_idx, grid_dims)           \\\n{                                                                        \\\n  int lsm_fmm_dir;                                                       \\\n  result = 0;                                                            \\\n  for (lsm_fmm_dir = 0; lsm_fmm_dir < FMM_NDIM; lsm_fmm_dir++) {         \\\n    if (  (grid_idx[lsm_fmm_dir]<0)                                      \\\n       || (grid_idx[lsm_fmm_dir]>grid_dims[lsm_fmm_dir]-1) ) {           \\\n      result = 1;                                                        \\\n      break;                                                             \\\n    }                                                                    \\\n  }                                                                      \\\n}\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/eikonal/src/FMM_Core.c",
    "content": "/*\n * File:        FMM_Core.c\n * Copyrights:  (c) 2005 The Trustees of Princeton University and Board of\n *                  Regents of the University of Texas.  All rights reserved.\n *              (c) 2009 Kevin T. Chu.  All rights reserved.\n * Revision:    $Revision: 149 $\n * Modified:    $Date: 2009-01-18 00:31:09 -0800 (Sun, 18 Jan 2009) $\n * Description: Implementation of FMM_Core functions\n */\n \n#include <stdio.h>\n#include <stdlib.h>\n#include <float.h>\n\n#include \"FMM_Heap.h\"\n#include \"FMM_Core.h\"\n\n/*======================= FMM_Core Constants =========================*/\n#define FMM_CORE_TRUE                   (1)\n#define FMM_CORE_FALSE                  (0)\n#define FMM_CORE_NULL                   (0)\n#define FMM_CORE_MAX_NDIM               (FMM_HEAP_MAX_NDIM)\n\n\n/*======================= FMM_Core Macros =========================*/\n#define FMM_CORE_ABS(x)       ((x) > 0 ? (x) : -1.0*(x))\n\n#define FMM_CORE_IDX(idx, num_dims, grid_idx, grid_dims)                   \\\n{                                                                          \\\n  int macro_i;                         /* loop variable */                 \\\n  int macro_num_gridpts_per_grid_idx = 1;                                  \\\n  idx = 0;                                                                 \\\n  for (macro_i = 0; macro_i < num_dims; macro_i++) {                       \\\n    idx += macro_num_gridpts_per_grid_idx*grid_idx[macro_i];               \\\n    macro_num_gridpts_per_grid_idx *= grid_dims[macro_i];                  \\\n  }                                                                        \\\n}\n\n#define FMM_CORE_IDX_OUT_OF_BOUNDS(out_of_bounds, num_dims, grid_idx,     \\\n                                   grid_dims)                             \\\n{                                                                         \\\n  int macro_i;       /* loop variable */                                  \\\n  out_of_bounds = 0;                                                      \\\n  for (macro_i = 0; macro_i < num_dims; macro_i++) {                      \\\n    if (  (grid_idx[macro_i] < 0)                                         \\\n       || (grid_idx[macro_i] > grid_dims[macro_i]-1) ) {                  \\\n      out_of_bounds = 1;                                                  \\\n      break;                                                              \\\n    }                                                                     \\\n  }                                                                       \\\n}\n\n\n/*=============== FMM_Core Helper Function Declarations ==============*/\n\n/* \n * FMM_Core_updateNeighbors() updates the neighbors of the specified\n * grid point.\n */\nstatic \nvoid FMM_Core_updateNeighbors(FMM_CoreData *fmm_core_data, int *grid_idx); \n\n\n/*=============== Fast Marching Method Data Structures ==============*/\nstruct FMM_CoreData {\n\n  /* field data */\n  int num_dims;\n  FMM_FieldData *fmm_field_data;\n  int grid_dims[FMM_CORE_MAX_NDIM];\n  LSMLIB_REAL dx[FMM_CORE_MAX_NDIM];\n\n  /* function pointer to grid update function */\n  initializeFrontFuncPtr initializeFront;\n  updateGridPointFuncPtr updateGridPoint;\n\n  /* internal data */\n  int* heapnode_handles;\n  int* gridpoint_status;\n  FMM_Heap* trial_points;\n  FMM_Heap* known_points;\n};\n\n\n/*=============== FMM_Core API Function Definitions ==============*/\n\nFMM_CoreData* FMM_Core_createFMM_CoreData(\n  FMM_FieldData *fmm_field_data,\n  const int num_dims,\n  const int *grid_dims,\n  const LSMLIB_REAL *dx,\n  initializeFrontFuncPtr initializeFront,\n  updateGridPointFuncPtr updateGridPoint)\n{\n  FMM_CoreData *fmm_core_data;     /* pointer to new FMM_CoreData */\n  int num_gridpoints;              /* number of grid points */\n  int initial_heap_size;           /* initial size for FMM_Heap */\n  int i;                           /* loop variable */\n  int *ptr;                        /* integer pointer loop variable */\n\n  /* check that num_dimension is supported */\n  if ( num_dims > FMM_CORE_MAX_NDIM ) {\n    fprintf(stderr,\n    \"ERROR: Invalid number of dimensions.  Only NDIM < %d supported.\\n\",\n    FMM_CORE_MAX_NDIM);\n    exit(-1);\n  } \n\n  /* allocate memory for FMM_CoreData */\n  fmm_core_data = (FMM_CoreData*) malloc( sizeof(FMM_CoreData) );\n\n  /* compute number of grid points */\n  num_gridpoints = 1;\n  for (i = 0; i < num_dims; i++) num_gridpoints *= grid_dims[i];\n\n  /* initialize FMM data */\n  fmm_core_data->heapnode_handles = (int*) malloc(num_gridpoints*sizeof(int));\n  fmm_core_data->gridpoint_status = (int*) malloc(num_gridpoints*sizeof(int));\n  fmm_core_data->num_dims = num_dims;\n  fmm_core_data->fmm_field_data = fmm_field_data;\n  fmm_core_data->initializeFront = initializeFront;\n  fmm_core_data->updateGridPoint = updateGridPoint;\n\n  /* initialize grid_dims and dx to zero */\n  for (i = 0; i < FMM_CORE_MAX_NDIM; i++) {\n    fmm_core_data->grid_dims[i] = 0;\n    fmm_core_data->dx[i] = 0.0;\n  }\n\n  /* copy of grid_dims and dx from user specified arguments */\n  /* NOTE:  data is only copied for the number of           */\n  /*        dimensions specified for the computation.       */\n  for (i = 0; i < num_dims; i++) {\n    fmm_core_data->grid_dims[i] = grid_dims[i];\n    fmm_core_data->dx[i] = dx[i];\n  }\n\n  /* create an FMM_Heap to store the trial points */\n  /* NOTE: using default heap growth factor by    */\n  /*       specifying 0 for the second argument   */\n  initial_heap_size = 0;\n  for (i = 0; i < num_dims; i++) initial_heap_size += grid_dims[i];\n  fmm_core_data->trial_points = \n    FMM_Heap_createHeap(num_dims,initial_heap_size,0); \n\n  /* initialize heapnode handles to have a default value of -1 */\n  ptr = fmm_core_data->heapnode_handles;\n  for (i = 0; i < num_gridpoints; i++, ptr++) {\n    *ptr = -1;\n  }\n\n  /* initialize gridpoint status of all cells to FAR */\n  ptr = fmm_core_data->gridpoint_status;\n  for (i = 0; i < num_gridpoints; i++, ptr++) {\n    *ptr = FAR;\n  }\n\n  return fmm_core_data;\n}\n\n\nvoid FMM_Core_destroyFMM_CoreData(FMM_CoreData *fmm_core_data)\n{\n  free(fmm_core_data->heapnode_handles);\n  free(fmm_core_data->gridpoint_status);\n  FMM_Heap_destroyHeap(fmm_core_data->trial_points);\n  if (fmm_core_data->known_points != FMM_CORE_NULL)\n    FMM_Heap_destroyHeap(fmm_core_data->known_points);\n  free(fmm_core_data);\n}\n\n\nvoid FMM_Core_initializeFront(FMM_CoreData *fmm_core_data)\n{\n  int num_dims = fmm_core_data->num_dims; \n  int *grid_dims = fmm_core_data->grid_dims;\n  FMM_FieldData *fmm_field_data = fmm_core_data->fmm_field_data;\n  int num_gridpoints;\n\n  /* list of known points */\n  FMM_Heap *known_points; \n  int initial_heap_size;\n  int grid_idx[FMM_CORE_MAX_NDIM];\n\n  /* auxilliary variables */\n  int i;         /* loop variable */\n\n  /* compute the number of grid points and initial heap size */\n  num_gridpoints = 1;\n  initial_heap_size = 0;\n  for (i = 0; i < num_dims; i++) {\n    num_gridpoints *= grid_dims[i];\n    initial_heap_size += grid_dims[i];\n  }\n\n  /* create FMM_Heap to contain known points      */\n  /* NOTE: using default heap growth factor by    */\n  /*       specifying 0 for the second argument   */\n  known_points = FMM_Heap_createHeap(num_dims,initial_heap_size,0);\n  fmm_core_data->known_points = known_points;\n\n  /* let user-provided callback function find and initialize the front */\n  fmm_core_data->initializeFront(\n    fmm_core_data, \n    fmm_field_data, \n    fmm_core_data->num_dims, \n    fmm_core_data->grid_dims, \n    fmm_core_data->dx);\n\n\n  /* \n   * Set initial set of trial points (i.e. all of the \n   * neighbors of the initial set of known points).\n   * For all \"known\" points: \n   *   (1) update their neighbors \n   *   (2) add their neighbors to the list of trial points\n   */\n  \n  while (!FMM_Heap_isEmpty(known_points)) {\n    /* extract grid index of next known point */\n    FMM_HeapNode node = FMM_Heap_extractMin(known_points,\n                                            FMM_CORE_NULL,\n                                            FMM_CORE_NULL);\n\n    \n    /* update neighbors if the value of the node is */\n    /* less than LSMLIB_REAL_MAX                    */\n    if (node.value < LSMLIB_REAL_MAX) {\n\n      /* set grid_idx */\n      for (i = 0; i < num_dims; i++) {\n        grid_idx[i] = node.grid_idx[i];\n      }\n      for (i = num_dims; i < FMM_CORE_MAX_NDIM; i++) {\n        grid_idx[i] = 0;\n      }\n\n      FMM_Core_updateNeighbors(fmm_core_data, grid_idx);\n    }\n\n  } /* end loop over \"known\" points */\n\n  /* clean up memory */\n  FMM_Heap_destroyHeap(known_points);\n  fmm_core_data->known_points = FMM_CORE_NULL;\n}\n\n\n/*\n * FMM_Core_setInitialFrontPoint() first makes a local copy of the grid_idx\n * because the FMM_CORE_IDX calculation and FMM_Heap_insertNode() function\n * require that grid_idx is an array of size FMM_CORE_MAX_NDIM \n * (= FMM_HEAP_MAX_NDIM).\n */\nvoid FMM_Core_setInitialFrontPoint(\n  FMM_CoreData *fmm_core_data, \n  int *grid_idx, \n  LSMLIB_REAL value)\n{\n  int num_dims = fmm_core_data->num_dims; \n  int *grid_dims = fmm_core_data->grid_dims;\n  int *gridpoint_status = fmm_core_data->gridpoint_status; \n  int grid_idx_local[FMM_CORE_MAX_NDIM];     /* local copy of grid_idx */\n\n  /* auxilliary variables */\n  int i;    /* loop variable */\n  int idx;  /* data array index */\n\n  /* make local copy of grid index */\n  for (i = 0; i < num_dims; i++) {\n    grid_idx_local[i] = grid_idx[i];\n  }\n  for (i = num_dims; i < FMM_CORE_MAX_NDIM; i++) {\n    grid_idx_local[i] = 0;\n  }\n\n  /* Set status of grid point based and add it to the \"known_points\" heap. */\n  FMM_CORE_IDX(idx, num_dims, grid_idx_local, grid_dims);\n  gridpoint_status[idx] = KNOWN;\n  FMM_Heap_insertNode(fmm_core_data->known_points,grid_idx_local,value);\n\n}\n\n/*\n * FMM_Core_markPointOutsideDomain() first makes a local copy of the grid_idx\n * because the FMM_CORE_IDX calculation and FMM_Heap_insertNode() function\n * require that grid_idx is an array of size FMM_CORE_MAX_NDIM \n * (= FMM_HEAP_MAX_NDIM).\n */\nvoid FMM_Core_markPointOutsideDomain(\n  FMM_CoreData *fmm_core_data, \n  int *grid_idx)\n{\n  int num_dims = fmm_core_data->num_dims; \n  int *grid_dims = fmm_core_data->grid_dims;\n  int *gridpoint_status = fmm_core_data->gridpoint_status; \n  int grid_idx_local[FMM_CORE_MAX_NDIM];     /* local copy of grid_idx */\n\n  /* auxilliary variables */\n  int i;    /* loop variable */\n  int idx;  /* data array index */\n\n  /* make local copy of grid index */\n  for (i = 0; i < num_dims; i++) {\n    grid_idx_local[i] = grid_idx[i];\n  }\n  for (i = num_dims; i < FMM_CORE_MAX_NDIM; i++) {\n    grid_idx_local[i] = 0;\n  }\n\n  /* set grid point status to OUTSIDE_DOMAIN */\n  FMM_CORE_IDX(idx, num_dims, grid_idx_local, grid_dims);\n  gridpoint_status[idx] = OUTSIDE_DOMAIN;\n\n}\n\n/* \n * NOTES:\n *  (1) There may be some error in the update of cells on the border \n *      of the grid, but this error is not important as long as the \n *      zero level set is sufficiently far away from the domain border.\n */\nvoid FMM_Core_advanceFront(FMM_CoreData *fmm_core_data)\n{\n  int num_dims = fmm_core_data->num_dims;\n  int* grid_dims = fmm_core_data->grid_dims;\n  FMM_Heap *fmm_trial_points = fmm_core_data->trial_points;\n  int *heapnode_handles = fmm_core_data->heapnode_handles;\n  int *gridpoint_status = fmm_core_data->gridpoint_status;\n  FMM_HeapNode moved_node;\n  int moved_handle;\n  FMM_HeapNode min_node;\n  int idx;\n\n  /* \n   * remove the point with the smallest value from the set of \"trial\" points.\n   */\n  min_node = FMM_Heap_extractMin(fmm_trial_points, &moved_node, &moved_handle);\n\n  /* correct the handle for the moved node */\n  if (-1 != moved_handle) {  /* update heapnode_data if necessary */\n    FMM_CORE_IDX(idx, num_dims, moved_node.grid_idx, grid_dims);\n    heapnode_handles[idx] = moved_handle;\n  }\n\n  /* set status of min node to \"known\" */\n  FMM_CORE_IDX(idx, num_dims, min_node.grid_idx, grid_dims);\n  gridpoint_status[idx] = KNOWN;\n\n  /* update neighbors */\n  FMM_Core_updateNeighbors(fmm_core_data, min_node.grid_idx);\n\n}\n\nint FMM_Core_moreGridPointsToUpdate(FMM_CoreData *fmm_core_data)\n{\n  return ( FMM_Heap_isEmpty(fmm_core_data->trial_points) ?\n           FMM_CORE_FALSE : FMM_CORE_TRUE);\n}\n\nint* FMM_Core_getGridPointStatusDataArray(FMM_CoreData *fmm_core_data)\n{\n  return (fmm_core_data->gridpoint_status);\n}\n\n\n/*=============== FMM_Core Helper Function Definitions ==============*/\n\nvoid FMM_Core_updateNeighbors(FMM_CoreData *fmm_core_data, int *grid_idx)\n{\n  int* grid_dims = fmm_core_data->grid_dims;\n  FMM_Heap *fmm_trial_points = fmm_core_data->trial_points;\n  FMM_FieldData *fmm_field_data = fmm_core_data->fmm_field_data;\n  int *heapnode_handles = fmm_core_data->heapnode_handles;\n  int *gridpoint_status = fmm_core_data->gridpoint_status;\n  int num_dims = fmm_core_data->num_dims;\n\n  /* variables for update calculation */\n  int neighbor[FMM_CORE_MAX_NDIM];\n  int offset[FMM_CORE_MAX_NDIM];\n  LSMLIB_REAL value;\n  int heapnode_handle;\n\n  /* auxilliary variables */\n  int dir; \t       /* loop variable for spatial directions */\n  int n;\t         /* loop variable for neighbors */\n  int m;\t         /* extra loop variable */\n  int idx;             /* data array index */\n  int out_of_bounds;   /* boolean indicating if index is out of bounds */\n\n  /* loop over coordinate directions */\n  for (dir = 0; dir < num_dims; dir++) { \n\n    /* reset neighbor and offset */\n    for (m = 0; m < FMM_CORE_MAX_NDIM; m++) {\n      neighbor[m] = 0; offset[m] = 0; \n    }\n\n    for (n = -1; n<=1; n+=2) { /* loop over neighbors */\n      PointStatus neighbor_status;\n\n      offset[dir] = n;\n\n      for (m = 0; m < num_dims; m++) neighbor[m] = grid_idx[m]+offset[m];\n\n      FMM_CORE_IDX_OUT_OF_BOUNDS(out_of_bounds, num_dims, neighbor, grid_dims);\n      if (!out_of_bounds) {\n\n        FMM_CORE_IDX(idx, num_dims, neighbor, grid_dims);\n        neighbor_status = (PointStatus) gridpoint_status[idx];\n        if (  (KNOWN != neighbor_status) \n           && (OUTSIDE_DOMAIN != neighbor_status) ) {\n\n          /* compute trial values for neighbor */\n          value = fmm_core_data->updateGridPoint(fmm_core_data, \n                                                 fmm_field_data,\n                                                 neighbor,\n                                                 fmm_core_data->num_dims, \n                                                 fmm_core_data->grid_dims, \n                                                 fmm_core_data->dx);\n          if (value < 0) value *= -1; /* only absolute value matters here */\n\n          if (FAR == neighbor_status) {\n\n            /* set the status of the neighbor to TRIAL */\n            FMM_CORE_IDX(idx, num_dims, neighbor, grid_dims);\n            gridpoint_status[idx] = TRIAL;\n\n            /* insert the new TRIAL point into the FMM_Heap */\n            heapnode_handle = FMM_Heap_insertNode(fmm_trial_points, \n                                                  neighbor, value);\n\n            /* set the heap node handle */\n            heapnode_handles[idx] = heapnode_handle;\n\n          } else { \n            /* \n             * neighbor has status TRIAL, so just update its value in \n             * the heap\n             */\n            FMM_CORE_IDX(idx, num_dims, neighbor, grid_dims);\n            FMM_Heap_updateNode(fmm_trial_points, heapnode_handles[idx], \n                                value);\n          } \n        } /* end update of neighbor point (not in \"known\" set) */\n\n      } /* end case: grid index of neighbor is not out of bounds */\n\n    } /* end loop over neighbors */\n  } /* end loop over coordinate directions */\n\n}\n\n"
  },
  {
    "path": "OptolithiumC/libs/eikonal/src/FMM_Heap.c",
    "content": "/*\n * File:        FMM_Heap.c\n * Copyrights:  (c) 2005 The Trustees of Princeton University and Board of\n *                  Regents of the University of Texas.  All rights reserved.\n *              (c) 2009 Kevin T. Chu.  All rights reserved.\n * Revision:    $Revision: 149 $\n * Modified:    $Date: 2009-01-18 00:31:09 -0800 (Sun, 18 Jan 2009) $\n * Description: C heap library for supporting fast marching method \n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <float.h>\n\n#include \"FMM_Heap.h\" \n\n/*\n * FMM_Heap Constants\n */\n#define DEFAULT_HEAP_MEM_SIZE (64)\n#define DEFAULT_HEAP_GROWTH_FACTOR (2)\n\n/*\n * FMM_Heap Macros\n */\n\n#define HEAP_POS(i) \t( d_nodes[(i)].heap_pos )\n#define PARENT_N(i) \t\\\n\t( d_heap[ (int)( (d_nodes[(i)].heap_pos+1)/2 -1 )] )\n#define CHILD_LEFT_N(i) \t\\\n\t( d_heap[ (int)(2*(d_nodes[(i)].heap_pos+1) -1 )] )\n#define CHILD_RIGHT_N(i) \t\\\n\t( d_heap[ (int)( 2*(d_nodes[(i)].heap_pos+1) )] )\n#define PARENT_H(i) \t\t( (int)( ((i)+1)/2 -1 ) )\n#define CHILD_LEFT_H(i) \t( (int)( 2*((i)+1) -1 ) )\n#define CHILD_RIGHT_H(i) \t( (int)( 2*((i)+1) ) )\n\n\n/*\n * Definition of FMM_Heap structure.\n */\nstruct FMM_Heap {\n  int* d_heap;\n  FMM_HeapNode* d_nodes;\n  int d_num_dims;\n  int d_heap_size;\n  int d_heap_mem_size;\n  LSMLIB_REAL d_heap_growth_factor;\n};\n\n\n/*================== Helper Functions Declarations ==================*/\n\n/*\n * FMM_Heap_makeNewHeap() allocates memory for and initializes all\n * nodes in the heap to have a big value (LSMLIB_REAL_MAX).\n * The amount of memory allocated is dynamically adjusted\n * to accomodate the number of nodes in the heap.\n */\nstatic void FMM_Heap_makeNewHeap(FMM_Heap* heap, int heap_mem_size);\n\n/*\n * FMM_Heap_growHeap() increases the amount of the memory allocated for\n * the heap by the heap growth factor.\n *\n * NOTE:  this is an EXPENSIVE operation because all FMM_HeapNodes\n *        must be copied to the new array AND because all of the\n *        \"back-pointers\" from the grid must be updated to reflect\n *        the new locations of the FMM_HeapNodes.\n */\nstatic void FMM_Heap_growHeap(FMM_Heap* heap);\n\n/*\n * FMM_Heap_upHeap() bubbles the specified position up the heap until\n * the value of the corresponding node is greater than its parent.\n */\nstatic void FMM_Heap_upHeap(FMM_Heap* heap, int heap_pos);\n\n/*\n * FMM_Heap_downHeap() bubbles the specified position down the heap\n * until the value of the corresponding node is smaller than its parent.\n */\nstatic void FMM_Heap_downHeap(FMM_Heap* heap, int heap_pos);\n\n/*===================================================================*/\n\n\n/*==================== Function Definitions =========================*/\n\nFMM_Heap* FMM_Heap_createHeap(int num_dims, int heap_mem_size, \n  LSMLIB_REAL growth_factor)\n{\n  FMM_Heap* heap;\n\n  /* Check inputs */\n  if (heap_mem_size <= 0) heap_mem_size = DEFAULT_HEAP_MEM_SIZE;\n  if (growth_factor < 1) growth_factor = DEFAULT_HEAP_GROWTH_FACTOR; \n\n  heap = (FMM_Heap*) malloc(sizeof(FMM_Heap));\n  heap->d_num_dims = num_dims;\n  heap->d_heap_size = 0;\n  heap->d_heap_mem_size = heap_mem_size;\n  heap->d_heap_growth_factor = growth_factor;\n\n  FMM_Heap_makeNewHeap(heap, heap_mem_size);\n\n  return heap;\n}\n\nvoid FMM_Heap_destroyHeap(FMM_Heap* heap)\n{\n  free(heap->d_heap);\n  free(heap->d_nodes);\n  free(heap);\n}\n\nint FMM_Heap_insertNode(FMM_Heap* heap, int *grid_idx, LSMLIB_REAL value)\n{\n  int *d_heap = heap->d_heap;\n  FMM_HeapNode* d_nodes = heap->d_nodes;\n  int d_heap_size = heap->d_heap_size;\n  int i;\n\n  /* insert node at bottom heap */\n  d_heap[d_heap_size] = d_heap_size;\n  for (i = 0; i< heap->d_num_dims; i++) {\n    d_nodes[d_heap_size].grid_idx[i] = grid_idx[i];\n  }\n  d_nodes[d_heap_size].value = value;\n  d_nodes[d_heap_size].heap_pos = d_heap_size;\n\n  /* bubble it up the heap until the heap property is satisfied */\n  FMM_Heap_upHeap(heap, d_heap_size);\n\n  /* update heap size information and grow heap memory if necessary */\n  heap->d_heap_size++;\n  if (heap->d_heap_size == heap->d_heap_mem_size) FMM_Heap_growHeap(heap);\n\n  return (heap->d_heap_size-1);\n}\n\nFMM_HeapNode FMM_Heap_extractMin(FMM_Heap* heap, FMM_HeapNode* moved_node, \n  int* moved_handle) \n{\n  int *d_heap = heap->d_heap;\n  FMM_HeapNode* d_nodes = heap->d_nodes;\n  int d_heap_size = heap->d_heap_size;\n\n  int root_handle = d_heap[0]; /* handle for root of heap */\n  FMM_HeapNode moved_node_local;\n  int moved_handle_local;\n  FMM_HeapNode min_node = d_nodes[root_handle]; /* copy root of heap */\n\n  /* \n   * if min_node was not located at the end of d_nodes, \n   * fill the gap in d_heap left by moving the FMM_HeapNode\n   * at the end of d_nodes to the position occupied\n   * by min_node and the FMM_HeapNode at the end of d_nodes\n   * into an invalid state\n   */\n  if (root_handle != d_heap_size-1) {\n\n    /* set moved node and handle */\n    moved_node_local = d_nodes[d_heap_size-1]; \n    moved_handle_local = root_handle;  \n\n    /* replace min_node wth moved_node and fix pointer from d_heap */\n    d_nodes[root_handle] = moved_node_local; \n    d_heap[moved_node_local.heap_pos] = root_handle; \n\n    /* invalidate copy of moved_node */\n    d_nodes[d_heap_size-1].value = LSMLIB_REAL_MAX;\n\n  } else {\n\n    int i;\n\n    /* set position occupied by root node to invalid state */\n    d_nodes[root_handle].value = LSMLIB_REAL_MAX;\n    \n    /* set moved_node and moved_handle to invalid state */\n    for (i = 0; i < FMM_HEAP_MAX_NDIM; i++) {\n      moved_node_local.grid_idx[i] = -1;\n    }\n    moved_node_local.value = LSMLIB_REAL_MAX;\n    moved_node_local.heap_pos = -1;\n    moved_handle_local = -1;\n\n  }\n\n  /* \n   * move the last FMM_HeapNode in the heap (d_heap NOT d_nodes) \n   * to the root position and trickle it down until the heap \n   * property is satisfied using the FMM_Heap_downHeap() method.\n   */\n  HEAP_POS(d_heap[d_heap_size-1]) = 0;\n  d_heap[0] = d_heap[d_heap_size-1];\n  FMM_Heap_downHeap(heap, 0);\n\n  /* \n   * copy the moved node data into moved_node and moved_handle\n   *if they are not NULL\n   */\n  if (moved_handle) (*moved_handle) = moved_handle_local;\n  if (moved_node) {\n    (*moved_node) = moved_node_local;\n\n    /* \n     * update moved_node's heap_pos field in case it changed\n     * during the FMM_Heap_downHeap() operation\n     */ \n    if (0 < moved_handle_local)\n      moved_node->heap_pos = HEAP_POS(moved_handle_local);\n  }\n\n  /* remove the last node from the heap */\n  d_heap[d_heap_size-1] = -1;\n  heap->d_heap_size--;\n\n  return min_node;\n}\n\nvoid FMM_Heap_updateNode(FMM_Heap* heap, int node_handle, LSMLIB_REAL value)\n{\n  int *d_heap = heap->d_heap;\n  FMM_HeapNode* d_nodes = heap->d_nodes;\n\n  d_nodes[node_handle].value = value;  /* update value of node */\n\n  /* bubble the node up/down the heap to reinstate heap property */\n  if (    (HEAP_POS(node_handle) > 0) /* make sure there is parent to check */\n       && (value < d_nodes[PARENT_N(node_handle)].value) ) {\n    FMM_Heap_upHeap(heap, HEAP_POS(node_handle)); \n  } else {\n    FMM_Heap_downHeap(heap, HEAP_POS(node_handle));\n  }\n}\n\nvoid FMM_Heap_clear(FMM_Heap* heap)\n{\n  int *d_heap = heap->d_heap;\n  FMM_HeapNode* d_nodes = heap->d_nodes;\n  int i;\n\n  /* reset heap size to zero */\n  heap->d_heap_size = 0;\n\n  /* \n   * initialize the value of all nodes to LSMLIB_REAL_MAX and all \n   * heap pointers to -1 \n   */\n  for (i = 0; i < heap->d_heap_mem_size; i++) {\n    d_heap[i] = -1;\n    d_nodes[i].value = LSMLIB_REAL_MAX;\n  }\n}\n\n\n/**\n * FMM_Heap_isEmpty() returns true if the heap is empty and false otherwise.\n */\nint FMM_Heap_isEmpty(FMM_Heap* heap)\n{\n  if (0 == heap->d_heap_size) return 1;\n  else return 0;\n}\n \n/**\n * FMM_Heap_getNode() returns the specified node\n */\nFMM_HeapNode FMM_Heap_getNode(FMM_Heap* heap,int node_handle) \n{\n  return heap->d_nodes[node_handle];\n}\n\nint FMM_Heap_getHeapSize(FMM_Heap* heap) \n{\n  return heap->d_heap_size;\n}\n\nint FMM_Heap_getHeapMemSize(FMM_Heap* heap) \n{\n  return heap->d_heap_mem_size;\n}\n \nvoid FMM_Heap_printHeapData(FMM_Heap* heap)\n{\n  int *d_heap = heap->d_heap;\n  FMM_HeapNode* d_nodes = heap->d_nodes;\n  int d_heap_size = heap->d_heap_size;\n\n  printf(\"\\nprintHeapData...\\n\");\n  printf(\"FMM_Heap: this = %ld\\n\", (long int) heap);\n  printf(\"d_heap = %ld\\n\", (long int) d_heap);\n  printf(\"d_nodes = %ld\\n\", (long int) d_nodes); \n  printf(\"d_heap_size = %d\\n\", d_heap_size); \n  printf(\"d_heap_mem_size = %d\\n\", heap->d_heap_mem_size); \n  printf(\"d_heap_growth_factor = %f\\n\\n\", heap->d_heap_growth_factor); \n}\n\n/*================== Helper Functions Definitions ===================*/\n\nvoid FMM_Heap_makeNewHeap(FMM_Heap* heap, int heap_mem_size)\n{\n  int i;\n\n  /* allocate memory for heap */\n  heap->d_heap = (int*) malloc(heap_mem_size*sizeof(int));\n  heap->d_nodes = (FMM_HeapNode*) malloc(heap_mem_size*sizeof(FMM_HeapNode));\n\n  /* initialize the value of all nodes to LSMLIB_REAL_MAX and all heap \n     pointers to -1 */\n  for (i = 0; i < heap_mem_size; i++) {\n    heap->d_heap[i] = -1;\n    heap->d_nodes[i].value = LSMLIB_REAL_MAX;\n  }\n\n}\n\nvoid FMM_Heap_growHeap(FMM_Heap* heap)\n{\n  int *d_heap = heap->d_heap;\n  FMM_HeapNode* d_nodes = heap->d_nodes;\n  int d_heap_size = heap->d_heap_size;\n  LSMLIB_REAL d_heap_growth_factor = heap->d_heap_growth_factor;\n  int i;\n  int *old_heap; \n  FMM_HeapNode *old_nodes; \n\n  /* compute new heap memory size */\n  heap->d_heap_mem_size = \n     (int) (heap->d_heap_mem_size*d_heap_growth_factor+1);  \n  \n  /* save pointer to old heap and allocate memory for new heap */\n  old_heap = d_heap;\n  old_nodes = d_nodes;\n  FMM_Heap_makeNewHeap(heap, heap->d_heap_mem_size);\n\n  /* copy nodes from old heap to new heap */\n  d_heap_size = heap->d_heap_size;\n  d_heap = heap->d_heap;\n  d_nodes = heap->d_nodes;\n  for (i=0;i<d_heap_size;i++) {\n    d_heap[i] = old_heap[i];\n    d_nodes[i] = old_nodes[i];\n  }\n\n  /* reclaim memory for old_heap */\n  free(old_heap); \n  free(old_nodes); \n}\n\nvoid FMM_Heap_upHeap(FMM_Heap* heap, int heap_pos)\n{\n  int *d_heap = heap->d_heap;\n  FMM_HeapNode* d_nodes = heap->d_nodes;\n  int parent_pos;\n  int tmp;\n\n  parent_pos = PARENT_H(heap_pos);\n  while ( (heap_pos > 0) &&\n          (d_nodes[d_heap[heap_pos]].value < \n             d_nodes[d_heap[parent_pos]].value) )\n  {\n    /* swap heap positions in d_nodes */\n    HEAP_POS(d_heap[heap_pos]) = parent_pos;\n    HEAP_POS(d_heap[parent_pos]) = heap_pos;\n\n    /* swap node handle with parent node handle in d_heap */\n    tmp = d_heap[heap_pos];\n    d_heap[heap_pos] = d_heap[parent_pos];\n    d_heap[parent_pos] = tmp;\n\n    /* update heap_pos and parent heap_pos */\n    heap_pos = parent_pos;\n    parent_pos = PARENT_H(heap_pos);\n  } \n\n}\n\nvoid FMM_Heap_downHeap(FMM_Heap* heap, int heap_pos)\n{\n  int *d_heap = heap->d_heap;\n  FMM_HeapNode* d_nodes = heap->d_nodes;\n  int d_heap_size = heap->d_heap_size;\n  int left_pos; \n  int right_pos;\n  LSMLIB_REAL cur_value;\n  LSMLIB_REAL left_value; \n  LSMLIB_REAL right_value;\n  int tmp;\n\n  int done = 0;\n  while ( !done && (d_heap_size > CHILD_LEFT_H(heap_pos)) ) {\n\n    left_pos = CHILD_LEFT_H(heap_pos);\n    right_pos = CHILD_RIGHT_H(heap_pos);\n    cur_value = d_nodes[d_heap[heap_pos]].value;\n    left_value = d_nodes[d_heap[left_pos]].value;\n    right_value = LSMLIB_REAL_MAX;\n\n    if (right_pos < d_heap_size) {\n      right_value = d_nodes[d_heap[right_pos]].value;\n    }\n\n    if ( (cur_value <= left_value) && (cur_value <= right_value) ) {\n      /* heap_pos is min, so we're done */ \n      done = 1;\n    } else if ( (left_value < cur_value) && (left_value <= right_value) ){\n      /* left child is min */\n\n      /* swap heap positions in d_nodes */\n      HEAP_POS(d_heap[heap_pos]) = left_pos;\n      HEAP_POS(d_heap[left_pos]) = heap_pos;\n\n      /* swap node handle with left child node handle in d_heap */\n      tmp = d_heap[heap_pos];\n      d_heap[heap_pos] = d_heap[left_pos];\n      d_heap[left_pos] = tmp;\n\n      /* set heap_pos to the left child of heap_pos */\n      heap_pos = left_pos;\n\n    } else if (right_pos < d_heap_size) {\n      /* right child is min */\n\n      /* swap heap positions in d_nodes */\n      HEAP_POS(d_heap[heap_pos]) = right_pos;\n      HEAP_POS(d_heap[right_pos]) = heap_pos;\n\n      /* swap node handle with right child node handle in d_heap */\n      tmp = d_heap[heap_pos];\n      d_heap[heap_pos] = d_heap[right_pos];\n      d_heap[right_pos] = tmp;\n\n      /* set heap_pos to the right child of heap_pos */\n      heap_pos = right_pos;\n\n    } \n  }\n\n}\n"
  },
  {
    "path": "OptolithiumC/libs/eikonal/src/FMM_eikonal2d.c",
    "content": "/*\n * File:        lsm_FMM_eikonal.c\n * Copyrights:  (c) 2005 The Trustees of Princeton University and Board of\n *                  Regents of the University of Texas.  All rights reserved.\n *              (c) 2009 Kevin T. Chu.  All rights reserved.\n * Revision:    $Revision: 149 $\n * Modified:    $Date: 2009-01-18 00:31:09 -0800 (Sun, 18 Jan 2009) $\n * Description: Implementation of Fast Marching Method for Eikonal equation\n */\n\n/*! \\file lsm_FMM_eikonal.c\n *\n * \\brief\n * @ref lsm_FMM_eikonal.c provides \"generic\" implementations of \n *      first- and second-order accurate Fast Marching Method schemes\n *      for solving the Eikonal equation.  The code is \"templated\" on \n *      the number of dimensions through the use of macro definitions \n *      that MUST be provided by the user.  \n *\n *\n * <h3> Usage: </h3>\n *\n * -# Define the following macros:\n *    -# FMM_NDIM:  the number of spatial dimensions.\n *    -# FMM_EIKONAL_SOLVE_EIKONAL_EQUATION:  desired name of function \n *       that solves the Eikonal equation.\n *    -# FMM_EIKONAL_INITIALIZE_FRONT:  desired name of function that\n *       initializes the values on the front.\n *    -# FMM_EIKONAL_UPDATE_GRID_POINT_ORDER1:  desired name of function \n *       that updates the value of the solution at grid points using\n *       a first-order accurate discretization\n *    -# FMM_EIKONAL_UPDATE_GRID_POINT_ORDER2:  desired name of function \n *       that updates the value of the solution at grid points using\n *       a second-order accurate discretization\n * -# Include this file at the end of the implementation file\n *    for the n-dimentsional Eikonal equation solver.\n * -# Compile code.\n *\n *\n * <h3> NOTES: </h3>\n * - Because this code depends on macros, care must be taken to \n *   ensure that macros do not conflict.\n *\n */\n\n#ifndef included_lsm_FMM_eikonal_c\n#define included_lsm_FMM_eikonal_c\n \n#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n#include <float.h>\n\n#include \"FMM_Config2d.h\"\n\n#include \"FMM_Core.h\"\n#include \"FMM_Heap.h\"\n#include \"FMM_Macros.h\"\n\n/*\n * This macro protect against misuse of the code in this file.  It will\n * cause the compiler to complain.\n */\n#ifndef FMM_NDIM\n#error \"lsm_FMM_eikonal: required macro FMM_NDIM not defined!\"\n#endif\n#ifndef FMM_EIKONAL_SOLVE_EIKONAL_EQUATION\n#error \"lsm_FMM_eikonal: required macro FMM_EIKONAL_SOLVE_EIKONAL_EQUATION not defined!\"\n#endif\n#ifndef FMM_EIKONAL_INITIALIZE_FRONT\n#error \"lsm_FMM_eikonal: required macro FMM_EIKONAL_INITIALIZE_FRONT not defined!\"\n#endif\n#ifndef FMM_EIKONAL_UPDATE_GRID_POINT_ORDER1\n#error \"lsm_FMM_eikonal: required macro FMM_EIKONAL_UPDATE_GRID_POINT_ORDER1 not defined!\"\n#endif\n#ifndef FMM_EIKONAL_UPDATE_GRID_POINT_ORDER2\n#error \"lsm_FMM_eikonal: required macro FMM_EIKONAL_UPDATE_GRID_POINT_ORDER2 not defined!\"\n#endif\n\n\n/*================== lsm_FMM_eikonal Data Structures ================*/\nstruct FMM_FieldData {\n  LSMLIB_REAL *phi;            /* solution to Eikonal equation */\n  const LSMLIB_REAL *speed;    /* speed function               */\n};\n\n\n/*============= FMM Eikonal Equation Solver Functions ===============*/\n\n/*\n * FMM_EIKONAL_INITIALIZE_FRONT() implements the callback\n * function required by FMM_Core::FMM_initializeFront() to find \n * and initialize the front.\n */\nvoid FMM_EIKONAL_INITIALIZE_FRONT(\n  FMM_CoreData *fmm_core_data,\n  FMM_FieldData *fmm_field_data,\n  int num_dims,\n  int *grid_dims,\n  LSMLIB_REAL *dx);\n\n/* \n * FMM_EIKONAL_UPDATE_GRID_POINT_ORDER1() implements the callback \n * function required by FMM_Core::FMM_Core_updateNeighbors() to\n * update the solution at a grid point.  It computes and returns \n * the updated phi value of the specified grid point using values of \n * neighbors that have status \"KNOWN\" and a first-order accurate \n * discretization of the gradient operator.\n */\nLSMLIB_REAL FMM_EIKONAL_UPDATE_GRID_POINT_ORDER1(\n  FMM_CoreData *fmm_core_data,\n  FMM_FieldData *fmm_field_data,\n  int *grid_idx,\n  int num_dims,\n  int *grid_dims,\n  LSMLIB_REAL *dx);\n\n/* \n * FMM_EIKONAL_UPDATE_GRID_POINT_ORDER2() implements the callback  \n * function required by FMM_Core::FMM_Core_updateNeighbors() to \n * update the solution at a grid point.  It computes and returns \n * the updated phi value of the specified grid point using values of \n * neighbors that have status \"KNOWN\" and a second-order accurate \n * discretization of the gradient operator when a sufficient number \n * of \"KNOWN\" neighboring grid points are available.  When there are\n * an insufficient number of \"KNOWN\" neighbors, the discretization\n * of the gradient drops to first-order accuracy.\n */\nLSMLIB_REAL FMM_EIKONAL_UPDATE_GRID_POINT_ORDER2(\n  FMM_CoreData *fmm_core_data,\n  FMM_FieldData *fmm_field_data,\n  int *grid_idx,\n  int num_dims,\n  int *grid_dims,\n  LSMLIB_REAL *dx);\n\n\n/*==================== Function Definitions =========================*/\n\n\nint FMM_EIKONAL_SOLVE_EIKONAL_EQUATION(\n  LSMLIB_REAL *phi,\n  const LSMLIB_REAL *speed,\n  LSMLIB_REAL *mask,\n  const int spatial_discretization_order,\n  const int *grid_dims,\n  const LSMLIB_REAL *dx)\n{\n  /* fast marching method data */\n  FMM_CoreData *fmm_core_data;\n  FMM_FieldData *fmm_field_data;\n\n  /* pointers to callback functions */\n  updateGridPointFuncPtr updateGridPoint;\n  initializeFrontFuncPtr initializeFront;\n\n  /* auxiliary variables */\n  int num_gridpoints;       /* number of grid points */\n  int i, idx;               /* loop variables */\n\n\n  /******************************************************\n   * set up appropriate grid point update and front\n   * detection/initialization functions based on the\n   * specified spatial derivative order\n   ******************************************************/\n  initializeFront = &FMM_EIKONAL_INITIALIZE_FRONT;\n  if (spatial_discretization_order == 1) {\n    updateGridPoint = &FMM_EIKONAL_UPDATE_GRID_POINT_ORDER1;\n  } else if (spatial_discretization_order == 2) {\n    updateGridPoint = &FMM_EIKONAL_UPDATE_GRID_POINT_ORDER2;\n  } else {\n    fprintf(stderr,\n           \"ERROR: Invalid spatial derivative order.  Only first-\\n\");\n    fprintf(stderr,\n           \"       and second-order finite differences supported.\\n\");\n    return LSM_FMM_ERR_INVALID_SPATIAL_DISCRETIZATION_ORDER;\n  }\n\n  /********************************************\n   * set up FMM Field Data\n   ********************************************/\n  fmm_field_data = (FMM_FieldData*) malloc(sizeof(FMM_FieldData));\n  if (!fmm_field_data) return LSM_FMM_ERR_FMM_DATA_CREATION_ERROR;\n  fmm_field_data->phi   = phi;\n  fmm_field_data->speed = speed;\n   \n  /********************************************\n   * initialize FMM Core Data\n   ********************************************/\n  fmm_core_data = FMM_Core_createFMM_CoreData(\n    fmm_field_data,\n    FMM_NDIM,\n    grid_dims,\n    dx,\n    initializeFront,\n    updateGridPoint);\n  if (!fmm_core_data) return LSM_FMM_ERR_FMM_DATA_CREATION_ERROR;\n\n  /********************************************\n   * initialize phi and mark grid points\n   * outside of the mathematical/physical \n   * domain\n   ********************************************/\n  num_gridpoints = 1;\n  for (i = 0; i < FMM_NDIM; i++) {\n    num_gridpoints *= grid_dims[i];\n  }\n\n  for (idx = 0; idx < num_gridpoints; idx++) {\n\n    /* temporary variables */\n    int grid_idx[FMM_NDIM];   /* grid index */\n    int idx_remainder = idx;\n\n    /* compute grid_idx */\n    for (i = 0; i < FMM_NDIM; i++) {\n      grid_idx[i] = idx_remainder%grid_dims[i];\n      idx_remainder -= grid_idx[i];\n      idx_remainder /= grid_dims[i];\n    }\n\n    /* grid points with a negative mask value are taken to */\n    /* be outside of the mathemtatical/physical domain     */\n    if ((mask) && (mask[idx] < 0)) {\n\n      FMM_Core_markPointOutsideDomain(fmm_core_data, grid_idx);\n\n      /* set phi to LSMLIB_REAL_MAX (i.e. infinity) */\n      phi[idx] = LSMLIB_REAL_MAX;\n    }\n\n    /* grid points with a non-positive speed are taken to */\n    /* be outside of the mathemtatical/physical domain    */\n    if (speed[idx] < LSMLIB_ZERO_TOL) {\n\n      FMM_Core_markPointOutsideDomain(fmm_core_data, grid_idx);\n\n      /* speed is zero, so set phi to be LSMLIB_REAL_MAX (i.e. infinity) */\n      phi[idx] = LSMLIB_REAL_MAX;\n    }\n\n  } /* end loop over grid to mark points outside of domain */ \n\n  /* initialize grid points around the front */ \n  FMM_Core_initializeFront(fmm_core_data); \n\n  /* update remaining grid points */\n  while (FMM_Core_moreGridPointsToUpdate(fmm_core_data)) {\n    FMM_Core_advanceFront(fmm_core_data);\n  }\n\n  /* clean up memory */\n  FMM_Core_destroyFMM_CoreData(fmm_core_data);\n  free(fmm_field_data);\n\n  return LSM_FMM_ERR_SUCCESS;\n}\n\nvoid FMM_EIKONAL_INITIALIZE_FRONT(\n  FMM_CoreData *fmm_core_data,\n  FMM_FieldData *fmm_field_data,\n  int num_dims,\n  int *grid_dims,\n  LSMLIB_REAL *dx)\n{\n  /* Grid point status */\n  int *gridpoint_status = FMM_Core_getGridPointStatusDataArray(fmm_core_data);\n\n  /* FMM Field Data variables */\n  LSMLIB_REAL *phi   = fmm_field_data->phi;\n\n  /* auxilliary variables */\n  int num_gridpoints;\n  int i,idx;         /* loop variables */\n\n  /* unused function parameters */\n  (void) num_dims;\n  (void) dx;\n\n  /*\n   * loop through cells in grid and initialize points on the boundary\n   * for Eikonal equation.\n   */\n  num_gridpoints = 1;\n  for (i = 0; i < FMM_NDIM; i++) {\n    num_gridpoints *= grid_dims[i];\n  }\n\n  for (idx = 0; idx < num_gridpoints; idx++) {\n\n    /* temporary variables */\n    int grid_idx[FMM_NDIM];\n    int idx_remainder = idx;\n\n    /* compute grid_idx */\n    for (i = 0; i < FMM_NDIM; i++) {\n      grid_idx[i] = idx_remainder%grid_dims[i];\n      idx_remainder -= grid_idx[i];\n      idx_remainder /= grid_dims[i];\n    }\n\n    /* set grid points on the initial front */\n    if (   (phi[idx] > -LSMLIB_ZERO_TOL) \n        && (gridpoint_status[idx] != OUTSIDE_DOMAIN) ) {\n\n      /* the value for phi(i,j) has already been provided */\n      FMM_Core_setInitialFrontPoint(fmm_core_data, grid_idx, phi[idx]);\n\n    }\n\n  }  /* end loop over grid */\n\n}\n\n\nLSMLIB_REAL FMM_EIKONAL_UPDATE_GRID_POINT_ORDER1(\n  FMM_CoreData *fmm_core_data,\n  FMM_FieldData *fmm_field_data,\n  int *grid_idx,\n  int num_dims,\n  int *grid_dims,\n  LSMLIB_REAL *dx)\n{\n  int *gridpoint_status = FMM_Core_getGridPointStatusDataArray(fmm_core_data);\n\n  /* FMM Field Data variables */\n  LSMLIB_REAL *phi   = fmm_field_data->phi; \n  const LSMLIB_REAL *speed = fmm_field_data->speed;\n\n  /* variables used in phi update */\n  PointStatus neighbor_status;\n  LSMLIB_REAL phi_upwind;\n  LSMLIB_REAL phi_plus;\n  LSMLIB_REAL inv_dx_sq; \n  int offset[FMM_NDIM]; \n  int neighbor[FMM_NDIM];\n\n  /* coefficients of quadratic equation for phi */\n  LSMLIB_REAL phi_A = 0;\n  LSMLIB_REAL phi_B = 0;\n  LSMLIB_REAL phi_C = 0;\n  LSMLIB_REAL discriminant;\n  LSMLIB_REAL phi_updated;\n\n  /* auxilliary variables */\n  int dir;  /* loop variable for spatial directions */\n  int l;    /* extra loop variable */ \n  int idx_cur_gridpoint, idx_neighbor;\n  int grid_idx_out_of_bounds;\n\n  /* unused function parameters */\n  (void) num_dims;\n\n  /* compute index for current grid point */\n  LSM_FMM_IDX(idx_cur_gridpoint, grid_idx, grid_dims);\n\n  /* calculate update to phi */\n  for (dir = 0; dir < FMM_NDIM; dir++) { \n\n    /* reset offset */\n    for (l = 0; l < FMM_NDIM; l++) { \n      offset[l] = 0; \n    }\n\n    /* find \"upwind\" direction and phi value */\n    phi_upwind = LSMLIB_REAL_MAX;\n\n    /* check minus direction */\n    offset[dir] = -1;\n    for (l = 0; l < FMM_NDIM; l++) { \n      neighbor[l] = grid_idx[l] + offset[l];\n    }\n    LSM_FMM_IDX_OUT_OF_BOUNDS(grid_idx_out_of_bounds,neighbor,grid_dims);\n    if (!grid_idx_out_of_bounds) {\n      LSM_FMM_IDX(idx_neighbor, neighbor, grid_dims);\n      neighbor_status = (PointStatus) gridpoint_status[idx_neighbor];\n      if (KNOWN == neighbor_status) {\n        phi_upwind = phi[idx_neighbor];\n      }\n    }\n\n    /* check plus direction */\n    offset[dir] = 1;\n    for (l = 0; l < FMM_NDIM; l++) { \n      neighbor[l] = grid_idx[l] + offset[l];\n    }\n    LSM_FMM_IDX_OUT_OF_BOUNDS(grid_idx_out_of_bounds,neighbor,grid_dims);\n    if (!grid_idx_out_of_bounds) {\n      LSM_FMM_IDX(idx_neighbor, neighbor, grid_dims);\n      neighbor_status = (PointStatus) gridpoint_status[idx_neighbor];\n      if (KNOWN == neighbor_status) {\n        phi_plus = phi[idx_neighbor];\n\n        /* \n         * choosing the upwind direction to be the direction\n         * with the smaller abs(phi) value gives a consistent \n         * solution to the \"upwind\" Eikonal equation.\n         */\n        if (LSM_FMM_ABS(phi_plus) < LSM_FMM_ABS(phi_upwind)) {\n          phi_upwind = phi_plus;\n        }\n      }\n    }\n\n    /*\n     * accumulate coefficients for phi if any of the neighbors are \"KNOWN\"\n     */\n    if (phi_upwind < LSMLIB_REAL_MAX) {\n      /* accumulate coefs for phi */ \n      inv_dx_sq = 1/dx[dir]; inv_dx_sq *= inv_dx_sq; \n      phi_A += inv_dx_sq;\n      phi_B += inv_dx_sq*phi_upwind;\n      phi_C += inv_dx_sq*phi_upwind*phi_upwind;\n    }\n\n  } /* loop over coordinate directions */\n\n  /* check that phi_A is nonzero */\n  if (LSM_FMM_ABS(phi_A) == 0) {\n    fprintf(stderr,\"ERROR: phi update - no KNOWN neighbors!!!\\n\");\n    fprintf(stderr,\"       phi set to 'infinity'.\\n\");\n    return LSMLIB_REAL_MAX;\n  }\n\n  /* complete computation of phi_B and phi_C */\n  phi_B *= -2.0;\n  phi_C -= 1/speed[idx_cur_gridpoint]/speed[idx_cur_gridpoint];\n\n  /* compute phi by solving quadratic equation */\n  discriminant = phi_B*phi_B - 4.0*phi_A*phi_C;\n  phi_updated = LSMLIB_REAL_MAX;\n  if (discriminant >= 0) {\n\n    phi_updated = 0.5*(-phi_B + sqrt(discriminant))/phi_A;\n\n  } else {\n\n    /* discriminant is negative ... set phi_updated to the    */\n    /* value of phi at the current grid point so that the     */\n    /* solution to the Eikonal equation is not corrupted by   */\n    /* infinities if it has already been assigned a value     */\n    /* based on a different set of KNOWN neighbors.           */\n    /* This situation occurs when the boundary data are not   */\n    /* completely self-consistent from the perspective of the */\n    /* discretized Eikonal equation.  Using the previously    */\n    /* computed value does not introduce any significant      */\n    /* errors into the numerical solution.                    */\n    phi_updated = phi[idx_cur_gridpoint]; \n\n  }\n\n  /* set phi at current grid point */\n  phi[idx_cur_gridpoint] = phi_updated;\n\n  return phi_updated;\n}\n\n\nLSMLIB_REAL FMM_EIKONAL_UPDATE_GRID_POINT_ORDER2(\n  FMM_CoreData *fmm_core_data,\n  FMM_FieldData *fmm_field_data,\n  int *grid_idx,\n  int num_dims,\n  int *grid_dims,\n  LSMLIB_REAL *dx)\n{\n  int *gridpoint_status = FMM_Core_getGridPointStatusDataArray(fmm_core_data);\n\n  /* FMM Field Data variables */\n  LSMLIB_REAL *phi   = fmm_field_data->phi; \n  const LSMLIB_REAL *speed = fmm_field_data->speed;\n\n  /* variables used in phi update */\n  PointStatus neighbor_status;\n  LSMLIB_REAL phi_upwind1, phi_upwind2;\n  LSMLIB_REAL phi_plus;\n  int second_order_switch;\n  LSMLIB_REAL inv_dx_sq; \n  int offset[FMM_NDIM]; \n  int neighbor1[FMM_NDIM];\n  int neighbor2[FMM_NDIM];\n\n  /* coefficients of quadratic equation for phi */\n  LSMLIB_REAL phi_A = 0;\n  LSMLIB_REAL phi_B = 0;\n  LSMLIB_REAL phi_C = 0;\n  LSMLIB_REAL discriminant;\n  LSMLIB_REAL phi_updated;\n\n  /* auxilliary variables */\n  int dir;  /* loop variable for spatial directions */\n  int l;    /* extra loop variable */ \n  int idx_cur_gridpoint, idx_neighbor1, idx_neighbor2;\n  int grid_idx_out_of_bounds;\n\n  /* unused function parameters */\n  (void) num_dims;\n\n  /* compute index for current grid point */\n  LSM_FMM_IDX(idx_cur_gridpoint, grid_idx, grid_dims);\n\n  /* calculate update to phi */\n  for (dir = 0; dir < FMM_NDIM; dir++) { \n\n    /* reset offset */\n    for (l = 0; l < FMM_NDIM; l++) { \n      offset[l] = 0; \n    }\n\n    /* reset phi_upwind1 and phi_upwind2 to LSMLIB_REAL_MAX */\n    phi_upwind1 = LSMLIB_REAL_MAX;\n    phi_upwind2 = LSMLIB_REAL_MAX;\n\n    /* reset second_order_switch to 0 (i.e. assume there are not enough */\n    /* KNOWN neighbors for second-order discretization.                 */\n    second_order_switch = 0;\n\n    /* check minus direction */\n    offset[dir] = -1;\n    for (l = 0; l < FMM_NDIM; l++) { \n      neighbor1[l] = grid_idx[l] + offset[l];\n      neighbor2[l] = grid_idx[l] + 2*offset[l];\n    }\n    LSM_FMM_IDX_OUT_OF_BOUNDS(grid_idx_out_of_bounds,neighbor1,grid_dims);\n    if (!grid_idx_out_of_bounds) {\n      LSM_FMM_IDX(idx_neighbor1, neighbor1, grid_dims);\n      neighbor_status = (PointStatus) gridpoint_status[idx_neighbor1];\n      if (KNOWN == neighbor_status) {\n        phi_upwind1 = phi[idx_neighbor1];\n\n        /* check for neighbor required for second-order accuracy */\n        LSM_FMM_IDX_OUT_OF_BOUNDS(grid_idx_out_of_bounds,neighbor2,grid_dims);\n        if (!grid_idx_out_of_bounds) {\n          LSM_FMM_IDX(idx_neighbor2, neighbor2, grid_dims);\n          neighbor_status = (PointStatus) gridpoint_status[idx_neighbor2];\n          if ( (KNOWN == neighbor_status) &&\n               (  LSM_FMM_ABS(phi[idx_neighbor2]) \n               <= LSM_FMM_ABS(phi_upwind1)) ) {\n            phi_upwind2 = phi[idx_neighbor2];\n            second_order_switch = 1;\n          }\n        } \n\n      } /* end case: first-order neighbor is KNOWN */\n    } \n\n    /* check plus direction */\n    offset[dir] = 1;\n    for (l = 0; l < FMM_NDIM; l++) { \n      neighbor1[l] = grid_idx[l] + offset[l];\n      neighbor2[l] = grid_idx[l] + 2*offset[l];\n    }\n    LSM_FMM_IDX_OUT_OF_BOUNDS(grid_idx_out_of_bounds,neighbor1,grid_dims);\n    if (!grid_idx_out_of_bounds) {\n      LSM_FMM_IDX(idx_neighbor1, neighbor1, grid_dims);\n      neighbor_status = (PointStatus) gridpoint_status[idx_neighbor1];\n      if (KNOWN == neighbor_status) {\n        phi_plus = phi[idx_neighbor1];\n\n        /* \n         * choosing the upwind direction to be the direction\n         * with the smaller abs(phi) value gives a consistent \n         * solution to the \"upwind\" Eikonal equation.\n         */\n        if (LSM_FMM_ABS(phi_plus) < LSM_FMM_ABS(phi_upwind1)) {\n          phi_upwind1 = phi_plus;\n          phi_upwind2 = LSMLIB_REAL_MAX;\n          second_order_switch = 0;\n\n          /* check for neighbor required for second-order accuracy */\n          LSM_FMM_IDX_OUT_OF_BOUNDS(grid_idx_out_of_bounds,neighbor2,grid_dims);\n          if (!grid_idx_out_of_bounds) {\n            LSM_FMM_IDX(idx_neighbor2, neighbor2, grid_dims);\n            neighbor_status = (PointStatus) gridpoint_status[idx_neighbor2];\n            if ( (KNOWN == neighbor_status) &&\n                 (  LSM_FMM_ABS(phi[idx_neighbor2]) \n                 <= LSM_FMM_ABS(phi_upwind1)) ) {\n              phi_upwind2 = phi[idx_neighbor2];\n              second_order_switch = 1;\n            }\n          } \n\n        }  /* end if: plus is upwind direction */\n      } /* end case: first-order neighbor is KNOWN */\n    }\n\n    /*\n     * accumulate coefficients for phi if any of the neighbors are \"KNOWN\"\n     */\n    if (phi_upwind1 < LSMLIB_REAL_MAX) {\n      /* temporary variables */\n      LSMLIB_REAL one_plus_switch_over_two = 1.0+0.5*second_order_switch;\n      LSMLIB_REAL phi_upwind_contrib;\n\n      /* set phi_upwind_contrib to be first- or second-order */\n      /* contribution based on value of second_order_switch  */\n      if (second_order_switch == 1) {\n        phi_upwind_contrib = 2.0*phi_upwind1 - 0.5*phi_upwind2;\n      } else {\n        phi_upwind_contrib = phi_upwind1;\n      }\n\n      /* accumulate coefs for phi */ \n      inv_dx_sq = 1/dx[dir]; inv_dx_sq *= inv_dx_sq; \n      phi_A += inv_dx_sq*one_plus_switch_over_two*one_plus_switch_over_two;\n      phi_B += inv_dx_sq*one_plus_switch_over_two*phi_upwind_contrib;\n      phi_C += inv_dx_sq*phi_upwind_contrib*phi_upwind_contrib;\n    }\n\n  } /* loop over coordinate directions */\n\n  /* check that phi_A is nonzero */\n  if (LSM_FMM_ABS(phi_A) == 0) {\n    fprintf(stderr,\"ERROR: phi update - no KNOWN neighbors!!!\\n\");\n    fprintf(stderr,\"       phi set to 'infinity'.\\n\");\n    return LSMLIB_REAL_MAX;\n  }\n\n  /* complete computation of phi_B and phi_C */\n  phi_B *= -2.0;\n  phi_C -= 1/speed[idx_cur_gridpoint]/speed[idx_cur_gridpoint];\n\n  /* compute phi by solving quadratic equation */\n  discriminant = phi_B*phi_B - 4.0*phi_A*phi_C;\n  phi_updated = LSMLIB_REAL_MAX;\n  if (discriminant >= 0) {\n\n    phi_updated = 0.5*(-phi_B + sqrt(discriminant))/phi_A;\n\n  } else {\n\n    /* discriminant is negative ... set phi_updated to the    */\n    /* value of phi at the current grid point so that the     */\n    /* solution to the Eikonal equation is not corrupted by   */\n    /* infinities if it has already been assigned a value     */\n    /* based on a different set of KNOWN neighbors.           */\n    /* This situation occurs when the boundary data are not   */\n    /* completely self-consistent from the perspective of the */\n    /* discretized Eikonal equation.  Using the previously    */\n    /* computed value does not introduce any significant      */\n    /* errors into the numerical solution.                    */\n    phi_updated = phi[idx_cur_gridpoint]; \n\n  }\n\n  /* set phi at current grid point */\n  phi[idx_cur_gridpoint] = phi_updated;\n\n  return phi_updated;\n}\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/eikonal/src/FMM_eikonal3d.c",
    "content": "/*\n * File:        lsm_FMM_eikonal.c\n * Copyrights:  (c) 2005 The Trustees of Princeton University and Board of\n *                  Regents of the University of Texas.  All rights reserved.\n *              (c) 2009 Kevin T. Chu.  All rights reserved.\n * Revision:    $Revision: 149 $\n * Modified:    $Date: 2009-01-18 00:31:09 -0800 (Sun, 18 Jan 2009) $\n * Description: Implementation of Fast Marching Method for Eikonal equation\n */\n\n/*! \\file lsm_FMM_eikonal.c\n *\n * \\brief\n * @ref lsm_FMM_eikonal.c provides \"generic\" implementations of \n *      first- and second-order accurate Fast Marching Method schemes\n *      for solving the Eikonal equation.  The code is \"templated\" on \n *      the number of dimensions through the use of macro definitions \n *      that MUST be provided by the user.  \n *\n *\n * <h3> Usage: </h3>\n *\n * -# Define the following macros:\n *    -# FMM_NDIM:  the number of spatial dimensions.\n *    -# FMM_EIKONAL_SOLVE_EIKONAL_EQUATION:  desired name of function \n *       that solves the Eikonal equation.\n *    -# FMM_EIKONAL_INITIALIZE_FRONT:  desired name of function that\n *       initializes the values on the front.\n *    -# FMM_EIKONAL_UPDATE_GRID_POINT_ORDER1:  desired name of function \n *       that updates the value of the solution at grid points using\n *       a first-order accurate discretization\n *    -# FMM_EIKONAL_UPDATE_GRID_POINT_ORDER2:  desired name of function \n *       that updates the value of the solution at grid points using\n *       a second-order accurate discretization\n * -# Include this file at the end of the implementation file\n *    for the n-dimentsional Eikonal equation solver.\n * -# Compile code.\n *\n *\n * <h3> NOTES: </h3>\n * - Because this code depends on macros, care must be taken to \n *   ensure that macros do not conflict.\n *\n */\n\n#ifndef included_lsm_FMM_eikonal_c\n#define included_lsm_FMM_eikonal_c\n \n#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n#include <float.h>\n\n#include \"FMM_Config3d.h\"\n\n#include \"FMM_Core.h\"\n#include \"FMM_Heap.h\"\n#include \"FMM_Macros.h\"\n\n/*\n * This macro protect against misuse of the code in this file.  It will\n * cause the compiler to complain.\n */\n#ifndef FMM_NDIM\n#error \"lsm_FMM_eikonal: required macro FMM_NDIM not defined!\"\n#endif\n#ifndef FMM_EIKONAL_SOLVE_EIKONAL_EQUATION\n#error \"lsm_FMM_eikonal: required macro FMM_EIKONAL_SOLVE_EIKONAL_EQUATION not defined!\"\n#endif\n#ifndef FMM_EIKONAL_INITIALIZE_FRONT\n#error \"lsm_FMM_eikonal: required macro FMM_EIKONAL_INITIALIZE_FRONT not defined!\"\n#endif\n#ifndef FMM_EIKONAL_UPDATE_GRID_POINT_ORDER1\n#error \"lsm_FMM_eikonal: required macro FMM_EIKONAL_UPDATE_GRID_POINT_ORDER1 not defined!\"\n#endif\n#ifndef FMM_EIKONAL_UPDATE_GRID_POINT_ORDER2\n#error \"lsm_FMM_eikonal: required macro FMM_EIKONAL_UPDATE_GRID_POINT_ORDER2 not defined!\"\n#endif\n\n\n/*================== lsm_FMM_eikonal Data Structures ================*/\nstruct FMM_FieldData {\n  LSMLIB_REAL *phi;            /* solution to Eikonal equation */\n  const LSMLIB_REAL *speed;    /* speed function               */\n};\n\n\n/*============= FMM Eikonal Equation Solver Functions ===============*/\n\n/*\n * FMM_EIKONAL_INITIALIZE_FRONT() implements the callback\n * function required by FMM_Core::FMM_initializeFront() to find \n * and initialize the front.\n */\nvoid FMM_EIKONAL_INITIALIZE_FRONT(\n  FMM_CoreData *fmm_core_data,\n  FMM_FieldData *fmm_field_data,\n  int num_dims,\n  int *grid_dims,\n  LSMLIB_REAL *dx);\n\n/* \n * FMM_EIKONAL_UPDATE_GRID_POINT_ORDER1() implements the callback \n * function required by FMM_Core::FMM_Core_updateNeighbors() to\n * update the solution at a grid point.  It computes and returns \n * the updated phi value of the specified grid point using values of \n * neighbors that have status \"KNOWN\" and a first-order accurate \n * discretization of the gradient operator.\n */\nLSMLIB_REAL FMM_EIKONAL_UPDATE_GRID_POINT_ORDER1(\n  FMM_CoreData *fmm_core_data,\n  FMM_FieldData *fmm_field_data,\n  int *grid_idx,\n  int num_dims,\n  int *grid_dims,\n  LSMLIB_REAL *dx);\n\n/* \n * FMM_EIKONAL_UPDATE_GRID_POINT_ORDER2() implements the callback  \n * function required by FMM_Core::FMM_Core_updateNeighbors() to \n * update the solution at a grid point.  It computes and returns \n * the updated phi value of the specified grid point using values of \n * neighbors that have status \"KNOWN\" and a second-order accurate \n * discretization of the gradient operator when a sufficient number \n * of \"KNOWN\" neighboring grid points are available.  When there are\n * an insufficient number of \"KNOWN\" neighbors, the discretization\n * of the gradient drops to first-order accuracy.\n */\nLSMLIB_REAL FMM_EIKONAL_UPDATE_GRID_POINT_ORDER2(\n  FMM_CoreData *fmm_core_data,\n  FMM_FieldData *fmm_field_data,\n  int *grid_idx,\n  int num_dims,\n  int *grid_dims,\n  LSMLIB_REAL *dx);\n\n\n/*==================== Function Definitions =========================*/\n\n\nint FMM_EIKONAL_SOLVE_EIKONAL_EQUATION(\n  LSMLIB_REAL *phi,\n  const LSMLIB_REAL *speed,\n  LSMLIB_REAL *mask,\n  const int spatial_discretization_order,\n  const int *grid_dims,\n  const LSMLIB_REAL *dx)\n{\n  /* fast marching method data */\n  FMM_CoreData *fmm_core_data;\n  FMM_FieldData *fmm_field_data;\n\n  /* pointers to callback functions */\n  updateGridPointFuncPtr updateGridPoint;\n  initializeFrontFuncPtr initializeFront;\n\n  /* auxiliary variables */\n  int num_gridpoints;       /* number of grid points */\n  int i, idx;               /* loop variables */\n\n\n  /******************************************************\n   * set up appropriate grid point update and front\n   * detection/initialization functions based on the\n   * specified spatial derivative order\n   ******************************************************/\n  initializeFront = &FMM_EIKONAL_INITIALIZE_FRONT;\n  if (spatial_discretization_order == 1) {\n    updateGridPoint = &FMM_EIKONAL_UPDATE_GRID_POINT_ORDER1;\n  } else if (spatial_discretization_order == 2) {\n    updateGridPoint = &FMM_EIKONAL_UPDATE_GRID_POINT_ORDER2;\n  } else {\n    fprintf(stderr,\n           \"ERROR: Invalid spatial derivative order.  Only first-\\n\");\n    fprintf(stderr,\n           \"       and second-order finite differences supported.\\n\");\n    return LSM_FMM_ERR_INVALID_SPATIAL_DISCRETIZATION_ORDER;\n  }\n\n  /********************************************\n   * set up FMM Field Data\n   ********************************************/\n  fmm_field_data = (FMM_FieldData*) malloc(sizeof(FMM_FieldData));\n  if (!fmm_field_data) return LSM_FMM_ERR_FMM_DATA_CREATION_ERROR;\n  fmm_field_data->phi   = phi;\n  fmm_field_data->speed = speed;\n   \n  /********************************************\n   * initialize FMM Core Data\n   ********************************************/\n  fmm_core_data = FMM_Core_createFMM_CoreData(\n    fmm_field_data,\n    FMM_NDIM,\n    grid_dims,\n    dx,\n    initializeFront,\n    updateGridPoint);\n  if (!fmm_core_data) return LSM_FMM_ERR_FMM_DATA_CREATION_ERROR;\n\n  /********************************************\n   * initialize phi and mark grid points\n   * outside of the mathematical/physical \n   * domain\n   ********************************************/\n  num_gridpoints = 1;\n  for (i = 0; i < FMM_NDIM; i++) {\n    num_gridpoints *= grid_dims[i];\n  }\n\n  for (idx = 0; idx < num_gridpoints; idx++) {\n\n    /* temporary variables */\n    int grid_idx[FMM_NDIM];   /* grid index */\n    int idx_remainder = idx;\n\n    /* compute grid_idx */\n    for (i = 0; i < FMM_NDIM; i++) {\n      grid_idx[i] = idx_remainder%grid_dims[i];\n      idx_remainder -= grid_idx[i];\n      idx_remainder /= grid_dims[i];\n    }\n\n    /* grid points with a negative mask value are taken to */\n    /* be outside of the mathemtatical/physical domain     */\n    if ((mask) && (mask[idx] < 0)) {\n\n      FMM_Core_markPointOutsideDomain(fmm_core_data, grid_idx);\n\n      /* set phi to LSMLIB_REAL_MAX (i.e. infinity) */\n      phi[idx] = LSMLIB_REAL_MAX;\n    }\n\n    /* grid points with a non-positive speed are taken to */\n    /* be outside of the mathemtatical/physical domain    */\n    if (speed[idx] < LSMLIB_ZERO_TOL) {\n\n      FMM_Core_markPointOutsideDomain(fmm_core_data, grid_idx);\n\n      /* speed is zero, so set phi to be LSMLIB_REAL_MAX (i.e. infinity) */\n      phi[idx] = LSMLIB_REAL_MAX;\n    }\n\n  } /* end loop over grid to mark points outside of domain */ \n\n  /* initialize grid points around the front */ \n  FMM_Core_initializeFront(fmm_core_data); \n\n  /* update remaining grid points */\n  while (FMM_Core_moreGridPointsToUpdate(fmm_core_data)) {\n    FMM_Core_advanceFront(fmm_core_data);\n  }\n\n  /* clean up memory */\n  FMM_Core_destroyFMM_CoreData(fmm_core_data);\n  free(fmm_field_data);\n\n  return LSM_FMM_ERR_SUCCESS;\n}\n\nvoid FMM_EIKONAL_INITIALIZE_FRONT(\n  FMM_CoreData *fmm_core_data,\n  FMM_FieldData *fmm_field_data,\n  int num_dims,\n  int *grid_dims,\n  LSMLIB_REAL *dx)\n{\n  /* Grid point status */\n  int *gridpoint_status = FMM_Core_getGridPointStatusDataArray(fmm_core_data);\n\n  /* FMM Field Data variables */\n  LSMLIB_REAL *phi   = fmm_field_data->phi;\n\n  /* auxilliary variables */\n  int num_gridpoints;\n  int i,idx;         /* loop variables */\n\n  /* unused function parameters */\n  (void) num_dims;\n  (void) dx;\n\n  /*\n   * loop through cells in grid and initialize points on the boundary\n   * for Eikonal equation.\n   */\n  num_gridpoints = 1;\n  for (i = 0; i < FMM_NDIM; i++) {\n    num_gridpoints *= grid_dims[i];\n  }\n\n  for (idx = 0; idx < num_gridpoints; idx++) {\n\n    /* temporary variables */\n    int grid_idx[FMM_NDIM];\n    int idx_remainder = idx;\n\n    /* compute grid_idx */\n    for (i = 0; i < FMM_NDIM; i++) {\n      grid_idx[i] = idx_remainder%grid_dims[i];\n      idx_remainder -= grid_idx[i];\n      idx_remainder /= grid_dims[i];\n    }\n\n    /* set grid points on the initial front */\n    if (   (phi[idx] > -LSMLIB_ZERO_TOL) \n        && (gridpoint_status[idx] != OUTSIDE_DOMAIN) ) {\n\n      /* the value for phi(i,j) has already been provided */\n      FMM_Core_setInitialFrontPoint(fmm_core_data, grid_idx, phi[idx]);\n\n    }\n\n  }  /* end loop over grid */\n\n}\n\n\nLSMLIB_REAL FMM_EIKONAL_UPDATE_GRID_POINT_ORDER1(\n  FMM_CoreData *fmm_core_data,\n  FMM_FieldData *fmm_field_data,\n  int *grid_idx,\n  int num_dims,\n  int *grid_dims,\n  LSMLIB_REAL *dx)\n{\n  int *gridpoint_status = FMM_Core_getGridPointStatusDataArray(fmm_core_data);\n\n  /* FMM Field Data variables */\n  LSMLIB_REAL *phi   = fmm_field_data->phi; \n  const LSMLIB_REAL *speed = fmm_field_data->speed;\n\n  /* variables used in phi update */\n  PointStatus neighbor_status;\n  LSMLIB_REAL phi_upwind;\n  LSMLIB_REAL phi_plus;\n  LSMLIB_REAL inv_dx_sq; \n  int offset[FMM_NDIM]; \n  int neighbor[FMM_NDIM];\n\n  /* coefficients of quadratic equation for phi */\n  LSMLIB_REAL phi_A = 0;\n  LSMLIB_REAL phi_B = 0;\n  LSMLIB_REAL phi_C = 0;\n  LSMLIB_REAL discriminant;\n  LSMLIB_REAL phi_updated;\n\n  /* auxilliary variables */\n  int dir;  /* loop variable for spatial directions */\n  int l;    /* extra loop variable */ \n  int idx_cur_gridpoint, idx_neighbor;\n  int grid_idx_out_of_bounds;\n\n  /* unused function parameters */\n  (void) num_dims;\n\n  /* compute index for current grid point */\n  LSM_FMM_IDX(idx_cur_gridpoint, grid_idx, grid_dims);\n\n  /* calculate update to phi */\n  for (dir = 0; dir < FMM_NDIM; dir++) { \n\n    /* reset offset */\n    for (l = 0; l < FMM_NDIM; l++) { \n      offset[l] = 0; \n    }\n\n    /* find \"upwind\" direction and phi value */\n    phi_upwind = LSMLIB_REAL_MAX;\n\n    /* check minus direction */\n    offset[dir] = -1;\n    for (l = 0; l < FMM_NDIM; l++) { \n      neighbor[l] = grid_idx[l] + offset[l];\n    }\n    LSM_FMM_IDX_OUT_OF_BOUNDS(grid_idx_out_of_bounds,neighbor,grid_dims);\n    if (!grid_idx_out_of_bounds) {\n      LSM_FMM_IDX(idx_neighbor, neighbor, grid_dims);\n      neighbor_status = (PointStatus) gridpoint_status[idx_neighbor];\n      if (KNOWN == neighbor_status) {\n        phi_upwind = phi[idx_neighbor];\n      }\n    }\n\n    /* check plus direction */\n    offset[dir] = 1;\n    for (l = 0; l < FMM_NDIM; l++) { \n      neighbor[l] = grid_idx[l] + offset[l];\n    }\n    LSM_FMM_IDX_OUT_OF_BOUNDS(grid_idx_out_of_bounds,neighbor,grid_dims);\n    if (!grid_idx_out_of_bounds) {\n      LSM_FMM_IDX(idx_neighbor, neighbor, grid_dims);\n      neighbor_status = (PointStatus) gridpoint_status[idx_neighbor];\n      if (KNOWN == neighbor_status) {\n        phi_plus = phi[idx_neighbor];\n\n        /* \n         * choosing the upwind direction to be the direction\n         * with the smaller abs(phi) value gives a consistent \n         * solution to the \"upwind\" Eikonal equation.\n         */\n        if (LSM_FMM_ABS(phi_plus) < LSM_FMM_ABS(phi_upwind)) {\n          phi_upwind = phi_plus;\n        }\n      }\n    }\n\n    /*\n     * accumulate coefficients for phi if any of the neighbors are \"KNOWN\"\n     */\n    if (phi_upwind < LSMLIB_REAL_MAX) {\n      /* accumulate coefs for phi */ \n      inv_dx_sq = 1/dx[dir]; inv_dx_sq *= inv_dx_sq; \n      phi_A += inv_dx_sq;\n      phi_B += inv_dx_sq*phi_upwind;\n      phi_C += inv_dx_sq*phi_upwind*phi_upwind;\n    }\n\n  } /* loop over coordinate directions */\n\n  /* check that phi_A is nonzero */\n  if (LSM_FMM_ABS(phi_A) == 0) {\n    fprintf(stderr,\"ERROR: phi update - no KNOWN neighbors!!!\\n\");\n    fprintf(stderr,\"       phi set to 'infinity'.\\n\");\n    return LSMLIB_REAL_MAX;\n  }\n\n  /* complete computation of phi_B and phi_C */\n  phi_B *= -2.0;\n  phi_C -= 1/speed[idx_cur_gridpoint]/speed[idx_cur_gridpoint];\n\n  /* compute phi by solving quadratic equation */\n  discriminant = phi_B*phi_B - 4.0*phi_A*phi_C;\n  phi_updated = LSMLIB_REAL_MAX;\n  if (discriminant >= 0) {\n\n    phi_updated = 0.5*(-phi_B + sqrt(discriminant))/phi_A;\n\n  } else {\n\n    /* discriminant is negative ... set phi_updated to the    */\n    /* value of phi at the current grid point so that the     */\n    /* solution to the Eikonal equation is not corrupted by   */\n    /* infinities if it has already been assigned a value     */\n    /* based on a different set of KNOWN neighbors.           */\n    /* This situation occurs when the boundary data are not   */\n    /* completely self-consistent from the perspective of the */\n    /* discretized Eikonal equation.  Using the previously    */\n    /* computed value does not introduce any significant      */\n    /* errors into the numerical solution.                    */\n    phi_updated = phi[idx_cur_gridpoint]; \n\n  }\n\n  /* set phi at current grid point */\n  phi[idx_cur_gridpoint] = phi_updated;\n\n  return phi_updated;\n}\n\n\nLSMLIB_REAL FMM_EIKONAL_UPDATE_GRID_POINT_ORDER2(\n  FMM_CoreData *fmm_core_data,\n  FMM_FieldData *fmm_field_data,\n  int *grid_idx,\n  int num_dims,\n  int *grid_dims,\n  LSMLIB_REAL *dx)\n{\n  int *gridpoint_status = FMM_Core_getGridPointStatusDataArray(fmm_core_data);\n\n  /* FMM Field Data variables */\n  LSMLIB_REAL *phi   = fmm_field_data->phi; \n  const LSMLIB_REAL *speed = fmm_field_data->speed;\n\n  /* variables used in phi update */\n  PointStatus neighbor_status;\n  LSMLIB_REAL phi_upwind1, phi_upwind2;\n  LSMLIB_REAL phi_plus;\n  int second_order_switch;\n  LSMLIB_REAL inv_dx_sq; \n  int offset[FMM_NDIM]; \n  int neighbor1[FMM_NDIM];\n  int neighbor2[FMM_NDIM];\n\n  /* coefficients of quadratic equation for phi */\n  LSMLIB_REAL phi_A = 0;\n  LSMLIB_REAL phi_B = 0;\n  LSMLIB_REAL phi_C = 0;\n  LSMLIB_REAL discriminant;\n  LSMLIB_REAL phi_updated;\n\n  /* auxilliary variables */\n  int dir;  /* loop variable for spatial directions */\n  int l;    /* extra loop variable */ \n  int idx_cur_gridpoint, idx_neighbor1, idx_neighbor2;\n  int grid_idx_out_of_bounds;\n\n  /* unused function parameters */\n  (void) num_dims;\n\n  /* compute index for current grid point */\n  LSM_FMM_IDX(idx_cur_gridpoint, grid_idx, grid_dims);\n\n  /* calculate update to phi */\n  for (dir = 0; dir < FMM_NDIM; dir++) { \n\n    /* reset offset */\n    for (l = 0; l < FMM_NDIM; l++) { \n      offset[l] = 0; \n    }\n\n    /* reset phi_upwind1 and phi_upwind2 to LSMLIB_REAL_MAX */\n    phi_upwind1 = LSMLIB_REAL_MAX;\n    phi_upwind2 = LSMLIB_REAL_MAX;\n\n    /* reset second_order_switch to 0 (i.e. assume there are not enough */\n    /* KNOWN neighbors for second-order discretization.                 */\n    second_order_switch = 0;\n\n    /* check minus direction */\n    offset[dir] = -1;\n    for (l = 0; l < FMM_NDIM; l++) { \n      neighbor1[l] = grid_idx[l] + offset[l];\n      neighbor2[l] = grid_idx[l] + 2*offset[l];\n    }\n    LSM_FMM_IDX_OUT_OF_BOUNDS(grid_idx_out_of_bounds,neighbor1,grid_dims);\n    if (!grid_idx_out_of_bounds) {\n      LSM_FMM_IDX(idx_neighbor1, neighbor1, grid_dims);\n      neighbor_status = (PointStatus) gridpoint_status[idx_neighbor1];\n      if (KNOWN == neighbor_status) {\n        phi_upwind1 = phi[idx_neighbor1];\n\n        /* check for neighbor required for second-order accuracy */\n        LSM_FMM_IDX_OUT_OF_BOUNDS(grid_idx_out_of_bounds,neighbor2,grid_dims);\n        if (!grid_idx_out_of_bounds) {\n          LSM_FMM_IDX(idx_neighbor2, neighbor2, grid_dims);\n          neighbor_status = (PointStatus) gridpoint_status[idx_neighbor2];\n          if ( (KNOWN == neighbor_status) &&\n               (  LSM_FMM_ABS(phi[idx_neighbor2]) \n               <= LSM_FMM_ABS(phi_upwind1)) ) {\n            phi_upwind2 = phi[idx_neighbor2];\n            second_order_switch = 1;\n          }\n        } \n\n      } /* end case: first-order neighbor is KNOWN */\n    } \n\n    /* check plus direction */\n    offset[dir] = 1;\n    for (l = 0; l < FMM_NDIM; l++) { \n      neighbor1[l] = grid_idx[l] + offset[l];\n      neighbor2[l] = grid_idx[l] + 2*offset[l];\n    }\n    LSM_FMM_IDX_OUT_OF_BOUNDS(grid_idx_out_of_bounds,neighbor1,grid_dims);\n    if (!grid_idx_out_of_bounds) {\n      LSM_FMM_IDX(idx_neighbor1, neighbor1, grid_dims);\n      neighbor_status = (PointStatus) gridpoint_status[idx_neighbor1];\n      if (KNOWN == neighbor_status) {\n        phi_plus = phi[idx_neighbor1];\n\n        /* \n         * choosing the upwind direction to be the direction\n         * with the smaller abs(phi) value gives a consistent \n         * solution to the \"upwind\" Eikonal equation.\n         */\n        if (LSM_FMM_ABS(phi_plus) < LSM_FMM_ABS(phi_upwind1)) {\n          phi_upwind1 = phi_plus;\n          phi_upwind2 = LSMLIB_REAL_MAX;\n          second_order_switch = 0;\n\n          /* check for neighbor required for second-order accuracy */\n          LSM_FMM_IDX_OUT_OF_BOUNDS(grid_idx_out_of_bounds,neighbor2,grid_dims);\n          if (!grid_idx_out_of_bounds) {\n            LSM_FMM_IDX(idx_neighbor2, neighbor2, grid_dims);\n            neighbor_status = (PointStatus) gridpoint_status[idx_neighbor2];\n            if ( (KNOWN == neighbor_status) &&\n                 (  LSM_FMM_ABS(phi[idx_neighbor2]) \n                 <= LSM_FMM_ABS(phi_upwind1)) ) {\n              phi_upwind2 = phi[idx_neighbor2];\n              second_order_switch = 1;\n            }\n          } \n\n        }  /* end if: plus is upwind direction */\n      } /* end case: first-order neighbor is KNOWN */\n    }\n\n    /*\n     * accumulate coefficients for phi if any of the neighbors are \"KNOWN\"\n     */\n    if (phi_upwind1 < LSMLIB_REAL_MAX) {\n      /* temporary variables */\n      LSMLIB_REAL one_plus_switch_over_two = 1.0+0.5*second_order_switch;\n      LSMLIB_REAL phi_upwind_contrib;\n\n      /* set phi_upwind_contrib to be first- or second-order */\n      /* contribution based on value of second_order_switch  */\n      if (second_order_switch == 1) {\n        phi_upwind_contrib = 2.0*phi_upwind1 - 0.5*phi_upwind2;\n      } else {\n        phi_upwind_contrib = phi_upwind1;\n      }\n\n      /* accumulate coefs for phi */ \n      inv_dx_sq = 1/dx[dir]; inv_dx_sq *= inv_dx_sq; \n      phi_A += inv_dx_sq*one_plus_switch_over_two*one_plus_switch_over_two;\n      phi_B += inv_dx_sq*one_plus_switch_over_two*phi_upwind_contrib;\n      phi_C += inv_dx_sq*phi_upwind_contrib*phi_upwind_contrib;\n    }\n\n  } /* loop over coordinate directions */\n\n  /* check that phi_A is nonzero */\n  if (LSM_FMM_ABS(phi_A) == 0) {\n    fprintf(stderr,\"ERROR: phi update - no KNOWN neighbors!!!\\n\");\n    fprintf(stderr,\"       phi set to 'infinity'.\\n\");\n    return LSMLIB_REAL_MAX;\n  }\n\n  /* complete computation of phi_B and phi_C */\n  phi_B *= -2.0;\n  phi_C -= 1/speed[idx_cur_gridpoint]/speed[idx_cur_gridpoint];\n\n  /* compute phi by solving quadratic equation */\n  discriminant = phi_B*phi_B - 4.0*phi_A*phi_C;\n  phi_updated = LSMLIB_REAL_MAX;\n  if (discriminant >= 0) {\n\n    phi_updated = 0.5*(-phi_B + sqrt(discriminant))/phi_A;\n\n  } else {\n\n    /* discriminant is negative ... set phi_updated to the    */\n    /* value of phi at the current grid point so that the     */\n    /* solution to the Eikonal equation is not corrupted by   */\n    /* infinities if it has already been assigned a value     */\n    /* based on a different set of KNOWN neighbors.           */\n    /* This situation occurs when the boundary data are not   */\n    /* completely self-consistent from the perspective of the */\n    /* discretized Eikonal equation.  Using the previously    */\n    /* computed value does not introduce any significant      */\n    /* errors into the numerical solution.                    */\n    phi_updated = phi[idx_cur_gridpoint]; \n\n  }\n\n  /* set phi at current grid point */\n  phi[idx_cur_gridpoint] = phi_updated;\n\n  return phi_updated;\n}\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/fftw3-win32/fftw3.f",
    "content": "      INTEGER FFTW_R2HC\r\n      PARAMETER (FFTW_R2HC=0)\r\n      INTEGER FFTW_HC2R\r\n      PARAMETER (FFTW_HC2R=1)\r\n      INTEGER FFTW_DHT\r\n      PARAMETER (FFTW_DHT=2)\r\n      INTEGER FFTW_REDFT00\r\n      PARAMETER (FFTW_REDFT00=3)\r\n      INTEGER FFTW_REDFT01\r\n      PARAMETER (FFTW_REDFT01=4)\r\n      INTEGER FFTW_REDFT10\r\n      PARAMETER (FFTW_REDFT10=5)\r\n      INTEGER FFTW_REDFT11\r\n      PARAMETER (FFTW_REDFT11=6)\r\n      INTEGER FFTW_RODFT00\r\n      PARAMETER (FFTW_RODFT00=7)\r\n      INTEGER FFTW_RODFT01\r\n      PARAMETER (FFTW_RODFT01=8)\r\n      INTEGER FFTW_RODFT10\r\n      PARAMETER (FFTW_RODFT10=9)\r\n      INTEGER FFTW_RODFT11\r\n      PARAMETER (FFTW_RODFT11=10)\r\n      INTEGER FFTW_FORWARD\r\n      PARAMETER (FFTW_FORWARD=-1)\r\n      INTEGER FFTW_BACKWARD\r\n      PARAMETER (FFTW_BACKWARD=+1)\r\n      INTEGER FFTW_MEASURE\r\n      PARAMETER (FFTW_MEASURE=0)\r\n      INTEGER FFTW_DESTROY_INPUT\r\n      PARAMETER (FFTW_DESTROY_INPUT=1)\r\n      INTEGER FFTW_UNALIGNED\r\n      PARAMETER (FFTW_UNALIGNED=2)\r\n      INTEGER FFTW_CONSERVE_MEMORY\r\n      PARAMETER (FFTW_CONSERVE_MEMORY=4)\r\n      INTEGER FFTW_EXHAUSTIVE\r\n      PARAMETER (FFTW_EXHAUSTIVE=8)\r\n      INTEGER FFTW_PRESERVE_INPUT\r\n      PARAMETER (FFTW_PRESERVE_INPUT=16)\r\n      INTEGER FFTW_PATIENT\r\n      PARAMETER (FFTW_PATIENT=32)\r\n      INTEGER FFTW_ESTIMATE\r\n      PARAMETER (FFTW_ESTIMATE=64)\r\n      INTEGER FFTW_WISDOM_ONLY\r\n      PARAMETER (FFTW_WISDOM_ONLY=2097152)\r\n      INTEGER FFTW_ESTIMATE_PATIENT\r\n      PARAMETER (FFTW_ESTIMATE_PATIENT=128)\r\n      INTEGER FFTW_BELIEVE_PCOST\r\n      PARAMETER (FFTW_BELIEVE_PCOST=256)\r\n      INTEGER FFTW_NO_DFT_R2HC\r\n      PARAMETER (FFTW_NO_DFT_R2HC=512)\r\n      INTEGER FFTW_NO_NONTHREADED\r\n      PARAMETER (FFTW_NO_NONTHREADED=1024)\r\n      INTEGER FFTW_NO_BUFFERING\r\n      PARAMETER (FFTW_NO_BUFFERING=2048)\r\n      INTEGER FFTW_NO_INDIRECT_OP\r\n      PARAMETER (FFTW_NO_INDIRECT_OP=4096)\r\n      INTEGER FFTW_ALLOW_LARGE_GENERIC\r\n      PARAMETER (FFTW_ALLOW_LARGE_GENERIC=8192)\r\n      INTEGER FFTW_NO_RANK_SPLITS\r\n      PARAMETER (FFTW_NO_RANK_SPLITS=16384)\r\n      INTEGER FFTW_NO_VRANK_SPLITS\r\n      PARAMETER (FFTW_NO_VRANK_SPLITS=32768)\r\n      INTEGER FFTW_NO_VRECURSE\r\n      PARAMETER (FFTW_NO_VRECURSE=65536)\r\n      INTEGER FFTW_NO_SIMD\r\n      PARAMETER (FFTW_NO_SIMD=131072)\r\n      INTEGER FFTW_NO_SLOW\r\n      PARAMETER (FFTW_NO_SLOW=262144)\r\n      INTEGER FFTW_NO_FIXED_RADIX_LARGE_N\r\n      PARAMETER (FFTW_NO_FIXED_RADIX_LARGE_N=524288)\r\n      INTEGER FFTW_ALLOW_PRUNING\r\n      PARAMETER (FFTW_ALLOW_PRUNING=1048576)\r\n"
  },
  {
    "path": "OptolithiumC/libs/fftw3-win32/fftw3.f03",
    "content": "! Generated automatically.  DO NOT EDIT!\r\n\r\n  integer, parameter :: C_FFTW_R2R_KIND = C_INT32_T\r\n\r\n  integer(C_INT), parameter :: FFTW_R2HC = 0\r\n  integer(C_INT), parameter :: FFTW_HC2R = 1\r\n  integer(C_INT), parameter :: FFTW_DHT = 2\r\n  integer(C_INT), parameter :: FFTW_REDFT00 = 3\r\n  integer(C_INT), parameter :: FFTW_REDFT01 = 4\r\n  integer(C_INT), parameter :: FFTW_REDFT10 = 5\r\n  integer(C_INT), parameter :: FFTW_REDFT11 = 6\r\n  integer(C_INT), parameter :: FFTW_RODFT00 = 7\r\n  integer(C_INT), parameter :: FFTW_RODFT01 = 8\r\n  integer(C_INT), parameter :: FFTW_RODFT10 = 9\r\n  integer(C_INT), parameter :: FFTW_RODFT11 = 10\r\n  integer(C_INT), parameter :: FFTW_FORWARD = -1\r\n  integer(C_INT), parameter :: FFTW_BACKWARD = +1\r\n  integer(C_INT), parameter :: FFTW_MEASURE = 0\r\n  integer(C_INT), parameter :: FFTW_DESTROY_INPUT = 1\r\n  integer(C_INT), parameter :: FFTW_UNALIGNED = 2\r\n  integer(C_INT), parameter :: FFTW_CONSERVE_MEMORY = 4\r\n  integer(C_INT), parameter :: FFTW_EXHAUSTIVE = 8\r\n  integer(C_INT), parameter :: FFTW_PRESERVE_INPUT = 16\r\n  integer(C_INT), parameter :: FFTW_PATIENT = 32\r\n  integer(C_INT), parameter :: FFTW_ESTIMATE = 64\r\n  integer(C_INT), parameter :: FFTW_WISDOM_ONLY = 2097152\r\n  integer(C_INT), parameter :: FFTW_ESTIMATE_PATIENT = 128\r\n  integer(C_INT), parameter :: FFTW_BELIEVE_PCOST = 256\r\n  integer(C_INT), parameter :: FFTW_NO_DFT_R2HC = 512\r\n  integer(C_INT), parameter :: FFTW_NO_NONTHREADED = 1024\r\n  integer(C_INT), parameter :: FFTW_NO_BUFFERING = 2048\r\n  integer(C_INT), parameter :: FFTW_NO_INDIRECT_OP = 4096\r\n  integer(C_INT), parameter :: FFTW_ALLOW_LARGE_GENERIC = 8192\r\n  integer(C_INT), parameter :: FFTW_NO_RANK_SPLITS = 16384\r\n  integer(C_INT), parameter :: FFTW_NO_VRANK_SPLITS = 32768\r\n  integer(C_INT), parameter :: FFTW_NO_VRECURSE = 65536\r\n  integer(C_INT), parameter :: FFTW_NO_SIMD = 131072\r\n  integer(C_INT), parameter :: FFTW_NO_SLOW = 262144\r\n  integer(C_INT), parameter :: FFTW_NO_FIXED_RADIX_LARGE_N = 524288\r\n  integer(C_INT), parameter :: FFTW_ALLOW_PRUNING = 1048576\r\n\r\n  type, bind(C) :: fftw_iodim\r\n     integer(C_INT) n, is, os\r\n  end type fftw_iodim\r\n  type, bind(C) :: fftw_iodim64\r\n     integer(C_INTPTR_T) n, is, os\r\n  end type fftw_iodim64\r\n\r\n  interface\r\n    type(C_PTR) function fftw_plan_dft(rank,n,in,out,sign,flags) bind(C, name='fftw_plan_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_dft\r\n    \r\n    type(C_PTR) function fftw_plan_dft_1d(n,in,out,sign,flags) bind(C, name='fftw_plan_dft_1d')\r\n      import\r\n      integer(C_INT), value :: n\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_dft_1d\r\n    \r\n    type(C_PTR) function fftw_plan_dft_2d(n0,n1,in,out,sign,flags) bind(C, name='fftw_plan_dft_2d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_dft_2d\r\n    \r\n    type(C_PTR) function fftw_plan_dft_3d(n0,n1,n2,in,out,sign,flags) bind(C, name='fftw_plan_dft_3d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      integer(C_INT), value :: n2\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_dft_3d\r\n    \r\n    type(C_PTR) function fftw_plan_many_dft(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,sign,flags) &\r\n                         bind(C, name='fftw_plan_many_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      integer(C_INT), value :: howmany\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      integer(C_INT), dimension(*), intent(in) :: inembed\r\n      integer(C_INT), value :: istride\r\n      integer(C_INT), value :: idist\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), dimension(*), intent(in) :: onembed\r\n      integer(C_INT), value :: ostride\r\n      integer(C_INT), value :: odist\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_many_dft\r\n    \r\n    type(C_PTR) function fftw_plan_guru_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) &\r\n                         bind(C, name='fftw_plan_guru_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftw_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftw_iodim), dimension(*), intent(in) :: howmany_dims\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_guru_dft\r\n    \r\n    type(C_PTR) function fftw_plan_guru_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) &\r\n                         bind(C, name='fftw_plan_guru_split_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftw_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftw_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(C_DOUBLE), dimension(*), intent(out) :: ri\r\n      real(C_DOUBLE), dimension(*), intent(out) :: ii\r\n      real(C_DOUBLE), dimension(*), intent(out) :: ro\r\n      real(C_DOUBLE), dimension(*), intent(out) :: io\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_guru_split_dft\r\n    \r\n    type(C_PTR) function fftw_plan_guru64_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) &\r\n                         bind(C, name='fftw_plan_guru64_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftw_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_guru64_dft\r\n    \r\n    type(C_PTR) function fftw_plan_guru64_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) &\r\n                         bind(C, name='fftw_plan_guru64_split_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftw_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(C_DOUBLE), dimension(*), intent(out) :: ri\r\n      real(C_DOUBLE), dimension(*), intent(out) :: ii\r\n      real(C_DOUBLE), dimension(*), intent(out) :: ro\r\n      real(C_DOUBLE), dimension(*), intent(out) :: io\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_guru64_split_dft\r\n    \r\n    subroutine fftw_execute_dft(p,in,out) bind(C, name='fftw_execute_dft')\r\n      import\r\n      type(C_PTR), value :: p\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(inout) :: in\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n    end subroutine fftw_execute_dft\r\n    \r\n    subroutine fftw_execute_split_dft(p,ri,ii,ro,io) bind(C, name='fftw_execute_split_dft')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_DOUBLE), dimension(*), intent(inout) :: ri\r\n      real(C_DOUBLE), dimension(*), intent(inout) :: ii\r\n      real(C_DOUBLE), dimension(*), intent(out) :: ro\r\n      real(C_DOUBLE), dimension(*), intent(out) :: io\r\n    end subroutine fftw_execute_split_dft\r\n    \r\n    type(C_PTR) function fftw_plan_many_dft_r2c(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) &\r\n                         bind(C, name='fftw_plan_many_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      integer(C_INT), value :: howmany\r\n      real(C_DOUBLE), dimension(*), intent(out) :: in\r\n      integer(C_INT), dimension(*), intent(in) :: inembed\r\n      integer(C_INT), value :: istride\r\n      integer(C_INT), value :: idist\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), dimension(*), intent(in) :: onembed\r\n      integer(C_INT), value :: ostride\r\n      integer(C_INT), value :: odist\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_many_dft_r2c\r\n    \r\n    type(C_PTR) function fftw_plan_dft_r2c(rank,n,in,out,flags) bind(C, name='fftw_plan_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      real(C_DOUBLE), dimension(*), intent(out) :: in\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_dft_r2c\r\n    \r\n    type(C_PTR) function fftw_plan_dft_r2c_1d(n,in,out,flags) bind(C, name='fftw_plan_dft_r2c_1d')\r\n      import\r\n      integer(C_INT), value :: n\r\n      real(C_DOUBLE), dimension(*), intent(out) :: in\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_dft_r2c_1d\r\n    \r\n    type(C_PTR) function fftw_plan_dft_r2c_2d(n0,n1,in,out,flags) bind(C, name='fftw_plan_dft_r2c_2d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      real(C_DOUBLE), dimension(*), intent(out) :: in\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_dft_r2c_2d\r\n    \r\n    type(C_PTR) function fftw_plan_dft_r2c_3d(n0,n1,n2,in,out,flags) bind(C, name='fftw_plan_dft_r2c_3d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      integer(C_INT), value :: n2\r\n      real(C_DOUBLE), dimension(*), intent(out) :: in\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_dft_r2c_3d\r\n    \r\n    type(C_PTR) function fftw_plan_many_dft_c2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) &\r\n                         bind(C, name='fftw_plan_many_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      integer(C_INT), value :: howmany\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      integer(C_INT), dimension(*), intent(in) :: inembed\r\n      integer(C_INT), value :: istride\r\n      integer(C_INT), value :: idist\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), dimension(*), intent(in) :: onembed\r\n      integer(C_INT), value :: ostride\r\n      integer(C_INT), value :: odist\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_many_dft_c2r\r\n    \r\n    type(C_PTR) function fftw_plan_dft_c2r(rank,n,in,out,flags) bind(C, name='fftw_plan_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_dft_c2r\r\n    \r\n    type(C_PTR) function fftw_plan_dft_c2r_1d(n,in,out,flags) bind(C, name='fftw_plan_dft_c2r_1d')\r\n      import\r\n      integer(C_INT), value :: n\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_dft_c2r_1d\r\n    \r\n    type(C_PTR) function fftw_plan_dft_c2r_2d(n0,n1,in,out,flags) bind(C, name='fftw_plan_dft_c2r_2d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_dft_c2r_2d\r\n    \r\n    type(C_PTR) function fftw_plan_dft_c2r_3d(n0,n1,n2,in,out,flags) bind(C, name='fftw_plan_dft_c2r_3d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      integer(C_INT), value :: n2\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_dft_c2r_3d\r\n    \r\n    type(C_PTR) function fftw_plan_guru_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) &\r\n                         bind(C, name='fftw_plan_guru_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftw_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftw_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(C_DOUBLE), dimension(*), intent(out) :: in\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_guru_dft_r2c\r\n    \r\n    type(C_PTR) function fftw_plan_guru_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) &\r\n                         bind(C, name='fftw_plan_guru_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftw_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftw_iodim), dimension(*), intent(in) :: howmany_dims\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_guru_dft_c2r\r\n    \r\n    type(C_PTR) function fftw_plan_guru_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) &\r\n                         bind(C, name='fftw_plan_guru_split_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftw_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftw_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(C_DOUBLE), dimension(*), intent(out) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: ro\r\n      real(C_DOUBLE), dimension(*), intent(out) :: io\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_guru_split_dft_r2c\r\n    \r\n    type(C_PTR) function fftw_plan_guru_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) &\r\n                         bind(C, name='fftw_plan_guru_split_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftw_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftw_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(C_DOUBLE), dimension(*), intent(out) :: ri\r\n      real(C_DOUBLE), dimension(*), intent(out) :: ii\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_guru_split_dft_c2r\r\n    \r\n    type(C_PTR) function fftw_plan_guru64_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) &\r\n                         bind(C, name='fftw_plan_guru64_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftw_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(C_DOUBLE), dimension(*), intent(out) :: in\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_guru64_dft_r2c\r\n    \r\n    type(C_PTR) function fftw_plan_guru64_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) &\r\n                         bind(C, name='fftw_plan_guru64_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftw_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_guru64_dft_c2r\r\n    \r\n    type(C_PTR) function fftw_plan_guru64_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) &\r\n                         bind(C, name='fftw_plan_guru64_split_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftw_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(C_DOUBLE), dimension(*), intent(out) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: ro\r\n      real(C_DOUBLE), dimension(*), intent(out) :: io\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_guru64_split_dft_r2c\r\n    \r\n    type(C_PTR) function fftw_plan_guru64_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) &\r\n                         bind(C, name='fftw_plan_guru64_split_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftw_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(C_DOUBLE), dimension(*), intent(out) :: ri\r\n      real(C_DOUBLE), dimension(*), intent(out) :: ii\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_guru64_split_dft_c2r\r\n    \r\n    subroutine fftw_execute_dft_r2c(p,in,out) bind(C, name='fftw_execute_dft_r2c')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_DOUBLE), dimension(*), intent(inout) :: in\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n    end subroutine fftw_execute_dft_r2c\r\n    \r\n    subroutine fftw_execute_dft_c2r(p,in,out) bind(C, name='fftw_execute_dft_c2r')\r\n      import\r\n      type(C_PTR), value :: p\r\n      complex(C_DOUBLE_COMPLEX), dimension(*), intent(inout) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n    end subroutine fftw_execute_dft_c2r\r\n    \r\n    subroutine fftw_execute_split_dft_r2c(p,in,ro,io) bind(C, name='fftw_execute_split_dft_r2c')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_DOUBLE), dimension(*), intent(inout) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: ro\r\n      real(C_DOUBLE), dimension(*), intent(out) :: io\r\n    end subroutine fftw_execute_split_dft_r2c\r\n    \r\n    subroutine fftw_execute_split_dft_c2r(p,ri,ii,out) bind(C, name='fftw_execute_split_dft_c2r')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_DOUBLE), dimension(*), intent(inout) :: ri\r\n      real(C_DOUBLE), dimension(*), intent(inout) :: ii\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n    end subroutine fftw_execute_split_dft_c2r\r\n    \r\n    type(C_PTR) function fftw_plan_many_r2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,kind,flags) &\r\n                         bind(C, name='fftw_plan_many_r2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      integer(C_INT), value :: howmany\r\n      real(C_DOUBLE), dimension(*), intent(out) :: in\r\n      integer(C_INT), dimension(*), intent(in) :: inembed\r\n      integer(C_INT), value :: istride\r\n      integer(C_INT), value :: idist\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), dimension(*), intent(in) :: onembed\r\n      integer(C_INT), value :: ostride\r\n      integer(C_INT), value :: odist\r\n      integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_many_r2r\r\n    \r\n    type(C_PTR) function fftw_plan_r2r(rank,n,in,out,kind,flags) bind(C, name='fftw_plan_r2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      real(C_DOUBLE), dimension(*), intent(out) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_r2r\r\n    \r\n    type(C_PTR) function fftw_plan_r2r_1d(n,in,out,kind,flags) bind(C, name='fftw_plan_r2r_1d')\r\n      import\r\n      integer(C_INT), value :: n\r\n      real(C_DOUBLE), dimension(*), intent(out) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), value :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_r2r_1d\r\n    \r\n    type(C_PTR) function fftw_plan_r2r_2d(n0,n1,in,out,kind0,kind1,flags) bind(C, name='fftw_plan_r2r_2d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      real(C_DOUBLE), dimension(*), intent(out) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), value :: kind0\r\n      integer(C_FFTW_R2R_KIND), value :: kind1\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_r2r_2d\r\n    \r\n    type(C_PTR) function fftw_plan_r2r_3d(n0,n1,n2,in,out,kind0,kind1,kind2,flags) bind(C, name='fftw_plan_r2r_3d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      integer(C_INT), value :: n2\r\n      real(C_DOUBLE), dimension(*), intent(out) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), value :: kind0\r\n      integer(C_FFTW_R2R_KIND), value :: kind1\r\n      integer(C_FFTW_R2R_KIND), value :: kind2\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_r2r_3d\r\n    \r\n    type(C_PTR) function fftw_plan_guru_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) &\r\n                         bind(C, name='fftw_plan_guru_r2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftw_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftw_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(C_DOUBLE), dimension(*), intent(out) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_guru_r2r\r\n    \r\n    type(C_PTR) function fftw_plan_guru64_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) &\r\n                         bind(C, name='fftw_plan_guru64_r2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftw_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(C_DOUBLE), dimension(*), intent(out) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftw_plan_guru64_r2r\r\n    \r\n    subroutine fftw_execute_r2r(p,in,out) bind(C, name='fftw_execute_r2r')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_DOUBLE), dimension(*), intent(inout) :: in\r\n      real(C_DOUBLE), dimension(*), intent(out) :: out\r\n    end subroutine fftw_execute_r2r\r\n    \r\n    subroutine fftw_destroy_plan(p) bind(C, name='fftw_destroy_plan')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end subroutine fftw_destroy_plan\r\n    \r\n    subroutine fftw_forget_wisdom() bind(C, name='fftw_forget_wisdom')\r\n      import\r\n    end subroutine fftw_forget_wisdom\r\n    \r\n    subroutine fftw_cleanup() bind(C, name='fftw_cleanup')\r\n      import\r\n    end subroutine fftw_cleanup\r\n    \r\n    subroutine fftw_set_timelimit(t) bind(C, name='fftw_set_timelimit')\r\n      import\r\n      real(C_DOUBLE), value :: t\r\n    end subroutine fftw_set_timelimit\r\n    \r\n    subroutine fftw_plan_with_nthreads(nthreads) bind(C, name='fftw_plan_with_nthreads')\r\n      import\r\n      integer(C_INT), value :: nthreads\r\n    end subroutine fftw_plan_with_nthreads\r\n    \r\n    integer(C_INT) function fftw_init_threads() bind(C, name='fftw_init_threads')\r\n      import\r\n    end function fftw_init_threads\r\n    \r\n    subroutine fftw_cleanup_threads() bind(C, name='fftw_cleanup_threads')\r\n      import\r\n    end subroutine fftw_cleanup_threads\r\n    \r\n    integer(C_INT) function fftw_export_wisdom_to_filename(filename) bind(C, name='fftw_export_wisdom_to_filename')\r\n      import\r\n      character(C_CHAR), dimension(*), intent(in) :: filename\r\n    end function fftw_export_wisdom_to_filename\r\n    \r\n    subroutine fftw_export_wisdom_to_file(output_file) bind(C, name='fftw_export_wisdom_to_file')\r\n      import\r\n      type(C_PTR), value :: output_file\r\n    end subroutine fftw_export_wisdom_to_file\r\n    \r\n    type(C_PTR) function fftw_export_wisdom_to_string() bind(C, name='fftw_export_wisdom_to_string')\r\n      import\r\n    end function fftw_export_wisdom_to_string\r\n    \r\n    subroutine fftw_export_wisdom(write_char,data) bind(C, name='fftw_export_wisdom')\r\n      import\r\n      type(C_FUNPTR), value :: write_char\r\n      type(C_PTR), value :: data\r\n    end subroutine fftw_export_wisdom\r\n    \r\n    integer(C_INT) function fftw_import_system_wisdom() bind(C, name='fftw_import_system_wisdom')\r\n      import\r\n    end function fftw_import_system_wisdom\r\n    \r\n    integer(C_INT) function fftw_import_wisdom_from_filename(filename) bind(C, name='fftw_import_wisdom_from_filename')\r\n      import\r\n      character(C_CHAR), dimension(*), intent(in) :: filename\r\n    end function fftw_import_wisdom_from_filename\r\n    \r\n    integer(C_INT) function fftw_import_wisdom_from_file(input_file) bind(C, name='fftw_import_wisdom_from_file')\r\n      import\r\n      type(C_PTR), value :: input_file\r\n    end function fftw_import_wisdom_from_file\r\n    \r\n    integer(C_INT) function fftw_import_wisdom_from_string(input_string) bind(C, name='fftw_import_wisdom_from_string')\r\n      import\r\n      character(C_CHAR), dimension(*), intent(in) :: input_string\r\n    end function fftw_import_wisdom_from_string\r\n    \r\n    integer(C_INT) function fftw_import_wisdom(read_char,data) bind(C, name='fftw_import_wisdom')\r\n      import\r\n      type(C_FUNPTR), value :: read_char\r\n      type(C_PTR), value :: data\r\n    end function fftw_import_wisdom\r\n    \r\n    subroutine fftw_fprint_plan(p,output_file) bind(C, name='fftw_fprint_plan')\r\n      import\r\n      type(C_PTR), value :: p\r\n      type(C_PTR), value :: output_file\r\n    end subroutine fftw_fprint_plan\r\n    \r\n    subroutine fftw_print_plan(p) bind(C, name='fftw_print_plan')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end subroutine fftw_print_plan\r\n    \r\n    type(C_PTR) function fftw_sprint_plan(p) bind(C, name='fftw_sprint_plan')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end function fftw_sprint_plan\r\n    \r\n    type(C_PTR) function fftw_malloc(n) bind(C, name='fftw_malloc')\r\n      import\r\n      integer(C_SIZE_T), value :: n\r\n    end function fftw_malloc\r\n    \r\n    type(C_PTR) function fftw_alloc_real(n) bind(C, name='fftw_alloc_real')\r\n      import\r\n      integer(C_SIZE_T), value :: n\r\n    end function fftw_alloc_real\r\n    \r\n    type(C_PTR) function fftw_alloc_complex(n) bind(C, name='fftw_alloc_complex')\r\n      import\r\n      integer(C_SIZE_T), value :: n\r\n    end function fftw_alloc_complex\r\n    \r\n    subroutine fftw_free(p) bind(C, name='fftw_free')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end subroutine fftw_free\r\n    \r\n    subroutine fftw_flops(p,add,mul,fmas) bind(C, name='fftw_flops')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_DOUBLE), intent(out) :: add\r\n      real(C_DOUBLE), intent(out) :: mul\r\n      real(C_DOUBLE), intent(out) :: fmas\r\n    end subroutine fftw_flops\r\n    \r\n    real(C_DOUBLE) function fftw_estimate_cost(p) bind(C, name='fftw_estimate_cost')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end function fftw_estimate_cost\r\n    \r\n    real(C_DOUBLE) function fftw_cost(p) bind(C, name='fftw_cost')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end function fftw_cost\r\n    \r\n    integer(C_INT) function fftw_alignment_of(p) bind(C, name='fftw_alignment_of')\r\n      import\r\n      real(C_DOUBLE), dimension(*), intent(out) :: p\r\n    end function fftw_alignment_of\r\n    \r\n  end interface\r\n\r\n  type, bind(C) :: fftwf_iodim\r\n     integer(C_INT) n, is, os\r\n  end type fftwf_iodim\r\n  type, bind(C) :: fftwf_iodim64\r\n     integer(C_INTPTR_T) n, is, os\r\n  end type fftwf_iodim64\r\n\r\n  interface\r\n    type(C_PTR) function fftwf_plan_dft(rank,n,in,out,sign,flags) bind(C, name='fftwf_plan_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_dft\r\n    \r\n    type(C_PTR) function fftwf_plan_dft_1d(n,in,out,sign,flags) bind(C, name='fftwf_plan_dft_1d')\r\n      import\r\n      integer(C_INT), value :: n\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_dft_1d\r\n    \r\n    type(C_PTR) function fftwf_plan_dft_2d(n0,n1,in,out,sign,flags) bind(C, name='fftwf_plan_dft_2d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_dft_2d\r\n    \r\n    type(C_PTR) function fftwf_plan_dft_3d(n0,n1,n2,in,out,sign,flags) bind(C, name='fftwf_plan_dft_3d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      integer(C_INT), value :: n2\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_dft_3d\r\n    \r\n    type(C_PTR) function fftwf_plan_many_dft(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,sign,flags) &\r\n                         bind(C, name='fftwf_plan_many_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      integer(C_INT), value :: howmany\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in\r\n      integer(C_INT), dimension(*), intent(in) :: inembed\r\n      integer(C_INT), value :: istride\r\n      integer(C_INT), value :: idist\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), dimension(*), intent(in) :: onembed\r\n      integer(C_INT), value :: ostride\r\n      integer(C_INT), value :: odist\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_many_dft\r\n    \r\n    type(C_PTR) function fftwf_plan_guru_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) &\r\n                         bind(C, name='fftwf_plan_guru_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwf_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_guru_dft\r\n    \r\n    type(C_PTR) function fftwf_plan_guru_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) &\r\n                         bind(C, name='fftwf_plan_guru_split_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwf_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(C_FLOAT), dimension(*), intent(out) :: ri\r\n      real(C_FLOAT), dimension(*), intent(out) :: ii\r\n      real(C_FLOAT), dimension(*), intent(out) :: ro\r\n      real(C_FLOAT), dimension(*), intent(out) :: io\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_guru_split_dft\r\n    \r\n    type(C_PTR) function fftwf_plan_guru64_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) &\r\n                         bind(C, name='fftwf_plan_guru64_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwf_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_guru64_dft\r\n    \r\n    type(C_PTR) function fftwf_plan_guru64_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) &\r\n                         bind(C, name='fftwf_plan_guru64_split_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwf_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(C_FLOAT), dimension(*), intent(out) :: ri\r\n      real(C_FLOAT), dimension(*), intent(out) :: ii\r\n      real(C_FLOAT), dimension(*), intent(out) :: ro\r\n      real(C_FLOAT), dimension(*), intent(out) :: io\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_guru64_split_dft\r\n    \r\n    subroutine fftwf_execute_dft(p,in,out) bind(C, name='fftwf_execute_dft')\r\n      import\r\n      type(C_PTR), value :: p\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(inout) :: in\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out\r\n    end subroutine fftwf_execute_dft\r\n    \r\n    subroutine fftwf_execute_split_dft(p,ri,ii,ro,io) bind(C, name='fftwf_execute_split_dft')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_FLOAT), dimension(*), intent(inout) :: ri\r\n      real(C_FLOAT), dimension(*), intent(inout) :: ii\r\n      real(C_FLOAT), dimension(*), intent(out) :: ro\r\n      real(C_FLOAT), dimension(*), intent(out) :: io\r\n    end subroutine fftwf_execute_split_dft\r\n    \r\n    type(C_PTR) function fftwf_plan_many_dft_r2c(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) &\r\n                         bind(C, name='fftwf_plan_many_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      integer(C_INT), value :: howmany\r\n      real(C_FLOAT), dimension(*), intent(out) :: in\r\n      integer(C_INT), dimension(*), intent(in) :: inembed\r\n      integer(C_INT), value :: istride\r\n      integer(C_INT), value :: idist\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), dimension(*), intent(in) :: onembed\r\n      integer(C_INT), value :: ostride\r\n      integer(C_INT), value :: odist\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_many_dft_r2c\r\n    \r\n    type(C_PTR) function fftwf_plan_dft_r2c(rank,n,in,out,flags) bind(C, name='fftwf_plan_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      real(C_FLOAT), dimension(*), intent(out) :: in\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_dft_r2c\r\n    \r\n    type(C_PTR) function fftwf_plan_dft_r2c_1d(n,in,out,flags) bind(C, name='fftwf_plan_dft_r2c_1d')\r\n      import\r\n      integer(C_INT), value :: n\r\n      real(C_FLOAT), dimension(*), intent(out) :: in\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_dft_r2c_1d\r\n    \r\n    type(C_PTR) function fftwf_plan_dft_r2c_2d(n0,n1,in,out,flags) bind(C, name='fftwf_plan_dft_r2c_2d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      real(C_FLOAT), dimension(*), intent(out) :: in\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_dft_r2c_2d\r\n    \r\n    type(C_PTR) function fftwf_plan_dft_r2c_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwf_plan_dft_r2c_3d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      integer(C_INT), value :: n2\r\n      real(C_FLOAT), dimension(*), intent(out) :: in\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_dft_r2c_3d\r\n    \r\n    type(C_PTR) function fftwf_plan_many_dft_c2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) &\r\n                         bind(C, name='fftwf_plan_many_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      integer(C_INT), value :: howmany\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in\r\n      integer(C_INT), dimension(*), intent(in) :: inembed\r\n      integer(C_INT), value :: istride\r\n      integer(C_INT), value :: idist\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n      integer(C_INT), dimension(*), intent(in) :: onembed\r\n      integer(C_INT), value :: ostride\r\n      integer(C_INT), value :: odist\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_many_dft_c2r\r\n    \r\n    type(C_PTR) function fftwf_plan_dft_c2r(rank,n,in,out,flags) bind(C, name='fftwf_plan_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_dft_c2r\r\n    \r\n    type(C_PTR) function fftwf_plan_dft_c2r_1d(n,in,out,flags) bind(C, name='fftwf_plan_dft_c2r_1d')\r\n      import\r\n      integer(C_INT), value :: n\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_dft_c2r_1d\r\n    \r\n    type(C_PTR) function fftwf_plan_dft_c2r_2d(n0,n1,in,out,flags) bind(C, name='fftwf_plan_dft_c2r_2d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_dft_c2r_2d\r\n    \r\n    type(C_PTR) function fftwf_plan_dft_c2r_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwf_plan_dft_c2r_3d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      integer(C_INT), value :: n2\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_dft_c2r_3d\r\n    \r\n    type(C_PTR) function fftwf_plan_guru_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) &\r\n                         bind(C, name='fftwf_plan_guru_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwf_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(C_FLOAT), dimension(*), intent(out) :: in\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_guru_dft_r2c\r\n    \r\n    type(C_PTR) function fftwf_plan_guru_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) &\r\n                         bind(C, name='fftwf_plan_guru_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwf_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_guru_dft_c2r\r\n    \r\n    type(C_PTR) function fftwf_plan_guru_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) &\r\n                         bind(C, name='fftwf_plan_guru_split_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwf_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(C_FLOAT), dimension(*), intent(out) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: ro\r\n      real(C_FLOAT), dimension(*), intent(out) :: io\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_guru_split_dft_r2c\r\n    \r\n    type(C_PTR) function fftwf_plan_guru_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) &\r\n                         bind(C, name='fftwf_plan_guru_split_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwf_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(C_FLOAT), dimension(*), intent(out) :: ri\r\n      real(C_FLOAT), dimension(*), intent(out) :: ii\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_guru_split_dft_c2r\r\n    \r\n    type(C_PTR) function fftwf_plan_guru64_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) &\r\n                         bind(C, name='fftwf_plan_guru64_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwf_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(C_FLOAT), dimension(*), intent(out) :: in\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_guru64_dft_r2c\r\n    \r\n    type(C_PTR) function fftwf_plan_guru64_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) &\r\n                         bind(C, name='fftwf_plan_guru64_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwf_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_guru64_dft_c2r\r\n    \r\n    type(C_PTR) function fftwf_plan_guru64_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) &\r\n                         bind(C, name='fftwf_plan_guru64_split_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwf_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(C_FLOAT), dimension(*), intent(out) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: ro\r\n      real(C_FLOAT), dimension(*), intent(out) :: io\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_guru64_split_dft_r2c\r\n    \r\n    type(C_PTR) function fftwf_plan_guru64_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) &\r\n                         bind(C, name='fftwf_plan_guru64_split_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwf_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(C_FLOAT), dimension(*), intent(out) :: ri\r\n      real(C_FLOAT), dimension(*), intent(out) :: ii\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_guru64_split_dft_c2r\r\n    \r\n    subroutine fftwf_execute_dft_r2c(p,in,out) bind(C, name='fftwf_execute_dft_r2c')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_FLOAT), dimension(*), intent(inout) :: in\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out\r\n    end subroutine fftwf_execute_dft_r2c\r\n    \r\n    subroutine fftwf_execute_dft_c2r(p,in,out) bind(C, name='fftwf_execute_dft_c2r')\r\n      import\r\n      type(C_PTR), value :: p\r\n      complex(C_FLOAT_COMPLEX), dimension(*), intent(inout) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n    end subroutine fftwf_execute_dft_c2r\r\n    \r\n    subroutine fftwf_execute_split_dft_r2c(p,in,ro,io) bind(C, name='fftwf_execute_split_dft_r2c')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_FLOAT), dimension(*), intent(inout) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: ro\r\n      real(C_FLOAT), dimension(*), intent(out) :: io\r\n    end subroutine fftwf_execute_split_dft_r2c\r\n    \r\n    subroutine fftwf_execute_split_dft_c2r(p,ri,ii,out) bind(C, name='fftwf_execute_split_dft_c2r')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_FLOAT), dimension(*), intent(inout) :: ri\r\n      real(C_FLOAT), dimension(*), intent(inout) :: ii\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n    end subroutine fftwf_execute_split_dft_c2r\r\n    \r\n    type(C_PTR) function fftwf_plan_many_r2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,kind,flags) &\r\n                         bind(C, name='fftwf_plan_many_r2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      integer(C_INT), value :: howmany\r\n      real(C_FLOAT), dimension(*), intent(out) :: in\r\n      integer(C_INT), dimension(*), intent(in) :: inembed\r\n      integer(C_INT), value :: istride\r\n      integer(C_INT), value :: idist\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n      integer(C_INT), dimension(*), intent(in) :: onembed\r\n      integer(C_INT), value :: ostride\r\n      integer(C_INT), value :: odist\r\n      integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_many_r2r\r\n    \r\n    type(C_PTR) function fftwf_plan_r2r(rank,n,in,out,kind,flags) bind(C, name='fftwf_plan_r2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      real(C_FLOAT), dimension(*), intent(out) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_r2r\r\n    \r\n    type(C_PTR) function fftwf_plan_r2r_1d(n,in,out,kind,flags) bind(C, name='fftwf_plan_r2r_1d')\r\n      import\r\n      integer(C_INT), value :: n\r\n      real(C_FLOAT), dimension(*), intent(out) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), value :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_r2r_1d\r\n    \r\n    type(C_PTR) function fftwf_plan_r2r_2d(n0,n1,in,out,kind0,kind1,flags) bind(C, name='fftwf_plan_r2r_2d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      real(C_FLOAT), dimension(*), intent(out) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), value :: kind0\r\n      integer(C_FFTW_R2R_KIND), value :: kind1\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_r2r_2d\r\n    \r\n    type(C_PTR) function fftwf_plan_r2r_3d(n0,n1,n2,in,out,kind0,kind1,kind2,flags) bind(C, name='fftwf_plan_r2r_3d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      integer(C_INT), value :: n2\r\n      real(C_FLOAT), dimension(*), intent(out) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), value :: kind0\r\n      integer(C_FFTW_R2R_KIND), value :: kind1\r\n      integer(C_FFTW_R2R_KIND), value :: kind2\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_r2r_3d\r\n    \r\n    type(C_PTR) function fftwf_plan_guru_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) &\r\n                         bind(C, name='fftwf_plan_guru_r2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwf_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(C_FLOAT), dimension(*), intent(out) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_guru_r2r\r\n    \r\n    type(C_PTR) function fftwf_plan_guru64_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) &\r\n                         bind(C, name='fftwf_plan_guru64_r2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwf_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(C_FLOAT), dimension(*), intent(out) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftwf_plan_guru64_r2r\r\n    \r\n    subroutine fftwf_execute_r2r(p,in,out) bind(C, name='fftwf_execute_r2r')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_FLOAT), dimension(*), intent(inout) :: in\r\n      real(C_FLOAT), dimension(*), intent(out) :: out\r\n    end subroutine fftwf_execute_r2r\r\n    \r\n    subroutine fftwf_destroy_plan(p) bind(C, name='fftwf_destroy_plan')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end subroutine fftwf_destroy_plan\r\n    \r\n    subroutine fftwf_forget_wisdom() bind(C, name='fftwf_forget_wisdom')\r\n      import\r\n    end subroutine fftwf_forget_wisdom\r\n    \r\n    subroutine fftwf_cleanup() bind(C, name='fftwf_cleanup')\r\n      import\r\n    end subroutine fftwf_cleanup\r\n    \r\n    subroutine fftwf_set_timelimit(t) bind(C, name='fftwf_set_timelimit')\r\n      import\r\n      real(C_DOUBLE), value :: t\r\n    end subroutine fftwf_set_timelimit\r\n    \r\n    subroutine fftwf_plan_with_nthreads(nthreads) bind(C, name='fftwf_plan_with_nthreads')\r\n      import\r\n      integer(C_INT), value :: nthreads\r\n    end subroutine fftwf_plan_with_nthreads\r\n    \r\n    integer(C_INT) function fftwf_init_threads() bind(C, name='fftwf_init_threads')\r\n      import\r\n    end function fftwf_init_threads\r\n    \r\n    subroutine fftwf_cleanup_threads() bind(C, name='fftwf_cleanup_threads')\r\n      import\r\n    end subroutine fftwf_cleanup_threads\r\n    \r\n    integer(C_INT) function fftwf_export_wisdom_to_filename(filename) bind(C, name='fftwf_export_wisdom_to_filename')\r\n      import\r\n      character(C_CHAR), dimension(*), intent(in) :: filename\r\n    end function fftwf_export_wisdom_to_filename\r\n    \r\n    subroutine fftwf_export_wisdom_to_file(output_file) bind(C, name='fftwf_export_wisdom_to_file')\r\n      import\r\n      type(C_PTR), value :: output_file\r\n    end subroutine fftwf_export_wisdom_to_file\r\n    \r\n    type(C_PTR) function fftwf_export_wisdom_to_string() bind(C, name='fftwf_export_wisdom_to_string')\r\n      import\r\n    end function fftwf_export_wisdom_to_string\r\n    \r\n    subroutine fftwf_export_wisdom(write_char,data) bind(C, name='fftwf_export_wisdom')\r\n      import\r\n      type(C_FUNPTR), value :: write_char\r\n      type(C_PTR), value :: data\r\n    end subroutine fftwf_export_wisdom\r\n    \r\n    integer(C_INT) function fftwf_import_system_wisdom() bind(C, name='fftwf_import_system_wisdom')\r\n      import\r\n    end function fftwf_import_system_wisdom\r\n    \r\n    integer(C_INT) function fftwf_import_wisdom_from_filename(filename) bind(C, name='fftwf_import_wisdom_from_filename')\r\n      import\r\n      character(C_CHAR), dimension(*), intent(in) :: filename\r\n    end function fftwf_import_wisdom_from_filename\r\n    \r\n    integer(C_INT) function fftwf_import_wisdom_from_file(input_file) bind(C, name='fftwf_import_wisdom_from_file')\r\n      import\r\n      type(C_PTR), value :: input_file\r\n    end function fftwf_import_wisdom_from_file\r\n    \r\n    integer(C_INT) function fftwf_import_wisdom_from_string(input_string) bind(C, name='fftwf_import_wisdom_from_string')\r\n      import\r\n      character(C_CHAR), dimension(*), intent(in) :: input_string\r\n    end function fftwf_import_wisdom_from_string\r\n    \r\n    integer(C_INT) function fftwf_import_wisdom(read_char,data) bind(C, name='fftwf_import_wisdom')\r\n      import\r\n      type(C_FUNPTR), value :: read_char\r\n      type(C_PTR), value :: data\r\n    end function fftwf_import_wisdom\r\n    \r\n    subroutine fftwf_fprint_plan(p,output_file) bind(C, name='fftwf_fprint_plan')\r\n      import\r\n      type(C_PTR), value :: p\r\n      type(C_PTR), value :: output_file\r\n    end subroutine fftwf_fprint_plan\r\n    \r\n    subroutine fftwf_print_plan(p) bind(C, name='fftwf_print_plan')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end subroutine fftwf_print_plan\r\n    \r\n    type(C_PTR) function fftwf_sprint_plan(p) bind(C, name='fftwf_sprint_plan')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end function fftwf_sprint_plan\r\n    \r\n    type(C_PTR) function fftwf_malloc(n) bind(C, name='fftwf_malloc')\r\n      import\r\n      integer(C_SIZE_T), value :: n\r\n    end function fftwf_malloc\r\n    \r\n    type(C_PTR) function fftwf_alloc_real(n) bind(C, name='fftwf_alloc_real')\r\n      import\r\n      integer(C_SIZE_T), value :: n\r\n    end function fftwf_alloc_real\r\n    \r\n    type(C_PTR) function fftwf_alloc_complex(n) bind(C, name='fftwf_alloc_complex')\r\n      import\r\n      integer(C_SIZE_T), value :: n\r\n    end function fftwf_alloc_complex\r\n    \r\n    subroutine fftwf_free(p) bind(C, name='fftwf_free')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end subroutine fftwf_free\r\n    \r\n    subroutine fftwf_flops(p,add,mul,fmas) bind(C, name='fftwf_flops')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_DOUBLE), intent(out) :: add\r\n      real(C_DOUBLE), intent(out) :: mul\r\n      real(C_DOUBLE), intent(out) :: fmas\r\n    end subroutine fftwf_flops\r\n    \r\n    real(C_DOUBLE) function fftwf_estimate_cost(p) bind(C, name='fftwf_estimate_cost')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end function fftwf_estimate_cost\r\n    \r\n    real(C_DOUBLE) function fftwf_cost(p) bind(C, name='fftwf_cost')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end function fftwf_cost\r\n    \r\n    integer(C_INT) function fftwf_alignment_of(p) bind(C, name='fftwf_alignment_of')\r\n      import\r\n      real(C_FLOAT), dimension(*), intent(out) :: p\r\n    end function fftwf_alignment_of\r\n    \r\n  end interface\r\n"
  },
  {
    "path": "OptolithiumC/libs/fftw3-win32/fftw3.h",
    "content": "/*\r\n * Copyright (c) 2003, 2007-14 Matteo Frigo\r\n * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology\r\n *\r\n * The following statement of license applies *only* to this header file,\r\n * and *not* to the other files distributed with FFTW or derived therefrom:\r\n * \r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions\r\n * are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright\r\n *    notice, this list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright\r\n *    notice, this list of conditions and the following disclaimer in the\r\n *    documentation and/or other materials provided with the distribution.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS\r\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\r\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\r\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\n/***************************** NOTE TO USERS *********************************\r\n *\r\n *                 THIS IS A HEADER FILE, NOT A MANUAL\r\n *\r\n *    If you want to know how to use FFTW, please read the manual,\r\n *    online at http://www.fftw.org/doc/ and also included with FFTW.\r\n *    For a quick start, see the manual's tutorial section.\r\n *\r\n *   (Reading header files to learn how to use a library is a habit\r\n *    stemming from code lacking a proper manual.  Arguably, it's a\r\n *    *bad* habit in most cases, because header files can contain\r\n *    interfaces that are not part of the public, stable API.)\r\n *\r\n ****************************************************************************/\r\n\r\n#ifndef FFTW3_H\r\n#define FFTW3_H\r\n\r\n#include <stdio.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\"\r\n{\r\n#endif /* __cplusplus */\r\n\r\n/* If <complex.h> is included, use the C99 complex type.  Otherwise\r\n   define a type bit-compatible with C99 complex */\r\n#if !defined(FFTW_NO_Complex) && defined(_Complex_I) && defined(complex) && defined(I)\r\n#  define FFTW_DEFINE_COMPLEX(R, C) typedef R _Complex C\r\n#else\r\n#  define FFTW_DEFINE_COMPLEX(R, C) typedef R C[2]\r\n#endif\r\n\r\n#define FFTW_CONCAT(prefix, name) prefix ## name\r\n#define FFTW_MANGLE_DOUBLE(name) FFTW_CONCAT(fftw_, name)\r\n#define FFTW_MANGLE_FLOAT(name) FFTW_CONCAT(fftwf_, name)\r\n#define FFTW_MANGLE_LONG_DOUBLE(name) FFTW_CONCAT(fftwl_, name)\r\n#define FFTW_MANGLE_QUAD(name) FFTW_CONCAT(fftwq_, name)\r\n\r\n/* IMPORTANT: for Windows compilers, you should add a line\r\n*/\r\n#define FFTW_DLL\r\n/*\r\n   here and in kernel/ifftw.h if you are compiling/using FFTW as a\r\n   DLL, in order to do the proper importing/exporting, or\r\n   alternatively compile with -DFFTW_DLL or the equivalent\r\n   command-line flag.  This is not necessary under MinGW/Cygwin, where\r\n   libtool does the imports/exports automatically. */\r\n#if defined(FFTW_DLL) && (defined(_WIN32) || defined(__WIN32__))\r\n   /* annoying Windows syntax for shared-library declarations */\r\n#  if defined(COMPILING_FFTW) /* defined in api.h when compiling FFTW */\r\n#    define FFTW_EXTERN extern __declspec(dllexport) \r\n#  else /* user is calling FFTW; import symbol */\r\n#    define FFTW_EXTERN extern __declspec(dllimport) \r\n#  endif\r\n#else\r\n#  define FFTW_EXTERN extern\r\n#endif\r\n\r\nenum fftw_r2r_kind_do_not_use_me {\r\n     FFTW_R2HC=0, FFTW_HC2R=1, FFTW_DHT=2,\r\n     FFTW_REDFT00=3, FFTW_REDFT01=4, FFTW_REDFT10=5, FFTW_REDFT11=6,\r\n     FFTW_RODFT00=7, FFTW_RODFT01=8, FFTW_RODFT10=9, FFTW_RODFT11=10\r\n};\r\n\r\nstruct fftw_iodim_do_not_use_me {\r\n     int n;                     /* dimension size */\r\n     int is;\t\t\t/* input stride */\r\n     int os;\t\t\t/* output stride */\r\n};\r\n\r\n#include <stddef.h> /* for ptrdiff_t */\r\nstruct fftw_iodim64_do_not_use_me {\r\n     ptrdiff_t n;                     /* dimension size */\r\n     ptrdiff_t is;\t\t\t/* input stride */\r\n     ptrdiff_t os;\t\t\t/* output stride */\r\n};\r\n\r\ntypedef void (*fftw_write_char_func_do_not_use_me)(char c, void *);\r\ntypedef int (*fftw_read_char_func_do_not_use_me)(void *);\r\n\r\n/*\r\n  huge second-order macro that defines prototypes for all API\r\n  functions.  We expand this macro for each supported precision\r\n \r\n  X: name-mangling macro\r\n  R: real data type\r\n  C: complex data type\r\n*/\r\n\r\n#define FFTW_DEFINE_API(X, R, C)\t\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_DEFINE_COMPLEX(R, C);\t\t\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\ntypedef struct X(plan_s) *X(plan);\t\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\ntypedef struct fftw_iodim_do_not_use_me X(iodim);\t\t\t   \\\r\ntypedef struct fftw_iodim64_do_not_use_me X(iodim64);\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\ntypedef enum fftw_r2r_kind_do_not_use_me X(r2r_kind);\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\ntypedef fftw_write_char_func_do_not_use_me X(write_char_func);\t\t   \\\r\ntypedef fftw_read_char_func_do_not_use_me X(read_char_func);\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN void X(execute)(const X(plan) p);\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_dft)(int rank, const int *n,\t\t\t   \\\r\n\t\t    C *in, C *out, int sign, unsigned flags);\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_dft_1d)(int n, C *in, C *out, int sign,\t   \\\r\n\t\t       unsigned flags);\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_dft_2d)(int n0, int n1,\t\t\t   \\\r\n\t\t       C *in, C *out, int sign, unsigned flags);\t   \\\r\nFFTW_EXTERN X(plan) X(plan_dft_3d)(int n0, int n1, int n2,\t\t   \\\r\n\t\t       C *in, C *out, int sign, unsigned flags);\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_many_dft)(int rank, const int *n,\t\t   \\\r\n                         int howmany,\t\t\t\t\t   \\\r\n                         C *in, const int *inembed,\t\t\t   \\\r\n                         int istride, int idist,\t\t\t   \\\r\n                         C *out, const int *onembed,\t\t\t   \\\r\n                         int ostride, int odist,\t\t\t   \\\r\n                         int sign, unsigned flags);\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_guru_dft)(int rank, const X(iodim) *dims,\t   \\\r\n\t\t\t int howmany_rank,\t\t\t\t   \\\r\n\t\t\t const X(iodim) *howmany_dims,\t\t\t   \\\r\n\t\t\t C *in, C *out,\t\t\t\t\t   \\\r\n\t\t\t int sign, unsigned flags);\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_guru_split_dft)(int rank, const X(iodim) *dims, \\\r\n\t\t\t int howmany_rank,\t\t\t\t   \\\r\n\t\t\t const X(iodim) *howmany_dims,\t\t\t   \\\r\n\t\t\t R *ri, R *ii, R *ro, R *io,\t\t\t   \\\r\n\t\t\t unsigned flags);\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_guru64_dft)(int rank,\t\t\t   \\\r\n                         const X(iodim64) *dims,\t\t\t   \\\r\n\t\t\t int howmany_rank,\t\t\t\t   \\\r\n\t\t\t const X(iodim64) *howmany_dims,\t\t   \\\r\n\t\t\t C *in, C *out,\t\t\t\t\t   \\\r\n\t\t\t int sign, unsigned flags);\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_guru64_split_dft)(int rank,\t\t\t   \\\r\n                         const X(iodim64) *dims,\t\t\t   \\\r\n\t\t\t int howmany_rank,\t\t\t\t   \\\r\n\t\t\t const X(iodim64) *howmany_dims,\t\t   \\\r\n\t\t\t R *ri, R *ii, R *ro, R *io,\t\t\t   \\\r\n\t\t\t unsigned flags);\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN void X(execute_dft)(const X(plan) p, C *in, C *out);\t   \\\r\nFFTW_EXTERN void X(execute_split_dft)(const X(plan) p, R *ri, R *ii,\t   \\\r\n                                      R *ro, R *io);\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_many_dft_r2c)(int rank, const int *n,\t   \\\r\n                             int howmany,\t\t\t\t   \\\r\n                             R *in, const int *inembed,\t\t\t   \\\r\n                             int istride, int idist,\t\t\t   \\\r\n                             C *out, const int *onembed,\t\t   \\\r\n                             int ostride, int odist,\t\t\t   \\\r\n                             unsigned flags);\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_dft_r2c)(int rank, const int *n,\t\t   \\\r\n                        R *in, C *out, unsigned flags);\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_dft_r2c_1d)(int n,R *in,C *out,unsigned flags); \\\r\nFFTW_EXTERN X(plan) X(plan_dft_r2c_2d)(int n0, int n1,\t\t\t   \\\r\n\t\t\t   R *in, C *out, unsigned flags);\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_dft_r2c_3d)(int n0, int n1,\t\t\t   \\\r\n\t\t\t   int n2,\t\t\t\t\t   \\\r\n\t\t\t   R *in, C *out, unsigned flags);\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_many_dft_c2r)(int rank, const int *n,\t   \\\r\n\t\t\t     int howmany,\t\t\t\t   \\\r\n\t\t\t     C *in, const int *inembed,\t\t\t   \\\r\n\t\t\t     int istride, int idist,\t\t\t   \\\r\n\t\t\t     R *out, const int *onembed,\t\t   \\\r\n\t\t\t     int ostride, int odist,\t\t\t   \\\r\n\t\t\t     unsigned flags);\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_dft_c2r)(int rank, const int *n,\t\t   \\\r\n                        C *in, R *out, unsigned flags);\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_dft_c2r_1d)(int n,C *in,R *out,unsigned flags); \\\r\nFFTW_EXTERN X(plan) X(plan_dft_c2r_2d)(int n0, int n1,\t\t\t   \\\r\n\t\t\t   C *in, R *out, unsigned flags);\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_dft_c2r_3d)(int n0, int n1,\t\t\t   \\\r\n\t\t\t   int n2,\t\t\t\t\t   \\\r\n\t\t\t   C *in, R *out, unsigned flags);\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_guru_dft_r2c)(int rank, const X(iodim) *dims,   \\\r\n\t\t\t     int howmany_rank,\t\t\t\t   \\\r\n\t\t\t     const X(iodim) *howmany_dims,\t\t   \\\r\n\t\t\t     R *in, C *out,\t\t\t\t   \\\r\n\t\t\t     unsigned flags);\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_guru_dft_c2r)(int rank, const X(iodim) *dims,   \\\r\n\t\t\t     int howmany_rank,\t\t\t\t   \\\r\n\t\t\t     const X(iodim) *howmany_dims,\t\t   \\\r\n\t\t\t     C *in, R *out,\t\t\t\t   \\\r\n\t\t\t     unsigned flags);\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_guru_split_dft_r2c)(\t\t\t\t   \\\r\n                             int rank, const X(iodim) *dims,\t\t   \\\r\n\t\t\t     int howmany_rank,\t\t\t\t   \\\r\n\t\t\t     const X(iodim) *howmany_dims,\t\t   \\\r\n\t\t\t     R *in, R *ro, R *io,\t\t\t   \\\r\n\t\t\t     unsigned flags);\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_guru_split_dft_c2r)(\t\t\t\t   \\\r\n                             int rank, const X(iodim) *dims,\t\t   \\\r\n\t\t\t     int howmany_rank,\t\t\t\t   \\\r\n\t\t\t     const X(iodim) *howmany_dims,\t\t   \\\r\n\t\t\t     R *ri, R *ii, R *out,\t\t\t   \\\r\n\t\t\t     unsigned flags);\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_guru64_dft_r2c)(int rank,\t\t\t   \\\r\n                             const X(iodim64) *dims,\t\t\t   \\\r\n\t\t\t     int howmany_rank,\t\t\t\t   \\\r\n\t\t\t     const X(iodim64) *howmany_dims,\t\t   \\\r\n\t\t\t     R *in, C *out,\t\t\t\t   \\\r\n\t\t\t     unsigned flags);\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_guru64_dft_c2r)(int rank,\t\t\t   \\\r\n                             const X(iodim64) *dims,\t\t\t   \\\r\n\t\t\t     int howmany_rank,\t\t\t\t   \\\r\n\t\t\t     const X(iodim64) *howmany_dims,\t\t   \\\r\n\t\t\t     C *in, R *out,\t\t\t\t   \\\r\n\t\t\t     unsigned flags);\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_guru64_split_dft_r2c)(\t\t\t   \\\r\n                             int rank, const X(iodim64) *dims,\t\t   \\\r\n\t\t\t     int howmany_rank,\t\t\t\t   \\\r\n\t\t\t     const X(iodim64) *howmany_dims,\t\t   \\\r\n\t\t\t     R *in, R *ro, R *io,\t\t\t   \\\r\n\t\t\t     unsigned flags);\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_guru64_split_dft_c2r)(\t\t\t   \\\r\n                             int rank, const X(iodim64) *dims,\t\t   \\\r\n\t\t\t     int howmany_rank,\t\t\t\t   \\\r\n\t\t\t     const X(iodim64) *howmany_dims,\t\t   \\\r\n\t\t\t     R *ri, R *ii, R *out,\t\t\t   \\\r\n\t\t\t     unsigned flags);\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN void X(execute_dft_r2c)(const X(plan) p, R *in, C *out);\t   \\\r\nFFTW_EXTERN void X(execute_dft_c2r)(const X(plan) p, C *in, R *out);\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN void X(execute_split_dft_r2c)(const X(plan) p,\t\t   \\\r\n                                          R *in, R *ro, R *io);\t\t   \\\r\nFFTW_EXTERN void X(execute_split_dft_c2r)(const X(plan) p,\t\t   \\\r\n                                          R *ri, R *ii, R *out);\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_many_r2r)(int rank, const int *n,\t\t   \\\r\n                         int howmany,\t\t\t\t\t   \\\r\n                         R *in, const int *inembed,\t\t\t   \\\r\n                         int istride, int idist,\t\t\t   \\\r\n                         R *out, const int *onembed,\t\t\t   \\\r\n                         int ostride, int odist,\t\t\t   \\\r\n                         const X(r2r_kind) *kind, unsigned flags);\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_r2r)(int rank, const int *n, R *in, R *out,\t   \\\r\n                    const X(r2r_kind) *kind, unsigned flags);\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_r2r_1d)(int n, R *in, R *out,\t\t   \\\r\n                       X(r2r_kind) kind, unsigned flags);\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_r2r_2d)(int n0, int n1, R *in, R *out,\t   \\\r\n                       X(r2r_kind) kind0, X(r2r_kind) kind1,\t\t   \\\r\n                       unsigned flags);\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_r2r_3d)(int n0, int n1, int n2,\t\t   \\\r\n                       R *in, R *out, X(r2r_kind) kind0,\t\t   \\\r\n                       X(r2r_kind) kind1, X(r2r_kind) kind2,\t\t   \\\r\n                       unsigned flags);\t\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_guru_r2r)(int rank, const X(iodim) *dims,\t   \\\r\n                         int howmany_rank,\t\t\t\t   \\\r\n                         const X(iodim) *howmany_dims,\t\t\t   \\\r\n                         R *in, R *out,\t\t\t\t\t   \\\r\n                         const X(r2r_kind) *kind, unsigned flags);\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN X(plan) X(plan_guru64_r2r)(int rank, const X(iodim64) *dims,   \\\r\n                         int howmany_rank,\t\t\t\t   \\\r\n                         const X(iodim64) *howmany_dims,\t\t   \\\r\n                         R *in, R *out,\t\t\t\t\t   \\\r\n                         const X(r2r_kind) *kind, unsigned flags);\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN void X(execute_r2r)(const X(plan) p, R *in, R *out);\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN void X(destroy_plan)(X(plan) p);\t\t\t\t   \\\r\nFFTW_EXTERN void X(forget_wisdom)(void);\t\t\t\t   \\\r\nFFTW_EXTERN void X(cleanup)(void);\t\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN void X(set_timelimit)(double t);\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN void X(plan_with_nthreads)(int nthreads);\t\t\t   \\\r\nFFTW_EXTERN int X(init_threads)(void);\t\t\t\t\t   \\\r\nFFTW_EXTERN void X(cleanup_threads)(void);\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN int X(export_wisdom_to_filename)(const char *filename);\t   \\\r\nFFTW_EXTERN void X(export_wisdom_to_file)(FILE *output_file);\t\t   \\\r\nFFTW_EXTERN char *X(export_wisdom_to_string)(void);\t\t\t   \\\r\nFFTW_EXTERN void X(export_wisdom)(X(write_char_func) write_char,   \t   \\\r\n                                  void *data);\t\t\t\t   \\\r\nFFTW_EXTERN int X(import_system_wisdom)(void);\t\t\t\t   \\\r\nFFTW_EXTERN int X(import_wisdom_from_filename)(const char *filename);\t   \\\r\nFFTW_EXTERN int X(import_wisdom_from_file)(FILE *input_file);\t\t   \\\r\nFFTW_EXTERN int X(import_wisdom_from_string)(const char *input_string);\t   \\\r\nFFTW_EXTERN int X(import_wisdom)(X(read_char_func) read_char, void *data); \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN void X(fprint_plan)(const X(plan) p, FILE *output_file);\t   \\\r\nFFTW_EXTERN void X(print_plan)(const X(plan) p);\t\t\t   \\\r\nFFTW_EXTERN char *X(sprint_plan)(const X(plan) p);\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN void *X(malloc)(size_t n);\t\t\t\t\t   \\\r\nFFTW_EXTERN R *X(alloc_real)(size_t n);\t\t\t\t\t   \\\r\nFFTW_EXTERN C *X(alloc_complex)(size_t n);\t\t\t\t   \\\r\nFFTW_EXTERN void X(free)(void *p);\t\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN void X(flops)(const X(plan) p,\t\t\t\t   \\\r\n                          double *add, double *mul, double *fmas);\t   \\\r\nFFTW_EXTERN double X(estimate_cost)(const X(plan) p);\t\t\t   \\\r\nFFTW_EXTERN double X(cost)(const X(plan) p);\t\t\t\t   \\\r\n\t\t\t\t\t\t\t\t\t   \\\r\nFFTW_EXTERN int X(alignment_of)(R *p);                                     \\\r\nFFTW_EXTERN const char X(version)[];                                       \\\r\nFFTW_EXTERN const char X(cc)[];\t\t\t\t\t\t   \\\r\nFFTW_EXTERN const char X(codelet_optim)[];\r\n\r\n\r\n/* end of FFTW_DEFINE_API macro */\r\n\r\nFFTW_DEFINE_API(FFTW_MANGLE_DOUBLE, double, fftw_complex)\r\nFFTW_DEFINE_API(FFTW_MANGLE_FLOAT, float, fftwf_complex)\r\nFFTW_DEFINE_API(FFTW_MANGLE_LONG_DOUBLE, long double, fftwl_complex)\r\n\r\n/* __float128 (quad precision) is a gcc extension on i386, x86_64, and ia64\r\n   for gcc >= 4.6 (compiled in FFTW with --enable-quad-precision) */\r\n#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) \\\r\n && !(defined(__ICC) || defined(__INTEL_COMPILER)) \\\r\n && (defined(__i386__) || defined(__x86_64__) || defined(__ia64__))\r\n#  if !defined(FFTW_NO_Complex) && defined(_Complex_I) && defined(complex) && defined(I)\r\n/* note: __float128 is a typedef, which is not supported with the _Complex\r\n         keyword in gcc, so instead we use this ugly __attribute__ version.\r\n         However, we can't simply pass the __attribute__ version to\r\n         FFTW_DEFINE_API because the __attribute__ confuses gcc in pointer\r\n         types.  Hence redefining FFTW_DEFINE_COMPLEX.  Ugh. */\r\n#    undef FFTW_DEFINE_COMPLEX\r\n#    define FFTW_DEFINE_COMPLEX(R, C) typedef _Complex float __attribute__((mode(TC))) C\r\n#  endif\r\nFFTW_DEFINE_API(FFTW_MANGLE_QUAD, __float128, fftwq_complex)\r\n#endif\r\n\r\n#define FFTW_FORWARD (-1)\r\n#define FFTW_BACKWARD (+1)\r\n\r\n#define FFTW_NO_TIMELIMIT (-1.0)\r\n\r\n/* documented flags */\r\n#define FFTW_MEASURE (0U)\r\n#define FFTW_DESTROY_INPUT (1U << 0)\r\n#define FFTW_UNALIGNED (1U << 1)\r\n#define FFTW_CONSERVE_MEMORY (1U << 2)\r\n#define FFTW_EXHAUSTIVE (1U << 3) /* NO_EXHAUSTIVE is default */\r\n#define FFTW_PRESERVE_INPUT (1U << 4) /* cancels FFTW_DESTROY_INPUT */\r\n#define FFTW_PATIENT (1U << 5) /* IMPATIENT is default */\r\n#define FFTW_ESTIMATE (1U << 6)\r\n#define FFTW_WISDOM_ONLY (1U << 21)\r\n\r\n/* undocumented beyond-guru flags */\r\n#define FFTW_ESTIMATE_PATIENT (1U << 7)\r\n#define FFTW_BELIEVE_PCOST (1U << 8)\r\n#define FFTW_NO_DFT_R2HC (1U << 9)\r\n#define FFTW_NO_NONTHREADED (1U << 10)\r\n#define FFTW_NO_BUFFERING (1U << 11)\r\n#define FFTW_NO_INDIRECT_OP (1U << 12)\r\n#define FFTW_ALLOW_LARGE_GENERIC (1U << 13) /* NO_LARGE_GENERIC is default */\r\n#define FFTW_NO_RANK_SPLITS (1U << 14)\r\n#define FFTW_NO_VRANK_SPLITS (1U << 15)\r\n#define FFTW_NO_VRECURSE (1U << 16)\r\n#define FFTW_NO_SIMD (1U << 17)\r\n#define FFTW_NO_SLOW (1U << 18)\r\n#define FFTW_NO_FIXED_RADIX_LARGE_N (1U << 19)\r\n#define FFTW_ALLOW_PRUNING (1U << 20)\r\n\r\n#ifdef __cplusplus\r\n}  /* extern \"C\" */\r\n#endif /* __cplusplus */\r\n\r\n#endif /* FFTW3_H */\r\n"
  },
  {
    "path": "OptolithiumC/libs/fftw3-win32/fftw3l.f03",
    "content": "! Generated automatically.  DO NOT EDIT!\r\n\r\n\r\n  type, bind(C) :: fftwl_iodim\r\n     integer(C_INT) n, is, os\r\n  end type fftwl_iodim\r\n  type, bind(C) :: fftwl_iodim64\r\n     integer(C_INTPTR_T) n, is, os\r\n  end type fftwl_iodim64\r\n\r\n  interface\r\n    type(C_PTR) function fftwl_plan_dft(rank,n,in,out,sign,flags) bind(C, name='fftwl_plan_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_dft\r\n    \r\n    type(C_PTR) function fftwl_plan_dft_1d(n,in,out,sign,flags) bind(C, name='fftwl_plan_dft_1d')\r\n      import\r\n      integer(C_INT), value :: n\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_dft_1d\r\n    \r\n    type(C_PTR) function fftwl_plan_dft_2d(n0,n1,in,out,sign,flags) bind(C, name='fftwl_plan_dft_2d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_dft_2d\r\n    \r\n    type(C_PTR) function fftwl_plan_dft_3d(n0,n1,n2,in,out,sign,flags) bind(C, name='fftwl_plan_dft_3d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      integer(C_INT), value :: n2\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_dft_3d\r\n    \r\n    type(C_PTR) function fftwl_plan_many_dft(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,sign,flags) &\r\n                         bind(C, name='fftwl_plan_many_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      integer(C_INT), value :: howmany\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      integer(C_INT), dimension(*), intent(in) :: inembed\r\n      integer(C_INT), value :: istride\r\n      integer(C_INT), value :: idist\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), dimension(*), intent(in) :: onembed\r\n      integer(C_INT), value :: ostride\r\n      integer(C_INT), value :: odist\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_many_dft\r\n    \r\n    type(C_PTR) function fftwl_plan_guru_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) &\r\n                         bind(C, name='fftwl_plan_guru_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwl_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_guru_dft\r\n    \r\n    type(C_PTR) function fftwl_plan_guru_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) &\r\n                         bind(C, name='fftwl_plan_guru_split_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwl_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: ri\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: ii\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: io\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_guru_split_dft\r\n    \r\n    type(C_PTR) function fftwl_plan_guru64_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) &\r\n                         bind(C, name='fftwl_plan_guru64_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwl_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_guru64_dft\r\n    \r\n    type(C_PTR) function fftwl_plan_guru64_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) &\r\n                         bind(C, name='fftwl_plan_guru64_split_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwl_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: ri\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: ii\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: io\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_guru64_split_dft\r\n    \r\n    subroutine fftwl_execute_dft(p,in,out) bind(C, name='fftwl_execute_dft')\r\n      import\r\n      type(C_PTR), value :: p\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(inout) :: in\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n    end subroutine fftwl_execute_dft\r\n    \r\n    subroutine fftwl_execute_split_dft(p,ri,ii,ro,io) bind(C, name='fftwl_execute_split_dft')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_LONG_DOUBLE), dimension(*), intent(inout) :: ri\r\n      real(C_LONG_DOUBLE), dimension(*), intent(inout) :: ii\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: io\r\n    end subroutine fftwl_execute_split_dft\r\n    \r\n    type(C_PTR) function fftwl_plan_many_dft_r2c(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) &\r\n                         bind(C, name='fftwl_plan_many_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      integer(C_INT), value :: howmany\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: in\r\n      integer(C_INT), dimension(*), intent(in) :: inembed\r\n      integer(C_INT), value :: istride\r\n      integer(C_INT), value :: idist\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), dimension(*), intent(in) :: onembed\r\n      integer(C_INT), value :: ostride\r\n      integer(C_INT), value :: odist\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_many_dft_r2c\r\n    \r\n    type(C_PTR) function fftwl_plan_dft_r2c(rank,n,in,out,flags) bind(C, name='fftwl_plan_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: in\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_dft_r2c\r\n    \r\n    type(C_PTR) function fftwl_plan_dft_r2c_1d(n,in,out,flags) bind(C, name='fftwl_plan_dft_r2c_1d')\r\n      import\r\n      integer(C_INT), value :: n\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: in\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_dft_r2c_1d\r\n    \r\n    type(C_PTR) function fftwl_plan_dft_r2c_2d(n0,n1,in,out,flags) bind(C, name='fftwl_plan_dft_r2c_2d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: in\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_dft_r2c_2d\r\n    \r\n    type(C_PTR) function fftwl_plan_dft_r2c_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwl_plan_dft_r2c_3d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      integer(C_INT), value :: n2\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: in\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_dft_r2c_3d\r\n    \r\n    type(C_PTR) function fftwl_plan_many_dft_c2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) &\r\n                         bind(C, name='fftwl_plan_many_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      integer(C_INT), value :: howmany\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      integer(C_INT), dimension(*), intent(in) :: inembed\r\n      integer(C_INT), value :: istride\r\n      integer(C_INT), value :: idist\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), dimension(*), intent(in) :: onembed\r\n      integer(C_INT), value :: ostride\r\n      integer(C_INT), value :: odist\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_many_dft_c2r\r\n    \r\n    type(C_PTR) function fftwl_plan_dft_c2r(rank,n,in,out,flags) bind(C, name='fftwl_plan_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_dft_c2r\r\n    \r\n    type(C_PTR) function fftwl_plan_dft_c2r_1d(n,in,out,flags) bind(C, name='fftwl_plan_dft_c2r_1d')\r\n      import\r\n      integer(C_INT), value :: n\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_dft_c2r_1d\r\n    \r\n    type(C_PTR) function fftwl_plan_dft_c2r_2d(n0,n1,in,out,flags) bind(C, name='fftwl_plan_dft_c2r_2d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_dft_c2r_2d\r\n    \r\n    type(C_PTR) function fftwl_plan_dft_c2r_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwl_plan_dft_c2r_3d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      integer(C_INT), value :: n2\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_dft_c2r_3d\r\n    \r\n    type(C_PTR) function fftwl_plan_guru_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) &\r\n                         bind(C, name='fftwl_plan_guru_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwl_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: in\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_guru_dft_r2c\r\n    \r\n    type(C_PTR) function fftwl_plan_guru_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) &\r\n                         bind(C, name='fftwl_plan_guru_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwl_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_guru_dft_c2r\r\n    \r\n    type(C_PTR) function fftwl_plan_guru_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) &\r\n                         bind(C, name='fftwl_plan_guru_split_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwl_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: io\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_guru_split_dft_r2c\r\n    \r\n    type(C_PTR) function fftwl_plan_guru_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) &\r\n                         bind(C, name='fftwl_plan_guru_split_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwl_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: ri\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: ii\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_guru_split_dft_c2r\r\n    \r\n    type(C_PTR) function fftwl_plan_guru64_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) &\r\n                         bind(C, name='fftwl_plan_guru64_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwl_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: in\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_guru64_dft_r2c\r\n    \r\n    type(C_PTR) function fftwl_plan_guru64_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) &\r\n                         bind(C, name='fftwl_plan_guru64_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwl_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_guru64_dft_c2r\r\n    \r\n    type(C_PTR) function fftwl_plan_guru64_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) &\r\n                         bind(C, name='fftwl_plan_guru64_split_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwl_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: io\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_guru64_split_dft_r2c\r\n    \r\n    type(C_PTR) function fftwl_plan_guru64_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) &\r\n                         bind(C, name='fftwl_plan_guru64_split_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwl_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: ri\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: ii\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_guru64_split_dft_c2r\r\n    \r\n    subroutine fftwl_execute_dft_r2c(p,in,out) bind(C, name='fftwl_execute_dft_r2c')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_LONG_DOUBLE), dimension(*), intent(inout) :: in\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out\r\n    end subroutine fftwl_execute_dft_r2c\r\n    \r\n    subroutine fftwl_execute_dft_c2r(p,in,out) bind(C, name='fftwl_execute_dft_c2r')\r\n      import\r\n      type(C_PTR), value :: p\r\n      complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(inout) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n    end subroutine fftwl_execute_dft_c2r\r\n    \r\n    subroutine fftwl_execute_split_dft_r2c(p,in,ro,io) bind(C, name='fftwl_execute_split_dft_r2c')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_LONG_DOUBLE), dimension(*), intent(inout) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: io\r\n    end subroutine fftwl_execute_split_dft_r2c\r\n    \r\n    subroutine fftwl_execute_split_dft_c2r(p,ri,ii,out) bind(C, name='fftwl_execute_split_dft_c2r')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_LONG_DOUBLE), dimension(*), intent(inout) :: ri\r\n      real(C_LONG_DOUBLE), dimension(*), intent(inout) :: ii\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n    end subroutine fftwl_execute_split_dft_c2r\r\n    \r\n    type(C_PTR) function fftwl_plan_many_r2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,kind,flags) &\r\n                         bind(C, name='fftwl_plan_many_r2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      integer(C_INT), value :: howmany\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: in\r\n      integer(C_INT), dimension(*), intent(in) :: inembed\r\n      integer(C_INT), value :: istride\r\n      integer(C_INT), value :: idist\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_INT), dimension(*), intent(in) :: onembed\r\n      integer(C_INT), value :: ostride\r\n      integer(C_INT), value :: odist\r\n      integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_many_r2r\r\n    \r\n    type(C_PTR) function fftwl_plan_r2r(rank,n,in,out,kind,flags) bind(C, name='fftwl_plan_r2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_r2r\r\n    \r\n    type(C_PTR) function fftwl_plan_r2r_1d(n,in,out,kind,flags) bind(C, name='fftwl_plan_r2r_1d')\r\n      import\r\n      integer(C_INT), value :: n\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), value :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_r2r_1d\r\n    \r\n    type(C_PTR) function fftwl_plan_r2r_2d(n0,n1,in,out,kind0,kind1,flags) bind(C, name='fftwl_plan_r2r_2d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), value :: kind0\r\n      integer(C_FFTW_R2R_KIND), value :: kind1\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_r2r_2d\r\n    \r\n    type(C_PTR) function fftwl_plan_r2r_3d(n0,n1,n2,in,out,kind0,kind1,kind2,flags) bind(C, name='fftwl_plan_r2r_3d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      integer(C_INT), value :: n2\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), value :: kind0\r\n      integer(C_FFTW_R2R_KIND), value :: kind1\r\n      integer(C_FFTW_R2R_KIND), value :: kind2\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_r2r_3d\r\n    \r\n    type(C_PTR) function fftwl_plan_guru_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) &\r\n                         bind(C, name='fftwl_plan_guru_r2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwl_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_guru_r2r\r\n    \r\n    type(C_PTR) function fftwl_plan_guru64_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) &\r\n                         bind(C, name='fftwl_plan_guru64_r2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwl_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftwl_plan_guru64_r2r\r\n    \r\n    subroutine fftwl_execute_r2r(p,in,out) bind(C, name='fftwl_execute_r2r')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_LONG_DOUBLE), dimension(*), intent(inout) :: in\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: out\r\n    end subroutine fftwl_execute_r2r\r\n    \r\n    subroutine fftwl_destroy_plan(p) bind(C, name='fftwl_destroy_plan')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end subroutine fftwl_destroy_plan\r\n    \r\n    subroutine fftwl_forget_wisdom() bind(C, name='fftwl_forget_wisdom')\r\n      import\r\n    end subroutine fftwl_forget_wisdom\r\n    \r\n    subroutine fftwl_cleanup() bind(C, name='fftwl_cleanup')\r\n      import\r\n    end subroutine fftwl_cleanup\r\n    \r\n    subroutine fftwl_set_timelimit(t) bind(C, name='fftwl_set_timelimit')\r\n      import\r\n      real(C_DOUBLE), value :: t\r\n    end subroutine fftwl_set_timelimit\r\n    \r\n    subroutine fftwl_plan_with_nthreads(nthreads) bind(C, name='fftwl_plan_with_nthreads')\r\n      import\r\n      integer(C_INT), value :: nthreads\r\n    end subroutine fftwl_plan_with_nthreads\r\n    \r\n    integer(C_INT) function fftwl_init_threads() bind(C, name='fftwl_init_threads')\r\n      import\r\n    end function fftwl_init_threads\r\n    \r\n    subroutine fftwl_cleanup_threads() bind(C, name='fftwl_cleanup_threads')\r\n      import\r\n    end subroutine fftwl_cleanup_threads\r\n    \r\n    integer(C_INT) function fftwl_export_wisdom_to_filename(filename) bind(C, name='fftwl_export_wisdom_to_filename')\r\n      import\r\n      character(C_CHAR), dimension(*), intent(in) :: filename\r\n    end function fftwl_export_wisdom_to_filename\r\n    \r\n    subroutine fftwl_export_wisdom_to_file(output_file) bind(C, name='fftwl_export_wisdom_to_file')\r\n      import\r\n      type(C_PTR), value :: output_file\r\n    end subroutine fftwl_export_wisdom_to_file\r\n    \r\n    type(C_PTR) function fftwl_export_wisdom_to_string() bind(C, name='fftwl_export_wisdom_to_string')\r\n      import\r\n    end function fftwl_export_wisdom_to_string\r\n    \r\n    subroutine fftwl_export_wisdom(write_char,data) bind(C, name='fftwl_export_wisdom')\r\n      import\r\n      type(C_FUNPTR), value :: write_char\r\n      type(C_PTR), value :: data\r\n    end subroutine fftwl_export_wisdom\r\n    \r\n    integer(C_INT) function fftwl_import_system_wisdom() bind(C, name='fftwl_import_system_wisdom')\r\n      import\r\n    end function fftwl_import_system_wisdom\r\n    \r\n    integer(C_INT) function fftwl_import_wisdom_from_filename(filename) bind(C, name='fftwl_import_wisdom_from_filename')\r\n      import\r\n      character(C_CHAR), dimension(*), intent(in) :: filename\r\n    end function fftwl_import_wisdom_from_filename\r\n    \r\n    integer(C_INT) function fftwl_import_wisdom_from_file(input_file) bind(C, name='fftwl_import_wisdom_from_file')\r\n      import\r\n      type(C_PTR), value :: input_file\r\n    end function fftwl_import_wisdom_from_file\r\n    \r\n    integer(C_INT) function fftwl_import_wisdom_from_string(input_string) bind(C, name='fftwl_import_wisdom_from_string')\r\n      import\r\n      character(C_CHAR), dimension(*), intent(in) :: input_string\r\n    end function fftwl_import_wisdom_from_string\r\n    \r\n    integer(C_INT) function fftwl_import_wisdom(read_char,data) bind(C, name='fftwl_import_wisdom')\r\n      import\r\n      type(C_FUNPTR), value :: read_char\r\n      type(C_PTR), value :: data\r\n    end function fftwl_import_wisdom\r\n    \r\n    subroutine fftwl_fprint_plan(p,output_file) bind(C, name='fftwl_fprint_plan')\r\n      import\r\n      type(C_PTR), value :: p\r\n      type(C_PTR), value :: output_file\r\n    end subroutine fftwl_fprint_plan\r\n    \r\n    subroutine fftwl_print_plan(p) bind(C, name='fftwl_print_plan')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end subroutine fftwl_print_plan\r\n    \r\n    type(C_PTR) function fftwl_sprint_plan(p) bind(C, name='fftwl_sprint_plan')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end function fftwl_sprint_plan\r\n    \r\n    type(C_PTR) function fftwl_malloc(n) bind(C, name='fftwl_malloc')\r\n      import\r\n      integer(C_SIZE_T), value :: n\r\n    end function fftwl_malloc\r\n    \r\n    type(C_PTR) function fftwl_alloc_real(n) bind(C, name='fftwl_alloc_real')\r\n      import\r\n      integer(C_SIZE_T), value :: n\r\n    end function fftwl_alloc_real\r\n    \r\n    type(C_PTR) function fftwl_alloc_complex(n) bind(C, name='fftwl_alloc_complex')\r\n      import\r\n      integer(C_SIZE_T), value :: n\r\n    end function fftwl_alloc_complex\r\n    \r\n    subroutine fftwl_free(p) bind(C, name='fftwl_free')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end subroutine fftwl_free\r\n    \r\n    subroutine fftwl_flops(p,add,mul,fmas) bind(C, name='fftwl_flops')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_DOUBLE), intent(out) :: add\r\n      real(C_DOUBLE), intent(out) :: mul\r\n      real(C_DOUBLE), intent(out) :: fmas\r\n    end subroutine fftwl_flops\r\n    \r\n    real(C_DOUBLE) function fftwl_estimate_cost(p) bind(C, name='fftwl_estimate_cost')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end function fftwl_estimate_cost\r\n    \r\n    real(C_DOUBLE) function fftwl_cost(p) bind(C, name='fftwl_cost')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end function fftwl_cost\r\n    \r\n    integer(C_INT) function fftwl_alignment_of(p) bind(C, name='fftwl_alignment_of')\r\n      import\r\n      real(C_LONG_DOUBLE), dimension(*), intent(out) :: p\r\n    end function fftwl_alignment_of\r\n    \r\n  end interface\r\n"
  },
  {
    "path": "OptolithiumC/libs/fftw3-win32/fftw3q.f03",
    "content": "! Generated automatically.  DO NOT EDIT!\r\n\r\n\r\n  type, bind(C) :: fftwq_iodim\r\n     integer(C_INT) n, is, os\r\n  end type fftwq_iodim\r\n  type, bind(C) :: fftwq_iodim64\r\n     integer(C_INTPTR_T) n, is, os\r\n  end type fftwq_iodim64\r\n\r\n  interface\r\n    type(C_PTR) function fftwq_plan_dft(rank,n,in,out,sign,flags) bind(C, name='fftwq_plan_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      complex(16), dimension(*), intent(out) :: in\r\n      complex(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_dft\r\n    \r\n    type(C_PTR) function fftwq_plan_dft_1d(n,in,out,sign,flags) bind(C, name='fftwq_plan_dft_1d')\r\n      import\r\n      integer(C_INT), value :: n\r\n      complex(16), dimension(*), intent(out) :: in\r\n      complex(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_dft_1d\r\n    \r\n    type(C_PTR) function fftwq_plan_dft_2d(n0,n1,in,out,sign,flags) bind(C, name='fftwq_plan_dft_2d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      complex(16), dimension(*), intent(out) :: in\r\n      complex(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_dft_2d\r\n    \r\n    type(C_PTR) function fftwq_plan_dft_3d(n0,n1,n2,in,out,sign,flags) bind(C, name='fftwq_plan_dft_3d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      integer(C_INT), value :: n2\r\n      complex(16), dimension(*), intent(out) :: in\r\n      complex(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_dft_3d\r\n    \r\n    type(C_PTR) function fftwq_plan_many_dft(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,sign,flags) &\r\n                         bind(C, name='fftwq_plan_many_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      integer(C_INT), value :: howmany\r\n      complex(16), dimension(*), intent(out) :: in\r\n      integer(C_INT), dimension(*), intent(in) :: inembed\r\n      integer(C_INT), value :: istride\r\n      integer(C_INT), value :: idist\r\n      complex(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), dimension(*), intent(in) :: onembed\r\n      integer(C_INT), value :: ostride\r\n      integer(C_INT), value :: odist\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_many_dft\r\n    \r\n    type(C_PTR) function fftwq_plan_guru_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) &\r\n                         bind(C, name='fftwq_plan_guru_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwq_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims\r\n      complex(16), dimension(*), intent(out) :: in\r\n      complex(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_guru_dft\r\n    \r\n    type(C_PTR) function fftwq_plan_guru_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) &\r\n                         bind(C, name='fftwq_plan_guru_split_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwq_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(16), dimension(*), intent(out) :: ri\r\n      real(16), dimension(*), intent(out) :: ii\r\n      real(16), dimension(*), intent(out) :: ro\r\n      real(16), dimension(*), intent(out) :: io\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_guru_split_dft\r\n    \r\n    type(C_PTR) function fftwq_plan_guru64_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) &\r\n                         bind(C, name='fftwq_plan_guru64_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwq_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      complex(16), dimension(*), intent(out) :: in\r\n      complex(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: sign\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_guru64_dft\r\n    \r\n    type(C_PTR) function fftwq_plan_guru64_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) &\r\n                         bind(C, name='fftwq_plan_guru64_split_dft')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwq_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(16), dimension(*), intent(out) :: ri\r\n      real(16), dimension(*), intent(out) :: ii\r\n      real(16), dimension(*), intent(out) :: ro\r\n      real(16), dimension(*), intent(out) :: io\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_guru64_split_dft\r\n    \r\n    subroutine fftwq_execute_dft(p,in,out) bind(C, name='fftwq_execute_dft')\r\n      import\r\n      type(C_PTR), value :: p\r\n      complex(16), dimension(*), intent(inout) :: in\r\n      complex(16), dimension(*), intent(out) :: out\r\n    end subroutine fftwq_execute_dft\r\n    \r\n    subroutine fftwq_execute_split_dft(p,ri,ii,ro,io) bind(C, name='fftwq_execute_split_dft')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(16), dimension(*), intent(inout) :: ri\r\n      real(16), dimension(*), intent(inout) :: ii\r\n      real(16), dimension(*), intent(out) :: ro\r\n      real(16), dimension(*), intent(out) :: io\r\n    end subroutine fftwq_execute_split_dft\r\n    \r\n    type(C_PTR) function fftwq_plan_many_dft_r2c(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) &\r\n                         bind(C, name='fftwq_plan_many_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      integer(C_INT), value :: howmany\r\n      real(16), dimension(*), intent(out) :: in\r\n      integer(C_INT), dimension(*), intent(in) :: inembed\r\n      integer(C_INT), value :: istride\r\n      integer(C_INT), value :: idist\r\n      complex(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), dimension(*), intent(in) :: onembed\r\n      integer(C_INT), value :: ostride\r\n      integer(C_INT), value :: odist\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_many_dft_r2c\r\n    \r\n    type(C_PTR) function fftwq_plan_dft_r2c(rank,n,in,out,flags) bind(C, name='fftwq_plan_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      real(16), dimension(*), intent(out) :: in\r\n      complex(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_dft_r2c\r\n    \r\n    type(C_PTR) function fftwq_plan_dft_r2c_1d(n,in,out,flags) bind(C, name='fftwq_plan_dft_r2c_1d')\r\n      import\r\n      integer(C_INT), value :: n\r\n      real(16), dimension(*), intent(out) :: in\r\n      complex(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_dft_r2c_1d\r\n    \r\n    type(C_PTR) function fftwq_plan_dft_r2c_2d(n0,n1,in,out,flags) bind(C, name='fftwq_plan_dft_r2c_2d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      real(16), dimension(*), intent(out) :: in\r\n      complex(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_dft_r2c_2d\r\n    \r\n    type(C_PTR) function fftwq_plan_dft_r2c_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwq_plan_dft_r2c_3d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      integer(C_INT), value :: n2\r\n      real(16), dimension(*), intent(out) :: in\r\n      complex(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_dft_r2c_3d\r\n    \r\n    type(C_PTR) function fftwq_plan_many_dft_c2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) &\r\n                         bind(C, name='fftwq_plan_many_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      integer(C_INT), value :: howmany\r\n      complex(16), dimension(*), intent(out) :: in\r\n      integer(C_INT), dimension(*), intent(in) :: inembed\r\n      integer(C_INT), value :: istride\r\n      integer(C_INT), value :: idist\r\n      real(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), dimension(*), intent(in) :: onembed\r\n      integer(C_INT), value :: ostride\r\n      integer(C_INT), value :: odist\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_many_dft_c2r\r\n    \r\n    type(C_PTR) function fftwq_plan_dft_c2r(rank,n,in,out,flags) bind(C, name='fftwq_plan_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      complex(16), dimension(*), intent(out) :: in\r\n      real(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_dft_c2r\r\n    \r\n    type(C_PTR) function fftwq_plan_dft_c2r_1d(n,in,out,flags) bind(C, name='fftwq_plan_dft_c2r_1d')\r\n      import\r\n      integer(C_INT), value :: n\r\n      complex(16), dimension(*), intent(out) :: in\r\n      real(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_dft_c2r_1d\r\n    \r\n    type(C_PTR) function fftwq_plan_dft_c2r_2d(n0,n1,in,out,flags) bind(C, name='fftwq_plan_dft_c2r_2d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      complex(16), dimension(*), intent(out) :: in\r\n      real(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_dft_c2r_2d\r\n    \r\n    type(C_PTR) function fftwq_plan_dft_c2r_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwq_plan_dft_c2r_3d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      integer(C_INT), value :: n2\r\n      complex(16), dimension(*), intent(out) :: in\r\n      real(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_dft_c2r_3d\r\n    \r\n    type(C_PTR) function fftwq_plan_guru_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) &\r\n                         bind(C, name='fftwq_plan_guru_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwq_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(16), dimension(*), intent(out) :: in\r\n      complex(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_guru_dft_r2c\r\n    \r\n    type(C_PTR) function fftwq_plan_guru_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) &\r\n                         bind(C, name='fftwq_plan_guru_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwq_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims\r\n      complex(16), dimension(*), intent(out) :: in\r\n      real(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_guru_dft_c2r\r\n    \r\n    type(C_PTR) function fftwq_plan_guru_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) &\r\n                         bind(C, name='fftwq_plan_guru_split_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwq_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(16), dimension(*), intent(out) :: in\r\n      real(16), dimension(*), intent(out) :: ro\r\n      real(16), dimension(*), intent(out) :: io\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_guru_split_dft_r2c\r\n    \r\n    type(C_PTR) function fftwq_plan_guru_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) &\r\n                         bind(C, name='fftwq_plan_guru_split_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwq_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(16), dimension(*), intent(out) :: ri\r\n      real(16), dimension(*), intent(out) :: ii\r\n      real(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_guru_split_dft_c2r\r\n    \r\n    type(C_PTR) function fftwq_plan_guru64_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) &\r\n                         bind(C, name='fftwq_plan_guru64_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwq_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(16), dimension(*), intent(out) :: in\r\n      complex(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_guru64_dft_r2c\r\n    \r\n    type(C_PTR) function fftwq_plan_guru64_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) &\r\n                         bind(C, name='fftwq_plan_guru64_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwq_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      complex(16), dimension(*), intent(out) :: in\r\n      real(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_guru64_dft_c2r\r\n    \r\n    type(C_PTR) function fftwq_plan_guru64_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) &\r\n                         bind(C, name='fftwq_plan_guru64_split_dft_r2c')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwq_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(16), dimension(*), intent(out) :: in\r\n      real(16), dimension(*), intent(out) :: ro\r\n      real(16), dimension(*), intent(out) :: io\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_guru64_split_dft_r2c\r\n    \r\n    type(C_PTR) function fftwq_plan_guru64_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) &\r\n                         bind(C, name='fftwq_plan_guru64_split_dft_c2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwq_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(16), dimension(*), intent(out) :: ri\r\n      real(16), dimension(*), intent(out) :: ii\r\n      real(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_guru64_split_dft_c2r\r\n    \r\n    subroutine fftwq_execute_dft_r2c(p,in,out) bind(C, name='fftwq_execute_dft_r2c')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(16), dimension(*), intent(inout) :: in\r\n      complex(16), dimension(*), intent(out) :: out\r\n    end subroutine fftwq_execute_dft_r2c\r\n    \r\n    subroutine fftwq_execute_dft_c2r(p,in,out) bind(C, name='fftwq_execute_dft_c2r')\r\n      import\r\n      type(C_PTR), value :: p\r\n      complex(16), dimension(*), intent(inout) :: in\r\n      real(16), dimension(*), intent(out) :: out\r\n    end subroutine fftwq_execute_dft_c2r\r\n    \r\n    subroutine fftwq_execute_split_dft_r2c(p,in,ro,io) bind(C, name='fftwq_execute_split_dft_r2c')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(16), dimension(*), intent(inout) :: in\r\n      real(16), dimension(*), intent(out) :: ro\r\n      real(16), dimension(*), intent(out) :: io\r\n    end subroutine fftwq_execute_split_dft_r2c\r\n    \r\n    subroutine fftwq_execute_split_dft_c2r(p,ri,ii,out) bind(C, name='fftwq_execute_split_dft_c2r')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(16), dimension(*), intent(inout) :: ri\r\n      real(16), dimension(*), intent(inout) :: ii\r\n      real(16), dimension(*), intent(out) :: out\r\n    end subroutine fftwq_execute_split_dft_c2r\r\n    \r\n    type(C_PTR) function fftwq_plan_many_r2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,kind,flags) &\r\n                         bind(C, name='fftwq_plan_many_r2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      integer(C_INT), value :: howmany\r\n      real(16), dimension(*), intent(out) :: in\r\n      integer(C_INT), dimension(*), intent(in) :: inembed\r\n      integer(C_INT), value :: istride\r\n      integer(C_INT), value :: idist\r\n      real(16), dimension(*), intent(out) :: out\r\n      integer(C_INT), dimension(*), intent(in) :: onembed\r\n      integer(C_INT), value :: ostride\r\n      integer(C_INT), value :: odist\r\n      integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_many_r2r\r\n    \r\n    type(C_PTR) function fftwq_plan_r2r(rank,n,in,out,kind,flags) bind(C, name='fftwq_plan_r2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      integer(C_INT), dimension(*), intent(in) :: n\r\n      real(16), dimension(*), intent(out) :: in\r\n      real(16), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_r2r\r\n    \r\n    type(C_PTR) function fftwq_plan_r2r_1d(n,in,out,kind,flags) bind(C, name='fftwq_plan_r2r_1d')\r\n      import\r\n      integer(C_INT), value :: n\r\n      real(16), dimension(*), intent(out) :: in\r\n      real(16), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), value :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_r2r_1d\r\n    \r\n    type(C_PTR) function fftwq_plan_r2r_2d(n0,n1,in,out,kind0,kind1,flags) bind(C, name='fftwq_plan_r2r_2d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      real(16), dimension(*), intent(out) :: in\r\n      real(16), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), value :: kind0\r\n      integer(C_FFTW_R2R_KIND), value :: kind1\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_r2r_2d\r\n    \r\n    type(C_PTR) function fftwq_plan_r2r_3d(n0,n1,n2,in,out,kind0,kind1,kind2,flags) bind(C, name='fftwq_plan_r2r_3d')\r\n      import\r\n      integer(C_INT), value :: n0\r\n      integer(C_INT), value :: n1\r\n      integer(C_INT), value :: n2\r\n      real(16), dimension(*), intent(out) :: in\r\n      real(16), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), value :: kind0\r\n      integer(C_FFTW_R2R_KIND), value :: kind1\r\n      integer(C_FFTW_R2R_KIND), value :: kind2\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_r2r_3d\r\n    \r\n    type(C_PTR) function fftwq_plan_guru_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) &\r\n                         bind(C, name='fftwq_plan_guru_r2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwq_iodim), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims\r\n      real(16), dimension(*), intent(out) :: in\r\n      real(16), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_guru_r2r\r\n    \r\n    type(C_PTR) function fftwq_plan_guru64_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) &\r\n                         bind(C, name='fftwq_plan_guru64_r2r')\r\n      import\r\n      integer(C_INT), value :: rank\r\n      type(fftwq_iodim64), dimension(*), intent(in) :: dims\r\n      integer(C_INT), value :: howmany_rank\r\n      type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims\r\n      real(16), dimension(*), intent(out) :: in\r\n      real(16), dimension(*), intent(out) :: out\r\n      integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind\r\n      integer(C_INT), value :: flags\r\n    end function fftwq_plan_guru64_r2r\r\n    \r\n    subroutine fftwq_execute_r2r(p,in,out) bind(C, name='fftwq_execute_r2r')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(16), dimension(*), intent(inout) :: in\r\n      real(16), dimension(*), intent(out) :: out\r\n    end subroutine fftwq_execute_r2r\r\n    \r\n    subroutine fftwq_destroy_plan(p) bind(C, name='fftwq_destroy_plan')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end subroutine fftwq_destroy_plan\r\n    \r\n    subroutine fftwq_forget_wisdom() bind(C, name='fftwq_forget_wisdom')\r\n      import\r\n    end subroutine fftwq_forget_wisdom\r\n    \r\n    subroutine fftwq_cleanup() bind(C, name='fftwq_cleanup')\r\n      import\r\n    end subroutine fftwq_cleanup\r\n    \r\n    subroutine fftwq_set_timelimit(t) bind(C, name='fftwq_set_timelimit')\r\n      import\r\n      real(C_DOUBLE), value :: t\r\n    end subroutine fftwq_set_timelimit\r\n    \r\n    subroutine fftwq_plan_with_nthreads(nthreads) bind(C, name='fftwq_plan_with_nthreads')\r\n      import\r\n      integer(C_INT), value :: nthreads\r\n    end subroutine fftwq_plan_with_nthreads\r\n    \r\n    integer(C_INT) function fftwq_init_threads() bind(C, name='fftwq_init_threads')\r\n      import\r\n    end function fftwq_init_threads\r\n    \r\n    subroutine fftwq_cleanup_threads() bind(C, name='fftwq_cleanup_threads')\r\n      import\r\n    end subroutine fftwq_cleanup_threads\r\n    \r\n    integer(C_INT) function fftwq_export_wisdom_to_filename(filename) bind(C, name='fftwq_export_wisdom_to_filename')\r\n      import\r\n      character(C_CHAR), dimension(*), intent(in) :: filename\r\n    end function fftwq_export_wisdom_to_filename\r\n    \r\n    subroutine fftwq_export_wisdom_to_file(output_file) bind(C, name='fftwq_export_wisdom_to_file')\r\n      import\r\n      type(C_PTR), value :: output_file\r\n    end subroutine fftwq_export_wisdom_to_file\r\n    \r\n    type(C_PTR) function fftwq_export_wisdom_to_string() bind(C, name='fftwq_export_wisdom_to_string')\r\n      import\r\n    end function fftwq_export_wisdom_to_string\r\n    \r\n    subroutine fftwq_export_wisdom(write_char,data) bind(C, name='fftwq_export_wisdom')\r\n      import\r\n      type(C_FUNPTR), value :: write_char\r\n      type(C_PTR), value :: data\r\n    end subroutine fftwq_export_wisdom\r\n    \r\n    integer(C_INT) function fftwq_import_system_wisdom() bind(C, name='fftwq_import_system_wisdom')\r\n      import\r\n    end function fftwq_import_system_wisdom\r\n    \r\n    integer(C_INT) function fftwq_import_wisdom_from_filename(filename) bind(C, name='fftwq_import_wisdom_from_filename')\r\n      import\r\n      character(C_CHAR), dimension(*), intent(in) :: filename\r\n    end function fftwq_import_wisdom_from_filename\r\n    \r\n    integer(C_INT) function fftwq_import_wisdom_from_file(input_file) bind(C, name='fftwq_import_wisdom_from_file')\r\n      import\r\n      type(C_PTR), value :: input_file\r\n    end function fftwq_import_wisdom_from_file\r\n    \r\n    integer(C_INT) function fftwq_import_wisdom_from_string(input_string) bind(C, name='fftwq_import_wisdom_from_string')\r\n      import\r\n      character(C_CHAR), dimension(*), intent(in) :: input_string\r\n    end function fftwq_import_wisdom_from_string\r\n    \r\n    integer(C_INT) function fftwq_import_wisdom(read_char,data) bind(C, name='fftwq_import_wisdom')\r\n      import\r\n      type(C_FUNPTR), value :: read_char\r\n      type(C_PTR), value :: data\r\n    end function fftwq_import_wisdom\r\n    \r\n    subroutine fftwq_fprint_plan(p,output_file) bind(C, name='fftwq_fprint_plan')\r\n      import\r\n      type(C_PTR), value :: p\r\n      type(C_PTR), value :: output_file\r\n    end subroutine fftwq_fprint_plan\r\n    \r\n    subroutine fftwq_print_plan(p) bind(C, name='fftwq_print_plan')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end subroutine fftwq_print_plan\r\n    \r\n    type(C_PTR) function fftwq_sprint_plan(p) bind(C, name='fftwq_sprint_plan')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end function fftwq_sprint_plan\r\n    \r\n    type(C_PTR) function fftwq_malloc(n) bind(C, name='fftwq_malloc')\r\n      import\r\n      integer(C_SIZE_T), value :: n\r\n    end function fftwq_malloc\r\n    \r\n! Unable to generate Fortran interface for fftwq_alloc_real\r\n    type(C_PTR) function fftwq_alloc_complex(n) bind(C, name='fftwq_alloc_complex')\r\n      import\r\n      integer(C_SIZE_T), value :: n\r\n    end function fftwq_alloc_complex\r\n    \r\n    subroutine fftwq_free(p) bind(C, name='fftwq_free')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end subroutine fftwq_free\r\n    \r\n    subroutine fftwq_flops(p,add,mul,fmas) bind(C, name='fftwq_flops')\r\n      import\r\n      type(C_PTR), value :: p\r\n      real(C_DOUBLE), intent(out) :: add\r\n      real(C_DOUBLE), intent(out) :: mul\r\n      real(C_DOUBLE), intent(out) :: fmas\r\n    end subroutine fftwq_flops\r\n    \r\n    real(C_DOUBLE) function fftwq_estimate_cost(p) bind(C, name='fftwq_estimate_cost')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end function fftwq_estimate_cost\r\n    \r\n    real(C_DOUBLE) function fftwq_cost(p) bind(C, name='fftwq_cost')\r\n      import\r\n      type(C_PTR), value :: p\r\n    end function fftwq_cost\r\n    \r\n    integer(C_INT) function fftwq_alignment_of(p) bind(C, name='fftwq_alignment_of')\r\n      import\r\n      real(16), dimension(*), intent(out) :: p\r\n    end function fftwq_alignment_of\r\n    \r\n  end interface\r\n"
  },
  {
    "path": "OptolithiumC/libs/fftw3-win32/libfftw3-3.def",
    "content": "LIBRARY libfftw3-3.dll\r\nEXPORTS\r\ndfftw_cleanup_\r\ndfftw_cleanup__\r\ndfftw_cleanup_threads_\r\ndfftw_cleanup_threads__\r\ndfftw_cost_\r\ndfftw_cost__\r\ndfftw_destroy_plan_\r\ndfftw_destroy_plan__\r\ndfftw_estimate_cost_\r\ndfftw_estimate_cost__\r\ndfftw_execute_\r\ndfftw_execute__\r\ndfftw_execute_dft_\r\ndfftw_execute_dft__\r\ndfftw_execute_dft_c2r_\r\ndfftw_execute_dft_c2r__\r\ndfftw_execute_dft_r2c_\r\ndfftw_execute_dft_r2c__\r\ndfftw_execute_r2r_\r\ndfftw_execute_r2r__\r\ndfftw_execute_split_dft_\r\ndfftw_execute_split_dft__\r\ndfftw_execute_split_dft_c2r_\r\ndfftw_execute_split_dft_c2r__\r\ndfftw_execute_split_dft_r2c_\r\ndfftw_execute_split_dft_r2c__\r\ndfftw_export_wisdom_\r\ndfftw_export_wisdom__\r\ndfftw_flops_\r\ndfftw_flops__\r\ndfftw_forget_wisdom_\r\ndfftw_forget_wisdom__\r\ndfftw_import_system_wisdom_\r\ndfftw_import_system_wisdom__\r\ndfftw_import_wisdom_\r\ndfftw_import_wisdom__\r\ndfftw_init_threads_\r\ndfftw_init_threads__\r\ndfftw_plan_dft_\r\ndfftw_plan_dft_1d_\r\ndfftw_plan_dft_1d__\r\ndfftw_plan_dft_2d_\r\ndfftw_plan_dft_2d__\r\ndfftw_plan_dft_3d_\r\ndfftw_plan_dft_3d__\r\ndfftw_plan_dft__\r\ndfftw_plan_dft_c2r_\r\ndfftw_plan_dft_c2r_1d_\r\ndfftw_plan_dft_c2r_1d__\r\ndfftw_plan_dft_c2r_2d_\r\ndfftw_plan_dft_c2r_2d__\r\ndfftw_plan_dft_c2r_3d_\r\ndfftw_plan_dft_c2r_3d__\r\ndfftw_plan_dft_c2r__\r\ndfftw_plan_dft_r2c_\r\ndfftw_plan_dft_r2c_1d_\r\ndfftw_plan_dft_r2c_1d__\r\ndfftw_plan_dft_r2c_2d_\r\ndfftw_plan_dft_r2c_2d__\r\ndfftw_plan_dft_r2c_3d_\r\ndfftw_plan_dft_r2c_3d__\r\ndfftw_plan_dft_r2c__\r\ndfftw_plan_guru_dft_\r\ndfftw_plan_guru_dft__\r\ndfftw_plan_guru_dft_c2r_\r\ndfftw_plan_guru_dft_c2r__\r\ndfftw_plan_guru_dft_r2c_\r\ndfftw_plan_guru_dft_r2c__\r\ndfftw_plan_guru_r2r_\r\ndfftw_plan_guru_r2r__\r\ndfftw_plan_guru_split_dft_\r\ndfftw_plan_guru_split_dft__\r\ndfftw_plan_guru_split_dft_c2r_\r\ndfftw_plan_guru_split_dft_c2r__\r\ndfftw_plan_guru_split_dft_r2c_\r\ndfftw_plan_guru_split_dft_r2c__\r\ndfftw_plan_many_dft_\r\ndfftw_plan_many_dft__\r\ndfftw_plan_many_dft_c2r_\r\ndfftw_plan_many_dft_c2r__\r\ndfftw_plan_many_dft_r2c_\r\ndfftw_plan_many_dft_r2c__\r\ndfftw_plan_many_r2r_\r\ndfftw_plan_many_r2r__\r\ndfftw_plan_r2r_\r\ndfftw_plan_r2r_1d_\r\ndfftw_plan_r2r_1d__\r\ndfftw_plan_r2r_2d_\r\ndfftw_plan_r2r_2d__\r\ndfftw_plan_r2r_3d_\r\ndfftw_plan_r2r_3d__\r\ndfftw_plan_r2r__\r\ndfftw_plan_with_nthreads_\r\ndfftw_plan_with_nthreads__\r\ndfftw_print_plan_\r\ndfftw_print_plan__\r\ndfftw_set_timelimit_\r\ndfftw_set_timelimit__\r\nfftw_alignment_of\r\nfftw_alloc_complex\r\nfftw_alloc_real\r\nfftw_assertion_failed\r\nfftw_bufdist\r\nfftw_check_alignment_of_sse2_pm\r\nfftw_choose_radix\r\nfftw_cleanup\r\nfftw_cleanup_threads\r\nfftw_codelet_e01_8\r\nfftw_codelet_e10_8\r\nfftw_codelet_hb2_16\r\nfftw_codelet_hb2_20\r\nfftw_codelet_hb2_25\r\nfftw_codelet_hb2_32\r\nfftw_codelet_hb2_4\r\nfftw_codelet_hb2_5\r\nfftw_codelet_hb2_8\r\nfftw_codelet_hb_10\r\nfftw_codelet_hb_12\r\nfftw_codelet_hb_15\r\nfftw_codelet_hb_16\r\nfftw_codelet_hb_2\r\nfftw_codelet_hb_20\r\nfftw_codelet_hb_25\r\nfftw_codelet_hb_3\r\nfftw_codelet_hb_32\r\nfftw_codelet_hb_4\r\nfftw_codelet_hb_5\r\nfftw_codelet_hb_6\r\nfftw_codelet_hb_64\r\nfftw_codelet_hb_7\r\nfftw_codelet_hb_8\r\nfftw_codelet_hb_9\r\nfftw_codelet_hc2cb2_16\r\nfftw_codelet_hc2cb2_20\r\nfftw_codelet_hc2cb2_32\r\nfftw_codelet_hc2cb2_4\r\nfftw_codelet_hc2cb2_8\r\nfftw_codelet_hc2cb_10\r\nfftw_codelet_hc2cb_12\r\nfftw_codelet_hc2cb_16\r\nfftw_codelet_hc2cb_2\r\nfftw_codelet_hc2cb_20\r\nfftw_codelet_hc2cb_32\r\nfftw_codelet_hc2cb_4\r\nfftw_codelet_hc2cb_6\r\nfftw_codelet_hc2cb_8\r\nfftw_codelet_hc2cbdft2_16\r\nfftw_codelet_hc2cbdft2_20\r\nfftw_codelet_hc2cbdft2_32\r\nfftw_codelet_hc2cbdft2_4\r\nfftw_codelet_hc2cbdft2_8\r\nfftw_codelet_hc2cbdft_10\r\nfftw_codelet_hc2cbdft_12\r\nfftw_codelet_hc2cbdft_16\r\nfftw_codelet_hc2cbdft_2\r\nfftw_codelet_hc2cbdft_20\r\nfftw_codelet_hc2cbdft_32\r\nfftw_codelet_hc2cbdft_4\r\nfftw_codelet_hc2cbdft_6\r\nfftw_codelet_hc2cbdft_8\r\nfftw_codelet_hc2cbdftv_10_avx\r\nfftw_codelet_hc2cbdftv_10_sse2\r\nfftw_codelet_hc2cbdftv_12_avx\r\nfftw_codelet_hc2cbdftv_12_sse2\r\nfftw_codelet_hc2cbdftv_16_avx\r\nfftw_codelet_hc2cbdftv_16_sse2\r\nfftw_codelet_hc2cbdftv_20_avx\r\nfftw_codelet_hc2cbdftv_20_sse2\r\nfftw_codelet_hc2cbdftv_2_avx\r\nfftw_codelet_hc2cbdftv_2_sse2\r\nfftw_codelet_hc2cbdftv_32_avx\r\nfftw_codelet_hc2cbdftv_32_sse2\r\nfftw_codelet_hc2cbdftv_4_avx\r\nfftw_codelet_hc2cbdftv_4_sse2\r\nfftw_codelet_hc2cbdftv_6_avx\r\nfftw_codelet_hc2cbdftv_6_sse2\r\nfftw_codelet_hc2cbdftv_8_avx\r\nfftw_codelet_hc2cbdftv_8_sse2\r\nfftw_codelet_hc2cf2_16\r\nfftw_codelet_hc2cf2_20\r\nfftw_codelet_hc2cf2_32\r\nfftw_codelet_hc2cf2_4\r\nfftw_codelet_hc2cf2_8\r\nfftw_codelet_hc2cf_10\r\nfftw_codelet_hc2cf_12\r\nfftw_codelet_hc2cf_16\r\nfftw_codelet_hc2cf_2\r\nfftw_codelet_hc2cf_20\r\nfftw_codelet_hc2cf_32\r\nfftw_codelet_hc2cf_4\r\nfftw_codelet_hc2cf_6\r\nfftw_codelet_hc2cf_8\r\nfftw_codelet_hc2cfdft2_16\r\nfftw_codelet_hc2cfdft2_20\r\nfftw_codelet_hc2cfdft2_32\r\nfftw_codelet_hc2cfdft2_4\r\nfftw_codelet_hc2cfdft2_8\r\nfftw_codelet_hc2cfdft_10\r\nfftw_codelet_hc2cfdft_12\r\nfftw_codelet_hc2cfdft_16\r\nfftw_codelet_hc2cfdft_2\r\nfftw_codelet_hc2cfdft_20\r\nfftw_codelet_hc2cfdft_32\r\nfftw_codelet_hc2cfdft_4\r\nfftw_codelet_hc2cfdft_6\r\nfftw_codelet_hc2cfdft_8\r\nfftw_codelet_hc2cfdftv_10_avx\r\nfftw_codelet_hc2cfdftv_10_sse2\r\nfftw_codelet_hc2cfdftv_12_avx\r\nfftw_codelet_hc2cfdftv_12_sse2\r\nfftw_codelet_hc2cfdftv_16_avx\r\nfftw_codelet_hc2cfdftv_16_sse2\r\nfftw_codelet_hc2cfdftv_20_avx\r\nfftw_codelet_hc2cfdftv_20_sse2\r\nfftw_codelet_hc2cfdftv_2_avx\r\nfftw_codelet_hc2cfdftv_2_sse2\r\nfftw_codelet_hc2cfdftv_32_avx\r\nfftw_codelet_hc2cfdftv_32_sse2\r\nfftw_codelet_hc2cfdftv_4_avx\r\nfftw_codelet_hc2cfdftv_4_sse2\r\nfftw_codelet_hc2cfdftv_6_avx\r\nfftw_codelet_hc2cfdftv_6_sse2\r\nfftw_codelet_hc2cfdftv_8_avx\r\nfftw_codelet_hc2cfdftv_8_sse2\r\nfftw_codelet_hf2_16\r\nfftw_codelet_hf2_20\r\nfftw_codelet_hf2_25\r\nfftw_codelet_hf2_32\r\nfftw_codelet_hf2_4\r\nfftw_codelet_hf2_5\r\nfftw_codelet_hf2_8\r\nfftw_codelet_hf_10\r\nfftw_codelet_hf_12\r\nfftw_codelet_hf_15\r\nfftw_codelet_hf_16\r\nfftw_codelet_hf_2\r\nfftw_codelet_hf_20\r\nfftw_codelet_hf_25\r\nfftw_codelet_hf_3\r\nfftw_codelet_hf_32\r\nfftw_codelet_hf_4\r\nfftw_codelet_hf_5\r\nfftw_codelet_hf_6\r\nfftw_codelet_hf_64\r\nfftw_codelet_hf_7\r\nfftw_codelet_hf_8\r\nfftw_codelet_hf_9\r\nfftw_codelet_n1_10\r\nfftw_codelet_n1_11\r\nfftw_codelet_n1_12\r\nfftw_codelet_n1_13\r\nfftw_codelet_n1_14\r\nfftw_codelet_n1_15\r\nfftw_codelet_n1_16\r\nfftw_codelet_n1_2\r\nfftw_codelet_n1_20\r\nfftw_codelet_n1_25\r\nfftw_codelet_n1_3\r\nfftw_codelet_n1_32\r\nfftw_codelet_n1_4\r\nfftw_codelet_n1_5\r\nfftw_codelet_n1_6\r\nfftw_codelet_n1_64\r\nfftw_codelet_n1_7\r\nfftw_codelet_n1_8\r\nfftw_codelet_n1_9\r\nfftw_codelet_n1bv_10_avx\r\nfftw_codelet_n1bv_10_sse2\r\nfftw_codelet_n1bv_11_avx\r\nfftw_codelet_n1bv_11_sse2\r\nfftw_codelet_n1bv_128_avx\r\nfftw_codelet_n1bv_128_sse2\r\nfftw_codelet_n1bv_12_avx\r\nfftw_codelet_n1bv_12_sse2\r\nfftw_codelet_n1bv_13_avx\r\nfftw_codelet_n1bv_13_sse2\r\nfftw_codelet_n1bv_14_avx\r\nfftw_codelet_n1bv_14_sse2\r\nfftw_codelet_n1bv_15_avx\r\nfftw_codelet_n1bv_15_sse2\r\nfftw_codelet_n1bv_16_avx\r\nfftw_codelet_n1bv_16_sse2\r\nfftw_codelet_n1bv_20_avx\r\nfftw_codelet_n1bv_20_sse2\r\nfftw_codelet_n1bv_25_avx\r\nfftw_codelet_n1bv_25_sse2\r\nfftw_codelet_n1bv_2_avx\r\nfftw_codelet_n1bv_2_sse2\r\nfftw_codelet_n1bv_32_avx\r\nfftw_codelet_n1bv_32_sse2\r\nfftw_codelet_n1bv_3_avx\r\nfftw_codelet_n1bv_3_sse2\r\nfftw_codelet_n1bv_4_avx\r\nfftw_codelet_n1bv_4_sse2\r\nfftw_codelet_n1bv_5_avx\r\nfftw_codelet_n1bv_5_sse2\r\nfftw_codelet_n1bv_64_avx\r\nfftw_codelet_n1bv_64_sse2\r\nfftw_codelet_n1bv_6_avx\r\nfftw_codelet_n1bv_6_sse2\r\nfftw_codelet_n1bv_7_avx\r\nfftw_codelet_n1bv_7_sse2\r\nfftw_codelet_n1bv_8_avx\r\nfftw_codelet_n1bv_8_sse2\r\nfftw_codelet_n1bv_9_avx\r\nfftw_codelet_n1bv_9_sse2\r\nfftw_codelet_n1fv_10_avx\r\nfftw_codelet_n1fv_10_sse2\r\nfftw_codelet_n1fv_11_avx\r\nfftw_codelet_n1fv_11_sse2\r\nfftw_codelet_n1fv_128_avx\r\nfftw_codelet_n1fv_128_sse2\r\nfftw_codelet_n1fv_12_avx\r\nfftw_codelet_n1fv_12_sse2\r\nfftw_codelet_n1fv_13_avx\r\nfftw_codelet_n1fv_13_sse2\r\nfftw_codelet_n1fv_14_avx\r\nfftw_codelet_n1fv_14_sse2\r\nfftw_codelet_n1fv_15_avx\r\nfftw_codelet_n1fv_15_sse2\r\nfftw_codelet_n1fv_16_avx\r\nfftw_codelet_n1fv_16_sse2\r\nfftw_codelet_n1fv_20_avx\r\nfftw_codelet_n1fv_20_sse2\r\nfftw_codelet_n1fv_25_avx\r\nfftw_codelet_n1fv_25_sse2\r\nfftw_codelet_n1fv_2_avx\r\nfftw_codelet_n1fv_2_sse2\r\nfftw_codelet_n1fv_32_avx\r\nfftw_codelet_n1fv_32_sse2\r\nfftw_codelet_n1fv_3_avx\r\nfftw_codelet_n1fv_3_sse2\r\nfftw_codelet_n1fv_4_avx\r\nfftw_codelet_n1fv_4_sse2\r\nfftw_codelet_n1fv_5_avx\r\nfftw_codelet_n1fv_5_sse2\r\nfftw_codelet_n1fv_64_avx\r\nfftw_codelet_n1fv_64_sse2\r\nfftw_codelet_n1fv_6_avx\r\nfftw_codelet_n1fv_6_sse2\r\nfftw_codelet_n1fv_7_avx\r\nfftw_codelet_n1fv_7_sse2\r\nfftw_codelet_n1fv_8_avx\r\nfftw_codelet_n1fv_8_sse2\r\nfftw_codelet_n1fv_9_avx\r\nfftw_codelet_n1fv_9_sse2\r\nfftw_codelet_n2bv_10_avx\r\nfftw_codelet_n2bv_10_sse2\r\nfftw_codelet_n2bv_12_avx\r\nfftw_codelet_n2bv_12_sse2\r\nfftw_codelet_n2bv_14_avx\r\nfftw_codelet_n2bv_14_sse2\r\nfftw_codelet_n2bv_16_avx\r\nfftw_codelet_n2bv_16_sse2\r\nfftw_codelet_n2bv_20_avx\r\nfftw_codelet_n2bv_20_sse2\r\nfftw_codelet_n2bv_2_avx\r\nfftw_codelet_n2bv_2_sse2\r\nfftw_codelet_n2bv_32_avx\r\nfftw_codelet_n2bv_32_sse2\r\nfftw_codelet_n2bv_4_avx\r\nfftw_codelet_n2bv_4_sse2\r\nfftw_codelet_n2bv_64_avx\r\nfftw_codelet_n2bv_64_sse2\r\nfftw_codelet_n2bv_6_avx\r\nfftw_codelet_n2bv_6_sse2\r\nfftw_codelet_n2bv_8_avx\r\nfftw_codelet_n2bv_8_sse2\r\nfftw_codelet_n2fv_10_avx\r\nfftw_codelet_n2fv_10_sse2\r\nfftw_codelet_n2fv_12_avx\r\nfftw_codelet_n2fv_12_sse2\r\nfftw_codelet_n2fv_14_avx\r\nfftw_codelet_n2fv_14_sse2\r\nfftw_codelet_n2fv_16_avx\r\nfftw_codelet_n2fv_16_sse2\r\nfftw_codelet_n2fv_20_avx\r\nfftw_codelet_n2fv_20_sse2\r\nfftw_codelet_n2fv_2_avx\r\nfftw_codelet_n2fv_2_sse2\r\nfftw_codelet_n2fv_32_avx\r\nfftw_codelet_n2fv_32_sse2\r\nfftw_codelet_n2fv_4_avx\r\nfftw_codelet_n2fv_4_sse2\r\nfftw_codelet_n2fv_64_avx\r\nfftw_codelet_n2fv_64_sse2\r\nfftw_codelet_n2fv_6_avx\r\nfftw_codelet_n2fv_6_sse2\r\nfftw_codelet_n2fv_8_avx\r\nfftw_codelet_n2fv_8_sse2\r\nfftw_codelet_n2sv_16_avx\r\nfftw_codelet_n2sv_16_sse2\r\nfftw_codelet_n2sv_32_avx\r\nfftw_codelet_n2sv_32_sse2\r\nfftw_codelet_n2sv_4_avx\r\nfftw_codelet_n2sv_4_sse2\r\nfftw_codelet_n2sv_64_avx\r\nfftw_codelet_n2sv_64_sse2\r\nfftw_codelet_n2sv_8_avx\r\nfftw_codelet_n2sv_8_sse2\r\nfftw_codelet_q1_2\r\nfftw_codelet_q1_3\r\nfftw_codelet_q1_4\r\nfftw_codelet_q1_5\r\nfftw_codelet_q1_6\r\nfftw_codelet_q1_8\r\nfftw_codelet_q1bv_2_avx\r\nfftw_codelet_q1bv_2_sse2\r\nfftw_codelet_q1bv_4_avx\r\nfftw_codelet_q1bv_4_sse2\r\nfftw_codelet_q1bv_5_avx\r\nfftw_codelet_q1bv_5_sse2\r\nfftw_codelet_q1bv_8_avx\r\nfftw_codelet_q1bv_8_sse2\r\nfftw_codelet_q1fv_2_avx\r\nfftw_codelet_q1fv_2_sse2\r\nfftw_codelet_q1fv_4_avx\r\nfftw_codelet_q1fv_4_sse2\r\nfftw_codelet_q1fv_5_avx\r\nfftw_codelet_q1fv_5_sse2\r\nfftw_codelet_q1fv_8_avx\r\nfftw_codelet_q1fv_8_sse2\r\nfftw_codelet_r2cbIII_10\r\nfftw_codelet_r2cbIII_12\r\nfftw_codelet_r2cbIII_15\r\nfftw_codelet_r2cbIII_16\r\nfftw_codelet_r2cbIII_2\r\nfftw_codelet_r2cbIII_20\r\nfftw_codelet_r2cbIII_25\r\nfftw_codelet_r2cbIII_3\r\nfftw_codelet_r2cbIII_32\r\nfftw_codelet_r2cbIII_4\r\nfftw_codelet_r2cbIII_5\r\nfftw_codelet_r2cbIII_6\r\nfftw_codelet_r2cbIII_64\r\nfftw_codelet_r2cbIII_7\r\nfftw_codelet_r2cbIII_8\r\nfftw_codelet_r2cbIII_9\r\nfftw_codelet_r2cb_10\r\nfftw_codelet_r2cb_11\r\nfftw_codelet_r2cb_12\r\nfftw_codelet_r2cb_128\r\nfftw_codelet_r2cb_13\r\nfftw_codelet_r2cb_14\r\nfftw_codelet_r2cb_15\r\nfftw_codelet_r2cb_16\r\nfftw_codelet_r2cb_2\r\nfftw_codelet_r2cb_20\r\nfftw_codelet_r2cb_25\r\nfftw_codelet_r2cb_3\r\nfftw_codelet_r2cb_32\r\nfftw_codelet_r2cb_4\r\nfftw_codelet_r2cb_5\r\nfftw_codelet_r2cb_6\r\nfftw_codelet_r2cb_64\r\nfftw_codelet_r2cb_7\r\nfftw_codelet_r2cb_8\r\nfftw_codelet_r2cb_9\r\nfftw_codelet_r2cfII_10\r\nfftw_codelet_r2cfII_12\r\nfftw_codelet_r2cfII_15\r\nfftw_codelet_r2cfII_16\r\nfftw_codelet_r2cfII_2\r\nfftw_codelet_r2cfII_20\r\nfftw_codelet_r2cfII_25\r\nfftw_codelet_r2cfII_3\r\nfftw_codelet_r2cfII_32\r\nfftw_codelet_r2cfII_4\r\nfftw_codelet_r2cfII_5\r\nfftw_codelet_r2cfII_6\r\nfftw_codelet_r2cfII_64\r\nfftw_codelet_r2cfII_7\r\nfftw_codelet_r2cfII_8\r\nfftw_codelet_r2cfII_9\r\nfftw_codelet_r2cf_10\r\nfftw_codelet_r2cf_11\r\nfftw_codelet_r2cf_12\r\nfftw_codelet_r2cf_128\r\nfftw_codelet_r2cf_13\r\nfftw_codelet_r2cf_14\r\nfftw_codelet_r2cf_15\r\nfftw_codelet_r2cf_16\r\nfftw_codelet_r2cf_2\r\nfftw_codelet_r2cf_20\r\nfftw_codelet_r2cf_25\r\nfftw_codelet_r2cf_3\r\nfftw_codelet_r2cf_32\r\nfftw_codelet_r2cf_4\r\nfftw_codelet_r2cf_5\r\nfftw_codelet_r2cf_6\r\nfftw_codelet_r2cf_64\r\nfftw_codelet_r2cf_7\r\nfftw_codelet_r2cf_8\r\nfftw_codelet_r2cf_9\r\nfftw_codelet_t1_10\r\nfftw_codelet_t1_12\r\nfftw_codelet_t1_15\r\nfftw_codelet_t1_16\r\nfftw_codelet_t1_2\r\nfftw_codelet_t1_20\r\nfftw_codelet_t1_25\r\nfftw_codelet_t1_3\r\nfftw_codelet_t1_32\r\nfftw_codelet_t1_4\r\nfftw_codelet_t1_5\r\nfftw_codelet_t1_6\r\nfftw_codelet_t1_64\r\nfftw_codelet_t1_7\r\nfftw_codelet_t1_8\r\nfftw_codelet_t1_9\r\nfftw_codelet_t1buv_10_avx\r\nfftw_codelet_t1buv_10_sse2\r\nfftw_codelet_t1buv_2_avx\r\nfftw_codelet_t1buv_2_sse2\r\nfftw_codelet_t1buv_3_avx\r\nfftw_codelet_t1buv_3_sse2\r\nfftw_codelet_t1buv_4_avx\r\nfftw_codelet_t1buv_4_sse2\r\nfftw_codelet_t1buv_5_avx\r\nfftw_codelet_t1buv_5_sse2\r\nfftw_codelet_t1buv_6_avx\r\nfftw_codelet_t1buv_6_sse2\r\nfftw_codelet_t1buv_7_avx\r\nfftw_codelet_t1buv_7_sse2\r\nfftw_codelet_t1buv_8_avx\r\nfftw_codelet_t1buv_8_sse2\r\nfftw_codelet_t1buv_9_avx\r\nfftw_codelet_t1buv_9_sse2\r\nfftw_codelet_t1bv_10_avx\r\nfftw_codelet_t1bv_10_sse2\r\nfftw_codelet_t1bv_12_avx\r\nfftw_codelet_t1bv_12_sse2\r\nfftw_codelet_t1bv_15_avx\r\nfftw_codelet_t1bv_15_sse2\r\nfftw_codelet_t1bv_16_avx\r\nfftw_codelet_t1bv_16_sse2\r\nfftw_codelet_t1bv_20_avx\r\nfftw_codelet_t1bv_20_sse2\r\nfftw_codelet_t1bv_25_avx\r\nfftw_codelet_t1bv_25_sse2\r\nfftw_codelet_t1bv_2_avx\r\nfftw_codelet_t1bv_2_sse2\r\nfftw_codelet_t1bv_32_avx\r\nfftw_codelet_t1bv_32_sse2\r\nfftw_codelet_t1bv_3_avx\r\nfftw_codelet_t1bv_3_sse2\r\nfftw_codelet_t1bv_4_avx\r\nfftw_codelet_t1bv_4_sse2\r\nfftw_codelet_t1bv_5_avx\r\nfftw_codelet_t1bv_5_sse2\r\nfftw_codelet_t1bv_64_avx\r\nfftw_codelet_t1bv_64_sse2\r\nfftw_codelet_t1bv_6_avx\r\nfftw_codelet_t1bv_6_sse2\r\nfftw_codelet_t1bv_7_avx\r\nfftw_codelet_t1bv_7_sse2\r\nfftw_codelet_t1bv_8_avx\r\nfftw_codelet_t1bv_8_sse2\r\nfftw_codelet_t1bv_9_avx\r\nfftw_codelet_t1bv_9_sse2\r\nfftw_codelet_t1fuv_10_avx\r\nfftw_codelet_t1fuv_10_sse2\r\nfftw_codelet_t1fuv_2_avx\r\nfftw_codelet_t1fuv_2_sse2\r\nfftw_codelet_t1fuv_3_avx\r\nfftw_codelet_t1fuv_3_sse2\r\nfftw_codelet_t1fuv_4_avx\r\nfftw_codelet_t1fuv_4_sse2\r\nfftw_codelet_t1fuv_5_avx\r\nfftw_codelet_t1fuv_5_sse2\r\nfftw_codelet_t1fuv_6_avx\r\nfftw_codelet_t1fuv_6_sse2\r\nfftw_codelet_t1fuv_7_avx\r\nfftw_codelet_t1fuv_7_sse2\r\nfftw_codelet_t1fuv_8_avx\r\nfftw_codelet_t1fuv_8_sse2\r\nfftw_codelet_t1fuv_9_avx\r\nfftw_codelet_t1fuv_9_sse2\r\nfftw_codelet_t1fv_10_avx\r\nfftw_codelet_t1fv_10_sse2\r\nfftw_codelet_t1fv_12_avx\r\nfftw_codelet_t1fv_12_sse2\r\nfftw_codelet_t1fv_15_avx\r\nfftw_codelet_t1fv_15_sse2\r\nfftw_codelet_t1fv_16_avx\r\nfftw_codelet_t1fv_16_sse2\r\nfftw_codelet_t1fv_20_avx\r\nfftw_codelet_t1fv_20_sse2\r\nfftw_codelet_t1fv_25_avx\r\nfftw_codelet_t1fv_25_sse2\r\nfftw_codelet_t1fv_2_avx\r\nfftw_codelet_t1fv_2_sse2\r\nfftw_codelet_t1fv_32_avx\r\nfftw_codelet_t1fv_32_sse2\r\nfftw_codelet_t1fv_3_avx\r\nfftw_codelet_t1fv_3_sse2\r\nfftw_codelet_t1fv_4_avx\r\nfftw_codelet_t1fv_4_sse2\r\nfftw_codelet_t1fv_5_avx\r\nfftw_codelet_t1fv_5_sse2\r\nfftw_codelet_t1fv_64_avx\r\nfftw_codelet_t1fv_64_sse2\r\nfftw_codelet_t1fv_6_avx\r\nfftw_codelet_t1fv_6_sse2\r\nfftw_codelet_t1fv_7_avx\r\nfftw_codelet_t1fv_7_sse2\r\nfftw_codelet_t1fv_8_avx\r\nfftw_codelet_t1fv_8_sse2\r\nfftw_codelet_t1fv_9_avx\r\nfftw_codelet_t1fv_9_sse2\r\nfftw_codelet_t1sv_16_avx\r\nfftw_codelet_t1sv_16_sse2\r\nfftw_codelet_t1sv_2_avx\r\nfftw_codelet_t1sv_2_sse2\r\nfftw_codelet_t1sv_32_avx\r\nfftw_codelet_t1sv_32_sse2\r\nfftw_codelet_t1sv_4_avx\r\nfftw_codelet_t1sv_4_sse2\r\nfftw_codelet_t1sv_8_avx\r\nfftw_codelet_t1sv_8_sse2\r\nfftw_codelet_t2_10\r\nfftw_codelet_t2_16\r\nfftw_codelet_t2_20\r\nfftw_codelet_t2_25\r\nfftw_codelet_t2_32\r\nfftw_codelet_t2_4\r\nfftw_codelet_t2_5\r\nfftw_codelet_t2_64\r\nfftw_codelet_t2_8\r\nfftw_codelet_t2bv_10_avx\r\nfftw_codelet_t2bv_10_sse2\r\nfftw_codelet_t2bv_16_avx\r\nfftw_codelet_t2bv_16_sse2\r\nfftw_codelet_t2bv_20_avx\r\nfftw_codelet_t2bv_20_sse2\r\nfftw_codelet_t2bv_25_avx\r\nfftw_codelet_t2bv_25_sse2\r\nfftw_codelet_t2bv_2_avx\r\nfftw_codelet_t2bv_2_sse2\r\nfftw_codelet_t2bv_32_avx\r\nfftw_codelet_t2bv_32_sse2\r\nfftw_codelet_t2bv_4_avx\r\nfftw_codelet_t2bv_4_sse2\r\nfftw_codelet_t2bv_5_avx\r\nfftw_codelet_t2bv_5_sse2\r\nfftw_codelet_t2bv_64_avx\r\nfftw_codelet_t2bv_64_sse2\r\nfftw_codelet_t2bv_8_avx\r\nfftw_codelet_t2bv_8_sse2\r\nfftw_codelet_t2fv_10_avx\r\nfftw_codelet_t2fv_10_sse2\r\nfftw_codelet_t2fv_16_avx\r\nfftw_codelet_t2fv_16_sse2\r\nfftw_codelet_t2fv_20_avx\r\nfftw_codelet_t2fv_20_sse2\r\nfftw_codelet_t2fv_25_avx\r\nfftw_codelet_t2fv_25_sse2\r\nfftw_codelet_t2fv_2_avx\r\nfftw_codelet_t2fv_2_sse2\r\nfftw_codelet_t2fv_32_avx\r\nfftw_codelet_t2fv_32_sse2\r\nfftw_codelet_t2fv_4_avx\r\nfftw_codelet_t2fv_4_sse2\r\nfftw_codelet_t2fv_5_avx\r\nfftw_codelet_t2fv_5_sse2\r\nfftw_codelet_t2fv_64_avx\r\nfftw_codelet_t2fv_64_sse2\r\nfftw_codelet_t2fv_8_avx\r\nfftw_codelet_t2fv_8_sse2\r\nfftw_codelet_t2sv_16_avx\r\nfftw_codelet_t2sv_16_sse2\r\nfftw_codelet_t2sv_32_avx\r\nfftw_codelet_t2sv_32_sse2\r\nfftw_codelet_t2sv_4_avx\r\nfftw_codelet_t2sv_4_sse2\r\nfftw_codelet_t2sv_8_avx\r\nfftw_codelet_t2sv_8_sse2\r\nfftw_codelet_t3bv_10_avx\r\nfftw_codelet_t3bv_10_sse2\r\nfftw_codelet_t3bv_16_avx\r\nfftw_codelet_t3bv_16_sse2\r\nfftw_codelet_t3bv_20_avx\r\nfftw_codelet_t3bv_20_sse2\r\nfftw_codelet_t3bv_25_avx\r\nfftw_codelet_t3bv_25_sse2\r\nfftw_codelet_t3bv_32_avx\r\nfftw_codelet_t3bv_32_sse2\r\nfftw_codelet_t3bv_4_avx\r\nfftw_codelet_t3bv_4_sse2\r\nfftw_codelet_t3bv_5_avx\r\nfftw_codelet_t3bv_5_sse2\r\nfftw_codelet_t3bv_8_avx\r\nfftw_codelet_t3bv_8_sse2\r\nfftw_codelet_t3fv_10_avx\r\nfftw_codelet_t3fv_10_sse2\r\nfftw_codelet_t3fv_16_avx\r\nfftw_codelet_t3fv_16_sse2\r\nfftw_codelet_t3fv_20_avx\r\nfftw_codelet_t3fv_20_sse2\r\nfftw_codelet_t3fv_25_avx\r\nfftw_codelet_t3fv_25_sse2\r\nfftw_codelet_t3fv_32_avx\r\nfftw_codelet_t3fv_32_sse2\r\nfftw_codelet_t3fv_4_avx\r\nfftw_codelet_t3fv_4_sse2\r\nfftw_codelet_t3fv_5_avx\r\nfftw_codelet_t3fv_5_sse2\r\nfftw_codelet_t3fv_8_avx\r\nfftw_codelet_t3fv_8_sse2\r\nfftw_compute_tilesz\r\nfftw_configure_planner\r\nfftw_cost\r\nfftw_cpy1d\r\nfftw_cpy2d\r\nfftw_cpy2d_ci\r\nfftw_cpy2d_co\r\nfftw_cpy2d_pair\r\nfftw_cpy2d_pair_ci\r\nfftw_cpy2d_pair_co\r\nfftw_cpy2d_tiled\r\nfftw_cpy2d_tiledbuf\r\nfftw_ct_applicable\r\nfftw_ct_generic_register\r\nfftw_ct_genericbuf_register\r\nfftw_ct_uglyp\r\nfftw_destroy_plan\r\nfftw_dft_bluestein_register\r\nfftw_dft_buffered_register\r\nfftw_dft_conf_standard\r\nfftw_dft_generic_register\r\nfftw_dft_indirect_register\r\nfftw_dft_indirect_transpose_register\r\nfftw_dft_nop_register\r\nfftw_dft_r2hc_register\r\nfftw_dft_rader_register\r\nfftw_dft_rank_geq2_register\r\nfftw_dft_solve\r\nfftw_dft_thr_vrank_geq1_register\r\nfftw_dft_vrank_geq1_register\r\nfftw_dft_zerotens\r\nfftw_dht_r2hc_register\r\nfftw_dht_rader_register\r\nfftw_dimcmp\r\nfftw_elapsed_since\r\nfftw_estimate_cost\r\nfftw_execute\r\nfftw_execute_dft\r\nfftw_execute_dft_c2r\r\nfftw_execute_dft_r2c\r\nfftw_execute_r2r\r\nfftw_execute_split_dft\r\nfftw_execute_split_dft_c2r\r\nfftw_execute_split_dft_r2c\r\nfftw_export_wisdom\r\nfftw_export_wisdom_to_file\r\nfftw_export_wisdom_to_filename\r\nfftw_export_wisdom_to_string\r\nfftw_extract_reim\r\nfftw_factors_into\r\nfftw_factors_into_small_primes\r\nfftw_find_generator\r\nfftw_first_divisor\r\nfftw_flops\r\nfftw_forget_wisdom\r\nfftw_fprint_plan\r\nfftw_free\r\nfftw_get_crude_time\r\nfftw_guru64_kosherp\r\nfftw_guru_kosherp\r\nfftw_hash\r\nfftw_have_simd_avx\r\nfftw_have_simd_sse2\r\nfftw_hc2c_applicable\r\nfftw_hc2hc_applicable\r\nfftw_hc2hc_generic_register\r\nfftw_iabs\r\nfftw_iestimate_cost\r\nfftw_ifree\r\nfftw_ifree0\r\nfftw_imax\r\nfftw_imin\r\nfftw_import_system_wisdom\r\nfftw_import_wisdom\r\nfftw_import_wisdom_from_file\r\nfftw_import_wisdom_from_filename\r\nfftw_import_wisdom_from_string\r\nfftw_init_threads\r\nfftw_is_prime\r\nfftw_isqrt\r\nfftw_ithreads_init\r\nfftw_join_taint\r\nfftw_kdft_dif_register\r\nfftw_kdft_difsq_register\r\nfftw_kdft_dit_register\r\nfftw_kdft_register\r\nfftw_kernel_free\r\nfftw_kernel_malloc\r\nfftw_khc2c_register\r\nfftw_khc2hc_register\r\nfftw_kr2c_register\r\nfftw_kr2r_register\r\nfftw_malloc\r\nfftw_malloc_plain\r\nfftw_many_kosherp\r\nfftw_map_r2r_kind\r\nfftw_mapflags\r\nfftw_md5INT\r\nfftw_md5begin\r\nfftw_md5end\r\nfftw_md5int\r\nfftw_md5putb\r\nfftw_md5putc\r\nfftw_md5puts\r\nfftw_md5unsigned\r\nfftw_measure_execution_time\r\nfftw_mkapiplan\r\nfftw_mkplan\r\nfftw_mkplan_d\r\nfftw_mkplan_dft\r\nfftw_mkplan_dftw\r\nfftw_mkplan_f_d\r\nfftw_mkplan_hc2c\r\nfftw_mkplan_hc2hc\r\nfftw_mkplan_rdft\r\nfftw_mkplan_rdft2\r\nfftw_mkplanner\r\nfftw_mkprinter\r\nfftw_mkprinter_cnt\r\nfftw_mkprinter_file\r\nfftw_mkprinter_str\r\nfftw_mkproblem\r\nfftw_mkproblem_dft\r\nfftw_mkproblem_dft_d\r\nfftw_mkproblem_rdft\r\nfftw_mkproblem_rdft2\r\nfftw_mkproblem_rdft2_d\r\nfftw_mkproblem_rdft2_d_3pointers\r\nfftw_mkproblem_rdft_0_d\r\nfftw_mkproblem_rdft_1\r\nfftw_mkproblem_rdft_1_d\r\nfftw_mkproblem_rdft_d\r\nfftw_mkproblem_unsolvable\r\nfftw_mkscanner\r\nfftw_mksolver\r\nfftw_mksolver_ct\r\nfftw_mksolver_ct_threads\r\nfftw_mksolver_dft_direct\r\nfftw_mksolver_dft_directbuf\r\nfftw_mksolver_hc2c\r\nfftw_mksolver_hc2hc\r\nfftw_mksolver_hc2hc_threads\r\nfftw_mksolver_rdft2_direct\r\nfftw_mksolver_rdft_r2c_direct\r\nfftw_mksolver_rdft_r2c_directbuf\r\nfftw_mksolver_rdft_r2r_direct\r\nfftw_mkstride\r\nfftw_mktensor\r\nfftw_mktensor_0d\r\nfftw_mktensor_1d\r\nfftw_mktensor_2d\r\nfftw_mktensor_3d\r\nfftw_mktensor_4d\r\nfftw_mktensor_5d\r\nfftw_mktensor_iodims\r\nfftw_mktensor_iodims64\r\nfftw_mktensor_rowmajor\r\nfftw_mktriggen\r\nfftw_modulo\r\nfftw_nbuf\r\nfftw_nbuf_redundant\r\nfftw_next_prime\r\nfftw_null_awake\r\nfftw_ops_add\r\nfftw_ops_add2\r\nfftw_ops_cpy\r\nfftw_ops_madd\r\nfftw_ops_madd2\r\nfftw_ops_other\r\nfftw_ops_zero\r\nfftw_pickdim\r\nfftw_plan_awake\r\nfftw_plan_destroy_internal\r\nfftw_plan_dft\r\nfftw_plan_dft_1d\r\nfftw_plan_dft_2d\r\nfftw_plan_dft_3d\r\nfftw_plan_dft_c2r\r\nfftw_plan_dft_c2r_1d\r\nfftw_plan_dft_c2r_2d\r\nfftw_plan_dft_c2r_3d\r\nfftw_plan_dft_r2c\r\nfftw_plan_dft_r2c_1d\r\nfftw_plan_dft_r2c_2d\r\nfftw_plan_dft_r2c_3d\r\nfftw_plan_guru64_dft\r\nfftw_plan_guru64_dft_c2r\r\nfftw_plan_guru64_dft_r2c\r\nfftw_plan_guru64_r2r\r\nfftw_plan_guru64_split_dft\r\nfftw_plan_guru64_split_dft_c2r\r\nfftw_plan_guru64_split_dft_r2c\r\nfftw_plan_guru_dft\r\nfftw_plan_guru_dft_c2r\r\nfftw_plan_guru_dft_r2c\r\nfftw_plan_guru_r2r\r\nfftw_plan_guru_split_dft\r\nfftw_plan_guru_split_dft_c2r\r\nfftw_plan_guru_split_dft_r2c\r\nfftw_plan_many_dft\r\nfftw_plan_many_dft_c2r\r\nfftw_plan_many_dft_r2c\r\nfftw_plan_many_r2r\r\nfftw_plan_null_destroy\r\nfftw_plan_r2r\r\nfftw_plan_r2r_1d\r\nfftw_plan_r2r_2d\r\nfftw_plan_r2r_3d\r\nfftw_plan_with_nthreads\r\nfftw_planner_destroy\r\nfftw_power_mod\r\nfftw_print_plan\r\nfftw_printer_destroy\r\nfftw_problem_destroy\r\nfftw_rader_tl_delete\r\nfftw_rader_tl_find\r\nfftw_rader_tl_insert\r\nfftw_rdft2_buffered_register\r\nfftw_rdft2_complex_n\r\nfftw_rdft2_inplace_strides\r\nfftw_rdft2_nop_register\r\nfftw_rdft2_pad\r\nfftw_rdft2_rank0_register\r\nfftw_rdft2_rank_geq2_register\r\nfftw_rdft2_rdft_register\r\nfftw_rdft2_solve\r\nfftw_rdft2_strides\r\nfftw_rdft2_tensor_max_index\r\nfftw_rdft2_thr_vrank_geq1_register\r\nfftw_rdft2_vrank_geq1_register\r\nfftw_rdft_buffered_register\r\nfftw_rdft_conf_standard\r\nfftw_rdft_dht_register\r\nfftw_rdft_generic_register\r\nfftw_rdft_indirect_register\r\nfftw_rdft_kind_str\r\nfftw_rdft_nop_register\r\nfftw_rdft_rank0_register\r\nfftw_rdft_rank_geq2_register\r\nfftw_rdft_solve\r\nfftw_rdft_thr_vrank_geq1_register\r\nfftw_rdft_vrank3_transpose_register\r\nfftw_rdft_vrank_geq1_register\r\nfftw_rdft_zerotens\r\nfftw_redft00e_r2hc_pad_register\r\nfftw_regsolver_ct_directw\r\nfftw_regsolver_ct_directwsq\r\nfftw_regsolver_hc2c_direct\r\nfftw_regsolver_hc2hc_direct\r\nfftw_reodft00e_splitradix_register\r\nfftw_reodft010e_r2hc_register\r\nfftw_reodft11e_r2hc_odd_register\r\nfftw_reodft11e_radix2_r2hc_register\r\nfftw_reodft_conf_standard\r\nfftw_rodft00e_r2hc_pad_register\r\nfftw_safe_mulmod\r\nfftw_scanner_destroy\r\nfftw_set_timelimit\r\nfftw_solver_destroy\r\nfftw_solver_register\r\nfftw_solver_use\r\nfftw_solvtab_exec\r\nfftw_spawn_loop\r\nfftw_sprint_plan\r\nfftw_stride_destroy\r\nfftw_taint\r\nfftw_tensor_append\r\nfftw_tensor_compress\r\nfftw_tensor_compress_contiguous\r\nfftw_tensor_copy\r\nfftw_tensor_copy_except\r\nfftw_tensor_copy_inplace\r\nfftw_tensor_copy_sub\r\nfftw_tensor_destroy\r\nfftw_tensor_destroy2\r\nfftw_tensor_destroy4\r\nfftw_tensor_equal\r\nfftw_tensor_inplace_locations\r\nfftw_tensor_inplace_strides\r\nfftw_tensor_inplace_strides2\r\nfftw_tensor_kosherp\r\nfftw_tensor_max_index\r\nfftw_tensor_md5\r\nfftw_tensor_min_istride\r\nfftw_tensor_min_ostride\r\nfftw_tensor_min_stride\r\nfftw_tensor_print\r\nfftw_tensor_split\r\nfftw_tensor_strides_decrease\r\nfftw_tensor_sz\r\nfftw_tensor_tornk1\r\nfftw_the_planner\r\nfftw_threads_cleanup\r\nfftw_threads_conf_standard\r\nfftw_tile2d\r\nfftw_toobig\r\nfftw_transpose\r\nfftw_transpose_tiled\r\nfftw_transpose_tiledbuf\r\nfftw_triggen_destroy\r\nfftw_twiddle_awake\r\nfftw_twiddle_length\r\n"
  },
  {
    "path": "OptolithiumC/libs/fftw3-win32/libfftw3f-3.def",
    "content": "LIBRARY libfftw3f-3.dll\r\nEXPORTS\r\nfftwf_alignment_of\r\nfftwf_alloc_complex\r\nfftwf_alloc_real\r\nfftwf_assertion_failed\r\nfftwf_bufdist\r\nfftwf_check_alignment_of_sse2_pm\r\nfftwf_choose_radix\r\nfftwf_cleanup\r\nfftwf_cleanup_threads\r\nfftwf_codelet_e01_8\r\nfftwf_codelet_e10_8\r\nfftwf_codelet_hb2_16\r\nfftwf_codelet_hb2_20\r\nfftwf_codelet_hb2_25\r\nfftwf_codelet_hb2_32\r\nfftwf_codelet_hb2_4\r\nfftwf_codelet_hb2_5\r\nfftwf_codelet_hb2_8\r\nfftwf_codelet_hb_10\r\nfftwf_codelet_hb_12\r\nfftwf_codelet_hb_15\r\nfftwf_codelet_hb_16\r\nfftwf_codelet_hb_2\r\nfftwf_codelet_hb_20\r\nfftwf_codelet_hb_25\r\nfftwf_codelet_hb_3\r\nfftwf_codelet_hb_32\r\nfftwf_codelet_hb_4\r\nfftwf_codelet_hb_5\r\nfftwf_codelet_hb_6\r\nfftwf_codelet_hb_64\r\nfftwf_codelet_hb_7\r\nfftwf_codelet_hb_8\r\nfftwf_codelet_hb_9\r\nfftwf_codelet_hc2cb2_16\r\nfftwf_codelet_hc2cb2_20\r\nfftwf_codelet_hc2cb2_32\r\nfftwf_codelet_hc2cb2_4\r\nfftwf_codelet_hc2cb2_8\r\nfftwf_codelet_hc2cb_10\r\nfftwf_codelet_hc2cb_12\r\nfftwf_codelet_hc2cb_16\r\nfftwf_codelet_hc2cb_2\r\nfftwf_codelet_hc2cb_20\r\nfftwf_codelet_hc2cb_32\r\nfftwf_codelet_hc2cb_4\r\nfftwf_codelet_hc2cb_6\r\nfftwf_codelet_hc2cb_8\r\nfftwf_codelet_hc2cbdft2_16\r\nfftwf_codelet_hc2cbdft2_20\r\nfftwf_codelet_hc2cbdft2_32\r\nfftwf_codelet_hc2cbdft2_4\r\nfftwf_codelet_hc2cbdft2_8\r\nfftwf_codelet_hc2cbdft_10\r\nfftwf_codelet_hc2cbdft_12\r\nfftwf_codelet_hc2cbdft_16\r\nfftwf_codelet_hc2cbdft_2\r\nfftwf_codelet_hc2cbdft_20\r\nfftwf_codelet_hc2cbdft_32\r\nfftwf_codelet_hc2cbdft_4\r\nfftwf_codelet_hc2cbdft_6\r\nfftwf_codelet_hc2cbdft_8\r\nfftwf_codelet_hc2cbdftv_10_avx\r\nfftwf_codelet_hc2cbdftv_10_sse2\r\nfftwf_codelet_hc2cbdftv_12_avx\r\nfftwf_codelet_hc2cbdftv_12_sse2\r\nfftwf_codelet_hc2cbdftv_16_avx\r\nfftwf_codelet_hc2cbdftv_16_sse2\r\nfftwf_codelet_hc2cbdftv_20_avx\r\nfftwf_codelet_hc2cbdftv_20_sse2\r\nfftwf_codelet_hc2cbdftv_2_avx\r\nfftwf_codelet_hc2cbdftv_2_sse2\r\nfftwf_codelet_hc2cbdftv_32_avx\r\nfftwf_codelet_hc2cbdftv_32_sse2\r\nfftwf_codelet_hc2cbdftv_4_avx\r\nfftwf_codelet_hc2cbdftv_4_sse2\r\nfftwf_codelet_hc2cbdftv_6_avx\r\nfftwf_codelet_hc2cbdftv_6_sse2\r\nfftwf_codelet_hc2cbdftv_8_avx\r\nfftwf_codelet_hc2cbdftv_8_sse2\r\nfftwf_codelet_hc2cf2_16\r\nfftwf_codelet_hc2cf2_20\r\nfftwf_codelet_hc2cf2_32\r\nfftwf_codelet_hc2cf2_4\r\nfftwf_codelet_hc2cf2_8\r\nfftwf_codelet_hc2cf_10\r\nfftwf_codelet_hc2cf_12\r\nfftwf_codelet_hc2cf_16\r\nfftwf_codelet_hc2cf_2\r\nfftwf_codelet_hc2cf_20\r\nfftwf_codelet_hc2cf_32\r\nfftwf_codelet_hc2cf_4\r\nfftwf_codelet_hc2cf_6\r\nfftwf_codelet_hc2cf_8\r\nfftwf_codelet_hc2cfdft2_16\r\nfftwf_codelet_hc2cfdft2_20\r\nfftwf_codelet_hc2cfdft2_32\r\nfftwf_codelet_hc2cfdft2_4\r\nfftwf_codelet_hc2cfdft2_8\r\nfftwf_codelet_hc2cfdft_10\r\nfftwf_codelet_hc2cfdft_12\r\nfftwf_codelet_hc2cfdft_16\r\nfftwf_codelet_hc2cfdft_2\r\nfftwf_codelet_hc2cfdft_20\r\nfftwf_codelet_hc2cfdft_32\r\nfftwf_codelet_hc2cfdft_4\r\nfftwf_codelet_hc2cfdft_6\r\nfftwf_codelet_hc2cfdft_8\r\nfftwf_codelet_hc2cfdftv_10_avx\r\nfftwf_codelet_hc2cfdftv_10_sse2\r\nfftwf_codelet_hc2cfdftv_12_avx\r\nfftwf_codelet_hc2cfdftv_12_sse2\r\nfftwf_codelet_hc2cfdftv_16_avx\r\nfftwf_codelet_hc2cfdftv_16_sse2\r\nfftwf_codelet_hc2cfdftv_20_avx\r\nfftwf_codelet_hc2cfdftv_20_sse2\r\nfftwf_codelet_hc2cfdftv_2_avx\r\nfftwf_codelet_hc2cfdftv_2_sse2\r\nfftwf_codelet_hc2cfdftv_32_avx\r\nfftwf_codelet_hc2cfdftv_32_sse2\r\nfftwf_codelet_hc2cfdftv_4_avx\r\nfftwf_codelet_hc2cfdftv_4_sse2\r\nfftwf_codelet_hc2cfdftv_6_avx\r\nfftwf_codelet_hc2cfdftv_6_sse2\r\nfftwf_codelet_hc2cfdftv_8_avx\r\nfftwf_codelet_hc2cfdftv_8_sse2\r\nfftwf_codelet_hf2_16\r\nfftwf_codelet_hf2_20\r\nfftwf_codelet_hf2_25\r\nfftwf_codelet_hf2_32\r\nfftwf_codelet_hf2_4\r\nfftwf_codelet_hf2_5\r\nfftwf_codelet_hf2_8\r\nfftwf_codelet_hf_10\r\nfftwf_codelet_hf_12\r\nfftwf_codelet_hf_15\r\nfftwf_codelet_hf_16\r\nfftwf_codelet_hf_2\r\nfftwf_codelet_hf_20\r\nfftwf_codelet_hf_25\r\nfftwf_codelet_hf_3\r\nfftwf_codelet_hf_32\r\nfftwf_codelet_hf_4\r\nfftwf_codelet_hf_5\r\nfftwf_codelet_hf_6\r\nfftwf_codelet_hf_64\r\nfftwf_codelet_hf_7\r\nfftwf_codelet_hf_8\r\nfftwf_codelet_hf_9\r\nfftwf_codelet_n1_10\r\nfftwf_codelet_n1_11\r\nfftwf_codelet_n1_12\r\nfftwf_codelet_n1_13\r\nfftwf_codelet_n1_14\r\nfftwf_codelet_n1_15\r\nfftwf_codelet_n1_16\r\nfftwf_codelet_n1_2\r\nfftwf_codelet_n1_20\r\nfftwf_codelet_n1_25\r\nfftwf_codelet_n1_3\r\nfftwf_codelet_n1_32\r\nfftwf_codelet_n1_4\r\nfftwf_codelet_n1_5\r\nfftwf_codelet_n1_6\r\nfftwf_codelet_n1_64\r\nfftwf_codelet_n1_7\r\nfftwf_codelet_n1_8\r\nfftwf_codelet_n1_9\r\nfftwf_codelet_n1bv_10_avx\r\nfftwf_codelet_n1bv_10_sse2\r\nfftwf_codelet_n1bv_11_avx\r\nfftwf_codelet_n1bv_11_sse2\r\nfftwf_codelet_n1bv_128_avx\r\nfftwf_codelet_n1bv_128_sse2\r\nfftwf_codelet_n1bv_12_avx\r\nfftwf_codelet_n1bv_12_sse2\r\nfftwf_codelet_n1bv_13_avx\r\nfftwf_codelet_n1bv_13_sse2\r\nfftwf_codelet_n1bv_14_avx\r\nfftwf_codelet_n1bv_14_sse2\r\nfftwf_codelet_n1bv_15_avx\r\nfftwf_codelet_n1bv_15_sse2\r\nfftwf_codelet_n1bv_16_avx\r\nfftwf_codelet_n1bv_16_sse2\r\nfftwf_codelet_n1bv_20_avx\r\nfftwf_codelet_n1bv_20_sse2\r\nfftwf_codelet_n1bv_25_avx\r\nfftwf_codelet_n1bv_25_sse2\r\nfftwf_codelet_n1bv_2_avx\r\nfftwf_codelet_n1bv_2_sse2\r\nfftwf_codelet_n1bv_32_avx\r\nfftwf_codelet_n1bv_32_sse2\r\nfftwf_codelet_n1bv_3_avx\r\nfftwf_codelet_n1bv_3_sse2\r\nfftwf_codelet_n1bv_4_avx\r\nfftwf_codelet_n1bv_4_sse2\r\nfftwf_codelet_n1bv_5_avx\r\nfftwf_codelet_n1bv_5_sse2\r\nfftwf_codelet_n1bv_64_avx\r\nfftwf_codelet_n1bv_64_sse2\r\nfftwf_codelet_n1bv_6_avx\r\nfftwf_codelet_n1bv_6_sse2\r\nfftwf_codelet_n1bv_7_avx\r\nfftwf_codelet_n1bv_7_sse2\r\nfftwf_codelet_n1bv_8_avx\r\nfftwf_codelet_n1bv_8_sse2\r\nfftwf_codelet_n1bv_9_avx\r\nfftwf_codelet_n1bv_9_sse2\r\nfftwf_codelet_n1fv_10_avx\r\nfftwf_codelet_n1fv_10_sse2\r\nfftwf_codelet_n1fv_11_avx\r\nfftwf_codelet_n1fv_11_sse2\r\nfftwf_codelet_n1fv_128_avx\r\nfftwf_codelet_n1fv_128_sse2\r\nfftwf_codelet_n1fv_12_avx\r\nfftwf_codelet_n1fv_12_sse2\r\nfftwf_codelet_n1fv_13_avx\r\nfftwf_codelet_n1fv_13_sse2\r\nfftwf_codelet_n1fv_14_avx\r\nfftwf_codelet_n1fv_14_sse2\r\nfftwf_codelet_n1fv_15_avx\r\nfftwf_codelet_n1fv_15_sse2\r\nfftwf_codelet_n1fv_16_avx\r\nfftwf_codelet_n1fv_16_sse2\r\nfftwf_codelet_n1fv_20_avx\r\nfftwf_codelet_n1fv_20_sse2\r\nfftwf_codelet_n1fv_25_avx\r\nfftwf_codelet_n1fv_25_sse2\r\nfftwf_codelet_n1fv_2_avx\r\nfftwf_codelet_n1fv_2_sse2\r\nfftwf_codelet_n1fv_32_avx\r\nfftwf_codelet_n1fv_32_sse2\r\nfftwf_codelet_n1fv_3_avx\r\nfftwf_codelet_n1fv_3_sse2\r\nfftwf_codelet_n1fv_4_avx\r\nfftwf_codelet_n1fv_4_sse2\r\nfftwf_codelet_n1fv_5_avx\r\nfftwf_codelet_n1fv_5_sse2\r\nfftwf_codelet_n1fv_64_avx\r\nfftwf_codelet_n1fv_64_sse2\r\nfftwf_codelet_n1fv_6_avx\r\nfftwf_codelet_n1fv_6_sse2\r\nfftwf_codelet_n1fv_7_avx\r\nfftwf_codelet_n1fv_7_sse2\r\nfftwf_codelet_n1fv_8_avx\r\nfftwf_codelet_n1fv_8_sse2\r\nfftwf_codelet_n1fv_9_avx\r\nfftwf_codelet_n1fv_9_sse2\r\nfftwf_codelet_n2bv_10_avx\r\nfftwf_codelet_n2bv_10_sse2\r\nfftwf_codelet_n2bv_12_avx\r\nfftwf_codelet_n2bv_12_sse2\r\nfftwf_codelet_n2bv_14_avx\r\nfftwf_codelet_n2bv_14_sse2\r\nfftwf_codelet_n2bv_16_avx\r\nfftwf_codelet_n2bv_16_sse2\r\nfftwf_codelet_n2bv_20_avx\r\nfftwf_codelet_n2bv_20_sse2\r\nfftwf_codelet_n2bv_2_avx\r\nfftwf_codelet_n2bv_2_sse2\r\nfftwf_codelet_n2bv_32_avx\r\nfftwf_codelet_n2bv_32_sse2\r\nfftwf_codelet_n2bv_4_avx\r\nfftwf_codelet_n2bv_4_sse2\r\nfftwf_codelet_n2bv_64_avx\r\nfftwf_codelet_n2bv_64_sse2\r\nfftwf_codelet_n2bv_6_avx\r\nfftwf_codelet_n2bv_6_sse2\r\nfftwf_codelet_n2bv_8_avx\r\nfftwf_codelet_n2bv_8_sse2\r\nfftwf_codelet_n2fv_10_avx\r\nfftwf_codelet_n2fv_10_sse2\r\nfftwf_codelet_n2fv_12_avx\r\nfftwf_codelet_n2fv_12_sse2\r\nfftwf_codelet_n2fv_14_avx\r\nfftwf_codelet_n2fv_14_sse2\r\nfftwf_codelet_n2fv_16_avx\r\nfftwf_codelet_n2fv_16_sse2\r\nfftwf_codelet_n2fv_20_avx\r\nfftwf_codelet_n2fv_20_sse2\r\nfftwf_codelet_n2fv_2_avx\r\nfftwf_codelet_n2fv_2_sse2\r\nfftwf_codelet_n2fv_32_avx\r\nfftwf_codelet_n2fv_32_sse2\r\nfftwf_codelet_n2fv_4_avx\r\nfftwf_codelet_n2fv_4_sse2\r\nfftwf_codelet_n2fv_64_avx\r\nfftwf_codelet_n2fv_64_sse2\r\nfftwf_codelet_n2fv_6_avx\r\nfftwf_codelet_n2fv_6_sse2\r\nfftwf_codelet_n2fv_8_avx\r\nfftwf_codelet_n2fv_8_sse2\r\nfftwf_codelet_n2sv_16_avx\r\nfftwf_codelet_n2sv_16_sse2\r\nfftwf_codelet_n2sv_32_avx\r\nfftwf_codelet_n2sv_32_sse2\r\nfftwf_codelet_n2sv_4_avx\r\nfftwf_codelet_n2sv_4_sse2\r\nfftwf_codelet_n2sv_64_avx\r\nfftwf_codelet_n2sv_64_sse2\r\nfftwf_codelet_n2sv_8_avx\r\nfftwf_codelet_n2sv_8_sse2\r\nfftwf_codelet_q1_2\r\nfftwf_codelet_q1_3\r\nfftwf_codelet_q1_4\r\nfftwf_codelet_q1_5\r\nfftwf_codelet_q1_6\r\nfftwf_codelet_q1_8\r\nfftwf_codelet_q1bv_2_avx\r\nfftwf_codelet_q1bv_2_sse2\r\nfftwf_codelet_q1bv_4_avx\r\nfftwf_codelet_q1bv_4_sse2\r\nfftwf_codelet_q1bv_5_avx\r\nfftwf_codelet_q1bv_5_sse2\r\nfftwf_codelet_q1bv_8_avx\r\nfftwf_codelet_q1bv_8_sse2\r\nfftwf_codelet_q1fv_2_avx\r\nfftwf_codelet_q1fv_2_sse2\r\nfftwf_codelet_q1fv_4_avx\r\nfftwf_codelet_q1fv_4_sse2\r\nfftwf_codelet_q1fv_5_avx\r\nfftwf_codelet_q1fv_5_sse2\r\nfftwf_codelet_q1fv_8_avx\r\nfftwf_codelet_q1fv_8_sse2\r\nfftwf_codelet_r2cbIII_10\r\nfftwf_codelet_r2cbIII_12\r\nfftwf_codelet_r2cbIII_15\r\nfftwf_codelet_r2cbIII_16\r\nfftwf_codelet_r2cbIII_2\r\nfftwf_codelet_r2cbIII_20\r\nfftwf_codelet_r2cbIII_25\r\nfftwf_codelet_r2cbIII_3\r\nfftwf_codelet_r2cbIII_32\r\nfftwf_codelet_r2cbIII_4\r\nfftwf_codelet_r2cbIII_5\r\nfftwf_codelet_r2cbIII_6\r\nfftwf_codelet_r2cbIII_64\r\nfftwf_codelet_r2cbIII_7\r\nfftwf_codelet_r2cbIII_8\r\nfftwf_codelet_r2cbIII_9\r\nfftwf_codelet_r2cb_10\r\nfftwf_codelet_r2cb_11\r\nfftwf_codelet_r2cb_12\r\nfftwf_codelet_r2cb_128\r\nfftwf_codelet_r2cb_13\r\nfftwf_codelet_r2cb_14\r\nfftwf_codelet_r2cb_15\r\nfftwf_codelet_r2cb_16\r\nfftwf_codelet_r2cb_2\r\nfftwf_codelet_r2cb_20\r\nfftwf_codelet_r2cb_25\r\nfftwf_codelet_r2cb_3\r\nfftwf_codelet_r2cb_32\r\nfftwf_codelet_r2cb_4\r\nfftwf_codelet_r2cb_5\r\nfftwf_codelet_r2cb_6\r\nfftwf_codelet_r2cb_64\r\nfftwf_codelet_r2cb_7\r\nfftwf_codelet_r2cb_8\r\nfftwf_codelet_r2cb_9\r\nfftwf_codelet_r2cfII_10\r\nfftwf_codelet_r2cfII_12\r\nfftwf_codelet_r2cfII_15\r\nfftwf_codelet_r2cfII_16\r\nfftwf_codelet_r2cfII_2\r\nfftwf_codelet_r2cfII_20\r\nfftwf_codelet_r2cfII_25\r\nfftwf_codelet_r2cfII_3\r\nfftwf_codelet_r2cfII_32\r\nfftwf_codelet_r2cfII_4\r\nfftwf_codelet_r2cfII_5\r\nfftwf_codelet_r2cfII_6\r\nfftwf_codelet_r2cfII_64\r\nfftwf_codelet_r2cfII_7\r\nfftwf_codelet_r2cfII_8\r\nfftwf_codelet_r2cfII_9\r\nfftwf_codelet_r2cf_10\r\nfftwf_codelet_r2cf_11\r\nfftwf_codelet_r2cf_12\r\nfftwf_codelet_r2cf_128\r\nfftwf_codelet_r2cf_13\r\nfftwf_codelet_r2cf_14\r\nfftwf_codelet_r2cf_15\r\nfftwf_codelet_r2cf_16\r\nfftwf_codelet_r2cf_2\r\nfftwf_codelet_r2cf_20\r\nfftwf_codelet_r2cf_25\r\nfftwf_codelet_r2cf_3\r\nfftwf_codelet_r2cf_32\r\nfftwf_codelet_r2cf_4\r\nfftwf_codelet_r2cf_5\r\nfftwf_codelet_r2cf_6\r\nfftwf_codelet_r2cf_64\r\nfftwf_codelet_r2cf_7\r\nfftwf_codelet_r2cf_8\r\nfftwf_codelet_r2cf_9\r\nfftwf_codelet_t1_10\r\nfftwf_codelet_t1_12\r\nfftwf_codelet_t1_15\r\nfftwf_codelet_t1_16\r\nfftwf_codelet_t1_2\r\nfftwf_codelet_t1_20\r\nfftwf_codelet_t1_25\r\nfftwf_codelet_t1_3\r\nfftwf_codelet_t1_32\r\nfftwf_codelet_t1_4\r\nfftwf_codelet_t1_5\r\nfftwf_codelet_t1_6\r\nfftwf_codelet_t1_64\r\nfftwf_codelet_t1_7\r\nfftwf_codelet_t1_8\r\nfftwf_codelet_t1_9\r\nfftwf_codelet_t1buv_10_avx\r\nfftwf_codelet_t1buv_10_sse2\r\nfftwf_codelet_t1buv_2_avx\r\nfftwf_codelet_t1buv_2_sse2\r\nfftwf_codelet_t1buv_3_avx\r\nfftwf_codelet_t1buv_3_sse2\r\nfftwf_codelet_t1buv_4_avx\r\nfftwf_codelet_t1buv_4_sse2\r\nfftwf_codelet_t1buv_5_avx\r\nfftwf_codelet_t1buv_5_sse2\r\nfftwf_codelet_t1buv_6_avx\r\nfftwf_codelet_t1buv_6_sse2\r\nfftwf_codelet_t1buv_7_avx\r\nfftwf_codelet_t1buv_7_sse2\r\nfftwf_codelet_t1buv_8_avx\r\nfftwf_codelet_t1buv_8_sse2\r\nfftwf_codelet_t1buv_9_avx\r\nfftwf_codelet_t1buv_9_sse2\r\nfftwf_codelet_t1bv_10_avx\r\nfftwf_codelet_t1bv_10_sse2\r\nfftwf_codelet_t1bv_12_avx\r\nfftwf_codelet_t1bv_12_sse2\r\nfftwf_codelet_t1bv_15_avx\r\nfftwf_codelet_t1bv_15_sse2\r\nfftwf_codelet_t1bv_16_avx\r\nfftwf_codelet_t1bv_16_sse2\r\nfftwf_codelet_t1bv_20_avx\r\nfftwf_codelet_t1bv_20_sse2\r\nfftwf_codelet_t1bv_25_avx\r\nfftwf_codelet_t1bv_25_sse2\r\nfftwf_codelet_t1bv_2_avx\r\nfftwf_codelet_t1bv_2_sse2\r\nfftwf_codelet_t1bv_32_avx\r\nfftwf_codelet_t1bv_32_sse2\r\nfftwf_codelet_t1bv_3_avx\r\nfftwf_codelet_t1bv_3_sse2\r\nfftwf_codelet_t1bv_4_avx\r\nfftwf_codelet_t1bv_4_sse2\r\nfftwf_codelet_t1bv_5_avx\r\nfftwf_codelet_t1bv_5_sse2\r\nfftwf_codelet_t1bv_64_avx\r\nfftwf_codelet_t1bv_64_sse2\r\nfftwf_codelet_t1bv_6_avx\r\nfftwf_codelet_t1bv_6_sse2\r\nfftwf_codelet_t1bv_7_avx\r\nfftwf_codelet_t1bv_7_sse2\r\nfftwf_codelet_t1bv_8_avx\r\nfftwf_codelet_t1bv_8_sse2\r\nfftwf_codelet_t1bv_9_avx\r\nfftwf_codelet_t1bv_9_sse2\r\nfftwf_codelet_t1fuv_10_avx\r\nfftwf_codelet_t1fuv_10_sse2\r\nfftwf_codelet_t1fuv_2_avx\r\nfftwf_codelet_t1fuv_2_sse2\r\nfftwf_codelet_t1fuv_3_avx\r\nfftwf_codelet_t1fuv_3_sse2\r\nfftwf_codelet_t1fuv_4_avx\r\nfftwf_codelet_t1fuv_4_sse2\r\nfftwf_codelet_t1fuv_5_avx\r\nfftwf_codelet_t1fuv_5_sse2\r\nfftwf_codelet_t1fuv_6_avx\r\nfftwf_codelet_t1fuv_6_sse2\r\nfftwf_codelet_t1fuv_7_avx\r\nfftwf_codelet_t1fuv_7_sse2\r\nfftwf_codelet_t1fuv_8_avx\r\nfftwf_codelet_t1fuv_8_sse2\r\nfftwf_codelet_t1fuv_9_avx\r\nfftwf_codelet_t1fuv_9_sse2\r\nfftwf_codelet_t1fv_10_avx\r\nfftwf_codelet_t1fv_10_sse2\r\nfftwf_codelet_t1fv_12_avx\r\nfftwf_codelet_t1fv_12_sse2\r\nfftwf_codelet_t1fv_15_avx\r\nfftwf_codelet_t1fv_15_sse2\r\nfftwf_codelet_t1fv_16_avx\r\nfftwf_codelet_t1fv_16_sse2\r\nfftwf_codelet_t1fv_20_avx\r\nfftwf_codelet_t1fv_20_sse2\r\nfftwf_codelet_t1fv_25_avx\r\nfftwf_codelet_t1fv_25_sse2\r\nfftwf_codelet_t1fv_2_avx\r\nfftwf_codelet_t1fv_2_sse2\r\nfftwf_codelet_t1fv_32_avx\r\nfftwf_codelet_t1fv_32_sse2\r\nfftwf_codelet_t1fv_3_avx\r\nfftwf_codelet_t1fv_3_sse2\r\nfftwf_codelet_t1fv_4_avx\r\nfftwf_codelet_t1fv_4_sse2\r\nfftwf_codelet_t1fv_5_avx\r\nfftwf_codelet_t1fv_5_sse2\r\nfftwf_codelet_t1fv_64_avx\r\nfftwf_codelet_t1fv_64_sse2\r\nfftwf_codelet_t1fv_6_avx\r\nfftwf_codelet_t1fv_6_sse2\r\nfftwf_codelet_t1fv_7_avx\r\nfftwf_codelet_t1fv_7_sse2\r\nfftwf_codelet_t1fv_8_avx\r\nfftwf_codelet_t1fv_8_sse2\r\nfftwf_codelet_t1fv_9_avx\r\nfftwf_codelet_t1fv_9_sse2\r\nfftwf_codelet_t1sv_16_avx\r\nfftwf_codelet_t1sv_16_sse2\r\nfftwf_codelet_t1sv_2_avx\r\nfftwf_codelet_t1sv_2_sse2\r\nfftwf_codelet_t1sv_32_avx\r\nfftwf_codelet_t1sv_32_sse2\r\nfftwf_codelet_t1sv_4_avx\r\nfftwf_codelet_t1sv_4_sse2\r\nfftwf_codelet_t1sv_8_avx\r\nfftwf_codelet_t1sv_8_sse2\r\nfftwf_codelet_t2_10\r\nfftwf_codelet_t2_16\r\nfftwf_codelet_t2_20\r\nfftwf_codelet_t2_25\r\nfftwf_codelet_t2_32\r\nfftwf_codelet_t2_4\r\nfftwf_codelet_t2_5\r\nfftwf_codelet_t2_64\r\nfftwf_codelet_t2_8\r\nfftwf_codelet_t2bv_10_avx\r\nfftwf_codelet_t2bv_10_sse2\r\nfftwf_codelet_t2bv_16_avx\r\nfftwf_codelet_t2bv_16_sse2\r\nfftwf_codelet_t2bv_20_avx\r\nfftwf_codelet_t2bv_20_sse2\r\nfftwf_codelet_t2bv_25_avx\r\nfftwf_codelet_t2bv_25_sse2\r\nfftwf_codelet_t2bv_2_avx\r\nfftwf_codelet_t2bv_2_sse2\r\nfftwf_codelet_t2bv_32_avx\r\nfftwf_codelet_t2bv_32_sse2\r\nfftwf_codelet_t2bv_4_avx\r\nfftwf_codelet_t2bv_4_sse2\r\nfftwf_codelet_t2bv_5_avx\r\nfftwf_codelet_t2bv_5_sse2\r\nfftwf_codelet_t2bv_64_avx\r\nfftwf_codelet_t2bv_64_sse2\r\nfftwf_codelet_t2bv_8_avx\r\nfftwf_codelet_t2bv_8_sse2\r\nfftwf_codelet_t2fv_10_avx\r\nfftwf_codelet_t2fv_10_sse2\r\nfftwf_codelet_t2fv_16_avx\r\nfftwf_codelet_t2fv_16_sse2\r\nfftwf_codelet_t2fv_20_avx\r\nfftwf_codelet_t2fv_20_sse2\r\nfftwf_codelet_t2fv_25_avx\r\nfftwf_codelet_t2fv_25_sse2\r\nfftwf_codelet_t2fv_2_avx\r\nfftwf_codelet_t2fv_2_sse2\r\nfftwf_codelet_t2fv_32_avx\r\nfftwf_codelet_t2fv_32_sse2\r\nfftwf_codelet_t2fv_4_avx\r\nfftwf_codelet_t2fv_4_sse2\r\nfftwf_codelet_t2fv_5_avx\r\nfftwf_codelet_t2fv_5_sse2\r\nfftwf_codelet_t2fv_64_avx\r\nfftwf_codelet_t2fv_64_sse2\r\nfftwf_codelet_t2fv_8_avx\r\nfftwf_codelet_t2fv_8_sse2\r\nfftwf_codelet_t2sv_16_avx\r\nfftwf_codelet_t2sv_16_sse2\r\nfftwf_codelet_t2sv_32_avx\r\nfftwf_codelet_t2sv_32_sse2\r\nfftwf_codelet_t2sv_4_avx\r\nfftwf_codelet_t2sv_4_sse2\r\nfftwf_codelet_t2sv_8_avx\r\nfftwf_codelet_t2sv_8_sse2\r\nfftwf_codelet_t3bv_10_avx\r\nfftwf_codelet_t3bv_10_sse2\r\nfftwf_codelet_t3bv_16_avx\r\nfftwf_codelet_t3bv_16_sse2\r\nfftwf_codelet_t3bv_20_avx\r\nfftwf_codelet_t3bv_20_sse2\r\nfftwf_codelet_t3bv_25_avx\r\nfftwf_codelet_t3bv_25_sse2\r\nfftwf_codelet_t3bv_32_avx\r\nfftwf_codelet_t3bv_32_sse2\r\nfftwf_codelet_t3bv_4_avx\r\nfftwf_codelet_t3bv_4_sse2\r\nfftwf_codelet_t3bv_5_avx\r\nfftwf_codelet_t3bv_5_sse2\r\nfftwf_codelet_t3bv_8_avx\r\nfftwf_codelet_t3bv_8_sse2\r\nfftwf_codelet_t3fv_10_avx\r\nfftwf_codelet_t3fv_10_sse2\r\nfftwf_codelet_t3fv_16_avx\r\nfftwf_codelet_t3fv_16_sse2\r\nfftwf_codelet_t3fv_20_avx\r\nfftwf_codelet_t3fv_20_sse2\r\nfftwf_codelet_t3fv_25_avx\r\nfftwf_codelet_t3fv_25_sse2\r\nfftwf_codelet_t3fv_32_avx\r\nfftwf_codelet_t3fv_32_sse2\r\nfftwf_codelet_t3fv_4_avx\r\nfftwf_codelet_t3fv_4_sse2\r\nfftwf_codelet_t3fv_5_avx\r\nfftwf_codelet_t3fv_5_sse2\r\nfftwf_codelet_t3fv_8_avx\r\nfftwf_codelet_t3fv_8_sse2\r\nfftwf_compute_tilesz\r\nfftwf_configure_planner\r\nfftwf_cost\r\nfftwf_cpy1d\r\nfftwf_cpy2d\r\nfftwf_cpy2d_ci\r\nfftwf_cpy2d_co\r\nfftwf_cpy2d_pair\r\nfftwf_cpy2d_pair_ci\r\nfftwf_cpy2d_pair_co\r\nfftwf_cpy2d_tiled\r\nfftwf_cpy2d_tiledbuf\r\nfftwf_ct_applicable\r\nfftwf_ct_generic_register\r\nfftwf_ct_genericbuf_register\r\nfftwf_ct_uglyp\r\nfftwf_destroy_plan\r\nfftwf_dft_bluestein_register\r\nfftwf_dft_buffered_register\r\nfftwf_dft_conf_standard\r\nfftwf_dft_generic_register\r\nfftwf_dft_indirect_register\r\nfftwf_dft_indirect_transpose_register\r\nfftwf_dft_nop_register\r\nfftwf_dft_r2hc_register\r\nfftwf_dft_rader_register\r\nfftwf_dft_rank_geq2_register\r\nfftwf_dft_solve\r\nfftwf_dft_thr_vrank_geq1_register\r\nfftwf_dft_vrank_geq1_register\r\nfftwf_dft_zerotens\r\nfftwf_dht_r2hc_register\r\nfftwf_dht_rader_register\r\nfftwf_dimcmp\r\nfftwf_elapsed_since\r\nfftwf_estimate_cost\r\nfftwf_execute\r\nfftwf_execute_dft\r\nfftwf_execute_dft_c2r\r\nfftwf_execute_dft_r2c\r\nfftwf_execute_r2r\r\nfftwf_execute_split_dft\r\nfftwf_execute_split_dft_c2r\r\nfftwf_execute_split_dft_r2c\r\nfftwf_export_wisdom\r\nfftwf_export_wisdom_to_file\r\nfftwf_export_wisdom_to_filename\r\nfftwf_export_wisdom_to_string\r\nfftwf_extract_reim\r\nfftwf_factors_into\r\nfftwf_factors_into_small_primes\r\nfftwf_find_generator\r\nfftwf_first_divisor\r\nfftwf_flops\r\nfftwf_forget_wisdom\r\nfftwf_fprint_plan\r\nfftwf_free\r\nfftwf_get_crude_time\r\nfftwf_guru64_kosherp\r\nfftwf_guru_kosherp\r\nfftwf_hash\r\nfftwf_have_simd_avx\r\nfftwf_have_simd_sse2\r\nfftwf_hc2c_applicable\r\nfftwf_hc2hc_applicable\r\nfftwf_hc2hc_generic_register\r\nfftwf_iabs\r\nfftwf_iestimate_cost\r\nfftwf_ifree\r\nfftwf_ifree0\r\nfftwf_imax\r\nfftwf_imin\r\nfftwf_import_system_wisdom\r\nfftwf_import_wisdom\r\nfftwf_import_wisdom_from_file\r\nfftwf_import_wisdom_from_filename\r\nfftwf_import_wisdom_from_string\r\nfftwf_init_threads\r\nfftwf_is_prime\r\nfftwf_isqrt\r\nfftwf_ithreads_init\r\nfftwf_join_taint\r\nfftwf_kdft_dif_register\r\nfftwf_kdft_difsq_register\r\nfftwf_kdft_dit_register\r\nfftwf_kdft_register\r\nfftwf_kernel_free\r\nfftwf_kernel_malloc\r\nfftwf_khc2c_register\r\nfftwf_khc2hc_register\r\nfftwf_kr2c_register\r\nfftwf_kr2r_register\r\nfftwf_malloc\r\nfftwf_malloc_plain\r\nfftwf_many_kosherp\r\nfftwf_map_r2r_kind\r\nfftwf_mapflags\r\nfftwf_md5INT\r\nfftwf_md5begin\r\nfftwf_md5end\r\nfftwf_md5int\r\nfftwf_md5putb\r\nfftwf_md5putc\r\nfftwf_md5puts\r\nfftwf_md5unsigned\r\nfftwf_measure_execution_time\r\nfftwf_mkapiplan\r\nfftwf_mkplan\r\nfftwf_mkplan_d\r\nfftwf_mkplan_dft\r\nfftwf_mkplan_dftw\r\nfftwf_mkplan_f_d\r\nfftwf_mkplan_hc2c\r\nfftwf_mkplan_hc2hc\r\nfftwf_mkplan_rdft\r\nfftwf_mkplan_rdft2\r\nfftwf_mkplanner\r\nfftwf_mkprinter\r\nfftwf_mkprinter_cnt\r\nfftwf_mkprinter_file\r\nfftwf_mkprinter_str\r\nfftwf_mkproblem\r\nfftwf_mkproblem_dft\r\nfftwf_mkproblem_dft_d\r\nfftwf_mkproblem_rdft\r\nfftwf_mkproblem_rdft2\r\nfftwf_mkproblem_rdft2_d\r\nfftwf_mkproblem_rdft2_d_3pointers\r\nfftwf_mkproblem_rdft_0_d\r\nfftwf_mkproblem_rdft_1\r\nfftwf_mkproblem_rdft_1_d\r\nfftwf_mkproblem_rdft_d\r\nfftwf_mkproblem_unsolvable\r\nfftwf_mkscanner\r\nfftwf_mksolver\r\nfftwf_mksolver_ct\r\nfftwf_mksolver_ct_threads\r\nfftwf_mksolver_dft_direct\r\nfftwf_mksolver_dft_directbuf\r\nfftwf_mksolver_hc2c\r\nfftwf_mksolver_hc2hc\r\nfftwf_mksolver_hc2hc_threads\r\nfftwf_mksolver_rdft2_direct\r\nfftwf_mksolver_rdft_r2c_direct\r\nfftwf_mksolver_rdft_r2c_directbuf\r\nfftwf_mksolver_rdft_r2r_direct\r\nfftwf_mkstride\r\nfftwf_mktensor\r\nfftwf_mktensor_0d\r\nfftwf_mktensor_1d\r\nfftwf_mktensor_2d\r\nfftwf_mktensor_3d\r\nfftwf_mktensor_4d\r\nfftwf_mktensor_5d\r\nfftwf_mktensor_iodims\r\nfftwf_mktensor_iodims64\r\nfftwf_mktensor_rowmajor\r\nfftwf_mktriggen\r\nfftwf_modulo\r\nfftwf_nbuf\r\nfftwf_nbuf_redundant\r\nfftwf_next_prime\r\nfftwf_null_awake\r\nfftwf_ops_add\r\nfftwf_ops_add2\r\nfftwf_ops_cpy\r\nfftwf_ops_madd\r\nfftwf_ops_madd2\r\nfftwf_ops_other\r\nfftwf_ops_zero\r\nfftwf_pickdim\r\nfftwf_plan_awake\r\nfftwf_plan_destroy_internal\r\nfftwf_plan_dft\r\nfftwf_plan_dft_1d\r\nfftwf_plan_dft_2d\r\nfftwf_plan_dft_3d\r\nfftwf_plan_dft_c2r\r\nfftwf_plan_dft_c2r_1d\r\nfftwf_plan_dft_c2r_2d\r\nfftwf_plan_dft_c2r_3d\r\nfftwf_plan_dft_r2c\r\nfftwf_plan_dft_r2c_1d\r\nfftwf_plan_dft_r2c_2d\r\nfftwf_plan_dft_r2c_3d\r\nfftwf_plan_guru64_dft\r\nfftwf_plan_guru64_dft_c2r\r\nfftwf_plan_guru64_dft_r2c\r\nfftwf_plan_guru64_r2r\r\nfftwf_plan_guru64_split_dft\r\nfftwf_plan_guru64_split_dft_c2r\r\nfftwf_plan_guru64_split_dft_r2c\r\nfftwf_plan_guru_dft\r\nfftwf_plan_guru_dft_c2r\r\nfftwf_plan_guru_dft_r2c\r\nfftwf_plan_guru_r2r\r\nfftwf_plan_guru_split_dft\r\nfftwf_plan_guru_split_dft_c2r\r\nfftwf_plan_guru_split_dft_r2c\r\nfftwf_plan_many_dft\r\nfftwf_plan_many_dft_c2r\r\nfftwf_plan_many_dft_r2c\r\nfftwf_plan_many_r2r\r\nfftwf_plan_null_destroy\r\nfftwf_plan_r2r\r\nfftwf_plan_r2r_1d\r\nfftwf_plan_r2r_2d\r\nfftwf_plan_r2r_3d\r\nfftwf_plan_with_nthreads\r\nfftwf_planner_destroy\r\nfftwf_power_mod\r\nfftwf_print_plan\r\nfftwf_printer_destroy\r\nfftwf_problem_destroy\r\nfftwf_rader_tl_delete\r\nfftwf_rader_tl_find\r\nfftwf_rader_tl_insert\r\nfftwf_rdft2_buffered_register\r\nfftwf_rdft2_complex_n\r\nfftwf_rdft2_inplace_strides\r\nfftwf_rdft2_nop_register\r\nfftwf_rdft2_pad\r\nfftwf_rdft2_rank0_register\r\nfftwf_rdft2_rank_geq2_register\r\nfftwf_rdft2_rdft_register\r\nfftwf_rdft2_solve\r\nfftwf_rdft2_strides\r\nfftwf_rdft2_tensor_max_index\r\nfftwf_rdft2_thr_vrank_geq1_register\r\nfftwf_rdft2_vrank_geq1_register\r\nfftwf_rdft_buffered_register\r\nfftwf_rdft_conf_standard\r\nfftwf_rdft_dht_register\r\nfftwf_rdft_generic_register\r\nfftwf_rdft_indirect_register\r\nfftwf_rdft_kind_str\r\nfftwf_rdft_nop_register\r\nfftwf_rdft_rank0_register\r\nfftwf_rdft_rank_geq2_register\r\nfftwf_rdft_solve\r\nfftwf_rdft_thr_vrank_geq1_register\r\nfftwf_rdft_vrank3_transpose_register\r\nfftwf_rdft_vrank_geq1_register\r\nfftwf_rdft_zerotens\r\nfftwf_redft00e_r2hc_pad_register\r\nfftwf_regsolver_ct_directw\r\nfftwf_regsolver_ct_directwsq\r\nfftwf_regsolver_hc2c_direct\r\nfftwf_regsolver_hc2hc_direct\r\nfftwf_reodft00e_splitradix_register\r\nfftwf_reodft010e_r2hc_register\r\nfftwf_reodft11e_r2hc_odd_register\r\nfftwf_reodft11e_radix2_r2hc_register\r\nfftwf_reodft_conf_standard\r\nfftwf_rodft00e_r2hc_pad_register\r\nfftwf_safe_mulmod\r\nfftwf_scanner_destroy\r\nfftwf_set_timelimit\r\nfftwf_solver_destroy\r\nfftwf_solver_register\r\nfftwf_solver_use\r\nfftwf_solvtab_exec\r\nfftwf_spawn_loop\r\nfftwf_sprint_plan\r\nfftwf_stride_destroy\r\nfftwf_taint\r\nfftwf_tensor_append\r\nfftwf_tensor_compress\r\nfftwf_tensor_compress_contiguous\r\nfftwf_tensor_copy\r\nfftwf_tensor_copy_except\r\nfftwf_tensor_copy_inplace\r\nfftwf_tensor_copy_sub\r\nfftwf_tensor_destroy\r\nfftwf_tensor_destroy2\r\nfftwf_tensor_destroy4\r\nfftwf_tensor_equal\r\nfftwf_tensor_inplace_locations\r\nfftwf_tensor_inplace_strides\r\nfftwf_tensor_inplace_strides2\r\nfftwf_tensor_kosherp\r\nfftwf_tensor_max_index\r\nfftwf_tensor_md5\r\nfftwf_tensor_min_istride\r\nfftwf_tensor_min_ostride\r\nfftwf_tensor_min_stride\r\nfftwf_tensor_print\r\nfftwf_tensor_split\r\nfftwf_tensor_strides_decrease\r\nfftwf_tensor_sz\r\nfftwf_tensor_tornk1\r\nfftwf_the_planner\r\nfftwf_threads_cleanup\r\nfftwf_threads_conf_standard\r\nfftwf_tile2d\r\nfftwf_toobig\r\nfftwf_transpose\r\nfftwf_transpose_tiled\r\nfftwf_transpose_tiledbuf\r\nfftwf_triggen_destroy\r\nfftwf_twiddle_awake\r\nfftwf_twiddle_length\r\nsfftw_cleanup_\r\nsfftw_cleanup__\r\nsfftw_cleanup_threads_\r\nsfftw_cleanup_threads__\r\nsfftw_cost_\r\nsfftw_cost__\r\nsfftw_destroy_plan_\r\nsfftw_destroy_plan__\r\nsfftw_estimate_cost_\r\nsfftw_estimate_cost__\r\nsfftw_execute_\r\nsfftw_execute__\r\nsfftw_execute_dft_\r\nsfftw_execute_dft__\r\nsfftw_execute_dft_c2r_\r\nsfftw_execute_dft_c2r__\r\nsfftw_execute_dft_r2c_\r\nsfftw_execute_dft_r2c__\r\nsfftw_execute_r2r_\r\nsfftw_execute_r2r__\r\nsfftw_execute_split_dft_\r\nsfftw_execute_split_dft__\r\nsfftw_execute_split_dft_c2r_\r\nsfftw_execute_split_dft_c2r__\r\nsfftw_execute_split_dft_r2c_\r\nsfftw_execute_split_dft_r2c__\r\nsfftw_export_wisdom_\r\nsfftw_export_wisdom__\r\nsfftw_flops_\r\nsfftw_flops__\r\nsfftw_forget_wisdom_\r\nsfftw_forget_wisdom__\r\nsfftw_import_system_wisdom_\r\nsfftw_import_system_wisdom__\r\nsfftw_import_wisdom_\r\nsfftw_import_wisdom__\r\nsfftw_init_threads_\r\nsfftw_init_threads__\r\nsfftw_plan_dft_\r\nsfftw_plan_dft_1d_\r\nsfftw_plan_dft_1d__\r\nsfftw_plan_dft_2d_\r\nsfftw_plan_dft_2d__\r\nsfftw_plan_dft_3d_\r\nsfftw_plan_dft_3d__\r\nsfftw_plan_dft__\r\nsfftw_plan_dft_c2r_\r\nsfftw_plan_dft_c2r_1d_\r\nsfftw_plan_dft_c2r_1d__\r\nsfftw_plan_dft_c2r_2d_\r\nsfftw_plan_dft_c2r_2d__\r\nsfftw_plan_dft_c2r_3d_\r\nsfftw_plan_dft_c2r_3d__\r\nsfftw_plan_dft_c2r__\r\nsfftw_plan_dft_r2c_\r\nsfftw_plan_dft_r2c_1d_\r\nsfftw_plan_dft_r2c_1d__\r\nsfftw_plan_dft_r2c_2d_\r\nsfftw_plan_dft_r2c_2d__\r\nsfftw_plan_dft_r2c_3d_\r\nsfftw_plan_dft_r2c_3d__\r\nsfftw_plan_dft_r2c__\r\nsfftw_plan_guru_dft_\r\nsfftw_plan_guru_dft__\r\nsfftw_plan_guru_dft_c2r_\r\nsfftw_plan_guru_dft_c2r__\r\nsfftw_plan_guru_dft_r2c_\r\nsfftw_plan_guru_dft_r2c__\r\nsfftw_plan_guru_r2r_\r\nsfftw_plan_guru_r2r__\r\nsfftw_plan_guru_split_dft_\r\nsfftw_plan_guru_split_dft__\r\nsfftw_plan_guru_split_dft_c2r_\r\nsfftw_plan_guru_split_dft_c2r__\r\nsfftw_plan_guru_split_dft_r2c_\r\nsfftw_plan_guru_split_dft_r2c__\r\nsfftw_plan_many_dft_\r\nsfftw_plan_many_dft__\r\nsfftw_plan_many_dft_c2r_\r\nsfftw_plan_many_dft_c2r__\r\nsfftw_plan_many_dft_r2c_\r\nsfftw_plan_many_dft_r2c__\r\nsfftw_plan_many_r2r_\r\nsfftw_plan_many_r2r__\r\nsfftw_plan_r2r_\r\nsfftw_plan_r2r_1d_\r\nsfftw_plan_r2r_1d__\r\nsfftw_plan_r2r_2d_\r\nsfftw_plan_r2r_2d__\r\nsfftw_plan_r2r_3d_\r\nsfftw_plan_r2r_3d__\r\nsfftw_plan_r2r__\r\nsfftw_plan_with_nthreads_\r\nsfftw_plan_with_nthreads__\r\nsfftw_print_plan_\r\nsfftw_print_plan__\r\nsfftw_set_timelimit_\r\nsfftw_set_timelimit__\r\n"
  },
  {
    "path": "OptolithiumC/libs/fftw3-win32/libfftw3l-3.def",
    "content": "LIBRARY libfftw3l-3.dll\r\nEXPORTS\r\nfftwl_alignment_of\r\nfftwl_alloc_complex\r\nfftwl_alloc_real\r\nfftwl_assertion_failed\r\nfftwl_bufdist\r\nfftwl_choose_radix\r\nfftwl_cleanup\r\nfftwl_cleanup_threads\r\nfftwl_codelet_e01_8\r\nfftwl_codelet_e10_8\r\nfftwl_codelet_hb2_16\r\nfftwl_codelet_hb2_20\r\nfftwl_codelet_hb2_25\r\nfftwl_codelet_hb2_32\r\nfftwl_codelet_hb2_4\r\nfftwl_codelet_hb2_5\r\nfftwl_codelet_hb2_8\r\nfftwl_codelet_hb_10\r\nfftwl_codelet_hb_12\r\nfftwl_codelet_hb_15\r\nfftwl_codelet_hb_16\r\nfftwl_codelet_hb_2\r\nfftwl_codelet_hb_20\r\nfftwl_codelet_hb_25\r\nfftwl_codelet_hb_3\r\nfftwl_codelet_hb_32\r\nfftwl_codelet_hb_4\r\nfftwl_codelet_hb_5\r\nfftwl_codelet_hb_6\r\nfftwl_codelet_hb_64\r\nfftwl_codelet_hb_7\r\nfftwl_codelet_hb_8\r\nfftwl_codelet_hb_9\r\nfftwl_codelet_hc2cb2_16\r\nfftwl_codelet_hc2cb2_20\r\nfftwl_codelet_hc2cb2_32\r\nfftwl_codelet_hc2cb2_4\r\nfftwl_codelet_hc2cb2_8\r\nfftwl_codelet_hc2cb_10\r\nfftwl_codelet_hc2cb_12\r\nfftwl_codelet_hc2cb_16\r\nfftwl_codelet_hc2cb_2\r\nfftwl_codelet_hc2cb_20\r\nfftwl_codelet_hc2cb_32\r\nfftwl_codelet_hc2cb_4\r\nfftwl_codelet_hc2cb_6\r\nfftwl_codelet_hc2cb_8\r\nfftwl_codelet_hc2cbdft2_16\r\nfftwl_codelet_hc2cbdft2_20\r\nfftwl_codelet_hc2cbdft2_32\r\nfftwl_codelet_hc2cbdft2_4\r\nfftwl_codelet_hc2cbdft2_8\r\nfftwl_codelet_hc2cbdft_10\r\nfftwl_codelet_hc2cbdft_12\r\nfftwl_codelet_hc2cbdft_16\r\nfftwl_codelet_hc2cbdft_2\r\nfftwl_codelet_hc2cbdft_20\r\nfftwl_codelet_hc2cbdft_32\r\nfftwl_codelet_hc2cbdft_4\r\nfftwl_codelet_hc2cbdft_6\r\nfftwl_codelet_hc2cbdft_8\r\nfftwl_codelet_hc2cf2_16\r\nfftwl_codelet_hc2cf2_20\r\nfftwl_codelet_hc2cf2_32\r\nfftwl_codelet_hc2cf2_4\r\nfftwl_codelet_hc2cf2_8\r\nfftwl_codelet_hc2cf_10\r\nfftwl_codelet_hc2cf_12\r\nfftwl_codelet_hc2cf_16\r\nfftwl_codelet_hc2cf_2\r\nfftwl_codelet_hc2cf_20\r\nfftwl_codelet_hc2cf_32\r\nfftwl_codelet_hc2cf_4\r\nfftwl_codelet_hc2cf_6\r\nfftwl_codelet_hc2cf_8\r\nfftwl_codelet_hc2cfdft2_16\r\nfftwl_codelet_hc2cfdft2_20\r\nfftwl_codelet_hc2cfdft2_32\r\nfftwl_codelet_hc2cfdft2_4\r\nfftwl_codelet_hc2cfdft2_8\r\nfftwl_codelet_hc2cfdft_10\r\nfftwl_codelet_hc2cfdft_12\r\nfftwl_codelet_hc2cfdft_16\r\nfftwl_codelet_hc2cfdft_2\r\nfftwl_codelet_hc2cfdft_20\r\nfftwl_codelet_hc2cfdft_32\r\nfftwl_codelet_hc2cfdft_4\r\nfftwl_codelet_hc2cfdft_6\r\nfftwl_codelet_hc2cfdft_8\r\nfftwl_codelet_hf2_16\r\nfftwl_codelet_hf2_20\r\nfftwl_codelet_hf2_25\r\nfftwl_codelet_hf2_32\r\nfftwl_codelet_hf2_4\r\nfftwl_codelet_hf2_5\r\nfftwl_codelet_hf2_8\r\nfftwl_codelet_hf_10\r\nfftwl_codelet_hf_12\r\nfftwl_codelet_hf_15\r\nfftwl_codelet_hf_16\r\nfftwl_codelet_hf_2\r\nfftwl_codelet_hf_20\r\nfftwl_codelet_hf_25\r\nfftwl_codelet_hf_3\r\nfftwl_codelet_hf_32\r\nfftwl_codelet_hf_4\r\nfftwl_codelet_hf_5\r\nfftwl_codelet_hf_6\r\nfftwl_codelet_hf_64\r\nfftwl_codelet_hf_7\r\nfftwl_codelet_hf_8\r\nfftwl_codelet_hf_9\r\nfftwl_codelet_n1_10\r\nfftwl_codelet_n1_11\r\nfftwl_codelet_n1_12\r\nfftwl_codelet_n1_13\r\nfftwl_codelet_n1_14\r\nfftwl_codelet_n1_15\r\nfftwl_codelet_n1_16\r\nfftwl_codelet_n1_2\r\nfftwl_codelet_n1_20\r\nfftwl_codelet_n1_25\r\nfftwl_codelet_n1_3\r\nfftwl_codelet_n1_32\r\nfftwl_codelet_n1_4\r\nfftwl_codelet_n1_5\r\nfftwl_codelet_n1_6\r\nfftwl_codelet_n1_64\r\nfftwl_codelet_n1_7\r\nfftwl_codelet_n1_8\r\nfftwl_codelet_n1_9\r\nfftwl_codelet_q1_2\r\nfftwl_codelet_q1_3\r\nfftwl_codelet_q1_4\r\nfftwl_codelet_q1_5\r\nfftwl_codelet_q1_6\r\nfftwl_codelet_q1_8\r\nfftwl_codelet_r2cbIII_10\r\nfftwl_codelet_r2cbIII_12\r\nfftwl_codelet_r2cbIII_15\r\nfftwl_codelet_r2cbIII_16\r\nfftwl_codelet_r2cbIII_2\r\nfftwl_codelet_r2cbIII_20\r\nfftwl_codelet_r2cbIII_25\r\nfftwl_codelet_r2cbIII_3\r\nfftwl_codelet_r2cbIII_32\r\nfftwl_codelet_r2cbIII_4\r\nfftwl_codelet_r2cbIII_5\r\nfftwl_codelet_r2cbIII_6\r\nfftwl_codelet_r2cbIII_64\r\nfftwl_codelet_r2cbIII_7\r\nfftwl_codelet_r2cbIII_8\r\nfftwl_codelet_r2cbIII_9\r\nfftwl_codelet_r2cb_10\r\nfftwl_codelet_r2cb_11\r\nfftwl_codelet_r2cb_12\r\nfftwl_codelet_r2cb_128\r\nfftwl_codelet_r2cb_13\r\nfftwl_codelet_r2cb_14\r\nfftwl_codelet_r2cb_15\r\nfftwl_codelet_r2cb_16\r\nfftwl_codelet_r2cb_2\r\nfftwl_codelet_r2cb_20\r\nfftwl_codelet_r2cb_25\r\nfftwl_codelet_r2cb_3\r\nfftwl_codelet_r2cb_32\r\nfftwl_codelet_r2cb_4\r\nfftwl_codelet_r2cb_5\r\nfftwl_codelet_r2cb_6\r\nfftwl_codelet_r2cb_64\r\nfftwl_codelet_r2cb_7\r\nfftwl_codelet_r2cb_8\r\nfftwl_codelet_r2cb_9\r\nfftwl_codelet_r2cfII_10\r\nfftwl_codelet_r2cfII_12\r\nfftwl_codelet_r2cfII_15\r\nfftwl_codelet_r2cfII_16\r\nfftwl_codelet_r2cfII_2\r\nfftwl_codelet_r2cfII_20\r\nfftwl_codelet_r2cfII_25\r\nfftwl_codelet_r2cfII_3\r\nfftwl_codelet_r2cfII_32\r\nfftwl_codelet_r2cfII_4\r\nfftwl_codelet_r2cfII_5\r\nfftwl_codelet_r2cfII_6\r\nfftwl_codelet_r2cfII_64\r\nfftwl_codelet_r2cfII_7\r\nfftwl_codelet_r2cfII_8\r\nfftwl_codelet_r2cfII_9\r\nfftwl_codelet_r2cf_10\r\nfftwl_codelet_r2cf_11\r\nfftwl_codelet_r2cf_12\r\nfftwl_codelet_r2cf_128\r\nfftwl_codelet_r2cf_13\r\nfftwl_codelet_r2cf_14\r\nfftwl_codelet_r2cf_15\r\nfftwl_codelet_r2cf_16\r\nfftwl_codelet_r2cf_2\r\nfftwl_codelet_r2cf_20\r\nfftwl_codelet_r2cf_25\r\nfftwl_codelet_r2cf_3\r\nfftwl_codelet_r2cf_32\r\nfftwl_codelet_r2cf_4\r\nfftwl_codelet_r2cf_5\r\nfftwl_codelet_r2cf_6\r\nfftwl_codelet_r2cf_64\r\nfftwl_codelet_r2cf_7\r\nfftwl_codelet_r2cf_8\r\nfftwl_codelet_r2cf_9\r\nfftwl_codelet_t1_10\r\nfftwl_codelet_t1_12\r\nfftwl_codelet_t1_15\r\nfftwl_codelet_t1_16\r\nfftwl_codelet_t1_2\r\nfftwl_codelet_t1_20\r\nfftwl_codelet_t1_25\r\nfftwl_codelet_t1_3\r\nfftwl_codelet_t1_32\r\nfftwl_codelet_t1_4\r\nfftwl_codelet_t1_5\r\nfftwl_codelet_t1_6\r\nfftwl_codelet_t1_64\r\nfftwl_codelet_t1_7\r\nfftwl_codelet_t1_8\r\nfftwl_codelet_t1_9\r\nfftwl_codelet_t2_10\r\nfftwl_codelet_t2_16\r\nfftwl_codelet_t2_20\r\nfftwl_codelet_t2_25\r\nfftwl_codelet_t2_32\r\nfftwl_codelet_t2_4\r\nfftwl_codelet_t2_5\r\nfftwl_codelet_t2_64\r\nfftwl_codelet_t2_8\r\nfftwl_compute_tilesz\r\nfftwl_configure_planner\r\nfftwl_cost\r\nfftwl_cpy1d\r\nfftwl_cpy2d\r\nfftwl_cpy2d_ci\r\nfftwl_cpy2d_co\r\nfftwl_cpy2d_pair\r\nfftwl_cpy2d_pair_ci\r\nfftwl_cpy2d_pair_co\r\nfftwl_cpy2d_tiled\r\nfftwl_cpy2d_tiledbuf\r\nfftwl_ct_applicable\r\nfftwl_ct_generic_register\r\nfftwl_ct_genericbuf_register\r\nfftwl_ct_uglyp\r\nfftwl_destroy_plan\r\nfftwl_dft_bluestein_register\r\nfftwl_dft_buffered_register\r\nfftwl_dft_conf_standard\r\nfftwl_dft_generic_register\r\nfftwl_dft_indirect_register\r\nfftwl_dft_indirect_transpose_register\r\nfftwl_dft_nop_register\r\nfftwl_dft_r2hc_register\r\nfftwl_dft_rader_register\r\nfftwl_dft_rank_geq2_register\r\nfftwl_dft_solve\r\nfftwl_dft_thr_vrank_geq1_register\r\nfftwl_dft_vrank_geq1_register\r\nfftwl_dft_zerotens\r\nfftwl_dht_r2hc_register\r\nfftwl_dht_rader_register\r\nfftwl_dimcmp\r\nfftwl_elapsed_since\r\nfftwl_estimate_cost\r\nfftwl_execute\r\nfftwl_execute_dft\r\nfftwl_execute_dft_c2r\r\nfftwl_execute_dft_r2c\r\nfftwl_execute_r2r\r\nfftwl_execute_split_dft\r\nfftwl_execute_split_dft_c2r\r\nfftwl_execute_split_dft_r2c\r\nfftwl_export_wisdom\r\nfftwl_export_wisdom_to_file\r\nfftwl_export_wisdom_to_filename\r\nfftwl_export_wisdom_to_string\r\nfftwl_extract_reim\r\nfftwl_factors_into\r\nfftwl_factors_into_small_primes\r\nfftwl_find_generator\r\nfftwl_first_divisor\r\nfftwl_flops\r\nfftwl_forget_wisdom\r\nfftwl_fprint_plan\r\nfftwl_free\r\nfftwl_get_crude_time\r\nfftwl_guru64_kosherp\r\nfftwl_guru_kosherp\r\nfftwl_hash\r\nfftwl_hc2c_applicable\r\nfftwl_hc2hc_applicable\r\nfftwl_hc2hc_generic_register\r\nfftwl_iabs\r\nfftwl_iestimate_cost\r\nfftwl_ifree\r\nfftwl_ifree0\r\nfftwl_imax\r\nfftwl_imin\r\nfftwl_import_system_wisdom\r\nfftwl_import_wisdom\r\nfftwl_import_wisdom_from_file\r\nfftwl_import_wisdom_from_filename\r\nfftwl_import_wisdom_from_string\r\nfftwl_init_threads\r\nfftwl_is_prime\r\nfftwl_isqrt\r\nfftwl_ithreads_init\r\nfftwl_kdft_dif_register\r\nfftwl_kdft_difsq_register\r\nfftwl_kdft_dit_register\r\nfftwl_kdft_register\r\nfftwl_kernel_free\r\nfftwl_kernel_malloc\r\nfftwl_khc2c_register\r\nfftwl_khc2hc_register\r\nfftwl_kr2c_register\r\nfftwl_kr2r_register\r\nfftwl_malloc\r\nfftwl_malloc_plain\r\nfftwl_many_kosherp\r\nfftwl_map_r2r_kind\r\nfftwl_mapflags\r\nfftwl_md5INT\r\nfftwl_md5begin\r\nfftwl_md5end\r\nfftwl_md5int\r\nfftwl_md5putb\r\nfftwl_md5putc\r\nfftwl_md5puts\r\nfftwl_md5unsigned\r\nfftwl_measure_execution_time\r\nfftwl_mkapiplan\r\nfftwl_mkplan\r\nfftwl_mkplan_d\r\nfftwl_mkplan_dft\r\nfftwl_mkplan_dftw\r\nfftwl_mkplan_f_d\r\nfftwl_mkplan_hc2c\r\nfftwl_mkplan_hc2hc\r\nfftwl_mkplan_rdft\r\nfftwl_mkplan_rdft2\r\nfftwl_mkplanner\r\nfftwl_mkprinter\r\nfftwl_mkprinter_cnt\r\nfftwl_mkprinter_file\r\nfftwl_mkprinter_str\r\nfftwl_mkproblem\r\nfftwl_mkproblem_dft\r\nfftwl_mkproblem_dft_d\r\nfftwl_mkproblem_rdft\r\nfftwl_mkproblem_rdft2\r\nfftwl_mkproblem_rdft2_d\r\nfftwl_mkproblem_rdft2_d_3pointers\r\nfftwl_mkproblem_rdft_0_d\r\nfftwl_mkproblem_rdft_1\r\nfftwl_mkproblem_rdft_1_d\r\nfftwl_mkproblem_rdft_d\r\nfftwl_mkproblem_unsolvable\r\nfftwl_mkscanner\r\nfftwl_mksolver\r\nfftwl_mksolver_ct\r\nfftwl_mksolver_ct_threads\r\nfftwl_mksolver_dft_direct\r\nfftwl_mksolver_dft_directbuf\r\nfftwl_mksolver_hc2c\r\nfftwl_mksolver_hc2hc\r\nfftwl_mksolver_hc2hc_threads\r\nfftwl_mksolver_rdft2_direct\r\nfftwl_mksolver_rdft_r2c_direct\r\nfftwl_mksolver_rdft_r2c_directbuf\r\nfftwl_mksolver_rdft_r2r_direct\r\nfftwl_mktensor\r\nfftwl_mktensor_0d\r\nfftwl_mktensor_1d\r\nfftwl_mktensor_2d\r\nfftwl_mktensor_3d\r\nfftwl_mktensor_4d\r\nfftwl_mktensor_5d\r\nfftwl_mktensor_iodims\r\nfftwl_mktensor_iodims64\r\nfftwl_mktensor_rowmajor\r\nfftwl_mktriggen\r\nfftwl_modulo\r\nfftwl_nbuf\r\nfftwl_nbuf_redundant\r\nfftwl_next_prime\r\nfftwl_null_awake\r\nfftwl_ops_add\r\nfftwl_ops_add2\r\nfftwl_ops_cpy\r\nfftwl_ops_madd\r\nfftwl_ops_madd2\r\nfftwl_ops_other\r\nfftwl_ops_zero\r\nfftwl_pickdim\r\nfftwl_plan_awake\r\nfftwl_plan_destroy_internal\r\nfftwl_plan_dft\r\nfftwl_plan_dft_1d\r\nfftwl_plan_dft_2d\r\nfftwl_plan_dft_3d\r\nfftwl_plan_dft_c2r\r\nfftwl_plan_dft_c2r_1d\r\nfftwl_plan_dft_c2r_2d\r\nfftwl_plan_dft_c2r_3d\r\nfftwl_plan_dft_r2c\r\nfftwl_plan_dft_r2c_1d\r\nfftwl_plan_dft_r2c_2d\r\nfftwl_plan_dft_r2c_3d\r\nfftwl_plan_guru64_dft\r\nfftwl_plan_guru64_dft_c2r\r\nfftwl_plan_guru64_dft_r2c\r\nfftwl_plan_guru64_r2r\r\nfftwl_plan_guru64_split_dft\r\nfftwl_plan_guru64_split_dft_c2r\r\nfftwl_plan_guru64_split_dft_r2c\r\nfftwl_plan_guru_dft\r\nfftwl_plan_guru_dft_c2r\r\nfftwl_plan_guru_dft_r2c\r\nfftwl_plan_guru_r2r\r\nfftwl_plan_guru_split_dft\r\nfftwl_plan_guru_split_dft_c2r\r\nfftwl_plan_guru_split_dft_r2c\r\nfftwl_plan_many_dft\r\nfftwl_plan_many_dft_c2r\r\nfftwl_plan_many_dft_r2c\r\nfftwl_plan_many_r2r\r\nfftwl_plan_null_destroy\r\nfftwl_plan_r2r\r\nfftwl_plan_r2r_1d\r\nfftwl_plan_r2r_2d\r\nfftwl_plan_r2r_3d\r\nfftwl_plan_with_nthreads\r\nfftwl_planner_destroy\r\nfftwl_power_mod\r\nfftwl_print_plan\r\nfftwl_printer_destroy\r\nfftwl_problem_destroy\r\nfftwl_rader_tl_delete\r\nfftwl_rader_tl_find\r\nfftwl_rader_tl_insert\r\nfftwl_rdft2_buffered_register\r\nfftwl_rdft2_complex_n\r\nfftwl_rdft2_inplace_strides\r\nfftwl_rdft2_nop_register\r\nfftwl_rdft2_pad\r\nfftwl_rdft2_rank0_register\r\nfftwl_rdft2_rank_geq2_register\r\nfftwl_rdft2_rdft_register\r\nfftwl_rdft2_solve\r\nfftwl_rdft2_strides\r\nfftwl_rdft2_tensor_max_index\r\nfftwl_rdft2_thr_vrank_geq1_register\r\nfftwl_rdft2_vrank_geq1_register\r\nfftwl_rdft_buffered_register\r\nfftwl_rdft_conf_standard\r\nfftwl_rdft_dht_register\r\nfftwl_rdft_generic_register\r\nfftwl_rdft_indirect_register\r\nfftwl_rdft_kind_str\r\nfftwl_rdft_nop_register\r\nfftwl_rdft_rank0_register\r\nfftwl_rdft_rank_geq2_register\r\nfftwl_rdft_solve\r\nfftwl_rdft_thr_vrank_geq1_register\r\nfftwl_rdft_vrank3_transpose_register\r\nfftwl_rdft_vrank_geq1_register\r\nfftwl_rdft_zerotens\r\nfftwl_redft00e_r2hc_pad_register\r\nfftwl_regsolver_ct_directw\r\nfftwl_regsolver_ct_directwsq\r\nfftwl_regsolver_hc2c_direct\r\nfftwl_regsolver_hc2hc_direct\r\nfftwl_reodft00e_splitradix_register\r\nfftwl_reodft010e_r2hc_register\r\nfftwl_reodft11e_r2hc_odd_register\r\nfftwl_reodft11e_radix2_r2hc_register\r\nfftwl_reodft_conf_standard\r\nfftwl_rodft00e_r2hc_pad_register\r\nfftwl_safe_mulmod\r\nfftwl_scanner_destroy\r\nfftwl_set_timelimit\r\nfftwl_solver_destroy\r\nfftwl_solver_register\r\nfftwl_solver_use\r\nfftwl_solvtab_exec\r\nfftwl_spawn_loop\r\nfftwl_sprint_plan\r\nfftwl_tensor_append\r\nfftwl_tensor_compress\r\nfftwl_tensor_compress_contiguous\r\nfftwl_tensor_copy\r\nfftwl_tensor_copy_except\r\nfftwl_tensor_copy_inplace\r\nfftwl_tensor_copy_sub\r\nfftwl_tensor_destroy\r\nfftwl_tensor_destroy2\r\nfftwl_tensor_destroy4\r\nfftwl_tensor_equal\r\nfftwl_tensor_inplace_locations\r\nfftwl_tensor_inplace_strides\r\nfftwl_tensor_inplace_strides2\r\nfftwl_tensor_kosherp\r\nfftwl_tensor_max_index\r\nfftwl_tensor_md5\r\nfftwl_tensor_min_istride\r\nfftwl_tensor_min_ostride\r\nfftwl_tensor_min_stride\r\nfftwl_tensor_print\r\nfftwl_tensor_split\r\nfftwl_tensor_strides_decrease\r\nfftwl_tensor_sz\r\nfftwl_tensor_tornk1\r\nfftwl_the_planner\r\nfftwl_threads_cleanup\r\nfftwl_threads_conf_standard\r\nfftwl_tile2d\r\nfftwl_toobig\r\nfftwl_transpose\r\nfftwl_transpose_tiled\r\nfftwl_transpose_tiledbuf\r\nfftwl_triggen_destroy\r\nfftwl_twiddle_awake\r\nfftwl_twiddle_length\r\nlfftw_cleanup_\r\nlfftw_cleanup__\r\nlfftw_cleanup_threads_\r\nlfftw_cleanup_threads__\r\nlfftw_cost_\r\nlfftw_cost__\r\nlfftw_destroy_plan_\r\nlfftw_destroy_plan__\r\nlfftw_estimate_cost_\r\nlfftw_estimate_cost__\r\nlfftw_execute_\r\nlfftw_execute__\r\nlfftw_execute_dft_\r\nlfftw_execute_dft__\r\nlfftw_execute_dft_c2r_\r\nlfftw_execute_dft_c2r__\r\nlfftw_execute_dft_r2c_\r\nlfftw_execute_dft_r2c__\r\nlfftw_execute_r2r_\r\nlfftw_execute_r2r__\r\nlfftw_execute_split_dft_\r\nlfftw_execute_split_dft__\r\nlfftw_execute_split_dft_c2r_\r\nlfftw_execute_split_dft_c2r__\r\nlfftw_execute_split_dft_r2c_\r\nlfftw_execute_split_dft_r2c__\r\nlfftw_export_wisdom_\r\nlfftw_export_wisdom__\r\nlfftw_flops_\r\nlfftw_flops__\r\nlfftw_forget_wisdom_\r\nlfftw_forget_wisdom__\r\nlfftw_import_system_wisdom_\r\nlfftw_import_system_wisdom__\r\nlfftw_import_wisdom_\r\nlfftw_import_wisdom__\r\nlfftw_init_threads_\r\nlfftw_init_threads__\r\nlfftw_plan_dft_\r\nlfftw_plan_dft_1d_\r\nlfftw_plan_dft_1d__\r\nlfftw_plan_dft_2d_\r\nlfftw_plan_dft_2d__\r\nlfftw_plan_dft_3d_\r\nlfftw_plan_dft_3d__\r\nlfftw_plan_dft__\r\nlfftw_plan_dft_c2r_\r\nlfftw_plan_dft_c2r_1d_\r\nlfftw_plan_dft_c2r_1d__\r\nlfftw_plan_dft_c2r_2d_\r\nlfftw_plan_dft_c2r_2d__\r\nlfftw_plan_dft_c2r_3d_\r\nlfftw_plan_dft_c2r_3d__\r\nlfftw_plan_dft_c2r__\r\nlfftw_plan_dft_r2c_\r\nlfftw_plan_dft_r2c_1d_\r\nlfftw_plan_dft_r2c_1d__\r\nlfftw_plan_dft_r2c_2d_\r\nlfftw_plan_dft_r2c_2d__\r\nlfftw_plan_dft_r2c_3d_\r\nlfftw_plan_dft_r2c_3d__\r\nlfftw_plan_dft_r2c__\r\nlfftw_plan_guru_dft_\r\nlfftw_plan_guru_dft__\r\nlfftw_plan_guru_dft_c2r_\r\nlfftw_plan_guru_dft_c2r__\r\nlfftw_plan_guru_dft_r2c_\r\nlfftw_plan_guru_dft_r2c__\r\nlfftw_plan_guru_r2r_\r\nlfftw_plan_guru_r2r__\r\nlfftw_plan_guru_split_dft_\r\nlfftw_plan_guru_split_dft__\r\nlfftw_plan_guru_split_dft_c2r_\r\nlfftw_plan_guru_split_dft_c2r__\r\nlfftw_plan_guru_split_dft_r2c_\r\nlfftw_plan_guru_split_dft_r2c__\r\nlfftw_plan_many_dft_\r\nlfftw_plan_many_dft__\r\nlfftw_plan_many_dft_c2r_\r\nlfftw_plan_many_dft_c2r__\r\nlfftw_plan_many_dft_r2c_\r\nlfftw_plan_many_dft_r2c__\r\nlfftw_plan_many_r2r_\r\nlfftw_plan_many_r2r__\r\nlfftw_plan_r2r_\r\nlfftw_plan_r2r_1d_\r\nlfftw_plan_r2r_1d__\r\nlfftw_plan_r2r_2d_\r\nlfftw_plan_r2r_2d__\r\nlfftw_plan_r2r_3d_\r\nlfftw_plan_r2r_3d__\r\nlfftw_plan_r2r__\r\nlfftw_plan_with_nthreads_\r\nlfftw_plan_with_nthreads__\r\nlfftw_print_plan_\r\nlfftw_print_plan__\r\nlfftw_set_timelimit_\r\nlfftw_set_timelimit__\r\n"
  },
  {
    "path": "OptolithiumC/libs/fourier/CMakeLists.txt",
    "content": "CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0)\r\nPROJECT(fourier)\r\n\r\nSET(CMAKE_USE_RELATIVE_PATHS ON)\r\nSET(CMAKE_SKIP_RPATH TRUE)\r\n\r\nSET(CMAKE_BUILD_TYPE \"Release\")\r\n\r\nSET(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Ofast -fmerge-all-constants -funroll-loops\")\r\n# SET(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -fassociative-math -ffinite-math-only -freciprocal-math\" )\r\n\r\nINCLUDE_DIRECTORIES(\"${CMAKE_CURRENT_SOURCE_DIR}/include\")\r\n\r\nADD_LIBRARY(fourier STATIC\r\n    \"src/fourier.c\"\r\n    \"src/primes.c\")\r\n\r\n\r\nFIND_PACKAGE(FFTW REQUIRED)\r\nINCLUDE_DIRECTORIES(\"${FFTW_INCLUDES}\")\r\nADD_EXECUTABLE(check \"src/check.c\")\r\nTARGET_LINK_LIBRARIES(check ${FFTW_LIBRARIES})\r\nTARGET_LINK_LIBRARIES(check fourier)\r\n"
  },
  {
    "path": "OptolithiumC/libs/fourier/include/basics.h",
    "content": "/*\n * Fourier Transform library for Optolithium lithography modelling software\n *\n * Copyright (C) 2015 Alexei Gladkikh\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are permitted provided that\n * the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the\n *    documentation  and/or other materials provided with the distribution.\n * 3. Neither the names of the copyright holders nor the names of any\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, ORCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n */\n\n#ifndef BASICS_H_\n#define BASICS_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdarg.h>\n\n#include <mm_malloc.h>\n#include <xmmintrin.h>\n#include <pmmintrin.h>\n\n#include \"fourier.h\"\n\n\n#define FORCE_INLINE __attribute__((always_inline))\n\n\n#if FOURIER_LOG_VERBOSE_LEVEL <= 50\nextern unsigned int RECURSION_DEPTH;\n#define INCREASE_RECURSION_DEPTH() RECURSION_DEPTH++;\n#define DECREASE_RECURSION_DEPTH() \\\n    if (FOURIER_LOG_VERBOSE_LEVEL <= 50) { \\\n        FOURIER_LOG(50, \"<--- Recursion depth: %d\", RECURSION_DEPTH); \\\n        RECURSION_DEPTH--; \\\n    }\n\nstatic inline void _print_log_recursion_tabs(void) {\n    unsigned int k = 0;\n    if (RECURSION_DEPTH > 0) {\n        for (k = 0; k < RECURSION_DEPTH-1; k++) {\n            fprintf(stdout, \"\\t\");\n        }\n    }\n}\n#else\n// When heavy logging disabled then remove recursion depth follow for multithreading\nextern unsigned int RECURSION_DEPTH;\n#define INCREASE_RECURSION_DEPTH()\n#define DECREASE_RECURSION_DEPTH()\nstatic inline void _print_log_recursion_tabs(void) { }\n#endif\n\n\nstatic char *ECHO_NAME_MAP[] = {\"DEBUG\", \"VERBOSE\", \"CRITICAL\"};\n\n\n#define FOURIER_ASSERT(condition, level, message, ...) \\\n    /* This code will be optimized out if current level unsatisfied */ \\\n    if (level >= FOURIER_ASSERT_VERBOSE_LEVEL) { \\\n        if (!(condition)) { \\\n            fflush(stdout); \\\n            fprintf(stderr, \"[%s] Fourier library assertion in [%s:%4d]:\\n\\t\"message, \\\n                    ECHO_NAME_MAP[level], __func__, __LINE__, ##__VA_ARGS__); \\\n            exit(-1); \\\n        } \\\n    }\n\n\n#define FOURIER_LOG(level, message, ...) \\\n    /* This code will be optimized out if current level unsatisfied */ \\\n    if (level >= FOURIER_LOG_VERBOSE_LEVEL) { \\\n        fprintf(stdout, \"[%2d] Fourier log [%18s:%4d]: \", level, __func__, __LINE__); \\\n        _print_log_recursion_tabs(); \\\n        fprintf(stdout, message\"\\n\", ##__VA_ARGS__); \\\n        fflush(stdout); \\\n    }\n\n\n#if FOURIER_LOG_VERBOSE_LEVEL <= 50\n#define INCREASE_CALCULATED_TWIDDLES(_plan) _plan->calculated_twiddles++;\n#define INIT_CALCULATED_TWIDDLES(_plan) _plan->calculated_twiddles = 0;\n#define PRINT_CALCULATED_TWIDDLES(_plan) \\\n        FOURIER_LOG(50, \"Total calculated twiddles = %d\", plan->calculated_twiddles);\n#else\n#define INCREASE_CALCULATED_TWIDDLES(_plan)\n#define INIT_CALCULATED_TWIDDLES(_plan)\n#define PRINT_CALCULATED_TWIDDLES(_plan)\n#endif\n\n\nstatic FORCE_INLINE void* wmalloc(size_t n_bytes) {\n    void* result = _mm_malloc(n_bytes, 16);\n    if (FOURIER_LOG_VERBOSE_LEVEL >= 30) {\n        memset(result, 0, n_bytes);\n    }\n    FOURIER_LOG(30, \"Allocated %d bytes of memory at %p\", (unsigned int) n_bytes, result);\n    return result;\n}\n\n\nstatic FORCE_INLINE void wfree(void* ptr) {\n    FOURIER_LOG(30, \"Memory at pointer %p has been freed\", ptr);\n    _mm_free(ptr);\n}\n\n\n#define MALLOC(count, type) (type*) wmalloc(count*sizeof(type))\n#define MEMCPY(dst, src, count, type) memcpy(dst, src, count*sizeof(type))\n#define FREE(ptr) \\\n    if (ptr != NULL) { \\\n        wfree(ptr); \\\n        ptr = NULL; \\\n    }\n\n\n#define SWAP(type, v1, v2) \\\n{ \\\n    type tmp = v1; \\\n    v1 = v2; \\\n    v2 = tmp; \\\n}\n\n\n#define FOURIER_ALGORITHM_STD_ASSERTS(_level, _plan, _min_samples) \\\n    FOURIER_ASSERT(_plan->count >= _min_samples, _level, \\\n        \"FFT algorithm implemented only for more than %d samples in the input sequence: %d\\n\", \\\n        _min_samples, _plan->count); \\\n    FOURIER_ASSERT(_plan->howMany > 0, _level, \"Plan howMany must be greater than zero: %d\\n\", _plan->howMany); \\\n    FOURIER_ASSERT(_plan->in != NULL, _level, \"Plan input array must be allocated: %p\\n\", _plan->in); \\\n    FOURIER_ASSERT(_plan->out != NULL, _level, \"Plan output array must be allocated: %p\\n\", _plan->out); \\\n    FOURIER_ASSERT(_plan->direction == FFT_LITHO_BACKWARD || _plan->direction == FFT_LITHO_FORWARD, \\\n                   FOURIER_ECHO_DEBUG, \"Direction of FFT can be -1 or 1 but specified: %d\\n\", _plan->direction);\n\n\n#define FOURIER_ALGORITHM_STD_LOG(_level, _plan, _name) \\\n    FOURIER_LOG(_level, \"---> [%2d] FFT ALGORITHM: '\"_name \\\n                \"' count=%d  howMany=%d  iodist=%d/%d  iostride=%d/%d  dir=%d\", \\\n                RECURSION_DEPTH, _plan->count, _plan->howMany, _plan->idist, _plan->odist, \\\n                _plan->istride, _plan->ostride, _plan->direction);\n\n\n#define USE_FFT_SSE3\n\n\n#ifdef USE_FFT_SSE3\nstatic FORCE_INLINE fft_complex_t c_add(const fft_complex_t a, const fft_complex_t b) {\n    __m128d x = _mm_load_pd(&a.r);\n    __m128d y = _mm_load_pd(&b.r);\n    __m128d z = _mm_add_pd(x, y);\n\n    fft_complex_t result;\n    _mm_store_pd((double *)&result, z);\n    return result;\n}\n#else\nstatic FORCE_INLINE fft_complex_t c_add(const fft_complex_t a, const fft_complex_t b) {\n    fft_complex_t result = {\n            .r = a.r + b.r,\n            .i = a.i + b.i\n    };\n    return result;\n}\n#endif\n\n#ifdef USE_FFT_SSE3\nstatic FORCE_INLINE fft_complex_t c_sub(const fft_complex_t a, const fft_complex_t b) {\n    __m128d x = _mm_load_pd(&a.r);\n    __m128d y = _mm_load_pd(&b.r);\n    __m128d z = _mm_sub_pd(x, y);\n\n    fft_complex_t result;\n    _mm_store_pd((double *)&result, z);\n    return result;\n}\n#else\nstatic FORCE_INLINE fft_complex_t c_sub(const fft_complex_t a, const fft_complex_t b) {\n    fft_complex_t result = {\n            .r = a.r - b.r,\n            .i = a.i - b.i\n    };\n    return result;\n}\n#endif\n\n\n#ifdef USE_FFT_SSE3\nstatic FORCE_INLINE fft_complex_t c_mul(const fft_complex_t a, const fft_complex_t b) {\n    // Duplicates lower vector element into upper vector element.\n    //   num1: [x.real, x.real]\n    __m128d x = _mm_loaddup_pd(&a.r);\n\n    // Move y elements into a vector\n    //   num2: [y.img, y.real]\n    __m128d y = _mm_set_pd(b.i, b.r);\n\n    // Multiplies vector elements\n    //   num3: [(x.real*y.img), (x.real*y.real)]\n    __m128d z = _mm_mul_pd(y, x);\n\n    //   num1: [x.img, x.img]\n    x = _mm_loaddup_pd(&a.i);\n\n    // Swaps the vector elements\n    //   num2: [y.real, y.img]\n    y = _mm_shuffle_pd(y, y, 1);\n\n    //   num2: [(x.img*y.real), (x.img*y.img)]\n    y = _mm_mul_pd(y, x);\n\n    // Adds upper vector element while subtracting lower vector element\n    //   num3: [((x.real *y.img)+(x.img*y.real)),\n    //          ((x.real*y.real)-(x.img*y.img))]\n    z = _mm_addsub_pd(z, y);\n\n    fft_complex_t result;\n    _mm_store_pd((double *)&result, z);\n    return result;\n}\n#else\n#define C_MUL_RE(a, b) a.r * b.r - a.i * b.i\n#define C_MUL_IM(a, b) a.r * b.i + a.i * b.r\n\nstatic FORCE_INLINE fft_complex_t c_mul(const fft_complex_t a, const fft_complex_t b) {\n    fft_complex_t result = {\n            .r = C_MUL_RE(a, b),\n            .i = C_MUL_IM(a, b)\n    };\n    return result;\n}\n#endif\n\n\nstatic FORCE_INLINE fft_complex_t* c_divbyv(fft_complex_t* a, const double v) {\n    a->r /= v;\n    a->i /= v;\n    return a;\n}\n\n\nstatic FORCE_INLINE fft_complex_t c_divv(fft_complex_t a, const double v) {\n    fft_complex_t result = {\n            .r = a.r / v,\n            .i = a.i / v\n    };\n    return result;\n}\n\n\nstatic FORCE_INLINE fft_complex_t* c_addto(fft_complex_t *a, const fft_complex_t b) {\n    a->r += b.r;\n    a->i += b.i;\n    return a;\n}\n\n\nstatic FORCE_INLINE fft_complex_t* c_subfrom(fft_complex_t *a, const fft_complex_t b) {\n    a->r -= b.r;\n    a->i -= b.i;\n    return a;\n}\n\n\nstatic FORCE_INLINE fft_complex_t* c_mulby(fft_complex_t *a, const fft_complex_t b) {\n    *a = c_mul(*a, b);\n    return a;\n}\n\n\nstatic FORCE_INLINE fft_complex_t c_exp(fft_complex_t a) {\n    fft_complex_t result = {\n            .r = exp(a.r) * cos(a.i),\n            .i = exp(a.r) * sin(a.i)\n    };\n    return result;\n};\n\n\nstatic FORCE_INLINE fft_complex_t c_expi(double imag) {\n    fft_complex_t result = {\n            .r = cos(imag),\n            .i = sin(imag)\n    };\n    return result;\n};\n\n\nstatic FORCE_INLINE fft_complex_t c_rone(void) {\n    fft_complex_t result = {\n            .r = 1.0,\n            .i = 0.0\n    };\n    return result;\n}\n\n\nstatic FORCE_INLINE fft_complex_t c_ione(void) {\n    fft_complex_t result = {\n            .r = 0.0,\n            .i = 1.0\n    };\n    return result;\n}\n\n\nstatic FORCE_INLINE fft_complex_t c_zero(void) {\n    fft_complex_t result = {\n            .r = 0.0,\n            .i = 0.0\n    };\n    return result;\n}\n\n\nstatic FORCE_INLINE fft_complex_t* c_clear(fft_complex_t* a) {\n    a->r = 0.0;\n    a->i = 0.0;\n    return a;\n};\n\n\nstatic FORCE_INLINE fft_complex_t c_neg(const fft_complex_t a) {\n    fft_complex_t result = {\n            .r = -a.r,\n            .i = -a.i\n    };\n    return result;\n};\n\n\nstatic FORCE_INLINE fft_complex_t c_mulpj(const fft_complex_t a) {\n    fft_complex_t result = {\n            .r = -a.i,\n            .i = a.r\n    };\n    return result;\n};\n\n\nstatic FORCE_INLINE fft_complex_t c_mulnj(const fft_complex_t a) {\n    fft_complex_t result = {\n            .r = a.i,\n            .i = -a.r\n    };\n    return result;\n};\n\n\nstatic FORCE_INLINE fft_complex_t c_mulj(const fft_complex_t a, const int sign) {\n    FOURIER_ASSERT(sign > 0 || sign < 0, FOURIER_ECHO_DEBUG, \"Sign must be > 0 or < 0\");\n    return (sign < 0) ? c_mulpj(a) : c_mulnj(a);\n};\n\n\n/*\n *  WARNING: This function can't be inlined\n */\nstatic FORCE_INLINE fft_complex_t* c_sumto(fft_complex_t* result, const unsigned int count, ...) {\n    va_list args;\n    va_start(args, count);\n    unsigned int k = 0;\n    for (k = 0; k < count; k++) {\n        fft_complex_t value = va_arg(args, fft_complex_t);\n        c_addto(result, value);\n    }\n    va_end(args);\n    return result;\n}\n\n/*\n *  WARNING: This function can't be inlined\n */\nstatic FORCE_INLINE fft_complex_t c_sum(const unsigned int count, ...) {\n    va_list args;\n    va_start(args, count);\n    fft_complex_t result = c_zero();\n    c_sumto(&result, count, args);\n    va_end(args);\n    return result;\n}\n\n\nstatic FORCE_INLINE fft_complex_t* ivp(const struct fft_plan_t* plan, unsigned int s, unsigned int k) {\n    fft_complex_t* result = plan->in + s * plan->istride + k * plan->idist;\n\n    FOURIER_ASSERT(s < plan->howMany, FOURIER_ECHO_DEBUG, \"Signal number (s) must be lower than plan->howMany\");\n    FOURIER_ASSERT(k < plan->count, FOURIER_ECHO_DEBUG, \"Item number (k) must be lower than plan->count\");\n    FOURIER_ASSERT(s == 0 || plan->istride != 0, FOURIER_ECHO_DEBUG,\n                   \"s != 0 and plan->istride == 0: s = %d of %d with istride %d and k = %d of %d with idist %d\",\n                   s, plan->howMany, plan->istride, k, plan->count, plan->idist);\n    FOURIER_ASSERT(k == 0 || plan->idist != 0, FOURIER_ECHO_DEBUG,\n                   \"k != 0 and plan->idist == 0: s = %d of %d with istride %d and k = %d of %d with idist %d\",\n                   s, plan->howMany, plan->istride, k, plan->count, plan->idist);\n\n    FOURIER_LOG(40, \"s = %d of %d with istride %d and k = %d of %d with idist %d -> (%.4f, %.4f)\",\n                s, plan->howMany, plan->istride, k, plan->count, plan->idist, result->r, result->i);\n\n    return result;\n}\n\n\nstatic FORCE_INLINE fft_complex_t iv(const struct fft_plan_t* plan, unsigned int s, unsigned int k) {\n    return *ivp(plan, s, k);\n}\n\n\nstatic FORCE_INLINE fft_complex_t* ovp(const struct fft_plan_t* plan, unsigned int s, unsigned int k) {\n    fft_complex_t* result = plan->out + s * plan->ostride + k * plan->odist;\n\n    FOURIER_ASSERT(s < plan->howMany, FOURIER_ECHO_DEBUG, \"Signal number (s) must be lower than plan->howMany\");\n    FOURIER_ASSERT(k < plan->count, FOURIER_ECHO_DEBUG, \"Item number (k) must be lower than plan->count\");\n    FOURIER_ASSERT(s == 0 || plan->ostride != 0, FOURIER_ECHO_DEBUG,\n                   \"s != 0 and plan->istride == 0: s = %d of %d with ostride %d and k = %d of %d with odist %d\",\n                   s, plan->howMany, plan->ostride, k, plan->count, plan->odist);\n    FOURIER_ASSERT(k == 0 || plan->odist != 0, FOURIER_ECHO_DEBUG,\n                   \"k != 0 and plan->idist == 0: s = %d of %d with ostride %d and k = %d of %d with odist %d\",\n                   s, plan->howMany, plan->ostride, k, plan->count, plan->odist);\n\n    FOURIER_LOG(40, \"s = %d of %d with ostride %d and k = %d of %d with odist %d -> (%.4f, %.4f)\",\n                s, plan->howMany, plan->ostride, k, plan->count, plan->odist, result->r, result->i);\n\n    return result;\n}\n\n\nstatic FORCE_INLINE fft_complex_t ov(const struct fft_plan_t* plan, unsigned int s, unsigned int k) {\n    return *ovp(plan, s, k);\n}\n\n\n// Normalize array if backward transform (according to Matlab)\n#if FOURIER_NORMALIZATION_TYPE != FOURIER_DISABLE_NORMALIZATION\n#define FOURIER_NORMALIZE(_plan, _s, _k) \\\n    if (_plan->direction == FOURIER_NORMALIZATION_TYPE) { \\\n        for (_k = 0; _k < _plan->count; _k++) { \\\n            c_divbyv(ovp(_plan, _s, _k), _plan->count); \\\n        } \\\n    }\n#else\n#define FOURIER_NORMALIZE(_plan, _s, _k)\n#endif\n\n\n// This macros should be used for \"manual\" implementation of FFT for some samples count\n// routine that specified in fft_handlers array. Each function that included in fft_handlers\n// should be started with FFT_IMPLEMENTATION_BEGIN macro and finished with\n// FFT_IMPLEMENTATION_END macro. In this macros defined next variables that required to\n// implement FFT:\n// complex iv[] - array of input values\n// complex *ovp[] - array of pointers to output values\n// complex w[] - array of twiddles, w[1] = twiddle(1,N)\n// Between this macros code for calculation each output value of FFT should be placed.\n// Begin and end macros calculate required twiddles factors, normalization (for backward\n// transform), input value (according to idist, istride, inext) and output values places.\n// !!! NOTE !!! Loop that used in the macros optimized by compiler to linear code execution.\n#define FFT_IMPLEMENTATION_BEGIN(_plan, _length) \\\n        INCREASE_RECURSION_DEPTH(); \\\n        FOURIER_ALGORITHM_STD_LOG(50, _plan, \"Butterfly\"); \\\n        FOURIER_ALGORITHM_STD_ASSERTS(FOURIER_ECHO_DEBUG, _plan, _length) \\\n        FOURIER_ASSERT(_plan->count == _length, FOURIER_ECHO_DEBUG, \"Samples count must be equal to %d\\n\", _length); \\\n        unsigned int k = 0, s = 0; \\\n        const int len = _length; \\\n        for (s = 0; s < _plan->howMany; s++) { \\\n\n#if FOURIER_NORMALIZATION_TYPE != FOURIER_DISABLE_NORMALIZATION\n#define FFT_IMPLEMENTATION_END(_plan) \\\n            if (_plan->direction == FOURIER_NORMALIZATION_TYPE) { \\\n                for (k = 0; k < len; k++) { \\\n                    c_divbyv(ovp(_plan,s,k), len); \\\n                } \\\n            } \\\n        } \\\n        DECREASE_RECURSION_DEPTH();\n#else\n#define FFT_IMPLEMENTATION_END(_plan) } DECREASE_RECURSION_DEPTH();\n#endif\n\n#define X(k) iv(plan, s, k)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif"
  },
  {
    "path": "OptolithiumC/libs/fourier/include/fourier.h",
    "content": "/*\n * Fourier Transform library for Optolithium lithography modelling software\n *\n * Copyright (C) 2015 Alexei Gladkikh\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are permitted provided that\n * the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the\n *    documentation  and/or other materials provided with the distribution.\n * 3. Neither the names of the copyright holders nor the names of any\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, ORCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n * \n */\n\n#ifndef FOURIER_H_\n#define FOURIER_H_\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n#define FOURIER_ASSERT_UNCONDITION 0\n\n\n#define FOURIER_ECHO_DEBUG     0\n#define FOURIER_ECHO_VERBOSE   1\n#define FOURIER_ECHO_CRITICAL  2\n#define FOURIER_ECHO_NONE      3\n\n\n#define FFT_LITHO_FORWARD  (-1)\n#define FFT_LITHO_BACKWARD (+1)\n\n\n#define FOURIER_DISABLE_NORMALIZATION 0\n#define FOURIER_BACKWARD_NORMALIZATION FFT_LITHO_BACKWARD\n#define FOURIER_FORWARD_NORMALIZATION FFT_LITHO_FORWARD\n\n\n#ifndef FOURIER_LOG_VERBOSE_LEVEL\n#define FOURIER_LOG_VERBOSE_LEVEL 100\n#endif\n\n#ifndef FOURIER_ASSERT_VERBOSE_LEVEL\n#define FOURIER_ASSERT_VERBOSE_LEVEL FOURIER_ECHO_NONE\n//#define FOURIER_ASSERT_VERBOSE_LEVEL FOURIER_ECHO_DEBUG\n#endif\n\n#ifndef FOURIER_NORMALIZATION_TYPE\n#define FOURIER_NORMALIZATION_TYPE FOURIER_DISABLE_NORMALIZATION\n//#define FOURIER_NORMALIZATION_TYPE FFT_LITHO_BACKWARD\n#endif\n\n\n#define MAX_PRIMES_COUNT 32\n\n\ntypedef struct {\n    double r;\n    double i;\n} fft_complex_t;\n\n\nvoid fftshift(fft_complex_t *data, unsigned int count);\nvoid ifftshift(fft_complex_t *data, unsigned int count);\n\n\n/*\n * result - Obtained primes of the number N\n * \t\t    Note: Maximum number of element after factorization may occurred if number is only radix-2.\n * \t\t    For 32-bit int value in this case obviously that maximum prime multipliers count is 32.\n * \t\t    This value is also maximum multiplier count because for any other prime value number of\n * \t\t    multiplier will be reduced.\n * return: Count of prime factors\n */\n// TODO: Sieve of Eratosthenes\nint prime_factorize(int result[32], unsigned int N);\nint is_prime(unsigned int N);\nint is_power2(unsigned int x);\n\n// Twiddles cache structure definition\n\n#define MAX_TWIDDLES_CACHE_CHILDREN 3\nstruct _fft_twiddles_cache_t;\n\n\ntypedef struct {\n    int is_calculated;\n    fft_complex_t value;\n} fft_cache_item_t;\n\n\nstruct _fft_twiddles_cache_t {\n    unsigned int count;\n    fft_cache_item_t* data;\n    struct _fft_twiddles_cache_t* children[MAX_TWIDDLES_CACHE_CHILDREN];\n};\n\n// FFT plan structure definition\n\n#define FFT_NO_FLAGS          0x00\n#define FFT_USE_CACHE         0x01\n#define FFT_USE_RADIX2_TABLE  0x02\n\n\nstruct fft_plan_t {\n\tunsigned int count;     // Number of FFT samples\n\tunsigned int howMany;   // Number of FFT transforms\n    fft_complex_t* in;      // Memory block of input array\n\tint idist;              // Shift between samples for the same signal (for single normal FFT transform istride = 1)\n\tint istride;            // Shift between samples for different signal (algorithm use it only if howMany > 1)\n\tint __unused _inext;    // Used only if required to calculate only one harmonic for many signals and should\n\t                        // be set to shift between different signal (else equal to 0).\n                            // Option is used to calculate one frequency sample\n\t                        // for different input signal. For first frequency in[n] will be used, for\n\t                        // the second frequency in[count + n], etc. So result spectrum calculated\n\t                        // using in[k*count+n], where k - frequency number, n - input signal sample\n\tfft_complex_t* out;     // Memory block of output array (memory must be preallocated)\n\tint ostride;            // See istride.\n\tint odist;              // See idist.\n\tint direction;          // One of FFT_LITHO_FORWARD or FFT_LITHO_BACKWARD\n\n    // Input sample address calculated as: in + k*inext + s*istride + k*idist\n\t// Output sample address calculated as: out + s*ostride + k*odist\n    //       where s - iterate to howMany, k - iterate to sample count\n\n    fft_complex_t *tmpbuf;  // Temporary buffer for in place transformation\n\n    struct _fft_twiddles_cache_t** cache;\n    unsigned int flags;\n\n    // Multi-dimension extensions\n    unsigned int total;     // Total items for N-dimensions transformation\n    unsigned int rank;      // Number of independent dimensions\n    unsigned int *dims;     // Pointer to array with each dimension elements count\n\n    // Performance debug\n#if FOURIER_LOG_VERBOSE_LEVEL <= 50\n    unsigned int calculated_twiddles;\n#endif\n};\n\ntypedef struct _fft_twiddles_cache_t fft_twiddles_cache_t;\n\n\n//void fft_radix_2(struct fft_plan_t* plan);\n//void fft_prime(struct fft_plan_t *plan);\n//void fft_mixed_radix(struct fft_plan_t *plan);\n\n// Initialize internal arrays for radix-2 transform.\n// This function perform at the first plan creation,\n// but it can be called at any point program before FFT used.\nvoid fft_initialize_radix_2(void);\n\nstruct fft_plan_t* fft_plan_create_1d(\n        unsigned int count, fft_complex_t* in, fft_complex_t* out,\n        int direction, unsigned int flags);\n\nstruct fft_plan_t* fft_plan_create_many_1d(\n        unsigned int count, unsigned int howMany,\n        fft_complex_t* in, fft_complex_t* out,\n        int direction, unsigned int flags);\n\nstruct fft_plan_t* fft_plan_create_2d(\n        unsigned int n_rows, unsigned int n_cols,\n        fft_complex_t* in, fft_complex_t* out,\n        int direction, unsigned int flags);\n\nstruct fft_plan_t* fft_plan_create_nd(\n        unsigned int rank, unsigned int* dims,\n        fft_complex_t* in, fft_complex_t* out,\n        int direction, unsigned int flags);\n\nvoid fft_plan_destroy(struct fft_plan_t* state);\n\nvoid fft_execute_1d(struct fft_plan_t* plan);\nvoid fft_execute_2d(struct fft_plan_t* plan);\nvoid fft_execute_nd(struct fft_plan_t* plan);\nvoid fft_execute(struct fft_plan_t* plan);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* FOURIER_H_ */\n"
  },
  {
    "path": "OptolithiumC/libs/fourier/include/primes.h",
    "content": "/*\n * Fourier Transform library for Optolithium lithography modelling software\n *\n * Copyright (C) 2015 Alexei Gladkikh\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are permitted provided that\n * the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the\n *    documentation  and/or other materials provided with the distribution.\n * 3. Neither the names of the copyright holders nor the names of any\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, ORCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n */\n\n#ifndef PRIMES_H_\n#define PRIMES_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"basics.h\"\n\n// Definition of the implemented FFT callback's type\ntypedef void (*fft_handler_t)(struct fft_plan_t *);\ntypedef struct {\n        unsigned int count;\n        fft_handler_t handler;\n} fft_handler_desc_t;\n\n\nextern const fft_handler_desc_t fft_handlers[];\nextern const unsigned int FFT_IMPLEMENTED_RADIX_COUNT;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif"
  },
  {
    "path": "OptolithiumC/libs/fourier/src/check.c",
    "content": "/*\n * Benchmark and test the Fourier library for Optolithium software\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n */\n\n#include <fftw3.h>\n#include <fourier.h>\n#include <stdlib.h>\n#include <time.h>\n#include <math.h>\n#include <sys/time.h>\n\n\n#define MEASURE_START() { \\\n    struct timeval tval_before, tval_after, tval_result; \\\n    gettimeofday(&tval_before, NULL);\n\n\n#define MEASURE_FINISH(result) \\\n    gettimeofday(&tval_after, NULL); \\\n    timersub(&tval_after, &tval_before, &tval_result); \\\n    result = (double) (tval_result.tv_sec) + (double)(tval_result.tv_usec)/1.0E6; \\\n}\n\n#define FFT_DIRECTION FFT_LITHO_FORWARD\n//#define FFT_DIRECTION FFT_LITHO_BACKWARD\n\n#define N_START 1\n\n#define N_STOP 1024\n//#define N_STOP 5\n\n#define HOW_MANY 128\n#define ERROR_THRESHOLD 1.0\n#define PRINT_EVERY_NTEST 512\n\n#define USE_FFTW_ONE_EXECUTE\n\n//#define ONLY_POWER_OF_2\n\n\nint main(int argc, char* argv[]) {\n    unsigned int n_test, s = 0;\n    double sum_coef = 0.0;\n    double sum_fourier_time = 0.0;\n    double sum_fftw_time = 0.0;\n    unsigned int count = 0;\n    unsigned int total_prime = 0;\n    unsigned int total_radix2 = 0;\n    unsigned int total_mixed = 0;\n\n    double ft_rate = 0.0;\n    double fftw_rate = 0.0;\n\n    double mean_ft_rate = 0.0;\n    double mean_fftw_rate = 0.0;\n\n    double prime_time_fftw = 0.0;\n    double radix2_time_fftw = 0.0;\n    double mixed_time_fftw = 0.0;\n\n    double prime_time_ft = 0.0;\n    double radix2_time_ft = 0.0;\n    double mixed_time_ft = 0.0;\n\n    time_t current_time;\n    time(&current_time);\n    srand((unsigned int) current_time);\n\n    double fftw_time, fourier_time;\n\n    fft_initialize_radix_2();\n\n    for (n_test = N_START; n_test <= N_STOP; n_test++) {\n#ifdef ONLY_POWER_OF_2\n        if (is_power2(n_test)) {\n#endif\n            unsigned int total = HOW_MANY * n_test;\n\n            fft_complex_t *in_buf = (fft_complex_t *) malloc(total * sizeof(fft_complex_t));\n            fft_complex_t *opl_buf = (fft_complex_t *) malloc(total * sizeof(fft_complex_t));\n        #ifdef USE_FFTW_ONE_EXECUTE\n            fftw_complex *fftw_buf_in = (fftw_complex *) malloc(total * sizeof(fftw_complex));\n            fftw_complex *fftw_buf_out = (fftw_complex *) malloc(total * sizeof(fftw_complex));\n\n            for (s = 0; s < total; s++) {\n                in_buf[s].r = opl_buf[s].r = fftw_buf_in[s][0] = (double) (rand() % 32768) / 512.0;\n                in_buf[s].i = opl_buf[s].i = fftw_buf_in[s][1] = (double) (rand() % 32768) / 512.0;\n            }\n        #else\n            fftw_complex *fftw_buf = (fftw_complex *) malloc(total * sizeof(fftw_complex));\n\n            for (s = 0; s < total; s++) {\n                in_buf[s].r = opl_buf[s].r = fftw_buf[s][0] = (double) (rand() % 32768) / 512.0;\n                in_buf[s].i = opl_buf[s].i = fftw_buf[s][1] = (double) (rand() % 32768) / 512.0;\n            }\n        #endif\n\n//            for (s = 0; s < total; s++) {\n//                in_buf[s].r = opl_buf[s].r = fftw_buf[s][0] = 10.0*(s+1);\n//                in_buf[s].i = opl_buf[s].i = fftw_buf[s][1] = 4.0*(s+1);\n//            }\n\n            MEASURE_START()\n#ifdef USE_FFTW_ONE_EXECUTE\n                int dims[1] = { n_test };\n                fftw_plan fftw_pln = fftw_plan_many_dft(\n                        1, dims, HOW_MANY,\n                        fftw_buf_in, dims, 1, n_test,\n                        fftw_buf_out, dims, 1, n_test,\n                        FFT_DIRECTION, FFTW_ESTIMATE);\n                fftw_execute(fftw_pln);\n#else\n                fftw_complex *tmp = fftw_buf;\n                unsigned int k = 0;\n                for (k = 0; k < HOW_MANY; k++) {\n                    fftw_plan fftw_pln = fftw_plan_dft_1d(n_test, tmp, tmp, FFT_DIRECTION, FFTW_ESTIMATE);\n                    fftw_execute(fftw_pln);\n                    tmp += n_test;\n                }\n#endif\n            MEASURE_FINISH(fftw_time)\n\n            MEASURE_START()\n//                struct fft_plan_t* opl_plan = fft_plan_create_many_1d(n_test, HOW_MANY, opl_buf, opl_buf, FFT_DIRECTION, FFT_NO_FLAGS);\n//                struct fft_plan_t* opl_plan = fft_plan_create_many_1d(n_test, HOW_MANY, opl_buf, opl_buf, FFT_DIRECTION, FFT_USE_RADIX2_TABLE);\n//                struct fft_plan_t* opl_plan = fft_plan_create_many_1d(n_test, HOW_MANY, opl_buf, opl_buf, FFT_DIRECTION, FFT_USE_CACHE);\n                struct fft_plan_t *opl_plan = fft_plan_create_many_1d(\n                        n_test, HOW_MANY, opl_buf, opl_buf, FFT_DIRECTION, FFT_USE_CACHE | FFT_USE_RADIX2_TABLE);\n                fft_execute(opl_plan);\n            MEASURE_FINISH(fourier_time)\n\n            double std = 0.0, error = 0.0;\n            for (s = 0; s < total; s++) {\n#ifdef USE_FFTW_ONE_EXECUTE\n                double dr = fabs(opl_buf[s].r - fftw_buf_out[s][0]);\n                double di = fabs(opl_buf[s].i - fftw_buf_out[s][1]);\n#else\n                double dr = fabs(opl_buf[s].r - fftw_buf[s][0]);\n                double di = fabs(opl_buf[s].i - fftw_buf[s][1]);\n#endif\n                std += sqrt(dr * dr + di * di);\n            }\n\n            ft_rate += 5 * n_test * log2(n_test) / (fourier_time * 1E6 / (double) HOW_MANY);\n            fftw_rate += 5 * n_test * log2(n_test) / (fftw_time * 1E6 / (double) HOW_MANY);\n\n            mean_ft_rate += ft_rate;\n            mean_fftw_rate += fftw_rate;\n\n            fftw_time /= (double) HOW_MANY;\n            fourier_time /= (double) HOW_MANY;\n\n            std /= (double) (total);\n            sum_fftw_time += fftw_time;\n            sum_fourier_time += fourier_time;\n            sum_coef += (fourier_time / fftw_time);\n            count++;\n\n            if (is_prime(n_test)) {\n                prime_time_fftw += fftw_time;\n                prime_time_ft += fourier_time;\n                total_prime++;\n            } else if (is_power2(n_test)) {\n                radix2_time_fftw += fftw_time;\n                radix2_time_ft += fourier_time;\n                total_radix2++;\n            } else {\n                mixed_time_fftw += fftw_time;\n                mixed_time_ft += fourier_time;\n                total_mixed++;\n            }\n\n#ifdef ONLY_POWER_OF_2\n            if (is_power2(n_test) || std > ERROR_THRESHOLD) {\n#else\n            if (n_test % PRINT_EVERY_NTEST == 0 || std > ERROR_THRESHOLD) {\n#endif\n                printf(\"---- [%6d] Results Fourier/FFTW -> cur: |%6d|%.6f|%.6f| = %7.2f total: |%.6f|%.6f| mean = %5.2f Rate: |%5.0f|%5.0f| ----\\n\",\n                       n_test, n_test,\n                       fourier_time, fftw_time, fourier_time / fftw_time,\n                       sum_fourier_time, sum_fftw_time,\n                       sum_coef / (double) count,\n                       ft_rate/(double)count, fftw_rate/(double)count);\n                fflush(stdout);\n                sum_fftw_time = 0;\n                sum_fourier_time = 0;\n                sum_coef = 0;\n                count = 0;\n                ft_rate = 0;\n                fftw_rate = 0;\n            }\n\n            if (std > ERROR_THRESHOLD) {\n                for (s = 0; s < total; s++) {\n#ifdef USE_FFTW_ONE_EXECUTE\n                    printf(\"values[%3d] = (%.3f, %.3fi) -> fftw = (%.3f, %.3fi) opl = (%.3f, %.3fi)\\n\",\n                           s, in_buf[s].r, in_buf[s].i, fftw_buf_out[s][0], fftw_buf_out[s][1], opl_buf[s].r, opl_buf[s].i);\n#else\n                    printf(\"values[%3d] = (%.3f, %.3fi) -> fftw = (%.3f, %.3fi) opl = (%.3f, %.3fi)\\n\",\n                           s, in_buf[s].r, in_buf[s].i, fftw_buf[s][0], fftw_buf[s][1], opl_buf[s].r, opl_buf[s].i);\n#endif\n                }\n                printf(\"ERROR: TEST WAS NOT PASSED! -> TOO BIG ERROR\\n\");\n                return -1;\n            }\n\n            free(in_buf);\n            free(opl_buf);\n#ifdef USE_FFTW_ONE_EXECUTE\n            free(fftw_buf_out);\n            free(fftw_buf_in);\n#else\n            free(fftw_buf);\n#endif\n#ifdef ONLY_POWER_OF_2\n        }\n#endif\n    }\n\n    const unsigned int total = total_mixed+total_prime+total_radix2;\n    printf(\"Total count: %d\\n\", total);\n    printf(\"Fourier/FFTW total -> prime %d radix-2 %d mixed %d\\n\", total_prime, total_radix2, total_mixed);\n    printf(\"Fourier/FFTW total -> prime |%.6f|%.6f| radix-2 |%.6f|%.6f| mixed |%.6f|%.6f|\\n\",\n           prime_time_ft, prime_time_fftw, radix2_time_ft, radix2_time_fftw, mixed_time_ft, mixed_time_fftw);\n    printf(\"Fourier/FFTW mean  -> prime |%.6f|%.6f| radix-2 |%.6f|%.6f| mixed |%.6f|%.6f|\\n\",\n            prime_time_ft/(double)total_prime,\n            prime_time_fftw/(double)total_prime,\n            radix2_time_ft/(double)total_radix2,\n            radix2_time_fftw/(double)total_radix2,\n            mixed_time_ft/(double)total_mixed,\n            mixed_time_fftw/(double)total_mixed);\n    printf(\"Mean rate Fourier/FFTW: |%5.0f|%5.0f|\\n\", mean_ft_rate/(double) total, mean_fftw_rate/(double) total);\n\n    return 0;\n}"
  },
  {
    "path": "OptolithiumC/libs/fourier/src/fourier.c",
    "content": "/*\n * Fourier Transform library for Optolithium lithography modelling software\n *\n * Copyright (C) 2015 Alexei Gladkikh\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are permitted provided that\n * the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the\n *    documentation  and/or other materials provided with the distribution.\n * 3. Neither the names of the copyright holders nor the names of any\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n */\n\n#include \"basics.h\"\n#include \"primes.h\"\n\n\nunsigned int RECURSION_DEPTH = 0;\n\n\nvoid perform_bitrev(unsigned int *indexes, unsigned int count) {\n    unsigned int i, forward, rev, zeros;\n\n    // to hold bitwise negated or odd values\n    unsigned int nodd, noddrev;\n    unsigned int halfn, quartn, nmin1;\n\n    // frequently used 'constants'\n//\tN = 1 << logN;\n    halfn = count >> 1;\n    quartn = count >> 2;\n    nmin1 = count - 1;\n\n    // variable initializations\n    forward = halfn;\n    rev = 1;\n\n    // start of bitreversed permutation loop, N/4 iterations\n    for (i = quartn; i; i--) {\n        // Gray code generator for even values:\n\n        // counting ones is easier\n        nodd = ~i;\n\n        // find trailing zero's in i\n        for (zeros = 0; nodd & 1; zeros++) {\n            nodd >>= 1;\n        }\n\n        // toggle one bit of forward\n        forward ^= 2 << zeros;\n        // toggle one bit of rev\n        rev ^= quartn >> zeros;\n\n        // swap even and ~even conditionally\n        if (forward < rev) {\n            SWAP(unsigned int, indexes[forward], indexes[rev]);\n            // compute the bitwise negations\n            nodd = nmin1 ^ forward;\n            noddrev = nmin1 ^ rev;\n            // swap bitwise-negated pairs\n            SWAP(unsigned int, indexes[nodd], indexes[noddrev]);\n        }\n\n        // compute the odd values from the even\n        nodd = forward ^ 1;\n        noddrev = rev ^ halfn;\n        // swap odd unconditionally\n        SWAP(unsigned int, indexes[nodd], indexes[noddrev]);\n    }\n    // end of the bitreverse permutation loop\n}\n\n\nunsigned int *create_bitrev(unsigned int length) {\n    FOURIER_LOG(35, \"Create bit reversal array of length %d\", length);\n    unsigned int k = 0;\n    unsigned int *bit_reversed_indx = MALLOC(length, unsigned int);\n    for (k = 0; k < length; k++) {\n        bit_reversed_indx[k] = k;\n    }\n    perform_bitrev(bit_reversed_indx, length);\n    return bit_reversed_indx;\n}\n\n\nstatic int RADIX2_INIT = 0;\n\n#define TWIDDLE_ARRAY_SIZE (1 << 18)\nstatic double TWIDDLE_ARRAY[TWIDDLE_ARRAY_SIZE] = { 0.0 };\n\n#define BITREV_POWERS_NUM 18\n#define BITREV_MAX_LENGTH (1 << BITREV_POWERS_NUM)\nstatic unsigned int* BITREV_ARRAY[BITREV_POWERS_NUM+1] = { NULL };\n\n\nvoid fft_initialize_radix_2(void) {\n    FOURIER_LOG(50, \"Initialize FFT radix-2 internal arrays: %d\", RADIX2_INIT)\n    if (!RADIX2_INIT) {\n        unsigned int k = 0;\n\n        for (k = 0; k < TWIDDLE_ARRAY_SIZE; k++) {\n            double x = 2.0 * M_PI * (double) k / (double) TWIDDLE_ARRAY_SIZE;\n            TWIDDLE_ARRAY[k] = sin(x);\n        }\n\n        for (k = 1; k <= BITREV_POWERS_NUM; k++) {\n            BITREV_ARRAY[k] = create_bitrev((unsigned int)(1 << k));\n        }\n\n        RADIX2_INIT = 1;\n    }\n}\n\n\nunsigned int log2shift(unsigned int N) {\n    FOURIER_LOG(5, \"Calculate for N = %d\", N);\n    FOURIER_ASSERT(N > 0, FOURIER_ECHO_CRITICAL, \"N must be greater than zero!\\n\");\n\n    unsigned int log2N = 0;\n    while (N != 0) {\n        N >>= 1;\n        log2N++;\n    }\n    return log2N - 1;\n}\n\n\nstatic FORCE_INLINE unsigned int *get_bitrev(unsigned int length) {\n    unsigned int pow = log2shift(length);\n    if (pow <= BITREV_POWERS_NUM) {\n        FOURIER_LOG(35, \"Get bitrev array from stored data: %d\", length);\n        return BITREV_ARRAY[pow];\n    } else {\n        return create_bitrev(length);\n    }\n}\n\n\nstatic FORCE_INLINE void free_bitrev(unsigned int* ptr, unsigned int length) {\n    if (length > BITREV_MAX_LENGTH) {\n        wfree(ptr);\n    }\n}\n\n\nvoid fftshift(fft_complex_t *data, unsigned int count) {\n    int k = 0;\n    // Central element\n    int c = (int) floor((float) count / 2);\n    // For odd and for even numbers of element use different algorithm\n    if (count % 2 == 0) {\n        for (k = 0; k < c; k++) {\n            SWAP(fft_complex_t, data[k], data[k + c])\n        }\n    } else {\n        fft_complex_t tmp = data[0];\n        for (k = 0; k < c; k++) {\n            data[k] = data[c + k + 1];\n            data[c + k + 1] = data[k + 1];\n        }\n        data[c] = tmp;\n    }\n}\n\n\nvoid ifftshift(fft_complex_t *data, unsigned int count) {\n    int k = 0;\n    int c = (int) floor((float) count / 2);\n    if (count % 2 == 0) {\n        for (k = 0; k < c; k++) {\n            SWAP(fft_complex_t, data[k], data[k + c])\n        }\n    } else {\n        fft_complex_t tmp = data[count - 1];\n        for (k = c - 1; k >= 0; k--) {\n            data[c + k + 1] = data[k];\n            data[k] = data[c + k];\n        }\n        data[c] = tmp;\n    }\n}\n\n\nint prime_factorize(int result[MAX_PRIMES_COUNT], unsigned int N) {\n    FOURIER_ASSERT(N > 0, FOURIER_ECHO_DEBUG, \"Argument N = %d less than or equal zero\", N);\n\n    if (N < 4) {\n        result[0] = N;\n        return 1;\n    }\n\n    // Count of prime factors\n    int count = 0;\n\n    // Current prime multiplier\n    int div = 2;\n\n    while (N > 1) {\n        if (N % div != 0) {\n            div++;\n        } else {\n            N /= div;\n            result[count++] = div;\n        }\n    }\n\n    return count;\n}\n\n\nFORCE_INLINE int is_prime(unsigned int N) {\n    // TODO: I know that is ugly and very time expensive and it will be change later\n    // (e.g. Sieve of Eratosthenes)\n    int primes[MAX_PRIMES_COUNT];\n    int count = prime_factorize(primes, N);\n    return count > 1 ? 0 : 1;\n}\n\n\nFORCE_INLINE int is_power2(unsigned int x) {\n    return x && !(x & (x - 1));\n}\n\n\nFORCE_INLINE int is_power4(unsigned int x) {\n    return x && !(x & (x - 1)) && (x & 0x55555555);\n}\n\n\nFORCE_INLINE void _add_cache_as_table(const fft_twiddles_cache_t* cache, const int k) {\n    int imag_indx = TWIDDLE_ARRAY_SIZE / cache->count * k;\n    int real_indx = (imag_indx + TWIDDLE_ARRAY_SIZE / 4) % TWIDDLE_ARRAY_SIZE;\n    fft_cache_item_t item = {\n            .is_calculated = 1,\n            .value.r = TWIDDLE_ARRAY[real_indx],\n            .value.i = TWIDDLE_ARRAY[imag_indx]\n    };\n    cache->data[k] = item;\n}\n\n\nFORCE_INLINE void _add_cache_as_calc(const fft_twiddles_cache_t* cache, const int k) {\n    fft_cache_item_t item = {\n            .is_calculated = 1,\n            .value = c_expi(2 * M_PI * (double) k / (double) cache->count)\n    };\n    cache->data[k] = item;\n}\n\n\nFORCE_INLINE fft_complex_t _cached(const fft_twiddles_cache_t* cache, const int k, const int dir) {\n    fft_complex_t cached = cache->data[k].value;\n    fft_complex_t twiddle = {\n            .r = cached.r,\n            .i = (dir == FFT_LITHO_BACKWARD) ? cached.i : -cached.i\n    };\n    return twiddle;\n}\n\n\nFORCE_INLINE fft_complex_t _calc_twiddle_by_table(const int k, const struct fft_plan_t* plan) {\n    FOURIER_LOG(70, \"Calculate twiddle using table...\")\n    int imag_indx = TWIDDLE_ARRAY_SIZE / plan->count * k;\n    int real_indx = (imag_indx + TWIDDLE_ARRAY_SIZE / 4) % TWIDDLE_ARRAY_SIZE;\n    fft_complex_t twiddle = {\n            .r = TWIDDLE_ARRAY[real_indx],\n            .i = (plan->direction == FFT_LITHO_BACKWARD) ? TWIDDLE_ARRAY[imag_indx] : -TWIDDLE_ARRAY[imag_indx]\n    };\n    return twiddle;\n};\n\n\nFORCE_INLINE fft_complex_t _calc_twiddle(const int k, const int N, const int d) {\n    return c_expi(2 * M_PI * d * (double) k / (double) N);\n};\n\n\nFORCE_INLINE fft_complex_t _calc_twiddle_by_exp(const int k, const struct fft_plan_t* plan) {\n    FOURIER_LOG(70, \"Calculate twiddle using c_expi...\")\n    return _calc_twiddle(k, plan->count, plan->direction);\n};\n\n\nFORCE_INLINE fft_twiddles_cache_t* fft_cache_create_node(const unsigned int count) {\n    unsigned int k = 0;\n\n    fft_twiddles_cache_t* cache = MALLOC(1, fft_twiddles_cache_t);\n\n    if (count != 0) {\n        cache->count = count;\n        cache->data = MALLOC(count, fft_cache_item_t);\n        for (k = 0; k < count; k++) {\n            cache->data[k].is_calculated = 0;\n        }\n    }\n\n    for (k = 0; k < MAX_TWIDDLES_CACHE_CHILDREN; k++) {\n        cache->children[k] = NULL;\n    }\n\n    return cache;\n}\n\n\nFORCE_INLINE fft_twiddles_cache_t* fft_cache_alloc_child(\n        fft_twiddles_cache_t* cache, const struct fft_plan_t* plan, const int indx) {\n    if (cache != NULL) {\n        if (cache->children[indx] == NULL) {\n            cache->children[indx] = fft_cache_create_node(plan->count);\n        }\n        return cache->children[indx];\n    } else {\n        return NULL;\n    }\n}\n\n\nFORCE_INLINE void fft_cache_init(struct fft_plan_t* plan) {\n    unsigned int k = 0;\n    plan->cache = MALLOC(plan->rank, fft_twiddles_cache_t*);\n    for (k = 0; k < plan->rank; k++) {\n        plan->cache[k] = plan->flags & FFT_USE_CACHE ? fft_cache_create_node(plan->dims[k]) : NULL;\n    }\n}\n\n\nFORCE_INLINE void _fft_cache_destroy(fft_twiddles_cache_t* cache) {\n    if (cache != NULL) {\n        unsigned int k = 0;\n\n        for (k = 0; k < MAX_TWIDDLES_CACHE_CHILDREN; k++) {\n            _fft_cache_destroy(cache->children[k]);\n        }\n\n        FREE(cache->data);\n        FREE(cache);\n    }\n}\n\n\nFORCE_INLINE void fft_cache_destroy(struct fft_plan_t* plan) {\n    unsigned int k = 0;\n    for (k = 0; k < plan->rank; k++) {\n        _fft_cache_destroy(plan->cache[k]);\n    }\n}\n\n\n#define USE_RADIX2_TABLE(_plan) \\\n    TWIDDLE_ARRAY_SIZE % _plan->count == 0 && _plan->count < TWIDDLE_ARRAY_SIZE && _plan->flags & FFT_USE_RADIX2_TABLE\n\n\nFORCE_INLINE fft_complex_t calc_twiddle(const int k, struct fft_plan_t* plan, fft_twiddles_cache_t* cache) {\n    // Get indexes from sinus array that represent specified complex exponent\n    // cos(A + pi/2) = sin(A)\n    // cos(-A) =  cos(A)\n    // sin(-A) = -sin(A)\n    INCREASE_CALCULATED_TWIDDLES(plan);\n\n    fft_complex_t twiddle;\n\n    if (cache != NULL) {\n        if (!cache->data[k].is_calculated) {\n            if (USE_RADIX2_TABLE(plan)) {\n                _add_cache_as_table(cache, k);\n            } else {\n                _add_cache_as_calc(cache, k);\n            }\n        }\n        twiddle = _cached(cache, k, plan->direction);\n    } else {\n        twiddle = USE_RADIX2_TABLE(plan) ? _calc_twiddle_by_table(k, plan) : _calc_twiddle_by_exp(k, plan);\n    }\n\n    FOURIER_LOG(45, \"k = %3d N = %3d dir = %2d -> (%7.4f, %7.4f)\",\n                k, plan->count, plan->direction, twiddle.r, twiddle.i);\n\n    return twiddle;\n}\n\n\nFORCE_INLINE int sign_rotation(int k, int p) {\n    // Return value depending on k and p (period) by the next law:\n    // 0 1 2 3 4 5 6 7 ...\n    // 0 1 0 1 0 1 0 1 ... p = 1\n    // 0 0 1 1 0 0 1 1 ... p = 2\n    // 0 0 0 0 1 1 1 1 ... p = 4\n    // Where alternation of 0 and 1 is equal to p\n    return (k / p) % 2;\n}\n\n\nFORCE_INLINE int get_twiddle_sign(int k, int n) {\n    // Table of what alternation period has each of twiddle factor\n    //       2  4  8\n    // 0 ->  0  0  0\n    // 1 ->  1  0  0\n    // 2 ->  0  1  0\n    // 3 ->  1  1  0\n    // 4 ->  0  0  1\n    // .............\n    // For example, sign of zero twiddle factor hasn't got rotation period throught frequency number\n    // so for all frequency sign is equal. But for third twiddle factor sign has rotation period\n    // by 2 and by 4 depending on frequency number (k). In this case sign equal to:\n    // sign_period(k, 2) * sign_period(k, 4). In the code below multiplication replaced by XOR\n    // because in the code boolean value used (XOR of boolean values equal to +1/-1 multiplication).\n\n    int p = 0, sign = 0;\n\n    for (p = 1; p <= n; p <<= 1) {\n        if (p & n) {\n            sign ^= sign_rotation(k, 2 * p);\n        }\n    }\n\n    return sign ? -1 : 1;\n}\n\n\n#define FFT_RADIX2_CACHED(_plan, _cache, _childno) { \\\n    fft_twiddles_cache_t* child_cache = fft_cache_alloc_child(cache, _plan, _childno);\\\n    fft_radix_2(_plan, child_cache); \\\n}\n\n\n/*\n * fft_radix_2 - Perform Fast Fourier Transform from input signal specified by <in>\n *               that have power of two number of samples.\n */\nvoid fft_radix_2(struct fft_plan_t *plan, fft_twiddles_cache_t* cache) {\n    INCREASE_RECURSION_DEPTH();\n    FOURIER_ALGORITHM_STD_LOG(50, plan, \"Cooley–Tukey Radix-2\");\n    FOURIER_ALGORITHM_STD_ASSERTS(FOURIER_ECHO_DEBUG, plan, 2);\n\n    unsigned int s = 0;  // Transform number\n\n    // If frequencies is generated for similar signals then pairs can be calculated once\n    // else for different frequency (k) pairs will be also different.\n    unsigned int *bitrev_indx = get_bitrev(plan->count);\n\n    for (s = 0; s < plan->howMany; s++) {\n\n        unsigned int stage, group, pair, k;\n\n        for (k = 0; k < plan->count; k+=2) {\n            *ovp(plan, s, k + 0) = c_add(iv(plan, s, bitrev_indx[k]), iv(plan, s, bitrev_indx[k+1]));\n            *ovp(plan, s, k + 1) = c_sub(iv(plan, s, bitrev_indx[k]), iv(plan, s, bitrev_indx[k+1]));\n        }\n\n        for (stage = 2; stage < plan->count; stage <<= 1) {\n            const unsigned int jump = stage << 1;\n            for (group = 0; group < stage; group++) {\n                fft_complex_t twiddle = calc_twiddle(plan->count*group/jump, plan, cache);\n                for (pair = group; pair < plan->count; pair += jump) {\n                    const unsigned int match = pair + stage;\n                    FOURIER_LOG(70, \"stage = %2d group = %2d pair = %2d, match = %d\", stage, group, pair, match);\n                    fft_complex_t t = c_mul(twiddle, ov(plan, s, match));\n                    *ovp(plan, s, match) = c_sub(ov(plan, s, pair), t);\n                    c_addto(ovp(plan, s, pair), t);\n                }\n            }\n        }\n\n        FOURIER_NORMALIZE(plan, s, k);\n    }\n\n    free_bitrev(bitrev_indx, plan->count);\n\n    DECREASE_RECURSION_DEPTH();\n}\n\n\n// Calculate modulus exponent R(b, e, m) = b^e mod m\nFORCE_INLINE unsigned int modpow(unsigned int base, unsigned int exp, unsigned int modulus) {\n    unsigned int result = 1;\n    base %= modulus;\n    while (exp > 0) {\n        if (exp & 1) {\n            result = (result * base) % modulus;\n        }\n        base = (base * base) % modulus;\n        exp >>= 1;\n    }\n    return result;\n}\n\n\n// Calculate generator number \"g\" for Galois Field. R(k) = g^k mod N\n// If k = 1..M, then generator is \"g\" such that any number from R(k) not repeat and belong [1; M]\n// For example if g = 2, N = 5, and\n// k = 1  2  3  4  5  6  7  8\n// R = 1  3  4  2  1  3  4  2\n// then \"g\" is generator for \"N\"\n//\n// Criteria for \"g\" is generator is C(k) = g^((N-1)/p[k]) mod N != 1 for any p[k],\n// where p[k] is primes of the N-1. One generator must exist for any prime \"N\".\nunsigned int calc_primitive_root(unsigned int N) {\n    if (N == 2) {\n        return 1;\n    } else if (N == 3) {\n        return 2;\n    }\n\n    int primes[MAX_PRIMES_COUNT];\n\n    unsigned int g, k = 0;\n\n    // Calculate prime number of N-1\n    int primes_count = prime_factorize(primes, N - 1);\n\n    // Check that N is prime:\n    //   if N-1 is have only one prime_count then N-1 is prime then N can't be prime\n    FOURIER_ASSERT(\n            primes_count != 1, FOURIER_ECHO_DEBUG,\n            \"N-1 = %d is prime number then N = %d can't be prime\\n\", N - 1, N);\n\n    for (g = 2; g < N; g++) {\n        int is_generator = 1;\n\n        for (k = 0; is_generator && k < primes_count; k++) {\n            is_generator = (modpow(g, (N - 1) / primes[k], N) != 1);\n        }\n\n        if (is_generator) {\n            return g;\n        }\n    }\n\n    FOURIER_ASSERT(FOURIER_ASSERT_UNCONDITION, FOURIER_ECHO_CRITICAL, \"Generator not found for N = %d\\n\", N);\n    return 0;\n}\n\n\nvoid fft_mixed_radix(struct fft_plan_t* plan, fft_twiddles_cache_t* cache);\n\n\n#define FFT_MIXED_CACHED(_plan, _cache, _childno) { \\\n    fft_twiddles_cache_t* child_cache = fft_cache_alloc_child(cache, _plan, _childno);\\\n    fft_mixed_radix(_plan, child_cache); \\\n}\n\n\n#define FFT_PRIME_CACHED(_plan, _cache, _childno) { \\\n    fft_twiddles_cache_t* child_cache = fft_cache_alloc_child(cache, _plan, _childno);\\\n    fft_prime(_plan, child_cache); \\\n}\n\n\nvoid fft_prime(struct fft_plan_t *plan, fft_twiddles_cache_t* cache) {\n    INCREASE_RECURSION_DEPTH();\n\n    FOURIER_ALGORITHM_STD_LOG(50, plan, \"Prime number\");\n    FOURIER_ALGORITHM_STD_ASSERTS(FOURIER_ECHO_DEBUG, plan, 2);\n\n    unsigned int s = 0, k = 0;\n\n    unsigned int twiddles_generator = calc_primitive_root(plan->count);\n\n    // Samples generator is differ from twiddles generator and is equals to the next generator\n    // number. It can be calculated as g^(-1) mod N. Because loop of the sequence [1] = [N],\n    // [0] = [N-1] and [-1] = [N-2].\n    unsigned int samples_generator = modpow(twiddles_generator, plan->count - 2, plan->count);\n\n    // Number of samples used in convolution\n    unsigned int conv_samples_count = plan->count - 1;\n\n    // Make a convolution between twiddles from generator and part input samples (without zero sample)\n    struct fft_plan_t twiddle_plan = {\n            .count = conv_samples_count,\n            .howMany = 1,\n            .in = MALLOC(conv_samples_count, fft_complex_t),\n            .idist = 1,\n            .istride = 0,\n            .out = MALLOC(conv_samples_count, fft_complex_t),\n            .odist = 1,\n            .ostride = 0,\n            .direction = FFT_LITHO_FORWARD\n    };\n\n    unsigned int *twiddles_indxes = MALLOC(conv_samples_count, unsigned int);\n    unsigned int *samples_indxes = MALLOC(conv_samples_count, unsigned int);\n\n    FOURIER_LOG(30, \"Calculate twiddles array to perform convolution\");\n\n    for (k = 0; k < conv_samples_count; k++) {\n        twiddles_indxes[k] = modpow(twiddles_generator, k, plan->count);\n        samples_indxes[k] = modpow(samples_generator, k, plan->count);\n        twiddle_plan.in[k] = calc_twiddle(twiddles_indxes[k], plan, cache);\n    }\n\n    // Perform twiddle forward transform (required for convolution)\n    FFT_MIXED_CACHED(&twiddle_plan, cache, 0);\n\n    // Direction will be set within loop, because it changed in it\n    struct fft_plan_t samples_plan = {\n            .count = conv_samples_count,\n            .howMany = 1,\n            .in = MALLOC(conv_samples_count, fft_complex_t),\n            .idist = 1,\n            .istride = 0,\n            .out = MALLOC(conv_samples_count, fft_complex_t),\n            .odist = 1,\n            .ostride = 0,\n    };\n\n    fft_twiddles_cache_t* sample_cache = fft_cache_alloc_child(cache, &samples_plan, 1);\n    for (s = 0; s < plan->howMany; s++) {\n        FOURIER_LOG(30, \"Calculate of samples array #%d/%d FFT to perform convolution\", s, plan->howMany);\n\n        // Using modulus generator permutation fill twiddles and samples arrays for convolution\n        for (k = 0; k < conv_samples_count; k++) {\n            // Calculate result sample index with the offset\n            samples_plan.in[k] = iv(plan, s, samples_indxes[k]);\n        }\n\n        // Perform FORWARD FFT (convolution, st.1)\n        samples_plan.direction = FFT_LITHO_FORWARD;\n        fft_mixed_radix(&samples_plan, sample_cache);\n\n        FOURIER_LOG(30, \"Calculate specturm multiplication of twiddles and samples #%d/%d\", s, plan->howMany);\n\n        // Perform spectrum multiplication (convolution, st.2)\n        for (k = 0; k < conv_samples_count; k++) {\n            c_mulby(&samples_plan.out[k], twiddle_plan.out[k]);\n        }\n\n        FOURIER_LOG(30, \"Calculate backward FFT of multiplied spectrums #%d/%d\", s, plan->howMany);\n\n        // Perform BACKWARD FFT (convolution, st.3)\n        SWAP(fft_complex_t*, samples_plan.in, samples_plan.out);\n        samples_plan.direction = FFT_LITHO_BACKWARD;\n        fft_mixed_radix(&samples_plan, sample_cache);\n\n#if FOURIER_NORMALIZATION_TYPE == FOURIER_DISABLE_NORMALIZATION\n        for (k = 0; k < conv_samples_count; k++) {\n            // Normalize data after convolution if in standard FFT normalization disabled\n            c_divbyv(&samples_plan.out[k], conv_samples_count);\n        }\n#endif\n\n        FOURIER_LOG(30, \"Calculate zero spectrum data of samples array #%d/%d\", s, plan->howMany);\n        // Calculate zero spectrum sample by summing all of input elements\n        // and add zero input sample to calculated spectrum values (required according to algorithm).\n        // Also perform reverse generator permutation\n\n        // out[0] = in[0], assign the zero sample for s-th array\n        *ovp(plan, s, 0) = *ivp(plan, s, 0);\n\n        for (k = 1; k < plan->count; k++) {\n            // Calculate zero spectrum sample\n            c_addto(ovp(plan, s, 0), iv(plan, s, twiddles_indxes[k - 1]));\n\n            // Calculate others spectrum samples by mean of sum with the zero spectrum sample\n            *ovp(plan, s, twiddles_indxes[k - 1]) = c_add(samples_plan.out[k - 1], iv(plan, s, 0));\n        }\n\n        // Normalization for backward transform only.\n        // TODO: may be divide in the above loop is faster?\n        FOURIER_NORMALIZE(plan, s, k);\n    }\n\n    wfree(samples_indxes);\n    wfree(twiddles_indxes);\n\n    wfree(samples_plan.in);\n    wfree(samples_plan.out);\n\n    wfree(twiddle_plan.in);\n    wfree(twiddle_plan.out);\n\n    DECREASE_RECURSION_DEPTH();\n}\n\n\nint check_implemented_fft(int count, fft_handler_t *handler) {\n    int k = 0;\n\n    for (k = FFT_IMPLEMENTED_RADIX_COUNT - 1; k >= 0; k--) {\n        if (count == fft_handlers[k].count) {\n            if (handler != NULL) {\n                *handler = fft_handlers[k].handler;\n            }\n            FOURIER_LOG(50, \"Factor = %d, radix index = %d\", fft_handlers[k].count, k);\n            return k;\n        }\n    }\n\n    // Automatical returns -1 if not found\n    return k;\n}\n\n\n// TODO: NOT USED - DELETE?\nint factorize_number(int result[MAX_PRIMES_COUNT], unsigned int N) {\n    int k = 0, count = 0;\n\n    // If number divide by 2 then lookup maximum nearest and lower than number power of two\n    if (N % 2 == 0) {\n        int radix2 = 1 << log2shift(N);\n\n        while (N % radix2 != 0) {\n            radix2 >>= 1;\n        }\n\n        result[count++] = radix2;\n        N /= result[count];\n    }\n\n    // Look up for radix that have fast optimized implementation\n    for (k = 0; N > 1 && k < FFT_IMPLEMENTED_RADIX_COUNT; k++) {\n        if (N % fft_handlers[k].count == 0) {\n            result[count++] = fft_handlers[k].count;\n            N /= result[count];\n        }\n    }\n\n    // Look up odd multipliers\n    int div = 3;\n\n    while (N > 1) {\n        if (N % div != 0) {\n            div += 2;\n        } else {\n            N /= div;\n            result[count++] = div;\n        }\n    }\n\n    return count;\n}\n\n\nunsigned int fft_get_factor(unsigned int N, int *imp_radix_indx) {\n    FOURIER_LOG(10, \"Factorize number N = %d\", N);\n    FOURIER_ASSERT(N > 1, FOURIER_ECHO_DEBUG, \"N = %d and can't be factorized\\n\", N);\n\n    int k = 0;\n\n    // Look up for radix that have fast optimized implementation\n    for (k = FFT_IMPLEMENTED_RADIX_COUNT-1; k >= 0; k--) {\n        if (N % fft_handlers[k].count == 0) {\n            if (imp_radix_indx != NULL) {\n                *imp_radix_indx = k;\n            }\n\n            FOURIER_LOG(50, \"Factor = %d, radix index = %d\", fft_handlers[k].count, k);\n            return fft_handlers[k].count;\n        }\n    }\n\n    // If number divide by 2 then lookup maximum nearest and lower than number power of two\n    if (N % 2 == 0) {\n        unsigned int radix2 = (1U) << log2shift(N);\n\n        while (N % radix2 != 0) {\n            radix2 >>= 1;\n        }\n\n        if (imp_radix_indx != NULL) {\n            *imp_radix_indx = -1;\n        }\n\n        FOURIER_LOG(10, \"Factor = %d, radix index = %d\", radix2, *imp_radix_indx);\n        return radix2;\n    }\n\n    // Look up odd multipliers\n    unsigned int div = 3;\n\n    while (N % div != 0) {\n        div += 2;\n    }\n\n    if (imp_radix_indx != NULL) {\n        *imp_radix_indx = -1;\n    }\n\n    FOURIER_LOG(10, \"Factor = %d, radix index = %d\", div, *imp_radix_indx);\n    return div;\n}\n\n\nvoid fft_singular(struct fft_plan_t *plan) {\n    INCREASE_RECURSION_DEPTH();\n    FOURIER_ALGORITHM_STD_LOG(50, plan, \"Copy\")\n    // Copy input data to the output\n    unsigned int s = 0;\n    for (s = 0; s < plan->howMany; s++) {\n        *ovp(plan, s, 0) = *ivp(plan, s, 0);\n    }\n    DECREASE_RECURSION_DEPTH();\n}\n\n\nvoid fft_split_radix(struct fft_plan_t* plan, fft_twiddles_cache_t* cache) {\n    INCREASE_RECURSION_DEPTH();\n    FOURIER_ALGORITHM_STD_LOG(50, plan, \"Split radix\");\n    FOURIER_ALGORITHM_STD_ASSERTS(FOURIER_ECHO_DEBUG, plan, 2);\n\n    unsigned int s, k;\n\n    // Here value imp_radix_indx equal index of one of implemented FFT radix if plan->count divide on this radix\n    int imp_radix_indx = -1;\n\n    unsigned int prime_factor = fft_get_factor(plan->count, &imp_radix_indx);\n    unsigned int mixed_factor = plan->count / prime_factor;\n\n    struct fft_plan_t step_plan;\n\n    step_plan.in = MALLOC(plan->count, fft_complex_t);\n    step_plan.out = MALLOC(plan->count, fft_complex_t);\n    step_plan.direction = plan->direction;\n\n    for (s = 0; s < plan->howMany; s++) {\n\n        FOURIER_LOG(30, \"Calculate column-wise FFT for s = %d\", s);\n\n        for (k = 0; k < plan->count; k++) {\n            step_plan.in[k] = iv(plan, s, k);\n        }\n\n        // Perform FFT by columns\n        step_plan.count = prime_factor; // Number of samples in column (equals to rows count)\n        step_plan.howMany = mixed_factor; // Number of columns\n        step_plan.idist = step_plan.odist = step_plan.howMany; // Dist. between samples (equals to cols. count)\n        step_plan.istride = step_plan.ostride = 1; // Dist. between columns\n\n        // For example for 15 sample:\n        //  0  1  2  3  4  5  6  7  8  9  10  11  12  13  14\n        // fft_get_factor returns 3 then prime_factor = 3 and mixed_factor = 5\n        //  0  1  2\n        //  3  4  5\n        //  6  7  8\n        //  9 10 11\n        // 12 13 14\n\n        if (step_plan.count == 1) {\n            fft_singular(&step_plan);\n        } else if (imp_radix_indx != -1) {\n            fft_handlers[imp_radix_indx].handler(&step_plan);\n//        } else if (prime_factor % 4 == 0) {\n//            fft_radix_4(&step_plan, cols_cache);\n        } else if (prime_factor % 2 == 0) {\n            FFT_RADIX2_CACHED(&step_plan, cache, 0);\n        } else {\n            FFT_PRIME_CACHED(&step_plan, cache, 0);\n        }\n\n        FOURIER_LOG(30, \"Calculate columns twiddles multiplications for s = %d\", s);\n\n        // Addition twiddles multiplications\n        unsigned int r = 0, c = 0;\n        // Iterate through columns\n        for (c = 1; c < step_plan.howMany; c++) {\n            // Iterate through rows\n            for (r = 1; r < step_plan.count; r++) {\n                fft_complex_t twiddle = calc_twiddle(r * c, plan, cache);\n                c_mulby(ovp(&step_plan, c, r), twiddle);\n            }\n        }\n\n        FOURIER_LOG(30, \"Calculate row-wise FFT for s = %d\", s);\n\n        //  0  1  2  3  4\n        //  5  6  7  8  9\n        // 10 11 12 13 14\n        // Perform FFT by rows\n        SWAP(fft_complex_t*, step_plan.in, step_plan.out);\n        step_plan.count = mixed_factor; // Number of samples in row (columns count)\n        step_plan.howMany = prime_factor; // Number of rows\n        step_plan.idist = 1; // Dist. between samples (no shift, samples near)\n        step_plan.odist = step_plan.howMany;\n        step_plan.istride = step_plan.count; // Dist. between rows = columns count\n        step_plan.ostride = 1;\n\n        fft_twiddles_cache_t* rows_cache = fft_cache_alloc_child(cache, &step_plan, 1);\n\n        fft_mixed_radix(&step_plan, rows_cache);\n\n        for (k = 0; k < plan->count; k++) {\n            *ovp(plan, s, k) = step_plan.out[k];\n        }\n    }\n\n    FOURIER_LOG(5, \"Free temporary step plan output buffer\");\n\n    // free memory of the temporary buffers\n    wfree(step_plan.in);\n    wfree(step_plan.out);\n\n    DECREASE_RECURSION_DEPTH();\n}\n\n\n/*\n * count - Number of samples\n * in - Input two-dimensional array. This routine calculate one frequency sample\n *      for different input signal. For first frequency in[n] will be used, for\n *      the second frequency in[count + n], etc. So result spectrum calculated\n *      using in[k*count+n], where k - frequency number, n - input signal sample.\n *      Note: for this routine number of different signal must be equal to the\n *            result frequency number.\n * out - Result signal spectrum\n * direction - FFT_LITHO_FORWARD - forward transform and FFT_LITHO_BACKWARD - backward transform.\n */\nvoid fft_mixed_radix(struct fft_plan_t* plan, fft_twiddles_cache_t* cache) {\n    // N = 30 -> 2 * 3 * 5\n    // 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29\n\n    //     0  1  2  3  4\n    // 0  00 01 02 03 04\n    // 1  05 06 07 08 09\n    // 2  10 11 12 13 14\n    // 3  15 16 17 18 19\n    // 4  20 21 22 23 24\n    // 5  25 26 27 28 29\n\n    FOURIER_ALGORITHM_STD_ASSERTS(FOURIER_ECHO_DEBUG, plan, 1);\n\n    fft_handler_t implemented_fft;\n\n    // In this case we check if plan->count is equal one of implemented FFT radix\n    if (plan->count == 1) {\n        fft_singular(plan);\n    } else if (check_implemented_fft(plan->count, &implemented_fft) != -1) {\n        implemented_fft(plan);\n//    } else if (is_power4(plan->count)) {\n//        fft_radix_4(plan, cache);\n    } else if (is_power2(plan->count)) {\n        fft_radix_2(plan, cache);\n    } else if (is_prime(plan->count)) {\n        fft_prime(plan, cache);\n    } else {\n        fft_split_radix(plan, cache);\n    }\n}\n\n\nstruct fft_plan_t* fft_plan_create_many_1d(\n        unsigned int count, unsigned int howMany,\n        fft_complex_t* in, fft_complex_t* out, int direction,\n        unsigned int flags) {\n    fft_initialize_radix_2();\n\n    FOURIER_LOG(50, \"Create %d one dimension FFT plans for %d samples in=%p out=%p dir=%d\",\n                howMany, count, in, out, direction);\n\n    FOURIER_ASSERT(in != NULL, FOURIER_ECHO_CRITICAL, \"Input buffer can't be NULL\\n\");\n    FOURIER_ASSERT(out != NULL, FOURIER_ECHO_CRITICAL, \"Output buffer can't be NULL\\n\");\n\n    struct fft_plan_t *plan = MALLOC(1, struct fft_plan_t);\n\n    plan->rank = 1;\n    plan->total = count;\n\n    plan->dims = MALLOC(1, unsigned int);\n    plan->dims[0] = count;\n\n    plan->in = in;\n    plan->out = out;\n\n    if (plan->in == plan->out) {\n        FOURIER_LOG(50, \"Initialize pseudo in place FFT one dimension plan\");\n        plan->tmpbuf = MALLOC(count * howMany, fft_complex_t);\n        plan->out = plan->tmpbuf;\n    } else {\n        FOURIER_LOG(50, \"Initialize out of place FFT one dimension plan\");\n        plan->tmpbuf = NULL;\n    }\n\n    plan->count = count;\n    plan->howMany = howMany;\n    plan->idist = plan->odist = 1;\n    plan->istride = plan->ostride = plan->count;\n\n    plan->direction = direction;\n\n    plan->flags = flags;\n\n    fft_cache_init(plan);\n\n    return plan;\n}\n\n\nstruct fft_plan_t* fft_plan_create_1d(unsigned int count,\n        fft_complex_t* in, fft_complex_t* out, int direction,\n        unsigned int flags) {\n    FOURIER_LOG(50, \"Create one dimension FFT plan for %d samples in=%p out=%p dir=%d\", count, in, out, direction);\n    return fft_plan_create_many_1d(count, 1, in, out, direction, flags);\n}\n\n\nstruct fft_plan_t* fft_plan_create_nd(unsigned int rank, unsigned int* dims,\n        fft_complex_t *in, fft_complex_t *out, int direction, unsigned int flags) {\n    fft_initialize_radix_2();\n\n    FOURIER_LOG(50, \"Create %d-dimensions FFT plan: in=%p out=%p dir=%d\", rank, in, out, direction);\n\n    FOURIER_ASSERT(in != NULL, FOURIER_ECHO_CRITICAL, \"Input buffer can't be NULL\\n\");\n    FOURIER_ASSERT(out != NULL, FOURIER_ECHO_CRITICAL, \"Output buffer can't be NULL\\n\");\n\n    unsigned int k = 0;\n\n    struct fft_plan_t *plan = MALLOC(1, struct fft_plan_t);\n\n    plan->rank = rank;\n    plan->dims = MALLOC(plan->rank, unsigned int);\n    for (k = 0, plan->total = 1; k < plan->rank; k++) {\n        plan->total *= dims[k];\n        plan->dims[k] = dims[k];\n    }\n\n    if (in != out) {\n        FOURIER_LOG(50, \"Initialize out of place FFT multidimension plan\");\n        plan->tmpbuf = MALLOC(plan->total, fft_complex_t);\n        MEMCPY(plan->tmpbuf, in, plan->total, fft_complex_t);\n        plan->in = plan->tmpbuf;\n        plan->out = out;\n    } else {\n        FOURIER_LOG(50, \"Initialize in place FFT multidimension plan\");\n        plan->tmpbuf = MALLOC(plan->total, fft_complex_t);\n        plan->in = in;\n        plan->out = plan->tmpbuf;\n    }\n\n    plan->direction = direction;\n\n    plan->flags = flags;\n\n    fft_cache_init(plan);\n\n    return plan;\n}\n\n\nstruct fft_plan_t* fft_plan_create_2d(\n        unsigned int n_rows, unsigned int n_cols,\n        fft_complex_t *in, fft_complex_t *out, int direction,\n        unsigned int flags) {\n    FOURIER_LOG(50, \"Create two dimensions FFT plan %dx%d: in=%p out=%p dir=%d\", n_rows, n_cols, in, out, direction);\n    unsigned int dims[2] = {n_rows, n_cols};\n    return fft_plan_create_nd(2, dims, in, out, direction, flags);\n}\n\n\nvoid fft_plan_destroy(struct fft_plan_t* plan) {\n    fft_cache_destroy(plan);\n    FREE(plan->tmpbuf);\n    FREE(plan->dims);\n    FREE(plan);\n}\n\n\nvoid fft_execute_1d(struct fft_plan_t* plan) {\n    fft_mixed_radix(plan, plan->cache[0]);\n\n    if (plan->tmpbuf) {\n        MEMCPY(plan->in, plan->tmpbuf, plan->count * plan->howMany, fft_complex_t);\n    }\n}\n\n\nvoid fft_execute_2d(struct fft_plan_t* plan) {\n    unsigned int k = 0;\n\n    // Column-wise FFT\n\n    plan->count = plan->dims[0];\n    plan->howMany = plan->total / plan->dims[0];\n\n    plan->istride = plan->ostride = plan->dims[0];\n    plan->idist = plan->odist = 1;\n\n    FOURIER_LOG(60, \"Column-wise FFT: rank = %d count = %d howMany = %d stride = %d dist = %d\",\n                plan->rank, plan->count, plan->howMany, plan->istride, plan->idist);\n\n    fft_mixed_radix(plan, plan->cache[0]);\n\n    SWAP(fft_complex_t*, plan->in, plan->out);\n\n    // Row-wise FFT\n\n    fft_complex_t* backup_in = plan->in;\n    fft_complex_t* backup_out = plan->out;\n\n    plan->howMany = plan->dims[0];\n    plan->count = plan->dims[1];\n    plan->idist = plan->odist = plan->dims[0];\n    plan->istride = plan->ostride = 1;\n    unsigned int total2d = plan->count * plan->howMany;\n    unsigned int howMany2d = plan->total / total2d;\n\n    FOURIER_LOG(60, \"total2d = %d howMany2d = %d\", total2d, howMany2d);\n\n    for (k = 0; k < howMany2d; k++) {\n        FOURIER_LOG(60, \"Row-wise FFT #%2d: rank = %d count = %d howMany = %d stride = %d dist = %d\",\n                    k, plan->rank, plan->count, plan->howMany, plan->istride, plan->idist);\n\n        fft_mixed_radix(plan, plan->cache[1]);\n\n        plan->in += total2d;\n        plan->out += total2d;\n    }\n\n    plan->in = backup_in;\n    plan->out = backup_out;\n\n    // Copy if data from temporary buffer to the input buffer if out of place transformation perform\n    if (plan->in != plan->tmpbuf) {\n        MEMCPY(plan->in, plan->tmpbuf, plan->count, fft_complex_t);\n    }\n}\n\n\n// TODO: not tested\nvoid fft_execute_nd(struct fft_plan_t* plan) {\n    unsigned int k = 0;\n\n    fft_execute_2d(plan);\n\n    for (k = 2; k < plan->rank; k++) {\n        unsigned int dist = plan->total / plan->dims[k];\n\n        plan->count = plan->dims[k];\n        plan->howMany = dist;\n\n        plan->istride = plan->ostride = 1;\n        plan->idist = plan->odist = dist;\n\n        FOURIER_LOG(60, \"fft_execute_1d #%02d: rank = %d count = %d howMany = %d stride = %d odist = %d\",\n                    k, plan->rank, plan->count, plan->howMany, plan->istride, plan->idist);\n\n        fft_mixed_radix(plan, plan->cache[k]);\n\n        SWAP(fft_complex_t*, plan->in, plan->out);\n    }\n\n    // Copy if data from temporary buffer to the input buffer if out of place transformation perform\n    if (plan->in != plan->tmpbuf) {\n        MEMCPY(plan->in, plan->tmpbuf, plan->count, fft_complex_t);\n    }\n}\n\n\nvoid fft_execute(struct fft_plan_t* plan) {\n    INIT_CALCULATED_TWIDDLES(plan);\n\n    if (plan->rank == 1) {\n        fft_execute_1d(plan);\n    } else if (plan->rank == 2) {\n        fft_execute_2d(plan);\n    } else {\n        fft_execute_nd(plan);\n    }\n\n    PRINT_CALCULATED_TWIDDLES(plan);\n}\n\n\n"
  },
  {
    "path": "OptolithiumC/libs/fourier/src/primes.c",
    "content": "/*\n * Fourier Transform library for Optolithium lithography modelling software\n *\n * Copyright (C) 2015 Alexei Gladkikh\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are permitted provided that\n * the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the\n *    documentation  and/or other materials provided with the distribution.\n * 3. Neither the names of the copyright holders nor the names of any\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, ORCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n */\n\n#include \"primes.h\"\n\n\nvoid fft_litho_c2(struct fft_plan_t *plan) {\n    FFT_IMPLEMENTATION_BEGIN(plan, 2);\n\n        *ovp(plan, s, 0) = c_add(X(0), X(1));\n        *ovp(plan, s, 1) = c_sub(X(0), X(1));\n\n    FFT_IMPLEMENTATION_END(plan);\n}\n\n\nconst static fft_complex_t TWIDDLE_ARRAY_R3[2][3] = {\n        {\n                { .r =  1.0000000000000000, .i =  0.0000000000000000},\n                { .r = -0.4999999999999998, .i = -0.8660254037844388},\n                { .r = -0.5000000000000004, .i =  0.8660254037844384},\n        }, {\n                { .r =  1.0000000000000000, .i =  0.0000000000000000},\n                { .r = -0.4999999999999998, .i =  0.8660254037844388},\n                { .r = -0.5000000000000004, .i = -0.8660254037844384},\n        }\n};\n\n\nFORCE_INLINE fft_complex_t c_add3(const fft_complex_t a, const fft_complex_t b, const fft_complex_t c) {\n    fft_complex_t result = {\n            .r = a.r + b.r + c.r,\n            .i = a.i + b.i + c.i\n    };\n    return result;\n}\n\n\n#define CALC_S3(k1, k2) c_add3(X(0), c_mul(w[k1], X(1)), c_mul(w[k2], X(2)))\n\n\nvoid fft_litho_c3(struct fft_plan_t *plan) {\n    FFT_IMPLEMENTATION_BEGIN(plan, 3);\n\n        const fft_complex_t *w = TWIDDLE_ARRAY_R3[plan->direction == FFT_LITHO_BACKWARD];\n        *ovp(plan, s, 0) = c_add3(X(0), X(1), X(2));\n        *ovp(plan, s, 1) = CALC_S3(1, 2);\n        *ovp(plan, s, 2) = CALC_S3(2, 1);\n\n    FFT_IMPLEMENTATION_END(plan);\n}\n\n\nFORCE_INLINE fft_complex_t c_add4(const fft_complex_t a, const fft_complex_t b, const fft_complex_t c, const fft_complex_t d) {\n    fft_complex_t result = {\n            .r = a.r + b.r + c.r + d.r,\n            .i = a.i + b.i + c.i + d.i\n    };\n    return result;\n}\n\n\nvoid fft_litho_c4(struct fft_plan_t *plan) {\n    FFT_IMPLEMENTATION_BEGIN(plan, 4);\n\n        const int d = plan->direction;\n\n        *ovp(plan, s, 0) = c_add4(X(0),        X(1),            X(2),         X(3));\n        *ovp(plan, s, 1) = c_add4(X(0), c_mulj(X(1), -d), c_neg(X(2)), c_mulj(X(3),  d));\n        *ovp(plan, s, 2) = c_add4(X(0),  c_neg(X(1)),           X(2),   c_neg(X(3)));\n        *ovp(plan, s, 3) = c_add4(X(0), c_mulj(X(1),  d), c_neg(X(2)), c_mulj(X(3), -d));\n\n    FFT_IMPLEMENTATION_END(plan);\n}\n\n\nconst static fft_complex_t TWIDDLE_ARRAY_R5[2][5] = {\n        {\n                { .r =  1.0000000000000000, .i =  0.0000000000000000},\n                { .r =  0.3090169943749475, .i = -0.9510565162951535},\n                { .r = -0.8090169943749473, .i = -0.5877852522924732},\n                { .r = -0.8090169943749475, .i =  0.5877852522924730},\n                { .r =  0.3090169943749472, .i =  0.9510565162951536},\n        }, {\n                { .r =  1.0000000000000000, .i =  0.0000000000000000},\n                { .r =  0.3090169943749475, .i =  0.9510565162951535},\n                { .r = -0.8090169943749473, .i =  0.5877852522924732},\n                { .r = -0.8090169943749475, .i = -0.5877852522924730},\n                { .r =  0.3090169943749472, .i = -0.9510565162951536},\n        }\n};\n\n\nFORCE_INLINE fft_complex_t c_add5(\n        const fft_complex_t x0, const fft_complex_t x1, const fft_complex_t x2,\n        const fft_complex_t x3, const fft_complex_t x4) {\n    fft_complex_t result = {\n            .r = x0.r + x1.r + x2.r + x3.r + x4.r,\n            .i = x0.i + x1.i + x2.i + x3.i + x4.i\n    };\n    return result;\n}\n\n\n#define CALC_S5(k1, k2, k3, k4) \\\n    c_add5(X(0), \\\n        c_mul(w[k1], X(1)), c_mul(w[k2], X(2)), c_mul(w[k3], X(3)), c_mul(w[k4], X(4)))\n\n\nvoid fft_litho_c5(struct fft_plan_t *plan) {\n    FFT_IMPLEMENTATION_BEGIN(plan, 5);\n\n        const fft_complex_t *w = TWIDDLE_ARRAY_R5[plan->direction == FFT_LITHO_BACKWARD];\n\n        *ovp(plan, s, 0) = c_add5(X(0), X(1), X(2), X(3), X(4));\n        *ovp(plan, s, 1) = CALC_S5(1, 2, 3, 4);\n        *ovp(plan, s, 2) = CALC_S5(2, 4, 1, 3);\n        *ovp(plan, s, 3) = CALC_S5(3, 1, 4, 2);\n        *ovp(plan, s, 4) = CALC_S5(4, 3, 2, 1);\n\n    FFT_IMPLEMENTATION_END(plan);\n}\n\n\nconst static fft_complex_t TWIDDLE_ARRAY_R6[2][6] = {\n        {\n                { .r =  1.0000000000000000, .i =  0.0000000000000000},\n                { .r =  0.5000000000000001, .i = -0.8660254037844386},\n                { .r = -0.4999999999999998, .i = -0.8660254037844388},\n                { .r = -1.0000000000000000, .i = -0.0000000000000001},\n                { .r = -0.5000000000000004, .i =  0.8660254037844384},\n                { .r =  0.4999999999999993, .i =  0.8660254037844390},\n        }, {\n                { .r =  1.0000000000000000, .i =  0.0000000000000000},\n                { .r =  0.5000000000000001, .i =  0.8660254037844386},\n                { .r = -0.4999999999999998, .i =  0.8660254037844388},\n                { .r = -1.0000000000000000, .i =  0.0000000000000001},\n                { .r = -0.5000000000000004, .i = -0.8660254037844384},\n                { .r =  0.4999999999999993, .i = -0.8660254037844390},\n\n        }\n};\n\n\nvoid fft_litho_c6(struct fft_plan_t *plan) {\n    FFT_IMPLEMENTATION_BEGIN(plan, 6);\n\n        const fft_complex_t *w3 = TWIDDLE_ARRAY_R3[plan->direction == FFT_LITHO_BACKWARD];\n        const fft_complex_t *w6 = TWIDDLE_ARRAY_R6[plan->direction == FFT_LITHO_BACKWARD];\n\n        const fft_complex_t e[3] = {\n                c_add3(X(0), X(2), X(4)),\n                c_add3(X(0), c_mul(w3[1], X(2)), c_mul(w3[2], X(4))),\n                c_add3(X(0), c_mul(w3[2], X(2)), c_mul(w3[1], X(4))),\n        };\n\n        const fft_complex_t o[3] = {\n                c_add3(X(1), X(3), X(5)),\n                c_mul(w6[1], c_add3(X(1), c_mul(w3[1], X(3)), c_mul(w3[2], X(5)))),\n                c_mul(w6[2], c_add3(X(1), c_mul(w3[2], X(3)), c_mul(w3[1], X(5)))),\n        };\n\n        *ovp(plan, s, 0) = c_add(e[0], o[0]);\n        *ovp(plan, s, 1) = c_add(e[1], o[1]);\n        *ovp(plan, s, 2) = c_add(e[2], o[2]);\n        *ovp(plan, s, 3) = c_sub(e[0], o[0]);\n        *ovp(plan, s, 4) = c_sub(e[1], o[1]);\n        *ovp(plan, s, 5) = c_sub(e[2], o[2]);\n\n    FFT_IMPLEMENTATION_END(plan);\n}\n\n\nconst static fft_complex_t TWIDDLE_ARRAY_R7[2][7] __attribute__ ((aligned (16))) = {\n        {\n                { .r =  1.0000000000000000, .i =  0.0000000000000000},\n                { .r =  0.6234898018587336, .i = -0.7818314824680297},\n                { .r = -0.2225209339563143, .i = -0.9749279121818236},\n                { .r = -0.9009688679024190, .i = -0.4338837391175582},\n                { .r = -0.9009688679024191, .i =  0.4338837391175580},\n                { .r = -0.2225209339563146, .i =  0.9749279121818235},\n                { .r =  0.6234898018587334, .i =  0.7818314824680299},\n        }, {\n                { .r =  1.0000000000000000, .i =  0.0000000000000000},\n                { .r =  0.6234898018587336, .i =  0.7818314824680297},\n                { .r = -0.2225209339563143, .i =  0.9749279121818236},\n                { .r = -0.9009688679024190, .i =  0.4338837391175582},\n                { .r = -0.9009688679024191, .i = -0.4338837391175580},\n                { .r = -0.2225209339563146, .i = -0.9749279121818235},\n                { .r =  0.6234898018587334, .i = -0.7818314824680299},\n        }\n};\n\n\nFORCE_INLINE fft_complex_t c_add7(\n        const fft_complex_t x0, const fft_complex_t x1, const fft_complex_t x2, const fft_complex_t x3,\n        const fft_complex_t x4, const fft_complex_t x5, const fft_complex_t x6) {\n    fft_complex_t result = {\n            .r = x0.r + x1.r + x2.r + x3.r + x4.r + x5.r + x6.r,\n            .i = x0.i + x1.i + x2.i + x3.i + x4.i + x5.i + x6.i\n    };\n    return result;\n}\n\n\n#define CALC_S7(k1, k2, k3, k4, k5, k6) \\\n    c_add7(X(0), \\\n        c_mul(w[k1], X(1)), c_mul(w[k2], X(2)), c_mul(w[k3], X(3)), \\\n        c_mul(w[k4], X(4)), c_mul(w[k5], X(5)), c_mul(w[k6], X(6)))\n\n\nvoid fft_litho_c7(struct fft_plan_t *plan) {\n    FFT_IMPLEMENTATION_BEGIN(plan, 7);\n\n        const fft_complex_t *w = TWIDDLE_ARRAY_R7[plan->direction == FFT_LITHO_BACKWARD];\n        *ovp(plan, s, 0) = c_add7(X(0), X(1), X(2), X(3), X(4), X(5), X(6));\n        *ovp(plan, s, 1) = CALC_S7(1, 2, 3, 4, 5, 6);\n        *ovp(plan, s, 2) = CALC_S7(2, 4, 6, 1, 3, 5);\n        *ovp(plan, s, 3) = CALC_S7(3, 6, 2, 5, 1, 4);\n        *ovp(plan, s, 4) = CALC_S7(4, 1, 5, 2, 6, 3);\n        *ovp(plan, s, 5) = CALC_S7(5, 3, 1, 6, 4, 2);\n        *ovp(plan, s, 6) = CALC_S7(6, 5, 4, 3, 2, 1);\n\n    FFT_IMPLEMENTATION_END(plan);\n}\n\n\nconst static fft_complex_t TWIDDLE_ARRAY_R11[2][11] = {\n        {\n                {.r =  1.0000000000000000, .i =  0.0000000000000000 },\n                {.r =  0.8412535328311812, .i = -0.5406408174555976 },\n                {.r =  0.4154150130018864, .i = -0.9096319953545183 },\n                {.r = -0.1423148382732852, .i = -0.9898214418809327 },\n                {.r = -0.6548607339452850, .i = -0.7557495743542584 },\n                {.r = -0.9594929736144974, .i = -0.2817325568414296 },\n                {.r = -0.9594929736144974, .i =  0.2817325568414298 },\n                {.r = -0.6548607339452852, .i =  0.7557495743542582 },\n                {.r = -0.1423148382732853, .i =  0.9898214418809327 },\n                {.r =  0.4154150130018860, .i =  0.9096319953545186 },\n                {.r =  0.8412535328311812, .i =  0.5406408174555974 },\n        }, {\n                {.r =  1.0000000000000000, .i =  0.0000000000000000 },\n                {.r =  0.8412535328311812, .i =  0.5406408174555976 },\n                {.r =  0.4154150130018864, .i =  0.9096319953545183 },\n                {.r = -0.1423148382732852, .i =  0.9898214418809327 },\n                {.r = -0.6548607339452850, .i =  0.7557495743542584 },\n                {.r = -0.9594929736144974, .i =  0.2817325568414296 },\n                {.r = -0.9594929736144974, .i = -0.2817325568414298 },\n                {.r = -0.6548607339452852, .i = -0.7557495743542582 },\n                {.r = -0.1423148382732853, .i = -0.9898214418809327 },\n                {.r =  0.4154150130018860, .i = -0.9096319953545186 },\n                {.r =  0.8412535328311812, .i = -0.5406408174555974 },\n        }\n};\n\n\nFORCE_INLINE fft_complex_t c_add11(\n        const fft_complex_t x0, const fft_complex_t x1, const fft_complex_t x2, const fft_complex_t x3,\n        const fft_complex_t x4, const fft_complex_t x5, const fft_complex_t x6, const fft_complex_t x7,\n        const fft_complex_t x8, const fft_complex_t x9, const fft_complex_t x10) {\n    fft_complex_t result = {\n            .r = x0.r + x1.r + x2.r + x3.r + x4.r + x5.r + x6.r + x7.r + x8.r + x9.r + x10.r,\n            .i = x0.i + x1.i + x2.i + x3.i + x4.i + x5.i + x6.i + x7.i + x8.i + x9.i + x10.i\n    };\n    return result;\n}\n\n\n#define CALC_S11(k1, k2, k3, k4, k5, k6, k7, k8, k9, k10) \\\n    c_add11(X(0), \\\n        c_mul(w[k1], X(1)), c_mul(w[k2], X(2)), c_mul(w[k3], X(3)), c_mul(w[k4], X(4)),  c_mul(w[k5],  X(5)), \\\n        c_mul(w[k6], X(6)), c_mul(w[k7], X(7)), c_mul(w[k8], X(8)), c_mul(w[k9], X(9)), c_mul(w[k10], X(10)));\n\n\nvoid fft_litho_c11(struct fft_plan_t *plan) {\n    FFT_IMPLEMENTATION_BEGIN(plan, 11);\n\n        const fft_complex_t *w = TWIDDLE_ARRAY_R11[plan->direction == FFT_LITHO_BACKWARD];\n\n        *ovp(plan, s,  0) = c_add11(X(0), X(1), X(2), X(3), X(4), X(5), X(6), X(7), X(8), X(9), X(10));\n        *ovp(plan, s,  1) = CALC_S11( 1,  2,  3,  4,  5,  6,  7,  8,  9, 10);\n        *ovp(plan, s,  2) = CALC_S11( 2,  4,  6,  8, 10,  1,  3,  5,  7,  9);\n        *ovp(plan, s,  3) = CALC_S11( 3,  6,  9,  1,  4,  7, 10,  2,  5,  8);\n        *ovp(plan, s,  4) = CALC_S11( 4,  8,  1,  5,  9,  2,  6, 10,  3,  7);\n        *ovp(plan, s,  5) = CALC_S11( 5, 10,  4,  9,  3,  8,  2,  7,  1,  6);\n        *ovp(plan, s,  6) = CALC_S11( 6,  1,  7,  2,  8,  3,  9,  4, 10,  5);\n        *ovp(plan, s,  7) = CALC_S11( 7,  3, 10,  6,  2,  9,  5,  1,  8,  4);\n        *ovp(plan, s,  8) = CALC_S11( 8,  5,  2, 10,  7,  4,  1,  9,  6,  3);\n        *ovp(plan, s,  9) = CALC_S11( 9,  7,  5,  3,  1, 10,  8,  6,  4,  2);\n        *ovp(plan, s, 10) = CALC_S11(10,  9,  8,  7,  6,  5,  4,  3,  2,  1);\n\n    FFT_IMPLEMENTATION_END(plan);\n}\n\n\nconst static fft_complex_t TWIDDLE_ARRAY_R13[2][13] = {\n        {\n                { .r =  1.0000000000000000, .i =  0.0000000000000000},\n                { .r =  0.8854560256532099, .i = -0.4647231720437686},\n                { .r =  0.5680647467311558, .i = -0.8229838658936564},\n                { .r =  0.1205366802553230, .i = -0.9927088740980540},\n                { .r = -0.3546048870425357, .i = -0.9350162426854148},\n                { .r = -0.7485107481711012, .i = -0.6631226582407952},\n                { .r = -0.9709418174260520, .i = -0.2393156642875577},\n                { .r = -0.9709418174260520, .i =  0.2393156642875579},\n                { .r = -0.7485107481711011, .i =  0.6631226582407953},\n                { .r = -0.3546048870425359, .i =  0.9350162426854147},\n                { .r =  0.1205366802553232, .i =  0.9927088740980540},\n                { .r =  0.5680647467311556, .i =  0.8229838658936566},\n                { .r =  0.8854560256532100, .i =  0.4647231720437683},\n        }, {\n                { .r =  1.0000000000000000, .i =  0.0000000000000000},\n                { .r =  0.8854560256532099, .i =  0.4647231720437686},\n                { .r =  0.5680647467311558, .i =  0.8229838658936564},\n                { .r =  0.1205366802553230, .i =  0.9927088740980540},\n                { .r = -0.3546048870425357, .i =  0.9350162426854148},\n                { .r = -0.7485107481711012, .i =  0.6631226582407952},\n                { .r = -0.9709418174260520, .i =  0.2393156642875577},\n                { .r = -0.9709418174260520, .i = -0.2393156642875579},\n                { .r = -0.7485107481711011, .i = -0.6631226582407953},\n                { .r = -0.3546048870425359, .i = -0.9350162426854147},\n                { .r =  0.1205366802553232, .i = -0.9927088740980540},\n                { .r =  0.5680647467311556, .i = -0.8229838658936566},\n                { .r =  0.8854560256532100, .i = -0.4647231720437683},\n        }\n};\n\n\nFORCE_INLINE fft_complex_t c_add13(\n        const fft_complex_t x0, const fft_complex_t x1, const fft_complex_t x2, const fft_complex_t x3,\n        const fft_complex_t x4, const fft_complex_t x5, const fft_complex_t x6, const fft_complex_t x7,\n        const fft_complex_t x8, const fft_complex_t x9, const fft_complex_t x10, const fft_complex_t x11,\n        const fft_complex_t x12) {\n    fft_complex_t result = {\n            .r = x0.r + x1.r + x2.r + x3.r + x4.r + x5.r + x6.r + x7.r + x8.r + x9.r + x10.r + x11.r + x12.r,\n            .i = x0.i + x1.i + x2.i + x3.i + x4.i + x5.i + x6.i + x7.i + x8.i + x9.i + x10.i + x11.i + x12.i\n    };\n    return result;\n}\n\n\n#define CALC_S13(k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, k12) \\\n    c_add13(X(0), \\\n        c_mul(w[k1], X(1)), c_mul(w[k2], X(2)), c_mul(w[k3], X(3)), c_mul(w[k4], X(4)),  c_mul(w[k5],  X(5)), \\\n        c_mul(w[k6], X(6)), c_mul(w[k7], X(7)), c_mul(w[k8], X(8)), c_mul(w[k9], X(9)), c_mul(w[k10], X(10)), \\\n        c_mul(w[k11], X(11)), c_mul(w[k12], X(12)))\n\n\nvoid fft_litho_c13(struct fft_plan_t *plan) {\n    FFT_IMPLEMENTATION_BEGIN(plan, 13);\n\n        const fft_complex_t *w = TWIDDLE_ARRAY_R13[plan->direction == FFT_LITHO_BACKWARD];\n\n        *ovp(plan, s,  0) = c_add13(X(0), X(1), X(2), X(3), X(4), X(5), X(6), X(7), X(8), X(9), X(10), X(11), X(12));\n        *ovp(plan, s,  1) = CALC_S13( 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12);\n        *ovp(plan, s,  2) = CALC_S13( 2,  4,  6,  8, 10, 12,  1,  3,  5,  7,  9, 11);\n        *ovp(plan, s,  3) = CALC_S13( 3,  6,  9, 12,  2,  5,  8, 11,  1,  4,  7, 10);\n        *ovp(plan, s,  4) = CALC_S13( 4,  8, 12,  3,  7, 11,  2,  6, 10,  1,  5,  9);\n        *ovp(plan, s,  5) = CALC_S13( 5, 10,  2,  7, 12,  4,  9,  1,  6, 11,  3,  8);\n        *ovp(plan, s,  6) = CALC_S13( 6, 12,  5, 11,  4, 10,  3,  9,  2,  8,  1,  7);\n        *ovp(plan, s,  7) = CALC_S13( 7,  1,  8,  2,  9,  3, 10,  4, 11,  5, 12,  6);\n        *ovp(plan, s,  8) = CALC_S13( 8,  3, 11,  6,  1,  9,  4, 12,  7,  2, 10,  5);\n        *ovp(plan, s,  9) = CALC_S13( 9,  5,  1, 10,  6,  2, 11,  7,  3, 12,  8,  4);\n        *ovp(plan, s, 10) = CALC_S13(10,  7,  4,  1, 11,  8,  5,  2, 12,  9,  6,  3);\n        *ovp(plan, s, 11) = CALC_S13(11,  9,  7,  5,  3,  1, 12, 10,  8,  6,  4,  2);\n        *ovp(plan, s, 12) = CALC_S13(12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1);\n\n    FFT_IMPLEMENTATION_END(plan);\n}\n\n\nconst static fft_complex_t TWIDDLE_ARRAY_R17[2][17] = {\n        {\n                { .r =  1.0000000000000000, .i =  0.0000000000000000},\n                { .r =  0.9324722294043558, .i = -0.3612416661871529},\n                { .r =  0.7390089172206591, .i = -0.6736956436465572},\n                { .r =  0.4457383557765383, .i = -0.8951632913550623},\n                { .r =  0.0922683594633020, .i = -0.9957341762950345},\n                { .r = -0.2736629900720827, .i = -0.9618256431728192},\n                { .r = -0.6026346363792563, .i = -0.7980172272802396},\n                { .r = -0.8502171357296140, .i = -0.5264321628773561},\n                { .r = -0.9829730996839018, .i = -0.1837495178165704},\n                { .r = -0.9829730996839018, .i =  0.1837495178165701},\n                { .r = -0.8502171357296143, .i =  0.5264321628773555},\n                { .r = -0.6026346363792572, .i =  0.7980172272802388},\n                { .r = -0.2736629900720831, .i =  0.9618256431728190},\n                { .r =  0.0922683594633024, .i =  0.9957341762950345},\n                { .r =  0.4457383557765378, .i =  0.8951632913550626},\n                { .r =  0.7390089172206586, .i =  0.6736956436465578},\n                { .r =  0.9324722294043558, .i =  0.3612416661871530},\n        }, {\n                { .r =  1.0000000000000000, .i =  0.0000000000000000},\n                { .r =  0.9324722294043558, .i =  0.3612416661871529},\n                { .r =  0.7390089172206591, .i =  0.6736956436465572},\n                { .r =  0.4457383557765383, .i =  0.8951632913550623},\n                { .r =  0.0922683594633020, .i =  0.9957341762950345},\n                { .r = -0.2736629900720827, .i =  0.9618256431728192},\n                { .r = -0.6026346363792563, .i =  0.7980172272802396},\n                { .r = -0.8502171357296140, .i =  0.5264321628773561},\n                { .r = -0.9829730996839018, .i =  0.1837495178165704},\n                { .r = -0.9829730996839018, .i = -0.1837495178165701},\n                { .r = -0.8502171357296143, .i = -0.5264321628773555},\n                { .r = -0.6026346363792572, .i = -0.7980172272802388},\n                { .r = -0.2736629900720831, .i = -0.9618256431728190},\n                { .r =  0.0922683594633024, .i = -0.9957341762950345},\n                { .r =  0.4457383557765378, .i = -0.8951632913550626},\n                { .r =  0.7390089172206586, .i = -0.6736956436465578},\n                { .r =  0.9324722294043558, .i = -0.3612416661871530},\n        }\n};\n\n\nFORCE_INLINE fft_complex_t c_add17(\n        const fft_complex_t x0, const fft_complex_t x1, const fft_complex_t x2, const fft_complex_t x3,\n        const fft_complex_t x4, const fft_complex_t x5, const fft_complex_t x6, const fft_complex_t x7,\n        const fft_complex_t x8, const fft_complex_t x9, const fft_complex_t x10, const fft_complex_t x11,\n        const fft_complex_t x12, const fft_complex_t x13, const fft_complex_t x14, const fft_complex_t x15,\n        const fft_complex_t x16) {\n    fft_complex_t result = {\n            .r = x0.r + x1.r + x2.r + x3.r + x4.r + x5.r + x6.r + x7.r + x8.r +\n                    x9.r + x10.r + x11.r + x12.r + x13.r + x14.r + x15.r + x16.r,\n            .i = x0.i + x1.i + x2.i + x3.i + x4.i + x5.i + x6.i + x7.i + x8.i +\n                    x9.i + x10.i + x11.i + x12.i + x13.i + x14.i + x15.i + x16.i\n    };\n    return result;\n}\n\n\n#define CALC_S17(k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, k12, k13, k14, k15, k16) \\\n    c_add17(X(0), \\\n        c_mul(w[k1], X(1)), c_mul(w[k2], X(2)), c_mul(w[k3], X(3)), c_mul(w[k4], X(4)),  c_mul(w[k5],  X(5)), \\\n        c_mul(w[k6], X(6)), c_mul(w[k7], X(7)), c_mul(w[k8], X(8)), c_mul(w[k9], X(9)), c_mul(w[k10], X(10)), \\\n        c_mul(w[k11], X(11)), c_mul(w[k12], X(12)), c_mul(w[k13], X(13)), c_mul(w[k14], X(14)), \\\n        c_mul(w[k15], X(15)), c_mul(w[k16], X(16)))\n\n\nvoid fft_litho_c17(struct fft_plan_t *plan) {\n    FFT_IMPLEMENTATION_BEGIN(plan, 17);\n\n        const fft_complex_t *w = TWIDDLE_ARRAY_R17[plan->direction == FFT_LITHO_BACKWARD];\n\n        *ovp(plan, s,  0) = c_add17(\n                X(0), X(1), X(2), X(3), X(4), X(5), X(6), X(7), X(8),\n                X(9), X(10), X(11), X(12), X(13), X(14), X(15), X(16));\n        *ovp(plan, s,  1) = CALC_S17( 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16);\n        *ovp(plan, s,  2) = CALC_S17( 2,  4,  6,  8, 10, 12, 14, 16,  1,  3,  5,  7,  9, 11, 13, 15);\n        *ovp(plan, s,  3) = CALC_S17( 3,  6,  9, 12, 15,  1,  4,  7, 10, 13, 16,  2,  5,  8, 11, 14);\n        *ovp(plan, s,  4) = CALC_S17( 4,  8, 12, 16,  3,  7, 11, 15,  2,  6, 10, 14,  1,  5,  9, 13);\n        *ovp(plan, s,  5) = CALC_S17( 5, 10, 15,  3,  8, 13,  1,  6, 11, 16,  4,  9, 14,  2,  7, 12);\n        *ovp(plan, s,  6) = CALC_S17( 6, 12,  1,  7, 13,  2,  8, 14,  3,  9, 15,  4, 10, 16,  5, 11);\n        *ovp(plan, s,  7) = CALC_S17( 7, 14,  4, 11,  1,  8, 15,  5, 12,  2,  9, 16,  6, 13,  3, 10);\n        *ovp(plan, s,  8) = CALC_S17( 8, 16,  7, 15,  6, 14,  5, 13,  4, 12,  3, 11,  2, 10,  1,  9);\n        *ovp(plan, s,  9) = CALC_S17( 9,  1, 10,  2, 11,  3, 12,  4, 13,  5, 14,  6, 15,  7, 16,  8);\n        *ovp(plan, s, 10) = CALC_S17(10,  3, 13,  6, 16,  9,  2, 12,  5, 15,  8,  1, 11,  4, 14,  7);\n        *ovp(plan, s, 11) = CALC_S17(11,  5, 16, 10,  4, 15,  9,  3, 14,  8,  2, 13,  7,  1, 12,  6);\n        *ovp(plan, s, 12) = CALC_S17(12,  7,  2, 14,  9,  4, 16, 11,  6,  1, 13,  8,  3, 15, 10,  5);\n        *ovp(plan, s, 13) = CALC_S17(13,  9,  5,  1, 14, 10,  6,  2, 15, 11,  7,  3, 16, 12,  8,  4);\n        *ovp(plan, s, 14) = CALC_S17(14, 11,  8,  5,  2, 16, 13, 10,  7,  4,  1, 15, 12,  9,  6,  3);\n        *ovp(plan, s, 15) = CALC_S17(15, 13, 11,  9,  7,  5,  3,  1, 16, 14, 12, 10,  8,  6,  4,  2);\n        *ovp(plan, s, 16) = CALC_S17(16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1);\n\n    FFT_IMPLEMENTATION_END(plan);\n}\n\nconst static fft_complex_t TWIDDLE_ARRAY_R19[2][19] = {\n        {\n                { .r =  1.0000000000000000, .i =  0.0000000000000000},\n                { .r =  0.9458172417006346, .i = -0.3246994692046835},\n                { .r =  0.7891405093963937, .i = -0.6142127126896678},\n                { .r =  0.5469481581224270, .i = -0.8371664782625285},\n                { .r =  0.2454854871407992, .i = -0.9694002659393304},\n                { .r = -0.0825793454723323, .i = -0.9965844930066698},\n                { .r = -0.4016954246529693, .i = -0.9157733266550575},\n                { .r = -0.6772815716257409, .i = -0.7357239106731317},\n                { .r = -0.8794737512064890, .i = -0.4759473930370737},\n                { .r = -0.9863613034027223, .i = -0.1645945902807340},\n                { .r = -0.9863613034027224, .i =  0.1645945902807338},\n                { .r = -0.8794737512064893, .i =  0.4759473930370731},\n                { .r = -0.6772815716257414, .i =  0.7357239106731313},\n                { .r = -0.4016954246529699, .i =  0.9157733266550573},\n                { .r = -0.0825793454723327, .i =  0.9965844930066698},\n                { .r =  0.2454854871407979, .i =  0.9694002659393307},\n                { .r =  0.5469481581224266, .i =  0.8371664782625288},\n                { .r =  0.7891405093963935, .i =  0.6142127126896680},\n                { .r =  0.9458172417006346, .i =  0.3246994692046837},\n        }, {\n                { .r =  1.0000000000000000, .i =  0.0000000000000000},\n                { .r =  0.9458172417006346, .i =  0.3246994692046835},\n                { .r =  0.7891405093963937, .i =  0.6142127126896678},\n                { .r =  0.5469481581224270, .i =  0.8371664782625285},\n                { .r =  0.2454854871407992, .i =  0.9694002659393304},\n                { .r = -0.0825793454723323, .i =  0.9965844930066698},\n                { .r = -0.4016954246529693, .i =  0.9157733266550575},\n                { .r = -0.6772815716257409, .i =  0.7357239106731317},\n                { .r = -0.8794737512064890, .i =  0.4759473930370737},\n                { .r = -0.9863613034027223, .i =  0.1645945902807340},\n                { .r = -0.9863613034027224, .i = -0.1645945902807338},\n                { .r = -0.8794737512064893, .i = -0.4759473930370731},\n                { .r = -0.6772815716257414, .i = -0.7357239106731313},\n                { .r = -0.4016954246529699, .i = -0.9157733266550573},\n                { .r = -0.0825793454723327, .i = -0.9965844930066698},\n                { .r =  0.2454854871407979, .i = -0.9694002659393307},\n                { .r =  0.5469481581224266, .i = -0.8371664782625288},\n                { .r =  0.7891405093963935, .i = -0.6142127126896680},\n                { .r =  0.9458172417006346, .i = -0.3246994692046837},\n        }\n};\n\nFORCE_INLINE fft_complex_t c_add19(const fft_complex_t x0, const fft_complex_t x1, const fft_complex_t x2, const fft_complex_t x3, const fft_complex_t x4, const fft_complex_t x5, const fft_complex_t x6, const fft_complex_t x7, const fft_complex_t x8, const fft_complex_t x9, const fft_complex_t x10, const fft_complex_t x11, const fft_complex_t x12, const fft_complex_t x13, const fft_complex_t x14, const fft_complex_t x15, const fft_complex_t x16, const fft_complex_t x17, const fft_complex_t x18) {\n    fft_complex_t result = {\n            .r = x0.r + x1.r + x2.r + x3.r + x4.r + x5.r + x6.r + x7.r + x8.r + x9.r + x10.r + x11.r + x12.r + x13.r + x14.r + x15.r + x16.r + x17.r + x18.r,\n            .i = x0.i + x1.i + x2.i + x3.i + x4.i + x5.i + x6.i + x7.i + x8.i + x9.i + x10.i + x11.i + x12.i + x13.i + x14.i + x15.i + x16.i + x17.i + x18.i\n    };\n    return result;\n}\n\n#define CALC_S19(k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, k12, k13, k14, k15, k16, k17, k18) \\\n    c_add19(X(0), c_mul(w[k1], X(1)), c_mul(w[k2], X(2)), c_mul(w[k3], X(3)), c_mul(w[k4], X(4)), c_mul(w[k5], X(5)), c_mul(w[k6], X(6)), c_mul(w[k7], X(7)), c_mul(w[k8], X(8)), c_mul(w[k9], X(9)), c_mul(w[k10], X(10)), c_mul(w[k11], X(11)), c_mul(w[k12], X(12)), c_mul(w[k13], X(13)), c_mul(w[k14], X(14)), c_mul(w[k15], X(15)), c_mul(w[k16], X(16)), c_mul(w[k17], X(17)), c_mul(w[k18], X(18)))\n\nvoid fft_litho_c19(struct fft_plan_t *plan) {\n    FFT_IMPLEMENTATION_BEGIN(plan, 19) ;\n\n        const fft_complex_t *w = TWIDDLE_ARRAY_R19[plan->direction == FFT_LITHO_BACKWARD];\n\n        *ovp(plan, s, 0) = c_add19(X(0), X(1), X(2), X(3), X(4), X(5), X(6), X(7), X(8), X(9), X(10), X(11), X(12), X(13), X(14), X(15), X(16), X(17), X(18));\n        *ovp(plan, s, 0) = CALC_S19(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n        *ovp(plan, s, 1) = CALC_S19(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18);\n        *ovp(plan, s, 2) = CALC_S19(2, 4, 6, 8, 10, 12, 14, 16, 18, 1, 3, 5, 7, 9, 11, 13, 15, 17);\n        *ovp(plan, s, 3) = CALC_S19(3, 6, 9, 12, 15, 18, 2, 5, 8, 11, 14, 17, 1, 4, 7, 10, 13, 16);\n        *ovp(plan, s, 4) = CALC_S19(4, 8, 12, 16, 1, 5, 9, 13, 17, 2, 6, 10, 14, 18, 3, 7, 11, 15);\n        *ovp(plan, s, 5) = CALC_S19(5, 10, 15, 1, 6, 11, 16, 2, 7, 12, 17, 3, 8, 13, 18, 4, 9, 14);\n        *ovp(plan, s, 6) = CALC_S19(6, 12, 18, 5, 11, 17, 4, 10, 16, 3, 9, 15, 2, 8, 14, 1, 7, 13);\n        *ovp(plan, s, 7) = CALC_S19(7, 14, 2, 9, 16, 4, 11, 18, 6, 13, 1, 8, 15, 3, 10, 17, 5, 12);\n        *ovp(plan, s, 8) = CALC_S19(8, 16, 5, 13, 2, 10, 18, 7, 15, 4, 12, 1, 9, 17, 6, 14, 3, 11);\n        *ovp(plan, s, 9) = CALC_S19(9, 18, 8, 17, 7, 16, 6, 15, 5, 14, 4, 13, 3, 12, 2, 11, 1, 10);\n        *ovp(plan, s, 10) = CALC_S19(10, 1, 11, 2, 12, 3, 13, 4, 14, 5, 15, 6, 16, 7, 17, 8, 18, 9);\n        *ovp(plan, s, 11) = CALC_S19(11, 3, 14, 6, 17, 9, 1, 12, 4, 15, 7, 18, 10, 2, 13, 5, 16, 8);\n        *ovp(plan, s, 12) = CALC_S19(12, 5, 17, 10, 3, 15, 8, 1, 13, 6, 18, 11, 4, 16, 9, 2, 14, 7);\n        *ovp(plan, s, 13) = CALC_S19(13, 7, 1, 14, 8, 2, 15, 9, 3, 16, 10, 4, 17, 11, 5, 18, 12, 6);\n        *ovp(plan, s, 14) = CALC_S19(14, 9, 4, 18, 13, 8, 3, 17, 12, 7, 2, 16, 11, 6, 1, 15, 10, 5);\n        *ovp(plan, s, 15) = CALC_S19(15, 11, 7, 3, 18, 14, 10, 6, 2, 17, 13, 9, 5, 1, 16, 12, 8, 4);\n        *ovp(plan, s, 16) = CALC_S19(16, 13, 10, 7, 4, 1, 17, 14, 11, 8, 5, 2, 18, 15, 12, 9, 6, 3);\n        *ovp(plan, s, 17) = CALC_S19(17, 15, 13, 11, 9, 7, 5, 3, 1, 18, 16, 14, 12, 10, 8, 6, 4, 2);\n        *ovp(plan, s, 18) = CALC_S19(18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1);\n\n    FFT_IMPLEMENTATION_END(plan);\n}\n\n\nconst static fft_complex_t TWIDDLE_ARRAY_R47[2][47] = {\n        {\n                { .r =  1.0000000000000000, .i =  0.0000000000000000},\n                { .r =  0.9910774881547801, .i = -0.1332869553737788},\n                { .r =  0.9644691750543766, .i = -0.2641954018712860},\n                { .r =  0.9206498866764288, .i = -0.3903892751634948},\n                { .r =  0.8604015792601394, .i = -0.5096166425919174},\n                { .r =  0.7847993852786610, .i = -0.6197498889602449},\n                { .r =  0.6951924276746423, .i = -0.7188236838779293},\n                { .r =  0.5931797447293553, .i = -0.8050700531275629},\n                { .r =  0.4805817551866838, .i = -0.8769499282066715},\n                { .r =  0.3594077728375128, .i = -0.9331806110416025},\n                { .r =  0.2318201502675284, .i = -0.9727586637650372},\n                { .r =  0.1000956916240987, .i = -0.9949778150885040},\n                { .r = -0.0334149770076745, .i = -0.9994415637302546},\n                { .r = -0.1663293545831300, .i = -0.9860702539900286},\n                { .r = -0.2962755808856338, .i = -0.9551024972069124},\n                { .r = -0.4209347624283349, .i = -0.9070909137343408},\n                { .r = -0.5380823531633726, .i = -0.8428922714167971},\n                { .r = -0.6456278515588023, .i = -0.7636521965473321},\n                { .r = -0.7416521056479576, .i = -0.6707847301392235},\n                { .r = -0.8244415603417601, .i = -0.5659470943305954},\n                { .r = -0.8925188358598811, .i = -0.4510101192161021},\n                { .r = -0.9446690916079189, .i = -0.3280248578395689},\n                { .r = -0.9799617050365866, .i = -0.1991859851038367},\n                { .r = -0.9977668786231532, .i = -0.0667926337451217},\n                { .r = -0.9977668786231532, .i =  0.0667926337451215},\n                { .r = -0.9799617050365869, .i =  0.1991859851038361},\n                { .r = -0.9446690916079188, .i =  0.3280248578395691},\n                { .r = -0.8925188358598815, .i =  0.4510101192161015},\n                { .r = -0.8244415603417605, .i =  0.5659470943305949},\n                { .r = -0.7416521056479577, .i =  0.6707847301392232},\n                { .r = -0.6456278515588026, .i =  0.7636521965473319},\n                { .r = -0.5380823531633728, .i =  0.8428922714167969},\n                { .r = -0.4209347624283351, .i =  0.9070909137343407},\n                { .r = -0.2962755808856340, .i =  0.9551024972069124},\n                { .r = -0.1663293545831301, .i =  0.9860702539900286},\n                { .r = -0.0334149770076754, .i =  0.9994415637302546},\n                { .r =  0.1000956916240984, .i =  0.9949778150885040},\n                { .r =  0.2318201502675284, .i =  0.9727586637650372},\n                { .r =  0.3594077728375122, .i =  0.9331806110416028},\n                { .r =  0.4805817551866832, .i =  0.8769499282066718},\n                { .r =  0.5931797447293546, .i =  0.8050700531275633},\n                { .r =  0.6951924276746418, .i =  0.7188236838779297},\n                { .r =  0.7847993852786612, .i =  0.6197498889602445},\n                { .r =  0.8604015792601392, .i =  0.5096166425919177},\n                { .r =  0.9206498866764283, .i =  0.3903892751634960},\n                { .r =  0.9644691750543765, .i =  0.2641954018712863},\n                { .r =  0.9910774881547800, .i =  0.1332869553737791},\n        }, {\n                { .r =  1.0000000000000000, .i =  0.0000000000000000},\n                { .r =  0.9910774881547801, .i =  0.1332869553737788},\n                { .r =  0.9644691750543766, .i =  0.2641954018712860},\n                { .r =  0.9206498866764288, .i =  0.3903892751634948},\n                { .r =  0.8604015792601394, .i =  0.5096166425919174},\n                { .r =  0.7847993852786610, .i =  0.6197498889602449},\n                { .r =  0.6951924276746423, .i =  0.7188236838779293},\n                { .r =  0.5931797447293553, .i =  0.8050700531275629},\n                { .r =  0.4805817551866838, .i =  0.8769499282066715},\n                { .r =  0.3594077728375128, .i =  0.9331806110416025},\n                { .r =  0.2318201502675284, .i =  0.9727586637650372},\n                { .r =  0.1000956916240987, .i =  0.9949778150885040},\n                { .r = -0.0334149770076745, .i =  0.9994415637302546},\n                { .r = -0.1663293545831300, .i =  0.9860702539900286},\n                { .r = -0.2962755808856338, .i =  0.9551024972069124},\n                { .r = -0.4209347624283349, .i =  0.9070909137343408},\n                { .r = -0.5380823531633726, .i =  0.8428922714167971},\n                { .r = -0.6456278515588023, .i =  0.7636521965473321},\n                { .r = -0.7416521056479576, .i =  0.6707847301392235},\n                { .r = -0.8244415603417601, .i =  0.5659470943305954},\n                { .r = -0.8925188358598811, .i =  0.4510101192161021},\n                { .r = -0.9446690916079189, .i =  0.3280248578395689},\n                { .r = -0.9799617050365866, .i =  0.1991859851038367},\n                { .r = -0.9977668786231532, .i =  0.0667926337451217},\n                { .r = -0.9977668786231532, .i = -0.0667926337451215},\n                { .r = -0.9799617050365869, .i = -0.1991859851038361},\n                { .r = -0.9446690916079188, .i = -0.3280248578395691},\n                { .r = -0.8925188358598815, .i = -0.4510101192161015},\n                { .r = -0.8244415603417605, .i = -0.5659470943305949},\n                { .r = -0.7416521056479577, .i = -0.6707847301392232},\n                { .r = -0.6456278515588026, .i = -0.7636521965473319},\n                { .r = -0.5380823531633728, .i = -0.8428922714167969},\n                { .r = -0.4209347624283351, .i = -0.9070909137343407},\n                { .r = -0.2962755808856340, .i = -0.9551024972069124},\n                { .r = -0.1663293545831301, .i = -0.9860702539900286},\n                { .r = -0.0334149770076754, .i = -0.9994415637302546},\n                { .r =  0.1000956916240984, .i = -0.9949778150885040},\n                { .r =  0.2318201502675284, .i = -0.9727586637650372},\n                { .r =  0.3594077728375122, .i = -0.9331806110416028},\n                { .r =  0.4805817551866832, .i = -0.8769499282066718},\n                { .r =  0.5931797447293546, .i = -0.8050700531275633},\n                { .r =  0.6951924276746418, .i = -0.7188236838779297},\n                { .r =  0.7847993852786612, .i = -0.6197498889602445},\n                { .r =  0.8604015792601392, .i = -0.5096166425919177},\n                { .r =  0.9206498866764283, .i = -0.3903892751634960},\n                { .r =  0.9644691750543765, .i = -0.2641954018712863},\n                { .r =  0.9910774881547800, .i = -0.1332869553737791},\n        }\n};\n\nFORCE_INLINE fft_complex_t c_add47(const fft_complex_t x0, const fft_complex_t x1, const fft_complex_t x2, const fft_complex_t x3, const fft_complex_t x4, const fft_complex_t x5, const fft_complex_t x6, const fft_complex_t x7, const fft_complex_t x8, const fft_complex_t x9, const fft_complex_t x10, const fft_complex_t x11, const fft_complex_t x12, const fft_complex_t x13, const fft_complex_t x14, const fft_complex_t x15, const fft_complex_t x16, const fft_complex_t x17, const fft_complex_t x18, const fft_complex_t x19, const fft_complex_t x20, const fft_complex_t x21, const fft_complex_t x22, const fft_complex_t x23, const fft_complex_t x24, const fft_complex_t x25, const fft_complex_t x26, const fft_complex_t x27, const fft_complex_t x28, const fft_complex_t x29, const fft_complex_t x30, const fft_complex_t x31, const fft_complex_t x32, const fft_complex_t x33, const fft_complex_t x34, const fft_complex_t x35, const fft_complex_t x36, const fft_complex_t x37, const fft_complex_t x38, const fft_complex_t x39, const fft_complex_t x40, const fft_complex_t x41, const fft_complex_t x42, const fft_complex_t x43, const fft_complex_t x44, const fft_complex_t x45, const fft_complex_t x46) {\n    fft_complex_t result = {\n            .r = x0.r + x1.r + x2.r + x3.r + x4.r + x5.r + x6.r + x7.r + x8.r + x9.r + x10.r + x11.r + x12.r + x13.r + x14.r + x15.r + x16.r + x17.r + x18.r + x19.r + x20.r + x21.r + x22.r + x23.r + x24.r + x25.r + x26.r + x27.r + x28.r + x29.r + x30.r + x31.r + x32.r + x33.r + x34.r + x35.r + x36.r + x37.r + x38.r + x39.r + x40.r + x41.r + x42.r + x43.r + x44.r + x45.r + x46.r,\n            .i = x0.i + x1.i + x2.i + x3.i + x4.i + x5.i + x6.i + x7.i + x8.i + x9.i + x10.i + x11.i + x12.i + x13.i + x14.i + x15.i + x16.i + x17.i + x18.i + x19.i + x20.i + x21.i + x22.i + x23.i + x24.i + x25.i + x26.i + x27.i + x28.i + x29.i + x30.i + x31.i + x32.i + x33.i + x34.i + x35.i + x36.i + x37.i + x38.i + x39.i + x40.i + x41.i + x42.i + x43.i + x44.i + x45.i + x46.i\n    };\n    return result;\n}\n\n#define CALC_S47(k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46) \\\n    c_add47(X(0), c_mul(w[k1], X(1)), c_mul(w[k2], X(2)), c_mul(w[k3], X(3)), c_mul(w[k4], X(4)), c_mul(w[k5], X(5)), c_mul(w[k6], X(6)), c_mul(w[k7], X(7)), c_mul(w[k8], X(8)), c_mul(w[k9], X(9)), c_mul(w[k10], X(10)), c_mul(w[k11], X(11)), c_mul(w[k12], X(12)), c_mul(w[k13], X(13)), c_mul(w[k14], X(14)), c_mul(w[k15], X(15)), c_mul(w[k16], X(16)), c_mul(w[k17], X(17)), c_mul(w[k18], X(18)), c_mul(w[k19], X(19)), c_mul(w[k20], X(20)), c_mul(w[k21], X(21)), c_mul(w[k22], X(22)), c_mul(w[k23], X(23)), c_mul(w[k24], X(24)), c_mul(w[k25], X(25)), c_mul(w[k26], X(26)), c_mul(w[k27], X(27)), c_mul(w[k28], X(28)), c_mul(w[k29], X(29)), c_mul(w[k30], X(30)), c_mul(w[k31], X(31)), c_mul(w[k32], X(32)), c_mul(w[k33], X(33)), c_mul(w[k34], X(34)), c_mul(w[k35], X(35)), c_mul(w[k36], X(36)), c_mul(w[k37], X(37)), c_mul(w[k38], X(38)), c_mul(w[k39], X(39)), c_mul(w[k40], X(40)), c_mul(w[k41], X(41)), c_mul(w[k42], X(42)), c_mul(w[k43], X(43)), c_mul(w[k44], X(44)), c_mul(w[k45], X(45)), c_mul(w[k46], X(46)))\n\nvoid fft_litho_c47(struct fft_plan_t *plan) {\n    FFT_IMPLEMENTATION_BEGIN(plan, 47);\n\n        const fft_complex_t *w = TWIDDLE_ARRAY_R47[plan->direction == FFT_LITHO_BACKWARD];\n\n        *ovp(plan, s,  0) = c_add47(X(0), X(1), X(2), X(3), X(4), X(5), X(6), X(7), X(8), X(9), X(10), X(11), X(12), X(13), X(14), X(15), X(16), X(17), X(18), X(19), X(20), X(21), X(22), X(23), X(24), X(25), X(26), X(27), X(28), X(29), X(30), X(31), X(32), X(33), X(34), X(35), X(36), X(37), X(38), X(39), X(40), X(41), X(42), X(43), X(44), X(45), X(46));\n        *ovp(plan, s,  0) = CALC_S47( 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0);\n        *ovp(plan, s,  1) = CALC_S47( 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46);\n        *ovp(plan, s,  2) = CALC_S47( 2,  4,  6,  8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46,  1,  3,  5,  7,  9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45);\n        *ovp(plan, s,  3) = CALC_S47( 3,  6,  9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45,  1,  4,  7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46,  2,  5,  8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44);\n        *ovp(plan, s,  4) = CALC_S47( 4,  8, 12, 16, 20, 24, 28, 32, 36, 40, 44,  1,  5,  9, 13, 17, 21, 25, 29, 33, 37, 41, 45,  2,  6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46,  3,  7, 11, 15, 19, 23, 27, 31, 35, 39, 43);\n        *ovp(plan, s,  5) = CALC_S47( 5, 10, 15, 20, 25, 30, 35, 40, 45,  3,  8, 13, 18, 23, 28, 33, 38, 43,  1,  6, 11, 16, 21, 26, 31, 36, 41, 46,  4,  9, 14, 19, 24, 29, 34, 39, 44,  2,  7, 12, 17, 22, 27, 32, 37, 42);\n        *ovp(plan, s,  6) = CALC_S47( 6, 12, 18, 24, 30, 36, 42,  1,  7, 13, 19, 25, 31, 37, 43,  2,  8, 14, 20, 26, 32, 38, 44,  3,  9, 15, 21, 27, 33, 39, 45,  4, 10, 16, 22, 28, 34, 40, 46,  5, 11, 17, 23, 29, 35, 41);\n        *ovp(plan, s,  7) = CALC_S47( 7, 14, 21, 28, 35, 42,  2,  9, 16, 23, 30, 37, 44,  4, 11, 18, 25, 32, 39, 46,  6, 13, 20, 27, 34, 41,  1,  8, 15, 22, 29, 36, 43,  3, 10, 17, 24, 31, 38, 45,  5, 12, 19, 26, 33, 40);\n        *ovp(plan, s,  8) = CALC_S47( 8, 16, 24, 32, 40,  1,  9, 17, 25, 33, 41,  2, 10, 18, 26, 34, 42,  3, 11, 19, 27, 35, 43,  4, 12, 20, 28, 36, 44,  5, 13, 21, 29, 37, 45,  6, 14, 22, 30, 38, 46,  7, 15, 23, 31, 39);\n        *ovp(plan, s,  9) = CALC_S47( 9, 18, 27, 36, 45,  7, 16, 25, 34, 43,  5, 14, 23, 32, 41,  3, 12, 21, 30, 39,  1, 10, 19, 28, 37, 46,  8, 17, 26, 35, 44,  6, 15, 24, 33, 42,  4, 13, 22, 31, 40,  2, 11, 20, 29, 38);\n        *ovp(plan, s, 10) = CALC_S47(10, 20, 30, 40,  3, 13, 23, 33, 43,  6, 16, 26, 36, 46,  9, 19, 29, 39,  2, 12, 22, 32, 42,  5, 15, 25, 35, 45,  8, 18, 28, 38,  1, 11, 21, 31, 41,  4, 14, 24, 34, 44,  7, 17, 27, 37);\n        *ovp(plan, s, 11) = CALC_S47(11, 22, 33, 44,  8, 19, 30, 41,  5, 16, 27, 38,  2, 13, 24, 35, 46, 10, 21, 32, 43,  7, 18, 29, 40,  4, 15, 26, 37,  1, 12, 23, 34, 45,  9, 20, 31, 42,  6, 17, 28, 39,  3, 14, 25, 36);\n        *ovp(plan, s, 12) = CALC_S47(12, 24, 36,  1, 13, 25, 37,  2, 14, 26, 38,  3, 15, 27, 39,  4, 16, 28, 40,  5, 17, 29, 41,  6, 18, 30, 42,  7, 19, 31, 43,  8, 20, 32, 44,  9, 21, 33, 45, 10, 22, 34, 46, 11, 23, 35);\n        *ovp(plan, s, 13) = CALC_S47(13, 26, 39,  5, 18, 31, 44, 10, 23, 36,  2, 15, 28, 41,  7, 20, 33, 46, 12, 25, 38,  4, 17, 30, 43,  9, 22, 35,  1, 14, 27, 40,  6, 19, 32, 45, 11, 24, 37,  3, 16, 29, 42,  8, 21, 34);\n        *ovp(plan, s, 14) = CALC_S47(14, 28, 42,  9, 23, 37,  4, 18, 32, 46, 13, 27, 41,  8, 22, 36,  3, 17, 31, 45, 12, 26, 40,  7, 21, 35,  2, 16, 30, 44, 11, 25, 39,  6, 20, 34,  1, 15, 29, 43, 10, 24, 38,  5, 19, 33);\n        *ovp(plan, s, 15) = CALC_S47(15, 30, 45, 13, 28, 43, 11, 26, 41,  9, 24, 39,  7, 22, 37,  5, 20, 35,  3, 18, 33,  1, 16, 31, 46, 14, 29, 44, 12, 27, 42, 10, 25, 40,  8, 23, 38,  6, 21, 36,  4, 19, 34,  2, 17, 32);\n        *ovp(plan, s, 16) = CALC_S47(16, 32,  1, 17, 33,  2, 18, 34,  3, 19, 35,  4, 20, 36,  5, 21, 37,  6, 22, 38,  7, 23, 39,  8, 24, 40,  9, 25, 41, 10, 26, 42, 11, 27, 43, 12, 28, 44, 13, 29, 45, 14, 30, 46, 15, 31);\n        *ovp(plan, s, 17) = CALC_S47(17, 34,  4, 21, 38,  8, 25, 42, 12, 29, 46, 16, 33,  3, 20, 37,  7, 24, 41, 11, 28, 45, 15, 32,  2, 19, 36,  6, 23, 40, 10, 27, 44, 14, 31,  1, 18, 35,  5, 22, 39,  9, 26, 43, 13, 30);\n        *ovp(plan, s, 18) = CALC_S47(18, 36,  7, 25, 43, 14, 32,  3, 21, 39, 10, 28, 46, 17, 35,  6, 24, 42, 13, 31,  2, 20, 38,  9, 27, 45, 16, 34,  5, 23, 41, 12, 30,  1, 19, 37,  8, 26, 44, 15, 33,  4, 22, 40, 11, 29);\n        *ovp(plan, s, 19) = CALC_S47(19, 38, 10, 29,  1, 20, 39, 11, 30,  2, 21, 40, 12, 31,  3, 22, 41, 13, 32,  4, 23, 42, 14, 33,  5, 24, 43, 15, 34,  6, 25, 44, 16, 35,  7, 26, 45, 17, 36,  8, 27, 46, 18, 37,  9, 28);\n        *ovp(plan, s, 20) = CALC_S47(20, 40, 13, 33,  6, 26, 46, 19, 39, 12, 32,  5, 25, 45, 18, 38, 11, 31,  4, 24, 44, 17, 37, 10, 30,  3, 23, 43, 16, 36,  9, 29,  2, 22, 42, 15, 35,  8, 28,  1, 21, 41, 14, 34,  7, 27);\n        *ovp(plan, s, 21) = CALC_S47(21, 42, 16, 37, 11, 32,  6, 27,  1, 22, 43, 17, 38, 12, 33,  7, 28,  2, 23, 44, 18, 39, 13, 34,  8, 29,  3, 24, 45, 19, 40, 14, 35,  9, 30,  4, 25, 46, 20, 41, 15, 36, 10, 31,  5, 26);\n        *ovp(plan, s, 22) = CALC_S47(22, 44, 19, 41, 16, 38, 13, 35, 10, 32,  7, 29,  4, 26,  1, 23, 45, 20, 42, 17, 39, 14, 36, 11, 33,  8, 30,  5, 27,  2, 24, 46, 21, 43, 18, 40, 15, 37, 12, 34,  9, 31,  6, 28,  3, 25);\n        *ovp(plan, s, 23) = CALC_S47(23, 46, 22, 45, 21, 44, 20, 43, 19, 42, 18, 41, 17, 40, 16, 39, 15, 38, 14, 37, 13, 36, 12, 35, 11, 34, 10, 33,  9, 32,  8, 31,  7, 30,  6, 29,  5, 28,  4, 27,  3, 26,  2, 25,  1, 24);\n        *ovp(plan, s, 24) = CALC_S47(24,  1, 25,  2, 26,  3, 27,  4, 28,  5, 29,  6, 30,  7, 31,  8, 32,  9, 33, 10, 34, 11, 35, 12, 36, 13, 37, 14, 38, 15, 39, 16, 40, 17, 41, 18, 42, 19, 43, 20, 44, 21, 45, 22, 46, 23);\n        *ovp(plan, s, 25) = CALC_S47(25,  3, 28,  6, 31,  9, 34, 12, 37, 15, 40, 18, 43, 21, 46, 24,  2, 27,  5, 30,  8, 33, 11, 36, 14, 39, 17, 42, 20, 45, 23,  1, 26,  4, 29,  7, 32, 10, 35, 13, 38, 16, 41, 19, 44, 22);\n        *ovp(plan, s, 26) = CALC_S47(26,  5, 31, 10, 36, 15, 41, 20, 46, 25,  4, 30,  9, 35, 14, 40, 19, 45, 24,  3, 29,  8, 34, 13, 39, 18, 44, 23,  2, 28,  7, 33, 12, 38, 17, 43, 22,  1, 27,  6, 32, 11, 37, 16, 42, 21);\n        *ovp(plan, s, 27) = CALC_S47(27,  7, 34, 14, 41, 21,  1, 28,  8, 35, 15, 42, 22,  2, 29,  9, 36, 16, 43, 23,  3, 30, 10, 37, 17, 44, 24,  4, 31, 11, 38, 18, 45, 25,  5, 32, 12, 39, 19, 46, 26,  6, 33, 13, 40, 20);\n        *ovp(plan, s, 28) = CALC_S47(28,  9, 37, 18, 46, 27,  8, 36, 17, 45, 26,  7, 35, 16, 44, 25,  6, 34, 15, 43, 24,  5, 33, 14, 42, 23,  4, 32, 13, 41, 22,  3, 31, 12, 40, 21,  2, 30, 11, 39, 20,  1, 29, 10, 38, 19);\n        *ovp(plan, s, 29) = CALC_S47(29, 11, 40, 22,  4, 33, 15, 44, 26,  8, 37, 19,  1, 30, 12, 41, 23,  5, 34, 16, 45, 27,  9, 38, 20,  2, 31, 13, 42, 24,  6, 35, 17, 46, 28, 10, 39, 21,  3, 32, 14, 43, 25,  7, 36, 18);\n        *ovp(plan, s, 30) = CALC_S47(30, 13, 43, 26,  9, 39, 22,  5, 35, 18,  1, 31, 14, 44, 27, 10, 40, 23,  6, 36, 19,  2, 32, 15, 45, 28, 11, 41, 24,  7, 37, 20,  3, 33, 16, 46, 29, 12, 42, 25,  8, 38, 21,  4, 34, 17);\n        *ovp(plan, s, 31) = CALC_S47(31, 15, 46, 30, 14, 45, 29, 13, 44, 28, 12, 43, 27, 11, 42, 26, 10, 41, 25,  9, 40, 24,  8, 39, 23,  7, 38, 22,  6, 37, 21,  5, 36, 20,  4, 35, 19,  3, 34, 18,  2, 33, 17,  1, 32, 16);\n        *ovp(plan, s, 32) = CALC_S47(32, 17,  2, 34, 19,  4, 36, 21,  6, 38, 23,  8, 40, 25, 10, 42, 27, 12, 44, 29, 14, 46, 31, 16,  1, 33, 18,  3, 35, 20,  5, 37, 22,  7, 39, 24,  9, 41, 26, 11, 43, 28, 13, 45, 30, 15);\n        *ovp(plan, s, 33) = CALC_S47(33, 19,  5, 38, 24, 10, 43, 29, 15,  1, 34, 20,  6, 39, 25, 11, 44, 30, 16,  2, 35, 21,  7, 40, 26, 12, 45, 31, 17,  3, 36, 22,  8, 41, 27, 13, 46, 32, 18,  4, 37, 23,  9, 42, 28, 14);\n        *ovp(plan, s, 34) = CALC_S47(34, 21,  8, 42, 29, 16,  3, 37, 24, 11, 45, 32, 19,  6, 40, 27, 14,  1, 35, 22,  9, 43, 30, 17,  4, 38, 25, 12, 46, 33, 20,  7, 41, 28, 15,  2, 36, 23, 10, 44, 31, 18,  5, 39, 26, 13);\n        *ovp(plan, s, 35) = CALC_S47(35, 23, 11, 46, 34, 22, 10, 45, 33, 21,  9, 44, 32, 20,  8, 43, 31, 19,  7, 42, 30, 18,  6, 41, 29, 17,  5, 40, 28, 16,  4, 39, 27, 15,  3, 38, 26, 14,  2, 37, 25, 13,  1, 36, 24, 12);\n        *ovp(plan, s, 36) = CALC_S47(36, 25, 14,  3, 39, 28, 17,  6, 42, 31, 20,  9, 45, 34, 23, 12,  1, 37, 26, 15,  4, 40, 29, 18,  7, 43, 32, 21, 10, 46, 35, 24, 13,  2, 38, 27, 16,  5, 41, 30, 19,  8, 44, 33, 22, 11);\n        *ovp(plan, s, 37) = CALC_S47(37, 27, 17,  7, 44, 34, 24, 14,  4, 41, 31, 21, 11,  1, 38, 28, 18,  8, 45, 35, 25, 15,  5, 42, 32, 22, 12,  2, 39, 29, 19,  9, 46, 36, 26, 16,  6, 43, 33, 23, 13,  3, 40, 30, 20, 10);\n        *ovp(plan, s, 38) = CALC_S47(38, 29, 20, 11,  2, 40, 31, 22, 13,  4, 42, 33, 24, 15,  6, 44, 35, 26, 17,  8, 46, 37, 28, 19, 10,  1, 39, 30, 21, 12,  3, 41, 32, 23, 14,  5, 43, 34, 25, 16,  7, 45, 36, 27, 18,  9);\n        *ovp(plan, s, 39) = CALC_S47(39, 31, 23, 15,  7, 46, 38, 30, 22, 14,  6, 45, 37, 29, 21, 13,  5, 44, 36, 28, 20, 12,  4, 43, 35, 27, 19, 11,  3, 42, 34, 26, 18, 10,  2, 41, 33, 25, 17,  9,  1, 40, 32, 24, 16,  8);\n        *ovp(plan, s, 40) = CALC_S47(40, 33, 26, 19, 12,  5, 45, 38, 31, 24, 17, 10,  3, 43, 36, 29, 22, 15,  8,  1, 41, 34, 27, 20, 13,  6, 46, 39, 32, 25, 18, 11,  4, 44, 37, 30, 23, 16,  9,  2, 42, 35, 28, 21, 14,  7);\n        *ovp(plan, s, 41) = CALC_S47(41, 35, 29, 23, 17, 11,  5, 46, 40, 34, 28, 22, 16, 10,  4, 45, 39, 33, 27, 21, 15,  9,  3, 44, 38, 32, 26, 20, 14,  8,  2, 43, 37, 31, 25, 19, 13,  7,  1, 42, 36, 30, 24, 18, 12,  6);\n        *ovp(plan, s, 42) = CALC_S47(42, 37, 32, 27, 22, 17, 12,  7,  2, 44, 39, 34, 29, 24, 19, 14,  9,  4, 46, 41, 36, 31, 26, 21, 16, 11,  6,  1, 43, 38, 33, 28, 23, 18, 13,  8,  3, 45, 40, 35, 30, 25, 20, 15, 10,  5);\n        *ovp(plan, s, 43) = CALC_S47(43, 39, 35, 31, 27, 23, 19, 15, 11,  7,  3, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10,  6,  2, 45, 41, 37, 33, 29, 25, 21, 17, 13,  9,  5,  1, 44, 40, 36, 32, 28, 24, 20, 16, 12,  8,  4);\n        *ovp(plan, s, 44) = CALC_S47(44, 41, 38, 35, 32, 29, 26, 23, 20, 17, 14, 11,  8,  5,  2, 46, 43, 40, 37, 34, 31, 28, 25, 22, 19, 16, 13, 10,  7,  4,  1, 45, 42, 39, 36, 33, 30, 27, 24, 21, 18, 15, 12,  9,  6,  3);\n        *ovp(plan, s, 45) = CALC_S47(45, 43, 41, 39, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11,  9,  7,  5,  3,  1, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10,  8,  6,  4,  2);\n        *ovp(plan, s, 46) = CALC_S47(46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1);\n\n    FFT_IMPLEMENTATION_END(plan);\n}\n\n\nconst fft_handler_desc_t fft_handlers[] = {\n        {  2, fft_litho_c2},\n        {  3, fft_litho_c3},\n        {  4, fft_litho_c4},\n        {  5, fft_litho_c5},\n        {  6, fft_litho_c6},\n        {  7, fft_litho_c7},\n        { 11, fft_litho_c11},\n        { 13, fft_litho_c13},\n        { 17, fft_litho_c17},\n        { 19, fft_litho_c19},\n        { 47, fft_litho_c47},\n};\n\n\nconst unsigned int FFT_IMPLEMENTED_RADIX_COUNT = sizeof(fft_handlers)/sizeof(fft_handler_desc_t);"
  },
  {
    "path": "OptolithiumC/libs/fourier/tools/generate_twiddles.m",
    "content": "twiddle_count = 2^14;\nline_count = 8;\ntest_indx = 0;\ntest_size = 8;\n\nx = (0:twiddle_count-1) * (2*pi) / twiddle_count;\ny = sin(x);\n\nimag_indx = length(y)/test_size*test_indx + 1;\nreal_indx = mod(imag_indx + length(y)/4, length(y));\n\nreal_part = y(real_indx);\nimag_part = y(imag_indx);\n\nfprintf('Twiddle count = %d\\n', twiddle_count);\nfprintf('%2d/%2d = %.4f %.4f\\n', test_indx, test_size, real_part, imag_part);\n\nreturn;\n\nout = fopen('twiddle_array.h', 'w');\n\nfprintf(out, '#ifndef TWIDDLE_ARRAY_H_\\n');\nfprintf(out, '#define TWIDDLE_ARRAY_H_\\n');\nfprintf(out, '#include <complex.h>\\n');\nfprintf(out, '#define TWIDDLE_ARRAY_SIZE %d\\n', twiddle_count);\nfprintf(out, 'static double TWIDDLE_ARRAY[TWIDDLE_ARRAY_SIZE] = {\\n');\n\nfor k = 1:line_count:length(y),\n    fprintf(out, '%.16ff, ', y(k:k+line_count-1));\n    fprintf(out, '\\n');\nend;\n\nfprintf(out, '};\\n');\nfprintf(out, '#endif /* TWIDDLE_ARRAY_H_ */\\n');\n\nfclose(out);"
  },
  {
    "path": "OptolithiumC/libs/kissfft/CMakeLists.txt",
    "content": "CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0)\r\nPROJECT(polyclipping)\r\n\r\nSET(CMAKE_USE_RELATIVE_PATHS ON)\r\nSET(CMAKE_SKIP_RPATH TRUE)\r\n\r\nSET(CMAKE_BUILD_TYPE \"Release\")\r\n\r\nINCLUDE_DIRECTORIES(\"${CMAKE_CURRENT_SOURCE_DIR}/include\")\r\n\r\nADD_LIBRARY(kissfft STATIC\r\n        \"src/kiss_fft.c\"\r\n        \"src/kiss_fftnd.c\"\r\n)\r\n\r\n# CONFIGURE_FILE (polyclipping.pc.cmakein \"${PCFILE}\" @ONLY)\r\n\r\n# INSTALL (FILES clipper.hpp DESTINATION \"${CMAKE_INSTALL_INCDIR}\")\r\n# INSTALL (TARGETS polyclipping LIBRARY DESTINATION \"${CMAKE_CURRENT_SOURCE_DIR}/lib\")\r\n# INSTALL (FILES \"${PCFILE}\" DESTINATION \"${CMAKE_INSTALL_PKGCONFIGDIR}\")\r\n\r\n# SET_TARGET_PROPERTIES(polyclipping PROPERTIES VERSION 19.0.0 SOVERSION 19 )\r\n"
  },
  {
    "path": "OptolithiumC/libs/kissfft/include/_kiss_fft_guts.h",
    "content": "/*\nCopyright (c) 2003-2010, Mark Borgerding\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n    * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/* kiss_fft.h\n   defines kiss_fft_scalar as either short or a float type\n   and defines\n   typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */\n#include \"kiss_fft.h\"\n#include <limits.h>\n\n#define MAXFACTORS 32\n/* e.g. an fft of length 128 has 4 factors \n as far as kissfft is concerned\n 4*4*4*2\n */\n\nstruct kiss_fft_state{\n    int nfft;\n    int inverse;\n    int factors[2*MAXFACTORS];\n    kiss_fft_cpx twiddles[1];\n};\n\n/*\n  Explanation of macros dealing with complex math:\n\n   C_MUL(m,a,b)         : m = a*b\n   C_FIXDIV( c , div )  : if a fixed point impl., c /= div. noop otherwise\n   C_SUB( res, a,b)     : res = a - b\n   C_SUBFROM( res , a)  : res -= a\n   C_ADDTO( res , a)    : res += a\n * */\n#ifdef FIXED_POINT\n#if (FIXED_POINT==32)\n# define FRACBITS 31\n# define SAMPPROD int64_t\n#define SAMP_MAX 2147483647\n#else\n# define FRACBITS 15\n# define SAMPPROD int32_t \n#define SAMP_MAX 32767\n#endif\n\n#define SAMP_MIN -SAMP_MAX\n\n#if defined(CHECK_OVERFLOW)\n#  define CHECK_OVERFLOW_OP(a,op,b)  \\\n\tif ( (SAMPPROD)(a) op (SAMPPROD)(b) > SAMP_MAX || (SAMPPROD)(a) op (SAMPPROD)(b) < SAMP_MIN ) { \\\n\t\tfprintf(stderr,\"WARNING:overflow @ \" __FILE__ \"(%d): (%d \" #op\" %d) = %ld\\n\",__LINE__,(a),(b),(SAMPPROD)(a) op (SAMPPROD)(b) );  }\n#endif\n\n\n#   define smul(a,b) ( (SAMPPROD)(a)*(b) )\n#   define sround( x )  (kiss_fft_scalar)( ( (x) + (1<<(FRACBITS-1)) ) >> FRACBITS )\n\n#   define S_MUL(a,b) sround( smul(a,b) )\n\n#   define C_MUL(m,a,b) \\\n      do{ (m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) ); \\\n          (m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); }while(0)\n\n#   define DIVSCALAR(x,k) \\\n\t(x) = sround( smul(  x, SAMP_MAX/k ) )\n\n#   define C_FIXDIV(c,div) \\\n\tdo {    DIVSCALAR( (c).r , div);  \\\n\t\tDIVSCALAR( (c).i  , div); }while (0)\n\n#   define C_MULBYSCALAR( c, s ) \\\n    do{ (c).r =  sround( smul( (c).r , s ) ) ;\\\n        (c).i =  sround( smul( (c).i , s ) ) ; }while(0)\n\n#else  /* not FIXED_POINT*/\n\n#   define S_MUL(a,b) ( (a)*(b) )\n#define C_MUL(m,a,b) \\\n    do{ (m).r = (a).r*(b).r - (a).i*(b).i;\\\n        (m).i = (a).r*(b).i + (a).i*(b).r; }while(0)\n#   define C_FIXDIV(c,div) /* NOOP */\n#   define C_MULBYSCALAR( c, s ) \\\n    do{ (c).r *= (s);\\\n        (c).i *= (s); }while(0)\n#endif\n\n#ifndef CHECK_OVERFLOW_OP\n#  define CHECK_OVERFLOW_OP(a,op,b) /* noop */\n#endif\n\n#define  C_ADD( res, a,b)\\\n    do { \\\n\t    CHECK_OVERFLOW_OP((a).r,+,(b).r)\\\n\t    CHECK_OVERFLOW_OP((a).i,+,(b).i)\\\n\t    (res).r=(a).r+(b).r;  (res).i=(a).i+(b).i; \\\n    }while(0)\n#define  C_SUB( res, a,b)\\\n    do { \\\n\t    CHECK_OVERFLOW_OP((a).r,-,(b).r)\\\n\t    CHECK_OVERFLOW_OP((a).i,-,(b).i)\\\n\t    (res).r=(a).r-(b).r;  (res).i=(a).i-(b).i; \\\n    }while(0)\n#define C_ADDTO( res , a)\\\n    do { \\\n\t    CHECK_OVERFLOW_OP((res).r,+,(a).r)\\\n\t    CHECK_OVERFLOW_OP((res).i,+,(a).i)\\\n\t    (res).r += (a).r;  (res).i += (a).i;\\\n    }while(0)\n\n#define C_SUBFROM( res , a)\\\n    do {\\\n\t    CHECK_OVERFLOW_OP((res).r,-,(a).r)\\\n\t    CHECK_OVERFLOW_OP((res).i,-,(a).i)\\\n\t    (res).r -= (a).r;  (res).i -= (a).i; \\\n    }while(0)\n\n\n#ifdef FIXED_POINT\n#  define KISS_FFT_COS(phase)  floor(.5+SAMP_MAX * cos (phase))\n#  define KISS_FFT_SIN(phase)  floor(.5+SAMP_MAX * sin (phase))\n#  define HALF_OF(x) ((x)>>1)\n#elif defined(USE_SIMD)\n#  define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) )\n#  define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) )\n#  define HALF_OF(x) ((x)*_mm_set1_ps(.5))\n#else\n#  define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase)\n#  define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase)\n#  define HALF_OF(x) ((x)*.5)\n#endif\n\n#define  kf_cexp(x,phase) \\\n\tdo{ \\\n\t\t(x)->r = KISS_FFT_COS(phase);\\\n\t\t(x)->i = KISS_FFT_SIN(phase);\\\n\t}while(0)\n\n\n/* a debugging function */\n#define pcpx(c)\\\n    fprintf(stderr,\"%g + %gi\\n\",(double)((c)->r),(double)((c)->i) )\n\n\n#ifdef KISS_FFT_USE_ALLOCA\n// define this to allow use of alloca instead of malloc for temporary buffers\n// Temporary buffers are used in two case: \n// 1. FFT sizes that have \"bad\" factors. i.e. not 2,3 and 5\n// 2. \"in-place\" FFTs.  Notice the quotes, since kissfft does not really do an in-place transform.\n#include <alloca.h>\n#define  KISS_FFT_TMP_ALLOC(nbytes) alloca(nbytes)\n#define  KISS_FFT_TMP_FREE(ptr) \n#else\n#define  KISS_FFT_TMP_ALLOC(nbytes) KISS_FFT_MALLOC(nbytes)\n#define  KISS_FFT_TMP_FREE(ptr) KISS_FFT_FREE(ptr)\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/kissfft/include/kiss_fft.h",
    "content": "#ifndef KISS_FFT_H\n#define KISS_FFT_H\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <math.h>\n#include <string.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n ATTENTION!\n If you would like a :\n -- a utility that will handle the caching of fft objects\n -- real-only (no imaginary time component ) FFT\n -- a multi-dimensional FFT\n -- a command-line utility to perform ffts\n -- a command-line utility to perform fast-convolution filtering\n\n Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c\n  in the tools/ directory.\n*/\n\n#ifdef USE_SIMD\n# include <xmmintrin.h>\n# define kiss_fft_scalar __m128\n#define KISS_FFT_MALLOC(nbytes) _mm_malloc(nbytes,16)\n#define KISS_FFT_FREE _mm_free\n#else\t\n#define KISS_FFT_MALLOC malloc\n#define KISS_FFT_FREE free\n#endif\t\n\n\n#ifdef FIXED_POINT\n#include <sys/types.h>\t\n# if (FIXED_POINT == 32)\n#  define kiss_fft_scalar int32_t\n# else\t\n#  define kiss_fft_scalar int16_t\n# endif\n#else\n# ifndef kiss_fft_scalar\n/*  default is float */\n#   define kiss_fft_scalar double\n# endif\n#endif\n\ntypedef struct {\n    kiss_fft_scalar r;\n    kiss_fft_scalar i;\n} kiss_fft_cpx;\n\ntypedef struct kiss_fft_state* kiss_fft_cfg;\n\n/* \n *  kiss_fft_alloc\n *  \n *  Initialize a FFT (or IFFT) algorithm's cfg/state buffer.\n *\n *  typical usage:      kiss_fft_cfg mycfg=kiss_fft_alloc(1024,0,NULL,NULL);\n *\n *  The return value from fft_alloc is a cfg buffer used internally\n *  by the fft routine or NULL.\n *\n *  If lenmem is NULL, then kiss_fft_alloc will allocate a cfg buffer using malloc.\n *  The returned value should be free()d when done to avoid memory leaks.\n *  \n *  The state can be placed in a user supplied buffer 'mem':\n *  If lenmem is not NULL and mem is not NULL and *lenmem is large enough,\n *      then the function places the cfg in mem and the size used in *lenmem\n *      and returns mem.\n *  \n *  If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough),\n *      then the function returns NULL and places the minimum cfg \n *      buffer size in *lenmem.\n * */\n\nkiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem); \n\n/*\n * kiss_fft(cfg,in_out_buf)\n *\n * Perform an FFT on a complex input buffer.\n * for a forward FFT,\n * fin should be  f[0] , f[1] , ... ,f[nfft-1]\n * fout will be   F[0] , F[1] , ... ,F[nfft-1]\n * Note that each element is complex and can be accessed like\n    f[k].r and f[k].i\n * */\nvoid kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout);\n\n/*\n A more generic version of the above function. It reads its input from every Nth sample.\n * */\nvoid kiss_fft_stride(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int fin_stride);\n\n/* If kiss_fft_alloc allocated a buffer, it is one contiguous \n   buffer and can be simply free()d when no longer needed*/\n#define kiss_fft_free free\n\n/*\n Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up \n your compiler output to call this before you exit.\n*/\nvoid kiss_fft_cleanup(void);\n\t\n\n/*\n * Returns the smallest integer k, such that k>=n and k has only \"fast\" factors (2,3,5)\n */\nint kiss_fft_next_fast_size(int n);\n\n/* for real ffts, we need an even size */\n#define kiss_fftr_next_fast_size_real(n) \\\n        (kiss_fft_next_fast_size( ((n)+1)>>1)<<1)\n\n#ifdef __cplusplus\n} \n#endif\n\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/kissfft/include/kiss_fftnd.h",
    "content": "#ifndef KISS_FFTND_H\n#define KISS_FFTND_H\n\n#include \"kiss_fft.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct kiss_fftnd_state * kiss_fftnd_cfg;\n    \nkiss_fftnd_cfg  kiss_fftnd_alloc(const int *dims,int ndims,int inverse_fft,void*mem,size_t*lenmem);\nvoid kiss_fftnd(kiss_fftnd_cfg  cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout);\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "OptolithiumC/libs/kissfft/src/kiss_fft.c",
    "content": "/*\nCopyright (c) 2003-2010, Mark Borgerding\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n    * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n\n#include \"_kiss_fft_guts.h\"\n/* The guts header contains all the multiplication and addition macros that are defined for\n fixed or floating point complex numbers.  It also delares the kf_ internal functions.\n */\n\nstatic void kf_bfly2(\n        kiss_fft_cpx * Fout,\n        const size_t fstride,\n        const kiss_fft_cfg st,\n        int m\n        )\n{\n    kiss_fft_cpx * Fout2;\n    kiss_fft_cpx * tw1 = st->twiddles;\n    kiss_fft_cpx t;\n    Fout2 = Fout + m;\n    do{\n        C_FIXDIV(*Fout,2); C_FIXDIV(*Fout2,2);\n\n        C_MUL (t,  *Fout2 , *tw1);\n        tw1 += fstride;\n        C_SUB( *Fout2 ,  *Fout , t );\n        C_ADDTO( *Fout ,  t );\n        ++Fout2;\n        ++Fout;\n    }while (--m);\n}\n\nstatic void kf_bfly4(\n        kiss_fft_cpx * Fout,\n        const size_t fstride,\n        const kiss_fft_cfg st,\n        const size_t m\n        )\n{\n    kiss_fft_cpx *tw1,*tw2,*tw3;\n    kiss_fft_cpx scratch[6];\n    size_t k=m;\n    const size_t m2=2*m;\n    const size_t m3=3*m;\n\n\n    tw3 = tw2 = tw1 = st->twiddles;\n\n    do {\n        C_FIXDIV(*Fout,4); C_FIXDIV(Fout[m],4); C_FIXDIV(Fout[m2],4); C_FIXDIV(Fout[m3],4);\n\n        C_MUL(scratch[0],Fout[m] , *tw1 );\n        C_MUL(scratch[1],Fout[m2] , *tw2 );\n        C_MUL(scratch[2],Fout[m3] , *tw3 );\n\n        C_SUB( scratch[5] , *Fout, scratch[1] );\n        C_ADDTO(*Fout, scratch[1]);\n        C_ADD( scratch[3] , scratch[0] , scratch[2] );\n        C_SUB( scratch[4] , scratch[0] , scratch[2] );\n        C_SUB( Fout[m2], *Fout, scratch[3] );\n        tw1 += fstride;\n        tw2 += fstride*2;\n        tw3 += fstride*3;\n        C_ADDTO( *Fout , scratch[3] );\n\n        if(st->inverse) {\n            Fout[m].r = scratch[5].r - scratch[4].i;\n            Fout[m].i = scratch[5].i + scratch[4].r;\n            Fout[m3].r = scratch[5].r + scratch[4].i;\n            Fout[m3].i = scratch[5].i - scratch[4].r;\n        }else{\n            Fout[m].r = scratch[5].r + scratch[4].i;\n            Fout[m].i = scratch[5].i - scratch[4].r;\n            Fout[m3].r = scratch[5].r - scratch[4].i;\n            Fout[m3].i = scratch[5].i + scratch[4].r;\n        }\n        ++Fout;\n    }while(--k);\n}\n\nstatic void kf_bfly3(\n         kiss_fft_cpx * Fout,\n         const size_t fstride,\n         const kiss_fft_cfg st,\n         size_t m\n         )\n{\n     size_t k=m;\n     const size_t m2 = 2*m;\n     kiss_fft_cpx *tw1,*tw2;\n     kiss_fft_cpx scratch[5];\n     kiss_fft_cpx epi3;\n     epi3 = st->twiddles[fstride*m];\n\n     tw1=tw2=st->twiddles;\n\n     do{\n         C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3);\n\n         C_MUL(scratch[1],Fout[m] , *tw1);\n         C_MUL(scratch[2],Fout[m2] , *tw2);\n\n         C_ADD(scratch[3],scratch[1],scratch[2]);\n         C_SUB(scratch[0],scratch[1],scratch[2]);\n         tw1 += fstride;\n         tw2 += fstride*2;\n\n         Fout[m].r = Fout->r - HALF_OF(scratch[3].r);\n         Fout[m].i = Fout->i - HALF_OF(scratch[3].i);\n\n         C_MULBYSCALAR( scratch[0] , epi3.i );\n\n         C_ADDTO(*Fout,scratch[3]);\n\n         Fout[m2].r = Fout[m].r + scratch[0].i;\n         Fout[m2].i = Fout[m].i - scratch[0].r;\n\n         Fout[m].r -= scratch[0].i;\n         Fout[m].i += scratch[0].r;\n\n         ++Fout;\n     }while(--k);\n}\n\nstatic void kf_bfly5(\n        kiss_fft_cpx * Fout,\n        const size_t fstride,\n        const kiss_fft_cfg st,\n        int m\n        )\n{\n    kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4;\n    int u;\n    kiss_fft_cpx scratch[13];\n    kiss_fft_cpx * twiddles = st->twiddles;\n    kiss_fft_cpx *tw;\n    kiss_fft_cpx ya,yb;\n    ya = twiddles[fstride*m];\n    yb = twiddles[fstride*2*m];\n\n    Fout0=Fout;\n    Fout1=Fout0+m;\n    Fout2=Fout0+2*m;\n    Fout3=Fout0+3*m;\n    Fout4=Fout0+4*m;\n\n    tw=st->twiddles;\n    for ( u=0; u<m; ++u ) {\n        C_FIXDIV( *Fout0,5); C_FIXDIV( *Fout1,5); C_FIXDIV( *Fout2,5); C_FIXDIV( *Fout3,5); C_FIXDIV( *Fout4,5);\n        scratch[0] = *Fout0;\n\n        C_MUL(scratch[1] ,*Fout1, tw[u*fstride]);\n        C_MUL(scratch[2] ,*Fout2, tw[2*u*fstride]);\n        C_MUL(scratch[3] ,*Fout3, tw[3*u*fstride]);\n        C_MUL(scratch[4] ,*Fout4, tw[4*u*fstride]);\n\n        C_ADD( scratch[7],scratch[1],scratch[4]);\n        C_SUB( scratch[10],scratch[1],scratch[4]);\n        C_ADD( scratch[8],scratch[2],scratch[3]);\n        C_SUB( scratch[9],scratch[2],scratch[3]);\n\n        Fout0->r += scratch[7].r + scratch[8].r;\n        Fout0->i += scratch[7].i + scratch[8].i;\n\n        scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r);\n        scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r);\n\n        scratch[6].r =  S_MUL(scratch[10].i,ya.i) + S_MUL(scratch[9].i,yb.i);\n        scratch[6].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i);\n\n        C_SUB(*Fout1,scratch[5],scratch[6]);\n        C_ADD(*Fout4,scratch[5],scratch[6]);\n\n        scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r);\n        scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r);\n        scratch[12].r = - S_MUL(scratch[10].i,yb.i) + S_MUL(scratch[9].i,ya.i);\n        scratch[12].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i);\n\n        C_ADD(*Fout2,scratch[11],scratch[12]);\n        C_SUB(*Fout3,scratch[11],scratch[12]);\n\n        ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4;\n    }\n}\n\n/* perform the butterfly for one stage of a mixed radix FFT */\nstatic void kf_bfly_generic(\n        kiss_fft_cpx * Fout,\n        const size_t fstride,\n        const kiss_fft_cfg st,\n        int m,\n        int p\n        )\n{\n    int u,k,q1,q;\n    kiss_fft_cpx * twiddles = st->twiddles;\n    kiss_fft_cpx t;\n    int Norig = st->nfft;\n\n    kiss_fft_cpx * scratch = (kiss_fft_cpx*)KISS_FFT_TMP_ALLOC(sizeof(kiss_fft_cpx)*p);\n\n    for ( u=0; u<m; ++u ) {\n        k=u;\n        for ( q1=0 ; q1<p ; ++q1 ) {\n            scratch[q1] = Fout[ k  ];\n            C_FIXDIV(scratch[q1],p);\n            k += m;\n        }\n\n        k=u;\n        for ( q1=0 ; q1<p ; ++q1 ) {\n            int twidx=0;\n            Fout[ k ] = scratch[0];\n            for (q=1;q<p;++q ) {\n                twidx += fstride * k;\n                if (twidx>=Norig) twidx-=Norig;\n                C_MUL(t,scratch[q] , twiddles[twidx] );\n                C_ADDTO( Fout[ k ] ,t);\n            }\n            k += m;\n        }\n    }\n    KISS_FFT_TMP_FREE(scratch);\n}\n\nstatic\nvoid kf_work(\n        kiss_fft_cpx * Fout,\n        const kiss_fft_cpx * f,\n        const size_t fstride,\n        int in_stride,\n        int * factors,\n        const kiss_fft_cfg st\n        )\n{\n    kiss_fft_cpx * Fout_beg=Fout;\n    const int p=*factors++; /* the radix  */\n    const int m=*factors++; /* stage's fft length/p */\n    const kiss_fft_cpx * Fout_end = Fout + p*m;\n\n#ifdef _OPENMP\n    // use openmp extensions at the \n    // top-level (not recursive)\n    if (fstride==1 && p<=5)\n    {\n        int k;\n\n        // execute the p different work units in different threads\n#       pragma omp parallel for\n        for (k=0;k<p;++k) \n            kf_work( Fout +k*m, f+ fstride*in_stride*k,fstride*p,in_stride,factors,st);\n        // all threads have joined by this point\n\n        switch (p) {\n            case 2: kf_bfly2(Fout,fstride,st,m); break;\n            case 3: kf_bfly3(Fout,fstride,st,m); break; \n            case 4: kf_bfly4(Fout,fstride,st,m); break;\n            case 5: kf_bfly5(Fout,fstride,st,m); break; \n            default: kf_bfly_generic(Fout,fstride,st,m,p); break;\n        }\n        return;\n    }\n#endif\n\n    if (m==1) {\n        do{\n            *Fout = *f;\n            f += fstride*in_stride;\n        }while(++Fout != Fout_end );\n    }else{\n        do{\n            // recursive call:\n            // DFT of size m*p performed by doing\n            // p instances of smaller DFTs of size m, \n            // each one takes a decimated version of the input\n            kf_work( Fout , f, fstride*p, in_stride, factors,st);\n            f += fstride*in_stride;\n        }while( (Fout += m) != Fout_end );\n    }\n\n    Fout=Fout_beg;\n\n    // recombine the p smaller DFTs \n    switch (p) {\n        case 2: kf_bfly2(Fout,fstride,st,m); break;\n        case 3: kf_bfly3(Fout,fstride,st,m); break; \n        case 4: kf_bfly4(Fout,fstride,st,m); break;\n        case 5: kf_bfly5(Fout,fstride,st,m); break; \n        default: kf_bfly_generic(Fout,fstride,st,m,p); break;\n    }\n}\n\n/*  facbuf is populated by p1,m1,p2,m2, ...\n    where \n    p[i] * m[i] = m[i-1]\n    m0 = n                  */\nstatic \nvoid kf_factor(int n,int * facbuf)\n{\n    int p=4;\n    double floor_sqrt;\n    floor_sqrt = floor( sqrt((double)n) );\n\n    /*factor out powers of 4, powers of 2, then any remaining primes */\n    do {\n        while (n % p) {\n            switch (p) {\n                case 4: p = 2; break;\n                case 2: p = 3; break;\n                default: p += 2; break;\n            }\n            if (p > floor_sqrt)\n                p = n;          /* no more factors, skip to end */\n        }\n        n /= p;\n        *facbuf++ = p;\n        *facbuf++ = n;\n    } while (n > 1);\n}\n\n/*\n *\n * User-callable function to allocate all necessary storage space for the fft.\n *\n * The return value is a contiguous block of memory, allocated with malloc.  As such,\n * It can be freed with free(), rather than a kiss_fft-specific function.\n * */\nkiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem )\n{\n    kiss_fft_cfg st=NULL;\n    size_t memneeded = sizeof(struct kiss_fft_state)\n        + sizeof(kiss_fft_cpx)*(nfft-1); /* twiddle factors*/\n\n    if ( lenmem==NULL ) {\n        st = ( kiss_fft_cfg)KISS_FFT_MALLOC( memneeded );\n    }else{\n        if (mem != NULL && *lenmem >= memneeded)\n            st = (kiss_fft_cfg)mem;\n        *lenmem = memneeded;\n    }\n    if (st) {\n        int i;\n        st->nfft=nfft;\n        st->inverse = inverse_fft;\n\n        for (i=0;i<nfft;++i) {\n            const double pi=3.141592653589793238462643383279502884197169399375105820974944;\n            double phase = -2*pi*i / nfft;\n            if (st->inverse)\n                phase *= -1;\n            kf_cexp(st->twiddles+i, phase );\n        }\n\n        kf_factor(nfft,st->factors);\n    }\n    return st;\n}\n\n\nvoid kiss_fft_stride(kiss_fft_cfg st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int in_stride)\n{\n    if (fin == fout) {\n        //NOTE: this is not really an in-place FFT algorithm.\n        //It just performs an out-of-place FFT into a temp buffer\n        kiss_fft_cpx * tmpbuf = (kiss_fft_cpx*)KISS_FFT_TMP_ALLOC( sizeof(kiss_fft_cpx)*st->nfft);\n        kf_work(tmpbuf,fin,1,in_stride, st->factors,st);\n        memcpy(fout,tmpbuf,sizeof(kiss_fft_cpx)*st->nfft);\n        KISS_FFT_TMP_FREE(tmpbuf);\n    }else{\n        kf_work( fout, fin, 1,in_stride, st->factors,st );\n    }\n}\n\nvoid kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout)\n{\n    kiss_fft_stride(cfg,fin,fout,1);\n}\n\n\nvoid kiss_fft_cleanup(void)\n{\n    // nothing needed any more\n}\n\nint kiss_fft_next_fast_size(int n)\n{\n    while(1) {\n        int m=n;\n        while ( (m%2) == 0 ) m/=2;\n        while ( (m%3) == 0 ) m/=3;\n        while ( (m%5) == 0 ) m/=5;\n        if (m<=1)\n            break; /* n is completely factorable by twos, threes, and fives */\n        n++;\n    }\n    return n;\n}\n"
  },
  {
    "path": "OptolithiumC/libs/kissfft/src/kiss_fftnd.c",
    "content": "\n\n/*\nCopyright (c) 2003-2004, Mark Borgerding\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n    * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#include \"kiss_fftnd.h\"\n#include \"_kiss_fft_guts.h\"\n\nstruct kiss_fftnd_state{\n    int dimprod; /* dimsum would be mighty tasty right now */\n    int ndims; \n    int *dims;\n    kiss_fft_cfg *states; /* cfg states for each dimension */\n    kiss_fft_cpx * tmpbuf; /*buffer capable of hold the entire input */\n};\n\nkiss_fftnd_cfg kiss_fftnd_alloc(const int *dims,int ndims,int inverse_fft,void*mem,size_t*lenmem)\n{\n    kiss_fftnd_cfg st = NULL;\n    int i;\n    int dimprod=1;\n    size_t memneeded = sizeof(struct kiss_fftnd_state);\n    char * ptr;\n\n    for (i=0;i<ndims;++i) {\n        size_t sublen=0;\n        kiss_fft_alloc (dims[i], inverse_fft, NULL, &sublen);\n        memneeded += sublen;   /* st->states[i] */\n        dimprod *= dims[i];\n    }\n    memneeded += sizeof(int) * ndims;/*  st->dims */\n    memneeded += sizeof(void*) * ndims;/* st->states  */\n    memneeded += sizeof(kiss_fft_cpx) * dimprod; /* st->tmpbuf */\n\n    if (lenmem == NULL) {/* allocate for the caller*/\n        st = (kiss_fftnd_cfg) malloc (memneeded);\n    } else { /* initialize supplied buffer if big enough */\n        if (*lenmem >= memneeded)\n            st = (kiss_fftnd_cfg) mem;\n        *lenmem = memneeded; /*tell caller how big struct is (or would be) */\n    }\n    if (!st)\n        return NULL; /*malloc failed or buffer too small */\n\n    st->dimprod = dimprod;\n    st->ndims = ndims;\n    ptr=(char*)(st+1);\n\n    st->states = (kiss_fft_cfg *)ptr;\n    ptr += sizeof(void*) * ndims;\n\n    st->dims = (int*)ptr;\n    ptr += sizeof(int) * ndims;\n\n    st->tmpbuf = (kiss_fft_cpx*)ptr;\n    ptr += sizeof(kiss_fft_cpx) * dimprod;\n\n    for (i=0;i<ndims;++i) {\n        size_t len;\n        st->dims[i] = dims[i];\n        kiss_fft_alloc (st->dims[i], inverse_fft, NULL, &len);\n        st->states[i] = kiss_fft_alloc (st->dims[i], inverse_fft, ptr,&len);\n        ptr += len;\n    }\n    /*\nHi there!\n\nIf you're looking at this particular code, it probably means you've got a brain-dead bounds checker \nthat thinks the above code overwrites the end of the array.\n\nIt doesn't.\n\n-- Mark \n\nP.S.\nThe below code might give you some warm fuzzies and help convince you.\n       */\n    if ( ptr - (char*)st != (int)memneeded ) {\n        fprintf(stderr,\n                \"################################################################################\\n\"\n                \"Internal error! Memory allocation miscalculation\\n\"\n                \"################################################################################\\n\"\n               );\n    }\n    return st;\n}\n\n/*\n This works by tackling one dimension at a time.\n\n In effect,\n Each stage starts out by reshaping the matrix into a DixSi 2d matrix.\n A Di-sized fft is taken of each column, transposing the matrix as it goes.\n\nHere's a 3-d example:\nTake a 2x3x4 matrix, laid out in memory as a contiguous buffer\n [ [ [ a b c d ] [ e f g h ] [ i j k l ] ]\n   [ [ m n o p ] [ q r s t ] [ u v w x ] ] ]\n\nStage 0 ( D=2): treat the buffer as a 2x12 matrix\n   [ [a b ... k l]\n     [m n ... w x] ]\n\n   FFT each column with size 2.\n   Transpose the matrix at the same time using kiss_fft_stride.\n\n   [ [ a+m a-m ]\n     [ b+n b-n]\n     ...\n     [ k+w k-w ]\n     [ l+x l-x ] ]\n\n   Note fft([x y]) == [x+y x-y]\n\nStage 1 ( D=3) treats the buffer (the output of stage D=2) as an 3x8 matrix,\n   [ [ a+m a-m b+n b-n c+o c-o d+p d-p ] \n     [ e+q e-q f+r f-r g+s g-s h+t h-t ]\n     [ i+u i-u j+v j-v k+w k-w l+x l-x ] ]\n\n   And perform FFTs (size=3) on each of the columns as above, transposing \n   the matrix as it goes.  The output of stage 1 is \n       (Legend: ap = [ a+m e+q i+u ]\n                am = [ a-m e-q i-u ] )\n   \n   [ [ sum(ap) fft(ap)[0] fft(ap)[1] ]\n     [ sum(am) fft(am)[0] fft(am)[1] ]\n     [ sum(bp) fft(bp)[0] fft(bp)[1] ]\n     [ sum(bm) fft(bm)[0] fft(bm)[1] ]\n     [ sum(cp) fft(cp)[0] fft(cp)[1] ]\n     [ sum(cm) fft(cm)[0] fft(cm)[1] ]\n     [ sum(dp) fft(dp)[0] fft(dp)[1] ]\n     [ sum(dm) fft(dm)[0] fft(dm)[1] ]  ]\n\nStage 2 ( D=4) treats this buffer as a 4*6 matrix,\n   [ [ sum(ap) fft(ap)[0] fft(ap)[1] sum(am) fft(am)[0] fft(am)[1] ]\n     [ sum(bp) fft(bp)[0] fft(bp)[1] sum(bm) fft(bm)[0] fft(bm)[1] ]\n     [ sum(cp) fft(cp)[0] fft(cp)[1] sum(cm) fft(cm)[0] fft(cm)[1] ]\n     [ sum(dp) fft(dp)[0] fft(dp)[1] sum(dm) fft(dm)[0] fft(dm)[1] ]  ]\n\n   Then FFTs each column, transposing as it goes.\n\n   The resulting matrix is the 3d FFT of the 2x3x4 input matrix.\n\n   Note as a sanity check that the first element of the final \n   stage's output (DC term) is \n   sum( [ sum(ap) sum(bp) sum(cp) sum(dp) ] )\n   , i.e. the summation of all 24 input elements. \n\n*/\nvoid kiss_fftnd(kiss_fftnd_cfg st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout)\n{\n    int i,k;\n    const kiss_fft_cpx * bufin=fin;\n    kiss_fft_cpx * bufout;\n\n    /*arrange it so the last bufout == fout*/\n    if ( st->ndims & 1 ) {\n        bufout = fout;\n        if (fin==fout) {\n            memcpy( st->tmpbuf, fin, sizeof(kiss_fft_cpx) * st->dimprod );\n            bufin = st->tmpbuf;\n        }\n    }else\n        bufout = st->tmpbuf;\n\n    for ( k=0; k < st->ndims; ++k) {\n        int curdim = st->dims[k];\n        int stride = st->dimprod / curdim;\n\n        for ( i=0 ; i<stride ; ++i ) \n            kiss_fft_stride( st->states[k], bufin+i , bufout+i*curdim, stride );\n\n        /*toggle back and forth between the two buffers*/\n        if (bufout == st->tmpbuf){\n            bufout = fout;\n            bufin = st->tmpbuf;\n        }else{\n            bufout = st->tmpbuf;\n            bufin = fout;\n        }\n    }\n}\n"
  },
  {
    "path": "OptolithiumC/optolithiumc.i",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n%module optolithiumc\n%{\n    #define SWIG_FILE_WITH_INIT\n\n    /* Includes the header in the wrapper code */\n    #include \"opl_contours.h\"\n    #include \"opl_geometry.h\"\n    #include \"opl_iter.h\"\n    #include \"opl_capi.h\"\n    #include \"opl_sim.h\"\n\n    static PyObject* ctypes_module;\n    static PyObject* ctypes_module_cast;\n    static PyObject* ctypes_module_c_void_p;\n\n    int load_ctypes_module(void) {\n        ctypes_module = PyImport_ImportModule(\"ctypes\");\n        if (!ctypes_module) {\n            PyErr_SetString(PyExc_RuntimeError, \"Can't load ctypes module!\");\n            return -1;\n        }\n\n        ctypes_module_cast = PyObject_GetAttrString(ctypes_module, \"cast\");\n        if (!ctypes_module_cast) {\n            PyErr_SetString(PyExc_RuntimeError, \"ctypes.cast function not found in ctypes module!\");\n            return -1;\n        }\n\n        ctypes_module_c_void_p = PyObject_GetAttrString(ctypes_module, \"c_void_p\");\n        if (!ctypes_module_c_void_p) {\n            PyErr_SetString(PyExc_RuntimeError, \"ctypes.c_void_p class not found in ctypes module!\");\n            return -1;\n        }\n        return 0;\n    }\n\n%}\n\n%init {\n    if (load_ctypes_module() == -1) {\n        # if PY_VERSION_HEX >= 0x03000000\n            return NULL;\n        # else\n            return;\n        # endif\n    }\n}\n\n/* ---------------------------------------------------------------------------- */\n\n%define %ctypes_callback(typename)\n    %typemap(in) typename {\n        PyObject* args = Py_BuildValue(\"(OO)\", $input, ctypes_module_c_void_p);\n        if (!args) {\n            SWIG_exception_fail(SWIG_ERROR, \"Py_BuildValue: can't create input args tuple!\");\n        }\n        PyObject* pointer = PyObject_CallObject(ctypes_module_cast, args);\n        if (!pointer) {\n            SWIG_exception_fail(SWIG_ERROR, \"PyObject_CallObject: convert function to c_void_p failed!\");\n        }\n        PyObject* address = PyObject_GetAttrString(pointer, \"value\");\n        if (!address) {\n            SWIG_exception_fail(SWIG_ERROR, \"PyObject_GetAttrString: get address from c_void_p failed!\");\n        }\n        uint64_t address_value = PyInt_AsUnsignedLongLongMask(address);\n        //printf(\"Address is %016llX\\n\", address_value);\n        //PyObject_Print(address,stdout,Py_PRINT_RAW);\n        if (address_value == (uint64_t)-1) {\n            if (PyErr_Occurred()) {\n                PyObject *errtype, *errvalue, *traceback;\n                PyErr_Fetch(&errtype, &errvalue, &traceback);\n                if (errvalue != nullptr) {\n                    PyObject *str = PyObject_Str(errvalue);\n                    std::string header_string(\"PyLong_AsUnsignedLongLong: \");\n                    std::string message_string(PyString_AsString(str));\n                    SWIG_exception_fail(SWIG_ERROR, (header_string + message_string).c_str());\n                    Py_DECREF(str);\n                }\n                Py_XDECREF(errvalue);\n                Py_XDECREF(errtype);\n                Py_XDECREF(traceback);\n            }\n        }\n        $1 = reinterpret_cast<typename>(address_value);\n    }\n%enddef\n\n/* ---------------------------------------------------------------------------- */\n\n%include <typemaps.i>\n%include <stdint.i>\n%include <complex.i>\n%include <std_shared_ptr.i>\n%include <std_vector.i>\n%include <std_string.i>\n%include <armanpy.i>\n\n/* ---------------------------------------------------------------------------- */\n\n%ctypes_callback(source_shape_expr_t)\n%ctypes_callback(rate_model_expr_t)\n%ctypes_callback(pupil_filter_expr_t)\n\n/* ---------------------------------------------------------------------------- */\n\n%shared_ptr(geometry::Point2d)\n%shared_ptr(geometry::Edge2d)\n\n%shared_ptr(geometry::Point3d)\n%shared_ptr(geometry::Edge3d)\n\n%shared_ptr(geometry::Triangle3d)\n%shared_ptr(geometry::Surface3d)\n\n%shared_ptr(geometry::AbstractGeometry)\n%shared_ptr(geometry::PolygonGeometry)\n%shared_ptr(geometry::RectangleGeometry)\n\n%shared_ptr(oplc::AbstractMaskGeometry)\n%shared_ptr(oplc::Region)\n%shared_ptr(oplc::Box)\n\n%shared_ptr(oplc::AbstractResistRateModel)\n%shared_ptr(oplc::ResistRateModelExpression)\n%shared_ptr(oplc::ResistRateModelSheet)\n%shared_ptr(oplc::ResistRateModelDepthSheet)\n\n%shared_ptr(oplc::AbstractSourceShapeModel)\n%shared_ptr(oplc::SourceShapeModelPlugin)\n%shared_ptr(oplc::SourceShapeModelSheet)\n\n%shared_ptr(oplc::AbstractPupilFilterModel)\n%shared_ptr(oplc::PupilFilterModelPlugin)\n%shared_ptr(oplc::PupilFilterModelSheet)\n%shared_ptr(oplc::PupilFilterModelEmpty)\n\n%shared_ptr(oplc::ExposureResistModel)\n%shared_ptr(oplc::PebResistModel)\n\n%shared_ptr(oplc::AbstractWaferLayer)\n%shared_ptr(oplc::StandardWaferLayer)\n%shared_ptr(oplc::ResistWaferLayer)\n%shared_ptr(oplc::ConstantWaferLayer)\n%shared_ptr(oplc::WaferStack)\n\n%shared_ptr(oplc::Mask)\n%shared_ptr(oplc::ImagingTool)\n%shared_ptr(oplc::Diffraction)\n%shared_ptr(oplc::SourceShape)\n%shared_ptr(oplc::Exposure)\n%shared_ptr(oplc::PostExposureBake)\n%shared_ptr(oplc::Development)\n%shared_ptr(oplc::OpticalTransferFunction)\n\n%shared_ptr(oplc::AbstractResistSimulations)\n%shared_ptr(oplc::ResistVolume)\n%shared_ptr(oplc::ResistProfile)\n\n/* ---------------------------------------------------------------------------- */\n\n%template(Triangle3dArray) std::vector<std::shared_ptr<geometry::Triangle3d> >;\n%template(PolygonsArray) std::vector<std::shared_ptr<geometry::PolygonGeometry> >;\n%template(Points2dArray) std::vector<std::shared_ptr<geometry::Point2d> >;\n%template(Points3dArray) std::vector<std::shared_ptr<geometry::Point3d> >;\n%template(RegionsArray) std::vector<std::shared_ptr<Region> >;\n%template(DoubleArray) std::vector<double>;\n\n/* ---------------------------------------------------------------------------- */\n\n%exception {\n    try {\n        $action\n    } catch (std::length_error error) {\n        PyErr_SetString(PyExc_IndexError, error.what());\n        SWIG_fail;\n    } catch (std::out_of_range error) {\n        PyErr_SetString(PyExc_IndexError, error.what());\n        SWIG_fail;\n    } catch (std::invalid_argument error) {\n        PyErr_SetString(PyExc_ValueError, error.what());\n        SWIG_fail;\n    } catch (std::range_error error) {\n        PyErr_SetString(PyExc_IndexError, error.what());\n        SWIG_fail;\n    } catch (std::runtime_error error) {\n        PyErr_SetString(PyExc_RuntimeError, error.what());\n        SWIG_fail;\n    } catch (std::exception error) {\n        PyErr_SetString(PyExc_Exception, error.what());\n        SWIG_fail;    \n    }\n}\n\n/* ---------------------------------------------------------------------------- */\n\nnamespace geometry {\n\n    %extend Point2d {\n        %rename(__getitem__) operator[];\n        %rename(__len__) length;\n        %rename(__repr__) str;\n\n        %pythoncode %{\n            def round(self, ndigits):\n                return self.__class__(round(self.x, ndigits), round(self.y, ndigits))\n\n            def __hash__(self):\n                return hash((self.x, self.y))\n        %}\n    }\n\n    %ignore operator *;\n    %ignore operator /;\n\n    %extend Edge2d {\n        %rename(__str__) str;\n    }\n\n    %extend Point3d {\n        %rename(__getitem__) operator[];\n        %rename(__len__) length;\n        %rename(__repr__) str;\n    }\n\n    %extend Edge3d {\n        %rename(__str__) str;\n    }\n\n    %extend Triangle3d {\n        %rename(__getitem__) operator[];\n        %rename(__len__) length;\n        %rename(__repr__) str;\n\n        %rename(_get_a) a() const;\n        %rename(_get_b) b() const;\n        %rename(_get_c) c() const;\n\n        %pythoncode %{\n            __swig_getmethods__[\"a\"] = _get_a\n            __swig_getmethods__[\"b\"] = _get_b\n            __swig_getmethods__[\"c\"] = _get_c\n\n            if _newclass: \n                a = property(_get_a)\n                b = property(_get_b)\n                c = property(_get_c)\n        %}\n    }\n\n    %extend Surface3d {\n        %rename(_get_points) points() const;\n        %rename(_get_triangles) triangles() const;\n\n        %rename(_get_x) x() const;\n        %rename(_get_y) y() const;\n        %rename(_get_z) z() const;\n\n        %pythoncode %{\n            __swig_getmethods__[\"points\"] = _get_points\n            __swig_getmethods__[\"triangles\"] = _get_triangles\n\n            __swig_getmethods__[\"x\"] = _get_x\n            __swig_getmethods__[\"y\"] = _get_y\n            __swig_getmethods__[\"z\"] = _get_z\n\n            if _newclass: \n                points = property(_get_points)\n                triangles = property(_get_triangles)\n\n                x = property(_get_x)\n                y = property(_get_y)\n                z = property(_get_z)\n        %}\n    }\n\n    // ArrayOfSharedPoints2d\n    %extend std::vector<std::shared_ptr<Point2d> > {\n        std::string __str__() {\n            std::ostringstream result;\n            for (auto item : *$self) {\n                result << \" \" << item->str() << \", \" << std::endl;\n            }\n            return result.str();\n        }\n    }\n\n    // ArrayOfSharedPoints3d\n    %extend std::vector<std::shared_ptr<Point3d> > {\n        std::string __str__() {\n            std::ostringstream result;\n            for (auto item : *$self) {\n                result << \" \" << item->str() << \", \" << std::endl;\n            }\n            return result.str();\n        }\n    }\n\n    %extend AbstractGeometry {\n        %rename(__getitem__) at;\n        %rename(__len__) length;\n        %rename(__str__) str;\n\n        %pythoncode %{\n            def __iter__(self):\n                for k in xrange(len(self)):\n                    yield self[k]\n        %}\n    }\n\n\n    // ArrayOfSharedPolygons\n    %extend std::vector<std::shared_ptr<PolygonGeometry> > {\n        std::string __str__() {\n            std::ostringstream result;\n            for (auto item : *$self) {\n                result << \" \" << item->str() << \", \" << std::endl;\n            }\n            return result.str();\n        }\n    }\n}  // namespace geometry\n\n\nnamespace interp {\n    %extend LinearInterpolation1d {\n        LinearInterpolation1d(const arma::vec& x, const arma::vec& y, double fill=0.0) {\n            return new interp::LinearInterpolation1d(\n                std::make_shared<const arma::vec>(x), \n                std::make_shared<const arma::vec>(y), \n                fill);\n        }\n    }\n\n    %extend LinearInterpolation2d {\n        LinearInterpolation2d(const arma::vec& x, const arma::vec& y, const arma::mat& values, double fill=0.0) {\n            return new interp::LinearInterpolation2d(\n                std::make_shared<const arma::vec>(x), \n                std::make_shared<const arma::vec>(y), \n                std::make_shared<const arma::mat>(values), \n                fill);\n        }\n    }\n}  // namespace interp\n\nnamespace oplc {\n\n    %extend Diffraction {\n        %ignore c(uint32_t) const;\n        %ignore k(uint32_t) const;\n        %ignore frq(uint32_t) const;\n        %ignore value(uint32_t, uint32_t) const;\n        %ignore cx(uint32_t) const;\n        %ignore cy(uint32_t) const;\n        %ignore kx(uint32_t) const;\n        %ignore ky(uint32_t) const;\n\n        %rename(_get_values) values() const;\n        %rename(_get_cxy) cxy() const;\n        \n        %rename(_get_cx) cx() const;\n        %rename(_get_cy) cy() const;\n\n        %rename(_get_frqx) frqx() const;\n        %rename(_get_frqy) frqy() const;\n        \n        %rename(_get_kx) kx() const;\n        %rename(_get_ky) ky() const;\n        \n        %pythoncode %{\n            __swig_getmethods__[\"values\"] = _get_values\n            __swig_getmethods__[\"cxy\"] = _get_cxy\n            \n            __swig_getmethods__[\"cx\"] = _get_cx\n            __swig_getmethods__[\"cy\"] = _get_cy\n\n            __swig_getmethods__[\"frqx\"] = _get_frqx\n            __swig_getmethods__[\"frqy\"] = _get_frqy\n            \n            __swig_getmethods__[\"kx\"] = _get_kx\n            __swig_getmethods__[\"ky\"] = _get_ky\n            if _newclass: \n                values = property(_get_values)\n                cxy = property(_get_cxy)\n\n                cx = property(_get_cx)\n                cy = property(_get_cy)\n                \n                frqx = property(_get_frqx)\n                frqy = property(_get_frqy)\n                \n                kx = property(_get_kx)\n                ky = property(_get_ky)\n        %}\n    }\n\n\n    %extend AbstractResistSimulations {    \n        %ignore x(uint32_t) const;\n        %ignore y(uint32_t) const;\n        %ignore z(uint32_t) const;\n\n        %rename(_get_type) type() const;\n        %rename(_get_x) x() const;\n        %rename(_get_y) y() const;\n        %rename(_get_z) z() const;\n        %rename(_has_x) has_x() const;\n        %rename(_has_y) has_y() const;\n        %rename(_has_z) has_z() const;\n        %rename(_axes) axes() const;\n\n        %pythoncode %{\n            __swig_getmethods__[\"type\"] = _get_type\n            __swig_getmethods__[\"x\"] = _get_x\n            __swig_getmethods__[\"y\"] = _get_y\n            __swig_getmethods__[\"z\"] = _get_z\n            __swig_getmethods__[\"has_x\"] = _has_x\n            __swig_getmethods__[\"has_y\"] = _has_y\n            __swig_getmethods__[\"has_z\"] = _has_z\n            __swig_getmethods__[\"axes\"] = _axes;\n            if _newclass:\n                type = property(_get_type)\n                x = property(_get_x)\n                y = property(_get_y)\n                z = property(_get_z)\n                has_x = property(_has_x)\n                has_y = property(_has_y)\n                has_z = property(_has_z)\n                axes = property(_axes)\n        %}\n    }\n\n\n    %extend ResistVolume {\n        %ignore value(uint32_t, uint32_t, uint32_t) const;\n        %rename(_get_values) values() const;\n        %pythoncode %{\n            __swig_getmethods__[\"values\"] = _get_values\n            if _newclass:\n                values = property(_get_values)\n        %}\n    }\n\n\n    %extend ResistProfile {\n        %rename(_get_polygons) polygons() const;\n        %pythoncode %{\n            __swig_getmethods__[\"values\"] = _get_polygons\n            if _newclass:\n                polygons = property(_get_polygons)\n        %}\n    }\n\n    %extend Mask {\n        %rename(__getitem__) at;\n        %rename(__len__) length;\n    };\n\n\n    %extend AbstractWaferLayer {\n        %rename(__str__) str;\n    };\n\n\n    %extend ResistWaferLayer {\n        static std::shared_ptr<ResistWaferLayer> cast(std::shared_ptr<AbstractWaferLayer> base) {\n            return std::dynamic_pointer_cast<ResistWaferLayer>(base);\n        }\n    }\n\n\n    %extend WaferStack {\n        %rename(__getitem__) operator[];\n    };\n    \n}  // namespace oplc\n\n\n%ignore _ContourBuilderIterator;\n%ignore _ContourEngine;\n\n\n/* Parse the header file to generate wrappers */\n%include \"opl_physc.h\"\n%include \"opl_interp.h\"\n%include \"opl_geometry.h\"\n%include \"opl_contours.h\"\n%include \"opl_capi.h\"\n%include \"opl_sim.h\"\n%include \"opl_log.h\"\n"
  },
  {
    "path": "OptolithiumC/plugins/CMakeLists.txt",
    "content": "CMAKE_MINIMUM_REQUIRED(VERSION 2.8)\nCMAKE_POLICY(SET CMP0015 NEW)\nIF (WIN32)\n  CMAKE_POLICY(SET CMP0054 OLD)\nENDIF()\n\nSET(CMAKE_BUILD_TYPE \"Release\")\nSET(BUILD_DIR \"build\")\n\nSET(CMAKE_USE_RELATIVE_PATHS ON)\nSET(CMAKE_SKIP_RPATH TRUE)\n\nSET(OPTOLITHIUMGUI_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/../../OptolithiumGui\")\n\nSET(src \"${CMAKE_CURRENT_SOURCE_DIR}/src\")\n\nINCLUDE_DIRECTORIES(\"../include\")\n\nMACRO(SUBDIRLIST result curdir)\n  FILE(GLOB children ABSOLUTE ${curdir} ${curdir}/*)\n  SET(dirlist \"\")\n  FOREACH(child_path ${children})\n  \tGET_FILENAME_COMPONENT(child \"${child_path}\" NAME)\n    IF((IS_DIRECTORY \"${curdir}/${child}\") AND NOT (${curdir} EQUAL \"${child}\"))\n        LIST(APPEND dirlist ${child})\n    ENDIF()\n  ENDFOREACH()\n  SET(${result} ${dirlist})\nENDMACRO()\n\nSUBDIRLIST(subdirs \"${src}\")\n\nFOREACH(plugins_type ${subdirs})\n\t# MESSAGE(STATUS \"Plugin Type = ${plugins_type}\")\n\tFILE(GLOB plugins_files ABSOLUTE \"${src}/${plugins_type}\" \"${src}/${plugins_type}/*.c\")\n\tFOREACH (plugin_path ${plugins_files})\n\t\tGET_FILENAME_COMPONENT(plugin_name \"${plugin_path}\" NAME_WE)\n\t\tSET(input_src \"${src}/${plugins_type}/${plugin_name}.c\")\n\t\tIF (EXISTS \"${input_src}\")\n\t\t\tMESSAGE(STATUS \"${plugins_type}: ${plugin_name}\")\n\t\t\tADD_LIBRARY(${plugin_name} SHARED \"${input_src}\")\n\t\t\tSET_TARGET_PROPERTIES(${plugin_name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY \"${BUILD_DIR}/${plugins_type}/\")\n\t\t\tINSTALL(\n                TARGETS ${plugin_name} \n                LIBRARY DESTINATION \"${OPTOLITHIUMGUI_DIR}/plugins/${plugins_type}/\"\n                RUNTIME DESTINATION \"${OPTOLITHIUMGUI_DIR}/plugins/${plugins_type}/\"\n            )\n\t\tENDIF()\n\tENDFOREACH()\nENDFOREACH()\n"
  },
  {
    "path": "OptolithiumC/plugins/src/dev_models/enhanced.c",
    "content": "/*\r\n *\r\n * This file is part of Optolithium lithography modelling software.\r\n *\r\n * Copyright (C) 2015 Alexei Gladkikh\r\n *\r\n * This software is dual-licensed: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 2 of the License, or\r\n * (at your option) any later version only for NON-COMMERCIAL usage.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program; if not, write to the Free Software\r\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n *\r\n * If you are interested in other licensing models, including a commercial-\r\n * license, please contact the author at gladkikhalexei@gmail.com\r\n *\r\n */\r\n\r\n#include <optolithium.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\ntypedef struct {\r\n\tdouble Rmax;\r\n\tdouble Rmin;\r\n\tdouble Rresin;\r\n\tdouble n;\r\n\tdouble l;\r\n} args_t;\r\n\r\nstatic double enhanced_model_expr(double pac, double depth, const void *args)\r\n{\r\n    const args_t *dev = (const args_t*) args;\r\n\r\n    double ki = dev->Rresin/dev->Rmin - 1;\r\n    double ke = dev->Rmax/dev->Rresin - 1;\r\n    double rate = dev->Rresin * (1 + ke * pow(1 - pac, dev->n)) / (1 + ki * pow(pac, dev->l));\r\n\r\n\treturn rate;\r\n};\r\n\r\nstatic const dev_model_arg_t args[] = {\r\n    {.name = \"Development Rmax (nm/s)\", .min = DBL(0.0), .max = NULL, .defv = 100.0},\r\n    {.name = \"Development Rmin (nm/s)\", .min = DBL(0.0), .max = NULL, .defv = 0.5},\r\n    {.name = \"Development Rresin (nm/s)\", .min = DBL(0.0), .max = NULL, .defv = 10.0},\r\n    {.name = \"Development n\", .min = DBL(1.0), .max = NULL, .defv = 4.0},\r\n    {.name = \"Development l\", .min = DBL(0.0), .max = NULL, .defv = 20.0},\r\n};\r\n\r\nstatic const dev_model_t development_model = {\r\n    .prolith_id = INT(2),\r\n    .name = \"Enhanced Model\",\r\n    .desc = \"Resist developing simulates using enhanced Mack's model\",\r\n    .expression = enhanced_model_expr,\r\n    .args_count = 5,\r\n    .args = &args,\r\n};\r\n\r\nDLL_PUBLIC plugin_descriptor_t PluginDescriptor = {\r\n    .plugin_type = PLUGIN_DEVELOPMENT_MODEL,\r\n    .plugin_entry = &development_model\r\n};\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n"
  },
  {
    "path": "OptolithiumC/plugins/src/dev_models/enhanced_notch.c",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#include <optolithium.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct {\n\tdouble Rmax;\n\tdouble Rmin;\n\tdouble n;\n\tdouble Mth_notch;\n\tdouble n_notch;\n    double S;\n} args_t;\n\n\nstatic double enhanced_notch_model_expr(double pac, double depth, const void *args)\n{\n    const args_t *dev = (const args_t*) args;\n\n\tdouble c = (dev->n_notch + 1)/( dev->n_notch-1)*pow(1 - dev->Mth_notch,  dev->n_notch);\n\tdouble p = pow(1 - pac,  dev->n_notch);\n\tdouble k = p*(c + 1)/(c + p);\n    double v = (1 - k) * (1 - k);\n\tdouble rate = dev->Rmax*pow(1 - pac, dev->n)*k + dev->Rmin*pow(dev->S*1E9, 1 - pac)*v;\n\n\treturn rate;\n};\n\nstatic const dev_model_arg_t args[] = {\n    {.name = \"Development Rmax (nm/s)\", .min = DBL(0.0), .max = NULL, .defv = 100.0},\n    {.name = \"Development Rmin (nm/s)\", .min = DBL(0.0), .max = NULL, .defv = 0.5},\n    {.name = \"Development n\", .min = DBL(1.0), .max = NULL, .defv = 1.5},\n    {.name = \"Development Notch Mth\", .min = NULL, .max = DBL(1.0), .defv = 0.5},\n    {.name = \"Development Notch n\", .min = DBL(1.0), .max = NULL, .defv = 10.0},\n    {.name = \"Development Se-9\", .min = NULL, .max = NULL, .defv = 0.15},\n};\n\nstatic const dev_model_t development_model = {\n    .prolith_id = NULL,\n    .name = \"Enhanced Notch Model\",\n    .desc = \"Resist developing simulates using the enhanced most sophisticated model\",\n    .expression = enhanced_notch_model_expr,\n    .args_count = 6,\n    .args = &args,\n};\n\nDLL_PUBLIC plugin_descriptor_t PluginDescriptor = {\n    .plugin_type = PLUGIN_DEVELOPMENT_MODEL,\n    .plugin_entry = &development_model\n};\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "OptolithiumC/plugins/src/dev_models/mack.c",
    "content": "/*\r\n *\r\n * This file is part of Optolithium lithography modelling software.\r\n *\r\n * Copyright (C) 2015 Alexei Gladkikh\r\n *\r\n * This software is dual-licensed: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 2 of the License, or\r\n * (at your option) any later version only for NON-COMMERCIAL usage.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program; if not, write to the Free Software\r\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n *\r\n * If you are interested in other licensing models, including a commercial-\r\n * license, please contact the author at gladkikhalexei@gmail.com\r\n *\r\n */\r\n\r\n#include <optolithium.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\ntypedef struct {\r\n\tdouble Rmax;\r\n\tdouble Rmin;\r\n\tdouble Mth;\r\n\tdouble n;\r\n} args_t;\r\n\r\nstatic double mack_model_expr(double pac, double depth, const void *args)\r\n{\r\n    const args_t *dev = (const args_t*) args;\r\n\r\n\tdouble a = (dev->n + 1)/(dev->n - 1) * pow(1 - dev->Mth, dev->n);\r\n\tdouble p = pow(1 - pac, dev->n);\r\n\tdouble rate = dev->Rmax * (a + 1) * p  / (a + p) + dev->Rmin;\r\n\r\n\treturn rate;\r\n};\r\n\r\nstatic const dev_model_arg_t args[] = {\r\n    {.name = \"Development Rmax (nm/s)\", .min = DBL(0.0), .max = NULL, .defv = 100.0},\r\n    {.name = \"Development Rmin (nm/s)\", .min = DBL(0.0), .max = NULL, .defv = 0.5},\r\n    {.name = \"Development Mth\", .min = NULL, .max = DBL(1.0), .defv = 0.5},\r\n    {.name = \"Development n\", .min = DBL(1.0), .max = NULL, .defv = 2.0},\r\n};\r\n\r\nstatic const dev_model_t development_model = {\r\n    .prolith_id = INT(1),\r\n    .name = \"Mack Model\",\r\n    .desc = \"Resist developing simulates using original Mack's model\",\r\n    .expression = mack_model_expr,\r\n    .args_count = 4,\r\n    .args = &args,\r\n};\r\n\r\nDLL_PUBLIC plugin_descriptor_t PluginDescriptor = {\r\n    .plugin_type = PLUGIN_DEVELOPMENT_MODEL,\r\n    .plugin_entry = &development_model\r\n};\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n"
  },
  {
    "path": "OptolithiumC/plugins/src/dev_models/notch.c",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#include <optolithium.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct {\n\tdouble Rmax;\n\tdouble Rmin;\n\tdouble n;\n\tdouble Mth_notch;\n\tdouble n_notch;\n} args_t;\n\nstatic double notch_model_expr(double pac, double depth, const void *args)\n{\n    const args_t *dev = (const args_t*) args;\n\n\tdouble c = (dev->n_notch + 1)/( dev->n_notch-1)*pow(1 - dev->Mth_notch,  dev->n_notch);\n\tdouble p = pow(1 - pac,  dev->n_notch);\n\tdouble k = p*(c + 1)/(c + p);\n\tdouble rate = dev->Rmax*pow(1 - pac, dev->n)*k + dev->Rmin;\n\n\treturn rate;\n};\n\nstatic const dev_model_arg_t args[] = {\n    {.name = \"Development Rmax (nm/s)\", .min = DBL(0.0), .max = NULL, .defv = 100.0},\n    {.name = \"Development Rmin (nm/s)\", .min = DBL(0.0), .max = NULL, .defv = 0.5},\n    {.name = \"Development n\", .min = DBL(1.0), .max = NULL, .defv = 1.5},\n    {.name = \"Development Notch Mth\", .min = NULL, .max = DBL(1.0), .defv = 0.5},\n    {.name = \"Development Notch n\", .min = DBL(1.0), .max = NULL, .defv = 10.0},\n};\n\nstatic const dev_model_t development_model = {\n    .prolith_id = INT(3),\n    .name = \"Notch Model\",\n    .desc = \"Resist developing simulates using the most sophisticated model\",\n    .expression = notch_model_expr,\n    .args_count = 5,\n    .args = &args,\n};\n\nDLL_PUBLIC plugin_descriptor_t PluginDescriptor = {\n    .plugin_type = PLUGIN_DEVELOPMENT_MODEL,\n    .plugin_entry = &development_model\n};\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "OptolithiumC/plugins/src/dev_models/notch_depth.c",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#include <optolithium.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct {\n\tdouble Rmax;\n\tdouble Rmin;\n\tdouble n;\n\tdouble Mth_notch;\n\tdouble n_notch;\n    double dep_inh;\n} args_t;\n\nstatic double notch_model_expr(double pac, double depth, const void *args)\n{\n    const args_t *dev = (const args_t*) args;\n\n\tdouble c = (dev->n_notch + 1)/( dev->n_notch-1)*pow(1 - dev->Mth_notch,  dev->n_notch);\n\tdouble p = pow(1 - pac,  dev->n_notch);\n\tdouble k = p*(c + 1)/(c + p);\n\tdouble rate = dev->Rmax*pow(1 - pac, dev->n)*k + dev->Rmin;\n\n\treturn rate * exp(-dev->dep_inh*depth);\n};\n\nstatic const dev_model_arg_t args[] = {\n    {.name = \"Development Rmax (nm/s)\", .min = DBL(0.0), .max = NULL, .defv = 100.0},\n    {.name = \"Development Rmin (nm/s)\", .min = DBL(0.0), .max = NULL, .defv = 0.5},\n    {.name = \"Development n\", .min = DBL(1.0), .max = NULL, .defv = 1.5},\n    {.name = \"Development Notch Mth\", .min = NULL, .max = DBL(1.0), .defv = 0.5},\n    {.name = \"Development Notch n\", .min = DBL(1.0), .max = NULL, .defv = 10.0},\n    {.name = \"Depth inhibition\", .min = DBL(0.0), .max = DBL(1.0), .defv = 0.5},\n};\n\nstatic const dev_model_t development_model = {\n    .prolith_id = NULL,\n    .name = \"Notch Model with Depth Dependence\",\n    .desc = \"Resist developing simulates using the most sophisticated model\",\n    .expression = notch_model_expr,\n    .args_count = 6,\n    .args = &args,\n};\n\nDLL_PUBLIC plugin_descriptor_t PluginDescriptor = {\n    .plugin_type = PLUGIN_DEVELOPMENT_MODEL,\n    .plugin_entry = &development_model\n};\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "OptolithiumC/plugins/src/masks/fiveBarLine.c",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#include <optolithium.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct {\n    double feature_width;\n    double feature_space;\n    double pitch_x;\n    double pitch_y;\n} prms_t;\n\n\n#define REGION_COUNT 5\n#define POINTS_COUNT 4\n\n#define X_OFFSET 100.0\n#define Y_OFFSET 500.0\n\n\nvoid allocate_memory(mask_t *mask, const prms_t *prms)\n{\n    int k = 0;\n    \n    if (mask->regions_count == 0)\n    {\n        mask->regions_count = REGION_COUNT;\n        mask->regions = calloc(mask->regions_count, sizeof(mask_region_t));\n        \n        for (k = 0; k < REGION_COUNT; k++)\n        {\n            mask->regions[k].length = POINTS_COUNT;\n            mask->regions[k].points = calloc(mask->regions[k].length, sizeof(mask_point_t));\n        }\n    }\n    \n    if (mask->boundary.length == 0)\n    {\n        mask->boundary.length = 4;\n        mask->boundary.points = calloc(4, sizeof(mask_point_t));\n        \n        mask->boundary.transmittance = 1.0;\n        mask->boundary.phase = 0.0;\n    }   \n}\n\nvoid create_rectangle(mask_point_t *points, double x, double y, double width, double height)\n{\n    points[0].x = x;\n    points[0].y = y;\n    \n    points[1].x = x;\n    points[1].y = y + height;\n    \n    points[2].x = x + width;\n    points[2].y = y + height;\n    \n    points[3].x = x + width;\n    points[3].y = y;\n}\n\nvoid create_centered_rectangle(mask_point_t *points, double cx, double cy, double width, double height)\n{\n    create_rectangle(points, cx - width/2, cy - height/2, width, height);\n}\n\nvoid set_pitch(mask_t *mask, prms_t *prms)\n{\n    double total_x = REGION_COUNT * (prms->feature_width + prms->feature_space) + X_OFFSET;\n    \n    if (prms->pitch_x < total_x)\n        prms->pitch_x = total_x;\n        \n    create_centered_rectangle(mask->boundary.points, 0.0, 0.0, prms->pitch_x, prms->pitch_y);\n}\n\nvoid create_primary_line(mask_region_t *region, const prms_t *prms)\n{\n    double y0 = Y_OFFSET - prms->pitch_y/2;\n    double y1 = prms->pitch_y/2 - Y_OFFSET;\n    double height = y1 - y0;\n    create_rectangle(region->points, -prms->feature_width/2, y0, prms->feature_width, height);\n}\n\nvoid create_secondary_lines(mask_region_t *regions, const prms_t *prms)\n{\n    int k = 0;\n    \n    double y0 = Y_OFFSET - prms->pitch_y/2;\n    double y1 = 0.0;\n    double height = y1 - y0;\n    \n    double dx = prms->feature_width/2 + prms->feature_space;\n    \n    for (k = 0; k < (REGION_COUNT - 1)/2; k++)\n    {\n        double x0 = dx + k * (prms->feature_width + prms->feature_space);\n        create_rectangle(regions[2*k].points, x0, y0, prms->feature_width, height);\n        create_rectangle(regions[2*k+1].points, -x0 - prms->feature_width, y0, prms->feature_width, height);\n    }\n}\n\nstatic int create_mask(mask_t *mask, void *parameters)\n{\n    prms_t *prms = (prms_t*) parameters;\n    \n    allocate_memory(mask, prms);\n    set_pitch(mask, prms);\n    create_primary_line(&mask->regions[0], prms);\n    create_secondary_lines(&mask->regions[1], prms);\n    \n    return 0;\n};\n\nstatic const mask_parameter_t parameters[] = {\n    {.name = \"Feature Width (nm)\", .min = DBL(0.0), .max = NULL, .defv = 250.0},\n    {.name = \"Feature Space (nm)\", .min = DBL(0.0), .max = NULL, .defv = 500.0},\n    {.name = \"Pitch X (nm)\", .min = DBL(0.0), .max = NULL, .defv = 2000.0},\n    {.name = \"Pitch Y (nm)\", .min = DBL(0.0), .max = NULL, .defv = 8000.0},\n};\n\nstatic const mask_plugin_t mask_plugin = {\n    .name = \"2D Five Bar Lines\",\n    .desc = \"Two dimensions five bar lines features\",\n    .type = MASK_TYPE_2D,\n    .create = create_mask,\n    .parameters_count = 4,\n    .parameters = &parameters,\n};\n\nDLL_PUBLIC plugin_descriptor_t PluginDescriptor = {\n    .plugin_type = PLUGIN_MASK,\n    .plugin_entry = &mask_plugin\n};\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "OptolithiumC/plugins/src/masks/line1D.c",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#include <optolithium.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct {\n    double feature_width;\n    double pitch;\n} prms_t;\n\nint set_mask_parameters(mask_t *mask, const void *parameters)\n{\n    const prms_t *prms = (const prms_t*) parameters;\n    \n    // Boundary half pitch in each direction\n    mask->boundary.points[0].x = -prms->pitch/2;\n    mask->boundary.points[1].x = prms->pitch/2;\n    \n    // Feature half width in each direction\n    mask->regions[0].points[0].x = -prms->feature_width/2;\n    mask->regions[0].points[1].x = prms->feature_width/2;\n    \n    // Black line\n    mask->regions[0].transmittance = 0.0;\n    mask->regions[0].phase = 0.0;\n    \n    return 0;\n}\n\nstatic int create_mask_line_1d(mask_t *mask, void *parameters)\n{\n    if (mask->regions_count == 0)\n    {\n        mask->regions_count = 1;\n        mask->regions = calloc(mask->regions_count, sizeof(mask_region_t));\n        \n        mask->regions[0].length = 2;\n        mask->regions[0].points = calloc(2, sizeof(mask_point_t));\n    }\n    \n    if (mask->boundary.length == 0)\n    {\n        mask->boundary.length = 2;\n        mask->boundary.points = calloc(2, sizeof(mask_point_t));\n        \n        mask->boundary.transmittance = 1.0;\n        mask->boundary.phase = 0.0;\n    }\n    \n    return set_mask_parameters(mask, parameters);\n};\n\nstatic const mask_parameter_t parameters[] = {\n    {.name = \"Feature Width (nm)\", .min = DBL(0.0), .max = NULL, .defv = 250.0},\n    {.name = \"Pitch (nm)\", .min = DBL(0.0), .max = NULL, .defv = 800.0}\n};\n\nstatic const mask_plugin_t mask = {\n    .name = \"1D Binary - Line\",\n    .desc = \"One dimensional binary line feature\",\n    .type = MASK_TYPE_1D,\n    .create = create_mask_line_1d,\n    .parameters_count = 2,\n    .parameters = &parameters,\n};\n\nDLL_PUBLIC plugin_descriptor_t PluginDescriptor = {\n    .plugin_type = PLUGIN_MASK,\n    .plugin_entry = &mask\n};\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "OptolithiumC/plugins/src/masks/line1D_SRAF.c",
    "content": "/*\r\n *\r\n * This file is part of Optolithium lithography modelling software.\r\n *\r\n * Copyright (C) 2015 Alexei Gladkikh\r\n *\r\n * This software is dual-licensed: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 2 of the License, or\r\n * (at your option) any later version only for NON-COMMERCIAL usage.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program; if not, write to the Free Software\r\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n *\r\n * If you are interested in other licensing models, including a commercial-\r\n * license, please contact the author at gladkikhalexei@gmail.com\r\n *\r\n */\r\n\r\n#include <optolithium.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\ntypedef struct {\r\n    double feature_width;\r\n    double pitch;\r\n    double number_of_srafs;\r\n    double sraf_size;\r\n    double sraf_space2main;\r\n    double sraf_space2sraf;\r\n} prms_t;\r\n\r\nint get_number_of_regions(int number_of_srafs)\r\n{\r\n    int srafs_regions = (number_of_srafs % 2 == 0) ? number_of_srafs : (number_of_srafs + 1);\r\n    return srafs_regions + 1;\r\n}\r\n\r\nvoid allocate_memory(mask_t* mask, const prms_t* prms)\r\n{\r\n    int k = 0;\r\n    \r\n    int number_of_srafs = (int)prms->number_of_srafs;\r\n    \r\n    for (k = 0; k < mask->regions_count; k++)\r\n        free(mask->regions[k].points);\r\n    free(mask->regions);\r\n    \r\n    mask->regions_count = get_number_of_regions(number_of_srafs);\r\n    mask->regions = calloc(mask->regions_count, sizeof(mask_region_t));\r\n        \r\n    for (k = 0; k < mask->regions_count; k++)\r\n    {\r\n        mask->regions[k].length = 2;\r\n        mask->regions[k].points = calloc(2, sizeof(mask_point_t));\r\n    }\r\n    \r\n    if (mask->boundary.length == 0)\r\n    {\r\n        mask->boundary.length = 2;\r\n        mask->boundary.points = calloc(2, sizeof(mask_point_t));\r\n        \r\n        mask->boundary.transmittance = 1.0;\r\n        mask->boundary.phase = 0.0;\r\n    }\r\n}\r\n\r\nvoid set_pitch(mask_t *mask, const prms_t *prms)\r\n{\r\n    // Boundary half pitch in each direction\r\n    mask->boundary.points[0].x = -prms->pitch/2;\r\n    mask->boundary.points[1].x = prms->pitch/2;\r\n}\r\n\r\nvoid create_primary_line(mask_region_t *region, const prms_t *prms)\r\n{    \r\n    // Feature half width in each direction\r\n    region->points[0].x = -prms->feature_width/2;\r\n    region->points[1].x = prms->feature_width/2;\r\n    \r\n    // Black line\r\n    region->transmittance = 0.0;\r\n    region->phase = 0.0;\r\n}\r\n\r\nvoid create_odd_srafs(mask_region_t *left, mask_region_t *right, const prms_t *prms)\r\n{\r\n    left->points[0].x = -prms->pitch/2;\r\n    left->points[1].x = -prms->pitch/2 + prms->sraf_size/2;\r\n    \r\n    right->points[0].x = prms->pitch/2 - prms->sraf_size/2;\r\n    right->points[1].x = prms->pitch/2;\r\n}\r\n\r\nvoid create_srafs(mask_region_t *regions, const prms_t *prms, int count)\r\n{\r\n    int k = 0;\r\n    \r\n    for (k = 0; k < count/2; k++)\r\n    {\r\n        double x0 = prms->feature_width/2 + prms->sraf_space2main + k * (prms->sraf_size + prms->sraf_space2sraf);\r\n        \r\n        regions[2*k].points[0].x = x0;\r\n        regions[2*k].points[1].x = x0 + prms->sraf_size;\r\n        \r\n        regions[2*k+1].points[0].x = -x0;\r\n        regions[2*k+1].points[1].x = -(x0 + prms->sraf_size);\r\n    }\r\n}\r\n\r\nstatic int create_mask_line_1d_sraf(mask_t *mask, void *parameters)\r\n{\r\n    int k = 0;\r\n    prms_t *prms = (prms_t*) parameters;\r\n    \r\n    allocate_memory(mask, prms);\r\n    \r\n    create_primary_line(&mask->regions[0], prms);\r\n    \r\n    int number_of_srafs = (int) prms->number_of_srafs;\r\n    \r\n    double total_sraf_size = number_of_srafs * prms->sraf_size;\r\n    double total_sraf_space = (number_of_srafs - 1) * prms->sraf_space2sraf + 2 * prms->sraf_space2main;\r\n    \r\n    if (number_of_srafs % 2 != 0)\r\n    {\r\n        prms->pitch = prms->feature_width + total_sraf_size + total_sraf_space;\r\n\r\n        create_odd_srafs(&mask->regions[1], &mask->regions[2], prms);\r\n        create_srafs(&mask->regions[3], prms, number_of_srafs - 1);\r\n    }\r\n    else\r\n    {\r\n        //double total_sraf_space = number_of_srafs * prms->sraf_space2sraf + 2 * prms->sraf_space2main;\r\n        double required_pitch = prms->feature_width + total_sraf_space + total_sraf_size;\r\n        \r\n        if (prms->pitch < required_pitch)\r\n            prms->pitch = required_pitch;\r\n        create_srafs(&mask->regions[1], prms, number_of_srafs);\r\n    }\r\n    \r\n    set_pitch(mask, prms);\r\n    \r\n    return 0;\r\n};\r\n\r\nstatic const mask_parameter_t parameters[] = {\r\n    {.name = \"Feature Width (nm)\", .min = DBL(0.0), .max = NULL, .defv = 250.0},\r\n    {.name = \"Pitch (nm)\", .min = DBL(0.0), .max = NULL, .defv = 800.0},\r\n    {.name = \"Number Of SRAFs\", .min = DBL(1), .max = DBL(6), .defv = 2.0},\r\n    {.name = \"SRAF Size (nm)\", .min = DBL(1.0), .max = NULL, .defv = 80.0},\r\n    {.name = \"SRAF Space to Primary (nm)\", .min = DBL(1.0), .max = NULL, .defv = 300.0},\r\n    {.name = \"Space between SRAF's (nm)\", .min = DBL(1.0), .max = NULL, .defv = 100.0}\r\n};\r\n\r\nstatic const mask_plugin_t mask = {\r\n    .name = \"1D Binary SRAF - Line\",\r\n    .desc = \"One dimensional binary line feature with subresolution features\",\r\n    .type = MASK_TYPE_1D,\r\n    .create = create_mask_line_1d_sraf,\r\n    .parameters_count = 6,\r\n    .parameters = &parameters,\r\n};\r\n\r\nDLL_PUBLIC plugin_descriptor_t PluginDescriptor = {\r\n    .plugin_type = PLUGIN_MASK,\r\n    .plugin_entry = &mask\r\n};\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n"
  },
  {
    "path": "OptolithiumC/plugins/src/masks/space1D.c",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#include <optolithium.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct {\n    double feature_width;\n    double pitch;\n} prms_t;\n\nint set_mask_parameters(mask_t *mask, const void *parameters)\n{\n    const prms_t *prms = (const prms_t*) parameters;\n    \n    // Boundary half pitch in each direction\n    mask->boundary.points[0].x = -prms->pitch/2;\n    mask->boundary.points[1].x = prms->pitch/2;\n    \n    // Feature half width in each direction\n    mask->regions[0].points[0].x = -prms->feature_width/2;\n    mask->regions[0].points[1].x = prms->feature_width/2;\n    \n    // Space line\n    mask->regions[0].transmittance = 1.0;\n    mask->regions[0].phase = 0.0;\n    \n    return 0;\n}\n\nstatic int create_mask_space_1d(mask_t *mask, void *parameters)\n{\n    if (mask->regions_count == 0)\n    {\n        mask->regions_count = 1;\n        mask->regions = calloc(mask->regions_count, sizeof(mask_region_t));\n        \n        mask->regions[0].length = 2;\n        mask->regions[0].points = calloc(2, sizeof(mask_point_t));\n    }\n    \n    if (mask->boundary.length == 0)\n    {\n        mask->boundary.length = 2;\n        mask->boundary.points = calloc(2, sizeof(mask_point_t));\n        \n        mask->boundary.transmittance = 0.0;\n        mask->boundary.phase = 0.0;\n    }\n    \n    return set_mask_parameters(mask, parameters);\n};\n\nstatic const mask_parameter_t parameters[] = {\n    {.name = \"Feature Width (nm)\", .min = DBL(0.0), .max = NULL, .defv = 250.0},\n    {.name = \"Pitch (nm)\", .min = DBL(0.0), .max = NULL, .defv = 800.0},\n    {.name = \"Transmittance\", .min = DBL(0.0), .max = DBL(1.0), .defv = 1.0},\n    {.name = \"Phase (deg.)\", .min = DBL(-180.0), .max = DBL(180.0), .defv = 0.0},\n};\n\nstatic const mask_plugin_t mask = {\n    .name = \"1D Binary - Space\",\n    .desc = \"One dimensional binary space feature\",\n    .type = MASK_TYPE_1D,\n    .create = create_mask_space_1d,\n    .parameters_count = 2,\n    .parameters = &parameters,\n};\n\nDLL_PUBLIC plugin_descriptor_t PluginDescriptor = {\n    .plugin_type = PLUGIN_MASK,\n    .plugin_entry = &mask\n};\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "OptolithiumC/plugins/src/pupil_filters/central_obscuration.c",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#include <optolithium.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct {\n\tdouble radius;\n} args_t;\n\n#define PRECISION 0.001\n\ninline double round_to(double value, double precision) {\n    return round(value / precision) * precision;\n};\n\ninline double squared_distance(double x, double y) {\n    return round_to(x, PRECISION) * round_to(x, PRECISION) + round_to(y, PRECISION) * round_to(y, PRECISION);\n}\n\nstatic double _Complex central_obscuration_pupil(double sx, double sy, const void *args) {\n    const args_t *prms = (const args_t*) args;\n    double sxy = squared_distance(sx, sy);\n    double squared_radius = prms->radius * prms->radius;\n\treturn (double _Complex)(sxy > squared_radius);\n    if (sxy > squared_radius) {\n        return 1.0;\n    } else {\n        return 0.0;\n    }\n};\n\nstatic const source_shape_arg_t args[] = {\n    {.name = \"Radius\", .min = DBL(0.0), .max = DBL(1.0), .defv = 0.1},\n};\n\nstatic const pupil_filter_plugin_t pupil_filter_plugin = {\n    .name = \"Central Obscuration\",\n    .desc = \"Ideal central pupil zone obscuration\",\n    .expression = central_obscuration_pupil,\n    .args_count = 1,\n    .args = &args,\n};\n\nDLL_PUBLIC plugin_descriptor_t PluginDescriptor = {\n    .plugin_type = PLUGIN_PUPIL_FILTER,\n    .plugin_entry = &pupil_filter_plugin\n};\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "OptolithiumC/plugins/src/source_shapes/annular.c",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#include <optolithium.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct {\n\tdouble sigma_in;\n\tdouble sigma_out;\n} args_t;\n\n#define PRECISION 0.001\n\ninline double round_to(double value, double precision) {\n    return round(value / precision) * precision;\n};\n\ninline double squared_distance(double x, double y) {\n    return round_to(x, PRECISION) * round_to(x, PRECISION) + round_to(y, PRECISION) * round_to(y, PRECISION);\n}\n\nstatic double annular_source_shape(double sx, double sy, const void *args) {\n    const args_t *prms = (const args_t*) args;\n    double sxy = squared_distance(sx, sy);\n    double squared_inner = prms->sigma_in * prms->sigma_in;\n    double squared_outer = prms->sigma_out * prms->sigma_out;\n\treturn (double)(sxy >= squared_inner && sxy <= squared_outer);\n};\n\nstatic const source_shape_arg_t args[] = {\n    {.name = \"Sigma Inner\", .min = DBL(0.0), .max = DBL(1.0), .defv = 0.3},\n    {.name = \"Sigma Outer\", .min = DBL(0.0), .max = DBL(1.0), .defv = 0.8},\n};\n\nstatic const source_shape_plugin_t source_shape_plugin = {\n    .name = \"Annular\",\n    .desc = \"Ideal annular source shape\",\n    .expression = annular_source_shape,\n    .args_count = 2,\n    .args = &args,\n};\n\nDLL_PUBLIC plugin_descriptor_t PluginDescriptor = {\n    .plugin_type = PLUGIN_SOURCE_SHAPE,\n    .plugin_entry = &source_shape_plugin\n};\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "OptolithiumC/plugins/src/source_shapes/coherent.c",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#include <optolithium.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct {\n\tdouble tilt_x;\n\tdouble tilt_y;\n} args_t;\n\n#define PRECISION 0.001\n\ninline double round_to(double value, double precision) {\n    return round(value / precision) * precision;\n};\n\nstatic double coherent_source_shape(double sx, double sy, const void *args) {\n    const args_t *prms = (const args_t*) args;\n\treturn (double)(\n        round_to(sx, 0.001) == round_to(prms->tilt_x, 0.001) && \n        round_to(sy, 0.001) == round_to(prms->tilt_y, 0.001)\n    );\n};\n\nstatic const source_shape_arg_t args[] = {\n    {.name = \"Tilt X\", .min = DBL(-1.0), .max = DBL(1.0), .defv = 0.0},\n    {.name = \"Tilt Y\", .min = DBL(-1.0), .max = DBL(1.0), .defv = 0.0},\n};\n\nstatic const source_shape_plugin_t source_shape_plugin = {\n    .name = \"Coherent\",\n    .desc = \"Ideal model of fully spatial coherent source shape\",\n    .expression = coherent_source_shape,\n    .args_count = 2,\n    .args = &args,\n};\n\nDLL_PUBLIC plugin_descriptor_t PluginDescriptor = {\n    .plugin_type = PLUGIN_SOURCE_SHAPE,\n    .plugin_entry = &source_shape_plugin\n};\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "OptolithiumC/plugins/src/source_shapes/convenient.c",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#include <optolithium.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct {\n\tdouble sigma;\n} args_t;\n\n#define PRECISION 0.001\n\ninline double round_to(double value, double precision) {\n    return round(value / precision) * precision;\n};\n\ninline double squared_distance(double x, double y) {\n    return round_to(x, PRECISION) * round_to(x, PRECISION) + round_to(y, PRECISION) * round_to(y, PRECISION);\n}\n\nstatic double convenient_source_shape(double sx, double sy, const void *args) {\n    const args_t *prms = (const args_t*) args;\n    double sxy = squared_distance(sx, sy);\n    double squared_sigma = prms->sigma * prms->sigma;\n\treturn (double)(sxy <= squared_sigma);\n};\n\nstatic const source_shape_arg_t args[] = {\n    {.name = \"Sigma\", .min = DBL(0.0), .max = DBL(1.0), .defv = 0.5},\n};\n\nstatic const source_shape_plugin_t source_shape_plugin = {\n    .name = \"Convenient\",\n    .desc = \"Ideal convenient source shape\",\n    .expression = convenient_source_shape,\n    .args_count = 1,\n    .args = &args,\n};\n\nDLL_PUBLIC plugin_descriptor_t PluginDescriptor = {\n    .plugin_type = PLUGIN_SOURCE_SHAPE,\n    .plugin_entry = &source_shape_plugin\n};\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "OptolithiumC/src/opl_capi.cpp",
    "content": "/*\r\n *\r\n * This file is part of Optolithium lithography modelling software.\r\n *\r\n * Copyright (C) 2015 Alexei Gladkikh\r\n *\r\n * This software is dual-licensed: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 2 of the License, or\r\n * (at your option) any later version only for NON-COMMERCIAL usage.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program; if not, write to the Free Software\r\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n *\r\n * If you are interested in other licensing models, including a commercial-\r\n * license, please contact the author at gladkikhalexei@gmail.com\r\n *\r\n */\r\n\r\n#include \"opl_capi.h\"\r\n\r\nnamespace oplc {\r\n\r\n    // ========================================= AbstractResistSimulations ========================================== //\r\n\r\n    std::shared_ptr<arma::vec> AbstractResistSimulations::x(void) const {\r\n        return this->_x;\r\n    }\r\n\r\n    std::shared_ptr<arma::vec> AbstractResistSimulations::y(void) const {\r\n        return this->_y;\r\n    }\r\n\r\n    std::shared_ptr<arma::vec> AbstractResistSimulations::z(void) const {\r\n        return this->_z;\r\n    }\r\n\r\n    double AbstractResistSimulations::x(uint32_t k) const {\r\n        return (*this->_x)(k);\r\n    }\r\n\r\n    double AbstractResistSimulations::y(uint32_t k) const {\r\n        return (*this->_y)(k);\r\n    }\r\n\r\n    double AbstractResistSimulations::z(uint32_t k) const {\r\n        return (*this->_z)(k);\r\n    }\r\n\r\n    bool AbstractResistSimulations::has_x(void) const {\r\n        return this->_x->n_elem > 1;\r\n    }\r\n\r\n    bool AbstractResistSimulations::has_y(void) const {\r\n        return this->_y->n_elem > 1;\r\n    }\r\n\r\n    bool AbstractResistSimulations::has_z(void) const {\r\n        return this->_z->n_elem > 1;\r\n    }\r\n\r\n    double AbstractResistSimulations::stepx(void) const {\r\n        return this->_stepx;\r\n    }\r\n\r\n    double AbstractResistSimulations::stepy(void) const {\r\n        return this->_stepy;\r\n    }\r\n\r\n    double AbstractResistSimulations::stepz(void) const {\r\n        return this->_stepz;\r\n    }\r\n\r\n    resist_volume_type_t AbstractResistSimulations::axes(void) const {\r\n        uint8_t has_z = static_cast<uint8_t>(this->has_z()) << 2;\r\n        uint8_t has_y = static_cast<uint8_t>(this->has_y()) << 1;\r\n        uint8_t has_x = static_cast<uint8_t>(this->has_x());\r\n        return static_cast<resist_volume_type_t>(has_z | has_y | has_x);\r\n    }\r\n\r\n\r\n    // ================================================ ResistVolume ================================================ //\r\n\r\n\r\n    // Initialization for 2D/3D cases (e.g. Image in Resist, Latent Image, PAC, Development Rates)\r\n    ResistVolume::ResistVolume(\r\n        const RectangleGeometry& boundary, double thickness, double desired_stepxy, double desired_stepz) :\r\n        boundary(boundary), thickness(thickness), desired_stepxy(desired_stepxy), desired_stepz(desired_stepz) {\r\n\r\n        Sizes sizes = this->boundary.sizes();\r\n\r\n        this->_stepx = ResistVolume::_calc_lateral_step(sizes.x, desired_stepxy);\r\n        this->_stepy = ResistVolume::_calc_lateral_step(sizes.y, desired_stepxy);\r\n        this->_stepz = ResistVolume::_calc_normal_step(thickness, desired_stepz);\r\n\r\n        // VLOG(4) << \"Step X = \" << this->_stepx << \" Step Y = \" << this->_stepy << \" Step Z = \" << this->_stepz;\r\n\r\n        uint32_t row = ResistVolume::_get_count(sizes.y, this->_stepy, 1);\r\n        uint32_t col = ResistVolume::_get_count(sizes.x, this->_stepx, 1);\r\n        uint32_t slices =  ResistVolume::_get_count(thickness, this->_stepz);\r\n\r\n        if (slices != 1) {\r\n            slices++;\r\n        }\r\n\r\n        // VLOG(4) << \"row = \" << row << \" col = \" << col << \" slices = \" << slices;\r\n\r\n        this->_values = std::make_shared<arma::cube>(row, col, slices);\r\n        this->_x = std::make_shared<arma::vec>(col);\r\n        this->_y = std::make_shared<arma::vec>(row);\r\n        this->_z = std::make_shared<arma::vec>(slices);\r\n\r\n        const Point2d& left_bottom = this->boundary.left_bottom();\r\n\r\n        ResistVolume::_init_vector(*this->_x, left_bottom.x, this->_stepx);\r\n        ResistVolume::_init_vector(*this->_y, left_bottom.y, this->_stepy);\r\n        ResistVolume::_init_vector(*this->_z, thickness, -this->_stepz);\r\n    }\r\n\r\n    // Initialization for 1D/2D cases (e.g. for AerialImage)\r\n    ResistVolume::ResistVolume(const RectangleGeometry& boundary, double desired_step) : \r\n        ResistVolume(boundary, 0.0, desired_step, 0.0) { }\r\n\r\n    ResistVolume::ResistVolume(const ResistVolume& other, bool copydata) :\r\n        boundary(other.boundary), thickness(other.thickness),\r\n        desired_stepxy(other.desired_stepxy), desired_stepz(other.desired_stepz) {\r\n        this->_stepx = other._stepx;\r\n        this->_stepy = other._stepy;\r\n        this->_stepz = other._stepz;\r\n        this->_x = std::make_shared<arma::vec>(*other._x);\r\n        this->_y = std::make_shared<arma::vec>(*other._y);\r\n        this->_z = std::make_shared<arma::vec>(*other._z);\r\n        if (copydata) {\r\n            this->_values = std::make_shared<arma::cube>(\r\n                    other._values->n_rows, other._values->n_cols, other._values->n_slices);\r\n        } else {\r\n            this->_values = std::make_shared<arma::cube>(*other._values);\r\n        }\r\n    }\r\n\r\n    std::shared_ptr<arma::cube> ResistVolume::values(void) const {\r\n        return this->_values;\r\n    }\r\n\r\n    double& ResistVolume::value(uint32_t u, uint32_t v, uint32_t k) const {\r\n        return (*this->_values)(u, v, k);\r\n    }\r\n\r\n    resist_simulations_t ResistVolume::type(void) const {\r\n        return RESIST_VOLUME;\r\n    }\r\n\r\n\r\n    // ================================================ ResistProfile =============================================== //\r\n\r\n\r\n    ResistProfile::ResistProfile(SharedResistVolume volume, double level) {\r\n        this->_stepx = volume->stepx();\r\n        this->_stepy = volume->stepy();\r\n        this->_stepz = volume->stepz();\r\n        this->_x = std::make_shared<arma::vec>(*volume->x());\r\n        this->_y = std::make_shared<arma::vec>(*volume->y());\r\n        this->_z = std::make_shared<arma::vec>(*volume->z());\r\n\r\n        if (this->has_x() && this->has_y()) {\r\n            throw std::invalid_argument(\"Can't create resist profile from 3D resist volume data\");\r\n        } else if (this->has_x()) {\r\n            const arma::mat& values = volume->values()->tube(arma::span(0, 0), arma::span::all);\r\n            this->_polygons = contours::contours(*this->_x, *this->_z, misc::rot90(values), level, true);\r\n        } else if (this->has_y()) {\r\n            const arma::mat& values = volume->values()->tube(arma::span::all, arma::span(0, 0));\r\n            this->_polygons = contours::contours(*this->_y, *this->_z, misc::rot90(values), level, true);\r\n        } else {\r\n            throw std::invalid_argument(\"Can't create resist profile from empty resist volume data\");\r\n        }\r\n    }\r\n\r\n    ArrayOfSharedPolygons ResistProfile::polygons(void) const {\r\n        return this->_polygons;\r\n    }\r\n\r\n    resist_simulations_t ResistProfile::type(void) const {\r\n        return RESIST_PROFILE;\r\n    }\r\n\r\n\r\n    // ============================================== AbstractGeometry ============================================== //\r\n\r\n\r\n    double AbstractMaskGeometry::transmittance(void) const {\r\n        return this->_transmittance;\r\n    }\r\n\r\n    double AbstractMaskGeometry::phase(void) const {\r\n        return this->_phase;\r\n    }\r\n\r\n    bool AbstractMaskGeometry::is_mask(void) const {\r\n        return true;\r\n    }\r\n\r\n    // Effective transmittance of the region\r\n    arma::cx_double AbstractMaskGeometry::etransmit(void) {\r\n        return _etransmit(this->_transmittance, this->_phase);\r\n    }\r\n\r\n    bool AbstractMaskGeometry::operator==(const AbstractGeometry& other) const {\r\n        if (!other.is_mask()) {\r\n            return false;\r\n        } else {\r\n            const AbstractMaskGeometry* p = dynamic_cast<const AbstractMaskGeometry*>(&other);\r\n            return this->_transmittance == p->_transmittance && this->_phase == p->_phase;\r\n        }\r\n    }\r\n\r\n\r\n    // ==================================================== Mask ==================================================== //\r\n\r\n\r\n    // Correct mask region according to diffraction calculation requirements\r\n    SharedRegion Mask::_make_region(ConstSharedRegion region, const Point2d& center_offset) {\r\n        auto result = std::make_shared<Region>(*region);\r\n        result->set_bypass(CW);\r\n        for (auto edge : *result) {\r\n            edge->org -= center_offset;\r\n            edge->dst -= center_offset;\r\n        }\r\n        return result;\r\n    }\r\n\r\n    Mask::Mask(const ArrayOfSharedRegions& regions, SharedBox boundary) {\r\n        const Point2d center_offset = boundary->left_bottom() + (boundary->right_top() - boundary->left_bottom()) / 2.0;\r\n        for (auto region : regions) {\r\n            this->_regions.push_back(Mask::_make_region(region, center_offset));\r\n        }\r\n        auto lb = boundary->left_bottom() - center_offset;\r\n        auto rt = boundary->right_top() - center_offset;\r\n        this->_boundary = std::make_shared<Box>(lb, rt, boundary->transmittance(), boundary->phase());\r\n        this->_sizes = this->_boundary->sizes();\r\n    }\r\n\r\n    Mask::Mask(const Mask& other) {\r\n        for (auto region : other) {\r\n            this->_regions.push_back(std::make_shared<Region>(*region));\r\n        }\r\n        this->_boundary = std::make_shared<Box>(*other._boundary);\r\n        this->_sizes = this->_boundary->sizes();\r\n    }\r\n\r\n    SharedBox Mask::boundary(void) const {\r\n        return this->_boundary;\r\n    }\r\n\r\n    Sizes Mask::pitch(void) const {\r\n        return this->_sizes;\r\n    }\r\n\r\n    bool Mask::is_opaque(void) const {\r\n        return this->_boundary->transmittance() == 0.0;\r\n    }\r\n\r\n    bool Mask::is_clear(void) const {\r\n        return !this->is_opaque();\r\n    }\r\n\r\n    bool Mask::is_bad(void) const {\r\n        return this->_sizes.x == 0.0 && this->_sizes.y == 0.0;\r\n    }\r\n\r\n    bool Mask::is_1d(void) const {\r\n        return this->_sizes.x == 0.0 || this->_sizes.y == 0.0;\r\n    }\r\n\r\n    bool Mask::operator==(const Mask& other) const {\r\n        return *this->_boundary == *other._boundary && misc::safe_vector_equal(this->_regions, other._regions);\r\n    }\r\n\r\n\r\n    SharedRegion Mask::at(uint32_t index) const\r\n    {\r\n        return this->_regions.at(index);\r\n    }\r\n\r\n    uint32_t Mask::length(void) const {\r\n        return static_cast<uint32_t>(this->_regions.size());\r\n    }\r\n\r\n\r\n    // =========================================== SourceShapeModelPlugin =========================================== //\r\n\r\n\r\n    SourceShapeModelPlugin::SourceShapeModelPlugin(source_shape_expr_t expression, std::vector<double> args) :\r\n        AbstractSourceShapeModel(PLUGIN_MODEL_TYPE), _expression(expression), _args(args),\r\n        _pargs(static_cast<const void*>(this->_args.data())) {\r\n        VLOG(6) << \"Plugin source shape model core object created\";\r\n    };\r\n\r\n    double SourceShapeModelPlugin::calculate(double sx, double sy) const {\r\n        return this->_expression(sx, sy, this->_pargs);\r\n    }\r\n\r\n    bool SourceShapeModelPlugin::operator==(const AbstractSourceShapeModel& other) const {\r\n        if (this->type != other.type) {\r\n            return false;\r\n        } else {\r\n            const SourceShapeModelPlugin *p = dynamic_cast<const SourceShapeModelPlugin*>(&other);\r\n            return this->_args == p->_args && this->_expression == p->_expression;\r\n        }\r\n    }\r\n\r\n\r\n    // ============================================ SourceShapeModelSheet =========================================== //\r\n\r\n\r\n    //\tarmanpy not support pass arrays by shared_ptr\r\n    SourceShapeModelSheet::SourceShapeModelSheet(const arma::vec& sx, const arma::vec& sy, const arma::mat& intensity) :\r\n        AbstractSourceShapeModel(SHEET_MODEL_TYPE), _interp(interp::LinearInterpolation2d(\r\n                std::make_shared<arma::vec>(sx), std::make_shared<arma::vec>(sy),\r\n                std::make_shared<arma::mat>(intensity))) {\r\n        VLOG(6) << \"Sheet source shape model core object created\";\r\n    };\r\n\r\n    double SourceShapeModelSheet::calculate(double sx, double sy) const {\r\n        return this->_interp.interpolate(sx, sy);\r\n    }\r\n\r\n    bool SourceShapeModelSheet::operator==(const AbstractSourceShapeModel& other) const {\r\n        if (this->type != other.type) {\r\n            return false;\r\n        } else {\r\n            const SourceShapeModelSheet *p = dynamic_cast<const SourceShapeModelSheet*>(&other);\r\n            return this->_interp == p->_interp;\r\n        }\r\n    }\r\n\r\n\r\n    // ========================================== ResistRateModelExpression ========================================= //\r\n\r\n\r\n    ResistRateModelExpression::ResistRateModelExpression(rate_model_expr_t expression, std::vector<double> args) :\r\n        AbstractResistRateModel(PLUGIN_MODEL_TYPE), _expression(expression), _args(args),\r\n        _pargs(static_cast<const void*>(this->_args.data())) {\r\n        VLOG(6) << \"Plugin resist development rate model core object created\";\r\n    };\r\n\r\n    double ResistRateModelExpression::calculate(double pac, double depth) const {\r\n        return this->_expression(pac, depth, this->_pargs);\r\n    }\r\n\r\n    bool ResistRateModelExpression::operator==(const AbstractResistRateModel& other) const {\r\n        if (this->type != other.type) {\r\n            return false;\r\n        } else {\r\n            const ResistRateModelExpression *p = dynamic_cast<const ResistRateModelExpression*>(&other);\r\n            return this->_args == p->_args && this->_expression == p->_expression;\r\n        }\r\n    }\r\n\r\n\r\n    // ========================================== ResistRateModelDepthSheet ========================================= //\r\n\r\n\r\n    //\tarmanpy not support pass arrays by shared_ptr\r\n    ResistRateModelDepthSheet::ResistRateModelDepthSheet(\r\n        const arma::vec& pac, const arma::vec& depth, const arma::mat& rate) :\r\n        AbstractResistRateModel(SHEET_MODEL_TYPE), _interp(interp::LinearInterpolation2d(\r\n                std::make_shared<arma::vec>(pac), std::make_shared<arma::vec>(depth),\r\n                std::make_shared<arma::mat>(rate))) {\r\n        VLOG(6) << \"Sheet with depth dependence resist development rate model core object created\";\r\n    }\r\n\r\n    double ResistRateModelDepthSheet::calculate(double pac, double depth) const {\r\n        return this->_interp.interpolate(pac, depth);\r\n    }\r\n\r\n    bool ResistRateModelDepthSheet::operator==(const AbstractResistRateModel& other) const {\r\n        if (this->type != other.type) {\r\n            return false;\r\n        } else {\r\n            const ResistRateModelDepthSheet *p = dynamic_cast<const ResistRateModelDepthSheet*>(&other);\r\n            return this->_interp == p->_interp;\r\n        }\r\n    }\r\n\r\n\r\n    // ============================================ ResistRateModelSheet =========================================== //\r\n\r\n\r\n    //\tarmanpy not support pass arrays by shared_ptr\r\n    ResistRateModelSheet::ResistRateModelSheet(const arma::vec& pac, const arma::vec& rate) :\r\n        AbstractResistRateModel(SHEET_MODEL_TYPE), _interp(interp::LinearInterpolation1d(\r\n                std::make_shared<arma::vec>(pac), std::make_shared<arma::vec>(rate))) {\r\n        VLOG(6) << \"Sheet resist development rate model core object created\";\r\n    }\r\n\r\n    double ResistRateModelSheet::calculate(double pac, double depth) const {\r\n        return this->_interp.interpolate(pac);\r\n    }\r\n\r\n    bool ResistRateModelSheet::operator==(const AbstractResistRateModel& other) const {\r\n        if (this->type != other.type) {\r\n            return false;\r\n        } else {\r\n            const ResistRateModelSheet *p = dynamic_cast<const ResistRateModelSheet*>(&other);\r\n            return this->_interp == p->_interp;\r\n        }\r\n    }\r\n\r\n\r\n    // ============================================ PupilFilterModelPlugin ========================================== //\r\n\r\n\r\n    PupilFilterModelPlugin::PupilFilterModelPlugin(pupil_filter_expr_t expression, std::vector<double> args) :\r\n        AbstractPupilFilterModel(PLUGIN_MODEL_TYPE), _expression(expression), _args(args),\r\n        _pargs(static_cast<const void*>(this->_args.data())) {\r\n        VLOG(6) << \"Plugin pupil filter model core object created\";\r\n    };\r\n\r\n    arma::cx_double PupilFilterModelPlugin::calculate(double sx, double sy) const {\r\n        return static_cast<arma::cx_double>(this->_expression(sx, sy, this->_pargs));\r\n    }\r\n\r\n    bool PupilFilterModelPlugin::operator==(const AbstractPupilFilterModel& other) const {\r\n        if (this->type != other.type) {\r\n            return false;\r\n        } else {\r\n            const PupilFilterModelPlugin *p = dynamic_cast<const PupilFilterModelPlugin*>(&other);\r\n            return this->_args == p->_args && this->_expression == p->_expression;\r\n        }\r\n    }\r\n\r\n\r\n    // ============================================= PupilFilterModelSheet ========================================== //\r\n\r\n\r\n    //\tarmanpy not support pass arrays by shared_ptr\r\n    PupilFilterModelSheet::PupilFilterModelSheet(const arma::vec& sx, const arma::vec& sy, const arma::cx_mat& coef) :\r\n        AbstractPupilFilterModel(SHEET_MODEL_TYPE) {\r\n        auto reals = std::make_shared<arma::mat>(coef.n_rows, coef.n_cols);\r\n        auto imags = std::make_shared<arma::mat>(coef.n_rows, coef.n_cols);\r\n        for (uint32_t r = 0; r < coef.n_rows; r++) {\r\n            for (uint32_t c = 0; c < coef.n_cols; c++) {\r\n                (*reals)(r, c) = coef(r, c).real();\r\n                (*imags)(r, c) = coef(r, c).imag();\r\n            }\r\n        }\r\n\r\n        std::shared_ptr<arma::vec> p_sx = std::make_shared<arma::vec>(sx);\r\n        std::shared_ptr<arma::vec> p_sy = std::make_shared<arma::vec>(sy);\r\n\r\n        this->_interp_real = interp::LinearInterpolation2d(p_sx, p_sy, reals);\r\n        this->_interp_imag = interp::LinearInterpolation2d(p_sx, p_sy, imags);\r\n\r\n        VLOG(6) << \"Sheet pupil filter model core object created\";\r\n    }\r\n\r\n    arma::cx_double PupilFilterModelSheet::calculate(double sx, double sy) const {\r\n        double real = this->_interp_real.interpolate(sx, sy);\r\n        double imag = this->_interp_imag.interpolate(sx, sy);\r\n        return arma::cx_double(real, imag);\r\n    }\r\n\r\n    bool PupilFilterModelSheet::operator==(const AbstractPupilFilterModel& other) const {\r\n        if (this->type != other.type) {\r\n            return false;\r\n        } else {\r\n            const PupilFilterModelSheet *p = dynamic_cast<const PupilFilterModelSheet*>(&other);\r\n            return this->_interp_real == p->_interp_real && this->_interp_imag == this->_interp_imag;\r\n        }\r\n    }\r\n\r\n\r\n    // ============================================= PupilFilterModelEmpty ========================================== //\r\n\r\n\r\n    PupilFilterModelEmpty::PupilFilterModelEmpty(void) : AbstractPupilFilterModel(EMPTY_MODEL_TYPE) {\r\n        VLOG(6) << \"Empty pupil filter model core object created\";\r\n    }\r\n\r\n    arma::cx_double PupilFilterModelEmpty::calculate(double sx, double sy) const {\r\n        return arma::cx_double(1.0, 0.0);\r\n    }\r\n\r\n    bool PupilFilterModelEmpty::operator==(const AbstractPupilFilterModel& other) const {\r\n        return this->type == other.type;\r\n    }\r\n\r\n\r\n    // ================================================= SourceShape ================================================ //\r\n\r\n\r\n    void SourceShape::_init_vectors(std::shared_ptr<arma::s32_vec> &k, std::shared_ptr<arma::vec> &dcos, double step) {\r\n        // Cut value above 1.0 because max direction cosine in source shape grid must be lower 1.0\r\n        double count = static_cast<uint32_t>(2*SourceShape::_clim/step+1);\r\n\r\n        k = std::make_shared<arma::s32_vec>(count);\r\n        dcos = std::make_shared<arma::vec>(count);\r\n\r\n        uint32_t median = static_cast<uint32_t>(floor(static_cast<double>(count)/2.0));\r\n        for (uint32_t i = 0; i < count; i++) {\r\n            (*k)(i) = i - median;\r\n            (*dcos)(i) = (*k)(i) * step;\r\n        }\r\n    }\r\n\r\n    std::shared_ptr<arma::mat> SourceShape::_init_values(const arma::vec &cx, const arma::vec &cy,\r\n            SharedAbstractSourceShapeModel model) {\r\n        std::shared_ptr<arma::mat> result = std::make_shared<arma::mat>(cy.n_elem, cx.n_elem);\r\n        for (uint32_t c = 0; c < cx.n_elem; c++) {\r\n            for (uint32_t r = 0; r < cy.n_elem; r++) {\r\n                (*result)(r, c) = model->calculate(cx(c), cy(r));\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n\r\n    std::shared_ptr<arma::umat> SourceShape::_get_non_zeros_indexes(const arma::mat &values) {\r\n        arma::uvec indexes = arma::find(values != 0.0);\r\n        auto result = std::make_shared<arma::umat>(indexes.n_elem, 2);\r\n        for (int32_t k = 0; k < static_cast<int32_t>(indexes.n_elem); k++) {\r\n            (*result)(k, 0) = indexes(k) % values.n_rows;  // row index\r\n            (*result)(k, 1) = indexes(k) / values.n_rows;  // column index\r\n        }\r\n        return result;\r\n    }\r\n\r\n    void SourceShape::_get_limits(double &sx_min, double &sx_max, double &sy_min, double &sy_max, \r\n            std::shared_ptr<arma::umat> non_zeros, std::shared_ptr<arma::vec> cx, std::shared_ptr<arma::vec> cy) {\r\n\r\n        auto rows_indx = non_zeros->col(0);\r\n        uint32_t r_min = arma::min(rows_indx);\r\n        uint32_t r_max = arma::max(rows_indx);\r\n\r\n        auto cols_indx = non_zeros->col(1);\r\n        uint32_t c_min = arma::min(cols_indx);\r\n        uint32_t c_max = arma::max(cols_indx);\r\n\r\n        sx_min = (*cx)(c_min);\r\n        sx_max = (*cx)(c_max);\r\n\r\n        sy_min = (*cy)(r_min);\r\n        sy_max = (*cy)(r_max);\r\n    }\r\n\r\n    SourceShape::SourceShape(SharedAbstractSourceShapeModel model, double stepx, double stepy) {\r\n        this->_model = model;\r\n        this->_stepx = stepx;\r\n        this->_stepy = stepy;\r\n\r\n        SourceShape::_init_vectors(this->_kx, this->_cx, stepx);\r\n        SourceShape::_init_vectors(this->_ky, this->_cy, stepy);\r\n\r\n    //\tVLOG(4) << \"Calculate source shape values in simulation grid\";\r\n        this->_values = SourceShape::_init_values(*this->_cx, *this->_cy, this->_model);\r\n\r\n    //\tVLOG(4) << \"Get indexes of the non-zeros items\";\r\n        this->_non_zeros = SourceShape::_get_non_zeros_indexes(*this->_values);\r\n\r\n    //  VLOG(4) << \"Get source shape direction cosine limits\";\r\n        this->_get_limits(this->_sx_min, this->_sx_max, this->_sy_min, this->_sy_max,\r\n                this->_non_zeros, this->_cx, this->_cy);\r\n    //\tVLOG(4) << \"SX = \" << this->_sx_min << \" \" << this->_sx_max <<\r\n    //\t\t\t\" SY = \" << this->_sy_min << \" \" << this->_sy_max;\r\n    }\r\n\r\n    std::shared_ptr<arma::mat> SourceShape::values(void) const {\r\n        return this->_values;\r\n    }\r\n\r\n    double SourceShape::value(uint32_t r, uint32_t c) const {\r\n        return (*this->_values)(r, c);\r\n    }\r\n\r\n    std::shared_ptr<arma::vec> SourceShape::cx(void) const {\r\n        return this->_cx;\r\n    }\r\n\r\n    double SourceShape::cx(uint32_t i) const {\r\n        return (*this->_cx)(i);\r\n    }\r\n\r\n    std::shared_ptr<arma::vec> SourceShape::cy(void) const {\r\n        return this->_cy;\r\n    }\r\n\r\n    double SourceShape::cy(uint32_t i) const {\r\n        return (*this->_cy)(i);\r\n    }\r\n\r\n    std::shared_ptr<arma::umat> SourceShape::non_zeros(void) const {\r\n        return this->_non_zeros;\r\n    }\r\n\r\n    double SourceShape::sx_min(void) const {\r\n        return this->_sx_min;\r\n    }\r\n\r\n    double SourceShape::sx_max(void) const {\r\n        return this->_sx_max;\r\n    }\r\n\r\n    double SourceShape::sy_min(void) const {\r\n        return this->_sy_min;\r\n    }\r\n\r\n    double SourceShape::sy_max(void) const {\r\n        return this->_sy_max;\r\n    }\r\n\r\n    bool SourceShape::operator==(const SourceShape& other) const {\r\n        return *this->_model == *other._model && this->_stepx == other._stepx && this->_stepy == other._stepy;\r\n    }\r\n\r\n\r\n    // ================================================= ImagingTool ================================================ //\r\n\r\n\r\n    ImagingTool::ImagingTool(SharedSourceShape source_shape, SharedAbstractPupilFilterModel pupil_filter_model,\r\n            double wavelength, double numeric_aperture, double reduction_ratio, double flare, double immersion) :\r\n        wavelength(wavelength), numeric_aperture(numeric_aperture) {\r\n        this->_source_shape = source_shape;\r\n        this->_pupil_filter_model = pupil_filter_model;\r\n        this->_reduction_ratio = reduction_ratio;\r\n        this->_squared_reduction_ratio = reduction_ratio * reduction_ratio;\r\n        this->_flare = flare;\r\n        this->_immersion = immersion;\r\n    }\r\n\r\n    SharedSourceShape ImagingTool::source_shape(void) const {\r\n        return this->_source_shape;\r\n    }\r\n\r\n    arma::cx_double ImagingTool::filter(double cx, double cy) const {\r\n        return this->_pupil_filter_model->calculate(cx, cy);\r\n    }\r\n\r\n    double ImagingTool::reduction(double cx, double cy, arma::cx_double environment_refraction) const {\r\n        // TODO: Added immersion calculation\r\n        double cxy2 = cx * cx + cy * cy;\r\n        double n_env2 = std::abs(environment_refraction) * std::abs(environment_refraction);\r\n    //\tLOG(INFO) << \"Environment refractive index = \" << std::abs(environment_refraction);\r\n        return std::pow((1 - cxy2/this->_squared_reduction_ratio) / (1 - cxy2/n_env2), 0.25);\r\n    }\r\n\r\n    void ImagingTool::flare(SharedResistVolume intensity) const {\r\n        if (this->_flare != 0.0) {\r\n            arma::cube& values = *intensity->values();\r\n            for (arma::cube::iterator it = values.begin(); it != values.end(); it++) {\r\n                *it = this->_flare + (1 - this->_flare) * (*it);\r\n            }\r\n        }\r\n    }\r\n\r\n    bool ImagingTool::operator==(const ImagingTool& other) const {\r\n        return *this->_source_shape == *other._source_shape &&\r\n                *this->_pupil_filter_model == *other._pupil_filter_model &&\r\n                this->wavelength == other.wavelength &&\r\n                this->numeric_aperture == other.numeric_aperture &&\r\n                this->_reduction_ratio == other._reduction_ratio &&\r\n                this->_flare == other._flare &&\r\n                this->_immersion == other._immersion;\r\n    }\r\n\r\n\r\n    // ================================================== Exposure ================================================== //\r\n\r\n\r\n    Exposure::Exposure(double focus, double nominal_dose, double correctable) :\r\n        focus(focus), nominal_dose(nominal_dose), correctable(correctable) { }\r\n\r\n    arma::cx_double Exposure::defocus(double cx, double cy, double wvl) const {\r\n        if (this->focus != 0.0) {\r\n            double cxy2 = cx * cx + cy * cy;\r\n            double opd = this->focus*(1 - sqrt(1 - cxy2));\r\n            return std::exp(2*M_PI*j*opd/wvl);\r\n        } else {\r\n            return arma::cx_double(1.0, 0.0);\r\n        }\r\n    }\r\n\r\n    double Exposure::dose(void) const {\r\n        return this->nominal_dose * this->correctable;\r\n    }\r\n\r\n    bool Exposure::operator==(const Exposure& other) const {\r\n        return this->focus == other.focus &&\r\n                this->nominal_dose == other.nominal_dose &&\r\n                this->correctable == other.correctable;\r\n    }\r\n\r\n\r\n    // ================================================= Diffraction ================================================ //\r\n\r\n\r\n    void Diffraction::_add_1d_region(SharedAbstractMaskGeometry region, arma::cx_double factor)\r\n    {\r\n        // Corrected during mask converting\r\n        // region->set_bypass(CW);\r\n\r\n        // In one-dimensional mask only one region exist\r\n        SharedEdge2d r = region->front();\r\n\r\n        // Simplifier access to required member fields\r\n        uint32_t axis = region->axis();\r\n        double dst = r->dst[axis];\r\n        double org = r->org[axis];\r\n        arma::cx_mat& values = *this->_values;\r\n        arma::s32_vec& k = *this->k(axis);\r\n        arma::vec& frq = *this->frq(axis);\r\n\r\n        arma::cx_double value;\r\n        for (uint32_t i = 0; i < k.n_elem; i++) {\r\n            if (k(i) == 0) {\r\n                value = (dst - org);\r\n    //\t\t\tVLOG(4) << \"i = \" << i << \" k = \" << i << \"/\" << k.n_elem << \" v = \" << value;\r\n            } else {\r\n                arma::cx_double w = 2*M_PI*j*frq(i);\r\n                value = -(std::exp(-w*dst) - std::exp(-w*org)) / w;\r\n    //\t\t\tVLOG(4) << \"i = \" << i << \" k = \" << i << \"/\" << k.n_elem << \" f = \" << frq(i)\r\n    //\t\t\t\t\t<< \" w = \" << w << \" e^w1 = \" << exp(-w*dst) << \" e^w2 = \" << exp(-w*org)\r\n    //\t\t\t\t\t<< \" v = \" << value;\r\n            }\r\n            values(i) += factor*value;\r\n        }\r\n    }\r\n\r\n    arma::cx_double Diffraction::_calc_2d_region(SharedAbstractMaskGeometry region, \r\n            int32_t kx, int32_t ky, double frqx, double frqy) {\r\n        arma::cx_double result = 0.0;\r\n\r\n        for (auto e : *region) {\r\n            arma::cx_double value;\r\n            const double dx = e->dx();\r\n\r\n            if (dx == 0.0) {\r\n                value = 0.0;\r\n            } else {\r\n                const double dy = e->dy();\r\n                const double s = e->slope();\r\n                const double b = e->dst.y - s*e->dst.x;\r\n\r\n                if (kx == 0 && ky == 0) { // diffraction for zero order\r\n                    value = e->area();\r\n                } else if (kx == 0 && ky != 0) { // diffraction for orders if FX = 0\r\n                    const arma::cx_double wy = 2*M_PI*j*frqy;\r\n                    if (dy == 0) {\r\n                        value = dx/wy*(1.0 - std::exp(-wy*b));\r\n                    } else { //dX && dY != 0\r\n                        value = dx/wy + (std::exp(-wy*b)/s/wy/wy)*(std::exp(-s*wy*e->dst.x) - std::exp(-s*wy*e->org.x));\r\n                    }\r\n                } else if (kx != 0 && ky == 0) { // diffraction for orders if FY = 0\r\n                    const arma::cx_double wx = 2*M_PI*j*frqx;\r\n                    if (dy == 0) {\r\n                        value = b/wx*(std::exp(-wx*e->org.x) - std::exp(-wx*e->dst.x));\r\n                    } else { //dX && dY != 0\r\n                        const arma::cx_double ex0 = std::exp(-wx * e->org.x);\r\n                        const arma::cx_double ex1 = std::exp(-wx * e->dst.x);\r\n                        value = (s+wx*b)*(ex0-ex1)/wx/wx + s*(ex0*e->org.x - ex1*e->dst.x)/wx;\r\n                    }\r\n                } else { // other cases\r\n                    const arma::cx_double wx = 2*M_PI*j*frqx;\r\n                    const arma::cx_double wy = 2*M_PI*j*frqy;\r\n                    if (dy == 0) {\r\n                        value = (1.0 - std::exp(-wy*b))*(std::exp(-wx*e->org.x)-std::exp(-wx*e->dst.x))/wx/wy;\r\n                    } else if (wx + s*wy == 0.0) {\r\n                        value = (std::exp(-wx*e->org.x)-std::exp(-wx*e->dst.x))/wx/wy - dx*std::exp(-wy*b)/wy;\r\n                    } else {\r\n                        const arma::cx_double coef = wx + s*wy;\r\n                        const arma::cx_double dexp = std::exp(-wx*e->org.x) - std::exp(-wx*e->dst.x);\r\n                        value = dexp/wx/wy + std::exp(-wy*b)/wy*(std::exp(-coef*e->dst.x)-std::exp(-coef*e->org.x))/coef;\r\n                    }\r\n                }\r\n            }\r\n            result += value;\r\n        }\r\n        return result;\r\n    }\r\n\r\n    void Diffraction::_add_2d_region(SharedAbstractMaskGeometry region, arma::cx_double factor) {\r\n        arma::cx_mat& values = *this->values();\r\n        arma::mat& cxy = *this->cxy();\r\n\r\n        // Corrected during mask converting\r\n        // We should make positive area of polygon\r\n        // region->set_bypass(CW);\r\n\r\n        double na = this->numeric_aperture;\r\n\r\n        // Flag that diffraction term at kx, ky has been calculated\r\n        auto calculated = arma::uchar_mat(values.n_rows, values.n_cols, arma::fill::zeros);\r\n\r\n        for (uint32_t k = 0; k < this->source_shape->non_zeros()->n_rows; k++) {\r\n            auto rc = this->source_shape->non_zeros()->row(k);\r\n            double scx = na * this->source_shape->cx(rc(1));\r\n            double scy = na * this->source_shape->cy(rc(0));\r\n\r\n            for (uint32_t c = 0;  c < this->_kx->n_elem; c++) {\r\n                int32_t kx = (*this->_kx)(c);\r\n                double cx = (*this->_cx)(c);\r\n                double frqx = (*this->_frqx)(c);\r\n                for (uint32_t r = 0; r < this->_ky->n_elem; r++) {\r\n                    int32_t ky = (*this->_ky)(r);\r\n                    double cy = (*this->_cy)(r);\r\n                    double frqy = (*this->_frqy)(r);\r\n                    // Diffraction term not being calculated if it has already been calculated and\r\n                    // it in aperture or in aperture + offset from source\r\n                    // Additional check cxy <= na required for the reason diffraction orders should\r\n                    // not been removed for central order especially for displaying.\r\n                    if (!calculated(r, c) && (cxy(r, c) <= na || within_circle(cx, cy, scx, scy, na))) {\r\n                        values(r, c) += factor*Diffraction::_calc_2d_region(region, kx, ky, frqx, frqy);\r\n                        calculated(r, c) = true;\r\n                    }\r\n                } // end ky for-loop\r\n            }  // end kx for-loop\r\n        }  // end source shape for-loop\r\n    }\r\n\r\n    Diffraction::Diffraction(SharedMask mask, SharedImagingTool imaging_tool) :\r\n            source_shape(imaging_tool->source_shape()),\r\n            pitch(mask->pitch()),\r\n            boundary(*mask->boundary()),\r\n            numeric_aperture(imaging_tool->numeric_aperture),\r\n            wavelength(imaging_tool->wavelength)\r\n    {\r\n        const double na = this->numeric_aperture;\r\n        const double wvl = this->wavelength;\r\n        const double scx_min = this->source_shape->sx_min();\r\n        const double scx_max = this->source_shape->sx_max();\r\n        const double scy_min = this->source_shape->sy_min();\r\n        const double scy_max = this->source_shape->sy_max();\r\n\r\n        // Attention: rows is y-axis and cols is x-axis\r\n        auto lim_cols = Diffraction::_calc_size(na, wvl, this->pitch.x, scx_min, scx_max);\r\n        auto lim_rows = Diffraction::_calc_size(na, wvl, this->pitch.y, scy_min, scy_max);\r\n\r\n        uint32_t cols = lim_cols.second - lim_cols.first + 1;\r\n        uint32_t rows = lim_rows.second - lim_rows.first + 1;\r\n\r\n    //\tVLOG(4) << \"Cols = \" << cols << \" Rows = \" << rows;\r\n\r\n    //\tVLOG(4) << \"Allocate memory for arrays and vectors\";\r\n        this->_values = std::make_shared<arma::cx_mat>(rows, cols, arma::fill::zeros);\r\n\r\n        this->_frqx = std::make_shared<arma::vec>(cols, arma::fill::zeros);\r\n        this->_frqy = std::make_shared<arma::vec>(rows, arma::fill::zeros);\r\n\r\n        this->_cx = std::make_shared<arma::vec>(cols, arma::fill::zeros);\r\n        this->_cy = std::make_shared<arma::vec>(rows, arma::fill::zeros);\r\n\r\n        this->_kx = std::make_shared<arma::s32_vec>(cols, arma::fill::zeros);\r\n        this->_ky = std::make_shared<arma::s32_vec>(rows, arma::fill::zeros);\r\n\r\n    //\tVLOG(4) << \"Initialize diffraction cosine and terms vectors\";\r\n        Diffraction::_init_vectors(*this->_kx, *this->_frqx, *this->_cx, this->pitch.x, this->wavelength, lim_cols);\r\n        Diffraction::_init_vectors(*this->_ky, *this->_frqy, *this->_cy, this->pitch.y, this->wavelength, lim_rows);\r\n\r\n        this->_cxy = std::make_shared<arma::mat>(rows, cols, arma::fill::zeros);\r\n        Diffraction::_init_cosines(*this->_cxy, *this->_cx, *this->_cy);\r\n    }\r\n\r\n    // Return direction cosines for given axis\r\n    std::shared_ptr<arma::vec> Diffraction::c(uint32_t axis) const {\r\n        return Diffraction::_select_axis(axis, this->_cx, this->_cy);\r\n    }\r\n\r\n    // Return diffraction terms order number for given axis\r\n    std::shared_ptr<arma::s32_vec> Diffraction::k(uint32_t axis) const {\r\n        return Diffraction::_select_axis(axis, this->_kx, this->_ky);\r\n    }\r\n\r\n    // Return spatial frequencies for given axis\r\n    std::shared_ptr<arma::vec> Diffraction::frq(uint32_t axis) const {\r\n        return Diffraction::_select_axis(axis, this->_frqx, this->_frqy);\r\n    }\r\n\r\n    // Return plane waves of diffraction pattern values\r\n    std::shared_ptr<arma::cx_mat> Diffraction::values(void) const {\r\n        return this->_values;\r\n    }\r\n\r\n    arma::cx_double Diffraction::value(uint32_t r, uint32_t c) const {\r\n        return (*this->_values)(r, c);\r\n    }\r\n\r\n    // Return absolute value of direction cosines\r\n    std::shared_ptr<arma::mat> Diffraction::cxy(void) const {\r\n        return this->_cxy;\r\n    }\r\n\r\n    // Return direction cosine belong to x-axis\r\n    std::shared_ptr<arma::vec> Diffraction::cx(void) const {\r\n        return this->_cx;\r\n    }\r\n\r\n    double Diffraction::cx(uint32_t i) const {\r\n        return (*this->_cx)(i);\r\n    }\r\n\r\n    // Return direction cosine belong to y-axis\r\n    std::shared_ptr<arma::vec> Diffraction::cy(void) const {\r\n        return this->_cy;\r\n    }\r\n\r\n    double Diffraction::cy(uint32_t i) const {\r\n        return (*this->_cy)(i);\r\n    }\r\n\r\n    // Return spatial frequencies belong to x-axis\r\n    std::shared_ptr<arma::vec> Diffraction::frqx(void) const {\r\n        return this->_frqx;\r\n    }\r\n\r\n    // Return spatial frequencies belong to y-axis\r\n    std::shared_ptr<arma::vec> Diffraction::frqy(void) const {\r\n        return this->_frqy;\r\n    }\r\n\r\n    // Return diffraction terms order numbers belong x-axis\r\n    std::shared_ptr<arma::s32_vec> Diffraction::kx(void) const {\r\n        return this->_kx;\r\n    }\r\n\r\n    int32_t Diffraction::kx(uint32_t i) const {\r\n        return (*this->_kx)(i);\r\n    }\r\n\r\n    // Return diffraction terms order numbers belong y-axis\r\n    std::shared_ptr<arma::s32_vec> Diffraction::ky(void) const {\r\n        return this->_ky;\r\n    }\r\n\r\n    int32_t Diffraction::ky(uint32_t i) const {\r\n        return (*this->_ky)(i);\r\n    }\r\n\r\n    void Diffraction::add_region(SharedAbstractMaskGeometry region, arma::cx_double factor) {\r\n        if (region->axis() == DIM_1D_X || region->axis() == DIM_1D_Y) {\r\n            this->_add_1d_region(region, factor/this->pitch[region->axis()]);\r\n        } else if (region->axis() == DIM_2D) {\r\n            this->_add_2d_region(region, factor/this->pitch.x/this->pitch.y);\r\n        } else {\r\n            throw std::invalid_argument(\"Can't process region while diffraction calculate: region type is unknown\");\r\n        }\r\n    }\r\n\r\n\r\n    // ============================================= AbstractWaferLayer ============================================= //\r\n\r\n\r\n    bool AbstractWaferLayer::is_environment(void) const {\r\n        return this->type == ENVIRONMENT_LAYER;\r\n    }\r\n\r\n    bool AbstractWaferLayer::is_resist(void) const {\r\n        return this->type == RESIST_LAYER;\r\n    }\r\n\r\n    bool AbstractWaferLayer::is_material(void) const {\r\n        return this->type == MATERIAL_LAYER;\r\n    }\r\n\r\n    bool AbstractWaferLayer::is_substrate(void) const {\r\n        return this->type == SUBSTRATE_LAYER;\r\n    }\r\n\r\n    arma::cx_double AbstractWaferLayer::effective_refraction(arma::cx_double incident_angle, double wavelength) const {\r\n        return std::cos(incident_angle) * this->refraction(wavelength);\r\n    }\r\n\r\n    // Attention: valid only for zero order\r\n    arma::cx_double AbstractWaferLayer::internal_transmit(double wavelength, double power) const {\r\n        return std::exp(2.0*M_PI*j*this->refraction(wavelength)*this->thickness/wavelength*power);\r\n    }\r\n\r\n    arma::cx_double AbstractWaferLayer::internal_transmit(\r\n        arma::cx_double incident_angle, double dz, double wavelength) const {\r\n        return std::exp(2.0*M_PI*j*this->effective_refraction(incident_angle, wavelength)*dz/wavelength);\r\n    }\r\n\r\n    std::string AbstractWaferLayer::str(void) const {\r\n        std::ostringstream result;\r\n        result << \"WaferLayer: \";\r\n        if (this->is_environment()) {\r\n            result << \"environment\";\r\n        } else if (this->is_resist()) {\r\n            result << \"resist\";\r\n        } else if (this->is_material()) {\r\n            result << \"material\";\r\n        } else if (this->is_substrate()) {\r\n            result << \"substrate\";\r\n        } else {\r\n            result << \"unknown type\";\r\n        }\r\n        result << \"; thickness: \" << this->thickness;\r\n        return result.str();\r\n    }\r\n\r\n\r\n    // ============================================= StandardWaferLayer ============================================= //\r\n\r\n\r\n    StandardWaferLayer::StandardWaferLayer(layer_type_t layer_type, double thickness, const arma::vec& wavelength,\r\n            const arma::vec& refraction_real, const arma::vec& refraction_imag) :\r\n                AbstractWaferLayer(layer_type, thickness) {\r\n        auto wvl = std::make_shared<arma::vec>(wavelength);\r\n        auto real = std::make_shared<arma::vec>(refraction_real);\r\n        auto imag = std::make_shared<arma::vec>(refraction_imag);\r\n        this->_refraction_real = interp::LinearInterpolation1d(wvl, real, NAN);\r\n        this->_refraction_imag = interp::LinearInterpolation1d(wvl, imag, NAN);\r\n    }\r\n\r\n    arma::cx_double StandardWaferLayer::refraction(double wavelength, double m) const {\r\n        double real = this->_refraction_real.interpolate(wavelength);\r\n        double imag = this->_refraction_imag.interpolate(wavelength);\r\n    //\tLOG(INFO) << \"REFRACTION(\" << wavelength << \") = \" << real << \" \" << imag;\r\n        return arma::cx_double(real, imag);\r\n    }\r\n\r\n    bool StandardWaferLayer::operator==(const AbstractWaferLayer& other) const {\r\n        if (this->type != other.type) {\r\n            return false;\r\n        } else {\r\n            const StandardWaferLayer *p = dynamic_cast<const StandardWaferLayer*>(&other);\r\n            return this->_refraction_real == p->_refraction_real && this->_refraction_imag == p->_refraction_imag;\r\n        }\r\n    }\r\n\r\n\r\n    // ============================================= ConstantWaferLayer ============================================= //\r\n\r\n\r\n    ConstantWaferLayer::ConstantWaferLayer(layer_type_t layer_type, double thickness, double real, double imag) :\r\n        AbstractWaferLayer(layer_type, thickness) {\r\n        this->_refraction = arma::cx_double(real, imag);\r\n    }\r\n\r\n    arma::cx_double ConstantWaferLayer::refraction(double wavelength, double m) const {\r\n    //\tLOG(INFO) << \"CONST REFRACTION: \" << this->_refraction.real() << \" \" << this->_refraction.imag();\r\n        return this->_refraction;\r\n    }\r\n\r\n    bool ConstantWaferLayer::operator==(const AbstractWaferLayer& other) const {\r\n        if (this->type != other.type) {\r\n            return false;\r\n        } else {\r\n            const ConstantWaferLayer *p = dynamic_cast<const ConstantWaferLayer*>(&other);\r\n            return this->_refraction == p->_refraction;\r\n        }\r\n    }\r\n\r\n\r\n    // ============================================ ExposureResistModel ============================================= //\r\n\r\n\r\n    arma::cx_double ExposureResistModel::refraction(double m) const {\r\n        double im = this->wavelength / 4.0 / M_PI * (this->a * m + this->b) * 1e-3;\r\n        return arma::cx_double(this->n, im);\r\n    }\r\n\r\n    bool ExposureResistModel::operator==(const ExposureResistModel& other) const {\r\n        return this->wavelength == other.wavelength &&\r\n                this->a == other.a && this->b == other.b &&\r\n                this->c == other.c && this->n == other.n;\r\n    }\r\n\r\n\r\n    // ============================================== PebResistModel ================================================ //\r\n\r\n\r\n    double PebResistModel::diffusivity(double temp) const {\r\n        double tempk = temp - physc::T0;\r\n        return std::exp(this->ln_ar - this->ea/(physc::R*tempk));\r\n    }\r\n\r\n    double PebResistModel::diffusion_length(double temp, double time) const {\r\n        return std::sqrt(2.0 * this->diffusivity(temp) * time);\r\n    }\r\n\r\n    arma::vec PebResistModel::kernel(SharedPostExposureBake peb, double step) const {\r\n        if (step != 0.0) {\r\n            double sigma = this->diffusion_length(peb->temp, peb->time);\r\n\r\n    //\t\tLOG(INFO) << \"Create PEB kernel for temp = \" << peb->temp <<\r\n    //\t\t\t\t\" time = \" << peb->time << \" with Sigma = \" << sigma;\r\n\r\n            // Convert result sigma value to input grid value\r\n            double sigma_on_grid = std::ceil(3.0*sigma) - std::fmod(std::ceil(3.0*sigma), step) + step;\r\n            uint32_t count = (uint32_t) (2*sigma_on_grid/step) + 1;\r\n\r\n    //\t\tLOG(INFO) << \"Kernel size = \" << count << \" SigmaGrid = \" << sigma_on_grid;\r\n\r\n            arma::vec kernel = arma::vec(count);\r\n\r\n            for (uint32_t k = 0; k < count; k++) {\r\n                double x = k*step - sigma_on_grid;\r\n                kernel[k] = step/sigma/std::sqrt(2*M_PI)*std::exp(-x*x/2/sigma/sigma);\r\n            }\r\n\r\n            // Convolution kernel must be normalized because three sigma interval is not equal to full intergral value\r\n            // of the kernel. So this can result in PAC after PEB will exceed max possible value 1.0. In turn development\r\n            // rates will be calculated with NaN values\r\n            return kernel / arma::accu(kernel);\r\n        } else {\r\n    //\t\tLOG(INFO) << \"Create empty PEB kernel (step = 0.0)\";\r\n            return arma::vec(1, arma::fill::ones);\r\n        }\r\n    }\r\n\r\n    bool PebResistModel::operator==(const PebResistModel& other) const {\r\n        return this->ea == other.ea && this->ln_ar == other.ln_ar;\r\n    }\r\n\r\n\r\n    // ============================================= ResistWaferLayer =============================================== //\r\n\r\n\r\n    arma::cx_double ResistWaferLayer::refraction(double wavelength, double m) const {\r\n        return this->exposure->refraction(m);\r\n    }\r\n\r\n    bool ResistWaferLayer::operator==(const AbstractWaferLayer& other) const {\r\n        if (this->type != other.type) {\r\n            return false;\r\n        } else {\r\n            const ResistWaferLayer *p = dynamic_cast<const ResistWaferLayer*>(&other);\r\n            return this->exposure == p->exposure && this->peb == p->peb && this->rate == p->rate;\r\n        }\r\n    }\r\n\r\n\r\n    // ================================================ WaferStack ================================================== //\r\n\r\n\r\n    // Calculate refractive indexes between layers (for all layers in the stack)\r\n    arma::cx_vec WaferStack::_calc_refractive_indexes(double cxy, double wavelength) {\r\n        arma::cx_vec refractive_indexes = arma::cx_vec(this->_layers.size());\r\n\r\n        arma::cx_double angle = std::asin(cxy);\r\n        refractive_indexes(0) = this->_layers[0]->effective_refraction(angle, wavelength);\r\n        for (uint32_t k = 1; k < this->_layers.size(); k++) {\r\n            arma::cx_double rtop = this->_layers[k-1]->refraction(wavelength);\r\n            arma::cx_double rbot = this->_layers[k]->refraction(wavelength);\r\n            angle = WaferStack::_angle(angle, rtop, rbot);\r\n            refractive_indexes(k) = this->_layers[k]->effective_refraction(angle, wavelength);\r\n        }\r\n\r\n        return refractive_indexes;\r\n    }\r\n\r\n    // Calculate effective reflection for all stack from top to bottom\r\n    // (reflection with taking account of all top layers)\r\n    std::shared_ptr<arma::cx_vec> WaferStack::_calc_effective_top_reflections(double cxy, double wavelength) {\r\n        arma::cx_vec refractive_indexes = this->_calc_refractive_indexes(cxy, wavelength);\r\n\r\n        std::shared_ptr<arma::cx_vec> result = std::make_shared<arma::cx_vec>(this->_layers.size());\r\n        arma::cx_vec& reflections = *result;\r\n\r\n        reflections(0) = WaferStack::_reflection(refractive_indexes(0), refractive_indexes(1));\r\n\r\n        for (uint32_t k = 1; k < this->_layers.size()-1; k++) {\r\n            arma::cx_double v = reflections(k-1) * this->_layers[k]->internal_transmit(wavelength, 2.0);\r\n            arma::cx_double y = (1.0 + v) / (1.0 - v);\r\n            reflections(k) = (refractive_indexes(k)*y - refractive_indexes(k+1)) /\r\n                    (refractive_indexes(k)*y + refractive_indexes(k+1));\r\n        }\r\n\r\n        return result;\r\n    }\r\n\r\n    // Return cached value or calculate\r\n    std::shared_ptr<arma::cx_vec> WaferStack::effective_top_reflection(double cx, double cy, double wavelength) {\r\n        if (this->_cached_wavelength != wavelength) {\r\n            this->_cached_top_reflections.clear();\r\n            this->_cached_wavelength = wavelength;\r\n        }\r\n        auto cx_cy = std::make_pair(cx, cy);\r\n        auto cached = this->_cached_top_reflections.find(cx_cy);\r\n        if (cached != this->_cached_top_reflections.end()) {\r\n             return cached->second;\r\n        } else {\r\n            double cxy = sqrt(cx*cx + cy*cy);\r\n            std::shared_ptr<arma::cx_vec> reflections = this->_calc_effective_top_reflections(cxy, wavelength);\r\n            this->_cached_top_reflections[cx_cy] = reflections;\r\n            return reflections;\r\n        }\r\n    }\r\n\r\n    // Calculate effective reflection for all stack from bottom to top\r\n    // (reflection with taking account of all bottom layers)\r\n    std::shared_ptr<arma::cx_vec> WaferStack::_calc_effective_bottom_reflections(double cxy, double wavelength) {\r\n        arma::cx_vec refractive_indexes = this->_calc_refractive_indexes(cxy, wavelength);\r\n        std::shared_ptr<arma::cx_vec> result = std::make_shared<arma::cx_vec>(this->_layers.size());\r\n        arma::cx_vec& reflections = *result;\r\n\r\n        uint32_t bottom = this->_layers.size() - 1;\r\n        reflections(bottom-1) = WaferStack::_reflection(refractive_indexes(bottom-1), refractive_indexes(bottom));\r\n\r\n        for (uint32_t k = bottom-2; k >= 1; k--) {\r\n            arma::cx_double v = reflections(k+1) * this->_layers[k+1]->internal_transmit(wavelength, 2.0);\r\n            arma::cx_double x = (1.0 - v) / (1.0 + v);\r\n            reflections(k) = (refractive_indexes(k) - x*refractive_indexes(k+1)) /\r\n                    (refractive_indexes(k) + x*refractive_indexes(k+1));\r\n        }\r\n\r\n        reflections(0) = WaferStack::_reflection(refractive_indexes(0), refractive_indexes(1));\r\n\r\n        return result;\r\n    }\r\n\r\n    // Return cached value or calculate\r\n    std::shared_ptr<arma::cx_vec> WaferStack::effective_bottom_reflection(double cx, double cy, double wavelength) {\r\n        if (this->_cached_wavelength != wavelength) {\r\n            this->_cached_bottom_reflections.clear();\r\n            this->_cached_wavelength = wavelength;\r\n        }\r\n        auto cx_cy = std::make_pair(cx, cy);\r\n        auto cached = this->_cached_bottom_reflections.find(cx_cy);\r\n        if (cached != this->_cached_bottom_reflections.end()) {\r\n             return cached->second;\r\n        } else {\r\n            double cxy = sqrt(cx*cx + cy*cy);\r\n            std::shared_ptr<arma::cx_vec> reflections = this->_calc_effective_bottom_reflections(cxy, wavelength);\r\n            this->_cached_bottom_reflections[cx_cy] = reflections;\r\n            return reflections;\r\n        }\r\n    }\r\n\r\n    WaferStack::WaferStack(void) {\r\n        this->_resist = nullptr;\r\n        this->_substrate = nullptr;\r\n        this->_environment = nullptr;\r\n        this->_cached_wavelength = -1.0;\r\n    }\r\n\r\n    WaferStack::WaferStack(ArrayOfSharedAbstractWaferLayers layers) : WaferStack() {\r\n        for (auto layer : layers) {\r\n            this->push(layer);\r\n        }\r\n    }\r\n\r\n    void WaferStack::push(SharedAbstractWaferLayer layer) {\r\n        if (this->_environment) {\r\n            throw std::invalid_argument(\"Layer of any type can't be added after the environment layer set\");\r\n        }\r\n\r\n        if (this->_resist) {\r\n            if (layer->is_resist()) {\r\n                throw std::invalid_argument(\"Can't push the second resist layer into the wafer stack\");\r\n            } else if (!layer->is_environment()) {\r\n                throw std::invalid_argument(\"Material layer on the resist layer not allowed\");\r\n            }\r\n        }\r\n\r\n        if (this->_layers.empty() && !layer->is_substrate()) {\r\n            throw std::invalid_argument(\"First layer must be substrate layer\");\r\n        }\r\n\r\n        if (layer->is_environment()) {\r\n            this->_environment = layer;\r\n        } else if (layer->is_resist()) {\r\n            this->_resist = layer;\r\n        } else if (layer->is_substrate()) {\r\n            this->_substrate = layer;\r\n        }\r\n\r\n        this->_layers.insert(this->_layers.begin(), layer);\r\n    }\r\n\r\n    bool WaferStack::is_ok(void) {\r\n        return this->_environment && this->_resist && this->_substrate;\r\n    }\r\n\r\n    SharedAbstractWaferLayer WaferStack::operator[](int32_t i) const {\r\n        // Make available circular indexing and negative indexing, e.g. -1 => last item\r\n        return this->_layers[(this->_layers.size() + i) % this->_layers.size()];\r\n    }\r\n\r\n    SharedAbstractWaferLayer WaferStack::environment(void) const {\r\n        return this->_environment;\r\n    }\r\n\r\n    SharedAbstractWaferLayer WaferStack::resist(void) const {\r\n        return this->_resist;\r\n    }\r\n\r\n    SharedAbstractWaferLayer WaferStack::substrate(void) const {\r\n        return this->_substrate;\r\n    }\r\n\r\n    uint32_t WaferStack::index_of(SharedAbstractWaferLayer layer) const {\r\n        return std::find(this->_layers.begin(), this->_layers.end(), layer) - this->_layers.begin();\r\n    }\r\n\r\n    std::complex<double> WaferStack::reflectivity(uint32_t indx, double wavelength) {\r\n        if (indx == 0 || indx > this->_layers.size()-1) {\r\n            throw std::out_of_range(\"Can't calculate reflectivity for \"\r\n                    \"environment layer or layer that isn't in list\");\r\n        }\r\n\r\n        arma::cx_double ro12 = WaferStack::_reflection(\r\n                this->_layers[indx-1]->effective_refraction(0.0, wavelength),\r\n                this->_layers[indx]->effective_refraction(0.0, wavelength));\r\n\r\n        arma::cx_vec bottom_reflections = *this->effective_bottom_reflection(0.0, 0.0, wavelength);\r\n\r\n        arma::cx_double ro23e = bottom_reflections(indx);\r\n        arma::cx_double tau2d = this->_layers[indx]->internal_transmit(wavelength, 2.0);\r\n\r\n        arma::cx_double v = (ro12 + ro23e * tau2d) / (1.0 + ro12*ro23e * tau2d);\r\n\r\n    //\tLOG(INFO) << \"indx = \" << indx << \"ro12 = \" << ro12 << \" ro23e = \"\r\n    //\t\t\t<< ro23e << \" tau2d = \" << tau2d << \" v = \" << v;\r\n\r\n        return v;\r\n    }\r\n\r\n    // This routine only suitable for the stack where resist is the SECOND layer!\r\n    std::complex<double> WaferStack::standing_waves(double cx, double cy, double dz, double wavelength) {\r\n        arma::cx_vec reflections = *this->effective_bottom_reflection(cx, cy, wavelength);\r\n        double cxy = sqrt(cx*cx + cy*cy);\r\n\r\n        arma::cx_double env_angle = std::asin(cxy);\r\n        arma::cx_double resist_angle = WaferStack::_angle(env_angle,\r\n                this->environment()->refraction(wavelength), this->resist()->refraction(wavelength));\r\n\r\n        arma::cx_double reffenv = this->environment()->effective_refraction(env_angle, wavelength);\r\n        arma::cx_double reffres = this->resist()->effective_refraction(resist_angle, wavelength);\r\n\r\n        arma::cx_double tau12 = WaferStack::_transmittance(reffenv, reffres);\r\n        arma::cx_double ro12 = reflections(0);\r\n        arma::cx_double ro23e = reflections(1);\r\n        arma::cx_double dtau = this->resist()->internal_transmit(resist_angle, this->resist()->thickness, wavelength);\r\n        arma::cx_double tau2d = dtau * dtau;\r\n        arma::cx_double ztau = this->resist()->internal_transmit(resist_angle, dz, wavelength);\r\n        arma::cx_double num = tau12 * (ztau + ro23e*tau2d/ztau);\r\n        arma::cx_double den = 1.0 + ro12*ro23e*tau2d;\r\n        arma::cx_double standing_wave = num / den;\r\n    //\tLOG(INFO) << \"cx = \" << cx << \" cy = \" << cy << \" dz = \" << dz << \" wvl = \" << wavelength << std::endl\r\n    //\t\t\t<< \" angle env = \" << env_angle << \" angl res = \" << resist_angle << std::endl\r\n    //\t\t\t<< \" reffenv = \" << reffenv << \" reffres = \" << reffres << \" tau12 = \" << tau12 << std::endl\r\n    //\t\t\t<< \" coef = \" << ztau << \" ro12 = \" << reflections(0) << \" ro23e = \" << reflections(1) << std::endl\r\n    //\t\t\t<< \" standing wave = \" << standing_wave;\r\n        return standing_wave;\r\n    }\r\n\r\n    bool WaferStack::operator==(const WaferStack& other) const {\r\n        return this->_layers == other._layers;\r\n    }\r\n\r\n\r\n    // =========================================== OpticalTransferFunction ========================================== //\r\n\r\n\r\n    // Calculate optical transfer function value for given direction cosines values cx, cy\r\n    // and given offset from the resist top dz.\r\n    arma::cx_double OpticalTransferFunction::calc(double cx, double cy, double dz) {\r\n        arma::cx_double otf = 1.0;\r\n        if (within_circle(cx, cy, this->_numeric_aperture)) {\r\n            otf *= this->_imaging_tool->filter(cx, cy);\r\n            otf *= this->_imaging_tool->reduction(cx, cy);\r\n            if (this->_exposure) {\r\n                otf *= this->_exposure->defocus(cx, cy, this->_wavelength);\r\n            }\r\n            if (this->_wafer_stack) {\r\n                otf *= this->_wafer_stack->standing_waves(cx, cy, dz, this->_wavelength);\r\n            }\r\n        } else {\r\n            otf = 0.0;\r\n        }\r\n        return otf;\r\n    }\r\n\r\n    ConstSharedImagingTool OpticalTransferFunction::imaging_tool(void) const {\r\n        return this->_imaging_tool;\r\n    }\r\n\r\n    ConstSharedExposure OpticalTransferFunction::exposure(void) const {\r\n        return this->_exposure;\r\n    }\r\n\r\n    ConstSharedWaferStack OpticalTransferFunction::wafer_stack(void) const {\r\n        return this->_wafer_stack;\r\n    }\r\n    \r\n}  // namespace oplc\r\n"
  },
  {
    "path": "OptolithiumC/src/opl_contours.cpp",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#include \"opl_contours.h\"\n\n\nnamespace contours {\n\n\tusing namespace geometry;\n\n\t/* ==================================== ContourEngine ==================================== */\n\n\tinline double _get_level(int32_t r, int32_t c, const arma::mat& values, double level, int32_t sign) {\n        int32_t n_rows = static_cast<int32_t>(values.n_rows);\n        int32_t n_cols = static_cast<int32_t>(values.n_cols);\n\t\tif (r >= 0 && c >= 0 && r < n_rows && c < n_cols) {\n\t\t\treturn values(r, c) - level;\n\t\t} else {\n\t\t\treturn static_cast<double>(sign);\n\t\t}\n\t}\n\n\tinline void _calc_level_array(double *f, int32_t r, int32_t c,\n\t\t\tconst arma::mat& values, double level, int32_t sign) {\n\t\tf[0] = _get_level(r-1, c-1, values, level, sign);\n\t\tf[1] = _get_level(r-1, c, values, level, sign);\n\t\tf[3] = _get_level(r, c-1, values, level, sign);\n\t\tf[2] = _get_level(r, c, values, level, sign);\n\n\t\tfor (uint32_t k = 0; k < 4; k++) {\n\t\t\tif (std::abs(f[k]) < std::numeric_limits<double>::epsilon()) {\n\t\t\t\tf[k] = std::numeric_limits<double>::epsilon();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid _ContourEngine::_mark_facets(double lvl, int32_t sign) {\n\t\tconst arma::mat& values = *this->_values;\n\t\tCharMat& marks = this->_marks;\n\n\t\tdouble f[4];\n\n\t\tfor (int32_t c = 0; c < static_cast<int32_t>(marks.n_cols); c++) {\n\t\t\tfor (int32_t r = 0; r < static_cast<int32_t>(marks.n_rows); r++) {\n\t\t\t\t_calc_level_array(f, r, c, values, lvl, sign);\n\n\t\t\t\tif (f[1] * f[2] < 0) {\n\t\t\t\t\tmarks(r, c) += 2;\n\t\t\t\t}\n\n\t\t\t\tif (f[0] * f[3] < 0) {\n\t\t\t\t\tmarks(r, c) += 8;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (int32_t r = 0; r < static_cast<int32_t>(marks.n_rows); r++) {\n\t\t\tfor (int32_t c = 0; c < static_cast<int32_t>(marks.n_cols); c++) {\n\t\t\t\t_calc_level_array(f, r, c, values, lvl, sign);\n\n\t\t\t\tif (f[0] * f[1] < 0) {\n\t\t\t\t\tmarks(r, c) += 1;\n\t\t\t\t}\n\n\t\t\t\tif (f[2] * f[3] < 0) {\n\t\t\t\t\tmarks(r, c) += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid _ContourEngine::_drawcn(double lvl, int32_t r, int32_t c, Point2d ct, uint8_t start_edge, bool first) {\n\t\tdouble px[4], py[4], pz[4], tmp;\n\t\tuint32_t stop_edge, pt[2];\n\n\t\tconst arma::vec& x = *this->_x;\n\t\tconst arma::vec& y = *this->_y;\n\t\tconst arma::mat& values = *this->_values;\n\n\t\tCharMat& marks = this->_marks;\n\n\t\t// Continue while next facet is not done yet.\n\t\twhile (r >= 0 && c >= 0 && \n               r < static_cast<int32_t>(marks.n_rows) && \n               c < static_cast<int32_t>(marks.n_cols) && \n               marks(r, c) > 0) {\n\t\t\t//get x, y, and z - lvl for current facet\n\t\t\tpx[0] = px[3] = (c-1 < 0) ? x(c) : x(c-1);\n\t\t\tpx[1] = px[2] = (c == static_cast<int32_t>(x.n_elem)) ? x(c-1) : x(c);\n\n\t\t\tpy[0] = py[1] = (r-1 < 0) ? y(r) : y(r-1);\n\t\t\tpy[2] = py[3] = (r == static_cast<int32_t>(y.n_elem)) ? y(r-1) : y(r);\n\n\t\t\t_calc_level_array(pz, r, c, values, lvl, -1.0);\n\n\t\t\t// Get mark value of current facet.\n\t\t\tchar id = marks(r, c);\n\n\t\t\t// Check startedge s.\n\t\t\tif (start_edge == 255) {\n\t\t\t\t// Find start edge.\n\t\t\t\tfor (uint32_t k = 0; k < 4; k++) {\n\t\t\t\t\tif (static_cast<char>(1 << k) & id) {\n\t\t\t\t\t\tstart_edge = k;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (start_edge != 255) {\n\t\t\t\t// Decrease mark value of current facet for start edge.\n\t\t\t\tmarks(r, c) -= static_cast<char>(1 << start_edge);\n\n\t\t\t\t// Next point (clockwise).\n\t\t\t\tpt[0] = start_edge;\n\t\t\t\tpt[1] = (pt[0] + 1) % 4;\n\n\t\t\t\tSharedArrayOfSharedPoints contour = nullptr;\n\n\t\t\t\t// Calculate contour segment start if first of contour.\n\t\t\t\tif (first) {\n\t\t\t\t\ttmp = std::abs(pz[pt[1]]) / std::abs(pz[pt[0]]);\n\n\t\t\t\t\tif (std::isnan(tmp)) {\n\t\t\t\t\t\tct.x = ct.y = 0.5;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tct.x = px[pt[0]] + (px[pt[1]] - px[pt[0]])/(1 + tmp);\n\t\t\t\t\t\tct.y = py[pt[0]] + (py[pt[1]] - py[pt[0]])/(1 + tmp);\n//\t\t\t\t\t\tVLOG(9) << \"Set as first ct to \" << ct.str();\n\t\t\t\t\t}\n\n\t\t\t\t\tcontour = std::make_shared<ArrayOfSharedPoints2d>();\n\t\t\t\t\tSharedPoint2d point = std::make_shared<Point2d>(ct);\n\t\t\t\t\tcontour->push_back(point);\n\t\t\t\t\tthis->_contours_list.push_back(contour);\n\t\t\t\t\tfirst = false;\n\t\t\t\t} else {\n\t\t\t\t\tcontour = this->_contours_list.back();\n\t\t\t\t}\n\n\t\t\t\t// Find stop edge.\n\t\t\t\tfor (uint32_t k = 1; k <= 4; k++) {\n\t\t\t\t\tif (start_edge == 0 || start_edge == 2) {\n\t\t\t\t\t\tstop_edge = (start_edge + k) % 4;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstop_edge = (start_edge - k) % 4;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (static_cast<char>(1 << stop_edge) & id) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tpt[0] = stop_edge;\n\t\t\t\tpt[1] = (pt[0] + 1) % 4;\n\t\t\t\ttmp = std::abs(pz[pt[1]]) / std::abs(pz[pt[0]]);\n\n\t\t\t\tif (std::isnan(tmp)) {\n\t\t\t\t\tct.x = ct.y = 0.5;\n\t\t\t\t} else {\n//\t\t\t\t\tVLOG(9) << \"Set ct to \" << ct.str();\n\t\t\t\t\tct.x = px[pt[0]] + (px[pt[1]] - px[pt[0]])/(1 + tmp);\n\t\t\t\t\tct.y = py[pt[0]] + (py[pt[1]] - py[pt[0]])/(1 + tmp);\n\t\t\t\t}\n\n\t\t\t\t// Add point to contour.\n\t\t\t\tSharedPoint2d point = std::make_shared<Point2d>(ct);\n\t\t\t\tcontour->push_back(point);\n\n\t\t\t\t// Decrease id value of current facet for start edge.\n\t\t\t\tmarks(r, c) -= static_cast<char>(1 << stop_edge);\n\n\t\t\t\tif (stop_edge == 0) {\n\t\t\t\t\tr--;\n\t\t\t\t} else if (stop_edge == 1) {\n\t\t\t\t\tc++;\n\t\t\t\t} else if (stop_edge == 2) {\n\t\t\t\t\tr++;\n\t\t\t\t} else if (stop_edge == 3) {\n\t\t\t\t\tc--;\n\t\t\t\t}\n\n\t\t\t\tstart_edge = (stop_edge + 2) % 4;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid _ContourEngine::_calculate_level_lines(double level) {\n\t\tconst arma::mat& values = *this->_values;\n\t\tCharMat& marks = this->_marks;\n        \n\t\tfor (int32_t c = 0; c < static_cast<int32_t>(this->_values->n_cols); c++)\n\t\t{\n\t\t\tif (marks(0, c) & 1) {\n\t\t\t\tthis->_drawcn(level, 0, c, Point2d(), 0, true);\n\t\t\t}\n\n\t\t\tif (marks(static_cast<int32_t>(values.n_rows)-2, c) & 4) {\n\t\t\t\tthis->_drawcn(level, static_cast<int32_t>(values.n_rows)-2, c, Point2d(), 2, true);\n\t\t\t}\n\t\t}\n\n\t\tfor (int32_t r = 0; r < static_cast<int32_t>(values.n_rows); r++)\n\t\t{\n\t\t\tif (marks(r, 0) & 8) {\n\t\t\t\tthis->_drawcn(level, r, 0, Point2d(), 3, true);\n\t\t\t}\n\n\t\t\tif (marks(r, static_cast<int32_t>(values.n_cols)-2) & 2) {\n\t\t\t\tthis->_drawcn(level, r, static_cast<int32_t>(values.n_cols)-2, Point2d(), 1, true);\n\t\t\t}\n\t\t}\n        \n\t\tfor (int32_t r = 0; r < static_cast<int32_t>(values.n_rows); r++) {\n\t\t\tfor (int32_t c = 0; c < static_cast<int32_t>(values.n_cols); c++) {\n\t\t\t\tif (marks(r, c) > 0) {\n\t\t\t\t\tthis->_drawcn(level, r, c, Point2d(), 255, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n//\t\tfor (auto contour : this->_contours_list) {\n//\t\t\tVLOG(9) << \"------------ Found contour ------------\";\n//\t\t\tfor (auto point : *contour) {\n//\t\t\t\tVLOG(9) << point->str();\n//\t\t\t}\n//\t\t}\n\n\t\tthis->_marks.clear();\n\t}\n\n\tvoid _ContourEngine::_erase_contour(SharedArrayOfSharedPoints contour) {\n\t\tfor (auto it = this->_contours_list.begin(); it != this->_contours_list.end(); it++) {\n\t\t\tif (*it == contour) {\n\t\t\t\tthis->_contours_list.erase(it);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid _ContourEngine::_extract_polygons(void) {\n\t\tfor (auto contour : this->_contours_list) {\n\t\t\tSharedPolygon polygon = std::make_shared<PolygonGeometry>(*contour);\n\t\t\tpolygon->clean();\n\t\t\tthis->_polygons.push_back(polygon);\n\t\t}\n\t\tthis->_contours_list.clear();\n\t}\n\n\t_ContourEngine::_ContourEngine(const arma::vec& x, const arma::vec& y,\n\t\t\tconst arma::mat& values, double level, bool negative) :\n\t\t_x(std::make_shared<arma::vec>(x)), _y(std::make_shared<arma::vec>(y)),\n\t\t_values(std::make_shared<arma::mat>(values)) {\n\n\t\tif (y.n_elem != values.n_rows || x.n_elem != values.n_cols) {\n\t\t\tthrow std::invalid_argument(\"Values cols must be equal to X size and rows must be equal to Y size\");\n\t\t}\n\n\t\tconst int32_t sign = negative ? -1 : 1;\n\n\t\tthis->_marks = CharMat(values.n_rows+1, values.n_cols+1, arma::fill::zeros);\n\n\t\tVLOG(8) << \"Make facets at \" << level << \" with sign \" << sign;\n\t\tthis->_mark_facets(level, sign);\n\n//\t\tfor (uint32_t r = 0; r < this->_marks.n_rows; r++) {\n//\t\t\tfor (uint32_t c = 0; c < this->_marks.n_cols; c++) {\n//\t\t\t\tif (this->_marks(r, c) == 0) {\n//\t\t\t\t\tprintf(\"   \");\n//\t\t\t\t} else {\n//\t\t\t\t\tprintf(\"%02d \", this->_marks(r, c));\n//\t\t\t\t}\n//\t\t\t}\n//\t\t\tprintf(\"\\n\");\n//\t\t}\n\n\t\tVLOG(8) << \"Calculate level lines at \" << level;\n\t\tthis->_calculate_level_lines(level);\n\t\tVLOG(8) << \"Extract polygons\";\n\t\tthis->_extract_polygons();\n\t\tVLOG(8) << \"Contours done\";\n\t}\n\n\tArrayOfSharedPolygons _ContourEngine::polygons(void) const {\n\t\treturn this->_polygons;\n\t}\n\n\t/* ==================================== _SurfaceEngine ==================================== */\n\n\tconst uint32_t _SurfaceEngine::edgeTable[256] = {\n\t\t0x0  , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,\n\t\t0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,\n\t\t0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,\n\t\t0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,\n\t\t0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c,\n\t\t0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,\n\t\t0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac,\n\t\t0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,\n\t\t0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c,\n\t\t0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,\n\t\t0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc,\n\t\t0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,\n\t\t0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c,\n\t\t0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,\n\t\t0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc ,\n\t\t0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,\n\t\t0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,\n\t\t0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,\n\t\t0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,\n\t\t0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,\n\t\t0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,\n\t\t0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,\n\t\t0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,\n\t\t0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460,\n\t\t0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,\n\t\t0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0,\n\t\t0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,\n\t\t0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230,\n\t\t0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,\n\t\t0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190,\n\t\t0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,\n\t\t0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0\n\t};\n\n\tconst int32_t _SurfaceEngine::triTable[256][16] = {\n\t\t{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1},\n\t\t{3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1},\n\t\t{3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1},\n\t\t{3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1},\n\t\t{2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1},\n\t\t{8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1},\n\t\t{4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1},\n\t\t{3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1},\n\t\t{4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1},\n\t\t{4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1},\n\t\t{5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1},\n\t\t{2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1},\n\t\t{9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1},\n\t\t{2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1},\n\t\t{10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1},\n\t\t{4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1},\n\t\t{5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1},\n\t\t{5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1},\n\t\t{10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1},\n\t\t{8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1},\n\t\t{2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1},\n\t\t{7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1},\n\t\t{2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1},\n\t\t{11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1},\n\t\t{5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1},\n\t\t{11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1},\n\t\t{11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1},\n\t\t{5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1},\n\t\t{2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1},\n\t\t{5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1},\n\t\t{6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1},\n\t\t{3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1},\n\t\t{6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1},\n\t\t{5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1},\n\t\t{10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1},\n\t\t{6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1},\n\t\t{8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1},\n\t\t{7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1},\n\t\t{3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1},\n\t\t{5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1},\n\t\t{0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1},\n\t\t{9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1},\n\t\t{8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1},\n\t\t{5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1},\n\t\t{0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1},\n\t\t{6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1},\n\t\t{10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1},\n\t\t{10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1},\n\t\t{8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1},\n\t\t{1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1},\n\t\t{3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1},\n\t\t{0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1},\n\t\t{10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1},\n\t\t{3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1},\n\t\t{6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1},\n\t\t{9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1},\n\t\t{8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1},\n\t\t{3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1},\n\t\t{6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1},\n\t\t{10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1},\n\t\t{10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1},\n\t\t{2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1},\n\t\t{7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1},\n\t\t{7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1},\n\t\t{2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1},\n\t\t{1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1},\n\t\t{11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1},\n\t\t{8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1},\n\t\t{0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1},\n\t\t{7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1},\n\t\t{10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1},\n\t\t{2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1},\n\t\t{6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1},\n\t\t{7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1},\n\t\t{2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1},\n\t\t{10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1},\n\t\t{10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1},\n\t\t{0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1},\n\t\t{7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1},\n\t\t{6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1},\n\t\t{8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1},\n\t\t{6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1},\n\t\t{4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1},\n\t\t{10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1},\n\t\t{8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1},\n\t\t{1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1},\n\t\t{8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1},\n\t\t{10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1},\n\t\t{4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1},\n\t\t{10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1},\n\t\t{5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1},\n\t\t{11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1},\n\t\t{9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1},\n\t\t{6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1},\n\t\t{7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1},\n\t\t{3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1},\n\t\t{7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1},\n\t\t{3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1},\n\t\t{6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1},\n\t\t{9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1},\n\t\t{1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1},\n\t\t{4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1},\n\t\t{7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1},\n\t\t{6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1},\n\t\t{3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1},\n\t\t{0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1},\n\t\t{6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1},\n\t\t{0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1},\n\t\t{11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1},\n\t\t{6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1},\n\t\t{5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1},\n\t\t{9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1},\n\t\t{1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1},\n\t\t{10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1},\n\t\t{0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1},\n\t\t{5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1},\n\t\t{10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1},\n\t\t{11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1},\n\t\t{9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1},\n\t\t{7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1},\n\t\t{2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1},\n\t\t{8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1},\n\t\t{9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1},\n\t\t{9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1},\n\t\t{1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1},\n\t\t{5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1},\n\t\t{0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1},\n\t\t{10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1},\n\t\t{2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1},\n\t\t{0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1},\n\t\t{0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1},\n\t\t{9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1},\n\t\t{5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1},\n\t\t{3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1},\n\t\t{5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1},\n\t\t{8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1},\n\t\t{9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1},\n\t\t{1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1},\n\t\t{3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1},\n\t\t{4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1},\n\t\t{9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1},\n\t\t{11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1},\n\t\t{11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1},\n\t\t{2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1},\n\t\t{9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1},\n\t\t{3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1},\n\t\t{1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1},\n\t\t{4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1},\n\t\t{4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1},\n\t\t{3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1},\n\t\t{3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1},\n\t\t{0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1},\n\t\t{9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1},\n\t\t{1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n\t\t{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}\n\t};\n\n\tconst uint32_t _SurfaceEngine::indexes_p[12] = {0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3};\n\tconst uint32_t _SurfaceEngine::indexes_q[12] = {1, 2, 3, 0, 5, 6, 7, 4, 4, 5, 6, 7};\n\n\tuint32_t _SurfaceEngine::_calculate_table_index(const _SurfaceCell& cell, double level, int32_t negative) {\n\t\tuint32_t table_index = 0;\n\t\tfor (uint32_t k = 0; k < 8; k++) {\n\t\t\tif (negative*(level - cell.values[k]) > 0) {\n\t\t\t\ttable_index |= (1 << k);\n\t\t\t}\n\t\t}\n//\t\tif (negative*cell.values[7] < negative*level) table_index |= 0x80;  // Vertex 7\n\t\treturn table_index;\n\t}\n\n\tArrayOfSharedPoints3d _SurfaceEngine::_calculate_vertices(const _SurfaceCell& cell, uint32_t edge_code, double level) {\n\t\tArrayOfSharedPoints3d verteces;\n\n\t\tverteces.resize(12);\n\n\t\tif (edge_code == 0) {\n\t\t\treturn verteces;\n\t\t}\n\n\t\t/* Find the vertices where the surface intersects the cube */\n\t\tfor (uint32_t k = 0; k < 12; k++) {\n\t\t\tif (edge_code & (1 << k)) {\n\t\t\t\tdouble v1 = cell.values[_SurfaceEngine::indexes_p[k]];\n\t\t\t\tdouble v2 = cell.values[_SurfaceEngine::indexes_q[k]];\n\t\t\t\tconst Point3d& p = cell.points[_SurfaceEngine::indexes_p[k]];\n\t\t\t\tconst Point3d& q = cell.points[_SurfaceEngine::indexes_q[k]];\n\t\t\t\tverteces[k] = std::make_shared<Point3d>(_SurfaceEngine::_linear_interp3d(level, p, q, v1, v2));\n\t\t\t}\n\t\t}\n\n\t\treturn verteces;\n\t}\n\n\tvoid _SurfaceEngine::_process_verteces(ArrayOfSharedPoints3d verteces, const int32_t tri_codes[]) {\n\t\tfor (uint32_t k = 0; tri_codes[k] != -1; k += 3) {\n\t\t\tSharedPoint3d a = verteces[tri_codes[k  ]];\n\t\t\tSharedPoint3d b = verteces[tri_codes[k+1]];\n\t\t\tSharedPoint3d c = verteces[tri_codes[k+2]];\n\t\t\tif (!a || !b || !c) {\n\t\t\t\tthrow std::runtime_error(\"One of triangle vertex is null: \"\n\t\t\t\t\t\t\"something wrong with Marching Cubes algorithm\");\n\t\t\t}\n\t\t\tSharedTriangle3d triangle = std::make_shared<Triangle3d>(a, b, c);\n\t\t\tthis->_triangles.push_back(triangle);\n\t\t}\n\n\t\tfor (auto vertex : verteces) {\n\t\t\tif (vertex) {\n\t\t\t\tthis->_verteces.push_back(vertex);\n\t\t\t}\n\t\t}\n\t}\n\n\t_SurfaceEngine::_SurfaceEngine(const arma::vec& x, const arma::vec& y, const arma::vec& z,\n\t\t\tconst arma::cube& values, const double level, const int32_t negative) :\n\t\t\t_x(x), _y(y), _z(z), _values(values), _level(level), _negative(negative) {\n\n\t\tfor (uint32_t r = 0; r < y.n_elem; r++) {\n\t\t\tfor (uint32_t c = 0; c < x.n_elem; c++) {\n\t\t\t\tfor (uint32_t s = 0; s < z.n_elem; s++) {\n\t\t\t\t\t_SurfaceCell cell(this, r, c, s);\n\n\t\t\t\t\t//std::cout << cell.str() << std::endl;\n\n\t\t\t\t\tuint32_t table_index = _SurfaceEngine::_calculate_table_index(cell, this->_level, this->_negative);\n\n\t\t\t\t\tuint32_t edge_code = _SurfaceEngine::edgeTable[table_index];\n\t\t\t\t\tconst int32_t* tri_codes = _SurfaceEngine::triTable[table_index];\n\n\t\t\t\t\tArrayOfSharedPoints3d verteces = _SurfaceEngine::_calculate_vertices(cell, edge_code, this->_level);\n\t\t\t\t\tthis->_process_verteces(verteces, tri_codes);\n\t\t\t\t}  // end for-s\n\t\t\t}  // end for-c\n\t\t}  // end for r\n\n\t}\n\n\tSharedSurface3d _SurfaceEngine::surface(void) const {\n\t\treturn std::make_shared<Surface3d>(this->_verteces, this->_triangles);\n\t}\n\n\t/* ==================================== Routines ==================================== */\n\n\tArrayOfSharedPolygons contours(const arma::vec& x, const arma::vec& y,\n\t\t\tconst arma::mat& values, double level, bool negative) {\n\t\t_ContourEngine ce = _ContourEngine(x, y, values, level, negative);\n\t\treturn ce.polygons();\n\t}\n\n\tSharedSurface3d isosurface(const arma::vec& x, const arma::vec& y, const arma::vec& z,\n\t\t\tconst arma::cube& values, double level, bool negative) {\n\t\t_SurfaceEngine se = _SurfaceEngine(x, y, z, values, level, negative);\n\t\treturn se.surface();\n\t}\n}\n"
  },
  {
    "path": "OptolithiumC/src/opl_geometry.cpp",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#include \"opl_geometry.h\"\n#include \"opl_misc.h\"\n\nnamespace geometry {\n\n\t/* ==================================== Point ==================================== */\n\n\tPoint2d Point2d::operator+(const Point2d& p) const {\n\t\treturn Point2d(this->x + p.x, this->y + p.y);\n\t}\n\n\tPoint2d Point2d::operator+(double s) const {\n\t\treturn Point2d(this->x + s, this->y + s);\n\t}\n\n\tPoint2d Point2d::operator-(const Point2d& p) const {\n\t\treturn Point2d(this->x - p.x, this->y - p.y);\n\t}\n\n\tPoint2d Point2d::operator-(double s) const {\n\t\treturn Point2d(this->x - s, this->y - s);\n\t}\n\n\tPoint2d operator* (double s, const Point2d& p) {\n\t\treturn Point2d(s * p.x, s * p.y);\n\t}\n\n\tPoint2d operator/ (const Point2d& p, double s) {\n\t\treturn Point2d(p.x/s, p.y/s);\n\t}\n\n\tdouble dot(const Point2d& p, const Point2d& q) {\n\t\treturn p.x*q.x + p.y*q.y;\n\t}\n\n\tdouble& Point2d::operator[](uint32_t i) {\n\t\treturn (i == 0) ? this->x : this->y;\n\t}\n\n\tdouble Point2d::operator[](uint32_t i) const {\n\t\treturn (i == 0) ? this->x : this->y;\n\t}\n\n\tbool Point2d::operator==(const Point2d& p) const {\n\t\treturn (this->x == p.x) && (this->y == p.y);\n\t}\n\n\tbool Point2d::operator!=(const Point2d& p) const {\n\t\treturn (this->x != p.x) || (this->y != p.y);\n\t}\n\n\tbool Point2d::operator<(const Point2d& p) const {\n\t\treturn ((this->x < p.x) || ((this->x == p.x) && (this->y < p.y)));\n\t}\n\n\tbool Point2d::operator>(const Point2d& p) const {\n\t\treturn ((this->x > p.x) || ((this->x == p.x) && (this->y > p.y)));\n\t}\n\n\tPoint2d& Point2d::operator+=(const Point2d& rhs) {\n\t\tthis->x += rhs.x;\n\t\tthis->y += rhs.y;\n\t\treturn *this;\n\t}\n\n\tPoint2d& Point2d::operator-=(const Point2d& rhs) {\n\t\tthis->x -= rhs.x;\n\t\tthis->y -= rhs.y;\n\t\treturn *this;\n\t}\n\n\tPoint2d& Point2d::abs(void) {\n\t\tthis->x = (this->x >= 0) ? this->x : -this->x;\n\t\tthis->y = (this->y >= 0) ? this->y : -this->y;\n\t\treturn *this;\n\t}\n\n\tclassify_type_t Point2d::classify(const Point2d& p0, const Point2d& p1, double precision) const {\n\t\tPoint2d p2 = *this;\n\t\tPoint2d a = p1 - p0;\n\t\tPoint2d b = p2 - p0;\n\t\tdouble sa = a.x*b.y - b.x*a.y;\n\n\t\tif (sa > precision) {\n\t\t\treturn LEFT;\n\t\t} else if (sa < -precision) {\n\t\t\treturn RIGHT;\n\t\t} else if (a.x*b.x < 0 || a.y*b.y < 0) {\n\t\t\treturn BEHIND;\n\t\t} else if (a.length() < b.length()) {\n\t\t\treturn BEYOND;\n\t\t} else if (p0 == p2) {\n\t\t\treturn ORIGIN;\n\t\t} else if (p1 == p2) {\n\t\t\treturn DESTINATION;\n\t\t} else {\n\t\t\treturn BETWEEN;\n\t\t}\n\t}\n\n\tclassify_type_t Point2d::classify(const Edge2d& e, double precision) const {\n\t\treturn this->classify(e.org, e.dst, precision);\n\t}\n\n\tdouble Point2d::polar_angle(void) const {\n\t\tif (this->x == 0 && this->y == 0) {\n\t\t\treturn -1;\n\t\t} else if (this->x == 0) {\n\t\t\treturn ((this->y > 0.0) ? 90.0 : 270.0);\n\t\t}\n\n\t\tdouble theta = atan(this->y/this->x);\n\t\ttheta *= 360/(2*M_PI);\n\n\t\tif (x > 0)\n\t\t\treturn ((y >= 0) ? theta : 360.0 + theta);\n\t\telse\n\t\t\treturn\t180.0 + theta;\n\t}\n\n\tdouble Point2d::length(void) const {\n\t\treturn sqrt(this->x*this->x + this->y*this->y);\n\t}\n\n\tPoint2d Point2d::normal_intersect(const Edge2d& e) const {\n\t\tEdge2d ab = e;\n\t\tab.rot(CCW);\n\t\tPoint2d n(ab.dst - ab.org);\n\t\tEdge2d normal(*this, *this + n);\n\t\treturn e.point(normal);\n\t}\n\n\tdouble Point2d::distance(const Edge2d& e) const {\n\t\tPoint2d s = this->normal_intersect(e);\n\t\treturn Edge2d(*this, s).length();\n\t}\n\n\tvoid Point2d::transform(int32_t sign, double mag, double angle) {\n\t\tdouble xp = this->x, yp = this->y;\n\t\tdouble cos_ang = cos(angle), sin_ang = sin(angle);\n\n\t\tthis->x = mag * (xp * cos_ang - sign * yp * sin_ang);\n\t\tthis->y = mag * (xp * sin_ang + sign * yp * cos_ang);\n\t}\n\n\tstd::string Point2d::str(void) const {\n\t\tstd::ostringstream result;\n\t\tresult << \"(\" << this->x << \", \" << this->y << \")\";\n\t\treturn result.str();\n\t}\n\n\t/* ==================================== Edge ==================================== */\n\n\tEdge2d& Edge2d::rot(rotation_type_t dir) {\n\t\tint32_t sign = (dir == CW) ? -1 : 1;\n\t\tPoint2d m = 0.5 * (this->org + this->dst);\n\t\tPoint2d v = this->dst - this->org;\n\t\tPoint2d n(v.y, -v.x);\n\t\tthis->org = m + sign * 0.5 * n;\n\t\tthis->dst = m - sign * 0.5 * n;\n\t\treturn *this;\n\t}\n\n\tEdge2d& Edge2d::flip(void) {\n\t\tmisc::swap(this->dst.x, this->org.x);\n\t\tmisc::swap(this->dst.y, this->org.y);\n\t\treturn *this;\n\t}\n\n\tcross_type_t Edge2d::intersect(const Edge2d& e, double &t) const {\n\t\tPoint2d a = this->org;\n\t\tPoint2d b = this->dst;\n\t\tPoint2d c = e.org;\n\t\tPoint2d d = e.dst;\n\t\tPoint2d n = Point2d((d - c).y, (c - d).x);\n\t\tdouble denom = dot(n, b-a);\n\n\t\tif (denom == 0)\n\t\t{\n\t\t\tif (this->org.classify(e) == LEFT || this->org.classify(e) == RIGHT) {\n\t\t\t\treturn PARALLEL;\n\t\t\t} else {\n\t\t\t\treturn COLLINEAR;\n\t\t\t}\n\t\t}\n\t\tdouble num = dot(n, a-c);\n\t\tt = -num/denom;\n\t\treturn SKEW;\n\t}\n\n\t// Return intersection point between 'this' edge and edge represented as 't' value (line direction)\n\tPoint2d Edge2d::point(double t) const {\n\t\treturn Point2d(this->org + t*(this->dst - this->org));\n\t}\n\n\t// Return intersection point between 'this' edge and given edge 'e'\n\tPoint2d Edge2d::point(const Edge2d& e) const {\n\t\tdouble t = 0.0;\n\t\tthis->intersect(e, t);\n\t\treturn this->point(t);\n\t}\n\n\tcross_type_t Edge2d::cross_type(const Edge2d& e) const {\n\t\tdouble s = 0.0, t = 0.0;\n\n\t\tcross_type_t cross = e.intersect(*this, s);\n\t\tif (cross == COLLINEAR || cross == PARALLEL)\n\t\t\treturn cross;\n\n\t\tif (s < 0.0 || s > 1.0)\n\t\t\treturn SKEW_NO_CROSS;\n\n\t\t// Calculate t-value\n\t\tthis->intersect(e, t);\n\n\t\tif (0.0 <= t || t <= 1.0) {\n\t\t\treturn SKEW_CROSS;\n\t\t} else {\n\t\t\treturn SKEW_NO_CROSS;\n\t\t}\n\t}\n\n\tbool Edge2d::is_vertical(void) const {\n\t\treturn this->org.x == this->dst.x;\n\t}\n\n\tbool Edge2d::is_horizontal(void) const {\n\t\treturn this->org.y == this->dst.y;\n\t}\n\n\tdouble Edge2d::dx(void) const {\n\t\treturn this->dst.x - this->org.x;\n\t}\n\n\tdouble Edge2d::dy(void) const {\n\t\treturn this->dst.y - this->org.y;\n\t}\n\n\tSizes Edge2d::sizes(void) const {\n\t\treturn this->dst - this->org;\n\t}\n\n\tdouble Edge2d::length(void) const {\n\t\treturn this->sizes().length();\n\t}\n\n\tdouble Edge2d::slope(void) const {\n\t\tif (this->dx() != 0.0) {\n\t\t\treturn this->dy()/this->dx();\n\t\t} else {\n\t\t\t// Infinity slope\n\t\t\treturn this->dy() * INFINITY;\n\t\t}\n\t}\n\n\tdouble Edge2d::y(double x) const {\n\t\treturn this->slope()*(x - this->org.x) + this->org.y;\n\t}\n\n\t// Calculate the area of trapezoid between this edge, y-axis and two horizontal lines.\n\tdouble Edge2d::area(void) const {\n\t\treturn this->dx() * (this->dst.y + this->org.y) / 2.0;\n\t}\n\n\tstd::string Edge2d::str(void) const {\n\t\tstd::ostringstream result;\n\t\tresult << \"[\" << this->org.str() << \" -> \" << this->dst.str() << \"]\";\n\t\treturn result.str();\n\t}\n\n\tbool Edge2d::operator==(const Edge2d& other) const {\n\t\treturn this->org == other.org && this->dst == other.dst;\n\t}\n\n\t/* ==================================== AbstractGeometry ==================================== */\n\n\tSharedEdge2d AbstractGeometry::at(uint32_t index) const {\n\t\treturn this->_edges.at(index);\n\t}\n\n\tuint32_t AbstractGeometry::length(void) const {\n\t\treturn static_cast<uint32_t>(this->_edges.size());\n\t}\n\n\tdouble AbstractGeometry::signed_area(void) const {\n\t\tdouble result = 0.0;\n\t\tif (this->_axis == DIM_2D) {\n\t\t\tfor (auto edge : this->_edges) {\n\t\t\t\tresult += edge->area();\n\t\t\t}\n\t\t} else {\n\t\t\tSharedEdge2d e = this->front();\n\t\t\tuint32_t axis = this->_axis;\n\t\t\tresult = e->dst[axis] - e->org[axis];\n\t\t}\n\t\treturn result;\n\t}\n\n\tbool AbstractGeometry::set_bypass(rotation_type_t direction) {\n\t\tbool corrected = false;\n\t\tdouble area = this->signed_area();\n\t\tif (direction*area < 0) {\n\t\t\tcorrected = true;\n\t\t\tstd::reverse(this->_edges.begin(), this->_edges.end());\n\t\t\tfor (auto edge : this->_edges) {\n\t\t\t\tedge->flip();\n\t\t\t}\n\t\t}\n\t\treturn corrected;\n\t}\n\n\tdimension_t AbstractGeometry::axis(void) const {\n\t\treturn this->_axis;\n\t}\n\n\t/* ==================================== PolygonGeometry ==================================== */\n\n\tgeometry_t PolygonGeometry::type(void) const {\n\t\treturn GEOMETRY_POLYGON;\n\t}\n\n\t// Check whether input points represent one dimensional polygon\n\tbool PolygonGeometry::is_1d_possible(const ArrayOfSharedPoints2d &points) {\n\t\tif (points.size() == 2) {\n\t\t\tconst Edge2d edge = Edge2d(*points[0], *points[1]);\n\t\t\tif (edge.is_vertical() || edge.is_horizontal()) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tbool PolygonGeometry::is_2d_possible(const ArrayOfSharedPoints2d &points) {\n\t\treturn points.size() >= 3;\n\t}\n\n\tPolygonGeometry::PolygonGeometry(const ArrayOfSharedPoints2d &points) {\n\t\tif (PolygonGeometry::is_1d_possible(points)) {\n\t\t\tSharedEdge2d edge = std::make_shared<Edge2d>(*points.back(), *points.front());\n\t\t\tthis->_edges.push_back(edge);\n\t\t\tthis->_axis = edge->is_horizontal() ? DIM_1D_X : DIM_1D_Y;\n\t\t} else if (PolygonGeometry::is_2d_possible(points)) {\n\t\t\tauto start = points.begin();\n\t\t\tSharedPoint2d previous_point = *start;\n\t\t\tfor (auto it = ++start; it != points.end(); ++it) {\n\t\t\t\tSharedPoint2d current_point = *it;\n\t\t\t\tthis->_edges.push_back(std::make_shared<Edge2d>(*previous_point, *current_point));\n\t\t\t\tprevious_point = current_point;\n\t\t\t}\n\t\t\tthis->_edges.push_back(std::make_shared<Edge2d>(*points.back(), *points.front()));\n\t\t\tthis->_axis = DIM_2D;\n\t\t} else {\n\t\t\tthrow std::invalid_argument(\"Can't create region from passed points sequence!\");\n\t\t}\n\t}\n\n\tPolygonGeometry::PolygonGeometry(const PolygonGeometry& other) {\n\t\tthis->_axis = other._axis;\n\t\tfor (auto edge : other) {\n\t\t\tthis->_edges.push_back(std::make_shared<Edge2d>(*edge));\n\t\t}\n\t}\n\n\tbool PolygonGeometry::clean(void) {\n\t\tif (this->_axis == DIM_2D) {\n//\t\t\tLOG(INFO) << \"Clean polygon with \" << this->length() << \" edges\";\n\t\t\tbool deleted = false;\n\t\t\tauto it = this->begin();\n\t\t\twhile (this->length() && it != this->end()) {\n//\t\t\t\tSharedEdge prev_edge = *it.prev();\n//\t\t\t\tbool is_end = !(it.prev() != this->end());\n//\t\t\t\tLOG(INFO) << \"[\" << is_end << \"] Prev Edge[\" << it.prev().pos() << \"/\"\n//\t\t\t\t\t\t<< this->length() << \"] = \" << prev_edge->str();\n\n\t\t\t\tSharedEdge2d cur_edge = *it;\n//\t\t\t\tis_end = !(it != this->end());\n//\t\t\t\tLOG(INFO) << \"[\" << is_end << \"] Cur  Edge[\" << it.pos() << \"/\"\n//\t\t\t\t\t\t<< this->length() << \"] = \" << cur_edge->str();\n\n\t\t\t\tSharedEdge2d next_edge = *it.next();\n//\t\t\t\tis_end = !(it.next() != this->end());\n//\t\t\t\tLOG(INFO) << \"[\" << is_end << \"] Next Edge[\" << it.next().pos() << \"/\"\n//\t\t\t\t\t\t<< this->length() << \"] = \" << next_edge->str();\n\n\t\t\t\tbool remove_required = false;\n\t\t\t\tif (cur_edge->length() == 0.0) {\n\t\t\t\t\tremove_required = true;\n\t\t\t\t} else {\n\t\t\t\t\tdouble tmp = 0.0;\n\t\t\t\t\tif (cur_edge->intersect(*next_edge, tmp) == COLLINEAR) {\n\t\t\t\t\t\tremove_required = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (remove_required) {\n//\t\t\t\t\tLOG(INFO) << \"---> Erase edge: \" << (*it)->str();\n\t\t\t\t\tthis->_edges.erase(this->_edges.begin() + it.pos());\n\t\t\t\t\t(*it)->org = (*it.prev())->dst;\n\t\t\t\t\tdeleted = true;\n\t\t\t\t} else {\n\t\t\t\t\t++it;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis->_edges.shrink_to_fit();\n\n//\t\t\tLOG(INFO) << \"Cleaned polygon[\" << deleted << \"] \" << this->str();\n\n\t\t\treturn deleted;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tstd::string PolygonGeometry::str(void) const {\n\t\tstd::ostringstream result;\n\t\tresult << \"PolygonGeometry {\";\n\t\tfor (auto edge : this->_edges) {\n\t\t\tresult << std::endl << \"\\t\" << edge->str();\n\t\t}\n\t\tresult << \"};\";\n\t\treturn result.str();\n\t}\n\n\tbool PolygonGeometry::operator==(const AbstractGeometry& other) const {\n\t\treturn this->type() == other.type() && misc::safe_vector_equal(this->_edges,\n\t\t\t\tdynamic_cast<const PolygonGeometry*>(&other)->_edges);\n\t}\n\n\t/* ==================================== RectangleGeometry ==================================== */\n\n\tgeometry_t RectangleGeometry::type(void) const {\n\t\treturn GEOMETRY_BOX;\n\t}\n\n\tRectangleGeometry::RectangleGeometry(const Point2d& lb, const Point2d& rt) : _diag(Edge2d(lb, rt)) {\n\t\tthis->_sizes = this->_diag.sizes();\n\n\t\tif (this->_sizes.x != 0.0 && this->_sizes.y != 0.0) {\n\t\t\tthis->_axis = DIM_2D;\n\n\t\t\tthis->_edges = {\n\t\t\t\tstd::make_shared<Edge2d>(lb.x, lb.y, rt.x, lb.y),\n\t\t\t\tstd::make_shared<Edge2d>(rt.x, lb.y, rt.x, rt.y),\n\t\t\t\tstd::make_shared<Edge2d>(rt.x, rt.y, lb.x, rt.y),\n\t\t\t\tstd::make_shared<Edge2d>(lb.x, rt.y, lb.x, lb.y)\n\t\t\t};\n\t\t} else if (this->_sizes.x != 0.0) {\n\t\t\tthis->_axis = DIM_1D_X;\n\t\t\tthis->_edges = { std::make_shared<Edge2d>(this->_diag) };\n\t\t} else {\n\t\t\tthis->_axis = DIM_1D_Y;\n\t\t\tthis->_edges = { std::make_shared<Edge2d>(this->_diag) };\n\t\t}\n\t}\n\n\tRectangleGeometry::RectangleGeometry(ArrayOfSharedPoints2d points) : RectangleGeometry(*points[0], *points[1]) { }\n\n\tRectangleGeometry::RectangleGeometry(const RectangleGeometry& other) :\n\t\tRectangleGeometry(other.left_bottom(), other.right_top()) { }\n\n\tPoint2d RectangleGeometry::left_bottom(void) const {\n\t\treturn this->_diag.org;\n\t}\n\n\tPoint2d RectangleGeometry::right_top(void) const {\n\t\treturn this->_diag.dst;\n\t}\n\n\tEdge2d RectangleGeometry::diag(void) const {\n\t\treturn this->_diag;\n\t}\n\n\tSizes RectangleGeometry::sizes(void) const {\n\t\treturn this->_sizes;\n\t}\n\n\tbool RectangleGeometry::set_bypass(rotation_type_t direction) {\n\t\tbool corrected = false;\n\t\tif (AbstractGeometry::set_bypass(direction)) {\n\t\t\tthis->_diag.flip();\n\t\t\tcorrected = true;\n\t\t}\n\t\treturn corrected;\n\t}\n\n\tbool RectangleGeometry::operator==(const AbstractGeometry& other) const {\n\t\treturn this->type() == other.type() && this->_diag == dynamic_cast<const RectangleGeometry*>(&other)->_diag;\n\t}\n\n\tstd::string RectangleGeometry::str(void) const {\n\t\tstd::ostringstream result;\n\t\tresult << \"RectangleGeometry {\";\n\t\tresult << std::endl << \"\\t\" << this->_diag.org.str();\n\t\tresult << std::endl << \"\\t\" << this->_diag.dst.str();\n\t\tresult << \"};\";\n\t\treturn result.str();\n\t}\n\n\t/* ==================================== Point 3d ==================================== */\n\n\tPoint3d Point3d::operator+(const Point3d& p) const {\n\t\treturn Point3d(this->x + p.x, this->y + p.y, p.z + this->z);\n\t}\n\n\tPoint3d Point3d::operator+(double s) const {\n\t\treturn Point3d(this->x + s, this->y + s, this->z + s);\n\t}\n\n\tPoint3d Point3d::operator-(const Point3d& p) const {\n\t\treturn Point3d(this->x - p.x, this->y - p.y, this->z - p.z);\n\t}\n\n\tPoint3d Point3d::operator-(double s) const {\n\t\treturn Point3d(this->x - s, this->y - s, this->z - s);\n\t}\n\n\tPoint3d operator* (double s, const Point3d& p) {\n\t\treturn Point3d(s * p.x, s * p.y, s * p.z);\n\t}\n\n\tPoint3d operator/ (const Point3d& p, double s) {\n\t\treturn Point3d(p.x/s, p.y/s, p.z/s);\n\t}\n\n\tdouble dot(const Point3d& p, const Point3d& q) {\n\t\treturn p.x*q.x + p.y*q.y + p.z*q.z;\n\t}\n\n\tdouble& Point3d::operator[](uint32_t i) {\n\t\tif (i == 0) {\n\t\t\treturn this->x;\n\t\t} else if (i == 1) {\n\t\t\treturn this->y;\n\t\t} else if (i == 2) {\n\t\t\treturn this->z;\n\t\t} else {\n\t\t\tthrow std::out_of_range(\"The index of dimensions is out of range\");\n\t\t}\n\t}\n\n\tdouble Point3d::operator[](uint32_t i) const {\n\t\tif (i == 0) {\n\t\t\treturn this->x;\n\t\t} else if (i == 1) {\n\t\t\treturn this->y;\n\t\t} else if (i == 2) {\n\t\t\treturn this->z;\n\t\t} else {\n\t\t\tthrow std::out_of_range(\"The index of dimensions is out of range\");\n\t\t}\n\t}\n\n\tbool Point3d::operator==(const Point3d& p) const {\n\t\treturn (this->x == p.x) && (this->y == p.y);\n\t}\n\n\tbool Point3d::operator!=(const Point3d& p) const {\n\t\treturn (this->x != p.x) || (this->y != p.y);\n\t}\n\n\tbool Point3d::operator<(const Point3d& p) const {\n\t\tif (this->x < p.x) {\n\t\t\treturn true;\n\t\t} else if (this->x == p.x) {\n\t\t\tif (this->y < p.y) {\n\t\t\t\treturn true;\n\t\t\t} else if (this->y == p.y) {\n\t\t\t\treturn this->z < p.z;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tbool Point3d::operator>(const Point3d& p) const {\n\t\tif (this->x > p.x) {\n\t\t\treturn true;\n\t\t} else if (this->x == p.x) {\n\t\t\tif (this->y > p.y) {\n\t\t\t\treturn true;\n\t\t\t} else if (this->y == p.y) {\n\t\t\t\treturn this->z > p.z;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tPoint3d& Point3d::operator+=(const Point3d& rhs) {\n\t\tthis->x += rhs.x;\n\t\tthis->y += rhs.y;\n\t\tthis->z += rhs.z;\n\t\treturn *this;\n\t}\n\n\tPoint3d& Point3d::operator-=(const Point3d& rhs) {\n\t\tthis->x -= rhs.x;\n\t\tthis->y -= rhs.y;\n\t\tthis->z -= rhs.z;\n\t\treturn *this;\n\t}\n\n\tPoint3d& Point3d::abs(void) {\n\t\tthis->x = fabs(this->x);\n\t\tthis->y = fabs(this->y);\n\t\tthis->z = fabs(this->z);\n\t\treturn *this;\n\t}\n\n\tdouble Point3d::length(void) const {\n\t\treturn sqrt(this->x*this->x + this->y*this->y + this->z*this->z);\n\t}\n\n\tstd::string Point3d::str(void) const {\n\t\tstd::ostringstream result;\n\t\tresult << \"(\" << this->x << \", \" << this->y << \", \" << this->z << \")\";\n\t\treturn result.str();\n\t}\n\n\t/* ==================================== Edge 3d ==================================== */\n\n\tdouble Edge3d::length(void) const {\n\t\tPoint3d v = (this->dst - this->org);\n\t\treturn sqrt(dot(v, v));\n\t}\n\n\tstd::string Edge3d::str(void) const {\n\t\tstd::ostringstream result;\n\t\tresult << \"[\" << this->org.str() << \" -> \" << this->dst.str() << \"]\";\n\t\treturn result.str();\n\t}\n\n\tbool Edge3d::operator==(const Edge3d& other) const {\n\t\treturn this->org == other.org && this->dst == other.dst;\n\t}\n\n\tdouble dot(const Edge3d& p, const Edge3d& q) {\n\t\treturn dot(p.dst - p.org, q.dst - q.org);\n\t}\n\n\tPoint3d cross(const Edge3d& p, const Edge3d& q) {\n\t\tPoint3d a = p.dst - p.org;\n\t\tPoint3d b = q.dst - q.org;\n\t\treturn Point3d(\n\t\t\t\ta.y * b.z - a.z * b.y,\n\t\t\t\ta.z * b.x - a.x * b.z,\n\t\t\t\ta.x * b.y - a.y * b.z);\n\t}\n\n\t/* ==================================== Triangle 3d ==================================== */\n\n\tTriangle3d::Triangle3d(const Point3d& a, const Point3d& b, const Point3d& c) {\n\t\t// TODO: Check that points can create triangle\n\t\tthis->_a = std::make_shared<Point3d>(a);\n\t\tthis->_b = std::make_shared<Point3d>(b);\n\t\tthis->_c = std::make_shared<Point3d>(c);\n\t}\n\n\tbool Triangle3d::operator==(const Triangle3d &other) const {\n\t\treturn *this->_a == other[0] && *this->_b == other[1] && *this->_c == other[2];\n\t}\n\n\tstd::string Triangle3d::str(void) const {\n\t\tstd::ostringstream result;\n\t\tresult << \"{\" << this->_a->str() << \", \" << this->_b->str() << \", \" << this->_c->str() << \"}\";\n\t\treturn result.str();\n\t}\n\n\tSharedPoint3d Triangle3d::at(uint32_t index) const {\n\t\tif (index == 0) {\n\t\t\treturn this->_a;\n\t\t} else if (index == 1) {\n\t\t\treturn this->_b;\n\t\t} else if (index == 2) {\n\t\t\treturn this->_c;\n\t\t} else {\n\t\t\tthrow std::out_of_range(\"The index of dimensions is out of range\");\n\t\t}\n\t}\n\n\tPoint3d& Triangle3d::operator[](uint32_t i){\n\t\tif (i == 0) {\n\t\t\treturn *this->_a;\n\t\t} else if (i == 1) {\n\t\t\treturn *this->_b;\n\t\t} else if (i == 2) {\n\t\t\treturn *this->_c;\n\t\t} else {\n\t\t\tthrow std::out_of_range(\"The index of dimensions is out of range\");\n\t\t}\n\t}\n\n\tPoint3d Triangle3d::operator[](uint32_t i) const {\n\t\tif (i == 0) {\n\t\t\treturn *this->_a;\n\t\t} else if (i == 1) {\n\t\t\treturn *this->_b;\n\t\t} else if (i == 2) {\n\t\t\treturn *this->_c;\n\t\t} else {\n\t\t\tthrow std::out_of_range(\"The index of dimensions is out of range\");\n\t\t}\n\t}\n\n\tSharedPoint3d Triangle3d::normal(void) const {\n\t\tPoint3d n = cross(Edge3d(*this->_a, *this->_b), Edge3d(*this->_b, *this->_c));\n\t\treturn std::make_shared<Point3d>(n/n.length());\n\t}\n\n\t/* ==================================== Surface 3d ==================================== */\n\n\tSurface3d::Surface3d(ArrayOfSharedPoints3d points, ArrayOfSharedTriangles3d triangles) : Surface3d() {\n\t\tthis->_points = points;\n\t\tthis->_triangles = triangles;\n\t\tthis->generate_xyz();\n\t}\n\n\tvoid Surface3d::generate_xyz(void) {\n\t\tif (!this->_is_finalized) {\n\t\t\tuint32_t length = this->_points.size();\n\t\t\tthis->_x = std::make_shared<arma::vec>(length);\n\t\t\tthis->_y = std::make_shared<arma::vec>(length);\n\t\t\tthis->_z = std::make_shared<arma::vec>(length);\n\t\t\tfor (uint32_t k = 0; k < this->_points.size(); k++) {\n\t\t\t\t(*this->_x)(k) = this->_points[k]->x;\n\t\t\t\t(*this->_y)(k) = this->_points[k]->y;\n\t\t\t\t(*this->_z)(k) = this->_points[k]->z;\n\t\t\t}\n\t\t\tthis->_is_finalized = true;\n\t\t}\n\t}\n\n\tArrayOfSharedPoints3d Surface3d::points(void) const {\n\t\treturn this->_points;\n\t}\n\n\tArrayOfSharedTriangles3d Surface3d::triangles(void) const {\n\t\treturn this->_triangles;\n\t}\n\n\tstd::shared_ptr<arma::vec> Surface3d::x(void) const {\n\t\treturn this->_x;\n\t}\n\n\tstd::shared_ptr<arma::vec> Surface3d::y(void) const {\n\t\treturn this->_y;\n\t}\n\n\tstd::shared_ptr<arma::vec> Surface3d::z(void) const {\n\t\treturn this->_z;\n\t}\n}\n"
  },
  {
    "path": "OptolithiumC/src/opl_interp.cpp",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#include <float.h>\n#include <stdint.h>\n#include \"opl_interp.h\"\n#include \"opl_log.h\"\n\n\nnamespace interp {\n\tuint32_t _get_base_index(const arma::vec& x, double xi) {\n\t\tuint32_t result = 0;\n\n//\t\tif (xi < x(0) || xi > x(x.n_elem-1)) {\n//\t\t\tstd::ostringstream result;\n//\t\t\tresult << \"Wrong base index interval during interpolation: \"\n//\t\t\t\t\t<< \"xi = \" << xi << \" x(0) = \" << x(0) << \" x(-1) = \" << x(x.n_elem-1);\n//\t\t\tthrow std::range_error(result.str());\n//\t\t}\n\n\t\tconst int32_t sdx = (x(x.n_elem-1) - x(0)) > 0 ? 1 : -1;\n\t\tfor (uint32_t k = 0; k < x.n_elem-1; k++) {\n\t\t\tif (sdx*xi >= sdx*x(k) && sdx*xi <= sdx*x(k+1)) {\n\t\t\t\tresult = k;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tinline double _interp1(double xi, double x0, double x1, double v0, double v1) {\n\t\treturn ((x1 - xi)*v0 + (xi - x0)*v1)/(x1 - x0);\n\t}\n\n\tLinearInterpolation1d::LinearInterpolation1d(ConstVector px, ConstVector py, double fill) : _px(px), _py(py) {\n\t\tthis->_fill = fill;\n\t\tconst arma::vec &x = *this->_px, &y = *this->_py;\n\t\tthis->_s = std::make_shared<arma::vec>(x.n_elem);\n\t\tthis->_b = std::make_shared<arma::vec>(x.n_elem);\n\t\tarma::vec& s = *this->_s;\n\t\tarma::vec& b = *this->_b;\n//\t\tLOG(INFO) << \"size(y) = \" << y.n_elem << \" size(x) = \" << x.n_elem;\n\t\tfor (uint32_t k = 0; k < x.n_elem-1; k++) {\n//\t\t\tLOG(INFO) << \"k = \" << k << \" y(k) = \" << y(k) << \" x(k) = \" << x(k);\n\t\t\ts(k) = (y(k+1) - y(k)) / (x(k+1) - x(k));\n\t\t\tb(k) = (x(k+1)*y(k) - x(k)*y(k+1)) / (x(k+1) - x(k));\n\t\t}\n\t}\n\n\tdouble LinearInterpolation1d::interpolate(double xi) const {\n\t\tconst arma::vec &x = *this->_px, &y = *this->_py;\n//\t\tLOG(INFO) << \"xi = \" << xi << \" x(0) = \" << x(0) << \" x(-1) = \" << x(x.n_elem-1);\n\t\tconst int32_t sdx = (x(x.n_elem-1) - x(0)) > 0 ? 1 : -1;\n\t\tif (sdx*xi < sdx*x(0) || sdx*xi > sdx*x(x.n_elem-1)) {\n\t\t\treturn this->_fill;\n\t\t} else if (xi == x(0)) {\n//\t\t\tLOG(INFO) << \"return y(0) = \" << y(0);\n\t\t\treturn y(0);\n\t\t} else if (xi == x(x.n_elem-1)) {\n//\t\t\tLOG(INFO) << \"return y(-1) = \" << y(y.n_elem-1);\n\t\t\treturn y(y.n_elem-1);\n\t\t} else {\n\t\t\tconst uint32_t k = _get_base_index(x, xi);\n\t\t\tconst arma::vec &s = *this->_s, &b = *this->_b;\n\t\t\tconst double result = s(k)*xi + b(k);\n//\t\t\tLOG(INFO) << \"interpolate 1d s = \" << s(k) << \" b = \" << b(k) << \" v = \" << result;\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tstd::shared_ptr<arma::vec> LinearInterpolation1d::interpolate(const arma::vec& xi) const {\n\t\tstd::shared_ptr<arma::vec> result = std::make_shared<arma::vec>(xi.n_elem);\n\t\tfor (uint32_t k = 0; k < xi.n_elem; k++) {\n\t\t\t(*result)(k) = this->interpolate(xi(k));\n\t\t}\n\t\treturn result;\n\t}\n\n\tbool LinearInterpolation1d::operator==(const LinearInterpolation1d& other) const {\n\t\treturn arma::as_scalar(*this->_px == *other._px) && arma::as_scalar(*this->_py == *other._py) &&\n\t\t\t\tthis->_fill == other._fill;\n\t}\n\n\tLinearInterpolation2d::LinearInterpolation2d(ConstVector px, ConstVector py, ConstMatrix values, double fill) {\n\t\tthis->_px = px;\n\t\tthis->_py = py;\n\t\tthis->_values = values;\n\t\tthis->_fill = fill;\n\n//\t\tLOG(INFO) << \"px.n_elem = \" << px->n_elem << \" py.n_elem = \" << py->n_elem;\n//\t\tLOG(INFO) << \"INPUT MATRIX: r = \" << values->n_rows << \" c = \" << values->n_cols;\n\n\t\tthis->_yinterp1.resize(py->n_elem);\n\t\tfor (uint32_t r = 0; r < py->n_elem; r++) {\n\t\t\tConstVector row = std::make_shared<arma::vec>(arma::trans(values->row(r)));\n\t\t\tthis->_yinterp1[r] = std::make_shared<LinearInterpolation1d>(px, row);\n\t\t}\n\n\t\tConstVector last_col = std::make_shared<arma::vec>(values->col(px->n_elem-1));\n\t\tthis->_xlastinterp1 = std::make_shared<LinearInterpolation1d>(py, last_col);\n\t}\n\n\tdouble LinearInterpolation2d::interpolate(double xi, double yi) const {\n\t\tconst arma::mat &f = *this->_values;\n\t\tconst arma::vec &x = *this->_px, &y = *this->_py;\n\t\tconst int32_t sdx = (x(x.n_elem-1) - x(0)) > 0 ? 1 : -1;\n\t\tconst int32_t sdy = (y(y.n_elem-1) - y(0)) > 0 ? 1 : -1;\n//\t\tLOG(INFO) << \"xi = \" << xi << \" x(0) = \" << x(0) << \" x(-1) = \" << x(x.n_elem-1) << \" sdx = \" << sdx\n//\t\t\t\t<< \" yi = \" << yi << \" y(0) = \" << y(0) << \" y(-1) = \" << y(y.n_elem-1) << \" sdy = \" << sdy;\n\t\tif (sdx*xi < sdx*x(0) || sdx*xi > sdx*x(x.n_elem-1) ||\n\t\t\tsdy*yi < sdy*y(0) || sdy*yi > sdy*y(y.n_elem-1)) {\n//\t\t\tLOG(INFO) << \"return filler \" << (sdx*xi < sdx*x(0)) << \" \" << (sdx*xi > sdx*x(x.n_elem-1)) << \" \"\n//\t\t\t\t\t<< (sdy*yi < sdy*y(0)) << \" \" << (sdy*yi > sdy*y(y.n_elem-1));\n\t\t\treturn this->_fill;\n\t\t} else if (xi == x(x.n_elem-1) && yi == y(y.n_elem-1)) {\n//\t\t\tLOG(INFO) << \"return f(-1, -1)\";\n\t\t\treturn f(y.n_elem-1, x.n_elem-1);\n\t\t} else if (yi == y(y.n_elem-1)) {\n//\t\t\tLOG(INFO) << \"interpolate last row\";\n\t\t\treturn this->_yinterp1[y.n_elem-1]->interpolate(xi);\n\t\t} else if (xi == x(x.n_elem-1)) {\n//\t\t\tLOG(INFO) << \"interpolate last col\";\n\t\t\treturn this->_xlastinterp1->interpolate(yi);\n\t\t} else {\n//\t\t\tLOG(INFO) << \"interpolate 2d\";\n\t\t\tconst uint32_t r = _get_base_index(y, yi);\n//\t\t\tLOG(INFO) << \"BASE INDEX = \" << r << \"/\" << this->_yinterp1.size();\n\t\t\tdouble v0 = this->_yinterp1[r]->interpolate(xi);\n\t\t\tdouble v1 = this->_yinterp1[r+1]->interpolate(xi);\n\t\t\treturn _interp1(yi, y(r), y(r+1), v0, v1);\n\t\t}\n\t}\n\n\tstd::shared_ptr<arma::mat> LinearInterpolation2d::interpolate(const arma::vec& xi, const arma::vec& yi) const {\n\t\tstd::shared_ptr<arma::mat> result = std::make_shared<arma::mat>(yi.n_elem, xi.n_elem);\n\t\tfor (uint32_t r = 0; r < yi.n_elem; r++) {\n\t\t\tfor (uint32_t c = 0; c < xi.n_elem; c++) {\n\t\t\t\t(*result)(r, c) = this->interpolate(xi(c), yi(r));\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\n\tbool LinearInterpolation2d::operator==(const LinearInterpolation2d& other) const {\n\t\treturn arma::as_scalar(*this->_px == *other._px) && arma::as_scalar(*this->_py == *other._py) &&\n\t\t\t\tarma::as_scalar(*this->_values == *other._values) && this->_fill == other._fill;\n\t}\n}\n"
  },
  {
    "path": "OptolithiumC/src/opl_log.cpp",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#include \"opl_log.h\"\n\n\n_INITIALIZE_EASYLOGGINGPP\n\n\nOptolithiumCoreLog::OptolithiumCoreLog(void) {\n\tel::Loggers::reconfigureAllLoggers(el::ConfigurationType::Format,\n\t\t\t\"%level %datetime{%H:%m:%s} [%file:%line]: %msg\");\n\tel::Loggers::reconfigureAllLoggers(el::ConfigurationType::ToStandardOutput, \"true\");\n\tel::Loggers::addFlag(el::LoggingFlag::ColoredTerminalOutput);\n\tLOG(INFO) << \"Initialize Optolithium Core logging system\";\n};\n\nOptolithiumCoreLog::~OptolithiumCoreLog(void) {\n\tLOG(INFO) << \"Finalize Optolithium Core logging system\";\n};\n\nvoid OptolithiumCoreLog::set_verbose_level(int level) {\n\tint argc = 2;\n\tstd::ostringstream verbosity;\n\tverbosity << \"--v=\" << level;\n\tconst char *argv[2] = { \"Optolithium\",  verbosity.str().c_str() };\n\tel::Helpers::setArgs(argc, argv);\n};\n\nvoid OptolithiumCoreLog::log(const std::string &message) {\n\tLOG(INFO) << message;\n};\n\nvoid OptolithiumCoreLog::vlog(const std::string &message, int level) {\n\tVLOG(level) << message;\n}\n"
  },
  {
    "path": "OptolithiumC/src/opl_sim.cpp",
    "content": "/*\n *\n * This file is part of Optolithium lithography modelling software.\n *\n * Copyright (C) 2015 Alexei Gladkikh\n *\n * This software is dual-licensed: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version only for NON-COMMERCIAL usage.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n *\n * If you are interested in other licensing models, including a commercial-\n * license, please contact the author at gladkikhalexei@gmail.com\n *\n */\n\n#include \"opl_sim.h\"\n#include \"opl_physc.h\"\n#include \"opl_conv.h\"\n#include \"opl_eikonal.h\"\n#include \"opl_contours.h\"\n#include \"opl_fft.h\"\n\n\nSharedDiffraction diffraction(SharedImagingTool imaging_tool, SharedMask mask)\n{\n\tLOG(INFO) << \"Optolithium Core: Calculate diffraction pattern for given mask, pitch = \" << mask->pitch().str();\n\tTIMED_FUNC(diffraction_timer);\n\n\tif (mask->is_bad()) {\n\t\tthrow std::invalid_argument(\"Wrong mask bounding box size! \"\n\t\t\t\t\"Diffraction 1D can only be calculation for one-dimensional mask.\");\n\t}\n\n\tSharedDiffraction diffraction = std::make_shared<Diffraction>(mask, imaging_tool);\n\n\tfor (auto region : *mask) {\n\t\tarma::cx_double factor = region->etransmit() - mask->boundary()->etransmit();\n\t\tdiffraction->add_region(region, factor);\n\t}\n\n\tif (!mask->is_opaque()) {\n\t\tarma::cx_double factor = mask->boundary()->etransmit();\n\t\tdiffraction->values()->elem(arma::find(*diffraction->cxy() == 0.0)) += factor;\n\t}\n\n\treturn diffraction;\n}\n\n\nvoid _calc_aerial_image(SharedResistVolume result, SharedDiffraction diffraction,\n\t\tSharedOpticalTransferFunction otf, double refractive_index, double stepxy, double stepz=0.0) {\n\tTIMED_FUNC(aerial_image_timer);\n\n\tconst uint32_t n_rows = result->values()->n_rows != 1 ? result->values()->n_rows - 1 : result->values()->n_rows;\n\tconst uint32_t n_cols = result->values()->n_cols != 1 ? result->values()->n_cols - 1 : result->values()->n_cols;\n\tconst uint32_t n_slices = result->values()->n_slices;\n\n\tconst uint32_t midcol = static_cast<uint32_t>(static_cast<double>(n_cols)/2.0);\n\tconst uint32_t midrow = static_cast<uint32_t>(static_cast<double>(n_rows)/2.0);\n\n\tconst uint32_t n_source_points = diffraction->source_shape->non_zeros()->n_rows;\n\n\tconst double na = diffraction->numeric_aperture;\n\n\tif (n_rows != 1 && n_rows % 2 != 0) {\n\t\tthrow std::invalid_argument(\"The result rows count must be even\");\n\t} else if (n_cols != 1 && n_cols % 2 != 0) {\n\t\tthrow std::invalid_argument(\"The result columns count must be even\");\n\t}\n\n\tarma::cx_mat efield = arma::cx_mat(n_rows, n_cols);\n\n    fft::FFT2d fft(efield, fft::FFT_BACKWARD, n_source_points*n_slices);\n\n\tfor (uint32_t s = 0; s < n_slices; s++) {\n\t\tconst double thickness = result->z(s);\n\n\t\tarma::mat intensity = arma::mat(n_rows, n_cols, arma::fill::zeros);\n\n\t\tfor (uint32_t k = 0; k < diffraction->source_shape->non_zeros()->n_rows; k++) {\n\t\t\t// Get non-zeros intensity source shape point indexes\n\t\t\tauto src_row_col = diffraction->source_shape->non_zeros()->row(k);\n\n\t\t\tconst double source_irradiance = diffraction->source_shape->value(src_row_col(0), src_row_col(1));\n\t\t\tconst double scx = na * diffraction->source_shape->cx(src_row_col(1));\n\t\t\tconst double scy = na * diffraction->source_shape->cy(src_row_col(0));\n\n\t\t\t// Clear temporary array of current source shape electric field\n\t\t\tefield.zeros();\n\n\t\t\t{TIMED_SCOPE(aerial_image_diffraction, \"Diffraction pattern generation done\");\n\t\t\t\t// Get non-zeros elements (according to current source shape point) and\n\t\t\t\t// copy it to Fourier backward transform temporary matrix\n\t\t\t\tfor (uint32_t r = 0; r < diffraction->values()->n_rows; r++) {\n\t\t\t\t\tfor (uint32_t c = 0; c < diffraction->values()->n_cols; c++) {\n\t\t\t\t\t\tdouble dcy = diffraction->cy(r);\n\t\t\t\t\t\tdouble dcx = diffraction->cx(c);\n\t\t\t\t\t\tuint32_t e_row = (n_rows + diffraction->ky(r) - 1) % n_rows;\n\t\t\t\t\t\tuint32_t e_col = (n_cols + diffraction->kx(c) - 1) % n_cols;\n\t\t\t\t\t\tefield(e_row, e_col) = otf->calc(dcx - scx, dcy - scy, thickness) * diffraction->value(r, c);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n            fft.execute();\n\n\t\t\t{TIMED_SCOPE(aerial_image_timer_intensity, \"Intensity for given source shape point done\");\n\t\t\t\t// Calculate intensity for given source point and sum if with previous result\n\t\t\t\tintensity += source_irradiance * arma::real(efield % arma::conj(efield));\n\t\t\t}\n\t\t}\n\n\t\tintensity *= (refractive_index / arma::accu(*diffraction->source_shape->values()));\n\n\t\t// Save results to the output array and make fftshift and copy last point (Prolith symmetry)\n\t\tarma::mat& layer = result->values()->slice(s);\n\t\tif (n_cols != 1 && n_rows == 1) {\n\t\t\tfor (uint32_t c = 0; c < midcol; c++) {\n\t\t\t\tlayer(0, c + midcol) = intensity(0, c);\n\t\t\t\tlayer(0, c) = intensity(0, c + midcol);\n\t\t\t}\n\t\t\tlayer(0, n_cols) = layer(0, 0);\n\t\t} else if (n_rows != 1 && n_cols == 1) {\n\t\t\tfor (uint32_t r = 0; r < midrow; r++) {\n\t\t\t\tlayer(r + midrow, 0) = intensity(r, 0);\n\t\t\t\tlayer(r, 0) = intensity(r + midrow, 0);\n\t\t\t}\n\t\t\tlayer(n_rows, 0) = layer(0, 0);\n\t\t} else if (n_rows != 1 && n_cols != 1) {\n\t\t\tfor (uint32_t r = 0; r < midrow; r++) {\n\t\t\t\tfor (uint32_t c = 0; c < midcol; c++) {\n\t\t\t\t\tlayer(r + midrow, c + midcol) = intensity(r, c);\n\t\t\t\t\tlayer(r, c) = intensity(r + midrow, c + midcol);\n\t\t\t\t\tlayer(r, c + midcol) = intensity(r + midrow, c);\n\t\t\t\t\tlayer(r + midrow, c) = intensity(r, c + midcol);\n\n\t\t\t\t\tlayer(n_rows, c) = layer(0, c);\n\t\t\t\t\tlayer(n_rows, c + midcol) = layer(0, c + midcol);\n\t\t\t\t}\n\t\t\t\tlayer(r, n_cols) = layer(r, 0);\n\t\t\t\tlayer(r + midrow, n_cols) = layer(r + midrow, 0);\n\t\t\t}\n\t\t\tlayer(n_rows, n_cols) = layer(0, 0);\n\t\t}\n\t}\n}\n\n\nSharedResistVolume aerial_image(SharedDiffraction diffraction, SharedOpticalTransferFunction otf, double stepxy) {\n\tLOG(INFO) << \"Optolithium Core: Calculate aerial image\";\n\tdouble refractive_index = physc::air_nk.real();\n\tif (otf->wafer_stack()) {\n\t\tif (!otf->wafer_stack()->environment()) {\n\t\t\tthrow std::invalid_argument(\"Environment was not specified\");\n\t\t}\n\t\tdouble wavelength = diffraction->wavelength;\n\t\trefractive_index = otf->wafer_stack()->environment()->refraction(wavelength).real();\n\t}\n\tSharedResistVolume result = std::make_shared<ResistVolume>(diffraction->boundary, stepxy);\n\t_calc_aerial_image(result, diffraction, otf, refractive_index, stepxy);\n\totf->imaging_tool()->flare(result);\n\treturn result;\n}\n\n\nSharedResistVolume image_in_resist(SharedDiffraction diffraction,\n\t\tSharedOpticalTransferFunction otf, double stepxy, double stepz) {\n\tLOG(INFO) << \"Optolithium Core: Calculate image in resist\";\n\tdouble wavelength = diffraction->wavelength;\n\tif (!otf->wafer_stack()) {\n\t\tthrow std::invalid_argument(\"Wafer stack was not specified\");\n\t}\n\tif (!otf->wafer_stack()->resist()) {\n\t\tthrow std::invalid_argument(\"Resist was not specified\");\n\t}\n\tdouble refractive_index = otf->wafer_stack()->resist()->refraction(wavelength).real();\n\tdouble thickness = otf->wafer_stack()->resist()->thickness;\n\tSharedResistVolume result = std::make_shared<ResistVolume>(diffraction->boundary, thickness, stepxy, stepz);\n\t_calc_aerial_image(result, diffraction, otf, refractive_index, stepxy, stepz);\n\totf->imaging_tool()->flare(result);\n\treturn result;\n}\n\n\nSharedResistVolume latent_image(SharedResistVolume image_in_resist,\n\t\tSharedResistWaferLayer resist, SharedExposure exposure) {\n\tLOG(INFO) << \"Optolithium Core: Calculate exposed latent image\";\n\tconst arma::cube& values = *image_in_resist->values();\n\t// Create new resist volume object without coping data from it.\n\tSharedResistVolume result = std::make_shared<ResistVolume>(*image_in_resist, false);\n//\tLOG(INFO) << \"Dose = \" << exposure->dose() << \" C = \" << resist->exposure->c;\n\t*result->values() = arma::exp(-values*exposure->dose()*resist->exposure->c);\n\treturn result;\n}\n\n\nSharedResistVolume peb_latent_image(SharedResistVolume latent_image,\n\t\tSharedResistWaferLayer resist, SharedPostExposureBake peb) {\n\tLOG(INFO) << \"Optolithium Core: Calculate PEB latent image\";\n\tSharedResistVolume result = std::make_shared<ResistVolume>(*latent_image, false);\n\n\tarma::vec kernelx = resist->peb->kernel(peb, latent_image->stepx());\n\tarma::vec kernely = resist->peb->kernel(peb, latent_image->stepy());\n\tarma::vec kernelz = resist->peb->kernel(peb, latent_image->stepz());\n\n\t// Perform separable convolution\n\n\tconst arma::cube& input = *latent_image->values();\n\tarma::cube& output = *result->values();\n\n\tfor (uint32_t s = 0; s < input.n_slices; s++) {\n\t\tconst arma::mat& input_slice = input.slice(s);\n\t\tarma::mat output_slice = arma::mat(input_slice.n_rows, input_slice.n_cols);\n\n//\t\tLOG(INFO) << \"Slice #\" << s << \" kernelx = \" << kernelx.n_elem << \" kernely = \" << kernely.n_elem;\n\n\t\t// Because when slice the cube matrix is transpose then y->cols and x->rows\n\n\t\tfor (uint32_t r = 0; r < input.n_rows; r++) {\n\t\t\tconst arma::rowvec& row = input_slice.row(r);\n\t\t\toutput_slice.row(r) = conv::conv1d(row, kernelx, conv::CIRCULAR);\n\t\t}\n\n\t\tfor (uint32_t c = 0; c < input.n_cols; c++) {\n\t\t\tconst arma::colvec& col = output_slice.col(c);\n\t\t\tarma::vec tmp = conv::conv1d(col, kernely, conv::CIRCULAR);\n\t\t\toutput_slice.col(c) = tmp;\n\t\t}\n\n\t\toutput.slice(s) = output_slice;\n\t}\n\n\tfor (uint32_t r = 0; r < input.n_rows; r++) {\n\t\tfor (uint32_t c = 0; c < input.n_cols; c++) {\n\t\t\tconst arma::cube& tube = output.tube(r, c);\n\t\t\tauto tmp = conv::conv1d(tube, kernelz, conv::SYMMETRIC);\n\t\t\toutput.tube(r, c) = tmp;\n\t\t}\n\t}\n\n\treturn result;\n}\n\n\n//#define ENABLE_DEBUG_RATES\n\n\nSharedResistVolume develop_time_contours(SharedResistVolume peb_latent_image, SharedResistWaferLayer resist) {\n\tLOG(INFO) << \"Optolithium Core: Calculate develop time contours\";\n\tSharedResistVolume result = std::make_shared<ResistVolume>(*peb_latent_image, false);\n\n\tconst arma::cube& values = *peb_latent_image->values();\n\n\tarma::cube rates = arma::cube(values.n_rows, values.n_cols, values.n_slices);\n\n//\tLOG(INFO) << \"Calculate development rates\";\n\tfor (uint32_t s = 0; s < rates.n_slices; s++) {\n\t\tdouble depth = peb_latent_image->z(s);\n//\t\tLOG(INFO) << \"s = \" << s << \" depth = \" << depth;\n\t\tfor (uint32_t r = 0; r < rates.n_rows; r++) {\n\t\t\tfor (uint32_t c = 0; c < rates.n_cols; c++) {\n\t\t\t\tdouble pac = values(r, c, s);\n\t\t\t\trates(r, c, s) = resist->rate->calculate(pac, depth);\n\t\t\t}\n\t\t}\n\t}\n\n#ifndef ENABLE_DEBUG_RATES\n\tarma::cube& develop = *result->values();\n\n//\tLOG(INFO) << \"Create initial resist profile contour\";\n\tdevelop.fill(-1.0);\n\tdevelop.slice(develop.n_slices-1).fill(arma::fill::zeros);\n\n//\tLOG(INFO) << \"Calculate resist profile development\";\n\teikonal::solve3d(develop, rates, result->stepy(), result->stepx(), result->stepz());\n#else\n\t*result->values() = rates;\n#endif\n\n\treturn result;\n}\n\n\nSharedResistProfile resist_profile(SharedResistVolume develop_times, SharedDevelopment development) {\n\treturn std::make_shared<ResistProfile>(develop_times, development->time);\n}\n"
  },
  {
    "path": "OptolithiumGui/auxmath.py",
    "content": "# This file is part of Optolithium lithography modelling software.\r\n#\r\n# Copyright (C) 2015 Alexei Gladkikh\r\n#\r\n# This software is dual-licensed: you can redistribute it and/or modify\r\n# it under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version only for NON-COMMERCIAL usage.\r\n#\r\n# This program is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n#\r\n# If you are interested in other licensing models, including a commercial-\r\n# license, please contact the author at gladkikhalexei@gmail.com\r\n\r\nimport numpy\r\n\r\n\r\n__author__ = 'Alexei Gladkikh'\r\n\r\n\r\ndef cartesian(*arrays):\r\n    \"\"\"\r\n    Generate a cartesian product of input arrays.\r\n\r\n    :param tuple of ndarray arrays: 1-D arrays to form the cartesian product of.\r\n    :return: 2-D array of shape (M, len(arrays)) containing cartesian products formed of input arrays.\r\n    :rtype: ndarray\r\n\r\n    Examples\r\n    --------\r\n    >>> cartesian([1, 2, 3], [4, 5], [6, 7])\r\n    array([[1, 4, 6],\r\n           [1, 4, 7],\r\n           [1, 5, 6],\r\n           [1, 5, 7],\r\n           [2, 4, 6],\r\n           [2, 4, 7],\r\n           [2, 5, 6],\r\n           [2, 5, 7],\r\n           [3, 4, 6],\r\n           [3, 4, 7],\r\n           [3, 5, 6],\r\n           [3, 5, 7]])\r\n\r\n    \"\"\"\r\n    def _cartesian(_arrays, _out):\r\n        _n = numpy.prod([_x.size for _x in _arrays])\r\n        m = _n / _arrays[0].size\r\n        _out[:, 0] = numpy.repeat(_arrays[0], m)\r\n        if _arrays[1:]:\r\n            _cartesian(_arrays[1:], _out=_out[0:m, 1:])\r\n            for j in xrange(1, _arrays[0].size):\r\n                _out[j*m:(j+1)*m, 1:] = _out[0:m, 1:]\r\n        return _out\r\n\r\n    arrays = [numpy.asarray(x) for x in arrays]\r\n    n = numpy.prod([x.size for x in arrays])\r\n    out = numpy.zeros([n, len(arrays)], dtype=arrays[0].dtype)\r\n    _cartesian(arrays, out)\r\n    return out\r\n\r\n\r\ndef middle(vec):\r\n    \"\"\"\r\n    Calculate zero index of frequency vector\r\n    :param ndarray or list vec: Input numpy array\r\n    :rtype: int\r\n\r\n    Examples\r\n    --------\r\n    >>> middle(numpy.array([1.0, 2.0, 3.0, 4.0, 5.0]))\r\n    2\r\n    >>> middle([5.0])\r\n    0\r\n    \"\"\"\r\n    return int(numpy.floor(len(vec) / 2.0))\r\n\r\n\r\ndef point_line_distance(point, line):\r\n    \"\"\"\r\n    Calculate the minimum distance between point and line specified by two points\r\n\r\n    :type point: list[float | int]\r\n    :type line: list[list[float | int]]\r\n\r\n    Examples\r\n    --------\r\n    >>> round(point_line_distance([-1, 3], [[0, 1.5], [10, -6]]), 1)\r\n    0.6\r\n    \"\"\"\r\n    a = -float(line[1][1] - line[0][1])\r\n    b = float(line[1][0] - line[0][0])\r\n    c = line[0][0] * line[1][1] - line[1][0] * line[0][1]\r\n    return abs(a*point[0] + b*point[1] + c) / numpy.sqrt(a**2 + b**2)\r\n\r\n\r\ndef point_inside_polygon(point, polygon):\r\n    \"\"\"\r\n    Check whether point belongs to the polygon\r\n\r\n    :rtype: bool\r\n\r\n    Examples\r\n    --------\r\n    >>> class Point(object):\r\n    ...     def __init__(self, x, y):\r\n    ...         self.x = x\r\n    ...         self.y = y\r\n    >>> class Polygon(object):\r\n    ...     def __init__(self, points):\r\n    ...         self.points = points\r\n    >>> polygon = Polygon([\r\n    ...     Point(35.0, 120.5), Point(37.9, 129.1),\r\n    ...     Point(46.9, 129.1), Point(39.7, 134.5),\r\n    ...     Point(42.3, 143.1), Point(35.0, 139.0),\r\n    ...     Point(27.7, 143.1), Point(30.3, 134.5),\r\n    ...     Point(23.1, 129.1), Point(32.1, 129.1)])\r\n    >>> point_inside_polygon(Point(35.0, 134.5), polygon)\r\n    True\r\n    >>> point_inside_polygon(Point(100.0, 100.5), polygon)\r\n    False\r\n    >>> polygon = Polygon([Point(10.0, 0.0), Point(15.0, 0.0)])\r\n    >>> point_inside_polygon(Point(12.0, 0.0), polygon)\r\n    True\r\n    >>> point_inside_polygon(Point(54.0, 0.0), polygon)\r\n    False\r\n    >>> polygon = Polygon([Point(0.0, 21.0), Point(0.0, 30.5)])\r\n    >>> point_inside_polygon(Point(0.0, 22.0), polygon)\r\n    True\r\n    >>> point_inside_polygon(Point(0.0, -1.0), polygon)\r\n    False\r\n    \"\"\"\r\n    n = len(polygon.points)\r\n    if n == 2:\r\n        return polygon.points[0].x <= point.x <= polygon.points[1].x and \\\r\n            polygon.points[0].y <= point.y <= polygon.points[1].y\r\n    else:\r\n        inside = False\r\n\r\n        p1x, p1y = polygon.points[0].x, polygon.points[0].y\r\n        for k in range(n + 1):\r\n            p2x, p2y = polygon.points[k % n].x, polygon.points[k % n].y\r\n            if min(p1y, p2y) < point.y <= max(p1y, p2y) and point.x <= max(p1x, p2x):\r\n                if (p1y != p2y and point.x < (point.y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x) or p1x == p2x:\r\n                    inside = not inside\r\n            p1x, p1y = p2x, p2y\r\n\r\n        return inside\r\n\r\n\r\nif __name__ == \"__main__\":\r\n    import doctest\r\n    doctest.testmod()"
  },
  {
    "path": "OptolithiumGui/config.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport os\nimport psutil\nimport json\nimport logging as module_logging\nimport sys\nimport helpers\nimport ctypes\n\n\n__author__ = 'Alexei Gladkikh'\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.INFO)\nhelpers.logStreamEnable(logging)\n\n\ndarwin = \"darwin\"\nnt = \"win32\"\nposix = \"linux2\"\n\n\n_shared_ext = {\n    darwin: \".dylib\",\n    nt: \".dll\",\n    posix: \".so\"\n}\n\n\nshared_ext = _shared_ext[sys.platform]\n\n\n_plot_bottom_adjust = {\n    darwin: 0.15,\n    nt: 0.15,\n    posix: 0.15\n}\n\nplot_bottom_adjust = _plot_bottom_adjust[sys.platform]\n\n\n_application_styles = {\n    darwin: u\"Plastique\",\n    nt: u\"Windows\",\n    posix: u\"Windows\"\n}\n\n\napplication_style = _application_styles[sys.platform]\n\nRESIST_FILL_COLOR = \"purple\"\nRESIST_LINES_COLOR = \"black\"\nRESIST_CONTOUR_COLOR = \"grey\"\nCOMMON_LINES_COLOR = \"crimson\"\n\nKILOBYTE = 1024\nMEGABYTE = KILOBYTE * KILOBYTE\nGIGABYTE = KILOBYTE * MEGABYTE\n\nSTATUS_BAR_MESSAGE_DURATION = 2000\n\nMAXIMUM_DIALOG_BUTTON_WIDTH = 100\nDEFAULT_EDIT_WIDTH = 60\n\nAPPLICATION_NAME = \"Optolithium\"\nAPPLICATION_WEBSITE = \"https://bitbucket.org/gladkikhalexei/lithography\"\n\nLOG_DATABASE_QUERIES = False\nRESOURCES = [\"icons\"]\n\nDATETIME_FORMAT = \"%d.%m.%Y %H:%M:%S\"\n\nDEFAULT_DECIMAL_COUNT = 3\n\nDEFAULT_LAYER_THICKNESS = 100.0\nDEFAULT_LAYER_REAL_INDEX = 1.0\nDEFAULT_LAYER_IMAG_INDEX = 0.0\n\nPEB_TEMP_GRAPH_RANGE = 20\nDEV_RATE_PAC_STEP = 0.01\n\nDEFAULT_RESIST_NAME = \"ResistDefault\"\nDEFAULT_SUBSTRATE_MATERIAL_NAME = \"SubstrateMaterial\"\nDEFAULT_DEV_RATE_NAME = \"DevRateDefault\"\nDEFAULT_SOURCE_SHAPE_NAME = \"Coherent\"\nDEFAULT_AIR_VACUUM_NAME = \"Air-Vacuum\"\n\nDEFAULT_OPTIONS_NAME = \"Untitled.opl\"\nOPTIONS_EXTENSION = \"Optolithium options (*.opl)\"\n\nKLAYOUT_PATH = \"klayout\"\n\nif sys.platform == nt:\n    buf = ctypes.create_unicode_buffer(1024)\n    ctypes.windll.kernel32.GetEnvironmentVariableW(u\"USERPROFILE\", buf, 1024)\n    HOME_PATH = buf.value\nelse:\n    HOME_PATH = os.path.expanduser(\"~\")\n\nAPPLICATION_DIRECTORY = \".\" + APPLICATION_NAME\nCONFIG_NAME = \"config.json\"\n\nCONFIG_PATH = os.path.join(HOME_PATH, APPLICATION_DIRECTORY, CONFIG_NAME)\n\nDEFAULT_DATABASE_NAME = \"OptolithiumDatabase.db\"\nDEFAULT_MAP_FILE_NAME = \"map.json\"\nDEFAULT_MEMORY_USAGE_UPDATE = 1000  # ms\nDEFAULT_GRAPH_DPI = 60\nDEFAULT_MAX_GDSII_FILE_SIZE = 5 * MEGABYTE\n\nSOURCE_SHAPE_STEP_MAP = [0.007, 0.010, 0.020, 0.032, 0.040, 0.050, 0.059, 0.067, 0.083, 0.125, 0.250]\n\n\nclass LayerMapConfig(object):\n\n    BOUNDARY_LAYER_VALUE = \"boundary\"\n    BACKGROUND_LAYER_KEY = \"background\"\n    TRANSMITTANCE_MAP_KEY = \"transmittance\"\n    PHASE_MAP_KEY = \"phase\"\n\n    __instance__ = None\n\n    class ParseError(Exception):\n        pass\n\n    @staticmethod\n    def _default_data():\n        return {\n            \"8.0\": {\"transmittance\": 0.0, \"phase\": 0.0},\n            \"63.0\": \"boundary\",\n            \"background\": {\"transmittance\": 1.0, \"phase\": 0.0}\n        }\n\n    def _verify(self):\n        if LayerMapConfig.BACKGROUND_LAYER_KEY not in self.__data:\n            raise LayerMapConfig.ParseError(\"Background parameters not found\")\n\n        if LayerMapConfig.BOUNDARY_LAYER_VALUE not in self.__data.values():\n            raise LayerMapConfig.ParseError(\"Boundary layer not found\")\n\n        for key, value in self.__data.items():\n            if key != LayerMapConfig.BACKGROUND_LAYER_KEY:\n\n                num_type = key.split(\".\")\n                if len(num_type) != 2:\n                    raise LayerMapConfig.ParseError(\"Wrong layer number: %s\" % key)\n\n                number, datatype = num_type\n\n                try:\n                    int(number)\n                    int(datatype)\n                except ValueError:\n                    LayerMapConfig.ParseError(\"Wrong layer number or datatype: %s\" % key)\n\n                if value != LayerMapConfig.BOUNDARY_LAYER_VALUE:\n                    try:\n                        float(value[LayerMapConfig.TRANSMITTANCE_MAP_KEY])\n                    except ValueError or KeyError:\n                        raise LayerMapConfig.ParseError(\"Wrong map record %s: %s\" % (key, value))\n\n    def save(self, path):\n        map_dir = os.path.dirname(os.path.abspath(path))\n\n        if not os.path.exists(map_dir):\n            os.makedirs(map_dir)\n\n        with open(path, \"w\") as map_file:\n            map_file.write(json.dumps(self.__data, indent=4))\n\n    def __init__(self, path):\n\n        if LayerMapConfig.__instance__ is not None:\n            raise RuntimeError(\"Layers map configuration has been already initialized!\")\n\n        self.__data = dict()\n\n        try:\n            with open(path) as map_file:\n                self.__data.update(json.loads(map_file.read()))\n        except IOError as error:\n            if error.errno == 2:\n                logging.error(\"GDS map file was not found using default\")\n                self.__data = LayerMapConfig._default_data()\n                self.save(path)\n            else:\n                raise\n        else:\n            self._verify()\n\n        self.__path = path\n\n        LayerMapConfig.__instance__ = self\n\n    @property\n    def path(self):\n        return self.__path\n\n    def boundary_layer(self):\n        \"\"\":rtype: (int, int)\"\"\"\n        return [map(int, k.split(\".\")) for k, v in self.__data.iteritems()\n                if v == LayerMapConfig.BOUNDARY_LAYER_VALUE][0]\n\n    def __getitem__(self, item):\n        return self.__data[item]\n\n    def get_layer(self, transmittance, phase):\n        \"\"\":rtype: (int, int)\"\"\"\n        layers = [k for k, v in self.__data.iteritems()\n                  if isinstance(v, dict) and\n                  v[LayerMapConfig.TRANSMITTANCE_MAP_KEY] == transmittance and\n                  v[LayerMapConfig.PHASE_MAP_KEY] == phase]\n        if not layers:\n            raise KeyError\n        if layers[0] == LayerMapConfig.BACKGROUND_LAYER_KEY:\n            raise ValueError\n        return map(int, layers[0].split(\".\"))\n\n\nGdsLayerMapping = None\n\"\"\":type: LayerMapConfig\"\"\"\n\n\n# noinspection PyPep8Naming\ndef openLayerMapConfig(path):\n    global GdsLayerMapping\n    GdsLayerMapping = LayerMapConfig(path)\n\n\nclass _Configuration(object):\n\n    SYSTEM_PLUGINS_PATH = \"plugins\"\n    PLUGIN_PATHS_SEPARATOR = \";\"\n\n    __ERROR_CONFIG_NOT_INIT_MSG__ = \"Configuration was not initialized\"\n\n    __instance__ = None\n\n    def __init__(self, **kwargs):\n        \"\"\"\n        :param str map_path: Path to gds map file\n        :param str db_path: Application Database path\n        :param str plugin_paths: User plugin directory\n        :param str __memory_update:\n        :param int dpi: Dots-per-Inch for all graphs\n        :param int gds_size: Maximum Gds size in megabytes\n        :param int thread_count: Count of the threads\n        \"\"\"\n        if _Configuration.__instance__ is not None:\n            raise RuntimeError(\"Global application configuration settings has been already initialized!\")\n\n        self.__data = dict()\n\n        try:\n            self.__data[\"map_path\"] = kwargs[\"map_path\"]\n        except KeyError:\n            self.__data[\"map_path\"] = os.path.join(HOME_PATH, APPLICATION_DIRECTORY, DEFAULT_MAP_FILE_NAME)\n            logging.warning(\"GDSII map file path was not set using default path: %s\" % self.layer_map_path)\n\n        try:\n            self.__data[\"db_path\"] = kwargs[\"db_path\"]\n        except KeyError:\n            self.__data[\"db_path\"] = os.path.join(HOME_PATH, APPLICATION_DIRECTORY, DEFAULT_DATABASE_NAME)\n            logging.warning(\"Database file path was not set using default path: %s\" % self.db_path)\n\n        try:\n            if kwargs[\"plugin_paths\"]:\n                self.__data[\"plugin_paths\"] = \\\n                    kwargs[\"plugin_paths\"].split(_Configuration.PLUGIN_PATHS_SEPARATOR) + \\\n                    [_Configuration.SYSTEM_PLUGINS_PATH]\n            else:\n                self.__data[\"plugin_paths\"] = [_Configuration.SYSTEM_PLUGINS_PATH]\n        except KeyError:\n            self.__data[\"plugin_paths\"] = [_Configuration.SYSTEM_PLUGINS_PATH]\n            logging.warning(\"Additional plugin directories was not set using system path only: %s\" % self.plugin_paths)\n\n        try:\n            self.__data[\"memory_update\"] = int(kwargs[\"memory_update\"])\n        except KeyError or ValueError:\n            self.__data[\"memory_update\"] = DEFAULT_MEMORY_USAGE_UPDATE\n            logging.warning(\"Memory usage update interval was not set \"\n                            \"to properly value using default: %s\" % self.memory_update_interval)\n\n        try:\n            self.__data[\"dpi\"] = int(kwargs[\"dpi\"])\n        except KeyError or ValueError:\n            self.__data[\"dpi\"] = DEFAULT_GRAPH_DPI\n            logging.warning(\"Graphs DPI was not set to properly value using default: %s\" % self.dpi)\n\n        try:\n            self.__data[\"gds_size\"] = int(kwargs[\"gds_size\"])\n        except KeyError or ValueError:\n            self.__data[\"gds_size\"] = DEFAULT_MAX_GDSII_FILE_SIZE\n            logging.warning(\"Max GDSII file size was not set \"\n                            \"to properly value using default: %s\" % self.maximum_gds_size)\n\n        try:\n            self.__data[\"thread_count\"] = int(kwargs[\"thread_count\"])\n        except KeyError or ValueError:\n            self.__data[\"thread_count\"] = psutil.cpu_count()\n            logging.warning(\"Max threads count was not set \"\n                            \"to properly value using CPU cores count: %s\" % self.thread_count)\n\n        self.path = None\n\n        _Configuration.__instance__ = self\n\n    def serialize(self):\n        result = self.__data\n        filtered = filter(lambda v: v != _Configuration.SYSTEM_PLUGINS_PATH, self.__data[\"plugin_paths\"])\n        logging.info(\"%s\" % filtered)\n        result[\"plugin_paths\"] = _Configuration.PLUGIN_PATHS_SEPARATOR.join(filtered)\n        return result\n\n    def _get_data(self, key):\n        try:\n            return self.__data[key]\n        except KeyError:\n            raise RuntimeError(_Configuration.__ERROR_CONFIG_NOT_INIT_MSG__)\n\n    @property\n    def layer_map_path(self):\n        return self._get_data(\"map_path\")\n\n    @layer_map_path.setter\n    def layer_map_path(self, value):\n        self.__data[\"map_path\"] = value\n\n    @property\n    def db_path(self):\n        return self._get_data(\"db_path\")\n\n    @db_path.setter\n    def db_path(self, value):\n        self.__data[\"db_path\"] = value\n\n    @property\n    def plugin_paths(self):\n        return self._get_data(\"plugin_paths\")\n\n    @plugin_paths.setter\n    def plugin_paths(self, value):\n        self.__data[\"plugin_paths\"] = value.split(_Configuration.PLUGIN_PATHS_SEPARATOR)\n\n    @property\n    def memory_update_interval(self):\n        return self._get_data(\"memory_update\")\n\n    @memory_update_interval.setter\n    def memory_update_interval(self, value):\n        interval = int(value)\n        if interval < 100:\n            interval = 100\n        self.__data[\"memory_update\"] = interval\n\n    @property\n    def dpi(self):\n        return self._get_data(\"dpi\")\n\n    @dpi.setter\n    def dpi(self, value):\n        dpi = int(value)\n        if dpi < 40:\n            dpi = 40\n        elif dpi > 100:\n            dpi = 100\n        self.__data[\"dpi\"] = dpi\n\n    @property\n    def maximum_gds_size(self):\n        return self._get_data(\"gds_size\")\n\n    @maximum_gds_size.setter\n    def maximum_gds_size(self, value):\n        size = int(value)\n        if size < MEGABYTE:\n            size = MEGABYTE\n        self.__data[\"gds_size\"] = size\n\n    @property\n    def thread_count(self):\n        return self._get_data(\"thread_count\")\n\n    @thread_count.setter\n    def thread_count(self, value):\n        thread_count = int(value)\n        if thread_count > psutil.cpu_count():\n            thread_count = psutil.cpu_count()\n        elif thread_count < 1:\n            thread_count = 1\n        self.__data[\"thread_count\"] = thread_count\n\n    @classmethod\n    def open(cls, path=CONFIG_PATH):\n\n        save_required = False\n\n        try:\n            with open(path, \"r\") as config_file:\n                kwargs = json.loads(config_file.read())\n        except IOError as error:\n            if error.errno == 2:\n                logging.error(\"Can't open configuration file using default values\")\n                save_required = True\n                kwargs = {}\n            else:\n                raise\n        except ValueError:\n            logging.error(\"Can't parse configuration file using default values\")\n            save_required = True\n            kwargs = {}\n\n        config = cls(**kwargs)\n        config.path = path\n\n        if save_required:\n            config.save(path)\n\n        return config\n\n    def save(self, path=CONFIG_PATH):\n        config_dir = os.path.dirname(os.path.abspath(path))\n\n        if not os.path.exists(config_dir):\n            os.makedirs(config_dir)\n\n        with open(path, \"w\") as config_file:\n            config_file.write(json.dumps(self.serialize(), indent=4))\n\n\nConfiguration = _Configuration.open()\n\"\"\":type: _Configuration\"\"\"\n"
  },
  {
    "path": "OptolithiumGui/core.py",
    "content": "# This file is part of Optolithium lithography modelling software.\r\n#\r\n# Copyright (C) 2015 Alexei Gladkikh\r\n#\r\n# This software is dual-licensed: you can redistribute it and/or modify\r\n# it under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version only for NON-COMMERCIAL usage.\r\n#\r\n# This program is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n#\r\n# If you are interested in other licensing models, including a commercial-\r\n# license, please contact the author at gladkikhalexei@gmail.com\r\n\r\nimport optolithiumc as oplc\r\nimport logging as module_logging\r\nimport helpers\r\n\r\nfrom numpy import angle\r\nfrom qt import QtCore, Signal, connect, Slot\r\nfrom metrics import IMAGE_NEGATIVE, IMAGE_POSITIVE, \\\r\n    CONTOUR_METRICS, IMAGE_METRICS, PROFILE_METRICS, STANDING_WAVES_METRICS\r\n\r\n\r\n__author__ = 'Alexei Gladkikh'\r\n\r\n\r\nlogging = module_logging.getLogger(__name__)\r\nlogging.setLevel(module_logging.INFO)\r\nhelpers.logStreamEnable(logging)\r\n\r\ncore_logging = oplc.OptolithiumCoreLog()\r\ncore_logging.set_verbose_level(4)\r\n\r\nLOG_VERBOSE_0 = 0\r\n\r\n# set_printoptions(linewidth=nan, precision=3, threshold=nan)\r\n\r\n\r\nclass CoreSimulationOptions(object):\r\n\r\n    def __init__(self, options):\r\n        \"\"\":type options: options.structures.Options\"\"\"\r\n        self.__options = options\r\n\r\n        self.__mask = None\r\n        self.__imaging_tool = None\r\n        self.__wafer_stack = None\r\n        self.__exposure = None\r\n        self.__peb = None\r\n        self.__development = None\r\n\r\n    @property\r\n    def options(self):\r\n        return self.__options\r\n\r\n    def numerics(self, changed=None):\r\n        if changed is not None:\r\n            changed.append(not self.__options.numerics.is_simulated)\r\n        self.__options.numerics.simulated()\r\n        return self.__options.numerics\r\n\r\n    def mask(self, changed=None):\r\n        if not self.__options.mask.is_simulated or self.__mask is None:\r\n            if changed is not None:\r\n                changed.append(True)\r\n            self.__mask = self.__options.mask.convert2core()\r\n            self.__options.mask.simulated()\r\n        elif changed is not None:\r\n            changed.append(False)\r\n        return self.__mask\r\n\r\n    def imaging_tool(self, changed=None):\r\n        if not self.__options.imaging_tool.is_simulated or self.__imaging_tool is None:\r\n            if changed is not None:\r\n                changed.append(True)\r\n            self.__imaging_tool = self.__options.imaging_tool.convert2core()\r\n            self.__options.imaging_tool.simulated()\r\n        elif changed is not None:\r\n            changed.append(False)\r\n        return self.__imaging_tool\r\n\r\n    def wafer_stack(self, changed=None):\r\n        if not self.__options.wafer_process.is_simulated or self.__wafer_stack is None:\r\n            if changed is not None:\r\n                changed.append(True)\r\n            self.__wafer_stack = self.__options.wafer_process.convert2core()\r\n            self.__options.wafer_process.simulated()\r\n        elif changed is not None:\r\n            changed.append(False)\r\n        return self.__wafer_stack\r\n\r\n    def exposure(self, changed=None):\r\n        if not self.__options.exposure_focus.is_simulated or self.__exposure is None:\r\n            if changed is not None:\r\n                changed.append(True)\r\n            self.__exposure = self.__options.exposure_focus.convert2core()\r\n            self.__options.exposure_focus.simulated()\r\n        elif changed is not None:\r\n            changed.append(False)\r\n        return self.__exposure\r\n\r\n    def post_exposure_bake(self, changed=None):\r\n        if not self.__options.peb.is_simulated or self.__peb is None:\r\n            if changed is not None:\r\n                changed.append(True)\r\n            self.__peb = self.__options.peb.convert2core()\r\n            self.__options.peb.simulated()\r\n        elif changed is not None:\r\n            changed.append(False)\r\n        return self.__peb\r\n\r\n    def development(self, changed=None):\r\n        if not self.__options.development.is_simulated or self.__development is None:\r\n            if changed is not None:\r\n                changed.append(True)\r\n            self.__development = self.__options.development.convert2core()\r\n            self.__options.development.simulated()\r\n        elif changed is not None:\r\n            changed.append(False)\r\n        return self.__development\r\n\r\n\r\nclass AbstractStage(QtCore.QObject):\r\n\r\n    invalidated = Signal()\r\n\r\n    def __init__(self, core_options, metrics, pre_stage=None):\r\n        \"\"\"\r\n        :type core_options: CoreSimulationOptions\r\n        :type pre_stage: AbstractStage or None\r\n        \"\"\"\r\n        super(AbstractStage, self).__init__()\r\n\r\n        self.__core_options = core_options\r\n\r\n        self.__pre_stage = pre_stage\r\n        \"\"\":type: AbstractStage or None\"\"\"\r\n\r\n        if self.__pre_stage is not None:\r\n            self.__pre_stage.add_post_stage(self)\r\n\r\n        self.__post_stages = []\r\n        \"\"\":type: list of AbstractStage\"\"\"\r\n\r\n        self.__result = None\r\n\r\n        self.__metrics = [metric_class(self) for metric_class in metrics]\r\n\r\n    @property\r\n    def name(self):\r\n        \"\"\":rtype: str\"\"\"\r\n        raise NotImplementedError\r\n\r\n    @property\r\n    def pre_stage(self):\r\n        return self.__pre_stage\r\n\r\n    def add_post_stage(self, stage):\r\n        \"\"\":type: AbstractStage\"\"\"\r\n        self.__post_stages.append(stage)\r\n\r\n    @property\r\n    def has_result(self):\r\n        return self.__result is not None\r\n\r\n    @Slot()\r\n    def invalidate(self):\r\n        # logging.info(\"Invalidate: %s\" % self.__class__.__name__)\r\n        self.__result = None\r\n        for stage in self.__post_stages:\r\n            # if stage.has_result:\r\n            stage.invalidate()\r\n        self.invalidated.emit()\r\n\r\n    @property\r\n    def core_options(self):\r\n        return self.__core_options\r\n\r\n    @property\r\n    def options(self):\r\n        return self.core_options.options\r\n\r\n    def _payload(self):\r\n        \"\"\":rtype: optolithiumc.Diffraction or optolithiumc.ResistVolume\"\"\"\r\n        raise NotImplementedError\r\n\r\n    @property\r\n    def metrics_kwargs(self):\r\n        \"\"\":rtype: dict from str\"\"\"\r\n        return dict()\r\n\r\n    @property\r\n    def metrics(self):\r\n        \"\"\":rtype: list of metrology.MetrologyInterface\"\"\"\r\n        return self.__metrics\r\n\r\n    def calculate(self):\r\n        logging.debug(\"Calculate %s\" % self.__class__.__name__)\r\n        if not self.has_result:\r\n            self.__result = self._payload()\r\n        else:\r\n            logging.debug(\"%s not changed\" % self.__class__.__name__)\r\n        return self.__result\r\n\r\n\r\nclass DiffractionStage(AbstractStage):\r\n\r\n    def __init__(self, core_options):\r\n        super(DiffractionStage, self).__init__(core_options, [])\r\n\r\n    @property\r\n    def name(self):\r\n        return \"Diffraction\"\r\n\r\n    def _payload(self, *args):\r\n        mask = self.core_options.mask()\r\n        imaging_tool = self.core_options.imaging_tool()\r\n\r\n        diffraction = oplc.diffraction(imaging_tool, mask)\r\n\r\n        logging.log(\r\n            LOG_VERBOSE_0,\r\n            \"Calculated diffraction pattern data:\\n\"\r\n            \"Diffraction terms numbers belong X-Axis:\\n%s\\n\"\r\n            \"Diffraction terms numbers belong Y-Axis:\\n%s\\n\"\r\n            \"Diffraction direction cosines belong X-Axis:\\n%s\\n\"\r\n            \"Diffraction direction cosines belong Y-Axis:\\n%s\\n\"\r\n            \"Diffraction terms direction cosines in polar view:\\n%s\\n\"\r\n            \"Diffraction terms values:\\n%s\\n\" % (\r\n                diffraction.kx, diffraction.ky,\r\n                diffraction.cx, diffraction.cy,\r\n                diffraction.cxy, diffraction.values\r\n            )\r\n        )\r\n\r\n        return diffraction\r\n\r\n\r\nclass AerialImageStage(AbstractStage):\r\n\r\n    def __init__(self, core_options, pre_stage):\r\n        super(AerialImageStage, self).__init__(core_options, metrics=IMAGE_METRICS, pre_stage=pre_stage)\r\n\r\n    @property\r\n    def name(self):\r\n        return \"Aerial Image\"\r\n\r\n    def _payload(self):\r\n        diffraction = self.pre_stage.calculate()\r\n\r\n        numerics = self.core_options.numerics()\r\n        imaging_tool = self.core_options.imaging_tool()\r\n        exposure_focus = self.core_options.exposure()\r\n\r\n        otf = oplc.OpticalTransferFunction(imaging_tool, exposure_focus)\r\n        aerial_image = oplc.aerial_image(diffraction, otf, numerics.grid_xy.value)\r\n\r\n        logging.log(\r\n            LOG_VERBOSE_0,\r\n            \"Calculated aerial image data [%s]:\\n\"\r\n            \"Aerial image X-Axis data:\\n%s\\n\"\r\n            \"Aerial image Y-Axis data:\\n%s\\n\"\r\n            \"Aerial image values:\\n%s\\n\" % (\r\n                aerial_image.values.shape,\r\n                aerial_image.x,\r\n                aerial_image.y,\r\n                aerial_image.values\r\n            )\r\n        )\r\n\r\n        return aerial_image\r\n\r\n    @property\r\n    def metrics_kwargs(self):\r\n        return {\r\n            \"level\": self.options.metrology.aerial_image_level.value\r\n        }\r\n\r\n\r\ndef _magnitude(v):\r\n    return (v * v.conjugate()).real\r\n\r\n\r\ndef _phase(v):\r\n    return angle(v, deg=True)\r\n\r\n\r\nclass StandingWavesStage(AbstractStage):\r\n\r\n    def __init__(self, core_options):\r\n        super(StandingWavesStage, self).__init__(core_options, metrics=STANDING_WAVES_METRICS)\r\n\r\n    @property\r\n    def name(self):\r\n        return \"Standing Waves\"\r\n\r\n    def _payload(self):\r\n        wafer_stack = self.core_options.wafer_stack()\r\n        wavelength = self.core_options.imaging_tool().wavelength\r\n        resist_indx = wafer_stack.index_of(wafer_stack.resist())\r\n        resist_reflectivity = wafer_stack.reflectivity(resist_indx, wavelength)\r\n        substrate_reflectivity = wafer_stack.reflectivity(resist_indx+1, wavelength)\r\n        return {\r\n            \"resist_reflectivity\": _magnitude(resist_reflectivity),\r\n            \"resist_phase\": _phase(resist_reflectivity),\r\n            \"substrate_reflectivity\": _magnitude(substrate_reflectivity),\r\n            \"substrate_phase\": _phase(substrate_reflectivity)\r\n        }\r\n\r\n\r\nclass ImageInResistStage(AbstractStage):\r\n\r\n    def __init__(self, core_options, pre_stage):\r\n        super(ImageInResistStage, self).__init__(core_options, metrics=IMAGE_METRICS, pre_stage=pre_stage)\r\n\r\n    @property\r\n    def name(self):\r\n        return \"Image in Resist\"\r\n\r\n    def _payload(self):\r\n        diffraction = self.pre_stage.calculate()\r\n\r\n        numerics = self.core_options.numerics()\r\n        wafer_stack = self.core_options.wafer_stack()\r\n        imaging_tool = self.core_options.imaging_tool()\r\n        exposure = self.core_options.exposure()\r\n\r\n        otf = oplc.OpticalTransferFunction(imaging_tool, exposure, wafer_stack)\r\n\r\n        image_in_resist = oplc.image_in_resist(diffraction, otf, numerics.grid_xy.value, numerics.grid_z.value)\r\n\r\n        logging.log(\r\n            LOG_VERBOSE_0,\r\n            \"Calculated image in resist data [%s]:\\n\"\r\n            \"Image in resist X-Axis data:\\n%s\\n\"\r\n            \"Image in resist Y-Axis data:\\n%s\\n\"\r\n            \"Image in resist Z-Axis data:\\n%s\\n\"\r\n            \"Image in resist values:\\n%s\\n\" % (\r\n                image_in_resist.values.shape,\r\n                image_in_resist.x,\r\n                image_in_resist.y,\r\n                image_in_resist.z,\r\n                image_in_resist.values\r\n            )\r\n        )\r\n        return image_in_resist\r\n\r\n    @property\r\n    def metrics_kwargs(self):\r\n        return {\r\n            \"title\": \"Relative Intensity\",\r\n            \"level\": self.options.metrology.image_in_resist_level.value,\r\n            \"image_tonality\": IMAGE_NEGATIVE,\r\n            \"tonality\": self.options.metrology.mask_tonality.value,\r\n            \"height\": self.options.metrology.measurement_height.value,\r\n        }\r\n\r\n\r\nclass LatentImageStage(AbstractStage):\r\n\r\n    def __init__(self, core_options, pre_stage):\r\n        super(LatentImageStage, self).__init__(core_options, metrics=IMAGE_METRICS, pre_stage=pre_stage)\r\n\r\n    @property\r\n    def name(self):\r\n        return \"Exposed Latent Image in Resist\"\r\n\r\n    def _payload(self):\r\n        image_in_resist = self.pre_stage.calculate()\r\n\r\n        resist = oplc.ResistWaferLayer.cast(self.core_options.wafer_stack().resist())\r\n        exposure = self.core_options.exposure()\r\n\r\n        latent_image = oplc.latent_image(image_in_resist, resist, exposure)\r\n\r\n        logging.log(\r\n            LOG_VERBOSE_0,\r\n            \"Calculated image in resist data [%s]:\\n\"\r\n            \"Exposed Latent Image in resist X-Axis data:\\n%s\\n\"\r\n            \"Exposed Latent Image in resist Y-Axis data:\\n%s\\n\"\r\n            \"Exposed Latent Image in resist Z-Axis data:\\n%s\\n\"\r\n            \"Exposed Latent Image in resist values:\\n%s\\n\" % (\r\n                latent_image.values.shape,\r\n                latent_image.x,\r\n                latent_image.y,\r\n                latent_image.z,\r\n                latent_image.values\r\n            )\r\n        )\r\n        return latent_image\r\n\r\n    @property\r\n    def metrics_kwargs(self):\r\n        return {\r\n            \"title\": \"Relative PAC Concentration\",\r\n            \"level\": self.options.metrology.latent_image_level.value,\r\n            \"image_tonality\": IMAGE_POSITIVE,\r\n            \"tonality\": self.options.metrology.mask_tonality.value,\r\n            \"height\": self.options.metrology.measurement_height.value,\r\n        }\r\n\r\n\r\nclass PebLatentImageStage(AbstractStage):\r\n\r\n    def __init__(self, core_options, pre_stage):\r\n        super(PebLatentImageStage, self).__init__(core_options, metrics=IMAGE_METRICS, pre_stage=pre_stage)\r\n\r\n    @property\r\n    def name(self):\r\n        return \"Latent Image in Resist after PEB\"\r\n\r\n    def _payload(self):\r\n        latent_image = self.pre_stage.calculate()\r\n\r\n        resist = oplc.ResistWaferLayer.cast(self.core_options.wafer_stack().resist())\r\n        peb = self.core_options.post_exposure_bake()\r\n\r\n        peb_latent_image = oplc.peb_latent_image(latent_image, resist, peb)\r\n\r\n        logging.log(\r\n            LOG_VERBOSE_0,\r\n            \"Calculated image in resist data [%s]:\\n\"\r\n            \"PEB Latent Image in resist X-Axis data:\\n%s\\n\"\r\n            \"PEB Latent Image in resist Y-Axis data:\\n%s\\n\"\r\n            \"PEB Latent Image in resist Z-Axis data:\\n%s\\n\"\r\n            \"PEB Latent Image in resist values:\\n%s\\n\" % (\r\n                peb_latent_image.values.shape,\r\n                peb_latent_image.x,\r\n                peb_latent_image.y,\r\n                peb_latent_image.z,\r\n                peb_latent_image.values\r\n            )\r\n        )\r\n        return peb_latent_image\r\n\r\n    @property\r\n    def metrics_kwargs(self):\r\n        return {\r\n            \"title\": \"Relative PAC Concentration\",\r\n            \"level\": self.options.metrology.peb_latent_image_level.value,\r\n            \"image_tonality\": IMAGE_POSITIVE,\r\n            \"tonality\": self.options.metrology.mask_tonality.value,\r\n            \"height\": self.options.metrology.measurement_height.value,\r\n        }\r\n\r\n\r\nclass DevelopContoursStage(AbstractStage):\r\n\r\n    def __init__(self, core_options, pre_stage):\r\n        super(DevelopContoursStage, self).__init__(core_options, metrics=CONTOUR_METRICS, pre_stage=pre_stage)\r\n\r\n    @property\r\n    def name(self):\r\n        return \"Develop Time Contours\"\r\n\r\n    def _payload(self):\r\n        peb_latent_image = self.pre_stage.calculate()\r\n\r\n        resist = oplc.ResistWaferLayer.cast(self.core_options.wafer_stack().resist())\r\n\r\n        develop_contours = oplc.develop_time_contours(peb_latent_image, resist)\r\n\r\n        logging.log(\r\n            LOG_VERBOSE_0,\r\n            \"Calculated develop time contours data [%s]:\\n\"\r\n            \"Develop time contours X-Axis data:\\n%s\\n\"\r\n            \"Develop time contours Y-Axis data:\\n%s\\n\"\r\n            \"Develop time contours Z-Axis data:\\n%s\\n\"\r\n            \"Develop time contours values:\\n%s\\n\" % (\r\n                develop_contours.values.shape,\r\n                develop_contours.x,\r\n                develop_contours.y,\r\n                develop_contours.z,\r\n                develop_contours.values\r\n            )\r\n        )\r\n        return develop_contours\r\n\r\n    @property\r\n    def metrics_kwargs(self):\r\n        return {\r\n            \"level\": self.options.development.develop_time.value,\r\n            \"image_tonality\": IMAGE_POSITIVE,\r\n            \"tonality\": self.options.metrology.mask_tonality.value,\r\n            \"height\": self.options.metrology.measurement_height.value,\r\n            \"variate_height\": self.options.metrology.variate_meas_height.value,\r\n        }\r\n\r\n\r\nclass ResistProfileStage(AbstractStage):\r\n\r\n    def __init__(self, core_options, pre_stage):\r\n        super(ResistProfileStage, self).__init__(core_options, metrics=PROFILE_METRICS, pre_stage=pre_stage)\r\n\r\n    @property\r\n    def name(self):\r\n        return \"Resist Profile\"\r\n\r\n    def _payload(self):\r\n        develop_contours = self.pre_stage.calculate()\r\n        develop_time = self.core_options.development()\r\n        resist_profile = oplc.resist_profile(develop_contours, develop_time)\r\n        return resist_profile\r\n\r\n    @property\r\n    def metrics_kwargs(self):\r\n        return {\r\n            \"tonality\": self.options.metrology.mask_tonality.value,\r\n            \"height\": self.options.metrology.measurement_height.value,\r\n            \"variate_height\": self.options.metrology.variate_meas_height.value,\r\n        }\r\n\r\n\r\nclass Core(QtCore.QObject):\r\n\r\n    def __init__(self, options, *args, **kwargs):\r\n        \"\"\":type options: options.structures.Options\"\"\"\r\n        super(Core, self).__init__(*args, **kwargs)\r\n        self.__options = options\r\n        core_options = CoreSimulationOptions(options)\r\n        self.__standing_waves_stage = StandingWavesStage(core_options)\r\n        self.__diffraction_stage = DiffractionStage(core_options)\r\n        self.__aerial_image_stage = AerialImageStage(core_options, self.__diffraction_stage)\r\n        self.__image_in_resist_stage = ImageInResistStage(core_options, self.__diffraction_stage)\r\n        self.__latent_image_stage = LatentImageStage(core_options, self.__image_in_resist_stage)\r\n        self.__peb_latent_image_stage = PebLatentImageStage(core_options, self.__latent_image_stage)\r\n        self.__develop_contours_stage = DevelopContoursStage(core_options, self.__peb_latent_image_stage)\r\n        self.__resist_profile_stage = ResistProfileStage(core_options, self.__develop_contours_stage)\r\n\r\n        self.__stages = [\r\n            self.standing_waves, self.diffraction,\r\n            self.aerial_image, self.image_in_resist,\r\n            self.latent_image, self.peb_latent_image,\r\n            self.develop_contours, self.resist_profile\r\n        ]\r\n\r\n        logging.info(\"Connect numerics signals to core\")\r\n        connect(\r\n            self.__options.numerics.changed,\r\n            self.__standing_waves_stage.invalidate,\r\n            self.__aerial_image_stage.invalidate,\r\n            self.__image_in_resist_stage.invalidate\r\n        )\r\n\r\n        logging.info(\"Connect wafer process signals to core\")\r\n        connect(\r\n            self.__options.wafer_process.changed,\r\n            self.__standing_waves_stage.invalidate,\r\n            self.__image_in_resist_stage.invalidate,\r\n        )\r\n\r\n        logging.info(\"Connect resist signals to core\")\r\n        connect(\r\n            self.__options.wafer_process.resist.changed,\r\n            self.__standing_waves_stage.invalidate,\r\n            self.__develop_contours_stage.invalidate,\r\n        )\r\n\r\n        logging.info(\"Connect mask signals to core\")\r\n        connect(\r\n            self.__options.mask.changed,\r\n            self.__diffraction_stage.invalidate\r\n        )\r\n\r\n        logging.info(\"Connect imaging tool signals to core\")\r\n        connect(\r\n            self.__options.imaging_tool.changed,\r\n            self.__standing_waves_stage.invalidate,\r\n            self.__diffraction_stage.invalidate,\r\n        )\r\n\r\n        logging.info(\"Connect exposure focus signals to core\")\r\n        connect(\r\n            self.__options.exposure_focus.changed,\r\n            self.__aerial_image_stage.invalidate,\r\n            self.__image_in_resist_stage.invalidate\r\n        )\r\n\r\n        logging.info(\"Connect peb signals to core\")\r\n        connect(\r\n            self.__options.peb.changed,\r\n            self.__peb_latent_image_stage.invalidate\r\n        )\r\n\r\n        logging.info(\"Connect development signals to core\")\r\n        connect(\r\n            self.__options.development.changed,\r\n            self.__resist_profile_stage.invalidate\r\n        )\r\n\r\n    @property\r\n    def options(self):\r\n        return self.__options\r\n\r\n    def __iter__(self):\r\n        return self.__stages.__iter__()\r\n\r\n    standing_waves = property(lambda self: self.__standing_waves_stage)\r\n    diffraction = property(lambda self: self.__diffraction_stage)\r\n    aerial_image = property(lambda self: self.__aerial_image_stage)\r\n    image_in_resist = property(lambda self: self.__image_in_resist_stage)\r\n    latent_image = property(lambda self: self.__latent_image_stage)\r\n    peb_latent_image = property(lambda self: self.__peb_latent_image_stage)\r\n    develop_contours = property(lambda self: self.__develop_contours_stage)\r\n    resist_profile = property(lambda self: self.__resist_profile_stage)"
  },
  {
    "path": "OptolithiumGui/database/Enum.py",
    "content": "# -*- coding: utf-8 -*-\n# The Enum Recipe by zzzeek\n# http://techspot.zzzeek.org/2011/01/14/the-enum-recipe/\nimport re\nfrom sqlalchemy.types import SchemaType, TypeDecorator\nfrom database.base import Enum\n\n\nclass EnumSymbol(object):\n    \"\"\"Define a fixed symbol tied to a parent class.\"\"\"\n\n    def __init__(self, cls_, name, value, description):\n        self.cls_ = cls_\n        \"\"\":type: type\"\"\"\n        self.name = name\n        \"\"\":type: str\"\"\"\n        self.value = value\n        \"\"\":type: str\"\"\"\n        self.description = description\n        \"\"\":type: str\"\"\"\n\n    def __reduce__(self):\n        \"\"\"Allow unpickling to return the symbol linked to the DeclarativeEnum class.\"\"\"\n        return getattr, (self.cls_, self.name)\n\n    def __iter__(self):\n        return iter([self.value, self.description])\n\n    def __repr__(self):\n        return \"%s\" % self.name\n\n\nclass EnumMeta(type):\n    \"\"\"Generate new DeclarativeEnum classes.\"\"\"\n\n    def __init__(cls, classname, bases, dict_):\n        cls._reg = reg = cls._reg.copy()\n        for k, v in dict_.items():\n            if isinstance(v, tuple):\n                sym = reg[v[0]] = EnumSymbol(cls, k, *v)\n                setattr(cls, k, sym)\n        # noinspection PyReturnFromInit\n        return type.__init__(cls, classname, bases, dict_)\n\n    def __iter__(cls):\n        # noinspection PyUnresolvedReferences\n        return iter(cls._reg.values())\n\n\nclass DeclarativeEnum(object):\n    \"\"\"Declarative enumeration.\"\"\"\n\n    __metaclass__ = EnumMeta\n    _reg = {}\n\n    @classmethod\n    def from_string(cls, value):\n        try:\n            return cls._reg[value]\n        except KeyError:\n            raise ValueError(\"Invalid value for %r: %r\" % (cls.__name__, value))\n\n    @classmethod\n    def values(cls):\n        return cls._reg.keys()\n\n    @classmethod\n    def db_type(cls):\n        return DeclarativeEnumType(cls)\n\n\nclass DeclarativeEnumType(SchemaType, TypeDecorator):\n    # noinspection PyMissingConstructor\n    def __init__(self, enum):\n        self.enum = enum\n        sub = re.sub('([A-Z])', lambda m: \"_\" + m.group(1).lower(), enum.__name__)\n        self.impl = Enum(*enum.values(), name=\"ck%s\" % sub)\n\n    def _set_table(self, table, column):\n        # noinspection PyProtectedMember\n        self.impl._set_table(table, column)\n\n    def copy(self):\n        return DeclarativeEnumType(self.enum)\n\n    def process_bind_param(self, value, dialect):\n        if value is None:\n            return None\n        return value.value\n\n    def process_result_value(self, value, dialect):\n        if value is None:\n            return None\n        return self.enum.from_string(value.strip())"
  },
  {
    "path": "OptolithiumGui/database/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\n\n__author__ = 'Alexei Gladkikh'"
  },
  {
    "path": "OptolithiumGui/database/base.py",
    "content": "# This file is part of Optolithium lithography modelling software.\r\n#\r\n# Copyright (C) 2015 Alexei Gladkikh\r\n#\r\n# This software is dual-licensed: you can redistribute it and/or modify\r\n# it under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version only for NON-COMMERCIAL usage.\r\n#\r\n# This program is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n#\r\n# If you are interested in other licensing models, including a commercial-\r\n# license, please contact the author at gladkikhalexei@gmail.com\r\n\r\nimport sqlalchemy\r\nfrom sqlalchemy.orm import RelationshipProperty\r\nfrom sqlalchemy.ext.declarative import DeclarativeMeta\r\n\r\nimport logging as module_logging\r\nimport settings\r\nimport helpers\r\n\r\n\r\nInteger = sqlalchemy.Integer\r\nString = sqlalchemy.String\r\nFloat = sqlalchemy.Float\r\nBoolean = sqlalchemy.Boolean\r\nDateTime = sqlalchemy.DateTime\r\nEnum = sqlalchemy.Enum\r\n\r\n\r\n__author__ = 'Alexei Gladkikh'\r\n\r\n\r\nlogging = module_logging.getLogger(__name__)\r\nlogging.setLevel(module_logging.INFO)\r\nhelpers.logStreamEnable(logging)\r\n\r\n\r\nclass Column(sqlalchemy.Column):\r\n\r\n    def __init__(self, *args, **kwargs):\r\n        self.precision = kwargs.pop(\"precision\", None)\r\n        super(Column, self).__init__(*args, **kwargs)\r\n\r\n\r\nclass SignalsMeta(DeclarativeMeta):\r\n\r\n    ID_NAME = \"id\"\r\n\r\n    SIGNAL_CLASS_SUFFIX = \"SignalsClass\"\r\n\r\n    GuiObjectClass = settings.get_gui_provider_object()\r\n    GuiSignalClass = settings.get_gui_provider_signal()\r\n\r\n    ClassAttributes = dict()\r\n\r\n    # noinspection PyPep8Naming\r\n    @staticmethod\r\n    def SignalsAttrName(arg):\r\n        classname = arg if isinstance(arg, basestring) else arg.__class__.__name__\r\n        return \"%s.%s\" % (classname, SignalsMeta.SIGNAL_CLASS_SUFFIX)\r\n\r\n    class AbstractSignalsClass(GuiObjectClass):\r\n        def __init__(self, container):\r\n            SignalsMeta.GuiObjectClass.__init__(self)\r\n            # logging.info(\"%s: %s\" % (self.__class__.__name__, container))\r\n            self.__container = container\r\n\r\n        def __getitem__(self, column):\r\n            \"\"\"\r\n            :type column: Column | RelationshipProperty |\r\n                options.structures.AttributedProperty | options.structures.Abstract\r\n            :rtype: GuiSignalClass\r\n            \"\"\"\r\n            return getattr(self, column.key)\r\n\r\n        # def __iter__(self):\r\n        #     for field in self.__container.__dict__.values():\r\n        #         # if isinstance(field, (Column, RelationshipProperty, AttributedProperty, Abstract)):\r\n        #         # FIXME: This is wrench and very danger\r\n        #         logging.info(\"Self: %s (%s)\" % (field, field.__class__.__name__))\r\n        #         if isinstance(field, (Column, RelationshipProperty)) or \\\r\n        #            field.__class__.__name__ == \"AttributedProperty\" or \\\r\n        #            field.__class__.__name__ == \"Abstract\":\r\n        #             yield self[field]\r\n\r\n        def container(self):\r\n            return self.__container\r\n\r\n    # noinspection PyPep8Naming\r\n    @staticmethod\r\n    def CreateSignalsClass(class_name, items, db_columns=False):\r\n        \"\"\"\r\n        :type class_name: str\r\n        :type items: list of str or list of Column\r\n        :type db_columns: bool\r\n        \"\"\"\r\n        signal_class_name = SignalsMeta.SignalsAttrName(class_name)\r\n        if db_columns:\r\n            signal_class_dict = dict()\r\n            for item in items:\r\n                # logging.info(\"Item: %s [%s]\" % (item, type(item)))\r\n\r\n                # \"key\" property used here because \"name\" property has only Column\r\n                # object but RelationshipProperty hasn't. While \"key\" is equal to \"name\"\r\n                # and both objects have this property.\r\n                if isinstance(item, (Column, RelationshipProperty)) and \\\r\n                   item.key not in signal_class_dict and \\\r\n                   item.key != SignalsMeta.ID_NAME:\r\n                    # logging.info(\"Add signal: %s.%s\" % (class_name, item.key))\r\n                    signal_class_dict[item.key] = SignalsMeta.GuiSignalClass(name=item.key)\r\n        else:\r\n            signal_class_dict = {item: SignalsMeta.GuiSignalClass(name=item) for item in items}\r\n\r\n        return type(signal_class_name, (SignalsMeta.AbstractSignalsClass, ), signal_class_dict)\r\n\r\n    def __init__(cls, class_name, bases, dict_):\r\n        # logging.info(\"Current class: %s\" % cls.__name__)\r\n\r\n        super(SignalsMeta, cls).__init__(class_name, bases, dict_)\r\n\r\n        check_attrs = []\r\n        for parent in cls.mro():\r\n            check_attrs.extend(SignalsMeta.ClassAttributes.get(parent, []))\r\n        check_attrs.extend(dict_.values())\r\n\r\n        SignalsMeta.ClassAttributes[cls] = dict_.values()\r\n\r\n        signal_class = SignalsMeta.CreateSignalsClass(class_name, check_attrs, db_columns=True)\r\n        setattr(cls, signal_class.__name__, signal_class)"
  },
  {
    "path": "OptolithiumGui/database/common.py",
    "content": "# -*- coding: utf-8 -*-\r\n\r\n# This file is part of Optolithium lithography modelling software.\r\n#\r\n# Copyright (C) 2015 Alexei Gladkikh\r\n#\r\n# This software is dual-licensed: you can redistribute it and/or modify\r\n# it under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version only for NON-COMMERCIAL usage.\r\n#\r\n# This program is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n#\r\n# If you are interested in other licensing models, including a commercial-\r\n# license, please contact the author at gladkikhalexei@gmail.com\r\n\r\nimport os\r\nimport logging as module_logging\r\nfrom database import dbparser\r\n\r\nimport orm\r\n\r\nimport config\r\nimport helpers\r\n\r\n\r\n__author__ = 'Alexei Gladkikh'\r\n\r\n\r\nlogging = module_logging.getLogger(__name__)\r\nlogging.setLevel(module_logging.DEBUG)\r\nhelpers.logStreamEnable(logging)\r\n\r\n\r\nDB_VERSION = 6\r\nDB_SCHEME = \"sqlite\"\r\n\r\n\r\n# noinspection PyPep8Naming\r\ndef appdbCloseIfError(function):\r\n    def wrapped(inst, *args, **kwargs):\r\n        try:\r\n            return function(inst, *args, **kwargs)\r\n        except:\r\n            inst.close()\r\n            raise\r\n    return wrapped\r\n\r\n\r\nclass ApplicationDatabase(object):\r\n\r\n    standard_tables = orm.standard_tables\r\n    plugin_tables = orm.plugin_tables\r\n\r\n    # ------------------------------------------------------------------------------------------------------------------\r\n\r\n    class OperationError(Exception):\r\n        def __init__(self, *args, **kwargs):\r\n            super(ApplicationDatabase.OperationError, self).__init__(*args, **kwargs)\r\n\r\n    class SqlError(OperationError):\r\n        def __init__(self, *args, **kwargs):\r\n            super(ApplicationDatabase.SqlError, self).__init__(*args, **kwargs)\r\n\r\n    class ObjectExisted(OperationError):\r\n        def __init__(self, p_object):\r\n            super(ApplicationDatabase.ObjectExisted, self).__init__()\r\n            self.object = p_object\r\n\r\n    class ImportError(OperationError):\r\n        def __init__(self, *args, **kwargs):\r\n            super(ApplicationDatabase.ImportError, self).__init__(*args, **kwargs)\r\n\r\n    class VersionError(OperationError):\r\n        def __init__(self, version, *args):\r\n            super(ApplicationDatabase.VersionError, self).__init__(*args)\r\n            self.__version = version\r\n\r\n        @property\r\n        def version(self):\r\n            return self.__version\r\n\r\n    class DefaultObjectsError(OperationError):\r\n        def __init__(self, database, create_callbacks, *args):\r\n            \"\"\"\r\n            :param ApplicationDatabase database: Database\r\n            :param list create_callbacks: List of callbacks to create default objects\r\n            \"\"\"\r\n            super(ApplicationDatabase.DefaultObjectsError, self).__init__(*args)\r\n            self.__create_callbacks = create_callbacks\r\n            self.__database = database\r\n\r\n        def fix(self):\r\n            for callback in self.__create_callbacks:\r\n                callback(self.__database, commit=True)\r\n            return self.__database\r\n\r\n    # ------------------------------------------------------------------------------------------------------------------\r\n\r\n    def __init__(self, path):\r\n        self.__path = path\r\n        \"\"\":type: str\"\"\"\r\n        self.__connection = orm.Connection(\"%s:///%s\" % (DB_SCHEME, path), echo=config.LOG_DATABASE_QUERIES)\r\n        self.__session = orm.Session(bind=self.__connection)\r\n        self.__is_closed = False\r\n\r\n        self.__parser = None\r\n        \"\"\":type: database.dbparser.GenericParser or None\"\"\"\r\n\r\n    @property\r\n    def parser(self):\r\n        return self.__parser\r\n\r\n    @parser.setter\r\n    def parser(self, value):\r\n        \"\"\":type value: database.dbparser.GenericParser or None\"\"\"\r\n        if self.__parser and self.__parser.selector is not None:\r\n            logging.warning(\"Parser has already tethered to the database and will be rewritten!\")\r\n            self.__parser.selector = None\r\n        self.__parser = value\r\n        self.__parser.selector = self.__session.query\r\n\r\n    def _create_db_scheme(self):\r\n        orm.Base.metadata.create_all(self.__connection)\r\n        self.__session.add(orm.Info(DB_VERSION))\r\n        self.__session.commit()\r\n\r\n    @classmethod\r\n    def create(cls, path, rewrite=False):\r\n        \"\"\"\r\n        Create new database file and initialize it (required for template.db generation)\r\n\r\n        :param str path: Path to database file (may be empty string then db created in the memory)\r\n        :param bool rewrite: If True and DB already existed then it will be rewritten\r\n        :raises: ApplicationDatabase.SqlError\r\n        \"\"\"\r\n        if os.path.isfile(path):\r\n            if rewrite:\r\n                os.remove(path)\r\n            else:\r\n                raise ApplicationDatabase.OperationError(\"Configuration database already existed!\")\r\n\r\n        appdb = cls(path)\r\n        appdb._create_db_scheme()\r\n\r\n        return appdb\r\n\r\n    @staticmethod\r\n    def _check_sqlite_db(path):\r\n        \"\"\"\r\n        Check that database file existed and file has format of the SQLite database\r\n\r\n        :param str path: Database file path\r\n        :raises: ApplicationDatabase.OperationError\r\n        \"\"\"\r\n        # SQLite database file header is 100 bytes\r\n        if os.path.getsize(path) < 100:\r\n            raise ApplicationDatabase.OperationError(\"Wrong SQLite file size! (Most possible file is not SQLite)\")\r\n\r\n        with open(path, \"rb\") as db_file:\r\n            header = db_file.read(100)\r\n\r\n        if header[0:16] != \"SQLite format 3\\x00\":\r\n            raise ApplicationDatabase.OperationError(\"Wrong SQLite header! (Most possible file is not SQLite database)\")\r\n\r\n    @staticmethod\r\n    def _check_tables(inspector):\r\n        orm_table_names = orm.tables.keys()\r\n        db_tables_names = inspector.get_table_names()\r\n\r\n        orm_set = set(orm_table_names)\r\n        db_set = set(db_tables_names)\r\n\r\n        if orm_set != db_set:\r\n            diff = orm_set.symmetric_difference(db_set)\r\n            raise ApplicationDatabase.SqlError(\"Wrong database scheme:\\n*Not equal tables %s\" % (\" \".join(diff)))\r\n\r\n    @staticmethod\r\n    def _check_columns(inspector):\r\n        for table_name, orm_table in orm.tables.iteritems():\r\n            orm_columns = [\"%s\" % column for column in orm_table.columns]\r\n            db_columns = [\"%s.%s\" % (table_name, d[\"name\"]) for d in inspector.get_columns(table_name)]\r\n\r\n            orm_set = set(orm_columns)\r\n            db_set = set(db_columns)\r\n\r\n            if orm_set != db_set:\r\n                diff = orm_set.symmetric_difference(db_set)\r\n                raise ApplicationDatabase.SqlError(\r\n                    \"Wrong database table %s columns:\\n*Not equal columns %s\" %\r\n                    (table_name, \" \".join([str(c) for c in diff])))\r\n\r\n    @appdbCloseIfError\r\n    def _check_db_scheme(self, check_compat):\r\n        \"\"\"\r\n        Check database scheme and version\r\n\r\n        :param bool check_compat: Check compatibility of the database with supported scheme\r\n        :raises: ApplicationDatabase.SqlError\r\n        \"\"\"\r\n        logging.info(\"Check database scheme\")\r\n\r\n        try:\r\n            info = self.__session.query(orm.Info).one()\r\n        except orm.NoResultFound:\r\n            raise ApplicationDatabase.SqlError(\"Version record in application database not found!\")\r\n        except orm.MultipleResultsFound:\r\n            raise ApplicationDatabase.SqlError(\"Info table in application database not found!\")\r\n\r\n        if check_compat:\r\n            if info.version != DB_VERSION:\r\n                raise ApplicationDatabase.VersionError(info.version, \"Database version not supported!\")\r\n            inspector = orm.Inspector.from_engine(self.__connection)\r\n            self._check_tables(inspector)\r\n            self._check_columns(inspector)\r\n\r\n    @classmethod\r\n    def open(cls, path, create=False, check_compat=True):\r\n        \"\"\"\r\n        Open existed database and check it\r\n\r\n        :param str path: Path to database file\r\n        :param bool create: Create the database if not existed\r\n        :param bool check_compat: Check the version of the database scheme also\r\n        :raises: ApplicationDatabase.OperationError, ApplicationDatabase.SqlError\r\n        \"\"\"\r\n        logging.info(\"Open application database: %s\" % path)\r\n\r\n        if not os.path.isfile(path):\r\n            if create:\r\n                appdb = cls(path)\r\n                appdb._create_db_scheme()\r\n            else:\r\n                raise ApplicationDatabase.OperationError(\"Application database file not found!\")\r\n        else:\r\n            cls._check_sqlite_db(path)\r\n            appdb = cls(path)\r\n            appdb._check_db_scheme(check_compat)\r\n\r\n        return appdb\r\n\r\n    def close(self):\r\n        self.__session.close()\r\n        self.__is_closed = True\r\n\r\n    @property\r\n    def closed(self):\r\n        return self.__is_closed\r\n\r\n    def _existed(self, p_object):\r\n        \"\"\"\r\n        :type p_object: orm.Generic\r\n        :rtype: bool\r\n        \"\"\"\r\n        return self.__session.query(orm.Generic).filter(orm.Generic.name == p_object.name).first() is not None\r\n\r\n    def commit(self):\r\n        try:\r\n            self.__session.commit()\r\n\r\n        except (orm.IntegrityError, orm.OperationalError) as error:\r\n            self.__session.rollback()\r\n            signature = \"CHECK constraint failed: \"\r\n            if signature in error.orig.message:\r\n                message = \"While added %s: %s\" % (error.params, error.orig.message.split(signature)[-1])\r\n            else:\r\n                message = error.message\r\n            raise ApplicationDatabase.SqlError(message)\r\n\r\n        except:\r\n            self.__session.rollback()\r\n            raise\r\n\r\n    def add(self, p_object, commit=True):\r\n        \"\"\"\r\n        Add object to the database store\r\n\r\n        :param orm.Generic p_object: ORM Object to be added to the database\r\n        :param bool commit: Commit changes after modification\r\n        :raises: ApplicationDatabase.ObjectExisted\r\n        :rtype: list of orm.Generic\r\n        \"\"\"\r\n        if self._existed(p_object):\r\n            raise ApplicationDatabase.ObjectExisted(p_object)\r\n\r\n        self.__session.add(p_object)\r\n\r\n        new_objects = [obj for obj in self.__session.new if isinstance(obj, orm.Generic)]\r\n\r\n        if commit:\r\n            self.commit()\r\n\r\n        return new_objects\r\n\r\n    def remove(self, name=None, p_object=None, commit=True):\r\n        \"\"\"\r\n        Remove object from the database using an object or using name of the object\r\n\r\n        :param string name: Removing object name\r\n        :param orm.Generic p_object: Removing object\r\n        :param bool commit: Commit changes after modification\r\n        :rtype: list of orm.Generic\r\n        \"\"\"\r\n        if name is not None:\r\n            try:\r\n                this = self.__session.query(orm.Generic).filter(orm.Generic.name == name).one()\r\n            except orm.NoResultFound:\r\n                pass\r\n            else:\r\n                logging.debug(\"Remove object: %s\" % this)\r\n                self.__session.delete(this)\r\n        elif p_object is not None:\r\n            self.__session.delete(p_object)\r\n        else:\r\n            raise ValueError(\"Name of the object or deleted object must be set!\")\r\n\r\n        deleted = [obj for obj in self.__session.deleted if isinstance(obj, orm.Generic)]\r\n\r\n        if commit:\r\n            self.commit()\r\n\r\n        return deleted\r\n\r\n    def replace(self, p_object, commit=True):\r\n        \"\"\"\r\n        Replace object in the database store. Exception will be raised if object was not found in DB.\r\n\r\n        :param orm.Generic p_object: ORM Object to be added to the database\r\n        :param commit: Commit changes after modification\r\n        \"\"\"\r\n        # Commit required because it can be composed objects that also must be deleted\r\n        # So after_flush (see orm module) must executed\r\n        self.remove(name=p_object.name, commit=True)\r\n        self.add(p_object, commit)\r\n\r\n    def import_object(self, path):\r\n        \"\"\":rtype: list of orm.Generic\"\"\"\r\n        filename = helpers.GetFilename(path)\r\n        try:\r\n            p_object = self.__parser.parse(path)\r\n            new_objects = self.add(p_object)\r\n        except dbparser.GenericParserError as error:\r\n            logging.info(\"Parsing error: %s\" % path)\r\n            raise ApplicationDatabase.ImportError(\"Parsing error: %s\\n\\n%s!\" % (filename, error.message))\r\n        except ApplicationDatabase.SqlError as error:\r\n            logging.info(\"Insert error: %s\" % path)\r\n            raise ApplicationDatabase.ImportError(\"Inserting into database error: %s\\n\\n%s\" % (filename, error.message))\r\n        else:\r\n            return new_objects\r\n\r\n    @property\r\n    def path(self):\r\n        return self.__path\r\n\r\n    @appdbCloseIfError\r\n    def __getitem__(self, item):\r\n        \"\"\":rtype: sqlalchemy.orm.Query\"\"\"\r\n        return self.__session.query(item)"
  },
  {
    "path": "OptolithiumGui/database/dbparser.py",
    "content": "# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport abc\nimport os\nimport re\nimport StringIO\nimport numpy\nimport logging as module_logging\n\nimport config\nimport clipper\nimport gdsii.library\nimport gdsii.elements\n\nimport orm\nimport helpers\n\n\n__author__ = 'Alexei Gladkikh'\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.INFO)\nhelpers.logStreamEnable(logging)\n\n\ndef unique_rows(array):\n    ncols = array.shape[1]\n    dtype = array.dtype.descr * ncols\n    struct = array.view(dtype)\n    unique = numpy.unique(struct)\n    return unique.view(array.dtype).reshape(-1, ncols)\n\n\ndef txt2array(text, ndmin=1):\n    \"\"\"\n    :type text: str\n    :rtype: numpy.ndarray\n    \"\"\"\n    # noinspection PyTypeChecker\n    return numpy.loadtxt(StringIO.StringIO(text), ndmin=ndmin)\n\n\nclass GenericParserError(Exception):\n    pass\n\n\nclass UnableParseError(GenericParserError):\n    pass\n\n\nclass WrongParserError(GenericParserError):\n    pass\n\n\nclass ParserInterface(object):\n\n    __meta_class__ = abc.ABCMeta\n\n    def __init__(self, extension_map=None):\n        self.extension_map = extension_map if extension_map is not None else dict()\n\n    @abc.abstractmethod\n    def name(self):\n        \"\"\":rtype: str\"\"\"\n        pass\n\n    @abc.abstractmethod\n    def parse(self, path):\n        \"\"\"\n        :param str path: Path to the file object\n        :rtype: orm.GenericObject\n        \"\"\"\n        pass\n\n    def __getitem__(self, item):\n        \"\"\"\n        :param str item: Path to Prolith file being parsed\n        \"\"\"\n        _, ext = os.path.splitext(item)\n\n        try:\n            return self.extension_map[ext.lower()]\n        except KeyError:\n            raise UnableParseError(\"Unknown file extension %s\" % ext)\n\n\nclass Version(object):\n\n    class ParseError(UnableParseError):\n        pass\n\n    @staticmethod\n    def _normalize(v):\n        return [int(x) for x in re.sub(r'(\\.0+)*$', '', v).split(\".\")]\n\n    def __init__(self, value):\n        \"\"\":type value: str\"\"\"\n        self.__value = value\n        try:\n            self.__version = self._normalize(value)\n        except (KeyError, ValueError):\n            raise Version.ParseError(\"Version number can't be parsed\")\n\n    def __cmp__(self, other):\n        return cmp(self.__version, other.__version)\n\n    def __str__(self):\n        return self.__value\n\n\nclass ProlithFormat(object):\n\n    PUPIL_FILTER_TYPE_RADIUS = 0\n    PUPIL_FILTER_TYPE_GRID = 1\n\n    DEV_RATE_TYPE_PAC = 0\n    DEV_RATE_TYPE_EXPOSURE = 1\n\n    RESIST_NEGATIVE = 0\n    RESIST_POSITIVE = 1\n\n    RESIST_CONVENTIONAL = 0\n    RESIST_CHEMICAL_AMPLIFIED = 1\n\n    RESIST_EXPOSURE_MODEL_TYPE = 1\n\n    RESIST_PEB_DIFFUSION_MODEL = 1\n    RESIST_PEB_RXD_MODEL = 2\n\n\nclass ProlithParser(ParserInterface):\n\n    COMMENT_CHAR = \";\"\n\n    SUPPORTED_VERSIONS = [Version(\"1.2.3.4\")]\n\n    JUNK_PATTERN = re.compile(r\"\"\"^\\s*$|\\s*;.*$\"\"\", re.MULTILINE)\n\n    # It's a witchcraft be carefully... I was near to tear it into shreds...\n    SECTIONS_PATTERN = re.compile(r\"\"\"\\[Version](?:\\r\\n?|\\n)(?P<Version>[^\\[]*)\n\\[Parameters](?:\\r\\n?|\\n)(?P<Parameters>[^\\[]*)\n(?:\\[(?i)Data](?:\\r\\n?|\\n)(?P<Data>[^\\[]*))?\n(?:\\[Comments](?:\\r\\n?|\\n)(?P<Comments>[^\\[]*))?\n(?:\\[Develop\\sParameters](?:\\r\\n?|\\n)(?P<Develop>[^\\[]*))?\n(?:\\[PAB\\sParameters](?:\\r\\n?|\\n)(?P<PAB>[^\\[]*))?\n(?:\\[PEB\\sParameters](?:\\r\\n?|\\n)(?P<PEB>[^\\[]*))?\n(?:\\[Exposure\\sParameters](?:\\r\\n?|\\n)(?P<Exposure>[^\\[]*))?\"\"\", re.DOTALL | re.VERBOSE)\n\n    # This regex return list of dictionary with next keys:\n    # transmittance, phase, group, points\n    POLYGON_PATTERN = re.compile(r\"\"\"Polygon\\(\n                    (?P<transmittance>[-+]?[0-9]*\\.?[0-9]+),\\ *\n                    (?P<phase>[-+]?[0-9]*\\.?[0-9]+),\\ *\n                    (?P<group>[-+]?[0-9]*\\.?[0-9]+)\\ *\\)\n                    (?:\\r\\n?|\\n)\\{(?:\\r\\n?|\\n)\n                    (?P<points>(?:\\ *[-+]?[0-9]*\\.?[0-9]+,\\ [-+]?[0-9]*\\.?[0-9]+(?:\\r\\n?|\\n))+)\n                    }\"\"\", re.VERBOSE)\n\n    # ------------------------------------------------------------------------------------------------------------------\n\n    @staticmethod\n    def dictify(separated, names):\n        \"\"\"\n        Created dictionary from list of values and names for keys and also clean all comment started with\n        ProlithParser.COMMENT_CHAR if any occurred. Moreover control if next value is not empty or not equal to the\n        new Prolith format section.\n\n        :param list of str separated: Separated values to generate dictionary\n        :param list of str names: Name for result dictionary\n        :rtype: dict from str to str\n        \"\"\"\n        results = dict.fromkeys(names, None)\n\n        for line, name in zip(separated, names):\n            value = line.split(ProlithParser.COMMENT_CHAR)[0].strip()\n            \"\"\":type: str\"\"\"\n            if not value or value.startswith('[') and value.endswith(']'):\n                break\n            results[name] = value\n\n        return results\n\n    @staticmethod\n    def get_parameters(sections, names, directory=\"Parameters\"):\n        \"\"\"\n        :param dict from str to str sections: Input data\n        :param list of str names: Name for result dictionary\n        :param str directory: Determine from which directory parameter will be extracted\n        :rtype: dict from str to str\n        \"\"\"\n        return ProlithParser.dictify(sections[directory].splitlines(), names)\n\n    # ------------------------------------------------------------------------------------------------------------------\n\n    @staticmethod\n    def load_data_array(model, sections):\n        \"\"\"\n        :type model: type\n        :type sections: dict from str to str\n        :rtype: list of orm.Generic\n        \"\"\"\n        array = txt2array(sections[\"Data\"].strip(), ndmin=2)\n        return [model(*args) for args in unique_rows(array)]\n\n    def load_generic_object(self, object_model, data_model, sections):\n        \"\"\"\n        :type object_model: type\n        :type data_model: type\n        :type sections: dict from str to str\n        :rtype: orm.Generic\n        \"\"\"\n        name = self.get_parameters(sections, [\"name\"])[\"name\"]\n        array = self.load_data_array(data_model, sections)\n        return object_model(name, array)\n\n    # ------------------------------------------------------------------------------------------------------------------\n\n    def load_material(self, sections):\n        \"\"\":rtype: orm.Material, list of orm.Generic\"\"\"\n        logging.debug(\"Load material data\")\n        return self.load_generic_object(orm.Material, orm.MaterialData, sections)\n\n    def load_source_shape(self, sections):\n        \"\"\":rtype: orm.SourceShape, list of orm.Generic\"\"\"\n        logging.debug(\"Load source shape data\")\n        return self.load_generic_object(orm.SourceShape, orm.SourceShapeData, sections)\n\n    def load_pupil_filter(self, sections):\n        \"\"\"\n        :type sections: dict from str to str\n        :rtype: orm.PupilFilter\n        \"\"\"\n        logging.debug(\"Load pupil filter data\")\n        prms = self.get_parameters(sections, [\"name\", \"type\", \"step\"])\n        if int(prms[\"type\"]) != ProlithFormat.PUPIL_FILTER_TYPE_RADIUS:\n            raise UnableParseError(\"Only radius format data supported\")\n        array = self.load_data_array(orm.PupilFilterData, sections)\n        \"\"\":type: list of PupilFilterData\"\"\"\n        return orm.PupilFilter(prms[\"name\"], array)\n\n    def load_development_rate(self, sections):\n        \"\"\"\n        :type sections: dict from str to str\n        :rtype: orm.DeveloperSheet\n        \"\"\"\n        logging.debug(\"Load developer rate data\")\n        prms = self.get_parameters(sections, [\"name\", \"type\", \"is_depth\", \"steps\"])\n        if int(prms[\"type\"]) != ProlithFormat.DEV_RATE_TYPE_PAC:\n            raise UnableParseError(\"Only R(m) developer rate dependence supported\")\n\n        is_depth = int(prms[\"is_depth\"])\n\n        if is_depth:\n            steps = int(prms[\"steps\"])\n            data_section = sections[\"Data\"].splitlines()\n            depth_array = txt2array(data_section[0])\n            data_array = txt2array(\"\\n\".join(data_section[1:]))\n            if len(depth_array) != steps or data_array.shape[1] != steps+1:\n                raise UnableParseError(\"Number of columns %s not equals to number of steps %s\" %\n                                       (data_array.shape[1], steps))\n\n            data = list()\n            for k, depth in enumerate(depth_array):\n                for s, rate in enumerate(data_array[:, k+1]):\n                    pac = data_array[s, 0]\n                    data.append(orm.DeveloperSheetData(pac, rate, depth))\n        else:\n            data = self.load_data_array(orm.DeveloperSheetData, sections)\n\n        return orm.DeveloperSheet(prms[\"name\"], bool(is_depth), data)\n\n    # noinspection PyMethodMayBeStatic\n    def load_illumination(self, sections):\n        \"\"\":rtype: orm.Illumination, list of orm.Generic\"\"\"\n        logging.debug(\"Load illumination data\")\n        return self.load_generic_object(orm.Illumination, orm.IlluminationData, sections)\n\n    def load_polarization(self, sections):\n        \"\"\":rtype: orm.Polarization, list of orm.Generic\"\"\"\n        logging.debug(\"Load polarization data\")\n        return self.load_generic_object(orm.Polarization, orm.PolarizationData, sections)\n\n    def load_temperature_profile(self, sections):\n        \"\"\":rtype: orm.TemperatureProfile, list of orm.Generic\"\"\"\n        logging.debug(\"Load temperature profile data\")\n        return self.load_generic_object(orm.TemperatureProfile, orm.TemperatureProfileData, sections)\n\n    @staticmethod\n    def parse_mask_region(data):\n        \"\"\"\n        Generate new regions using string of floating-point values array specified in the next format:\n            x1,y1\n            x2,y2\n            :\n            xn,yn\n\n        :param data: Geometry data of region specified as string contained points array\n        \"\"\"\n        region = orm.Region(float(data[\"transmittance\"]), float(data[\"phase\"]), orm.GeometryShape.Polygon)\n        for line in data[\"points\"].strip().splitlines():\n            p = line.strip().split(\",\")\n            region.add(orm.Point(float(p[0]), float(p[1])))\n        return region\n\n    @staticmethod\n    def str2bbox(value):\n        \"\"\"\n        Convert string of four floating-point value represent bounding box to polygon\n\n        :param str value: Prolith bounding box string representation\n        :rtype: orm.Geometry\n        \"\"\"\n        return orm.Geometry.rectangle(*reversed([float(v) for v in value.split(\",\")]))\n\n    # noinspection PyMethodMayBeStatic\n    def load_mask(self, sections):\n        \"\"\"\n        :type sections: dict from str to str\n        :rtype: orm.Mask\n        \"\"\"\n        logging.debug(\"Load mask 2D data\")\n\n        # Section parameters contain fixed data. Values saved with the next order.\n        prms = self.get_parameters(sections, [\"name\", \"boundary\", \"sim_region\", \"background\",\n                                              \"phase\", \"critical_shape_step\", \"generate_cse\", \"clean\"])\n\n        # Create mask base object\n        mask = orm.Mask(\n            name=prms[\"name\"],\n            background=float(prms[\"background\"]),\n            phase=float(prms[\"phase\"]),\n            boundary=ProlithParser.str2bbox(prms[\"boundary\"]),\n            sim_region=ProlithParser.str2bbox(prms[\"sim_region\"]))\n\n        # Parsing polygons data sections\n        for match in self.POLYGON_PATTERN.finditer(sections[\"Data\"]):\n            region = ProlithParser.parse_mask_region(match.groupdict())\n            # TODO: Consider about polygon clipping by dimensions\n            mask.add_region(region)\n\n        return mask\n\n    def _parse_developer(self, sections, resist_name):\n        header = [\"number_of_developers\", \"model\", \"developer_used\"]\n\n        prms = self.get_parameters(sections, header, directory=\"Develop\")\n\n        if int(prms[\"number_of_developers\"]) != 1:\n            raise UnableParseError(\"Only one developer supported\")\n\n        # Development rate in sheet data (Prolith not store which of rate are used)\n        if prms[\"developer_used\"] == \"0\":\n            return None\n\n        # If User Defined then used parameters otherwise bad format\n        if prms[\"developer_used\"] != \"User Defined\":\n            raise UnableParseError(\"Bad developer used\")\n\n        try:\n            model = (self.select(orm.DevelopmentModel).\n                     filter(orm.DevelopmentModel.prolith_id == int(prms[\"model\"])).one())\n            \"\"\":type: orm.DevelopmentModel\"\"\"\n        except orm.NoResultFound:\n            raise UnableParseError(\"Not supported Prolith resist development model\")\n\n        header.extend([arg.name for arg in model.args])\n        header.extend([\"Surface Rate\", \"Inhibition\"])\n\n        prms = self.get_parameters(sections, header, directory=\"Develop\")\n\n        values = [float(prms[arg.name]) for arg in model.args]\n\n        return orm.DeveloperExpr(name=\"Dev%s\" % resist_name,\n                                 model=model, values=values,\n                                 surface_rate=float(prms[\"Surface Rate\"]), inhibition_depth=float(prms[\"Inhibition\"]),\n                                 desc=\"Development model expression for %s resist\" % resist_name, temporary=True)\n\n    def _parse_exposure(self, sections):\n        prms = self.get_parameters(sections, [\"model_type\", \"values\"], directory=\"Exposure\")\n\n        if int(prms[\"model_type\"]) != ProlithFormat.RESIST_EXPOSURE_MODEL_TYPE:\n            raise UnableParseError(\"Unsupported Prolith exposure model type\")\n\n        prms = self.dictify(prms[\"values\"].split(), [\"wavelength\", \"A\", \"B\", \"C\", \"n_unexposed\", \"n_exposed\"])\n\n        if float(prms[\"n_unexposed\"]) != float(prms[\"n_exposed\"]):\n            raise UnableParseError(\"Real part of the refractive index changing during exposure process unsupported\")\n\n        return orm.ExposureParameters(float(prms[\"wavelength\"]), float(prms[\"A\"]), float(prms[\"B\"]),\n                                      float(prms[\"C\"]), float(prms[\"n_unexposed\"]))\n\n    def _parse_peb(self, sections):\n        prms = self.get_parameters(sections, [\"model_type\", \"Ea\", \"LnAr\"], directory=\"PEB\")\n\n        if int(prms[\"model_type\"]) != ProlithFormat.RESIST_PEB_DIFFUSION_MODEL:\n            raise UnableParseError(\"Only Diffusion PEB model supported\")\n\n        return orm.PebParameters(float(prms[\"Ea\"]), float(prms[\"LnAr\"]))\n\n    # noinspection PyMethodMayBeStatic\n    def load_resist(self, sections):\n        \"\"\"\n        :type sections: dict from str to str\n        :rtype: orm.Resist\n        \"\"\"\n        logging.debug(\"Load resist\")\n\n        prms = self.get_parameters(sections, [\"name\", \"vendor\", \"read_only\", \"tone\", \"type\"])\n\n        if int(prms[\"tone\"]) != ProlithFormat.RESIST_POSITIVE:\n            raise UnableParseError(\"Only positive resist tone is supported\")\n\n        if int(prms[\"type\"]) != ProlithFormat.RESIST_CONVENTIONAL:\n            raise UnableParseError(\"Only conventional resist types are supported\")\n\n        exposure_prms = self._parse_exposure(sections)\n        peb_prms = self._parse_peb(sections)\n        develop_prms = self._parse_developer(sections, prms[\"name\"])\n        resist = orm.Resist(prms[\"name\"], sections[\"Comments\"], exposure_prms, peb_prms, develop_prms)\n\n        return resist\n\n    # ------------------------------------------------------------------------------------------------------------------\n\n    @staticmethod\n    def _parse_sections(data):\n        \"\"\":type data: str\"\"\"\n        # Clean all the comments\n        data = ProlithParser.JUNK_PATTERN.sub('', data) + \"\\n\"\n\n        try:\n            # noinspection PyTypeChecker\n            sections = next(ProlithParser.SECTIONS_PATTERN.finditer(data)).groupdict()\n        except StopIteration:\n            raise WrongParserError\n\n        for key, value in sections.iteritems():\n            if value is not None:\n                sections[key] = value.strip()\n\n        return sections\n\n    def __init__(self):\n        super(ProlithParser, self).__init__(\n            extension_map={\n                \".mat\": self.load_material,\n                \".src\": self.load_source_shape,\n                \".fil\": self.load_pupil_filter,\n                \".dev\": self.load_development_rate,\n                \".ill\": self.load_illumination,\n                \".pol\": self.load_polarization,\n                \".tpr\": self.load_temperature_profile,\n                \".msk\": self.load_mask,\n                \".res\": self.load_resist})\n\n        self.select = None\n        \"\"\":type: (sqlalchemy.orm.session.Session, tuple, dict) -> sqlalchemy.orm.Query or None\"\"\"\n\n    def parse(self, path):\n        \"\"\"\n        :param str path: Path to the file object\n        :rtype: orm.Generic\n        \"\"\"\n        with open(path) as datafile:\n            data = datafile.read()\n\n        sections = self._parse_sections(data)\n        version = Version(sections[\"Version\"])\n\n        # if version not in ProlithParser.SUPPORTED_VERSIONS:\n        #     raise UnableParseError(\"Unsupported format version %s\" % version)\n\n        try:\n            return self[path](sections)\n        except ValueError as error:\n            raise UnableParseError(\"Prolith parsing error:\\nStandardError: %s\" % error.message)\n\n    def name(self):\n        return \"Prolith\"\n\n\nclass LayoutParser(ParserInterface):\n\n    @staticmethod\n    def merge(polygons):\n        paths = clipper.Paths()\n        for polygon in polygons:\n            xy = polygon.xy if polygon.xy[0] != polygon.xy[-1] else polygon.xy[:-1]\n            path = clipper.Path([clipper.IntPoint(*p) for p in xy])\n            paths.append(path)\n        clipper.SimplifyPolygons(paths, clipper.pftNonZero | clipper.pftEvenOdd | clipper.pftPositive)\n        paths = clipper.CutHoles(clipper.Paths(paths))\n        # print paths\n        return paths\n\n    @staticmethod\n    def load_gds(path):\n        with open(path, \"r\") as gds_stream:\n            gds_lib = gdsii.library.Library.load(gds_stream)\n\n        # Coordinates factor to set all coordinates in nanometers\n        factor = gds_lib.physical_unit / 1.0E-9\n\n        if len(gds_lib) != 1:\n            raise UnableParseError(\"GDSII file should contains one cell only\")\n\n        cell = gds_lib[0]\n        \"\"\":type: gdsii.elements.Cell\"\"\"\n\n        polygons = filter(lambda item: isinstance(item, gdsii.elements.Boundary), cell)\n        \"\"\":type: list[gdsii.elements.Boundary]\"\"\"\n\n        # Get boundary polygon\n        bnd_num, bnd_dt = config.GdsLayerMapping.boundary_layer()\n        boundary_polygons = filter(lambda item: item.layer == bnd_num and item.data_type == bnd_dt, polygons)\n\n        if len(boundary_polygons) != 1:\n            raise UnableParseError(\"Boundary layer should contains only one polygon\")\n\n        if boundary_polygons[0].xy[0] == boundary_polygons[0].xy[-1]:\n            boundary_xy = boundary_polygons[0].xy[:-1]\n        else:\n            boundary_xy = boundary_polygons[0].xy\n\n        # GDSII format first and last point of the polygon must be matched.\n        # So run over all point except the last\n        boundary = orm.Geometry(\n            shape=orm.GeometryShape.Polygon,\n            points=[orm.Point(*p)*factor for p in boundary_xy]).convert2rect()\n\n        if boundary is None:\n            raise UnableParseError(\"Boundary polygon is not rectangle: %s\" % boundary_xy)\n\n        # Parse polygons\n        not_mapped = dict()\n        mapped_polygons = dict()\n\n        regions = []\n        for polygon in polygons:\n\n            if polygon == boundary_polygons[0]:\n                continue\n\n            layer_number = \"%s.%s\" % (polygon.layer, polygon.data_type)\n            try:\n                config.GdsLayerMapping[layer_number]\n            except KeyError:\n                if layer_number not in not_mapped:\n                    not_mapped[layer_number] = 1\n                else:\n                    not_mapped[layer_number] += 1\n            else:\n                if layer_number not in mapped_polygons:\n                    mapped_polygons[layer_number] = list()\n                mapped_polygons[layer_number].append(polygon)\n\n        for layer_number in not_mapped:\n            logging.warning(\"Loaded %s object from GDS layer %s not mapped!\" % (not_mapped[layer_number], layer_number))\n\n        offset = boundary[0] + (boundary[1] - boundary[0]) / 2.0\n\n        for layer_number, polygons_list in mapped_polygons.items():\n            polygons = LayoutParser.merge(polygons_list)\n            for polygon in polygons:\n                layer_property = config.GdsLayerMapping[layer_number]\n                # Move origin of layout to boundary left-bottom point, and polygon now is numpy array\n                # noinspection PyTypeChecker\n                regions.append(orm.Region(\n                    transmittance=layer_property[\"transmittance\"],\n                    phase=layer_property[\"phase\"],\n                    shape=orm.GeometryShape.Polygon,\n                    points=[(orm.Point(p.X, p.Y)*factor - offset) for p in polygon]))\n\n        # Move boundary to origin\n        boundary -= offset\n\n        return orm.Mask(\n            name=cell.name,\n            background=float(config.GdsLayerMapping[\"background\"][\"transmittance\"]),\n            phase=float(config.GdsLayerMapping[\"background\"][\"phase\"]),\n            boundary=boundary,\n            sim_region=boundary.clone(),\n            regions=regions)\n\n    def __init__(self):\n        super(LayoutParser, self).__init__(\n            extension_map={\n                \".gdsii\": LayoutParser.load_gds,\n                \".gds2\": LayoutParser.load_gds,\n                \".gds\": LayoutParser.load_gds})\n        self.select = None\n        \"\"\":type: (sqlalchemy.orm.session.Session, tuple, dict) -> sqlalchemy.orm.Query or None\"\"\"\n\n    def parse(self, path):\n        \"\"\"\n        :param str path: Path to the file object\n        :rtype: orm.Generic\n        \"\"\"\n        if os.path.getsize(path) > config.Configuration.maximum_gds_size:\n            raise UnableParseError(\"Layout file is too large!\")\n\n        return self[path](path)\n\n    def name(self):\n        return \"LayoutParser\"\n\n\nclass GenericParser(ParserInterface):\n\n    __available_drivers__ = [ProlithParser, LayoutParser]\n    \"\"\":type: list of type\"\"\"\n\n    def __init__(self):\n        super(GenericParser, self).__init__()\n        self.__drivers = [cls() for cls in GenericParser.__available_drivers__]\n        \"\"\":type: list of ParserInterface\"\"\"\n        self.__select = None\n        \"\"\":type: (sqlalchemy.orm.session.Session, tuple, dict) -> sqlalchemy.orm.Query or None\"\"\"\n\n    @property\n    def selector(self):\n        \"\"\":rtype: (sqlalchemy.orm.session.Session, tuple, dict) -> sqlalchemy.orm.Query or None\"\"\"\n        return self.__select\n\n    @selector.setter\n    def selector(self, value):\n        \"\"\":type value: (sqlalchemy.orm.session.Session, tuple, dict) -> sqlalchemy.orm.Query or None\"\"\"\n        self.__select = value\n        for driver in self.__drivers:\n            driver.select = self.__select\n\n    def parse(self, path):\n        \"\"\"\n        :param str path: Path to the file object\n        :rtype: orm.Generic\n        \"\"\"\n        if not os.path.isfile(path):\n            raise GenericParserError(\"File can't be opened\")\n\n        for driver in self.__drivers:\n            try:\n                return driver.parse(path)\n            except UnableParseError as error:\n                error.message = \"%s: %s\" % (driver.name(), error.message)\n                raise error\n            except WrongParserError:\n                continue\n\n        raise GenericParserError(\"File format was not understood, no appropriate driver found\")\n\n    def name(self):\n        return \"Generic\""
  },
  {
    "path": "OptolithiumGui/database/orm.py",
    "content": "#!/usr/bin/env python\r\n# -*- coding: utf-8 -*-\r\n\r\n# This file is part of Optolithium lithography modelling software.\r\n#\r\n# Copyright (C) 2015 Alexei Gladkikh\r\n#\r\n# This software is dual-licensed: you can redistribute it and/or modify\r\n# it under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version only for NON-COMMERCIAL usage.\r\n#\r\n# This program is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n#\r\n# If you are interested in other licensing models, including a commercial-\r\n# license, please contact the author at gladkikhalexei@gmail.com\r\n\r\nimport ctypes\r\nimport datetime\r\nimport logging as module_logging\r\nimport gdsii.library\r\nimport gdsii.structure\r\nimport gdsii.elements\r\n\r\nimport sqlalchemy\r\nimport sqlalchemy.exc\r\nimport sqlalchemy.orm.query\r\nimport sqlalchemy.orm.exc\r\nimport sqlalchemy.orm.session\r\nimport sqlalchemy.engine.reflection\r\nimport sqlalchemy.sql.schema\r\nfrom sqlalchemy import and_\r\nfrom sqlalchemy import ForeignKey, event\r\nfrom sqlalchemy.orm import relationship, backref, RelationshipProperty, ColumnProperty\r\nfrom sqlalchemy.schema import CheckConstraint, UniqueConstraint, DDL\r\nfrom sqlalchemy.ext.declarative import declared_attr, declarative_base\r\nfrom sqlalchemy.ext.associationproxy import association_proxy\r\nfrom sqlalchemy.ext.hybrid import hybrid_property\r\n\r\nfrom database.base import Column, SignalsMeta, Integer, Float, String, DateTime, Boolean\r\n\r\nimport numpy as np\r\nfrom scipy.interpolate import interp1d, griddata\r\nfrom collections import OrderedDict\r\nfrom config import DATETIME_FORMAT\r\n\r\nfrom options.common import Variable, Numeric, AttributedProperty\r\nfrom auxmath import cartesian, point_inside_polygon\r\n\r\nimport optolithiumc as oplc\r\n\r\nimport config\r\nimport Enum\r\nimport helpers\r\nimport pcpi\r\nimport physc\r\n\r\n\r\n__author__ = 'Alexei Gladkikh'\r\n\r\n\r\nConnection = sqlalchemy.create_engine\r\nInspector = sqlalchemy.engine.reflection.Inspector\r\nTable = sqlalchemy.sql.schema.Table\r\nQuery = sqlalchemy.orm.query.Query\r\n\r\nNoResultFound = sqlalchemy.orm.exc.NoResultFound\r\nMultipleResultsFound = sqlalchemy.orm.exc.MultipleResultsFound\r\nIntegrityError = sqlalchemy.exc.IntegrityError\r\nOperationalError = sqlalchemy.exc.OperationalError\r\n\r\nlogging = module_logging.getLogger(__name__)\r\nlogging.setLevel(module_logging.INFO)\r\nhelpers.logStreamEnable(logging)\r\n\r\nAPPLICATION_NAME = \"Optolithium\"\r\n\r\nMETHOD_NONE_IMPLEMENTED = \"This method must be redefined in the inherited class\"\r\n\r\n\r\nclass Precision(object):\r\n    refractive_index = 3\r\n    wavelength = 3\r\n    dill = 3\r\n\r\n\r\nclass DeleteHook(object):\r\n\r\n    def on_delete(self, session):\r\n        \"\"\"\r\n        :type: Session\r\n        :return: Query of the objects to being delete\r\n        :rtype: Query\r\n        \"\"\"\r\n        pass\r\n\r\n\r\nclass UnknownObjectTypeError(Exception):\r\n    def __init__(self, typename):\r\n        super(UnknownObjectTypeError, self).__init__(\"Unknown object type: %s\" % typename)\r\n\r\n\r\nclass GenericType(Enum.DeclarativeEnum):\r\n\r\n    # Standard object's types\r\n    Material = \"Ma\", \"Materials\"\r\n    \"\"\":type: str\"\"\"\r\n    SourceShape = \"So\", \"Source Shapes\"\r\n    \"\"\":type: str\"\"\"\r\n    PupilFilter = \"Pf\", \"Pupil Filters\"\r\n    \"\"\":type: str\"\"\"\r\n    Illumination = \"Il\", \"Illuminations\"\r\n    \"\"\":type: str\"\"\"\r\n    Polarization = \"Po\", \"Polarizations\"\r\n    \"\"\":type: str\"\"\"\r\n    TemperatureProfile = \"Tp\", \"Temperature Profiles\"\r\n    \"\"\":type: str\"\"\"\r\n    Mask = \"Mk\", \"Database Masks\"\r\n    \"\"\":type: str\"\"\"\r\n    DeveloperSheet = \"DSh\", \"Development Rates\"\r\n    \"\"\":type: str\"\"\"\r\n    DeveloperExpr = \"DEx\", \"Development Rates\"\r\n    \"\"\":type: str\"\"\"\r\n    Resist = \"Re\", \"Resists\"\r\n    \"\"\":type: str\"\"\"\r\n\r\n    # Plugin object's types\r\n    DevelopmentModel = \"DmD\", \"Development Models\"\r\n    \"\"\":type: str\"\"\"\r\n    AbstractPluginMask = \"MkP\", \"Mask's Plugins\"\r\n    \"\"\":type: str\"\"\"\r\n    AbstractPluginSourceShape = \"SoP\", \"Source Shape's Plugins\"\r\n    \"\"\":type: str\"\"\"\r\n    AbstractPluginPupilFilter = \"PfP\", \"Pupil Filter's Plugins\"\r\n    \"\"\":type: str\"\"\"\r\n\r\n\r\nclass GeometryShape(Enum.DeclarativeEnum):\r\n\r\n    Rectangle = \"R\", \"Rectangle\"\r\n    \"\"\":type: str\"\"\"\r\n    Polygon = \"P\", \"Polygon\"\r\n    \"\"\":type: str\"\"\"\r\n\r\n\r\nclass GeometryObjectType(Enum.DeclarativeEnum):\r\n\r\n    Geometry = \"Ge\", \"Geometry\"\r\n    \"\"\":type: str\"\"\"\r\n    Region = \"Re\", \"Region\"\r\n    \"\"\":type: str\"\"\"\r\n\r\n\r\nclass BaseTemplate(object):\r\n\r\n    id = Column(Integer, primary_key=True)\r\n    __tablename__ = declared_attr(lambda cls: cls.__name__)\r\n    identifier = hybrid_property(lambda cls: cls.__tablename__)\r\n\r\n    # CAUTION: Using lazy initialization because \"@reconstructor\" decorator not working under Cython\r\n\r\n    @property\r\n    def dirty(self):\r\n        if not hasattr(self, \"_dirty\"):\r\n            # noinspection PyAttributeOutsideInit\r\n            self._dirty = False\r\n        return self._dirty\r\n\r\n    @property\r\n    def signals(self):\r\n        \"\"\":rtype: AbstractSignalsClass\"\"\"\r\n        if not hasattr(self, \"_signals\"):\r\n            # logging.info(\"Create signals for %s of %s\" % (self, self.__class__.__name__))\r\n            signal_class = getattr(self.__class__, SignalsMeta.SignalsAttrName(self))\r\n            # noinspection PyAttributeOutsideInit\r\n            self._signals = signal_class(self)\r\n        return self._signals\r\n\r\n\r\nBase = declarative_base(cls=BaseTemplate, name=BaseTemplate.__name__, metaclass=SignalsMeta, constructor=None)\r\n\r\n\r\n# noinspection PyUnusedLocal\r\n@event.listens_for(Base, 'attribute_instrument')\r\ndef configure_listener(class_, key, inst):\r\n    \"\"\"This event is called whenever an attribute on a class is instrumented\"\"\"\r\n\r\n    # logging.info(\"Configure listener for: %s, %s, %s\" % (inst, hasattr(inst.property, 'columns'), type(inst)))\r\n\r\n    if isinstance(inst.property, ColumnProperty):\r\n        # noinspection PyUnusedLocal\r\n        @event.listens_for(inst, \"set\", retval=True)\r\n        def set_column(instance, value, oldvalue, initiator):\r\n            \"\"\"This event is called whenever a \"set\" occurs on that instrumented attribute\"\"\"\r\n            column = inst.property.columns[0]\r\n            if column.key == SignalsMeta.ID_NAME:\r\n                return value\r\n\r\n            round_value = round(value, column.precision) if column.precision is not None else value\r\n            # logging.info(\"%s: %s -> %s (%s) [%s]\" % (column.key, oldvalue, value, round_value, column.precision))\r\n\r\n            if column.key not in instance.__dict__ or instance.__dict__[column.key] != round_value:\r\n                # Oh... it's a black magic change value before some ORM action's how it affect on db\r\n                instance.__dict__[column.key] = round_value\r\n\r\n                # Workaround of SQLAlchemy strange behaviour, it set attribute\r\n                # before call constructor or reconstructor for parametric material\r\n                if hasattr(instance, \"signals\"):\r\n                    instance.signals[column].emit()\r\n\r\n                instance._dirty = True\r\n\r\n            return round_value\r\n\r\n    elif isinstance(inst.property, RelationshipProperty):\r\n        # noinspection PyUnusedLocal\r\n        @event.listens_for(inst, \"set\", retval=True)\r\n        def set_relationship(instance, value, oldvalue, initiator):\r\n            \"\"\"This event is called whenever a \"set\" occurs on that instrumented attribute\"\"\"\r\n            # logging.info(\"%s: %s -> %s\" % (inst.property.key, oldvalue, value))\r\n            if inst.property.key not in instance.__dict__ or instance.__dict__[inst.property.key] != value:\r\n                instance.__dict__[inst.property.key] = value\r\n\r\n                if hasattr(instance, \"signals\"):\r\n                    instance.signals[inst.property].emit()\r\n\r\n                instance._dirty = True\r\n\r\n            return value\r\n\r\n\r\nclass Generic(Base):\r\n\r\n    @staticmethod\r\n    def const_polymorphic():\r\n        query = \"\"\"\r\n            CREATE TRIGGER ConstantGenericInheritance\r\n                UPDATE OF type ON Generic\r\n            BEGIN\r\n                SELECT RAISE (ABORT, 'Changing of objects polymorphic type is forbidden!');\r\n            END;\"\"\"\r\n        return DDL(query)\r\n\r\n    @staticmethod\r\n    def inheritance_trigger(child_class):\r\n        \"\"\":type child_class: type\"\"\"\r\n        symbol = getattr(GenericType, child_class.__name__)\r\n        query = \"\"\"\r\n            CREATE TRIGGER Check%(child_name)sInheritance\r\n                BEFORE INSERT ON %(child_name)s\r\n                WHEN EXISTS (\r\n                    SELECT NULL FROM Generic\r\n                    WHERE Generic.id == new.id AND Generic.type != \"%(type_name)s\"\r\n                )\r\n            BEGIN\r\n                SELECT RAISE (ABORT, 'Inheritance violated on Generic->%(child_name)s');\r\n            END;\"\"\" % {'child_name': symbol.name, 'type_name': symbol.value}\r\n        return DDL(query)\r\n\r\n    # noinspection PyPropertyDefinition,PyMethodParameters\r\n    @hybrid_property\r\n    def icon(cls):\r\n        raise NotImplementedError(METHOD_NONE_IMPLEMENTED)\r\n\r\n    # noinspection PyPropertyDefinition,PyMethodParameters\r\n    @hybrid_property\r\n    def title(cls):\r\n        # This hack is required because cls can be as a instance and object\r\n        # Class always must has __name__ attribute that determine its name\r\n        name = getattr(cls, \"__name__\", cls.__class__.__name__)\r\n        enum_symbol = getattr(GenericType, name)\r\n        \"\"\":type: Enum.EnumSymbol\"\"\"\r\n        return enum_symbol.description\r\n\r\n    id = Column(Integer, primary_key=True)\r\n    name = Column(String, nullable=False, unique=True)\r\n    desc = Column(String, nullable=False)\r\n    created = Column(DateTime, nullable=False)\r\n    type = Column(GenericType.db_type(), nullable=False)\r\n\r\n    __mapper_args__ = {\r\n        \"polymorphic_identity\": None,\r\n        \"polymorphic_on\": type\r\n    }\r\n\r\n    def __init__(self, name, desc):\r\n        super(Generic, self).__init__()\r\n        self.name = name\r\n        self.desc = desc if desc is not None else str()\r\n        self.created = datetime.datetime.now()\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: Generic\"\"\"\r\n        if self.type != other.type:\r\n            raise RuntimeError(\"Assign of Generics objects (%s, %s) with different types (%s, %s)\" %\r\n                               (self.name, other.name, self.type, other.type))\r\n        self.name = other.name\r\n        self.desc = other.desc\r\n        self.created = other.created\r\n        self.type = other.type\r\n\r\n    def clone(self, name=None):\r\n        \"\"\"\r\n        :type name: str or None\r\n        :rtype: Generic\r\n        \"\"\"\r\n        return Generic(self.name if name is None else name, self.desc)\r\n\r\n    def __str__(self):\r\n        return \"%s \\\"%s\\\"\" % (self.__tablename__, self.name)\r\n\r\n    def export(self):\r\n        \"\"\":rtype: dict\"\"\"\r\n        return {\r\n            Generic.name.key: self.name,\r\n            Generic.desc.key: self.desc,\r\n            Generic.created.key: self.created.strftime(DATETIME_FORMAT),\r\n            Generic.type.key: str(self.type)\r\n        }\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        raise NotImplementedError(METHOD_NONE_IMPLEMENTED)\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        raise NotImplementedError(METHOD_NONE_IMPLEMENTED)\r\n\r\n\r\nevent.listen(Generic.__table__, \"after_create\", Generic.const_polymorphic())\r\n\r\n\r\nclass Session(sqlalchemy.orm.session.Session):\r\n\r\n    def delete(self, instance):\r\n        logging.debug(\"Session.delete(%s)\" % instance)\r\n        deleted = [instance]\r\n        if isinstance(instance, Generic) and isinstance(instance, DeleteHook):\r\n            deleted.extend(instance.on_delete(self))\r\n        self.autoflush = False\r\n        for p_object in deleted:\r\n            super(Session, self).delete(p_object)\r\n        self.autoflush = True\r\n\r\n\r\nclass StandardObject(object):\r\n    pass\r\n\r\n\r\nclass PluginObject(object):\r\n\r\n    cpi = None\r\n    \"\"\"\r\n    :param: C plugin interface structure\r\n    :type: pcpi.CPluginInterface\r\n    \"\"\"\r\n\r\n\r\nclass AbstractPluginParameter(object):\r\n\r\n    def __init__(self, name, order, defv, vmin=None, vmax=None):\r\n        \"\"\"\r\n        :type name: str\r\n        :type order: int\r\n        :type defv: float\r\n        :type vmin: float\r\n        :type vmax: float\r\n        \"\"\"\r\n        super(AbstractPluginParameter, self).__init__()\r\n        self.name = name\r\n        self.ord = order\r\n        self.defv = defv\r\n        self.min = vmin\r\n        self.max = vmax\r\n\r\n    @property\r\n    def default(self):\r\n        return self.defv\r\n\r\n    def clone(self):\r\n        \"\"\":rtype: AbstractPluginParameter\"\"\"\r\n        return self.__class__(self.name, self.ord, self.defv, self.min, self.max)\r\n\r\n\r\ndef _create_backref(name, order_by=\"id\", suffix=\"Data\"):\r\n    \"\"\":type name: str\"\"\"\r\n    data_table = name + suffix\r\n    return backref(data_table, order_by=\"%s.%s\" % (data_table, order_by))\r\n\r\n\r\ndef _create_relationship(name, order_by=\"id\", suffix=\"Data\", cascade=\"all, delete, delete-orphan\"):\r\n    \"\"\":type name: str\"\"\"\r\n    data_table = name + suffix\r\n    return relationship(data_table, order_by=\"%s.%s\" % (data_table, order_by), cascade=cascade)\r\n\r\n\r\nclass Material(Generic, StandardObject):\r\n\r\n    icon = hybrid_property(lambda cls: \"icons/Material\")\r\n\r\n    id = Column(Integer, ForeignKey(Generic.id), primary_key=True)\r\n    data = _create_relationship(\"Material\")\r\n\r\n    __mapper_args__ = {\"polymorphic_identity\": GenericType.Material}\r\n\r\n    def __init__(self, name, data, desc=None):\r\n        \"\"\":type data: list of MaterialData\"\"\"\r\n        super(Material, self).__init__(name, desc)\r\n        self.data = data\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: Material\"\"\"\r\n        super(Material, self).assign(other)\r\n        self.data = [v.clone() for v in other.data]\r\n\r\n    def clone(self, name=None):\r\n        \"\"\"\r\n        :type name: str or None\r\n        :rtype: Material\r\n        \"\"\"\r\n        data = [v.clone() for v in self.data]\r\n        return Material(self.name if name is None else name, data, self.desc)\r\n\r\n    def export(self):\r\n        \"\"\":rtype: dict\"\"\"\r\n        result = super(Material, self).export()\r\n        result.update({Material.data.key: [data.export() for data in self.data]})\r\n        return result\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        data = [MaterialData.load(data) for data in p_object[Material.data.key]]\r\n        return cls(\r\n            name=str(p_object[Material.name.key]),\r\n            desc=str(p_object[Material.desc.key]),\r\n            data=data)\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(Material.load(p_object))\r\n\r\n\r\nevent.listen(Material.__table__, \"after_create\", Generic.inheritance_trigger(Material))\r\n\r\n\r\nclass MaterialData(Base):\r\n\r\n    wavelength = Column(Float, nullable=False, precision=Precision.wavelength)\r\n    real = Column(Float, nullable=False, precision=Precision.refractive_index)\r\n    imag = Column(Float, nullable=False, precision=Precision.refractive_index)\r\n    material_id = Column(Integer, ForeignKey(Material.id), nullable=False)\r\n\r\n    material = relationship(Material, backref=_create_backref(\"Material\"))\r\n\r\n    __table_args__ = (\r\n        UniqueConstraint(wavelength, material_id, name=\"duplicate wavelength values\"),\r\n        # -------------------------------------------------\r\n        CheckConstraint(wavelength > 0.0, name=\"wavelength must be > 0.0\"),\r\n        # -------------------------------------------------\r\n        CheckConstraint(real >= 0.0, name=\"real part must be >= 0.0\"),\r\n        CheckConstraint(imag >= 0.0, name=\"imag part must be >= 0.0\")\r\n    )\r\n\r\n    def __init__(self, wavelength, real, imag):\r\n        \"\"\"\r\n        :type wavelength: float\r\n        :type real: float\r\n        :type imag: float\r\n        \"\"\"\r\n        super(MaterialData, self).__init__()\r\n        self.wavelength = wavelength\r\n        self.real = real\r\n        self.imag = imag\r\n\r\n    def clone(self):\r\n        \"\"\":rtype: MaterialData\"\"\"\r\n        return MaterialData(self.wavelength, self.real, self.imag)\r\n\r\n    def __iter__(self):\r\n        return (v for v in [self.real, self.imag])\r\n\r\n    def export(self):\r\n        return {\r\n            MaterialData.wavelength.key: self.wavelength,\r\n            MaterialData.real.key: self.real,\r\n            MaterialData.imag.key: self.imag\r\n        }\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: MaterialData\"\"\"\r\n        self.wavelength = other.wavelength\r\n        self.real = other.real\r\n        self.imag = other.imag\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        return cls(\r\n            wavelength=float(p_object[MaterialData.wavelength.key]),\r\n            real=float(p_object[MaterialData.real.key]),\r\n            imag=float(p_object[MaterialData.imag.key]))\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(MaterialData.load(p_object))\r\n\r\n\r\nclass SourceShape(Generic, StandardObject):\r\n\r\n    icon = hybrid_property(lambda cls: \"icons/SourceShape\")\r\n\r\n    id = Column(Integer, ForeignKey(Generic.id), primary_key=True)\r\n    data = _create_relationship(\"SourceShape\")\r\n\r\n    __mapper_args__ = {\"polymorphic_identity\": GenericType.SourceShape}\r\n\r\n    def __init__(self, name, data, desc=None):\r\n        \"\"\":type data: list of SourceShapeData\"\"\"\r\n        super(SourceShape, self).__init__(name, desc)\r\n        self.data = data\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: SourceShape\"\"\"\r\n        super(SourceShape, self).assign(other)\r\n        self.data = [v.clone() for v in other.data]\r\n\r\n    def clone(self, name=None):\r\n        \"\"\"\r\n        :type name: str or None\r\n        :rtype: SourceShape\r\n        \"\"\"\r\n        data = [v.clone() for v in self.data]\r\n        return SourceShape(self.name if name is None else name, data, self.desc)\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        data = [SourceShapeData.load(data) for data in p_object[SourceShape.data.key]]\r\n        return cls(\r\n            name=str(p_object[SourceShape.name.key]),\r\n            desc=str(p_object[SourceShape.desc.key]),\r\n            data=data)\r\n\r\n    def export(self):\r\n        result = super(SourceShape, self).export()\r\n        result.update({SourceShape.data.key: [data.export() for data in self.data]})\r\n        return result\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(SourceShape.load(p_object))\r\n\r\n    def intensity(self, x=None, y=None):\r\n        \"\"\"\r\n        Return intensity of the source shape.\r\n        If x or y is None then native coordinates (as in input data) are used.\r\n\r\n        :param list of float x or None: x-coordinates at which intensity must be calculated\r\n        :param list of float y or None: y-coordinates at which intensity must be calculated\r\n        :return: Native x, y if x or y is None and intensity else only intensity\r\n        :rtype: (np.array, np.array, np.array) or np.array\r\n        \"\"\"\r\n        def find_nearest(value, array):\r\n            return (np.abs(array - value)).argmin()\r\n\r\n        native_xy = False\r\n\r\n        if x is None or y is None:\r\n            native_xy = True\r\n            vx, vy, vz = [], [], []\r\n            for item in self.data:\r\n                vx.append(item.x)\r\n                vy.append(item.y)\r\n                vz.append(item.intensity)\r\n\r\n            x = np.unique(np.array(vx))\r\n            y = np.unique(np.array(vy))\r\n\r\n        if len(self.data) == 1:\r\n            result = np.ndarray([len(y), len(x)])\r\n            r = find_nearest(self.data[0].y, y)\r\n            c = find_nearest(self.data[0].x, x)\r\n            result[r, c] = self.data[0].intensity\r\n        else:\r\n            vx, vy, vz = [], [], []\r\n            for item in self.data:\r\n                vx.append(item.x)\r\n                vy.append(item.y)\r\n                vz.append(item.intensity)\r\n\r\n            vx = np.array(vx)\r\n            vy = np.array(vy)\r\n            vz = np.array(vz)\r\n\r\n            # This shit: y[:, None] - is transpose\r\n            result = griddata((vy, vx), vz, (y[None, :], x[:, None]), method='linear', fill_value=0.0)\r\n\r\n        if native_xy:\r\n            return x, y, result\r\n\r\n        return result\r\n\r\n    # Compatibility with ConcretePluginSourceShape\r\n    @property\r\n    def variables(self):\r\n        return []\r\n\r\n    def convert2core(self):\r\n        x, y, values = self.intensity()\r\n        return oplc.SourceShapeModelSheet(x, y, np.asfortranarray(values))\r\n\r\n\r\nevent.listen(SourceShape.__table__, \"after_create\", Generic.inheritance_trigger(SourceShape))\r\n\r\n\r\nclass SourceShapeData(Base):\r\n\r\n    x = Column(Float, nullable=False)\r\n    y = Column(Float, nullable=False)\r\n    intensity = Column(Float, nullable=False)\r\n    source_shape_id = Column(Integer, ForeignKey(SourceShape.id), nullable=False)\r\n\r\n    source_shape = relationship(SourceShape, backref=_create_backref(\"SourceShape\"))\r\n\r\n    __table_args__ = (\r\n        UniqueConstraint(x, y, source_shape_id, name=\"duplicate x, y values\"),\r\n        # -------------------------------------------------\r\n        CheckConstraint(intensity >= 0.0, name=\"intensity must >= 0.0\"),\r\n        CheckConstraint(intensity <= 1.0, name=\"intensity must <= 1.0\"),\r\n        # -------------------------------------------------\r\n        CheckConstraint(x >= -1.0, name=\"x must be >= -1.0\"),\r\n        CheckConstraint(x <= 1.0, name=\"x must be <= 1.0\"),\r\n        # -------------------------------------------------\r\n        CheckConstraint(y >= -1.0, name=\"y must be >= -1.0\"),\r\n        CheckConstraint(y <= 1.0, name=\"y must be <= 1.0\")\r\n    )\r\n\r\n    def __init__(self, x, y, intensity):\r\n        \"\"\"\r\n        :type x: float\r\n        :type y: float\r\n        :type intensity: float\r\n        \"\"\"\r\n        super(SourceShapeData, self).__init__()\r\n        self.x = x\r\n        self.y = y\r\n        self.intensity = intensity\r\n\r\n    def clone(self):\r\n        \"\"\":rtype: SourceShapeData\"\"\"\r\n        return SourceShapeData(self.x, self.y, self.intensity)\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: SourceShapeData\"\"\"\r\n        self.x = other.x\r\n        self.y = other.y\r\n        self.intensity = other.intensity\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        return cls(\r\n            x=p_object[SourceShapeData.x.key],\r\n            y=p_object[SourceShapeData.y.key],\r\n            intensity=p_object[SourceShapeData.intensity.key])\r\n\r\n    def export(self):\r\n        return {\r\n            SourceShapeData.x.key: self.x,\r\n            SourceShapeData.y.key: self.y,\r\n            SourceShapeData.intensity.key: self.intensity\r\n        }\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(SourceShapeData.load(p_object))\r\n\r\n\r\nclass ConcretePluginCommon(object):\r\n\r\n    SignalsClass = None\r\n\r\n    def __init__(self, abstract, values):\r\n        self.__abstract = abstract\r\n\r\n        self.__signals = self.__class__.SignalsClass(self)\r\n\r\n        self.__vars_dict = OrderedDict()\r\n\r\n        values = [parameter.default for parameter in self._base.prms] if values is None else values\r\n\r\n        for parameter, value in zip(self._base.prms, values):\r\n            variable = Variable(\r\n                ftype=Numeric(vmin=parameter.min, vmax=parameter.max, dtype=float),\r\n                value=value, name=parameter.name)\r\n            self.__vars_dict[variable.name] = variable\r\n\r\n    signals = property(lambda self: self.__signals)\r\n    name = property(lambda self: self.__abstract.name)\r\n    desc = property(lambda self: self.__abstract.desc)\r\n    variables = property(lambda self: self.__vars_dict.values())\r\n    values = property(lambda self: [variable.value for variable in self.__vars_dict.values()])\r\n\r\n    _base = property(lambda self: self.__abstract)\r\n\r\n    def export(self):\r\n        return {variable.name: variable.value for variable in self.variables}\r\n\r\n    @classmethod\r\n    def load(cls, p_object, abstract):\r\n        values = [float(p_object[parameter.name]) for parameter in abstract.prms]\r\n        return cls(abstract, values)\r\n\r\n    def clone(self):\r\n        return self.__class__(self._base, self.values)\r\n\r\n\r\nclass ConcretePluginSourceShape(ConcretePluginCommon):\r\n\r\n    SignalsClass = SignalsMeta.CreateSignalsClass(\"ConcretePluginSourceShape\", [], db_columns=False)\r\n\r\n    def __init__(self, abstract, values=None):\r\n        \"\"\"\r\n        :type abstract: orm.AbstractPluginSourceShape\r\n        :type values: list of float\r\n        \"\"\"\r\n        super(ConcretePluginSourceShape, self).__init__(abstract, values)\r\n        self.__source_shape_struct = pcpi.source_shape_plugin_t()\r\n\r\n    def intensity(self, x, y):\r\n        \"\"\"\r\n        Return intensity of the source shape.\r\n        If x or y is None then native coordinates (as in input data) are used.\r\n\r\n        :param list of float x: x-coordinates at which intensity must be calculated\r\n        :param list of float y: y-coordinates at which intensity must be calculated\r\n        :return: intensity on x-y grid\r\n        :rtype: np.array\r\n        \"\"\"\r\n        result = np.ndarray([len(y), len(x)], dtype=float)\r\n        xy = cartesian(y, x)\r\n        rows = range(len(y))\r\n        cols = range(len(x))\r\n        rc = cartesian(rows, cols)\r\n        for (r, c), (y, x) in zip(rc, xy):\r\n            result[r, c] = self._base.calculate(x, y, *self.values)\r\n        return result\r\n\r\n    expr = property(lambda self: self._base.entry.expr)\r\n\r\n    def export(self):\r\n        result = self._base.export()\r\n        result.update(super(ConcretePluginSourceShape, self).export())\r\n        return result\r\n\r\n    @classmethod\r\n    def load(cls, p_object, abstract=None):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        abstract_base = AbstractPluginSourceShape.load(p_object)\r\n        return super(ConcretePluginSourceShape, cls).load(p_object, abstract_base)\r\n\r\n    def convert2core(self):\r\n        return oplc.SourceShapeModelPlugin(self.expr, self.values)\r\n\r\n\r\nclass AbstractPluginSourceShape(Generic, PluginObject):\r\n\r\n    icon = hybrid_property(lambda cls: \"icons/Numerics\")\r\n\r\n    cpi = pcpi.source_shape_plugin_t\r\n\r\n    id = Column(Integer, ForeignKey(Generic.id), primary_key=True)\r\n    prms = relationship(\r\n        \"AbstractPluginSourceShapePrm\",\r\n        order_by=\"AbstractPluginSourceShapePrm.ord\",\r\n        cascade=\"all, delete, delete-orphan\")\r\n\r\n    __mapper_args__ = {\"polymorphic_identity\": GenericType.AbstractPluginSourceShape}\r\n\r\n    def __init__(self, name, prms, desc=None):\r\n        \"\"\"\r\n        :param str name: Source Shape plugin name\r\n        :param list of AbstractPluginSourceShapePrm prms: Parameters descriptors of the source shape plugin\r\n        :param str or None desc: Description of the plugin\r\n        \"\"\"\r\n        super(AbstractPluginSourceShape, self).__init__(name, desc)\r\n        self.prms = prms\r\n        self._source_shape_entry = None\r\n        \"\"\":type: pcpi.source_shape_plugin_t\"\"\"\r\n\r\n    def produce(self, values=None):\r\n        \"\"\"\r\n        :type values: list of float\r\n        :rtype: ConcretePluginSourceShape\r\n        \"\"\"\r\n        return ConcretePluginSourceShape(self, values)\r\n\r\n    @property\r\n    def entry(self):\r\n        \"\"\":rtype: pcpi.source_shape_plugin_t\"\"\"\r\n        if not hasattr(self, \"_source_shape_entry\") or self._source_shape_entry is None:\r\n            self._source_shape_entry = pcpi.PLUGIN_REGISTRY.get_by_id(self.id).entry\r\n        return self._source_shape_entry\r\n\r\n    def calculate(self, cx, cy, *values):\r\n        array = ctypes.c_double * len(self.prms)\r\n        # noinspection PyCallingNonCallable\r\n        return self.entry.expr(cx, cy, array(*values))\r\n\r\n    def assign(self, other):\r\n        raise NotImplementedError(METHOD_NONE_IMPLEMENTED)\r\n\r\n    def clone(self, name=None):\r\n        \"\"\"\r\n        :type name: str or None\r\n        :rtype: AbstractPluginSourceShape\r\n        \"\"\"\r\n        if name is not None:\r\n            raise NotImplementedError(METHOD_NONE_IMPLEMENTED)\r\n\r\n        prms = [v.clone() for v in self.prms]\r\n        return AbstractPluginSourceShape(self.name, prms, self.desc)\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        return pcpi.PLUGIN_REGISTRY.get_by_name(p_object[Generic.name.key]).record\r\n\r\n\r\nclass AbstractPluginSourceShapePrm(AbstractPluginParameter, Base):\r\n\r\n    name = Column(String, nullable=False)\r\n    ord = Column(Integer, nullable=False)\r\n    defv = Column(Float)\r\n    max = Column(Float)\r\n    min = Column(Float)\r\n    plugin_source_shape_id = Column(Integer, ForeignKey(AbstractPluginSourceShape.id, ondelete=\"CASCADE\"))\r\n\r\n    __table_args__ = (\r\n        UniqueConstraint(ord, plugin_source_shape_id, name=\"duplicate order arguments number\"),\r\n        # -------------------------------------------------\r\n        # TODO: Check parameters\r\n        # CheckConstraint(defv > min, \"default value must greater than min values\"),\r\n        # CheckConstraint(defv < max, \"default value must lower than max values\"),\r\n        # CheckConstraint(max > min, name=\"max must be > min argument value\"),\r\n    )\r\n\r\n\r\nclass PupilFilter(Generic, StandardObject):\r\n\r\n    icon = hybrid_property(lambda cls: \"icons/PupilFilter\")\r\n\r\n    id = Column(Integer, ForeignKey(Generic.id), primary_key=True)\r\n    data = _create_relationship(\"PupilFilter\")\r\n\r\n    __mapper_args__ = {\"polymorphic_identity\": GenericType.PupilFilter}\r\n\r\n    def __init__(self, name, data, desc=None):\r\n        \"\"\":type data: list of PupilFilterData\"\"\"\r\n        super(PupilFilter, self).__init__(name, desc)\r\n        self.data = data\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: PupilFilter\"\"\"\r\n        super(PupilFilter, self).assign(other)\r\n        self.data = [v.clone() for v in other.data]\r\n\r\n    def clone(self, name=None):\r\n        \"\"\"\r\n        :type name: str or None\r\n        :rtype: PupilFilter\r\n        \"\"\"\r\n        data = [v.clone() for v in self.data]\r\n        return PupilFilter(self.name if name is None else name, data, self.desc)\r\n\r\n    def export(self):\r\n        result = super(PupilFilter, self).export()\r\n        result.update({PupilFilter.data.key: [data.export() for data in self.data]})\r\n        return result\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        data = [PupilFilterData.load(data) for data in p_object[PupilFilter.data.key]]\r\n        return cls(\r\n            name=str(p_object[PupilFilter.name.key]),\r\n            desc=str(p_object[PupilFilter.desc.key]),\r\n            data=data)\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(PupilFilter.load(p_object))\r\n\r\n    def coefficients(self, xdata=None, ydata=None):\r\n        native_xy = False\r\n        if xdata is None or ydata is None:\r\n            step_rad = 1.0/float(len(self.data))\r\n            xdata = np.arange(-1.0, 1.0 + step_rad, step_rad)\r\n            ydata = np.arange(-1.0, 1.0 + step_rad, step_rad)\r\n            native_xy = True\r\n\r\n        rows = len(ydata)\r\n        cols = len(xdata)\r\n        result = np.ndarray([rows, cols], dtype=complex)\r\n        xp = []\r\n        fp_real = []\r\n        fp_imag = []\r\n        for item in self.data:\r\n            xp.append(item.radius)\r\n            rad = np.deg2rad(item.phase)\r\n            fp_real.append(item.amplitude * np.cos(rad))\r\n            fp_imag.append(item.amplitude * np.sin(rad))\r\n        real = interp1d(xp, fp_real, bounds_error=False, fill_value=0.0)\r\n        imag = interp1d(xp, fp_imag, bounds_error=False, fill_value=0.0)\r\n        rc = cartesian(range(rows), range(cols))\r\n        xy = cartesian(xdata, ydata)\r\n        for (r, c), (x, y) in zip(rc, xy):\r\n            radius = np.sqrt(x**2 + y**2)\r\n            result[r, c] = complex(real(radius), imag(radius))\r\n\r\n        if native_xy:\r\n            return xdata, ydata, result\r\n\r\n        return result\r\n\r\n    # Compatibility with ConcretePluginPupilFilter\r\n    @property\r\n    def variables(self):\r\n        return []\r\n\r\n    def convert2core(self):\r\n        x, y, values = self.coefficients()\r\n        return oplc.PupilFilterModelSheet(x, y, np.asfortranarray(values))\r\n\r\n\r\nevent.listen(PupilFilter.__table__, \"after_create\", Generic.inheritance_trigger(PupilFilter))\r\n\r\n\r\nclass PupilFilterData(Base):\r\n\r\n    radius = Column(Float, nullable=False)\r\n    phase = Column(Float, nullable=False)  # in degrees\r\n    amplitude = Column(Float, nullable=False)\r\n    pupil_filter_id = Column(Integer, ForeignKey(PupilFilter.id), nullable=False)\r\n\r\n    pupil_filter = relationship(PupilFilter, backref=_create_backref(\"PupilFilter\"))\r\n\r\n    __table_args__ = (\r\n        UniqueConstraint(radius, pupil_filter_id, name=\"duplicate radius values\"),\r\n        # -------------------------------------------------\r\n        CheckConstraint(phase >= -180.0, name=\"phase must be >= -180.0\"),\r\n        CheckConstraint(phase <= 180.0, name=\"phase must be <= 180.0\"),\r\n        # -------------------------------------------------\r\n        CheckConstraint(amplitude >= 0.0, name=\"amplitude >= 0.0\"),\r\n        CheckConstraint(amplitude <= 1.0, name=\"amplitude <= 1.0\")\r\n    )\r\n\r\n    def __init__(self, radius, phase, amplitude):\r\n        \"\"\"\r\n        :type radius: float\r\n        :type phase: float\r\n        :type amplitude: float\r\n        \"\"\"\r\n        super(PupilFilterData, self).__init__()\r\n        self.radius = radius\r\n        self.phase = phase\r\n        self.amplitude = amplitude\r\n\r\n    def clone(self):\r\n        \"\"\":rtype: PupilFilterData\"\"\"\r\n        return PupilFilterData(self.radius, self.phase, self.amplitude)\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: PupilFilterData\"\"\"\r\n        self.radius = other.radius\r\n        self.phase = other.phase\r\n        self.amplitude = other.amplitude\r\n\r\n    def export(self):\r\n        return {\r\n            PupilFilterData.radius.key: self.radius,\r\n            PupilFilterData.phase.key: self.phase,\r\n            PupilFilterData.amplitude.key: self.amplitude\r\n        }\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        return cls(\r\n            radius=p_object[PupilFilterData.radius.key],\r\n            phase=p_object[PupilFilterData.phase.key],\r\n            amplitude=p_object[PupilFilterData.amplitude.key])\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(PupilFilterData.load(p_object))\r\n\r\n\r\nclass ConcretePluginPupilFilter(ConcretePluginCommon):\r\n\r\n    SignalsClass = SignalsMeta.CreateSignalsClass(\"ConcretePluginPupilFilter\", [], db_columns=False)\r\n\r\n    def __init__(self, abstract, values=None):\r\n        \"\"\"\r\n        :type abstract: orm.AbstractPluginPupilFilter\r\n        :type values: list of float\r\n        \"\"\"\r\n        super(ConcretePluginPupilFilter, self).__init__(abstract, values)\r\n        self.__pupil_filter_struct = pcpi.pupil_filter_plugin_t()\r\n\r\n    def coefficients(self, x, y):\r\n        \"\"\"\r\n        Return coefficients of the pupil filter.\r\n        If x or y is None then native coordinates (as in input data) are used.\r\n\r\n        :param list of float x: x-coordinates at which intensity must be calculated\r\n        :param list of float y: y-coordinates at which intensity must be calculated\r\n        :return: intensity on x-y grid\r\n        :rtype: np.array\r\n        \"\"\"\r\n        result = np.ndarray([len(y), len(x)], dtype=complex)\r\n        xy = cartesian(y, x)\r\n        rows = range(len(y))\r\n        cols = range(len(x))\r\n        rc = cartesian(rows, cols)\r\n        for (r, c), (y, x) in zip(rc, xy):\r\n            result[r, c] = self._base.calculate(x, y, *self.values)\r\n        return result\r\n\r\n    expr = property(lambda self: self._base.entry.expr)\r\n\r\n    def export(self):\r\n        result = self._base.export()\r\n        result.update(super(ConcretePluginPupilFilter, self).export())\r\n        return result\r\n\r\n    @classmethod\r\n    def load(cls, p_object, abstract=None):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        abstract_base = AbstractPluginPupilFilter.load(p_object)\r\n        return super(ConcretePluginPupilFilter, cls).load(p_object, abstract_base)\r\n\r\n    def convert2core(self):\r\n        return oplc.PupilFilterModelPlugin(self.expr, self.values)\r\n\r\n\r\nclass AbstractPluginPupilFilter(Generic, PluginObject):\r\n\r\n    icon = hybrid_property(lambda cls: \"icons/Numerics\")\r\n\r\n    cpi = pcpi.pupil_filter_plugin_t\r\n\r\n    id = Column(Integer, ForeignKey(Generic.id), primary_key=True)\r\n    prms = relationship(\r\n        \"AbstractPluginPupilFilterPrm\",\r\n        order_by=\"AbstractPluginPupilFilterPrm.ord\",\r\n        cascade=\"all, delete, delete-orphan\")\r\n\r\n    __mapper_args__ = {\"polymorphic_identity\": GenericType.AbstractPluginPupilFilter}\r\n\r\n    def __init__(self, name, prms, desc=None):\r\n        \"\"\"\r\n        :param str name: Pupil filter plugin name\r\n        :param list of AbstractPluginPupilFilterPrm prms: Parameters descriptors of the pupil filter plugin\r\n        :param str or None desc: Description of the plugin\r\n        \"\"\"\r\n        super(AbstractPluginPupilFilter, self).__init__(name, desc)\r\n        self.prms = prms\r\n        self._pupil_filter_entry = None\r\n        \"\"\":type: pcpi.pupil_filter_plugin_t\"\"\"\r\n\r\n    def produce(self, values=None):\r\n        \"\"\"\r\n        :type values: list of float\r\n        :rtype: ConcretePluginPupilFilter\r\n        \"\"\"\r\n        return ConcretePluginPupilFilter(self, values)\r\n\r\n    @property\r\n    def entry(self):\r\n        \"\"\":rtype: pcpi.pupil_filter_plugin_t\"\"\"\r\n        if not hasattr(self, \"_pupil_filter_entry\") or self._pupil_filter_entry is None:\r\n            self._pupil_filter_entry = pcpi.PLUGIN_REGISTRY.get_by_id(self.id).entry\r\n        return self._pupil_filter_entry\r\n\r\n    def calculate(self, cx, cy, *values):\r\n        array = ctypes.c_double * len(self.prms)\r\n        # noinspection PyCallingNonCallable\r\n        value = self.entry.expr(cx, cy, array(*values))\r\n        return complex(value.real, value.imag)\r\n\r\n    def assign(self, other):\r\n        raise NotImplementedError(METHOD_NONE_IMPLEMENTED)\r\n\r\n    def clone(self, name=None):\r\n        \"\"\"\r\n        :type name: str or None\r\n        :rtype: AbstractPluginPupilFilter\r\n        \"\"\"\r\n        if name is not None:\r\n            raise NotImplementedError(METHOD_NONE_IMPLEMENTED)\r\n\r\n        prms = [v.clone() for v in self.prms]\r\n        return AbstractPluginPupilFilter(self.name, prms, self.desc)\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        return pcpi.PLUGIN_REGISTRY.get_by_name(p_object[Generic.name.key]).record\r\n\r\n\r\nclass AbstractPluginPupilFilterPrm(AbstractPluginParameter, Base):\r\n\r\n    name = Column(String, nullable=False)\r\n    ord = Column(Integer, nullable=False)\r\n    defv = Column(Float)\r\n    max = Column(Float)\r\n    min = Column(Float)\r\n    plugin_pupil_filter_id = Column(Integer, ForeignKey(AbstractPluginPupilFilter.id, ondelete=\"CASCADE\"))\r\n\r\n    __table_args__ = (\r\n        UniqueConstraint(ord, plugin_pupil_filter_id, name=\"duplicate order arguments number\"),\r\n        # -------------------------------------------------\r\n        # TODO: Check parameters\r\n        # CheckConstraint(defv > min, \"default value must greater than min values\"),\r\n        # CheckConstraint(defv < max, \"default value must lower than max values\"),\r\n        # CheckConstraint(max > min, name=\"max must be > min argument value\"),\r\n    )\r\n\r\n\r\nclass Illumination(Generic, StandardObject):\r\n\r\n    icon = hybrid_property(lambda cls: \"icons/Material\")\r\n\r\n    id = Column(Integer, ForeignKey(Generic.id), primary_key=True)\r\n    data = _create_relationship(\"Illumination\")\r\n\r\n    __mapper_args__ = {\"polymorphic_identity\": GenericType.Illumination}\r\n\r\n    def __init__(self, name, data, desc=None):\r\n        \"\"\":type data: list of IlluminationData\"\"\"\r\n        super(Illumination, self).__init__(name, desc)\r\n        self.data = data\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: Illumination\"\"\"\r\n        super(Illumination, self).assign(other)\r\n        self.data = [v.clone() for v in other.data]\r\n\r\n    def clone(self, name=None):\r\n        \"\"\"\r\n        :type name: str or None\r\n        :rtype: Illumination\r\n        \"\"\"\r\n        data = [v.clone() for v in self.data]\r\n        return Illumination(self.name if name is None else name, data, self.desc)\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        data = [IlluminationData.load(data) for data in p_object[Illumination.data.key]]\r\n        return cls(p_object[Illumination.name.key, data, p_object[Illumination.desc.key]])\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(Illumination.load(p_object))\r\n\r\n\r\nevent.listen(Illumination.__table__, \"after_create\", Generic.inheritance_trigger(Illumination))\r\n\r\n\r\nclass IlluminationData(Base):\r\n\r\n    wavelength = Column(Float, nullable=False, precision=Precision.wavelength)\r\n    intensity = Column(Float, nullable=False)\r\n    illumination_id = Column(Integer, ForeignKey(Illumination.id), nullable=False)\r\n\r\n    illumination = relationship(Illumination, backref=_create_backref(\"Illumination\"))\r\n\r\n    __table_args__ = (\r\n        UniqueConstraint(wavelength, illumination_id, name=\"duplicate wavelength values\"),\r\n        # -------------------------------------------------\r\n        CheckConstraint(intensity >= 0.0, name=\"intensity >= 0.0\"),\r\n        CheckConstraint(intensity <= 1.0, name=\"intensity <= 1.0\")\r\n    )\r\n\r\n    def __init__(self, wavelength, intensity):\r\n        \"\"\"\r\n        :type wavelength: float\r\n        :type intensity: float\r\n        \"\"\"\r\n        super(IlluminationData, self).__init__()\r\n        self.wavelength = wavelength\r\n        self.intensity = intensity\r\n\r\n    def clone(self):\r\n        \"\"\":rtype: IlluminationData\"\"\"\r\n        return IlluminationData(self.wavelength, self.intensity)\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: IlluminationData\"\"\"\r\n        self.wavelength = other.wavelength\r\n        self.intensity = other.intensity\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        return cls(\r\n            wavelength=p_object[IlluminationData.wavelength.key],\r\n            intensity=p_object[IlluminationData.intensity.key])\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(IlluminationData.load(p_object))\r\n\r\n\r\nclass Polarization(Generic, StandardObject):\r\n\r\n    icon = hybrid_property(lambda cls: \"icons/Material\")\r\n\r\n    id = Column(Integer, ForeignKey(Generic.id), primary_key=True)\r\n    data = _create_relationship(\"Polarization\")\r\n\r\n    __mapper_args__ = {\"polymorphic_identity\": GenericType.Polarization}\r\n\r\n    def __init__(self, name, data, desc=None):\r\n        \"\"\":type data: list of PolarizationData\"\"\"\r\n        super(Polarization, self).__init__(name, desc)\r\n        self.data = data\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: Polarization\"\"\"\r\n        super(Polarization, self).assign(other)\r\n        self.data = [v.clone() for v in other.data]\r\n\r\n    def clone(self, name=None):\r\n        \"\"\"\r\n        :type name: str or None\r\n        :rtype: Polarization\r\n        \"\"\"\r\n        data = [v.clone() for v in self.data]\r\n        return Polarization(self.name if name is None else name, data, self.desc)\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        data = [PolarizationData.load(data) for data in p_object[Polarization.data.key]]\r\n        return cls(p_object[Polarization.name.key, data, p_object[Polarization.desc.key]])\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(Polarization.load(p_object))\r\n\r\n\r\nevent.listen(Polarization.__table__, \"after_create\", Generic.inheritance_trigger(Polarization))\r\n\r\n\r\nclass PolarizationData(Base):\r\n\r\n    x = Column(Float, nullable=False)\r\n    y = Column(Float, nullable=False)\r\n    degree = Column(Float, nullable=False)\r\n    angle = Column(Float, nullable=False)\r\n    ellipticity = Column(Float, nullable=False)\r\n    polarization_id = Column(Integer, ForeignKey(Polarization.id), nullable=False)\r\n\r\n    polarization = relationship(Polarization, backref=_create_backref(\"Polarization\"))\r\n\r\n    __table_args__ = (\r\n        UniqueConstraint(x, y, polarization_id, name=\"duplicate x, y values\"),\r\n        # -------------------------------------------------\r\n        CheckConstraint(x >= -1.0, name=\"x must be >= -1.0\"),\r\n        CheckConstraint(x <= 1.0, name=\"x must be <= 1.0\"),\r\n        # -------------------------------------------------\r\n        CheckConstraint(y >= -1.0, name=\"y must be >= -1.0\"),\r\n        CheckConstraint(y <= 1.0, name=\"y must be <= 1.0\"),\r\n        # -------------------------------------------------\r\n        CheckConstraint(degree >= 0.0, name=\"degree must be >= -1.0\"),\r\n        CheckConstraint(degree <= 1.0, name=\"degree must be <= 1.0\"),\r\n        # -------------------------------------------------\r\n        CheckConstraint(angle >= -180.0, name=\"angle must be >= -180.0\"),\r\n        CheckConstraint(angle <= 180.0, name=\"angle must be <= 180.0\"),\r\n        # -------------------------------------------------\r\n        CheckConstraint(ellipticity >= -1.0, name=\"ellipticity must be >= -1.0\"),\r\n        CheckConstraint(ellipticity <= 1.0, name=\"ellipticity must be <= 1.0\"),\r\n    )\r\n\r\n    def __init__(self, x, y, degree, angle, ellipticity):\r\n        \"\"\"\r\n        :type x: float\r\n        :type y: float\r\n        :type degree: float\r\n        :type angle: float\r\n        :type ellipticity: float\r\n        \"\"\"\r\n        super(PolarizationData, self).__init__()\r\n        self.x = x\r\n        self.y = y\r\n        self.degree = degree\r\n        self.angle = angle\r\n        self.ellipticity = ellipticity\r\n\r\n    def clone(self):\r\n        \"\"\":rtype: PolarizationData\"\"\"\r\n        return PolarizationData(self.x, self.y, self.degree, self.angle, self.ellipticity)\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: PolarizationData\"\"\"\r\n        self.x = other.x\r\n        self.y = other.y\r\n        self.degree = other.degree\r\n        self.angle = other.angle\r\n        self.ellipticity = other.ellipticity\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        return cls(\r\n            x=p_object[PolarizationData.x.key],\r\n            y=p_object[PolarizationData.y.key],\r\n            degree=p_object[PolarizationData.degree.key],\r\n            angle=p_object[PolarizationData.angle.key],\r\n            ellipticity=p_object[PolarizationData.ellipticity.key])\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(PolarizationData.load(p_object))\r\n\r\n\r\nclass TemperatureProfile(Generic, StandardObject):\r\n\r\n    icon = hybrid_property(lambda cls: \"icons/Material\")\r\n\r\n    id = Column(Integer, ForeignKey(Generic.id), primary_key=True)\r\n    data = _create_relationship(\"TemperatureProfile\")\r\n\r\n    __mapper_args__ = {\"polymorphic_identity\": GenericType.TemperatureProfile}\r\n\r\n    def __init__(self, name, data, desc=None):\r\n        \"\"\":type data: list of TemperatureProfileData\"\"\"\r\n        super(TemperatureProfile, self).__init__(name, desc)\r\n        self.data = data\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: TemperatureProfile\"\"\"\r\n        super(TemperatureProfile, self).assign(other)\r\n        self.data = [v.clone() for v in other.data]\r\n\r\n    def clone(self, name=None):\r\n        \"\"\"\r\n        :type name: str or None\r\n        :rtype: TemperatureProfile\r\n        \"\"\"\r\n        data = [v.clone() for v in self.data]\r\n        return TemperatureProfile(self.name if name is None else name, data, self.desc)\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        data = [TemperatureProfileData.load(data) for data in p_object[TemperatureProfile.data.key]]\r\n        return cls(p_object[TemperatureProfile.name.key, data, p_object[TemperatureProfile.desc.key]])\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(TemperatureProfile.load(p_object))\r\n\r\n\r\nevent.listen(TemperatureProfile.__table__, \"after_create\", Generic.inheritance_trigger(TemperatureProfile))\r\n\r\n\r\nclass TemperatureProfileData(Base):\r\n\r\n    time = Column(Float, nullable=False)\r\n    temperature = Column(Float, nullable=False)\r\n    temperature_profile_id = Column(Integer, ForeignKey(TemperatureProfile.id), nullable=False)\r\n\r\n    temperature_profile = relationship(TemperatureProfile, backref=_create_backref(\"TemperatureProfile\"))\r\n\r\n    __table_args__ = (\r\n        # UniqueConstraint(time, temperature_profile_id, name=\"duplicate time values\"),\r\n        CheckConstraint(temperature >= physc.T0, name=\"temperature must be >= %s C\" % physc.T0),\r\n    )\r\n\r\n    def __init__(self, time, temperature):\r\n        \"\"\"\r\n        :type time: float\r\n        :type temperature: float\r\n        \"\"\"\r\n        super(TemperatureProfileData, self).__init__()\r\n        self.time = time\r\n        self.temperature = temperature\r\n\r\n    def clone(self):\r\n        \"\"\":rtype: TemperatureProfileData\"\"\"\r\n        return TemperatureProfileData(self.time, self.temperature)\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: TemperatureProfileData\"\"\"\r\n        self.time = other.time\r\n        self.temperature = other.temperature\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        return cls(\r\n            time=p_object[TemperatureProfileData.time.key],\r\n            temperature=p_object[TemperatureProfileData.temperature.key])\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(TemperatureProfileData.load(p_object))\r\n\r\n\r\nclass Geometry(Base):\r\n\r\n    shape = Column(GeometryShape.db_type(), nullable=False)\r\n    type = Column(GeometryObjectType.db_type(), nullable=False)\r\n\r\n    points = relationship(\"Point\", order_by=\"Point.ord\", cascade=\"all, delete, delete-orphan\")\r\n\r\n    __mapper_args__ = {\r\n        \"polymorphic_identity\": GeometryObjectType.Geometry,\r\n        \"polymorphic_on\": type\r\n    }\r\n\r\n    def __init__(self, shape, points):\r\n        \"\"\"\r\n        :type shape: str\r\n        :type points: list of Point\r\n        \"\"\"\r\n        super(Geometry, self).__init__()\r\n        self.shape = shape\r\n        if points is not None:\r\n            self.points = points\r\n            for k, point in enumerate(self.points):\r\n                point.ord = k\r\n\r\n    def clone(self):\r\n        \"\"\":rtype: Geometry\"\"\"\r\n        return Geometry(shape=self.shape, points=[p.clone() for p in self.points])\r\n\r\n    def add(self, point):\r\n        \"\"\":type point: Point\"\"\"\r\n        point.ord = len(self.points)\r\n        self.points.append(point)\r\n\r\n    def __sub__(self, other):\r\n        if isinstance(other, Point):\r\n            return Geometry(shape=self.shape, points=[p - other for p in self.points])\r\n        return NotImplemented\r\n\r\n    def __len__(self):\r\n        return len(self.points)\r\n\r\n    def __getitem__(self, item):\r\n        return self.points[item]\r\n\r\n    def __iter__(self):\r\n        for point in self.points:\r\n            yield point\r\n\r\n    def convert2rect(self):\r\n        \"\"\":rtype: Geometry or None\"\"\"\r\n\r\n        if self.shape == GeometryShape.Rectangle:\r\n            return self.clone()\r\n\r\n        point_count = len(self.points)\r\n\r\n        if point_count != 4:\r\n            return None\r\n\r\n        min_x = min(self.points, key=lambda p: p.x).x\r\n        max_x = max(self.points, key=lambda p: p.x).x\r\n        min_y = min(self.points, key=lambda p: p.y).y\r\n        max_y = max(self.points, key=lambda p: p.y).y\r\n\r\n        try:\r\n            lb = filter(lambda p: p.x == min_x and p.y == min_y, self.points)[0]\r\n            rt = filter(lambda p: p.x == max_x and p.y == max_y, self.points)[0]\r\n            lt = filter(lambda p: p.x == min_x and p.y == max_y, self.points)[0]\r\n            rb = filter(lambda p: p.x == max_x and p.y == min_y, self.points)[0]\r\n        except IndexError:\r\n            return None\r\n\r\n        if lb.x == lt.x and rt.x == rb.x and lb.y == rb.y and lt.y == rt.y:\r\n            return Geometry(shape=GeometryShape.Rectangle, points=[lb, rt])\r\n\r\n        return None\r\n\r\n    def convert2poly(self):\r\n        if self.shape == GeometryShape.Polygon:\r\n            return self.clone()\r\n        elif self.shape == GeometryShape.Rectangle:\r\n            lb = self.points[0]\r\n            rt = self.points[1]\r\n            # Check if one dimension region\r\n            if lb.x == rt.x or lb.y == rt.y:\r\n                return self.clone()\r\n            points = [Point(lb.x, lb.y), Point(rt.x, lb.y), Point(rt.x, rt.y), Point(lb.x, rt.y)]\r\n            return Geometry(shape=GeometryShape.Polygon, points=points)\r\n        else:\r\n            raise RuntimeError(\"Unknown geometry type\")\r\n\r\n    def is_rect(self):\r\n        return self.convert2rect() is not None\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        shape = getattr(GeometryShape, str(p_object[Geometry.shape.key]))\r\n        points = [Point.load(point_data) for point_data in p_object[Geometry.points.key]]\r\n        return cls(shape, points)\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: Geometry\"\"\"\r\n        if self.type != other.type:\r\n            raise RuntimeError(\"Assign of Geometry objects with different types (%s, %s)\" % (self.type, other.type))\r\n        self.shape = other.shape\r\n        self.points = [point.clone() for point in other.points]\r\n\r\n    def export(self):\r\n        return {\r\n            Geometry.shape.key: str(self.shape),\r\n            Geometry.points.key: [point.export() for point in self.points]\r\n        }\r\n\r\n    @classmethod\r\n    def rectangle(cls, left, bottom, right, top):\r\n        \"\"\"\r\n        :type left: float\r\n        :type bottom: float\r\n        :type right: float\r\n        :type top: float\r\n        \"\"\"\r\n        return cls(GeometryShape.Rectangle, [Point(left, bottom), Point(right, top)])\r\n\r\n    @classmethod\r\n    def polygon(cls, points):\r\n        \"\"\"\r\n        :type points: list[tuple[float]]\r\n        \"\"\"\r\n        return cls(GeometryShape.Polygon, [Point(*coords) for k, coords in enumerate(points)])\r\n\r\n\r\nclass Point(Base):\r\n\r\n    x = Column(Integer, nullable=False)\r\n    y = Column(Integer, nullable=False)\r\n    ord = Column(Integer, nullable=False)\r\n    geometry_id = Column(Integer, ForeignKey(Geometry.id), nullable=False)\r\n\r\n    def __init__(self, x, y):\r\n        \"\"\"\r\n        :type x: float\r\n        :type y: float\r\n        \"\"\"\r\n        super(Point, self).__init__()\r\n        self.x = x\r\n        self.y = y\r\n\r\n    def __add__(self, other):\r\n        if isinstance(other, float) or isinstance(other, int):\r\n            return Point(self.x + other, self.y + other)\r\n        elif isinstance(other, Point):\r\n            return Point(self.x + other.x, self.y + other.y)\r\n        return NotImplemented\r\n\r\n    def __sub__(self, other):\r\n        if isinstance(other, float) or isinstance(other, int):\r\n            return Point(self.x - other, self.y - other)\r\n        elif isinstance(other, Point):\r\n            return Point(self.x - other.x, self.y - other.y)\r\n        return NotImplemented\r\n\r\n    def __mul__(self, other):\r\n        if isinstance(other, float) or isinstance(other, int):\r\n            return Point(self.x * other, self.y * other)\r\n        return NotImplemented\r\n\r\n    def __rmul__(self, other):\r\n        if isinstance(other, float) or isinstance(other, int):\r\n            return Point(other * self.x, other * self.y)\r\n        return NotImplemented\r\n\r\n    def __div__(self, other):\r\n        if isinstance(other, float) or isinstance(other, int):\r\n            return Point(self.x / other, self.y / other)\r\n        return NotImplemented\r\n\r\n    def __str__(self):\r\n        return \"Point(%f, %f)\" % (self.x, self.y)\r\n\r\n    def __iter__(self):\r\n        return iter([self.x, self.y])\r\n\r\n    def inside(self, polygon):\r\n        if polygon.type == GeometryShape.Polygon:\r\n            return point_inside_polygon(self, polygon)\r\n        elif polygon.type == GeometryShape.Rectangle:\r\n            return polygon.points[0].x <= self.x <= polygon.points[1].x and \\\r\n                polygon.points[0].y <= self.y <= polygon.points[1].y\r\n        else:\r\n            raise RuntimeError(\"Unknown polygon shape type\")\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        return cls(float(p_object[Point.x.key]), float(p_object[Point.y.key]))\r\n\r\n    def export(self):\r\n        return {Point.x.key: self.x, Point.y.key: self.y}\r\n\r\n    def clone(self):\r\n        \"\"\":rtype: Point\"\"\"\r\n        return Point(self.x, self.y)\r\n\r\n\r\nclass Mask(Generic, StandardObject):\r\n\r\n    DB_MASK_DIMENSIONS_COUNT = 2\r\n\r\n    icon = hybrid_property(lambda cls: \"icons/Mask\")\r\n\r\n    id = Column(Integer, ForeignKey(Generic.id), primary_key=True)\r\n\r\n    boundary_id = Column(Integer, ForeignKey(Geometry.id), nullable=False, unique=True)\r\n    boundary = relationship(Geometry, foreign_keys=[boundary_id])\r\n\r\n    sim_region_id = Column(Integer, ForeignKey(Geometry.id), nullable=False, unique=True)\r\n    sim_region = relationship(Geometry, foreign_keys=[sim_region_id])\r\n\r\n    regions = relationship(\r\n        \"Region\", order_by=\"Region.id\",\r\n        cascade=\"all, delete, delete-orphan\",\r\n        foreign_keys=\"[Region.mask_id]\")\r\n\r\n    background = Column(Float, nullable=False)\r\n    phase = Column(Float, nullable=False)\r\n    clean = Column(Boolean, nullable=False)\r\n\r\n    __mapper_args__ = {\"polymorphic_identity\": GenericType.Mask}\r\n\r\n    __table_args__ = (\r\n        CheckConstraint(background >= 0.0, name=\"background transmittance must be >= 0.0\"),\r\n        CheckConstraint(background <= 1.0, name=\"background transmittance must be <= 1.0\"),\r\n        # -------------------------------------------------\r\n        CheckConstraint(phase >= -180.0, name=\"phase must be >= -180.0\"),\r\n        CheckConstraint(phase <= 180.0, name=\"phase must be <= 180.0\")\r\n    )\r\n\r\n    def __init__(self, name, background, phase, boundary, sim_region, regions=None, clean=True, desc=None):\r\n        \"\"\"\r\n        :type name: str\r\n        :type background: float\r\n        :type phase: float\r\n        :type boundary: Geometry\r\n        :type sim_region: Geometry\r\n        :type regions: list of Region\r\n        :type clean: bool\r\n        :type desc: str\r\n        \"\"\"\r\n        super(Mask, self).__init__(name, desc)\r\n        self.background = background\r\n        self.phase = phase\r\n        self.boundary = boundary\r\n        self.sim_region = sim_region\r\n        self.clean = clean\r\n        if regions is not None:\r\n            self.regions = regions\r\n\r\n    def add_region(self, region):\r\n        \"\"\":type region: Region\"\"\"\r\n        self.regions.append(region)\r\n        self.clean = False\r\n\r\n    def clone(self, name=None):\r\n        \"\"\":rtype: MaskDatabase\"\"\"\r\n        return Mask(\r\n            name=self.name if name is None else name,\r\n            desc=self.desc,\r\n            background=self.background,\r\n            phase=self.phase,\r\n            boundary=self.boundary.clone(),\r\n            sim_region=self.sim_region.clone(),\r\n            regions=[v.clone() for v in self.regions],\r\n            clean=self.clean)\r\n\r\n    @property\r\n    def dimensions(self):\r\n        return Mask.DB_MASK_DIMENSIONS_COUNT\r\n\r\n    # Compatibility with ConcretePluginMask\r\n    @property\r\n    def variables(self):\r\n        return []\r\n\r\n    def gds(self, stream):\r\n        gds_lib = gdsii.library.Library(version=600, physical_unit=1.0E-9, logical_unit=0.001, name=\"DB\")\r\n\r\n        top_cell = gdsii.structure.Structure(self.name)\r\n\r\n        for region in self.regions:\r\n            try:\r\n                layer, datatype = config.GdsLayerMapping.get_layer(region.transmittance, region.phase)\r\n            except (KeyError, ValueError):\r\n                return False\r\n            points = [np.array([p.x, p.y]) for p in region.points]\r\n            polygon = gdsii.elements.Boundary(xy=points, layer=layer, data_type=datatype)\r\n            top_cell.append(polygon)\r\n\r\n        bnd = self.boundary\r\n        points = [np.array([bnd[0].x, bnd[0].y]), np.array([bnd[0].x, bnd[1].y]),\r\n                  np.array([bnd[1].x, bnd[1].y]), np.array([bnd[1].x, bnd[0].y])]\r\n        layer, datatype = config.GdsLayerMapping.boundary_layer()\r\n        boundary = gdsii.elements.Boundary(xy=points, layer=layer, data_type=datatype)\r\n        top_cell.append(boundary)\r\n\r\n        gds_lib.append(top_cell)\r\n        gds_lib.save(stream)\r\n\r\n        return True\r\n\r\n    def export(self):\r\n        \"\"\":rtype: dict\"\"\"\r\n        result = super(Mask, self).export()\r\n        result.update({\r\n            Mask.background.key: self.background,\r\n            Mask.phase.key: self.phase,\r\n            Mask.boundary.key: self.boundary.export(),\r\n            Mask.sim_region.key: self.sim_region.export(),\r\n            Mask.clean.key: self.clean,\r\n            Mask.regions.key: [region.export() for region in self.regions]\r\n        })\r\n        return result\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: Mask\"\"\"\r\n        super(Mask, self).assign(other)\r\n        self.background = other.background\r\n        self.phase = other.phase\r\n        self.sim_region.assign(other.sim_region)\r\n        self.boundary.assign(other.boundary)\r\n        self.clean = other.clean\r\n        self.regions = [region.clone() for region in other.regions]\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        return cls(\r\n            name=str(p_object[Mask.name.key]),\r\n            desc=str(p_object[Mask.desc.key]),\r\n            background=float(p_object[Mask.background.key]),\r\n            phase=float(p_object[Mask.phase.key]),\r\n            boundary=Geometry.load(p_object[Mask.boundary.key]),\r\n            sim_region=Geometry.load(p_object[Mask.sim_region.key]),\r\n            clean=bool(p_object[Mask.clean.key]),\r\n            regions=[Region.load(region_data) for region_data in p_object[Mask.regions.key]],\r\n        )\r\n\r\n    def parse(self, p_object):\r\n        self.assign(Mask.load(p_object))\r\n\r\n\r\nevent.listen(Mask.__table__, \"after_create\", Generic.inheritance_trigger(Mask))\r\n\r\n\r\nclass Region(Geometry):\r\n\r\n    id = Column(Integer, ForeignKey(Geometry.id), primary_key=True)\r\n\r\n    # Self fields\r\n    transmittance = Column(Float, nullable=False)\r\n    phase = Column(Float, nullable=False)\r\n\r\n    __table_args__ = (\r\n        CheckConstraint(transmittance >= 0.0), CheckConstraint(transmittance <= 1.0),\r\n        CheckConstraint(phase >= -180.0), CheckConstraint(phase <= 180.0)\r\n    )\r\n\r\n    __mapper_args__ = {\"polymorphic_identity\": GeometryObjectType.Region}\r\n\r\n    # Reference to the mask data\r\n    mask_id = Column(Integer, ForeignKey(Mask.id), nullable=False)\r\n\r\n    def __init__(self, transmittance, phase, shape, points=None):\r\n        \"\"\"\r\n        :type transmittance: float\r\n        :type phase: float\r\n        :type shape: str\r\n        :type points: list of Point or None\r\n        \"\"\"\r\n        super(Region, self).__init__(shape, points)\r\n        self.transmittance = transmittance\r\n        self.phase = phase\r\n\r\n    def export(self):\r\n        result = super(Region, self).export()\r\n        result.update({\r\n            Region.transmittance.key: self.transmittance,\r\n            Region.phase.key: self.phase,\r\n        })\r\n        return result\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        transmittance = float(p_object[Region.transmittance.key])\r\n        phase = float(p_object[Region.phase.key])\r\n        shape = getattr(GeometryShape, str(p_object[Geometry.shape.key]))\r\n        points = [Point.load(point_data) for point_data in p_object[Geometry.points.key]]\r\n        return cls(transmittance, phase, shape, points)\r\n\r\n    def clone(self):\r\n        \"\"\":rtype: Region\"\"\"\r\n        points = [v.clone() for v in self.points]\r\n        return Region(self.transmittance, self.phase, self.shape, points)\r\n\r\n\r\nclass ConcretePluginMask(ConcretePluginCommon):\r\n\r\n    SignalsClass = SignalsMeta.CreateSignalsClass(\"ConcretePluginMask\", [\"background\", \"phase\"], db_columns=False)\r\n\r\n    def __init__(self, abstract, values=None):\r\n        \"\"\"\r\n        :type abstract: orm.AbstractPluginMask\r\n        :type values: list of float\r\n        \"\"\"\r\n        super(ConcretePluginMask, self).__init__(abstract, values)\r\n        self.__mask_struct = pcpi.mask_t()\r\n        self._base.regenerate(self.__mask_struct, *self.values)\r\n        self.__transmittance = self.__mask_struct.boundary.transmittance\r\n        self.__phase = self.__mask_struct.boundary.phase\r\n\r\n    dimensions = property(lambda self: self._base.dims)\r\n\r\n    @property\r\n    def boundary(self):\r\n        self._base.regenerate(self.__mask_struct, *self.values)\r\n        self.__mask_struct.boundary.transmittance = self.__transmittance\r\n        self.__mask_struct.boundary.phase = self.__phase\r\n        points = self.__mask_struct.boundary.points\r\n        if self._base.dims == 1:\r\n            boundary = Geometry.rectangle(points[0].x, points[0].y, points[1].x, points[1].y)\r\n        else:\r\n            boundary = Geometry.rectangle(points[0].x, points[0].y, points[2].x, points[2].y)\r\n        return boundary\r\n\r\n    @property\r\n    def regions(self):\r\n        self._base.regenerate(self.__mask_struct, *self.values)\r\n        self.__mask_struct.boundary.transmittance = self.__transmittance\r\n        self.__mask_struct.boundary.phase = self.__phase\r\n        # Returns regions generator\r\n        for k in xrange(self.__mask_struct.regions_count):\r\n            r = self.__mask_struct.regions[k]\r\n            yield Region(\r\n                transmittance=r.transmittance, phase=r.phase, shape=GeometryShape.Polygon,\r\n                points=[Point(r.points[k].x, r.points[k].y) for k in xrange(r.length)])\r\n\r\n    def _get_background(self):\r\n        return self.__mask_struct.boundary.transmittance\r\n\r\n    def _set_background(self, value):\r\n        if self.__mask_struct.boundary.transmittance != value:\r\n            self.__mask_struct.boundary.transmittance = self.__transmittance = value\r\n            self.signals[ConcretePluginMask.background].emit()\r\n\r\n    def _get_phase(self):\r\n        return self.__mask_struct.boundary.phase\r\n\r\n    def _set_phase(self, value):\r\n        if self.__mask_struct.boundary.phase != value:\r\n            self.__mask_struct.boundary.phase = self.__phase = value\r\n            self.signals[ConcretePluginMask.phase].emit()\r\n\r\n    background = AttributedProperty(_get_background, _set_background, key=\"background\", dtype=Float)\r\n    phase = AttributedProperty(_get_phase, _set_phase, key=\"phase\", dtype=Float)\r\n\r\n    def export(self):\r\n        result = self._base.export()\r\n        result.update(super(ConcretePluginMask, self).export())\r\n        result.update({\r\n            ConcretePluginMask.background.key: self.background,\r\n            ConcretePluginMask.phase.key: self.phase,\r\n        })\r\n        return result\r\n\r\n    @classmethod\r\n    def load(cls, p_object, abstract=None):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        abstract_base = AbstractPluginMask.load(p_object)\r\n        result = super(ConcretePluginMask, cls).load(p_object, abstract_base)\r\n        result.background = p_object[ConcretePluginMask.background.key]\r\n        result.phase = p_object[ConcretePluginMask.phase.key]\r\n        return result\r\n\r\n    def clone(self):\r\n        result = super(ConcretePluginMask, self).clone()\r\n        result.background = self.background\r\n        result.phase = self.phase\r\n        return result\r\n\r\n\r\nclass AbstractPluginMask(Generic, PluginObject):\r\n\r\n    icon = hybrid_property(lambda cls: \"icons/Numerics\")\r\n\r\n    cpi = pcpi.mask_plugin_t\r\n\r\n    id = Column(Integer, ForeignKey(Generic.id), primary_key=True)\r\n    dims = Column(Integer, nullable=False)\r\n    prms = relationship(\r\n        \"AbstractPluginMaskPrm\",\r\n        order_by=\"AbstractPluginMaskPrm.ord\",\r\n        cascade=\"all, delete, delete-orphan\")\r\n\r\n    __mapper_args__ = {\"polymorphic_identity\": GenericType.AbstractPluginMask}\r\n\r\n    def __init__(self, name, prms, dims, desc=None):\r\n        \"\"\"\r\n        :param str name: Mask plugin name\r\n        :param list of AbstractPluginMaskPrm prms: Parameters descriptors of the mask plugin\r\n        :param int dims: 1 or 2 dimensions mask\r\n        :param str or None desc: Description of the plugin\r\n        \"\"\"\r\n        super(AbstractPluginMask, self).__init__(name, desc)\r\n        self.prms = prms\r\n        self.dims = dims\r\n        self._mask_entry = None\r\n        \"\"\":type: mask_plugin_t\"\"\"\r\n\r\n    def produce(self, values=None):\r\n        \"\"\"\r\n        :type values: list of float\r\n        :rtype: ConcretePluginMask\r\n        \"\"\"\r\n        return ConcretePluginMask(self, values)\r\n\r\n    @property\r\n    def entry(self):\r\n        \"\"\":rtype: mask_t\"\"\"\r\n        if not hasattr(self, \"_mask_entry\") or self._mask_entry is None:\r\n            self._mask_entry = pcpi.PLUGIN_REGISTRY.get_by_id(self.id).entry\r\n        return self._mask_entry\r\n\r\n    def regenerate(self, mask_struct, *values):\r\n        \"\"\":type mask_struct: pcpi.mask_t\"\"\"\r\n        array = ctypes.c_double * len(self.prms)\r\n        # noinspection PyCallingNonCallable\r\n        if self.entry.create(ctypes.byref(mask_struct), array(*values)):\r\n            raise RuntimeError(\"Error during plugin mask regeneration\")\r\n\r\n    def assign(self, other):\r\n        raise NotImplementedError(METHOD_NONE_IMPLEMENTED)\r\n\r\n    def clone(self, name=None):\r\n        \"\"\"\r\n        :type name: str or None\r\n        :rtype: AbstractPluginMask\r\n        \"\"\"\r\n        if name is not None:\r\n            raise NotImplementedError(METHOD_NONE_IMPLEMENTED)\r\n\r\n        prms = [v.clone() for v in self.prms]\r\n        return AbstractPluginMask(self.name, prms, self.mask_type, self.desc)\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        return pcpi.PLUGIN_REGISTRY.get_by_name(p_object[Generic.name.key]).record\r\n\r\n\r\nclass AbstractPluginMaskPrm(AbstractPluginParameter, Base):\r\n\r\n    name = Column(String, nullable=False)\r\n    ord = Column(Integer, nullable=False)\r\n    defv = Column(Float)\r\n    max = Column(Float)\r\n    min = Column(Float)\r\n    plugin_mask_id = Column(Integer, ForeignKey(AbstractPluginMask.id, ondelete=\"CASCADE\"))\r\n\r\n    __table_args__ = (\r\n        UniqueConstraint(ord, plugin_mask_id, name=\"duplicate order arguments number\"),\r\n        # -------------------------------------------------\r\n        # TODO: Check parameters\r\n        # CheckConstraint(defv > min, \"default value must greater than min values\"),\r\n        # CheckConstraint(defv < max, \"default value must lower than max values\"),\r\n        # CheckConstraint(max > min, name=\"max must be > min argument value\"),\r\n    )\r\n\r\n\r\nclass DeveloperInterface(Generic):\r\n\r\n    icon = hybrid_property(lambda cls: \"icons/Development\")\r\n    __text_type__ = \"Abstract\"\r\n\r\n    id = Column(Integer, ForeignKey(Generic.id), primary_key=True)\r\n\r\n    __mapper_args__ = {\"polymorphic_identity\": None}\r\n\r\n    def __init__(self, name, desc):\r\n        super(DeveloperInterface, self).__init__(name, desc)\r\n\r\n    def rate(self, pac, depth):\r\n        \"\"\"\r\n        :type pac: numpy.ndarray or list of float\r\n        :type depth: numpy.ndarray or list of float\r\n        :rtype: numpy.ndarray\r\n        \"\"\"\r\n        raise NotImplementedError(METHOD_NONE_IMPLEMENTED)\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: DeveloperInterface\"\"\"\r\n        if not DeveloperInterface in self.__class__.mro():\r\n            raise NotImplementedError(METHOD_NONE_IMPLEMENTED)\r\n        super(DeveloperInterface, self).assign(other)\r\n\r\n    def clone(self, name=None):\r\n        \"\"\"\r\n        :type name: str\r\n        :rtype: DeveloperInterface\r\n        \"\"\"\r\n        if not DeveloperInterface in self.__class__.mro():\r\n            raise NotImplementedError(METHOD_NONE_IMPLEMENTED)\r\n        return super(DeveloperInterface, self).clone()\r\n\r\n    def __str__(self):\r\n        return \"%s [%s]\" % (self.name, self.__text_type__)\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        if p_object[DeveloperInterface.type.key] == str(GenericType.DeveloperExpr):\r\n            return DeveloperExpr.load(p_object)\r\n        elif p_object[DeveloperInterface.type.key] == str(GenericType.DeveloperSheet):\r\n            return DeveloperSheet.load(p_object)\r\n        else:\r\n            raise UnknownObjectTypeError(p_object[DeveloperInterface.type.key])\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(type(self).load(p_object))\r\n\r\n    def convert2core(self):\r\n        raise NotImplementedError(METHOD_NONE_IMPLEMENTED)\r\n\r\n\r\nclass Resist(Generic, StandardObject, DeleteHook):\r\n\r\n    icon = hybrid_property(lambda cls: \"icons/Resist\")\r\n\r\n    id = Column(Integer, ForeignKey(Generic.id), primary_key=True)\r\n\r\n    # Compare with ExposureParameter and PebParameters where foreign keys not in resist table developer must be in\r\n    # resist table because for one developer several resist may exists. But for Exposure and PEB connection is one-one.\r\n    # Also it's simpler to delete orphan exposure and peb parameter only using DB level (ON DELETE CASCADE)\r\n    developer_id = Column(Integer, ForeignKey(DeveloperInterface.id))\r\n    developer = relationship(DeveloperInterface, foreign_keys=[developer_id])\r\n    \"\"\":type: DeveloperInterface\"\"\"\r\n\r\n    exposure = relationship(\"ExposureParameters\", cascade=\"all, delete-orphan\", uselist=False)\r\n    \"\"\":type: ExposureParameters\"\"\"\r\n    peb = relationship(\"PebParameters\", cascade=\"all, delete-orphan\", uselist=False)\r\n    \"\"\":type: PebParameters\"\"\"\r\n\r\n    __mapper_args__ = {\"polymorphic_identity\": GenericType.Resist}\r\n\r\n    def __init__(self, name, comment, exposure, peb, developer):\r\n        \"\"\"\r\n        :type name: str\r\n        :type comment: str\r\n        :type exposure: ExposureParameters\r\n        :type peb: PebParameters\r\n        :type developer: DeveloperInterface\r\n        \"\"\"\r\n        super(Resist, self).__init__(name, comment)\r\n        self.exposure = exposure\r\n        self.peb = peb\r\n        self.developer = developer\r\n\r\n    def on_delete(self, session):\r\n        \"\"\"\r\n        :type session: Session\r\n        :return: Query of the objects to being delete\r\n        :rtype: Query\r\n        \"\"\"\r\n        # Select only deleted and temporary development expression\r\n        condition = and_(DeveloperExpr.id == self.developer_id, DeveloperExpr.temporary == 1)\r\n        return session.query(DeveloperExpr).filter(condition)\r\n\r\n    def assign(self, other, developer=None):\r\n        \"\"\"\r\n        :type other: Resist\r\n        :type developer: DeveloperInterface\r\n        \"\"\"\r\n        super(Resist, self).assign(other)\r\n        self.developer = other.developer if developer is None else developer\r\n        self.exposure.assign(other.exposure)\r\n        self.peb.assign(other.peb)\r\n\r\n    def clone(self, name=None, developer=None):\r\n        \"\"\"\r\n        :type name: str\r\n        :type developer: DeveloperInterface\r\n        :rtype: Resist\r\n        \"\"\"\r\n        exposure = self.exposure.clone()\r\n        peb = self.peb.clone()\r\n\r\n        if developer is None:\r\n            if isinstance(self.developer, DeveloperExpr):\r\n                developer = self.developer.clone()\r\n            elif isinstance(self.developer, DeveloperSheet):\r\n                developer = self.developer\r\n            elif self.developer is None:\r\n                developer = None\r\n            else:\r\n                raise TypeError(\"Unknown developer %s type: %s\" % (self.developer.name, type(self.developer).__name__))\r\n\r\n        name = self.name if name is None else name\r\n\r\n        return Resist(name, self.desc, exposure, peb, developer)\r\n\r\n    def export(self):\r\n        result = super(Resist, self).export()\r\n        result.update({\r\n            Resist.exposure.key: self.exposure.export(),\r\n            Resist.peb.key: self.peb.export(),\r\n            Resist.developer.key: self.developer.export()\r\n        })\r\n        return result\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        return cls(\r\n            name=p_object[Resist.name.key],\r\n            comment=p_object[Resist.desc.key],\r\n            exposure=ExposureParameters.load(p_object[Resist.exposure.key]),\r\n            peb=PebParameters.load(p_object[Resist.peb.key]),\r\n            developer=DeveloperInterface.load(p_object[Resist.developer.key]))\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(Resist.load(p_object))\r\n\r\n\r\nevent.listen(Resist.__table__, \"after_create\", Generic.inheritance_trigger(Resist))\r\n\r\n\r\nclass ExposureParameters(Base):\r\n\r\n    name = \"Exposure Parameters\"\r\n\r\n    resist_id = Column(Integer, ForeignKey(Resist.id, ondelete=\"CASCADE\"), unique=True, nullable=False)\r\n\r\n    wavelength = Column(Float, nullable=False, precision=Precision.wavelength)\r\n    a = Column(Float, nullable=False, precision=Precision.dill)\r\n    b = Column(Float, nullable=False, precision=Precision.dill)\r\n    c = Column(Float, nullable=False, precision=Precision.dill)\r\n    n = Column(Float, nullable=False, precision=Precision.refractive_index)\r\n\r\n    __table_args__ = (\r\n        CheckConstraint(wavelength >= 0.0, name=\"Wavelength must be >= 0.0\"),\r\n        CheckConstraint(a >= 0.0, name=\"Dill A must be >= 0.0\"),\r\n        CheckConstraint(b >= 0.0, name=\"Dill B must be >= 0.0\"),\r\n        CheckConstraint(c >= 0.0, name=\"Dill C must be >= 0.0\"),\r\n        CheckConstraint(n >= 0.0, name=\"Unexposed n must be >= 0.0\"),\r\n    )\r\n\r\n    def __init__(self, wavelength, a, b, c, n):\r\n        \"\"\"\r\n        :param float wavelength: Wavelength at which resist was calibrated\r\n        :param float a: Exposure Dill ABC model parameter A\r\n        :param float b: Exposure Dill ABC model parameter B\r\n        :param float c: Exposure Dill ABC model parameter C\r\n        :param float n: Real part of refractive index of unexposed resist\r\n        \"\"\"\r\n        super(ExposureParameters, self).__init__()\r\n        self.wavelength = wavelength\r\n        self.a = a\r\n        self.b = b\r\n        self.c = c\r\n        self.n = n\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: ExposureParameters\"\"\"\r\n        self.wavelength = other.wavelength\r\n        self.a = other.a\r\n        self.b = other.b\r\n        self.c = other.c\r\n        self.n = other.n\r\n\r\n    def clone(self):\r\n        \"\"\":rtype: ExposureParameters\"\"\"\r\n        return ExposureParameters(self.wavelength, self.a, self.b, self.c, self.n)\r\n\r\n    def export(self):\r\n        return {\r\n            ExposureParameters.wavelength.key: self.wavelength,\r\n            ExposureParameters.a.key: self.a,\r\n            ExposureParameters.b.key: self.b,\r\n            ExposureParameters.c.key: self.c,\r\n            ExposureParameters.n.key: self.n\r\n        }\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        return cls(\r\n            wavelength=p_object[ExposureParameters.wavelength.key],\r\n            a=p_object[ExposureParameters.a.key],\r\n            b=p_object[ExposureParameters.b.key],\r\n            c=p_object[ExposureParameters.c.key],\r\n            n=p_object[ExposureParameters.n.key])\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(ExposureParameters.load(p_object))\r\n\r\n    def convert2core(self):\r\n        return oplc.ExposureResistModel(self.wavelength, self.a, self.b, self.c, self.n)\r\n\r\n\r\nclass PebParameters(Base):\r\n\r\n    name = \"PEB Parameters\"\r\n\r\n    resist_id = Column(Integer, ForeignKey(Resist.id, ondelete=\"CASCADE\"), unique=True, nullable=False)\r\n\r\n    ea = Column(Float, nullable=False, precision=3)\r\n    ln_ar = Column(Float, nullable=False, precision=3)\r\n\r\n    def __init__(self, ea, ln_ar):\r\n        \"\"\"\r\n        :type ea: float\r\n        :type ln_ar: float\r\n        \"\"\"\r\n        super(PebParameters, self).__init__()\r\n        self.ea = ea\r\n        self.ln_ar = ln_ar\r\n\r\n    def diffusivity(self, temp):\r\n        \"\"\"\r\n        Calculate diffusivity for graph display.\r\n        Note: Real sigma to PEB convolution should be calculated using:\r\n        sqrt(2*kt*time), where kt is the result of this function.\r\n\r\n        :param float or list of float or numpy.ndarray temp: Temperature in C\r\n        :rtype: float\r\n        \"\"\"\r\n        if isinstance(temp, list):\r\n            temp = np.array(temp, dtype=float)\r\n        tempk = temp - physc.T0\r\n        return np.exp(self.ln_ar - self.ea/(physc.R*tempk))\r\n\r\n    def diffusion_length(self, temp, time):\r\n        \"\"\"\r\n        :type temp: float\r\n        :type time: float\r\n        \"\"\"\r\n        return np.sqrt(2*self.diffusivity(temp)*time)\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: PebParameters\"\"\"\r\n        self.ln_ar = other.ln_ar\r\n        self.ea = other.ea\r\n\r\n    def clone(self):\r\n        \"\"\":rtype: PebParameters\"\"\"\r\n        return PebParameters(self.ea, self.ln_ar)\r\n\r\n    def export(self):\r\n        return {\r\n            PebParameters.ea.key: self.ea,\r\n            PebParameters.ln_ar.key: self.ln_ar\r\n        }\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        return cls(\r\n            ea=p_object[PebParameters.ea.key],\r\n            ln_ar=p_object[PebParameters.ln_ar.key])\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(ExposureParameters.load(p_object))\r\n\r\n    def convert2core(self):\r\n        return oplc.PebResistModel(self.ea, self.ln_ar)\r\n\r\n\r\nclass DeveloperSheet(DeveloperInterface, StandardObject):\r\n\r\n    id = Column(Integer, ForeignKey(DeveloperInterface.id), primary_key=True)\r\n    is_depth = Column(Boolean, nullable=False)\r\n    data = relationship(\"DeveloperSheetData\", order_by=\"DeveloperSheetData.pac\", cascade=\"all, delete-orphan\")\r\n\r\n    __text_type__ = \"Sheet\"\r\n\r\n    __mapper_args__ = {\"polymorphic_identity\": GenericType.DeveloperSheet}\r\n\r\n    def __init__(self, name, is_depth, data, desc=None):\r\n        \"\"\"\r\n        :type name: str\r\n        :type is_depth: bool\r\n        :type data: list of DeveloperSheetData\r\n        \"\"\"\r\n        super(DeveloperSheet, self).__init__(name, desc)\r\n        self.is_depth = is_depth\r\n        self.data = data\r\n\r\n    def rate(self, pac=None, depth=None):\r\n        \"\"\"\r\n        :type pac: numpy.ndarray or list of float or None\r\n        :type depth: numpy.ndarray or list of float or None\r\n        :rtype: numpy.ndarray\r\n        \"\"\"\r\n\r\n        native_xy = True\r\n\r\n        pacs, depths, rates = [], [], []\r\n        for item in self.data:\r\n            pacs.append(item.pac)\r\n            depths.append(item.depth if self.is_depth else 0.0)\r\n            rates.append(item.rate)\r\n\r\n        if pac is None or depth is None:\r\n            pac = np.unique(np.array(pacs))\r\n            depth = np.unique(np.array(depths))\r\n        else:\r\n            native_xy = False\r\n            if not self.is_depth:\r\n                if callable(depth) and (depth is max or depth is min):\r\n                    depth = np.zeros([1, 1])\r\n                else:\r\n                    depth = np.zeros(len(depth))\r\n            else:\r\n                if callable(depth) and (depth is max or depth is min):\r\n                    depth = np.array(depth(self.data, key=lambda v: v.depth).depth)\r\n                else:\r\n                    depth = np.array(depth)\r\n            pac = np.array(pac)\r\n\r\n        if len(depth) > 1:\r\n            # This shit: y[:, None] - is transpose\r\n            result = griddata((pacs, depths), rates, (pac[None, :], depth[:, None]), method='linear', fill_value=0.0)\r\n        else:\r\n            depth_cond = np.where(np.asarray(depths) == depth[0])\r\n            pacs = np.asarray(pacs)[depth_cond]\r\n            rates = np.asarray(rates)[depth_cond]\r\n            result = np.ndarray([len(pac), 1])\r\n            result[:, 0] = interp1d(pacs, rates)(pac)\r\n\r\n        if native_xy:\r\n            return pac, depth, result\r\n\r\n        return result\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: DeveloperSheet\"\"\"\r\n        super(DeveloperSheet, self).assign(other)\r\n        self.is_depth = other.is_depth\r\n        self.data = [v.clone() for v in other.data]\r\n\r\n    def clone(self, name=None):\r\n        \"\"\":rtype: DeveloperSheet\"\"\"\r\n        name = self.name if name is None else name\r\n        data = [v.clone() for v in self.data]\r\n        return DeveloperSheet(name, self.is_depth, data, self.desc)\r\n\r\n    def export(self):\r\n        result = super(DeveloperSheet, self).export()\r\n        result.update({\r\n            DeveloperSheet.is_depth.key: self.is_depth,\r\n            DeveloperSheet.data.key: [data.export() for data in self.data]\r\n        })\r\n        return result\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        data = [DeveloperSheetData.load(data) for data in p_object[DeveloperSheet.data.key]]\r\n        return cls(\r\n            name=p_object[DeveloperSheet.name.key],\r\n            desc=p_object[DeveloperSheet.desc.key],\r\n            is_depth=p_object[DeveloperSheet.is_depth.key],\r\n            data=data)\r\n\r\n    def convert2core(self):\r\n        if self.is_depth:\r\n            pac, depth, values = self.rate()\r\n            return oplc.ResistRateModelDepthSheet(pac, depth, np.asfortranarray(values))\r\n        else:\r\n            pac, _, values = self.rate()\r\n            return oplc.ResistRateModelSheet(pac, values[:, 0])\r\n\r\n\r\nevent.listen(DeveloperSheet.__table__, \"after_create\", Generic.inheritance_trigger(DeveloperSheet))\r\n\r\n\r\n_dev_rate_depth_dependency = DDL(\"\"\"\r\nCREATE TRIGGER dev_rate_depth_dependency\r\nBEFORE INSERT ON DeveloperSheetData\r\nFOR EACH ROW\r\nWHEN (\r\n  CASE\r\n    EXISTS (\r\n      SELECT NULL FROM DeveloperSheet\r\n      WHERE DeveloperSheet.id == new.developer_sheet_id\r\n            AND DeveloperSheet.is_depth == 1\r\n    )\r\n  WHEN 1 THEN\r\n    new.depth IS NULL\r\n  ELSE\r\n    new.depth IS NOT NULL\r\n  END\r\n)\r\nBEGIN\r\n  SELECT RAISE( ABORT, 'Development rate depth dependency failed' );\r\nEND;\"\"\")\r\n\r\n\r\nclass DeveloperSheetData(Base):\r\n\r\n    pac = Column(Float, nullable=False)\r\n    rate = Column(Float, nullable=False)  # in nm/s\r\n    depth = Column(Float)\r\n\r\n    developer_sheet_id = Column(Integer, ForeignKey(DeveloperSheet.id, ondelete=\"CASCADE\"), nullable=False)\r\n\r\n    __table_args__ = (\r\n        UniqueConstraint(pac, depth, developer_sheet_id, name=\"duplicate PAC, depth values\"),\r\n        # -------------------------------------------------\r\n        CheckConstraint(pac >= 0.0, name=\"PAC must be >= 0.0\"),\r\n        CheckConstraint(pac <= 1.0, name=\"PAC must be <= 1.0\"),\r\n        # -------------------------------------------------\r\n        CheckConstraint(rate >= 0.0, name=\"developer rate must be >= 0.0\"),\r\n    )\r\n\r\n    def __init__(self, pac, rate, depth=None):\r\n        super(DeveloperSheetData, self).__init__()\r\n        self.pac = float(pac)\r\n        self.rate = float(rate)\r\n        self.depth = float(depth) if depth is not None else None\r\n\r\n    def clone(self):\r\n        \"\"\":rtype: DeveloperSheetData\"\"\"\r\n        return DeveloperSheetData(self.pac, self.rate, self.depth)\r\n\r\n    def export(self):\r\n        return {\r\n            DeveloperSheetData.pac.key: self.pac,\r\n            DeveloperSheetData.rate.key: self.rate,\r\n            DeveloperSheetData.depth.key: self.depth\r\n        }\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        return cls(\r\n            pac=p_object[DeveloperSheetData.pac.key],\r\n            rate=p_object[DeveloperSheetData.rate.key],\r\n            depth=p_object[DeveloperSheetData.depth.key])\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        self.assign(DeveloperSheetData.load(p_object))\r\n\r\n\r\n# CREATE TRIGGER dev_rate_depth_dependency\r\nevent.listen(DeveloperSheetData.__table__, \"after_create\", _dev_rate_depth_dependency)\r\n\r\n\r\nclass DevelopmentModel(Generic, PluginObject):\r\n\r\n    icon = hybrid_property(lambda cls: \"icons/Numerics\")\r\n\r\n    cpi = pcpi.dev_model_t\r\n\r\n    id = Column(Integer, ForeignKey(Generic.id), primary_key=True)\r\n    prolith_id = Column(Integer, unique=True)\r\n    args = relationship(\"DevelopmentModelArg\", order_by=\"DevelopmentModelArg.ord\")\r\n\r\n    __mapper_args__ = {\"polymorphic_identity\": GenericType.DevelopmentModel}\r\n\r\n    def __init__(self, name, args, desc=None, prolith_id=None):\r\n        \"\"\"\r\n        :param str name: Development model name\r\n        :param list of DevelopmentModelArg args: Arguments descriptors of the model\r\n        :param str or None desc: Description of the model\r\n        :param int or None prolith_id: Prolith development model identifier (to link model with it's standard models)\r\n        \"\"\"\r\n        super(DevelopmentModel, self).__init__(name, desc)\r\n        self.args = args\r\n        self.prolith_id = prolith_id\r\n        self._rate_entry = None\r\n\r\n    @property\r\n    def entry(self):\r\n        if not hasattr(self, \"_rate_entry\") or self._rate_entry is None:\r\n            self._rate_entry = pcpi.PLUGIN_REGISTRY.get_by_id(self.id).entry\r\n        return self._rate_entry\r\n\r\n    def calc(self, pac, depth, *values):\r\n        array = ctypes.c_double * len(self.args)\r\n        # noinspection PyTypeChecker,PyCallingNonCallable\r\n        return self.entry.expr(pac, depth, array(*values))\r\n\r\n    def assign(self, other):\r\n        raise NotImplementedError(METHOD_NONE_IMPLEMENTED)\r\n\r\n    def clone(self, name=None):\r\n        \"\"\"\r\n        :type name: str or None\r\n        :rtype: DevelopmentModel\r\n        \"\"\"\r\n        if name is not None:\r\n            raise NotImplementedError(METHOD_NONE_IMPLEMENTED)\r\n\r\n        args = [v.clone() for v in self.args]\r\n        return DevelopmentModel(self.name, args, self.desc, self.prolith_id)\r\n\r\n\r\nclass DevelopmentModelArg(AbstractPluginParameter, Base):\r\n\r\n    name = Column(String, nullable=False)\r\n    ord = Column(Integer, nullable=False)\r\n    defv = Column(Float)\r\n    max = Column(Float)\r\n    min = Column(Float)\r\n    development_model_id = Column(Integer, ForeignKey(DevelopmentModel.id, ondelete=\"CASCADE\"))\r\n\r\n    __table_args__ = (\r\n        UniqueConstraint(ord, development_model_id, name=\"duplicate order arguments number\"),\r\n        # -------------------------------------------------\r\n        # TODO: Check parameters\r\n        # CheckConstraint(defv > min, \"default value must greater than min values\"),\r\n        # CheckConstraint(defv < max, \"default value must lower than max values\"),\r\n        # CheckConstraint(max > min, name=\"max must be > min argument value\"),\r\n    )\r\n\r\n\r\nclass DeveloperExpr(DeveloperInterface, StandardObject):\r\n\r\n    id = Column(Integer, ForeignKey(DeveloperInterface.id), primary_key=True)\r\n    model_id = Column(Integer, ForeignKey(DevelopmentModel.id, ondelete=\"CASCADE\"))\r\n\r\n    __text_type__ = \"Expression\"\r\n\r\n    model = relationship(DevelopmentModel, foreign_keys=[model_id])\r\n\r\n    surface_rate = Column(Float, nullable=False)\r\n    inhibition_depth = Column(Float, nullable=False)\r\n\r\n    #TODO: Create trigger or other controller on this column (see description in __init__)\r\n    temporary = Column(Boolean, nullable=False)\r\n\r\n    #TODO: order_by\r\n    object_values = relationship(\"DeveloperExprArgValue\", cascade=\"all, delete-orphan\")\r\n    \"\"\":type: list of DeveloperExprArgValue\"\"\"\r\n\r\n    values = association_proxy(\"object_values\", \"value\")\r\n\r\n    __mapper_args__ = {\"polymorphic_identity\": GenericType.DeveloperExpr}\r\n\r\n    def __init__(self, name, model, values=None, surface_rate=1.0, inhibition_depth=10.0, desc=None, temporary=False):\r\n        \"\"\"\r\n        :param str name: Name of the developer model\r\n        :param DevelopmentModel model: Definition of the model\r\n        :param list of float values or None: Model argument values (if None then default will be used)\r\n        :param float surface_rate: Relative surface rate\r\n        :param float inhibition_depth: Inhibition depth (nm)\r\n        :param str desc: Description of the model\r\n        :param bool temporary: If this parameter is True - then Developer will be deleted as soon as according\r\n                               resist removed. Also in this case only one resist can be linked with this Developer\r\n        \"\"\"\r\n        super(DeveloperExpr, self).__init__(name, desc)\r\n        self.model = model\r\n        if values is None:\r\n            values = [arg.default for arg in model.args]\r\n        self.values = values\r\n        self.surface_rate = surface_rate\r\n        self.inhibition_depth = inhibition_depth\r\n        self.temporary = temporary\r\n\r\n    def rate(self, pac, depth):\r\n        \"\"\"\r\n        Return rates of the development model\r\n\r\n        :param numpy.ndarray or list of float pac: Photo-active component concentration\r\n        :param numpy.ndarray or list of float depth: Depth into resist\r\n        :return: rate on pac-depth grid\r\n        :rtype: numpy.ndarray\r\n        \"\"\"\r\n        result = np.ndarray([len(pac), len(depth)])\r\n        pac_depth = cartesian(pac, depth)\r\n        rows = range(len(pac))\r\n        cols = range(len(depth))\r\n        rc = cartesian(rows, cols)\r\n        for (r, c), (pac, depth) in zip(rc, pac_depth):\r\n            result[r, c] = self.model.calc(pac, depth, *self.values)\r\n        return result\r\n\r\n    def change_model(self, model):\r\n        \"\"\":type model: DevelopmentModel\"\"\"\r\n        if self.model != model:\r\n            self.model = model\r\n            self.values = [arg.default for arg in model.args]\r\n            logging.info(\"Set model %s to %s: %s\" % (self.model, self.name, self.values))\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: DeveloperExpr\"\"\"\r\n        super(DeveloperExpr, self).assign(other)\r\n        self.model = other.model\r\n        self.surface_rate = other.surface_rate\r\n        self.inhibition_depth = other.inhibition_depth\r\n        self.temporary = other.temporary\r\n        self.values = [float(v) for v in other.values]\r\n\r\n    def clone(self, name=None):\r\n        \"\"\":rtype: DeveloperExpr\"\"\"\r\n        name = self.name if name is None else name\r\n        values = [float(v) for v in self.values]\r\n        return DeveloperExpr(name, self.model, values, self.surface_rate,\r\n                             self.inhibition_depth, self.desc, self.temporary)\r\n\r\n    def export(self):\r\n        result = super(DeveloperExpr, self).export()\r\n        # noinspection PyUnresolvedReferences\r\n        result.update({\r\n            DeveloperExpr.model.key: self.model.name,\r\n            DeveloperExpr.surface_rate.key: self.surface_rate,\r\n            DeveloperExpr.inhibition_depth.key: self.inhibition_depth,\r\n            DeveloperExpr.temporary.key: self.temporary,\r\n            DeveloperExpr.object_values.key: [float(v) for v in self.values]\r\n        })\r\n        return result\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: dict\"\"\"\r\n        model = pcpi.PLUGIN_REGISTRY.get_by_name(p_object[DeveloperExpr.model.key]).record\r\n        # noinspection PyUnresolvedReferences\r\n        return cls(\r\n            name=p_object[DeveloperExpr.name.key],\r\n            desc=p_object[DeveloperExpr.desc.key],\r\n            model=model,\r\n            temporary=p_object[DeveloperExpr.temporary.key],\r\n            surface_rate=p_object[DeveloperExpr.surface_rate.key],\r\n            inhibition_depth=p_object[DeveloperExpr.inhibition_depth.key],\r\n            values=p_object[DeveloperExpr.object_values.key])\r\n\r\n    def convert2core(self):\r\n        return oplc.ResistRateModelExpression(self.model.entry.expr, self.values)\r\n\r\n\r\nevent.listen(DeveloperExpr.__table__, \"after_create\", Generic.inheritance_trigger(DeveloperExpr))\r\n\r\n\r\nclass DeveloperExprArgValue(Base):\r\n\r\n    value = Column(Float, nullable=False)\r\n\r\n    development_model_arg_id = Column(Integer, ForeignKey(DevelopmentModelArg.id, ondelete=\"CASCADE\"), unique=True)\r\n    developer_expr_id = Column(Integer, ForeignKey(DeveloperExpr.id, ondelete=\"CASCADE\"))\r\n\r\n    __table_args__ = (\r\n        UniqueConstraint(development_model_arg_id, developer_expr_id, name=\"duplicate developer expression arguments\"),\r\n    )\r\n\r\n    def __init__(self, value):\r\n        \"\"\":type value: float\"\"\"\r\n        super(DeveloperExprArgValue, self).__init__()\r\n        # TODO: development_model_arg_id is not fill because association_proxy field\r\n        # (check whether this link is really required)\r\n        self.value = value\r\n\r\n    def clone(self):\r\n        \"\"\":rtype: DeveloperExprArgValue\"\"\"\r\n        return DeveloperExprArgValue(self.value)\r\n\r\n    def assign(self, other):\r\n        \"\"\":type other: DeveloperExprArgValue\"\"\"\r\n        self.value = other.value\r\n\r\n    @classmethod\r\n    def load(cls, p_object):\r\n        \"\"\":type p_object: float\"\"\"\r\n        return cls(p_object)\r\n\r\n    def parse(self, p_object):\r\n        \"\"\":type p_object: float\"\"\"\r\n        self.value = p_object\r\n\r\n\r\nclass Info(Base):\r\n\r\n    version = Column(Integer, nullable=False)\r\n    appname = Column(String, nullable=False)\r\n    created = Column(DateTime, nullable=False)\r\n\r\n    def __init__(self, version):\r\n        super(Info, self).__init__()\r\n        self.version = version\r\n        self.appname = APPLICATION_NAME\r\n        self.created = datetime.datetime.now()\r\n\r\n    def __str__(self):\r\n        print self.appname, self.version, self.created\r\n        return \"%s DB v.%d created %s\" % (self.appname, self.version, self.created)\r\n\r\n\r\ntables = Base.metadata.tables\r\n\"\"\":type: dict from str to Table\"\"\"\r\n\r\n\r\ndef _enum_tables_of(base):\r\n    \"\"\":rtype: __generator[Generic]\"\"\"\r\n    for table_name in tables.keys():\r\n        table_class = globals().get(table_name, None)\r\n        if table_class is not None and issubclass(table_class, base):\r\n            yield table_class\r\n\r\n\r\nstandard_tables = list(_enum_tables_of(StandardObject))\r\nplugin_tables = list(_enum_tables_of(PluginObject))\r\n\r\n\r\ndef get_table_by_plugin(plugin):\r\n    # noinspection PyUnresolvedReferences\r\n    _tables = [table for table in plugin_tables if table.cpi.plugin_id == plugin.type]\r\n    if not _tables:\r\n        raise KeyError(\"Plugin table not found\")\r\n    elif len(_tables) > 1:\r\n        raise RuntimeError(\"Tables count to one plugin must be == 1\")\r\n    return _tables[0]"
  },
  {
    "path": "OptolithiumGui/database/settings.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\n__author__ = 'Alexei Gladkikh'\n\n\nclass DummyProvider(object):\n\n    def __init__(self, *args, **kwargs):\n        pass\n\n    def emit(self, *args, **kwargs):\n        pass\n\n    def connect(self, *args, **kwargs):\n        pass\n\n\ntry:\n    from qt import Signal, QtCore\n    _GUI_PROVIDER_OBJECT = QtCore.QObject\n    _GUI_PROVIDER_SIGNAL = Signal\nexcept ImportError:\n    Signal = None\n    QObject = None\n    _GUI_PROVIDER_OBJECT = DummyProvider\n    _GUI_PROVIDER_SIGNAL = DummyProvider\n\n\ndef set_gui_provider(object_class, signal_class):\n    global _GUI_PROVIDER_OBJECT, _GUI_PROVIDER_SIGNAL\n    _GUI_PROVIDER_OBJECT = object_class\n    _GUI_PROVIDER_SIGNAL = signal_class\n\n\ndef get_gui_provider_object():\n    return _GUI_PROVIDER_OBJECT\n\n\ndef get_gui_provider_signal():\n    return _GUI_PROVIDER_SIGNAL\n"
  },
  {
    "path": "OptolithiumGui/helpers.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport abc\nimport os\nimport subprocess\nimport threading\nimport traceback\nimport functools\nfrom Queue import Queue as StandardQueue\nfrom Queue import Empty as QueueEmpty\nimport logging as module_logging\nimport sys\nimport itertools\n\n\n__author__ = 'Alexei Gladkikh'\n\n\n# noinspection PyPep8Naming\ndef enableLoggersForHelperModule():\n    \"\"\"\n    This function will be called after definition of enableStreamLogHandler and\n    enableFileLogHandler. Use it to enable required logger handlers.\n    \"\"\"\n    logStreamEnable(logging)\n\n\n# --------------------------------------------------------------------------------------------------\n\n\n# noinspection PyPep8Naming\ndef GetFilename(path):\n    \"\"\"\n    Return file name without extension from input path\n\n    :type path: str\n    \"\"\"\n    basename = os.path.basename(path)\n    return os.path.splitext(basename)[0]\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.INFO)\nfdevnull = open(os.devnull, 'w')\n\n\n# noinspection PyPep8Naming\ndef Cast(value, type, default=None):\n    \"\"\"\n    Cast(value, type[, default]) -> value\n\n    Try to cast value to specified type. If conversion can't be performed return default value.\n    \"\"\"\n    try:\n        return type(value)\n    except ValueError:\n        if default is None:\n            return default\n        return type(default)\n\n\n# noinspection PyPep8Naming\ndef StaticVariable(varname, value):\n    def decorate(func):\n        setattr(func, varname, value)\n        return func\n    return decorate\n\n\n# noinspection PyPep8Naming\ndef Singleton(cls):\n    \"\"\"\n    Decorate specified class to make it correspond to singleton pattern.\n\n    WARNING: In inheritance a class that also decorated by mean of this Singleton decorator\n    you have to use old-style parent constructor, for example threading.Thread.__init__(self),\n    otherwise TypeError exception occurred.\n\n    :param cls: Decorated as singleton class\n    :type cls: class\n    :return: types.FunctionType\n    \"\"\"\n\n    # Static variable\n    instances = {}\n\n    def getInstance(*args, **kwargs):\n        if cls not in instances:\n            instances[cls] = cls(*args, **kwargs)\n        return instances[cls]\n\n    return getInstance\n\n\n# noinspection PyPep8Naming\n@StaticVariable(\"handler\", None)\n@StaticVariable(\"loggers\", [])\ndef logStreamEnable(logger):\n    \"\"\"\n    Set format and enable stream logging for specified logger.\n\n    :type logger: logging.Logger\n    \"\"\"\n\n    if logger not in logStreamEnable.loggers:\n        # Lazy handler initialization\n        if logStreamEnable.handler is None:\n            log_hdlr = module_logging.StreamHandler(sys.stdout)\n            formatter = module_logging.Formatter(\"%(levelname)-8s %(module)-12s\"\n                                                 \"[%(funcName)-18s:%(lineno)-4d]# %(message)s\")\n            log_hdlr.setFormatter(formatter)\n            logStreamEnable.handler = log_hdlr\n\n        logger.addHandler(logStreamEnable.handler)\n        logStreamEnable.loggers.append(logger)\n        logging.debug(\"Stream log handler enabled for logger %s\" % logger.name)\n    else:\n        logging.warning(\"Stream log handler already enabled for logger %s\" % logger.name)\n\n\n# This function must be defined at the head of helper module\n# where required logger must be initialized by mean of\n# enableStreamLogHandler and/or enableFileLogHandler\nenableLoggersForHelperModule()\n\n\n# noinspection PyPep8Naming\nclass classproperty(property):\n    # noinspection PyMethodOverriding\n    def __get__(self, cls, owner):\n        return classmethod(self.fget).__get__(None, owner)()\n\n\n# --------------------------------------------------------------------------------------------------\n\n\ndef enum(*sequential, **named):\n    \"\"\"\n    Create enumeration object with reverse dictionary property.\n\n    Python 2.7 enumeration support (PEP 435).\n\n    E = enum(\"ONE\", \"TWO\")\n    print(E.ONE, E.TWO)\n    -> 0, 1\n    E.reverse_mapping[0] => \"ONE\"\n    E.reverse_mapping[1] => \"TWO\"\n    \"\"\"\n    enums = dict(zip(sequential, range(len(sequential))), **named)\n    reverse = dict((value, key) for key, value in enums.iteritems())\n    enums['reverse_mapping'] = reverse\n    return type('Enum', (), enums)\n\n\n# --------------------------------------------------------------------------------------------------\n\n\ndef pairwise_shift(iterable):\n    \"\"\"s -> (s0,s1), (s2,s3), (s4, s5), ...\"\"\"\n    a = iter(iterable)\n    return itertools.izip(a, a)\n\n\ndef pairwise_all(iterable):\n    \"\"\"s -> (s0,s1), (s1,s2), (s2, s3), ...\"\"\"\n    a, b = itertools.tee(iterable)\n    next(b, None)\n    return itertools.izip(a, b)\n\n\n# --------------------------------------------------------------------------------------------------\n\n\nclass DisposableInterface(object):\n\n    __metaclass__ = abc.ABCMeta\n\n    def __init__(self, *args, **kwargs):\n        pass\n\n    @abc.abstractmethod\n    def dispose(self):\n        pass\n\n\nclass DisposableList(list, DisposableInterface):\n\n    # Caution: type(self) for purposes to use it in the IDAPython. When IDA reload context (after script restart)\n    # ID of previous superclass and current superclass is different, but types are equals.\n\n    # noinspection PyMissingConstructor\n    def __init__(self, *args):\n        super(type(self), self).__init__()\n        for item in args:\n            self.append(item)\n\n    def append(self, p_object):\n        if not isinstance(p_object, DisposableInterface):\n            raise ValueError(\"Item must be inherited from DisposableInterface\")\n        super(type(self), self).append(p_object)\n\n    def extend(self, iterable):\n        if not all([isinstance(item, DisposableInterface) for item in iterable]):\n            raise ValueError(\"All items must be inherited from DisposableInterface\")\n        super(type(self), self).extend(iterable)\n\n    def insert(self, index, p_object):\n        if not isinstance(p_object, DisposableInterface):\n            raise ValueError(\"Item must be inherited from DisposableInterface\")\n        super(type(self), self).insert(index, p_object)\n\n    def pop(self, index=None):\n        value = super(type(self), self).pop(index) if index is not None else super(type(self), self).pop()\n        value.dispose()\n        return value\n\n    def remove(self, value):\n        super(type(self), self).remove(value)\n        value.dispose()\n\n    def dispose(self):\n        while self:\n            self.pop()"
  },
  {
    "path": "OptolithiumGui/info.py",
    "content": "__name__ = \"optolithium\"\r\n__version__ = \"0.3.0\""
  },
  {
    "path": "OptolithiumGui/main.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport sys\nimport config\nfrom qt import QtGui, QtCore\nfrom optolithium import MainWindow\nfrom info import __version__\nfrom config import application_style\n\n\n__author__ = 'Alexei Gladkikh'\n\n\ndef main():\n    app = QtGui.QApplication(sys.argv)\n\n    QtCore.QThread.currentThread().setObjectName(\"MainThread\")\n\n    # QtGui.QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps)\n    # noinspection PyCallByClass,PyTypeChecker\n    QtGui.QApplication.setStyle(application_style)\n    QtGui.QApplication.setApplicationName(config.APPLICATION_NAME)\n    QtGui.QApplication.setApplicationVersion(__version__)\n    # noinspection PyUnusedLocal\n    main_window = MainWindow()\n    sys.exit(app.exec_())\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "OptolithiumGui/matplotlibrc",
    "content": "### MATPLOTLIBRC FORMAT\n\n# This is a sample matplotlib configuration file - you can find a copy\n# of it on your system in\n# site-packages/matplotlib/mpl-data/matplotlibrc.  If you edit it\n# there, please note that it will be overwritten in your next install.\n# If you want to keep a permanent local copy that will not be\n# overwritten, place it in HOME/.matplotlib/matplotlibrc (unix/linux\n# like systems) and C:\\Documents and Settings\\yourname\\.matplotlib\n# (win32 systems).\n#\n# This file is best viewed in a editor which supports python mode\n# syntax highlighting. Blank lines, or lines starting with a comment\n# symbol, are ignored, as are trailing comments.  Other lines must\n# have the format\n#    key : val # optional comment\n#\n# Colors: for the color values below, you can either use - a\n# matplotlib color string, such as r, k, or b - an rgb tuple, such as\n# (1.0, 0.5, 0.0) - a hex string, such as ff00ff or #ff00ff - a scalar\n# grayscale intensity such as 0.75 - a legal html color name, eg red,\n# blue, darkslategray\n\n#### CONFIGURATION BEGINS HERE\n\n# the default backend; one of GTK GTKAgg GTKCairo CocoaAgg FltkAgg\n# MacOSX QtAgg Qt4Agg TkAgg WX WXAgg Agg Cairo GDK PS PDF SVG Template\n# You can also deploy your own backend outside of matplotlib by\n# referring to the module name (which must be in the PYTHONPATH) as\n# 'module://my_backend'\nbackend      : TkAgg\n\n# If you are using the Qt4Agg backend, you can choose here\n# to use the PyQt4 bindings or the newer PySide bindings to\n# the underlying Qt4 toolkit.\n#backend.qt4 : PyQt4        # PyQt4 | PySide\n\n# Note that this can be overridden by the environment variable\n# QT_API used by Enthought Tool Suite (ETS); valid values are\n# \"pyqt\" and \"pyside\".  The \"pyqt\" setting has the side effect of\n# forcing the use of Version 2 API for QString and QVariant.\n\n# if you are running pyplot inside a GUI and your backend choice\n# conflicts, we will automatically try to find a compatible one for\n# you if backend_fallback is True\n#backend_fallback: True\n\n#interactive  : False\n#toolbar      : toolbar2   # None | classic | toolbar2\n#timezone     : UTC        # a pytz timezone string, eg US/Central or Europe/Paris\n\n# Where your matplotlib data lives if you installed to a non-default\n# location.  This is where the matplotlib fonts, bitmaps, etc reside\n#datapath : /home/jdhunter/mpldata\n\n\n### LINES\n# See http://matplotlib.sourceforge.net/api/artist_api.html#module-matplotlib.lines for more\n# information on line properties.\n#lines.linewidth   : 1.0     # line width in points\n#lines.linestyle   : -       # solid line\n#lines.color       : blue\n#lines.marker      : None    # the default marker\n#lines.markeredgewidth  : 0.5     # the line width around the marker symbol\n#lines.markersize  : 6            # markersize, in points\n#lines.dash_joinstyle : miter        # miter|round|bevel\n#lines.dash_capstyle : butt          # butt|round|projecting\n#lines.solid_joinstyle : miter       # miter|round|bevel\n#lines.solid_capstyle : projecting   # butt|round|projecting\n#lines.antialiased : True         # render lines in antialised (no jaggies)\n\n### PATCHES\n# Patches are graphical objects that fill 2D space, like polygons or\n# circles.  See\n# http://matplotlib.sourceforge.net/api/artist_api.html#module-matplotlib.patches\n# information on patch properties\n#patch.linewidth        : 1.0     # edge width in points\n#patch.facecolor        : blue\n#patch.edgecolor        : black\n#patch.antialiased      : True    # render patches in antialised (no jaggies)\n\n### FONT\n#\n# font properties used by text.Text.  See\n# http://matplotlib.sourceforge.net/api/font_manager_api.html for more\n# information on font properties.  The 6 font properties used for font\n# matching are given below with their default values.\n#\n# The font.family property has five values: 'serif' (e.g. Times),\n# 'sans-serif' (e.g. Helvetica), 'cursive' (e.g. Zapf-Chancery),\n# 'fantasy' (e.g. Western), and 'monospace' (e.g. Courier).  Each of\n# these font families has a default list of font names in decreasing\n# order of priority associated with them.\n#\n# The font.style property has three values: normal (or roman), italic\n# or oblique.  The oblique style will be used for italic, if it is not\n# present.\n#\n# The font.variant property has two values: normal or small-caps.  For\n# TrueType fonts, which are scalable fonts, small-caps is equivalent\n# to using a font size of 'smaller', or about 83% of the current font\n# size.\n#\n# The font.weight property has effectively 13 values: normal, bold,\n# bolder, lighter, 100, 200, 300, ..., 900.  Normal is the same as\n# 400, and bold is 700.  bolder and lighter are relative values with\n# respect to the current weight.\n#\n# The font.stretch property has 11 values: ultra-condensed,\n# extra-condensed, condensed, semi-condensed, normal, semi-expanded,\n# expanded, extra-expanded, ultra-expanded, wider, and narrower.  This\n# property is not currently implemented.\n#\n# The font.size property is the default font size for text, given in pts.\n# 12pt is the standard value.\n#\n#font.family         : sans-serif\n#font.style          : normal\n#font.variant        : normal\n#font.weight         : medium\n#font.stretch        : normal\n# note that font.size controls default text sizes.  To configure\n# special text sizes tick labels, axes, labels, title, etc, see the rc\n# settings for axes and ticks. Special text sizes can be defined\n# relative to font.size, using the following values: xx-small, x-small,\n# small, medium, large, x-large, xx-large, larger, or smaller\n#font.size           : 12.0\n#font.serif          : Bitstream Vera Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif\n#font.sans-serif     : Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif\n#font.cursive        : Apple Chancery, Textile, Zapf Chancery, Sand, cursive\n#font.fantasy        : Comic Sans MS, Chicago, Charcoal, Impact, Western, fantasy\n#font.monospace      : Bitstream Vera Sans Mono, Andale Mono, Nimbus Mono L, Courier New, Courier, Fixed, Terminal, monospace\n\n### TEXT\n# text properties used by text.Text.  See\n# http://matplotlib.sourceforge.net/api/artist_api.html#module-matplotlib.text for more\n# information on text properties\n\n#text.color          : black\n\n### LaTeX customizations. See http://www.scipy.org/Wiki/Cookbook/Matplotlib/UsingTex\n#text.usetex         : False  # use latex for all text handling. The following fonts\n                              # are supported through the usual rc parameter settings:\n                              # new century schoolbook, bookman, times, palatino,\n                              # zapf chancery, charter, serif, sans-serif, helvetica,\n                              # avant garde, courier, monospace, computer modern roman,\n                              # computer modern sans serif, computer modern typewriter\n                              # If another font is desired which can loaded using the\n                              # LaTeX \\usepackage command, please inquire at the\n                              # matplotlib mailing list\n#text.latex.unicode : False # use \"ucs\" and \"inputenc\" LaTeX packages for handling\n                            # unicode strings.\n#text.latex.preamble :  # IMPROPER USE OF THIS FEATURE WILL LEAD TO LATEX FAILURES\n                            # AND IS THEREFORE UNSUPPORTED. PLEASE DO NOT ASK FOR HELP\n                            # IF THIS FEATURE DOES NOT DO WHAT YOU EXPECT IT TO.\n                            # preamble is a comma separated list of LaTeX statements\n                            # that are included in the LaTeX document preamble.\n                            # An example:\n                            # text.latex.preamble : \\usepackage{bm},\\usepackage{euler}\n                            # The following packages are always loaded with usetex, so\n                            # beware of package collisions: color, geometry, graphicx,\n                            # type1cm, textcomp. Adobe Postscript (PSSNFS) font packages\n                            # may also be loaded, depending on your font settings\n\n#text.dvipnghack : None      # some versions of dvipng don't handle alpha\n                             # channel properly.  Use True to correct\n                             # and flush ~/.matplotlib/tex.cache\n                             # before testing and False to force\n                             # correction off.  None will try and\n                             # guess based on your dvipng version\n\n#text.hinting : True # If True, text will be hinted, otherwise not.  This only\n                     # affects the Agg backend.\n\n#text.antialiased : True # If True (default), the text will be antialiased.\n                         # This only affects the Agg backend.\n\n# The following settings allow you to select the fonts in math mode.\n# They map from a TeX font name to a fontconfig font pattern.\n# These settings are only used if mathtext.fontset is 'custom'.\n# Note that this \"custom\" mode is unsupported and may go away in the\n# future.\n#mathtext.cal : cursive\n#mathtext.rm  : serif\n#mathtext.tt  : monospace\n#mathtext.it  : serif:italic\n#mathtext.bf  : serif:bold\n#mathtext.sf  : sans\n#mathtext.fontset : cm # Should be 'cm' (Computer Modern), 'stix',\n                       # 'stixsans' or 'custom'\n#mathtext.fallback_to_cm : True  # When True, use symbols from the Computer Modern\n                                 # fonts when a symbol can not be found in one of\n                                 # the custom math fonts.\n\n#mathtext.default : it # The default font to use for math.\n                       # Can be any of the LaTeX font names, including\n                       # the special name \"regular\" for the same font\n                       # used in regular text.\n\n### AXES\n# default face and edge color, default tick sizes,\n# default fontsizes for ticklabels, and so on.  See\n# http://matplotlib.sourceforge.net/api/axes_api.html#module-matplotlib.axes\n#axes.hold           : True    # whether to clear the axes by default on\n#axes.facecolor      : white   # axes background color\n#axes.edgecolor      : black   # axes edge color\n#axes.linewidth      : 1.0     # edge linewidth\n#axes.grid           : False   # display grid or not\n#axes.titlesize      : large   # fontsize of the axes title\n#axes.labelsize      : medium  # fontsize of the x any y labels\n#axes.labelweight    : normal  # weight of the x and y labels\n#axes.labelcolor     : black\n#axes.axisbelow      : False   # whether axis gridlines and ticks are below\n                              # the axes elements (lines, text, etc)\n#axes.formatter.limits : -7, 7 # use scientific notation if log10\n                               # of the axis range is smaller than the\n                               # first or larger than the second\n#axes.formatter.use_locale : False # When True, format tick labels\n                                   # according to the user's locale.\n                                   # For example, use ',' as a decimal\n                                   # separator in the fr_FR locale.\n#axes.unicode_minus  : True    # use unicode for the minus symbol\n                               # rather than hyphen.  See\n                               # http://en.wikipedia.org/wiki/Plus_and_minus_signs#Character_codes\n#axes.color_cycle    : b, g, r, c, m, y, k  # color cycle for plot lines\n                                            # as list of string colorspecs:\n                                            # single letter, long name, or\n                                            # web-style hex\n\n#polaraxes.grid      : True    # display grid on polar axes\n#axes3d.grid         : True    # display grid on 3d axes\n\n### TICKS\n# see http://matplotlib.sourceforge.net/api/axis_api.html#matplotlib.axis.Tick\n#xtick.major.size     : 4      # major tick size in points\n#xtick.minor.size     : 2      # minor tick size in points\n#xtick.major.width    : 0.5    # major tick width in points\n#xtick.minor.width    : 0.5    # minor tick width in points\n#xtick.major.pad      : 4      # distance to major tick label in points\n#xtick.minor.pad      : 4      # distance to the minor tick label in points\n#xtick.color          : k      # color of the tick labels\n#xtick.labelsize      : medium # fontsize of the tick labels\n#xtick.direction      : in     # direction: in or out\n\n#ytick.major.size     : 4      # major tick size in points\n#ytick.minor.size     : 2      # minor tick size in points\n#ytick.major.width    : 0.5    # major tick width in points\n#ytick.minor.width    : 0.5    # minor tick width in points\n#ytick.major.pad      : 4      # distance to major tick label in points\n#ytick.minor.pad      : 4      # distance to the minor tick label in points\n#ytick.color          : k      # color of the tick labels\n#ytick.labelsize      : medium # fontsize of the tick labels\n#ytick.direction      : in     # direction: in or out\n\n\n### GRIDS\n#grid.color       :   black   # grid color\n#grid.linestyle   :   :       # dotted\n#grid.linewidth   :   0.5     # in points\n\n### Legend\n#legend.fancybox      : False  # if True, use a rounded box for the\n                               # legend, else a rectangle\n#legend.isaxes        : True\n#legend.numpoints     : 2      # the number of points in the legend line\n#legend.fontsize      : large\n#legend.pad           : 0.0    # deprecated; the fractional whitespace inside the legend border\n#legend.borderpad     : 0.5    # border whitespace in fontsize units\n#legend.markerscale   : 1.0    # the relative size of legend markers vs. original\n# the following dimensions are in axes coords\n#legend.labelsep      : 0.010  # deprecated; the vertical space between the legend entries\n#legend.labelspacing  : 0.5    # the vertical space between the legend entries in fraction of fontsize\n#legend.handlelen     : 0.05   # deprecated; the length of the legend lines\n#legend.handlelength  : 2.     # the length of the legend lines in fraction of fontsize\n#legend.handleheight  : 0.7     # the height of the legend handle in fraction of fontsize\n#legend.handletextsep : 0.02   # deprecated; the space between the legend line and legend text\n#legend.handletextpad : 0.8    # the space between the legend line and legend text in fraction of fontsize\n#legend.axespad       : 0.02   # deprecated; the border between the axes and legend edge\n#legend.borderaxespad : 0.5   # the border between the axes and legend edge in fraction of fontsize\n#legend.columnspacing : 2.    # the border between the axes and legend edge in fraction of fontsize\n#legend.shadow        : False\n#legend.frameon       : True   # whether or not to draw a frame around legend\n\n### FIGURE\n# See http://matplotlib.sourceforge.net/api/figure_api.html#matplotlib.figure.Figure\n#figure.figsize   : 8, 6    # figure size in inches\n#figure.dpi       : 80      # figure dots per inch\n#figure.facecolor : 0.75    # figure facecolor; 0.75 is scalar gray\n#figure.edgecolor : white   # figure edgecolor\n\n# The figure subplot parameters.  All dimensions are a fraction of the\n# figure width or height\n#figure.subplot.left    : 0.125  # the left side of the subplots of the figure\n#figure.subplot.right   : 0.9    # the right side of the subplots of the figure\n#figure.subplot.bottom  : 0.1    # the bottom of the subplots of the figure\n#figure.subplot.top     : 0.9    # the top of the subplots of the figure\n#figure.subplot.wspace  : 0.2    # the amount of width reserved for blank space between subplots\n#figure.subplot.hspace  : 0.2    # the amount of height reserved for white space between subplots\n\n### IMAGES\n#image.aspect : equal             # equal | auto | a number\n#image.interpolation  : bilinear  # see help(imshow) for options\n#image.cmap   : jet               # gray | jet etc...\n#image.lut    : 256               # the size of the colormap lookup table\n#image.origin : upper             # lower | upper\n#image.resample  : False\n\n### CONTOUR PLOTS\n#contour.negative_linestyle :  dashed # dashed | solid\n\n### Agg rendering\n### Warning: experimental, 2008/10/10\n#agg.path.chunksize : 0           # 0 to disable; values in the range\n                                  # 10000 to 100000 can improve speed slightly\n                                  # and prevent an Agg rendering failure\n                                  # when plotting very large data sets,\n                                  # especially if they are very gappy.\n                                  # It may cause minor artifacts, though.\n                                  # A value of 20000 is probably a good\n                                  # starting point.\n### SAVING FIGURES\n#path.simplify : True   # When True, simplify paths by removing \"invisible\"\n                        # points to reduce file size and increase rendering\n                        # speed\n#path.simplify_threshold : 0.1  # The threshold of similarity below which\n                                # vertices will be removed in the simplification\n                                # process\n#path.snap : True # When True, rectilinear axis-aligned paths will be snapped to\n                  # the nearest pixel when certain criteria are met.  When False,\n                  # paths will never be snapped.\n\n# the default savefig params can be different from the display params\n# Eg, you may want a higher resolution, or to make the figure\n# background white\n#savefig.dpi       : 100      # figure dots per inch\n#savefig.facecolor : white    # figure facecolor when saving\n#savefig.edgecolor : white    # figure edgecolor when saving\n#savefig.extension : auto     # what extension to use for savefig('foo'), or 'auto'\n\n#cairo.format      : png      # png, ps, pdf, svg\n\n# tk backend params\n#tk.window_focus   : False    # Maintain shell focus for TkAgg\n\n# ps backend params\n#ps.papersize      : letter   # auto, letter, legal, ledger, A0-A10, B0-B10\n#ps.useafm         : False    # use of afm fonts, results in small files\n#ps.usedistiller   : False    # can be: None, ghostscript or xpdf\n                                          # Experimental: may produce smaller files.\n                                          # xpdf intended for production of publication quality files,\n                                          # but requires ghostscript, xpdf and ps2eps\n#ps.distiller.res  : 6000      # dpi\n#ps.fonttype       : 3         # Output Type 3 (Type3) or Type 42 (TrueType)\n\n# pdf backend params\n#pdf.compression   : 6 # integer from 0 to 9\n                       # 0 disables compression (good for debugging)\n#pdf.fonttype       : 3         # Output Type 3 (Type3) or Type 42 (TrueType)\n\n# svg backend params\n#svg.image_inline : True       # write raster image data directly into the svg file\n#svg.image_noscale : False     # suppress scaling of raster data embedded in SVG\n#svg.fonttype : 'path'         # How to handle SVG fonts:\n#    'none': Assume fonts are installed on the machine where the SVG will be viewed.\n#    'path': Embed characters as paths -- supported by most SVG renderers\n#    'svgfont': Embed characters as SVG fonts -- supported only by Chrome,\n#               Opera and Safari\n\n# docstring params\n#docstring.hardcopy = False  # set this when you want to generate hardcopy docstring\n\n# Set the verbose flags.  This controls how much information\n# matplotlib gives you at runtime and where it goes.  The verbosity\n# levels are: silent, helpful, debug, debug-annoying.  Any level is\n# inclusive of all the levels below it.  If your setting is \"debug\",\n# you'll get all the debug and helpful messages.  When submitting\n# problems to the mailing-list, please set verbose to \"helpful\" or \"debug\"\n# and paste the output into your report.\n#\n# The \"fileo\" gives the destination for any calls to verbose.report.\n# These objects can a filename, or a filehandle like sys.stdout.\n#\n# You can override the rc default verbosity from the command line by\n# giving the flags --verbose-LEVEL where LEVEL is one of the legal\n# levels, eg --verbose-helpful.\n#\n# You can access the verbose instance in your code\n#   from matplotlib import verbose.\n#verbose.level  : silent      # one of silent, helpful, debug, debug-annoying\n#verbose.fileo  : sys.stdout  # a log filename, sys.stdout or sys.stderr\n\n# Event keys to interact with figures/plots via keyboard.\n# Customize these settings according to your needs.\n# Leave the field(s) empty if you don't need a key-map. (i.e., fullscreen : '')\n\n#keymap.fullscreen : f               # toggling\n#keymap.home : h, r, home            # home or reset mnemonic\n#keymap.back : left, c, backspace    # forward / backward keys to enable\n#keymap.forward : right, v           #   left handed quick navigation\n#keymap.pan : p                      # pan mnemonic\n#keymap.zoom : o                     # zoom mnemonic\n#keymap.save : s                     # saving current figure\n#keymap.grid : g                     # switching on/off a grid in current axes\n#keymap.yscale : l                   # toggle scaling of y-axes ('log'/'linear')\n#keymap.xscale : L, k                # toggle scaling of x-axes ('log'/'linear')\n#keymap.all_axes : a                 # enable all axes\n\n# Control downloading of example data. Various examples download some\n# data from the Matplotlib git repository to avoid distributing extra\n# files, but sometimes you want to avoid that. In that case set\n# examples.download to False and examples.directory to the directory\n# where you have a checkout of https://github.com/matplotlib/sample_data\n\n# examples.download : False  # False to bypass downloading mechanism\n# examples.directory : '/usr/share/matplotlib/sampledata'   # absolute directory to look in if download is false\n"
  },
  {
    "path": "OptolithiumGui/metrics.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport logging as module_logging\n\nfrom numpy import NaN, rot90, mean, abs, interp, asfortranarray, where, squeeze, \\\n    degrees, arctan, sin, cos, array, ones, vstack, dot, diff, average\nfrom numpy import max as amax\nfrom numpy import min as amin\nfrom numpy.linalg import lstsq\n\nimport optolithiumc as oplc\n\n# noinspection PyUnresolvedReferences\nimport helpers\nimport abc\n\n\n__author__ = 'Alexei Gladkikh'\n\n\n# Quirk for forward compatibility\ntry:\n    oplc.Edge2d\n    oplc.Point2d\nexcept NameError:\n    oplc.Edge2d = oplc.Edge\n    oplc.Edge2d.cross_type = oplc.Edge.cross\n    oplc.Point2d = oplc.Point\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.DEBUG)\nhelpers.logStreamEnable(logging)\n\n\nMASK_CLEAR = \"clear\"\nMASK_OPAQUE = \"opaque\"\n\nIMAGE_NEGATIVE = \"negative\"\nIMAGE_POSITIVE = \"positive\"\n\nVARIATE_HEIGHT_TRUE = \"Yes\"\nVARIATE_HEIGHT_FALSE = \"No\"\n\n\ndef _get_target_mask(mask):\n    left = right = None\n    for region in mask.container.regions:\n        x_direct, y_direct = [], []\n        for point in region.points:\n            if point.y == 0:\n                x_direct.append(point.x)\n            if point.x == 0:\n                y_direct.append(point.y)\n        if len(x_direct) == len(region.points):\n            axis_direct = x_direct\n        elif len(y_direct) == len(region.points):\n            axis_direct = y_direct\n        for x in axis_direct:\n            if (left is None and x < 0) or 0 > x > left:\n                left = x\n            if (right is None and x > 0) or 0 < x < right:\n                right = x\n    return left, right\n\n\ndef _is_mask_negative(mask):\n    center_transmit, left_transmit, right_transmit = _get_mask_type(mask)\n    side_transmit = mean([left_transmit, right_transmit])\n    background = mask.container.background\n    if center_transmit >= side_transmit:\n        tonality = MASK_CLEAR\n    else:\n        tonality = MASK_OPAQUE\n    if tonality is None:\n        is_mask_negative = True if background == 0.0 else False\n    else:\n        is_mask_negative = {MASK_CLEAR: True, MASK_OPAQUE: False}[tonality]\n    return is_mask_negative\n\n\ndef contour_sign(mask, **kwargs):\n    image_tonality = kwargs.get(\"image_tonality\")\n    is_image_negative = {IMAGE_NEGATIVE: True, IMAGE_POSITIVE: False}[image_tonality]\n    return not is_image_negative\n\n\ndef _get_mask_type(mask):\n    left, right = _get_target_mask(mask)\n    center_transmit, left_transmit, right_transmit = -1, -1, -1\n    for region in mask.container.regions:\n        has_left, has_right = False, False\n        for point in region.points:\n            if point.x == left:\n                has_left = True\n            if point.x == right:\n                has_right = True\n        if has_left and has_right:\n            center_transmit = region.transmittance\n            side_transmit = mask.container.background\n            return center_transmit, side_transmit, side_transmit\n        if has_left and not has_right:\n            center_transmit = mask.container.background\n            left_transmit = region.transmittance\n        if not has_left and has_right:\n            center_transmit = mask.container.background\n            right_transmit = region.transmittance\n    return center_transmit, left_transmit, right_transmit\n\n\nclass MetricNotImplementedError(Exception):\n    pass\n\n\nclass MetrologyInterface(object):\n\n    __metaclass__ = abc.ABCMeta\n\n    def __calculate_1d_wrap(self, sim_data, **kwargs):\n        \"\"\":type sim_data: oplc.ResistVolume\"\"\"\n        if sim_data.has_x:\n            x, values = sim_data.x, sim_data.values[0, :, 0]\n        else:\n            x, values = sim_data.y, sim_data.values[:, 0, 0]\n        return self._calculate_1d(x, values, **kwargs)\n\n    def __calculate_2d_wrap(self, sim_data, **kwargs):\n        \"\"\":type sim_data: oplc.ResistVolume\"\"\"\n        if sim_data.has_x:\n            x, z, values = sim_data.x, sim_data.z, sim_data.values[0, :, :]\n        else:\n            x, z, values = sim_data.y, sim_data.z, sim_data.values[:, 0, :]\n        return self._calculate_2d(x, z, rot90(values), **kwargs)\n\n    def _calculate_1d(self, x, values, **kwargs):\n        raise MetricNotImplementedError\n\n    def _calculate_xy(self, sim_data, **kwargs):\n        raise MetricNotImplementedError\n\n    def _calculate_2d(self, x, z, values, **kwargs):\n        raise MetricNotImplementedError\n\n    def _calculate_3d(self, sim_data, **kwargs):\n        raise MetricNotImplementedError\n\n    def _calculate_profile(self, profile, **kwargs):\n        raise MetricNotImplementedError\n\n    def _calculate_common(self, sim_data, **kwargs):\n        raise MetricNotImplementedError\n\n    def __init__(self, stage):\n        self.__stage = stage\n        self.__routines = {\n            oplc.X_1D: self.__calculate_1d_wrap,\n            oplc.Y_1D: self.__calculate_1d_wrap,\n            oplc.XY_2D: self._calculate_xy,\n            oplc.XZ_2D: self.__calculate_2d_wrap,\n            oplc.YZ_2D: self.__calculate_2d_wrap,\n            oplc.XYZ_3D: self._calculate_3d\n        }\n\n    @property\n    def options(self):\n        return self.__stage.options\n\n    @property\n    def stage(self):\n        return self.__stage\n\n    @abc.abstractproperty\n    def caption(self):\n        pass\n\n    @abc.abstractproperty\n    def format(self):\n        pass\n\n    def __call__(self, sim_data, **kwargs):\n        \"\"\":type sim_data: oplc.AbstractResistSimulations\"\"\"\n        if isinstance(sim_data, dict):\n            return self._calculate_common(sim_data, **kwargs)\n        elif sim_data.type == oplc.RESIST_VOLUME:\n            callback = self.__routines[sim_data.axes]\n            return callback(sim_data, **kwargs)\n        elif sim_data.type == oplc.RESIST_PROFILE:\n            return self._calculate_profile(sim_data, **kwargs)\n        else:\n            raise RuntimeError(\"Unknown simulation data type\")\n\n\ndef _image_values_at_height(x, z, values, **kwargs):\n    height = kwargs.get(\"height\")\n    absolute_height = max(z) * height / 100.0\n    qx = asfortranarray(x)\n    f = oplc.LinearInterpolation2d(qx, asfortranarray(z), asfortranarray(values))\n    return squeeze(f.interpolate(qx, asfortranarray(absolute_height)))\n\n\nclass Average(MetrologyInterface):\n\n    caption = property(lambda self: \"Average\")\n    format = property(lambda self: \"%.3f\")\n\n    def _calculate_1d(self, x, values, **kwargs):\n        return mean(values)\n\n    def _calculate_2d(self, x, z, values, **kwargs):\n        return mean(_image_values_at_height(x, z, values, **kwargs))\n\n\ndef _calculate_lstsq(polygons, is_left=True):\n    s = 1 if is_left else -1\n    for polygon in polygons:\n        if not(all([edge.org.x > 0 for edge in polygon]) or all([edge.org.x < 0 for edge in polygon])):\n            avg_x = average([min(edge.org.x for edge in polygon), max(edge.org.x for edge in polygon)])\n            sw_x = [edge.org.y for edge in polygon if s * (edge.org.x - avg_x) < 0]\n            sw_y = [edge.org.x for edge in polygon if s * (edge.org.x - avg_x) < 0]\n            sw_x_matrix = vstack([sw_x, ones(len(sw_x))]).T\n            a, b = lstsq(sw_x_matrix, sw_y)[0]\n            return a, b\n    raise LookupError\n\n\ndef _calculate_lstsq_v2(polygons):\n    nxor = lambda a, b: a and b or not a and not b\n    found = False\n    a, b = 0.0, 0.0\n    for polygon in polygons:\n        _do_lstsq = False\n        if all([edge.org.x < 0 for edge in polygon]):\n            start_point = max([edge.org.x for edge in polygon if edge.org.y == 0])\n            max_y = 0.9 * max(edge.org.y for edge in polygon)\n            angle_new = 0.0\n            _to_left = True\n            i = 0\n            sw_x, sw_y = [], []\n            for edge in reversed(polygon):\n                if _do_lstsq and edge.org.y != 0 and edge.org.y >= old_edge.org.y:\n                    angle_old = angle_new\n                    angle_new = (edge.org.x - start_point)/edge.org.y\n                    sw_x.append(edge.org.y)\n                    sw_y.append(edge.org.x)\n                    if nxor(_to_left, angle_new > angle_old):\n                        end_sw_x = sw_x[:]\n                        end_sw_y = sw_y[:]\n                        _to_left = not _to_left\n                        i += 1\n                elif edge.org.y == 0.0 and edge.org.x == start_point:\n                    _do_lstsq = True\n                    old_edge = edge\n                elif edge.org.y < old_edge.org.y and edge.org.y != 0:\n                    end_sw_x = sw_x[:]\n                    end_sw_y = sw_y[:]\n                    break\n            if i < 3:\n                _do_lstsq = False\n                for edge in reversed(polygon):\n                    if _do_lstsq and edge.org.y != 0 and edge.org.y <= max_y:\n                        end_sw_x.append(edge.org.y)\n                        end_sw_y.append(edge.org.x)\n                    elif edge.org.y == 0.0 and edge.org.x == start_point:\n                        _do_lstsq = True\n            sw_x_matrix = vstack([end_sw_x, ones(len(end_sw_x))]).T\n            found = True\n            a, b = lstsq(sw_x_matrix, end_sw_y)[0]\n    if not found:\n        raise LookupError\n    return a, b\n\n\nclass SidewallAngle(MetrologyInterface):\n\n    caption = property(lambda self: \"Sidewall Angle Avg. (deg.)\")\n    format = property(lambda self: \"%.1f\")\n\n    @staticmethod\n    def _calculate_sidewall_angle(polygons):\n        a_left, _ = _calculate_lstsq(polygons, is_left=True)\n        a_right, _ = _calculate_lstsq(polygons, is_left=False)\n        sa_left = 90.0 - abs(degrees(arctan(a_left)))\n        sa_right = 90.0 - abs(degrees(arctan(a_right)))\n        return mean([sa_left, sa_right])\n\n    @staticmethod\n    def _calculate_sidewall_angle_v2(polygons):\n        a, _ = _calculate_lstsq_v2(polygons)\n        return 90.0 - abs(degrees(arctan(a)))\n\n    def _calculate_2d(self, x, z, values, **kwargs):\n        level = kwargs.get(\"level\")\n        negative = contour_sign(self.options.mask, **kwargs)\n        polygons = oplc.contours(asfortranarray(x), asfortranarray(z), asfortranarray(values), level, negative)\n        try:\n            if _is_mask_negative(self.options.mask):\n                return SidewallAngle._calculate_sidewall_angle_v2(polygons)\n            else:\n                return SidewallAngle._calculate_sidewall_angle(polygons)\n        except LookupError:\n            return NaN\n\n    def _calculate_profile(self, profile, **kwargs):\n        try:\n            if _is_mask_negative(self.options.mask):\n                return SidewallAngle._calculate_sidewall_angle_v2(profile.polygons)\n            else:\n                return SidewallAngle._calculate_sidewall_angle(profile.polygons)\n        except LookupError:\n            return NaN\n\n\nclass StandingWaveAmpl(MetrologyInterface):\n\n    caption = property(lambda self: \"SW Amplitude Avg. (nm)\")\n    format = property(lambda self: \"%.3f\")\n\n    @staticmethod\n    def _calculate_swamp(polygons, is_left=True):\n        a, b = _calculate_lstsq(polygons, is_left)\n        s = 1 if is_left else -1\n        rotate_matrix = array([[cos(arctan(a)), -sin(arctan(a))], [sin(arctan(a)), cos(arctan(a))]])\n        for polygon in polygons:\n            if not(all([edge.org.x > 0 for edge in polygon]) or all([edge.org.x < 0 for edge in polygon])):\n                sw_points = []\n                for edge in polygon:\n                    if s * edge.org.x < 0:\n                        old_point = array([edge.org.y, edge.org.x])\n                        new_point = dot(old_point, rotate_matrix) - [0, b]\n                        sw_points.append(new_point[1])\n                sw_points = array(sw_points)\n                # Getting average of absolute maximum values of resist profile edge (standing wave curve)\n                # by mean of derivative analysis\n                d = diff(sw_points)\n                result = average(abs([sw_points[k+1] for k, (cur, nxt) in enumerate(zip(d, d[1:])) if cur*nxt < 0]))\n                return result\n        raise LookupError\n\n    @staticmethod\n    def _calculate_swamp_v2(polygons):\n        a, b = _calculate_lstsq_v2(polygons)\n        rotate_matrix = array([[cos(arctan(a)), -sin(arctan(a))], [sin(arctan(a)), cos(arctan(a))]])\n        for polygon in polygons:\n            _do_lstsq = False\n            if all([edge.org.x < 0 for edge in polygon]):\n                sw_points = []\n                start_point = max([edge.org.x for edge in polygon if edge.org.y == 0])\n                for edge in reversed(polygon):\n                    if _do_lstsq and edge.org.y != 0 and edge.org.y >= old_edge.org.y:\n                        old_point = array([edge.org.y, edge.org.x])\n                        new_point = dot(old_point, rotate_matrix) - [0, b]\n                        sw_points.append(new_point[1])\n                    elif edge.org.y == 0.0 and edge.org.x == start_point:\n                        _do_lstsq = True\n                        old_edge = edge\n                sw_points = array(sw_points)\n                # Getting average of absolute maximum values of resist profile edge (standing wave curve)\n                # by mean of derivative analysis\n                d = diff(sw_points)\n                result = average(abs([sw_points[k+1] for k, (cur, nxt) in enumerate(zip(d, d[1:])) if cur*nxt < 0]))\n                return result\n        raise LookupError\n\n    def _calculate_2d(self, x, z, values, **kwargs):\n        level = kwargs.get(\"level\")\n        negative = contour_sign(self.options.mask, **kwargs)\n        # center_transmit, left_transmit, right_transmit = _get_mask_type(self.options.mask)\n        polygons = oplc.contours(asfortranarray(x), asfortranarray(z), asfortranarray(values), level, negative)\n        try:\n            if _is_mask_negative(self.options.mask):\n                return StandingWaveAmpl._calculate_swamp_v2(polygons)\n            else:\n                swamp_left = StandingWaveAmpl._calculate_swamp(polygons, is_left=True)\n                swamp_right = StandingWaveAmpl._calculate_swamp(polygons, is_left=False)\n                return mean([swamp_left, swamp_right])\n        except LookupError:\n            return NaN\n\n    def _calculate_profile(self, profile, **kwargs):\n        try:\n            if _is_mask_negative(self.options.mask):\n                return StandingWaveAmpl._calculate_swamp_v2(profile.polygons)\n            else:\n                swamp_left = StandingWaveAmpl._calculate_swamp(profile.polygons, is_left=True)\n                swamp_right = StandingWaveAmpl._calculate_swamp(profile.polygons, is_left=False)\n                return mean([swamp_left, swamp_right])\n        except LookupError:\n            return NaN\n\n\nclass Contrast(MetrologyInterface):\n\n    caption = property(lambda self: \"Contrast\")\n    format = property(lambda self: \"%.3f\")\n\n    @staticmethod\n    def __contrast_expr(values):\n        return (amax(values) - amin(values)) / (amax(values) + amin(values))\n\n    def _calculate_1d(self, x, values, **kwargs):\n        return self.__contrast_expr(values)\n\n    def _calculate_2d(self, x, z, values, **kwargs):\n        return self.__contrast_expr(_image_values_at_height(x, z, values, **kwargs))\n\n    def _calculate_xy(self, aerial_image, **kwargs):\n        \"\"\":type aerial_image: oplc.ResistVolume\"\"\"\n        # TODO: Wrong result compare to Prolith\n        return self.__contrast_expr(aerial_image.values)\n\n\nclass ResistMagReflectivity(MetrologyInterface):\n\n    caption = property(lambda self: \"Resist Mag. Reflectivity\")\n    format = property(lambda self: \"%.3f\")\n\n    def _calculate_common(self, sim_data, **kwargs):\n        return sim_data[\"resist_reflectivity\"]\n\n\nclass SubstrateMagReflectivity(MetrologyInterface):\n\n    caption = property(lambda self: \"Substrate Mag. Reflectivity\")\n    format = property(lambda self: \"%.3f\")\n\n    def _calculate_common(self, sim_data, **kwargs):\n        return sim_data[\"substrate_reflectivity\"]\n\n\nclass ResistPhaseReflectivity(MetrologyInterface):\n\n    caption = property(lambda self: \"Resist Phase Reflectivity\")\n    format = property(lambda self: \"%.3f\")\n\n    def _calculate_common(self, sim_data, **kwargs):\n        return sim_data[\"resist_phase\"]\n\n\nclass SubstratePhaseReflectivity(MetrologyInterface):\n\n    caption = property(lambda self: \"Substrate Phase Reflectivity\")\n    format = property(lambda self: \"%.3f\")\n\n    def _calculate_common(self, sim_data, **kwargs):\n        return sim_data[\"substrate_phase\"]\n\n\ndef _calculate_thickness(polygons):\n    if not len(polygons):\n        return NaN\n\n    return max([max(polygon, key=lambda e: e.org.y).org.y for polygon in polygons])\n\n\nclass ResistLoss(MetrologyInterface):\n\n    caption = property(lambda self: \"Resist lost (nm):\")\n    format = property(lambda self: \"%.3f\")\n\n    def _calculate_profile(self, profile, **kwargs):\n        \"\"\":type profile: oplc.ResistProfile\"\"\"\n        return amax(profile.z) - _calculate_thickness(profile.polygons)\n\n\nclass CriticalDimension(MetrologyInterface):\n\n    caption = property(lambda self: \"CD (nm)\")\n    format = property(lambda self: \"%.3f\")\n\n    def _calculate_1d(self, x, values, **kwargs):\n        level = kwargs.get(\"level\")\n        level_edge = oplc.Edge2d(min(x), level, amax(x), level)\n        cross_points = []\n        for k in xrange(len(values)-1):\n            current_edge = oplc.Edge2d(x[k], values[k], x[k+1], values[k+1])\n            if level_edge.cross_type(current_edge) == oplc.SKEW_CROSS:\n                cross_points.append(level_edge.point(current_edge))\n\n        if len(cross_points) != 2:\n            return NaN\n\n        return oplc.Edge2d(cross_points[0], cross_points[1]).length()\n\n    @staticmethod\n    def __calculate_cd(x, z, polygons, **kwargs):\n        height = kwargs.get(\"height\")\n        variate = kwargs.get(\"variate_height\")\n        # tonality = kwargs.get(\"mask_tonality\")\n\n        if variate == VARIATE_HEIGHT_TRUE:\n            thickness = _calculate_thickness(polygons)\n        elif variate == VARIATE_HEIGHT_FALSE or variate is None:\n            thickness = amax(z)\n        else:\n            raise RuntimeError(\"Wrong variate height option: %s\" % variate)\n\n        absolute_height = height * thickness / 100.0\n\n        x_min, x_max = amin(x), amax(x)\n\n        level_edge = oplc.Edge2d(oplc.Point2d(x_min, absolute_height), oplc.Point2d(x_max, absolute_height))\n        # logging.info(\"Level edge: %s\" % level_edge)\n\n        cross_points = set()\n        for polygon in polygons:\n            for edge in polygon:\n                # logging.info(\"Edge: %s\" % edge)\n                if level_edge.cross_type(edge) == oplc.SKEW_CROSS:\n                    point = level_edge.point(edge)\n                    # logging.info(\"=======> Cross point: %s <=======\" % point)\n                    cross_points.add(point.round(3))\n                    # logging.info(\"Current: %s\" % cross_points)\n\n        if not cross_points:\n            return NaN\n\n        # Lookup two points nearest to the center of the given area (because mask feature for 1D mask always centered)\n        xmin1 = min(cross_points, key=lambda p: oplc.Edge2d(p, oplc.Point2d(0.0, p.y)).length())\n        cross_points.remove(xmin1)\n        xmin2 = min(cross_points, key=lambda p: oplc.Edge2d(p, oplc.Point2d(0.0, p.y)).length())\n\n        return oplc.Edge2d(xmin1, xmin2).length()\n\n    def _calculate_2d(self, x, z, values, **kwargs):\n        level = kwargs.get(\"level\")\n        negative = contour_sign(self.options.mask, **kwargs)\n        polygons = oplc.contours(asfortranarray(x), asfortranarray(z), asfortranarray(values), level, negative)\n        return CriticalDimension.__calculate_cd(x, z, polygons, **kwargs)\n\n    def _calculate_profile(self, profile, **kwargs):\n        \"\"\":type profile: oplc.ResistProfile\"\"\"\n\n        if profile.has_x:\n            x = profile.x\n        elif profile.has_y:\n            x = profile.y\n        else:\n            return NaN\n\n        return CriticalDimension.__calculate_cd(x, profile.z, profile.polygons, **kwargs)\n\n\nclass CriticalDimensionAbsoluteError(CriticalDimension):\n\n    caption = property(lambda self: \"CD Error (nm)\")\n    format = property(lambda self: \"%.3f\")\n\n    def _calculate_1d(self, x, values, **kwargs):\n        cd = super(CriticalDimensionAbsoluteError, self)._calculate_1d(x, values, **kwargs)\n        left, right = _get_target_mask(self.options.mask)\n        return cd - (right - left)\n\n    def _calculate_2d(self, x, z, values, **kwargs):\n        cd = super(CriticalDimensionAbsoluteError, self)._calculate_2d(x, z, values, **kwargs)\n        left, right = _get_target_mask(self.options.mask)\n        return cd - (right - left)\n\n    def _calculate_profile(self, profile, **kwargs):\n        cd = super(CriticalDimensionAbsoluteError, self)._calculate_profile(profile, **kwargs)\n        left, right = _get_target_mask(self.options.mask)\n        return cd - (right - left)\n\n\nclass CriticalDimensionRelativeError(CriticalDimension):\n\n    caption = property(lambda self: \"CD Error (%)\")\n    format = property(lambda self: \"%.3f\")\n\n    def _calculate_1d(self, x, values, **kwargs):\n        cd = super(CriticalDimensionRelativeError, self)._calculate_1d(x, values, **kwargs)\n        left, right = _get_target_mask(self.options.mask)\n        target = right - left\n        return float(cd - target)/float(target)*100.0\n\n    def _calculate_2d(self, x, z, values, **kwargs):\n        cd = super(CriticalDimensionRelativeError, self)._calculate_2d(x, z, values, **kwargs)\n        left, right = _get_target_mask(self.options.mask)\n        target = right - left\n        return float(cd - target)/float(target)*100.0\n\n    def _calculate_profile(self, profile, **kwargs):\n        cd = super(CriticalDimensionRelativeError, self)._calculate_profile(profile, **kwargs)\n        left, right = _get_target_mask(self.options.mask)\n        target = right - left\n        return float(cd - target)/float(target)*100.0\n\n\nclass TimeToClear(MetrologyInterface):\n\n    caption = property(lambda self: \"Time to Clear (sec)\")\n    format = property(lambda self: \"%.1f\")\n\n    def _calculate_2d(self, x, z, values, **kwargs):\n        return amin(values[where(z == 0), :])\n\n\nclass Slope(MetrologyInterface):\n\n    caption = property(lambda self: \"Slope Avg. (1/um)\")\n    format = property(lambda self: \"%.3f\")\n\n    @staticmethod\n    def _calc_dvalue(left, right, dx, x, values):\n        v0 = interp([left-dx, right-dx], x, values)\n        v1 = interp([left+dx, right+dx], x, values)\n        return abs(v1 - v0)\n\n    def _calc_slope(self, left, right, x, values):\n        dx = float(self.options.numerics.grid_xy.value)/10.0\n        dv = Slope._calc_dvalue(left, right, dx, x, values)\n        return mean(dv)/2.0/dx*1000.0\n\n    def _calculate_1d(self, x, values, **kwargs):\n        left, right = _get_target_mask(self.options.mask)\n        return self._calc_slope(left, right, x, values)\n\n    def _calculate_2d(self, x, z, values, **kwargs):\n        left, right = _get_target_mask(self.options.mask)\n        return self._calc_slope(left, right, x, _image_values_at_height(x, z, values, **kwargs))\n\n\nclass LogSlope(Slope):\n\n    caption = property(lambda self: \"Log Slope Avg. (1/um)\")\n    format = property(lambda self: \"%.3f\")\n\n    def _calc_logslope(self, left, right, x, values):\n        s = self._calc_slope(left, right, x, values)\n        v = mean(interp([left, right], x, values))\n        return s/v\n\n    def _calculate_1d(self, x, values, **kwargs):\n        left, right = _get_target_mask(self.options.mask)\n        return self._calc_logslope(left, right, x, values)\n\n    def _calculate_2d(self, x, z, values, **kwargs):\n        left, right = _get_target_mask(self.options.mask)\n        return self._calc_logslope(left, right, x, _image_values_at_height(x, z, values, **kwargs))\n\n\nclass NILS(LogSlope):\n\n    caption = property(lambda self: \"NILS (Avg.)\")\n    format = property(lambda self: \"%.3f\")\n\n    def _calc_nils(self, left, right, x, values):\n        s = self._calc_slope(left, right, x, values)\n        v = mean(interp([left, right], x, values)) * 1000.0\n        return s * (right - left) / v\n\n    def _calculate_1d(self, x, values, **kwargs):\n        left, right = _get_target_mask(self.options.mask)\n        return self._calc_nils(left, right, x, values)\n\n    def _calculate_2d(self, x, z, values, **kwargs):\n        left, right = _get_target_mask(self.options.mask)\n        return self._calc_nils(left, right, x, _image_values_at_height(x, z, values, **kwargs))\n\n# _calculate_1d, _calculate_2d\nIMAGE_METRICS = [\n    Average,\n    Contrast,\n    CriticalDimension,\n    CriticalDimensionAbsoluteError,\n    CriticalDimensionRelativeError,\n    Slope,\n    LogSlope,\n    NILS,\n    StandingWaveAmpl\n]\n\n# _calculate_common\nSTANDING_WAVES_METRICS = [\n    ResistMagReflectivity,\n    ResistPhaseReflectivity,\n    SubstrateMagReflectivity,\n    SubstratePhaseReflectivity\n]\n\n# _calculate_2d\nCONTOUR_METRICS = [\n    TimeToClear,\n    CriticalDimension,\n    CriticalDimensionAbsoluteError,\n    CriticalDimensionRelativeError,\n    # SidewallAngle,\n    # StandingWaveAmpl\n]\n\n# _calculate_profile\nPROFILE_METRICS = [\n    CriticalDimension,\n    CriticalDimensionAbsoluteError,\n    CriticalDimensionRelativeError,\n    ResistLoss,\n    SidewallAngle,\n    StandingWaveAmpl\n]"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/cmex10.afm",
    "content": "StartFontMetrics 2.0\nComment Creation Date: Thu Jun 21 22:23:20 1990\nComment UniqueID 5000774\nFontName CMEX10\nEncodingScheme FontSpecific\nFullName CMEX10\nFamilyName Computer Modern\nWeight Medium\nItalicAngle 0\nIsFixedPitch false\nVersion 1.00\nNotice Copyright (c) 1997 American Mathematical Society.  All Rights Reserved.\nComment Computer Modern fonts were designed by Donald E. Knuth\nFontBBox -24 -2960 1454 772\nXHeight 430.556\nComment CapHeight 0\nAscender 750\nComment Descender -1760\nDescender -2960\nComment FontID CMEX\nComment DesignSize 10 (pts)\nComment CharacterCodingScheme TeX math extension\nComment Space 0 0 0 \nComment ExtraSpace 0\nComment Quad 1000\nComment DefaultRuleThickness 40\nComment BigOpSpacing 111.111 166.667 200 600 100\nComment Ascendible characters (74)\t\t% macro  - PS charname\nComment Ascending 0, 16, 18, 32, 48\t\t% (\t - parenleft\nComment Ascending 1, 17, 19, 33, 49\t\t% )\t - parenright\nComment Ascending 2, 104, 20, 34, 50\t\t% [\t - bracketleft\nComment Ascending 3, 105, 21, 35, 51\t\t% ] \t - bracketright\nComment Ascending 4, 106, 22, 36, 52\t\t% lfloor - floorleft\nComment Ascending 5, 107, 23, 37, 53\t\t% rfloor - floorright\nComment Ascending 6, 108, 24, 38, 54\t\t% lceil\t - ceilingleft\nComment Ascending 7, 109, 25, 39, 55\t\t% rceil\t - ceilingright\nComment Ascending 8, 110, 26, 40, 56\t\t% {\t - braceleft\nComment Ascending 9, 111, 27, 41, 57\t\t% }\t - braceright\nComment Ascending 10, 68, 28, 42\t\t% <\t - anglebracketleft\nComment Ascending 11, 69, 29, 43\t\t% >\t - anglebracketright\nComment Ascending 14, 46, 30, 44\t\t% /\t - slash\nComment Ascending 15, 47, 31, 45\t\t% \\\t - backslash\nComment Ascending 70, 71\t\t\t% bigsqcup  - unionsq\nComment Ascending 72, 73\t\t\t% oint\t    - contintegral\nComment Ascending 74, 75\t\t\t% bigodot   - circledot\nComment Ascending 76, 77\t\t\t% bigoplus  - circleplus\nComment Ascending 78, 79\t\t\t% bigotimes - circlemultiply\nComment Ascending 80, 88\t\t\t% sum       - summation\nComment Ascending 81, 89\t\t\t% prod      - product\nComment Ascending 82, 90\t\t\t% int       - integral\nComment Ascending 83, 91\t\t\t% bigcup    - union\nComment Ascending 84, 92\t\t\t% bigcap    - intersection\nComment Ascending 85, 93\t\t\t% biguplus  - unionmulti\nComment Ascending 86, 94\t\t\t% bigwedge  - logicaland\nComment Ascending 87, 95\t\t\t% bigvee    - logicalor\nComment Ascending 96, 97\t\t\t% coprod    - coproduct\nComment Ascending 98, 99, 100\t\t\t% widehat   - hatwide\nComment Ascending 101, 102, 103\t\t\t% widetilde - tildewide\nComment Ascending 112, 113, 114, 115, 116\t% radical   - sqrt\nComment Extensible characters (28)\nComment Extensible 12 top 0 mid 0 bot 0 rep 12\t    % vert   - thin bar\nComment Extensible 13 top 0 mid 0 bot 0 rep 13\t    % Vert   - thin double bar\nComment Extensible 48 top 48 mid 0 bot 64 rep 66    % (      - parenleft\nComment Extensible 49 top 49 mid 0 bot 65 rep 67    % )      - parenright\nComment Extensible 50 top 50 mid 0 bot 52 rep 54    % [      - bracketleft\nComment Extensible 51 top 51 mid 0 bot 53 rep 55    % ]      - bracketright\nComment Extensible 52 top 0 mid 0 bot 52 rep 54\t    % lfloor - floorleft\nComment Extensible 53 top 0 mid 0 bot 53 rep 55\t    % rfloor - floorright\nComment Extensible 54 top 50 mid 0 bot 0 rep 54\t    % lceil  - ceilingleft\nComment Extensible 55 top 51 mid 0 bot 0 rep 55\t    % rceil  - ceilingright\nComment Extensible 56 top 56 mid 60 bot 58 rep 62   % {      - braceleft\nComment Extensible 57 top 57 mid 61 bot 59 rep 62   % }      - braceright\nComment Extensible 58 top 56 mid 0 bot 58 rep 62    % lgroup\nComment Extensible 59 top 57 mid 0 bot 59 rep 62    % rgroup\nComment Extensible 60 top 0 mid 0 bot 0 rep 63\t    % arrowvert\nComment Extensible 61 top 0 mid 0 bot 0 rep 119\t    % Arrowvert\nComment Extensible 62 top 0 mid 0 bot 0 rep 62\t    % bracevert\nComment Extensible 63 top 120 mid 0 bot 121 rep 63  % updownarrow\nComment Extensible 64 top 56 mid 0 bot 59 rep 62    % lmoustache\nComment Extensible 65 top 57 mid 0 bot 58 rep 62    % rmoustache\nComment Extensible 66 top 0 mid 0 bot 0 rep 66\t    % parenleftexten\nComment Extensible 67 top 0 mid 0 bot 0 rep 67\t    % parenrightexten\nComment Extensible 116 top 118 mid 0 bot 116 rep 117\t% radical\nComment Extensible 119 top 126 mid 0 bot 127 rep 119\t% Updownarrow\nComment Extensible 120 top 120 mid 0 bot 0 rep 63\t% uparrow\nComment Extensible 121 top 0 mid 0 bot 121 rep 63\t% downarrow\nComment Extensible 126 top 126 mid 0 bot 0 rep 119\t% Uparrow\nComment Extensible 127 top 0 mid 0 bot 127 rep 119\t% Downarrow\nStartCharMetrics 129\nC 0 ; WX 458.333 ; N parenleftbig ; B 152 -1159 413 40 ; \nC 1 ; WX 458.333 ; N parenrightbig ; B 44 -1159 305 40 ; \nC 2 ; WX 416.667 ; N bracketleftbig ; B 202 -1159 394 40 ; \nC 3 ; WX 416.667 ; N bracketrightbig ; B 22 -1159 214 40 ; \nC 4 ; WX 472.222 ; N floorleftbig ; B 202 -1159 449 40 ; \nC 5 ; WX 472.222 ; N floorrightbig ; B 22 -1159 269 40 ; \nC 6 ; WX 472.222 ; N ceilingleftbig ; B 202 -1159 449 40 ; \nC 7 ; WX 472.222 ; N ceilingrightbig ; B 22 -1159 269 40 ; \nC 8 ; WX 583.333 ; N braceleftbig ; B 113 -1159 469 40 ; \nC 9 ; WX 583.333 ; N bracerightbig ; B 113 -1159 469 40 ; \nC 10 ; WX 472.222 ; N angbracketleftbig ; B 98 -1160 393 40 ; \nC 11 ; WX 472.222 ; N angbracketrightbig ; B 78 -1160 373 40 ; \nC 12 ; WX 333.333 ; N vextendsingle ; B 145 -621 188 21 ; \nC 13 ; WX 555.556 ; N vextenddouble ; B 145 -621 410 21 ; \nC 14 ; WX 577.778 ; N slashbig ; B 56 -1159 521 40 ; \nC 15 ; WX 577.778 ; N backslashbig ; B 56 -1159 521 40 ; \nC 16 ; WX 597.222 ; N parenleftBig ; B 180 -1759 560 40 ; \nC 17 ; WX 597.222 ; N parenrightBig ; B 36 -1759 416 40 ; \nC 18 ; WX 736.111 ; N parenleftbigg ; B 208 -2359 700 40 ; \nC 19 ; WX 736.111 ; N parenrightbigg ; B 35 -2359 527 40 ; \nC 20 ; WX 527.778 ; N bracketleftbigg ; B 250 -2359 513 40 ; \nC 21 ; WX 527.778 ; N bracketrightbigg ; B 14 -2359 277 40 ; \nC 22 ; WX 583.333 ; N floorleftbigg ; B 250 -2359 568 40 ; \nC 23 ; WX 583.333 ; N floorrightbigg ; B 14 -2359 332 40 ; \nC 24 ; WX 583.333 ; N ceilingleftbigg ; B 250 -2359 568 40 ; \nC 25 ; WX 583.333 ; N ceilingrightbigg ; B 14 -2359 332 40 ; \nC 26 ; WX 750 ; N braceleftbigg ; B 131 -2359 618 40 ; \nC 27 ; WX 750 ; N bracerightbigg ; B 131 -2359 618 40 ; \nC 28 ; WX 750 ; N angbracketleftbigg ; B 125 -2359 652 40 ; \nC 29 ; WX 750 ; N angbracketrightbigg ; B 97 -2359 624 40 ; \nC 30 ; WX 1044.44 ; N slashbigg ; B 56 -2359 987 40 ; \nC 31 ; WX 1044.44 ; N backslashbigg ; B 56 -2359 987 40 ; \nC 32 ; WX 791.667 ; N parenleftBigg ; B 236 -2959 757 40 ; \nC 33 ; WX 791.667 ; N parenrightBigg ; B 34 -2959 555 40 ; \nC 34 ; WX 583.333 ; N bracketleftBigg ; B 275 -2959 571 40 ; \nC 35 ; WX 583.333 ; N bracketrightBigg ; B 11 -2959 307 40 ; \nC 36 ; WX 638.889 ; N floorleftBigg ; B 275 -2959 627 40 ; \nC 37 ; WX 638.889 ; N floorrightBigg ; B 11 -2959 363 40 ; \nC 38 ; WX 638.889 ; N ceilingleftBigg ; B 275 -2959 627 40 ; \nC 39 ; WX 638.889 ; N ceilingrightBigg ; B 11 -2959 363 40 ; \nC 40 ; WX 805.556 ; N braceleftBigg ; B 144 -2959 661 40 ; \nC 41 ; WX 805.556 ; N bracerightBigg ; B 144 -2959 661 40 ; \nC 42 ; WX 805.556 ; N angbracketleftBigg ; B 139 -2960 697 40 ; \nC 43 ; WX 805.556 ; N angbracketrightBigg ; B 108 -2960 666 40 ; \nC 44 ; WX 1277.78 ; N slashBigg ; B 56 -2959 1221 40 ; \nC 45 ; WX 1277.78 ; N backslashBigg ; B 56 -2959 1221 40 ; \nC 46 ; WX 811.111 ; N slashBig ; B 56 -1759 754 40 ; \nC 47 ; WX 811.111 ; N backslashBig ; B 56 -1759 754 40 ; \nC 48 ; WX 875 ; N parenlefttp ; B 291 -1770 842 39 ; \nC 49 ; WX 875 ; N parenrighttp ; B 32 -1770 583 39 ; \nC 50 ; WX 666.667 ; N bracketlefttp ; B 326 -1760 659 39 ; \nC 51 ; WX 666.667 ; N bracketrighttp ; B 7 -1760 340 39 ; \nC 52 ; WX 666.667 ; N bracketleftbt ; B 326 -1759 659 40 ; \nC 53 ; WX 666.667 ; N bracketrightbt ; B 7 -1759 340 40 ; \nC 54 ; WX 666.667 ; N bracketleftex ; B 326 -601 395 1 ; \nC 55 ; WX 666.667 ; N bracketrightex ; B 271 -601 340 1 ; \nC 56 ; WX 888.889 ; N bracelefttp ; B 384 -910 718 -1 ; \nC 57 ; WX 888.889 ; N bracerighttp ; B 170 -910 504 -1 ; \nC 58 ; WX 888.889 ; N braceleftbt ; B 384 -899 718 10 ; \nC 59 ; WX 888.889 ; N bracerightbt ; B 170 -899 504 10 ; \nC 60 ; WX 888.889 ; N braceleftmid ; B 170 -1810 504 10 ; \nC 61 ; WX 888.889 ; N bracerightmid ; B 384 -1810 718 10 ; \nC 62 ; WX 888.889 ; N braceex ; B 384 -310 504 10 ; \nC 63 ; WX 666.667 ; N arrowvertex ; B 312 -601 355 1 ; \nC 64 ; WX 875 ; N parenleftbt ; B 291 -1759 842 50 ; \nC 65 ; WX 875 ; N parenrightbt ; B 32 -1759 583 50 ; \nC 66 ; WX 875 ; N parenleftex ; B 291 -610 402 10 ; \nC 67 ; WX 875 ; N parenrightex ; B 472 -610 583 10 ; \nC 68 ; WX 611.111 ; N angbracketleftBig ; B 112 -1759 522 40 ; \nC 69 ; WX 611.111 ; N angbracketrightBig ; B 88 -1759 498 40 ; \nC 70 ; WX 833.333 ; N unionsqtext ; B 56 -1000 776 0 ; \nC 71 ; WX 1111.11 ; N unionsqdisplay ; B 56 -1400 1054 0 ; \nC 72 ; WX 472.222 ; N contintegraltext ; B 56 -1111 609 0 ; \nC 73 ; WX 555.556 ; N contintegraldisplay ; B 56 -2222 943 0 ; \nC 74 ; WX 1111.11 ; N circledottext ; B 56 -1000 1054 0 ; \nC 75 ; WX 1511.11 ; N circledotdisplay ; B 56 -1400 1454 0 ; \nC 76 ; WX 1111.11 ; N circleplustext ; B 56 -1000 1054 0 ; \nC 77 ; WX 1511.11 ; N circleplusdisplay ; B 56 -1400 1454 0 ; \nC 78 ; WX 1111.11 ; N circlemultiplytext ; B 56 -1000 1054 0 ; \nC 79 ; WX 1511.11 ; N circlemultiplydisplay ; B 56 -1400 1454 0 ; \nC 80 ; WX 1055.56 ; N summationtext ; B 56 -1000 999 0 ; \nC 81 ; WX 944.444 ; N producttext ; B 56 -1000 887 0 ; \nC 82 ; WX 472.222 ; N integraltext ; B 56 -1111 609 0 ; \nC 83 ; WX 833.333 ; N uniontext ; B 56 -1000 776 0 ; \nC 84 ; WX 833.333 ; N intersectiontext ; B 56 -1000 776 0 ; \nC 85 ; WX 833.333 ; N unionmultitext ; B 56 -1000 776 0 ; \nC 86 ; WX 833.333 ; N logicalandtext ; B 56 -1000 776 0 ; \nC 87 ; WX 833.333 ; N logicalortext ; B 56 -1000 776 0 ; \nC 88 ; WX 1444.44 ; N summationdisplay ; B 56 -1400 1387 0 ; \nC 89 ; WX 1277.78 ; N productdisplay ; B 56 -1400 1221 0 ; \nC 90 ; WX 555.556 ; N integraldisplay ; B 56 -2222 943 0 ; \nC 91 ; WX 1111.11 ; N uniondisplay ; B 56 -1400 1054 0 ; \nC 92 ; WX 1111.11 ; N intersectiondisplay ; B 56 -1400 1054 0 ; \nC 93 ; WX 1111.11 ; N unionmultidisplay ; B 56 -1400 1054 0 ; \nC 94 ; WX 1111.11 ; N logicalanddisplay ; B 56 -1400 1054 0 ; \nC 95 ; WX 1111.11 ; N logicalordisplay ; B 56 -1400 1054 0 ; \nC 96 ; WX 944.444 ; N coproducttext ; B 56 -1000 887 0 ; \nC 97 ; WX 1277.78 ; N coproductdisplay ; B 56 -1400 1221 0 ; \nC 98 ; WX 555.556 ; N hatwide ; B -5 562 561 744 ; \nC 99 ; WX 1000 ; N hatwider ; B -4 575 1003 772 ; \nC 100 ; WX 1444.44 ; N hatwidest ; B -3 575 1446 772 ; \nC 101 ; WX 555.556 ; N tildewide ; B 0 608 555 722 ; \nC 102 ; WX 1000 ; N tildewider ; B 0 624 999 750 ; \nC 103 ; WX 1444.44 ; N tildewidest ; B 0 623 1443 750 ; \nC 104 ; WX 472.222 ; N bracketleftBig ; B 226 -1759 453 40 ; \nC 105 ; WX 472.222 ; N bracketrightBig ; B 18 -1759 245 40 ; \nC 106 ; WX 527.778 ; N floorleftBig ; B 226 -1759 509 40 ; \nC 107 ; WX 527.778 ; N floorrightBig ; B 18 -1759 301 40 ; \nC 108 ; WX 527.778 ; N ceilingleftBig ; B 226 -1759 509 40 ; \nC 109 ; WX 527.778 ; N ceilingrightBig ; B 18 -1759 301 40 ; \nC 110 ; WX 666.667 ; N braceleftBig ; B 119 -1759 547 40 ; \nC 111 ; WX 666.667 ; N bracerightBig ; B 119 -1759 547 40 ; \nC 112 ; WX 1000 ; N radicalbig ; B 110 -1160 1020 40 ; \nC 113 ; WX 1000 ; N radicalBig ; B 110 -1760 1020 40 ; \nC 114 ; WX 1000 ; N radicalbigg ; B 111 -2360 1020 40 ; \nC 115 ; WX 1000 ; N radicalBigg ; B 111 -2960 1020 40 ; \nC 116 ; WX 1055.56 ; N radicalbt ; B 111 -1800 742 20 ; \nC 117 ; WX 1055.56 ; N radicalvertex ; B 702 -620 742 20 ; \nC 118 ; WX 1055.56 ; N radicaltp ; B 702 -580 1076 40 ; \nC 119 ; WX 777.778 ; N arrowvertexdbl ; B 257 -601 521 1 ; \nC 120 ; WX 666.667 ; N arrowtp ; B 111 -600 556 0 ; \nC 121 ; WX 666.667 ; N arrowbt ; B 111 -600 556 0 ; \nC 122 ; WX 450 ; N bracehtipdownleft ; B -24 -214 460 120 ; \nC 123 ; WX 450 ; N bracehtipdownright ; B -10 -214 474 120 ; \nC 124 ; WX 450 ; N bracehtipupleft ; B -24 0 460 334 ; \nC 125 ; WX 450 ; N bracehtipupright ; B -10 0 474 334 ; \nC 126 ; WX 777.778 ; N arrowdbltp ; B 56 -600 722 -1 ; \nC 127 ; WX 777.778 ; N arrowdblbt ; B 56 -599 722 0 ; \nC -1 ; WX 333.333 ; N space ; B 0 0 0 0 ;\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/cmmi10.afm",
    "content": "StartFontMetrics 2.0\nComment Creation Date: Thu Jun 21 22:23:22 1990\nComment UniqueID 5000785\nFontName CMMI10\nEncodingScheme FontSpecific\nFullName CMMI10\nFamilyName Computer Modern\nWeight Medium\nItalicAngle -14.04\nIsFixedPitch false\nVersion 1.00A\nNotice Copyright (c) 1997 American Mathematical Society.  All Rights Reserved.\nComment Computer Modern fonts were designed by Donald E. Knuth\nFontBBox -32 -250 1048 750\nCapHeight 683.333\nXHeight 430.556\nAscender 694.444\nDescender -194.444\nComment FontID CMMI\nComment DesignSize 10 (pts)\nComment CharacterCodingScheme TeX math italic\nComment Space 0 0 0 \nComment Quad 1000\nStartCharMetrics 129\nC 0 ; WX 615.276 ; N Gamma ; B 39 0 723 680 ; \nC 1 ; WX 833.333 ; N Delta ; B 49 0 787 716 ; \nC 2 ; WX 762.774 ; N Theta ; B 50 -22 739 705 ; \nC 3 ; WX 694.444 ; N Lambda ; B 35 0 666 716 ; \nC 4 ; WX 742.361 ; N Xi ; B 53 0 777 677 ; \nC 5 ; WX 831.25 ; N Pi ; B 39 0 880 680 ; \nC 6 ; WX 779.861 ; N Sigma ; B 59 0 807 683 ; \nC 7 ; WX 583.333 ; N Upsilon ; B 29 0 700 705 ; \nC 8 ; WX 666.667 ; N Phi ; B 24 0 642 683 ; \nC 9 ; WX 612.221 ; N Psi ; B 28 0 692 683 ; \nC 10 ; WX 772.396 ; N Omega ; B 80 0 785 705 ; \nC 11 ; WX 639.7 ; N alpha ; B 41 -11 601 442 ; \nC 12 ; WX 565.625 ; N beta ; B 25 -194 590 705 ; \nC 13 ; WX 517.73 ; N gamma ; B 18 -215 542 442 ; \nC 14 ; WX 444.444 ; N delta ; B 41 -12 452 705 ; \nC 15 ; WX 405.902 ; N epsilon1 ; B 47 -11 376 431 ; \nC 16 ; WX 437.5 ; N zeta ; B 47 -205 474 697 ; \nC 17 ; WX 496.53 ; N eta ; B 29 -216 496 442 ; \nC 18 ; WX 469.442 ; N theta ; B 42 -11 455 705 ; \nC 19 ; WX 353.935 ; N iota ; B 56 -11 324 442 ; \nC 20 ; WX 576.159 ; N kappa ; B 55 -11 546 442 ; \nC 21 ; WX 583.333 ; N lambda ; B 53 -13 547 694 ; \nC 22 ; WX 602.548 ; N mu ; B 30 -216 572 442 ; \nC 23 ; WX 493.981 ; N nu ; B 53 0 524 442 ; \nC 24 ; WX 437.5 ; N xi ; B 24 -205 446 697 ; \nC 25 ; WX 570.025 ; N pi ; B 27 -11 567 431 ; \nC 26 ; WX 517.014 ; N rho ; B 30 -216 502 442 ; \nC 27 ; WX 571.429 ; N sigma ; B 38 -11 567 431 ; \nC 28 ; WX 437.153 ; N tau ; B 27 -12 511 431 ; \nC 29 ; WX 540.278 ; N upsilon ; B 29 -11 524 443 ; \nC 30 ; WX 595.833 ; N phi ; B 49 -205 573 694 ; \nC 31 ; WX 625.691 ; N chi ; B 32 -205 594 442 ; \nC 32 ; WX 651.39 ; N psi ; B 29 -205 635 694 ; \nC 33 ; WX 622.453 ; N omega ; B 13 -11 605 443 ; \nC 34 ; WX 466.316 ; N epsilon ; B 27 -22 428 453 ; \nC 35 ; WX 591.438 ; N theta1 ; B 29 -11 561 705 ; \nC 36 ; WX 828.125 ; N pi1 ; B 27 -11 817 431 ; \nC 37 ; WX 517.014 ; N rho1 ; B 74 -194 502 442 ; \nC 38 ; WX 362.846 ; N sigma1 ; B 32 -108 408 442 ; \nC 39 ; WX 654.165 ; N phi1 ; B 50 -218 619 442 ; \nC 40 ; WX 1000 ; N arrowlefttophalf ; B 56 230 943 428 ; \nC 41 ; WX 1000 ; N arrowleftbothalf ; B 56 72 943 270 ; \nC 42 ; WX 1000 ; N arrowrighttophalf ; B 56 230 943 428 ; \nC 43 ; WX 1000 ; N arrowrightbothalf ; B 56 72 943 270 ; \nC 44 ; WX 277.778 ; N arrowhookleft ; B 56 230 221 464 ; \nC 45 ; WX 277.778 ; N arrowhookright ; B 56 230 221 464 ; \nC 46 ; WX 500 ; N triangleright ; B 27 -4 472 504 ; \nC 47 ; WX 500 ; N triangleleft ; B 27 -4 472 504 ; \nC 48 ; WX 500 ; N zerooldstyle ; B 40 -22 459 453 ; \nC 49 ; WX 500 ; N oneoldstyle ; B 92 0 418 453 ; \nC 50 ; WX 500 ; N twooldstyle ; B 44 0 449 453 ; \nC 51 ; WX 500 ; N threeoldstyle ; B 42 -216 457 453 ; \nC 52 ; WX 500 ; N fouroldstyle ; B 28 -194 471 464 ; \nC 53 ; WX 500 ; N fiveoldstyle ; B 50 -216 449 453 ; \nC 54 ; WX 500 ; N sixoldstyle ; B 42 -22 457 666 ; \nC 55 ; WX 500 ; N sevenoldstyle ; B 56 -216 485 463 ; \nC 56 ; WX 500 ; N eightoldstyle ; B 42 -22 457 666 ; \nC 57 ; WX 500 ; N nineoldstyle ; B 42 -216 457 453 ; \nC 58 ; WX 277.778 ; N period ; B 86 0 192 106 ; \nC 59 ; WX 277.778 ; N comma ; B 86 -193 203 106 ; \nC 60 ; WX 777.778 ; N less ; B 83 -39 694 539 ; \nC 61 ; WX 500 ; N slash ; B 56 -250 443 750 ; \nC 62 ; WX 777.778 ; N greater ; B 83 -39 694 539 ; \nC 63 ; WX 500 ; N star ; B 4 16 496 486 ; \nC 64 ; WX 530.902 ; N partialdiff ; B 40 -22 566 716 ; \nC 65 ; WX 750 ; N A ; B 35 0 722 716 ; \nC 66 ; WX 758.508 ; N B ; B 42 0 756 683 ; \nC 67 ; WX 714.72 ; N C ; B 51 -22 759 705 ; \nC 68 ; WX 827.915 ; N D ; B 41 0 803 683 ; \nC 69 ; WX 738.193 ; N E ; B 39 0 765 680 ; \nC 70 ; WX 643.055 ; N F ; B 39 0 751 680 ; \nC 71 ; WX 786.247 ; N G ; B 51 -22 760 705 ; \nC 72 ; WX 831.25 ; N H ; B 39 0 881 683 ; \nC 73 ; WX 439.583 ; N I ; B 34 0 498 683 ; \nC 74 ; WX 554.512 ; N J ; B 73 -22 633 683 ; \nC 75 ; WX 849.305 ; N K ; B 39 0 889 683 ; \nC 76 ; WX 680.556 ; N L ; B 39 0 643 683 ; \nC 77 ; WX 970.138 ; N M ; B 43 0 1044 683 ; \nC 78 ; WX 803.471 ; N N ; B 39 0 881 683 ; \nC 79 ; WX 762.774 ; N O ; B 50 -22 739 705 ; \nC 80 ; WX 642.012 ; N P ; B 41 0 753 683 ; \nC 81 ; WX 790.553 ; N Q ; B 50 -194 739 705 ; \nC 82 ; WX 759.288 ; N R ; B 41 -22 755 683 ; \nC 83 ; WX 613.193 ; N S ; B 53 -22 645 705 ; \nC 84 ; WX 584.375 ; N T ; B 24 0 704 677 ; \nC 85 ; WX 682.776 ; N U ; B 68 -22 760 683 ; \nC 86 ; WX 583.333 ; N V ; B 56 -22 769 683 ; \nC 87 ; WX 944.444 ; N W ; B 55 -22 1048 683 ; \nC 88 ; WX 828.472 ; N X ; B 27 0 851 683 ; \nC 89 ; WX 580.556 ; N Y ; B 34 0 762 683 ; \nC 90 ; WX 682.638 ; N Z ; B 59 0 722 683 ; \nC 91 ; WX 388.889 ; N flat ; B 56 -22 332 750 ; \nC 92 ; WX 388.889 ; N natural ; B 79 -217 309 728 ; \nC 93 ; WX 388.889 ; N sharp ; B 56 -216 332 716 ; \nC 94 ; WX 1000 ; N slurbelow ; B 56 133 943 371 ; \nC 95 ; WX 1000 ; N slurabove ; B 56 130 943 381 ; \nC 96 ; WX 416.667 ; N lscript ; B 11 -12 398 705 ; \nC 97 ; WX 528.588 ; N a ; B 40 -11 498 442 ; \nC 98 ; WX 429.165 ; N b ; B 47 -11 415 694 ; \nC 99 ; WX 432.755 ; N c ; B 41 -11 430 442 ; \nC 100 ; WX 520.486 ; N d ; B 40 -11 517 694 ; \nC 101 ; WX 465.625 ; N e ; B 46 -11 430 442 ; \nC 102 ; WX 489.583 ; N f ; B 53 -205 552 705 ; \nC 103 ; WX 476.967 ; N g ; B 16 -205 474 442 ; \nC 104 ; WX 576.159 ; N h ; B 55 -11 546 694 ; \nC 105 ; WX 344.511 ; N i ; B 29 -11 293 661 ; \nC 106 ; WX 411.805 ; N j ; B -13 -205 397 661 ; \nC 107 ; WX 520.602 ; N k ; B 55 -11 508 694 ; \nC 108 ; WX 298.378 ; N l ; B 46 -11 260 694 ; \nC 109 ; WX 878.012 ; N m ; B 29 -11 848 442 ; \nC 110 ; WX 600.233 ; N n ; B 29 -11 571 442 ; \nC 111 ; WX 484.721 ; N o ; B 41 -11 469 442 ; \nC 112 ; WX 503.125 ; N p ; B -32 -194 490 442 ; \nC 113 ; WX 446.412 ; N q ; B 40 -194 453 442 ; \nC 114 ; WX 451.158 ; N r ; B 29 -11 436 442 ; \nC 115 ; WX 468.75 ; N s ; B 52 -11 419 442 ; \nC 116 ; WX 361.111 ; N t ; B 23 -11 330 626 ; \nC 117 ; WX 572.456 ; N u ; B 29 -11 543 442 ; \nC 118 ; WX 484.722 ; N v ; B 29 -11 468 443 ; \nC 119 ; WX 715.916 ; N w ; B 29 -11 691 443 ; \nC 120 ; WX 571.527 ; N x ; B 29 -11 527 442 ; \nC 121 ; WX 490.28 ; N y ; B 29 -205 490 442 ; \nC 122 ; WX 465.048 ; N z ; B 43 -11 467 442 ; \nC 123 ; WX 322.454 ; N dotlessi ; B 29 -11 293 442 ; \nC 124 ; WX 384.028 ; N dotlessj ; B -13 -205 360 442 ; \nC 125 ; WX 636.457 ; N weierstrass ; B 76 -216 618 453 ; \nC 126 ; WX 500 ; N vector ; B 182 516 625 714 ; \nC 127 ; WX 277.778 ; N tie ; B 264 538 651 665 ; \nC -1 ; WX 333.333 ; N space ; B 0 0 0 0 ;\nEndCharMetrics\nComment The following are bogus kern pairs for TeX positioning of accents\nStartKernData\nStartKernPairs 166\nKPX Gamma slash -55.556\nKPX Gamma comma -111.111\nKPX Gamma period -111.111\nKPX Gamma tie 83.333\nKPX Delta tie 166.667\nKPX Theta tie 83.333\nKPX Lambda tie 166.667\nKPX Xi tie 83.333\nKPX Pi slash -55.556\nKPX Pi comma -55.556\nKPX Pi period -55.556\nKPX Pi tie 55.556\nKPX Sigma tie 83.333\nKPX Upsilon slash -55.556\nKPX Upsilon comma -111.111\nKPX Upsilon period -111.111\nKPX Upsilon tie 55.556\nKPX Phi tie 83.333\nKPX Psi slash -55.556\nKPX Psi comma -55.556\nKPX Psi period -55.556\nKPX Psi tie 55.556\nKPX Omega tie 83.333\nKPX alpha tie 27.778\nKPX beta tie 83.333\nKPX delta comma -55.556\nKPX delta period -55.556\nKPX delta tie 55.556\nKPX epsilon1 tie 55.556\nKPX zeta tie 83.333\nKPX eta tie 55.556\nKPX theta tie 83.333\nKPX iota tie 55.556\nKPX mu tie 27.778\nKPX nu comma -55.556\nKPX nu period -55.556\nKPX nu tie 27.778\nKPX xi tie 111.111\nKPX rho tie 83.333\nKPX sigma comma -55.556\nKPX sigma period -55.556\nKPX tau comma -55.556\nKPX tau period -55.556\nKPX tau tie 27.778\nKPX upsilon tie 27.778\nKPX phi tie 83.333\nKPX chi tie 55.556\nKPX psi tie 111.111\nKPX epsilon tie 83.333\nKPX theta1 tie 83.333\nKPX rho1 tie 83.333\nKPX sigma1 tie 83.333\nKPX phi1 tie 83.333\nKPX slash Delta -55.556\nKPX slash A -55.556\nKPX slash M -55.556\nKPX slash N -55.556\nKPX slash Y 55.556\nKPX slash Z -55.556\nKPX partialdiff tie 83.333\nKPX A tie 138.889\nKPX B tie 83.333\nKPX C slash -27.778\nKPX C comma -55.556\nKPX C period -55.556\nKPX C tie 83.333\nKPX D tie 55.556\nKPX E tie 83.333\nKPX F slash -55.556\nKPX F comma -111.111\nKPX F period -111.111\nKPX F tie 83.333\nKPX G tie 83.333\nKPX H slash -55.556\nKPX H comma -55.556\nKPX H period -55.556\nKPX H tie 55.556\nKPX I tie 111.111\nKPX J slash -55.556\nKPX J comma -111.111\nKPX J period -111.111\nKPX J tie 166.667\nKPX K slash -55.556\nKPX K comma -55.556\nKPX K period -55.556\nKPX K tie 55.556\nKPX L tie 27.778\nKPX M slash -55.556\nKPX M comma -55.556\nKPX M period -55.556\nKPX M tie 83.333\nKPX N slash -83.333\nKPX N slash -27.778\nKPX N comma -55.556\nKPX N period -55.556\nKPX N tie 83.333\nKPX O tie 83.333\nKPX P slash -55.556\nKPX P comma -111.111\nKPX P period -111.111\nKPX P tie 83.333\nKPX Q tie 83.333\nKPX R tie 83.333\nKPX S slash -55.556\nKPX S comma -55.556\nKPX S period -55.556\nKPX S tie 83.333\nKPX T slash -27.778\nKPX T comma -55.556\nKPX T period -55.556\nKPX T tie 83.333\nKPX U comma -111.111\nKPX U period -111.111\nKPX U slash -55.556\nKPX U tie 27.778\nKPX V comma -166.667\nKPX V period -166.667\nKPX V slash -111.111\nKPX W comma -166.667\nKPX W period -166.667\nKPX W slash -111.111\nKPX X slash -83.333\nKPX X slash -27.778\nKPX X comma -55.556\nKPX X period -55.556\nKPX X tie 83.333\nKPX Y comma -166.667\nKPX Y period -166.667\nKPX Y slash -111.111\nKPX Z slash -55.556\nKPX Z comma -55.556\nKPX Z period -55.556\nKPX Z tie 83.333\nKPX lscript tie 111.111\nKPX c tie 55.556\nKPX d Y 55.556\nKPX d Z -55.556\nKPX d j -111.111\nKPX d f -166.667\nKPX d tie 166.667\nKPX e tie 55.556\nKPX f comma -55.556\nKPX f period -55.556\nKPX f tie 166.667\nKPX g tie 27.778\nKPX h tie -27.778\nKPX j comma -55.556\nKPX j period -55.556\nKPX l tie 83.333\nKPX o tie 55.556\nKPX p tie 83.333\nKPX q tie 83.333\nKPX r comma -55.556\nKPX r period -55.556\nKPX r tie 55.556\nKPX s tie 55.556\nKPX t tie 83.333\nKPX u tie 27.778\nKPX v tie 27.778\nKPX w tie 83.333\nKPX x tie 27.778\nKPX y tie 55.556\nKPX z tie 55.556\nKPX dotlessi tie 27.778\nKPX dotlessj tie 83.333\nKPX weierstrass tie 111.111\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/cmr10.afm",
    "content": "StartFontMetrics 2.0\nComment Creation Date: Thu Jun 21 22:23:28 1990\nComment UniqueID 5000793\nFontName CMR10\nEncodingScheme FontSpecific\nFullName CMR10\nFamilyName Computer Modern\nWeight Medium\nItalicAngle 0.0\nIsFixedPitch false\nVersion 1.00B\nNotice Copyright (c) 1997 American Mathematical Society.  All Rights Reserved.\nComment Computer Modern fonts were designed by Donald E. Knuth\nFontBBox -40 -250 1009 969\nCapHeight 683.333\nXHeight 430.556\nAscender 694.444\nDescender -194.444\nComment FontID CMR\nComment DesignSize 10 (pts)\nComment CharacterCodingScheme TeX text\nComment Space 333.333 166.667 111.111 \nComment ExtraSpace 111.111\nComment Quad 1000\nStartCharMetrics 129\nC 0 ; WX 625 ; N Gamma ; B 33 0 582 680 ; \nC 1 ; WX 833.333 ; N Delta ; B 47 0 785 716 ; \nC 2 ; WX 777.778 ; N Theta ; B 56 -22 721 705 ; \nC 3 ; WX 694.444 ; N Lambda ; B 32 0 661 716 ; \nC 4 ; WX 666.667 ; N Xi ; B 42 0 624 677 ; \nC 5 ; WX 750 ; N Pi ; B 33 0 716 680 ; \nC 6 ; WX 722.222 ; N Sigma ; B 56 0 665 683 ; \nC 7 ; WX 777.778 ; N Upsilon ; B 56 0 721 705 ; \nC 8 ; WX 722.222 ; N Phi ; B 56 0 665 683 ; \nC 9 ; WX 777.778 ; N Psi ; B 57 0 720 683 ; \nC 10 ; WX 722.222 ; N Omega ; B 44 0 677 705 ; \nC 11 ; WX 583.333 ; N ff ; B 27 0 628 705 ; L i ffi ; L l ffl ; \nC 12 ; WX 555.556 ; N fi ; B 27 0 527 705 ; \nC 13 ; WX 555.556 ; N fl ; B 27 0 527 705 ; \nC 14 ; WX 833.333 ; N ffi ; B 27 0 804 705 ; \nC 15 ; WX 833.333 ; N ffl ; B 27 0 804 705 ; \nC 16 ; WX 277.778 ; N dotlessi ; B 33 0 247 442 ; \nC 17 ; WX 305.556 ; N dotlessj ; B -40 -205 210 442 ; \nC 18 ; WX 500 ; N grave ; B 107 510 293 698 ; \nC 19 ; WX 500 ; N acute ; B 206 510 392 698 ; \nC 20 ; WX 500 ; N caron ; B 118 516 381 638 ; \nC 21 ; WX 500 ; N breve ; B 100 522 399 694 ; \nC 22 ; WX 500 ; N macron ; B 69 559 430 590 ; \nC 23 ; WX 750 ; N ring ; B 279 541 470 716 ; \nC 24 ; WX 444.444 ; N cedilla ; B 131 -203 367 -22 ; \nC 25 ; WX 500 ; N germandbls ; B 28 -11 471 705 ; \nC 26 ; WX 722.222 ; N ae ; B 45 -11 693 448 ; \nC 27 ; WX 777.778 ; N oe ; B 28 -11 749 448 ; \nC 28 ; WX 500 ; N oslash ; B 35 -102 464 534 ; \nC 29 ; WX 902.778 ; N AE ; B 32 0 874 683 ; \nC 30 ; WX 1013.89 ; N OE ; B 70 -22 985 705 ; \nC 31 ; WX 777.778 ; N Oslash ; B 56 -56 721 739 ; \nC 32 ; WX 277.778 ; N suppress ; B 27 280 262 392 ; \nC 33 ; WX 277.778 ; N exclam ; B 86 0 192 716 ; L quoteleft exclamdown ; \nC 34 ; WX 500 ; N quotedblright ; B 33 395 347 694 ; \nC 35 ; WX 833.333 ; N numbersign ; B 56 -194 776 694 ; \nC 36 ; WX 500 ; N dollar ; B 56 -56 443 750 ; \nC 37 ; WX 833.333 ; N percent ; B 56 -56 776 750 ; \nC 38 ; WX 777.778 ; N ampersand ; B 42 -22 727 716 ; \nC 39 ; WX 277.778 ; N quoteright ; B 86 395 206 694 ; L quoteright quotedblright ; \nC 40 ; WX 388.889 ; N parenleft ; B 99 -250 331 750 ; \nC 41 ; WX 388.889 ; N parenright ; B 57 -250 289 750 ; \nC 42 ; WX 500 ; N asterisk ; B 65 319 434 750 ; \nC 43 ; WX 777.778 ; N plus ; B 56 -83 721 583 ; \nC 44 ; WX 277.778 ; N comma ; B 86 -193 203 106 ; \nC 45 ; WX 333.333 ; N hyphen ; B 11 187 276 245 ; L hyphen endash ; \nC 46 ; WX 277.778 ; N period ; B 86 0 192 106 ; \nC 47 ; WX 500 ; N slash ; B 56 -250 443 750 ; \nC 48 ; WX 500 ; N zero ; B 39 -22 460 666 ; \nC 49 ; WX 500 ; N one ; B 89 0 419 666 ; \nC 50 ; WX 500 ; N two ; B 50 0 449 666 ; \nC 51 ; WX 500 ; N three ; B 42 -22 457 666 ; \nC 52 ; WX 500 ; N four ; B 28 0 471 677 ; \nC 53 ; WX 500 ; N five ; B 50 -22 449 666 ; \nC 54 ; WX 500 ; N six ; B 42 -22 457 666 ; \nC 55 ; WX 500 ; N seven ; B 56 -22 485 676 ; \nC 56 ; WX 500 ; N eight ; B 42 -22 457 666 ; \nC 57 ; WX 500 ; N nine ; B 42 -22 457 666 ; \nC 58 ; WX 277.778 ; N colon ; B 86 0 192 431 ; \nC 59 ; WX 277.778 ; N semicolon ; B 86 -193 195 431 ; \nC 60 ; WX 277.778 ; N exclamdown ; B 86 -216 192 500 ; \nC 61 ; WX 777.778 ; N equal ; B 56 133 721 367 ; \nC 62 ; WX 472.222 ; N questiondown ; B 56 -205 415 500 ; \nC 63 ; WX 472.222 ; N question ; B 56 0 415 705 ; L quoteleft questiondown ; \nC 64 ; WX 777.778 ; N at ; B 56 -11 721 705 ; \nC 65 ; WX 750 ; N A ; B 32 0 717 716 ; \nC 66 ; WX 708.333 ; N B ; B 36 0 651 683 ; \nC 67 ; WX 722.222 ; N C ; B 56 -22 665 705 ; \nC 68 ; WX 763.889 ; N D ; B 35 0 707 683 ; \nC 69 ; WX 680.556 ; N E ; B 33 0 652 680 ; \nC 70 ; WX 652.778 ; N F ; B 33 0 610 680 ; \nC 71 ; WX 784.722 ; N G ; B 56 -22 735 705 ; \nC 72 ; WX 750 ; N H ; B 33 0 716 683 ; \nC 73 ; WX 361.111 ; N I ; B 28 0 333 683 ; \nC 74 ; WX 513.889 ; N J ; B 41 -22 465 683 ; \nC 75 ; WX 777.778 ; N K ; B 33 0 736 683 ; \nC 76 ; WX 625 ; N L ; B 33 0 582 683 ; \nC 77 ; WX 916.667 ; N M ; B 37 0 879 683 ; \nC 78 ; WX 750 ; N N ; B 33 0 716 683 ; \nC 79 ; WX 777.778 ; N O ; B 56 -22 721 705 ; \nC 80 ; WX 680.556 ; N P ; B 35 0 624 683 ; \nC 81 ; WX 777.778 ; N Q ; B 56 -194 727 705 ; \nC 82 ; WX 736.111 ; N R ; B 35 -22 732 683 ; \nC 83 ; WX 555.556 ; N S ; B 56 -22 499 705 ; \nC 84 ; WX 722.222 ; N T ; B 36 0 685 677 ; \nC 85 ; WX 750 ; N U ; B 33 -22 716 683 ; \nC 86 ; WX 750 ; N V ; B 19 -22 730 683 ; \nC 87 ; WX 1027.78 ; N W ; B 18 -22 1009 683 ; \nC 88 ; WX 750 ; N X ; B 24 0 726 683 ; \nC 89 ; WX 750 ; N Y ; B 11 0 738 683 ; \nC 90 ; WX 611.111 ; N Z ; B 56 0 560 683 ; \nC 91 ; WX 277.778 ; N bracketleft ; B 118 -250 255 750 ; \nC 92 ; WX 500 ; N quotedblleft ; B 152 394 466 693 ; \nC 93 ; WX 277.778 ; N bracketright ; B 22 -250 159 750 ; \nC 94 ; WX 500 ; N circumflex ; B 116 540 383 694 ; \nC 95 ; WX 277.778 ; N dotaccent ; B 85 563 192 669 ; \nC 96 ; WX 277.778 ; N quoteleft ; B 72 394 192 693 ; L quoteleft quotedblleft ; \nC 97 ; WX 500 ; N a ; B 42 -11 493 448 ; \nC 98 ; WX 555.556 ; N b ; B 28 -11 521 694 ; \nC 99 ; WX 444.444 ; N c ; B 34 -11 415 448 ; \nC 100 ; WX 555.556 ; N d ; B 34 -11 527 694 ; \nC 101 ; WX 444.444 ; N e ; B 28 -11 415 448 ; \nC 102 ; WX 305.556 ; N f ; B 33 0 357 705 ; L i fi ; L f ff ; L l fl ; \nC 103 ; WX 500 ; N g ; B 28 -206 485 453 ; \nC 104 ; WX 555.556 ; N h ; B 32 0 535 694 ; \nC 105 ; WX 277.778 ; N i ; B 33 0 247 669 ; \nC 106 ; WX 305.556 ; N j ; B -40 -205 210 669 ; \nC 107 ; WX 527.778 ; N k ; B 28 0 511 694 ; \nC 108 ; WX 277.778 ; N l ; B 33 0 255 694 ; \nC 109 ; WX 833.333 ; N m ; B 32 0 813 442 ; \nC 110 ; WX 555.556 ; N n ; B 32 0 535 442 ; \nC 111 ; WX 500 ; N o ; B 28 -11 471 448 ; \nC 112 ; WX 555.556 ; N p ; B 28 -194 521 442 ; \nC 113 ; WX 527.778 ; N q ; B 34 -194 527 442 ; \nC 114 ; WX 391.667 ; N r ; B 28 0 364 442 ; \nC 115 ; WX 394.444 ; N s ; B 33 -11 360 448 ; \nC 116 ; WX 388.889 ; N t ; B 19 -11 332 615 ; \nC 117 ; WX 555.556 ; N u ; B 32 -11 535 442 ; \nC 118 ; WX 527.778 ; N v ; B 19 -11 508 431 ; \nC 119 ; WX 722.222 ; N w ; B 18 -11 703 431 ; \nC 120 ; WX 527.778 ; N x ; B 12 0 516 431 ; \nC 121 ; WX 527.778 ; N y ; B 19 -205 508 431 ; \nC 122 ; WX 444.444 ; N z ; B 28 0 401 431 ; \nC 123 ; WX 500 ; N endash ; B 0 255 499 277 ; L hyphen emdash ; \nC 124 ; WX 1000 ; N emdash ; B 0 255 999 277 ; \nC 125 ; WX 500 ; N hungarumlaut ; B 128 513 420 699 ; \nC 126 ; WX 500 ; N tilde ; B 83 575 416 668 ; \nC 127 ; WX 500 ; N dieresis ; B 103 569 396 669 ; \nC -1 ; WX 333.333 ; N space ; B 0 0 0 0 ; \nEndCharMetrics\nStartKernData\nStartKernPairs 183\nKPX ff quoteright 77.778\nKPX ff question 77.778\nKPX ff exclam 77.778\nKPX ff parenright 77.778\nKPX ff bracketright 77.778\nKPX suppress l -277.778\nKPX suppress L -319.444\nKPX quoteright question 111.111\nKPX quoteright exclam 111.111\nKPX A t -27.778\nKPX A C -27.778\nKPX A O -27.778\nKPX A G -27.778\nKPX A U -27.778\nKPX A Q -27.778\nKPX A T -83.333\nKPX A Y -83.333\nKPX A V -111.111\nKPX A W -111.111\nKPX D X -27.778\nKPX D W -27.778\nKPX D A -27.778\nKPX D V -27.778\nKPX D Y -27.778\nKPX F o -83.333\nKPX F e -83.333\nKPX F u -83.333\nKPX F r -83.333\nKPX F a -83.333\nKPX F A -111.111\nKPX F O -27.778\nKPX F C -27.778\nKPX F G -27.778\nKPX F Q -27.778\nKPX I I 27.778\nKPX K O -27.778\nKPX K C -27.778\nKPX K G -27.778\nKPX K Q -27.778\nKPX L T -83.333\nKPX L Y -83.333\nKPX L V -111.111\nKPX L W -111.111\nKPX O X -27.778\nKPX O W -27.778\nKPX O A -27.778\nKPX O V -27.778\nKPX O Y -27.778\nKPX P A -83.333\nKPX P o -27.778\nKPX P e -27.778\nKPX P a -27.778\nKPX P period -83.333\nKPX P comma -83.333\nKPX R t -27.778\nKPX R C -27.778\nKPX R O -27.778\nKPX R G -27.778\nKPX R U -27.778\nKPX R Q -27.778\nKPX R T -83.333\nKPX R Y -83.333\nKPX R V -111.111\nKPX R W -111.111\nKPX T y -27.778\nKPX T e -83.333\nKPX T o -83.333\nKPX T r -83.333\nKPX T a -83.333\nKPX T A -83.333\nKPX T u -83.333\nKPX V o -83.333\nKPX V e -83.333\nKPX V u -83.333\nKPX V r -83.333\nKPX V a -83.333\nKPX V A -111.111\nKPX V O -27.778\nKPX V C -27.778\nKPX V G -27.778\nKPX V Q -27.778\nKPX W o -83.333\nKPX W e -83.333\nKPX W u -83.333\nKPX W r -83.333\nKPX W a -83.333\nKPX W A -111.111\nKPX W O -27.778\nKPX W C -27.778\nKPX W G -27.778\nKPX W Q -27.778\nKPX X O -27.778\nKPX X C -27.778\nKPX X G -27.778\nKPX X Q -27.778\nKPX Y e -83.333\nKPX Y o -83.333\nKPX Y r -83.333\nKPX Y a -83.333\nKPX Y A -83.333\nKPX Y u -83.333\nKPX a v -27.778\nKPX a j 55.556\nKPX a y -27.778\nKPX a w -27.778\nKPX b e 27.778\nKPX b o 27.778\nKPX b x -27.778\nKPX b d 27.778\nKPX b c 27.778\nKPX b q 27.778\nKPX b v -27.778\nKPX b j 55.556\nKPX b y -27.778\nKPX b w -27.778\nKPX c h -27.778\nKPX c k -27.778\nKPX f quoteright 77.778\nKPX f question 77.778\nKPX f exclam 77.778\nKPX f parenright 77.778\nKPX f bracketright 77.778\nKPX g j 27.778\nKPX h t -27.778\nKPX h u -27.778\nKPX h b -27.778\nKPX h y -27.778\nKPX h v -27.778\nKPX h w -27.778\nKPX k a -55.556\nKPX k e -27.778\nKPX k a -27.778\nKPX k o -27.778\nKPX k c -27.778\nKPX m t -27.778\nKPX m u -27.778\nKPX m b -27.778\nKPX m y -27.778\nKPX m v -27.778\nKPX m w -27.778\nKPX n t -27.778\nKPX n u -27.778\nKPX n b -27.778\nKPX n y -27.778\nKPX n v -27.778\nKPX n w -27.778\nKPX o e 27.778\nKPX o o 27.778\nKPX o x -27.778\nKPX o d 27.778\nKPX o c 27.778\nKPX o q 27.778\nKPX o v -27.778\nKPX o j 55.556\nKPX o y -27.778\nKPX o w -27.778\nKPX p e 27.778\nKPX p o 27.778\nKPX p x -27.778\nKPX p d 27.778\nKPX p c 27.778\nKPX p q 27.778\nKPX p v -27.778\nKPX p j 55.556\nKPX p y -27.778\nKPX p w -27.778\nKPX t y -27.778\nKPX t w -27.778\nKPX u w -27.778\nKPX v a -55.556\nKPX v e -27.778\nKPX v a -27.778\nKPX v o -27.778\nKPX v c -27.778\nKPX w e -27.778\nKPX w a -27.778\nKPX w o -27.778\nKPX w c -27.778\nKPX y o -27.778\nKPX y e -27.778\nKPX y a -27.778\nKPX y period -83.333\nKPX y comma -83.333\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/cmsy10.afm",
    "content": "StartFontMetrics 2.0\nComment Creation Date: Thu Jun 21 22:23:44 1990\nComment UniqueID 5000820\nFontName CMSY10\nEncodingScheme FontSpecific\nFullName CMSY10\nFamilyName Computer Modern\nWeight Medium\nItalicAngle -14.035\nIsFixedPitch false\nVersion 1.00\nNotice Copyright (c) 1997 American Mathematical Society.  All Rights Reserved.\nComment Computer Modern fonts were designed by Donald E. Knuth\nFontBBox -29 -960 1116 775\nCapHeight 683.333\nXHeight 430.556\nAscender 694.444\nDescender -960\nComment FontID CMSY\nComment DesignSize 10 (pts)\nComment CharacterCodingScheme TeX math symbols\nComment Space 0 0 0 \nComment ExtraSpace 0\nComment Quad 1000\nComment Num 676.508 393.732 443.731\nComment Denom 685.951 344.841\nComment Sup 412.892 362.892 288.889\nComment Sub 150 247.217\nComment Supdrop 386.108\nComment Subdrop 50\nComment Delim 2390 1010\nComment Axisheight 250\nStartCharMetrics 129\nC 0 ; WX 777.778 ; N minus ; B 83 230 694 270 ; \nC 1 ; WX 277.778 ; N periodcentered ; B 86 197 192 303 ; \nC 2 ; WX 777.778 ; N multiply ; B 147 9 630 491 ; \nC 3 ; WX 500 ; N asteriskmath ; B 65 34 434 465 ; \nC 4 ; WX 777.778 ; N divide ; B 56 -30 722 530 ; \nC 5 ; WX 500 ; N diamondmath ; B 11 11 489 489 ; \nC 6 ; WX 777.778 ; N plusminus ; B 56 0 721 666 ; \nC 7 ; WX 777.778 ; N minusplus ; B 56 -166 721 500 ; \nC 8 ; WX 777.778 ; N circleplus ; B 56 -83 721 583 ; \nC 9 ; WX 777.778 ; N circleminus ; B 56 -83 721 583 ; \nC 10 ; WX 777.778 ; N circlemultiply ; B 56 -83 721 583 ; \nC 11 ; WX 777.778 ; N circledivide ; B 56 -83 721 583 ; \nC 12 ; WX 777.778 ; N circledot ; B 56 -83 721 583 ; \nC 13 ; WX 1000 ; N circlecopyrt ; B 56 -216 943 716 ; \nC 14 ; WX 500 ; N openbullet ; B 56 56 443 444 ; \nC 15 ; WX 500 ; N bullet ; B 56 56 443 444 ; \nC 16 ; WX 777.778 ; N equivasymptotic ; B 56 16 721 484 ; \nC 17 ; WX 777.778 ; N equivalence ; B 56 36 721 464 ; \nC 18 ; WX 777.778 ; N reflexsubset ; B 83 -137 694 636 ; \nC 19 ; WX 777.778 ; N reflexsuperset ; B 83 -137 694 636 ; \nC 20 ; WX 777.778 ; N lessequal ; B 83 -137 694 636 ; \nC 21 ; WX 777.778 ; N greaterequal ; B 83 -137 694 636 ; \nC 22 ; WX 777.778 ; N precedesequal ; B 83 -137 694 636 ; \nC 23 ; WX 777.778 ; N followsequal ; B 83 -137 694 636 ; \nC 24 ; WX 777.778 ; N similar ; B 56 133 721 367 ; \nC 25 ; WX 777.778 ; N approxequal ; B 56 56 721 483 ; \nC 26 ; WX 777.778 ; N propersubset ; B 83 -40 694 540 ; \nC 27 ; WX 777.778 ; N propersuperset ; B 83 -40 694 540 ; \nC 28 ; WX 1000 ; N lessmuch ; B 56 -66 943 566 ; \nC 29 ; WX 1000 ; N greatermuch ; B 56 -66 943 566 ; \nC 30 ; WX 777.778 ; N precedes ; B 83 -40 694 539 ; \nC 31 ; WX 777.778 ; N follows ; B 83 -40 694 539 ; \nC 32 ; WX 1000 ; N arrowleft ; B 57 72 943 428 ; \nC 33 ; WX 1000 ; N arrowright ; B 56 72 942 428 ; \nC 34 ; WX 500 ; N arrowup ; B 72 -194 428 693 ; \nC 35 ; WX 500 ; N arrowdown ; B 72 -193 428 694 ; \nC 36 ; WX 1000 ; N arrowboth ; B 57 72 942 428 ; \nC 37 ; WX 1000 ; N arrownortheast ; B 56 -193 946 697 ; \nC 38 ; WX 1000 ; N arrowsoutheast ; B 56 -197 946 693 ; \nC 39 ; WX 777.778 ; N similarequal ; B 56 36 721 464 ; \nC 40 ; WX 1000 ; N arrowdblleft ; B 57 -25 943 525 ; \nC 41 ; WX 1000 ; N arrowdblright ; B 56 -25 942 525 ; \nC 42 ; WX 611.111 ; N arrowdblup ; B 30 -194 580 694 ; \nC 43 ; WX 611.111 ; N arrowdbldown ; B 30 -194 580 694 ; \nC 44 ; WX 1000 ; N arrowdblboth ; B 35 -25 964 525 ; \nC 45 ; WX 1000 ; N arrownorthwest ; B 53 -193 943 697 ; \nC 46 ; WX 1000 ; N arrowsouthwest ; B 53 -197 943 693 ; \nC 47 ; WX 777.778 ; N proportional ; B 56 -11 722 442 ; \nC 48 ; WX 275 ; N prime ; B 29 45 262 559 ; \nC 49 ; WX 1000 ; N infinity ; B 56 -11 943 442 ; \nC 50 ; WX 666.667 ; N element ; B 83 -40 583 540 ; \nC 51 ; WX 666.667 ; N owner ; B 83 -40 583 540 ; \nC 52 ; WX 888.889 ; N triangle ; B 59 0 829 716 ; \nC 53 ; WX 888.889 ; N triangleinv ; B 59 -216 829 500 ; \nC 54 ; WX 0 ; N negationslash ; B 139 -216 638 716 ; \nC 55 ; WX 0 ; N mapsto ; B 56 64 124 436 ; \nC 56 ; WX 555.556 ; N universal ; B 0 -22 556 694 ; \nC 57 ; WX 555.556 ; N existential ; B 56 0 499 694 ; \nC 58 ; WX 666.667 ; N logicalnot ; B 56 89 610 356 ; \nC 59 ; WX 500 ; N emptyset ; B 47 -78 452 772 ; \nC 60 ; WX 722.222 ; N Rfractur ; B 46 -22 714 716 ; \nC 61 ; WX 722.222 ; N Ifractur ; B 56 -11 693 705 ; \nC 62 ; WX 777.778 ; N latticetop ; B 56 0 722 666 ; \nC 63 ; WX 777.778 ; N perpendicular ; B 56 0 722 666 ; \nC 64 ; WX 611.111 ; N aleph ; B 56 0 554 693 ; \nC 65 ; WX 798.469 ; N A ; B 27 -50 798 722 ; \nC 66 ; WX 656.808 ; N B ; B 30 -22 665 706 ; \nC 67 ; WX 526.527 ; N C ; B 12 -24 534 705 ; \nC 68 ; WX 771.391 ; N D ; B 20 0 766 683 ; \nC 69 ; WX 527.778 ; N E ; B 28 -22 565 705 ; \nC 70 ; WX 718.75 ; N F ; B 17 -33 829 683 ; \nC 71 ; WX 594.864 ; N G ; B 44 -119 601 705 ; \nC 72 ; WX 844.516 ; N H ; B 20 -47 818 683 ; \nC 73 ; WX 544.513 ; N I ; B -24 0 635 683 ; \nC 74 ; WX 677.778 ; N J ; B 47 -119 840 683 ; \nC 75 ; WX 761.949 ; N K ; B 30 -22 733 705 ; \nC 76 ; WX 689.723 ; N L ; B 31 -22 656 705 ; \nC 77 ; WX 1200.9 ; N M ; B 27 -50 1116 705 ; \nC 78 ; WX 820.489 ; N N ; B -29 -50 978 775 ; \nC 79 ; WX 796.112 ; N O ; B 57 -22 777 705 ; \nC 80 ; WX 695.558 ; N P ; B 20 -50 733 683 ; \nC 81 ; WX 816.667 ; N Q ; B 113 -124 788 705 ; \nC 82 ; WX 847.502 ; N R ; B 20 -22 837 683 ; \nC 83 ; WX 605.556 ; N S ; B 18 -22 642 705 ; \nC 84 ; WX 544.643 ; N T ; B 29 0 798 717 ; \nC 85 ; WX 625.83 ; N U ; B -17 -28 688 683 ; \nC 86 ; WX 612.781 ; N V ; B 35 -45 660 683 ; \nC 87 ; WX 987.782 ; N W ; B 35 -45 1036 683 ; \nC 88 ; WX 713.295 ; N X ; B 50 0 808 683 ; \nC 89 ; WX 668.335 ; N Y ; B 31 -135 717 683 ; \nC 90 ; WX 724.724 ; N Z ; B 37 0 767 683 ; \nC 91 ; WX 666.667 ; N union ; B 56 -22 610 598 ; \nC 92 ; WX 666.667 ; N intersection ; B 56 -22 610 598 ; \nC 93 ; WX 666.667 ; N unionmulti ; B 56 -22 610 598 ; \nC 94 ; WX 666.667 ; N logicaland ; B 56 -22 610 598 ; \nC 95 ; WX 666.667 ; N logicalor ; B 56 -22 610 598 ; \nC 96 ; WX 611.111 ; N turnstileleft ; B 56 0 554 694 ; \nC 97 ; WX 611.111 ; N turnstileright ; B 56 0 554 694 ; \nC 98 ; WX 444.444 ; N floorleft ; B 174 -250 422 750 ; \nC 99 ; WX 444.444 ; N floorright ; B 21 -250 269 750 ; \nC 100 ; WX 444.444 ; N ceilingleft ; B 174 -250 422 750 ; \nC 101 ; WX 444.444 ; N ceilingright ; B 21 -250 269 750 ; \nC 102 ; WX 500 ; N braceleft ; B 72 -250 427 750 ; \nC 103 ; WX 500 ; N braceright ; B 72 -250 427 750 ; \nC 104 ; WX 388.889 ; N angbracketleft ; B 110 -250 332 750 ; \nC 105 ; WX 388.889 ; N angbracketright ; B 56 -250 278 750 ; \nC 106 ; WX 277.778 ; N bar ; B 119 -250 159 750 ; \nC 107 ; WX 500 ; N bardbl ; B 132 -250 367 750 ; \nC 108 ; WX 500 ; N arrowbothv ; B 72 -272 428 772 ; \nC 109 ; WX 611.111 ; N arrowdblbothv ; B 30 -272 580 772 ; \nC 110 ; WX 500 ; N backslash ; B 56 -250 443 750 ; \nC 111 ; WX 277.778 ; N wreathproduct ; B 56 -83 221 583 ; \nC 112 ; WX 833.333 ; N radical ; B 73 -960 853 40 ; \nC 113 ; WX 750 ; N coproduct ; B 36 0 713 683 ; \nC 114 ; WX 833.333 ; N nabla ; B 47 -33 785 683 ; \nC 115 ; WX 416.667 ; N integral ; B 56 -216 471 716 ; \nC 116 ; WX 666.667 ; N unionsq ; B 61 0 605 598 ; \nC 117 ; WX 666.667 ; N intersectionsq ; B 61 0 605 598 ; \nC 118 ; WX 777.778 ; N subsetsqequal ; B 83 -137 714 636 ; \nC 119 ; WX 777.778 ; N supersetsqequal ; B 63 -137 694 636 ; \nC 120 ; WX 444.444 ; N section ; B 69 -205 374 705 ; \nC 121 ; WX 444.444 ; N dagger ; B 56 -216 387 705 ; \nC 122 ; WX 444.444 ; N daggerdbl ; B 56 -205 387 705 ; \nC 123 ; WX 611.111 ; N paragraph ; B 56 -194 582 694 ; \nC 124 ; WX 777.778 ; N club ; B 28 -130 750 727 ; \nC 125 ; WX 777.778 ; N diamond ; B 56 -163 722 727 ; \nC 126 ; WX 777.778 ; N heart ; B 56 -33 722 716 ; \nC 127 ; WX 777.778 ; N spade ; B 56 -130 722 727 ; \nC -1 ; WX 333.333 ; N space ; B 0 0 0 0 ;\nEndCharMetrics\nComment The following are bogus kern pairs for TeX positioning of accents\nStartKernData\nStartKernPairs 26\nKPX A prime 194.444\nKPX B prime 138.889\nKPX C prime 138.889\nKPX D prime 83.333\nKPX E prime 111.111\nKPX F prime 111.111\nKPX G prime 111.111\nKPX H prime 111.111\nKPX I prime 27.778\nKPX J prime 166.667\nKPX K prime 55.556\nKPX L prime 138.889\nKPX M prime 138.889\nKPX N prime 83.333\nKPX O prime 111.111\nKPX P prime 83.333\nKPX Q prime 111.111\nKPX R prime 83.333\nKPX S prime 138.889\nKPX T prime 27.778\nKPX U prime 83.333\nKPX V prime 27.778\nKPX W prime 83.333\nKPX X prime 138.889\nKPX Y prime 83.333\nKPX Z prime 138.889\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/cmtt10.afm",
    "content": "StartFontMetrics 2.0\nComment Creation Date: Thu Jun 21 22:23:51 1990\nComment UniqueID 5000832\nFontName CMTT10\nEncodingScheme FontSpecific\nFullName CMTT10\nFamilyName Computer Modern\nWeight Medium\nItalicAngle 0.0\nIsFixedPitch true\nVersion 1.00B\nNotice Copyright (c) 1997 American Mathematical Society.  All Rights Reserved.\nComment Computer Modern fonts were designed by Donald E. Knuth\nFontBBox -4 -235 731 800\nCapHeight 611.111\nXHeight 430.556\nAscender 611.111\nDescender -222.222\nComment FontID CMTT\nComment DesignSize 10 (pts)\nComment CharacterCodingScheme TeX typewriter text\nComment Space 525 0 0 \nComment ExtraSpace 525\nComment Quad 1050\nStartCharMetrics 129\nC 0 ; WX 525 ; N Gamma ; B 32 0 488 611 ; \nC 1 ; WX 525 ; N Delta ; B 34 0 490 623 ; \nC 2 ; WX 525 ; N Theta ; B 56 -11 468 622 ; \nC 3 ; WX 525 ; N Lambda ; B 29 0 495 623 ; \nC 4 ; WX 525 ; N Xi ; B 33 0 491 611 ; \nC 5 ; WX 525 ; N Pi ; B 22 0 502 611 ; \nC 6 ; WX 525 ; N Sigma ; B 40 0 484 611 ; \nC 7 ; WX 525 ; N Upsilon ; B 38 0 486 622 ; \nC 8 ; WX 525 ; N Phi ; B 40 0 484 611 ; \nC 9 ; WX 525 ; N Psi ; B 38 0 486 611 ; \nC 10 ; WX 525 ; N Omega ; B 32 0 492 622 ; \nC 11 ; WX 525 ; N arrowup ; B 59 0 465 611 ; \nC 12 ; WX 525 ; N arrowdown ; B 59 0 465 611 ; \nC 13 ; WX 525 ; N quotesingle ; B 217 328 309 622 ; \nC 14 ; WX 525 ; N exclamdown ; B 212 -233 312 389 ; \nC 15 ; WX 525 ; N questiondown ; B 62 -228 462 389 ; \nC 16 ; WX 525 ; N dotlessi ; B 78 0 455 431 ; \nC 17 ; WX 525 ; N dotlessj ; B 48 -228 368 431 ; \nC 18 ; WX 525 ; N grave ; B 117 477 329 611 ; \nC 19 ; WX 525 ; N acute ; B 195 477 407 611 ; \nC 20 ; WX 525 ; N caron ; B 101 454 423 572 ; \nC 21 ; WX 525 ; N breve ; B 86 498 438 611 ; \nC 22 ; WX 525 ; N macron ; B 73 514 451 577 ; \nC 23 ; WX 525 ; N ring ; B 181 499 343 619 ; \nC 24 ; WX 525 ; N cedilla ; B 162 -208 428 45 ; \nC 25 ; WX 525 ; N germandbls ; B 17 -6 495 617 ; \nC 26 ; WX 525 ; N ae ; B 33 -6 504 440 ; \nC 27 ; WX 525 ; N oe ; B 19 -6 505 440 ; \nC 28 ; WX 525 ; N oslash ; B 43 -140 481 571 ; \nC 29 ; WX 525 ; N AE ; B 23 0 499 611 ; \nC 30 ; WX 525 ; N OE ; B 29 -11 502 622 ; \nC 31 ; WX 525 ; N Oslash ; B 56 -85 468 696 ; \nC 32 ; WX 525 ; N visiblespace ; B 44 -132 480 240 ; \nC 33 ; WX 525 ; N exclam ; B 212 0 312 622 ; L quoteleft exclamdown ; \nC 34 ; WX 525 ; N quotedbl ; B 126 328 398 622 ; \nC 35 ; WX 525 ; N numbersign ; B 35 0 489 611 ; \nC 36 ; WX 525 ; N dollar ; B 58 -83 466 694 ; \nC 37 ; WX 525 ; N percent ; B 35 -83 489 694 ; \nC 38 ; WX 525 ; N ampersand ; B 28 -11 490 622 ; \nC 39 ; WX 525 ; N quoteright ; B 180 302 341 611 ; \nC 40 ; WX 525 ; N parenleft ; B 173 -82 437 694 ; \nC 41 ; WX 525 ; N parenright ; B 88 -82 352 694 ; \nC 42 ; WX 525 ; N asterisk ; B 68 90 456 521 ; \nC 43 ; WX 525 ; N plus ; B 38 81 486 531 ; \nC 44 ; WX 525 ; N comma ; B 180 -139 346 125 ; \nC 45 ; WX 525 ; N hyphen ; B 56 271 468 341 ; \nC 46 ; WX 525 ; N period ; B 200 0 325 125 ; \nC 47 ; WX 525 ; N slash ; B 58 -83 466 694 ; \nC 48 ; WX 525 ; N zero ; B 50 -11 474 622 ; \nC 49 ; WX 525 ; N one ; B 105 0 442 622 ; \nC 50 ; WX 525 ; N two ; B 52 0 472 622 ; \nC 51 ; WX 525 ; N three ; B 44 -11 480 622 ; \nC 52 ; WX 525 ; N four ; B 29 0 495 623 ; \nC 53 ; WX 525 ; N five ; B 52 -11 472 611 ; \nC 54 ; WX 525 ; N six ; B 53 -11 471 622 ; \nC 55 ; WX 525 ; N seven ; B 44 -11 480 627 ; \nC 56 ; WX 525 ; N eight ; B 44 -11 480 622 ; \nC 57 ; WX 525 ; N nine ; B 53 -11 471 622 ; \nC 58 ; WX 525 ; N colon ; B 200 0 325 431 ; \nC 59 ; WX 525 ; N semicolon ; B 180 -139 330 431 ; \nC 60 ; WX 525 ; N less ; B 56 56 468 556 ; \nC 61 ; WX 525 ; N equal ; B 38 195 486 417 ; \nC 62 ; WX 525 ; N greater ; B 56 56 468 556 ; \nC 63 ; WX 525 ; N question ; B 62 0 462 617 ; L quoteleft questiondown ; \nC 64 ; WX 525 ; N at ; B 44 -6 480 617 ; \nC 65 ; WX 525 ; N A ; B 27 0 497 623 ; \nC 66 ; WX 525 ; N B ; B 23 0 482 611 ; \nC 67 ; WX 525 ; N C ; B 40 -11 484 622 ; \nC 68 ; WX 525 ; N D ; B 19 0 485 611 ; \nC 69 ; WX 525 ; N E ; B 26 0 502 611 ; \nC 70 ; WX 525 ; N F ; B 28 0 490 611 ; \nC 71 ; WX 525 ; N G ; B 38 -11 496 622 ; \nC 72 ; WX 525 ; N H ; B 22 0 502 611 ; \nC 73 ; WX 525 ; N I ; B 79 0 446 611 ; \nC 74 ; WX 525 ; N J ; B 71 -11 478 611 ; \nC 75 ; WX 525 ; N K ; B 26 0 495 611 ; \nC 76 ; WX 525 ; N L ; B 32 0 488 611 ; \nC 77 ; WX 525 ; N M ; B 17 0 507 611 ; \nC 78 ; WX 525 ; N N ; B 28 0 496 611 ; \nC 79 ; WX 525 ; N O ; B 56 -11 468 622 ; \nC 80 ; WX 525 ; N P ; B 26 0 480 611 ; \nC 81 ; WX 525 ; N Q ; B 56 -139 468 622 ; \nC 82 ; WX 525 ; N R ; B 22 -11 522 611 ; \nC 83 ; WX 525 ; N S ; B 52 -11 472 622 ; \nC 84 ; WX 525 ; N T ; B 26 0 498 611 ; \nC 85 ; WX 525 ; N U ; B 4 -11 520 611 ; \nC 86 ; WX 525 ; N V ; B 18 -8 506 611 ; \nC 87 ; WX 525 ; N W ; B 11 -8 513 611 ; \nC 88 ; WX 525 ; N X ; B 27 0 496 611 ; \nC 89 ; WX 525 ; N Y ; B 19 0 505 611 ; \nC 90 ; WX 525 ; N Z ; B 48 0 481 611 ; \nC 91 ; WX 525 ; N bracketleft ; B 222 -83 483 694 ; \nC 92 ; WX 525 ; N backslash ; B 58 -83 466 694 ; \nC 93 ; WX 525 ; N bracketright ; B 41 -83 302 694 ; \nC 94 ; WX 525 ; N asciicircum ; B 100 471 424 611 ; \nC 95 ; WX 525 ; N underscore ; B 56 -95 468 -25 ; \nC 96 ; WX 525 ; N quoteleft ; B 183 372 344 681 ; \nC 97 ; WX 525 ; N a ; B 55 -6 524 440 ; \nC 98 ; WX 525 ; N b ; B 12 -6 488 611 ; \nC 99 ; WX 525 ; N c ; B 73 -6 466 440 ; \nC 100 ; WX 525 ; N d ; B 36 -6 512 611 ; \nC 101 ; WX 525 ; N e ; B 55 -6 464 440 ; \nC 102 ; WX 525 ; N f ; B 42 0 437 617 ; \nC 103 ; WX 525 ; N g ; B 29 -229 509 442 ; \nC 104 ; WX 525 ; N h ; B 12 0 512 611 ; \nC 105 ; WX 525 ; N i ; B 78 0 455 612 ; \nC 106 ; WX 525 ; N j ; B 48 -228 368 612 ; \nC 107 ; WX 525 ; N k ; B 21 0 508 611 ; \nC 108 ; WX 525 ; N l ; B 58 0 467 611 ; \nC 109 ; WX 525 ; N m ; B -4 0 516 437 ; \nC 110 ; WX 525 ; N n ; B 12 0 512 437 ; \nC 111 ; WX 525 ; N o ; B 57 -6 467 440 ; \nC 112 ; WX 525 ; N p ; B 12 -222 488 437 ; \nC 113 ; WX 525 ; N q ; B 40 -222 537 437 ; \nC 114 ; WX 525 ; N r ; B 32 0 487 437 ; \nC 115 ; WX 525 ; N s ; B 72 -6 459 440 ; \nC 116 ; WX 525 ; N t ; B 25 -6 449 554 ; \nC 117 ; WX 525 ; N u ; B 12 -6 512 431 ; \nC 118 ; WX 525 ; N v ; B 24 -4 500 431 ; \nC 119 ; WX 525 ; N w ; B 16 -4 508 431 ; \nC 120 ; WX 525 ; N x ; B 27 0 496 431 ; \nC 121 ; WX 525 ; N y ; B 26 -228 500 431 ; \nC 122 ; WX 525 ; N z ; B 33 0 475 431 ; \nC 123 ; WX 525 ; N braceleft ; B 57 -83 467 694 ; \nC 124 ; WX 525 ; N bar ; B 227 -83 297 694 ; \nC 125 ; WX 525 ; N braceright ; B 57 -83 467 694 ; \nC 126 ; WX 525 ; N asciitilde ; B 87 491 437 611 ; \nC 127 ; WX 525 ; N dieresis ; B 110 512 414 612 ; \nC -1 ; WX 525 ; N space ; B 0 0 0 0 ; \nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pagd8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990, 1991 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Mon Mar  4 13:46:34 1991\nComment UniqueID 34370\nComment VMusage 24954 31846\nFontName AvantGarde-Demi\nFullName ITC Avant Garde Gothic Demi\nFamilyName ITC Avant Garde Gothic\nWeight Demi\nItalicAngle 0\nIsFixedPitch false\nFontBBox -123 -251 1222 1021\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.007\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1991 Adobe Systems Incorporated.  All Rights Reserved.ITC Avant Garde Gothic is a registered trademark of International Typeface Corporation.\nEncodingScheme AdobeStandardEncoding\nCapHeight 740\nXHeight 555\nAscender 740\nDescender -185\nStartCharMetrics 228\nC 32 ; WX 280 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 280 ; N exclam ; B 73 0 206 740 ;\nC 34 ; WX 360 ; N quotedbl ; B 19 444 341 740 ;\nC 35 ; WX 560 ; N numbersign ; B 29 0 525 700 ;\nC 36 ; WX 560 ; N dollar ; B 58 -86 501 857 ;\nC 37 ; WX 860 ; N percent ; B 36 -15 822 755 ;\nC 38 ; WX 680 ; N ampersand ; B 34 -15 665 755 ;\nC 39 ; WX 280 ; N quoteright ; B 72 466 205 740 ;\nC 40 ; WX 380 ; N parenleft ; B 74 -157 350 754 ;\nC 41 ; WX 380 ; N parenright ; B 37 -157 313 754 ;\nC 42 ; WX 440 ; N asterisk ; B 67 457 374 755 ;\nC 43 ; WX 600 ; N plus ; B 48 0 552 506 ;\nC 44 ; WX 280 ; N comma ; B 73 -141 206 133 ;\nC 45 ; WX 420 ; N hyphen ; B 71 230 349 348 ;\nC 46 ; WX 280 ; N period ; B 73 0 206 133 ;\nC 47 ; WX 460 ; N slash ; B 6 -100 454 740 ;\nC 48 ; WX 560 ; N zero ; B 32 -15 529 755 ;\nC 49 ; WX 560 ; N one ; B 137 0 363 740 ;\nC 50 ; WX 560 ; N two ; B 36 0 523 755 ;\nC 51 ; WX 560 ; N three ; B 28 -15 532 755 ;\nC 52 ; WX 560 ; N four ; B 15 0 545 740 ;\nC 53 ; WX 560 ; N five ; B 25 -15 535 740 ;\nC 54 ; WX 560 ; N six ; B 23 -15 536 739 ;\nC 55 ; WX 560 ; N seven ; B 62 0 498 740 ;\nC 56 ; WX 560 ; N eight ; B 33 -15 527 755 ;\nC 57 ; WX 560 ; N nine ; B 24 0 537 754 ;\nC 58 ; WX 280 ; N colon ; B 73 0 206 555 ;\nC 59 ; WX 280 ; N semicolon ; B 73 -141 206 555 ;\nC 60 ; WX 600 ; N less ; B 46 -8 554 514 ;\nC 61 ; WX 600 ; N equal ; B 48 81 552 425 ;\nC 62 ; WX 600 ; N greater ; B 46 -8 554 514 ;\nC 63 ; WX 560 ; N question ; B 38 0 491 755 ;\nC 64 ; WX 740 ; N at ; B 50 -12 750 712 ;\nC 65 ; WX 740 ; N A ; B 7 0 732 740 ;\nC 66 ; WX 580 ; N B ; B 70 0 551 740 ;\nC 67 ; WX 780 ; N C ; B 34 -15 766 755 ;\nC 68 ; WX 700 ; N D ; B 63 0 657 740 ;\nC 69 ; WX 520 ; N E ; B 61 0 459 740 ;\nC 70 ; WX 480 ; N F ; B 61 0 438 740 ;\nC 71 ; WX 840 ; N G ; B 27 -15 817 755 ;\nC 72 ; WX 680 ; N H ; B 71 0 610 740 ;\nC 73 ; WX 280 ; N I ; B 72 0 209 740 ;\nC 74 ; WX 480 ; N J ; B 2 -15 409 740 ;\nC 75 ; WX 620 ; N K ; B 89 0 620 740 ;\nC 76 ; WX 440 ; N L ; B 72 0 435 740 ;\nC 77 ; WX 900 ; N M ; B 63 0 837 740 ;\nC 78 ; WX 740 ; N N ; B 70 0 671 740 ;\nC 79 ; WX 840 ; N O ; B 33 -15 807 755 ;\nC 80 ; WX 560 ; N P ; B 72 0 545 740 ;\nC 81 ; WX 840 ; N Q ; B 32 -15 824 755 ;\nC 82 ; WX 580 ; N R ; B 64 0 565 740 ;\nC 83 ; WX 520 ; N S ; B 12 -15 493 755 ;\nC 84 ; WX 420 ; N T ; B 6 0 418 740 ;\nC 85 ; WX 640 ; N U ; B 55 -15 585 740 ;\nC 86 ; WX 700 ; N V ; B 8 0 695 740 ;\nC 87 ; WX 900 ; N W ; B 7 0 899 740 ;\nC 88 ; WX 680 ; N X ; B 4 0 676 740 ;\nC 89 ; WX 620 ; N Y ; B -2 0 622 740 ;\nC 90 ; WX 500 ; N Z ; B 19 0 481 740 ;\nC 91 ; WX 320 ; N bracketleft ; B 66 -157 284 754 ;\nC 92 ; WX 640 ; N backslash ; B 96 -100 544 740 ;\nC 93 ; WX 320 ; N bracketright ; B 36 -157 254 754 ;\nC 94 ; WX 600 ; N asciicircum ; B 73 375 527 740 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 280 ; N quoteleft ; B 72 466 205 740 ;\nC 97 ; WX 660 ; N a ; B 27 -18 613 574 ;\nC 98 ; WX 660 ; N b ; B 47 -18 632 740 ;\nC 99 ; WX 640 ; N c ; B 37 -18 610 574 ;\nC 100 ; WX 660 ; N d ; B 34 -18 618 740 ;\nC 101 ; WX 640 ; N e ; B 31 -18 610 577 ;\nC 102 ; WX 280 ; N f ; B 15 0 280 755 ; L i fi ; L l fl ;\nC 103 ; WX 660 ; N g ; B 32 -226 623 574 ;\nC 104 ; WX 600 ; N h ; B 54 0 546 740 ;\nC 105 ; WX 240 ; N i ; B 53 0 186 740 ;\nC 106 ; WX 260 ; N j ; B 16 -185 205 740 ;\nC 107 ; WX 580 ; N k ; B 80 0 571 740 ;\nC 108 ; WX 240 ; N l ; B 54 0 187 740 ;\nC 109 ; WX 940 ; N m ; B 54 0 887 574 ;\nC 110 ; WX 600 ; N n ; B 54 0 547 574 ;\nC 111 ; WX 640 ; N o ; B 25 -18 615 574 ;\nC 112 ; WX 660 ; N p ; B 47 -185 629 574 ;\nC 113 ; WX 660 ; N q ; B 31 -185 613 574 ;\nC 114 ; WX 320 ; N r ; B 63 0 317 574 ;\nC 115 ; WX 440 ; N s ; B 19 -18 421 574 ;\nC 116 ; WX 300 ; N t ; B 21 0 299 740 ;\nC 117 ; WX 600 ; N u ; B 50 -18 544 555 ;\nC 118 ; WX 560 ; N v ; B 3 0 556 555 ;\nC 119 ; WX 800 ; N w ; B 11 0 789 555 ;\nC 120 ; WX 560 ; N x ; B 3 0 556 555 ;\nC 121 ; WX 580 ; N y ; B 8 -185 571 555 ;\nC 122 ; WX 460 ; N z ; B 20 0 442 555 ;\nC 123 ; WX 340 ; N braceleft ; B -3 -191 317 747 ;\nC 124 ; WX 600 ; N bar ; B 233 -100 366 740 ;\nC 125 ; WX 340 ; N braceright ; B 23 -191 343 747 ;\nC 126 ; WX 600 ; N asciitilde ; B 67 160 533 347 ;\nC 161 ; WX 280 ; N exclamdown ; B 74 -185 207 555 ;\nC 162 ; WX 560 ; N cent ; B 43 39 517 715 ;\nC 163 ; WX 560 ; N sterling ; B -2 0 562 755 ;\nC 164 ; WX 160 ; N fraction ; B -123 0 282 740 ;\nC 165 ; WX 560 ; N yen ; B -10 0 570 740 ;\nC 166 ; WX 560 ; N florin ; B 0 -151 512 824 ;\nC 167 ; WX 560 ; N section ; B 28 -158 530 755 ;\nC 168 ; WX 560 ; N currency ; B 27 69 534 577 ;\nC 169 ; WX 220 ; N quotesingle ; B 44 444 177 740 ;\nC 170 ; WX 480 ; N quotedblleft ; B 70 466 410 740 ;\nC 171 ; WX 460 ; N guillemotleft ; B 61 108 400 469 ;\nC 172 ; WX 240 ; N guilsinglleft ; B 50 108 190 469 ;\nC 173 ; WX 240 ; N guilsinglright ; B 50 108 190 469 ;\nC 174 ; WX 520 ; N fi ; B 25 0 461 755 ;\nC 175 ; WX 520 ; N fl ; B 25 0 461 755 ;\nC 177 ; WX 500 ; N endash ; B 35 230 465 348 ;\nC 178 ; WX 560 ; N dagger ; B 51 -142 509 740 ;\nC 179 ; WX 560 ; N daggerdbl ; B 51 -142 509 740 ;\nC 180 ; WX 280 ; N periodcentered ; B 73 187 206 320 ;\nC 182 ; WX 600 ; N paragraph ; B -7 -103 607 740 ;\nC 183 ; WX 600 ; N bullet ; B 148 222 453 532 ;\nC 184 ; WX 280 ; N quotesinglbase ; B 72 -141 205 133 ;\nC 185 ; WX 480 ; N quotedblbase ; B 70 -141 410 133 ;\nC 186 ; WX 480 ; N quotedblright ; B 70 466 410 740 ;\nC 187 ; WX 460 ; N guillemotright ; B 61 108 400 469 ;\nC 188 ; WX 1000 ; N ellipsis ; B 100 0 899 133 ;\nC 189 ; WX 1280 ; N perthousand ; B 36 -15 1222 755 ;\nC 191 ; WX 560 ; N questiondown ; B 68 -200 521 555 ;\nC 193 ; WX 420 ; N grave ; B 50 624 329 851 ;\nC 194 ; WX 420 ; N acute ; B 91 624 370 849 ;\nC 195 ; WX 540 ; N circumflex ; B 71 636 470 774 ;\nC 196 ; WX 480 ; N tilde ; B 44 636 437 767 ;\nC 197 ; WX 420 ; N macron ; B 72 648 349 759 ;\nC 198 ; WX 480 ; N breve ; B 42 633 439 770 ;\nC 199 ; WX 280 ; N dotaccent ; B 74 636 207 769 ;\nC 200 ; WX 500 ; N dieresis ; B 78 636 422 769 ;\nC 202 ; WX 360 ; N ring ; B 73 619 288 834 ;\nC 203 ; WX 340 ; N cedilla ; B 98 -251 298 6 ;\nC 205 ; WX 700 ; N hungarumlaut ; B 132 610 609 862 ;\nC 206 ; WX 340 ; N ogonek ; B 79 -195 262 9 ;\nC 207 ; WX 540 ; N caron ; B 71 636 470 774 ;\nC 208 ; WX 1000 ; N emdash ; B 35 230 965 348 ;\nC 225 ; WX 900 ; N AE ; B -5 0 824 740 ;\nC 227 ; WX 360 ; N ordfeminine ; B 19 438 334 755 ;\nC 232 ; WX 480 ; N Lslash ; B 26 0 460 740 ;\nC 233 ; WX 840 ; N Oslash ; B 33 -71 807 814 ;\nC 234 ; WX 1060 ; N OE ; B 37 -15 1007 755 ;\nC 235 ; WX 360 ; N ordmasculine ; B 23 438 338 755 ;\nC 241 ; WX 1080 ; N ae ; B 29 -18 1048 574 ;\nC 245 ; WX 240 ; N dotlessi ; B 53 0 186 555 ;\nC 248 ; WX 320 ; N lslash ; B 34 0 305 740 ;\nC 249 ; WX 660 ; N oslash ; B 35 -50 625 608 ;\nC 250 ; WX 1080 ; N oe ; B 30 -18 1050 574 ;\nC 251 ; WX 600 ; N germandbls ; B 51 -18 585 755 ;\nC -1 ; WX 640 ; N ecircumflex ; B 31 -18 610 774 ;\nC -1 ; WX 640 ; N edieresis ; B 31 -18 610 769 ;\nC -1 ; WX 660 ; N aacute ; B 27 -18 613 849 ;\nC -1 ; WX 740 ; N registered ; B -12 -12 752 752 ;\nC -1 ; WX 240 ; N icircumflex ; B -79 0 320 774 ;\nC -1 ; WX 600 ; N udieresis ; B 50 -18 544 769 ;\nC -1 ; WX 640 ; N ograve ; B 25 -18 615 851 ;\nC -1 ; WX 600 ; N uacute ; B 50 -18 544 849 ;\nC -1 ; WX 600 ; N ucircumflex ; B 50 -18 544 774 ;\nC -1 ; WX 740 ; N Aacute ; B 7 0 732 1019 ;\nC -1 ; WX 240 ; N igrave ; B -65 0 214 851 ;\nC -1 ; WX 280 ; N Icircumflex ; B -59 0 340 944 ;\nC -1 ; WX 640 ; N ccedilla ; B 37 -251 610 574 ;\nC -1 ; WX 660 ; N adieresis ; B 27 -18 613 769 ;\nC -1 ; WX 520 ; N Ecircumflex ; B 61 0 460 944 ;\nC -1 ; WX 440 ; N scaron ; B 19 -18 421 774 ;\nC -1 ; WX 660 ; N thorn ; B 47 -185 629 740 ;\nC -1 ; WX 1000 ; N trademark ; B 9 296 821 740 ;\nC -1 ; WX 640 ; N egrave ; B 31 -18 610 851 ;\nC -1 ; WX 336 ; N threesuperior ; B 8 287 328 749 ;\nC -1 ; WX 460 ; N zcaron ; B 20 0 455 774 ;\nC -1 ; WX 660 ; N atilde ; B 27 -18 613 767 ;\nC -1 ; WX 660 ; N aring ; B 27 -18 613 834 ;\nC -1 ; WX 640 ; N ocircumflex ; B 25 -18 615 774 ;\nC -1 ; WX 520 ; N Edieresis ; B 61 0 459 939 ;\nC -1 ; WX 840 ; N threequarters ; B 18 0 803 749 ;\nC -1 ; WX 580 ; N ydieresis ; B 8 -185 571 769 ;\nC -1 ; WX 580 ; N yacute ; B 8 -185 571 849 ;\nC -1 ; WX 240 ; N iacute ; B 26 0 305 849 ;\nC -1 ; WX 740 ; N Acircumflex ; B 7 0 732 944 ;\nC -1 ; WX 640 ; N Uacute ; B 55 -15 585 1019 ;\nC -1 ; WX 640 ; N eacute ; B 31 -18 610 849 ;\nC -1 ; WX 840 ; N Ograve ; B 33 -15 807 1021 ;\nC -1 ; WX 660 ; N agrave ; B 27 -18 613 851 ;\nC -1 ; WX 640 ; N Udieresis ; B 55 -15 585 939 ;\nC -1 ; WX 660 ; N acircumflex ; B 27 -18 613 774 ;\nC -1 ; WX 280 ; N Igrave ; B -45 0 234 1021 ;\nC -1 ; WX 336 ; N twosuperior ; B 13 296 322 749 ;\nC -1 ; WX 640 ; N Ugrave ; B 55 -15 585 1021 ;\nC -1 ; WX 840 ; N onequarter ; B 92 0 746 740 ;\nC -1 ; WX 640 ; N Ucircumflex ; B 55 -15 585 944 ;\nC -1 ; WX 520 ; N Scaron ; B 12 -15 493 944 ;\nC -1 ; WX 280 ; N Idieresis ; B -32 0 312 939 ;\nC -1 ; WX 240 ; N idieresis ; B -52 0 292 769 ;\nC -1 ; WX 520 ; N Egrave ; B 61 0 459 1021 ;\nC -1 ; WX 840 ; N Oacute ; B 33 -15 807 1019 ;\nC -1 ; WX 600 ; N divide ; B 48 -20 552 526 ;\nC -1 ; WX 740 ; N Atilde ; B 7 0 732 937 ;\nC -1 ; WX 740 ; N Aring ; B 7 0 732 969 ;\nC -1 ; WX 840 ; N Odieresis ; B 33 -15 807 939 ;\nC -1 ; WX 740 ; N Adieresis ; B 7 0 732 939 ;\nC -1 ; WX 740 ; N Ntilde ; B 70 0 671 937 ;\nC -1 ; WX 500 ; N Zcaron ; B 19 0 481 944 ;\nC -1 ; WX 560 ; N Thorn ; B 72 0 545 740 ;\nC -1 ; WX 280 ; N Iacute ; B 46 0 325 1019 ;\nC -1 ; WX 600 ; N plusminus ; B 48 -62 552 556 ;\nC -1 ; WX 600 ; N multiply ; B 59 12 541 494 ;\nC -1 ; WX 520 ; N Eacute ; B 61 0 459 1019 ;\nC -1 ; WX 620 ; N Ydieresis ; B -2 0 622 939 ;\nC -1 ; WX 336 ; N onesuperior ; B 72 296 223 740 ;\nC -1 ; WX 600 ; N ugrave ; B 50 -18 544 851 ;\nC -1 ; WX 600 ; N logicalnot ; B 48 108 552 425 ;\nC -1 ; WX 600 ; N ntilde ; B 54 0 547 767 ;\nC -1 ; WX 840 ; N Otilde ; B 33 -15 807 937 ;\nC -1 ; WX 640 ; N otilde ; B 25 -18 615 767 ;\nC -1 ; WX 780 ; N Ccedilla ; B 34 -251 766 755 ;\nC -1 ; WX 740 ; N Agrave ; B 7 0 732 1021 ;\nC -1 ; WX 840 ; N onehalf ; B 62 0 771 740 ;\nC -1 ; WX 742 ; N Eth ; B 25 0 691 740 ;\nC -1 ; WX 400 ; N degree ; B 57 426 343 712 ;\nC -1 ; WX 620 ; N Yacute ; B -2 0 622 1019 ;\nC -1 ; WX 840 ; N Ocircumflex ; B 33 -15 807 944 ;\nC -1 ; WX 640 ; N oacute ; B 25 -18 615 849 ;\nC -1 ; WX 576 ; N mu ; B 38 -187 539 555 ;\nC -1 ; WX 600 ; N minus ; B 48 193 552 313 ;\nC -1 ; WX 640 ; N eth ; B 27 -18 616 754 ;\nC -1 ; WX 640 ; N odieresis ; B 25 -18 615 769 ;\nC -1 ; WX 740 ; N copyright ; B -12 -12 752 752 ;\nC -1 ; WX 600 ; N brokenbar ; B 233 -100 366 740 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 218\n\nKPX A y -50\nKPX A w -65\nKPX A v -70\nKPX A u -20\nKPX A quoteright -90\nKPX A Y -80\nKPX A W -60\nKPX A V -102\nKPX A U -40\nKPX A T -25\nKPX A Q -50\nKPX A O -50\nKPX A G -40\nKPX A C -40\n\nKPX B A -10\n\nKPX C A -40\n\nKPX D period -20\nKPX D comma -20\nKPX D Y -45\nKPX D W -25\nKPX D V -50\nKPX D A -50\n\nKPX F period -129\nKPX F e -20\nKPX F comma -162\nKPX F a -20\nKPX F A -75\n\nKPX G period -20\nKPX G comma -20\nKPX G Y -15\n\nKPX J period -15\nKPX J a -20\nKPX J A -30\n\nKPX K y -20\nKPX K u -15\nKPX K o -45\nKPX K e -40\nKPX K O -30\n\nKPX L y -23\nKPX L quoteright -30\nKPX L quotedblright -30\nKPX L Y -80\nKPX L W -55\nKPX L V -85\nKPX L T -46\n\nKPX O period -30\nKPX O comma -30\nKPX O Y -30\nKPX O X -30\nKPX O W -20\nKPX O V -45\nKPX O T -15\nKPX O A -60\n\nKPX P period -200\nKPX P o -20\nKPX P e -20\nKPX P comma -220\nKPX P a -20\nKPX P A -100\n\nKPX Q comma 20\n\nKPX R W 25\nKPX R V -10\nKPX R U 25\nKPX R T 40\nKPX R O 25\n\nKPX S comma 20\n\nKPX T y -10\nKPX T w -55\nKPX T u -46\nKPX T semicolon -29\nKPX T r -30\nKPX T period -91\nKPX T o -49\nKPX T hyphen -75\nKPX T e -49\nKPX T comma -82\nKPX T colon -15\nKPX T a -70\nKPX T O -15\nKPX T A -25\n\nKPX U period -20\nKPX U comma -20\nKPX U A -40\n\nKPX V u -55\nKPX V semicolon -33\nKPX V period -145\nKPX V o -101\nKPX V i -15\nKPX V hyphen -75\nKPX V e -101\nKPX V comma -145\nKPX V colon -18\nKPX V a -95\nKPX V O -45\nKPX V G -20\nKPX V A -102\n\nKPX W y -15\nKPX W u -30\nKPX W semicolon -33\nKPX W period -106\nKPX W o -46\nKPX W i -10\nKPX W hyphen -35\nKPX W e -47\nKPX W comma -106\nKPX W colon -15\nKPX W a -50\nKPX W O -20\nKPX W A -58\n\nKPX Y u -52\nKPX Y semicolon -23\nKPX Y period -145\nKPX Y o -89\nKPX Y hyphen -100\nKPX Y e -89\nKPX Y comma -145\nKPX Y colon -10\nKPX Y a -93\nKPX Y O -30\nKPX Y A -80\n\nKPX a t 5\nKPX a p 20\nKPX a b 5\n\nKPX b y -20\nKPX b v -20\n\nKPX c y -20\nKPX c l -15\nKPX c k -15\n\nKPX comma space -50\nKPX comma quoteright -70\nKPX comma quotedblright -70\n\nKPX e y -20\nKPX e x -20\nKPX e w -20\nKPX e v -20\n\nKPX f period -40\nKPX f o -20\nKPX f l -15\nKPX f i -15\nKPX f f -20\nKPX f dotlessi -15\nKPX f comma -40\nKPX f a -15\n\nKPX g i 25\nKPX g a 15\n\nKPX h y -30\n\nKPX k y -5\nKPX k o -30\nKPX k e -40\n\nKPX m y -20\nKPX m u -20\n\nKPX n y -15\nKPX n v -30\n\nKPX o y -20\nKPX o x -30\nKPX o w -20\nKPX o v -30\n\nKPX p y -20\n\nKPX period space -50\nKPX period quoteright -70\nKPX period quotedblright -70\n\nKPX quotedblleft A -50\n\nKPX quotedblright space -50\n\nKPX quoteleft quoteleft -80\nKPX quoteleft A -50\n\nKPX quoteright v -10\nKPX quoteright t 10\nKPX quoteright space -50\nKPX quoteright s -15\nKPX quoteright r -20\nKPX quoteright quoteright -80\nKPX quoteright d -50\n\nKPX r y 40\nKPX r v 40\nKPX r u 20\nKPX r t 20\nKPX r s 20\nKPX r q -8\nKPX r period -73\nKPX r p 20\nKPX r o -15\nKPX r n 21\nKPX r m 15\nKPX r l 20\nKPX r k 5\nKPX r i 20\nKPX r hyphen -60\nKPX r g 1\nKPX r e -4\nKPX r d -6\nKPX r comma -75\nKPX r c -7\n\nKPX s period 20\nKPX s comma 20\n\nKPX space quoteleft -50\nKPX space quotedblleft -50\nKPX space Y -60\nKPX space W -25\nKPX space V -80\nKPX space T -25\nKPX space A -20\n\nKPX v period -90\nKPX v o -20\nKPX v e -20\nKPX v comma -90\nKPX v a -30\n\nKPX w period -90\nKPX w o -30\nKPX w e -20\nKPX w comma -90\nKPX w a -30\n\nKPX x e -20\n\nKPX y period -100\nKPX y o -30\nKPX y e -20\nKPX y comma -100\nKPX y c -35\nKPX y a -30\nEndKernPairs\nEndKernData\nStartComposites 56\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 160 170 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 100 170 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 120 170 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 160 170 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 190 135 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 130 170 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 50 170 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex -10 170 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 10 170 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 50 170 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute -45 170 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -130 170 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -110 170 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave -95 170 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 130 170 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 210 170 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 150 170 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 170 170 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 210 170 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 180 170 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron -10 170 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 145 170 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 50 170 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 70 170 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 75 170 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 135 170 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 60 170 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 5 170 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 120 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 60 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 80 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 120 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 150 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 90 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 110 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 50 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 70 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 110 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -65 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -150 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -130 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -115 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 60 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 110 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 50 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 70 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 110 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 80 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron -50 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 125 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 30 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 50 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 55 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 115 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 40 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron -15 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pagdo8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990, 1991 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Mon Mar  4 13:49:44 1991\nComment UniqueID 34373\nComment VMusage 6550 39938\nFontName AvantGarde-DemiOblique\nFullName ITC Avant Garde Gothic Demi Oblique\nFamilyName ITC Avant Garde Gothic\nWeight Demi\nItalicAngle -10.5\nIsFixedPitch false\nFontBBox -123 -251 1256 1021\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.007\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1991 Adobe Systems Incorporated.  All Rights Reserved.ITC Avant Garde Gothic is a registered trademark of International Typeface Corporation.\nEncodingScheme AdobeStandardEncoding\nCapHeight 740\nXHeight 555\nAscender 740\nDescender -185\nStartCharMetrics 228\nC 32 ; WX 280 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 280 ; N exclam ; B 73 0 343 740 ;\nC 34 ; WX 360 ; N quotedbl ; B 127 444 478 740 ;\nC 35 ; WX 560 ; N numbersign ; B 66 0 618 700 ;\nC 36 ; WX 560 ; N dollar ; B 99 -86 582 857 ;\nC 37 ; WX 860 ; N percent ; B 139 -15 856 755 ;\nC 38 ; WX 680 ; N ampersand ; B 71 -15 742 755 ;\nC 39 ; WX 280 ; N quoteright ; B 159 466 342 740 ;\nC 40 ; WX 380 ; N parenleft ; B 120 -157 490 754 ;\nC 41 ; WX 380 ; N parenright ; B 8 -157 378 754 ;\nC 42 ; WX 440 ; N asterisk ; B 174 457 492 755 ;\nC 43 ; WX 600 ; N plus ; B 84 0 610 506 ;\nC 44 ; WX 280 ; N comma ; B 48 -141 231 133 ;\nC 45 ; WX 420 ; N hyphen ; B 114 230 413 348 ;\nC 46 ; WX 280 ; N period ; B 73 0 231 133 ;\nC 47 ; WX 460 ; N slash ; B -13 -100 591 740 ;\nC 48 ; WX 560 ; N zero ; B 70 -15 628 755 ;\nC 49 ; WX 560 ; N one ; B 230 0 500 740 ;\nC 50 ; WX 560 ; N two ; B 44 0 622 755 ;\nC 51 ; WX 560 ; N three ; B 67 -15 585 755 ;\nC 52 ; WX 560 ; N four ; B 36 0 604 740 ;\nC 53 ; WX 560 ; N five ; B 64 -15 600 740 ;\nC 54 ; WX 560 ; N six ; B 64 -15 587 739 ;\nC 55 ; WX 560 ; N seven ; B 83 0 635 740 ;\nC 56 ; WX 560 ; N eight ; B 71 -15 590 755 ;\nC 57 ; WX 560 ; N nine ; B 110 0 633 754 ;\nC 58 ; WX 280 ; N colon ; B 73 0 309 555 ;\nC 59 ; WX 280 ; N semicolon ; B 48 -141 309 555 ;\nC 60 ; WX 600 ; N less ; B 84 -8 649 514 ;\nC 61 ; WX 600 ; N equal ; B 63 81 631 425 ;\nC 62 ; WX 600 ; N greater ; B 45 -8 610 514 ;\nC 63 ; WX 560 ; N question ; B 135 0 593 755 ;\nC 64 ; WX 740 ; N at ; B 109 -12 832 712 ;\nC 65 ; WX 740 ; N A ; B 7 0 732 740 ;\nC 66 ; WX 580 ; N B ; B 70 0 610 740 ;\nC 67 ; WX 780 ; N C ; B 97 -15 864 755 ;\nC 68 ; WX 700 ; N D ; B 63 0 732 740 ;\nC 69 ; WX 520 ; N E ; B 61 0 596 740 ;\nC 70 ; WX 480 ; N F ; B 61 0 575 740 ;\nC 71 ; WX 840 ; N G ; B 89 -15 887 755 ;\nC 72 ; WX 680 ; N H ; B 71 0 747 740 ;\nC 73 ; WX 280 ; N I ; B 72 0 346 740 ;\nC 74 ; WX 480 ; N J ; B 34 -15 546 740 ;\nC 75 ; WX 620 ; N K ; B 89 0 757 740 ;\nC 76 ; WX 440 ; N L ; B 72 0 459 740 ;\nC 77 ; WX 900 ; N M ; B 63 0 974 740 ;\nC 78 ; WX 740 ; N N ; B 70 0 808 740 ;\nC 79 ; WX 840 ; N O ; B 95 -15 882 755 ;\nC 80 ; WX 560 ; N P ; B 72 0 645 740 ;\nC 81 ; WX 840 ; N Q ; B 94 -15 882 755 ;\nC 82 ; WX 580 ; N R ; B 64 0 656 740 ;\nC 83 ; WX 520 ; N S ; B 49 -15 578 755 ;\nC 84 ; WX 420 ; N T ; B 119 0 555 740 ;\nC 85 ; WX 640 ; N U ; B 97 -15 722 740 ;\nC 86 ; WX 700 ; N V ; B 145 0 832 740 ;\nC 87 ; WX 900 ; N W ; B 144 0 1036 740 ;\nC 88 ; WX 680 ; N X ; B 4 0 813 740 ;\nC 89 ; WX 620 ; N Y ; B 135 0 759 740 ;\nC 90 ; WX 500 ; N Z ; B 19 0 599 740 ;\nC 91 ; WX 320 ; N bracketleft ; B 89 -157 424 754 ;\nC 92 ; WX 640 ; N backslash ; B 233 -100 525 740 ;\nC 93 ; WX 320 ; N bracketright ; B 7 -157 342 754 ;\nC 94 ; WX 600 ; N asciicircum ; B 142 375 596 740 ;\nC 95 ; WX 500 ; N underscore ; B -23 -125 486 -75 ;\nC 96 ; WX 280 ; N quoteleft ; B 158 466 341 740 ;\nC 97 ; WX 660 ; N a ; B 73 -18 716 574 ;\nC 98 ; WX 660 ; N b ; B 47 -18 689 740 ;\nC 99 ; WX 640 ; N c ; B 84 -18 679 574 ;\nC 100 ; WX 660 ; N d ; B 80 -18 755 740 ;\nC 101 ; WX 640 ; N e ; B 77 -18 667 577 ;\nC 102 ; WX 280 ; N f ; B 62 0 420 755 ; L i fi ; L l fl ;\nC 103 ; WX 660 ; N g ; B 33 -226 726 574 ;\nC 104 ; WX 600 ; N h ; B 54 0 614 740 ;\nC 105 ; WX 240 ; N i ; B 53 0 323 740 ;\nC 106 ; WX 260 ; N j ; B -18 -185 342 740 ;\nC 107 ; WX 580 ; N k ; B 80 0 648 740 ;\nC 108 ; WX 240 ; N l ; B 54 0 324 740 ;\nC 109 ; WX 940 ; N m ; B 54 0 954 574 ;\nC 110 ; WX 600 ; N n ; B 54 0 613 574 ;\nC 111 ; WX 640 ; N o ; B 71 -18 672 574 ;\nC 112 ; WX 660 ; N p ; B 13 -185 686 574 ;\nC 113 ; WX 660 ; N q ; B 78 -185 716 574 ;\nC 114 ; WX 320 ; N r ; B 63 0 423 574 ;\nC 115 ; WX 440 ; N s ; B 49 -18 483 574 ;\nC 116 ; WX 300 ; N t ; B 86 0 402 740 ;\nC 117 ; WX 600 ; N u ; B 87 -18 647 555 ;\nC 118 ; WX 560 ; N v ; B 106 0 659 555 ;\nC 119 ; WX 800 ; N w ; B 114 0 892 555 ;\nC 120 ; WX 560 ; N x ; B 3 0 632 555 ;\nC 121 ; WX 580 ; N y ; B 75 -185 674 555 ;\nC 122 ; WX 460 ; N z ; B 20 0 528 555 ;\nC 123 ; WX 340 ; N braceleft ; B 40 -191 455 747 ;\nC 124 ; WX 600 ; N bar ; B 214 -100 503 740 ;\nC 125 ; WX 340 ; N braceright ; B -12 -191 405 747 ;\nC 126 ; WX 600 ; N asciitilde ; B 114 160 579 347 ;\nC 161 ; WX 280 ; N exclamdown ; B 40 -185 310 555 ;\nC 162 ; WX 560 ; N cent ; B 110 39 599 715 ;\nC 163 ; WX 560 ; N sterling ; B 38 0 615 755 ;\nC 164 ; WX 160 ; N fraction ; B -123 0 419 740 ;\nC 165 ; WX 560 ; N yen ; B 83 0 707 740 ;\nC 166 ; WX 560 ; N florin ; B -27 -151 664 824 ;\nC 167 ; WX 560 ; N section ; B 65 -158 602 755 ;\nC 168 ; WX 560 ; N currency ; B 53 69 628 577 ;\nC 169 ; WX 220 ; N quotesingle ; B 152 444 314 740 ;\nC 170 ; WX 480 ; N quotedblleft ; B 156 466 546 740 ;\nC 171 ; WX 460 ; N guillemotleft ; B 105 108 487 469 ;\nC 172 ; WX 240 ; N guilsinglleft ; B 94 108 277 469 ;\nC 173 ; WX 240 ; N guilsinglright ; B 70 108 253 469 ;\nC 174 ; WX 520 ; N fi ; B 72 0 598 755 ;\nC 175 ; WX 520 ; N fl ; B 72 0 598 755 ;\nC 177 ; WX 500 ; N endash ; B 78 230 529 348 ;\nC 178 ; WX 560 ; N dagger ; B 133 -142 612 740 ;\nC 179 ; WX 560 ; N daggerdbl ; B 63 -142 618 740 ;\nC 180 ; WX 280 ; N periodcentered ; B 108 187 265 320 ;\nC 182 ; WX 600 ; N paragraph ; B 90 -103 744 740 ;\nC 183 ; WX 600 ; N bullet ; B 215 222 526 532 ;\nC 184 ; WX 280 ; N quotesinglbase ; B 47 -141 230 133 ;\nC 185 ; WX 480 ; N quotedblbase ; B 45 -141 435 133 ;\nC 186 ; WX 480 ; N quotedblright ; B 157 466 547 740 ;\nC 187 ; WX 460 ; N guillemotright ; B 81 108 463 469 ;\nC 188 ; WX 1000 ; N ellipsis ; B 100 0 924 133 ;\nC 189 ; WX 1280 ; N perthousand ; B 139 -15 1256 755 ;\nC 191 ; WX 560 ; N questiondown ; B 69 -200 527 555 ;\nC 193 ; WX 420 ; N grave ; B 189 624 462 851 ;\nC 194 ; WX 420 ; N acute ; B 224 624 508 849 ;\nC 195 ; WX 540 ; N circumflex ; B 189 636 588 774 ;\nC 196 ; WX 480 ; N tilde ; B 178 636 564 767 ;\nC 197 ; WX 420 ; N macron ; B 192 648 490 759 ;\nC 198 ; WX 480 ; N breve ; B 185 633 582 770 ;\nC 199 ; WX 280 ; N dotaccent ; B 192 636 350 769 ;\nC 200 ; WX 500 ; N dieresis ; B 196 636 565 769 ;\nC 202 ; WX 360 ; N ring ; B 206 619 424 834 ;\nC 203 ; WX 340 ; N cedilla ; B 67 -251 272 6 ;\nC 205 ; WX 700 ; N hungarumlaut ; B 258 610 754 862 ;\nC 206 ; WX 340 ; N ogonek ; B 59 -195 243 9 ;\nC 207 ; WX 540 ; N caron ; B 214 636 613 774 ;\nC 208 ; WX 1000 ; N emdash ; B 78 230 1029 348 ;\nC 225 ; WX 900 ; N AE ; B -5 0 961 740 ;\nC 227 ; WX 360 ; N ordfeminine ; B 127 438 472 755 ;\nC 232 ; WX 480 ; N Lslash ; B 68 0 484 740 ;\nC 233 ; WX 840 ; N Oslash ; B 94 -71 891 814 ;\nC 234 ; WX 1060 ; N OE ; B 98 -15 1144 755 ;\nC 235 ; WX 360 ; N ordmasculine ; B 131 438 451 755 ;\nC 241 ; WX 1080 ; N ae ; B 75 -18 1105 574 ;\nC 245 ; WX 240 ; N dotlessi ; B 53 0 289 555 ;\nC 248 ; WX 320 ; N lslash ; B 74 0 404 740 ;\nC 249 ; WX 660 ; N oslash ; B 81 -50 685 608 ;\nC 250 ; WX 1080 ; N oe ; B 76 -18 1108 574 ;\nC 251 ; WX 600 ; N germandbls ; B 51 -18 629 755 ;\nC -1 ; WX 640 ; N ecircumflex ; B 77 -18 667 774 ;\nC -1 ; WX 640 ; N edieresis ; B 77 -18 667 769 ;\nC -1 ; WX 660 ; N aacute ; B 73 -18 716 849 ;\nC -1 ; WX 740 ; N registered ; B 50 -12 827 752 ;\nC -1 ; WX 240 ; N icircumflex ; B 39 0 438 774 ;\nC -1 ; WX 600 ; N udieresis ; B 87 -18 647 769 ;\nC -1 ; WX 640 ; N ograve ; B 71 -18 672 851 ;\nC -1 ; WX 600 ; N uacute ; B 87 -18 647 849 ;\nC -1 ; WX 600 ; N ucircumflex ; B 87 -18 647 774 ;\nC -1 ; WX 740 ; N Aacute ; B 7 0 732 1019 ;\nC -1 ; WX 240 ; N igrave ; B 53 0 347 851 ;\nC -1 ; WX 280 ; N Icircumflex ; B 72 0 489 944 ;\nC -1 ; WX 640 ; N ccedilla ; B 83 -251 679 574 ;\nC -1 ; WX 660 ; N adieresis ; B 73 -18 716 769 ;\nC -1 ; WX 520 ; N Ecircumflex ; B 61 0 609 944 ;\nC -1 ; WX 440 ; N scaron ; B 49 -18 563 774 ;\nC -1 ; WX 660 ; N thorn ; B 13 -185 686 740 ;\nC -1 ; WX 1000 ; N trademark ; B 131 296 958 740 ;\nC -1 ; WX 640 ; N egrave ; B 77 -18 667 851 ;\nC -1 ; WX 336 ; N threesuperior ; B 87 287 413 749 ;\nC -1 ; WX 460 ; N zcaron ; B 20 0 598 774 ;\nC -1 ; WX 660 ; N atilde ; B 73 -18 716 767 ;\nC -1 ; WX 660 ; N aring ; B 73 -18 716 834 ;\nC -1 ; WX 640 ; N ocircumflex ; B 71 -18 672 774 ;\nC -1 ; WX 520 ; N Edieresis ; B 61 0 606 939 ;\nC -1 ; WX 840 ; N threequarters ; B 97 0 836 749 ;\nC -1 ; WX 580 ; N ydieresis ; B 75 -185 674 769 ;\nC -1 ; WX 580 ; N yacute ; B 75 -185 674 849 ;\nC -1 ; WX 240 ; N iacute ; B 53 0 443 849 ;\nC -1 ; WX 740 ; N Acircumflex ; B 7 0 732 944 ;\nC -1 ; WX 640 ; N Uacute ; B 97 -15 722 1019 ;\nC -1 ; WX 640 ; N eacute ; B 77 -18 667 849 ;\nC -1 ; WX 840 ; N Ograve ; B 95 -15 882 1021 ;\nC -1 ; WX 660 ; N agrave ; B 73 -18 716 851 ;\nC -1 ; WX 640 ; N Udieresis ; B 97 -15 722 939 ;\nC -1 ; WX 660 ; N acircumflex ; B 73 -18 716 774 ;\nC -1 ; WX 280 ; N Igrave ; B 72 0 398 1021 ;\nC -1 ; WX 336 ; N twosuperior ; B 73 296 436 749 ;\nC -1 ; WX 640 ; N Ugrave ; B 97 -15 722 1021 ;\nC -1 ; WX 840 ; N onequarter ; B 187 0 779 740 ;\nC -1 ; WX 640 ; N Ucircumflex ; B 97 -15 722 944 ;\nC -1 ; WX 520 ; N Scaron ; B 49 -15 635 944 ;\nC -1 ; WX 280 ; N Idieresis ; B 72 0 486 939 ;\nC -1 ; WX 240 ; N idieresis ; B 53 0 435 769 ;\nC -1 ; WX 520 ; N Egrave ; B 61 0 596 1021 ;\nC -1 ; WX 840 ; N Oacute ; B 95 -15 882 1019 ;\nC -1 ; WX 600 ; N divide ; B 84 -20 610 526 ;\nC -1 ; WX 740 ; N Atilde ; B 7 0 732 937 ;\nC -1 ; WX 740 ; N Aring ; B 7 0 732 969 ;\nC -1 ; WX 840 ; N Odieresis ; B 95 -15 882 939 ;\nC -1 ; WX 740 ; N Adieresis ; B 7 0 732 939 ;\nC -1 ; WX 740 ; N Ntilde ; B 70 0 808 937 ;\nC -1 ; WX 500 ; N Zcaron ; B 19 0 650 944 ;\nC -1 ; WX 560 ; N Thorn ; B 72 0 619 740 ;\nC -1 ; WX 280 ; N Iacute ; B 72 0 494 1019 ;\nC -1 ; WX 600 ; N plusminus ; B 37 -62 626 556 ;\nC -1 ; WX 600 ; N multiply ; B 76 12 617 494 ;\nC -1 ; WX 520 ; N Eacute ; B 61 0 596 1019 ;\nC -1 ; WX 620 ; N Ydieresis ; B 135 0 759 939 ;\nC -1 ; WX 336 ; N onesuperior ; B 182 296 360 740 ;\nC -1 ; WX 600 ; N ugrave ; B 87 -18 647 851 ;\nC -1 ; WX 600 ; N logicalnot ; B 105 108 631 425 ;\nC -1 ; WX 600 ; N ntilde ; B 54 0 624 767 ;\nC -1 ; WX 840 ; N Otilde ; B 95 -15 882 937 ;\nC -1 ; WX 640 ; N otilde ; B 71 -18 672 767 ;\nC -1 ; WX 780 ; N Ccedilla ; B 97 -251 864 755 ;\nC -1 ; WX 740 ; N Agrave ; B 7 0 732 1021 ;\nC -1 ; WX 840 ; N onehalf ; B 157 0 830 740 ;\nC -1 ; WX 742 ; N Eth ; B 83 0 766 740 ;\nC -1 ; WX 400 ; N degree ; B 160 426 451 712 ;\nC -1 ; WX 620 ; N Yacute ; B 135 0 759 1019 ;\nC -1 ; WX 840 ; N Ocircumflex ; B 95 -15 882 944 ;\nC -1 ; WX 640 ; N oacute ; B 71 -18 672 849 ;\nC -1 ; WX 576 ; N mu ; B 3 -187 642 555 ;\nC -1 ; WX 600 ; N minus ; B 84 193 610 313 ;\nC -1 ; WX 640 ; N eth ; B 73 -18 699 754 ;\nC -1 ; WX 640 ; N odieresis ; B 71 -18 672 769 ;\nC -1 ; WX 740 ; N copyright ; B 50 -12 827 752 ;\nC -1 ; WX 600 ; N brokenbar ; B 214 -100 503 740 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 218\n\nKPX A y -50\nKPX A w -65\nKPX A v -70\nKPX A u -20\nKPX A quoteright -90\nKPX A Y -80\nKPX A W -60\nKPX A V -102\nKPX A U -40\nKPX A T -25\nKPX A Q -50\nKPX A O -50\nKPX A G -40\nKPX A C -40\n\nKPX B A -10\n\nKPX C A -40\n\nKPX D period -20\nKPX D comma -20\nKPX D Y -45\nKPX D W -25\nKPX D V -50\nKPX D A -50\n\nKPX F period -129\nKPX F e -20\nKPX F comma -162\nKPX F a -20\nKPX F A -75\n\nKPX G period -20\nKPX G comma -20\nKPX G Y -15\n\nKPX J period -15\nKPX J a -20\nKPX J A -30\n\nKPX K y -20\nKPX K u -15\nKPX K o -45\nKPX K e -40\nKPX K O -30\n\nKPX L y -23\nKPX L quoteright -30\nKPX L quotedblright -30\nKPX L Y -80\nKPX L W -55\nKPX L V -85\nKPX L T -46\n\nKPX O period -30\nKPX O comma -30\nKPX O Y -30\nKPX O X -30\nKPX O W -20\nKPX O V -45\nKPX O T -15\nKPX O A -60\n\nKPX P period -200\nKPX P o -20\nKPX P e -20\nKPX P comma -220\nKPX P a -20\nKPX P A -100\n\nKPX Q comma 20\n\nKPX R W 25\nKPX R V -10\nKPX R U 25\nKPX R T 40\nKPX R O 25\n\nKPX S comma 20\n\nKPX T y -10\nKPX T w -55\nKPX T u -46\nKPX T semicolon -29\nKPX T r -30\nKPX T period -91\nKPX T o -49\nKPX T hyphen -75\nKPX T e -49\nKPX T comma -82\nKPX T colon -15\nKPX T a -70\nKPX T O -15\nKPX T A -25\n\nKPX U period -20\nKPX U comma -20\nKPX U A -40\n\nKPX V u -55\nKPX V semicolon -33\nKPX V period -145\nKPX V o -101\nKPX V i -15\nKPX V hyphen -75\nKPX V e -101\nKPX V comma -145\nKPX V colon -18\nKPX V a -95\nKPX V O -45\nKPX V G -20\nKPX V A -102\n\nKPX W y -15\nKPX W u -30\nKPX W semicolon -33\nKPX W period -106\nKPX W o -46\nKPX W i -10\nKPX W hyphen -35\nKPX W e -47\nKPX W comma -106\nKPX W colon -15\nKPX W a -50\nKPX W O -20\nKPX W A -58\n\nKPX Y u -52\nKPX Y semicolon -23\nKPX Y period -145\nKPX Y o -89\nKPX Y hyphen -100\nKPX Y e -89\nKPX Y comma -145\nKPX Y colon -10\nKPX Y a -93\nKPX Y O -30\nKPX Y A -80\n\nKPX a t 5\nKPX a p 20\nKPX a b 5\n\nKPX b y -20\nKPX b v -20\n\nKPX c y -20\nKPX c l -15\nKPX c k -15\n\nKPX comma space -50\nKPX comma quoteright -70\nKPX comma quotedblright -70\n\nKPX e y -20\nKPX e x -20\nKPX e w -20\nKPX e v -20\n\nKPX f period -40\nKPX f o -20\nKPX f l -15\nKPX f i -15\nKPX f f -20\nKPX f dotlessi -15\nKPX f comma -40\nKPX f a -15\n\nKPX g i 25\nKPX g a 15\n\nKPX h y -30\n\nKPX k y -5\nKPX k o -30\nKPX k e -40\n\nKPX m y -20\nKPX m u -20\n\nKPX n y -15\nKPX n v -30\n\nKPX o y -20\nKPX o x -30\nKPX o w -20\nKPX o v -30\n\nKPX p y -20\n\nKPX period space -50\nKPX period quoteright -70\nKPX period quotedblright -70\n\nKPX quotedblleft A -50\n\nKPX quotedblright space -50\n\nKPX quoteleft quoteleft -80\nKPX quoteleft A -50\n\nKPX quoteright v -10\nKPX quoteright t 10\nKPX quoteright space -50\nKPX quoteright s -15\nKPX quoteright r -20\nKPX quoteright quoteright -80\nKPX quoteright d -50\n\nKPX r y 40\nKPX r v 40\nKPX r u 20\nKPX r t 20\nKPX r s 20\nKPX r q -8\nKPX r period -73\nKPX r p 20\nKPX r o -15\nKPX r n 21\nKPX r m 15\nKPX r l 20\nKPX r k 5\nKPX r i 20\nKPX r hyphen -60\nKPX r g 1\nKPX r e -4\nKPX r d -6\nKPX r comma -75\nKPX r c -7\n\nKPX s period 20\nKPX s comma 20\n\nKPX space quoteleft -50\nKPX space quotedblleft -50\nKPX space Y -60\nKPX space W -25\nKPX space V -80\nKPX space T -25\nKPX space A -20\n\nKPX v period -90\nKPX v o -20\nKPX v e -20\nKPX v comma -90\nKPX v a -30\n\nKPX w period -90\nKPX w o -30\nKPX w e -20\nKPX w comma -90\nKPX w a -30\n\nKPX x e -20\n\nKPX y period -100\nKPX y o -30\nKPX y e -20\nKPX y comma -100\nKPX y c -35\nKPX y a -30\nEndKernPairs\nEndKernData\nStartComposites 56\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 192 170 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 132 170 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 152 170 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 192 170 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 215 135 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 162 170 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 82 170 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 22 170 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 42 170 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 82 170 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute -13 170 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -98 170 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -78 170 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave -63 170 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 162 170 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 242 170 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 182 170 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 202 170 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 242 170 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 212 170 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 22 170 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 177 170 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 82 170 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 102 170 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 107 170 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 167 170 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 92 170 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 37 170 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 120 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 60 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 80 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 120 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 150 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 90 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 110 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 50 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 70 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 110 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -65 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -150 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -130 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -115 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 60 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 110 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 50 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 70 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 110 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 80 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron -50 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 125 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 30 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 50 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 55 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 115 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 40 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron -15 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pagk8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990, 1991 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Mon Mar  4 13:37:31 1991\nComment UniqueID 34364\nComment VMusage 24225 31117\nFontName AvantGarde-Book\nFullName ITC Avant Garde Gothic Book\nFamilyName ITC Avant Garde Gothic\nWeight Book\nItalicAngle 0\nIsFixedPitch false\nFontBBox -113 -222 1148 955\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.006\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1991 Adobe Systems Incorporated.  All Rights Reserved.ITC Avant Garde Gothic is a registered trademark of International Typeface Corporation.\nEncodingScheme AdobeStandardEncoding\nCapHeight 740\nXHeight 547\nAscender 740\nDescender -192\nStartCharMetrics 228\nC 32 ; WX 277 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 295 ; N exclam ; B 111 0 185 740 ;\nC 34 ; WX 309 ; N quotedbl ; B 36 444 273 740 ;\nC 35 ; WX 554 ; N numbersign ; B 33 0 521 740 ;\nC 36 ; WX 554 ; N dollar ; B 70 -70 485 811 ;\nC 37 ; WX 775 ; N percent ; B 21 -13 753 751 ;\nC 38 ; WX 757 ; N ampersand ; B 56 -12 736 753 ;\nC 39 ; WX 351 ; N quoteright ; B 94 546 256 740 ;\nC 40 ; WX 369 ; N parenleft ; B 47 -205 355 757 ;\nC 41 ; WX 369 ; N parenright ; B 14 -205 322 757 ;\nC 42 ; WX 425 ; N asterisk ; B 58 446 367 740 ;\nC 43 ; WX 606 ; N plus ; B 51 0 555 506 ;\nC 44 ; WX 277 ; N comma ; B 14 -67 176 126 ;\nC 45 ; WX 332 ; N hyphen ; B 30 248 302 315 ;\nC 46 ; WX 277 ; N period ; B 102 0 176 126 ;\nC 47 ; WX 437 ; N slash ; B 44 -100 403 740 ;\nC 48 ; WX 554 ; N zero ; B 29 -13 525 753 ;\nC 49 ; WX 554 ; N one ; B 135 0 336 740 ;\nC 50 ; WX 554 ; N two ; B 40 0 514 753 ;\nC 51 ; WX 554 ; N three ; B 34 -13 506 753 ;\nC 52 ; WX 554 ; N four ; B 14 0 528 740 ;\nC 53 ; WX 554 ; N five ; B 26 -13 530 740 ;\nC 54 ; WX 554 ; N six ; B 24 -13 530 739 ;\nC 55 ; WX 554 ; N seven ; B 63 0 491 740 ;\nC 56 ; WX 554 ; N eight ; B 41 -13 513 753 ;\nC 57 ; WX 554 ; N nine ; B 24 0 530 752 ;\nC 58 ; WX 277 ; N colon ; B 102 0 176 548 ;\nC 59 ; WX 277 ; N semicolon ; B 14 -67 176 548 ;\nC 60 ; WX 606 ; N less ; B 46 -8 554 514 ;\nC 61 ; WX 606 ; N equal ; B 51 118 555 388 ;\nC 62 ; WX 606 ; N greater ; B 52 -8 560 514 ;\nC 63 ; WX 591 ; N question ; B 64 0 526 752 ;\nC 64 ; WX 867 ; N at ; B 65 -13 803 753 ;\nC 65 ; WX 740 ; N A ; B 12 0 729 740 ;\nC 66 ; WX 574 ; N B ; B 74 0 544 740 ;\nC 67 ; WX 813 ; N C ; B 43 -13 771 752 ;\nC 68 ; WX 744 ; N D ; B 74 0 699 740 ;\nC 69 ; WX 536 ; N E ; B 70 0 475 740 ;\nC 70 ; WX 485 ; N F ; B 70 0 444 740 ;\nC 71 ; WX 872 ; N G ; B 40 -13 828 753 ;\nC 72 ; WX 683 ; N H ; B 76 0 607 740 ;\nC 73 ; WX 226 ; N I ; B 76 0 150 740 ;\nC 74 ; WX 482 ; N J ; B 6 -13 402 740 ;\nC 75 ; WX 591 ; N K ; B 81 0 591 740 ;\nC 76 ; WX 462 ; N L ; B 82 0 462 740 ;\nC 77 ; WX 919 ; N M ; B 76 0 843 740 ;\nC 78 ; WX 740 ; N N ; B 75 0 664 740 ;\nC 79 ; WX 869 ; N O ; B 43 -13 826 753 ;\nC 80 ; WX 592 ; N P ; B 75 0 564 740 ;\nC 81 ; WX 871 ; N Q ; B 40 -13 837 753 ;\nC 82 ; WX 607 ; N R ; B 70 0 572 740 ;\nC 83 ; WX 498 ; N S ; B 22 -13 473 753 ;\nC 84 ; WX 426 ; N T ; B 6 0 419 740 ;\nC 85 ; WX 655 ; N U ; B 75 -13 579 740 ;\nC 86 ; WX 702 ; N V ; B 8 0 693 740 ;\nC 87 ; WX 960 ; N W ; B 11 0 950 740 ;\nC 88 ; WX 609 ; N X ; B 8 0 602 740 ;\nC 89 ; WX 592 ; N Y ; B 1 0 592 740 ;\nC 90 ; WX 480 ; N Z ; B 12 0 470 740 ;\nC 91 ; WX 351 ; N bracketleft ; B 133 -179 337 753 ;\nC 92 ; WX 605 ; N backslash ; B 118 -100 477 740 ;\nC 93 ; WX 351 ; N bracketright ; B 14 -179 218 753 ;\nC 94 ; WX 606 ; N asciicircum ; B 53 307 553 740 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 351 ; N quoteleft ; B 95 546 257 740 ;\nC 97 ; WX 683 ; N a ; B 42 -13 621 561 ;\nC 98 ; WX 682 ; N b ; B 68 -13 647 740 ;\nC 99 ; WX 647 ; N c ; B 41 -13 607 561 ;\nC 100 ; WX 685 ; N d ; B 39 -13 618 740 ;\nC 101 ; WX 650 ; N e ; B 38 -13 608 561 ;\nC 102 ; WX 314 ; N f ; B 19 0 314 753 ; L i fi ; L l fl ;\nC 103 ; WX 673 ; N g ; B 37 -215 606 561 ;\nC 104 ; WX 610 ; N h ; B 62 0 543 740 ;\nC 105 ; WX 200 ; N i ; B 65 0 135 740 ;\nC 106 ; WX 203 ; N j ; B -44 -192 137 740 ;\nC 107 ; WX 502 ; N k ; B 70 0 498 740 ;\nC 108 ; WX 200 ; N l ; B 65 0 135 740 ;\nC 109 ; WX 938 ; N m ; B 66 0 872 561 ;\nC 110 ; WX 610 ; N n ; B 65 0 546 561 ;\nC 111 ; WX 655 ; N o ; B 42 -13 614 561 ;\nC 112 ; WX 682 ; N p ; B 64 -192 643 561 ;\nC 113 ; WX 682 ; N q ; B 37 -192 616 561 ;\nC 114 ; WX 301 ; N r ; B 65 0 291 561 ;\nC 115 ; WX 388 ; N s ; B 24 -13 364 561 ;\nC 116 ; WX 339 ; N t ; B 14 0 330 740 ;\nC 117 ; WX 608 ; N u ; B 62 -13 541 547 ;\nC 118 ; WX 554 ; N v ; B 7 0 546 547 ;\nC 119 ; WX 831 ; N w ; B 13 0 820 547 ;\nC 120 ; WX 480 ; N x ; B 12 0 468 547 ;\nC 121 ; WX 536 ; N y ; B 15 -192 523 547 ;\nC 122 ; WX 425 ; N z ; B 10 0 415 547 ;\nC 123 ; WX 351 ; N braceleft ; B 70 -189 331 740 ;\nC 124 ; WX 672 ; N bar ; B 299 -100 373 740 ;\nC 125 ; WX 351 ; N braceright ; B 20 -189 281 740 ;\nC 126 ; WX 606 ; N asciitilde ; B 72 179 534 319 ;\nC 161 ; WX 295 ; N exclamdown ; B 110 -192 184 548 ;\nC 162 ; WX 554 ; N cent ; B 48 62 510 707 ;\nC 163 ; WX 554 ; N sterling ; B 4 0 552 753 ;\nC 164 ; WX 166 ; N fraction ; B -113 0 280 740 ;\nC 165 ; WX 554 ; N yen ; B 4 0 550 740 ;\nC 166 ; WX 554 ; N florin ; B -12 -153 518 818 ;\nC 167 ; WX 615 ; N section ; B 85 -141 529 753 ;\nC 168 ; WX 554 ; N currency ; B 8 42 546 580 ;\nC 169 ; WX 198 ; N quotesingle ; B 59 444 140 740 ;\nC 170 ; WX 502 ; N quotedblleft ; B 97 546 406 740 ;\nC 171 ; WX 425 ; N guillemotleft ; B 40 81 386 481 ;\nC 172 ; WX 251 ; N guilsinglleft ; B 40 81 212 481 ;\nC 173 ; WX 251 ; N guilsinglright ; B 39 81 211 481 ;\nC 174 ; WX 487 ; N fi ; B 19 0 422 753 ;\nC 175 ; WX 485 ; N fl ; B 19 0 420 753 ;\nC 177 ; WX 500 ; N endash ; B 35 248 465 315 ;\nC 178 ; WX 553 ; N dagger ; B 59 -133 493 740 ;\nC 179 ; WX 553 ; N daggerdbl ; B 59 -133 493 740 ;\nC 180 ; WX 277 ; N periodcentered ; B 102 190 176 316 ;\nC 182 ; WX 564 ; N paragraph ; B 22 -110 551 740 ;\nC 183 ; WX 606 ; N bullet ; B 150 222 455 532 ;\nC 184 ; WX 354 ; N quotesinglbase ; B 89 -68 251 126 ;\nC 185 ; WX 502 ; N quotedblbase ; B 89 -68 399 126 ;\nC 186 ; WX 484 ; N quotedblright ; B 96 546 405 740 ;\nC 187 ; WX 425 ; N guillemotright ; B 39 81 385 481 ;\nC 188 ; WX 1000 ; N ellipsis ; B 130 0 870 126 ;\nC 189 ; WX 1174 ; N perthousand ; B 25 -13 1148 751 ;\nC 191 ; WX 591 ; N questiondown ; B 65 -205 527 548 ;\nC 193 ; WX 378 ; N grave ; B 69 619 300 786 ;\nC 194 ; WX 375 ; N acute ; B 78 619 309 786 ;\nC 195 ; WX 502 ; N circumflex ; B 74 639 428 764 ;\nC 196 ; WX 439 ; N tilde ; B 47 651 392 754 ;\nC 197 ; WX 485 ; N macron ; B 73 669 411 736 ;\nC 198 ; WX 453 ; N breve ; B 52 651 401 754 ;\nC 199 ; WX 222 ; N dotaccent ; B 74 639 148 765 ;\nC 200 ; WX 369 ; N dieresis ; B 73 639 295 765 ;\nC 202 ; WX 332 ; N ring ; B 62 600 269 807 ;\nC 203 ; WX 324 ; N cedilla ; B 80 -222 254 0 ;\nC 205 ; WX 552 ; N hungarumlaut ; B 119 605 453 800 ;\nC 206 ; WX 302 ; N ogonek ; B 73 -191 228 0 ;\nC 207 ; WX 502 ; N caron ; B 68 639 423 764 ;\nC 208 ; WX 1000 ; N emdash ; B 35 248 965 315 ;\nC 225 ; WX 992 ; N AE ; B -20 0 907 740 ;\nC 227 ; WX 369 ; N ordfeminine ; B -3 407 356 753 ;\nC 232 ; WX 517 ; N Lslash ; B 59 0 517 740 ;\nC 233 ; WX 868 ; N Oslash ; B 43 -83 826 819 ;\nC 234 ; WX 1194 ; N OE ; B 45 -13 1142 753 ;\nC 235 ; WX 369 ; N ordmasculine ; B 12 407 356 753 ;\nC 241 ; WX 1157 ; N ae ; B 34 -13 1113 561 ;\nC 245 ; WX 200 ; N dotlessi ; B 65 0 135 547 ;\nC 248 ; WX 300 ; N lslash ; B 43 0 259 740 ;\nC 249 ; WX 653 ; N oslash ; B 41 -64 613 614 ;\nC 250 ; WX 1137 ; N oe ; B 34 -13 1104 561 ;\nC 251 ; WX 554 ; N germandbls ; B 61 -13 525 753 ;\nC -1 ; WX 650 ; N ecircumflex ; B 38 -13 608 764 ;\nC -1 ; WX 650 ; N edieresis ; B 38 -13 608 765 ;\nC -1 ; WX 683 ; N aacute ; B 42 -13 621 786 ;\nC -1 ; WX 747 ; N registered ; B -9 -12 755 752 ;\nC -1 ; WX 200 ; N icircumflex ; B -77 0 277 764 ;\nC -1 ; WX 608 ; N udieresis ; B 62 -13 541 765 ;\nC -1 ; WX 655 ; N ograve ; B 42 -13 614 786 ;\nC -1 ; WX 608 ; N uacute ; B 62 -13 541 786 ;\nC -1 ; WX 608 ; N ucircumflex ; B 62 -13 541 764 ;\nC -1 ; WX 740 ; N Aacute ; B 12 0 729 949 ;\nC -1 ; WX 200 ; N igrave ; B -60 0 171 786 ;\nC -1 ; WX 226 ; N Icircumflex ; B -64 0 290 927 ;\nC -1 ; WX 647 ; N ccedilla ; B 41 -222 607 561 ;\nC -1 ; WX 683 ; N adieresis ; B 42 -13 621 765 ;\nC -1 ; WX 536 ; N Ecircumflex ; B 70 0 475 927 ;\nC -1 ; WX 388 ; N scaron ; B 11 -13 366 764 ;\nC -1 ; WX 682 ; N thorn ; B 64 -192 643 740 ;\nC -1 ; WX 1000 ; N trademark ; B 9 296 816 740 ;\nC -1 ; WX 650 ; N egrave ; B 38 -13 608 786 ;\nC -1 ; WX 332 ; N threesuperior ; B 18 289 318 747 ;\nC -1 ; WX 425 ; N zcaron ; B 10 0 415 764 ;\nC -1 ; WX 683 ; N atilde ; B 42 -13 621 754 ;\nC -1 ; WX 683 ; N aring ; B 42 -13 621 807 ;\nC -1 ; WX 655 ; N ocircumflex ; B 42 -13 614 764 ;\nC -1 ; WX 536 ; N Edieresis ; B 70 0 475 928 ;\nC -1 ; WX 831 ; N threequarters ; B 46 0 784 747 ;\nC -1 ; WX 536 ; N ydieresis ; B 15 -192 523 765 ;\nC -1 ; WX 536 ; N yacute ; B 15 -192 523 786 ;\nC -1 ; WX 200 ; N iacute ; B 31 0 262 786 ;\nC -1 ; WX 740 ; N Acircumflex ; B 12 0 729 927 ;\nC -1 ; WX 655 ; N Uacute ; B 75 -13 579 949 ;\nC -1 ; WX 650 ; N eacute ; B 38 -13 608 786 ;\nC -1 ; WX 869 ; N Ograve ; B 43 -13 826 949 ;\nC -1 ; WX 683 ; N agrave ; B 42 -13 621 786 ;\nC -1 ; WX 655 ; N Udieresis ; B 75 -13 579 928 ;\nC -1 ; WX 683 ; N acircumflex ; B 42 -13 621 764 ;\nC -1 ; WX 226 ; N Igrave ; B -47 0 184 949 ;\nC -1 ; WX 332 ; N twosuperior ; B 19 296 318 747 ;\nC -1 ; WX 655 ; N Ugrave ; B 75 -13 579 949 ;\nC -1 ; WX 831 ; N onequarter ; B 100 0 729 740 ;\nC -1 ; WX 655 ; N Ucircumflex ; B 75 -13 579 927 ;\nC -1 ; WX 498 ; N Scaron ; B 22 -13 473 927 ;\nC -1 ; WX 226 ; N Idieresis ; B 2 0 224 928 ;\nC -1 ; WX 200 ; N idieresis ; B -11 0 211 765 ;\nC -1 ; WX 536 ; N Egrave ; B 70 0 475 949 ;\nC -1 ; WX 869 ; N Oacute ; B 43 -13 826 949 ;\nC -1 ; WX 606 ; N divide ; B 51 -13 555 519 ;\nC -1 ; WX 740 ; N Atilde ; B 12 0 729 917 ;\nC -1 ; WX 740 ; N Aring ; B 12 0 729 955 ;\nC -1 ; WX 869 ; N Odieresis ; B 43 -13 826 928 ;\nC -1 ; WX 740 ; N Adieresis ; B 12 0 729 928 ;\nC -1 ; WX 740 ; N Ntilde ; B 75 0 664 917 ;\nC -1 ; WX 480 ; N Zcaron ; B 12 0 470 927 ;\nC -1 ; WX 592 ; N Thorn ; B 60 0 549 740 ;\nC -1 ; WX 226 ; N Iacute ; B 44 0 275 949 ;\nC -1 ; WX 606 ; N plusminus ; B 51 -24 555 518 ;\nC -1 ; WX 606 ; N multiply ; B 74 24 533 482 ;\nC -1 ; WX 536 ; N Eacute ; B 70 0 475 949 ;\nC -1 ; WX 592 ; N Ydieresis ; B 1 0 592 928 ;\nC -1 ; WX 332 ; N onesuperior ; B 63 296 198 740 ;\nC -1 ; WX 608 ; N ugrave ; B 62 -13 541 786 ;\nC -1 ; WX 606 ; N logicalnot ; B 51 109 555 388 ;\nC -1 ; WX 610 ; N ntilde ; B 65 0 546 754 ;\nC -1 ; WX 869 ; N Otilde ; B 43 -13 826 917 ;\nC -1 ; WX 655 ; N otilde ; B 42 -13 614 754 ;\nC -1 ; WX 813 ; N Ccedilla ; B 43 -222 771 752 ;\nC -1 ; WX 740 ; N Agrave ; B 12 0 729 949 ;\nC -1 ; WX 831 ; N onehalf ; B 81 0 750 740 ;\nC -1 ; WX 790 ; N Eth ; B 40 0 739 740 ;\nC -1 ; WX 400 ; N degree ; B 56 421 344 709 ;\nC -1 ; WX 592 ; N Yacute ; B 1 0 592 949 ;\nC -1 ; WX 869 ; N Ocircumflex ; B 43 -13 826 927 ;\nC -1 ; WX 655 ; N oacute ; B 42 -13 614 786 ;\nC -1 ; WX 608 ; N mu ; B 80 -184 527 547 ;\nC -1 ; WX 606 ; N minus ; B 51 219 555 287 ;\nC -1 ; WX 655 ; N eth ; B 42 -12 614 753 ;\nC -1 ; WX 655 ; N odieresis ; B 42 -13 614 765 ;\nC -1 ; WX 747 ; N copyright ; B -9 -12 755 752 ;\nC -1 ; WX 672 ; N brokenbar ; B 299 -100 373 740 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 216\n\nKPX A y -62\nKPX A w -65\nKPX A v -70\nKPX A u -20\nKPX A quoteright -100\nKPX A quotedblright -100\nKPX A Y -92\nKPX A W -60\nKPX A V -102\nKPX A U -40\nKPX A T -45\nKPX A Q -40\nKPX A O -50\nKPX A G -40\nKPX A C -40\n\nKPX B A -10\n\nKPX C A -40\n\nKPX D period -20\nKPX D comma -20\nKPX D Y -30\nKPX D W -10\nKPX D V -50\nKPX D A -50\n\nKPX F period -160\nKPX F e -20\nKPX F comma -180\nKPX F a -20\nKPX F A -75\n\nKPX G period -20\nKPX G comma -20\nKPX G Y -20\n\nKPX J period -15\nKPX J a -20\nKPX J A -30\n\nKPX K o -15\nKPX K e -20\nKPX K O -20\n\nKPX L y -23\nKPX L quoteright -130\nKPX L quotedblright -130\nKPX L Y -91\nKPX L W -67\nKPX L V -113\nKPX L T -46\n\nKPX O period -30\nKPX O comma -30\nKPX O Y -30\nKPX O X -30\nKPX O W -20\nKPX O V -60\nKPX O T -30\nKPX O A -60\n\nKPX P period -300\nKPX P o -60\nKPX P e -20\nKPX P comma -280\nKPX P a -20\nKPX P A -114\n\nKPX Q comma 20\n\nKPX R Y -10\nKPX R W 10\nKPX R V -10\nKPX R T 6\n\nKPX S comma 20\n\nKPX T y -50\nKPX T w -55\nKPX T u -46\nKPX T semicolon -29\nKPX T r -30\nKPX T period -91\nKPX T o -70\nKPX T i 10\nKPX T hyphen -75\nKPX T e -49\nKPX T comma -82\nKPX T colon -15\nKPX T a -90\nKPX T O -30\nKPX T A -45\n\nKPX U period -20\nKPX U comma -20\nKPX U A -40\n\nKPX V u -40\nKPX V semicolon -33\nKPX V period -165\nKPX V o -101\nKPX V i -5\nKPX V hyphen -75\nKPX V e -101\nKPX V comma -145\nKPX V colon -18\nKPX V a -104\nKPX V O -60\nKPX V G -20\nKPX V A -102\n\nKPX W y -2\nKPX W u -30\nKPX W semicolon -33\nKPX W period -106\nKPX W o -46\nKPX W i 6\nKPX W hyphen -35\nKPX W e -47\nKPX W comma -106\nKPX W colon -15\nKPX W a -50\nKPX W O -20\nKPX W A -58\n\nKPX Y u -52\nKPX Y semicolon -23\nKPX Y period -175\nKPX Y o -89\nKPX Y hyphen -85\nKPX Y e -89\nKPX Y comma -145\nKPX Y colon -10\nKPX Y a -93\nKPX Y O -30\nKPX Y A -92\n\nKPX a p 20\nKPX a b 20\n\nKPX b y -20\nKPX b v -20\n\nKPX c y -20\nKPX c k -15\n\nKPX comma space -110\nKPX comma quoteright -120\nKPX comma quotedblright -120\n\nKPX e y -20\nKPX e w -20\nKPX e v -20\n\nKPX f period -50\nKPX f o -40\nKPX f l -30\nKPX f i -34\nKPX f f -60\nKPX f e -20\nKPX f dotlessi -34\nKPX f comma -50\nKPX f a -40\n\nKPX g a -15\n\nKPX h y -30\n\nKPX k y -5\nKPX k e -15\n\nKPX m y -20\nKPX m u -20\nKPX m a -20\n\nKPX n y -15\nKPX n v -20\n\nKPX o y -20\nKPX o x -15\nKPX o w -20\nKPX o v -30\n\nKPX p y -20\n\nKPX period space -110\nKPX period quoteright -120\nKPX period quotedblright -120\n\nKPX quotedblleft quoteleft -35\nKPX quotedblleft A -100\n\nKPX quotedblright space -110\n\nKPX quoteleft quoteleft -203\nKPX quoteleft A -100\n\nKPX quoteright v -30\nKPX quoteright t 10\nKPX quoteright space -110\nKPX quoteright s -15\nKPX quoteright r -20\nKPX quoteright quoteright -203\nKPX quoteright quotedblright -35\nKPX quoteright d -110\n\nKPX r y 40\nKPX r v 40\nKPX r u 20\nKPX r t 20\nKPX r s 20\nKPX r q -8\nKPX r period -73\nKPX r p 20\nKPX r o -20\nKPX r n 21\nKPX r m 28\nKPX r l 20\nKPX r k 20\nKPX r i 20\nKPX r hyphen -60\nKPX r g -15\nKPX r e -4\nKPX r d -6\nKPX r comma -75\nKPX r c -20\nKPX r a -20\n\nKPX s period 20\nKPX s comma 20\n\nKPX space quoteleft -110\nKPX space quotedblleft -110\nKPX space Y -60\nKPX space W -25\nKPX space V -50\nKPX space T -25\nKPX space A -20\n\nKPX v period -130\nKPX v o -30\nKPX v e -20\nKPX v comma -100\nKPX v a -30\n\nKPX w period -100\nKPX w o -30\nKPX w h 15\nKPX w e -20\nKPX w comma -90\nKPX w a -30\n\nKPX y period -125\nKPX y o -30\nKPX y e -20\nKPX y comma -110\nKPX y a -30\nEndKernPairs\nEndKernData\nStartComposites 56\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 183 163 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 119 163 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 186 163 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 181 163 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 204 148 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 151 163 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 81 163 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 17 163 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 84 163 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 79 163 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute -34 163 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -138 163 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -71 163 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave -116 163 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 151 163 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 247 163 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 184 163 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 250 163 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 246 163 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 215 163 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron -2 163 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 160 163 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 77 163 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 143 163 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 119 163 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 129 163 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 112 163 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron -11 163 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 154 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 91 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 157 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 153 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 176 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 122 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 138 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 74 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 141 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 136 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -47 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -151 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -84 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -129 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 86 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 140 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 77 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 143 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 139 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 108 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron -57 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 137 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 53 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 120 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 95 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 101 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 84 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron -38 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pagko8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990, 1991 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Mon Mar  4 13:41:11 1991\nComment UniqueID 34367\nComment VMusage 6555 39267\nFontName AvantGarde-BookOblique\nFullName ITC Avant Garde Gothic Book Oblique\nFamilyName ITC Avant Garde Gothic\nWeight Book\nItalicAngle -10.5\nIsFixedPitch false\nFontBBox -113 -222 1279 955\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.006\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1991 Adobe Systems Incorporated.  All Rights Reserved.ITC Avant Garde Gothic is a registered trademark of International Typeface Corporation.\nEncodingScheme AdobeStandardEncoding\nCapHeight 740\nXHeight 547\nAscender 740\nDescender -192\nStartCharMetrics 228\nC 32 ; WX 277 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 295 ; N exclam ; B 111 0 322 740 ;\nC 34 ; WX 309 ; N quotedbl ; B 130 444 410 740 ;\nC 35 ; WX 554 ; N numbersign ; B 71 0 620 740 ;\nC 36 ; WX 554 ; N dollar ; B 107 -70 581 811 ;\nC 37 ; WX 775 ; N percent ; B 124 -13 787 751 ;\nC 38 ; WX 757 ; N ampersand ; B 92 -12 775 753 ;\nC 39 ; WX 351 ; N quoteright ; B 195 546 393 740 ;\nC 40 ; WX 369 ; N parenleft ; B 89 -205 495 757 ;\nC 41 ; WX 369 ; N parenright ; B -24 -205 382 757 ;\nC 42 ; WX 425 ; N asterisk ; B 170 446 479 740 ;\nC 43 ; WX 606 ; N plus ; B 92 0 608 506 ;\nC 44 ; WX 277 ; N comma ; B 2 -67 199 126 ;\nC 45 ; WX 332 ; N hyphen ; B 76 248 360 315 ;\nC 46 ; WX 277 ; N period ; B 102 0 199 126 ;\nC 47 ; WX 437 ; N slash ; B 25 -100 540 740 ;\nC 48 ; WX 554 ; N zero ; B 71 -13 622 753 ;\nC 49 ; WX 554 ; N one ; B 260 0 473 740 ;\nC 50 ; WX 554 ; N two ; B 40 0 615 753 ;\nC 51 ; WX 554 ; N three ; B 73 -13 565 753 ;\nC 52 ; WX 554 ; N four ; B 39 0 598 740 ;\nC 53 ; WX 554 ; N five ; B 69 -13 605 740 ;\nC 54 ; WX 554 ; N six ; B 65 -13 580 739 ;\nC 55 ; WX 554 ; N seven ; B 110 0 628 740 ;\nC 56 ; WX 554 ; N eight ; B 77 -13 580 753 ;\nC 57 ; WX 554 ; N nine ; B 111 0 626 752 ;\nC 58 ; WX 277 ; N colon ; B 102 0 278 548 ;\nC 59 ; WX 277 ; N semicolon ; B 2 -67 278 548 ;\nC 60 ; WX 606 ; N less ; B 87 -8 649 514 ;\nC 61 ; WX 606 ; N equal ; B 73 118 627 388 ;\nC 62 ; WX 606 ; N greater ; B 51 -8 613 514 ;\nC 63 ; WX 591 ; N question ; B 158 0 628 752 ;\nC 64 ; WX 867 ; N at ; B 126 -13 888 753 ;\nC 65 ; WX 740 ; N A ; B 12 0 729 740 ;\nC 66 ; WX 574 ; N B ; B 74 0 606 740 ;\nC 67 ; WX 813 ; N C ; B 105 -13 870 752 ;\nC 68 ; WX 744 ; N D ; B 74 0 773 740 ;\nC 69 ; WX 536 ; N E ; B 70 0 612 740 ;\nC 70 ; WX 485 ; N F ; B 70 0 581 740 ;\nC 71 ; WX 872 ; N G ; B 103 -13 891 753 ;\nC 72 ; WX 683 ; N H ; B 76 0 744 740 ;\nC 73 ; WX 226 ; N I ; B 76 0 287 740 ;\nC 74 ; WX 482 ; N J ; B 37 -13 539 740 ;\nC 75 ; WX 591 ; N K ; B 81 0 728 740 ;\nC 76 ; WX 462 ; N L ; B 82 0 474 740 ;\nC 77 ; WX 919 ; N M ; B 76 0 980 740 ;\nC 78 ; WX 740 ; N N ; B 75 0 801 740 ;\nC 79 ; WX 869 ; N O ; B 105 -13 901 753 ;\nC 80 ; WX 592 ; N P ; B 75 0 664 740 ;\nC 81 ; WX 871 ; N Q ; B 102 -13 912 753 ;\nC 82 ; WX 607 ; N R ; B 70 0 669 740 ;\nC 83 ; WX 498 ; N S ; B 57 -13 561 753 ;\nC 84 ; WX 426 ; N T ; B 131 0 556 740 ;\nC 85 ; WX 655 ; N U ; B 118 -13 716 740 ;\nC 86 ; WX 702 ; N V ; B 145 0 830 740 ;\nC 87 ; WX 960 ; N W ; B 148 0 1087 740 ;\nC 88 ; WX 609 ; N X ; B 8 0 724 740 ;\nC 89 ; WX 592 ; N Y ; B 138 0 729 740 ;\nC 90 ; WX 480 ; N Z ; B 12 0 596 740 ;\nC 91 ; WX 351 ; N bracketleft ; B 145 -179 477 753 ;\nC 92 ; WX 605 ; N backslash ; B 255 -100 458 740 ;\nC 93 ; WX 351 ; N bracketright ; B -19 -179 312 753 ;\nC 94 ; WX 606 ; N asciicircum ; B 110 307 610 740 ;\nC 95 ; WX 500 ; N underscore ; B -23 -125 486 -75 ;\nC 96 ; WX 351 ; N quoteleft ; B 232 546 358 740 ;\nC 97 ; WX 683 ; N a ; B 88 -13 722 561 ;\nC 98 ; WX 682 ; N b ; B 68 -13 703 740 ;\nC 99 ; WX 647 ; N c ; B 87 -13 678 561 ;\nC 100 ; WX 685 ; N d ; B 85 -13 755 740 ;\nC 101 ; WX 650 ; N e ; B 84 -13 664 561 ;\nC 102 ; WX 314 ; N f ; B 104 0 454 753 ; L i fi ; L l fl ;\nC 103 ; WX 673 ; N g ; B 56 -215 707 561 ;\nC 104 ; WX 610 ; N h ; B 62 0 606 740 ;\nC 105 ; WX 200 ; N i ; B 65 0 272 740 ;\nC 106 ; WX 203 ; N j ; B -80 -192 274 740 ;\nC 107 ; WX 502 ; N k ; B 70 0 588 740 ;\nC 108 ; WX 200 ; N l ; B 65 0 272 740 ;\nC 109 ; WX 938 ; N m ; B 66 0 938 561 ;\nC 110 ; WX 610 ; N n ; B 65 0 609 561 ;\nC 111 ; WX 655 ; N o ; B 88 -13 669 561 ;\nC 112 ; WX 682 ; N p ; B 28 -192 699 561 ;\nC 113 ; WX 682 ; N q ; B 83 -192 717 561 ;\nC 114 ; WX 301 ; N r ; B 65 0 395 561 ;\nC 115 ; WX 388 ; N s ; B 49 -13 424 561 ;\nC 116 ; WX 339 ; N t ; B 104 0 431 740 ;\nC 117 ; WX 608 ; N u ; B 100 -13 642 547 ;\nC 118 ; WX 554 ; N v ; B 108 0 647 547 ;\nC 119 ; WX 831 ; N w ; B 114 0 921 547 ;\nC 120 ; WX 480 ; N x ; B 12 0 569 547 ;\nC 121 ; WX 536 ; N y ; B 97 -192 624 547 ;\nC 122 ; WX 425 ; N z ; B 10 0 498 547 ;\nC 123 ; WX 351 ; N braceleft ; B 115 -189 468 740 ;\nC 124 ; WX 672 ; N bar ; B 280 -100 510 740 ;\nC 125 ; WX 351 ; N braceright ; B -15 -189 338 740 ;\nC 126 ; WX 606 ; N asciitilde ; B 114 179 584 319 ;\nC 161 ; WX 295 ; N exclamdown ; B 74 -192 286 548 ;\nC 162 ; WX 554 ; N cent ; B 115 62 596 707 ;\nC 163 ; WX 554 ; N sterling ; B 29 0 614 753 ;\nC 164 ; WX 166 ; N fraction ; B -113 0 417 740 ;\nC 165 ; WX 554 ; N yen ; B 75 0 687 740 ;\nC 166 ; WX 554 ; N florin ; B -39 -153 669 818 ;\nC 167 ; WX 615 ; N section ; B 118 -141 597 753 ;\nC 168 ; WX 554 ; N currency ; B 24 42 645 580 ;\nC 169 ; WX 198 ; N quotesingle ; B 153 444 277 740 ;\nC 170 ; WX 502 ; N quotedblleft ; B 234 546 507 740 ;\nC 171 ; WX 425 ; N guillemotleft ; B 92 81 469 481 ;\nC 172 ; WX 251 ; N guilsinglleft ; B 92 81 295 481 ;\nC 173 ; WX 251 ; N guilsinglright ; B 60 81 263 481 ;\nC 174 ; WX 487 ; N fi ; B 104 0 559 753 ;\nC 175 ; WX 485 ; N fl ; B 104 0 557 753 ;\nC 177 ; WX 500 ; N endash ; B 81 248 523 315 ;\nC 178 ; WX 553 ; N dagger ; B 146 -133 593 740 ;\nC 179 ; WX 553 ; N daggerdbl ; B 72 -133 593 740 ;\nC 180 ; WX 277 ; N periodcentered ; B 137 190 235 316 ;\nC 182 ; WX 564 ; N paragraph ; B 119 -110 688 740 ;\nC 183 ; WX 606 ; N bullet ; B 217 222 528 532 ;\nC 184 ; WX 354 ; N quotesinglbase ; B 76 -68 274 126 ;\nC 185 ; WX 502 ; N quotedblbase ; B 76 -68 422 126 ;\nC 186 ; WX 484 ; N quotedblright ; B 197 546 542 740 ;\nC 187 ; WX 425 ; N guillemotright ; B 60 81 437 481 ;\nC 188 ; WX 1000 ; N ellipsis ; B 130 0 893 126 ;\nC 189 ; WX 1174 ; N perthousand ; B 128 -13 1182 751 ;\nC 191 ; WX 591 ; N questiondown ; B 64 -205 534 548 ;\nC 193 ; WX 378 ; N grave ; B 204 619 425 786 ;\nC 194 ; WX 375 ; N acute ; B 203 619 444 786 ;\nC 195 ; WX 502 ; N circumflex ; B 192 639 546 764 ;\nC 196 ; WX 439 ; N tilde ; B 179 651 520 754 ;\nC 197 ; WX 485 ; N macron ; B 197 669 547 736 ;\nC 198 ; WX 453 ; N breve ; B 192 651 541 754 ;\nC 199 ; WX 222 ; N dotaccent ; B 192 639 290 765 ;\nC 200 ; WX 369 ; N dieresis ; B 191 639 437 765 ;\nC 202 ; WX 332 ; N ring ; B 191 600 401 807 ;\nC 203 ; WX 324 ; N cedilla ; B 52 -222 231 0 ;\nC 205 ; WX 552 ; N hungarumlaut ; B 239 605 594 800 ;\nC 206 ; WX 302 ; N ogonek ; B 53 -191 202 0 ;\nC 207 ; WX 502 ; N caron ; B 210 639 565 764 ;\nC 208 ; WX 1000 ; N emdash ; B 81 248 1023 315 ;\nC 225 ; WX 992 ; N AE ; B -20 0 1044 740 ;\nC 227 ; WX 369 ; N ordfeminine ; B 102 407 494 753 ;\nC 232 ; WX 517 ; N Lslash ; B 107 0 529 740 ;\nC 233 ; WX 868 ; N Oslash ; B 76 -83 929 819 ;\nC 234 ; WX 1194 ; N OE ; B 107 -13 1279 753 ;\nC 235 ; WX 369 ; N ordmasculine ; B 116 407 466 753 ;\nC 241 ; WX 1157 ; N ae ; B 80 -13 1169 561 ;\nC 245 ; WX 200 ; N dotlessi ; B 65 0 236 547 ;\nC 248 ; WX 300 ; N lslash ; B 95 0 354 740 ;\nC 249 ; WX 653 ; N oslash ; B 51 -64 703 614 ;\nC 250 ; WX 1137 ; N oe ; B 80 -13 1160 561 ;\nC 251 ; WX 554 ; N germandbls ; B 61 -13 578 753 ;\nC -1 ; WX 650 ; N ecircumflex ; B 84 -13 664 764 ;\nC -1 ; WX 650 ; N edieresis ; B 84 -13 664 765 ;\nC -1 ; WX 683 ; N aacute ; B 88 -13 722 786 ;\nC -1 ; WX 747 ; N registered ; B 53 -12 830 752 ;\nC -1 ; WX 200 ; N icircumflex ; B 41 0 395 764 ;\nC -1 ; WX 608 ; N udieresis ; B 100 -13 642 765 ;\nC -1 ; WX 655 ; N ograve ; B 88 -13 669 786 ;\nC -1 ; WX 608 ; N uacute ; B 100 -13 642 786 ;\nC -1 ; WX 608 ; N ucircumflex ; B 100 -13 642 764 ;\nC -1 ; WX 740 ; N Aacute ; B 12 0 729 949 ;\nC -1 ; WX 200 ; N igrave ; B 65 0 296 786 ;\nC -1 ; WX 226 ; N Icircumflex ; B 76 0 439 927 ;\nC -1 ; WX 647 ; N ccedilla ; B 87 -222 678 561 ;\nC -1 ; WX 683 ; N adieresis ; B 88 -13 722 765 ;\nC -1 ; WX 536 ; N Ecircumflex ; B 70 0 612 927 ;\nC -1 ; WX 388 ; N scaron ; B 49 -13 508 764 ;\nC -1 ; WX 682 ; N thorn ; B 28 -192 699 740 ;\nC -1 ; WX 1000 ; N trademark ; B 137 296 953 740 ;\nC -1 ; WX 650 ; N egrave ; B 84 -13 664 786 ;\nC -1 ; WX 332 ; N threesuperior ; B 98 289 408 747 ;\nC -1 ; WX 425 ; N zcaron ; B 10 0 527 764 ;\nC -1 ; WX 683 ; N atilde ; B 88 -13 722 754 ;\nC -1 ; WX 683 ; N aring ; B 88 -13 722 807 ;\nC -1 ; WX 655 ; N ocircumflex ; B 88 -13 669 764 ;\nC -1 ; WX 536 ; N Edieresis ; B 70 0 612 928 ;\nC -1 ; WX 831 ; N threequarters ; B 126 0 825 747 ;\nC -1 ; WX 536 ; N ydieresis ; B 97 -192 624 765 ;\nC -1 ; WX 536 ; N yacute ; B 97 -192 624 786 ;\nC -1 ; WX 200 ; N iacute ; B 65 0 397 786 ;\nC -1 ; WX 740 ; N Acircumflex ; B 12 0 729 927 ;\nC -1 ; WX 655 ; N Uacute ; B 118 -13 716 949 ;\nC -1 ; WX 650 ; N eacute ; B 84 -13 664 786 ;\nC -1 ; WX 869 ; N Ograve ; B 105 -13 901 949 ;\nC -1 ; WX 683 ; N agrave ; B 88 -13 722 786 ;\nC -1 ; WX 655 ; N Udieresis ; B 118 -13 716 928 ;\nC -1 ; WX 683 ; N acircumflex ; B 88 -13 722 764 ;\nC -1 ; WX 226 ; N Igrave ; B 76 0 340 949 ;\nC -1 ; WX 332 ; N twosuperior ; B 74 296 433 747 ;\nC -1 ; WX 655 ; N Ugrave ; B 118 -13 716 949 ;\nC -1 ; WX 831 ; N onequarter ; B 183 0 770 740 ;\nC -1 ; WX 655 ; N Ucircumflex ; B 118 -13 716 927 ;\nC -1 ; WX 498 ; N Scaron ; B 57 -13 593 927 ;\nC -1 ; WX 226 ; N Idieresis ; B 76 0 396 928 ;\nC -1 ; WX 200 ; N idieresis ; B 65 0 353 765 ;\nC -1 ; WX 536 ; N Egrave ; B 70 0 612 949 ;\nC -1 ; WX 869 ; N Oacute ; B 105 -13 901 949 ;\nC -1 ; WX 606 ; N divide ; B 92 -13 608 519 ;\nC -1 ; WX 740 ; N Atilde ; B 12 0 729 917 ;\nC -1 ; WX 740 ; N Aring ; B 12 0 729 955 ;\nC -1 ; WX 869 ; N Odieresis ; B 105 -13 901 928 ;\nC -1 ; WX 740 ; N Adieresis ; B 12 0 729 928 ;\nC -1 ; WX 740 ; N Ntilde ; B 75 0 801 917 ;\nC -1 ; WX 480 ; N Zcaron ; B 12 0 596 927 ;\nC -1 ; WX 592 ; N Thorn ; B 60 0 621 740 ;\nC -1 ; WX 226 ; N Iacute ; B 76 0 440 949 ;\nC -1 ; WX 606 ; N plusminus ; B 47 -24 618 518 ;\nC -1 ; WX 606 ; N multiply ; B 87 24 612 482 ;\nC -1 ; WX 536 ; N Eacute ; B 70 0 612 949 ;\nC -1 ; WX 592 ; N Ydieresis ; B 138 0 729 928 ;\nC -1 ; WX 332 ; N onesuperior ; B 190 296 335 740 ;\nC -1 ; WX 608 ; N ugrave ; B 100 -13 642 786 ;\nC -1 ; WX 606 ; N logicalnot ; B 110 109 627 388 ;\nC -1 ; WX 610 ; N ntilde ; B 65 0 609 754 ;\nC -1 ; WX 869 ; N Otilde ; B 105 -13 901 917 ;\nC -1 ; WX 655 ; N otilde ; B 88 -13 669 754 ;\nC -1 ; WX 813 ; N Ccedilla ; B 105 -222 870 752 ;\nC -1 ; WX 740 ; N Agrave ; B 12 0 729 949 ;\nC -1 ; WX 831 ; N onehalf ; B 164 0 810 740 ;\nC -1 ; WX 790 ; N Eth ; B 104 0 813 740 ;\nC -1 ; WX 400 ; N degree ; B 158 421 451 709 ;\nC -1 ; WX 592 ; N Yacute ; B 138 0 729 949 ;\nC -1 ; WX 869 ; N Ocircumflex ; B 105 -13 901 927 ;\nC -1 ; WX 655 ; N oacute ; B 88 -13 669 786 ;\nC -1 ; WX 608 ; N mu ; B 46 -184 628 547 ;\nC -1 ; WX 606 ; N minus ; B 92 219 608 287 ;\nC -1 ; WX 655 ; N eth ; B 88 -12 675 753 ;\nC -1 ; WX 655 ; N odieresis ; B 88 -13 669 765 ;\nC -1 ; WX 747 ; N copyright ; B 53 -12 830 752 ;\nC -1 ; WX 672 ; N brokenbar ; B 280 -100 510 740 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 216\n\nKPX A y -62\nKPX A w -65\nKPX A v -70\nKPX A u -20\nKPX A quoteright -100\nKPX A quotedblright -100\nKPX A Y -92\nKPX A W -60\nKPX A V -102\nKPX A U -40\nKPX A T -45\nKPX A Q -40\nKPX A O -50\nKPX A G -40\nKPX A C -40\n\nKPX B A -10\n\nKPX C A -40\n\nKPX D period -20\nKPX D comma -20\nKPX D Y -30\nKPX D W -10\nKPX D V -50\nKPX D A -50\n\nKPX F period -160\nKPX F e -20\nKPX F comma -180\nKPX F a -20\nKPX F A -75\n\nKPX G period -20\nKPX G comma -20\nKPX G Y -20\n\nKPX J period -15\nKPX J a -20\nKPX J A -30\n\nKPX K o -15\nKPX K e -20\nKPX K O -20\n\nKPX L y -23\nKPX L quoteright -130\nKPX L quotedblright -130\nKPX L Y -91\nKPX L W -67\nKPX L V -113\nKPX L T -46\n\nKPX O period -30\nKPX O comma -30\nKPX O Y -30\nKPX O X -30\nKPX O W -20\nKPX O V -60\nKPX O T -30\nKPX O A -60\n\nKPX P period -300\nKPX P o -60\nKPX P e -20\nKPX P comma -280\nKPX P a -20\nKPX P A -114\n\nKPX Q comma 20\n\nKPX R Y -10\nKPX R W 10\nKPX R V -10\nKPX R T 6\n\nKPX S comma 20\n\nKPX T y -50\nKPX T w -55\nKPX T u -46\nKPX T semicolon -29\nKPX T r -30\nKPX T period -91\nKPX T o -70\nKPX T i 10\nKPX T hyphen -75\nKPX T e -49\nKPX T comma -82\nKPX T colon -15\nKPX T a -90\nKPX T O -30\nKPX T A -45\n\nKPX U period -20\nKPX U comma -20\nKPX U A -40\n\nKPX V u -40\nKPX V semicolon -33\nKPX V period -165\nKPX V o -101\nKPX V i -5\nKPX V hyphen -75\nKPX V e -101\nKPX V comma -145\nKPX V colon -18\nKPX V a -104\nKPX V O -60\nKPX V G -20\nKPX V A -102\n\nKPX W y -2\nKPX W u -30\nKPX W semicolon -33\nKPX W period -106\nKPX W o -46\nKPX W i 6\nKPX W hyphen -35\nKPX W e -47\nKPX W comma -106\nKPX W colon -15\nKPX W a -50\nKPX W O -20\nKPX W A -58\n\nKPX Y u -52\nKPX Y semicolon -23\nKPX Y period -175\nKPX Y o -89\nKPX Y hyphen -85\nKPX Y e -89\nKPX Y comma -145\nKPX Y colon -10\nKPX Y a -93\nKPX Y O -30\nKPX Y A -92\n\nKPX a p 20\nKPX a b 20\n\nKPX b y -20\nKPX b v -20\n\nKPX c y -20\nKPX c k -15\n\nKPX comma space -110\nKPX comma quoteright -120\nKPX comma quotedblright -120\n\nKPX e y -20\nKPX e w -20\nKPX e v -20\n\nKPX f period -50\nKPX f o -40\nKPX f l -30\nKPX f i -34\nKPX f f -60\nKPX f e -20\nKPX f dotlessi -34\nKPX f comma -50\nKPX f a -40\n\nKPX g a -15\n\nKPX h y -30\n\nKPX k y -5\nKPX k e -15\n\nKPX m y -20\nKPX m u -20\nKPX m a -20\n\nKPX n y -15\nKPX n v -20\n\nKPX o y -20\nKPX o x -15\nKPX o w -20\nKPX o v -30\n\nKPX p y -20\n\nKPX period space -110\nKPX period quoteright -120\nKPX period quotedblright -120\n\nKPX quotedblleft quoteleft -35\nKPX quotedblleft A -100\n\nKPX quotedblright space -110\n\nKPX quoteleft quoteleft -203\nKPX quoteleft A -100\n\nKPX quoteright v -30\nKPX quoteright t 10\nKPX quoteright space -110\nKPX quoteright s -15\nKPX quoteright r -20\nKPX quoteright quoteright -203\nKPX quoteright quotedblright -35\nKPX quoteright d -110\n\nKPX r y 40\nKPX r v 40\nKPX r u 20\nKPX r t 20\nKPX r s 20\nKPX r q -8\nKPX r period -73\nKPX r p 20\nKPX r o -20\nKPX r n 21\nKPX r m 28\nKPX r l 20\nKPX r k 20\nKPX r i 20\nKPX r hyphen -60\nKPX r g -15\nKPX r e -4\nKPX r d -6\nKPX r comma -75\nKPX r c -20\nKPX r a -20\n\nKPX s period 20\nKPX s comma 20\n\nKPX space quoteleft -110\nKPX space quotedblleft -110\nKPX space Y -60\nKPX space W -25\nKPX space V -50\nKPX space T -25\nKPX space A -20\n\nKPX v period -130\nKPX v o -30\nKPX v e -20\nKPX v comma -100\nKPX v a -30\n\nKPX w period -100\nKPX w o -30\nKPX w h 15\nKPX w e -20\nKPX w comma -90\nKPX w a -30\n\nKPX y period -125\nKPX y o -30\nKPX y e -20\nKPX y comma -110\nKPX y a -30\nEndKernPairs\nEndKernData\nStartComposites 56\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 213 163 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 149 163 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 216 163 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 211 163 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 231 148 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 181 163 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 111 163 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 47 163 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 114 163 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 109 163 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute -4 163 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -108 163 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -41 163 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave -86 163 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 181 163 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 277 163 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 214 163 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 280 163 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 276 163 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 245 163 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 28 163 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 190 163 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 107 163 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 173 163 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 149 163 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 159 163 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 142 163 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 19 163 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 154 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 91 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 157 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 153 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 176 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 122 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 138 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 74 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 141 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 136 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -47 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -151 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -84 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -129 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 86 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 140 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 77 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 143 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 139 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 108 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron -57 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 137 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 53 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 120 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 95 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 101 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 84 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron -38 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pbkd8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1992 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Tue Jan 21 16:13:29 1992\nComment UniqueID 37831\nComment VMusage 31983 38875\nFontName Bookman-Demi\nFullName ITC Bookman Demi\nFamilyName ITC Bookman\nWeight Demi\nItalicAngle 0\nIsFixedPitch false\nFontBBox -194 -250 1346 934 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.004\nNotice Copyright (c) 1985, 1987, 1989, 1992 Adobe Systems Incorporated.  All Rights Reserved.ITC Bookman is a registered trademark of International Typeface Corporation.\nEncodingScheme AdobeStandardEncoding\nCapHeight 681\nXHeight 502\nAscender 725\nDescender -212\nStartCharMetrics 228\nC 32 ; WX 340 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 360 ; N exclam ; B 82 -8 282 698 ;\nC 34 ; WX 420 ; N quotedbl ; B 11 379 369 698 ;\nC 35 ; WX 660 ; N numbersign ; B 84 0 576 681 ;\nC 36 ; WX 660 ; N dollar ; B 48 -119 620 805 ;\nC 37 ; WX 940 ; N percent ; B 12 -8 924 698 ;\nC 38 ; WX 800 ; N ampersand ; B 21 -17 772 698 ;\nC 39 ; WX 320 ; N quoteright ; B 82 440 242 698 ;\nC 40 ; WX 320 ; N parenleft ; B 48 -150 289 749 ;\nC 41 ; WX 320 ; N parenright ; B 20 -150 262 749 ;\nC 42 ; WX 460 ; N asterisk ; B 62 317 405 697 ;\nC 43 ; WX 600 ; N plus ; B 51 9 555 514 ;\nC 44 ; WX 340 ; N comma ; B 78 -124 257 162 ;\nC 45 ; WX 360 ; N hyphen ; B 20 210 340 318 ;\nC 46 ; WX 340 ; N period ; B 76 -8 258 172 ;\nC 47 ; WX 600 ; N slash ; B 50 -149 555 725 ;\nC 48 ; WX 660 ; N zero ; B 30 -17 639 698 ;\nC 49 ; WX 660 ; N one ; B 137 0 568 681 ;\nC 50 ; WX 660 ; N two ; B 41 0 628 698 ;\nC 51 ; WX 660 ; N three ; B 37 -17 631 698 ;\nC 52 ; WX 660 ; N four ; B 19 0 649 681 ;\nC 53 ; WX 660 ; N five ; B 44 -17 623 723 ;\nC 54 ; WX 660 ; N six ; B 34 -17 634 698 ;\nC 55 ; WX 660 ; N seven ; B 36 0 632 681 ;\nC 56 ; WX 660 ; N eight ; B 36 -17 633 698 ;\nC 57 ; WX 660 ; N nine ; B 33 -17 636 698 ;\nC 58 ; WX 340 ; N colon ; B 76 -8 258 515 ;\nC 59 ; WX 340 ; N semicolon ; B 75 -124 259 515 ;\nC 60 ; WX 600 ; N less ; B 49 -9 558 542 ;\nC 61 ; WX 600 ; N equal ; B 51 109 555 421 ;\nC 62 ; WX 600 ; N greater ; B 48 -9 557 542 ;\nC 63 ; WX 660 ; N question ; B 61 -8 608 698 ;\nC 64 ; WX 820 ; N at ; B 60 -17 758 698 ;\nC 65 ; WX 720 ; N A ; B -34 0 763 681 ;\nC 66 ; WX 720 ; N B ; B 20 0 693 681 ;\nC 67 ; WX 740 ; N C ; B 35 -17 724 698 ;\nC 68 ; WX 780 ; N D ; B 20 0 748 681 ;\nC 69 ; WX 720 ; N E ; B 20 0 724 681 ;\nC 70 ; WX 680 ; N F ; B 20 0 686 681 ;\nC 71 ; WX 780 ; N G ; B 35 -17 773 698 ;\nC 72 ; WX 820 ; N H ; B 20 0 800 681 ;\nC 73 ; WX 400 ; N I ; B 20 0 379 681 ;\nC 74 ; WX 640 ; N J ; B -12 -17 622 681 ;\nC 75 ; WX 800 ; N K ; B 20 0 796 681 ;\nC 76 ; WX 640 ; N L ; B 20 0 668 681 ;\nC 77 ; WX 940 ; N M ; B 20 0 924 681 ;\nC 78 ; WX 740 ; N N ; B 20 0 724 681 ;\nC 79 ; WX 800 ; N O ; B 35 -17 769 698 ;\nC 80 ; WX 660 ; N P ; B 20 0 658 681 ;\nC 81 ; WX 800 ; N Q ; B 35 -226 775 698 ;\nC 82 ; WX 780 ; N R ; B 20 0 783 681 ;\nC 83 ; WX 660 ; N S ; B 21 -17 639 698 ;\nC 84 ; WX 700 ; N T ; B -4 0 703 681 ;\nC 85 ; WX 740 ; N U ; B 15 -17 724 681 ;\nC 86 ; WX 720 ; N V ; B -20 0 730 681 ;\nC 87 ; WX 940 ; N W ; B -20 0 963 681 ;\nC 88 ; WX 780 ; N X ; B 1 0 770 681 ;\nC 89 ; WX 700 ; N Y ; B -20 0 718 681 ;\nC 90 ; WX 640 ; N Z ; B 6 0 635 681 ;\nC 91 ; WX 300 ; N bracketleft ; B 75 -138 285 725 ;\nC 92 ; WX 600 ; N backslash ; B 50 0 555 725 ;\nC 93 ; WX 300 ; N bracketright ; B 21 -138 231 725 ;\nC 94 ; WX 600 ; N asciicircum ; B 52 281 554 681 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 320 ; N quoteleft ; B 82 440 242 698 ;\nC 97 ; WX 580 ; N a ; B 28 -8 588 515 ;\nC 98 ; WX 600 ; N b ; B -20 -8 568 725 ;\nC 99 ; WX 580 ; N c ; B 31 -8 550 515 ;\nC 100 ; WX 640 ; N d ; B 31 -8 622 725 ;\nC 101 ; WX 580 ; N e ; B 31 -8 548 515 ;\nC 102 ; WX 380 ; N f ; B 22 0 461 741 ; L i fi ; L l fl ;\nC 103 ; WX 580 ; N g ; B 9 -243 583 595 ;\nC 104 ; WX 680 ; N h ; B 22 0 654 725 ;\nC 105 ; WX 360 ; N i ; B 22 0 335 729 ;\nC 106 ; WX 340 ; N j ; B -94 -221 278 729 ;\nC 107 ; WX 660 ; N k ; B 22 0 643 725 ;\nC 108 ; WX 340 ; N l ; B 9 0 322 725 ;\nC 109 ; WX 1000 ; N m ; B 22 0 980 515 ;\nC 110 ; WX 680 ; N n ; B 22 0 652 515 ;\nC 111 ; WX 620 ; N o ; B 31 -8 585 515 ;\nC 112 ; WX 640 ; N p ; B 22 -212 611 515 ;\nC 113 ; WX 620 ; N q ; B 31 -212 633 515 ;\nC 114 ; WX 460 ; N r ; B 22 0 462 502 ;\nC 115 ; WX 520 ; N s ; B 22 -8 492 515 ;\nC 116 ; WX 460 ; N t ; B 22 -8 445 660 ;\nC 117 ; WX 660 ; N u ; B 22 -8 653 502 ;\nC 118 ; WX 600 ; N v ; B -6 0 593 502 ;\nC 119 ; WX 800 ; N w ; B -6 0 810 502 ;\nC 120 ; WX 600 ; N x ; B 8 0 591 502 ;\nC 121 ; WX 620 ; N y ; B 6 -221 613 502 ;\nC 122 ; WX 560 ; N z ; B 22 0 547 502 ;\nC 123 ; WX 320 ; N braceleft ; B 14 -139 301 726 ;\nC 124 ; WX 600 ; N bar ; B 243 -250 362 750 ;\nC 125 ; WX 320 ; N braceright ; B 15 -140 302 725 ;\nC 126 ; WX 600 ; N asciitilde ; B 51 162 555 368 ;\nC 161 ; WX 360 ; N exclamdown ; B 84 -191 284 515 ;\nC 162 ; WX 660 ; N cent ; B 133 17 535 674 ;\nC 163 ; WX 660 ; N sterling ; B 10 -17 659 698 ;\nC 164 ; WX 120 ; N fraction ; B -194 0 312 681 ;\nC 165 ; WX 660 ; N yen ; B -28 0 696 681 ;\nC 166 ; WX 660 ; N florin ; B -46 -209 674 749 ;\nC 167 ; WX 600 ; N section ; B 36 -153 560 698 ;\nC 168 ; WX 660 ; N currency ; B 77 88 584 593 ;\nC 169 ; WX 240 ; N quotesingle ; B 42 379 178 698 ;\nC 170 ; WX 540 ; N quotedblleft ; B 82 439 449 698 ;\nC 171 ; WX 400 ; N guillemotleft ; B 34 101 360 457 ;\nC 172 ; WX 220 ; N guilsinglleft ; B 34 101 188 457 ;\nC 173 ; WX 220 ; N guilsinglright ; B 34 101 188 457 ;\nC 174 ; WX 740 ; N fi ; B 22 0 710 741 ;\nC 175 ; WX 740 ; N fl ; B 22 0 710 741 ;\nC 177 ; WX 500 ; N endash ; B -25 212 525 318 ;\nC 178 ; WX 440 ; N dagger ; B 33 -156 398 698 ;\nC 179 ; WX 380 ; N daggerdbl ; B 8 -156 380 698 ;\nC 180 ; WX 340 ; N periodcentered ; B 76 175 258 355 ;\nC 182 ; WX 800 ; N paragraph ; B 51 0 698 681 ;\nC 183 ; WX 460 ; N bullet ; B 60 170 404 511 ;\nC 184 ; WX 320 ; N quotesinglbase ; B 82 -114 242 144 ;\nC 185 ; WX 540 ; N quotedblbase ; B 82 -114 450 144 ;\nC 186 ; WX 540 ; N quotedblright ; B 82 440 449 698 ;\nC 187 ; WX 400 ; N guillemotright ; B 34 101 360 457 ;\nC 188 ; WX 1000 ; N ellipsis ; B 76 -8 924 172 ;\nC 189 ; WX 1360 ; N perthousand ; B 12 -8 1346 698 ;\nC 191 ; WX 660 ; N questiondown ; B 62 -191 609 515 ;\nC 193 ; WX 400 ; N grave ; B 68 547 327 730 ;\nC 194 ; WX 400 ; N acute ; B 68 547 327 731 ;\nC 195 ; WX 500 ; N circumflex ; B 68 555 430 731 ;\nC 196 ; WX 480 ; N tilde ; B 69 556 421 691 ;\nC 197 ; WX 460 ; N macron ; B 68 577 383 663 ;\nC 198 ; WX 500 ; N breve ; B 68 553 429 722 ;\nC 199 ; WX 320 ; N dotaccent ; B 68 536 259 730 ;\nC 200 ; WX 500 ; N dieresis ; B 68 560 441 698 ;\nC 202 ; WX 340 ; N ring ; B 68 552 275 755 ;\nC 203 ; WX 360 ; N cedilla ; B 68 -213 284 0 ;\nC 205 ; WX 440 ; N hungarumlaut ; B 68 554 365 741 ;\nC 206 ; WX 320 ; N ogonek ; B 68 -163 246 0 ;\nC 207 ; WX 500 ; N caron ; B 68 541 430 717 ;\nC 208 ; WX 1000 ; N emdash ; B -25 212 1025 318 ;\nC 225 ; WX 1140 ; N AE ; B -34 0 1149 681 ;\nC 227 ; WX 400 ; N ordfeminine ; B 27 383 396 698 ;\nC 232 ; WX 640 ; N Lslash ; B 20 0 668 681 ;\nC 233 ; WX 800 ; N Oslash ; B 35 -110 771 781 ;\nC 234 ; WX 1220 ; N OE ; B 35 -17 1219 698 ;\nC 235 ; WX 400 ; N ordmasculine ; B 17 383 383 698 ;\nC 241 ; WX 880 ; N ae ; B 28 -8 852 515 ;\nC 245 ; WX 360 ; N dotlessi ; B 22 0 335 502 ;\nC 248 ; WX 340 ; N lslash ; B 9 0 322 725 ;\nC 249 ; WX 620 ; N oslash ; B 31 -40 586 551 ;\nC 250 ; WX 940 ; N oe ; B 31 -8 908 515 ;\nC 251 ; WX 660 ; N germandbls ; B -61 -91 644 699 ;\nC -1 ; WX 580 ; N ecircumflex ; B 31 -8 548 731 ;\nC -1 ; WX 580 ; N edieresis ; B 31 -8 548 698 ;\nC -1 ; WX 580 ; N aacute ; B 28 -8 588 731 ;\nC -1 ; WX 740 ; N registered ; B 23 -17 723 698 ;\nC -1 ; WX 360 ; N icircumflex ; B -2 0 360 731 ;\nC -1 ; WX 660 ; N udieresis ; B 22 -8 653 698 ;\nC -1 ; WX 620 ; N ograve ; B 31 -8 585 730 ;\nC -1 ; WX 660 ; N uacute ; B 22 -8 653 731 ;\nC -1 ; WX 660 ; N ucircumflex ; B 22 -8 653 731 ;\nC -1 ; WX 720 ; N Aacute ; B -34 0 763 910 ;\nC -1 ; WX 360 ; N igrave ; B 22 0 335 730 ;\nC -1 ; WX 400 ; N Icircumflex ; B 18 0 380 910 ;\nC -1 ; WX 580 ; N ccedilla ; B 31 -213 550 515 ;\nC -1 ; WX 580 ; N adieresis ; B 28 -8 588 698 ;\nC -1 ; WX 720 ; N Ecircumflex ; B 20 0 724 910 ;\nC -1 ; WX 520 ; N scaron ; B 22 -8 492 717 ;\nC -1 ; WX 640 ; N thorn ; B 22 -212 611 725 ;\nC -1 ; WX 980 ; N trademark ; B 42 277 982 681 ;\nC -1 ; WX 580 ; N egrave ; B 31 -8 548 730 ;\nC -1 ; WX 396 ; N threesuperior ; B 5 269 391 698 ;\nC -1 ; WX 560 ; N zcaron ; B 22 0 547 717 ;\nC -1 ; WX 580 ; N atilde ; B 28 -8 588 691 ;\nC -1 ; WX 580 ; N aring ; B 28 -8 588 755 ;\nC -1 ; WX 620 ; N ocircumflex ; B 31 -8 585 731 ;\nC -1 ; WX 720 ; N Edieresis ; B 20 0 724 877 ;\nC -1 ; WX 990 ; N threequarters ; B 15 0 967 692 ;\nC -1 ; WX 620 ; N ydieresis ; B 6 -221 613 698 ;\nC -1 ; WX 620 ; N yacute ; B 6 -221 613 731 ;\nC -1 ; WX 360 ; N iacute ; B 22 0 335 731 ;\nC -1 ; WX 720 ; N Acircumflex ; B -34 0 763 910 ;\nC -1 ; WX 740 ; N Uacute ; B 15 -17 724 910 ;\nC -1 ; WX 580 ; N eacute ; B 31 -8 548 731 ;\nC -1 ; WX 800 ; N Ograve ; B 35 -17 769 909 ;\nC -1 ; WX 580 ; N agrave ; B 28 -8 588 730 ;\nC -1 ; WX 740 ; N Udieresis ; B 15 -17 724 877 ;\nC -1 ; WX 580 ; N acircumflex ; B 28 -8 588 731 ;\nC -1 ; WX 400 ; N Igrave ; B 20 0 379 909 ;\nC -1 ; WX 396 ; N twosuperior ; B 14 279 396 698 ;\nC -1 ; WX 740 ; N Ugrave ; B 15 -17 724 909 ;\nC -1 ; WX 990 ; N onequarter ; B 65 0 967 681 ;\nC -1 ; WX 740 ; N Ucircumflex ; B 15 -17 724 910 ;\nC -1 ; WX 660 ; N Scaron ; B 21 -17 639 896 ;\nC -1 ; WX 400 ; N Idieresis ; B 18 0 391 877 ;\nC -1 ; WX 360 ; N idieresis ; B -2 0 371 698 ;\nC -1 ; WX 720 ; N Egrave ; B 20 0 724 909 ;\nC -1 ; WX 800 ; N Oacute ; B 35 -17 769 910 ;\nC -1 ; WX 600 ; N divide ; B 51 9 555 521 ;\nC -1 ; WX 720 ; N Atilde ; B -34 0 763 870 ;\nC -1 ; WX 720 ; N Aring ; B -34 0 763 934 ;\nC -1 ; WX 800 ; N Odieresis ; B 35 -17 769 877 ;\nC -1 ; WX 720 ; N Adieresis ; B -34 0 763 877 ;\nC -1 ; WX 740 ; N Ntilde ; B 20 0 724 870 ;\nC -1 ; WX 640 ; N Zcaron ; B 6 0 635 896 ;\nC -1 ; WX 660 ; N Thorn ; B 20 0 658 681 ;\nC -1 ; WX 400 ; N Iacute ; B 20 0 379 910 ;\nC -1 ; WX 600 ; N plusminus ; B 51 0 555 514 ;\nC -1 ; WX 600 ; N multiply ; B 48 10 552 514 ;\nC -1 ; WX 720 ; N Eacute ; B 20 0 724 910 ;\nC -1 ; WX 700 ; N Ydieresis ; B -20 0 718 877 ;\nC -1 ; WX 396 ; N onesuperior ; B 65 279 345 687 ;\nC -1 ; WX 660 ; N ugrave ; B 22 -8 653 730 ;\nC -1 ; WX 600 ; N logicalnot ; B 51 129 555 421 ;\nC -1 ; WX 680 ; N ntilde ; B 22 0 652 691 ;\nC -1 ; WX 800 ; N Otilde ; B 35 -17 769 870 ;\nC -1 ; WX 620 ; N otilde ; B 31 -8 585 691 ;\nC -1 ; WX 740 ; N Ccedilla ; B 35 -213 724 698 ;\nC -1 ; WX 720 ; N Agrave ; B -34 0 763 909 ;\nC -1 ; WX 990 ; N onehalf ; B 65 0 980 681 ;\nC -1 ; WX 780 ; N Eth ; B 20 0 748 681 ;\nC -1 ; WX 400 ; N degree ; B 50 398 350 698 ;\nC -1 ; WX 700 ; N Yacute ; B -20 0 718 910 ;\nC -1 ; WX 800 ; N Ocircumflex ; B 35 -17 769 910 ;\nC -1 ; WX 620 ; N oacute ; B 31 -8 585 731 ;\nC -1 ; WX 660 ; N mu ; B 22 -221 653 502 ;\nC -1 ; WX 600 ; N minus ; B 51 207 555 323 ;\nC -1 ; WX 620 ; N eth ; B 31 -8 585 741 ;\nC -1 ; WX 620 ; N odieresis ; B 31 -8 585 698 ;\nC -1 ; WX 740 ; N copyright ; B 23 -17 723 698 ;\nC -1 ; WX 600 ; N brokenbar ; B 243 -175 362 675 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 90\n\nKPX A y -1\nKPX A w -9\nKPX A v -8\nKPX A Y -52\nKPX A W -20\nKPX A V -68\nKPX A T -40\n\nKPX F period -132\nKPX F comma -130\nKPX F A -59\n\nKPX L y 19\nKPX L Y -35\nKPX L W -41\nKPX L V -50\nKPX L T -4\n\nKPX P period -128\nKPX P comma -129\nKPX P A -46\n\nKPX R y -8\nKPX R Y -20\nKPX R W -24\nKPX R V -29\nKPX R T -4\n\nKPX T semicolon 5\nKPX T s -10\nKPX T r 27\nKPX T period -122\nKPX T o -28\nKPX T i 27\nKPX T hyphen -10\nKPX T e -29\nKPX T comma -122\nKPX T colon 7\nKPX T c -29\nKPX T a -24\nKPX T A -42\n\nKPX V y 12\nKPX V u -11\nKPX V semicolon -38\nKPX V r -15\nKPX V period -105\nKPX V o -79\nKPX V i 15\nKPX V hyphen -10\nKPX V e -80\nKPX V comma -103\nKPX V colon -37\nKPX V a -74\nKPX V A -88\n\nKPX W y 12\nKPX W u -11\nKPX W semicolon -38\nKPX W r -15\nKPX W period -105\nKPX W o -78\nKPX W i 15\nKPX W hyphen -10\nKPX W e -79\nKPX W comma -103\nKPX W colon -37\nKPX W a -73\nKPX W A -60\n\nKPX Y v 24\nKPX Y u -13\nKPX Y semicolon -34\nKPX Y q -66\nKPX Y period -105\nKPX Y p -23\nKPX Y o -66\nKPX Y i 2\nKPX Y hyphen -10\nKPX Y e -67\nKPX Y comma -103\nKPX Y colon -32\nKPX Y a -60\nKPX Y A -56\n\nKPX f f 21\n\nKPX r q -9\nKPX r period -102\nKPX r o -9\nKPX r n 20\nKPX r m 20\nKPX r hyphen -10\nKPX r h -23\nKPX r g -9\nKPX r f 20\nKPX r e -10\nKPX r d -10\nKPX r comma -101\nKPX r c -9\nEndKernPairs\nEndKernData\nStartComposites 56\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 160 179 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 110 179 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 110 179 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 160 179 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 190 179 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 120 179 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 160 179 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 110 179 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 110 179 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 160 179 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 0 179 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -50 179 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -50 179 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 0 179 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 130 179 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 200 179 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 150 179 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 150 179 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 200 179 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 160 179 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 80 179 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 170 179 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 120 179 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 120 179 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 170 179 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 150 179 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 100 179 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 70 179 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 90 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 40 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 40 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 90 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 100 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 30 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 90 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 40 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 40 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 90 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -20 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -70 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -70 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -20 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 80 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 110 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 60 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 60 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 110 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 50 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 10 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 130 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 80 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 80 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 130 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 110 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 60 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 30 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pbkdi8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1992 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Tue Jan 21 16:12:43 1992\nComment UniqueID 37832\nComment VMusage 32139 39031\nFontName Bookman-DemiItalic\nFullName ITC Bookman Demi Italic\nFamilyName ITC Bookman\nWeight Demi\nItalicAngle -10\nIsFixedPitch false\nFontBBox -231 -250 1333 941 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.004\nNotice Copyright (c) 1985, 1987, 1989, 1992 Adobe Systems Incorporated.  All Rights Reserved.ITC Bookman is a registered trademark of International Typeface Corporation.\nEncodingScheme AdobeStandardEncoding\nCapHeight 681\nXHeight 515\nAscender 732\nDescender -213\nStartCharMetrics 228\nC 32 ; WX 340 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 320 ; N exclam ; B 86 -8 366 698 ;\nC 34 ; WX 380 ; N quotedbl ; B 140 371 507 697 ;\nC 35 ; WX 680 ; N numbersign ; B 157 0 649 681 ;\nC 36 ; WX 680 ; N dollar ; B 45 -164 697 790 ;\nC 37 ; WX 880 ; N percent ; B 106 -17 899 698 ;\nC 38 ; WX 980 ; N ampersand ; B 48 -17 1016 698 ;\nC 39 ; WX 320 ; N quoteright ; B 171 420 349 698 ;\nC 40 ; WX 260 ; N parenleft ; B 31 -134 388 741 ;\nC 41 ; WX 260 ; N parenright ; B -35 -134 322 741 ;\nC 42 ; WX 460 ; N asterisk ; B 126 346 508 698 ;\nC 43 ; WX 600 ; N plus ; B 91 9 595 514 ;\nC 44 ; WX 340 ; N comma ; B 100 -124 298 185 ;\nC 45 ; WX 280 ; N hyphen ; B 59 218 319 313 ;\nC 46 ; WX 340 ; N period ; B 106 -8 296 177 ;\nC 47 ; WX 360 ; N slash ; B 9 -106 502 742 ;\nC 48 ; WX 680 ; N zero ; B 87 -17 703 698 ;\nC 49 ; WX 680 ; N one ; B 123 0 565 681 ;\nC 50 ; WX 680 ; N two ; B 67 0 674 698 ;\nC 51 ; WX 680 ; N three ; B 72 -17 683 698 ;\nC 52 ; WX 680 ; N four ; B 63 0 708 681 ;\nC 53 ; WX 680 ; N five ; B 78 -17 669 681 ;\nC 54 ; WX 680 ; N six ; B 88 -17 704 698 ;\nC 55 ; WX 680 ; N seven ; B 123 0 739 681 ;\nC 56 ; WX 680 ; N eight ; B 68 -17 686 698 ;\nC 57 ; WX 680 ; N nine ; B 71 -17 712 698 ;\nC 58 ; WX 340 ; N colon ; B 106 -8 356 515 ;\nC 59 ; WX 340 ; N semicolon ; B 100 -124 352 515 ;\nC 60 ; WX 620 ; N less ; B 79 -9 588 540 ;\nC 61 ; WX 600 ; N equal ; B 91 109 595 421 ;\nC 62 ; WX 620 ; N greater ; B 89 -9 598 540 ;\nC 63 ; WX 620 ; N question ; B 145 -8 668 698 ;\nC 64 ; WX 780 ; N at ; B 80 -17 790 698 ;\nC 65 ; WX 720 ; N A ; B -27 0 769 681 ;\nC 66 ; WX 720 ; N B ; B 14 0 762 681 ;\nC 67 ; WX 700 ; N C ; B 78 -17 754 698 ;\nC 68 ; WX 760 ; N D ; B 14 0 805 681 ;\nC 69 ; WX 720 ; N E ; B 14 0 777 681 ;\nC 70 ; WX 660 ; N F ; B 14 0 763 681 ;\nC 71 ; WX 760 ; N G ; B 77 -17 828 698 ;\nC 72 ; WX 800 ; N H ; B 14 0 910 681 ;\nC 73 ; WX 380 ; N I ; B 14 0 485 681 ;\nC 74 ; WX 620 ; N J ; B 8 -17 721 681 ;\nC 75 ; WX 780 ; N K ; B 14 0 879 681 ;\nC 76 ; WX 640 ; N L ; B 14 0 725 681 ;\nC 77 ; WX 860 ; N M ; B 14 0 970 681 ;\nC 78 ; WX 740 ; N N ; B 14 0 845 681 ;\nC 79 ; WX 760 ; N O ; B 78 -17 806 698 ;\nC 80 ; WX 640 ; N P ; B -6 0 724 681 ;\nC 81 ; WX 760 ; N Q ; B 37 -213 805 698 ;\nC 82 ; WX 740 ; N R ; B 14 0 765 681 ;\nC 83 ; WX 700 ; N S ; B 59 -17 731 698 ;\nC 84 ; WX 700 ; N T ; B 70 0 802 681 ;\nC 85 ; WX 740 ; N U ; B 112 -17 855 681 ;\nC 86 ; WX 660 ; N V ; B 72 0 819 681 ;\nC 87 ; WX 1000 ; N W ; B 72 0 1090 681 ;\nC 88 ; WX 740 ; N X ; B -7 0 835 681 ;\nC 89 ; WX 660 ; N Y ; B 72 0 817 681 ;\nC 90 ; WX 680 ; N Z ; B 23 0 740 681 ;\nC 91 ; WX 260 ; N bracketleft ; B 9 -118 374 741 ;\nC 92 ; WX 580 ; N backslash ; B 73 0 575 741 ;\nC 93 ; WX 260 ; N bracketright ; B -18 -118 347 741 ;\nC 94 ; WX 620 ; N asciicircum ; B 92 281 594 681 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 320 ; N quoteleft ; B 155 420 333 698 ;\nC 97 ; WX 680 ; N a ; B 84 -8 735 515 ;\nC 98 ; WX 600 ; N b ; B 57 -8 633 732 ;\nC 99 ; WX 560 ; N c ; B 58 -8 597 515 ;\nC 100 ; WX 680 ; N d ; B 60 -8 714 732 ;\nC 101 ; WX 560 ; N e ; B 59 -8 596 515 ;\nC 102 ; WX 420 ; N f ; B -192 -213 641 741 ; L i fi ; L l fl ;\nC 103 ; WX 620 ; N g ; B 21 -213 669 515 ;\nC 104 ; WX 700 ; N h ; B 93 -8 736 732 ;\nC 105 ; WX 380 ; N i ; B 83 -8 420 755 ;\nC 106 ; WX 320 ; N j ; B -160 -213 392 755 ;\nC 107 ; WX 700 ; N k ; B 97 -8 732 732 ;\nC 108 ; WX 380 ; N l ; B 109 -8 410 732 ;\nC 109 ; WX 960 ; N m ; B 83 -8 996 515 ;\nC 110 ; WX 680 ; N n ; B 83 -8 715 515 ;\nC 111 ; WX 600 ; N o ; B 59 -8 627 515 ;\nC 112 ; WX 660 ; N p ; B -24 -213 682 515 ;\nC 113 ; WX 620 ; N q ; B 60 -213 640 515 ;\nC 114 ; WX 500 ; N r ; B 84 0 582 515 ;\nC 115 ; WX 540 ; N s ; B 32 -8 573 515 ;\nC 116 ; WX 440 ; N t ; B 106 -8 488 658 ;\nC 117 ; WX 680 ; N u ; B 83 -8 720 507 ;\nC 118 ; WX 540 ; N v ; B 56 -8 572 515 ;\nC 119 ; WX 860 ; N w ; B 56 -8 891 515 ;\nC 120 ; WX 620 ; N x ; B 10 -8 654 515 ;\nC 121 ; WX 600 ; N y ; B 25 -213 642 507 ;\nC 122 ; WX 560 ; N z ; B 36 -8 586 515 ;\nC 123 ; WX 300 ; N braceleft ; B 49 -123 413 742 ;\nC 124 ; WX 620 ; N bar ; B 303 -250 422 750 ;\nC 125 ; WX 300 ; N braceright ; B -8 -114 356 751 ;\nC 126 ; WX 620 ; N asciitilde ; B 101 162 605 368 ;\nC 161 ; WX 320 ; N exclamdown ; B 64 -191 344 515 ;\nC 162 ; WX 680 ; N cent ; B 161 25 616 718 ;\nC 163 ; WX 680 ; N sterling ; B 0 -17 787 698 ;\nC 164 ; WX 120 ; N fraction ; B -144 0 382 681 ;\nC 165 ; WX 680 ; N yen ; B 92 0 782 681 ;\nC 166 ; WX 680 ; N florin ; B -28 -199 743 741 ;\nC 167 ; WX 620 ; N section ; B 46 -137 638 698 ;\nC 168 ; WX 680 ; N currency ; B 148 85 637 571 ;\nC 169 ; WX 180 ; N quotesingle ; B 126 370 295 696 ;\nC 170 ; WX 520 ; N quotedblleft ; B 156 420 545 698 ;\nC 171 ; WX 380 ; N guillemotleft ; B 62 84 406 503 ;\nC 172 ; WX 220 ; N guilsinglleft ; B 62 84 249 503 ;\nC 173 ; WX 220 ; N guilsinglright ; B 62 84 249 503 ;\nC 174 ; WX 820 ; N fi ; B -191 -213 850 741 ;\nC 175 ; WX 820 ; N fl ; B -191 -213 850 741 ;\nC 177 ; WX 500 ; N endash ; B 40 219 573 311 ;\nC 178 ; WX 420 ; N dagger ; B 89 -137 466 698 ;\nC 179 ; WX 420 ; N daggerdbl ; B 79 -137 486 698 ;\nC 180 ; WX 340 ; N periodcentered ; B 126 173 316 358 ;\nC 182 ; WX 680 ; N paragraph ; B 137 0 715 681 ;\nC 183 ; WX 360 ; N bullet ; B 60 170 404 511 ;\nC 184 ; WX 300 ; N quotesinglbase ; B 106 -112 284 166 ;\nC 185 ; WX 520 ; N quotedblbase ; B 106 -112 495 166 ;\nC 186 ; WX 520 ; N quotedblright ; B 171 420 560 698 ;\nC 187 ; WX 380 ; N guillemotright ; B 62 84 406 503 ;\nC 188 ; WX 1000 ; N ellipsis ; B 86 -8 942 177 ;\nC 189 ; WX 1360 ; N perthousand ; B 106 -17 1333 698 ;\nC 191 ; WX 620 ; N questiondown ; B 83 -189 606 515 ;\nC 193 ; WX 380 ; N grave ; B 193 566 424 771 ;\nC 194 ; WX 340 ; N acute ; B 176 566 407 771 ;\nC 195 ; WX 480 ; N circumflex ; B 183 582 523 749 ;\nC 196 ; WX 480 ; N tilde ; B 178 587 533 709 ;\nC 197 ; WX 480 ; N macron ; B 177 603 531 691 ;\nC 198 ; WX 460 ; N breve ; B 177 577 516 707 ;\nC 199 ; WX 380 ; N dotaccent ; B 180 570 345 734 ;\nC 200 ; WX 520 ; N dieresis ; B 180 570 569 734 ;\nC 202 ; WX 360 ; N ring ; B 185 558 406 775 ;\nC 203 ; WX 360 ; N cedilla ; B 68 -220 289 -8 ;\nC 205 ; WX 560 ; N hungarumlaut ; B 181 560 616 775 ;\nC 206 ; WX 320 ; N ogonek ; B 68 -182 253 0 ;\nC 207 ; WX 480 ; N caron ; B 183 582 523 749 ;\nC 208 ; WX 1000 ; N emdash ; B 40 219 1073 311 ;\nC 225 ; WX 1140 ; N AE ; B -27 0 1207 681 ;\nC 227 ; WX 440 ; N ordfeminine ; B 118 400 495 685 ;\nC 232 ; WX 640 ; N Lslash ; B 14 0 724 681 ;\nC 233 ; WX 760 ; N Oslash ; B 21 -29 847 725 ;\nC 234 ; WX 1180 ; N OE ; B 94 -17 1245 698 ;\nC 235 ; WX 440 ; N ordmasculine ; B 127 400 455 685 ;\nC 241 ; WX 880 ; N ae ; B 39 -8 913 515 ;\nC 245 ; WX 380 ; N dotlessi ; B 83 -8 420 507 ;\nC 248 ; WX 380 ; N lslash ; B 63 -8 412 732 ;\nC 249 ; WX 600 ; N oslash ; B 17 -54 661 571 ;\nC 250 ; WX 920 ; N oe ; B 48 -8 961 515 ;\nC 251 ; WX 660 ; N germandbls ; B -231 -213 702 741 ;\nC -1 ; WX 560 ; N ecircumflex ; B 59 -8 596 749 ;\nC -1 ; WX 560 ; N edieresis ; B 59 -8 596 734 ;\nC -1 ; WX 680 ; N aacute ; B 84 -8 735 771 ;\nC -1 ; WX 780 ; N registered ; B 83 -17 783 698 ;\nC -1 ; WX 380 ; N icircumflex ; B 83 -8 433 749 ;\nC -1 ; WX 680 ; N udieresis ; B 83 -8 720 734 ;\nC -1 ; WX 600 ; N ograve ; B 59 -8 627 771 ;\nC -1 ; WX 680 ; N uacute ; B 83 -8 720 771 ;\nC -1 ; WX 680 ; N ucircumflex ; B 83 -8 720 749 ;\nC -1 ; WX 720 ; N Aacute ; B -27 0 769 937 ;\nC -1 ; WX 380 ; N igrave ; B 83 -8 424 771 ;\nC -1 ; WX 380 ; N Icircumflex ; B 14 0 493 915 ;\nC -1 ; WX 560 ; N ccedilla ; B 58 -220 597 515 ;\nC -1 ; WX 680 ; N adieresis ; B 84 -8 735 734 ;\nC -1 ; WX 720 ; N Ecircumflex ; B 14 0 777 915 ;\nC -1 ; WX 540 ; N scaron ; B 32 -8 573 749 ;\nC -1 ; WX 660 ; N thorn ; B -24 -213 682 732 ;\nC -1 ; WX 940 ; N trademark ; B 42 277 982 681 ;\nC -1 ; WX 560 ; N egrave ; B 59 -8 596 771 ;\nC -1 ; WX 408 ; N threesuperior ; B 86 269 483 698 ;\nC -1 ; WX 560 ; N zcaron ; B 36 -8 586 749 ;\nC -1 ; WX 680 ; N atilde ; B 84 -8 735 709 ;\nC -1 ; WX 680 ; N aring ; B 84 -8 735 775 ;\nC -1 ; WX 600 ; N ocircumflex ; B 59 -8 627 749 ;\nC -1 ; WX 720 ; N Edieresis ; B 14 0 777 900 ;\nC -1 ; WX 1020 ; N threequarters ; B 86 0 1054 691 ;\nC -1 ; WX 600 ; N ydieresis ; B 25 -213 642 734 ;\nC -1 ; WX 600 ; N yacute ; B 25 -213 642 771 ;\nC -1 ; WX 380 ; N iacute ; B 83 -8 420 771 ;\nC -1 ; WX 720 ; N Acircumflex ; B -27 0 769 915 ;\nC -1 ; WX 740 ; N Uacute ; B 112 -17 855 937 ;\nC -1 ; WX 560 ; N eacute ; B 59 -8 596 771 ;\nC -1 ; WX 760 ; N Ograve ; B 78 -17 806 937 ;\nC -1 ; WX 680 ; N agrave ; B 84 -8 735 771 ;\nC -1 ; WX 740 ; N Udieresis ; B 112 -17 855 900 ;\nC -1 ; WX 680 ; N acircumflex ; B 84 -8 735 749 ;\nC -1 ; WX 380 ; N Igrave ; B 14 0 485 937 ;\nC -1 ; WX 408 ; N twosuperior ; B 91 279 485 698 ;\nC -1 ; WX 740 ; N Ugrave ; B 112 -17 855 937 ;\nC -1 ; WX 1020 ; N onequarter ; B 118 0 1054 681 ;\nC -1 ; WX 740 ; N Ucircumflex ; B 112 -17 855 915 ;\nC -1 ; WX 700 ; N Scaron ; B 59 -17 731 915 ;\nC -1 ; WX 380 ; N Idieresis ; B 14 0 499 900 ;\nC -1 ; WX 380 ; N idieresis ; B 83 -8 479 734 ;\nC -1 ; WX 720 ; N Egrave ; B 14 0 777 937 ;\nC -1 ; WX 760 ; N Oacute ; B 78 -17 806 937 ;\nC -1 ; WX 600 ; N divide ; B 91 9 595 521 ;\nC -1 ; WX 720 ; N Atilde ; B -27 0 769 875 ;\nC -1 ; WX 720 ; N Aring ; B -27 0 769 941 ;\nC -1 ; WX 760 ; N Odieresis ; B 78 -17 806 900 ;\nC -1 ; WX 720 ; N Adieresis ; B -27 0 769 900 ;\nC -1 ; WX 740 ; N Ntilde ; B 14 0 845 875 ;\nC -1 ; WX 680 ; N Zcaron ; B 23 0 740 915 ;\nC -1 ; WX 640 ; N Thorn ; B -6 0 701 681 ;\nC -1 ; WX 380 ; N Iacute ; B 14 0 485 937 ;\nC -1 ; WX 600 ; N plusminus ; B 91 0 595 514 ;\nC -1 ; WX 600 ; N multiply ; B 91 10 595 514 ;\nC -1 ; WX 720 ; N Eacute ; B 14 0 777 937 ;\nC -1 ; WX 660 ; N Ydieresis ; B 72 0 817 900 ;\nC -1 ; WX 408 ; N onesuperior ; B 118 279 406 688 ;\nC -1 ; WX 680 ; N ugrave ; B 83 -8 720 771 ;\nC -1 ; WX 620 ; N logicalnot ; B 81 129 585 421 ;\nC -1 ; WX 680 ; N ntilde ; B 83 -8 715 709 ;\nC -1 ; WX 760 ; N Otilde ; B 78 -17 806 875 ;\nC -1 ; WX 600 ; N otilde ; B 59 -8 627 709 ;\nC -1 ; WX 700 ; N Ccedilla ; B 78 -220 754 698 ;\nC -1 ; WX 720 ; N Agrave ; B -27 0 769 937 ;\nC -1 ; WX 1020 ; N onehalf ; B 118 0 1036 681 ;\nC -1 ; WX 760 ; N Eth ; B 14 0 805 681 ;\nC -1 ; WX 400 ; N degree ; B 130 398 430 698 ;\nC -1 ; WX 660 ; N Yacute ; B 72 0 817 937 ;\nC -1 ; WX 760 ; N Ocircumflex ; B 78 -17 806 915 ;\nC -1 ; WX 600 ; N oacute ; B 59 -8 627 771 ;\nC -1 ; WX 680 ; N mu ; B 54 -213 720 507 ;\nC -1 ; WX 600 ; N minus ; B 91 207 595 323 ;\nC -1 ; WX 600 ; N eth ; B 59 -8 662 741 ;\nC -1 ; WX 600 ; N odieresis ; B 59 -8 627 734 ;\nC -1 ; WX 780 ; N copyright ; B 83 -17 783 698 ;\nC -1 ; WX 620 ; N brokenbar ; B 303 -175 422 675 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 92\n\nKPX A y 20\nKPX A w 20\nKPX A v 20\nKPX A Y -25\nKPX A W -35\nKPX A V -40\nKPX A T -17\n\nKPX F period -105\nKPX F comma -98\nKPX F A -35\n\nKPX L y 62\nKPX L Y -5\nKPX L W -15\nKPX L V -19\nKPX L T -26\n\nKPX P period -105\nKPX P comma -98\nKPX P A -31\n\nKPX R y 27\nKPX R Y 4\nKPX R W -4\nKPX R V -8\nKPX R T -3\n\nKPX T y 56\nKPX T w 69\nKPX T u 42\nKPX T semicolon 31\nKPX T s -1\nKPX T r 41\nKPX T period -107\nKPX T o -5\nKPX T i 42\nKPX T hyphen -20\nKPX T e -10\nKPX T comma -100\nKPX T colon 26\nKPX T c -8\nKPX T a -8\nKPX T A -42\n\nKPX V y 17\nKPX V u -1\nKPX V semicolon -22\nKPX V r 2\nKPX V period -115\nKPX V o -50\nKPX V i 32\nKPX V hyphen -20\nKPX V e -50\nKPX V comma -137\nKPX V colon -28\nKPX V a -50\nKPX V A -50\n\nKPX W y -51\nKPX W u -69\nKPX W semicolon -81\nKPX W r -66\nKPX W period -183\nKPX W o -100\nKPX W i -36\nKPX W hyphen -22\nKPX W e -100\nKPX W comma -201\nKPX W colon -86\nKPX W a -100\nKPX W A -77\n\nKPX Y v 26\nKPX Y u -1\nKPX Y semicolon -4\nKPX Y q -43\nKPX Y period -113\nKPX Y o -41\nKPX Y i 20\nKPX Y hyphen -20\nKPX Y e -46\nKPX Y comma -106\nKPX Y colon -9\nKPX Y a -45\nKPX Y A -30\n\nKPX f f 10\n\nKPX r q -3\nKPX r period -120\nKPX r o -1\nKPX r n 39\nKPX r m 39\nKPX r hyphen -20\nKPX r h -35\nKPX r g -23\nKPX r f 42\nKPX r e -6\nKPX r d -3\nKPX r comma -113\nKPX r c -5\nEndKernPairs\nEndKernData\nStartComposites 56\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 190 166 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 120 166 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 100 166 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 170 166 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 200 166 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 120 166 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 190 166 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 120 166 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 100 166 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 170 166 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 20 166 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -30 166 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -70 166 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 0 166 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 130 166 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 210 166 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 140 166 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 140 166 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 190 166 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 140 166 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 110 166 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 200 166 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 130 166 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 130 166 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 180 166 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 160 166 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 70 166 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 100 166 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 170 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 100 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 80 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 150 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 160 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 100 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 110 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 60 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 20 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 90 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 0 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -90 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -90 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave 0 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 60 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 130 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 60 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 40 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 110 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 60 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 30 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 170 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 100 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 80 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 150 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 130 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 40 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 40 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pbkl8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1992 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Tue Jan 21 16:15:53 1992\nComment UniqueID 37833\nComment VMusage 32321 39213\nFontName Bookman-Light\nFullName ITC Bookman Light\nFamilyName ITC Bookman\nWeight Light\nItalicAngle 0\nIsFixedPitch false\nFontBBox -188 -251 1266 908 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.004\nNotice Copyright (c) 1985, 1987, 1989, 1992 Adobe Systems Incorporated.  All Rights Reserved.ITC Bookman is a registered trademark of International Typeface Corporation.\nEncodingScheme AdobeStandardEncoding\nCapHeight 681\nXHeight 484\nAscender 717\nDescender -228\nStartCharMetrics 228\nC 32 ; WX 320 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 300 ; N exclam ; B 75 -8 219 698 ;\nC 34 ; WX 380 ; N quotedbl ; B 56 458 323 698 ;\nC 35 ; WX 620 ; N numbersign ; B 65 0 556 681 ;\nC 36 ; WX 620 ; N dollar ; B 34 -109 593 791 ;\nC 37 ; WX 900 ; N percent ; B 22 -8 873 698 ;\nC 38 ; WX 800 ; N ampersand ; B 45 -17 787 698 ;\nC 39 ; WX 220 ; N quoteright ; B 46 480 178 698 ;\nC 40 ; WX 300 ; N parenleft ; B 76 -145 278 727 ;\nC 41 ; WX 300 ; N parenright ; B 17 -146 219 727 ;\nC 42 ; WX 440 ; N asterisk ; B 54 325 391 698 ;\nC 43 ; WX 600 ; N plus ; B 51 8 555 513 ;\nC 44 ; WX 320 ; N comma ; B 90 -114 223 114 ;\nC 45 ; WX 400 ; N hyphen ; B 50 232 350 292 ;\nC 46 ; WX 320 ; N period ; B 92 -8 220 123 ;\nC 47 ; WX 600 ; N slash ; B 74 -149 532 717 ;\nC 48 ; WX 620 ; N zero ; B 40 -17 586 698 ;\nC 49 ; WX 620 ; N one ; B 160 0 501 681 ;\nC 50 ; WX 620 ; N two ; B 42 0 576 698 ;\nC 51 ; WX 620 ; N three ; B 40 -17 576 698 ;\nC 52 ; WX 620 ; N four ; B 25 0 600 681 ;\nC 53 ; WX 620 ; N five ; B 60 -17 584 717 ;\nC 54 ; WX 620 ; N six ; B 45 -17 590 698 ;\nC 55 ; WX 620 ; N seven ; B 60 0 586 681 ;\nC 56 ; WX 620 ; N eight ; B 44 -17 583 698 ;\nC 57 ; WX 620 ; N nine ; B 37 -17 576 698 ;\nC 58 ; WX 320 ; N colon ; B 92 -8 220 494 ;\nC 59 ; WX 320 ; N semicolon ; B 90 -114 223 494 ;\nC 60 ; WX 600 ; N less ; B 49 -2 558 526 ;\nC 61 ; WX 600 ; N equal ; B 51 126 555 398 ;\nC 62 ; WX 600 ; N greater ; B 48 -2 557 526 ;\nC 63 ; WX 540 ; N question ; B 27 -8 514 698 ;\nC 64 ; WX 820 ; N at ; B 55 -17 755 698 ;\nC 65 ; WX 680 ; N A ; B -37 0 714 681 ;\nC 66 ; WX 740 ; N B ; B 31 0 702 681 ;\nC 67 ; WX 740 ; N C ; B 44 -17 702 698 ;\nC 68 ; WX 800 ; N D ; B 31 0 752 681 ;\nC 69 ; WX 720 ; N E ; B 31 0 705 681 ;\nC 70 ; WX 640 ; N F ; B 31 0 654 681 ;\nC 71 ; WX 800 ; N G ; B 44 -17 778 698 ;\nC 72 ; WX 800 ; N H ; B 31 0 769 681 ;\nC 73 ; WX 340 ; N I ; B 31 0 301 681 ;\nC 74 ; WX 600 ; N J ; B -23 -17 567 681 ;\nC 75 ; WX 720 ; N K ; B 31 0 750 681 ;\nC 76 ; WX 600 ; N L ; B 31 0 629 681 ;\nC 77 ; WX 920 ; N M ; B 26 0 894 681 ;\nC 78 ; WX 740 ; N N ; B 26 0 722 681 ;\nC 79 ; WX 800 ; N O ; B 44 -17 758 698 ;\nC 80 ; WX 620 ; N P ; B 31 0 613 681 ;\nC 81 ; WX 820 ; N Q ; B 44 -189 769 698 ;\nC 82 ; WX 720 ; N R ; B 31 0 757 681 ;\nC 83 ; WX 660 ; N S ; B 28 -17 634 698 ;\nC 84 ; WX 620 ; N T ; B -37 0 656 681 ;\nC 85 ; WX 780 ; N U ; B 25 -17 754 681 ;\nC 86 ; WX 700 ; N V ; B -30 0 725 681 ;\nC 87 ; WX 960 ; N W ; B -30 0 984 681 ;\nC 88 ; WX 720 ; N X ; B -30 0 755 681 ;\nC 89 ; WX 640 ; N Y ; B -30 0 666 681 ;\nC 90 ; WX 640 ; N Z ; B 10 0 656 681 ;\nC 91 ; WX 300 ; N bracketleft ; B 92 -136 258 717 ;\nC 92 ; WX 600 ; N backslash ; B 74 0 532 717 ;\nC 93 ; WX 300 ; N bracketright ; B 41 -136 207 717 ;\nC 94 ; WX 600 ; N asciicircum ; B 52 276 554 681 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 220 ; N quoteleft ; B 46 479 178 698 ;\nC 97 ; WX 580 ; N a ; B 35 -8 587 494 ;\nC 98 ; WX 620 ; N b ; B -2 -8 582 717 ;\nC 99 ; WX 520 ; N c ; B 37 -8 498 494 ;\nC 100 ; WX 620 ; N d ; B 37 -8 591 717 ;\nC 101 ; WX 520 ; N e ; B 37 -8 491 494 ;\nC 102 ; WX 320 ; N f ; B 20 0 414 734 ; L i fi ; L l fl ;\nC 103 ; WX 540 ; N g ; B 17 -243 542 567 ;\nC 104 ; WX 660 ; N h ; B 20 0 643 717 ;\nC 105 ; WX 300 ; N i ; B 20 0 288 654 ;\nC 106 ; WX 300 ; N j ; B -109 -251 214 654 ;\nC 107 ; WX 620 ; N k ; B 20 0 628 717 ;\nC 108 ; WX 300 ; N l ; B 20 0 286 717 ;\nC 109 ; WX 940 ; N m ; B 17 0 928 494 ;\nC 110 ; WX 660 ; N n ; B 20 0 649 494 ;\nC 111 ; WX 560 ; N o ; B 37 -8 526 494 ;\nC 112 ; WX 620 ; N p ; B 20 -228 583 494 ;\nC 113 ; WX 580 ; N q ; B 37 -228 589 494 ;\nC 114 ; WX 440 ; N r ; B 20 0 447 494 ;\nC 115 ; WX 520 ; N s ; B 40 -8 487 494 ;\nC 116 ; WX 380 ; N t ; B 20 -8 388 667 ;\nC 117 ; WX 680 ; N u ; B 20 -8 653 484 ;\nC 118 ; WX 520 ; N v ; B -23 0 534 484 ;\nC 119 ; WX 780 ; N w ; B -19 0 804 484 ;\nC 120 ; WX 560 ; N x ; B -16 0 576 484 ;\nC 121 ; WX 540 ; N y ; B -23 -236 549 484 ;\nC 122 ; WX 480 ; N z ; B 7 0 476 484 ;\nC 123 ; WX 280 ; N braceleft ; B 21 -136 260 717 ;\nC 124 ; WX 600 ; N bar ; B 264 -250 342 750 ;\nC 125 ; WX 280 ; N braceright ; B 21 -136 260 717 ;\nC 126 ; WX 600 ; N asciitilde ; B 52 173 556 352 ;\nC 161 ; WX 300 ; N exclamdown ; B 75 -214 219 494 ;\nC 162 ; WX 620 ; N cent ; B 116 20 511 651 ;\nC 163 ; WX 620 ; N sterling ; B 8 -17 631 698 ;\nC 164 ; WX 140 ; N fraction ; B -188 0 335 681 ;\nC 165 ; WX 620 ; N yen ; B -22 0 647 681 ;\nC 166 ; WX 620 ; N florin ; B -29 -155 633 749 ;\nC 167 ; WX 520 ; N section ; B 33 -178 486 698 ;\nC 168 ; WX 620 ; N currency ; B 58 89 563 591 ;\nC 169 ; WX 220 ; N quotesingle ; B 67 458 153 698 ;\nC 170 ; WX 400 ; N quotedblleft ; B 46 479 348 698 ;\nC 171 ; WX 360 ; N guillemotleft ; B 51 89 312 437 ;\nC 172 ; WX 240 ; N guilsinglleft ; B 51 89 189 437 ;\nC 173 ; WX 240 ; N guilsinglright ; B 51 89 189 437 ;\nC 174 ; WX 620 ; N fi ; B 20 0 608 734 ;\nC 175 ; WX 620 ; N fl ; B 20 0 606 734 ;\nC 177 ; WX 500 ; N endash ; B -15 232 515 292 ;\nC 178 ; WX 540 ; N dagger ; B 79 -156 455 698 ;\nC 179 ; WX 540 ; N daggerdbl ; B 79 -156 455 698 ;\nC 180 ; WX 320 ; N periodcentered ; B 92 196 220 327 ;\nC 182 ; WX 600 ; N paragraph ; B 14 0 577 681 ;\nC 183 ; WX 460 ; N bullet ; B 60 170 404 511 ;\nC 184 ; WX 220 ; N quotesinglbase ; B 46 -108 178 110 ;\nC 185 ; WX 400 ; N quotedblbase ; B 46 -108 348 110 ;\nC 186 ; WX 400 ; N quotedblright ; B 46 480 348 698 ;\nC 187 ; WX 360 ; N guillemotright ; B 51 89 312 437 ;\nC 188 ; WX 1000 ; N ellipsis ; B 101 -8 898 123 ;\nC 189 ; WX 1280 ; N perthousand ; B 22 -8 1266 698 ;\nC 191 ; WX 540 ; N questiondown ; B 23 -217 510 494 ;\nC 193 ; WX 340 ; N grave ; B 68 571 274 689 ;\nC 194 ; WX 340 ; N acute ; B 68 571 274 689 ;\nC 195 ; WX 420 ; N circumflex ; B 68 567 352 685 ;\nC 196 ; WX 440 ; N tilde ; B 68 572 375 661 ;\nC 197 ; WX 440 ; N macron ; B 68 587 364 635 ;\nC 198 ; WX 460 ; N breve ; B 68 568 396 687 ;\nC 199 ; WX 260 ; N dotaccent ; B 68 552 186 672 ;\nC 200 ; WX 420 ; N dieresis ; B 68 552 349 674 ;\nC 202 ; WX 320 ; N ring ; B 68 546 252 731 ;\nC 203 ; WX 320 ; N cedilla ; B 68 -200 257 0 ;\nC 205 ; WX 380 ; N hungarumlaut ; B 68 538 311 698 ;\nC 206 ; WX 320 ; N ogonek ; B 68 -145 245 0 ;\nC 207 ; WX 420 ; N caron ; B 68 554 352 672 ;\nC 208 ; WX 1000 ; N emdash ; B -15 232 1015 292 ;\nC 225 ; WX 1260 ; N AE ; B -36 0 1250 681 ;\nC 227 ; WX 420 ; N ordfeminine ; B 49 395 393 698 ;\nC 232 ; WX 600 ; N Lslash ; B 31 0 629 681 ;\nC 233 ; WX 800 ; N Oslash ; B 44 -53 758 733 ;\nC 234 ; WX 1240 ; N OE ; B 44 -17 1214 698 ;\nC 235 ; WX 420 ; N ordmasculine ; B 56 394 361 698 ;\nC 241 ; WX 860 ; N ae ; B 35 -8 832 494 ;\nC 245 ; WX 300 ; N dotlessi ; B 20 0 288 484 ;\nC 248 ; WX 320 ; N lslash ; B 20 0 291 717 ;\nC 249 ; WX 560 ; N oslash ; B 37 -40 526 534 ;\nC 250 ; WX 900 ; N oe ; B 37 -8 876 494 ;\nC 251 ; WX 660 ; N germandbls ; B -109 -110 614 698 ;\nC -1 ; WX 520 ; N ecircumflex ; B 37 -8 491 685 ;\nC -1 ; WX 520 ; N edieresis ; B 37 -8 491 674 ;\nC -1 ; WX 580 ; N aacute ; B 35 -8 587 689 ;\nC -1 ; WX 740 ; N registered ; B 23 -17 723 698 ;\nC -1 ; WX 300 ; N icircumflex ; B 8 0 292 685 ;\nC -1 ; WX 680 ; N udieresis ; B 20 -8 653 674 ;\nC -1 ; WX 560 ; N ograve ; B 37 -8 526 689 ;\nC -1 ; WX 680 ; N uacute ; B 20 -8 653 689 ;\nC -1 ; WX 680 ; N ucircumflex ; B 20 -8 653 685 ;\nC -1 ; WX 680 ; N Aacute ; B -37 0 714 866 ;\nC -1 ; WX 300 ; N igrave ; B 20 0 288 689 ;\nC -1 ; WX 340 ; N Icircumflex ; B 28 0 312 862 ;\nC -1 ; WX 520 ; N ccedilla ; B 37 -200 498 494 ;\nC -1 ; WX 580 ; N adieresis ; B 35 -8 587 674 ;\nC -1 ; WX 720 ; N Ecircumflex ; B 31 0 705 862 ;\nC -1 ; WX 520 ; N scaron ; B 40 -8 487 672 ;\nC -1 ; WX 620 ; N thorn ; B 20 -228 583 717 ;\nC -1 ; WX 980 ; N trademark ; B 34 277 930 681 ;\nC -1 ; WX 520 ; N egrave ; B 37 -8 491 689 ;\nC -1 ; WX 372 ; N threesuperior ; B 12 269 360 698 ;\nC -1 ; WX 480 ; N zcaron ; B 7 0 476 672 ;\nC -1 ; WX 580 ; N atilde ; B 35 -8 587 661 ;\nC -1 ; WX 580 ; N aring ; B 35 -8 587 731 ;\nC -1 ; WX 560 ; N ocircumflex ; B 37 -8 526 685 ;\nC -1 ; WX 720 ; N Edieresis ; B 31 0 705 851 ;\nC -1 ; WX 930 ; N threequarters ; B 52 0 889 691 ;\nC -1 ; WX 540 ; N ydieresis ; B -23 -236 549 674 ;\nC -1 ; WX 540 ; N yacute ; B -23 -236 549 689 ;\nC -1 ; WX 300 ; N iacute ; B 20 0 288 689 ;\nC -1 ; WX 680 ; N Acircumflex ; B -37 0 714 862 ;\nC -1 ; WX 780 ; N Uacute ; B 25 -17 754 866 ;\nC -1 ; WX 520 ; N eacute ; B 37 -8 491 689 ;\nC -1 ; WX 800 ; N Ograve ; B 44 -17 758 866 ;\nC -1 ; WX 580 ; N agrave ; B 35 -8 587 689 ;\nC -1 ; WX 780 ; N Udieresis ; B 25 -17 754 851 ;\nC -1 ; WX 580 ; N acircumflex ; B 35 -8 587 685 ;\nC -1 ; WX 340 ; N Igrave ; B 31 0 301 866 ;\nC -1 ; WX 372 ; N twosuperior ; B 20 279 367 698 ;\nC -1 ; WX 780 ; N Ugrave ; B 25 -17 754 866 ;\nC -1 ; WX 930 ; N onequarter ; B 80 0 869 681 ;\nC -1 ; WX 780 ; N Ucircumflex ; B 25 -17 754 862 ;\nC -1 ; WX 660 ; N Scaron ; B 28 -17 634 849 ;\nC -1 ; WX 340 ; N Idieresis ; B 28 0 309 851 ;\nC -1 ; WX 300 ; N idieresis ; B 8 0 289 674 ;\nC -1 ; WX 720 ; N Egrave ; B 31 0 705 866 ;\nC -1 ; WX 800 ; N Oacute ; B 44 -17 758 866 ;\nC -1 ; WX 600 ; N divide ; B 51 10 555 514 ;\nC -1 ; WX 680 ; N Atilde ; B -37 0 714 838 ;\nC -1 ; WX 680 ; N Aring ; B -37 0 714 908 ;\nC -1 ; WX 800 ; N Odieresis ; B 44 -17 758 851 ;\nC -1 ; WX 680 ; N Adieresis ; B -37 0 714 851 ;\nC -1 ; WX 740 ; N Ntilde ; B 26 0 722 838 ;\nC -1 ; WX 640 ; N Zcaron ; B 10 0 656 849 ;\nC -1 ; WX 620 ; N Thorn ; B 31 0 613 681 ;\nC -1 ; WX 340 ; N Iacute ; B 31 0 301 866 ;\nC -1 ; WX 600 ; N plusminus ; B 51 0 555 513 ;\nC -1 ; WX 600 ; N multiply ; B 51 9 555 513 ;\nC -1 ; WX 720 ; N Eacute ; B 31 0 705 866 ;\nC -1 ; WX 640 ; N Ydieresis ; B -30 0 666 851 ;\nC -1 ; WX 372 ; N onesuperior ; B 80 279 302 688 ;\nC -1 ; WX 680 ; N ugrave ; B 20 -8 653 689 ;\nC -1 ; WX 600 ; N logicalnot ; B 51 128 555 398 ;\nC -1 ; WX 660 ; N ntilde ; B 20 0 649 661 ;\nC -1 ; WX 800 ; N Otilde ; B 44 -17 758 838 ;\nC -1 ; WX 560 ; N otilde ; B 37 -8 526 661 ;\nC -1 ; WX 740 ; N Ccedilla ; B 44 -200 702 698 ;\nC -1 ; WX 680 ; N Agrave ; B -37 0 714 866 ;\nC -1 ; WX 930 ; N onehalf ; B 80 0 885 681 ;\nC -1 ; WX 800 ; N Eth ; B 31 0 752 681 ;\nC -1 ; WX 400 ; N degree ; B 50 398 350 698 ;\nC -1 ; WX 640 ; N Yacute ; B -30 0 666 866 ;\nC -1 ; WX 800 ; N Ocircumflex ; B 44 -17 758 862 ;\nC -1 ; WX 560 ; N oacute ; B 37 -8 526 689 ;\nC -1 ; WX 680 ; N mu ; B 20 -251 653 484 ;\nC -1 ; WX 600 ; N minus ; B 51 224 555 300 ;\nC -1 ; WX 560 ; N eth ; B 37 -8 526 734 ;\nC -1 ; WX 560 ; N odieresis ; B 37 -8 526 674 ;\nC -1 ; WX 740 ; N copyright ; B 24 -17 724 698 ;\nC -1 ; WX 600 ; N brokenbar ; B 264 -175 342 675 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 82\n\nKPX A y 32\nKPX A w 4\nKPX A v 7\nKPX A Y -35\nKPX A W -40\nKPX A V -56\nKPX A T 1\n\nKPX F period -46\nKPX F comma -41\nKPX F A -21\n\nKPX L y 79\nKPX L Y 13\nKPX L W 1\nKPX L V -4\nKPX L T 28\n\nKPX P period -60\nKPX P comma -55\nKPX P A -8\n\nKPX R y 59\nKPX R Y 26\nKPX R W 13\nKPX R V 8\nKPX R T 71\n\nKPX T s 16\nKPX T r 38\nKPX T period -33\nKPX T o 15\nKPX T i 42\nKPX T hyphen 90\nKPX T e 13\nKPX T comma -28\nKPX T c 14\nKPX T a 17\nKPX T A 1\n\nKPX V y 15\nKPX V u -38\nKPX V r -41\nKPX V period -40\nKPX V o -71\nKPX V i -20\nKPX V hyphen 11\nKPX V e -72\nKPX V comma -34\nKPX V a -69\nKPX V A -66\n\nKPX W y 15\nKPX W u -38\nKPX W r -41\nKPX W period -40\nKPX W o -68\nKPX W i -20\nKPX W hyphen 11\nKPX W e -69\nKPX W comma -34\nKPX W a -66\nKPX W A -64\n\nKPX Y v 15\nKPX Y u -38\nKPX Y q -55\nKPX Y period -40\nKPX Y p -31\nKPX Y o -57\nKPX Y i -37\nKPX Y hyphen 11\nKPX Y e -58\nKPX Y comma -34\nKPX Y a -54\nKPX Y A -53\n\nKPX f f 29\n\nKPX r q 9\nKPX r period -64\nKPX r o 8\nKPX r n 31\nKPX r m 31\nKPX r hyphen 70\nKPX r h -21\nKPX r g -4\nKPX r f 33\nKPX r e 7\nKPX r d 7\nKPX r comma -58\nKPX r c 7\nEndKernPairs\nEndKernData\nStartComposites 56\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 200 177 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 130 177 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 130 177 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 140 177 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 180 177 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 120 177 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 220 177 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 150 177 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 150 177 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 160 177 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 20 177 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -40 177 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -40 177 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave -20 177 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 150 177 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 260 177 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 190 177 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 190 177 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 200 177 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 180 177 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 120 177 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 250 177 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 180 177 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 180 177 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 190 177 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 150 177 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 110 177 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 110 177 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 120 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 80 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 80 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 120 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 130 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 70 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 90 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 50 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 50 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 90 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -20 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -60 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -60 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -20 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 110 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 110 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 70 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 70 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 110 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 60 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 50 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 170 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 130 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 130 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 170 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 100 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 60 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 30 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pbkli8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1992 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Tue Jan 21 16:12:06 1992\nComment UniqueID 37830\nComment VMusage 33139 40031\nFontName Bookman-LightItalic\nFullName ITC Bookman Light Italic\nFamilyName ITC Bookman\nWeight Light\nItalicAngle -10\nIsFixedPitch false\nFontBBox -228 -250 1269 883 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.004\nNotice Copyright (c) 1985, 1987, 1989, 1992 Adobe Systems Incorporated.  All Rights Reserved.ITC Bookman is a registered trademark of International Typeface Corporation.\nEncodingScheme AdobeStandardEncoding\nCapHeight 681\nXHeight 494\nAscender 717\nDescender -212\nStartCharMetrics 228\nC 32 ; WX 300 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 320 ; N exclam ; B 103 -8 342 698 ;\nC 34 ; WX 360 ; N quotedbl ; B 107 468 402 698 ;\nC 35 ; WX 620 ; N numbersign ; B 107 0 598 681 ;\nC 36 ; WX 620 ; N dollar ; B 78 -85 619 762 ;\nC 37 ; WX 800 ; N percent ; B 56 -8 811 691 ;\nC 38 ; WX 820 ; N ampersand ; B 65 -18 848 698 ;\nC 39 ; WX 280 ; N quoteright ; B 148 470 288 698 ;\nC 40 ; WX 280 ; N parenleft ; B 96 -146 383 727 ;\nC 41 ; WX 280 ; N parenright ; B -8 -146 279 727 ;\nC 42 ; WX 440 ; N asterisk ; B 139 324 505 698 ;\nC 43 ; WX 600 ; N plus ; B 91 43 595 548 ;\nC 44 ; WX 300 ; N comma ; B 88 -115 227 112 ;\nC 45 ; WX 320 ; N hyphen ; B 78 269 336 325 ;\nC 46 ; WX 300 ; N period ; B 96 -8 231 127 ;\nC 47 ; WX 600 ; N slash ; B 104 -149 562 717 ;\nC 48 ; WX 620 ; N zero ; B 86 -17 646 698 ;\nC 49 ; WX 620 ; N one ; B 154 0 500 681 ;\nC 50 ; WX 620 ; N two ; B 66 0 636 698 ;\nC 51 ; WX 620 ; N three ; B 55 -17 622 698 ;\nC 52 ; WX 620 ; N four ; B 69 0 634 681 ;\nC 53 ; WX 620 ; N five ; B 70 -17 614 681 ;\nC 54 ; WX 620 ; N six ; B 89 -17 657 698 ;\nC 55 ; WX 620 ; N seven ; B 143 0 672 681 ;\nC 56 ; WX 620 ; N eight ; B 61 -17 655 698 ;\nC 57 ; WX 620 ; N nine ; B 77 -17 649 698 ;\nC 58 ; WX 300 ; N colon ; B 96 -8 292 494 ;\nC 59 ; WX 300 ; N semicolon ; B 88 -114 292 494 ;\nC 60 ; WX 600 ; N less ; B 79 33 588 561 ;\nC 61 ; WX 600 ; N equal ; B 91 161 595 433 ;\nC 62 ; WX 600 ; N greater ; B 93 33 602 561 ;\nC 63 ; WX 540 ; N question ; B 114 -8 604 698 ;\nC 64 ; WX 780 ; N at ; B 102 -17 802 698 ;\nC 65 ; WX 700 ; N A ; B -25 0 720 681 ;\nC 66 ; WX 720 ; N B ; B 21 0 746 681 ;\nC 67 ; WX 720 ; N C ; B 88 -17 746 698 ;\nC 68 ; WX 740 ; N D ; B 21 0 782 681 ;\nC 69 ; WX 680 ; N E ; B 21 0 736 681 ;\nC 70 ; WX 620 ; N F ; B 21 0 743 681 ;\nC 71 ; WX 760 ; N G ; B 88 -17 813 698 ;\nC 72 ; WX 800 ; N H ; B 21 0 888 681 ;\nC 73 ; WX 320 ; N I ; B 21 0 412 681 ;\nC 74 ; WX 560 ; N J ; B -2 -17 666 681 ;\nC 75 ; WX 720 ; N K ; B 21 0 804 681 ;\nC 76 ; WX 580 ; N L ; B 21 0 656 681 ;\nC 77 ; WX 860 ; N M ; B 18 0 956 681 ;\nC 78 ; WX 720 ; N N ; B 18 0 823 681 ;\nC 79 ; WX 760 ; N O ; B 88 -17 799 698 ;\nC 80 ; WX 600 ; N P ; B 21 0 681 681 ;\nC 81 ; WX 780 ; N Q ; B 61 -191 812 698 ;\nC 82 ; WX 700 ; N R ; B 21 0 736 681 ;\nC 83 ; WX 640 ; N S ; B 61 -17 668 698 ;\nC 84 ; WX 600 ; N T ; B 50 0 725 681 ;\nC 85 ; WX 720 ; N U ; B 118 -17 842 681 ;\nC 86 ; WX 680 ; N V ; B 87 0 815 681 ;\nC 87 ; WX 960 ; N W ; B 87 0 1095 681 ;\nC 88 ; WX 700 ; N X ; B -25 0 815 681 ;\nC 89 ; WX 660 ; N Y ; B 87 0 809 681 ;\nC 90 ; WX 580 ; N Z ; B 8 0 695 681 ;\nC 91 ; WX 260 ; N bracketleft ; B 56 -136 351 717 ;\nC 92 ; WX 600 ; N backslash ; B 84 0 542 717 ;\nC 93 ; WX 260 ; N bracketright ; B 15 -136 309 717 ;\nC 94 ; WX 600 ; N asciicircum ; B 97 276 599 681 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 280 ; N quoteleft ; B 191 470 330 698 ;\nC 97 ; WX 620 ; N a ; B 71 -8 686 494 ;\nC 98 ; WX 600 ; N b ; B 88 -8 621 717 ;\nC 99 ; WX 480 ; N c ; B 65 -8 522 494 ;\nC 100 ; WX 640 ; N d ; B 65 -8 695 717 ;\nC 101 ; WX 540 ; N e ; B 65 -8 575 494 ;\nC 102 ; WX 340 ; N f ; B -160 -218 557 725 ; L i fi ; L l fl ;\nC 103 ; WX 560 ; N g ; B 4 -221 581 494 ;\nC 104 ; WX 620 ; N h ; B 88 -8 689 717 ;\nC 105 ; WX 280 ; N i ; B 88 -8 351 663 ;\nC 106 ; WX 280 ; N j ; B -200 -221 308 663 ;\nC 107 ; WX 600 ; N k ; B 88 -8 657 717 ;\nC 108 ; WX 280 ; N l ; B 100 -8 342 717 ;\nC 109 ; WX 880 ; N m ; B 88 -8 952 494 ;\nC 110 ; WX 620 ; N n ; B 88 -8 673 494 ;\nC 111 ; WX 540 ; N o ; B 65 -8 572 494 ;\nC 112 ; WX 600 ; N p ; B -24 -212 620 494 ;\nC 113 ; WX 560 ; N q ; B 65 -212 584 494 ;\nC 114 ; WX 400 ; N r ; B 88 0 481 494 ;\nC 115 ; WX 540 ; N s ; B 65 -8 547 494 ;\nC 116 ; WX 340 ; N t ; B 88 -8 411 664 ;\nC 117 ; WX 620 ; N u ; B 88 -8 686 484 ;\nC 118 ; WX 540 ; N v ; B 88 -8 562 494 ;\nC 119 ; WX 880 ; N w ; B 88 -8 893 494 ;\nC 120 ; WX 540 ; N x ; B 9 -8 626 494 ;\nC 121 ; WX 600 ; N y ; B 60 -221 609 484 ;\nC 122 ; WX 520 ; N z ; B 38 -8 561 494 ;\nC 123 ; WX 360 ; N braceleft ; B 122 -191 442 717 ;\nC 124 ; WX 600 ; N bar ; B 294 -250 372 750 ;\nC 125 ; WX 380 ; N braceright ; B 13 -191 333 717 ;\nC 126 ; WX 600 ; N asciitilde ; B 91 207 595 386 ;\nC 161 ; WX 320 ; N exclamdown ; B 73 -213 301 494 ;\nC 162 ; WX 620 ; N cent ; B 148 -29 596 715 ;\nC 163 ; WX 620 ; N sterling ; B 4 -17 702 698 ;\nC 164 ; WX 20 ; N fraction ; B -228 0 323 681 ;\nC 165 ; WX 620 ; N yen ; B 71 0 735 681 ;\nC 166 ; WX 620 ; N florin ; B -26 -218 692 725 ;\nC 167 ; WX 620 ; N section ; B 38 -178 638 698 ;\nC 168 ; WX 620 ; N currency ; B 100 89 605 591 ;\nC 169 ; WX 200 ; N quotesingle ; B 99 473 247 698 ;\nC 170 ; WX 440 ; N quotedblleft ; B 191 470 493 698 ;\nC 171 ; WX 300 ; N guillemotleft ; B 70 129 313 434 ;\nC 172 ; WX 180 ; N guilsinglleft ; B 75 129 208 434 ;\nC 173 ; WX 180 ; N guilsinglright ; B 70 129 203 434 ;\nC 174 ; WX 640 ; N fi ; B -159 -222 709 725 ;\nC 175 ; WX 660 ; N fl ; B -159 -218 713 725 ;\nC 177 ; WX 500 ; N endash ; B 33 269 561 325 ;\nC 178 ; WX 620 ; N dagger ; B 192 -130 570 698 ;\nC 179 ; WX 620 ; N daggerdbl ; B 144 -122 566 698 ;\nC 180 ; WX 300 ; N periodcentered ; B 137 229 272 364 ;\nC 182 ; WX 620 ; N paragraph ; B 112 0 718 681 ;\nC 183 ; WX 460 ; N bullet ; B 100 170 444 511 ;\nC 184 ; WX 320 ; N quotesinglbase ; B 87 -114 226 113 ;\nC 185 ; WX 480 ; N quotedblbase ; B 87 -114 390 113 ;\nC 186 ; WX 440 ; N quotedblright ; B 148 470 451 698 ;\nC 187 ; WX 300 ; N guillemotright ; B 60 129 303 434 ;\nC 188 ; WX 1000 ; N ellipsis ; B 99 -8 900 127 ;\nC 189 ; WX 1180 ; N perthousand ; B 56 -8 1199 691 ;\nC 191 ; WX 540 ; N questiondown ; B 18 -212 508 494 ;\nC 193 ; WX 340 ; N grave ; B 182 551 377 706 ;\nC 194 ; WX 320 ; N acute ; B 178 551 373 706 ;\nC 195 ; WX 440 ; N circumflex ; B 176 571 479 685 ;\nC 196 ; WX 440 ; N tilde ; B 180 586 488 671 ;\nC 197 ; WX 440 ; N macron ; B 178 599 484 658 ;\nC 198 ; WX 440 ; N breve ; B 191 577 500 680 ;\nC 199 ; WX 260 ; N dotaccent ; B 169 543 290 664 ;\nC 200 ; WX 420 ; N dieresis ; B 185 569 467 688 ;\nC 202 ; WX 300 ; N ring ; B 178 551 334 706 ;\nC 203 ; WX 320 ; N cedilla ; B 45 -178 240 0 ;\nC 205 ; WX 340 ; N hungarumlaut ; B 167 547 402 738 ;\nC 206 ; WX 260 ; N ogonek ; B 51 -173 184 0 ;\nC 207 ; WX 440 ; N caron ; B 178 571 481 684 ;\nC 208 ; WX 1000 ; N emdash ; B 33 269 1061 325 ;\nC 225 ; WX 1220 ; N AE ; B -45 0 1269 681 ;\nC 227 ; WX 440 ; N ordfeminine ; B 130 396 513 698 ;\nC 232 ; WX 580 ; N Lslash ; B 21 0 656 681 ;\nC 233 ; WX 760 ; N Oslash ; B 88 -95 799 777 ;\nC 234 ; WX 1180 ; N OE ; B 88 -17 1237 698 ;\nC 235 ; WX 400 ; N ordmasculine ; B 139 396 455 698 ;\nC 241 ; WX 880 ; N ae ; B 71 -8 918 494 ;\nC 245 ; WX 280 ; N dotlessi ; B 88 -8 351 484 ;\nC 248 ; WX 340 ; N lslash ; B 50 -8 398 717 ;\nC 249 ; WX 540 ; N oslash ; B 65 -49 571 532 ;\nC 250 ; WX 900 ; N oe ; B 65 -8 948 494 ;\nC 251 ; WX 620 ; N germandbls ; B -121 -111 653 698 ;\nC -1 ; WX 540 ; N ecircumflex ; B 65 -8 575 685 ;\nC -1 ; WX 540 ; N edieresis ; B 65 -8 575 688 ;\nC -1 ; WX 620 ; N aacute ; B 71 -8 686 706 ;\nC -1 ; WX 740 ; N registered ; B 84 -17 784 698 ;\nC -1 ; WX 280 ; N icircumflex ; B 76 -8 379 685 ;\nC -1 ; WX 620 ; N udieresis ; B 88 -8 686 688 ;\nC -1 ; WX 540 ; N ograve ; B 65 -8 572 706 ;\nC -1 ; WX 620 ; N uacute ; B 88 -8 686 706 ;\nC -1 ; WX 620 ; N ucircumflex ; B 88 -8 686 685 ;\nC -1 ; WX 700 ; N Aacute ; B -25 0 720 883 ;\nC -1 ; WX 280 ; N igrave ; B 88 -8 351 706 ;\nC -1 ; WX 320 ; N Icircumflex ; B 21 0 449 862 ;\nC -1 ; WX 480 ; N ccedilla ; B 65 -178 522 494 ;\nC -1 ; WX 620 ; N adieresis ; B 71 -8 686 688 ;\nC -1 ; WX 680 ; N Ecircumflex ; B 21 0 736 862 ;\nC -1 ; WX 540 ; N scaron ; B 65 -8 547 684 ;\nC -1 ; WX 600 ; N thorn ; B -24 -212 620 717 ;\nC -1 ; WX 980 ; N trademark ; B 69 277 965 681 ;\nC -1 ; WX 540 ; N egrave ; B 65 -8 575 706 ;\nC -1 ; WX 372 ; N threesuperior ; B 70 269 439 698 ;\nC -1 ; WX 520 ; N zcaron ; B 38 -8 561 684 ;\nC -1 ; WX 620 ; N atilde ; B 71 -8 686 671 ;\nC -1 ; WX 620 ; N aring ; B 71 -8 686 706 ;\nC -1 ; WX 540 ; N ocircumflex ; B 65 -8 572 685 ;\nC -1 ; WX 680 ; N Edieresis ; B 21 0 736 865 ;\nC -1 ; WX 930 ; N threequarters ; B 99 0 913 691 ;\nC -1 ; WX 600 ; N ydieresis ; B 60 -221 609 688 ;\nC -1 ; WX 600 ; N yacute ; B 60 -221 609 706 ;\nC -1 ; WX 280 ; N iacute ; B 88 -8 351 706 ;\nC -1 ; WX 700 ; N Acircumflex ; B -25 0 720 862 ;\nC -1 ; WX 720 ; N Uacute ; B 118 -17 842 883 ;\nC -1 ; WX 540 ; N eacute ; B 65 -8 575 706 ;\nC -1 ; WX 760 ; N Ograve ; B 88 -17 799 883 ;\nC -1 ; WX 620 ; N agrave ; B 71 -8 686 706 ;\nC -1 ; WX 720 ; N Udieresis ; B 118 -17 842 865 ;\nC -1 ; WX 620 ; N acircumflex ; B 71 -8 686 685 ;\nC -1 ; WX 320 ; N Igrave ; B 21 0 412 883 ;\nC -1 ; WX 372 ; N twosuperior ; B 68 279 439 698 ;\nC -1 ; WX 720 ; N Ugrave ; B 118 -17 842 883 ;\nC -1 ; WX 930 ; N onequarter ; B 91 0 913 681 ;\nC -1 ; WX 720 ; N Ucircumflex ; B 118 -17 842 862 ;\nC -1 ; WX 640 ; N Scaron ; B 61 -17 668 861 ;\nC -1 ; WX 320 ; N Idieresis ; B 21 0 447 865 ;\nC -1 ; WX 280 ; N idieresis ; B 88 -8 377 688 ;\nC -1 ; WX 680 ; N Egrave ; B 21 0 736 883 ;\nC -1 ; WX 760 ; N Oacute ; B 88 -17 799 883 ;\nC -1 ; WX 600 ; N divide ; B 91 46 595 548 ;\nC -1 ; WX 700 ; N Atilde ; B -25 0 720 848 ;\nC -1 ; WX 700 ; N Aring ; B -25 0 720 883 ;\nC -1 ; WX 760 ; N Odieresis ; B 88 -17 799 865 ;\nC -1 ; WX 700 ; N Adieresis ; B -25 0 720 865 ;\nC -1 ; WX 720 ; N Ntilde ; B 18 0 823 848 ;\nC -1 ; WX 580 ; N Zcaron ; B 8 0 695 861 ;\nC -1 ; WX 600 ; N Thorn ; B 21 0 656 681 ;\nC -1 ; WX 320 ; N Iacute ; B 21 0 412 883 ;\nC -1 ; WX 600 ; N plusminus ; B 91 0 595 548 ;\nC -1 ; WX 600 ; N multiply ; B 91 44 595 548 ;\nC -1 ; WX 680 ; N Eacute ; B 21 0 736 883 ;\nC -1 ; WX 660 ; N Ydieresis ; B 87 0 809 865 ;\nC -1 ; WX 372 ; N onesuperior ; B 114 279 339 688 ;\nC -1 ; WX 620 ; N ugrave ; B 88 -8 686 706 ;\nC -1 ; WX 600 ; N logicalnot ; B 91 163 595 433 ;\nC -1 ; WX 620 ; N ntilde ; B 88 -8 673 671 ;\nC -1 ; WX 760 ; N Otilde ; B 88 -17 799 848 ;\nC -1 ; WX 540 ; N otilde ; B 65 -8 572 671 ;\nC -1 ; WX 720 ; N Ccedilla ; B 88 -178 746 698 ;\nC -1 ; WX 700 ; N Agrave ; B -25 0 720 883 ;\nC -1 ; WX 930 ; N onehalf ; B 91 0 925 681 ;\nC -1 ; WX 740 ; N Eth ; B 21 0 782 681 ;\nC -1 ; WX 400 ; N degree ; B 120 398 420 698 ;\nC -1 ; WX 660 ; N Yacute ; B 87 0 809 883 ;\nC -1 ; WX 760 ; N Ocircumflex ; B 88 -17 799 862 ;\nC -1 ; WX 540 ; N oacute ; B 65 -8 572 706 ;\nC -1 ; WX 620 ; N mu ; B 53 -221 686 484 ;\nC -1 ; WX 600 ; N minus ; B 91 259 595 335 ;\nC -1 ; WX 540 ; N eth ; B 65 -8 642 725 ;\nC -1 ; WX 540 ; N odieresis ; B 65 -8 572 688 ;\nC -1 ; WX 740 ; N copyright ; B 84 -17 784 698 ;\nC -1 ; WX 600 ; N brokenbar ; B 294 -175 372 675 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 85\n\nKPX A Y -62\nKPX A W -73\nKPX A V -78\nKPX A T -5\n\nKPX F period -97\nKPX F comma -98\nKPX F A -16\n\nKPX L y 20\nKPX L Y 7\nKPX L W 9\nKPX L V 4\n\nKPX P period -105\nKPX P comma -106\nKPX P A -30\n\nKPX R Y 11\nKPX R W 2\nKPX R V 2\nKPX R T 65\n\nKPX T semicolon 48\nKPX T s -7\nKPX T r 67\nKPX T period -78\nKPX T o 14\nKPX T i 71\nKPX T hyphen 20\nKPX T e 10\nKPX T comma -79\nKPX T colon 48\nKPX T c 16\nKPX T a 9\nKPX T A -14\n\nKPX V y -14\nKPX V u -10\nKPX V semicolon -44\nKPX V r -20\nKPX V period -100\nKPX V o -70\nKPX V i 3\nKPX V hyphen 20\nKPX V e -70\nKPX V comma -109\nKPX V colon -35\nKPX V a -70\nKPX V A -70\n\nKPX W y -14\nKPX W u -20\nKPX W semicolon -42\nKPX W r -30\nKPX W period -100\nKPX W o -60\nKPX W i 3\nKPX W hyphen 20\nKPX W e -60\nKPX W comma -109\nKPX W colon -35\nKPX W a -60\nKPX W A -60\n\nKPX Y v -19\nKPX Y u -31\nKPX Y semicolon -40\nKPX Y q -72\nKPX Y period -100\nKPX Y p -37\nKPX Y o -75\nKPX Y i -11\nKPX Y hyphen 20\nKPX Y e -78\nKPX Y comma -109\nKPX Y colon -35\nKPX Y a -79\nKPX Y A -82\n\nKPX f f -19\n\nKPX r q -14\nKPX r period -134\nKPX r o -10\nKPX r n 38\nKPX r m 37\nKPX r hyphen 20\nKPX r h -20\nKPX r g -3\nKPX r f -9\nKPX r e -15\nKPX r d -9\nKPX r comma -143\nKPX r c -8\nEndKernPairs\nEndKernData\nStartComposites 56\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 200 177 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 130 177 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 140 177 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 160 177 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 220 177 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 130 177 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 210 177 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 140 177 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 150 177 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 150 177 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 30 177 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -30 177 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -20 177 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave -30 177 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 130 177 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 250 177 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 190 177 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 200 177 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 210 177 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 190 177 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 100 177 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 230 177 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 170 177 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 180 177 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 170 177 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 200 177 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 140 177 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 70 177 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 120 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 70 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 80 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 110 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 140 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 60 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 90 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 30 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 40 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 80 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -40 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -100 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -90 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -60 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 60 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 80 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 20 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 40 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 80 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 30 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 30 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 120 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 60 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 70 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 110 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 140 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 70 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 20 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pcrb8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1989, 1990, 1991, Adobe Systems Incorporated. All rights reserved.\nComment Creation Date: Tue Sep 17 14:02:41 1991\nComment UniqueID 36384\nComment VMusage 31992 40360\nFontName Courier-Bold\nFullName Courier Bold\nFamilyName Courier\nWeight Bold\nItalicAngle 0\nIsFixedPitch true\nFontBBox -113 -250 749 801\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.004\nNotice Copyright (c) 1989, 1990, 1991, Adobe Systems Incorporated. All rights reserved.\nEncodingScheme AdobeStandardEncoding\nCapHeight 562\nXHeight 439\nAscender 626\nDescender -142\nStartCharMetrics 260\nC 32 ; WX 600 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 600 ; N exclam ; B 202 -15 398 572 ;\nC 34 ; WX 600 ; N quotedbl ; B 135 277 465 562 ;\nC 35 ; WX 600 ; N numbersign ; B 56 -45 544 651 ;\nC 36 ; WX 600 ; N dollar ; B 82 -126 519 666 ;\nC 37 ; WX 600 ; N percent ; B 5 -15 595 616 ;\nC 38 ; WX 600 ; N ampersand ; B 36 -15 546 543 ;\nC 39 ; WX 600 ; N quoteright ; B 171 277 423 562 ;\nC 40 ; WX 600 ; N parenleft ; B 219 -102 461 616 ;\nC 41 ; WX 600 ; N parenright ; B 139 -102 381 616 ;\nC 42 ; WX 600 ; N asterisk ; B 91 219 509 601 ;\nC 43 ; WX 600 ; N plus ; B 71 39 529 478 ;\nC 44 ; WX 600 ; N comma ; B 123 -111 393 174 ;\nC 45 ; WX 600 ; N hyphen ; B 100 203 500 313 ;\nC 46 ; WX 600 ; N period ; B 192 -15 408 171 ;\nC 47 ; WX 600 ; N slash ; B 98 -77 502 626 ;\nC 48 ; WX 600 ; N zero ; B 87 -15 513 616 ;\nC 49 ; WX 600 ; N one ; B 81 0 539 616 ;\nC 50 ; WX 600 ; N two ; B 61 0 499 616 ;\nC 51 ; WX 600 ; N three ; B 63 -15 501 616 ;\nC 52 ; WX 600 ; N four ; B 53 0 507 616 ;\nC 53 ; WX 600 ; N five ; B 70 -15 521 601 ;\nC 54 ; WX 600 ; N six ; B 90 -15 521 616 ;\nC 55 ; WX 600 ; N seven ; B 55 0 494 601 ;\nC 56 ; WX 600 ; N eight ; B 83 -15 517 616 ;\nC 57 ; WX 600 ; N nine ; B 79 -15 510 616 ;\nC 58 ; WX 600 ; N colon ; B 191 -15 407 425 ;\nC 59 ; WX 600 ; N semicolon ; B 123 -111 408 425 ;\nC 60 ; WX 600 ; N less ; B 66 15 523 501 ;\nC 61 ; WX 600 ; N equal ; B 71 118 529 398 ;\nC 62 ; WX 600 ; N greater ; B 77 15 534 501 ;\nC 63 ; WX 600 ; N question ; B 98 -14 501 580 ;\nC 64 ; WX 600 ; N at ; B 16 -15 584 616 ;\nC 65 ; WX 600 ; N A ; B -9 0 609 562 ;\nC 66 ; WX 600 ; N B ; B 30 0 573 562 ;\nC 67 ; WX 600 ; N C ; B 22 -18 560 580 ;\nC 68 ; WX 600 ; N D ; B 30 0 594 562 ;\nC 69 ; WX 600 ; N E ; B 25 0 560 562 ;\nC 70 ; WX 600 ; N F ; B 39 0 570 562 ;\nC 71 ; WX 600 ; N G ; B 22 -18 594 580 ;\nC 72 ; WX 600 ; N H ; B 20 0 580 562 ;\nC 73 ; WX 600 ; N I ; B 77 0 523 562 ;\nC 74 ; WX 600 ; N J ; B 37 -18 601 562 ;\nC 75 ; WX 600 ; N K ; B 21 0 599 562 ;\nC 76 ; WX 600 ; N L ; B 39 0 578 562 ;\nC 77 ; WX 600 ; N M ; B -2 0 602 562 ;\nC 78 ; WX 600 ; N N ; B 8 -12 610 562 ;\nC 79 ; WX 600 ; N O ; B 22 -18 578 580 ;\nC 80 ; WX 600 ; N P ; B 48 0 559 562 ;\nC 81 ; WX 600 ; N Q ; B 32 -138 578 580 ;\nC 82 ; WX 600 ; N R ; B 24 0 599 562 ;\nC 83 ; WX 600 ; N S ; B 47 -22 553 582 ;\nC 84 ; WX 600 ; N T ; B 21 0 579 562 ;\nC 85 ; WX 600 ; N U ; B 4 -18 596 562 ;\nC 86 ; WX 600 ; N V ; B -13 0 613 562 ;\nC 87 ; WX 600 ; N W ; B -18 0 618 562 ;\nC 88 ; WX 600 ; N X ; B 12 0 588 562 ;\nC 89 ; WX 600 ; N Y ; B 12 0 589 562 ;\nC 90 ; WX 600 ; N Z ; B 62 0 539 562 ;\nC 91 ; WX 600 ; N bracketleft ; B 245 -102 475 616 ;\nC 92 ; WX 600 ; N backslash ; B 99 -77 503 626 ;\nC 93 ; WX 600 ; N bracketright ; B 125 -102 355 616 ;\nC 94 ; WX 600 ; N asciicircum ; B 108 250 492 616 ;\nC 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ;\nC 96 ; WX 600 ; N quoteleft ; B 178 277 428 562 ;\nC 97 ; WX 600 ; N a ; B 35 -15 570 454 ;\nC 98 ; WX 600 ; N b ; B 0 -15 584 626 ;\nC 99 ; WX 600 ; N c ; B 40 -15 545 459 ;\nC 100 ; WX 600 ; N d ; B 20 -15 591 626 ;\nC 101 ; WX 600 ; N e ; B 40 -15 563 454 ;\nC 102 ; WX 600 ; N f ; B 83 0 547 626 ; L i fi ; L l fl ;\nC 103 ; WX 600 ; N g ; B 30 -146 580 454 ;\nC 104 ; WX 600 ; N h ; B 5 0 592 626 ;\nC 105 ; WX 600 ; N i ; B 77 0 523 658 ;\nC 106 ; WX 600 ; N j ; B 63 -146 440 658 ;\nC 107 ; WX 600 ; N k ; B 20 0 585 626 ;\nC 108 ; WX 600 ; N l ; B 77 0 523 626 ;\nC 109 ; WX 600 ; N m ; B -22 0 626 454 ;\nC 110 ; WX 600 ; N n ; B 18 0 592 454 ;\nC 111 ; WX 600 ; N o ; B 30 -15 570 454 ;\nC 112 ; WX 600 ; N p ; B -1 -142 570 454 ;\nC 113 ; WX 600 ; N q ; B 20 -142 591 454 ;\nC 114 ; WX 600 ; N r ; B 47 0 580 454 ;\nC 115 ; WX 600 ; N s ; B 68 -17 535 459 ;\nC 116 ; WX 600 ; N t ; B 47 -15 532 562 ;\nC 117 ; WX 600 ; N u ; B -1 -15 569 439 ;\nC 118 ; WX 600 ; N v ; B -1 0 601 439 ;\nC 119 ; WX 600 ; N w ; B -18 0 618 439 ;\nC 120 ; WX 600 ; N x ; B 6 0 594 439 ;\nC 121 ; WX 600 ; N y ; B -4 -142 601 439 ;\nC 122 ; WX 600 ; N z ; B 81 0 520 439 ;\nC 123 ; WX 600 ; N braceleft ; B 160 -102 464 616 ;\nC 124 ; WX 600 ; N bar ; B 255 -250 345 750 ;\nC 125 ; WX 600 ; N braceright ; B 136 -102 440 616 ;\nC 126 ; WX 600 ; N asciitilde ; B 71 153 530 356 ;\nC 161 ; WX 600 ; N exclamdown ; B 202 -146 398 449 ;\nC 162 ; WX 600 ; N cent ; B 66 -49 518 614 ;\nC 163 ; WX 600 ; N sterling ; B 72 -28 558 611 ;\nC 164 ; WX 600 ; N fraction ; B 25 -60 576 661 ;\nC 165 ; WX 600 ; N yen ; B 10 0 590 562 ;\nC 166 ; WX 600 ; N florin ; B -30 -131 572 616 ;\nC 167 ; WX 600 ; N section ; B 83 -70 517 580 ;\nC 168 ; WX 600 ; N currency ; B 54 49 546 517 ;\nC 169 ; WX 600 ; N quotesingle ; B 227 277 373 562 ;\nC 170 ; WX 600 ; N quotedblleft ; B 71 277 535 562 ;\nC 171 ; WX 600 ; N guillemotleft ; B 8 70 553 446 ;\nC 172 ; WX 600 ; N guilsinglleft ; B 141 70 459 446 ;\nC 173 ; WX 600 ; N guilsinglright ; B 141 70 459 446 ;\nC 174 ; WX 600 ; N fi ; B 12 0 593 626 ;\nC 175 ; WX 600 ; N fl ; B 12 0 593 626 ;\nC 177 ; WX 600 ; N endash ; B 65 203 535 313 ;\nC 178 ; WX 600 ; N dagger ; B 106 -70 494 580 ;\nC 179 ; WX 600 ; N daggerdbl ; B 106 -70 494 580 ;\nC 180 ; WX 600 ; N periodcentered ; B 196 165 404 351 ;\nC 182 ; WX 600 ; N paragraph ; B 6 -70 576 580 ;\nC 183 ; WX 600 ; N bullet ; B 140 132 460 430 ;\nC 184 ; WX 600 ; N quotesinglbase ; B 175 -142 427 143 ;\nC 185 ; WX 600 ; N quotedblbase ; B 65 -142 529 143 ;\nC 186 ; WX 600 ; N quotedblright ; B 61 277 525 562 ;\nC 187 ; WX 600 ; N guillemotright ; B 47 70 592 446 ;\nC 188 ; WX 600 ; N ellipsis ; B 26 -15 574 116 ;\nC 189 ; WX 600 ; N perthousand ; B -113 -15 713 616 ;\nC 191 ; WX 600 ; N questiondown ; B 99 -146 502 449 ;\nC 193 ; WX 600 ; N grave ; B 132 508 395 661 ;\nC 194 ; WX 600 ; N acute ; B 205 508 468 661 ;\nC 195 ; WX 600 ; N circumflex ; B 103 483 497 657 ;\nC 196 ; WX 600 ; N tilde ; B 89 493 512 636 ;\nC 197 ; WX 600 ; N macron ; B 88 505 512 585 ;\nC 198 ; WX 600 ; N breve ; B 83 468 517 631 ;\nC 199 ; WX 600 ; N dotaccent ; B 230 485 370 625 ;\nC 200 ; WX 600 ; N dieresis ; B 128 485 472 625 ;\nC 202 ; WX 600 ; N ring ; B 198 481 402 678 ;\nC 203 ; WX 600 ; N cedilla ; B 205 -206 387 0 ;\nC 205 ; WX 600 ; N hungarumlaut ; B 68 488 588 661 ;\nC 206 ; WX 600 ; N ogonek ; B 169 -199 367 0 ;\nC 207 ; WX 600 ; N caron ; B 103 493 497 667 ;\nC 208 ; WX 600 ; N emdash ; B -10 203 610 313 ;\nC 225 ; WX 600 ; N AE ; B -29 0 602 562 ;\nC 227 ; WX 600 ; N ordfeminine ; B 147 196 453 580 ;\nC 232 ; WX 600 ; N Lslash ; B 39 0 578 562 ;\nC 233 ; WX 600 ; N Oslash ; B 22 -22 578 584 ;\nC 234 ; WX 600 ; N OE ; B -25 0 595 562 ;\nC 235 ; WX 600 ; N ordmasculine ; B 147 196 453 580 ;\nC 241 ; WX 600 ; N ae ; B -4 -15 601 454 ;\nC 245 ; WX 600 ; N dotlessi ; B 77 0 523 439 ;\nC 248 ; WX 600 ; N lslash ; B 77 0 523 626 ;\nC 249 ; WX 600 ; N oslash ; B 30 -24 570 463 ;\nC 250 ; WX 600 ; N oe ; B -18 -15 611 454 ;\nC 251 ; WX 600 ; N germandbls ; B 22 -15 596 626 ;\nC -1 ; WX 600 ; N Odieresis ; B 22 -18 578 748 ;\nC -1 ; WX 600 ; N logicalnot ; B 71 103 529 413 ;\nC -1 ; WX 600 ; N minus ; B 71 203 529 313 ;\nC -1 ; WX 600 ; N merge ; B 137 -15 464 487 ;\nC -1 ; WX 600 ; N degree ; B 86 243 474 616 ;\nC -1 ; WX 600 ; N dectab ; B 8 0 592 320 ;\nC -1 ; WX 600 ; N ll ; B -12 0 600 626 ;\nC -1 ; WX 600 ; N IJ ; B -8 -18 622 562 ;\nC -1 ; WX 600 ; N Eacute ; B 25 0 560 784 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 22 -18 578 780 ;\nC -1 ; WX 600 ; N ucircumflex ; B -1 -15 569 657 ;\nC -1 ; WX 600 ; N left ; B 65 44 535 371 ;\nC -1 ; WX 600 ; N threesuperior ; B 138 222 433 616 ;\nC -1 ; WX 600 ; N up ; B 136 0 463 447 ;\nC -1 ; WX 600 ; N multiply ; B 81 39 520 478 ;\nC -1 ; WX 600 ; N Scaron ; B 47 -22 553 790 ;\nC -1 ; WX 600 ; N tab ; B 19 0 581 562 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 4 -18 596 780 ;\nC -1 ; WX 600 ; N divide ; B 71 16 529 500 ;\nC -1 ; WX 600 ; N Acircumflex ; B -9 0 609 780 ;\nC -1 ; WX 600 ; N eacute ; B 40 -15 563 661 ;\nC -1 ; WX 600 ; N uacute ; B -1 -15 569 661 ;\nC -1 ; WX 600 ; N Aacute ; B -9 0 609 784 ;\nC -1 ; WX 600 ; N copyright ; B 0 -18 600 580 ;\nC -1 ; WX 600 ; N twosuperior ; B 143 230 436 616 ;\nC -1 ; WX 600 ; N Ecircumflex ; B 25 0 560 780 ;\nC -1 ; WX 600 ; N ntilde ; B 18 0 592 636 ;\nC -1 ; WX 600 ; N down ; B 137 -15 464 439 ;\nC -1 ; WX 600 ; N center ; B 40 14 560 580 ;\nC -1 ; WX 600 ; N onesuperior ; B 153 230 447 616 ;\nC -1 ; WX 600 ; N ij ; B 6 -146 574 658 ;\nC -1 ; WX 600 ; N edieresis ; B 40 -15 563 625 ;\nC -1 ; WX 600 ; N graybox ; B 76 0 525 599 ;\nC -1 ; WX 600 ; N odieresis ; B 30 -15 570 625 ;\nC -1 ; WX 600 ; N Ograve ; B 22 -18 578 784 ;\nC -1 ; WX 600 ; N threequarters ; B -47 -60 648 661 ;\nC -1 ; WX 600 ; N plusminus ; B 71 24 529 515 ;\nC -1 ; WX 600 ; N prescription ; B 24 -15 599 562 ;\nC -1 ; WX 600 ; N eth ; B 58 -27 543 626 ;\nC -1 ; WX 600 ; N largebullet ; B 248 229 352 333 ;\nC -1 ; WX 600 ; N egrave ; B 40 -15 563 661 ;\nC -1 ; WX 600 ; N ccedilla ; B 40 -206 545 459 ;\nC -1 ; WX 600 ; N notegraphic ; B 77 -15 523 572 ;\nC -1 ; WX 600 ; N Udieresis ; B 4 -18 596 748 ;\nC -1 ; WX 600 ; N Gcaron ; B 22 -18 594 790 ;\nC -1 ; WX 600 ; N arrowdown ; B 144 -15 456 608 ;\nC -1 ; WX 600 ; N format ; B 5 -146 115 601 ;\nC -1 ; WX 600 ; N Otilde ; B 22 -18 578 759 ;\nC -1 ; WX 600 ; N Idieresis ; B 77 0 523 748 ;\nC -1 ; WX 600 ; N adieresis ; B 35 -15 570 625 ;\nC -1 ; WX 600 ; N ecircumflex ; B 40 -15 563 657 ;\nC -1 ; WX 600 ; N Eth ; B 30 0 594 562 ;\nC -1 ; WX 600 ; N onequarter ; B -56 -60 656 661 ;\nC -1 ; WX 600 ; N LL ; B -45 0 645 562 ;\nC -1 ; WX 600 ; N agrave ; B 35 -15 570 661 ;\nC -1 ; WX 600 ; N Zcaron ; B 62 0 539 790 ;\nC -1 ; WX 600 ; N Scedilla ; B 47 -206 553 582 ;\nC -1 ; WX 600 ; N Idot ; B 77 0 523 748 ;\nC -1 ; WX 600 ; N Iacute ; B 77 0 523 784 ;\nC -1 ; WX 600 ; N indent ; B 65 45 535 372 ;\nC -1 ; WX 600 ; N Ugrave ; B 4 -18 596 784 ;\nC -1 ; WX 600 ; N scaron ; B 68 -17 535 667 ;\nC -1 ; WX 600 ; N overscore ; B 0 579 600 629 ;\nC -1 ; WX 600 ; N Aring ; B -9 0 609 801 ;\nC -1 ; WX 600 ; N Ccedilla ; B 22 -206 560 580 ;\nC -1 ; WX 600 ; N Igrave ; B 77 0 523 784 ;\nC -1 ; WX 600 ; N brokenbar ; B 255 -175 345 675 ;\nC -1 ; WX 600 ; N Oacute ; B 22 -18 578 784 ;\nC -1 ; WX 600 ; N otilde ; B 30 -15 570 636 ;\nC -1 ; WX 600 ; N Yacute ; B 12 0 589 784 ;\nC -1 ; WX 600 ; N lira ; B 72 -28 558 611 ;\nC -1 ; WX 600 ; N Icircumflex ; B 77 0 523 780 ;\nC -1 ; WX 600 ; N Atilde ; B -9 0 609 759 ;\nC -1 ; WX 600 ; N Uacute ; B 4 -18 596 784 ;\nC -1 ; WX 600 ; N Ydieresis ; B 12 0 589 748 ;\nC -1 ; WX 600 ; N ydieresis ; B -4 -142 601 625 ;\nC -1 ; WX 600 ; N idieresis ; B 77 0 523 625 ;\nC -1 ; WX 600 ; N Adieresis ; B -9 0 609 748 ;\nC -1 ; WX 600 ; N mu ; B -1 -142 569 439 ;\nC -1 ; WX 600 ; N trademark ; B -9 230 749 562 ;\nC -1 ; WX 600 ; N oacute ; B 30 -15 570 661 ;\nC -1 ; WX 600 ; N acircumflex ; B 35 -15 570 657 ;\nC -1 ; WX 600 ; N Agrave ; B -9 0 609 784 ;\nC -1 ; WX 600 ; N return ; B 19 0 581 562 ;\nC -1 ; WX 600 ; N atilde ; B 35 -15 570 636 ;\nC -1 ; WX 600 ; N square ; B 19 0 581 562 ;\nC -1 ; WX 600 ; N registered ; B 0 -18 600 580 ;\nC -1 ; WX 600 ; N stop ; B 19 0 581 562 ;\nC -1 ; WX 600 ; N udieresis ; B -1 -15 569 625 ;\nC -1 ; WX 600 ; N arrowup ; B 144 3 456 626 ;\nC -1 ; WX 600 ; N igrave ; B 77 0 523 661 ;\nC -1 ; WX 600 ; N Edieresis ; B 25 0 560 748 ;\nC -1 ; WX 600 ; N zcaron ; B 81 0 520 667 ;\nC -1 ; WX 600 ; N arrowboth ; B -24 143 624 455 ;\nC -1 ; WX 600 ; N gcaron ; B 30 -146 580 667 ;\nC -1 ; WX 600 ; N arrowleft ; B -24 143 634 455 ;\nC -1 ; WX 600 ; N aacute ; B 35 -15 570 661 ;\nC -1 ; WX 600 ; N ocircumflex ; B 30 -15 570 657 ;\nC -1 ; WX 600 ; N scedilla ; B 68 -206 535 459 ;\nC -1 ; WX 600 ; N ograve ; B 30 -15 570 661 ;\nC -1 ; WX 600 ; N onehalf ; B -47 -60 648 661 ;\nC -1 ; WX 600 ; N ugrave ; B -1 -15 569 661 ;\nC -1 ; WX 600 ; N Ntilde ; B 8 -12 610 759 ;\nC -1 ; WX 600 ; N iacute ; B 77 0 523 661 ;\nC -1 ; WX 600 ; N arrowright ; B -34 143 624 455 ;\nC -1 ; WX 600 ; N Thorn ; B 48 0 557 562 ;\nC -1 ; WX 600 ; N Egrave ; B 25 0 560 784 ;\nC -1 ; WX 600 ; N thorn ; B -14 -142 570 626 ;\nC -1 ; WX 600 ; N aring ; B 35 -15 570 678 ;\nC -1 ; WX 600 ; N yacute ; B -4 -142 601 661 ;\nC -1 ; WX 600 ; N icircumflex ; B 63 0 523 657 ;\nEndCharMetrics\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 30 123 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex -30 123 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis -20 123 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave -50 123 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring -10 123 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde -30 123 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 30 123 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 0 123 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 0 123 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 0 123 ;\nCC Gcaron 2 ; PCC G 0 0 ; PCC caron 10 123 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 0 123 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 0 123 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 0 123 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 0 123 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 0 123 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 0 123 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 0 123 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 0 123 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 0 123 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 0 123 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 0 123 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 30 123 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 0 123 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 0 123 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave -30 123 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 30 123 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 0 123 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 0 123 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 0 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex -20 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis -10 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave -30 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 0 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 0 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 0 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 0 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 0 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 0 0 ;\nCC gcaron 2 ; PCC g 0 0 ; PCC caron -40 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 0 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -40 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -40 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave 0 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 0 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 0 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 0 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 0 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 0 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 0 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 0 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 0 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex -20 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis -20 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave -30 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 30 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 10 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 0 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pcrbo8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1989, 1990, 1991, Adobe Systems Incorporated. All rights reserved.\nComment Creation Date: Tue Sep 17 14:13:24 1991\nComment UniqueID 36389\nComment VMusage 10055 54684\nFontName Courier-BoldOblique\nFullName Courier Bold Oblique\nFamilyName Courier\nWeight Bold\nItalicAngle -12\nIsFixedPitch true\nFontBBox -56 -250 868 801\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.004\nNotice Copyright (c) 1989, 1990, 1991, Adobe Systems Incorporated. All rights reserved.\nEncodingScheme AdobeStandardEncoding\nCapHeight 562\nXHeight 439\nAscender 626\nDescender -142\nStartCharMetrics 260\nC 32 ; WX 600 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 600 ; N exclam ; B 216 -15 495 572 ;\nC 34 ; WX 600 ; N quotedbl ; B 212 277 584 562 ;\nC 35 ; WX 600 ; N numbersign ; B 88 -45 640 651 ;\nC 36 ; WX 600 ; N dollar ; B 87 -126 629 666 ;\nC 37 ; WX 600 ; N percent ; B 102 -15 624 616 ;\nC 38 ; WX 600 ; N ampersand ; B 62 -15 594 543 ;\nC 39 ; WX 600 ; N quoteright ; B 230 277 542 562 ;\nC 40 ; WX 600 ; N parenleft ; B 266 -102 592 616 ;\nC 41 ; WX 600 ; N parenright ; B 117 -102 444 616 ;\nC 42 ; WX 600 ; N asterisk ; B 179 219 597 601 ;\nC 43 ; WX 600 ; N plus ; B 114 39 596 478 ;\nC 44 ; WX 600 ; N comma ; B 99 -111 430 174 ;\nC 45 ; WX 600 ; N hyphen ; B 143 203 567 313 ;\nC 46 ; WX 600 ; N period ; B 207 -15 426 171 ;\nC 47 ; WX 600 ; N slash ; B 91 -77 626 626 ;\nC 48 ; WX 600 ; N zero ; B 136 -15 592 616 ;\nC 49 ; WX 600 ; N one ; B 93 0 561 616 ;\nC 50 ; WX 600 ; N two ; B 61 0 593 616 ;\nC 51 ; WX 600 ; N three ; B 72 -15 571 616 ;\nC 52 ; WX 600 ; N four ; B 82 0 558 616 ;\nC 53 ; WX 600 ; N five ; B 77 -15 621 601 ;\nC 54 ; WX 600 ; N six ; B 136 -15 652 616 ;\nC 55 ; WX 600 ; N seven ; B 147 0 622 601 ;\nC 56 ; WX 600 ; N eight ; B 115 -15 604 616 ;\nC 57 ; WX 600 ; N nine ; B 76 -15 592 616 ;\nC 58 ; WX 600 ; N colon ; B 206 -15 479 425 ;\nC 59 ; WX 600 ; N semicolon ; B 99 -111 480 425 ;\nC 60 ; WX 600 ; N less ; B 121 15 612 501 ;\nC 61 ; WX 600 ; N equal ; B 96 118 614 398 ;\nC 62 ; WX 600 ; N greater ; B 97 15 589 501 ;\nC 63 ; WX 600 ; N question ; B 183 -14 591 580 ;\nC 64 ; WX 600 ; N at ; B 66 -15 641 616 ;\nC 65 ; WX 600 ; N A ; B -9 0 631 562 ;\nC 66 ; WX 600 ; N B ; B 30 0 629 562 ;\nC 67 ; WX 600 ; N C ; B 75 -18 674 580 ;\nC 68 ; WX 600 ; N D ; B 30 0 664 562 ;\nC 69 ; WX 600 ; N E ; B 25 0 669 562 ;\nC 70 ; WX 600 ; N F ; B 39 0 683 562 ;\nC 71 ; WX 600 ; N G ; B 75 -18 674 580 ;\nC 72 ; WX 600 ; N H ; B 20 0 699 562 ;\nC 73 ; WX 600 ; N I ; B 77 0 642 562 ;\nC 74 ; WX 600 ; N J ; B 59 -18 720 562 ;\nC 75 ; WX 600 ; N K ; B 21 0 691 562 ;\nC 76 ; WX 600 ; N L ; B 39 0 635 562 ;\nC 77 ; WX 600 ; N M ; B -2 0 721 562 ;\nC 78 ; WX 600 ; N N ; B 8 -12 729 562 ;\nC 79 ; WX 600 ; N O ; B 74 -18 645 580 ;\nC 80 ; WX 600 ; N P ; B 48 0 642 562 ;\nC 81 ; WX 600 ; N Q ; B 84 -138 636 580 ;\nC 82 ; WX 600 ; N R ; B 24 0 617 562 ;\nC 83 ; WX 600 ; N S ; B 54 -22 672 582 ;\nC 84 ; WX 600 ; N T ; B 86 0 678 562 ;\nC 85 ; WX 600 ; N U ; B 101 -18 715 562 ;\nC 86 ; WX 600 ; N V ; B 84 0 732 562 ;\nC 87 ; WX 600 ; N W ; B 84 0 737 562 ;\nC 88 ; WX 600 ; N X ; B 12 0 689 562 ;\nC 89 ; WX 600 ; N Y ; B 109 0 708 562 ;\nC 90 ; WX 600 ; N Z ; B 62 0 636 562 ;\nC 91 ; WX 600 ; N bracketleft ; B 223 -102 606 616 ;\nC 92 ; WX 600 ; N backslash ; B 223 -77 496 626 ;\nC 93 ; WX 600 ; N bracketright ; B 103 -102 486 616 ;\nC 94 ; WX 600 ; N asciicircum ; B 171 250 555 616 ;\nC 95 ; WX 600 ; N underscore ; B -27 -125 584 -75 ;\nC 96 ; WX 600 ; N quoteleft ; B 297 277 487 562 ;\nC 97 ; WX 600 ; N a ; B 62 -15 592 454 ;\nC 98 ; WX 600 ; N b ; B 13 -15 636 626 ;\nC 99 ; WX 600 ; N c ; B 81 -15 631 459 ;\nC 100 ; WX 600 ; N d ; B 61 -15 644 626 ;\nC 101 ; WX 600 ; N e ; B 81 -15 604 454 ;\nC 102 ; WX 600 ; N f ; B 83 0 677 626 ; L i fi ; L l fl ;\nC 103 ; WX 600 ; N g ; B 41 -146 673 454 ;\nC 104 ; WX 600 ; N h ; B 18 0 614 626 ;\nC 105 ; WX 600 ; N i ; B 77 0 545 658 ;\nC 106 ; WX 600 ; N j ; B 37 -146 580 658 ;\nC 107 ; WX 600 ; N k ; B 33 0 642 626 ;\nC 108 ; WX 600 ; N l ; B 77 0 545 626 ;\nC 109 ; WX 600 ; N m ; B -22 0 648 454 ;\nC 110 ; WX 600 ; N n ; B 18 0 614 454 ;\nC 111 ; WX 600 ; N o ; B 71 -15 622 454 ;\nC 112 ; WX 600 ; N p ; B -31 -142 622 454 ;\nC 113 ; WX 600 ; N q ; B 61 -142 684 454 ;\nC 114 ; WX 600 ; N r ; B 47 0 654 454 ;\nC 115 ; WX 600 ; N s ; B 67 -17 607 459 ;\nC 116 ; WX 600 ; N t ; B 118 -15 566 562 ;\nC 117 ; WX 600 ; N u ; B 70 -15 591 439 ;\nC 118 ; WX 600 ; N v ; B 70 0 694 439 ;\nC 119 ; WX 600 ; N w ; B 53 0 711 439 ;\nC 120 ; WX 600 ; N x ; B 6 0 670 439 ;\nC 121 ; WX 600 ; N y ; B -20 -142 694 439 ;\nC 122 ; WX 600 ; N z ; B 81 0 613 439 ;\nC 123 ; WX 600 ; N braceleft ; B 204 -102 595 616 ;\nC 124 ; WX 600 ; N bar ; B 202 -250 504 750 ;\nC 125 ; WX 600 ; N braceright ; B 114 -102 506 616 ;\nC 126 ; WX 600 ; N asciitilde ; B 120 153 589 356 ;\nC 161 ; WX 600 ; N exclamdown ; B 197 -146 477 449 ;\nC 162 ; WX 600 ; N cent ; B 121 -49 604 614 ;\nC 163 ; WX 600 ; N sterling ; B 107 -28 650 611 ;\nC 164 ; WX 600 ; N fraction ; B 22 -60 707 661 ;\nC 165 ; WX 600 ; N yen ; B 98 0 709 562 ;\nC 166 ; WX 600 ; N florin ; B -56 -131 701 616 ;\nC 167 ; WX 600 ; N section ; B 74 -70 619 580 ;\nC 168 ; WX 600 ; N currency ; B 77 49 643 517 ;\nC 169 ; WX 600 ; N quotesingle ; B 304 277 492 562 ;\nC 170 ; WX 600 ; N quotedblleft ; B 190 277 594 562 ;\nC 171 ; WX 600 ; N guillemotleft ; B 63 70 638 446 ;\nC 172 ; WX 600 ; N guilsinglleft ; B 196 70 544 446 ;\nC 173 ; WX 600 ; N guilsinglright ; B 166 70 514 446 ;\nC 174 ; WX 600 ; N fi ; B 12 0 643 626 ;\nC 175 ; WX 600 ; N fl ; B 12 0 643 626 ;\nC 177 ; WX 600 ; N endash ; B 108 203 602 313 ;\nC 178 ; WX 600 ; N dagger ; B 176 -70 586 580 ;\nC 179 ; WX 600 ; N daggerdbl ; B 122 -70 586 580 ;\nC 180 ; WX 600 ; N periodcentered ; B 249 165 461 351 ;\nC 182 ; WX 600 ; N paragraph ; B 61 -70 699 580 ;\nC 183 ; WX 600 ; N bullet ; B 197 132 523 430 ;\nC 184 ; WX 600 ; N quotesinglbase ; B 145 -142 457 143 ;\nC 185 ; WX 600 ; N quotedblbase ; B 35 -142 559 143 ;\nC 186 ; WX 600 ; N quotedblright ; B 120 277 644 562 ;\nC 187 ; WX 600 ; N guillemotright ; B 72 70 647 446 ;\nC 188 ; WX 600 ; N ellipsis ; B 35 -15 586 116 ;\nC 189 ; WX 600 ; N perthousand ; B -44 -15 742 616 ;\nC 191 ; WX 600 ; N questiondown ; B 101 -146 509 449 ;\nC 193 ; WX 600 ; N grave ; B 272 508 503 661 ;\nC 194 ; WX 600 ; N acute ; B 313 508 608 661 ;\nC 195 ; WX 600 ; N circumflex ; B 212 483 606 657 ;\nC 196 ; WX 600 ; N tilde ; B 200 493 642 636 ;\nC 197 ; WX 600 ; N macron ; B 195 505 636 585 ;\nC 198 ; WX 600 ; N breve ; B 217 468 651 631 ;\nC 199 ; WX 600 ; N dotaccent ; B 346 485 490 625 ;\nC 200 ; WX 600 ; N dieresis ; B 244 485 592 625 ;\nC 202 ; WX 600 ; N ring ; B 319 481 528 678 ;\nC 203 ; WX 600 ; N cedilla ; B 169 -206 367 0 ;\nC 205 ; WX 600 ; N hungarumlaut ; B 172 488 728 661 ;\nC 206 ; WX 600 ; N ogonek ; B 144 -199 350 0 ;\nC 207 ; WX 600 ; N caron ; B 238 493 632 667 ;\nC 208 ; WX 600 ; N emdash ; B 33 203 677 313 ;\nC 225 ; WX 600 ; N AE ; B -29 0 707 562 ;\nC 227 ; WX 600 ; N ordfeminine ; B 189 196 526 580 ;\nC 232 ; WX 600 ; N Lslash ; B 39 0 635 562 ;\nC 233 ; WX 600 ; N Oslash ; B 48 -22 672 584 ;\nC 234 ; WX 600 ; N OE ; B 26 0 700 562 ;\nC 235 ; WX 600 ; N ordmasculine ; B 189 196 542 580 ;\nC 241 ; WX 600 ; N ae ; B 21 -15 651 454 ;\nC 245 ; WX 600 ; N dotlessi ; B 77 0 545 439 ;\nC 248 ; WX 600 ; N lslash ; B 77 0 578 626 ;\nC 249 ; WX 600 ; N oslash ; B 55 -24 637 463 ;\nC 250 ; WX 600 ; N oe ; B 19 -15 661 454 ;\nC 251 ; WX 600 ; N germandbls ; B 22 -15 628 626 ;\nC -1 ; WX 600 ; N Odieresis ; B 74 -18 645 748 ;\nC -1 ; WX 600 ; N logicalnot ; B 135 103 617 413 ;\nC -1 ; WX 600 ; N minus ; B 114 203 596 313 ;\nC -1 ; WX 600 ; N merge ; B 168 -15 533 487 ;\nC -1 ; WX 600 ; N degree ; B 173 243 569 616 ;\nC -1 ; WX 600 ; N dectab ; B 8 0 615 320 ;\nC -1 ; WX 600 ; N ll ; B 1 0 653 626 ;\nC -1 ; WX 600 ; N IJ ; B -8 -18 741 562 ;\nC -1 ; WX 600 ; N Eacute ; B 25 0 669 784 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 74 -18 645 780 ;\nC -1 ; WX 600 ; N ucircumflex ; B 70 -15 591 657 ;\nC -1 ; WX 600 ; N left ; B 109 44 589 371 ;\nC -1 ; WX 600 ; N threesuperior ; B 193 222 525 616 ;\nC -1 ; WX 600 ; N up ; B 196 0 523 447 ;\nC -1 ; WX 600 ; N multiply ; B 105 39 606 478 ;\nC -1 ; WX 600 ; N Scaron ; B 54 -22 672 790 ;\nC -1 ; WX 600 ; N tab ; B 19 0 641 562 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 101 -18 715 780 ;\nC -1 ; WX 600 ; N divide ; B 114 16 596 500 ;\nC -1 ; WX 600 ; N Acircumflex ; B -9 0 631 780 ;\nC -1 ; WX 600 ; N eacute ; B 81 -15 608 661 ;\nC -1 ; WX 600 ; N uacute ; B 70 -15 608 661 ;\nC -1 ; WX 600 ; N Aacute ; B -9 0 665 784 ;\nC -1 ; WX 600 ; N copyright ; B 53 -18 667 580 ;\nC -1 ; WX 600 ; N twosuperior ; B 192 230 541 616 ;\nC -1 ; WX 600 ; N Ecircumflex ; B 25 0 669 780 ;\nC -1 ; WX 600 ; N ntilde ; B 18 0 642 636 ;\nC -1 ; WX 600 ; N down ; B 168 -15 496 439 ;\nC -1 ; WX 600 ; N center ; B 103 14 623 580 ;\nC -1 ; WX 600 ; N onesuperior ; B 213 230 514 616 ;\nC -1 ; WX 600 ; N ij ; B 6 -146 714 658 ;\nC -1 ; WX 600 ; N edieresis ; B 81 -15 604 625 ;\nC -1 ; WX 600 ; N graybox ; B 76 0 652 599 ;\nC -1 ; WX 600 ; N odieresis ; B 71 -15 622 625 ;\nC -1 ; WX 600 ; N Ograve ; B 74 -18 645 784 ;\nC -1 ; WX 600 ; N threequarters ; B 8 -60 698 661 ;\nC -1 ; WX 600 ; N plusminus ; B 76 24 614 515 ;\nC -1 ; WX 600 ; N prescription ; B 24 -15 632 562 ;\nC -1 ; WX 600 ; N eth ; B 93 -27 661 626 ;\nC -1 ; WX 600 ; N largebullet ; B 307 229 413 333 ;\nC -1 ; WX 600 ; N egrave ; B 81 -15 604 661 ;\nC -1 ; WX 600 ; N ccedilla ; B 81 -206 631 459 ;\nC -1 ; WX 600 ; N notegraphic ; B 91 -15 619 572 ;\nC -1 ; WX 600 ; N Udieresis ; B 101 -18 715 748 ;\nC -1 ; WX 600 ; N Gcaron ; B 75 -18 674 790 ;\nC -1 ; WX 600 ; N arrowdown ; B 174 -15 486 608 ;\nC -1 ; WX 600 ; N format ; B -26 -146 243 601 ;\nC -1 ; WX 600 ; N Otilde ; B 74 -18 668 759 ;\nC -1 ; WX 600 ; N Idieresis ; B 77 0 642 748 ;\nC -1 ; WX 600 ; N adieresis ; B 62 -15 592 625 ;\nC -1 ; WX 600 ; N ecircumflex ; B 81 -15 606 657 ;\nC -1 ; WX 600 ; N Eth ; B 30 0 664 562 ;\nC -1 ; WX 600 ; N onequarter ; B 14 -60 706 661 ;\nC -1 ; WX 600 ; N LL ; B -45 0 694 562 ;\nC -1 ; WX 600 ; N agrave ; B 62 -15 592 661 ;\nC -1 ; WX 600 ; N Zcaron ; B 62 0 659 790 ;\nC -1 ; WX 600 ; N Scedilla ; B 54 -206 672 582 ;\nC -1 ; WX 600 ; N Idot ; B 77 0 642 748 ;\nC -1 ; WX 600 ; N Iacute ; B 77 0 642 784 ;\nC -1 ; WX 600 ; N indent ; B 99 45 579 372 ;\nC -1 ; WX 600 ; N Ugrave ; B 101 -18 715 784 ;\nC -1 ; WX 600 ; N scaron ; B 67 -17 632 667 ;\nC -1 ; WX 600 ; N overscore ; B 123 579 734 629 ;\nC -1 ; WX 600 ; N Aring ; B -9 0 631 801 ;\nC -1 ; WX 600 ; N Ccedilla ; B 74 -206 674 580 ;\nC -1 ; WX 600 ; N Igrave ; B 77 0 642 784 ;\nC -1 ; WX 600 ; N brokenbar ; B 218 -175 488 675 ;\nC -1 ; WX 600 ; N Oacute ; B 74 -18 645 784 ;\nC -1 ; WX 600 ; N otilde ; B 71 -15 642 636 ;\nC -1 ; WX 600 ; N Yacute ; B 109 0 708 784 ;\nC -1 ; WX 600 ; N lira ; B 107 -28 650 611 ;\nC -1 ; WX 600 ; N Icircumflex ; B 77 0 642 780 ;\nC -1 ; WX 600 ; N Atilde ; B -9 0 638 759 ;\nC -1 ; WX 600 ; N Uacute ; B 101 -18 715 784 ;\nC -1 ; WX 600 ; N Ydieresis ; B 109 0 708 748 ;\nC -1 ; WX 600 ; N ydieresis ; B -20 -142 694 625 ;\nC -1 ; WX 600 ; N idieresis ; B 77 0 552 625 ;\nC -1 ; WX 600 ; N Adieresis ; B -9 0 631 748 ;\nC -1 ; WX 600 ; N mu ; B 50 -142 591 439 ;\nC -1 ; WX 600 ; N trademark ; B 86 230 868 562 ;\nC -1 ; WX 600 ; N oacute ; B 71 -15 622 661 ;\nC -1 ; WX 600 ; N acircumflex ; B 62 -15 592 657 ;\nC -1 ; WX 600 ; N Agrave ; B -9 0 631 784 ;\nC -1 ; WX 600 ; N return ; B 79 0 700 562 ;\nC -1 ; WX 600 ; N atilde ; B 62 -15 642 636 ;\nC -1 ; WX 600 ; N square ; B 19 0 700 562 ;\nC -1 ; WX 600 ; N registered ; B 53 -18 667 580 ;\nC -1 ; WX 600 ; N stop ; B 19 0 700 562 ;\nC -1 ; WX 600 ; N udieresis ; B 70 -15 591 625 ;\nC -1 ; WX 600 ; N arrowup ; B 244 3 556 626 ;\nC -1 ; WX 600 ; N igrave ; B 77 0 545 661 ;\nC -1 ; WX 600 ; N Edieresis ; B 25 0 669 748 ;\nC -1 ; WX 600 ; N zcaron ; B 81 0 632 667 ;\nC -1 ; WX 600 ; N arrowboth ; B 40 143 688 455 ;\nC -1 ; WX 600 ; N gcaron ; B 41 -146 673 667 ;\nC -1 ; WX 600 ; N arrowleft ; B 40 143 708 455 ;\nC -1 ; WX 600 ; N aacute ; B 62 -15 608 661 ;\nC -1 ; WX 600 ; N ocircumflex ; B 71 -15 622 657 ;\nC -1 ; WX 600 ; N scedilla ; B 67 -206 607 459 ;\nC -1 ; WX 600 ; N ograve ; B 71 -15 622 661 ;\nC -1 ; WX 600 ; N onehalf ; B 23 -60 715 661 ;\nC -1 ; WX 600 ; N ugrave ; B 70 -15 591 661 ;\nC -1 ; WX 600 ; N Ntilde ; B 8 -12 729 759 ;\nC -1 ; WX 600 ; N iacute ; B 77 0 608 661 ;\nC -1 ; WX 600 ; N arrowright ; B 20 143 688 455 ;\nC -1 ; WX 600 ; N Thorn ; B 48 0 619 562 ;\nC -1 ; WX 600 ; N Egrave ; B 25 0 669 784 ;\nC -1 ; WX 600 ; N thorn ; B -31 -142 622 626 ;\nC -1 ; WX 600 ; N aring ; B 62 -15 592 678 ;\nC -1 ; WX 600 ; N yacute ; B -20 -142 694 661 ;\nC -1 ; WX 600 ; N icircumflex ; B 77 0 566 657 ;\nEndCharMetrics\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 56 123 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex -4 123 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 6 123 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave -24 123 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 16 123 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde -4 123 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 56 123 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 26 123 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 26 123 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 26 123 ;\nCC Gcaron 2 ; PCC G 0 0 ; PCC caron 36 123 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 26 123 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 26 123 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 26 123 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 26 123 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 26 123 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 26 123 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 26 123 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 26 123 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 26 123 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 26 123 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 26 123 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 56 123 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 26 123 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 26 123 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave -4 123 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 56 123 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 26 123 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 26 123 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 0 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex -20 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis -10 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave -30 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 0 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 0 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 0 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 0 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 0 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 0 0 ;\nCC gcaron 2 ; PCC g 0 0 ; PCC caron -40 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 0 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -40 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -40 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave 0 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 0 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 0 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 0 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 0 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 0 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 0 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 0 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 0 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex -20 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis -20 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave -30 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 30 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 10 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 0 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pcrr8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1989, 1990, 1991 Adobe Systems Incorporated. All rights reserved.\nComment Creation Date: Tue Sep 17 07:47:21 1991\nComment UniqueID 36347\nComment VMusage 31037 39405\nFontName Courier\nFullName Courier\nFamilyName Courier\nWeight Medium\nItalicAngle 0\nIsFixedPitch true\nFontBBox -28 -250 628 805\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.004\nNotice Copyright (c) 1989, 1990, 1991 Adobe Systems Incorporated. All rights reserved.\nEncodingScheme AdobeStandardEncoding\nCapHeight 562\nXHeight 426\nAscender 629\nDescender -157\nStartCharMetrics 260\nC 32 ; WX 600 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 600 ; N exclam ; B 236 -15 364 572 ;\nC 34 ; WX 600 ; N quotedbl ; B 187 328 413 562 ;\nC 35 ; WX 600 ; N numbersign ; B 93 -32 507 639 ;\nC 36 ; WX 600 ; N dollar ; B 105 -126 496 662 ;\nC 37 ; WX 600 ; N percent ; B 81 -15 518 622 ;\nC 38 ; WX 600 ; N ampersand ; B 63 -15 538 543 ;\nC 39 ; WX 600 ; N quoteright ; B 213 328 376 562 ;\nC 40 ; WX 600 ; N parenleft ; B 269 -108 440 622 ;\nC 41 ; WX 600 ; N parenright ; B 160 -108 331 622 ;\nC 42 ; WX 600 ; N asterisk ; B 116 257 484 607 ;\nC 43 ; WX 600 ; N plus ; B 80 44 520 470 ;\nC 44 ; WX 600 ; N comma ; B 181 -112 344 122 ;\nC 45 ; WX 600 ; N hyphen ; B 103 231 497 285 ;\nC 46 ; WX 600 ; N period ; B 229 -15 371 109 ;\nC 47 ; WX 600 ; N slash ; B 125 -80 475 629 ;\nC 48 ; WX 600 ; N zero ; B 106 -15 494 622 ;\nC 49 ; WX 600 ; N one ; B 96 0 505 622 ;\nC 50 ; WX 600 ; N two ; B 70 0 471 622 ;\nC 51 ; WX 600 ; N three ; B 75 -15 466 622 ;\nC 52 ; WX 600 ; N four ; B 78 0 500 622 ;\nC 53 ; WX 600 ; N five ; B 92 -15 497 607 ;\nC 54 ; WX 600 ; N six ; B 111 -15 497 622 ;\nC 55 ; WX 600 ; N seven ; B 82 0 483 607 ;\nC 56 ; WX 600 ; N eight ; B 102 -15 498 622 ;\nC 57 ; WX 600 ; N nine ; B 96 -15 489 622 ;\nC 58 ; WX 600 ; N colon ; B 229 -15 371 385 ;\nC 59 ; WX 600 ; N semicolon ; B 181 -112 371 385 ;\nC 60 ; WX 600 ; N less ; B 41 42 519 472 ;\nC 61 ; WX 600 ; N equal ; B 80 138 520 376 ;\nC 62 ; WX 600 ; N greater ; B 66 42 544 472 ;\nC 63 ; WX 600 ; N question ; B 129 -15 492 572 ;\nC 64 ; WX 600 ; N at ; B 77 -15 533 622 ;\nC 65 ; WX 600 ; N A ; B 3 0 597 562 ;\nC 66 ; WX 600 ; N B ; B 43 0 559 562 ;\nC 67 ; WX 600 ; N C ; B 41 -18 540 580 ;\nC 68 ; WX 600 ; N D ; B 43 0 574 562 ;\nC 69 ; WX 600 ; N E ; B 53 0 550 562 ;\nC 70 ; WX 600 ; N F ; B 53 0 545 562 ;\nC 71 ; WX 600 ; N G ; B 31 -18 575 580 ;\nC 72 ; WX 600 ; N H ; B 32 0 568 562 ;\nC 73 ; WX 600 ; N I ; B 96 0 504 562 ;\nC 74 ; WX 600 ; N J ; B 34 -18 566 562 ;\nC 75 ; WX 600 ; N K ; B 38 0 582 562 ;\nC 76 ; WX 600 ; N L ; B 47 0 554 562 ;\nC 77 ; WX 600 ; N M ; B 4 0 596 562 ;\nC 78 ; WX 600 ; N N ; B 7 -13 593 562 ;\nC 79 ; WX 600 ; N O ; B 43 -18 557 580 ;\nC 80 ; WX 600 ; N P ; B 79 0 558 562 ;\nC 81 ; WX 600 ; N Q ; B 43 -138 557 580 ;\nC 82 ; WX 600 ; N R ; B 38 0 588 562 ;\nC 83 ; WX 600 ; N S ; B 72 -20 529 580 ;\nC 84 ; WX 600 ; N T ; B 38 0 563 562 ;\nC 85 ; WX 600 ; N U ; B 17 -18 583 562 ;\nC 86 ; WX 600 ; N V ; B -4 -13 604 562 ;\nC 87 ; WX 600 ; N W ; B -3 -13 603 562 ;\nC 88 ; WX 600 ; N X ; B 23 0 577 562 ;\nC 89 ; WX 600 ; N Y ; B 24 0 576 562 ;\nC 90 ; WX 600 ; N Z ; B 86 0 514 562 ;\nC 91 ; WX 600 ; N bracketleft ; B 269 -108 442 622 ;\nC 92 ; WX 600 ; N backslash ; B 118 -80 482 629 ;\nC 93 ; WX 600 ; N bracketright ; B 158 -108 331 622 ;\nC 94 ; WX 600 ; N asciicircum ; B 94 354 506 622 ;\nC 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ;\nC 96 ; WX 600 ; N quoteleft ; B 224 328 387 562 ;\nC 97 ; WX 600 ; N a ; B 53 -15 559 441 ;\nC 98 ; WX 600 ; N b ; B 14 -15 575 629 ;\nC 99 ; WX 600 ; N c ; B 66 -15 529 441 ;\nC 100 ; WX 600 ; N d ; B 45 -15 591 629 ;\nC 101 ; WX 600 ; N e ; B 66 -15 548 441 ;\nC 102 ; WX 600 ; N f ; B 114 0 531 629 ; L i fi ; L l fl ;\nC 103 ; WX 600 ; N g ; B 45 -157 566 441 ;\nC 104 ; WX 600 ; N h ; B 18 0 582 629 ;\nC 105 ; WX 600 ; N i ; B 95 0 505 657 ;\nC 106 ; WX 600 ; N j ; B 82 -157 410 657 ;\nC 107 ; WX 600 ; N k ; B 43 0 580 629 ;\nC 108 ; WX 600 ; N l ; B 95 0 505 629 ;\nC 109 ; WX 600 ; N m ; B -5 0 605 441 ;\nC 110 ; WX 600 ; N n ; B 26 0 575 441 ;\nC 111 ; WX 600 ; N o ; B 62 -15 538 441 ;\nC 112 ; WX 600 ; N p ; B 9 -157 555 441 ;\nC 113 ; WX 600 ; N q ; B 45 -157 591 441 ;\nC 114 ; WX 600 ; N r ; B 60 0 559 441 ;\nC 115 ; WX 600 ; N s ; B 80 -15 513 441 ;\nC 116 ; WX 600 ; N t ; B 87 -15 530 561 ;\nC 117 ; WX 600 ; N u ; B 21 -15 562 426 ;\nC 118 ; WX 600 ; N v ; B 10 -10 590 426 ;\nC 119 ; WX 600 ; N w ; B -4 -10 604 426 ;\nC 120 ; WX 600 ; N x ; B 20 0 580 426 ;\nC 121 ; WX 600 ; N y ; B 7 -157 592 426 ;\nC 122 ; WX 600 ; N z ; B 99 0 502 426 ;\nC 123 ; WX 600 ; N braceleft ; B 182 -108 437 622 ;\nC 124 ; WX 600 ; N bar ; B 275 -250 326 750 ;\nC 125 ; WX 600 ; N braceright ; B 163 -108 418 622 ;\nC 126 ; WX 600 ; N asciitilde ; B 63 197 540 320 ;\nC 161 ; WX 600 ; N exclamdown ; B 236 -157 364 430 ;\nC 162 ; WX 600 ; N cent ; B 96 -49 500 614 ;\nC 163 ; WX 600 ; N sterling ; B 84 -21 521 611 ;\nC 164 ; WX 600 ; N fraction ; B 92 -57 509 665 ;\nC 165 ; WX 600 ; N yen ; B 26 0 574 562 ;\nC 166 ; WX 600 ; N florin ; B 4 -143 539 622 ;\nC 167 ; WX 600 ; N section ; B 113 -78 488 580 ;\nC 168 ; WX 600 ; N currency ; B 73 58 527 506 ;\nC 169 ; WX 600 ; N quotesingle ; B 259 328 341 562 ;\nC 170 ; WX 600 ; N quotedblleft ; B 143 328 471 562 ;\nC 171 ; WX 600 ; N guillemotleft ; B 37 70 563 446 ;\nC 172 ; WX 600 ; N guilsinglleft ; B 149 70 451 446 ;\nC 173 ; WX 600 ; N guilsinglright ; B 149 70 451 446 ;\nC 174 ; WX 600 ; N fi ; B 3 0 597 629 ;\nC 175 ; WX 600 ; N fl ; B 3 0 597 629 ;\nC 177 ; WX 600 ; N endash ; B 75 231 525 285 ;\nC 178 ; WX 600 ; N dagger ; B 141 -78 459 580 ;\nC 179 ; WX 600 ; N daggerdbl ; B 141 -78 459 580 ;\nC 180 ; WX 600 ; N periodcentered ; B 222 189 378 327 ;\nC 182 ; WX 600 ; N paragraph ; B 50 -78 511 562 ;\nC 183 ; WX 600 ; N bullet ; B 172 130 428 383 ;\nC 184 ; WX 600 ; N quotesinglbase ; B 213 -134 376 100 ;\nC 185 ; WX 600 ; N quotedblbase ; B 143 -134 457 100 ;\nC 186 ; WX 600 ; N quotedblright ; B 143 328 457 562 ;\nC 187 ; WX 600 ; N guillemotright ; B 37 70 563 446 ;\nC 188 ; WX 600 ; N ellipsis ; B 37 -15 563 111 ;\nC 189 ; WX 600 ; N perthousand ; B 3 -15 600 622 ;\nC 191 ; WX 600 ; N questiondown ; B 108 -157 471 430 ;\nC 193 ; WX 600 ; N grave ; B 151 497 378 672 ;\nC 194 ; WX 600 ; N acute ; B 242 497 469 672 ;\nC 195 ; WX 600 ; N circumflex ; B 124 477 476 654 ;\nC 196 ; WX 600 ; N tilde ; B 105 489 503 606 ;\nC 197 ; WX 600 ; N macron ; B 120 525 480 565 ;\nC 198 ; WX 600 ; N breve ; B 153 501 447 609 ;\nC 199 ; WX 600 ; N dotaccent ; B 249 477 352 580 ;\nC 200 ; WX 600 ; N dieresis ; B 148 492 453 595 ;\nC 202 ; WX 600 ; N ring ; B 218 463 382 627 ;\nC 203 ; WX 600 ; N cedilla ; B 224 -151 362 10 ;\nC 205 ; WX 600 ; N hungarumlaut ; B 133 497 540 672 ;\nC 206 ; WX 600 ; N ogonek ; B 227 -151 370 0 ;\nC 207 ; WX 600 ; N caron ; B 124 492 476 669 ;\nC 208 ; WX 600 ; N emdash ; B 0 231 600 285 ;\nC 225 ; WX 600 ; N AE ; B 3 0 550 562 ;\nC 227 ; WX 600 ; N ordfeminine ; B 156 249 442 580 ;\nC 232 ; WX 600 ; N Lslash ; B 47 0 554 562 ;\nC 233 ; WX 600 ; N Oslash ; B 43 -80 557 629 ;\nC 234 ; WX 600 ; N OE ; B 7 0 567 562 ;\nC 235 ; WX 600 ; N ordmasculine ; B 157 249 443 580 ;\nC 241 ; WX 600 ; N ae ; B 19 -15 570 441 ;\nC 245 ; WX 600 ; N dotlessi ; B 95 0 505 426 ;\nC 248 ; WX 600 ; N lslash ; B 95 0 505 629 ;\nC 249 ; WX 600 ; N oslash ; B 62 -80 538 506 ;\nC 250 ; WX 600 ; N oe ; B 19 -15 559 441 ;\nC 251 ; WX 600 ; N germandbls ; B 48 -15 588 629 ;\nC -1 ; WX 600 ; N Odieresis ; B 43 -18 557 731 ;\nC -1 ; WX 600 ; N logicalnot ; B 87 108 513 369 ;\nC -1 ; WX 600 ; N minus ; B 80 232 520 283 ;\nC -1 ; WX 600 ; N merge ; B 160 -15 440 436 ;\nC -1 ; WX 600 ; N degree ; B 123 269 477 622 ;\nC -1 ; WX 600 ; N dectab ; B 18 0 582 227 ;\nC -1 ; WX 600 ; N ll ; B 18 0 567 629 ;\nC -1 ; WX 600 ; N IJ ; B 32 -18 583 562 ;\nC -1 ; WX 600 ; N Eacute ; B 53 0 550 793 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 43 -18 557 775 ;\nC -1 ; WX 600 ; N ucircumflex ; B 21 -15 562 654 ;\nC -1 ; WX 600 ; N left ; B 70 68 530 348 ;\nC -1 ; WX 600 ; N threesuperior ; B 155 240 406 622 ;\nC -1 ; WX 600 ; N up ; B 160 0 440 437 ;\nC -1 ; WX 600 ; N multiply ; B 87 43 515 470 ;\nC -1 ; WX 600 ; N Scaron ; B 72 -20 529 805 ;\nC -1 ; WX 600 ; N tab ; B 19 0 581 562 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 17 -18 583 775 ;\nC -1 ; WX 600 ; N divide ; B 87 48 513 467 ;\nC -1 ; WX 600 ; N Acircumflex ; B 3 0 597 775 ;\nC -1 ; WX 600 ; N eacute ; B 66 -15 548 672 ;\nC -1 ; WX 600 ; N uacute ; B 21 -15 562 672 ;\nC -1 ; WX 600 ; N Aacute ; B 3 0 597 793 ;\nC -1 ; WX 600 ; N copyright ; B 0 -18 600 580 ;\nC -1 ; WX 600 ; N twosuperior ; B 177 249 424 622 ;\nC -1 ; WX 600 ; N Ecircumflex ; B 53 0 550 775 ;\nC -1 ; WX 600 ; N ntilde ; B 26 0 575 606 ;\nC -1 ; WX 600 ; N down ; B 160 -15 440 426 ;\nC -1 ; WX 600 ; N center ; B 40 14 560 580 ;\nC -1 ; WX 600 ; N onesuperior ; B 172 249 428 622 ;\nC -1 ; WX 600 ; N ij ; B 37 -157 490 657 ;\nC -1 ; WX 600 ; N edieresis ; B 66 -15 548 595 ;\nC -1 ; WX 600 ; N graybox ; B 76 0 525 599 ;\nC -1 ; WX 600 ; N odieresis ; B 62 -15 538 595 ;\nC -1 ; WX 600 ; N Ograve ; B 43 -18 557 793 ;\nC -1 ; WX 600 ; N threequarters ; B 8 -56 593 666 ;\nC -1 ; WX 600 ; N plusminus ; B 87 44 513 558 ;\nC -1 ; WX 600 ; N prescription ; B 27 -15 577 562 ;\nC -1 ; WX 600 ; N eth ; B 62 -15 538 629 ;\nC -1 ; WX 600 ; N largebullet ; B 261 220 339 297 ;\nC -1 ; WX 600 ; N egrave ; B 66 -15 548 672 ;\nC -1 ; WX 600 ; N ccedilla ; B 66 -151 529 441 ;\nC -1 ; WX 600 ; N notegraphic ; B 136 -15 464 572 ;\nC -1 ; WX 600 ; N Udieresis ; B 17 -18 583 731 ;\nC -1 ; WX 600 ; N Gcaron ; B 31 -18 575 805 ;\nC -1 ; WX 600 ; N arrowdown ; B 116 -15 484 608 ;\nC -1 ; WX 600 ; N format ; B 5 -157 56 607 ;\nC -1 ; WX 600 ; N Otilde ; B 43 -18 557 732 ;\nC -1 ; WX 600 ; N Idieresis ; B 96 0 504 731 ;\nC -1 ; WX 600 ; N adieresis ; B 53 -15 559 595 ;\nC -1 ; WX 600 ; N ecircumflex ; B 66 -15 548 654 ;\nC -1 ; WX 600 ; N Eth ; B 30 0 574 562 ;\nC -1 ; WX 600 ; N onequarter ; B 0 -57 600 665 ;\nC -1 ; WX 600 ; N LL ; B 8 0 592 562 ;\nC -1 ; WX 600 ; N agrave ; B 53 -15 559 672 ;\nC -1 ; WX 600 ; N Zcaron ; B 86 0 514 805 ;\nC -1 ; WX 600 ; N Scedilla ; B 72 -151 529 580 ;\nC -1 ; WX 600 ; N Idot ; B 96 0 504 716 ;\nC -1 ; WX 600 ; N Iacute ; B 96 0 504 793 ;\nC -1 ; WX 600 ; N indent ; B 70 68 530 348 ;\nC -1 ; WX 600 ; N Ugrave ; B 17 -18 583 793 ;\nC -1 ; WX 600 ; N scaron ; B 80 -15 513 669 ;\nC -1 ; WX 600 ; N overscore ; B 0 579 600 629 ;\nC -1 ; WX 600 ; N Aring ; B 3 0 597 753 ;\nC -1 ; WX 600 ; N Ccedilla ; B 41 -151 540 580 ;\nC -1 ; WX 600 ; N Igrave ; B 96 0 504 793 ;\nC -1 ; WX 600 ; N brokenbar ; B 275 -175 326 675 ;\nC -1 ; WX 600 ; N Oacute ; B 43 -18 557 793 ;\nC -1 ; WX 600 ; N otilde ; B 62 -15 538 606 ;\nC -1 ; WX 600 ; N Yacute ; B 24 0 576 793 ;\nC -1 ; WX 600 ; N lira ; B 73 -21 521 611 ;\nC -1 ; WX 600 ; N Icircumflex ; B 96 0 504 775 ;\nC -1 ; WX 600 ; N Atilde ; B 3 0 597 732 ;\nC -1 ; WX 600 ; N Uacute ; B 17 -18 583 793 ;\nC -1 ; WX 600 ; N Ydieresis ; B 24 0 576 731 ;\nC -1 ; WX 600 ; N ydieresis ; B 7 -157 592 595 ;\nC -1 ; WX 600 ; N idieresis ; B 95 0 505 595 ;\nC -1 ; WX 600 ; N Adieresis ; B 3 0 597 731 ;\nC -1 ; WX 600 ; N mu ; B 21 -157 562 426 ;\nC -1 ; WX 600 ; N trademark ; B -23 263 623 562 ;\nC -1 ; WX 600 ; N oacute ; B 62 -15 538 672 ;\nC -1 ; WX 600 ; N acircumflex ; B 53 -15 559 654 ;\nC -1 ; WX 600 ; N Agrave ; B 3 0 597 793 ;\nC -1 ; WX 600 ; N return ; B 19 0 581 562 ;\nC -1 ; WX 600 ; N atilde ; B 53 -15 559 606 ;\nC -1 ; WX 600 ; N square ; B 19 0 581 562 ;\nC -1 ; WX 600 ; N registered ; B 0 -18 600 580 ;\nC -1 ; WX 600 ; N stop ; B 19 0 581 562 ;\nC -1 ; WX 600 ; N udieresis ; B 21 -15 562 595 ;\nC -1 ; WX 600 ; N arrowup ; B 116 0 484 623 ;\nC -1 ; WX 600 ; N igrave ; B 95 0 505 672 ;\nC -1 ; WX 600 ; N Edieresis ; B 53 0 550 731 ;\nC -1 ; WX 600 ; N zcaron ; B 99 0 502 669 ;\nC -1 ; WX 600 ; N arrowboth ; B -28 115 628 483 ;\nC -1 ; WX 600 ; N gcaron ; B 45 -157 566 669 ;\nC -1 ; WX 600 ; N arrowleft ; B -24 115 624 483 ;\nC -1 ; WX 600 ; N aacute ; B 53 -15 559 672 ;\nC -1 ; WX 600 ; N ocircumflex ; B 62 -15 538 654 ;\nC -1 ; WX 600 ; N scedilla ; B 80 -151 513 441 ;\nC -1 ; WX 600 ; N ograve ; B 62 -15 538 672 ;\nC -1 ; WX 600 ; N onehalf ; B 0 -57 611 665 ;\nC -1 ; WX 600 ; N ugrave ; B 21 -15 562 672 ;\nC -1 ; WX 600 ; N Ntilde ; B 7 -13 593 732 ;\nC -1 ; WX 600 ; N iacute ; B 95 0 505 672 ;\nC -1 ; WX 600 ; N arrowright ; B -24 115 624 483 ;\nC -1 ; WX 600 ; N Thorn ; B 79 0 538 562 ;\nC -1 ; WX 600 ; N Egrave ; B 53 0 550 793 ;\nC -1 ; WX 600 ; N thorn ; B -6 -157 555 629 ;\nC -1 ; WX 600 ; N aring ; B 53 -15 559 627 ;\nC -1 ; WX 600 ; N yacute ; B 7 -157 592 672 ;\nC -1 ; WX 600 ; N icircumflex ; B 94 0 505 654 ;\nEndCharMetrics\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 20 121 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex -30 121 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis -30 136 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave -30 121 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring -15 126 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 0 126 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 30 121 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 0 121 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 0 136 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 0 121 ;\nCC Gcaron 2 ; PCC G 0 0 ; PCC caron 0 136 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 0 121 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 0 121 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 0 136 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 0 121 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 0 126 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 0 121 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 0 121 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 0 136 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 0 121 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 0 126 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 30 136 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 30 121 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 0 121 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 0 136 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave -30 121 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 30 121 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 0 136 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 0 136 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 0 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 0 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 0 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 0 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 0 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 0 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 0 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 0 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 0 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 0 0 ;\nCC gcaron 2 ; PCC g 0 0 ; PCC caron -30 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 0 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -30 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -30 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -30 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 0 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 0 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 0 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 0 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 0 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 0 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 0 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute -10 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex -10 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 0 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave -30 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute -20 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis -10 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 10 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pcrro8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1989, 1990, 1991 Adobe Systems Incorporated. All rights reserved.\nComment Creation Date: Tue Sep 17 09:42:19 1991\nComment UniqueID 36350\nComment VMusage 9174 52297\nFontName Courier-Oblique\nFullName Courier Oblique\nFamilyName Courier\nWeight Medium\nItalicAngle -12\nIsFixedPitch true\nFontBBox -28 -250 742 805\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.004\nNotice Copyright (c) 1989, 1990, 1991 Adobe Systems Incorporated. All rights reserved.\nEncodingScheme AdobeStandardEncoding\nCapHeight 562\nXHeight 426\nAscender 629\nDescender -157\nStartCharMetrics 260\nC 32 ; WX 600 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 600 ; N exclam ; B 243 -15 464 572 ;\nC 34 ; WX 600 ; N quotedbl ; B 273 328 532 562 ;\nC 35 ; WX 600 ; N numbersign ; B 133 -32 596 639 ;\nC 36 ; WX 600 ; N dollar ; B 108 -126 596 662 ;\nC 37 ; WX 600 ; N percent ; B 134 -15 599 622 ;\nC 38 ; WX 600 ; N ampersand ; B 87 -15 580 543 ;\nC 39 ; WX 600 ; N quoteright ; B 283 328 495 562 ;\nC 40 ; WX 600 ; N parenleft ; B 313 -108 572 622 ;\nC 41 ; WX 600 ; N parenright ; B 137 -108 396 622 ;\nC 42 ; WX 600 ; N asterisk ; B 212 257 580 607 ;\nC 43 ; WX 600 ; N plus ; B 129 44 580 470 ;\nC 44 ; WX 600 ; N comma ; B 157 -112 370 122 ;\nC 45 ; WX 600 ; N hyphen ; B 152 231 558 285 ;\nC 46 ; WX 600 ; N period ; B 238 -15 382 109 ;\nC 47 ; WX 600 ; N slash ; B 112 -80 604 629 ;\nC 48 ; WX 600 ; N zero ; B 154 -15 575 622 ;\nC 49 ; WX 600 ; N one ; B 98 0 515 622 ;\nC 50 ; WX 600 ; N two ; B 70 0 568 622 ;\nC 51 ; WX 600 ; N three ; B 82 -15 538 622 ;\nC 52 ; WX 600 ; N four ; B 108 0 541 622 ;\nC 53 ; WX 600 ; N five ; B 99 -15 589 607 ;\nC 54 ; WX 600 ; N six ; B 155 -15 629 622 ;\nC 55 ; WX 600 ; N seven ; B 182 0 612 607 ;\nC 56 ; WX 600 ; N eight ; B 132 -15 588 622 ;\nC 57 ; WX 600 ; N nine ; B 93 -15 574 622 ;\nC 58 ; WX 600 ; N colon ; B 238 -15 441 385 ;\nC 59 ; WX 600 ; N semicolon ; B 157 -112 441 385 ;\nC 60 ; WX 600 ; N less ; B 96 42 610 472 ;\nC 61 ; WX 600 ; N equal ; B 109 138 600 376 ;\nC 62 ; WX 600 ; N greater ; B 85 42 599 472 ;\nC 63 ; WX 600 ; N question ; B 222 -15 583 572 ;\nC 64 ; WX 600 ; N at ; B 127 -15 582 622 ;\nC 65 ; WX 600 ; N A ; B 3 0 607 562 ;\nC 66 ; WX 600 ; N B ; B 43 0 616 562 ;\nC 67 ; WX 600 ; N C ; B 93 -18 655 580 ;\nC 68 ; WX 600 ; N D ; B 43 0 645 562 ;\nC 69 ; WX 600 ; N E ; B 53 0 660 562 ;\nC 70 ; WX 600 ; N F ; B 53 0 660 562 ;\nC 71 ; WX 600 ; N G ; B 83 -18 645 580 ;\nC 72 ; WX 600 ; N H ; B 32 0 687 562 ;\nC 73 ; WX 600 ; N I ; B 96 0 623 562 ;\nC 74 ; WX 600 ; N J ; B 52 -18 685 562 ;\nC 75 ; WX 600 ; N K ; B 38 0 671 562 ;\nC 76 ; WX 600 ; N L ; B 47 0 607 562 ;\nC 77 ; WX 600 ; N M ; B 4 0 715 562 ;\nC 78 ; WX 600 ; N N ; B 7 -13 712 562 ;\nC 79 ; WX 600 ; N O ; B 94 -18 625 580 ;\nC 80 ; WX 600 ; N P ; B 79 0 644 562 ;\nC 81 ; WX 600 ; N Q ; B 95 -138 625 580 ;\nC 82 ; WX 600 ; N R ; B 38 0 598 562 ;\nC 83 ; WX 600 ; N S ; B 76 -20 650 580 ;\nC 84 ; WX 600 ; N T ; B 108 0 665 562 ;\nC 85 ; WX 600 ; N U ; B 125 -18 702 562 ;\nC 86 ; WX 600 ; N V ; B 105 -13 723 562 ;\nC 87 ; WX 600 ; N W ; B 106 -13 722 562 ;\nC 88 ; WX 600 ; N X ; B 23 0 675 562 ;\nC 89 ; WX 600 ; N Y ; B 133 0 695 562 ;\nC 90 ; WX 600 ; N Z ; B 86 0 610 562 ;\nC 91 ; WX 600 ; N bracketleft ; B 246 -108 574 622 ;\nC 92 ; WX 600 ; N backslash ; B 249 -80 468 629 ;\nC 93 ; WX 600 ; N bracketright ; B 135 -108 463 622 ;\nC 94 ; WX 600 ; N asciicircum ; B 175 354 587 622 ;\nC 95 ; WX 600 ; N underscore ; B -27 -125 584 -75 ;\nC 96 ; WX 600 ; N quoteleft ; B 343 328 457 562 ;\nC 97 ; WX 600 ; N a ; B 76 -15 569 441 ;\nC 98 ; WX 600 ; N b ; B 29 -15 625 629 ;\nC 99 ; WX 600 ; N c ; B 106 -15 608 441 ;\nC 100 ; WX 600 ; N d ; B 85 -15 640 629 ;\nC 101 ; WX 600 ; N e ; B 106 -15 598 441 ;\nC 102 ; WX 600 ; N f ; B 114 0 662 629 ; L i fi ; L l fl ;\nC 103 ; WX 600 ; N g ; B 61 -157 657 441 ;\nC 104 ; WX 600 ; N h ; B 33 0 592 629 ;\nC 105 ; WX 600 ; N i ; B 95 0 515 657 ;\nC 106 ; WX 600 ; N j ; B 52 -157 550 657 ;\nC 107 ; WX 600 ; N k ; B 58 0 633 629 ;\nC 108 ; WX 600 ; N l ; B 95 0 515 629 ;\nC 109 ; WX 600 ; N m ; B -5 0 615 441 ;\nC 110 ; WX 600 ; N n ; B 26 0 585 441 ;\nC 111 ; WX 600 ; N o ; B 102 -15 588 441 ;\nC 112 ; WX 600 ; N p ; B -24 -157 605 441 ;\nC 113 ; WX 600 ; N q ; B 85 -157 682 441 ;\nC 114 ; WX 600 ; N r ; B 60 0 636 441 ;\nC 115 ; WX 600 ; N s ; B 78 -15 584 441 ;\nC 116 ; WX 600 ; N t ; B 167 -15 561 561 ;\nC 117 ; WX 600 ; N u ; B 101 -15 572 426 ;\nC 118 ; WX 600 ; N v ; B 90 -10 681 426 ;\nC 119 ; WX 600 ; N w ; B 76 -10 695 426 ;\nC 120 ; WX 600 ; N x ; B 20 0 655 426 ;\nC 121 ; WX 600 ; N y ; B -4 -157 683 426 ;\nC 122 ; WX 600 ; N z ; B 99 0 593 426 ;\nC 123 ; WX 600 ; N braceleft ; B 233 -108 569 622 ;\nC 124 ; WX 600 ; N bar ; B 222 -250 485 750 ;\nC 125 ; WX 600 ; N braceright ; B 140 -108 477 622 ;\nC 126 ; WX 600 ; N asciitilde ; B 116 197 600 320 ;\nC 161 ; WX 600 ; N exclamdown ; B 225 -157 445 430 ;\nC 162 ; WX 600 ; N cent ; B 151 -49 588 614 ;\nC 163 ; WX 600 ; N sterling ; B 124 -21 621 611 ;\nC 164 ; WX 600 ; N fraction ; B 84 -57 646 665 ;\nC 165 ; WX 600 ; N yen ; B 120 0 693 562 ;\nC 166 ; WX 600 ; N florin ; B -26 -143 671 622 ;\nC 167 ; WX 600 ; N section ; B 104 -78 590 580 ;\nC 168 ; WX 600 ; N currency ; B 94 58 628 506 ;\nC 169 ; WX 600 ; N quotesingle ; B 345 328 460 562 ;\nC 170 ; WX 600 ; N quotedblleft ; B 262 328 541 562 ;\nC 171 ; WX 600 ; N guillemotleft ; B 92 70 652 446 ;\nC 172 ; WX 600 ; N guilsinglleft ; B 204 70 540 446 ;\nC 173 ; WX 600 ; N guilsinglright ; B 170 70 506 446 ;\nC 174 ; WX 600 ; N fi ; B 3 0 619 629 ;\nC 175 ; WX 600 ; N fl ; B 3 0 619 629 ;\nC 177 ; WX 600 ; N endash ; B 124 231 586 285 ;\nC 178 ; WX 600 ; N dagger ; B 217 -78 546 580 ;\nC 179 ; WX 600 ; N daggerdbl ; B 163 -78 546 580 ;\nC 180 ; WX 600 ; N periodcentered ; B 275 189 434 327 ;\nC 182 ; WX 600 ; N paragraph ; B 100 -78 630 562 ;\nC 183 ; WX 600 ; N bullet ; B 224 130 485 383 ;\nC 184 ; WX 600 ; N quotesinglbase ; B 185 -134 397 100 ;\nC 185 ; WX 600 ; N quotedblbase ; B 115 -134 478 100 ;\nC 186 ; WX 600 ; N quotedblright ; B 213 328 576 562 ;\nC 187 ; WX 600 ; N guillemotright ; B 58 70 618 446 ;\nC 188 ; WX 600 ; N ellipsis ; B 46 -15 575 111 ;\nC 189 ; WX 600 ; N perthousand ; B 59 -15 627 622 ;\nC 191 ; WX 600 ; N questiondown ; B 105 -157 466 430 ;\nC 193 ; WX 600 ; N grave ; B 294 497 484 672 ;\nC 194 ; WX 600 ; N acute ; B 348 497 612 672 ;\nC 195 ; WX 600 ; N circumflex ; B 229 477 581 654 ;\nC 196 ; WX 600 ; N tilde ; B 212 489 629 606 ;\nC 197 ; WX 600 ; N macron ; B 232 525 600 565 ;\nC 198 ; WX 600 ; N breve ; B 279 501 576 609 ;\nC 199 ; WX 600 ; N dotaccent ; B 360 477 466 580 ;\nC 200 ; WX 600 ; N dieresis ; B 262 492 570 595 ;\nC 202 ; WX 600 ; N ring ; B 332 463 500 627 ;\nC 203 ; WX 600 ; N cedilla ; B 197 -151 344 10 ;\nC 205 ; WX 600 ; N hungarumlaut ; B 239 497 683 672 ;\nC 206 ; WX 600 ; N ogonek ; B 207 -151 348 0 ;\nC 207 ; WX 600 ; N caron ; B 262 492 614 669 ;\nC 208 ; WX 600 ; N emdash ; B 49 231 661 285 ;\nC 225 ; WX 600 ; N AE ; B 3 0 655 562 ;\nC 227 ; WX 600 ; N ordfeminine ; B 209 249 512 580 ;\nC 232 ; WX 600 ; N Lslash ; B 47 0 607 562 ;\nC 233 ; WX 600 ; N Oslash ; B 94 -80 625 629 ;\nC 234 ; WX 600 ; N OE ; B 59 0 672 562 ;\nC 235 ; WX 600 ; N ordmasculine ; B 210 249 535 580 ;\nC 241 ; WX 600 ; N ae ; B 41 -15 626 441 ;\nC 245 ; WX 600 ; N dotlessi ; B 95 0 515 426 ;\nC 248 ; WX 600 ; N lslash ; B 95 0 583 629 ;\nC 249 ; WX 600 ; N oslash ; B 102 -80 588 506 ;\nC 250 ; WX 600 ; N oe ; B 54 -15 615 441 ;\nC 251 ; WX 600 ; N germandbls ; B 48 -15 617 629 ;\nC -1 ; WX 600 ; N Odieresis ; B 94 -18 625 731 ;\nC -1 ; WX 600 ; N logicalnot ; B 155 108 591 369 ;\nC -1 ; WX 600 ; N minus ; B 129 232 580 283 ;\nC -1 ; WX 600 ; N merge ; B 187 -15 503 436 ;\nC -1 ; WX 600 ; N degree ; B 214 269 576 622 ;\nC -1 ; WX 600 ; N dectab ; B 18 0 593 227 ;\nC -1 ; WX 600 ; N ll ; B 33 0 616 629 ;\nC -1 ; WX 600 ; N IJ ; B 32 -18 702 562 ;\nC -1 ; WX 600 ; N Eacute ; B 53 0 668 793 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 94 -18 625 775 ;\nC -1 ; WX 600 ; N ucircumflex ; B 101 -15 572 654 ;\nC -1 ; WX 600 ; N left ; B 114 68 580 348 ;\nC -1 ; WX 600 ; N threesuperior ; B 213 240 501 622 ;\nC -1 ; WX 600 ; N up ; B 223 0 503 437 ;\nC -1 ; WX 600 ; N multiply ; B 103 43 607 470 ;\nC -1 ; WX 600 ; N Scaron ; B 76 -20 673 805 ;\nC -1 ; WX 600 ; N tab ; B 19 0 641 562 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 125 -18 702 775 ;\nC -1 ; WX 600 ; N divide ; B 136 48 573 467 ;\nC -1 ; WX 600 ; N Acircumflex ; B 3 0 607 775 ;\nC -1 ; WX 600 ; N eacute ; B 106 -15 612 672 ;\nC -1 ; WX 600 ; N uacute ; B 101 -15 602 672 ;\nC -1 ; WX 600 ; N Aacute ; B 3 0 658 793 ;\nC -1 ; WX 600 ; N copyright ; B 53 -18 667 580 ;\nC -1 ; WX 600 ; N twosuperior ; B 230 249 535 622 ;\nC -1 ; WX 600 ; N Ecircumflex ; B 53 0 660 775 ;\nC -1 ; WX 600 ; N ntilde ; B 26 0 629 606 ;\nC -1 ; WX 600 ; N down ; B 187 -15 467 426 ;\nC -1 ; WX 600 ; N center ; B 103 14 623 580 ;\nC -1 ; WX 600 ; N onesuperior ; B 231 249 491 622 ;\nC -1 ; WX 600 ; N ij ; B 37 -157 630 657 ;\nC -1 ; WX 600 ; N edieresis ; B 106 -15 598 595 ;\nC -1 ; WX 600 ; N graybox ; B 76 0 652 599 ;\nC -1 ; WX 600 ; N odieresis ; B 102 -15 588 595 ;\nC -1 ; WX 600 ; N Ograve ; B 94 -18 625 793 ;\nC -1 ; WX 600 ; N threequarters ; B 73 -56 659 666 ;\nC -1 ; WX 600 ; N plusminus ; B 96 44 594 558 ;\nC -1 ; WX 600 ; N prescription ; B 27 -15 617 562 ;\nC -1 ; WX 600 ; N eth ; B 102 -15 639 629 ;\nC -1 ; WX 600 ; N largebullet ; B 315 220 395 297 ;\nC -1 ; WX 600 ; N egrave ; B 106 -15 598 672 ;\nC -1 ; WX 600 ; N ccedilla ; B 106 -151 614 441 ;\nC -1 ; WX 600 ; N notegraphic ; B 143 -15 564 572 ;\nC -1 ; WX 600 ; N Udieresis ; B 125 -18 702 731 ;\nC -1 ; WX 600 ; N Gcaron ; B 83 -18 645 805 ;\nC -1 ; WX 600 ; N arrowdown ; B 152 -15 520 608 ;\nC -1 ; WX 600 ; N format ; B -28 -157 185 607 ;\nC -1 ; WX 600 ; N Otilde ; B 94 -18 656 732 ;\nC -1 ; WX 600 ; N Idieresis ; B 96 0 623 731 ;\nC -1 ; WX 600 ; N adieresis ; B 76 -15 570 595 ;\nC -1 ; WX 600 ; N ecircumflex ; B 106 -15 598 654 ;\nC -1 ; WX 600 ; N Eth ; B 43 0 645 562 ;\nC -1 ; WX 600 ; N onequarter ; B 65 -57 674 665 ;\nC -1 ; WX 600 ; N LL ; B 8 0 647 562 ;\nC -1 ; WX 600 ; N agrave ; B 76 -15 569 672 ;\nC -1 ; WX 600 ; N Zcaron ; B 86 0 643 805 ;\nC -1 ; WX 600 ; N Scedilla ; B 76 -151 650 580 ;\nC -1 ; WX 600 ; N Idot ; B 96 0 623 716 ;\nC -1 ; WX 600 ; N Iacute ; B 96 0 638 793 ;\nC -1 ; WX 600 ; N indent ; B 108 68 574 348 ;\nC -1 ; WX 600 ; N Ugrave ; B 125 -18 702 793 ;\nC -1 ; WX 600 ; N scaron ; B 78 -15 614 669 ;\nC -1 ; WX 600 ; N overscore ; B 123 579 734 629 ;\nC -1 ; WX 600 ; N Aring ; B 3 0 607 753 ;\nC -1 ; WX 600 ; N Ccedilla ; B 93 -151 658 580 ;\nC -1 ; WX 600 ; N Igrave ; B 96 0 623 793 ;\nC -1 ; WX 600 ; N brokenbar ; B 238 -175 469 675 ;\nC -1 ; WX 600 ; N Oacute ; B 94 -18 638 793 ;\nC -1 ; WX 600 ; N otilde ; B 102 -15 629 606 ;\nC -1 ; WX 600 ; N Yacute ; B 133 0 695 793 ;\nC -1 ; WX 600 ; N lira ; B 118 -21 621 611 ;\nC -1 ; WX 600 ; N Icircumflex ; B 96 0 623 775 ;\nC -1 ; WX 600 ; N Atilde ; B 3 0 656 732 ;\nC -1 ; WX 600 ; N Uacute ; B 125 -18 702 793 ;\nC -1 ; WX 600 ; N Ydieresis ; B 133 0 695 731 ;\nC -1 ; WX 600 ; N ydieresis ; B -4 -157 683 595 ;\nC -1 ; WX 600 ; N idieresis ; B 95 0 540 595 ;\nC -1 ; WX 600 ; N Adieresis ; B 3 0 607 731 ;\nC -1 ; WX 600 ; N mu ; B 72 -157 572 426 ;\nC -1 ; WX 600 ; N trademark ; B 75 263 742 562 ;\nC -1 ; WX 600 ; N oacute ; B 102 -15 612 672 ;\nC -1 ; WX 600 ; N acircumflex ; B 76 -15 581 654 ;\nC -1 ; WX 600 ; N Agrave ; B 3 0 607 793 ;\nC -1 ; WX 600 ; N return ; B 79 0 700 562 ;\nC -1 ; WX 600 ; N atilde ; B 76 -15 629 606 ;\nC -1 ; WX 600 ; N square ; B 19 0 700 562 ;\nC -1 ; WX 600 ; N registered ; B 53 -18 667 580 ;\nC -1 ; WX 600 ; N stop ; B 19 0 700 562 ;\nC -1 ; WX 600 ; N udieresis ; B 101 -15 572 595 ;\nC -1 ; WX 600 ; N arrowup ; B 209 0 577 623 ;\nC -1 ; WX 600 ; N igrave ; B 95 0 515 672 ;\nC -1 ; WX 600 ; N Edieresis ; B 53 0 660 731 ;\nC -1 ; WX 600 ; N zcaron ; B 99 0 624 669 ;\nC -1 ; WX 600 ; N arrowboth ; B 36 115 692 483 ;\nC -1 ; WX 600 ; N gcaron ; B 61 -157 657 669 ;\nC -1 ; WX 600 ; N arrowleft ; B 40 115 693 483 ;\nC -1 ; WX 600 ; N aacute ; B 76 -15 612 672 ;\nC -1 ; WX 600 ; N ocircumflex ; B 102 -15 588 654 ;\nC -1 ; WX 600 ; N scedilla ; B 78 -151 584 441 ;\nC -1 ; WX 600 ; N ograve ; B 102 -15 588 672 ;\nC -1 ; WX 600 ; N onehalf ; B 65 -57 669 665 ;\nC -1 ; WX 600 ; N ugrave ; B 101 -15 572 672 ;\nC -1 ; WX 600 ; N Ntilde ; B 7 -13 712 732 ;\nC -1 ; WX 600 ; N iacute ; B 95 0 612 672 ;\nC -1 ; WX 600 ; N arrowright ; B 34 115 688 483 ;\nC -1 ; WX 600 ; N Thorn ; B 79 0 606 562 ;\nC -1 ; WX 600 ; N Egrave ; B 53 0 660 793 ;\nC -1 ; WX 600 ; N thorn ; B -24 -157 605 629 ;\nC -1 ; WX 600 ; N aring ; B 76 -15 569 627 ;\nC -1 ; WX 600 ; N yacute ; B -4 -157 683 672 ;\nC -1 ; WX 600 ; N icircumflex ; B 95 0 551 654 ;\nEndCharMetrics\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 46 121 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex -4 121 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis -1 136 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave -4 121 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 12 126 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 27 126 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 56 121 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 26 121 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 29 136 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 26 121 ;\nCC Gcaron 2 ; PCC G 0 0 ; PCC caron 29 136 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 26 121 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 26 121 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 29 136 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 26 121 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 27 126 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 26 121 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 26 121 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 29 136 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 26 121 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 27 126 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 59 136 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 56 121 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 26 121 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 29 136 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave -4 121 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 56 121 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 29 136 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 29 136 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 0 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 0 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 0 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 0 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 0 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 0 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 0 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 0 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 0 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 0 0 ;\nCC gcaron 2 ; PCC g 0 0 ; PCC caron -30 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 0 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -30 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -30 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -30 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 0 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 0 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 0 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 0 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 0 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 0 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 0 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute -10 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex -10 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 0 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave -30 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute -20 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis -10 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 10 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/phvb8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu Mar 15 09:43:00 1990\nComment UniqueID 28357\nComment VMusage 26878 33770\nFontName Helvetica-Bold\nFullName Helvetica Bold\nFamilyName Helvetica\nWeight Bold\nItalicAngle 0\nIsFixedPitch false\nFontBBox -170 -228 1003 962\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.007\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.Helvetica is a trademark of Linotype AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 718\nXHeight 532\nAscender 718\nDescender -207\nStartCharMetrics 228\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 90 0 244 718 ;\nC 34 ; WX 474 ; N quotedbl ; B 98 447 376 718 ;\nC 35 ; WX 556 ; N numbersign ; B 18 0 538 698 ;\nC 36 ; WX 556 ; N dollar ; B 30 -115 523 775 ;\nC 37 ; WX 889 ; N percent ; B 28 -19 861 710 ;\nC 38 ; WX 722 ; N ampersand ; B 54 -19 701 718 ;\nC 39 ; WX 278 ; N quoteright ; B 69 445 209 718 ;\nC 40 ; WX 333 ; N parenleft ; B 35 -208 314 734 ;\nC 41 ; WX 333 ; N parenright ; B 19 -208 298 734 ;\nC 42 ; WX 389 ; N asterisk ; B 27 387 362 718 ;\nC 43 ; WX 584 ; N plus ; B 40 0 544 506 ;\nC 44 ; WX 278 ; N comma ; B 64 -168 214 146 ;\nC 45 ; WX 333 ; N hyphen ; B 27 215 306 345 ;\nC 46 ; WX 278 ; N period ; B 64 0 214 146 ;\nC 47 ; WX 278 ; N slash ; B -33 -19 311 737 ;\nC 48 ; WX 556 ; N zero ; B 32 -19 524 710 ;\nC 49 ; WX 556 ; N one ; B 69 0 378 710 ;\nC 50 ; WX 556 ; N two ; B 26 0 511 710 ;\nC 51 ; WX 556 ; N three ; B 27 -19 516 710 ;\nC 52 ; WX 556 ; N four ; B 27 0 526 710 ;\nC 53 ; WX 556 ; N five ; B 27 -19 516 698 ;\nC 54 ; WX 556 ; N six ; B 31 -19 520 710 ;\nC 55 ; WX 556 ; N seven ; B 25 0 528 698 ;\nC 56 ; WX 556 ; N eight ; B 32 -19 524 710 ;\nC 57 ; WX 556 ; N nine ; B 30 -19 522 710 ;\nC 58 ; WX 333 ; N colon ; B 92 0 242 512 ;\nC 59 ; WX 333 ; N semicolon ; B 92 -168 242 512 ;\nC 60 ; WX 584 ; N less ; B 38 -8 546 514 ;\nC 61 ; WX 584 ; N equal ; B 40 87 544 419 ;\nC 62 ; WX 584 ; N greater ; B 38 -8 546 514 ;\nC 63 ; WX 611 ; N question ; B 60 0 556 727 ;\nC 64 ; WX 975 ; N at ; B 118 -19 856 737 ;\nC 65 ; WX 722 ; N A ; B 20 0 702 718 ;\nC 66 ; WX 722 ; N B ; B 76 0 669 718 ;\nC 67 ; WX 722 ; N C ; B 44 -19 684 737 ;\nC 68 ; WX 722 ; N D ; B 76 0 685 718 ;\nC 69 ; WX 667 ; N E ; B 76 0 621 718 ;\nC 70 ; WX 611 ; N F ; B 76 0 587 718 ;\nC 71 ; WX 778 ; N G ; B 44 -19 713 737 ;\nC 72 ; WX 722 ; N H ; B 71 0 651 718 ;\nC 73 ; WX 278 ; N I ; B 64 0 214 718 ;\nC 74 ; WX 556 ; N J ; B 22 -18 484 718 ;\nC 75 ; WX 722 ; N K ; B 87 0 722 718 ;\nC 76 ; WX 611 ; N L ; B 76 0 583 718 ;\nC 77 ; WX 833 ; N M ; B 69 0 765 718 ;\nC 78 ; WX 722 ; N N ; B 69 0 654 718 ;\nC 79 ; WX 778 ; N O ; B 44 -19 734 737 ;\nC 80 ; WX 667 ; N P ; B 76 0 627 718 ;\nC 81 ; WX 778 ; N Q ; B 44 -52 737 737 ;\nC 82 ; WX 722 ; N R ; B 76 0 677 718 ;\nC 83 ; WX 667 ; N S ; B 39 -19 629 737 ;\nC 84 ; WX 611 ; N T ; B 14 0 598 718 ;\nC 85 ; WX 722 ; N U ; B 72 -19 651 718 ;\nC 86 ; WX 667 ; N V ; B 19 0 648 718 ;\nC 87 ; WX 944 ; N W ; B 16 0 929 718 ;\nC 88 ; WX 667 ; N X ; B 14 0 653 718 ;\nC 89 ; WX 667 ; N Y ; B 15 0 653 718 ;\nC 90 ; WX 611 ; N Z ; B 25 0 586 718 ;\nC 91 ; WX 333 ; N bracketleft ; B 63 -196 309 722 ;\nC 92 ; WX 278 ; N backslash ; B -33 -19 311 737 ;\nC 93 ; WX 333 ; N bracketright ; B 24 -196 270 722 ;\nC 94 ; WX 584 ; N asciicircum ; B 62 323 522 698 ;\nC 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ;\nC 96 ; WX 278 ; N quoteleft ; B 69 454 209 727 ;\nC 97 ; WX 556 ; N a ; B 29 -14 527 546 ;\nC 98 ; WX 611 ; N b ; B 61 -14 578 718 ;\nC 99 ; WX 556 ; N c ; B 34 -14 524 546 ;\nC 100 ; WX 611 ; N d ; B 34 -14 551 718 ;\nC 101 ; WX 556 ; N e ; B 23 -14 528 546 ;\nC 102 ; WX 333 ; N f ; B 10 0 318 727 ; L i fi ; L l fl ;\nC 103 ; WX 611 ; N g ; B 40 -217 553 546 ;\nC 104 ; WX 611 ; N h ; B 65 0 546 718 ;\nC 105 ; WX 278 ; N i ; B 69 0 209 725 ;\nC 106 ; WX 278 ; N j ; B 3 -214 209 725 ;\nC 107 ; WX 556 ; N k ; B 69 0 562 718 ;\nC 108 ; WX 278 ; N l ; B 69 0 209 718 ;\nC 109 ; WX 889 ; N m ; B 64 0 826 546 ;\nC 110 ; WX 611 ; N n ; B 65 0 546 546 ;\nC 111 ; WX 611 ; N o ; B 34 -14 578 546 ;\nC 112 ; WX 611 ; N p ; B 62 -207 578 546 ;\nC 113 ; WX 611 ; N q ; B 34 -207 552 546 ;\nC 114 ; WX 389 ; N r ; B 64 0 373 546 ;\nC 115 ; WX 556 ; N s ; B 30 -14 519 546 ;\nC 116 ; WX 333 ; N t ; B 10 -6 309 676 ;\nC 117 ; WX 611 ; N u ; B 66 -14 545 532 ;\nC 118 ; WX 556 ; N v ; B 13 0 543 532 ;\nC 119 ; WX 778 ; N w ; B 10 0 769 532 ;\nC 120 ; WX 556 ; N x ; B 15 0 541 532 ;\nC 121 ; WX 556 ; N y ; B 10 -214 539 532 ;\nC 122 ; WX 500 ; N z ; B 20 0 480 532 ;\nC 123 ; WX 389 ; N braceleft ; B 48 -196 365 722 ;\nC 124 ; WX 280 ; N bar ; B 84 -19 196 737 ;\nC 125 ; WX 389 ; N braceright ; B 24 -196 341 722 ;\nC 126 ; WX 584 ; N asciitilde ; B 61 163 523 343 ;\nC 161 ; WX 333 ; N exclamdown ; B 90 -186 244 532 ;\nC 162 ; WX 556 ; N cent ; B 34 -118 524 628 ;\nC 163 ; WX 556 ; N sterling ; B 28 -16 541 718 ;\nC 164 ; WX 167 ; N fraction ; B -170 -19 336 710 ;\nC 165 ; WX 556 ; N yen ; B -9 0 565 698 ;\nC 166 ; WX 556 ; N florin ; B -10 -210 516 737 ;\nC 167 ; WX 556 ; N section ; B 34 -184 522 727 ;\nC 168 ; WX 556 ; N currency ; B -3 76 559 636 ;\nC 169 ; WX 238 ; N quotesingle ; B 70 447 168 718 ;\nC 170 ; WX 500 ; N quotedblleft ; B 64 454 436 727 ;\nC 171 ; WX 556 ; N guillemotleft ; B 88 76 468 484 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 83 76 250 484 ;\nC 173 ; WX 333 ; N guilsinglright ; B 83 76 250 484 ;\nC 174 ; WX 611 ; N fi ; B 10 0 542 727 ;\nC 175 ; WX 611 ; N fl ; B 10 0 542 727 ;\nC 177 ; WX 556 ; N endash ; B 0 227 556 333 ;\nC 178 ; WX 556 ; N dagger ; B 36 -171 520 718 ;\nC 179 ; WX 556 ; N daggerdbl ; B 36 -171 520 718 ;\nC 180 ; WX 278 ; N periodcentered ; B 58 172 220 334 ;\nC 182 ; WX 556 ; N paragraph ; B -8 -191 539 700 ;\nC 183 ; WX 350 ; N bullet ; B 10 194 340 524 ;\nC 184 ; WX 278 ; N quotesinglbase ; B 69 -146 209 127 ;\nC 185 ; WX 500 ; N quotedblbase ; B 64 -146 436 127 ;\nC 186 ; WX 500 ; N quotedblright ; B 64 445 436 718 ;\nC 187 ; WX 556 ; N guillemotright ; B 88 76 468 484 ;\nC 188 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ;\nC 189 ; WX 1000 ; N perthousand ; B -3 -19 1003 710 ;\nC 191 ; WX 611 ; N questiondown ; B 55 -195 551 532 ;\nC 193 ; WX 333 ; N grave ; B -23 604 225 750 ;\nC 194 ; WX 333 ; N acute ; B 108 604 356 750 ;\nC 195 ; WX 333 ; N circumflex ; B -10 604 343 750 ;\nC 196 ; WX 333 ; N tilde ; B -17 610 350 737 ;\nC 197 ; WX 333 ; N macron ; B -6 604 339 678 ;\nC 198 ; WX 333 ; N breve ; B -2 604 335 750 ;\nC 199 ; WX 333 ; N dotaccent ; B 104 614 230 729 ;\nC 200 ; WX 333 ; N dieresis ; B 6 614 327 729 ;\nC 202 ; WX 333 ; N ring ; B 59 568 275 776 ;\nC 203 ; WX 333 ; N cedilla ; B 6 -228 245 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 9 604 486 750 ;\nC 206 ; WX 333 ; N ogonek ; B 71 -228 304 0 ;\nC 207 ; WX 333 ; N caron ; B -10 604 343 750 ;\nC 208 ; WX 1000 ; N emdash ; B 0 227 1000 333 ;\nC 225 ; WX 1000 ; N AE ; B 5 0 954 718 ;\nC 227 ; WX 370 ; N ordfeminine ; B 22 276 347 737 ;\nC 232 ; WX 611 ; N Lslash ; B -20 0 583 718 ;\nC 233 ; WX 778 ; N Oslash ; B 33 -27 744 745 ;\nC 234 ; WX 1000 ; N OE ; B 37 -19 961 737 ;\nC 235 ; WX 365 ; N ordmasculine ; B 6 276 360 737 ;\nC 241 ; WX 889 ; N ae ; B 29 -14 858 546 ;\nC 245 ; WX 278 ; N dotlessi ; B 69 0 209 532 ;\nC 248 ; WX 278 ; N lslash ; B -18 0 296 718 ;\nC 249 ; WX 611 ; N oslash ; B 22 -29 589 560 ;\nC 250 ; WX 944 ; N oe ; B 34 -14 912 546 ;\nC 251 ; WX 611 ; N germandbls ; B 69 -14 579 731 ;\nC -1 ; WX 611 ; N Zcaron ; B 25 0 586 936 ;\nC -1 ; WX 556 ; N ccedilla ; B 34 -228 524 546 ;\nC -1 ; WX 556 ; N ydieresis ; B 10 -214 539 729 ;\nC -1 ; WX 556 ; N atilde ; B 29 -14 527 737 ;\nC -1 ; WX 278 ; N icircumflex ; B -37 0 316 750 ;\nC -1 ; WX 333 ; N threesuperior ; B 8 271 326 710 ;\nC -1 ; WX 556 ; N ecircumflex ; B 23 -14 528 750 ;\nC -1 ; WX 611 ; N thorn ; B 62 -208 578 718 ;\nC -1 ; WX 556 ; N egrave ; B 23 -14 528 750 ;\nC -1 ; WX 333 ; N twosuperior ; B 9 283 324 710 ;\nC -1 ; WX 556 ; N eacute ; B 23 -14 528 750 ;\nC -1 ; WX 611 ; N otilde ; B 34 -14 578 737 ;\nC -1 ; WX 722 ; N Aacute ; B 20 0 702 936 ;\nC -1 ; WX 611 ; N ocircumflex ; B 34 -14 578 750 ;\nC -1 ; WX 556 ; N yacute ; B 10 -214 539 750 ;\nC -1 ; WX 611 ; N udieresis ; B 66 -14 545 729 ;\nC -1 ; WX 834 ; N threequarters ; B 16 -19 799 710 ;\nC -1 ; WX 556 ; N acircumflex ; B 29 -14 527 750 ;\nC -1 ; WX 722 ; N Eth ; B -5 0 685 718 ;\nC -1 ; WX 556 ; N edieresis ; B 23 -14 528 729 ;\nC -1 ; WX 611 ; N ugrave ; B 66 -14 545 750 ;\nC -1 ; WX 1000 ; N trademark ; B 44 306 956 718 ;\nC -1 ; WX 611 ; N ograve ; B 34 -14 578 750 ;\nC -1 ; WX 556 ; N scaron ; B 30 -14 519 750 ;\nC -1 ; WX 278 ; N Idieresis ; B -21 0 300 915 ;\nC -1 ; WX 611 ; N uacute ; B 66 -14 545 750 ;\nC -1 ; WX 556 ; N agrave ; B 29 -14 527 750 ;\nC -1 ; WX 611 ; N ntilde ; B 65 0 546 737 ;\nC -1 ; WX 556 ; N aring ; B 29 -14 527 776 ;\nC -1 ; WX 500 ; N zcaron ; B 20 0 480 750 ;\nC -1 ; WX 278 ; N Icircumflex ; B -37 0 316 936 ;\nC -1 ; WX 722 ; N Ntilde ; B 69 0 654 923 ;\nC -1 ; WX 611 ; N ucircumflex ; B 66 -14 545 750 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 76 0 621 936 ;\nC -1 ; WX 278 ; N Iacute ; B 64 0 329 936 ;\nC -1 ; WX 722 ; N Ccedilla ; B 44 -228 684 737 ;\nC -1 ; WX 778 ; N Odieresis ; B 44 -19 734 915 ;\nC -1 ; WX 667 ; N Scaron ; B 39 -19 629 936 ;\nC -1 ; WX 667 ; N Edieresis ; B 76 0 621 915 ;\nC -1 ; WX 278 ; N Igrave ; B -50 0 214 936 ;\nC -1 ; WX 556 ; N adieresis ; B 29 -14 527 729 ;\nC -1 ; WX 778 ; N Ograve ; B 44 -19 734 936 ;\nC -1 ; WX 667 ; N Egrave ; B 76 0 621 936 ;\nC -1 ; WX 667 ; N Ydieresis ; B 15 0 653 915 ;\nC -1 ; WX 737 ; N registered ; B -11 -19 748 737 ;\nC -1 ; WX 778 ; N Otilde ; B 44 -19 734 923 ;\nC -1 ; WX 834 ; N onequarter ; B 26 -19 766 710 ;\nC -1 ; WX 722 ; N Ugrave ; B 72 -19 651 936 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 72 -19 651 936 ;\nC -1 ; WX 667 ; N Thorn ; B 76 0 627 718 ;\nC -1 ; WX 584 ; N divide ; B 40 -42 544 548 ;\nC -1 ; WX 722 ; N Atilde ; B 20 0 702 923 ;\nC -1 ; WX 722 ; N Uacute ; B 72 -19 651 936 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 44 -19 734 936 ;\nC -1 ; WX 584 ; N logicalnot ; B 40 108 544 419 ;\nC -1 ; WX 722 ; N Aring ; B 20 0 702 962 ;\nC -1 ; WX 278 ; N idieresis ; B -21 0 300 729 ;\nC -1 ; WX 278 ; N iacute ; B 69 0 329 750 ;\nC -1 ; WX 556 ; N aacute ; B 29 -14 527 750 ;\nC -1 ; WX 584 ; N plusminus ; B 40 0 544 506 ;\nC -1 ; WX 584 ; N multiply ; B 40 1 545 505 ;\nC -1 ; WX 722 ; N Udieresis ; B 72 -19 651 915 ;\nC -1 ; WX 584 ; N minus ; B 40 197 544 309 ;\nC -1 ; WX 333 ; N onesuperior ; B 26 283 237 710 ;\nC -1 ; WX 667 ; N Eacute ; B 76 0 621 936 ;\nC -1 ; WX 722 ; N Acircumflex ; B 20 0 702 936 ;\nC -1 ; WX 737 ; N copyright ; B -11 -19 749 737 ;\nC -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ;\nC -1 ; WX 611 ; N odieresis ; B 34 -14 578 729 ;\nC -1 ; WX 611 ; N oacute ; B 34 -14 578 750 ;\nC -1 ; WX 400 ; N degree ; B 57 426 343 712 ;\nC -1 ; WX 278 ; N igrave ; B -50 0 209 750 ;\nC -1 ; WX 611 ; N mu ; B 66 -207 545 532 ;\nC -1 ; WX 778 ; N Oacute ; B 44 -19 734 936 ;\nC -1 ; WX 611 ; N eth ; B 34 -14 578 737 ;\nC -1 ; WX 722 ; N Adieresis ; B 20 0 702 915 ;\nC -1 ; WX 667 ; N Yacute ; B 15 0 653 936 ;\nC -1 ; WX 280 ; N brokenbar ; B 84 -19 196 737 ;\nC -1 ; WX 834 ; N onehalf ; B 26 -19 794 710 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 209\n\nKPX A y -30\nKPX A w -30\nKPX A v -40\nKPX A u -30\nKPX A Y -110\nKPX A W -60\nKPX A V -80\nKPX A U -50\nKPX A T -90\nKPX A Q -40\nKPX A O -40\nKPX A G -50\nKPX A C -40\n\nKPX B U -10\nKPX B A -30\n\nKPX D period -30\nKPX D comma -30\nKPX D Y -70\nKPX D W -40\nKPX D V -40\nKPX D A -40\n\nKPX F period -100\nKPX F comma -100\nKPX F a -20\nKPX F A -80\n\nKPX J u -20\nKPX J period -20\nKPX J comma -20\nKPX J A -20\n\nKPX K y -40\nKPX K u -30\nKPX K o -35\nKPX K e -15\nKPX K O -30\n\nKPX L y -30\nKPX L quoteright -140\nKPX L quotedblright -140\nKPX L Y -120\nKPX L W -80\nKPX L V -110\nKPX L T -90\n\nKPX O period -40\nKPX O comma -40\nKPX O Y -70\nKPX O X -50\nKPX O W -50\nKPX O V -50\nKPX O T -40\nKPX O A -50\n\nKPX P period -120\nKPX P o -40\nKPX P e -30\nKPX P comma -120\nKPX P a -30\nKPX P A -100\n\nKPX Q period 20\nKPX Q comma 20\nKPX Q U -10\n\nKPX R Y -50\nKPX R W -40\nKPX R V -50\nKPX R U -20\nKPX R T -20\nKPX R O -20\n\nKPX T y -60\nKPX T w -60\nKPX T u -90\nKPX T semicolon -40\nKPX T r -80\nKPX T period -80\nKPX T o -80\nKPX T hyphen -120\nKPX T e -60\nKPX T comma -80\nKPX T colon -40\nKPX T a -80\nKPX T O -40\nKPX T A -90\n\nKPX U period -30\nKPX U comma -30\nKPX U A -50\n\nKPX V u -60\nKPX V semicolon -40\nKPX V period -120\nKPX V o -90\nKPX V hyphen -80\nKPX V e -50\nKPX V comma -120\nKPX V colon -40\nKPX V a -60\nKPX V O -50\nKPX V G -50\nKPX V A -80\n\nKPX W y -20\nKPX W u -45\nKPX W semicolon -10\nKPX W period -80\nKPX W o -60\nKPX W hyphen -40\nKPX W e -35\nKPX W comma -80\nKPX W colon -10\nKPX W a -40\nKPX W O -20\nKPX W A -60\n\nKPX Y u -100\nKPX Y semicolon -50\nKPX Y period -100\nKPX Y o -100\nKPX Y e -80\nKPX Y comma -100\nKPX Y colon -50\nKPX Y a -90\nKPX Y O -70\nKPX Y A -110\n\nKPX a y -20\nKPX a w -15\nKPX a v -15\nKPX a g -10\n\nKPX b y -20\nKPX b v -20\nKPX b u -20\nKPX b l -10\n\nKPX c y -10\nKPX c l -20\nKPX c k -20\nKPX c h -10\n\nKPX colon space -40\n\nKPX comma space -40\nKPX comma quoteright -120\nKPX comma quotedblright -120\n\nKPX d y -15\nKPX d w -15\nKPX d v -15\nKPX d d -10\n\nKPX e y -15\nKPX e x -15\nKPX e w -15\nKPX e v -15\nKPX e period 20\nKPX e comma 10\n\nKPX f quoteright 30\nKPX f quotedblright 30\nKPX f period -10\nKPX f o -20\nKPX f e -10\nKPX f comma -10\n\nKPX g g -10\nKPX g e 10\n\nKPX h y -20\n\nKPX k o -15\n\nKPX l y -15\nKPX l w -15\n\nKPX m y -30\nKPX m u -20\n\nKPX n y -20\nKPX n v -40\nKPX n u -10\n\nKPX o y -20\nKPX o x -30\nKPX o w -15\nKPX o v -20\n\nKPX p y -15\n\nKPX period space -40\nKPX period quoteright -120\nKPX period quotedblright -120\n\nKPX quotedblright space -80\n\nKPX quoteleft quoteleft -46\n\nKPX quoteright v -20\nKPX quoteright space -80\nKPX quoteright s -60\nKPX quoteright r -40\nKPX quoteright quoteright -46\nKPX quoteright l -20\nKPX quoteright d -80\n\nKPX r y 10\nKPX r v 10\nKPX r t 20\nKPX r s -15\nKPX r q -20\nKPX r period -60\nKPX r o -20\nKPX r hyphen -20\nKPX r g -15\nKPX r d -20\nKPX r comma -60\nKPX r c -20\n\nKPX s w -15\n\nKPX semicolon space -40\n\nKPX space quoteleft -60\nKPX space quotedblleft -80\nKPX space Y -120\nKPX space W -80\nKPX space V -80\nKPX space T -100\n\nKPX v period -80\nKPX v o -30\nKPX v comma -80\nKPX v a -20\n\nKPX w period -40\nKPX w o -20\nKPX w comma -40\n\nKPX x e -10\n\nKPX y period -80\nKPX y o -25\nKPX y e -10\nKPX y comma -80\nKPX y a -30\n\nKPX z e 10\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 195 186 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 195 186 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 195 186 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 195 186 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 195 186 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 195 186 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 215 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 167 186 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 167 186 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 167 186 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 167 186 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute -27 186 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -27 186 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -27 186 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave -27 186 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 195 186 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 223 186 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 223 186 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 223 186 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 223 186 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 223 186 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 167 186 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 195 186 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 195 186 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 195 186 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 195 186 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 167 186 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 167 186 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 139 186 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 112 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 112 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 112 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 112 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 112 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 112 0 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 132 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 112 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 112 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 112 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 112 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -27 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 139 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 139 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 139 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 139 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 139 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 139 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 112 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 139 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 139 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 139 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 139 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 112 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 112 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 84 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/phvb8an.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu Mar 15 11:47:27 1990\nComment UniqueID 28398\nComment VMusage 7614 43068\nFontName Helvetica-Narrow-Bold\nFullName Helvetica Narrow Bold\nFamilyName Helvetica\nWeight Bold\nItalicAngle 0\nIsFixedPitch false\nFontBBox -139 -228 822 962\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.007\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.Helvetica is a trademark of Linotype AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 718\nXHeight 532\nAscender 718\nDescender -207\nStartCharMetrics 228\nC 32 ; WX 228 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 273 ; N exclam ; B 74 0 200 718 ;\nC 34 ; WX 389 ; N quotedbl ; B 80 447 308 718 ;\nC 35 ; WX 456 ; N numbersign ; B 15 0 441 698 ;\nC 36 ; WX 456 ; N dollar ; B 25 -115 429 775 ;\nC 37 ; WX 729 ; N percent ; B 23 -19 706 710 ;\nC 38 ; WX 592 ; N ampersand ; B 44 -19 575 718 ;\nC 39 ; WX 228 ; N quoteright ; B 57 445 171 718 ;\nC 40 ; WX 273 ; N parenleft ; B 29 -208 257 734 ;\nC 41 ; WX 273 ; N parenright ; B 16 -208 244 734 ;\nC 42 ; WX 319 ; N asterisk ; B 22 387 297 718 ;\nC 43 ; WX 479 ; N plus ; B 33 0 446 506 ;\nC 44 ; WX 228 ; N comma ; B 52 -168 175 146 ;\nC 45 ; WX 273 ; N hyphen ; B 22 215 251 345 ;\nC 46 ; WX 228 ; N period ; B 52 0 175 146 ;\nC 47 ; WX 228 ; N slash ; B -27 -19 255 737 ;\nC 48 ; WX 456 ; N zero ; B 26 -19 430 710 ;\nC 49 ; WX 456 ; N one ; B 57 0 310 710 ;\nC 50 ; WX 456 ; N two ; B 21 0 419 710 ;\nC 51 ; WX 456 ; N three ; B 22 -19 423 710 ;\nC 52 ; WX 456 ; N four ; B 22 0 431 710 ;\nC 53 ; WX 456 ; N five ; B 22 -19 423 698 ;\nC 54 ; WX 456 ; N six ; B 25 -19 426 710 ;\nC 55 ; WX 456 ; N seven ; B 20 0 433 698 ;\nC 56 ; WX 456 ; N eight ; B 26 -19 430 710 ;\nC 57 ; WX 456 ; N nine ; B 25 -19 428 710 ;\nC 58 ; WX 273 ; N colon ; B 75 0 198 512 ;\nC 59 ; WX 273 ; N semicolon ; B 75 -168 198 512 ;\nC 60 ; WX 479 ; N less ; B 31 -8 448 514 ;\nC 61 ; WX 479 ; N equal ; B 33 87 446 419 ;\nC 62 ; WX 479 ; N greater ; B 31 -8 448 514 ;\nC 63 ; WX 501 ; N question ; B 49 0 456 727 ;\nC 64 ; WX 800 ; N at ; B 97 -19 702 737 ;\nC 65 ; WX 592 ; N A ; B 16 0 576 718 ;\nC 66 ; WX 592 ; N B ; B 62 0 549 718 ;\nC 67 ; WX 592 ; N C ; B 36 -19 561 737 ;\nC 68 ; WX 592 ; N D ; B 62 0 562 718 ;\nC 69 ; WX 547 ; N E ; B 62 0 509 718 ;\nC 70 ; WX 501 ; N F ; B 62 0 481 718 ;\nC 71 ; WX 638 ; N G ; B 36 -19 585 737 ;\nC 72 ; WX 592 ; N H ; B 58 0 534 718 ;\nC 73 ; WX 228 ; N I ; B 52 0 175 718 ;\nC 74 ; WX 456 ; N J ; B 18 -18 397 718 ;\nC 75 ; WX 592 ; N K ; B 71 0 592 718 ;\nC 76 ; WX 501 ; N L ; B 62 0 478 718 ;\nC 77 ; WX 683 ; N M ; B 57 0 627 718 ;\nC 78 ; WX 592 ; N N ; B 57 0 536 718 ;\nC 79 ; WX 638 ; N O ; B 36 -19 602 737 ;\nC 80 ; WX 547 ; N P ; B 62 0 514 718 ;\nC 81 ; WX 638 ; N Q ; B 36 -52 604 737 ;\nC 82 ; WX 592 ; N R ; B 62 0 555 718 ;\nC 83 ; WX 547 ; N S ; B 32 -19 516 737 ;\nC 84 ; WX 501 ; N T ; B 11 0 490 718 ;\nC 85 ; WX 592 ; N U ; B 59 -19 534 718 ;\nC 86 ; WX 547 ; N V ; B 16 0 531 718 ;\nC 87 ; WX 774 ; N W ; B 13 0 762 718 ;\nC 88 ; WX 547 ; N X ; B 11 0 535 718 ;\nC 89 ; WX 547 ; N Y ; B 12 0 535 718 ;\nC 90 ; WX 501 ; N Z ; B 20 0 481 718 ;\nC 91 ; WX 273 ; N bracketleft ; B 52 -196 253 722 ;\nC 92 ; WX 228 ; N backslash ; B -27 -19 255 737 ;\nC 93 ; WX 273 ; N bracketright ; B 20 -196 221 722 ;\nC 94 ; WX 479 ; N asciicircum ; B 51 323 428 698 ;\nC 95 ; WX 456 ; N underscore ; B 0 -125 456 -75 ;\nC 96 ; WX 228 ; N quoteleft ; B 57 454 171 727 ;\nC 97 ; WX 456 ; N a ; B 24 -14 432 546 ;\nC 98 ; WX 501 ; N b ; B 50 -14 474 718 ;\nC 99 ; WX 456 ; N c ; B 28 -14 430 546 ;\nC 100 ; WX 501 ; N d ; B 28 -14 452 718 ;\nC 101 ; WX 456 ; N e ; B 19 -14 433 546 ;\nC 102 ; WX 273 ; N f ; B 8 0 261 727 ; L i fi ; L l fl ;\nC 103 ; WX 501 ; N g ; B 33 -217 453 546 ;\nC 104 ; WX 501 ; N h ; B 53 0 448 718 ;\nC 105 ; WX 228 ; N i ; B 57 0 171 725 ;\nC 106 ; WX 228 ; N j ; B 2 -214 171 725 ;\nC 107 ; WX 456 ; N k ; B 57 0 461 718 ;\nC 108 ; WX 228 ; N l ; B 57 0 171 718 ;\nC 109 ; WX 729 ; N m ; B 52 0 677 546 ;\nC 110 ; WX 501 ; N n ; B 53 0 448 546 ;\nC 111 ; WX 501 ; N o ; B 28 -14 474 546 ;\nC 112 ; WX 501 ; N p ; B 51 -207 474 546 ;\nC 113 ; WX 501 ; N q ; B 28 -207 453 546 ;\nC 114 ; WX 319 ; N r ; B 52 0 306 546 ;\nC 115 ; WX 456 ; N s ; B 25 -14 426 546 ;\nC 116 ; WX 273 ; N t ; B 8 -6 253 676 ;\nC 117 ; WX 501 ; N u ; B 54 -14 447 532 ;\nC 118 ; WX 456 ; N v ; B 11 0 445 532 ;\nC 119 ; WX 638 ; N w ; B 8 0 631 532 ;\nC 120 ; WX 456 ; N x ; B 12 0 444 532 ;\nC 121 ; WX 456 ; N y ; B 8 -214 442 532 ;\nC 122 ; WX 410 ; N z ; B 16 0 394 532 ;\nC 123 ; WX 319 ; N braceleft ; B 39 -196 299 722 ;\nC 124 ; WX 230 ; N bar ; B 69 -19 161 737 ;\nC 125 ; WX 319 ; N braceright ; B 20 -196 280 722 ;\nC 126 ; WX 479 ; N asciitilde ; B 50 163 429 343 ;\nC 161 ; WX 273 ; N exclamdown ; B 74 -186 200 532 ;\nC 162 ; WX 456 ; N cent ; B 28 -118 430 628 ;\nC 163 ; WX 456 ; N sterling ; B 23 -16 444 718 ;\nC 164 ; WX 137 ; N fraction ; B -139 -19 276 710 ;\nC 165 ; WX 456 ; N yen ; B -7 0 463 698 ;\nC 166 ; WX 456 ; N florin ; B -8 -210 423 737 ;\nC 167 ; WX 456 ; N section ; B 28 -184 428 727 ;\nC 168 ; WX 456 ; N currency ; B -2 76 458 636 ;\nC 169 ; WX 195 ; N quotesingle ; B 57 447 138 718 ;\nC 170 ; WX 410 ; N quotedblleft ; B 52 454 358 727 ;\nC 171 ; WX 456 ; N guillemotleft ; B 72 76 384 484 ;\nC 172 ; WX 273 ; N guilsinglleft ; B 68 76 205 484 ;\nC 173 ; WX 273 ; N guilsinglright ; B 68 76 205 484 ;\nC 174 ; WX 501 ; N fi ; B 8 0 444 727 ;\nC 175 ; WX 501 ; N fl ; B 8 0 444 727 ;\nC 177 ; WX 456 ; N endash ; B 0 227 456 333 ;\nC 178 ; WX 456 ; N dagger ; B 30 -171 426 718 ;\nC 179 ; WX 456 ; N daggerdbl ; B 30 -171 426 718 ;\nC 180 ; WX 228 ; N periodcentered ; B 48 172 180 334 ;\nC 182 ; WX 456 ; N paragraph ; B -7 -191 442 700 ;\nC 183 ; WX 287 ; N bullet ; B 8 194 279 524 ;\nC 184 ; WX 228 ; N quotesinglbase ; B 57 -146 171 127 ;\nC 185 ; WX 410 ; N quotedblbase ; B 52 -146 358 127 ;\nC 186 ; WX 410 ; N quotedblright ; B 52 445 358 718 ;\nC 187 ; WX 456 ; N guillemotright ; B 72 76 384 484 ;\nC 188 ; WX 820 ; N ellipsis ; B 75 0 745 146 ;\nC 189 ; WX 820 ; N perthousand ; B -2 -19 822 710 ;\nC 191 ; WX 501 ; N questiondown ; B 45 -195 452 532 ;\nC 193 ; WX 273 ; N grave ; B -19 604 184 750 ;\nC 194 ; WX 273 ; N acute ; B 89 604 292 750 ;\nC 195 ; WX 273 ; N circumflex ; B -8 604 281 750 ;\nC 196 ; WX 273 ; N tilde ; B -14 610 287 737 ;\nC 197 ; WX 273 ; N macron ; B -5 604 278 678 ;\nC 198 ; WX 273 ; N breve ; B -2 604 275 750 ;\nC 199 ; WX 273 ; N dotaccent ; B 85 614 189 729 ;\nC 200 ; WX 273 ; N dieresis ; B 5 614 268 729 ;\nC 202 ; WX 273 ; N ring ; B 48 568 225 776 ;\nC 203 ; WX 273 ; N cedilla ; B 5 -228 201 0 ;\nC 205 ; WX 273 ; N hungarumlaut ; B 7 604 399 750 ;\nC 206 ; WX 273 ; N ogonek ; B 58 -228 249 0 ;\nC 207 ; WX 273 ; N caron ; B -8 604 281 750 ;\nC 208 ; WX 820 ; N emdash ; B 0 227 820 333 ;\nC 225 ; WX 820 ; N AE ; B 4 0 782 718 ;\nC 227 ; WX 303 ; N ordfeminine ; B 18 276 285 737 ;\nC 232 ; WX 501 ; N Lslash ; B -16 0 478 718 ;\nC 233 ; WX 638 ; N Oslash ; B 27 -27 610 745 ;\nC 234 ; WX 820 ; N OE ; B 30 -19 788 737 ;\nC 235 ; WX 299 ; N ordmasculine ; B 5 276 295 737 ;\nC 241 ; WX 729 ; N ae ; B 24 -14 704 546 ;\nC 245 ; WX 228 ; N dotlessi ; B 57 0 171 532 ;\nC 248 ; WX 228 ; N lslash ; B -15 0 243 718 ;\nC 249 ; WX 501 ; N oslash ; B 18 -29 483 560 ;\nC 250 ; WX 774 ; N oe ; B 28 -14 748 546 ;\nC 251 ; WX 501 ; N germandbls ; B 57 -14 475 731 ;\nC -1 ; WX 501 ; N Zcaron ; B 20 0 481 936 ;\nC -1 ; WX 456 ; N ccedilla ; B 28 -228 430 546 ;\nC -1 ; WX 456 ; N ydieresis ; B 8 -214 442 729 ;\nC -1 ; WX 456 ; N atilde ; B 24 -14 432 737 ;\nC -1 ; WX 228 ; N icircumflex ; B -30 0 259 750 ;\nC -1 ; WX 273 ; N threesuperior ; B 7 271 267 710 ;\nC -1 ; WX 456 ; N ecircumflex ; B 19 -14 433 750 ;\nC -1 ; WX 501 ; N thorn ; B 51 -208 474 718 ;\nC -1 ; WX 456 ; N egrave ; B 19 -14 433 750 ;\nC -1 ; WX 273 ; N twosuperior ; B 7 283 266 710 ;\nC -1 ; WX 456 ; N eacute ; B 19 -14 433 750 ;\nC -1 ; WX 501 ; N otilde ; B 28 -14 474 737 ;\nC -1 ; WX 592 ; N Aacute ; B 16 0 576 936 ;\nC -1 ; WX 501 ; N ocircumflex ; B 28 -14 474 750 ;\nC -1 ; WX 456 ; N yacute ; B 8 -214 442 750 ;\nC -1 ; WX 501 ; N udieresis ; B 54 -14 447 729 ;\nC -1 ; WX 684 ; N threequarters ; B 13 -19 655 710 ;\nC -1 ; WX 456 ; N acircumflex ; B 24 -14 432 750 ;\nC -1 ; WX 592 ; N Eth ; B -4 0 562 718 ;\nC -1 ; WX 456 ; N edieresis ; B 19 -14 433 729 ;\nC -1 ; WX 501 ; N ugrave ; B 54 -14 447 750 ;\nC -1 ; WX 820 ; N trademark ; B 36 306 784 718 ;\nC -1 ; WX 501 ; N ograve ; B 28 -14 474 750 ;\nC -1 ; WX 456 ; N scaron ; B 25 -14 426 750 ;\nC -1 ; WX 228 ; N Idieresis ; B -17 0 246 915 ;\nC -1 ; WX 501 ; N uacute ; B 54 -14 447 750 ;\nC -1 ; WX 456 ; N agrave ; B 24 -14 432 750 ;\nC -1 ; WX 501 ; N ntilde ; B 53 0 448 737 ;\nC -1 ; WX 456 ; N aring ; B 24 -14 432 776 ;\nC -1 ; WX 410 ; N zcaron ; B 16 0 394 750 ;\nC -1 ; WX 228 ; N Icircumflex ; B -30 0 259 936 ;\nC -1 ; WX 592 ; N Ntilde ; B 57 0 536 923 ;\nC -1 ; WX 501 ; N ucircumflex ; B 54 -14 447 750 ;\nC -1 ; WX 547 ; N Ecircumflex ; B 62 0 509 936 ;\nC -1 ; WX 228 ; N Iacute ; B 52 0 270 936 ;\nC -1 ; WX 592 ; N Ccedilla ; B 36 -228 561 737 ;\nC -1 ; WX 638 ; N Odieresis ; B 36 -19 602 915 ;\nC -1 ; WX 547 ; N Scaron ; B 32 -19 516 936 ;\nC -1 ; WX 547 ; N Edieresis ; B 62 0 509 915 ;\nC -1 ; WX 228 ; N Igrave ; B -41 0 175 936 ;\nC -1 ; WX 456 ; N adieresis ; B 24 -14 432 729 ;\nC -1 ; WX 638 ; N Ograve ; B 36 -19 602 936 ;\nC -1 ; WX 547 ; N Egrave ; B 62 0 509 936 ;\nC -1 ; WX 547 ; N Ydieresis ; B 12 0 535 915 ;\nC -1 ; WX 604 ; N registered ; B -9 -19 613 737 ;\nC -1 ; WX 638 ; N Otilde ; B 36 -19 602 923 ;\nC -1 ; WX 684 ; N onequarter ; B 21 -19 628 710 ;\nC -1 ; WX 592 ; N Ugrave ; B 59 -19 534 936 ;\nC -1 ; WX 592 ; N Ucircumflex ; B 59 -19 534 936 ;\nC -1 ; WX 547 ; N Thorn ; B 62 0 514 718 ;\nC -1 ; WX 479 ; N divide ; B 33 -42 446 548 ;\nC -1 ; WX 592 ; N Atilde ; B 16 0 576 923 ;\nC -1 ; WX 592 ; N Uacute ; B 59 -19 534 936 ;\nC -1 ; WX 638 ; N Ocircumflex ; B 36 -19 602 936 ;\nC -1 ; WX 479 ; N logicalnot ; B 33 108 446 419 ;\nC -1 ; WX 592 ; N Aring ; B 16 0 576 962 ;\nC -1 ; WX 228 ; N idieresis ; B -17 0 246 729 ;\nC -1 ; WX 228 ; N iacute ; B 57 0 270 750 ;\nC -1 ; WX 456 ; N aacute ; B 24 -14 432 750 ;\nC -1 ; WX 479 ; N plusminus ; B 33 0 446 506 ;\nC -1 ; WX 479 ; N multiply ; B 33 1 447 505 ;\nC -1 ; WX 592 ; N Udieresis ; B 59 -19 534 915 ;\nC -1 ; WX 479 ; N minus ; B 33 197 446 309 ;\nC -1 ; WX 273 ; N onesuperior ; B 21 283 194 710 ;\nC -1 ; WX 547 ; N Eacute ; B 62 0 509 936 ;\nC -1 ; WX 592 ; N Acircumflex ; B 16 0 576 936 ;\nC -1 ; WX 604 ; N copyright ; B -9 -19 614 737 ;\nC -1 ; WX 592 ; N Agrave ; B 16 0 576 936 ;\nC -1 ; WX 501 ; N odieresis ; B 28 -14 474 729 ;\nC -1 ; WX 501 ; N oacute ; B 28 -14 474 750 ;\nC -1 ; WX 328 ; N degree ; B 47 426 281 712 ;\nC -1 ; WX 228 ; N igrave ; B -41 0 171 750 ;\nC -1 ; WX 501 ; N mu ; B 54 -207 447 532 ;\nC -1 ; WX 638 ; N Oacute ; B 36 -19 602 936 ;\nC -1 ; WX 501 ; N eth ; B 28 -14 474 737 ;\nC -1 ; WX 592 ; N Adieresis ; B 16 0 576 915 ;\nC -1 ; WX 547 ; N Yacute ; B 12 0 535 936 ;\nC -1 ; WX 230 ; N brokenbar ; B 69 -19 161 737 ;\nC -1 ; WX 684 ; N onehalf ; B 21 -19 651 710 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 209\n\nKPX A y -24\nKPX A w -24\nKPX A v -32\nKPX A u -24\nKPX A Y -89\nKPX A W -48\nKPX A V -65\nKPX A U -40\nKPX A T -73\nKPX A Q -32\nKPX A O -32\nKPX A G -40\nKPX A C -32\n\nKPX B U -7\nKPX B A -24\n\nKPX D period -24\nKPX D comma -24\nKPX D Y -56\nKPX D W -32\nKPX D V -32\nKPX D A -32\n\nKPX F period -81\nKPX F comma -81\nKPX F a -15\nKPX F A -65\n\nKPX J u -15\nKPX J period -15\nKPX J comma -15\nKPX J A -15\n\nKPX K y -32\nKPX K u -24\nKPX K o -28\nKPX K e -11\nKPX K O -24\n\nKPX L y -24\nKPX L quoteright -114\nKPX L quotedblright -114\nKPX L Y -97\nKPX L W -65\nKPX L V -89\nKPX L T -73\n\nKPX O period -32\nKPX O comma -32\nKPX O Y -56\nKPX O X -40\nKPX O W -40\nKPX O V -40\nKPX O T -32\nKPX O A -40\n\nKPX P period -97\nKPX P o -32\nKPX P e -24\nKPX P comma -97\nKPX P a -24\nKPX P A -81\n\nKPX Q period 16\nKPX Q comma 16\nKPX Q U -7\n\nKPX R Y -40\nKPX R W -32\nKPX R V -40\nKPX R U -15\nKPX R T -15\nKPX R O -15\n\nKPX T y -48\nKPX T w -48\nKPX T u -73\nKPX T semicolon -32\nKPX T r -65\nKPX T period -65\nKPX T o -65\nKPX T hyphen -97\nKPX T e -48\nKPX T comma -65\nKPX T colon -32\nKPX T a -65\nKPX T O -32\nKPX T A -73\n\nKPX U period -24\nKPX U comma -24\nKPX U A -40\n\nKPX V u -48\nKPX V semicolon -32\nKPX V period -97\nKPX V o -73\nKPX V hyphen -65\nKPX V e -40\nKPX V comma -97\nKPX V colon -32\nKPX V a -48\nKPX V O -40\nKPX V G -40\nKPX V A -65\n\nKPX W y -15\nKPX W u -36\nKPX W semicolon -7\nKPX W period -65\nKPX W o -48\nKPX W hyphen -32\nKPX W e -28\nKPX W comma -65\nKPX W colon -7\nKPX W a -32\nKPX W O -15\nKPX W A -48\n\nKPX Y u -81\nKPX Y semicolon -40\nKPX Y period -81\nKPX Y o -81\nKPX Y e -65\nKPX Y comma -81\nKPX Y colon -40\nKPX Y a -73\nKPX Y O -56\nKPX Y A -89\n\nKPX a y -15\nKPX a w -11\nKPX a v -11\nKPX a g -7\n\nKPX b y -15\nKPX b v -15\nKPX b u -15\nKPX b l -7\n\nKPX c y -7\nKPX c l -15\nKPX c k -15\nKPX c h -7\n\nKPX colon space -32\n\nKPX comma space -32\nKPX comma quoteright -97\nKPX comma quotedblright -97\n\nKPX d y -11\nKPX d w -11\nKPX d v -11\nKPX d d -7\n\nKPX e y -11\nKPX e x -11\nKPX e w -11\nKPX e v -11\nKPX e period 16\nKPX e comma 8\n\nKPX f quoteright 25\nKPX f quotedblright 25\nKPX f period -7\nKPX f o -15\nKPX f e -7\nKPX f comma -7\n\nKPX g g -7\nKPX g e 8\n\nKPX h y -15\n\nKPX k o -11\n\nKPX l y -11\nKPX l w -11\n\nKPX m y -24\nKPX m u -15\n\nKPX n y -15\nKPX n v -32\nKPX n u -7\n\nKPX o y -15\nKPX o x -24\nKPX o w -11\nKPX o v -15\n\nKPX p y -11\n\nKPX period space -32\nKPX period quoteright -97\nKPX period quotedblright -97\n\nKPX quotedblright space -65\n\nKPX quoteleft quoteleft -37\n\nKPX quoteright v -15\nKPX quoteright space -65\nKPX quoteright s -48\nKPX quoteright r -32\nKPX quoteright quoteright -37\nKPX quoteright l -15\nKPX quoteright d -65\n\nKPX r y 8\nKPX r v 8\nKPX r t 16\nKPX r s -11\nKPX r q -15\nKPX r period -48\nKPX r o -15\nKPX r hyphen -15\nKPX r g -11\nKPX r d -15\nKPX r comma -48\nKPX r c -15\n\nKPX s w -11\n\nKPX semicolon space -32\n\nKPX space quoteleft -48\nKPX space quotedblleft -65\nKPX space Y -97\nKPX space W -65\nKPX space V -65\nKPX space T -81\n\nKPX v period -65\nKPX v o -24\nKPX v comma -65\nKPX v a -15\n\nKPX w period -32\nKPX w o -15\nKPX w comma -32\n\nKPX x e -7\n\nKPX y period -65\nKPX y o -20\nKPX y e -7\nKPX y comma -65\nKPX y a -24\n\nKPX z e 8\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 160 186 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 160 186 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 160 186 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 160 186 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 160 186 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 160 186 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 176 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 137 186 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 137 186 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 137 186 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 137 186 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute -22 186 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -22 186 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -22 186 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave -22 186 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 160 186 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 183 186 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 183 186 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 183 186 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 183 186 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 183 186 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 137 186 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 160 186 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 160 186 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 160 186 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 160 186 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 137 186 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 137 186 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 114 186 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 92 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 92 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 92 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 92 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 92 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 92 0 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 108 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 92 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 92 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 92 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 92 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -22 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -22 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -22 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -22 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 114 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 114 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 114 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 114 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 114 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 114 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 92 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 114 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 114 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 114 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 114 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 92 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 92 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 69 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/phvbo8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu Mar 15 10:44:33 1990\nComment UniqueID 28371\nComment VMusage 7614 43068\nFontName Helvetica-BoldOblique\nFullName Helvetica Bold Oblique\nFamilyName Helvetica\nWeight Bold\nItalicAngle -12\nIsFixedPitch false\nFontBBox -174 -228 1114 962\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.007\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.Helvetica is a trademark of Linotype AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 718\nXHeight 532\nAscender 718\nDescender -207\nStartCharMetrics 228\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 94 0 397 718 ;\nC 34 ; WX 474 ; N quotedbl ; B 193 447 529 718 ;\nC 35 ; WX 556 ; N numbersign ; B 60 0 644 698 ;\nC 36 ; WX 556 ; N dollar ; B 67 -115 622 775 ;\nC 37 ; WX 889 ; N percent ; B 136 -19 901 710 ;\nC 38 ; WX 722 ; N ampersand ; B 89 -19 732 718 ;\nC 39 ; WX 278 ; N quoteright ; B 167 445 362 718 ;\nC 40 ; WX 333 ; N parenleft ; B 76 -208 470 734 ;\nC 41 ; WX 333 ; N parenright ; B -25 -208 369 734 ;\nC 42 ; WX 389 ; N asterisk ; B 146 387 481 718 ;\nC 43 ; WX 584 ; N plus ; B 82 0 610 506 ;\nC 44 ; WX 278 ; N comma ; B 28 -168 245 146 ;\nC 45 ; WX 333 ; N hyphen ; B 73 215 379 345 ;\nC 46 ; WX 278 ; N period ; B 64 0 245 146 ;\nC 47 ; WX 278 ; N slash ; B -37 -19 468 737 ;\nC 48 ; WX 556 ; N zero ; B 86 -19 617 710 ;\nC 49 ; WX 556 ; N one ; B 173 0 529 710 ;\nC 50 ; WX 556 ; N two ; B 26 0 619 710 ;\nC 51 ; WX 556 ; N three ; B 65 -19 608 710 ;\nC 52 ; WX 556 ; N four ; B 60 0 598 710 ;\nC 53 ; WX 556 ; N five ; B 64 -19 636 698 ;\nC 54 ; WX 556 ; N six ; B 85 -19 619 710 ;\nC 55 ; WX 556 ; N seven ; B 125 0 676 698 ;\nC 56 ; WX 556 ; N eight ; B 69 -19 616 710 ;\nC 57 ; WX 556 ; N nine ; B 78 -19 615 710 ;\nC 58 ; WX 333 ; N colon ; B 92 0 351 512 ;\nC 59 ; WX 333 ; N semicolon ; B 56 -168 351 512 ;\nC 60 ; WX 584 ; N less ; B 82 -8 655 514 ;\nC 61 ; WX 584 ; N equal ; B 58 87 633 419 ;\nC 62 ; WX 584 ; N greater ; B 36 -8 609 514 ;\nC 63 ; WX 611 ; N question ; B 165 0 671 727 ;\nC 64 ; WX 975 ; N at ; B 186 -19 954 737 ;\nC 65 ; WX 722 ; N A ; B 20 0 702 718 ;\nC 66 ; WX 722 ; N B ; B 76 0 764 718 ;\nC 67 ; WX 722 ; N C ; B 107 -19 789 737 ;\nC 68 ; WX 722 ; N D ; B 76 0 777 718 ;\nC 69 ; WX 667 ; N E ; B 76 0 757 718 ;\nC 70 ; WX 611 ; N F ; B 76 0 740 718 ;\nC 71 ; WX 778 ; N G ; B 108 -19 817 737 ;\nC 72 ; WX 722 ; N H ; B 71 0 804 718 ;\nC 73 ; WX 278 ; N I ; B 64 0 367 718 ;\nC 74 ; WX 556 ; N J ; B 60 -18 637 718 ;\nC 75 ; WX 722 ; N K ; B 87 0 858 718 ;\nC 76 ; WX 611 ; N L ; B 76 0 611 718 ;\nC 77 ; WX 833 ; N M ; B 69 0 918 718 ;\nC 78 ; WX 722 ; N N ; B 69 0 807 718 ;\nC 79 ; WX 778 ; N O ; B 107 -19 823 737 ;\nC 80 ; WX 667 ; N P ; B 76 0 738 718 ;\nC 81 ; WX 778 ; N Q ; B 107 -52 823 737 ;\nC 82 ; WX 722 ; N R ; B 76 0 778 718 ;\nC 83 ; WX 667 ; N S ; B 81 -19 718 737 ;\nC 84 ; WX 611 ; N T ; B 140 0 751 718 ;\nC 85 ; WX 722 ; N U ; B 116 -19 804 718 ;\nC 86 ; WX 667 ; N V ; B 172 0 801 718 ;\nC 87 ; WX 944 ; N W ; B 169 0 1082 718 ;\nC 88 ; WX 667 ; N X ; B 14 0 791 718 ;\nC 89 ; WX 667 ; N Y ; B 168 0 806 718 ;\nC 90 ; WX 611 ; N Z ; B 25 0 737 718 ;\nC 91 ; WX 333 ; N bracketleft ; B 21 -196 462 722 ;\nC 92 ; WX 278 ; N backslash ; B 124 -19 307 737 ;\nC 93 ; WX 333 ; N bracketright ; B -18 -196 423 722 ;\nC 94 ; WX 584 ; N asciicircum ; B 131 323 591 698 ;\nC 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ;\nC 96 ; WX 278 ; N quoteleft ; B 165 454 361 727 ;\nC 97 ; WX 556 ; N a ; B 55 -14 583 546 ;\nC 98 ; WX 611 ; N b ; B 61 -14 645 718 ;\nC 99 ; WX 556 ; N c ; B 79 -14 599 546 ;\nC 100 ; WX 611 ; N d ; B 82 -14 704 718 ;\nC 101 ; WX 556 ; N e ; B 70 -14 593 546 ;\nC 102 ; WX 333 ; N f ; B 87 0 469 727 ; L i fi ; L l fl ;\nC 103 ; WX 611 ; N g ; B 38 -217 666 546 ;\nC 104 ; WX 611 ; N h ; B 65 0 629 718 ;\nC 105 ; WX 278 ; N i ; B 69 0 363 725 ;\nC 106 ; WX 278 ; N j ; B -42 -214 363 725 ;\nC 107 ; WX 556 ; N k ; B 69 0 670 718 ;\nC 108 ; WX 278 ; N l ; B 69 0 362 718 ;\nC 109 ; WX 889 ; N m ; B 64 0 909 546 ;\nC 110 ; WX 611 ; N n ; B 65 0 629 546 ;\nC 111 ; WX 611 ; N o ; B 82 -14 643 546 ;\nC 112 ; WX 611 ; N p ; B 18 -207 645 546 ;\nC 113 ; WX 611 ; N q ; B 80 -207 665 546 ;\nC 114 ; WX 389 ; N r ; B 64 0 489 546 ;\nC 115 ; WX 556 ; N s ; B 63 -14 584 546 ;\nC 116 ; WX 333 ; N t ; B 100 -6 422 676 ;\nC 117 ; WX 611 ; N u ; B 98 -14 658 532 ;\nC 118 ; WX 556 ; N v ; B 126 0 656 532 ;\nC 119 ; WX 778 ; N w ; B 123 0 882 532 ;\nC 120 ; WX 556 ; N x ; B 15 0 648 532 ;\nC 121 ; WX 556 ; N y ; B 42 -214 652 532 ;\nC 122 ; WX 500 ; N z ; B 20 0 583 532 ;\nC 123 ; WX 389 ; N braceleft ; B 94 -196 518 722 ;\nC 124 ; WX 280 ; N bar ; B 80 -19 353 737 ;\nC 125 ; WX 389 ; N braceright ; B -18 -196 407 722 ;\nC 126 ; WX 584 ; N asciitilde ; B 115 163 577 343 ;\nC 161 ; WX 333 ; N exclamdown ; B 50 -186 353 532 ;\nC 162 ; WX 556 ; N cent ; B 79 -118 599 628 ;\nC 163 ; WX 556 ; N sterling ; B 50 -16 635 718 ;\nC 164 ; WX 167 ; N fraction ; B -174 -19 487 710 ;\nC 165 ; WX 556 ; N yen ; B 60 0 713 698 ;\nC 166 ; WX 556 ; N florin ; B -50 -210 669 737 ;\nC 167 ; WX 556 ; N section ; B 61 -184 598 727 ;\nC 168 ; WX 556 ; N currency ; B 27 76 680 636 ;\nC 169 ; WX 238 ; N quotesingle ; B 165 447 321 718 ;\nC 170 ; WX 500 ; N quotedblleft ; B 160 454 588 727 ;\nC 171 ; WX 556 ; N guillemotleft ; B 135 76 571 484 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 130 76 353 484 ;\nC 173 ; WX 333 ; N guilsinglright ; B 99 76 322 484 ;\nC 174 ; WX 611 ; N fi ; B 87 0 696 727 ;\nC 175 ; WX 611 ; N fl ; B 87 0 695 727 ;\nC 177 ; WX 556 ; N endash ; B 48 227 627 333 ;\nC 178 ; WX 556 ; N dagger ; B 118 -171 626 718 ;\nC 179 ; WX 556 ; N daggerdbl ; B 46 -171 628 718 ;\nC 180 ; WX 278 ; N periodcentered ; B 110 172 276 334 ;\nC 182 ; WX 556 ; N paragraph ; B 98 -191 688 700 ;\nC 183 ; WX 350 ; N bullet ; B 83 194 420 524 ;\nC 184 ; WX 278 ; N quotesinglbase ; B 41 -146 236 127 ;\nC 185 ; WX 500 ; N quotedblbase ; B 36 -146 463 127 ;\nC 186 ; WX 500 ; N quotedblright ; B 162 445 589 718 ;\nC 187 ; WX 556 ; N guillemotright ; B 104 76 540 484 ;\nC 188 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ;\nC 189 ; WX 1000 ; N perthousand ; B 76 -19 1038 710 ;\nC 191 ; WX 611 ; N questiondown ; B 53 -195 559 532 ;\nC 193 ; WX 333 ; N grave ; B 136 604 353 750 ;\nC 194 ; WX 333 ; N acute ; B 236 604 515 750 ;\nC 195 ; WX 333 ; N circumflex ; B 118 604 471 750 ;\nC 196 ; WX 333 ; N tilde ; B 113 610 507 737 ;\nC 197 ; WX 333 ; N macron ; B 122 604 483 678 ;\nC 198 ; WX 333 ; N breve ; B 156 604 494 750 ;\nC 199 ; WX 333 ; N dotaccent ; B 235 614 385 729 ;\nC 200 ; WX 333 ; N dieresis ; B 137 614 482 729 ;\nC 202 ; WX 333 ; N ring ; B 200 568 420 776 ;\nC 203 ; WX 333 ; N cedilla ; B -37 -228 220 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 137 604 645 750 ;\nC 206 ; WX 333 ; N ogonek ; B 41 -228 264 0 ;\nC 207 ; WX 333 ; N caron ; B 149 604 502 750 ;\nC 208 ; WX 1000 ; N emdash ; B 48 227 1071 333 ;\nC 225 ; WX 1000 ; N AE ; B 5 0 1100 718 ;\nC 227 ; WX 370 ; N ordfeminine ; B 92 276 465 737 ;\nC 232 ; WX 611 ; N Lslash ; B 34 0 611 718 ;\nC 233 ; WX 778 ; N Oslash ; B 35 -27 894 745 ;\nC 234 ; WX 1000 ; N OE ; B 99 -19 1114 737 ;\nC 235 ; WX 365 ; N ordmasculine ; B 92 276 485 737 ;\nC 241 ; WX 889 ; N ae ; B 56 -14 923 546 ;\nC 245 ; WX 278 ; N dotlessi ; B 69 0 322 532 ;\nC 248 ; WX 278 ; N lslash ; B 40 0 407 718 ;\nC 249 ; WX 611 ; N oslash ; B 22 -29 701 560 ;\nC 250 ; WX 944 ; N oe ; B 82 -14 977 546 ;\nC 251 ; WX 611 ; N germandbls ; B 69 -14 657 731 ;\nC -1 ; WX 611 ; N Zcaron ; B 25 0 737 936 ;\nC -1 ; WX 556 ; N ccedilla ; B 79 -228 599 546 ;\nC -1 ; WX 556 ; N ydieresis ; B 42 -214 652 729 ;\nC -1 ; WX 556 ; N atilde ; B 55 -14 619 737 ;\nC -1 ; WX 278 ; N icircumflex ; B 69 0 444 750 ;\nC -1 ; WX 333 ; N threesuperior ; B 91 271 441 710 ;\nC -1 ; WX 556 ; N ecircumflex ; B 70 -14 593 750 ;\nC -1 ; WX 611 ; N thorn ; B 18 -208 645 718 ;\nC -1 ; WX 556 ; N egrave ; B 70 -14 593 750 ;\nC -1 ; WX 333 ; N twosuperior ; B 69 283 449 710 ;\nC -1 ; WX 556 ; N eacute ; B 70 -14 627 750 ;\nC -1 ; WX 611 ; N otilde ; B 82 -14 646 737 ;\nC -1 ; WX 722 ; N Aacute ; B 20 0 750 936 ;\nC -1 ; WX 611 ; N ocircumflex ; B 82 -14 643 750 ;\nC -1 ; WX 556 ; N yacute ; B 42 -214 652 750 ;\nC -1 ; WX 611 ; N udieresis ; B 98 -14 658 729 ;\nC -1 ; WX 834 ; N threequarters ; B 99 -19 839 710 ;\nC -1 ; WX 556 ; N acircumflex ; B 55 -14 583 750 ;\nC -1 ; WX 722 ; N Eth ; B 62 0 777 718 ;\nC -1 ; WX 556 ; N edieresis ; B 70 -14 594 729 ;\nC -1 ; WX 611 ; N ugrave ; B 98 -14 658 750 ;\nC -1 ; WX 1000 ; N trademark ; B 179 306 1109 718 ;\nC -1 ; WX 611 ; N ograve ; B 82 -14 643 750 ;\nC -1 ; WX 556 ; N scaron ; B 63 -14 614 750 ;\nC -1 ; WX 278 ; N Idieresis ; B 64 0 494 915 ;\nC -1 ; WX 611 ; N uacute ; B 98 -14 658 750 ;\nC -1 ; WX 556 ; N agrave ; B 55 -14 583 750 ;\nC -1 ; WX 611 ; N ntilde ; B 65 0 646 737 ;\nC -1 ; WX 556 ; N aring ; B 55 -14 583 776 ;\nC -1 ; WX 500 ; N zcaron ; B 20 0 586 750 ;\nC -1 ; WX 278 ; N Icircumflex ; B 64 0 484 936 ;\nC -1 ; WX 722 ; N Ntilde ; B 69 0 807 923 ;\nC -1 ; WX 611 ; N ucircumflex ; B 98 -14 658 750 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 76 0 757 936 ;\nC -1 ; WX 278 ; N Iacute ; B 64 0 528 936 ;\nC -1 ; WX 722 ; N Ccedilla ; B 107 -228 789 737 ;\nC -1 ; WX 778 ; N Odieresis ; B 107 -19 823 915 ;\nC -1 ; WX 667 ; N Scaron ; B 81 -19 718 936 ;\nC -1 ; WX 667 ; N Edieresis ; B 76 0 757 915 ;\nC -1 ; WX 278 ; N Igrave ; B 64 0 367 936 ;\nC -1 ; WX 556 ; N adieresis ; B 55 -14 594 729 ;\nC -1 ; WX 778 ; N Ograve ; B 107 -19 823 936 ;\nC -1 ; WX 667 ; N Egrave ; B 76 0 757 936 ;\nC -1 ; WX 667 ; N Ydieresis ; B 168 0 806 915 ;\nC -1 ; WX 737 ; N registered ; B 55 -19 834 737 ;\nC -1 ; WX 778 ; N Otilde ; B 107 -19 823 923 ;\nC -1 ; WX 834 ; N onequarter ; B 132 -19 806 710 ;\nC -1 ; WX 722 ; N Ugrave ; B 116 -19 804 936 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 116 -19 804 936 ;\nC -1 ; WX 667 ; N Thorn ; B 76 0 716 718 ;\nC -1 ; WX 584 ; N divide ; B 82 -42 610 548 ;\nC -1 ; WX 722 ; N Atilde ; B 20 0 741 923 ;\nC -1 ; WX 722 ; N Uacute ; B 116 -19 804 936 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 107 -19 823 936 ;\nC -1 ; WX 584 ; N logicalnot ; B 105 108 633 419 ;\nC -1 ; WX 722 ; N Aring ; B 20 0 702 962 ;\nC -1 ; WX 278 ; N idieresis ; B 69 0 455 729 ;\nC -1 ; WX 278 ; N iacute ; B 69 0 488 750 ;\nC -1 ; WX 556 ; N aacute ; B 55 -14 627 750 ;\nC -1 ; WX 584 ; N plusminus ; B 40 0 625 506 ;\nC -1 ; WX 584 ; N multiply ; B 57 1 635 505 ;\nC -1 ; WX 722 ; N Udieresis ; B 116 -19 804 915 ;\nC -1 ; WX 584 ; N minus ; B 82 197 610 309 ;\nC -1 ; WX 333 ; N onesuperior ; B 148 283 388 710 ;\nC -1 ; WX 667 ; N Eacute ; B 76 0 757 936 ;\nC -1 ; WX 722 ; N Acircumflex ; B 20 0 706 936 ;\nC -1 ; WX 737 ; N copyright ; B 56 -19 835 737 ;\nC -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ;\nC -1 ; WX 611 ; N odieresis ; B 82 -14 643 729 ;\nC -1 ; WX 611 ; N oacute ; B 82 -14 654 750 ;\nC -1 ; WX 400 ; N degree ; B 175 426 467 712 ;\nC -1 ; WX 278 ; N igrave ; B 69 0 326 750 ;\nC -1 ; WX 611 ; N mu ; B 22 -207 658 532 ;\nC -1 ; WX 778 ; N Oacute ; B 107 -19 823 936 ;\nC -1 ; WX 611 ; N eth ; B 82 -14 670 737 ;\nC -1 ; WX 722 ; N Adieresis ; B 20 0 716 915 ;\nC -1 ; WX 667 ; N Yacute ; B 168 0 806 936 ;\nC -1 ; WX 280 ; N brokenbar ; B 80 -19 353 737 ;\nC -1 ; WX 834 ; N onehalf ; B 132 -19 858 710 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 209\n\nKPX A y -30\nKPX A w -30\nKPX A v -40\nKPX A u -30\nKPX A Y -110\nKPX A W -60\nKPX A V -80\nKPX A U -50\nKPX A T -90\nKPX A Q -40\nKPX A O -40\nKPX A G -50\nKPX A C -40\n\nKPX B U -10\nKPX B A -30\n\nKPX D period -30\nKPX D comma -30\nKPX D Y -70\nKPX D W -40\nKPX D V -40\nKPX D A -40\n\nKPX F period -100\nKPX F comma -100\nKPX F a -20\nKPX F A -80\n\nKPX J u -20\nKPX J period -20\nKPX J comma -20\nKPX J A -20\n\nKPX K y -40\nKPX K u -30\nKPX K o -35\nKPX K e -15\nKPX K O -30\n\nKPX L y -30\nKPX L quoteright -140\nKPX L quotedblright -140\nKPX L Y -120\nKPX L W -80\nKPX L V -110\nKPX L T -90\n\nKPX O period -40\nKPX O comma -40\nKPX O Y -70\nKPX O X -50\nKPX O W -50\nKPX O V -50\nKPX O T -40\nKPX O A -50\n\nKPX P period -120\nKPX P o -40\nKPX P e -30\nKPX P comma -120\nKPX P a -30\nKPX P A -100\n\nKPX Q period 20\nKPX Q comma 20\nKPX Q U -10\n\nKPX R Y -50\nKPX R W -40\nKPX R V -50\nKPX R U -20\nKPX R T -20\nKPX R O -20\n\nKPX T y -60\nKPX T w -60\nKPX T u -90\nKPX T semicolon -40\nKPX T r -80\nKPX T period -80\nKPX T o -80\nKPX T hyphen -120\nKPX T e -60\nKPX T comma -80\nKPX T colon -40\nKPX T a -80\nKPX T O -40\nKPX T A -90\n\nKPX U period -30\nKPX U comma -30\nKPX U A -50\n\nKPX V u -60\nKPX V semicolon -40\nKPX V period -120\nKPX V o -90\nKPX V hyphen -80\nKPX V e -50\nKPX V comma -120\nKPX V colon -40\nKPX V a -60\nKPX V O -50\nKPX V G -50\nKPX V A -80\n\nKPX W y -20\nKPX W u -45\nKPX W semicolon -10\nKPX W period -80\nKPX W o -60\nKPX W hyphen -40\nKPX W e -35\nKPX W comma -80\nKPX W colon -10\nKPX W a -40\nKPX W O -20\nKPX W A -60\n\nKPX Y u -100\nKPX Y semicolon -50\nKPX Y period -100\nKPX Y o -100\nKPX Y e -80\nKPX Y comma -100\nKPX Y colon -50\nKPX Y a -90\nKPX Y O -70\nKPX Y A -110\n\nKPX a y -20\nKPX a w -15\nKPX a v -15\nKPX a g -10\n\nKPX b y -20\nKPX b v -20\nKPX b u -20\nKPX b l -10\n\nKPX c y -10\nKPX c l -20\nKPX c k -20\nKPX c h -10\n\nKPX colon space -40\n\nKPX comma space -40\nKPX comma quoteright -120\nKPX comma quotedblright -120\n\nKPX d y -15\nKPX d w -15\nKPX d v -15\nKPX d d -10\n\nKPX e y -15\nKPX e x -15\nKPX e w -15\nKPX e v -15\nKPX e period 20\nKPX e comma 10\n\nKPX f quoteright 30\nKPX f quotedblright 30\nKPX f period -10\nKPX f o -20\nKPX f e -10\nKPX f comma -10\n\nKPX g g -10\nKPX g e 10\n\nKPX h y -20\n\nKPX k o -15\n\nKPX l y -15\nKPX l w -15\n\nKPX m y -30\nKPX m u -20\n\nKPX n y -20\nKPX n v -40\nKPX n u -10\n\nKPX o y -20\nKPX o x -30\nKPX o w -15\nKPX o v -20\n\nKPX p y -15\n\nKPX period space -40\nKPX period quoteright -120\nKPX period quotedblright -120\n\nKPX quotedblright space -80\n\nKPX quoteleft quoteleft -46\n\nKPX quoteright v -20\nKPX quoteright space -80\nKPX quoteright s -60\nKPX quoteright r -40\nKPX quoteright quoteright -46\nKPX quoteright l -20\nKPX quoteright d -80\n\nKPX r y 10\nKPX r v 10\nKPX r t 20\nKPX r s -15\nKPX r q -20\nKPX r period -60\nKPX r o -20\nKPX r hyphen -20\nKPX r g -15\nKPX r d -20\nKPX r comma -60\nKPX r c -20\n\nKPX s w -15\n\nKPX semicolon space -40\n\nKPX space quoteleft -60\nKPX space quotedblleft -80\nKPX space Y -120\nKPX space W -80\nKPX space V -80\nKPX space T -100\n\nKPX v period -80\nKPX v o -30\nKPX v comma -80\nKPX v a -20\n\nKPX w period -40\nKPX w o -20\nKPX w comma -40\n\nKPX x e -10\n\nKPX y period -80\nKPX y o -25\nKPX y e -10\nKPX y comma -80\nKPX y a -30\n\nKPX z e 10\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 235 186 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 235 186 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 235 186 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 235 186 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 235 186 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 235 186 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 215 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 207 186 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 207 186 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 207 186 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 207 186 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 13 186 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 13 186 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 13 186 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 13 186 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 235 186 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 263 186 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 263 186 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 263 186 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 263 186 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 263 186 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 207 186 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 235 186 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 235 186 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 235 186 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 235 186 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 207 186 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 207 186 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 179 186 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 112 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 112 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 112 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 112 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 112 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 112 0 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 132 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 112 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 112 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 112 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 112 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -27 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 139 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 139 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 139 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 139 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 139 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 139 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 112 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 139 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 139 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 139 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 139 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 112 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 112 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 84 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/phvbo8an.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu Mar 15 12:08:57 1990\nComment UniqueID 28407\nComment VMusage 7614 43068\nFontName Helvetica-Narrow-BoldOblique\nFullName Helvetica Narrow Bold Oblique\nFamilyName Helvetica\nWeight Bold\nItalicAngle -12\nIsFixedPitch false\nFontBBox -143 -228 913 962\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.007\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.Helvetica is a trademark of Linotype AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 718\nXHeight 532\nAscender 718\nDescender -207\nStartCharMetrics 228\nC 32 ; WX 228 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 273 ; N exclam ; B 77 0 325 718 ;\nC 34 ; WX 389 ; N quotedbl ; B 158 447 433 718 ;\nC 35 ; WX 456 ; N numbersign ; B 49 0 528 698 ;\nC 36 ; WX 456 ; N dollar ; B 55 -115 510 775 ;\nC 37 ; WX 729 ; N percent ; B 112 -19 739 710 ;\nC 38 ; WX 592 ; N ampersand ; B 73 -19 600 718 ;\nC 39 ; WX 228 ; N quoteright ; B 137 445 297 718 ;\nC 40 ; WX 273 ; N parenleft ; B 62 -208 385 734 ;\nC 41 ; WX 273 ; N parenright ; B -21 -208 302 734 ;\nC 42 ; WX 319 ; N asterisk ; B 120 387 394 718 ;\nC 43 ; WX 479 ; N plus ; B 67 0 500 506 ;\nC 44 ; WX 228 ; N comma ; B 23 -168 201 146 ;\nC 45 ; WX 273 ; N hyphen ; B 60 215 311 345 ;\nC 46 ; WX 228 ; N period ; B 52 0 201 146 ;\nC 47 ; WX 228 ; N slash ; B -30 -19 383 737 ;\nC 48 ; WX 456 ; N zero ; B 71 -19 506 710 ;\nC 49 ; WX 456 ; N one ; B 142 0 434 710 ;\nC 50 ; WX 456 ; N two ; B 21 0 508 710 ;\nC 51 ; WX 456 ; N three ; B 54 -19 499 710 ;\nC 52 ; WX 456 ; N four ; B 50 0 490 710 ;\nC 53 ; WX 456 ; N five ; B 53 -19 522 698 ;\nC 54 ; WX 456 ; N six ; B 70 -19 507 710 ;\nC 55 ; WX 456 ; N seven ; B 102 0 555 698 ;\nC 56 ; WX 456 ; N eight ; B 57 -19 505 710 ;\nC 57 ; WX 456 ; N nine ; B 64 -19 504 710 ;\nC 58 ; WX 273 ; N colon ; B 75 0 288 512 ;\nC 59 ; WX 273 ; N semicolon ; B 46 -168 288 512 ;\nC 60 ; WX 479 ; N less ; B 67 -8 537 514 ;\nC 61 ; WX 479 ; N equal ; B 48 87 519 419 ;\nC 62 ; WX 479 ; N greater ; B 30 -8 500 514 ;\nC 63 ; WX 501 ; N question ; B 135 0 550 727 ;\nC 64 ; WX 800 ; N at ; B 152 -19 782 737 ;\nC 65 ; WX 592 ; N A ; B 16 0 576 718 ;\nC 66 ; WX 592 ; N B ; B 62 0 626 718 ;\nC 67 ; WX 592 ; N C ; B 88 -19 647 737 ;\nC 68 ; WX 592 ; N D ; B 62 0 637 718 ;\nC 69 ; WX 547 ; N E ; B 62 0 620 718 ;\nC 70 ; WX 501 ; N F ; B 62 0 606 718 ;\nC 71 ; WX 638 ; N G ; B 89 -19 670 737 ;\nC 72 ; WX 592 ; N H ; B 58 0 659 718 ;\nC 73 ; WX 228 ; N I ; B 52 0 301 718 ;\nC 74 ; WX 456 ; N J ; B 49 -18 522 718 ;\nC 75 ; WX 592 ; N K ; B 71 0 703 718 ;\nC 76 ; WX 501 ; N L ; B 62 0 501 718 ;\nC 77 ; WX 683 ; N M ; B 57 0 752 718 ;\nC 78 ; WX 592 ; N N ; B 57 0 661 718 ;\nC 79 ; WX 638 ; N O ; B 88 -19 675 737 ;\nC 80 ; WX 547 ; N P ; B 62 0 605 718 ;\nC 81 ; WX 638 ; N Q ; B 88 -52 675 737 ;\nC 82 ; WX 592 ; N R ; B 62 0 638 718 ;\nC 83 ; WX 547 ; N S ; B 66 -19 588 737 ;\nC 84 ; WX 501 ; N T ; B 114 0 615 718 ;\nC 85 ; WX 592 ; N U ; B 96 -19 659 718 ;\nC 86 ; WX 547 ; N V ; B 141 0 656 718 ;\nC 87 ; WX 774 ; N W ; B 138 0 887 718 ;\nC 88 ; WX 547 ; N X ; B 11 0 648 718 ;\nC 89 ; WX 547 ; N Y ; B 137 0 661 718 ;\nC 90 ; WX 501 ; N Z ; B 20 0 604 718 ;\nC 91 ; WX 273 ; N bracketleft ; B 17 -196 379 722 ;\nC 92 ; WX 228 ; N backslash ; B 101 -19 252 737 ;\nC 93 ; WX 273 ; N bracketright ; B -14 -196 347 722 ;\nC 94 ; WX 479 ; N asciicircum ; B 107 323 484 698 ;\nC 95 ; WX 456 ; N underscore ; B -22 -125 443 -75 ;\nC 96 ; WX 228 ; N quoteleft ; B 136 454 296 727 ;\nC 97 ; WX 456 ; N a ; B 45 -14 478 546 ;\nC 98 ; WX 501 ; N b ; B 50 -14 529 718 ;\nC 99 ; WX 456 ; N c ; B 65 -14 491 546 ;\nC 100 ; WX 501 ; N d ; B 67 -14 577 718 ;\nC 101 ; WX 456 ; N e ; B 58 -14 486 546 ;\nC 102 ; WX 273 ; N f ; B 71 0 385 727 ; L i fi ; L l fl ;\nC 103 ; WX 501 ; N g ; B 31 -217 546 546 ;\nC 104 ; WX 501 ; N h ; B 53 0 516 718 ;\nC 105 ; WX 228 ; N i ; B 57 0 298 725 ;\nC 106 ; WX 228 ; N j ; B -35 -214 298 725 ;\nC 107 ; WX 456 ; N k ; B 57 0 549 718 ;\nC 108 ; WX 228 ; N l ; B 57 0 297 718 ;\nC 109 ; WX 729 ; N m ; B 52 0 746 546 ;\nC 110 ; WX 501 ; N n ; B 53 0 516 546 ;\nC 111 ; WX 501 ; N o ; B 67 -14 527 546 ;\nC 112 ; WX 501 ; N p ; B 15 -207 529 546 ;\nC 113 ; WX 501 ; N q ; B 66 -207 545 546 ;\nC 114 ; WX 319 ; N r ; B 52 0 401 546 ;\nC 115 ; WX 456 ; N s ; B 52 -14 479 546 ;\nC 116 ; WX 273 ; N t ; B 82 -6 346 676 ;\nC 117 ; WX 501 ; N u ; B 80 -14 540 532 ;\nC 118 ; WX 456 ; N v ; B 103 0 538 532 ;\nC 119 ; WX 638 ; N w ; B 101 0 723 532 ;\nC 120 ; WX 456 ; N x ; B 12 0 531 532 ;\nC 121 ; WX 456 ; N y ; B 34 -214 535 532 ;\nC 122 ; WX 410 ; N z ; B 16 0 478 532 ;\nC 123 ; WX 319 ; N braceleft ; B 77 -196 425 722 ;\nC 124 ; WX 230 ; N bar ; B 66 -19 289 737 ;\nC 125 ; WX 319 ; N braceright ; B -14 -196 333 722 ;\nC 126 ; WX 479 ; N asciitilde ; B 94 163 473 343 ;\nC 161 ; WX 273 ; N exclamdown ; B 41 -186 290 532 ;\nC 162 ; WX 456 ; N cent ; B 65 -118 491 628 ;\nC 163 ; WX 456 ; N sterling ; B 41 -16 520 718 ;\nC 164 ; WX 137 ; N fraction ; B -143 -19 399 710 ;\nC 165 ; WX 456 ; N yen ; B 49 0 585 698 ;\nC 166 ; WX 456 ; N florin ; B -41 -210 548 737 ;\nC 167 ; WX 456 ; N section ; B 50 -184 491 727 ;\nC 168 ; WX 456 ; N currency ; B 22 76 558 636 ;\nC 169 ; WX 195 ; N quotesingle ; B 135 447 263 718 ;\nC 170 ; WX 410 ; N quotedblleft ; B 132 454 482 727 ;\nC 171 ; WX 456 ; N guillemotleft ; B 111 76 468 484 ;\nC 172 ; WX 273 ; N guilsinglleft ; B 106 76 289 484 ;\nC 173 ; WX 273 ; N guilsinglright ; B 81 76 264 484 ;\nC 174 ; WX 501 ; N fi ; B 71 0 571 727 ;\nC 175 ; WX 501 ; N fl ; B 71 0 570 727 ;\nC 177 ; WX 456 ; N endash ; B 40 227 514 333 ;\nC 178 ; WX 456 ; N dagger ; B 97 -171 513 718 ;\nC 179 ; WX 456 ; N daggerdbl ; B 38 -171 515 718 ;\nC 180 ; WX 228 ; N periodcentered ; B 90 172 226 334 ;\nC 182 ; WX 456 ; N paragraph ; B 80 -191 564 700 ;\nC 183 ; WX 287 ; N bullet ; B 68 194 345 524 ;\nC 184 ; WX 228 ; N quotesinglbase ; B 34 -146 194 127 ;\nC 185 ; WX 410 ; N quotedblbase ; B 29 -146 380 127 ;\nC 186 ; WX 410 ; N quotedblright ; B 132 445 483 718 ;\nC 187 ; WX 456 ; N guillemotright ; B 85 76 443 484 ;\nC 188 ; WX 820 ; N ellipsis ; B 75 0 770 146 ;\nC 189 ; WX 820 ; N perthousand ; B 62 -19 851 710 ;\nC 191 ; WX 501 ; N questiondown ; B 44 -195 459 532 ;\nC 193 ; WX 273 ; N grave ; B 112 604 290 750 ;\nC 194 ; WX 273 ; N acute ; B 194 604 423 750 ;\nC 195 ; WX 273 ; N circumflex ; B 97 604 387 750 ;\nC 196 ; WX 273 ; N tilde ; B 92 610 415 737 ;\nC 197 ; WX 273 ; N macron ; B 100 604 396 678 ;\nC 198 ; WX 273 ; N breve ; B 128 604 405 750 ;\nC 199 ; WX 273 ; N dotaccent ; B 192 614 316 729 ;\nC 200 ; WX 273 ; N dieresis ; B 112 614 395 729 ;\nC 202 ; WX 273 ; N ring ; B 164 568 344 776 ;\nC 203 ; WX 273 ; N cedilla ; B -30 -228 180 0 ;\nC 205 ; WX 273 ; N hungarumlaut ; B 113 604 529 750 ;\nC 206 ; WX 273 ; N ogonek ; B 33 -228 216 0 ;\nC 207 ; WX 273 ; N caron ; B 123 604 412 750 ;\nC 208 ; WX 820 ; N emdash ; B 40 227 878 333 ;\nC 225 ; WX 820 ; N AE ; B 4 0 902 718 ;\nC 227 ; WX 303 ; N ordfeminine ; B 75 276 381 737 ;\nC 232 ; WX 501 ; N Lslash ; B 28 0 501 718 ;\nC 233 ; WX 638 ; N Oslash ; B 29 -27 733 745 ;\nC 234 ; WX 820 ; N OE ; B 81 -19 913 737 ;\nC 235 ; WX 299 ; N ordmasculine ; B 75 276 398 737 ;\nC 241 ; WX 729 ; N ae ; B 46 -14 757 546 ;\nC 245 ; WX 228 ; N dotlessi ; B 57 0 264 532 ;\nC 248 ; WX 228 ; N lslash ; B 33 0 334 718 ;\nC 249 ; WX 501 ; N oslash ; B 18 -29 575 560 ;\nC 250 ; WX 774 ; N oe ; B 67 -14 801 546 ;\nC 251 ; WX 501 ; N germandbls ; B 57 -14 539 731 ;\nC -1 ; WX 501 ; N Zcaron ; B 20 0 604 936 ;\nC -1 ; WX 456 ; N ccedilla ; B 65 -228 491 546 ;\nC -1 ; WX 456 ; N ydieresis ; B 34 -214 535 729 ;\nC -1 ; WX 456 ; N atilde ; B 45 -14 507 737 ;\nC -1 ; WX 228 ; N icircumflex ; B 57 0 364 750 ;\nC -1 ; WX 273 ; N threesuperior ; B 75 271 361 710 ;\nC -1 ; WX 456 ; N ecircumflex ; B 58 -14 486 750 ;\nC -1 ; WX 501 ; N thorn ; B 15 -208 529 718 ;\nC -1 ; WX 456 ; N egrave ; B 58 -14 486 750 ;\nC -1 ; WX 273 ; N twosuperior ; B 57 283 368 710 ;\nC -1 ; WX 456 ; N eacute ; B 58 -14 514 750 ;\nC -1 ; WX 501 ; N otilde ; B 67 -14 529 737 ;\nC -1 ; WX 592 ; N Aacute ; B 16 0 615 936 ;\nC -1 ; WX 501 ; N ocircumflex ; B 67 -14 527 750 ;\nC -1 ; WX 456 ; N yacute ; B 34 -214 535 750 ;\nC -1 ; WX 501 ; N udieresis ; B 80 -14 540 729 ;\nC -1 ; WX 684 ; N threequarters ; B 82 -19 688 710 ;\nC -1 ; WX 456 ; N acircumflex ; B 45 -14 478 750 ;\nC -1 ; WX 592 ; N Eth ; B 51 0 637 718 ;\nC -1 ; WX 456 ; N edieresis ; B 58 -14 487 729 ;\nC -1 ; WX 501 ; N ugrave ; B 80 -14 540 750 ;\nC -1 ; WX 820 ; N trademark ; B 146 306 909 718 ;\nC -1 ; WX 501 ; N ograve ; B 67 -14 527 750 ;\nC -1 ; WX 456 ; N scaron ; B 52 -14 504 750 ;\nC -1 ; WX 228 ; N Idieresis ; B 52 0 405 915 ;\nC -1 ; WX 501 ; N uacute ; B 80 -14 540 750 ;\nC -1 ; WX 456 ; N agrave ; B 45 -14 478 750 ;\nC -1 ; WX 501 ; N ntilde ; B 53 0 529 737 ;\nC -1 ; WX 456 ; N aring ; B 45 -14 478 776 ;\nC -1 ; WX 410 ; N zcaron ; B 16 0 481 750 ;\nC -1 ; WX 228 ; N Icircumflex ; B 52 0 397 936 ;\nC -1 ; WX 592 ; N Ntilde ; B 57 0 661 923 ;\nC -1 ; WX 501 ; N ucircumflex ; B 80 -14 540 750 ;\nC -1 ; WX 547 ; N Ecircumflex ; B 62 0 620 936 ;\nC -1 ; WX 228 ; N Iacute ; B 52 0 433 936 ;\nC -1 ; WX 592 ; N Ccedilla ; B 88 -228 647 737 ;\nC -1 ; WX 638 ; N Odieresis ; B 88 -19 675 915 ;\nC -1 ; WX 547 ; N Scaron ; B 66 -19 588 936 ;\nC -1 ; WX 547 ; N Edieresis ; B 62 0 620 915 ;\nC -1 ; WX 228 ; N Igrave ; B 52 0 301 936 ;\nC -1 ; WX 456 ; N adieresis ; B 45 -14 487 729 ;\nC -1 ; WX 638 ; N Ograve ; B 88 -19 675 936 ;\nC -1 ; WX 547 ; N Egrave ; B 62 0 620 936 ;\nC -1 ; WX 547 ; N Ydieresis ; B 137 0 661 915 ;\nC -1 ; WX 604 ; N registered ; B 45 -19 684 737 ;\nC -1 ; WX 638 ; N Otilde ; B 88 -19 675 923 ;\nC -1 ; WX 684 ; N onequarter ; B 108 -19 661 710 ;\nC -1 ; WX 592 ; N Ugrave ; B 96 -19 659 936 ;\nC -1 ; WX 592 ; N Ucircumflex ; B 96 -19 659 936 ;\nC -1 ; WX 547 ; N Thorn ; B 62 0 588 718 ;\nC -1 ; WX 479 ; N divide ; B 67 -42 500 548 ;\nC -1 ; WX 592 ; N Atilde ; B 16 0 608 923 ;\nC -1 ; WX 592 ; N Uacute ; B 96 -19 659 936 ;\nC -1 ; WX 638 ; N Ocircumflex ; B 88 -19 675 936 ;\nC -1 ; WX 479 ; N logicalnot ; B 86 108 519 419 ;\nC -1 ; WX 592 ; N Aring ; B 16 0 576 962 ;\nC -1 ; WX 228 ; N idieresis ; B 57 0 373 729 ;\nC -1 ; WX 228 ; N iacute ; B 57 0 400 750 ;\nC -1 ; WX 456 ; N aacute ; B 45 -14 514 750 ;\nC -1 ; WX 479 ; N plusminus ; B 33 0 512 506 ;\nC -1 ; WX 479 ; N multiply ; B 47 1 520 505 ;\nC -1 ; WX 592 ; N Udieresis ; B 96 -19 659 915 ;\nC -1 ; WX 479 ; N minus ; B 67 197 500 309 ;\nC -1 ; WX 273 ; N onesuperior ; B 121 283 318 710 ;\nC -1 ; WX 547 ; N Eacute ; B 62 0 620 936 ;\nC -1 ; WX 592 ; N Acircumflex ; B 16 0 579 936 ;\nC -1 ; WX 604 ; N copyright ; B 46 -19 685 737 ;\nC -1 ; WX 592 ; N Agrave ; B 16 0 576 936 ;\nC -1 ; WX 501 ; N odieresis ; B 67 -14 527 729 ;\nC -1 ; WX 501 ; N oacute ; B 67 -14 537 750 ;\nC -1 ; WX 328 ; N degree ; B 143 426 383 712 ;\nC -1 ; WX 228 ; N igrave ; B 57 0 268 750 ;\nC -1 ; WX 501 ; N mu ; B 18 -207 540 532 ;\nC -1 ; WX 638 ; N Oacute ; B 88 -19 675 936 ;\nC -1 ; WX 501 ; N eth ; B 67 -14 549 737 ;\nC -1 ; WX 592 ; N Adieresis ; B 16 0 588 915 ;\nC -1 ; WX 547 ; N Yacute ; B 137 0 661 936 ;\nC -1 ; WX 230 ; N brokenbar ; B 66 -19 289 737 ;\nC -1 ; WX 684 ; N onehalf ; B 108 -19 704 710 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 209\n\nKPX A y -30\nKPX A w -30\nKPX A v -40\nKPX A u -30\nKPX A Y -110\nKPX A W -60\nKPX A V -80\nKPX A U -50\nKPX A T -90\nKPX A Q -40\nKPX A O -40\nKPX A G -50\nKPX A C -40\n\nKPX B U -10\nKPX B A -30\n\nKPX D period -30\nKPX D comma -30\nKPX D Y -70\nKPX D W -40\nKPX D V -40\nKPX D A -40\n\nKPX F period -100\nKPX F comma -100\nKPX F a -20\nKPX F A -80\n\nKPX J u -20\nKPX J period -20\nKPX J comma -20\nKPX J A -20\n\nKPX K y -40\nKPX K u -30\nKPX K o -35\nKPX K e -15\nKPX K O -30\n\nKPX L y -30\nKPX L quoteright -140\nKPX L quotedblright -140\nKPX L Y -120\nKPX L W -80\nKPX L V -110\nKPX L T -90\n\nKPX O period -40\nKPX O comma -40\nKPX O Y -70\nKPX O X -50\nKPX O W -50\nKPX O V -50\nKPX O T -40\nKPX O A -50\n\nKPX P period -120\nKPX P o -40\nKPX P e -30\nKPX P comma -120\nKPX P a -30\nKPX P A -100\n\nKPX Q period 20\nKPX Q comma 20\nKPX Q U -10\n\nKPX R Y -50\nKPX R W -40\nKPX R V -50\nKPX R U -20\nKPX R T -20\nKPX R O -20\n\nKPX T y -60\nKPX T w -60\nKPX T u -90\nKPX T semicolon -40\nKPX T r -80\nKPX T period -80\nKPX T o -80\nKPX T hyphen -120\nKPX T e -60\nKPX T comma -80\nKPX T colon -40\nKPX T a -80\nKPX T O -40\nKPX T A -90\n\nKPX U period -30\nKPX U comma -30\nKPX U A -50\n\nKPX V u -60\nKPX V semicolon -40\nKPX V period -120\nKPX V o -90\nKPX V hyphen -80\nKPX V e -50\nKPX V comma -120\nKPX V colon -40\nKPX V a -60\nKPX V O -50\nKPX V G -50\nKPX V A -80\n\nKPX W y -20\nKPX W u -45\nKPX W semicolon -10\nKPX W period -80\nKPX W o -60\nKPX W hyphen -40\nKPX W e -35\nKPX W comma -80\nKPX W colon -10\nKPX W a -40\nKPX W O -20\nKPX W A -60\n\nKPX Y u -100\nKPX Y semicolon -50\nKPX Y period -100\nKPX Y o -100\nKPX Y e -80\nKPX Y comma -100\nKPX Y colon -50\nKPX Y a -90\nKPX Y O -70\nKPX Y A -110\n\nKPX a y -20\nKPX a w -15\nKPX a v -15\nKPX a g -10\n\nKPX b y -20\nKPX b v -20\nKPX b u -20\nKPX b l -10\n\nKPX c y -10\nKPX c l -20\nKPX c k -20\nKPX c h -10\n\nKPX colon space -40\n\nKPX comma space -40\nKPX comma quoteright -120\nKPX comma quotedblright -120\n\nKPX d y -15\nKPX d w -15\nKPX d v -15\nKPX d d -10\n\nKPX e y -15\nKPX e x -15\nKPX e w -15\nKPX e v -15\nKPX e period 20\nKPX e comma 10\n\nKPX f quoteright 30\nKPX f quotedblright 30\nKPX f period -10\nKPX f o -20\nKPX f e -10\nKPX f comma -10\n\nKPX g g -10\nKPX g e 10\n\nKPX h y -20\n\nKPX k o -15\n\nKPX l y -15\nKPX l w -15\n\nKPX m y -30\nKPX m u -20\n\nKPX n y -20\nKPX n v -40\nKPX n u -10\n\nKPX o y -20\nKPX o x -30\nKPX o w -15\nKPX o v -20\n\nKPX p y -15\n\nKPX period space -40\nKPX period quoteright -120\nKPX period quotedblright -120\n\nKPX quotedblright space -80\n\nKPX quoteleft quoteleft -46\n\nKPX quoteright v -20\nKPX quoteright space -80\nKPX quoteright s -60\nKPX quoteright r -40\nKPX quoteright quoteright -46\nKPX quoteright l -20\nKPX quoteright d -80\n\nKPX r y 10\nKPX r v 10\nKPX r t 20\nKPX r s -15\nKPX r q -20\nKPX r period -60\nKPX r o -20\nKPX r hyphen -20\nKPX r g -15\nKPX r d -20\nKPX r comma -60\nKPX r c -20\n\nKPX s w -15\n\nKPX semicolon space -40\n\nKPX space quoteleft -60\nKPX space quotedblleft -80\nKPX space Y -120\nKPX space W -80\nKPX space V -80\nKPX space T -100\n\nKPX v period -80\nKPX v o -30\nKPX v comma -80\nKPX v a -20\n\nKPX w period -40\nKPX w o -20\nKPX w comma -40\n\nKPX x e -10\n\nKPX y period -80\nKPX y o -25\nKPX y e -10\nKPX y comma -80\nKPX y a -30\n\nKPX z e 10\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 192 186 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 192 186 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 192 186 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 192 186 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 192 186 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 192 186 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 176 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 169 186 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 169 186 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 169 186 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 169 186 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 10 186 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 10 186 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 10 186 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 10 186 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 192 186 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 215 186 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 215 186 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 215 186 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 215 186 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 215 186 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 169 186 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 192 186 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 192 186 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 192 186 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 192 186 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 169 186 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 169 186 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 146 186 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 92 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 92 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 92 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 92 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 92 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 92 0 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 108 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 92 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 92 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 92 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 92 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -22 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -22 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -22 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -22 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 114 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 114 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 114 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 114 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 114 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 114 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 92 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 114 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 114 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 114 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 114 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 92 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 92 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 69 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/phvl8a.afm",
    "content": "StartFontMetrics 2.0\nComment  Copyright (c) 1985, 1987, 1988 Adobe Systems Incorporated. All Rights Reserved.\nComment Creation Date:Mon Jan 11 16:46:06 PST 1988\nFontName Helvetica-Light\nEncodingScheme AdobeStandardEncoding\nFullName Helvetica Light\nFamilyName Helvetica\nWeight Light\nItalicAngle 0.0\nIsFixedPitch false\nUnderlinePosition -90\nUnderlineThickness 58\nVersion 001.002\nNotice Copyright (c) 1985, 1987, 1988 Adobe Systems Incorporated.  All Rights Reserved.Helvetica is a trademark of Linotype Company.\nFontBBox -164 -212 1000 979\nCapHeight 720\nXHeight 518\nDescender -204\nAscender 720\nStartCharMetrics 228\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 130 0 203 720 ;\nC 34 ; WX 278 ; N quotedbl ; B 57 494 220 720 ;\nC 35 ; WX 556 ; N numbersign ; B 27 0 530 698 ;\nC 36 ; WX 556 ; N dollar ; B 37 -95 518 766 ;\nC 37 ; WX 889 ; N percent ; B 67 -14 821 705 ;\nC 38 ; WX 667 ; N ampersand ; B 41 -19 644 720 ;\nC 39 ; WX 222 ; N quoteright ; B 80 495 153 720 ;\nC 40 ; WX 333 ; N parenleft ; B 55 -191 277 739 ;\nC 41 ; WX 333 ; N parenright ; B 56 -191 278 739 ;\nC 42 ; WX 389 ; N asterisk ; B 44 434 344 720 ;\nC 43 ; WX 660 ; N plus ; B 80 0 580 500 ;\nC 44 ; WX 278 ; N comma ; B 102 -137 175 88 ;\nC 45 ; WX 333 ; N hyphen ; B 40 229 293 291 ;\nC 46 ; WX 278 ; N period ; B 102 0 175 88 ;\nC 47 ; WX 278 ; N slash ; B -3 -90 288 739 ;\nC 48 ; WX 556 ; N zero ; B 39 -14 516 705 ;\nC 49 ; WX 556 ; N one ; B 120 0 366 705 ;\nC 50 ; WX 556 ; N two ; B 48 0 515 705 ;\nC 51 ; WX 556 ; N three ; B 34 -14 512 705 ;\nC 52 ; WX 556 ; N four ; B 36 0 520 698 ;\nC 53 ; WX 556 ; N five ; B 35 -14 506 698 ;\nC 54 ; WX 556 ; N six ; B 41 -14 514 705 ;\nC 55 ; WX 556 ; N seven ; B 59 0 508 698 ;\nC 56 ; WX 556 ; N eight ; B 44 -14 512 705 ;\nC 57 ; WX 556 ; N nine ; B 41 -14 515 705 ;\nC 58 ; WX 278 ; N colon ; B 102 0 175 492 ;\nC 59 ; WX 278 ; N semicolon ; B 102 -137 175 492 ;\nC 60 ; WX 660 ; N less ; B 80 -6 580 505 ;\nC 61 ; WX 660 ; N equal ; B 80 124 580 378 ;\nC 62 ; WX 660 ; N greater ; B 80 -6 580 505 ;\nC 63 ; WX 500 ; N question ; B 37 0 472 739 ;\nC 64 ; WX 800 ; N at ; B 40 -19 760 739 ;\nC 65 ; WX 667 ; N A ; B 15 0 651 720 ;\nC 66 ; WX 667 ; N B ; B 81 0 610 720 ;\nC 67 ; WX 722 ; N C ; B 48 -19 670 739 ;\nC 68 ; WX 722 ; N D ; B 81 0 669 720 ;\nC 69 ; WX 611 ; N E ; B 81 0 570 720 ;\nC 70 ; WX 556 ; N F ; B 74 0 538 720 ;\nC 71 ; WX 778 ; N G ; B 53 -19 695 739 ;\nC 72 ; WX 722 ; N H ; B 80 0 642 720 ;\nC 73 ; WX 278 ; N I ; B 105 0 173 720 ;\nC 74 ; WX 500 ; N J ; B 22 -19 415 720 ;\nC 75 ; WX 667 ; N K ; B 85 0 649 720 ;\nC 76 ; WX 556 ; N L ; B 81 0 535 720 ;\nC 77 ; WX 833 ; N M ; B 78 0 755 720 ;\nC 78 ; WX 722 ; N N ; B 79 0 642 720 ;\nC 79 ; WX 778 ; N O ; B 53 -19 724 739 ;\nC 80 ; WX 611 ; N P ; B 78 0 576 720 ;\nC 81 ; WX 778 ; N Q ; B 48 -52 719 739 ;\nC 82 ; WX 667 ; N R ; B 80 0 612 720 ;\nC 83 ; WX 611 ; N S ; B 43 -19 567 739 ;\nC 84 ; WX 556 ; N T ; B 16 0 540 720 ;\nC 85 ; WX 722 ; N U ; B 82 -19 640 720 ;\nC 86 ; WX 611 ; N V ; B 18 0 593 720 ;\nC 87 ; WX 889 ; N W ; B 14 0 875 720 ;\nC 88 ; WX 611 ; N X ; B 18 0 592 720 ;\nC 89 ; WX 611 ; N Y ; B 12 0 598 720 ;\nC 90 ; WX 611 ; N Z ; B 31 0 579 720 ;\nC 91 ; WX 333 ; N bracketleft ; B 91 -191 282 739 ;\nC 92 ; WX 278 ; N backslash ; B -46 0 324 739 ;\nC 93 ; WX 333 ; N bracketright ; B 51 -191 242 739 ;\nC 94 ; WX 660 ; N asciicircum ; B 73 245 586 698 ;\nC 95 ; WX 500 ; N underscore ; B 0 -119 500 -61 ;\nC 96 ; WX 222 ; N quoteleft ; B 69 495 142 720 ;\nC 97 ; WX 556 ; N a ; B 46 -14 534 532 ;\nC 98 ; WX 611 ; N b ; B 79 -14 555 720 ;\nC 99 ; WX 556 ; N c ; B 47 -14 508 532 ;\nC 100 ; WX 611 ; N d ; B 56 -14 532 720 ;\nC 101 ; WX 556 ; N e ; B 45 -14 511 532 ;\nC 102 ; WX 278 ; N f ; B 20 0 257 734 ; L i fi ; L l fl ;\nC 103 ; WX 611 ; N g ; B 56 -212 532 532 ;\nC 104 ; WX 556 ; N h ; B 72 0 483 720 ;\nC 105 ; WX 222 ; N i ; B 78 0 144 720 ;\nC 106 ; WX 222 ; N j ; B 5 -204 151 720 ;\nC 107 ; WX 500 ; N k ; B 68 0 487 720 ;\nC 108 ; WX 222 ; N l ; B 81 0 141 720 ;\nC 109 ; WX 833 ; N m ; B 64 0 768 532 ;\nC 110 ; WX 556 ; N n ; B 72 0 483 532 ;\nC 111 ; WX 556 ; N o ; B 38 -14 518 532 ;\nC 112 ; WX 611 ; N p ; B 79 -204 555 532 ;\nC 113 ; WX 611 ; N q ; B 56 -204 532 532 ;\nC 114 ; WX 333 ; N r ; B 75 0 306 532 ;\nC 115 ; WX 500 ; N s ; B 46 -14 454 532 ;\nC 116 ; WX 278 ; N t ; B 20 -14 254 662 ;\nC 117 ; WX 556 ; N u ; B 72 -14 483 518 ;\nC 118 ; WX 500 ; N v ; B 17 0 483 518 ;\nC 119 ; WX 722 ; N w ; B 15 0 707 518 ;\nC 120 ; WX 500 ; N x ; B 18 0 481 518 ;\nC 121 ; WX 500 ; N y ; B 18 -204 482 518 ;\nC 122 ; WX 500 ; N z ; B 33 0 467 518 ;\nC 123 ; WX 333 ; N braceleft ; B 45 -191 279 739 ;\nC 124 ; WX 222 ; N bar ; B 81 0 141 739 ;\nC 125 ; WX 333 ; N braceright ; B 51 -187 285 743 ;\nC 126 ; WX 660 ; N asciitilde ; B 80 174 580 339 ;\nC 161 ; WX 333 ; N exclamdown ; B 130 -187 203 532 ;\nC 162 ; WX 556 ; N cent ; B 45 -141 506 647 ;\nC 163 ; WX 556 ; N sterling ; B 25 -14 530 705 ;\nC 164 ; WX 167 ; N fraction ; B -164 -14 331 705 ;\nC 165 ; WX 556 ; N yen ; B 4 0 552 720 ;\nC 166 ; WX 556 ; N florin ; B 13 -196 539 734 ;\nC 167 ; WX 556 ; N section ; B 48 -181 508 739 ;\nC 168 ; WX 556 ; N currency ; B 27 50 529 553 ;\nC 169 ; WX 222 ; N quotesingle ; B 85 494 137 720 ;\nC 170 ; WX 389 ; N quotedblleft ; B 86 495 310 720 ;\nC 171 ; WX 556 ; N guillemotleft ; B 113 117 443 404 ;\nC 172 ; WX 389 ; N guilsinglleft ; B 121 117 267 404 ;\nC 173 ; WX 389 ; N guilsinglright ; B 122 117 268 404 ;\nC 174 ; WX 500 ; N fi ; B 13 0 435 734 ;\nC 175 ; WX 500 ; N fl ; B 13 0 432 734 ;\nC 177 ; WX 500 ; N endash ; B 0 238 500 282 ;\nC 178 ; WX 556 ; N dagger ; B 37 -166 519 720 ;\nC 179 ; WX 556 ; N daggerdbl ; B 37 -166 519 720 ;\nC 180 ; WX 278 ; N periodcentered ; B 90 301 187 398 ;\nC 182 ; WX 650 ; N paragraph ; B 66 -146 506 720 ;\nC 183 ; WX 500 ; N bullet ; B 70 180 430 540 ;\nC 184 ; WX 222 ; N quotesinglbase ; B 80 -137 153 88 ;\nC 185 ; WX 389 ; N quotedblbase ; B 79 -137 303 88 ;\nC 186 ; WX 389 ; N quotedblright ; B 79 495 303 720 ;\nC 187 ; WX 556 ; N guillemotright ; B 113 117 443 404 ;\nC 188 ; WX 1000 ; N ellipsis ; B 131 0 870 88 ;\nC 189 ; WX 1000 ; N perthousand ; B 14 -14 985 705 ;\nC 191 ; WX 500 ; N questiondown ; B 28 -207 463 532 ;\nC 193 ; WX 333 ; N grave ; B 45 574 234 713 ;\nC 194 ; WX 333 ; N acute ; B 109 574 297 713 ;\nC 195 ; WX 333 ; N circumflex ; B 24 574 318 713 ;\nC 196 ; WX 333 ; N tilde ; B 16 586 329 688 ;\nC 197 ; WX 333 ; N macron ; B 23 612 319 657 ;\nC 198 ; WX 333 ; N breve ; B 28 580 316 706 ;\nC 199 ; WX 333 ; N dotaccent ; B 134 584 199 686 ;\nC 200 ; WX 333 ; N dieresis ; B 60 584 284 686 ;\nC 202 ; WX 333 ; N ring ; B 67 578 266 777 ;\nC 203 ; WX 333 ; N cedilla ; B 54 -207 257 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 109 574 459 713 ;\nC 206 ; WX 333 ; N ogonek ; B 74 -190 228 0 ;\nC 207 ; WX 333 ; N caron ; B 24 574 318 713 ;\nC 208 ; WX 1000 ; N emdash ; B 0 238 1000 282 ;\nC 225 ; WX 1000 ; N AE ; B 5 0 960 720 ;\nC 227 ; WX 334 ; N ordfeminine ; B 8 307 325 739 ;\nC 232 ; WX 556 ; N Lslash ; B 0 0 535 720 ;\nC 233 ; WX 778 ; N Oslash ; B 42 -37 736 747 ;\nC 234 ; WX 1000 ; N OE ; B 41 -19 967 739 ;\nC 235 ; WX 334 ; N ordmasculine ; B 11 307 323 739 ;\nC 241 ; WX 889 ; N ae ; B 39 -14 847 532 ;\nC 245 ; WX 222 ; N dotlessi ; B 78 0 138 518 ;\nC 248 ; WX 222 ; N lslash ; B 10 0 212 720 ;\nC 249 ; WX 556 ; N oslash ; B 35 -23 521 541 ;\nC 250 ; WX 944 ; N oe ; B 36 -14 904 532 ;\nC 251 ; WX 500 ; N germandbls ; B 52 -14 459 734 ;\nC -1 ; WX 667 ; N Aacute ; B 15 0 651 915 ;\nC -1 ; WX 667 ; N Acircumflex ; B 15 0 651 915 ;\nC -1 ; WX 667 ; N Adieresis ; B 15 0 651 888 ;\nC -1 ; WX 667 ; N Agrave ; B 15 0 651 915 ;\nC -1 ; WX 667 ; N Aring ; B 15 0 651 979 ;\nC -1 ; WX 667 ; N Atilde ; B 15 0 651 890 ;\nC -1 ; WX 722 ; N Ccedilla ; B 48 -207 670 739 ;\nC -1 ; WX 611 ; N Eacute ; B 81 0 570 915 ;\nC -1 ; WX 611 ; N Ecircumflex ; B 81 0 570 915 ;\nC -1 ; WX 611 ; N Edieresis ; B 81 0 570 888 ;\nC -1 ; WX 611 ; N Egrave ; B 81 0 570 915 ;\nC -1 ; WX 722 ; N Eth ; B 10 0 669 720 ;\nC -1 ; WX 278 ; N Iacute ; B 62 0 250 915 ;\nC -1 ; WX 278 ; N Icircumflex ; B -23 0 271 915 ;\nC -1 ; WX 278 ; N Idieresis ; B 13 0 237 888 ;\nC -1 ; WX 278 ; N Igrave ; B 18 0 207 915 ;\nC -1 ; WX 722 ; N Ntilde ; B 79 0 642 890 ;\nC -1 ; WX 778 ; N Oacute ; B 53 -19 724 915 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 53 -19 724 915 ;\nC -1 ; WX 778 ; N Odieresis ; B 53 -19 724 888 ;\nC -1 ; WX 778 ; N Ograve ; B 53 -19 724 915 ;\nC -1 ; WX 778 ; N Otilde ; B 53 -19 724 890 ;\nC -1 ; WX 611 ; N Scaron ; B 43 -19 567 915 ;\nC -1 ; WX 611 ; N Thorn ; B 78 0 576 720 ;\nC -1 ; WX 722 ; N Uacute ; B 82 -19 640 915 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 82 -19 640 915 ;\nC -1 ; WX 722 ; N Udieresis ; B 82 -19 640 888 ;\nC -1 ; WX 722 ; N Ugrave ; B 82 -19 640 915 ;\nC -1 ; WX 611 ; N Yacute ; B 12 0 598 915 ;\nC -1 ; WX 611 ; N Ydieresis ; B 12 0 598 888 ;\nC -1 ; WX 611 ; N Zcaron ; B 31 0 579 915 ;\nC -1 ; WX 556 ; N aacute ; B 46 -14 534 713 ;\nC -1 ; WX 556 ; N acircumflex ; B 46 -14 534 713 ;\nC -1 ; WX 556 ; N adieresis ; B 46 -14 534 686 ;\nC -1 ; WX 556 ; N agrave ; B 46 -14 534 713 ;\nC -1 ; WX 556 ; N aring ; B 46 -14 534 777 ;\nC -1 ; WX 556 ; N atilde ; B 46 -14 534 688 ;\nC -1 ; WX 222 ; N brokenbar ; B 81 0 141 739 ;\nC -1 ; WX 556 ; N ccedilla ; B 47 -207 508 532 ;\nC -1 ; WX 800 ; N copyright ; B 21 -19 779 739 ;\nC -1 ; WX 400 ; N degree ; B 50 405 350 705 ;\nC -1 ; WX 660 ; N divide ; B 80 0 580 500 ;\nC -1 ; WX 556 ; N eacute ; B 45 -14 511 713 ;\nC -1 ; WX 556 ; N ecircumflex ; B 45 -14 511 713 ;\nC -1 ; WX 556 ; N edieresis ; B 45 -14 511 686 ;\nC -1 ; WX 556 ; N egrave ; B 45 -14 511 713 ;\nC -1 ; WX 556 ; N eth ; B 38 -14 518 739 ;\nC -1 ; WX 222 ; N iacute ; B 34 0 222 713 ;\nC -1 ; WX 222 ; N icircumflex ; B -51 0 243 713 ;\nC -1 ; WX 222 ; N idieresis ; B -15 0 209 686 ;\nC -1 ; WX 222 ; N igrave ; B -10 0 179 713 ;\nC -1 ; WX 660 ; N logicalnot ; B 80 112 580 378 ;\nC -1 ; WX 660 ; N minus ; B 80 220 580 280 ;\nC -1 ; WX 556 ; N mu ; B 72 -204 483 518 ;\nC -1 ; WX 660 ; N multiply ; B 83 6 578 500 ;\nC -1 ; WX 556 ; N ntilde ; B 72 0 483 688 ;\nC -1 ; WX 556 ; N oacute ; B 38 -14 518 713 ;\nC -1 ; WX 556 ; N ocircumflex ; B 38 -14 518 713 ;\nC -1 ; WX 556 ; N odieresis ; B 38 -14 518 686 ;\nC -1 ; WX 556 ; N ograve ; B 38 -14 518 713 ;\nC -1 ; WX 834 ; N onehalf ; B 40 -14 794 739 ;\nC -1 ; WX 834 ; N onequarter ; B 40 -14 794 739 ;\nC -1 ; WX 333 ; N onesuperior ; B 87 316 247 739 ;\nC -1 ; WX 556 ; N otilde ; B 38 -14 518 688 ;\nC -1 ; WX 660 ; N plusminus ; B 80 0 580 500 ;\nC -1 ; WX 800 ; N registered ; B 21 -19 779 739 ;\nC -1 ; WX 500 ; N scaron ; B 46 -14 454 713 ;\nC -1 ; WX 611 ; N thorn ; B 79 -204 555 720 ;\nC -1 ; WX 834 ; N threequarters ; B 40 -14 794 739 ;\nC -1 ; WX 333 ; N threesuperior ; B 11 308 322 739 ;\nC -1 ; WX 940 ; N trademark ; B 29 299 859 720 ;\nC -1 ; WX 333 ; N twosuperior ; B 15 316 318 739 ;\nC -1 ; WX 556 ; N uacute ; B 72 -14 483 713 ;\nC -1 ; WX 556 ; N ucircumflex ; B 72 -14 483 713 ;\nC -1 ; WX 556 ; N udieresis ; B 72 -14 483 686 ;\nC -1 ; WX 556 ; N ugrave ; B 72 -14 483 713 ;\nC -1 ; WX 500 ; N yacute ; B 18 -204 482 713 ;\nC -1 ; WX 500 ; N ydieresis ; B 18 -204 482 686 ;\nC -1 ; WX 500 ; N zcaron ; B 33 0 467 713 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 115\n\nKPX A y -18\nKPX A w -18\nKPX A v -18\nKPX A quoteright -74\nKPX A Y -74\nKPX A W -37\nKPX A V -74\nKPX A T -92\n\nKPX F period -129\nKPX F comma -129\nKPX F A -55\n\nKPX L y -37\nKPX L quoteright -74\nKPX L Y -111\nKPX L W -55\nKPX L V -92\nKPX L T -92\n\nKPX P period -129\nKPX P comma -129\nKPX P A -74\n\nKPX R y 0\nKPX R Y -37\nKPX R W -18\nKPX R V -18\nKPX R T -18\n\nKPX T y -84\nKPX T w -84\nKPX T u -92\nKPX T semicolon -111\nKPX T s -111\nKPX T r -92\nKPX T period -111\nKPX T o -111\nKPX T i 0\nKPX T hyphen -129\nKPX T e -111\nKPX T comma -111\nKPX T colon -111\nKPX T c -111\nKPX T a -111\nKPX T A -92\n\nKPX V y -18\nKPX V u -37\nKPX V semicolon -74\nKPX V r -37\nKPX V period -129\nKPX V o -55\nKPX V i -18\nKPX V hyphen -55\nKPX V e -55\nKPX V comma -129\nKPX V colon -74\nKPX V a -55\nKPX V A -74\n\nKPX W y 0\nKPX W u -18\nKPX W semicolon -18\nKPX W r -18\nKPX W period -74\nKPX W o -18\nKPX W i 0\nKPX W hyphen 0\nKPX W e -18\nKPX W comma -74\nKPX W colon -18\nKPX W a -37\nKPX W A -37\n\nKPX Y v -40\nKPX Y u -37\nKPX Y semicolon -92\nKPX Y q -92\nKPX Y period -111\nKPX Y p -37\nKPX Y o -92\nKPX Y i -20\nKPX Y hyphen -111\nKPX Y e -92\nKPX Y comma -111\nKPX Y colon -92\nKPX Y a -92\nKPX Y A -74\n\nKPX f quoteright 18\nKPX f f -18\n\nKPX quoteleft quoteleft -18\n\nKPX quoteright t -18\nKPX quoteright s -74\nKPX quoteright quoteright -18\n\nKPX r z 0\nKPX r y 18\nKPX r x 0\nKPX r w 0\nKPX r v 0\nKPX r u 0\nKPX r t 18\nKPX r r 0\nKPX r quoteright 0\nKPX r q -18\nKPX r period -92\nKPX r o -18\nKPX r n 18\nKPX r m 18\nKPX r hyphen -55\nKPX r h 0\nKPX r g 0\nKPX r f 18\nKPX r e -18\nKPX r d -18\nKPX r comma -92\nKPX r c -18\n\nKPX v period -74\nKPX v comma -74\n\nKPX w period -55\nKPX w comma -55\n\nKPX y period -92\nKPX y comma -92\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 139 202 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 83 0 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 139 202 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 83 0 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 194 0 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 111 0 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 139 202 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 83 0 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 139 202 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 83 0 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 194 202 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 194 202 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 194 202 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 194 202 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 111 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 111 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 111 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 111 0 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute -47 202 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -47 202 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -47 202 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave -27 202 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -75 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -75 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -75 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -55 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 139 202 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 139 202 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 139 202 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 139 202 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 111 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 111 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 111 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 111 0 ;\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 167 202 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 167 202 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 167 202 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 167 202 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 111 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 111 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 111 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 111 0 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 222 202 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 222 202 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 222 202 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 222 202 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 111 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 111 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 111 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 111 0 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 167 202 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 111 0 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 194 202 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 111 0 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 222 202 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 111 0 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 187 202 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 111 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/phvlo8a.afm",
    "content": "StartFontMetrics 2.0\nComment  Copyright (c) 1985, 1987, 1988 Adobe Systems Incorporated. All Rights Reserved.\nComment Creation Date:Mon Jan 11 17:38:44 PST 1988\nFontName Helvetica-LightOblique\nEncodingScheme AdobeStandardEncoding\nFullName Helvetica Light Oblique\nFamilyName Helvetica\nWeight Light\nItalicAngle -12.0\nIsFixedPitch false\nUnderlinePosition -90\nUnderlineThickness 58\nVersion 001.002\nNotice Copyright (c) 1985, 1987, 1988 Adobe Systems Incorporated.  All Rights Reserved.Helvetica is a trademark of Linotype Company.\nFontBBox -167 -212 1110 979\nCapHeight 720\nXHeight 518\nDescender -204\nAscender 720\nStartCharMetrics 228\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 130 0 356 720 ;\nC 34 ; WX 278 ; N quotedbl ; B 162 494 373 720 ;\nC 35 ; WX 556 ; N numbersign ; B 75 0 633 698 ;\nC 36 ; WX 556 ; N dollar ; B 75 -95 613 766 ;\nC 37 ; WX 889 ; N percent ; B 176 -14 860 705 ;\nC 38 ; WX 667 ; N ampersand ; B 77 -19 646 720 ;\nC 39 ; WX 222 ; N quoteright ; B 185 495 306 720 ;\nC 40 ; WX 333 ; N parenleft ; B 97 -191 434 739 ;\nC 41 ; WX 333 ; N parenright ; B 15 -191 353 739 ;\nC 42 ; WX 389 ; N asterisk ; B 172 434 472 720 ;\nC 43 ; WX 660 ; N plus ; B 127 0 640 500 ;\nC 44 ; WX 278 ; N comma ; B 73 -137 194 88 ;\nC 45 ; WX 333 ; N hyphen ; B 89 229 355 291 ;\nC 46 ; WX 278 ; N period ; B 102 0 194 88 ;\nC 47 ; WX 278 ; N slash ; B -22 -90 445 739 ;\nC 48 ; WX 556 ; N zero ; B 93 -14 609 705 ;\nC 49 ; WX 556 ; N one ; B 231 0 516 705 ;\nC 50 ; WX 556 ; N two ; B 48 0 628 705 ;\nC 51 ; WX 556 ; N three ; B 74 -14 605 705 ;\nC 52 ; WX 556 ; N four ; B 73 0 570 698 ;\nC 53 ; WX 556 ; N five ; B 71 -14 616 698 ;\nC 54 ; WX 556 ; N six ; B 94 -14 617 705 ;\nC 55 ; WX 556 ; N seven ; B 152 0 656 698 ;\nC 56 ; WX 556 ; N eight ; B 80 -14 601 705 ;\nC 57 ; WX 556 ; N nine ; B 84 -14 607 705 ;\nC 58 ; WX 278 ; N colon ; B 102 0 280 492 ;\nC 59 ; WX 278 ; N semicolon ; B 73 -137 280 492 ;\nC 60 ; WX 660 ; N less ; B 129 -6 687 505 ;\nC 61 ; WX 660 ; N equal ; B 106 124 660 378 ;\nC 62 ; WX 660 ; N greater ; B 79 -6 640 505 ;\nC 63 ; WX 500 ; N question ; B 148 0 594 739 ;\nC 64 ; WX 800 ; N at ; B 108 -19 857 739 ;\nC 65 ; WX 667 ; N A ; B 15 0 651 720 ;\nC 66 ; WX 667 ; N B ; B 81 0 697 720 ;\nC 67 ; WX 722 ; N C ; B 111 -19 771 739 ;\nC 68 ; WX 722 ; N D ; B 81 0 758 720 ;\nC 69 ; WX 611 ; N E ; B 81 0 713 720 ;\nC 70 ; WX 556 ; N F ; B 74 0 691 720 ;\nC 71 ; WX 778 ; N G ; B 116 -19 796 739 ;\nC 72 ; WX 722 ; N H ; B 80 0 795 720 ;\nC 73 ; WX 278 ; N I ; B 105 0 326 720 ;\nC 74 ; WX 500 ; N J ; B 58 -19 568 720 ;\nC 75 ; WX 667 ; N K ; B 85 0 752 720 ;\nC 76 ; WX 556 ; N L ; B 81 0 547 720 ;\nC 77 ; WX 833 ; N M ; B 78 0 908 720 ;\nC 78 ; WX 722 ; N N ; B 79 0 795 720 ;\nC 79 ; WX 778 ; N O ; B 117 -19 812 739 ;\nC 80 ; WX 611 ; N P ; B 78 0 693 720 ;\nC 81 ; WX 778 ; N Q ; B 112 -52 808 739 ;\nC 82 ; WX 667 ; N R ; B 80 0 726 720 ;\nC 83 ; WX 611 ; N S ; B 82 -19 663 739 ;\nC 84 ; WX 556 ; N T ; B 157 0 693 720 ;\nC 85 ; WX 722 ; N U ; B 129 -19 793 720 ;\nC 86 ; WX 611 ; N V ; B 171 0 746 720 ;\nC 87 ; WX 889 ; N W ; B 167 0 1028 720 ;\nC 88 ; WX 611 ; N X ; B 18 0 734 720 ;\nC 89 ; WX 611 ; N Y ; B 165 0 751 720 ;\nC 90 ; WX 611 ; N Z ; B 31 0 729 720 ;\nC 91 ; WX 333 ; N bracketleft ; B 50 -191 439 739 ;\nC 92 ; WX 278 ; N backslash ; B 111 0 324 739 ;\nC 93 ; WX 333 ; N bracketright ; B 10 -191 399 739 ;\nC 94 ; WX 660 ; N asciicircum ; B 125 245 638 698 ;\nC 95 ; WX 500 ; N underscore ; B -25 -119 487 -61 ;\nC 96 ; WX 222 ; N quoteleft ; B 174 495 295 720 ;\nC 97 ; WX 556 ; N a ; B 71 -14 555 532 ;\nC 98 ; WX 611 ; N b ; B 79 -14 619 720 ;\nC 99 ; WX 556 ; N c ; B 92 -14 576 532 ;\nC 100 ; WX 611 ; N d ; B 101 -14 685 720 ;\nC 101 ; WX 556 ; N e ; B 90 -14 575 532 ;\nC 102 ; WX 278 ; N f ; B 97 0 412 734 ; L i fi ; L l fl ;\nC 103 ; WX 611 ; N g ; B 56 -212 642 532 ;\nC 104 ; WX 556 ; N h ; B 72 0 565 720 ;\nC 105 ; WX 222 ; N i ; B 81 0 297 720 ;\nC 106 ; WX 222 ; N j ; B -38 -204 304 720 ;\nC 107 ; WX 500 ; N k ; B 68 0 574 720 ;\nC 108 ; WX 222 ; N l ; B 81 0 294 720 ;\nC 109 ; WX 833 ; N m ; B 64 0 848 532 ;\nC 110 ; WX 556 ; N n ; B 72 0 565 532 ;\nC 111 ; WX 556 ; N o ; B 84 -14 582 532 ;\nC 112 ; WX 611 ; N p ; B 36 -204 620 532 ;\nC 113 ; WX 611 ; N q ; B 102 -204 642 532 ;\nC 114 ; WX 333 ; N r ; B 75 0 419 532 ;\nC 115 ; WX 500 ; N s ; B 78 -14 519 532 ;\nC 116 ; WX 278 ; N t ; B 108 -14 360 662 ;\nC 117 ; WX 556 ; N u ; B 103 -14 593 518 ;\nC 118 ; WX 500 ; N v ; B 127 0 593 518 ;\nC 119 ; WX 722 ; N w ; B 125 0 817 518 ;\nC 120 ; WX 500 ; N x ; B 18 0 584 518 ;\nC 121 ; WX 500 ; N y ; B 26 -204 592 518 ;\nC 122 ; WX 500 ; N z ; B 33 0 564 518 ;\nC 123 ; WX 333 ; N braceleft ; B 103 -191 436 739 ;\nC 124 ; WX 222 ; N bar ; B 81 0 298 739 ;\nC 125 ; WX 333 ; N braceright ; B 12 -187 344 743 ;\nC 126 ; WX 660 ; N asciitilde ; B 127 174 645 339 ;\nC 161 ; WX 333 ; N exclamdown ; B 90 -187 316 532 ;\nC 162 ; WX 556 ; N cent ; B 90 -141 574 647 ;\nC 163 ; WX 556 ; N sterling ; B 51 -14 613 705 ;\nC 164 ; WX 167 ; N fraction ; B -167 -14 481 705 ;\nC 165 ; WX 556 ; N yen ; B 110 0 705 720 ;\nC 166 ; WX 556 ; N florin ; B -26 -196 691 734 ;\nC 167 ; WX 556 ; N section ; B 91 -181 581 739 ;\nC 168 ; WX 556 ; N currency ; B 55 50 629 553 ;\nC 169 ; WX 222 ; N quotesingle ; B 190 494 290 720 ;\nC 170 ; WX 389 ; N quotedblleft ; B 191 495 463 720 ;\nC 171 ; WX 556 ; N guillemotleft ; B 161 117 529 404 ;\nC 172 ; WX 389 ; N guilsinglleft ; B 169 117 353 404 ;\nC 173 ; WX 389 ; N guilsinglright ; B 147 117 330 404 ;\nC 174 ; WX 500 ; N fi ; B 92 0 588 734 ;\nC 175 ; WX 500 ; N fl ; B 92 0 585 734 ;\nC 177 ; WX 500 ; N endash ; B 51 238 560 282 ;\nC 178 ; WX 556 ; N dagger ; B 130 -166 623 720 ;\nC 179 ; WX 556 ; N daggerdbl ; B 49 -166 625 720 ;\nC 180 ; WX 278 ; N periodcentered ; B 163 301 262 398 ;\nC 182 ; WX 650 ; N paragraph ; B 174 -146 659 720 ;\nC 183 ; WX 500 ; N bullet ; B 142 180 510 540 ;\nC 184 ; WX 222 ; N quotesinglbase ; B 51 -137 172 88 ;\nC 185 ; WX 389 ; N quotedblbase ; B 50 -137 322 88 ;\nC 186 ; WX 389 ; N quotedblright ; B 184 495 456 720 ;\nC 187 ; WX 556 ; N guillemotright ; B 138 117 505 404 ;\nC 188 ; WX 1000 ; N ellipsis ; B 131 0 889 88 ;\nC 189 ; WX 1000 ; N perthousand ; B 83 -14 1020 705 ;\nC 191 ; WX 500 ; N questiondown ; B 19 -207 465 532 ;\nC 193 ; WX 333 ; N grave ; B 197 574 356 713 ;\nC 194 ; WX 333 ; N acute ; B 231 574 449 713 ;\nC 195 ; WX 333 ; N circumflex ; B 146 574 440 713 ;\nC 196 ; WX 333 ; N tilde ; B 141 586 475 688 ;\nC 197 ; WX 333 ; N macron ; B 153 612 459 657 ;\nC 198 ; WX 333 ; N breve ; B 177 580 466 706 ;\nC 199 ; WX 333 ; N dotaccent ; B 258 584 345 686 ;\nC 200 ; WX 333 ; N dieresis ; B 184 584 430 686 ;\nC 202 ; WX 333 ; N ring ; B 209 578 412 777 ;\nC 203 ; WX 333 ; N cedilla ; B 14 -207 233 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 231 574 611 713 ;\nC 206 ; WX 333 ; N ogonek ; B 50 -190 199 0 ;\nC 207 ; WX 333 ; N caron ; B 176 574 470 713 ;\nC 208 ; WX 1000 ; N emdash ; B 51 238 1060 282 ;\nC 225 ; WX 1000 ; N AE ; B 5 0 1101 720 ;\nC 227 ; WX 334 ; N ordfeminine ; B 73 307 423 739 ;\nC 232 ; WX 556 ; N Lslash ; B 68 0 547 720 ;\nC 233 ; WX 778 ; N Oslash ; B 41 -37 887 747 ;\nC 234 ; WX 1000 ; N OE ; B 104 -19 1110 739 ;\nC 235 ; WX 334 ; N ordmasculine ; B 76 307 450 739 ;\nC 241 ; WX 889 ; N ae ; B 63 -14 913 532 ;\nC 245 ; WX 222 ; N dotlessi ; B 78 0 248 518 ;\nC 248 ; WX 222 ; N lslash ; B 74 0 316 720 ;\nC 249 ; WX 556 ; N oslash ; B 36 -23 629 541 ;\nC 250 ; WX 944 ; N oe ; B 82 -14 970 532 ;\nC 251 ; WX 500 ; N germandbls ; B 52 -14 554 734 ;\nC -1 ; WX 667 ; N Aacute ; B 15 0 659 915 ;\nC -1 ; WX 667 ; N Acircumflex ; B 15 0 651 915 ;\nC -1 ; WX 667 ; N Adieresis ; B 15 0 651 888 ;\nC -1 ; WX 667 ; N Agrave ; B 15 0 651 915 ;\nC -1 ; WX 667 ; N Aring ; B 15 0 651 979 ;\nC -1 ; WX 667 ; N Atilde ; B 15 0 685 890 ;\nC -1 ; WX 722 ; N Ccedilla ; B 111 -207 771 739 ;\nC -1 ; WX 611 ; N Eacute ; B 81 0 713 915 ;\nC -1 ; WX 611 ; N Ecircumflex ; B 81 0 713 915 ;\nC -1 ; WX 611 ; N Edieresis ; B 81 0 713 888 ;\nC -1 ; WX 611 ; N Egrave ; B 81 0 713 915 ;\nC -1 ; WX 722 ; N Eth ; B 81 0 758 720 ;\nC -1 ; WX 278 ; N Iacute ; B 105 0 445 915 ;\nC -1 ; WX 278 ; N Icircumflex ; B 105 0 436 915 ;\nC -1 ; WX 278 ; N Idieresis ; B 105 0 426 888 ;\nC -1 ; WX 278 ; N Igrave ; B 105 0 372 915 ;\nC -1 ; WX 722 ; N Ntilde ; B 79 0 795 890 ;\nC -1 ; WX 778 ; N Oacute ; B 117 -19 812 915 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 117 -19 812 915 ;\nC -1 ; WX 778 ; N Odieresis ; B 117 -19 812 888 ;\nC -1 ; WX 778 ; N Ograve ; B 117 -19 812 915 ;\nC -1 ; WX 778 ; N Otilde ; B 117 -19 812 890 ;\nC -1 ; WX 611 ; N Scaron ; B 82 -19 663 915 ;\nC -1 ; WX 611 ; N Thorn ; B 78 0 661 720 ;\nC -1 ; WX 722 ; N Uacute ; B 129 -19 793 915 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 129 -19 793 915 ;\nC -1 ; WX 722 ; N Udieresis ; B 129 -19 793 888 ;\nC -1 ; WX 722 ; N Ugrave ; B 129 -19 793 915 ;\nC -1 ; WX 611 ; N Yacute ; B 165 0 751 915 ;\nC -1 ; WX 611 ; N Ydieresis ; B 165 0 751 888 ;\nC -1 ; WX 611 ; N Zcaron ; B 31 0 729 915 ;\nC -1 ; WX 556 ; N aacute ; B 71 -14 561 713 ;\nC -1 ; WX 556 ; N acircumflex ; B 71 -14 555 713 ;\nC -1 ; WX 556 ; N adieresis ; B 71 -14 555 686 ;\nC -1 ; WX 556 ; N agrave ; B 71 -14 555 713 ;\nC -1 ; WX 556 ; N aring ; B 71 -14 555 777 ;\nC -1 ; WX 556 ; N atilde ; B 71 -14 587 688 ;\nC -1 ; WX 222 ; N brokenbar ; B 81 0 298 739 ;\nC -1 ; WX 556 ; N ccedilla ; B 92 -207 576 532 ;\nC -1 ; WX 800 ; N copyright ; B 89 -19 864 739 ;\nC -1 ; WX 400 ; N degree ; B 165 405 471 705 ;\nC -1 ; WX 660 ; N divide ; B 127 0 640 500 ;\nC -1 ; WX 556 ; N eacute ; B 90 -14 575 713 ;\nC -1 ; WX 556 ; N ecircumflex ; B 90 -14 575 713 ;\nC -1 ; WX 556 ; N edieresis ; B 90 -14 575 686 ;\nC -1 ; WX 556 ; N egrave ; B 90 -14 575 713 ;\nC -1 ; WX 556 ; N eth ; B 84 -14 582 739 ;\nC -1 ; WX 222 ; N iacute ; B 78 0 374 713 ;\nC -1 ; WX 222 ; N icircumflex ; B 71 0 365 713 ;\nC -1 ; WX 222 ; N idieresis ; B 78 0 355 686 ;\nC -1 ; WX 222 ; N igrave ; B 78 0 301 713 ;\nC -1 ; WX 660 ; N logicalnot ; B 148 112 660 378 ;\nC -1 ; WX 660 ; N minus ; B 127 220 640 280 ;\nC -1 ; WX 556 ; N mu ; B 29 -204 593 518 ;\nC -1 ; WX 660 ; N multiply ; B 92 6 677 500 ;\nC -1 ; WX 556 ; N ntilde ; B 72 0 587 688 ;\nC -1 ; WX 556 ; N oacute ; B 84 -14 582 713 ;\nC -1 ; WX 556 ; N ocircumflex ; B 84 -14 582 713 ;\nC -1 ; WX 556 ; N odieresis ; B 84 -14 582 686 ;\nC -1 ; WX 556 ; N ograve ; B 84 -14 582 713 ;\nC -1 ; WX 834 ; N onehalf ; B 125 -14 862 739 ;\nC -1 ; WX 834 ; N onequarter ; B 165 -14 823 739 ;\nC -1 ; WX 333 ; N onesuperior ; B 221 316 404 739 ;\nC -1 ; WX 556 ; N otilde ; B 84 -14 587 688 ;\nC -1 ; WX 660 ; N plusminus ; B 80 0 650 500 ;\nC -1 ; WX 800 ; N registered ; B 89 -19 864 739 ;\nC -1 ; WX 500 ; N scaron ; B 78 -14 554 713 ;\nC -1 ; WX 611 ; N thorn ; B 36 -204 620 720 ;\nC -1 ; WX 834 ; N threequarters ; B 131 -14 853 739 ;\nC -1 ; WX 333 ; N threesuperior ; B 102 308 444 739 ;\nC -1 ; WX 940 ; N trademark ; B 174 299 1012 720 ;\nC -1 ; WX 333 ; N twosuperior ; B 82 316 453 739 ;\nC -1 ; WX 556 ; N uacute ; B 103 -14 593 713 ;\nC -1 ; WX 556 ; N ucircumflex ; B 103 -14 593 713 ;\nC -1 ; WX 556 ; N udieresis ; B 103 -14 593 686 ;\nC -1 ; WX 556 ; N ugrave ; B 103 -14 593 713 ;\nC -1 ; WX 500 ; N yacute ; B 26 -204 592 713 ;\nC -1 ; WX 500 ; N ydieresis ; B 26 -204 592 686 ;\nC -1 ; WX 500 ; N zcaron ; B 33 0 564 713 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 115\n\nKPX A y -18\nKPX A w -18\nKPX A v -18\nKPX A quoteright -74\nKPX A Y -74\nKPX A W -37\nKPX A V -74\nKPX A T -92\n\nKPX F period -129\nKPX F comma -129\nKPX F A -55\n\nKPX L y -37\nKPX L quoteright -74\nKPX L Y -111\nKPX L W -55\nKPX L V -92\nKPX L T -92\n\nKPX P period -129\nKPX P comma -129\nKPX P A -74\n\nKPX R y 0\nKPX R Y -37\nKPX R W -18\nKPX R V -18\nKPX R T -18\n\nKPX T y -84\nKPX T w -84\nKPX T u -92\nKPX T semicolon -111\nKPX T s -111\nKPX T r -92\nKPX T period -111\nKPX T o -111\nKPX T i 0\nKPX T hyphen -129\nKPX T e -111\nKPX T comma -111\nKPX T colon -111\nKPX T c -111\nKPX T a -111\nKPX T A -92\n\nKPX V y -18\nKPX V u -37\nKPX V semicolon -74\nKPX V r -37\nKPX V period -129\nKPX V o -55\nKPX V i -18\nKPX V hyphen -55\nKPX V e -55\nKPX V comma -129\nKPX V colon -74\nKPX V a -55\nKPX V A -74\n\nKPX W y 0\nKPX W u -18\nKPX W semicolon -18\nKPX W r -18\nKPX W period -74\nKPX W o -18\nKPX W i 0\nKPX W hyphen 0\nKPX W e -18\nKPX W comma -74\nKPX W colon -18\nKPX W a -37\nKPX W A -37\n\nKPX Y v -40\nKPX Y u -37\nKPX Y semicolon -92\nKPX Y q -92\nKPX Y period -111\nKPX Y p -37\nKPX Y o -92\nKPX Y i -20\nKPX Y hyphen -111\nKPX Y e -92\nKPX Y comma -111\nKPX Y colon -92\nKPX Y a -92\nKPX Y A -74\n\nKPX f quoteright 18\nKPX f f -18\n\nKPX quoteleft quoteleft -18\n\nKPX quoteright t -18\nKPX quoteright s -74\nKPX quoteright quoteright -18\n\nKPX r z 0\nKPX r y 18\nKPX r x 0\nKPX r w 0\nKPX r v 0\nKPX r u 0\nKPX r t 18\nKPX r r 0\nKPX r quoteright 0\nKPX r q -18\nKPX r period -92\nKPX r o -18\nKPX r n 18\nKPX r m 18\nKPX r hyphen -55\nKPX r h 0\nKPX r g 0\nKPX r f 18\nKPX r e -18\nKPX r d -18\nKPX r comma -92\nKPX r c -18\n\nKPX v period -74\nKPX v comma -74\n\nKPX w period -55\nKPX w comma -55\n\nKPX y period -92\nKPX y comma -92\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 139 202 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 83 0 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 139 202 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 83 0 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 194 0 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 111 0 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 139 202 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 83 0 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 139 202 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 83 0 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 194 202 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 194 202 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 194 202 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 194 202 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 111 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 111 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 111 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 111 0 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute -47 202 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -47 202 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -47 202 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave -27 202 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -75 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -75 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -75 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -55 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 139 202 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 139 202 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 139 202 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 139 202 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 111 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 111 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 111 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 111 0 ;\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 167 202 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 167 202 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 167 202 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 167 202 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 111 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 111 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 111 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 111 0 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 222 202 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 222 202 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 222 202 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 222 202 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 111 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 111 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 111 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 111 0 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 167 202 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 111 0 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 194 202 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 111 0 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 222 202 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 111 0 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 187 202 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 111 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/phvr8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All rights reserved.\nComment Creation Date: Thu Mar 15 08:58:00 1990\nComment UniqueID 28352\nComment VMusage 26389 33281\nFontName Helvetica\nFullName Helvetica\nFamilyName Helvetica\nWeight Medium\nItalicAngle 0\nIsFixedPitch false\nFontBBox -166 -225 1000 931\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.006\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All rights reserved.Helvetica is a trademark of Linotype AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 718\nXHeight 523\nAscender 718\nDescender -207\nStartCharMetrics 228\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 278 ; N exclam ; B 90 0 187 718 ;\nC 34 ; WX 355 ; N quotedbl ; B 70 463 285 718 ;\nC 35 ; WX 556 ; N numbersign ; B 28 0 529 688 ;\nC 36 ; WX 556 ; N dollar ; B 32 -115 520 775 ;\nC 37 ; WX 889 ; N percent ; B 39 -19 850 703 ;\nC 38 ; WX 667 ; N ampersand ; B 44 -15 645 718 ;\nC 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ;\nC 40 ; WX 333 ; N parenleft ; B 68 -207 299 733 ;\nC 41 ; WX 333 ; N parenright ; B 34 -207 265 733 ;\nC 42 ; WX 389 ; N asterisk ; B 39 431 349 718 ;\nC 43 ; WX 584 ; N plus ; B 39 0 545 505 ;\nC 44 ; WX 278 ; N comma ; B 87 -147 191 106 ;\nC 45 ; WX 333 ; N hyphen ; B 44 232 289 322 ;\nC 46 ; WX 278 ; N period ; B 87 0 191 106 ;\nC 47 ; WX 278 ; N slash ; B -17 -19 295 737 ;\nC 48 ; WX 556 ; N zero ; B 37 -19 519 703 ;\nC 49 ; WX 556 ; N one ; B 101 0 359 703 ;\nC 50 ; WX 556 ; N two ; B 26 0 507 703 ;\nC 51 ; WX 556 ; N three ; B 34 -19 522 703 ;\nC 52 ; WX 556 ; N four ; B 25 0 523 703 ;\nC 53 ; WX 556 ; N five ; B 32 -19 514 688 ;\nC 54 ; WX 556 ; N six ; B 38 -19 518 703 ;\nC 55 ; WX 556 ; N seven ; B 37 0 523 688 ;\nC 56 ; WX 556 ; N eight ; B 38 -19 517 703 ;\nC 57 ; WX 556 ; N nine ; B 42 -19 514 703 ;\nC 58 ; WX 278 ; N colon ; B 87 0 191 516 ;\nC 59 ; WX 278 ; N semicolon ; B 87 -147 191 516 ;\nC 60 ; WX 584 ; N less ; B 48 11 536 495 ;\nC 61 ; WX 584 ; N equal ; B 39 115 545 390 ;\nC 62 ; WX 584 ; N greater ; B 48 11 536 495 ;\nC 63 ; WX 556 ; N question ; B 56 0 492 727 ;\nC 64 ; WX 1015 ; N at ; B 147 -19 868 737 ;\nC 65 ; WX 667 ; N A ; B 14 0 654 718 ;\nC 66 ; WX 667 ; N B ; B 74 0 627 718 ;\nC 67 ; WX 722 ; N C ; B 44 -19 681 737 ;\nC 68 ; WX 722 ; N D ; B 81 0 674 718 ;\nC 69 ; WX 667 ; N E ; B 86 0 616 718 ;\nC 70 ; WX 611 ; N F ; B 86 0 583 718 ;\nC 71 ; WX 778 ; N G ; B 48 -19 704 737 ;\nC 72 ; WX 722 ; N H ; B 77 0 646 718 ;\nC 73 ; WX 278 ; N I ; B 91 0 188 718 ;\nC 74 ; WX 500 ; N J ; B 17 -19 428 718 ;\nC 75 ; WX 667 ; N K ; B 76 0 663 718 ;\nC 76 ; WX 556 ; N L ; B 76 0 537 718 ;\nC 77 ; WX 833 ; N M ; B 73 0 761 718 ;\nC 78 ; WX 722 ; N N ; B 76 0 646 718 ;\nC 79 ; WX 778 ; N O ; B 39 -19 739 737 ;\nC 80 ; WX 667 ; N P ; B 86 0 622 718 ;\nC 81 ; WX 778 ; N Q ; B 39 -56 739 737 ;\nC 82 ; WX 722 ; N R ; B 88 0 684 718 ;\nC 83 ; WX 667 ; N S ; B 49 -19 620 737 ;\nC 84 ; WX 611 ; N T ; B 14 0 597 718 ;\nC 85 ; WX 722 ; N U ; B 79 -19 644 718 ;\nC 86 ; WX 667 ; N V ; B 20 0 647 718 ;\nC 87 ; WX 944 ; N W ; B 16 0 928 718 ;\nC 88 ; WX 667 ; N X ; B 19 0 648 718 ;\nC 89 ; WX 667 ; N Y ; B 14 0 653 718 ;\nC 90 ; WX 611 ; N Z ; B 23 0 588 718 ;\nC 91 ; WX 278 ; N bracketleft ; B 63 -196 250 722 ;\nC 92 ; WX 278 ; N backslash ; B -17 -19 295 737 ;\nC 93 ; WX 278 ; N bracketright ; B 28 -196 215 722 ;\nC 94 ; WX 469 ; N asciicircum ; B -14 264 483 688 ;\nC 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ;\nC 96 ; WX 222 ; N quoteleft ; B 65 470 169 725 ;\nC 97 ; WX 556 ; N a ; B 36 -15 530 538 ;\nC 98 ; WX 556 ; N b ; B 58 -15 517 718 ;\nC 99 ; WX 500 ; N c ; B 30 -15 477 538 ;\nC 100 ; WX 556 ; N d ; B 35 -15 499 718 ;\nC 101 ; WX 556 ; N e ; B 40 -15 516 538 ;\nC 102 ; WX 278 ; N f ; B 14 0 262 728 ; L i fi ; L l fl ;\nC 103 ; WX 556 ; N g ; B 40 -220 499 538 ;\nC 104 ; WX 556 ; N h ; B 65 0 491 718 ;\nC 105 ; WX 222 ; N i ; B 67 0 155 718 ;\nC 106 ; WX 222 ; N j ; B -16 -210 155 718 ;\nC 107 ; WX 500 ; N k ; B 67 0 501 718 ;\nC 108 ; WX 222 ; N l ; B 67 0 155 718 ;\nC 109 ; WX 833 ; N m ; B 65 0 769 538 ;\nC 110 ; WX 556 ; N n ; B 65 0 491 538 ;\nC 111 ; WX 556 ; N o ; B 35 -14 521 538 ;\nC 112 ; WX 556 ; N p ; B 58 -207 517 538 ;\nC 113 ; WX 556 ; N q ; B 35 -207 494 538 ;\nC 114 ; WX 333 ; N r ; B 77 0 332 538 ;\nC 115 ; WX 500 ; N s ; B 32 -15 464 538 ;\nC 116 ; WX 278 ; N t ; B 14 -7 257 669 ;\nC 117 ; WX 556 ; N u ; B 68 -15 489 523 ;\nC 118 ; WX 500 ; N v ; B 8 0 492 523 ;\nC 119 ; WX 722 ; N w ; B 14 0 709 523 ;\nC 120 ; WX 500 ; N x ; B 11 0 490 523 ;\nC 121 ; WX 500 ; N y ; B 11 -214 489 523 ;\nC 122 ; WX 500 ; N z ; B 31 0 469 523 ;\nC 123 ; WX 334 ; N braceleft ; B 42 -196 292 722 ;\nC 124 ; WX 260 ; N bar ; B 94 -19 167 737 ;\nC 125 ; WX 334 ; N braceright ; B 42 -196 292 722 ;\nC 126 ; WX 584 ; N asciitilde ; B 61 180 523 326 ;\nC 161 ; WX 333 ; N exclamdown ; B 118 -195 215 523 ;\nC 162 ; WX 556 ; N cent ; B 51 -115 513 623 ;\nC 163 ; WX 556 ; N sterling ; B 33 -16 539 718 ;\nC 164 ; WX 167 ; N fraction ; B -166 -19 333 703 ;\nC 165 ; WX 556 ; N yen ; B 3 0 553 688 ;\nC 166 ; WX 556 ; N florin ; B -11 -207 501 737 ;\nC 167 ; WX 556 ; N section ; B 43 -191 512 737 ;\nC 168 ; WX 556 ; N currency ; B 28 99 528 603 ;\nC 169 ; WX 191 ; N quotesingle ; B 59 463 132 718 ;\nC 170 ; WX 333 ; N quotedblleft ; B 38 470 307 725 ;\nC 171 ; WX 556 ; N guillemotleft ; B 97 108 459 446 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 88 108 245 446 ;\nC 173 ; WX 333 ; N guilsinglright ; B 88 108 245 446 ;\nC 174 ; WX 500 ; N fi ; B 14 0 434 728 ;\nC 175 ; WX 500 ; N fl ; B 14 0 432 728 ;\nC 177 ; WX 556 ; N endash ; B 0 240 556 313 ;\nC 178 ; WX 556 ; N dagger ; B 43 -159 514 718 ;\nC 179 ; WX 556 ; N daggerdbl ; B 43 -159 514 718 ;\nC 180 ; WX 278 ; N periodcentered ; B 77 190 202 315 ;\nC 182 ; WX 537 ; N paragraph ; B 18 -173 497 718 ;\nC 183 ; WX 350 ; N bullet ; B 18 202 333 517 ;\nC 184 ; WX 222 ; N quotesinglbase ; B 53 -149 157 106 ;\nC 185 ; WX 333 ; N quotedblbase ; B 26 -149 295 106 ;\nC 186 ; WX 333 ; N quotedblright ; B 26 463 295 718 ;\nC 187 ; WX 556 ; N guillemotright ; B 97 108 459 446 ;\nC 188 ; WX 1000 ; N ellipsis ; B 115 0 885 106 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -19 994 703 ;\nC 191 ; WX 611 ; N questiondown ; B 91 -201 527 525 ;\nC 193 ; WX 333 ; N grave ; B 14 593 211 734 ;\nC 194 ; WX 333 ; N acute ; B 122 593 319 734 ;\nC 195 ; WX 333 ; N circumflex ; B 21 593 312 734 ;\nC 196 ; WX 333 ; N tilde ; B -4 606 337 722 ;\nC 197 ; WX 333 ; N macron ; B 10 627 323 684 ;\nC 198 ; WX 333 ; N breve ; B 13 595 321 731 ;\nC 199 ; WX 333 ; N dotaccent ; B 121 604 212 706 ;\nC 200 ; WX 333 ; N dieresis ; B 40 604 293 706 ;\nC 202 ; WX 333 ; N ring ; B 75 572 259 756 ;\nC 203 ; WX 333 ; N cedilla ; B 45 -225 259 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 31 593 409 734 ;\nC 206 ; WX 333 ; N ogonek ; B 73 -225 287 0 ;\nC 207 ; WX 333 ; N caron ; B 21 593 312 734 ;\nC 208 ; WX 1000 ; N emdash ; B 0 240 1000 313 ;\nC 225 ; WX 1000 ; N AE ; B 8 0 951 718 ;\nC 227 ; WX 370 ; N ordfeminine ; B 24 304 346 737 ;\nC 232 ; WX 556 ; N Lslash ; B -20 0 537 718 ;\nC 233 ; WX 778 ; N Oslash ; B 39 -19 740 737 ;\nC 234 ; WX 1000 ; N OE ; B 36 -19 965 737 ;\nC 235 ; WX 365 ; N ordmasculine ; B 25 304 341 737 ;\nC 241 ; WX 889 ; N ae ; B 36 -15 847 538 ;\nC 245 ; WX 278 ; N dotlessi ; B 95 0 183 523 ;\nC 248 ; WX 222 ; N lslash ; B -20 0 242 718 ;\nC 249 ; WX 611 ; N oslash ; B 28 -22 537 545 ;\nC 250 ; WX 944 ; N oe ; B 35 -15 902 538 ;\nC 251 ; WX 611 ; N germandbls ; B 67 -15 571 728 ;\nC -1 ; WX 611 ; N Zcaron ; B 23 0 588 929 ;\nC -1 ; WX 500 ; N ccedilla ; B 30 -225 477 538 ;\nC -1 ; WX 500 ; N ydieresis ; B 11 -214 489 706 ;\nC -1 ; WX 556 ; N atilde ; B 36 -15 530 722 ;\nC -1 ; WX 278 ; N icircumflex ; B -6 0 285 734 ;\nC -1 ; WX 333 ; N threesuperior ; B 5 270 325 703 ;\nC -1 ; WX 556 ; N ecircumflex ; B 40 -15 516 734 ;\nC -1 ; WX 556 ; N thorn ; B 58 -207 517 718 ;\nC -1 ; WX 556 ; N egrave ; B 40 -15 516 734 ;\nC -1 ; WX 333 ; N twosuperior ; B 4 281 323 703 ;\nC -1 ; WX 556 ; N eacute ; B 40 -15 516 734 ;\nC -1 ; WX 556 ; N otilde ; B 35 -14 521 722 ;\nC -1 ; WX 667 ; N Aacute ; B 14 0 654 929 ;\nC -1 ; WX 556 ; N ocircumflex ; B 35 -14 521 734 ;\nC -1 ; WX 500 ; N yacute ; B 11 -214 489 734 ;\nC -1 ; WX 556 ; N udieresis ; B 68 -15 489 706 ;\nC -1 ; WX 834 ; N threequarters ; B 45 -19 810 703 ;\nC -1 ; WX 556 ; N acircumflex ; B 36 -15 530 734 ;\nC -1 ; WX 722 ; N Eth ; B 0 0 674 718 ;\nC -1 ; WX 556 ; N edieresis ; B 40 -15 516 706 ;\nC -1 ; WX 556 ; N ugrave ; B 68 -15 489 734 ;\nC -1 ; WX 1000 ; N trademark ; B 46 306 903 718 ;\nC -1 ; WX 556 ; N ograve ; B 35 -14 521 734 ;\nC -1 ; WX 500 ; N scaron ; B 32 -15 464 734 ;\nC -1 ; WX 278 ; N Idieresis ; B 13 0 266 901 ;\nC -1 ; WX 556 ; N uacute ; B 68 -15 489 734 ;\nC -1 ; WX 556 ; N agrave ; B 36 -15 530 734 ;\nC -1 ; WX 556 ; N ntilde ; B 65 0 491 722 ;\nC -1 ; WX 556 ; N aring ; B 36 -15 530 756 ;\nC -1 ; WX 500 ; N zcaron ; B 31 0 469 734 ;\nC -1 ; WX 278 ; N Icircumflex ; B -6 0 285 929 ;\nC -1 ; WX 722 ; N Ntilde ; B 76 0 646 917 ;\nC -1 ; WX 556 ; N ucircumflex ; B 68 -15 489 734 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 86 0 616 929 ;\nC -1 ; WX 278 ; N Iacute ; B 91 0 292 929 ;\nC -1 ; WX 722 ; N Ccedilla ; B 44 -225 681 737 ;\nC -1 ; WX 778 ; N Odieresis ; B 39 -19 739 901 ;\nC -1 ; WX 667 ; N Scaron ; B 49 -19 620 929 ;\nC -1 ; WX 667 ; N Edieresis ; B 86 0 616 901 ;\nC -1 ; WX 278 ; N Igrave ; B -13 0 188 929 ;\nC -1 ; WX 556 ; N adieresis ; B 36 -15 530 706 ;\nC -1 ; WX 778 ; N Ograve ; B 39 -19 739 929 ;\nC -1 ; WX 667 ; N Egrave ; B 86 0 616 929 ;\nC -1 ; WX 667 ; N Ydieresis ; B 14 0 653 901 ;\nC -1 ; WX 737 ; N registered ; B -14 -19 752 737 ;\nC -1 ; WX 778 ; N Otilde ; B 39 -19 739 917 ;\nC -1 ; WX 834 ; N onequarter ; B 73 -19 756 703 ;\nC -1 ; WX 722 ; N Ugrave ; B 79 -19 644 929 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 79 -19 644 929 ;\nC -1 ; WX 667 ; N Thorn ; B 86 0 622 718 ;\nC -1 ; WX 584 ; N divide ; B 39 -19 545 524 ;\nC -1 ; WX 667 ; N Atilde ; B 14 0 654 917 ;\nC -1 ; WX 722 ; N Uacute ; B 79 -19 644 929 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 39 -19 739 929 ;\nC -1 ; WX 584 ; N logicalnot ; B 39 108 545 390 ;\nC -1 ; WX 667 ; N Aring ; B 14 0 654 931 ;\nC -1 ; WX 278 ; N idieresis ; B 13 0 266 706 ;\nC -1 ; WX 278 ; N iacute ; B 95 0 292 734 ;\nC -1 ; WX 556 ; N aacute ; B 36 -15 530 734 ;\nC -1 ; WX 584 ; N plusminus ; B 39 0 545 506 ;\nC -1 ; WX 584 ; N multiply ; B 39 0 545 506 ;\nC -1 ; WX 722 ; N Udieresis ; B 79 -19 644 901 ;\nC -1 ; WX 584 ; N minus ; B 39 216 545 289 ;\nC -1 ; WX 333 ; N onesuperior ; B 43 281 222 703 ;\nC -1 ; WX 667 ; N Eacute ; B 86 0 616 929 ;\nC -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ;\nC -1 ; WX 737 ; N copyright ; B -14 -19 752 737 ;\nC -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ;\nC -1 ; WX 556 ; N odieresis ; B 35 -14 521 706 ;\nC -1 ; WX 556 ; N oacute ; B 35 -14 521 734 ;\nC -1 ; WX 400 ; N degree ; B 54 411 346 703 ;\nC -1 ; WX 278 ; N igrave ; B -13 0 184 734 ;\nC -1 ; WX 556 ; N mu ; B 68 -207 489 523 ;\nC -1 ; WX 778 ; N Oacute ; B 39 -19 739 929 ;\nC -1 ; WX 556 ; N eth ; B 35 -15 522 737 ;\nC -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ;\nC -1 ; WX 667 ; N Yacute ; B 14 0 653 929 ;\nC -1 ; WX 260 ; N brokenbar ; B 94 -19 167 737 ;\nC -1 ; WX 834 ; N onehalf ; B 43 -19 773 703 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 250\n\nKPX A y -40\nKPX A w -40\nKPX A v -40\nKPX A u -30\nKPX A Y -100\nKPX A W -50\nKPX A V -70\nKPX A U -50\nKPX A T -120\nKPX A Q -30\nKPX A O -30\nKPX A G -30\nKPX A C -30\n\nKPX B period -20\nKPX B comma -20\nKPX B U -10\n\nKPX C period -30\nKPX C comma -30\n\nKPX D period -70\nKPX D comma -70\nKPX D Y -90\nKPX D W -40\nKPX D V -70\nKPX D A -40\n\nKPX F r -45\nKPX F period -150\nKPX F o -30\nKPX F e -30\nKPX F comma -150\nKPX F a -50\nKPX F A -80\n\nKPX J u -20\nKPX J period -30\nKPX J comma -30\nKPX J a -20\nKPX J A -20\n\nKPX K y -50\nKPX K u -30\nKPX K o -40\nKPX K e -40\nKPX K O -50\n\nKPX L y -30\nKPX L quoteright -160\nKPX L quotedblright -140\nKPX L Y -140\nKPX L W -70\nKPX L V -110\nKPX L T -110\n\nKPX O period -40\nKPX O comma -40\nKPX O Y -70\nKPX O X -60\nKPX O W -30\nKPX O V -50\nKPX O T -40\nKPX O A -20\n\nKPX P period -180\nKPX P o -50\nKPX P e -50\nKPX P comma -180\nKPX P a -40\nKPX P A -120\n\nKPX Q U -10\n\nKPX R Y -50\nKPX R W -30\nKPX R V -50\nKPX R U -40\nKPX R T -30\nKPX R O -20\n\nKPX S period -20\nKPX S comma -20\n\nKPX T y -120\nKPX T w -120\nKPX T u -120\nKPX T semicolon -20\nKPX T r -120\nKPX T period -120\nKPX T o -120\nKPX T hyphen -140\nKPX T e -120\nKPX T comma -120\nKPX T colon -20\nKPX T a -120\nKPX T O -40\nKPX T A -120\n\nKPX U period -40\nKPX U comma -40\nKPX U A -40\n\nKPX V u -70\nKPX V semicolon -40\nKPX V period -125\nKPX V o -80\nKPX V hyphen -80\nKPX V e -80\nKPX V comma -125\nKPX V colon -40\nKPX V a -70\nKPX V O -40\nKPX V G -40\nKPX V A -80\n\nKPX W y -20\nKPX W u -30\nKPX W period -80\nKPX W o -30\nKPX W hyphen -40\nKPX W e -30\nKPX W comma -80\nKPX W a -40\nKPX W O -20\nKPX W A -50\n\nKPX Y u -110\nKPX Y semicolon -60\nKPX Y period -140\nKPX Y o -140\nKPX Y i -20\nKPX Y hyphen -140\nKPX Y e -140\nKPX Y comma -140\nKPX Y colon -60\nKPX Y a -140\nKPX Y O -85\nKPX Y A -110\n\nKPX a y -30\nKPX a w -20\nKPX a v -20\n\nKPX b y -20\nKPX b v -20\nKPX b u -20\nKPX b period -40\nKPX b l -20\nKPX b comma -40\nKPX b b -10\n\nKPX c k -20\nKPX c comma -15\n\nKPX colon space -50\n\nKPX comma quoteright -100\nKPX comma quotedblright -100\n\nKPX e y -20\nKPX e x -30\nKPX e w -20\nKPX e v -30\nKPX e period -15\nKPX e comma -15\n\nKPX f quoteright 50\nKPX f quotedblright 60\nKPX f period -30\nKPX f o -30\nKPX f e -30\nKPX f dotlessi -28\nKPX f comma -30\nKPX f a -30\n\nKPX g r -10\n\nKPX h y -30\n\nKPX k o -20\nKPX k e -20\n\nKPX m y -15\nKPX m u -10\n\nKPX n y -15\nKPX n v -20\nKPX n u -10\n\nKPX o y -30\nKPX o x -30\nKPX o w -15\nKPX o v -15\nKPX o period -40\nKPX o comma -40\n\nKPX oslash z -55\nKPX oslash y -70\nKPX oslash x -85\nKPX oslash w -70\nKPX oslash v -70\nKPX oslash u -55\nKPX oslash t -55\nKPX oslash s -55\nKPX oslash r -55\nKPX oslash q -55\nKPX oslash period -95\nKPX oslash p -55\nKPX oslash o -55\nKPX oslash n -55\nKPX oslash m -55\nKPX oslash l -55\nKPX oslash k -55\nKPX oslash j -55\nKPX oslash i -55\nKPX oslash h -55\nKPX oslash g -55\nKPX oslash f -55\nKPX oslash e -55\nKPX oslash d -55\nKPX oslash comma -95\nKPX oslash c -55\nKPX oslash b -55\nKPX oslash a -55\n\nKPX p y -30\nKPX p period -35\nKPX p comma -35\n\nKPX period space -60\nKPX period quoteright -100\nKPX period quotedblright -100\n\nKPX quotedblright space -40\n\nKPX quoteleft quoteleft -57\n\nKPX quoteright space -70\nKPX quoteright s -50\nKPX quoteright r -50\nKPX quoteright quoteright -57\nKPX quoteright d -50\n\nKPX r y 30\nKPX r v 30\nKPX r u 15\nKPX r t 40\nKPX r semicolon 30\nKPX r period -50\nKPX r p 30\nKPX r n 25\nKPX r m 25\nKPX r l 15\nKPX r k 15\nKPX r i 15\nKPX r comma -50\nKPX r colon 30\nKPX r a -10\n\nKPX s w -30\nKPX s period -15\nKPX s comma -15\n\nKPX semicolon space -50\n\nKPX space quoteleft -60\nKPX space quotedblleft -30\nKPX space Y -90\nKPX space W -40\nKPX space V -50\nKPX space T -50\n\nKPX v period -80\nKPX v o -25\nKPX v e -25\nKPX v comma -80\nKPX v a -25\n\nKPX w period -60\nKPX w o -10\nKPX w e -10\nKPX w comma -60\nKPX w a -15\n\nKPX x e -30\n\nKPX y period -100\nKPX y o -20\nKPX y e -20\nKPX y comma -100\nKPX y a -20\n\nKPX z o -15\nKPX z e -15\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 167 195 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 167 195 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 167 195 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 167 195 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 167 175 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 167 195 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 195 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 167 195 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 167 195 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 167 195 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 167 195 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute -27 195 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -27 195 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -27 195 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave -27 195 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 205 195 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 223 195 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 223 195 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 223 195 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 223 195 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 223 195 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 167 195 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 195 195 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 195 195 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 195 195 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 195 195 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 167 195 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 167 195 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 139 195 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 112 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 112 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 112 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 112 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 112 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 102 0 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 84 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 112 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 112 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 112 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 112 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -27 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 102 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 112 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 112 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 112 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 112 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 112 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 84 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 112 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 112 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 112 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 112 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 84 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 84 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 84 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/phvr8an.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All rights reserved.\nComment Creation Date: Thu Mar 15 11:04:57 1990\nComment UniqueID 28380\nComment VMusage 7572 42473\nFontName Helvetica-Narrow\nFullName Helvetica Narrow\nFamilyName Helvetica\nWeight Medium\nItalicAngle 0\nIsFixedPitch false\nFontBBox -136 -225 820 931\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.006\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All rights reserved.Helvetica is a trademark of Linotype AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 718\nXHeight 523\nAscender 718\nDescender -207\nStartCharMetrics 228\nC 32 ; WX 228 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 228 ; N exclam ; B 74 0 153 718 ;\nC 34 ; WX 291 ; N quotedbl ; B 57 463 234 718 ;\nC 35 ; WX 456 ; N numbersign ; B 23 0 434 688 ;\nC 36 ; WX 456 ; N dollar ; B 26 -115 426 775 ;\nC 37 ; WX 729 ; N percent ; B 32 -19 697 703 ;\nC 38 ; WX 547 ; N ampersand ; B 36 -15 529 718 ;\nC 39 ; WX 182 ; N quoteright ; B 43 463 129 718 ;\nC 40 ; WX 273 ; N parenleft ; B 56 -207 245 733 ;\nC 41 ; WX 273 ; N parenright ; B 28 -207 217 733 ;\nC 42 ; WX 319 ; N asterisk ; B 32 431 286 718 ;\nC 43 ; WX 479 ; N plus ; B 32 0 447 505 ;\nC 44 ; WX 228 ; N comma ; B 71 -147 157 106 ;\nC 45 ; WX 273 ; N hyphen ; B 36 232 237 322 ;\nC 46 ; WX 228 ; N period ; B 71 0 157 106 ;\nC 47 ; WX 228 ; N slash ; B -14 -19 242 737 ;\nC 48 ; WX 456 ; N zero ; B 30 -19 426 703 ;\nC 49 ; WX 456 ; N one ; B 83 0 294 703 ;\nC 50 ; WX 456 ; N two ; B 21 0 416 703 ;\nC 51 ; WX 456 ; N three ; B 28 -19 428 703 ;\nC 52 ; WX 456 ; N four ; B 20 0 429 703 ;\nC 53 ; WX 456 ; N five ; B 26 -19 421 688 ;\nC 54 ; WX 456 ; N six ; B 31 -19 425 703 ;\nC 55 ; WX 456 ; N seven ; B 30 0 429 688 ;\nC 56 ; WX 456 ; N eight ; B 31 -19 424 703 ;\nC 57 ; WX 456 ; N nine ; B 34 -19 421 703 ;\nC 58 ; WX 228 ; N colon ; B 71 0 157 516 ;\nC 59 ; WX 228 ; N semicolon ; B 71 -147 157 516 ;\nC 60 ; WX 479 ; N less ; B 39 11 440 495 ;\nC 61 ; WX 479 ; N equal ; B 32 115 447 390 ;\nC 62 ; WX 479 ; N greater ; B 39 11 440 495 ;\nC 63 ; WX 456 ; N question ; B 46 0 403 727 ;\nC 64 ; WX 832 ; N at ; B 121 -19 712 737 ;\nC 65 ; WX 547 ; N A ; B 11 0 536 718 ;\nC 66 ; WX 547 ; N B ; B 61 0 514 718 ;\nC 67 ; WX 592 ; N C ; B 36 -19 558 737 ;\nC 68 ; WX 592 ; N D ; B 66 0 553 718 ;\nC 69 ; WX 547 ; N E ; B 71 0 505 718 ;\nC 70 ; WX 501 ; N F ; B 71 0 478 718 ;\nC 71 ; WX 638 ; N G ; B 39 -19 577 737 ;\nC 72 ; WX 592 ; N H ; B 63 0 530 718 ;\nC 73 ; WX 228 ; N I ; B 75 0 154 718 ;\nC 74 ; WX 410 ; N J ; B 14 -19 351 718 ;\nC 75 ; WX 547 ; N K ; B 62 0 544 718 ;\nC 76 ; WX 456 ; N L ; B 62 0 440 718 ;\nC 77 ; WX 683 ; N M ; B 60 0 624 718 ;\nC 78 ; WX 592 ; N N ; B 62 0 530 718 ;\nC 79 ; WX 638 ; N O ; B 32 -19 606 737 ;\nC 80 ; WX 547 ; N P ; B 71 0 510 718 ;\nC 81 ; WX 638 ; N Q ; B 32 -56 606 737 ;\nC 82 ; WX 592 ; N R ; B 72 0 561 718 ;\nC 83 ; WX 547 ; N S ; B 40 -19 508 737 ;\nC 84 ; WX 501 ; N T ; B 11 0 490 718 ;\nC 85 ; WX 592 ; N U ; B 65 -19 528 718 ;\nC 86 ; WX 547 ; N V ; B 16 0 531 718 ;\nC 87 ; WX 774 ; N W ; B 13 0 761 718 ;\nC 88 ; WX 547 ; N X ; B 16 0 531 718 ;\nC 89 ; WX 547 ; N Y ; B 11 0 535 718 ;\nC 90 ; WX 501 ; N Z ; B 19 0 482 718 ;\nC 91 ; WX 228 ; N bracketleft ; B 52 -196 205 722 ;\nC 92 ; WX 228 ; N backslash ; B -14 -19 242 737 ;\nC 93 ; WX 228 ; N bracketright ; B 23 -196 176 722 ;\nC 94 ; WX 385 ; N asciicircum ; B -11 264 396 688 ;\nC 95 ; WX 456 ; N underscore ; B 0 -125 456 -75 ;\nC 96 ; WX 182 ; N quoteleft ; B 53 470 139 725 ;\nC 97 ; WX 456 ; N a ; B 30 -15 435 538 ;\nC 98 ; WX 456 ; N b ; B 48 -15 424 718 ;\nC 99 ; WX 410 ; N c ; B 25 -15 391 538 ;\nC 100 ; WX 456 ; N d ; B 29 -15 409 718 ;\nC 101 ; WX 456 ; N e ; B 33 -15 423 538 ;\nC 102 ; WX 228 ; N f ; B 11 0 215 728 ; L i fi ; L l fl ;\nC 103 ; WX 456 ; N g ; B 33 -220 409 538 ;\nC 104 ; WX 456 ; N h ; B 53 0 403 718 ;\nC 105 ; WX 182 ; N i ; B 55 0 127 718 ;\nC 106 ; WX 182 ; N j ; B -13 -210 127 718 ;\nC 107 ; WX 410 ; N k ; B 55 0 411 718 ;\nC 108 ; WX 182 ; N l ; B 55 0 127 718 ;\nC 109 ; WX 683 ; N m ; B 53 0 631 538 ;\nC 110 ; WX 456 ; N n ; B 53 0 403 538 ;\nC 111 ; WX 456 ; N o ; B 29 -14 427 538 ;\nC 112 ; WX 456 ; N p ; B 48 -207 424 538 ;\nC 113 ; WX 456 ; N q ; B 29 -207 405 538 ;\nC 114 ; WX 273 ; N r ; B 63 0 272 538 ;\nC 115 ; WX 410 ; N s ; B 26 -15 380 538 ;\nC 116 ; WX 228 ; N t ; B 11 -7 211 669 ;\nC 117 ; WX 456 ; N u ; B 56 -15 401 523 ;\nC 118 ; WX 410 ; N v ; B 7 0 403 523 ;\nC 119 ; WX 592 ; N w ; B 11 0 581 523 ;\nC 120 ; WX 410 ; N x ; B 9 0 402 523 ;\nC 121 ; WX 410 ; N y ; B 9 -214 401 523 ;\nC 122 ; WX 410 ; N z ; B 25 0 385 523 ;\nC 123 ; WX 274 ; N braceleft ; B 34 -196 239 722 ;\nC 124 ; WX 213 ; N bar ; B 77 -19 137 737 ;\nC 125 ; WX 274 ; N braceright ; B 34 -196 239 722 ;\nC 126 ; WX 479 ; N asciitilde ; B 50 180 429 326 ;\nC 161 ; WX 273 ; N exclamdown ; B 97 -195 176 523 ;\nC 162 ; WX 456 ; N cent ; B 42 -115 421 623 ;\nC 163 ; WX 456 ; N sterling ; B 27 -16 442 718 ;\nC 164 ; WX 137 ; N fraction ; B -136 -19 273 703 ;\nC 165 ; WX 456 ; N yen ; B 2 0 453 688 ;\nC 166 ; WX 456 ; N florin ; B -9 -207 411 737 ;\nC 167 ; WX 456 ; N section ; B 35 -191 420 737 ;\nC 168 ; WX 456 ; N currency ; B 23 99 433 603 ;\nC 169 ; WX 157 ; N quotesingle ; B 48 463 108 718 ;\nC 170 ; WX 273 ; N quotedblleft ; B 31 470 252 725 ;\nC 171 ; WX 456 ; N guillemotleft ; B 80 108 376 446 ;\nC 172 ; WX 273 ; N guilsinglleft ; B 72 108 201 446 ;\nC 173 ; WX 273 ; N guilsinglright ; B 72 108 201 446 ;\nC 174 ; WX 410 ; N fi ; B 11 0 356 728 ;\nC 175 ; WX 410 ; N fl ; B 11 0 354 728 ;\nC 177 ; WX 456 ; N endash ; B 0 240 456 313 ;\nC 178 ; WX 456 ; N dagger ; B 35 -159 421 718 ;\nC 179 ; WX 456 ; N daggerdbl ; B 35 -159 421 718 ;\nC 180 ; WX 228 ; N periodcentered ; B 63 190 166 315 ;\nC 182 ; WX 440 ; N paragraph ; B 15 -173 408 718 ;\nC 183 ; WX 287 ; N bullet ; B 15 202 273 517 ;\nC 184 ; WX 182 ; N quotesinglbase ; B 43 -149 129 106 ;\nC 185 ; WX 273 ; N quotedblbase ; B 21 -149 242 106 ;\nC 186 ; WX 273 ; N quotedblright ; B 21 463 242 718 ;\nC 187 ; WX 456 ; N guillemotright ; B 80 108 376 446 ;\nC 188 ; WX 820 ; N ellipsis ; B 94 0 726 106 ;\nC 189 ; WX 820 ; N perthousand ; B 6 -19 815 703 ;\nC 191 ; WX 501 ; N questiondown ; B 75 -201 432 525 ;\nC 193 ; WX 273 ; N grave ; B 11 593 173 734 ;\nC 194 ; WX 273 ; N acute ; B 100 593 262 734 ;\nC 195 ; WX 273 ; N circumflex ; B 17 593 256 734 ;\nC 196 ; WX 273 ; N tilde ; B -3 606 276 722 ;\nC 197 ; WX 273 ; N macron ; B 8 627 265 684 ;\nC 198 ; WX 273 ; N breve ; B 11 595 263 731 ;\nC 199 ; WX 273 ; N dotaccent ; B 99 604 174 706 ;\nC 200 ; WX 273 ; N dieresis ; B 33 604 240 706 ;\nC 202 ; WX 273 ; N ring ; B 61 572 212 756 ;\nC 203 ; WX 273 ; N cedilla ; B 37 -225 212 0 ;\nC 205 ; WX 273 ; N hungarumlaut ; B 25 593 335 734 ;\nC 206 ; WX 273 ; N ogonek ; B 60 -225 235 0 ;\nC 207 ; WX 273 ; N caron ; B 17 593 256 734 ;\nC 208 ; WX 820 ; N emdash ; B 0 240 820 313 ;\nC 225 ; WX 820 ; N AE ; B 7 0 780 718 ;\nC 227 ; WX 303 ; N ordfeminine ; B 20 304 284 737 ;\nC 232 ; WX 456 ; N Lslash ; B -16 0 440 718 ;\nC 233 ; WX 638 ; N Oslash ; B 32 -19 607 737 ;\nC 234 ; WX 820 ; N OE ; B 30 -19 791 737 ;\nC 235 ; WX 299 ; N ordmasculine ; B 20 304 280 737 ;\nC 241 ; WX 729 ; N ae ; B 30 -15 695 538 ;\nC 245 ; WX 228 ; N dotlessi ; B 78 0 150 523 ;\nC 248 ; WX 182 ; N lslash ; B -16 0 198 718 ;\nC 249 ; WX 501 ; N oslash ; B 23 -22 440 545 ;\nC 250 ; WX 774 ; N oe ; B 29 -15 740 538 ;\nC 251 ; WX 501 ; N germandbls ; B 55 -15 468 728 ;\nC -1 ; WX 501 ; N Zcaron ; B 19 0 482 929 ;\nC -1 ; WX 410 ; N ccedilla ; B 25 -225 391 538 ;\nC -1 ; WX 410 ; N ydieresis ; B 9 -214 401 706 ;\nC -1 ; WX 456 ; N atilde ; B 30 -15 435 722 ;\nC -1 ; WX 228 ; N icircumflex ; B -5 0 234 734 ;\nC -1 ; WX 273 ; N threesuperior ; B 4 270 266 703 ;\nC -1 ; WX 456 ; N ecircumflex ; B 33 -15 423 734 ;\nC -1 ; WX 456 ; N thorn ; B 48 -207 424 718 ;\nC -1 ; WX 456 ; N egrave ; B 33 -15 423 734 ;\nC -1 ; WX 273 ; N twosuperior ; B 3 281 265 703 ;\nC -1 ; WX 456 ; N eacute ; B 33 -15 423 734 ;\nC -1 ; WX 456 ; N otilde ; B 29 -14 427 722 ;\nC -1 ; WX 547 ; N Aacute ; B 11 0 536 929 ;\nC -1 ; WX 456 ; N ocircumflex ; B 29 -14 427 734 ;\nC -1 ; WX 410 ; N yacute ; B 9 -214 401 734 ;\nC -1 ; WX 456 ; N udieresis ; B 56 -15 401 706 ;\nC -1 ; WX 684 ; N threequarters ; B 37 -19 664 703 ;\nC -1 ; WX 456 ; N acircumflex ; B 30 -15 435 734 ;\nC -1 ; WX 592 ; N Eth ; B 0 0 553 718 ;\nC -1 ; WX 456 ; N edieresis ; B 33 -15 423 706 ;\nC -1 ; WX 456 ; N ugrave ; B 56 -15 401 734 ;\nC -1 ; WX 820 ; N trademark ; B 38 306 740 718 ;\nC -1 ; WX 456 ; N ograve ; B 29 -14 427 734 ;\nC -1 ; WX 410 ; N scaron ; B 26 -15 380 734 ;\nC -1 ; WX 228 ; N Idieresis ; B 11 0 218 901 ;\nC -1 ; WX 456 ; N uacute ; B 56 -15 401 734 ;\nC -1 ; WX 456 ; N agrave ; B 30 -15 435 734 ;\nC -1 ; WX 456 ; N ntilde ; B 53 0 403 722 ;\nC -1 ; WX 456 ; N aring ; B 30 -15 435 756 ;\nC -1 ; WX 410 ; N zcaron ; B 25 0 385 734 ;\nC -1 ; WX 228 ; N Icircumflex ; B -5 0 234 929 ;\nC -1 ; WX 592 ; N Ntilde ; B 62 0 530 917 ;\nC -1 ; WX 456 ; N ucircumflex ; B 56 -15 401 734 ;\nC -1 ; WX 547 ; N Ecircumflex ; B 71 0 505 929 ;\nC -1 ; WX 228 ; N Iacute ; B 75 0 239 929 ;\nC -1 ; WX 592 ; N Ccedilla ; B 36 -225 558 737 ;\nC -1 ; WX 638 ; N Odieresis ; B 32 -19 606 901 ;\nC -1 ; WX 547 ; N Scaron ; B 40 -19 508 929 ;\nC -1 ; WX 547 ; N Edieresis ; B 71 0 505 901 ;\nC -1 ; WX 228 ; N Igrave ; B -11 0 154 929 ;\nC -1 ; WX 456 ; N adieresis ; B 30 -15 435 706 ;\nC -1 ; WX 638 ; N Ograve ; B 32 -19 606 929 ;\nC -1 ; WX 547 ; N Egrave ; B 71 0 505 929 ;\nC -1 ; WX 547 ; N Ydieresis ; B 11 0 535 901 ;\nC -1 ; WX 604 ; N registered ; B -11 -19 617 737 ;\nC -1 ; WX 638 ; N Otilde ; B 32 -19 606 917 ;\nC -1 ; WX 684 ; N onequarter ; B 60 -19 620 703 ;\nC -1 ; WX 592 ; N Ugrave ; B 65 -19 528 929 ;\nC -1 ; WX 592 ; N Ucircumflex ; B 65 -19 528 929 ;\nC -1 ; WX 547 ; N Thorn ; B 71 0 510 718 ;\nC -1 ; WX 479 ; N divide ; B 32 -19 447 524 ;\nC -1 ; WX 547 ; N Atilde ; B 11 0 536 917 ;\nC -1 ; WX 592 ; N Uacute ; B 65 -19 528 929 ;\nC -1 ; WX 638 ; N Ocircumflex ; B 32 -19 606 929 ;\nC -1 ; WX 479 ; N logicalnot ; B 32 108 447 390 ;\nC -1 ; WX 547 ; N Aring ; B 11 0 536 931 ;\nC -1 ; WX 228 ; N idieresis ; B 11 0 218 706 ;\nC -1 ; WX 228 ; N iacute ; B 78 0 239 734 ;\nC -1 ; WX 456 ; N aacute ; B 30 -15 435 734 ;\nC -1 ; WX 479 ; N plusminus ; B 32 0 447 506 ;\nC -1 ; WX 479 ; N multiply ; B 32 0 447 506 ;\nC -1 ; WX 592 ; N Udieresis ; B 65 -19 528 901 ;\nC -1 ; WX 479 ; N minus ; B 32 216 447 289 ;\nC -1 ; WX 273 ; N onesuperior ; B 35 281 182 703 ;\nC -1 ; WX 547 ; N Eacute ; B 71 0 505 929 ;\nC -1 ; WX 547 ; N Acircumflex ; B 11 0 536 929 ;\nC -1 ; WX 604 ; N copyright ; B -11 -19 617 737 ;\nC -1 ; WX 547 ; N Agrave ; B 11 0 536 929 ;\nC -1 ; WX 456 ; N odieresis ; B 29 -14 427 706 ;\nC -1 ; WX 456 ; N oacute ; B 29 -14 427 734 ;\nC -1 ; WX 328 ; N degree ; B 44 411 284 703 ;\nC -1 ; WX 228 ; N igrave ; B -11 0 151 734 ;\nC -1 ; WX 456 ; N mu ; B 56 -207 401 523 ;\nC -1 ; WX 638 ; N Oacute ; B 32 -19 606 929 ;\nC -1 ; WX 456 ; N eth ; B 29 -15 428 737 ;\nC -1 ; WX 547 ; N Adieresis ; B 11 0 536 901 ;\nC -1 ; WX 547 ; N Yacute ; B 11 0 535 929 ;\nC -1 ; WX 213 ; N brokenbar ; B 77 -19 137 737 ;\nC -1 ; WX 684 ; N onehalf ; B 35 -19 634 703 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 250\n\nKPX A y -32\nKPX A w -32\nKPX A v -32\nKPX A u -24\nKPX A Y -81\nKPX A W -40\nKPX A V -56\nKPX A U -40\nKPX A T -97\nKPX A Q -24\nKPX A O -24\nKPX A G -24\nKPX A C -24\n\nKPX B period -15\nKPX B comma -15\nKPX B U -7\n\nKPX C period -24\nKPX C comma -24\n\nKPX D period -56\nKPX D comma -56\nKPX D Y -73\nKPX D W -32\nKPX D V -56\nKPX D A -32\n\nKPX F r -36\nKPX F period -122\nKPX F o -24\nKPX F e -24\nKPX F comma -122\nKPX F a -40\nKPX F A -65\n\nKPX J u -15\nKPX J period -24\nKPX J comma -24\nKPX J a -15\nKPX J A -15\n\nKPX K y -40\nKPX K u -24\nKPX K o -32\nKPX K e -32\nKPX K O -40\n\nKPX L y -24\nKPX L quoteright -130\nKPX L quotedblright -114\nKPX L Y -114\nKPX L W -56\nKPX L V -89\nKPX L T -89\n\nKPX O period -32\nKPX O comma -32\nKPX O Y -56\nKPX O X -48\nKPX O W -24\nKPX O V -40\nKPX O T -32\nKPX O A -15\n\nKPX P period -147\nKPX P o -40\nKPX P e -40\nKPX P comma -147\nKPX P a -32\nKPX P A -97\n\nKPX Q U -7\n\nKPX R Y -40\nKPX R W -24\nKPX R V -40\nKPX R U -32\nKPX R T -24\nKPX R O -15\n\nKPX S period -15\nKPX S comma -15\n\nKPX T y -97\nKPX T w -97\nKPX T u -97\nKPX T semicolon -15\nKPX T r -97\nKPX T period -97\nKPX T o -97\nKPX T hyphen -114\nKPX T e -97\nKPX T comma -97\nKPX T colon -15\nKPX T a -97\nKPX T O -32\nKPX T A -97\n\nKPX U period -32\nKPX U comma -32\nKPX U A -32\n\nKPX V u -56\nKPX V semicolon -32\nKPX V period -102\nKPX V o -65\nKPX V hyphen -65\nKPX V e -65\nKPX V comma -102\nKPX V colon -32\nKPX V a -56\nKPX V O -32\nKPX V G -32\nKPX V A -65\n\nKPX W y -15\nKPX W u -24\nKPX W period -65\nKPX W o -24\nKPX W hyphen -32\nKPX W e -24\nKPX W comma -65\nKPX W a -32\nKPX W O -15\nKPX W A -40\n\nKPX Y u -89\nKPX Y semicolon -48\nKPX Y period -114\nKPX Y o -114\nKPX Y i -15\nKPX Y hyphen -114\nKPX Y e -114\nKPX Y comma -114\nKPX Y colon -48\nKPX Y a -114\nKPX Y O -69\nKPX Y A -89\n\nKPX a y -24\nKPX a w -15\nKPX a v -15\n\nKPX b y -15\nKPX b v -15\nKPX b u -15\nKPX b period -32\nKPX b l -15\nKPX b comma -32\nKPX b b -7\n\nKPX c k -15\nKPX c comma -11\n\nKPX colon space -40\n\nKPX comma quoteright -81\nKPX comma quotedblright -81\n\nKPX e y -15\nKPX e x -24\nKPX e w -15\nKPX e v -24\nKPX e period -11\nKPX e comma -11\n\nKPX f quoteright 41\nKPX f quotedblright 49\nKPX f period -24\nKPX f o -24\nKPX f e -24\nKPX f dotlessi -22\nKPX f comma -24\nKPX f a -24\n\nKPX g r -7\n\nKPX h y -24\n\nKPX k o -15\nKPX k e -15\n\nKPX m y -11\nKPX m u -7\n\nKPX n y -11\nKPX n v -15\nKPX n u -7\n\nKPX o y -24\nKPX o x -24\nKPX o w -11\nKPX o v -11\nKPX o period -32\nKPX o comma -32\n\nKPX oslash z -44\nKPX oslash y -56\nKPX oslash x -69\nKPX oslash w -56\nKPX oslash v -56\nKPX oslash u -44\nKPX oslash t -44\nKPX oslash s -44\nKPX oslash r -44\nKPX oslash q -44\nKPX oslash period -77\nKPX oslash p -44\nKPX oslash o -44\nKPX oslash n -44\nKPX oslash m -44\nKPX oslash l -44\nKPX oslash k -44\nKPX oslash j -44\nKPX oslash i -44\nKPX oslash h -44\nKPX oslash g -44\nKPX oslash f -44\nKPX oslash e -44\nKPX oslash d -44\nKPX oslash comma -77\nKPX oslash c -44\nKPX oslash b -44\nKPX oslash a -44\n\nKPX p y -24\nKPX p period -28\nKPX p comma -28\n\nKPX period space -48\nKPX period quoteright -81\nKPX period quotedblright -81\n\nKPX quotedblright space -32\n\nKPX quoteleft quoteleft -46\n\nKPX quoteright space -56\nKPX quoteright s -40\nKPX quoteright r -40\nKPX quoteright quoteright -46\nKPX quoteright d -40\n\nKPX r y 25\nKPX r v 25\nKPX r u 12\nKPX r t 33\nKPX r semicolon 25\nKPX r period -40\nKPX r p 25\nKPX r n 21\nKPX r m 21\nKPX r l 12\nKPX r k 12\nKPX r i 12\nKPX r comma -40\nKPX r colon 25\nKPX r a -7\n\nKPX s w -24\nKPX s period -11\nKPX s comma -11\n\nKPX semicolon space -40\n\nKPX space quoteleft -48\nKPX space quotedblleft -24\nKPX space Y -73\nKPX space W -32\nKPX space V -40\nKPX space T -40\n\nKPX v period -65\nKPX v o -20\nKPX v e -20\nKPX v comma -65\nKPX v a -20\n\nKPX w period -48\nKPX w o -7\nKPX w e -7\nKPX w comma -48\nKPX w a -11\n\nKPX x e -24\n\nKPX y period -81\nKPX y o -15\nKPX y e -15\nKPX y comma -81\nKPX y a -15\n\nKPX z o -11\nKPX z e -11\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 137 195 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 137 195 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 137 195 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 137 195 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 137 175 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 137 195 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 160 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 137 195 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 137 195 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 137 195 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 137 195 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute -22 195 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -22 195 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -22 195 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave -22 195 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 168 195 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 183 195 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 183 195 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 183 195 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 183 195 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 183 195 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 137 195 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 160 195 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 160 195 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 160 195 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 160 195 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 137 195 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 137 195 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 114 195 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 92 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 92 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 92 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 92 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 92 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 84 0 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 69 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 92 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 92 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 92 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 92 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -22 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -22 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -22 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -22 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 84 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 92 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 92 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 92 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 92 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 92 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 69 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 92 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 92 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 92 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 92 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 69 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 69 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 69 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/phvro8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All rights reserved.\nComment Creation Date: Thu Mar 15 10:24:18 1990\nComment UniqueID 28362\nComment VMusage 7572 42473\nFontName Helvetica-Oblique\nFullName Helvetica Oblique\nFamilyName Helvetica\nWeight Medium\nItalicAngle -12\nIsFixedPitch false\nFontBBox -170 -225 1116 931\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.006\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All rights reserved.Helvetica is a trademark of Linotype AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 718\nXHeight 523\nAscender 718\nDescender -207\nStartCharMetrics 228\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 278 ; N exclam ; B 90 0 340 718 ;\nC 34 ; WX 355 ; N quotedbl ; B 168 463 438 718 ;\nC 35 ; WX 556 ; N numbersign ; B 73 0 631 688 ;\nC 36 ; WX 556 ; N dollar ; B 69 -115 617 775 ;\nC 37 ; WX 889 ; N percent ; B 147 -19 889 703 ;\nC 38 ; WX 667 ; N ampersand ; B 77 -15 647 718 ;\nC 39 ; WX 222 ; N quoteright ; B 151 463 310 718 ;\nC 40 ; WX 333 ; N parenleft ; B 108 -207 454 733 ;\nC 41 ; WX 333 ; N parenright ; B -9 -207 337 733 ;\nC 42 ; WX 389 ; N asterisk ; B 165 431 475 718 ;\nC 43 ; WX 584 ; N plus ; B 85 0 606 505 ;\nC 44 ; WX 278 ; N comma ; B 56 -147 214 106 ;\nC 45 ; WX 333 ; N hyphen ; B 93 232 357 322 ;\nC 46 ; WX 278 ; N period ; B 87 0 214 106 ;\nC 47 ; WX 278 ; N slash ; B -21 -19 452 737 ;\nC 48 ; WX 556 ; N zero ; B 93 -19 608 703 ;\nC 49 ; WX 556 ; N one ; B 207 0 508 703 ;\nC 50 ; WX 556 ; N two ; B 26 0 617 703 ;\nC 51 ; WX 556 ; N three ; B 75 -19 610 703 ;\nC 52 ; WX 556 ; N four ; B 61 0 576 703 ;\nC 53 ; WX 556 ; N five ; B 68 -19 621 688 ;\nC 54 ; WX 556 ; N six ; B 91 -19 615 703 ;\nC 55 ; WX 556 ; N seven ; B 137 0 669 688 ;\nC 56 ; WX 556 ; N eight ; B 74 -19 607 703 ;\nC 57 ; WX 556 ; N nine ; B 82 -19 609 703 ;\nC 58 ; WX 278 ; N colon ; B 87 0 301 516 ;\nC 59 ; WX 278 ; N semicolon ; B 56 -147 301 516 ;\nC 60 ; WX 584 ; N less ; B 94 11 641 495 ;\nC 61 ; WX 584 ; N equal ; B 63 115 628 390 ;\nC 62 ; WX 584 ; N greater ; B 50 11 597 495 ;\nC 63 ; WX 556 ; N question ; B 161 0 610 727 ;\nC 64 ; WX 1015 ; N at ; B 215 -19 965 737 ;\nC 65 ; WX 667 ; N A ; B 14 0 654 718 ;\nC 66 ; WX 667 ; N B ; B 74 0 712 718 ;\nC 67 ; WX 722 ; N C ; B 108 -19 782 737 ;\nC 68 ; WX 722 ; N D ; B 81 0 764 718 ;\nC 69 ; WX 667 ; N E ; B 86 0 762 718 ;\nC 70 ; WX 611 ; N F ; B 86 0 736 718 ;\nC 71 ; WX 778 ; N G ; B 111 -19 799 737 ;\nC 72 ; WX 722 ; N H ; B 77 0 799 718 ;\nC 73 ; WX 278 ; N I ; B 91 0 341 718 ;\nC 74 ; WX 500 ; N J ; B 47 -19 581 718 ;\nC 75 ; WX 667 ; N K ; B 76 0 808 718 ;\nC 76 ; WX 556 ; N L ; B 76 0 555 718 ;\nC 77 ; WX 833 ; N M ; B 73 0 914 718 ;\nC 78 ; WX 722 ; N N ; B 76 0 799 718 ;\nC 79 ; WX 778 ; N O ; B 105 -19 826 737 ;\nC 80 ; WX 667 ; N P ; B 86 0 737 718 ;\nC 81 ; WX 778 ; N Q ; B 105 -56 826 737 ;\nC 82 ; WX 722 ; N R ; B 88 0 773 718 ;\nC 83 ; WX 667 ; N S ; B 90 -19 713 737 ;\nC 84 ; WX 611 ; N T ; B 148 0 750 718 ;\nC 85 ; WX 722 ; N U ; B 123 -19 797 718 ;\nC 86 ; WX 667 ; N V ; B 173 0 800 718 ;\nC 87 ; WX 944 ; N W ; B 169 0 1081 718 ;\nC 88 ; WX 667 ; N X ; B 19 0 790 718 ;\nC 89 ; WX 667 ; N Y ; B 167 0 806 718 ;\nC 90 ; WX 611 ; N Z ; B 23 0 741 718 ;\nC 91 ; WX 278 ; N bracketleft ; B 21 -196 403 722 ;\nC 92 ; WX 278 ; N backslash ; B 140 -19 291 737 ;\nC 93 ; WX 278 ; N bracketright ; B -14 -196 368 722 ;\nC 94 ; WX 469 ; N asciicircum ; B 42 264 539 688 ;\nC 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ;\nC 96 ; WX 222 ; N quoteleft ; B 165 470 323 725 ;\nC 97 ; WX 556 ; N a ; B 61 -15 559 538 ;\nC 98 ; WX 556 ; N b ; B 58 -15 584 718 ;\nC 99 ; WX 500 ; N c ; B 74 -15 553 538 ;\nC 100 ; WX 556 ; N d ; B 84 -15 652 718 ;\nC 101 ; WX 556 ; N e ; B 84 -15 578 538 ;\nC 102 ; WX 278 ; N f ; B 86 0 416 728 ; L i fi ; L l fl ;\nC 103 ; WX 556 ; N g ; B 42 -220 610 538 ;\nC 104 ; WX 556 ; N h ; B 65 0 573 718 ;\nC 105 ; WX 222 ; N i ; B 67 0 308 718 ;\nC 106 ; WX 222 ; N j ; B -60 -210 308 718 ;\nC 107 ; WX 500 ; N k ; B 67 0 600 718 ;\nC 108 ; WX 222 ; N l ; B 67 0 308 718 ;\nC 109 ; WX 833 ; N m ; B 65 0 852 538 ;\nC 110 ; WX 556 ; N n ; B 65 0 573 538 ;\nC 111 ; WX 556 ; N o ; B 83 -14 585 538 ;\nC 112 ; WX 556 ; N p ; B 14 -207 584 538 ;\nC 113 ; WX 556 ; N q ; B 84 -207 605 538 ;\nC 114 ; WX 333 ; N r ; B 77 0 446 538 ;\nC 115 ; WX 500 ; N s ; B 63 -15 529 538 ;\nC 116 ; WX 278 ; N t ; B 102 -7 368 669 ;\nC 117 ; WX 556 ; N u ; B 94 -15 600 523 ;\nC 118 ; WX 500 ; N v ; B 119 0 603 523 ;\nC 119 ; WX 722 ; N w ; B 125 0 820 523 ;\nC 120 ; WX 500 ; N x ; B 11 0 594 523 ;\nC 121 ; WX 500 ; N y ; B 15 -214 600 523 ;\nC 122 ; WX 500 ; N z ; B 31 0 571 523 ;\nC 123 ; WX 334 ; N braceleft ; B 92 -196 445 722 ;\nC 124 ; WX 260 ; N bar ; B 90 -19 324 737 ;\nC 125 ; WX 334 ; N braceright ; B 0 -196 354 722 ;\nC 126 ; WX 584 ; N asciitilde ; B 111 180 580 326 ;\nC 161 ; WX 333 ; N exclamdown ; B 77 -195 326 523 ;\nC 162 ; WX 556 ; N cent ; B 95 -115 584 623 ;\nC 163 ; WX 556 ; N sterling ; B 49 -16 634 718 ;\nC 164 ; WX 167 ; N fraction ; B -170 -19 482 703 ;\nC 165 ; WX 556 ; N yen ; B 81 0 699 688 ;\nC 166 ; WX 556 ; N florin ; B -52 -207 654 737 ;\nC 167 ; WX 556 ; N section ; B 76 -191 584 737 ;\nC 168 ; WX 556 ; N currency ; B 60 99 646 603 ;\nC 169 ; WX 191 ; N quotesingle ; B 157 463 285 718 ;\nC 170 ; WX 333 ; N quotedblleft ; B 138 470 461 725 ;\nC 171 ; WX 556 ; N guillemotleft ; B 146 108 554 446 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 137 108 340 446 ;\nC 173 ; WX 333 ; N guilsinglright ; B 111 108 314 446 ;\nC 174 ; WX 500 ; N fi ; B 86 0 587 728 ;\nC 175 ; WX 500 ; N fl ; B 86 0 585 728 ;\nC 177 ; WX 556 ; N endash ; B 51 240 623 313 ;\nC 178 ; WX 556 ; N dagger ; B 135 -159 622 718 ;\nC 179 ; WX 556 ; N daggerdbl ; B 52 -159 623 718 ;\nC 180 ; WX 278 ; N periodcentered ; B 129 190 257 315 ;\nC 182 ; WX 537 ; N paragraph ; B 126 -173 650 718 ;\nC 183 ; WX 350 ; N bullet ; B 91 202 413 517 ;\nC 184 ; WX 222 ; N quotesinglbase ; B 21 -149 180 106 ;\nC 185 ; WX 333 ; N quotedblbase ; B -6 -149 318 106 ;\nC 186 ; WX 333 ; N quotedblright ; B 124 463 448 718 ;\nC 187 ; WX 556 ; N guillemotright ; B 120 108 528 446 ;\nC 188 ; WX 1000 ; N ellipsis ; B 115 0 908 106 ;\nC 189 ; WX 1000 ; N perthousand ; B 88 -19 1029 703 ;\nC 191 ; WX 611 ; N questiondown ; B 85 -201 534 525 ;\nC 193 ; WX 333 ; N grave ; B 170 593 337 734 ;\nC 194 ; WX 333 ; N acute ; B 248 593 475 734 ;\nC 195 ; WX 333 ; N circumflex ; B 147 593 438 734 ;\nC 196 ; WX 333 ; N tilde ; B 125 606 490 722 ;\nC 197 ; WX 333 ; N macron ; B 143 627 468 684 ;\nC 198 ; WX 333 ; N breve ; B 167 595 476 731 ;\nC 199 ; WX 333 ; N dotaccent ; B 249 604 362 706 ;\nC 200 ; WX 333 ; N dieresis ; B 168 604 443 706 ;\nC 202 ; WX 333 ; N ring ; B 214 572 402 756 ;\nC 203 ; WX 333 ; N cedilla ; B 2 -225 232 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 157 593 565 734 ;\nC 206 ; WX 333 ; N ogonek ; B 43 -225 249 0 ;\nC 207 ; WX 333 ; N caron ; B 177 593 468 734 ;\nC 208 ; WX 1000 ; N emdash ; B 51 240 1067 313 ;\nC 225 ; WX 1000 ; N AE ; B 8 0 1097 718 ;\nC 227 ; WX 370 ; N ordfeminine ; B 100 304 449 737 ;\nC 232 ; WX 556 ; N Lslash ; B 41 0 555 718 ;\nC 233 ; WX 778 ; N Oslash ; B 43 -19 890 737 ;\nC 234 ; WX 1000 ; N OE ; B 98 -19 1116 737 ;\nC 235 ; WX 365 ; N ordmasculine ; B 100 304 468 737 ;\nC 241 ; WX 889 ; N ae ; B 61 -15 909 538 ;\nC 245 ; WX 278 ; N dotlessi ; B 95 0 294 523 ;\nC 248 ; WX 222 ; N lslash ; B 41 0 347 718 ;\nC 249 ; WX 611 ; N oslash ; B 29 -22 647 545 ;\nC 250 ; WX 944 ; N oe ; B 83 -15 964 538 ;\nC 251 ; WX 611 ; N germandbls ; B 67 -15 658 728 ;\nC -1 ; WX 611 ; N Zcaron ; B 23 0 741 929 ;\nC -1 ; WX 500 ; N ccedilla ; B 74 -225 553 538 ;\nC -1 ; WX 500 ; N ydieresis ; B 15 -214 600 706 ;\nC -1 ; WX 556 ; N atilde ; B 61 -15 592 722 ;\nC -1 ; WX 278 ; N icircumflex ; B 95 0 411 734 ;\nC -1 ; WX 333 ; N threesuperior ; B 90 270 436 703 ;\nC -1 ; WX 556 ; N ecircumflex ; B 84 -15 578 734 ;\nC -1 ; WX 556 ; N thorn ; B 14 -207 584 718 ;\nC -1 ; WX 556 ; N egrave ; B 84 -15 578 734 ;\nC -1 ; WX 333 ; N twosuperior ; B 64 281 449 703 ;\nC -1 ; WX 556 ; N eacute ; B 84 -15 587 734 ;\nC -1 ; WX 556 ; N otilde ; B 83 -14 602 722 ;\nC -1 ; WX 667 ; N Aacute ; B 14 0 683 929 ;\nC -1 ; WX 556 ; N ocircumflex ; B 83 -14 585 734 ;\nC -1 ; WX 500 ; N yacute ; B 15 -214 600 734 ;\nC -1 ; WX 556 ; N udieresis ; B 94 -15 600 706 ;\nC -1 ; WX 834 ; N threequarters ; B 130 -19 861 703 ;\nC -1 ; WX 556 ; N acircumflex ; B 61 -15 559 734 ;\nC -1 ; WX 722 ; N Eth ; B 69 0 764 718 ;\nC -1 ; WX 556 ; N edieresis ; B 84 -15 578 706 ;\nC -1 ; WX 556 ; N ugrave ; B 94 -15 600 734 ;\nC -1 ; WX 1000 ; N trademark ; B 186 306 1056 718 ;\nC -1 ; WX 556 ; N ograve ; B 83 -14 585 734 ;\nC -1 ; WX 500 ; N scaron ; B 63 -15 552 734 ;\nC -1 ; WX 278 ; N Idieresis ; B 91 0 458 901 ;\nC -1 ; WX 556 ; N uacute ; B 94 -15 600 734 ;\nC -1 ; WX 556 ; N agrave ; B 61 -15 559 734 ;\nC -1 ; WX 556 ; N ntilde ; B 65 0 592 722 ;\nC -1 ; WX 556 ; N aring ; B 61 -15 559 756 ;\nC -1 ; WX 500 ; N zcaron ; B 31 0 571 734 ;\nC -1 ; WX 278 ; N Icircumflex ; B 91 0 452 929 ;\nC -1 ; WX 722 ; N Ntilde ; B 76 0 799 917 ;\nC -1 ; WX 556 ; N ucircumflex ; B 94 -15 600 734 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 86 0 762 929 ;\nC -1 ; WX 278 ; N Iacute ; B 91 0 489 929 ;\nC -1 ; WX 722 ; N Ccedilla ; B 108 -225 782 737 ;\nC -1 ; WX 778 ; N Odieresis ; B 105 -19 826 901 ;\nC -1 ; WX 667 ; N Scaron ; B 90 -19 713 929 ;\nC -1 ; WX 667 ; N Edieresis ; B 86 0 762 901 ;\nC -1 ; WX 278 ; N Igrave ; B 91 0 351 929 ;\nC -1 ; WX 556 ; N adieresis ; B 61 -15 559 706 ;\nC -1 ; WX 778 ; N Ograve ; B 105 -19 826 929 ;\nC -1 ; WX 667 ; N Egrave ; B 86 0 762 929 ;\nC -1 ; WX 667 ; N Ydieresis ; B 167 0 806 901 ;\nC -1 ; WX 737 ; N registered ; B 54 -19 837 737 ;\nC -1 ; WX 778 ; N Otilde ; B 105 -19 826 917 ;\nC -1 ; WX 834 ; N onequarter ; B 150 -19 802 703 ;\nC -1 ; WX 722 ; N Ugrave ; B 123 -19 797 929 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 123 -19 797 929 ;\nC -1 ; WX 667 ; N Thorn ; B 86 0 712 718 ;\nC -1 ; WX 584 ; N divide ; B 85 -19 606 524 ;\nC -1 ; WX 667 ; N Atilde ; B 14 0 699 917 ;\nC -1 ; WX 722 ; N Uacute ; B 123 -19 797 929 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 105 -19 826 929 ;\nC -1 ; WX 584 ; N logicalnot ; B 106 108 628 390 ;\nC -1 ; WX 667 ; N Aring ; B 14 0 654 931 ;\nC -1 ; WX 278 ; N idieresis ; B 95 0 416 706 ;\nC -1 ; WX 278 ; N iacute ; B 95 0 448 734 ;\nC -1 ; WX 556 ; N aacute ; B 61 -15 587 734 ;\nC -1 ; WX 584 ; N plusminus ; B 39 0 618 506 ;\nC -1 ; WX 584 ; N multiply ; B 50 0 642 506 ;\nC -1 ; WX 722 ; N Udieresis ; B 123 -19 797 901 ;\nC -1 ; WX 584 ; N minus ; B 85 216 606 289 ;\nC -1 ; WX 333 ; N onesuperior ; B 166 281 371 703 ;\nC -1 ; WX 667 ; N Eacute ; B 86 0 762 929 ;\nC -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ;\nC -1 ; WX 737 ; N copyright ; B 54 -19 837 737 ;\nC -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ;\nC -1 ; WX 556 ; N odieresis ; B 83 -14 585 706 ;\nC -1 ; WX 556 ; N oacute ; B 83 -14 587 734 ;\nC -1 ; WX 400 ; N degree ; B 169 411 468 703 ;\nC -1 ; WX 278 ; N igrave ; B 95 0 310 734 ;\nC -1 ; WX 556 ; N mu ; B 24 -207 600 523 ;\nC -1 ; WX 778 ; N Oacute ; B 105 -19 826 929 ;\nC -1 ; WX 556 ; N eth ; B 81 -15 617 737 ;\nC -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ;\nC -1 ; WX 667 ; N Yacute ; B 167 0 806 929 ;\nC -1 ; WX 260 ; N brokenbar ; B 90 -19 324 737 ;\nC -1 ; WX 834 ; N onehalf ; B 114 -19 839 703 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 250\n\nKPX A y -40\nKPX A w -40\nKPX A v -40\nKPX A u -30\nKPX A Y -100\nKPX A W -50\nKPX A V -70\nKPX A U -50\nKPX A T -120\nKPX A Q -30\nKPX A O -30\nKPX A G -30\nKPX A C -30\n\nKPX B period -20\nKPX B comma -20\nKPX B U -10\n\nKPX C period -30\nKPX C comma -30\n\nKPX D period -70\nKPX D comma -70\nKPX D Y -90\nKPX D W -40\nKPX D V -70\nKPX D A -40\n\nKPX F r -45\nKPX F period -150\nKPX F o -30\nKPX F e -30\nKPX F comma -150\nKPX F a -50\nKPX F A -80\n\nKPX J u -20\nKPX J period -30\nKPX J comma -30\nKPX J a -20\nKPX J A -20\n\nKPX K y -50\nKPX K u -30\nKPX K o -40\nKPX K e -40\nKPX K O -50\n\nKPX L y -30\nKPX L quoteright -160\nKPX L quotedblright -140\nKPX L Y -140\nKPX L W -70\nKPX L V -110\nKPX L T -110\n\nKPX O period -40\nKPX O comma -40\nKPX O Y -70\nKPX O X -60\nKPX O W -30\nKPX O V -50\nKPX O T -40\nKPX O A -20\n\nKPX P period -180\nKPX P o -50\nKPX P e -50\nKPX P comma -180\nKPX P a -40\nKPX P A -120\n\nKPX Q U -10\n\nKPX R Y -50\nKPX R W -30\nKPX R V -50\nKPX R U -40\nKPX R T -30\nKPX R O -20\n\nKPX S period -20\nKPX S comma -20\n\nKPX T y -120\nKPX T w -120\nKPX T u -120\nKPX T semicolon -20\nKPX T r -120\nKPX T period -120\nKPX T o -120\nKPX T hyphen -140\nKPX T e -120\nKPX T comma -120\nKPX T colon -20\nKPX T a -120\nKPX T O -40\nKPX T A -120\n\nKPX U period -40\nKPX U comma -40\nKPX U A -40\n\nKPX V u -70\nKPX V semicolon -40\nKPX V period -125\nKPX V o -80\nKPX V hyphen -80\nKPX V e -80\nKPX V comma -125\nKPX V colon -40\nKPX V a -70\nKPX V O -40\nKPX V G -40\nKPX V A -80\n\nKPX W y -20\nKPX W u -30\nKPX W period -80\nKPX W o -30\nKPX W hyphen -40\nKPX W e -30\nKPX W comma -80\nKPX W a -40\nKPX W O -20\nKPX W A -50\n\nKPX Y u -110\nKPX Y semicolon -60\nKPX Y period -140\nKPX Y o -140\nKPX Y i -20\nKPX Y hyphen -140\nKPX Y e -140\nKPX Y comma -140\nKPX Y colon -60\nKPX Y a -140\nKPX Y O -85\nKPX Y A -110\n\nKPX a y -30\nKPX a w -20\nKPX a v -20\n\nKPX b y -20\nKPX b v -20\nKPX b u -20\nKPX b period -40\nKPX b l -20\nKPX b comma -40\nKPX b b -10\n\nKPX c k -20\nKPX c comma -15\n\nKPX colon space -50\n\nKPX comma quoteright -100\nKPX comma quotedblright -100\n\nKPX e y -20\nKPX e x -30\nKPX e w -20\nKPX e v -30\nKPX e period -15\nKPX e comma -15\n\nKPX f quoteright 50\nKPX f quotedblright 60\nKPX f period -30\nKPX f o -30\nKPX f e -30\nKPX f dotlessi -28\nKPX f comma -30\nKPX f a -30\n\nKPX g r -10\n\nKPX h y -30\n\nKPX k o -20\nKPX k e -20\n\nKPX m y -15\nKPX m u -10\n\nKPX n y -15\nKPX n v -20\nKPX n u -10\n\nKPX o y -30\nKPX o x -30\nKPX o w -15\nKPX o v -15\nKPX o period -40\nKPX o comma -40\n\nKPX oslash z -55\nKPX oslash y -70\nKPX oslash x -85\nKPX oslash w -70\nKPX oslash v -70\nKPX oslash u -55\nKPX oslash t -55\nKPX oslash s -55\nKPX oslash r -55\nKPX oslash q -55\nKPX oslash period -95\nKPX oslash p -55\nKPX oslash o -55\nKPX oslash n -55\nKPX oslash m -55\nKPX oslash l -55\nKPX oslash k -55\nKPX oslash j -55\nKPX oslash i -55\nKPX oslash h -55\nKPX oslash g -55\nKPX oslash f -55\nKPX oslash e -55\nKPX oslash d -55\nKPX oslash comma -95\nKPX oslash c -55\nKPX oslash b -55\nKPX oslash a -55\n\nKPX p y -30\nKPX p period -35\nKPX p comma -35\n\nKPX period space -60\nKPX period quoteright -100\nKPX period quotedblright -100\n\nKPX quotedblright space -40\n\nKPX quoteleft quoteleft -57\n\nKPX quoteright space -70\nKPX quoteright s -50\nKPX quoteright r -50\nKPX quoteright quoteright -57\nKPX quoteright d -50\n\nKPX r y 30\nKPX r v 30\nKPX r u 15\nKPX r t 40\nKPX r semicolon 30\nKPX r period -50\nKPX r p 30\nKPX r n 25\nKPX r m 25\nKPX r l 15\nKPX r k 15\nKPX r i 15\nKPX r comma -50\nKPX r colon 30\nKPX r a -10\n\nKPX s w -30\nKPX s period -15\nKPX s comma -15\n\nKPX semicolon space -50\n\nKPX space quoteleft -60\nKPX space quotedblleft -30\nKPX space Y -90\nKPX space W -40\nKPX space V -50\nKPX space T -50\n\nKPX v period -80\nKPX v o -25\nKPX v e -25\nKPX v comma -80\nKPX v a -25\n\nKPX w period -60\nKPX w o -10\nKPX w e -10\nKPX w comma -60\nKPX w a -15\n\nKPX x e -30\n\nKPX y period -100\nKPX y o -20\nKPX y e -20\nKPX y comma -100\nKPX y a -20\n\nKPX z o -15\nKPX z e -15\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 208 195 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 208 195 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 208 195 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 208 195 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 204 175 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 208 195 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 195 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 208 195 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 208 195 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 208 195 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 208 195 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 14 195 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 14 195 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 14 195 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 14 195 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 246 195 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 264 195 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 264 195 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 264 195 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 264 195 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 264 195 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 208 195 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 236 195 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 236 195 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 236 195 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 236 195 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 208 195 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 208 195 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 180 195 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 112 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 112 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 112 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 112 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 112 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 102 0 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 84 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 112 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 112 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 112 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 112 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -27 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 102 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 112 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 112 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 112 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 112 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 112 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 84 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 112 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 112 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 112 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 112 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 84 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 84 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 84 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/phvro8an.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All rights reserved.\nComment Creation Date: Thu Mar 15 11:25:48 1990\nComment UniqueID 28389\nComment VMusage 7572 42473\nFontName Helvetica-Narrow-Oblique\nFullName Helvetica Narrow Oblique\nFamilyName Helvetica\nWeight Medium\nItalicAngle -12\nIsFixedPitch false\nFontBBox -139 -225 915 931\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.006\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All rights reserved.Helvetica is a trademark of Linotype AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 718\nXHeight 523\nAscender 718\nDescender -207\nStartCharMetrics 228\nC 32 ; WX 228 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 228 ; N exclam ; B 74 0 278 718 ;\nC 34 ; WX 291 ; N quotedbl ; B 138 463 359 718 ;\nC 35 ; WX 456 ; N numbersign ; B 60 0 517 688 ;\nC 36 ; WX 456 ; N dollar ; B 57 -115 506 775 ;\nC 37 ; WX 729 ; N percent ; B 120 -19 729 703 ;\nC 38 ; WX 547 ; N ampersand ; B 63 -15 530 718 ;\nC 39 ; WX 182 ; N quoteright ; B 124 463 254 718 ;\nC 40 ; WX 273 ; N parenleft ; B 89 -207 372 733 ;\nC 41 ; WX 273 ; N parenright ; B -7 -207 276 733 ;\nC 42 ; WX 319 ; N asterisk ; B 135 431 389 718 ;\nC 43 ; WX 479 ; N plus ; B 70 0 497 505 ;\nC 44 ; WX 228 ; N comma ; B 46 -147 175 106 ;\nC 45 ; WX 273 ; N hyphen ; B 77 232 293 322 ;\nC 46 ; WX 228 ; N period ; B 71 0 175 106 ;\nC 47 ; WX 228 ; N slash ; B -17 -19 370 737 ;\nC 48 ; WX 456 ; N zero ; B 77 -19 499 703 ;\nC 49 ; WX 456 ; N one ; B 170 0 417 703 ;\nC 50 ; WX 456 ; N two ; B 21 0 506 703 ;\nC 51 ; WX 456 ; N three ; B 61 -19 500 703 ;\nC 52 ; WX 456 ; N four ; B 50 0 472 703 ;\nC 53 ; WX 456 ; N five ; B 55 -19 509 688 ;\nC 54 ; WX 456 ; N six ; B 74 -19 504 703 ;\nC 55 ; WX 456 ; N seven ; B 112 0 549 688 ;\nC 56 ; WX 456 ; N eight ; B 60 -19 497 703 ;\nC 57 ; WX 456 ; N nine ; B 67 -19 499 703 ;\nC 58 ; WX 228 ; N colon ; B 71 0 247 516 ;\nC 59 ; WX 228 ; N semicolon ; B 46 -147 247 516 ;\nC 60 ; WX 479 ; N less ; B 77 11 526 495 ;\nC 61 ; WX 479 ; N equal ; B 52 115 515 390 ;\nC 62 ; WX 479 ; N greater ; B 41 11 490 495 ;\nC 63 ; WX 456 ; N question ; B 132 0 500 727 ;\nC 64 ; WX 832 ; N at ; B 176 -19 791 737 ;\nC 65 ; WX 547 ; N A ; B 11 0 536 718 ;\nC 66 ; WX 547 ; N B ; B 61 0 583 718 ;\nC 67 ; WX 592 ; N C ; B 88 -19 640 737 ;\nC 68 ; WX 592 ; N D ; B 66 0 626 718 ;\nC 69 ; WX 547 ; N E ; B 71 0 625 718 ;\nC 70 ; WX 501 ; N F ; B 71 0 603 718 ;\nC 71 ; WX 638 ; N G ; B 91 -19 655 737 ;\nC 72 ; WX 592 ; N H ; B 63 0 655 718 ;\nC 73 ; WX 228 ; N I ; B 75 0 279 718 ;\nC 74 ; WX 410 ; N J ; B 39 -19 476 718 ;\nC 75 ; WX 547 ; N K ; B 62 0 662 718 ;\nC 76 ; WX 456 ; N L ; B 62 0 455 718 ;\nC 77 ; WX 683 ; N M ; B 60 0 749 718 ;\nC 78 ; WX 592 ; N N ; B 62 0 655 718 ;\nC 79 ; WX 638 ; N O ; B 86 -19 677 737 ;\nC 80 ; WX 547 ; N P ; B 71 0 604 718 ;\nC 81 ; WX 638 ; N Q ; B 86 -56 677 737 ;\nC 82 ; WX 592 ; N R ; B 72 0 634 718 ;\nC 83 ; WX 547 ; N S ; B 74 -19 584 737 ;\nC 84 ; WX 501 ; N T ; B 122 0 615 718 ;\nC 85 ; WX 592 ; N U ; B 101 -19 653 718 ;\nC 86 ; WX 547 ; N V ; B 142 0 656 718 ;\nC 87 ; WX 774 ; N W ; B 138 0 886 718 ;\nC 88 ; WX 547 ; N X ; B 16 0 647 718 ;\nC 89 ; WX 547 ; N Y ; B 137 0 661 718 ;\nC 90 ; WX 501 ; N Z ; B 19 0 607 718 ;\nC 91 ; WX 228 ; N bracketleft ; B 17 -196 331 722 ;\nC 92 ; WX 228 ; N backslash ; B 115 -19 239 737 ;\nC 93 ; WX 228 ; N bracketright ; B -11 -196 302 722 ;\nC 94 ; WX 385 ; N asciicircum ; B 35 264 442 688 ;\nC 95 ; WX 456 ; N underscore ; B -22 -125 443 -75 ;\nC 96 ; WX 182 ; N quoteleft ; B 135 470 265 725 ;\nC 97 ; WX 456 ; N a ; B 50 -15 458 538 ;\nC 98 ; WX 456 ; N b ; B 48 -15 479 718 ;\nC 99 ; WX 410 ; N c ; B 61 -15 454 538 ;\nC 100 ; WX 456 ; N d ; B 69 -15 534 718 ;\nC 101 ; WX 456 ; N e ; B 69 -15 474 538 ;\nC 102 ; WX 228 ; N f ; B 71 0 341 728 ; L i fi ; L l fl ;\nC 103 ; WX 456 ; N g ; B 34 -220 500 538 ;\nC 104 ; WX 456 ; N h ; B 53 0 470 718 ;\nC 105 ; WX 182 ; N i ; B 55 0 252 718 ;\nC 106 ; WX 182 ; N j ; B -49 -210 252 718 ;\nC 107 ; WX 410 ; N k ; B 55 0 492 718 ;\nC 108 ; WX 182 ; N l ; B 55 0 252 718 ;\nC 109 ; WX 683 ; N m ; B 53 0 699 538 ;\nC 110 ; WX 456 ; N n ; B 53 0 470 538 ;\nC 111 ; WX 456 ; N o ; B 68 -14 479 538 ;\nC 112 ; WX 456 ; N p ; B 11 -207 479 538 ;\nC 113 ; WX 456 ; N q ; B 69 -207 496 538 ;\nC 114 ; WX 273 ; N r ; B 63 0 365 538 ;\nC 115 ; WX 410 ; N s ; B 52 -15 434 538 ;\nC 116 ; WX 228 ; N t ; B 84 -7 302 669 ;\nC 117 ; WX 456 ; N u ; B 77 -15 492 523 ;\nC 118 ; WX 410 ; N v ; B 98 0 495 523 ;\nC 119 ; WX 592 ; N w ; B 103 0 673 523 ;\nC 120 ; WX 410 ; N x ; B 9 0 487 523 ;\nC 121 ; WX 410 ; N y ; B 12 -214 492 523 ;\nC 122 ; WX 410 ; N z ; B 25 0 468 523 ;\nC 123 ; WX 274 ; N braceleft ; B 75 -196 365 722 ;\nC 124 ; WX 213 ; N bar ; B 74 -19 265 737 ;\nC 125 ; WX 274 ; N braceright ; B 0 -196 291 722 ;\nC 126 ; WX 479 ; N asciitilde ; B 91 180 476 326 ;\nC 161 ; WX 273 ; N exclamdown ; B 63 -195 267 523 ;\nC 162 ; WX 456 ; N cent ; B 78 -115 479 623 ;\nC 163 ; WX 456 ; N sterling ; B 40 -16 520 718 ;\nC 164 ; WX 137 ; N fraction ; B -139 -19 396 703 ;\nC 165 ; WX 456 ; N yen ; B 67 0 573 688 ;\nC 166 ; WX 456 ; N florin ; B -43 -207 537 737 ;\nC 167 ; WX 456 ; N section ; B 63 -191 479 737 ;\nC 168 ; WX 456 ; N currency ; B 49 99 530 603 ;\nC 169 ; WX 157 ; N quotesingle ; B 129 463 233 718 ;\nC 170 ; WX 273 ; N quotedblleft ; B 113 470 378 725 ;\nC 171 ; WX 456 ; N guillemotleft ; B 120 108 454 446 ;\nC 172 ; WX 273 ; N guilsinglleft ; B 112 108 279 446 ;\nC 173 ; WX 273 ; N guilsinglright ; B 91 108 257 446 ;\nC 174 ; WX 410 ; N fi ; B 71 0 481 728 ;\nC 175 ; WX 410 ; N fl ; B 71 0 479 728 ;\nC 177 ; WX 456 ; N endash ; B 42 240 510 313 ;\nC 178 ; WX 456 ; N dagger ; B 110 -159 510 718 ;\nC 179 ; WX 456 ; N daggerdbl ; B 43 -159 511 718 ;\nC 180 ; WX 228 ; N periodcentered ; B 106 190 211 315 ;\nC 182 ; WX 440 ; N paragraph ; B 103 -173 533 718 ;\nC 183 ; WX 287 ; N bullet ; B 74 202 339 517 ;\nC 184 ; WX 182 ; N quotesinglbase ; B 17 -149 147 106 ;\nC 185 ; WX 273 ; N quotedblbase ; B -5 -149 260 106 ;\nC 186 ; WX 273 ; N quotedblright ; B 102 463 367 718 ;\nC 187 ; WX 456 ; N guillemotright ; B 98 108 433 446 ;\nC 188 ; WX 820 ; N ellipsis ; B 94 0 744 106 ;\nC 189 ; WX 820 ; N perthousand ; B 72 -19 844 703 ;\nC 191 ; WX 501 ; N questiondown ; B 70 -201 438 525 ;\nC 193 ; WX 273 ; N grave ; B 139 593 276 734 ;\nC 194 ; WX 273 ; N acute ; B 203 593 390 734 ;\nC 195 ; WX 273 ; N circumflex ; B 121 593 359 734 ;\nC 196 ; WX 273 ; N tilde ; B 102 606 402 722 ;\nC 197 ; WX 273 ; N macron ; B 117 627 384 684 ;\nC 198 ; WX 273 ; N breve ; B 137 595 391 731 ;\nC 199 ; WX 273 ; N dotaccent ; B 204 604 297 706 ;\nC 200 ; WX 273 ; N dieresis ; B 138 604 363 706 ;\nC 202 ; WX 273 ; N ring ; B 175 572 330 756 ;\nC 203 ; WX 273 ; N cedilla ; B 2 -225 191 0 ;\nC 205 ; WX 273 ; N hungarumlaut ; B 129 593 463 734 ;\nC 206 ; WX 273 ; N ogonek ; B 35 -225 204 0 ;\nC 207 ; WX 273 ; N caron ; B 145 593 384 734 ;\nC 208 ; WX 820 ; N emdash ; B 42 240 875 313 ;\nC 225 ; WX 820 ; N AE ; B 7 0 899 718 ;\nC 227 ; WX 303 ; N ordfeminine ; B 82 304 368 737 ;\nC 232 ; WX 456 ; N Lslash ; B 34 0 455 718 ;\nC 233 ; WX 638 ; N Oslash ; B 35 -19 730 737 ;\nC 234 ; WX 820 ; N OE ; B 80 -19 915 737 ;\nC 235 ; WX 299 ; N ordmasculine ; B 82 304 384 737 ;\nC 241 ; WX 729 ; N ae ; B 50 -15 746 538 ;\nC 245 ; WX 228 ; N dotlessi ; B 78 0 241 523 ;\nC 248 ; WX 182 ; N lslash ; B 34 0 284 718 ;\nC 249 ; WX 501 ; N oslash ; B 24 -22 531 545 ;\nC 250 ; WX 774 ; N oe ; B 68 -15 791 538 ;\nC 251 ; WX 501 ; N germandbls ; B 55 -15 539 728 ;\nC -1 ; WX 501 ; N Zcaron ; B 19 0 607 929 ;\nC -1 ; WX 410 ; N ccedilla ; B 61 -225 454 538 ;\nC -1 ; WX 410 ; N ydieresis ; B 12 -214 492 706 ;\nC -1 ; WX 456 ; N atilde ; B 50 -15 486 722 ;\nC -1 ; WX 228 ; N icircumflex ; B 78 0 337 734 ;\nC -1 ; WX 273 ; N threesuperior ; B 74 270 358 703 ;\nC -1 ; WX 456 ; N ecircumflex ; B 69 -15 474 734 ;\nC -1 ; WX 456 ; N thorn ; B 11 -207 479 718 ;\nC -1 ; WX 456 ; N egrave ; B 69 -15 474 734 ;\nC -1 ; WX 273 ; N twosuperior ; B 52 281 368 703 ;\nC -1 ; WX 456 ; N eacute ; B 69 -15 481 734 ;\nC -1 ; WX 456 ; N otilde ; B 68 -14 494 722 ;\nC -1 ; WX 547 ; N Aacute ; B 11 0 560 929 ;\nC -1 ; WX 456 ; N ocircumflex ; B 68 -14 479 734 ;\nC -1 ; WX 410 ; N yacute ; B 12 -214 492 734 ;\nC -1 ; WX 456 ; N udieresis ; B 77 -15 492 706 ;\nC -1 ; WX 684 ; N threequarters ; B 106 -19 706 703 ;\nC -1 ; WX 456 ; N acircumflex ; B 50 -15 458 734 ;\nC -1 ; WX 592 ; N Eth ; B 57 0 626 718 ;\nC -1 ; WX 456 ; N edieresis ; B 69 -15 474 706 ;\nC -1 ; WX 456 ; N ugrave ; B 77 -15 492 734 ;\nC -1 ; WX 820 ; N trademark ; B 152 306 866 718 ;\nC -1 ; WX 456 ; N ograve ; B 68 -14 479 734 ;\nC -1 ; WX 410 ; N scaron ; B 52 -15 453 734 ;\nC -1 ; WX 228 ; N Idieresis ; B 75 0 375 901 ;\nC -1 ; WX 456 ; N uacute ; B 77 -15 492 734 ;\nC -1 ; WX 456 ; N agrave ; B 50 -15 458 734 ;\nC -1 ; WX 456 ; N ntilde ; B 53 0 486 722 ;\nC -1 ; WX 456 ; N aring ; B 50 -15 458 756 ;\nC -1 ; WX 410 ; N zcaron ; B 25 0 468 734 ;\nC -1 ; WX 228 ; N Icircumflex ; B 75 0 371 929 ;\nC -1 ; WX 592 ; N Ntilde ; B 62 0 655 917 ;\nC -1 ; WX 456 ; N ucircumflex ; B 77 -15 492 734 ;\nC -1 ; WX 547 ; N Ecircumflex ; B 71 0 625 929 ;\nC -1 ; WX 228 ; N Iacute ; B 75 0 401 929 ;\nC -1 ; WX 592 ; N Ccedilla ; B 88 -225 640 737 ;\nC -1 ; WX 638 ; N Odieresis ; B 86 -19 677 901 ;\nC -1 ; WX 547 ; N Scaron ; B 74 -19 584 929 ;\nC -1 ; WX 547 ; N Edieresis ; B 71 0 625 901 ;\nC -1 ; WX 228 ; N Igrave ; B 75 0 288 929 ;\nC -1 ; WX 456 ; N adieresis ; B 50 -15 458 706 ;\nC -1 ; WX 638 ; N Ograve ; B 86 -19 677 929 ;\nC -1 ; WX 547 ; N Egrave ; B 71 0 625 929 ;\nC -1 ; WX 547 ; N Ydieresis ; B 137 0 661 901 ;\nC -1 ; WX 604 ; N registered ; B 44 -19 687 737 ;\nC -1 ; WX 638 ; N Otilde ; B 86 -19 677 917 ;\nC -1 ; WX 684 ; N onequarter ; B 123 -19 658 703 ;\nC -1 ; WX 592 ; N Ugrave ; B 101 -19 653 929 ;\nC -1 ; WX 592 ; N Ucircumflex ; B 101 -19 653 929 ;\nC -1 ; WX 547 ; N Thorn ; B 71 0 584 718 ;\nC -1 ; WX 479 ; N divide ; B 70 -19 497 524 ;\nC -1 ; WX 547 ; N Atilde ; B 11 0 573 917 ;\nC -1 ; WX 592 ; N Uacute ; B 101 -19 653 929 ;\nC -1 ; WX 638 ; N Ocircumflex ; B 86 -19 677 929 ;\nC -1 ; WX 479 ; N logicalnot ; B 87 108 515 390 ;\nC -1 ; WX 547 ; N Aring ; B 11 0 536 931 ;\nC -1 ; WX 228 ; N idieresis ; B 78 0 341 706 ;\nC -1 ; WX 228 ; N iacute ; B 78 0 367 734 ;\nC -1 ; WX 456 ; N aacute ; B 50 -15 481 734 ;\nC -1 ; WX 479 ; N plusminus ; B 32 0 507 506 ;\nC -1 ; WX 479 ; N multiply ; B 41 0 526 506 ;\nC -1 ; WX 592 ; N Udieresis ; B 101 -19 653 901 ;\nC -1 ; WX 479 ; N minus ; B 70 216 497 289 ;\nC -1 ; WX 273 ; N onesuperior ; B 136 281 305 703 ;\nC -1 ; WX 547 ; N Eacute ; B 71 0 625 929 ;\nC -1 ; WX 547 ; N Acircumflex ; B 11 0 536 929 ;\nC -1 ; WX 604 ; N copyright ; B 44 -19 687 737 ;\nC -1 ; WX 547 ; N Agrave ; B 11 0 536 929 ;\nC -1 ; WX 456 ; N odieresis ; B 68 -14 479 706 ;\nC -1 ; WX 456 ; N oacute ; B 68 -14 481 734 ;\nC -1 ; WX 328 ; N degree ; B 138 411 384 703 ;\nC -1 ; WX 228 ; N igrave ; B 78 0 254 734 ;\nC -1 ; WX 456 ; N mu ; B 20 -207 492 523 ;\nC -1 ; WX 638 ; N Oacute ; B 86 -19 677 929 ;\nC -1 ; WX 456 ; N eth ; B 67 -15 506 737 ;\nC -1 ; WX 547 ; N Adieresis ; B 11 0 536 901 ;\nC -1 ; WX 547 ; N Yacute ; B 137 0 661 929 ;\nC -1 ; WX 213 ; N brokenbar ; B 74 -19 265 737 ;\nC -1 ; WX 684 ; N onehalf ; B 93 -19 688 703 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 250\n\nKPX A y -40\nKPX A w -40\nKPX A v -40\nKPX A u -30\nKPX A Y -100\nKPX A W -50\nKPX A V -70\nKPX A U -50\nKPX A T -120\nKPX A Q -30\nKPX A O -30\nKPX A G -30\nKPX A C -30\n\nKPX B period -20\nKPX B comma -20\nKPX B U -10\n\nKPX C period -30\nKPX C comma -30\n\nKPX D period -70\nKPX D comma -70\nKPX D Y -90\nKPX D W -40\nKPX D V -70\nKPX D A -40\n\nKPX F r -45\nKPX F period -150\nKPX F o -30\nKPX F e -30\nKPX F comma -150\nKPX F a -50\nKPX F A -80\n\nKPX J u -20\nKPX J period -30\nKPX J comma -30\nKPX J a -20\nKPX J A -20\n\nKPX K y -50\nKPX K u -30\nKPX K o -40\nKPX K e -40\nKPX K O -50\n\nKPX L y -30\nKPX L quoteright -160\nKPX L quotedblright -140\nKPX L Y -140\nKPX L W -70\nKPX L V -110\nKPX L T -110\n\nKPX O period -40\nKPX O comma -40\nKPX O Y -70\nKPX O X -60\nKPX O W -30\nKPX O V -50\nKPX O T -40\nKPX O A -20\n\nKPX P period -180\nKPX P o -50\nKPX P e -50\nKPX P comma -180\nKPX P a -40\nKPX P A -120\n\nKPX Q U -10\n\nKPX R Y -50\nKPX R W -30\nKPX R V -50\nKPX R U -40\nKPX R T -30\nKPX R O -20\n\nKPX S period -20\nKPX S comma -20\n\nKPX T y -120\nKPX T w -120\nKPX T u -120\nKPX T semicolon -20\nKPX T r -120\nKPX T period -120\nKPX T o -120\nKPX T hyphen -140\nKPX T e -120\nKPX T comma -120\nKPX T colon -20\nKPX T a -120\nKPX T O -40\nKPX T A -120\n\nKPX U period -40\nKPX U comma -40\nKPX U A -40\n\nKPX V u -70\nKPX V semicolon -40\nKPX V period -125\nKPX V o -80\nKPX V hyphen -80\nKPX V e -80\nKPX V comma -125\nKPX V colon -40\nKPX V a -70\nKPX V O -40\nKPX V G -40\nKPX V A -80\n\nKPX W y -20\nKPX W u -30\nKPX W period -80\nKPX W o -30\nKPX W hyphen -40\nKPX W e -30\nKPX W comma -80\nKPX W a -40\nKPX W O -20\nKPX W A -50\n\nKPX Y u -110\nKPX Y semicolon -60\nKPX Y period -140\nKPX Y o -140\nKPX Y i -20\nKPX Y hyphen -140\nKPX Y e -140\nKPX Y comma -140\nKPX Y colon -60\nKPX Y a -140\nKPX Y O -85\nKPX Y A -110\n\nKPX a y -30\nKPX a w -20\nKPX a v -20\n\nKPX b y -20\nKPX b v -20\nKPX b u -20\nKPX b period -40\nKPX b l -20\nKPX b comma -40\nKPX b b -10\n\nKPX c k -20\nKPX c comma -15\n\nKPX colon space -50\n\nKPX comma quoteright -100\nKPX comma quotedblright -100\n\nKPX e y -20\nKPX e x -30\nKPX e w -20\nKPX e v -30\nKPX e period -15\nKPX e comma -15\n\nKPX f quoteright 50\nKPX f quotedblright 60\nKPX f period -30\nKPX f o -30\nKPX f e -30\nKPX f dotlessi -28\nKPX f comma -30\nKPX f a -30\n\nKPX g r -10\n\nKPX h y -30\n\nKPX k o -20\nKPX k e -20\n\nKPX m y -15\nKPX m u -10\n\nKPX n y -15\nKPX n v -20\nKPX n u -10\n\nKPX o y -30\nKPX o x -30\nKPX o w -15\nKPX o v -15\nKPX o period -40\nKPX o comma -40\n\nKPX oslash z -55\nKPX oslash y -70\nKPX oslash x -85\nKPX oslash w -70\nKPX oslash v -70\nKPX oslash u -55\nKPX oslash t -55\nKPX oslash s -55\nKPX oslash r -55\nKPX oslash q -55\nKPX oslash period -95\nKPX oslash p -55\nKPX oslash o -55\nKPX oslash n -55\nKPX oslash m -55\nKPX oslash l -55\nKPX oslash k -55\nKPX oslash j -55\nKPX oslash i -55\nKPX oslash h -55\nKPX oslash g -55\nKPX oslash f -55\nKPX oslash e -55\nKPX oslash d -55\nKPX oslash comma -95\nKPX oslash c -55\nKPX oslash b -55\nKPX oslash a -55\n\nKPX p y -30\nKPX p period -35\nKPX p comma -35\n\nKPX period space -60\nKPX period quoteright -100\nKPX period quotedblright -100\n\nKPX quotedblright space -40\n\nKPX quoteleft quoteleft -57\n\nKPX quoteright space -70\nKPX quoteright s -50\nKPX quoteright r -50\nKPX quoteright quoteright -57\nKPX quoteright d -50\n\nKPX r y 30\nKPX r v 30\nKPX r u 15\nKPX r t 40\nKPX r semicolon 30\nKPX r period -50\nKPX r p 30\nKPX r n 25\nKPX r m 25\nKPX r l 15\nKPX r k 15\nKPX r i 15\nKPX r comma -50\nKPX r colon 30\nKPX r a -10\n\nKPX s w -30\nKPX s period -15\nKPX s comma -15\n\nKPX semicolon space -50\n\nKPX space quoteleft -60\nKPX space quotedblleft -30\nKPX space Y -90\nKPX space W -40\nKPX space V -50\nKPX space T -50\n\nKPX v period -80\nKPX v o -25\nKPX v e -25\nKPX v comma -80\nKPX v a -25\n\nKPX w period -60\nKPX w o -10\nKPX w e -10\nKPX w comma -60\nKPX w a -15\n\nKPX x e -30\n\nKPX y period -100\nKPX y o -20\nKPX y e -20\nKPX y comma -100\nKPX y a -20\n\nKPX z o -15\nKPX z e -15\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 171 195 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 171 195 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 171 195 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 171 195 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 167 175 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 171 195 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 160 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 171 195 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 171 195 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 171 195 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 171 195 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 12 195 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 12 195 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 12 195 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 12 195 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 202 195 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 217 195 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 217 195 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 217 195 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 217 195 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 217 195 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 171 195 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 194 195 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 194 195 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 194 195 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 194 195 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 171 195 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 171 195 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 148 195 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 92 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 92 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 92 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 92 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 92 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 84 0 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 69 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 92 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 92 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 92 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 92 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -22 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -22 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -22 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -22 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 84 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 92 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 92 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 92 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 92 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 92 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 69 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 92 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 92 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 92 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 92 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 69 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 69 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 69 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pncb8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1988, 1991 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Tue May 28 16:48:12 1991\nComment UniqueID 35031\nComment VMusage 30773 37665\nFontName NewCenturySchlbk-Bold\nFullName New Century Schoolbook Bold\nFamilyName New Century Schoolbook\nWeight Bold\nItalicAngle 0\nIsFixedPitch false\nFontBBox -165 -250 1000 988\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.009\nNotice Copyright (c) 1985, 1987, 1988, 1991 Adobe Systems Incorporated.  All Rights Reserved.\nEncodingScheme AdobeStandardEncoding\nCapHeight 722\nXHeight 475\nAscender 737\nDescender -205\nStartCharMetrics 228\nC 32 ; WX 287 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 296 ; N exclam ; B 53 -15 243 737 ;\nC 34 ; WX 333 ; N quotedbl ; B 0 378 333 737 ;\nC 35 ; WX 574 ; N numbersign ; B 36 0 538 690 ;\nC 36 ; WX 574 ; N dollar ; B 25 -141 549 810 ;\nC 37 ; WX 833 ; N percent ; B 14 -15 819 705 ;\nC 38 ; WX 852 ; N ampersand ; B 34 -15 818 737 ;\nC 39 ; WX 241 ; N quoteright ; B 22 378 220 737 ;\nC 40 ; WX 389 ; N parenleft ; B 77 -117 345 745 ;\nC 41 ; WX 389 ; N parenright ; B 44 -117 312 745 ;\nC 42 ; WX 500 ; N asterisk ; B 54 302 446 737 ;\nC 43 ; WX 606 ; N plus ; B 50 0 556 506 ;\nC 44 ; WX 278 ; N comma ; B 40 -184 238 175 ;\nC 45 ; WX 333 ; N hyphen ; B 42 174 291 302 ;\nC 46 ; WX 278 ; N period ; B 44 -15 234 175 ;\nC 47 ; WX 278 ; N slash ; B -42 -15 320 737 ;\nC 48 ; WX 574 ; N zero ; B 27 -15 547 705 ;\nC 49 ; WX 574 ; N one ; B 83 0 491 705 ;\nC 50 ; WX 574 ; N two ; B 19 0 531 705 ;\nC 51 ; WX 574 ; N three ; B 23 -15 531 705 ;\nC 52 ; WX 574 ; N four ; B 19 0 547 705 ;\nC 53 ; WX 574 ; N five ; B 32 -15 534 705 ;\nC 54 ; WX 574 ; N six ; B 27 -15 547 705 ;\nC 55 ; WX 574 ; N seven ; B 45 -15 547 705 ;\nC 56 ; WX 574 ; N eight ; B 27 -15 548 705 ;\nC 57 ; WX 574 ; N nine ; B 27 -15 547 705 ;\nC 58 ; WX 278 ; N colon ; B 44 -15 234 485 ;\nC 59 ; WX 278 ; N semicolon ; B 40 -184 238 485 ;\nC 60 ; WX 606 ; N less ; B 50 -9 556 515 ;\nC 61 ; WX 606 ; N equal ; B 50 103 556 403 ;\nC 62 ; WX 606 ; N greater ; B 50 -9 556 515 ;\nC 63 ; WX 500 ; N question ; B 23 -15 477 737 ;\nC 64 ; WX 747 ; N at ; B -2 -15 750 737 ;\nC 65 ; WX 759 ; N A ; B -19 0 778 737 ;\nC 66 ; WX 778 ; N B ; B 19 0 739 722 ;\nC 67 ; WX 778 ; N C ; B 39 -15 723 737 ;\nC 68 ; WX 833 ; N D ; B 19 0 794 722 ;\nC 69 ; WX 759 ; N E ; B 19 0 708 722 ;\nC 70 ; WX 722 ; N F ; B 19 0 697 722 ;\nC 71 ; WX 833 ; N G ; B 39 -15 818 737 ;\nC 72 ; WX 870 ; N H ; B 19 0 851 722 ;\nC 73 ; WX 444 ; N I ; B 29 0 415 722 ;\nC 74 ; WX 648 ; N J ; B 6 -15 642 722 ;\nC 75 ; WX 815 ; N K ; B 19 0 822 722 ;\nC 76 ; WX 722 ; N L ; B 19 0 703 722 ;\nC 77 ; WX 981 ; N M ; B 10 0 971 722 ;\nC 78 ; WX 833 ; N N ; B 5 -10 828 722 ;\nC 79 ; WX 833 ; N O ; B 39 -15 794 737 ;\nC 80 ; WX 759 ; N P ; B 24 0 735 722 ;\nC 81 ; WX 833 ; N Q ; B 39 -189 808 737 ;\nC 82 ; WX 815 ; N R ; B 19 -15 815 722 ;\nC 83 ; WX 667 ; N S ; B 51 -15 634 737 ;\nC 84 ; WX 722 ; N T ; B 16 0 706 722 ;\nC 85 ; WX 833 ; N U ; B 14 -15 825 722 ;\nC 86 ; WX 759 ; N V ; B -19 -10 778 722 ;\nC 87 ; WX 981 ; N W ; B 7 -10 974 722 ;\nC 88 ; WX 722 ; N X ; B -12 0 734 722 ;\nC 89 ; WX 722 ; N Y ; B -12 0 734 722 ;\nC 90 ; WX 667 ; N Z ; B 28 0 639 722 ;\nC 91 ; WX 389 ; N bracketleft ; B 84 -109 339 737 ;\nC 92 ; WX 606 ; N backslash ; B 122 -15 484 737 ;\nC 93 ; WX 389 ; N bracketright ; B 50 -109 305 737 ;\nC 94 ; WX 606 ; N asciicircum ; B 66 325 540 690 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 241 ; N quoteleft ; B 22 378 220 737 ;\nC 97 ; WX 611 ; N a ; B 40 -15 601 485 ;\nC 98 ; WX 648 ; N b ; B 4 -15 616 737 ;\nC 99 ; WX 556 ; N c ; B 32 -15 524 485 ;\nC 100 ; WX 667 ; N d ; B 32 -15 644 737 ;\nC 101 ; WX 574 ; N e ; B 32 -15 542 485 ;\nC 102 ; WX 389 ; N f ; B 11 0 461 737 ; L i fi ; L l fl ;\nC 103 ; WX 611 ; N g ; B 30 -205 623 535 ;\nC 104 ; WX 685 ; N h ; B 17 0 662 737 ;\nC 105 ; WX 370 ; N i ; B 26 0 338 737 ;\nC 106 ; WX 352 ; N j ; B -86 -205 271 737 ;\nC 107 ; WX 667 ; N k ; B 17 0 662 737 ;\nC 108 ; WX 352 ; N l ; B 17 0 329 737 ;\nC 109 ; WX 963 ; N m ; B 17 0 940 485 ;\nC 110 ; WX 685 ; N n ; B 17 0 662 485 ;\nC 111 ; WX 611 ; N o ; B 32 -15 579 485 ;\nC 112 ; WX 667 ; N p ; B 17 -205 629 485 ;\nC 113 ; WX 648 ; N q ; B 32 -205 638 485 ;\nC 114 ; WX 519 ; N r ; B 17 0 516 485 ;\nC 115 ; WX 500 ; N s ; B 48 -15 476 485 ;\nC 116 ; WX 426 ; N t ; B 21 -15 405 675 ;\nC 117 ; WX 685 ; N u ; B 17 -15 668 475 ;\nC 118 ; WX 611 ; N v ; B 12 -10 599 475 ;\nC 119 ; WX 889 ; N w ; B 16 -10 873 475 ;\nC 120 ; WX 611 ; N x ; B 12 0 599 475 ;\nC 121 ; WX 611 ; N y ; B 12 -205 599 475 ;\nC 122 ; WX 537 ; N z ; B 38 0 499 475 ;\nC 123 ; WX 389 ; N braceleft ; B 36 -109 313 737 ;\nC 124 ; WX 606 ; N bar ; B 249 -250 357 750 ;\nC 125 ; WX 389 ; N braceright ; B 76 -109 353 737 ;\nC 126 ; WX 606 ; N asciitilde ; B 72 160 534 346 ;\nC 161 ; WX 296 ; N exclamdown ; B 53 -205 243 547 ;\nC 162 ; WX 574 ; N cent ; B 32 -102 528 572 ;\nC 163 ; WX 574 ; N sterling ; B 16 -15 558 705 ;\nC 164 ; WX 167 ; N fraction ; B -165 -15 332 705 ;\nC 165 ; WX 574 ; N yen ; B -10 0 584 690 ;\nC 166 ; WX 574 ; N florin ; B 14 -205 548 737 ;\nC 167 ; WX 500 ; N section ; B 62 -86 438 737 ;\nC 168 ; WX 574 ; N currency ; B 27 84 547 605 ;\nC 169 ; WX 241 ; N quotesingle ; B 53 378 189 737 ;\nC 170 ; WX 481 ; N quotedblleft ; B 22 378 459 737 ;\nC 171 ; WX 500 ; N guillemotleft ; B 46 79 454 397 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 62 79 271 397 ;\nC 173 ; WX 333 ; N guilsinglright ; B 62 79 271 397 ;\nC 174 ; WX 685 ; N fi ; B 11 0 666 737 ;\nC 175 ; WX 685 ; N fl ; B 11 0 666 737 ;\nC 177 ; WX 500 ; N endash ; B 0 184 500 292 ;\nC 178 ; WX 500 ; N dagger ; B 39 -101 461 737 ;\nC 179 ; WX 500 ; N daggerdbl ; B 39 -89 461 737 ;\nC 180 ; WX 278 ; N periodcentered ; B 53 200 225 372 ;\nC 182 ; WX 747 ; N paragraph ; B 96 -71 631 722 ;\nC 183 ; WX 606 ; N bullet ; B 122 180 484 542 ;\nC 184 ; WX 241 ; N quotesinglbase ; B 22 -184 220 175 ;\nC 185 ; WX 481 ; N quotedblbase ; B 22 -184 459 175 ;\nC 186 ; WX 481 ; N quotedblright ; B 22 378 459 737 ;\nC 187 ; WX 500 ; N guillemotright ; B 46 79 454 397 ;\nC 188 ; WX 1000 ; N ellipsis ; B 72 -15 928 175 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -15 993 705 ;\nC 191 ; WX 500 ; N questiondown ; B 23 -205 477 547 ;\nC 193 ; WX 333 ; N grave ; B 2 547 249 737 ;\nC 194 ; WX 333 ; N acute ; B 84 547 331 737 ;\nC 195 ; WX 333 ; N circumflex ; B -10 547 344 725 ;\nC 196 ; WX 333 ; N tilde ; B -24 563 357 705 ;\nC 197 ; WX 333 ; N macron ; B -6 582 339 664 ;\nC 198 ; WX 333 ; N breve ; B 9 547 324 714 ;\nC 199 ; WX 333 ; N dotaccent ; B 95 552 237 694 ;\nC 200 ; WX 333 ; N dieresis ; B -12 552 345 694 ;\nC 202 ; WX 333 ; N ring ; B 58 545 274 761 ;\nC 203 ; WX 333 ; N cedilla ; B 17 -224 248 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -16 547 431 737 ;\nC 206 ; WX 333 ; N ogonek ; B 168 -163 346 3 ;\nC 207 ; WX 333 ; N caron ; B -10 547 344 725 ;\nC 208 ; WX 1000 ; N emdash ; B 0 184 1000 292 ;\nC 225 ; WX 981 ; N AE ; B -29 0 963 722 ;\nC 227 ; WX 367 ; N ordfeminine ; B 1 407 393 705 ;\nC 232 ; WX 722 ; N Lslash ; B 19 0 703 722 ;\nC 233 ; WX 833 ; N Oslash ; B 39 -53 794 775 ;\nC 234 ; WX 1000 ; N OE ; B 0 0 982 722 ;\nC 235 ; WX 367 ; N ordmasculine ; B 1 407 366 705 ;\nC 241 ; WX 870 ; N ae ; B 32 -15 838 485 ;\nC 245 ; WX 370 ; N dotlessi ; B 26 0 338 475 ;\nC 248 ; WX 352 ; N lslash ; B 17 0 329 737 ;\nC 249 ; WX 611 ; N oslash ; B 32 -103 579 573 ;\nC 250 ; WX 907 ; N oe ; B 32 -15 875 485 ;\nC 251 ; WX 611 ; N germandbls ; B -2 -15 580 737 ;\nC -1 ; WX 574 ; N ecircumflex ; B 32 -15 542 725 ;\nC -1 ; WX 574 ; N edieresis ; B 32 -15 542 694 ;\nC -1 ; WX 611 ; N aacute ; B 40 -15 601 737 ;\nC -1 ; WX 747 ; N registered ; B -2 -15 750 737 ;\nC -1 ; WX 370 ; N icircumflex ; B 9 0 363 725 ;\nC -1 ; WX 685 ; N udieresis ; B 17 -15 668 694 ;\nC -1 ; WX 611 ; N ograve ; B 32 -15 579 737 ;\nC -1 ; WX 685 ; N uacute ; B 17 -15 668 737 ;\nC -1 ; WX 685 ; N ucircumflex ; B 17 -15 668 725 ;\nC -1 ; WX 759 ; N Aacute ; B -19 0 778 964 ;\nC -1 ; WX 370 ; N igrave ; B 21 0 338 737 ;\nC -1 ; WX 444 ; N Icircumflex ; B 29 0 415 952 ;\nC -1 ; WX 556 ; N ccedilla ; B 32 -224 524 485 ;\nC -1 ; WX 611 ; N adieresis ; B 40 -15 601 694 ;\nC -1 ; WX 759 ; N Ecircumflex ; B 19 0 708 952 ;\nC -1 ; WX 500 ; N scaron ; B 48 -15 476 725 ;\nC -1 ; WX 667 ; N thorn ; B 17 -205 629 737 ;\nC -1 ; WX 1000 ; N trademark ; B 6 317 982 722 ;\nC -1 ; WX 574 ; N egrave ; B 32 -15 542 737 ;\nC -1 ; WX 344 ; N threesuperior ; B -3 273 355 705 ;\nC -1 ; WX 537 ; N zcaron ; B 38 0 499 725 ;\nC -1 ; WX 611 ; N atilde ; B 40 -15 601 705 ;\nC -1 ; WX 611 ; N aring ; B 40 -15 601 761 ;\nC -1 ; WX 611 ; N ocircumflex ; B 32 -15 579 725 ;\nC -1 ; WX 759 ; N Edieresis ; B 19 0 708 921 ;\nC -1 ; WX 861 ; N threequarters ; B 15 -15 838 705 ;\nC -1 ; WX 611 ; N ydieresis ; B 12 -205 599 694 ;\nC -1 ; WX 611 ; N yacute ; B 12 -205 599 737 ;\nC -1 ; WX 370 ; N iacute ; B 26 0 350 737 ;\nC -1 ; WX 759 ; N Acircumflex ; B -19 0 778 952 ;\nC -1 ; WX 833 ; N Uacute ; B 14 -15 825 964 ;\nC -1 ; WX 574 ; N eacute ; B 32 -15 542 737 ;\nC -1 ; WX 833 ; N Ograve ; B 39 -15 794 964 ;\nC -1 ; WX 611 ; N agrave ; B 40 -15 601 737 ;\nC -1 ; WX 833 ; N Udieresis ; B 14 -15 825 921 ;\nC -1 ; WX 611 ; N acircumflex ; B 40 -15 601 725 ;\nC -1 ; WX 444 ; N Igrave ; B 29 0 415 964 ;\nC -1 ; WX 344 ; N twosuperior ; B -3 282 350 705 ;\nC -1 ; WX 833 ; N Ugrave ; B 14 -15 825 964 ;\nC -1 ; WX 861 ; N onequarter ; B 31 -15 838 705 ;\nC -1 ; WX 833 ; N Ucircumflex ; B 14 -15 825 952 ;\nC -1 ; WX 667 ; N Scaron ; B 51 -15 634 952 ;\nC -1 ; WX 444 ; N Idieresis ; B 29 0 415 921 ;\nC -1 ; WX 370 ; N idieresis ; B 7 0 364 694 ;\nC -1 ; WX 759 ; N Egrave ; B 19 0 708 964 ;\nC -1 ; WX 833 ; N Oacute ; B 39 -15 794 964 ;\nC -1 ; WX 606 ; N divide ; B 50 -40 556 546 ;\nC -1 ; WX 759 ; N Atilde ; B -19 0 778 932 ;\nC -1 ; WX 759 ; N Aring ; B -19 0 778 988 ;\nC -1 ; WX 833 ; N Odieresis ; B 39 -15 794 921 ;\nC -1 ; WX 759 ; N Adieresis ; B -19 0 778 921 ;\nC -1 ; WX 833 ; N Ntilde ; B 5 -10 828 932 ;\nC -1 ; WX 667 ; N Zcaron ; B 28 0 639 952 ;\nC -1 ; WX 759 ; N Thorn ; B 24 0 735 722 ;\nC -1 ; WX 444 ; N Iacute ; B 29 0 415 964 ;\nC -1 ; WX 606 ; N plusminus ; B 50 0 556 506 ;\nC -1 ; WX 606 ; N multiply ; B 65 15 541 491 ;\nC -1 ; WX 759 ; N Eacute ; B 19 0 708 964 ;\nC -1 ; WX 722 ; N Ydieresis ; B -12 0 734 921 ;\nC -1 ; WX 344 ; N onesuperior ; B 31 282 309 705 ;\nC -1 ; WX 685 ; N ugrave ; B 17 -15 668 737 ;\nC -1 ; WX 606 ; N logicalnot ; B 50 103 556 403 ;\nC -1 ; WX 685 ; N ntilde ; B 17 0 662 705 ;\nC -1 ; WX 833 ; N Otilde ; B 39 -15 794 932 ;\nC -1 ; WX 611 ; N otilde ; B 32 -15 579 705 ;\nC -1 ; WX 778 ; N Ccedilla ; B 39 -224 723 737 ;\nC -1 ; WX 759 ; N Agrave ; B -19 0 778 964 ;\nC -1 ; WX 861 ; N onehalf ; B 31 -15 838 705 ;\nC -1 ; WX 833 ; N Eth ; B 19 0 794 722 ;\nC -1 ; WX 400 ; N degree ; B 57 419 343 705 ;\nC -1 ; WX 722 ; N Yacute ; B -12 0 734 964 ;\nC -1 ; WX 833 ; N Ocircumflex ; B 39 -15 794 952 ;\nC -1 ; WX 611 ; N oacute ; B 32 -15 579 737 ;\nC -1 ; WX 685 ; N mu ; B 17 -205 668 475 ;\nC -1 ; WX 606 ; N minus ; B 50 199 556 307 ;\nC -1 ; WX 611 ; N eth ; B 32 -15 579 737 ;\nC -1 ; WX 611 ; N odieresis ; B 32 -15 579 694 ;\nC -1 ; WX 747 ; N copyright ; B -2 -15 750 737 ;\nC -1 ; WX 606 ; N brokenbar ; B 249 -175 357 675 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 128\n\nKPX A y -18\nKPX A w -18\nKPX A v -18\nKPX A quoteright -74\nKPX A quotedblright -74\nKPX A Y -91\nKPX A W -74\nKPX A V -74\nKPX A U -18\nKPX A T -55\n\nKPX C period -18\nKPX C comma -18\n\nKPX D period -25\nKPX D comma -25\n\nKPX F r -18\nKPX F period -125\nKPX F o -55\nKPX F i -18\nKPX F e -55\nKPX F comma -125\nKPX F a -74\n\nKPX J u -18\nKPX J period -55\nKPX J o -18\nKPX J e -18\nKPX J comma -55\nKPX J a -18\nKPX J A -18\n\nKPX K y -25\nKPX K u -18\n\nKPX L y -25\nKPX L quoteright -100\nKPX L quotedblright -100\nKPX L Y -74\nKPX L W -74\nKPX L V -100\nKPX L T -100\n\nKPX N period -18\nKPX N comma -18\n\nKPX O period -25\nKPX O comma -25\nKPX O T 10\n\nKPX P period -150\nKPX P o -55\nKPX P e -55\nKPX P comma -150\nKPX P a -55\nKPX P A -74\n\nKPX S period -18\nKPX S comma -18\n\nKPX T u -18\nKPX T r -18\nKPX T period -100\nKPX T o -74\nKPX T i -18\nKPX T hyphen -125\nKPX T e -74\nKPX T comma -100\nKPX T a -74\nKPX T O 10\nKPX T A -55\n\nKPX U period -25\nKPX U comma -25\nKPX U A -18\n\nKPX V u -55\nKPX V semicolon -37\nKPX V period -125\nKPX V o -74\nKPX V i -18\nKPX V hyphen -100\nKPX V e -74\nKPX V comma -125\nKPX V colon -37\nKPX V a -74\nKPX V A -74\n\nKPX W y -25\nKPX W u -37\nKPX W semicolon -55\nKPX W period -100\nKPX W o -74\nKPX W i -18\nKPX W hyphen -100\nKPX W e -74\nKPX W comma -100\nKPX W colon -55\nKPX W a -74\nKPX W A -74\n\nKPX Y u -55\nKPX Y semicolon -25\nKPX Y period -100\nKPX Y o -100\nKPX Y i -18\nKPX Y hyphen -125\nKPX Y e -100\nKPX Y comma -100\nKPX Y colon -25\nKPX Y a -100\nKPX Y A -91\n\nKPX colon space -18\n\nKPX comma space -18\nKPX comma quoteright -18\nKPX comma quotedblright -18\n\nKPX f quoteright 75\nKPX f quotedblright 75\n\nKPX period space -18\nKPX period quoteright -18\nKPX period quotedblright -18\n\nKPX quotedblleft A -74\n\nKPX quotedblright space -18\n\nKPX quoteleft A -74\n\nKPX quoteright s -25\nKPX quoteright d -25\n\nKPX r period -74\nKPX r comma -74\n\nKPX semicolon space -18\n\nKPX space quoteleft -18\nKPX space quotedblleft -18\nKPX space Y -18\nKPX space W -18\nKPX space V -18\nKPX space T -18\nKPX space A -18\n\nKPX v period -100\nKPX v comma -100\n\nKPX w period -100\nKPX w comma -100\n\nKPX y period -100\nKPX y comma -100\nEndKernPairs\nEndKernData\nStartComposites 56\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 213 227 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 213 227 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 213 227 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 213 227 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 213 227 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 213 227 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 213 227 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 213 227 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 213 227 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 213 227 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 56 227 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 56 227 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 56 227 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 56 227 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 250 227 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 250 227 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 250 227 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 250 227 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 250 227 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 250 227 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 167 227 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 250 227 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 250 227 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 250 227 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 250 227 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 195 227 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 195 227 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 167 227 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 139 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 139 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 139 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 139 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 139 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 139 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 121 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 121 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 121 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 121 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 19 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex 19 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis 19 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave 19 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 176 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 139 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 139 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 139 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 139 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 139 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 84 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 176 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 176 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 176 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 176 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 139 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 139 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 102 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pncbi8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1991 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Tue May 28 16:56:07 1991\nComment UniqueID 35034\nComment VMusage 31030 37922\nFontName NewCenturySchlbk-BoldItalic\nFullName New Century Schoolbook Bold Italic\nFamilyName New Century Schoolbook\nWeight Bold\nItalicAngle -16\nIsFixedPitch false\nFontBBox -205 -250 1147 991\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.007\nNotice Copyright (c) 1985, 1987, 1989, 1991 Adobe Systems Incorporated.  All Rights Reserved.\nEncodingScheme AdobeStandardEncoding\nCapHeight 722\nXHeight 477\nAscender 737\nDescender -205\nStartCharMetrics 228\nC 32 ; WX 287 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 0 -15 333 737 ;\nC 34 ; WX 400 ; N quotedbl ; B 66 388 428 737 ;\nC 35 ; WX 574 ; N numbersign ; B 30 0 544 690 ;\nC 36 ; WX 574 ; N dollar ; B 9 -120 565 810 ;\nC 37 ; WX 889 ; N percent ; B 54 -28 835 727 ;\nC 38 ; WX 889 ; N ampersand ; B 32 -15 823 737 ;\nC 39 ; WX 259 ; N quoteright ; B 48 388 275 737 ;\nC 40 ; WX 407 ; N parenleft ; B 72 -117 454 745 ;\nC 41 ; WX 407 ; N parenright ; B -70 -117 310 745 ;\nC 42 ; WX 500 ; N asterisk ; B 58 301 498 737 ;\nC 43 ; WX 606 ; N plus ; B 50 0 556 506 ;\nC 44 ; WX 287 ; N comma ; B -57 -192 170 157 ;\nC 45 ; WX 333 ; N hyphen ; B 2 177 263 299 ;\nC 46 ; WX 287 ; N period ; B -20 -15 152 157 ;\nC 47 ; WX 278 ; N slash ; B -41 -15 320 737 ;\nC 48 ; WX 574 ; N zero ; B 21 -15 553 705 ;\nC 49 ; WX 574 ; N one ; B 25 0 489 705 ;\nC 50 ; WX 574 ; N two ; B -38 -3 538 705 ;\nC 51 ; WX 574 ; N three ; B -7 -15 536 705 ;\nC 52 ; WX 574 ; N four ; B -13 0 544 705 ;\nC 53 ; WX 574 ; N five ; B 0 -15 574 705 ;\nC 54 ; WX 574 ; N six ; B 31 -15 574 705 ;\nC 55 ; WX 574 ; N seven ; B 64 -15 593 705 ;\nC 56 ; WX 574 ; N eight ; B 0 -15 552 705 ;\nC 57 ; WX 574 ; N nine ; B 0 -15 543 705 ;\nC 58 ; WX 287 ; N colon ; B -20 -15 237 477 ;\nC 59 ; WX 287 ; N semicolon ; B -57 -192 237 477 ;\nC 60 ; WX 606 ; N less ; B 50 -9 556 515 ;\nC 61 ; WX 606 ; N equal ; B 50 103 556 403 ;\nC 62 ; WX 606 ; N greater ; B 50 -8 556 514 ;\nC 63 ; WX 481 ; N question ; B 79 -15 451 737 ;\nC 64 ; WX 747 ; N at ; B -4 -15 751 737 ;\nC 65 ; WX 741 ; N A ; B -75 0 716 737 ;\nC 66 ; WX 759 ; N B ; B -50 0 721 722 ;\nC 67 ; WX 759 ; N C ; B 37 -15 759 737 ;\nC 68 ; WX 833 ; N D ; B -47 0 796 722 ;\nC 69 ; WX 741 ; N E ; B -41 0 730 722 ;\nC 70 ; WX 704 ; N F ; B -41 0 730 722 ;\nC 71 ; WX 815 ; N G ; B 37 -15 805 737 ;\nC 72 ; WX 870 ; N H ; B -41 0 911 722 ;\nC 73 ; WX 444 ; N I ; B -41 0 485 722 ;\nC 74 ; WX 667 ; N J ; B -20 -15 708 722 ;\nC 75 ; WX 778 ; N K ; B -41 0 832 722 ;\nC 76 ; WX 704 ; N L ; B -41 0 670 722 ;\nC 77 ; WX 944 ; N M ; B -44 0 988 722 ;\nC 78 ; WX 852 ; N N ; B -61 -10 913 722 ;\nC 79 ; WX 833 ; N O ; B 37 -15 796 737 ;\nC 80 ; WX 741 ; N P ; B -41 0 730 722 ;\nC 81 ; WX 833 ; N Q ; B 37 -189 796 737 ;\nC 82 ; WX 796 ; N R ; B -41 -15 749 722 ;\nC 83 ; WX 685 ; N S ; B 1 -15 666 737 ;\nC 84 ; WX 722 ; N T ; B 41 0 759 722 ;\nC 85 ; WX 833 ; N U ; B 88 -15 900 722 ;\nC 86 ; WX 741 ; N V ; B 32 -10 802 722 ;\nC 87 ; WX 944 ; N W ; B 40 -10 1000 722 ;\nC 88 ; WX 741 ; N X ; B -82 0 801 722 ;\nC 89 ; WX 704 ; N Y ; B 13 0 775 722 ;\nC 90 ; WX 704 ; N Z ; B -33 0 711 722 ;\nC 91 ; WX 407 ; N bracketleft ; B 1 -109 464 737 ;\nC 92 ; WX 606 ; N backslash ; B 161 -15 445 737 ;\nC 93 ; WX 407 ; N bracketright ; B -101 -109 362 737 ;\nC 94 ; WX 606 ; N asciicircum ; B 66 325 540 690 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 259 ; N quoteleft ; B 47 388 274 737 ;\nC 97 ; WX 667 ; N a ; B 6 -15 636 477 ;\nC 98 ; WX 611 ; N b ; B 29 -15 557 737 ;\nC 99 ; WX 537 ; N c ; B 0 -15 482 477 ;\nC 100 ; WX 667 ; N d ; B 0 -15 660 737 ;\nC 101 ; WX 519 ; N e ; B 0 -15 479 477 ;\nC 102 ; WX 389 ; N f ; B -48 -205 550 737 ; L i fi ; L l fl ;\nC 103 ; WX 611 ; N g ; B -63 -205 604 528 ;\nC 104 ; WX 685 ; N h ; B 0 -15 639 737 ;\nC 105 ; WX 389 ; N i ; B 32 -15 345 737 ;\nC 106 ; WX 370 ; N j ; B -205 -205 347 737 ;\nC 107 ; WX 648 ; N k ; B -11 -15 578 737 ;\nC 108 ; WX 389 ; N l ; B 32 -15 375 737 ;\nC 109 ; WX 944 ; N m ; B 0 -15 909 477 ;\nC 110 ; WX 685 ; N n ; B 0 -15 639 477 ;\nC 111 ; WX 574 ; N o ; B 0 -15 530 477 ;\nC 112 ; WX 648 ; N p ; B -119 -205 590 477 ;\nC 113 ; WX 630 ; N q ; B 0 -205 587 477 ;\nC 114 ; WX 519 ; N r ; B 0 0 527 486 ;\nC 115 ; WX 481 ; N s ; B 0 -15 435 477 ;\nC 116 ; WX 407 ; N t ; B 24 -15 403 650 ;\nC 117 ; WX 685 ; N u ; B 30 -15 635 477 ;\nC 118 ; WX 556 ; N v ; B 30 -15 496 477 ;\nC 119 ; WX 833 ; N w ; B 30 -15 773 477 ;\nC 120 ; WX 574 ; N x ; B -46 -15 574 477 ;\nC 121 ; WX 519 ; N y ; B -66 -205 493 477 ;\nC 122 ; WX 519 ; N z ; B -19 -15 473 477 ;\nC 123 ; WX 407 ; N braceleft ; B 52 -109 408 737 ;\nC 124 ; WX 606 ; N bar ; B 249 -250 357 750 ;\nC 125 ; WX 407 ; N braceright ; B -25 -109 331 737 ;\nC 126 ; WX 606 ; N asciitilde ; B 72 160 534 346 ;\nC 161 ; WX 333 ; N exclamdown ; B -44 -205 289 547 ;\nC 162 ; WX 574 ; N cent ; B 30 -144 512 578 ;\nC 163 ; WX 574 ; N sterling ; B -18 -15 566 705 ;\nC 164 ; WX 167 ; N fraction ; B -166 -15 333 705 ;\nC 165 ; WX 574 ; N yen ; B 17 0 629 690 ;\nC 166 ; WX 574 ; N florin ; B -43 -205 575 737 ;\nC 167 ; WX 500 ; N section ; B -30 -146 515 737 ;\nC 168 ; WX 574 ; N currency ; B 27 84 547 605 ;\nC 169 ; WX 287 ; N quotesingle ; B 112 388 250 737 ;\nC 170 ; WX 481 ; N quotedblleft ; B 54 388 521 737 ;\nC 171 ; WX 481 ; N guillemotleft ; B -35 69 449 407 ;\nC 172 ; WX 278 ; N guilsinglleft ; B -25 69 244 407 ;\nC 173 ; WX 278 ; N guilsinglright ; B -26 69 243 407 ;\nC 174 ; WX 685 ; N fi ; B -70 -205 641 737 ;\nC 175 ; WX 685 ; N fl ; B -70 -205 671 737 ;\nC 177 ; WX 500 ; N endash ; B -47 189 479 287 ;\nC 178 ; WX 500 ; N dagger ; B 48 -146 508 737 ;\nC 179 ; WX 500 ; N daggerdbl ; B -60 -150 508 737 ;\nC 180 ; WX 287 ; N periodcentered ; B 57 200 229 372 ;\nC 182 ; WX 650 ; N paragraph ; B 25 -131 681 722 ;\nC 183 ; WX 606 ; N bullet ; B 122 180 484 542 ;\nC 184 ; WX 259 ; N quotesinglbase ; B -57 -192 170 157 ;\nC 185 ; WX 481 ; N quotedblbase ; B -57 -192 412 157 ;\nC 186 ; WX 481 ; N quotedblright ; B 43 388 510 737 ;\nC 187 ; WX 481 ; N guillemotright ; B -31 69 453 407 ;\nC 188 ; WX 1000 ; N ellipsis ; B 81 -15 919 157 ;\nC 189 ; WX 1167 ; N perthousand ; B 20 -28 1147 727 ;\nC 191 ; WX 481 ; N questiondown ; B 0 -205 372 547 ;\nC 193 ; WX 333 ; N grave ; B 74 538 294 722 ;\nC 194 ; WX 333 ; N acute ; B 123 538 372 722 ;\nC 195 ; WX 333 ; N circumflex ; B 23 533 365 705 ;\nC 196 ; WX 333 ; N tilde ; B 28 561 398 690 ;\nC 197 ; WX 333 ; N macron ; B 47 573 404 649 ;\nC 198 ; WX 333 ; N breve ; B 67 535 390 698 ;\nC 199 ; WX 333 ; N dotaccent ; B 145 546 289 690 ;\nC 200 ; WX 333 ; N dieresis ; B 33 546 393 690 ;\nC 202 ; WX 333 ; N ring ; B 111 522 335 746 ;\nC 203 ; WX 333 ; N cedilla ; B -21 -220 225 3 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 15 538 480 722 ;\nC 206 ; WX 333 ; N ogonek ; B 68 -155 246 -10 ;\nC 207 ; WX 333 ; N caron ; B 60 531 403 705 ;\nC 208 ; WX 1000 ; N emdash ; B -47 189 979 287 ;\nC 225 ; WX 889 ; N AE ; B -86 0 915 722 ;\nC 227 ; WX 412 ; N ordfeminine ; B 47 407 460 705 ;\nC 232 ; WX 704 ; N Lslash ; B -41 0 670 722 ;\nC 233 ; WX 833 ; N Oslash ; B 35 -68 798 790 ;\nC 234 ; WX 963 ; N OE ; B 29 0 989 722 ;\nC 235 ; WX 356 ; N ordmasculine ; B 42 407 394 705 ;\nC 241 ; WX 815 ; N ae ; B -18 -15 775 477 ;\nC 245 ; WX 389 ; N dotlessi ; B 32 -15 345 477 ;\nC 248 ; WX 389 ; N lslash ; B 5 -15 390 737 ;\nC 249 ; WX 574 ; N oslash ; B 0 -121 530 583 ;\nC 250 ; WX 852 ; N oe ; B -6 -15 812 477 ;\nC 251 ; WX 574 ; N germandbls ; B -91 -205 540 737 ;\nC -1 ; WX 519 ; N ecircumflex ; B 0 -15 479 705 ;\nC -1 ; WX 519 ; N edieresis ; B 0 -15 486 690 ;\nC -1 ; WX 667 ; N aacute ; B 6 -15 636 722 ;\nC -1 ; WX 747 ; N registered ; B -2 -15 750 737 ;\nC -1 ; WX 389 ; N icircumflex ; B 21 -15 363 698 ;\nC -1 ; WX 685 ; N udieresis ; B 30 -15 635 690 ;\nC -1 ; WX 574 ; N ograve ; B 0 -15 530 722 ;\nC -1 ; WX 685 ; N uacute ; B 30 -15 635 722 ;\nC -1 ; WX 685 ; N ucircumflex ; B 30 -15 635 705 ;\nC -1 ; WX 741 ; N Aacute ; B -75 0 716 947 ;\nC -1 ; WX 389 ; N igrave ; B 32 -15 345 715 ;\nC -1 ; WX 444 ; N Icircumflex ; B -41 0 485 930 ;\nC -1 ; WX 537 ; N ccedilla ; B 0 -220 482 477 ;\nC -1 ; WX 667 ; N adieresis ; B 6 -15 636 690 ;\nC -1 ; WX 741 ; N Ecircumflex ; B -41 0 730 930 ;\nC -1 ; WX 481 ; N scaron ; B 0 -15 477 705 ;\nC -1 ; WX 648 ; N thorn ; B -119 -205 590 737 ;\nC -1 ; WX 950 ; N trademark ; B 42 317 1017 722 ;\nC -1 ; WX 519 ; N egrave ; B 0 -15 479 722 ;\nC -1 ; WX 344 ; N threesuperior ; B 3 273 361 705 ;\nC -1 ; WX 519 ; N zcaron ; B -19 -15 473 695 ;\nC -1 ; WX 667 ; N atilde ; B 6 -15 636 690 ;\nC -1 ; WX 667 ; N aring ; B 6 -15 636 746 ;\nC -1 ; WX 574 ; N ocircumflex ; B 0 -15 530 705 ;\nC -1 ; WX 741 ; N Edieresis ; B -41 0 730 915 ;\nC -1 ; WX 861 ; N threequarters ; B 35 -15 789 705 ;\nC -1 ; WX 519 ; N ydieresis ; B -66 -205 493 690 ;\nC -1 ; WX 519 ; N yacute ; B -66 -205 493 722 ;\nC -1 ; WX 389 ; N iacute ; B 32 -15 370 715 ;\nC -1 ; WX 741 ; N Acircumflex ; B -75 0 716 930 ;\nC -1 ; WX 833 ; N Uacute ; B 88 -15 900 947 ;\nC -1 ; WX 519 ; N eacute ; B 0 -15 479 722 ;\nC -1 ; WX 833 ; N Ograve ; B 37 -15 796 947 ;\nC -1 ; WX 667 ; N agrave ; B 6 -15 636 722 ;\nC -1 ; WX 833 ; N Udieresis ; B 88 -15 900 915 ;\nC -1 ; WX 667 ; N acircumflex ; B 6 -15 636 705 ;\nC -1 ; WX 444 ; N Igrave ; B -41 0 485 947 ;\nC -1 ; WX 344 ; N twosuperior ; B -17 280 362 705 ;\nC -1 ; WX 833 ; N Ugrave ; B 88 -15 900 947 ;\nC -1 ; WX 861 ; N onequarter ; B 17 -15 789 705 ;\nC -1 ; WX 833 ; N Ucircumflex ; B 88 -15 900 930 ;\nC -1 ; WX 685 ; N Scaron ; B 1 -15 666 930 ;\nC -1 ; WX 444 ; N Idieresis ; B -41 0 509 915 ;\nC -1 ; WX 389 ; N idieresis ; B 31 -15 391 683 ;\nC -1 ; WX 741 ; N Egrave ; B -41 0 730 947 ;\nC -1 ; WX 833 ; N Oacute ; B 37 -15 796 947 ;\nC -1 ; WX 606 ; N divide ; B 50 -40 556 546 ;\nC -1 ; WX 741 ; N Atilde ; B -75 0 716 915 ;\nC -1 ; WX 741 ; N Aring ; B -75 0 716 991 ;\nC -1 ; WX 833 ; N Odieresis ; B 37 -15 796 915 ;\nC -1 ; WX 741 ; N Adieresis ; B -75 0 716 915 ;\nC -1 ; WX 852 ; N Ntilde ; B -61 -10 913 915 ;\nC -1 ; WX 704 ; N Zcaron ; B -33 0 711 930 ;\nC -1 ; WX 741 ; N Thorn ; B -41 0 690 722 ;\nC -1 ; WX 444 ; N Iacute ; B -41 0 488 947 ;\nC -1 ; WX 606 ; N plusminus ; B 50 0 556 506 ;\nC -1 ; WX 606 ; N multiply ; B 65 15 541 491 ;\nC -1 ; WX 741 ; N Eacute ; B -41 0 730 947 ;\nC -1 ; WX 704 ; N Ydieresis ; B 13 0 775 915 ;\nC -1 ; WX 344 ; N onesuperior ; B 19 282 326 705 ;\nC -1 ; WX 685 ; N ugrave ; B 30 -15 635 722 ;\nC -1 ; WX 606 ; N logicalnot ; B 50 103 556 403 ;\nC -1 ; WX 685 ; N ntilde ; B 0 -15 639 690 ;\nC -1 ; WX 833 ; N Otilde ; B 37 -15 796 915 ;\nC -1 ; WX 574 ; N otilde ; B 0 -15 530 690 ;\nC -1 ; WX 759 ; N Ccedilla ; B 37 -220 759 737 ;\nC -1 ; WX 741 ; N Agrave ; B -75 0 716 947 ;\nC -1 ; WX 861 ; N onehalf ; B 17 -15 798 705 ;\nC -1 ; WX 833 ; N Eth ; B -47 0 796 722 ;\nC -1 ; WX 400 ; N degree ; B 86 419 372 705 ;\nC -1 ; WX 704 ; N Yacute ; B 13 0 775 947 ;\nC -1 ; WX 833 ; N Ocircumflex ; B 37 -15 796 930 ;\nC -1 ; WX 574 ; N oacute ; B 0 -15 530 722 ;\nC -1 ; WX 685 ; N mu ; B -89 -205 635 477 ;\nC -1 ; WX 606 ; N minus ; B 50 199 556 307 ;\nC -1 ; WX 574 ; N eth ; B 0 -15 530 752 ;\nC -1 ; WX 574 ; N odieresis ; B 0 -15 530 690 ;\nC -1 ; WX 747 ; N copyright ; B -2 -15 750 737 ;\nC -1 ; WX 606 ; N brokenbar ; B 249 -175 357 675 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 239\n\nKPX A y -33\nKPX A w -25\nKPX A v -10\nKPX A u -15\nKPX A quoteright -95\nKPX A quotedblright -95\nKPX A Y -70\nKPX A W -84\nKPX A V -100\nKPX A U -32\nKPX A T 5\nKPX A Q 5\nKPX A O 5\nKPX A G 5\nKPX A C 5\n\nKPX B period 15\nKPX B comma 15\nKPX B U 15\nKPX B A -11\n\nKPX C A -5\n\nKPX D period -11\nKPX D comma -11\nKPX D Y 6\nKPX D W -11\nKPX D V -18\n\nKPX F r -27\nKPX F period -91\nKPX F o -47\nKPX F i -41\nKPX F e -41\nKPX F comma -91\nKPX F a -47\nKPX F A -79\n\nKPX J u -39\nKPX J period -74\nKPX J o -40\nKPX J e -33\nKPX J comma -74\nKPX J a -40\nKPX J A -30\n\nKPX K y -48\nKPX K u -4\nKPX K o -4\nKPX K e 18\n\nKPX L y -30\nKPX L quoteright -100\nKPX L quotedblright -100\nKPX L Y -55\nKPX L W -69\nKPX L V -97\nKPX L T -75\n\nKPX N period -49\nKPX N comma -49\n\nKPX O period -18\nKPX O comma -18\nKPX O X -18\nKPX O W -15\nKPX O V -24\nKPX O A -5\n\nKPX P period -100\nKPX P o -40\nKPX P e -33\nKPX P comma -100\nKPX P a -40\nKPX P A -80\n\nKPX R W -14\nKPX R V -24\n\nKPX S period -18\nKPX S comma -18\n\nKPX T y -30\nKPX T w -30\nKPX T u -22\nKPX T r -9\nKPX T period -55\nKPX T o -40\nKPX T i -22\nKPX T hyphen -75\nKPX T h -9\nKPX T e -33\nKPX T comma -55\nKPX T a -40\nKPX T O 11\nKPX T A -60\n\nKPX U period -25\nKPX U comma -25\nKPX U A -42\n\nKPX V u -70\nKPX V semicolon 6\nKPX V period -94\nKPX V o -71\nKPX V i -35\nKPX V hyphen -94\nKPX V e -66\nKPX V comma -94\nKPX V colon -49\nKPX V a -55\nKPX V O -19\nKPX V G -12\nKPX V A -100\n\nKPX W y -41\nKPX W u -25\nKPX W semicolon -22\nKPX W period -86\nKPX W o -33\nKPX W i -27\nKPX W hyphen -61\nKPX W h 5\nKPX W e -39\nKPX W comma -86\nKPX W colon -22\nKPX W a -33\nKPX W O -11\nKPX W A -66\n\nKPX Y u -58\nKPX Y semicolon -55\nKPX Y period -91\nKPX Y o -77\nKPX Y i -22\nKPX Y hyphen -91\nKPX Y e -71\nKPX Y comma -91\nKPX Y colon -55\nKPX Y a -77\nKPX Y A -79\n\nKPX a y -8\nKPX a w -8\nKPX a v 6\n\nKPX b y -6\nKPX b v 8\nKPX b period 6\nKPX b comma 6\n\nKPX c y -20\nKPX c period -8\nKPX c l -13\nKPX c k -8\nKPX c h -18\nKPX c comma -8\n\nKPX colon space -18\n\nKPX comma space -18\nKPX comma quoteright -18\nKPX comma quotedblright -18\n\nKPX d y -15\nKPX d w -15\n\nKPX e y -15\nKPX e x -5\nKPX e w -15\nKPX e p -11\nKPX e g -4\nKPX e b -8\n\nKPX f quoteright 105\nKPX f quotedblright 105\nKPX f period -28\nKPX f o 7\nKPX f l 7\nKPX f i 7\nKPX f e 14\nKPX f dotlessi 7\nKPX f comma -28\nKPX f a 8\n\nKPX g y -11\nKPX g r 11\nKPX g period -5\nKPX g comma -5\n\nKPX h y -20\n\nKPX i v 7\n\nKPX k y -15\nKPX k o -22\nKPX k e -16\n\nKPX l y -7\nKPX l w -7\n\nKPX m y -20\nKPX m u -11\n\nKPX n y -20\nKPX n v -7\nKPX n u -11\n\nKPX o y -11\nKPX o w -8\nKPX o v 6\n\nKPX p y -4\nKPX p period 8\nKPX p comma 8\n\nKPX period space -18\nKPX period quoteright -18\nKPX period quotedblright -18\n\nKPX quotedblleft quoteleft 20\nKPX quotedblleft A -60\n\nKPX quotedblright space -18\n\nKPX quoteleft A -80\n\nKPX quoteright v -16\nKPX quoteright t -22\nKPX quoteright s -46\nKPX quoteright r -9\nKPX quoteright l -22\nKPX quoteright d -41\n\nKPX r y -20\nKPX r v -7\nKPX r u -11\nKPX r t -11\nKPX r semicolon 9\nKPX r s -20\nKPX r quoteright 9\nKPX r period -90\nKPX r p -17\nKPX r o -11\nKPX r l -14\nKPX r k 9\nKPX r i -14\nKPX r hyphen -16\nKPX r g -11\nKPX r e -7\nKPX r d -7\nKPX r comma -90\nKPX r colon 9\nKPX r a -11\n\nKPX s period 11\nKPX s comma 11\n\nKPX semicolon space -18\n\nKPX space quotedblleft -18\nKPX space Y -18\nKPX space W -33\nKPX space V -24\nKPX space T -18\nKPX space A -22\n\nKPX v period -11\nKPX v o -6\nKPX v comma -11\nKPX v a -6\n\nKPX w period -17\nKPX w o -14\nKPX w e -8\nKPX w comma -17\nKPX w a -14\n\nKPX x e 5\n\nKPX y period -25\nKPX y o 8\nKPX y e 15\nKPX y comma -25\nKPX y a 8\n\nKPX z e 4\nEndKernPairs\nEndKernData\nStartComposites 56\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 259 225 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 259 225 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 259 225 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 259 225 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 229 245 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 259 225 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 296 225 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 296 225 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 296 225 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 296 225 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 116 225 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 116 225 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 116 225 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 116 225 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 326 225 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 315 225 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 315 225 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 315 225 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 315 225 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 315 225 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 206 225 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 340 225 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 340 225 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 340 225 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 340 225 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 246 225 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 236 225 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 226 225 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 167 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 167 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 167 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 167 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 167 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 167 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 93 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 93 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 93 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 93 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -2 -7 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -2 -7 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -2 -7 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -2 -7 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 176 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 121 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 121 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 121 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 121 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 121 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 74 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 176 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 176 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 176 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 176 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 93 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 93 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 63 -10 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pncr8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1991 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Tue May 28 16:31:51 1991\nComment UniqueID 35025\nComment VMusage 30420 37312\nFontName NewCenturySchlbk-Roman\nFullName New Century Schoolbook Roman\nFamilyName New Century Schoolbook\nWeight Roman\nItalicAngle 0\nIsFixedPitch false\nFontBBox -195 -250 1000 965\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.007\nNotice Copyright (c) 1985, 1987, 1989, 1991 Adobe Systems Incorporated.  All Rights Reserved.\nEncodingScheme AdobeStandardEncoding\nCapHeight 722\nXHeight 464\nAscender 737\nDescender -205\nStartCharMetrics 228\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 296 ; N exclam ; B 86 -15 210 737 ;\nC 34 ; WX 389 ; N quotedbl ; B 61 443 328 737 ;\nC 35 ; WX 556 ; N numbersign ; B 28 0 528 690 ;\nC 36 ; WX 556 ; N dollar ; B 45 -138 511 813 ;\nC 37 ; WX 833 ; N percent ; B 43 -15 790 705 ;\nC 38 ; WX 815 ; N ampersand ; B 51 -15 775 737 ;\nC 39 ; WX 204 ; N quoteright ; B 25 443 179 737 ;\nC 40 ; WX 333 ; N parenleft ; B 40 -117 279 745 ;\nC 41 ; WX 333 ; N parenright ; B 54 -117 293 745 ;\nC 42 ; WX 500 ; N asterisk ; B 57 306 443 737 ;\nC 43 ; WX 606 ; N plus ; B 50 0 556 506 ;\nC 44 ; WX 278 ; N comma ; B 62 -185 216 109 ;\nC 45 ; WX 333 ; N hyphen ; B 42 199 291 277 ;\nC 46 ; WX 278 ; N period ; B 77 -15 201 109 ;\nC 47 ; WX 278 ; N slash ; B -32 -15 310 737 ;\nC 48 ; WX 556 ; N zero ; B 42 -15 514 705 ;\nC 49 ; WX 556 ; N one ; B 100 0 496 705 ;\nC 50 ; WX 556 ; N two ; B 35 0 505 705 ;\nC 51 ; WX 556 ; N three ; B 42 -15 498 705 ;\nC 52 ; WX 556 ; N four ; B 28 0 528 705 ;\nC 53 ; WX 556 ; N five ; B 46 -15 502 705 ;\nC 54 ; WX 556 ; N six ; B 41 -15 515 705 ;\nC 55 ; WX 556 ; N seven ; B 59 -15 508 705 ;\nC 56 ; WX 556 ; N eight ; B 42 -15 514 705 ;\nC 57 ; WX 556 ; N nine ; B 41 -15 515 705 ;\nC 58 ; WX 278 ; N colon ; B 77 -15 201 474 ;\nC 59 ; WX 278 ; N semicolon ; B 62 -185 216 474 ;\nC 60 ; WX 606 ; N less ; B 50 -8 556 514 ;\nC 61 ; WX 606 ; N equal ; B 50 117 556 389 ;\nC 62 ; WX 606 ; N greater ; B 50 -8 556 514 ;\nC 63 ; WX 444 ; N question ; B 29 -15 415 737 ;\nC 64 ; WX 737 ; N at ; B -8 -15 744 737 ;\nC 65 ; WX 722 ; N A ; B -8 0 730 737 ;\nC 66 ; WX 722 ; N B ; B 29 0 669 722 ;\nC 67 ; WX 722 ; N C ; B 45 -15 668 737 ;\nC 68 ; WX 778 ; N D ; B 29 0 733 722 ;\nC 69 ; WX 722 ; N E ; B 29 0 663 722 ;\nC 70 ; WX 667 ; N F ; B 29 0 638 722 ;\nC 71 ; WX 778 ; N G ; B 45 -15 775 737 ;\nC 72 ; WX 833 ; N H ; B 29 0 804 722 ;\nC 73 ; WX 407 ; N I ; B 38 0 369 722 ;\nC 74 ; WX 556 ; N J ; B 5 -15 540 722 ;\nC 75 ; WX 778 ; N K ; B 29 0 803 722 ;\nC 76 ; WX 667 ; N L ; B 29 0 644 722 ;\nC 77 ; WX 944 ; N M ; B 29 0 915 722 ;\nC 78 ; WX 815 ; N N ; B 24 -15 791 722 ;\nC 79 ; WX 778 ; N O ; B 45 -15 733 737 ;\nC 80 ; WX 667 ; N P ; B 29 0 650 722 ;\nC 81 ; WX 778 ; N Q ; B 45 -190 748 737 ;\nC 82 ; WX 722 ; N R ; B 29 -15 713 722 ;\nC 83 ; WX 630 ; N S ; B 47 -15 583 737 ;\nC 84 ; WX 667 ; N T ; B 19 0 648 722 ;\nC 85 ; WX 815 ; N U ; B 16 -15 799 722 ;\nC 86 ; WX 722 ; N V ; B -8 -10 730 722 ;\nC 87 ; WX 981 ; N W ; B 5 -10 976 722 ;\nC 88 ; WX 704 ; N X ; B -8 0 712 722 ;\nC 89 ; WX 704 ; N Y ; B -11 0 715 722 ;\nC 90 ; WX 611 ; N Z ; B 24 0 576 722 ;\nC 91 ; WX 333 ; N bracketleft ; B 126 -109 315 737 ;\nC 92 ; WX 606 ; N backslash ; B 132 -15 474 737 ;\nC 93 ; WX 333 ; N bracketright ; B 18 -109 207 737 ;\nC 94 ; WX 606 ; N asciicircum ; B 89 325 517 690 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 204 ; N quoteleft ; B 25 443 179 737 ;\nC 97 ; WX 556 ; N a ; B 44 -15 542 479 ;\nC 98 ; WX 556 ; N b ; B 10 -15 522 737 ;\nC 99 ; WX 444 ; N c ; B 34 -15 426 479 ;\nC 100 ; WX 574 ; N d ; B 34 -15 552 737 ;\nC 101 ; WX 500 ; N e ; B 34 -15 466 479 ;\nC 102 ; WX 333 ; N f ; B 18 0 437 737 ; L i fi ; L l fl ;\nC 103 ; WX 537 ; N g ; B 23 -205 542 494 ;\nC 104 ; WX 611 ; N h ; B 7 0 592 737 ;\nC 105 ; WX 315 ; N i ; B 18 0 286 722 ;\nC 106 ; WX 296 ; N j ; B -86 -205 216 722 ;\nC 107 ; WX 593 ; N k ; B 10 0 589 737 ;\nC 108 ; WX 315 ; N l ; B 18 0 286 737 ;\nC 109 ; WX 889 ; N m ; B 26 0 863 479 ;\nC 110 ; WX 611 ; N n ; B 22 0 589 479 ;\nC 111 ; WX 500 ; N o ; B 34 -15 466 479 ;\nC 112 ; WX 574 ; N p ; B 22 -205 540 479 ;\nC 113 ; WX 556 ; N q ; B 34 -205 552 479 ;\nC 114 ; WX 444 ; N r ; B 18 0 434 479 ;\nC 115 ; WX 463 ; N s ; B 46 -15 417 479 ;\nC 116 ; WX 389 ; N t ; B 18 -15 371 666 ;\nC 117 ; WX 611 ; N u ; B 22 -15 589 464 ;\nC 118 ; WX 537 ; N v ; B -6 -10 515 464 ;\nC 119 ; WX 778 ; N w ; B 1 -10 749 464 ;\nC 120 ; WX 537 ; N x ; B 8 0 529 464 ;\nC 121 ; WX 537 ; N y ; B 4 -205 533 464 ;\nC 122 ; WX 481 ; N z ; B 42 0 439 464 ;\nC 123 ; WX 333 ; N braceleft ; B 54 -109 279 737 ;\nC 124 ; WX 606 ; N bar ; B 267 -250 339 750 ;\nC 125 ; WX 333 ; N braceright ; B 54 -109 279 737 ;\nC 126 ; WX 606 ; N asciitilde ; B 72 184 534 322 ;\nC 161 ; WX 296 ; N exclamdown ; B 86 -205 210 547 ;\nC 162 ; WX 556 ; N cent ; B 74 -141 482 584 ;\nC 163 ; WX 556 ; N sterling ; B 18 -15 538 705 ;\nC 164 ; WX 167 ; N fraction ; B -195 -15 362 705 ;\nC 165 ; WX 556 ; N yen ; B -1 0 557 690 ;\nC 166 ; WX 556 ; N florin ; B 0 -205 538 737 ;\nC 167 ; WX 500 ; N section ; B 55 -147 445 737 ;\nC 168 ; WX 556 ; N currency ; B 26 93 530 597 ;\nC 169 ; WX 204 ; N quotesingle ; B 59 443 145 737 ;\nC 170 ; WX 389 ; N quotedblleft ; B 25 443 364 737 ;\nC 171 ; WX 426 ; N guillemotleft ; B 39 78 387 398 ;\nC 172 ; WX 259 ; N guilsinglleft ; B 39 78 220 398 ;\nC 173 ; WX 259 ; N guilsinglright ; B 39 78 220 398 ;\nC 174 ; WX 611 ; N fi ; B 18 0 582 737 ;\nC 175 ; WX 611 ; N fl ; B 18 0 582 737 ;\nC 177 ; WX 556 ; N endash ; B 0 208 556 268 ;\nC 178 ; WX 500 ; N dagger ; B 42 -147 458 737 ;\nC 179 ; WX 500 ; N daggerdbl ; B 42 -149 458 737 ;\nC 180 ; WX 278 ; N periodcentered ; B 71 238 207 374 ;\nC 182 ; WX 606 ; N paragraph ; B 60 -132 546 722 ;\nC 183 ; WX 606 ; N bullet ; B 122 180 484 542 ;\nC 184 ; WX 204 ; N quotesinglbase ; B 25 -185 179 109 ;\nC 185 ; WX 389 ; N quotedblbase ; B 25 -185 364 109 ;\nC 186 ; WX 389 ; N quotedblright ; B 25 443 364 737 ;\nC 187 ; WX 426 ; N guillemotright ; B 39 78 387 398 ;\nC 188 ; WX 1000 ; N ellipsis ; B 105 -15 895 109 ;\nC 189 ; WX 1000 ; N perthousand ; B 6 -15 994 705 ;\nC 191 ; WX 444 ; N questiondown ; B 29 -205 415 547 ;\nC 193 ; WX 333 ; N grave ; B 17 528 242 699 ;\nC 194 ; WX 333 ; N acute ; B 91 528 316 699 ;\nC 195 ; WX 333 ; N circumflex ; B 10 528 323 695 ;\nC 196 ; WX 333 ; N tilde ; B 1 553 332 655 ;\nC 197 ; WX 333 ; N macron ; B 10 568 323 623 ;\nC 198 ; WX 333 ; N breve ; B 25 528 308 685 ;\nC 199 ; WX 333 ; N dotaccent ; B 116 543 218 645 ;\nC 200 ; WX 333 ; N dieresis ; B 16 543 317 645 ;\nC 202 ; WX 333 ; N ring ; B 66 522 266 722 ;\nC 203 ; WX 333 ; N cedilla ; B 29 -215 237 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -9 528 416 699 ;\nC 206 ; WX 333 ; N ogonek ; B 68 -215 254 0 ;\nC 207 ; WX 333 ; N caron ; B 10 528 323 695 ;\nC 208 ; WX 1000 ; N emdash ; B 0 208 1000 268 ;\nC 225 ; WX 1000 ; N AE ; B 0 0 962 722 ;\nC 227 ; WX 334 ; N ordfeminine ; B -4 407 338 705 ;\nC 232 ; WX 667 ; N Lslash ; B 29 0 644 722 ;\nC 233 ; WX 778 ; N Oslash ; B 45 -56 733 778 ;\nC 234 ; WX 1000 ; N OE ; B 21 0 979 722 ;\nC 235 ; WX 300 ; N ordmasculine ; B 4 407 296 705 ;\nC 241 ; WX 796 ; N ae ; B 34 -15 762 479 ;\nC 245 ; WX 315 ; N dotlessi ; B 18 0 286 464 ;\nC 248 ; WX 315 ; N lslash ; B 18 0 286 737 ;\nC 249 ; WX 500 ; N oslash ; B 34 -97 466 561 ;\nC 250 ; WX 833 ; N oe ; B 34 -15 799 479 ;\nC 251 ; WX 574 ; N germandbls ; B 30 -15 537 737 ;\nC -1 ; WX 500 ; N ecircumflex ; B 34 -15 466 695 ;\nC -1 ; WX 500 ; N edieresis ; B 34 -15 466 645 ;\nC -1 ; WX 556 ; N aacute ; B 44 -15 542 699 ;\nC -1 ; WX 737 ; N registered ; B -8 -15 744 737 ;\nC -1 ; WX 315 ; N icircumflex ; B 1 0 314 695 ;\nC -1 ; WX 611 ; N udieresis ; B 22 -15 589 645 ;\nC -1 ; WX 500 ; N ograve ; B 34 -15 466 699 ;\nC -1 ; WX 611 ; N uacute ; B 22 -15 589 699 ;\nC -1 ; WX 611 ; N ucircumflex ; B 22 -15 589 695 ;\nC -1 ; WX 722 ; N Aacute ; B -8 0 730 937 ;\nC -1 ; WX 315 ; N igrave ; B 8 0 286 699 ;\nC -1 ; WX 407 ; N Icircumflex ; B 38 0 369 933 ;\nC -1 ; WX 444 ; N ccedilla ; B 34 -215 426 479 ;\nC -1 ; WX 556 ; N adieresis ; B 44 -15 542 645 ;\nC -1 ; WX 722 ; N Ecircumflex ; B 29 0 663 933 ;\nC -1 ; WX 463 ; N scaron ; B 46 -15 417 695 ;\nC -1 ; WX 574 ; N thorn ; B 22 -205 540 737 ;\nC -1 ; WX 1000 ; N trademark ; B 32 318 968 722 ;\nC -1 ; WX 500 ; N egrave ; B 34 -15 466 699 ;\nC -1 ; WX 333 ; N threesuperior ; B 18 273 315 705 ;\nC -1 ; WX 481 ; N zcaron ; B 42 0 439 695 ;\nC -1 ; WX 556 ; N atilde ; B 44 -15 542 655 ;\nC -1 ; WX 556 ; N aring ; B 44 -15 542 732 ;\nC -1 ; WX 500 ; N ocircumflex ; B 34 -15 466 695 ;\nC -1 ; WX 722 ; N Edieresis ; B 29 0 663 883 ;\nC -1 ; WX 834 ; N threequarters ; B 28 -15 795 705 ;\nC -1 ; WX 537 ; N ydieresis ; B 4 -205 533 645 ;\nC -1 ; WX 537 ; N yacute ; B 4 -205 533 699 ;\nC -1 ; WX 315 ; N iacute ; B 18 0 307 699 ;\nC -1 ; WX 722 ; N Acircumflex ; B -8 0 730 933 ;\nC -1 ; WX 815 ; N Uacute ; B 16 -15 799 937 ;\nC -1 ; WX 500 ; N eacute ; B 34 -15 466 699 ;\nC -1 ; WX 778 ; N Ograve ; B 45 -15 733 937 ;\nC -1 ; WX 556 ; N agrave ; B 44 -15 542 699 ;\nC -1 ; WX 815 ; N Udieresis ; B 16 -15 799 883 ;\nC -1 ; WX 556 ; N acircumflex ; B 44 -15 542 695 ;\nC -1 ; WX 407 ; N Igrave ; B 38 0 369 937 ;\nC -1 ; WX 333 ; N twosuperior ; B 14 282 319 705 ;\nC -1 ; WX 815 ; N Ugrave ; B 16 -15 799 937 ;\nC -1 ; WX 834 ; N onequarter ; B 39 -15 795 705 ;\nC -1 ; WX 815 ; N Ucircumflex ; B 16 -15 799 933 ;\nC -1 ; WX 630 ; N Scaron ; B 47 -15 583 933 ;\nC -1 ; WX 407 ; N Idieresis ; B 38 0 369 883 ;\nC -1 ; WX 315 ; N idieresis ; B 7 0 308 645 ;\nC -1 ; WX 722 ; N Egrave ; B 29 0 663 937 ;\nC -1 ; WX 778 ; N Oacute ; B 45 -15 733 937 ;\nC -1 ; WX 606 ; N divide ; B 50 -22 556 528 ;\nC -1 ; WX 722 ; N Atilde ; B -8 0 730 893 ;\nC -1 ; WX 722 ; N Aring ; B -8 0 730 965 ;\nC -1 ; WX 778 ; N Odieresis ; B 45 -15 733 883 ;\nC -1 ; WX 722 ; N Adieresis ; B -8 0 730 883 ;\nC -1 ; WX 815 ; N Ntilde ; B 24 -15 791 893 ;\nC -1 ; WX 611 ; N Zcaron ; B 24 0 576 933 ;\nC -1 ; WX 667 ; N Thorn ; B 29 0 650 722 ;\nC -1 ; WX 407 ; N Iacute ; B 38 0 369 937 ;\nC -1 ; WX 606 ; N plusminus ; B 50 0 556 506 ;\nC -1 ; WX 606 ; N multiply ; B 74 24 532 482 ;\nC -1 ; WX 722 ; N Eacute ; B 29 0 663 937 ;\nC -1 ; WX 704 ; N Ydieresis ; B -11 0 715 883 ;\nC -1 ; WX 333 ; N onesuperior ; B 39 282 294 705 ;\nC -1 ; WX 611 ; N ugrave ; B 22 -15 589 699 ;\nC -1 ; WX 606 ; N logicalnot ; B 50 108 556 389 ;\nC -1 ; WX 611 ; N ntilde ; B 22 0 589 655 ;\nC -1 ; WX 778 ; N Otilde ; B 45 -15 733 893 ;\nC -1 ; WX 500 ; N otilde ; B 34 -15 466 655 ;\nC -1 ; WX 722 ; N Ccedilla ; B 45 -215 668 737 ;\nC -1 ; WX 722 ; N Agrave ; B -8 0 730 937 ;\nC -1 ; WX 834 ; N onehalf ; B 39 -15 820 705 ;\nC -1 ; WX 778 ; N Eth ; B 29 0 733 722 ;\nC -1 ; WX 400 ; N degree ; B 57 419 343 705 ;\nC -1 ; WX 704 ; N Yacute ; B -11 0 715 937 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 45 -15 733 933 ;\nC -1 ; WX 500 ; N oacute ; B 34 -15 466 699 ;\nC -1 ; WX 611 ; N mu ; B 22 -205 589 464 ;\nC -1 ; WX 606 ; N minus ; B 50 217 556 289 ;\nC -1 ; WX 500 ; N eth ; B 34 -15 466 752 ;\nC -1 ; WX 500 ; N odieresis ; B 34 -15 466 645 ;\nC -1 ; WX 737 ; N copyright ; B -8 -15 744 737 ;\nC -1 ; WX 606 ; N brokenbar ; B 267 -175 339 675 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 169\n\nKPX A y -37\nKPX A w -25\nKPX A v -37\nKPX A quoteright -74\nKPX A quotedblright -74\nKPX A Y -75\nKPX A W -50\nKPX A V -75\nKPX A U -30\nKPX A T -18\n\nKPX B period -37\nKPX B comma -37\nKPX B A -18\n\nKPX C period -37\nKPX C comma -37\nKPX C A -18\n\nKPX D period -37\nKPX D comma -37\nKPX D Y -18\nKPX D V -18\n\nKPX F r -10\nKPX F period -125\nKPX F o -55\nKPX F i -10\nKPX F e -55\nKPX F comma -125\nKPX F a -65\nKPX F A -50\n\nKPX G period -37\nKPX G comma -37\n\nKPX J u -25\nKPX J period -74\nKPX J o -25\nKPX J e -25\nKPX J comma -74\nKPX J a -25\nKPX J A -18\n\nKPX K y -25\nKPX K o 10\nKPX K e 10\n\nKPX L y -25\nKPX L quoteright -100\nKPX L quotedblright -100\nKPX L Y -74\nKPX L W -74\nKPX L V -91\nKPX L T -75\n\nKPX N period -55\nKPX N comma -55\n\nKPX O period -37\nKPX O comma -37\nKPX O Y -18\nKPX O V -18\nKPX O T 10\n\nKPX P period -125\nKPX P o -37\nKPX P e -37\nKPX P comma -125\nKPX P a -37\nKPX P A -55\n\nKPX Q period -25\nKPX Q comma -25\n\nKPX S period -37\nKPX S comma -37\n\nKPX T semicolon -37\nKPX T period -125\nKPX T o -55\nKPX T hyphen -100\nKPX T e -55\nKPX T comma -125\nKPX T colon -37\nKPX T a -55\nKPX T O 10\nKPX T A -18\n\nKPX U period -100\nKPX U comma -100\nKPX U A -30\n\nKPX V u -75\nKPX V semicolon -75\nKPX V period -125\nKPX V o -75\nKPX V i -18\nKPX V hyphen -100\nKPX V e -75\nKPX V comma -125\nKPX V colon -75\nKPX V a -85\nKPX V O -18\nKPX V A -74\n\nKPX W y -55\nKPX W u -55\nKPX W semicolon -100\nKPX W period -125\nKPX W o -60\nKPX W i -18\nKPX W hyphen -100\nKPX W e -60\nKPX W comma -125\nKPX W colon -100\nKPX W a -75\nKPX W A -50\n\nKPX Y u -91\nKPX Y semicolon -75\nKPX Y period -100\nKPX Y o -100\nKPX Y i -18\nKPX Y hyphen -125\nKPX Y e -100\nKPX Y comma -100\nKPX Y colon -75\nKPX Y a -100\nKPX Y O -18\nKPX Y A -75\n\nKPX a y -10\nKPX a w -10\nKPX a v -10\n\nKPX b period -18\nKPX b comma -18\n\nKPX c period -18\nKPX c l -7\nKPX c k -7\nKPX c h -7\nKPX c comma -18\n\nKPX colon space -37\n\nKPX comma space -37\nKPX comma quoteright -37\nKPX comma quotedblright -37\n\nKPX e period -18\nKPX e comma -18\n\nKPX f quoteright 100\nKPX f quotedblright 100\nKPX f period -37\nKPX f comma -37\n\nKPX g period -25\nKPX g comma -25\n\nKPX o period -18\nKPX o comma -18\n\nKPX p period -18\nKPX p comma -18\n\nKPX period space -37\nKPX period quoteright -37\nKPX period quotedblright -37\n\nKPX quotedblleft A -74\n\nKPX quotedblright space -37\n\nKPX quoteleft quoteleft -25\nKPX quoteleft A -74\n\nKPX quoteright s -25\nKPX quoteright quoteright -25\nKPX quoteright d -37\n\nKPX r period -100\nKPX r hyphen -37\nKPX r comma -100\n\nKPX s period -25\nKPX s comma -25\n\nKPX semicolon space -37\n\nKPX space quoteleft -37\nKPX space quotedblleft -37\nKPX space Y -37\nKPX space W -37\nKPX space V -37\nKPX space T -37\nKPX space A -37\n\nKPX v period -125\nKPX v comma -125\n\nKPX w period -125\nKPX w comma -125\nKPX w a -18\n\nKPX y period -125\nKPX y comma -125\nEndKernPairs\nEndKernData\nStartComposites 56\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 195 238 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 195 238 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 195 238 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 195 238 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 195 243 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 195 238 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 195 238 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 195 238 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 195 238 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 195 238 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 37 238 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 37 238 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 37 238 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 37 238 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 241 238 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 223 238 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 223 238 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 223 238 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 223 238 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 223 238 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 149 238 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 241 238 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 241 238 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 241 238 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 241 238 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 216 238 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 186 238 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 139 238 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 112 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 112 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 112 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 112 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 112 10 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 112 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 84 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 84 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 84 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 84 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -9 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -9 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -9 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -9 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 139 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 84 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 84 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 84 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 84 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 84 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 65 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 139 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 139 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 139 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 139 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 102 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 102 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 74 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pncri8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1991 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Tue May 28 16:40:04 1991\nComment UniqueID 35028\nComment VMusage 31423 38315\nFontName NewCenturySchlbk-Italic\nFullName New Century Schoolbook Italic\nFamilyName New Century Schoolbook\nWeight Medium\nItalicAngle -16\nIsFixedPitch false\nFontBBox -166 -250 994 958\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.006\nNotice Copyright (c) 1985, 1987, 1989, 1991 Adobe Systems Incorporated.  All Rights Reserved.\nEncodingScheme AdobeStandardEncoding\nCapHeight 722\nXHeight 466\nAscender 737\nDescender -205\nStartCharMetrics 228\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 17 -15 303 737 ;\nC 34 ; WX 400 ; N quotedbl ; B 127 463 363 737 ;\nC 35 ; WX 556 ; N numbersign ; B 28 0 528 690 ;\nC 36 ; WX 556 ; N dollar ; B 4 -142 536 808 ;\nC 37 ; WX 833 ; N percent ; B 43 -15 790 705 ;\nC 38 ; WX 852 ; N ampersand ; B 24 -15 773 737 ;\nC 39 ; WX 204 ; N quoteright ; B 39 463 229 737 ;\nC 40 ; WX 333 ; N parenleft ; B 53 -117 411 745 ;\nC 41 ; WX 333 ; N parenright ; B -93 -117 265 745 ;\nC 42 ; WX 500 ; N asterisk ; B 80 318 500 737 ;\nC 43 ; WX 606 ; N plus ; B 50 0 556 506 ;\nC 44 ; WX 278 ; N comma ; B -39 -165 151 109 ;\nC 45 ; WX 333 ; N hyphen ; B 32 202 259 274 ;\nC 46 ; WX 278 ; N period ; B 17 -15 141 109 ;\nC 47 ; WX 606 ; N slash ; B 132 -15 474 737 ;\nC 48 ; WX 556 ; N zero ; B 30 -15 526 705 ;\nC 49 ; WX 556 ; N one ; B 50 0 459 705 ;\nC 50 ; WX 556 ; N two ; B -37 0 506 705 ;\nC 51 ; WX 556 ; N three ; B -2 -15 506 705 ;\nC 52 ; WX 556 ; N four ; B -8 0 512 705 ;\nC 53 ; WX 556 ; N five ; B 4 -15 540 705 ;\nC 54 ; WX 556 ; N six ; B 36 -15 548 705 ;\nC 55 ; WX 556 ; N seven ; B 69 -15 561 705 ;\nC 56 ; WX 556 ; N eight ; B 6 -15 526 705 ;\nC 57 ; WX 556 ; N nine ; B 8 -15 520 705 ;\nC 58 ; WX 278 ; N colon ; B 17 -15 229 466 ;\nC 59 ; WX 278 ; N semicolon ; B -39 -165 229 466 ;\nC 60 ; WX 606 ; N less ; B 36 -8 542 514 ;\nC 61 ; WX 606 ; N equal ; B 50 117 556 389 ;\nC 62 ; WX 606 ; N greater ; B 64 -8 570 514 ;\nC 63 ; WX 444 ; N question ; B 102 -15 417 737 ;\nC 64 ; WX 747 ; N at ; B -2 -15 750 737 ;\nC 65 ; WX 704 ; N A ; B -87 0 668 737 ;\nC 66 ; WX 722 ; N B ; B -33 0 670 722 ;\nC 67 ; WX 722 ; N C ; B 40 -15 712 737 ;\nC 68 ; WX 778 ; N D ; B -33 0 738 722 ;\nC 69 ; WX 722 ; N E ; B -33 0 700 722 ;\nC 70 ; WX 667 ; N F ; B -33 0 700 722 ;\nC 71 ; WX 778 ; N G ; B 40 -15 763 737 ;\nC 72 ; WX 833 ; N H ; B -33 0 866 722 ;\nC 73 ; WX 407 ; N I ; B -33 0 435 722 ;\nC 74 ; WX 611 ; N J ; B -14 -15 651 722 ;\nC 75 ; WX 741 ; N K ; B -33 0 816 722 ;\nC 76 ; WX 667 ; N L ; B -33 0 627 722 ;\nC 77 ; WX 944 ; N M ; B -33 0 977 722 ;\nC 78 ; WX 815 ; N N ; B -51 -15 866 722 ;\nC 79 ; WX 778 ; N O ; B 40 -15 738 737 ;\nC 80 ; WX 667 ; N P ; B -33 0 667 722 ;\nC 81 ; WX 778 ; N Q ; B 40 -190 738 737 ;\nC 82 ; WX 741 ; N R ; B -45 -15 692 722 ;\nC 83 ; WX 667 ; N S ; B -6 -15 638 737 ;\nC 84 ; WX 685 ; N T ; B 40 0 725 722 ;\nC 85 ; WX 815 ; N U ; B 93 -15 867 722 ;\nC 86 ; WX 704 ; N V ; B 36 -10 779 722 ;\nC 87 ; WX 926 ; N W ; B 53 -10 978 722 ;\nC 88 ; WX 704 ; N X ; B -75 0 779 722 ;\nC 89 ; WX 685 ; N Y ; B 31 0 760 722 ;\nC 90 ; WX 667 ; N Z ; B -25 0 667 722 ;\nC 91 ; WX 333 ; N bracketleft ; B -55 -109 388 737 ;\nC 92 ; WX 606 ; N backslash ; B 132 -15 474 737 ;\nC 93 ; WX 333 ; N bracketright ; B -77 -109 366 737 ;\nC 94 ; WX 606 ; N asciicircum ; B 89 325 517 690 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 204 ; N quoteleft ; B 39 463 229 737 ;\nC 97 ; WX 574 ; N a ; B 2 -15 524 466 ;\nC 98 ; WX 556 ; N b ; B 32 -15 488 737 ;\nC 99 ; WX 444 ; N c ; B 2 -15 394 466 ;\nC 100 ; WX 611 ; N d ; B 2 -15 585 737 ;\nC 101 ; WX 444 ; N e ; B -6 -15 388 466 ;\nC 102 ; WX 333 ; N f ; B -68 -205 470 737 ; L i fi ; L l fl ;\nC 103 ; WX 537 ; N g ; B -79 -205 523 497 ;\nC 104 ; WX 611 ; N h ; B 14 -15 562 737 ;\nC 105 ; WX 333 ; N i ; B 29 -15 282 715 ;\nC 106 ; WX 315 ; N j ; B -166 -205 318 715 ;\nC 107 ; WX 556 ; N k ; B 0 -15 497 737 ;\nC 108 ; WX 333 ; N l ; B 14 -15 292 737 ;\nC 109 ; WX 889 ; N m ; B 14 -15 840 466 ;\nC 110 ; WX 611 ; N n ; B 14 -15 562 466 ;\nC 111 ; WX 500 ; N o ; B 2 -15 450 466 ;\nC 112 ; WX 574 ; N p ; B -101 -205 506 466 ;\nC 113 ; WX 556 ; N q ; B 2 -205 500 466 ;\nC 114 ; WX 444 ; N r ; B 10 0 434 466 ;\nC 115 ; WX 444 ; N s ; B 2 -15 394 466 ;\nC 116 ; WX 352 ; N t ; B 24 -15 328 619 ;\nC 117 ; WX 611 ; N u ; B 44 -15 556 466 ;\nC 118 ; WX 519 ; N v ; B 31 -15 447 466 ;\nC 119 ; WX 778 ; N w ; B 31 -15 706 466 ;\nC 120 ; WX 500 ; N x ; B -33 -15 471 466 ;\nC 121 ; WX 500 ; N y ; B -83 -205 450 466 ;\nC 122 ; WX 463 ; N z ; B -33 -15 416 466 ;\nC 123 ; WX 333 ; N braceleft ; B 38 -109 394 737 ;\nC 124 ; WX 606 ; N bar ; B 267 -250 339 750 ;\nC 125 ; WX 333 ; N braceright ; B -87 -109 269 737 ;\nC 126 ; WX 606 ; N asciitilde ; B 72 184 534 322 ;\nC 161 ; WX 333 ; N exclamdown ; B -22 -205 264 547 ;\nC 162 ; WX 556 ; N cent ; B 62 -144 486 580 ;\nC 163 ; WX 556 ; N sterling ; B -13 -15 544 705 ;\nC 164 ; WX 167 ; N fraction ; B -134 -15 301 705 ;\nC 165 ; WX 556 ; N yen ; B 40 0 624 690 ;\nC 166 ; WX 556 ; N florin ; B -58 -205 569 737 ;\nC 167 ; WX 500 ; N section ; B -10 -147 480 737 ;\nC 168 ; WX 556 ; N currency ; B 26 93 530 597 ;\nC 169 ; WX 278 ; N quotesingle ; B 151 463 237 737 ;\nC 170 ; WX 389 ; N quotedblleft ; B 39 463 406 737 ;\nC 171 ; WX 426 ; N guillemotleft ; B -15 74 402 402 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 40 74 259 402 ;\nC 173 ; WX 333 ; N guilsinglright ; B 40 74 259 402 ;\nC 174 ; WX 611 ; N fi ; B -68 -205 555 737 ;\nC 175 ; WX 611 ; N fl ; B -68 -205 587 737 ;\nC 177 ; WX 500 ; N endash ; B -27 208 487 268 ;\nC 178 ; WX 500 ; N dagger ; B 51 -147 506 737 ;\nC 179 ; WX 500 ; N daggerdbl ; B -54 -147 506 737 ;\nC 180 ; WX 278 ; N periodcentered ; B 71 238 207 374 ;\nC 182 ; WX 650 ; N paragraph ; B 48 -132 665 722 ;\nC 183 ; WX 606 ; N bullet ; B 122 180 484 542 ;\nC 184 ; WX 204 ; N quotesinglbase ; B -78 -165 112 109 ;\nC 185 ; WX 389 ; N quotedblbase ; B -78 -165 289 109 ;\nC 186 ; WX 389 ; N quotedblright ; B 39 463 406 737 ;\nC 187 ; WX 426 ; N guillemotright ; B -15 74 402 402 ;\nC 188 ; WX 1000 ; N ellipsis ; B 59 -15 849 109 ;\nC 189 ; WX 1000 ; N perthousand ; B 6 -15 994 705 ;\nC 191 ; WX 444 ; N questiondown ; B -3 -205 312 547 ;\nC 193 ; WX 333 ; N grave ; B 71 518 262 690 ;\nC 194 ; WX 333 ; N acute ; B 132 518 355 690 ;\nC 195 ; WX 333 ; N circumflex ; B 37 518 331 690 ;\nC 196 ; WX 333 ; N tilde ; B 52 547 383 649 ;\nC 197 ; WX 333 ; N macron ; B 52 560 363 610 ;\nC 198 ; WX 333 ; N breve ; B 69 518 370 677 ;\nC 199 ; WX 333 ; N dotaccent ; B 146 544 248 646 ;\nC 200 ; WX 333 ; N dieresis ; B 59 544 359 646 ;\nC 202 ; WX 333 ; N ring ; B 114 512 314 712 ;\nC 203 ; WX 333 ; N cedilla ; B 3 -215 215 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 32 518 455 690 ;\nC 206 ; WX 333 ; N ogonek ; B 68 -215 254 0 ;\nC 207 ; WX 333 ; N caron ; B 73 518 378 690 ;\nC 208 ; WX 1000 ; N emdash ; B -27 208 987 268 ;\nC 225 ; WX 870 ; N AE ; B -87 0 888 722 ;\nC 227 ; WX 422 ; N ordfeminine ; B 72 416 420 705 ;\nC 232 ; WX 667 ; N Lslash ; B -33 0 627 722 ;\nC 233 ; WX 778 ; N Oslash ; B 16 -68 748 780 ;\nC 234 ; WX 981 ; N OE ; B 40 0 975 722 ;\nC 235 ; WX 372 ; N ordmasculine ; B 66 416 370 705 ;\nC 241 ; WX 722 ; N ae ; B -18 -15 666 466 ;\nC 245 ; WX 333 ; N dotlessi ; B 29 -15 282 466 ;\nC 248 ; WX 333 ; N lslash ; B -25 -15 340 737 ;\nC 249 ; WX 500 ; N oslash ; B 2 -121 450 549 ;\nC 250 ; WX 778 ; N oe ; B 2 -15 722 466 ;\nC 251 ; WX 556 ; N germandbls ; B -76 -205 525 737 ;\nC -1 ; WX 444 ; N ecircumflex ; B -6 -15 388 690 ;\nC -1 ; WX 444 ; N edieresis ; B -6 -15 415 646 ;\nC -1 ; WX 574 ; N aacute ; B 2 -15 524 690 ;\nC -1 ; WX 747 ; N registered ; B -2 -15 750 737 ;\nC -1 ; WX 333 ; N icircumflex ; B 29 -15 331 690 ;\nC -1 ; WX 611 ; N udieresis ; B 44 -15 556 646 ;\nC -1 ; WX 500 ; N ograve ; B 2 -15 450 690 ;\nC -1 ; WX 611 ; N uacute ; B 44 -15 556 690 ;\nC -1 ; WX 611 ; N ucircumflex ; B 44 -15 556 690 ;\nC -1 ; WX 704 ; N Aacute ; B -87 0 668 946 ;\nC -1 ; WX 333 ; N igrave ; B 29 -15 282 690 ;\nC -1 ; WX 407 ; N Icircumflex ; B -33 0 435 946 ;\nC -1 ; WX 444 ; N ccedilla ; B 2 -215 394 466 ;\nC -1 ; WX 574 ; N adieresis ; B 2 -15 524 646 ;\nC -1 ; WX 722 ; N Ecircumflex ; B -33 0 700 946 ;\nC -1 ; WX 444 ; N scaron ; B 2 -15 434 690 ;\nC -1 ; WX 574 ; N thorn ; B -101 -205 506 737 ;\nC -1 ; WX 950 ; N trademark ; B 32 318 968 722 ;\nC -1 ; WX 444 ; N egrave ; B -6 -15 388 690 ;\nC -1 ; WX 333 ; N threesuperior ; B 22 273 359 705 ;\nC -1 ; WX 463 ; N zcaron ; B -33 -15 443 690 ;\nC -1 ; WX 574 ; N atilde ; B 2 -15 524 649 ;\nC -1 ; WX 574 ; N aring ; B 2 -15 524 712 ;\nC -1 ; WX 500 ; N ocircumflex ; B 2 -15 450 690 ;\nC -1 ; WX 722 ; N Edieresis ; B -33 0 700 902 ;\nC -1 ; WX 834 ; N threequarters ; B 22 -15 782 705 ;\nC -1 ; WX 500 ; N ydieresis ; B -83 -205 450 646 ;\nC -1 ; WX 500 ; N yacute ; B -83 -205 450 690 ;\nC -1 ; WX 333 ; N iacute ; B 29 -15 355 690 ;\nC -1 ; WX 704 ; N Acircumflex ; B -87 0 668 946 ;\nC -1 ; WX 815 ; N Uacute ; B 93 -15 867 946 ;\nC -1 ; WX 444 ; N eacute ; B -6 -15 411 690 ;\nC -1 ; WX 778 ; N Ograve ; B 40 -15 738 946 ;\nC -1 ; WX 574 ; N agrave ; B 2 -15 524 690 ;\nC -1 ; WX 815 ; N Udieresis ; B 93 -15 867 902 ;\nC -1 ; WX 574 ; N acircumflex ; B 2 -15 524 690 ;\nC -1 ; WX 407 ; N Igrave ; B -33 0 435 946 ;\nC -1 ; WX 333 ; N twosuperior ; B 0 282 359 705 ;\nC -1 ; WX 815 ; N Ugrave ; B 93 -15 867 946 ;\nC -1 ; WX 834 ; N onequarter ; B 34 -15 782 705 ;\nC -1 ; WX 815 ; N Ucircumflex ; B 93 -15 867 946 ;\nC -1 ; WX 667 ; N Scaron ; B -6 -15 638 946 ;\nC -1 ; WX 407 ; N Idieresis ; B -33 0 456 902 ;\nC -1 ; WX 333 ; N idieresis ; B 29 -15 359 646 ;\nC -1 ; WX 722 ; N Egrave ; B -33 0 700 946 ;\nC -1 ; WX 778 ; N Oacute ; B 40 -15 738 946 ;\nC -1 ; WX 606 ; N divide ; B 50 -22 556 528 ;\nC -1 ; WX 704 ; N Atilde ; B -87 0 668 905 ;\nC -1 ; WX 704 ; N Aring ; B -87 0 668 958 ;\nC -1 ; WX 778 ; N Odieresis ; B 40 -15 738 902 ;\nC -1 ; WX 704 ; N Adieresis ; B -87 0 668 902 ;\nC -1 ; WX 815 ; N Ntilde ; B -51 -15 866 905 ;\nC -1 ; WX 667 ; N Zcaron ; B -25 0 667 946 ;\nC -1 ; WX 667 ; N Thorn ; B -33 0 627 722 ;\nC -1 ; WX 407 ; N Iacute ; B -33 0 452 946 ;\nC -1 ; WX 606 ; N plusminus ; B 50 0 556 506 ;\nC -1 ; WX 606 ; N multiply ; B 74 24 532 482 ;\nC -1 ; WX 722 ; N Eacute ; B -33 0 700 946 ;\nC -1 ; WX 685 ; N Ydieresis ; B 31 0 760 902 ;\nC -1 ; WX 333 ; N onesuperior ; B 34 282 311 705 ;\nC -1 ; WX 611 ; N ugrave ; B 44 -15 556 690 ;\nC -1 ; WX 606 ; N logicalnot ; B 50 108 556 389 ;\nC -1 ; WX 611 ; N ntilde ; B 14 -15 562 649 ;\nC -1 ; WX 778 ; N Otilde ; B 40 -15 738 905 ;\nC -1 ; WX 500 ; N otilde ; B 2 -15 467 649 ;\nC -1 ; WX 722 ; N Ccedilla ; B 40 -215 712 737 ;\nC -1 ; WX 704 ; N Agrave ; B -87 0 668 946 ;\nC -1 ; WX 834 ; N onehalf ; B 34 -15 776 705 ;\nC -1 ; WX 778 ; N Eth ; B -33 0 738 722 ;\nC -1 ; WX 400 ; N degree ; B 86 419 372 705 ;\nC -1 ; WX 685 ; N Yacute ; B 31 0 760 946 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 40 -15 738 946 ;\nC -1 ; WX 500 ; N oacute ; B 2 -15 450 690 ;\nC -1 ; WX 611 ; N mu ; B -60 -205 556 466 ;\nC -1 ; WX 606 ; N minus ; B 50 217 556 289 ;\nC -1 ; WX 500 ; N eth ; B 2 -15 450 737 ;\nC -1 ; WX 500 ; N odieresis ; B 2 -15 450 646 ;\nC -1 ; WX 747 ; N copyright ; B -2 -15 750 737 ;\nC -1 ; WX 606 ; N brokenbar ; B 267 -175 339 675 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 181\n\nKPX A y -55\nKPX A w -18\nKPX A v -18\nKPX A u -18\nKPX A quoteright -125\nKPX A quotedblright -125\nKPX A Y -55\nKPX A W -74\nKPX A V -74\nKPX A U -37\nKPX A T -30\nKPX A Q -18\nKPX A O -18\nKPX A G -18\nKPX A C -18\n\nKPX B period -50\nKPX B comma -50\n\nKPX C period -50\nKPX C comma -50\n\nKPX D period -50\nKPX D comma -50\nKPX D Y -18\nKPX D W -18\nKPX D V -18\n\nKPX F r -55\nKPX F period -125\nKPX F o -55\nKPX F i -10\nKPX F e -55\nKPX F comma -125\nKPX F a -55\nKPX F A -35\n\nKPX G period -50\nKPX G comma -50\n\nKPX J u -18\nKPX J period -100\nKPX J o -37\nKPX J e -37\nKPX J comma -100\nKPX J a -37\nKPX J A -18\n\nKPX L y -50\nKPX L quoteright -125\nKPX L quotedblright -125\nKPX L Y -100\nKPX L W -100\nKPX L V -100\nKPX L T -100\n\nKPX N period -60\nKPX N comma -60\n\nKPX O period -50\nKPX O comma -50\nKPX O Y -18\nKPX O X -18\nKPX O V -18\nKPX O T 18\n\nKPX P period -125\nKPX P o -55\nKPX P e -55\nKPX P comma -125\nKPX P a -55\nKPX P A -50\n\nKPX Q period -20\nKPX Q comma -20\n\nKPX R Y -18\nKPX R W -18\nKPX R V -18\nKPX R U -18\n\nKPX S period -50\nKPX S comma -50\n\nKPX T y -50\nKPX T w -50\nKPX T u -50\nKPX T semicolon -50\nKPX T r -50\nKPX T period -100\nKPX T o -74\nKPX T i -18\nKPX T hyphen -100\nKPX T h -25\nKPX T e -74\nKPX T comma -100\nKPX T colon -50\nKPX T a -74\nKPX T O 18\n\nKPX U period -100\nKPX U comma -100\nKPX U A -18\n\nKPX V u -75\nKPX V semicolon -75\nKPX V period -100\nKPX V o -75\nKPX V i -50\nKPX V hyphen -100\nKPX V e -75\nKPX V comma -100\nKPX V colon -75\nKPX V a -75\nKPX V A -37\n\nKPX W y -55\nKPX W u -55\nKPX W semicolon -75\nKPX W period -100\nKPX W o -55\nKPX W i -20\nKPX W hyphen -75\nKPX W h -20\nKPX W e -55\nKPX W comma -100\nKPX W colon -75\nKPX W a -55\nKPX W A -55\n\nKPX Y u -100\nKPX Y semicolon -75\nKPX Y period -100\nKPX Y o -100\nKPX Y i -25\nKPX Y hyphen -100\nKPX Y e -100\nKPX Y comma -100\nKPX Y colon -75\nKPX Y a -100\nKPX Y A -55\n\nKPX b period -50\nKPX b comma -50\nKPX b b -10\n\nKPX c period -50\nKPX c k -18\nKPX c h -18\nKPX c comma -50\n\nKPX colon space -37\n\nKPX comma space -37\nKPX comma quoteright -37\nKPX comma quotedblright -37\n\nKPX e period -37\nKPX e comma -37\n\nKPX f quoteright 75\nKPX f quotedblright 75\nKPX f period -75\nKPX f o -10\nKPX f comma -75\n\nKPX g period -50\nKPX g comma -50\n\nKPX l y -10\n\nKPX o period -50\nKPX o comma -50\n\nKPX p period -50\nKPX p comma -50\n\nKPX period space -37\nKPX period quoteright -37\nKPX period quotedblright -37\n\nKPX quotedblleft A -75\n\nKPX quotedblright space -37\n\nKPX quoteleft quoteleft -37\nKPX quoteleft A -75\n\nKPX quoteright s -25\nKPX quoteright quoteright -37\nKPX quoteright d -37\n\nKPX r semicolon -25\nKPX r s -10\nKPX r period -125\nKPX r k -18\nKPX r hyphen -75\nKPX r comma -125\nKPX r colon -25\n\nKPX s period -50\nKPX s comma -50\n\nKPX semicolon space -37\n\nKPX space quoteleft -37\nKPX space quotedblleft -37\nKPX space Y -37\nKPX space W -37\nKPX space V -37\nKPX space T -37\nKPX space A -37\n\nKPX v period -75\nKPX v comma -75\n\nKPX w period -75\nKPX w comma -75\n\nKPX y period -75\nKPX y comma -75\nEndKernPairs\nEndKernData\nStartComposites 56\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 246 256 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 246 256 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 231 256 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 246 256 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 216 246 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 231 256 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 255 256 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 255 256 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 255 256 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 255 256 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 97 256 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 97 256 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 97 256 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 97 256 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 301 256 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 283 256 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 283 256 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 283 256 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 283 256 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 283 256 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 227 256 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 301 256 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 301 256 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 301 256 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 301 256 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 256 256 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 236 256 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 227 256 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 121 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 121 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 121 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 121 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 121 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 121 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 56 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 56 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 56 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 56 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 0 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex 0 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis 0 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave 0 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 139 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 84 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 84 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 84 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 84 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 84 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 56 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 139 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 139 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 139 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 139 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 84 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 84 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 65 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pplb8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Mon Jul  2 22:26:30 1990\nComment UniqueID 31793\nComment VMusage 36031 46923\nFontName Palatino-Bold\nFullName Palatino Bold\nFamilyName Palatino\nWeight Bold\nItalicAngle 0\nIsFixedPitch false\nFontBBox -152 -266 1000 924\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.005\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.Palatino is a trademark of Linotype AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 681\nXHeight 471\nAscender 720\nDescender -258\nStartCharMetrics 228\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 278 ; N exclam ; B 63 -12 219 688 ;\nC 34 ; WX 402 ; N quotedbl ; B 22 376 380 695 ;\nC 35 ; WX 500 ; N numbersign ; B 4 0 496 673 ;\nC 36 ; WX 500 ; N dollar ; B 28 -114 472 721 ;\nC 37 ; WX 889 ; N percent ; B 61 -9 828 714 ;\nC 38 ; WX 833 ; N ampersand ; B 52 -17 813 684 ;\nC 39 ; WX 278 ; N quoteright ; B 29 405 249 695 ;\nC 40 ; WX 333 ; N parenleft ; B 65 -104 305 723 ;\nC 41 ; WX 333 ; N parenright ; B 28 -104 268 723 ;\nC 42 ; WX 444 ; N asterisk ; B 44 332 399 695 ;\nC 43 ; WX 606 ; N plus ; B 51 0 555 505 ;\nC 44 ; WX 250 ; N comma ; B -6 -166 227 141 ;\nC 45 ; WX 333 ; N hyphen ; B 16 195 317 305 ;\nC 46 ; WX 250 ; N period ; B 47 -12 203 144 ;\nC 47 ; WX 296 ; N slash ; B -9 -17 305 720 ;\nC 48 ; WX 500 ; N zero ; B 33 -17 468 660 ;\nC 49 ; WX 500 ; N one ; B 35 -3 455 670 ;\nC 50 ; WX 500 ; N two ; B 25 -3 472 660 ;\nC 51 ; WX 500 ; N three ; B 22 -17 458 660 ;\nC 52 ; WX 500 ; N four ; B 12 -3 473 672 ;\nC 53 ; WX 500 ; N five ; B 42 -17 472 656 ;\nC 54 ; WX 500 ; N six ; B 37 -17 469 660 ;\nC 55 ; WX 500 ; N seven ; B 46 -3 493 656 ;\nC 56 ; WX 500 ; N eight ; B 34 -17 467 660 ;\nC 57 ; WX 500 ; N nine ; B 31 -17 463 660 ;\nC 58 ; WX 250 ; N colon ; B 47 -12 203 454 ;\nC 59 ; WX 250 ; N semicolon ; B -6 -166 227 454 ;\nC 60 ; WX 606 ; N less ; B 49 -15 558 519 ;\nC 61 ; WX 606 ; N equal ; B 51 114 555 396 ;\nC 62 ; WX 606 ; N greater ; B 49 -15 558 519 ;\nC 63 ; WX 444 ; N question ; B 43 -12 411 687 ;\nC 64 ; WX 747 ; N at ; B 42 -12 704 681 ;\nC 65 ; WX 778 ; N A ; B 24 -3 757 686 ;\nC 66 ; WX 667 ; N B ; B 39 -3 611 681 ;\nC 67 ; WX 722 ; N C ; B 44 -17 695 695 ;\nC 68 ; WX 833 ; N D ; B 35 -3 786 681 ;\nC 69 ; WX 611 ; N E ; B 39 -4 577 681 ;\nC 70 ; WX 556 ; N F ; B 28 -3 539 681 ;\nC 71 ; WX 833 ; N G ; B 47 -17 776 695 ;\nC 72 ; WX 833 ; N H ; B 36 -3 796 681 ;\nC 73 ; WX 389 ; N I ; B 39 -3 350 681 ;\nC 74 ; WX 389 ; N J ; B -11 -213 350 681 ;\nC 75 ; WX 778 ; N K ; B 39 -3 763 681 ;\nC 76 ; WX 611 ; N L ; B 39 -4 577 681 ;\nC 77 ; WX 1000 ; N M ; B 32 -10 968 681 ;\nC 78 ; WX 833 ; N N ; B 35 -16 798 681 ;\nC 79 ; WX 833 ; N O ; B 47 -17 787 695 ;\nC 80 ; WX 611 ; N P ; B 39 -3 594 681 ;\nC 81 ; WX 833 ; N Q ; B 47 -184 787 695 ;\nC 82 ; WX 722 ; N R ; B 39 -3 708 681 ;\nC 83 ; WX 611 ; N S ; B 57 -17 559 695 ;\nC 84 ; WX 667 ; N T ; B 17 -3 650 681 ;\nC 85 ; WX 778 ; N U ; B 26 -17 760 681 ;\nC 86 ; WX 778 ; N V ; B 20 -3 763 681 ;\nC 87 ; WX 1000 ; N W ; B 17 -3 988 686 ;\nC 88 ; WX 667 ; N X ; B 17 -3 650 695 ;\nC 89 ; WX 667 ; N Y ; B 15 -3 660 695 ;\nC 90 ; WX 667 ; N Z ; B 24 -3 627 681 ;\nC 91 ; WX 333 ; N bracketleft ; B 73 -104 291 720 ;\nC 92 ; WX 606 ; N backslash ; B 72 0 534 720 ;\nC 93 ; WX 333 ; N bracketright ; B 42 -104 260 720 ;\nC 94 ; WX 606 ; N asciicircum ; B 52 275 554 678 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 278 ; N quoteleft ; B 29 405 249 695 ;\nC 97 ; WX 500 ; N a ; B 40 -17 478 471 ;\nC 98 ; WX 611 ; N b ; B 10 -17 556 720 ;\nC 99 ; WX 444 ; N c ; B 37 -17 414 471 ;\nC 100 ; WX 611 ; N d ; B 42 -17 577 720 ;\nC 101 ; WX 500 ; N e ; B 42 -17 461 471 ;\nC 102 ; WX 389 ; N f ; B 34 -3 381 720 ; L i fi ; L l fl ;\nC 103 ; WX 556 ; N g ; B 26 -266 535 471 ;\nC 104 ; WX 611 ; N h ; B 24 -3 587 720 ;\nC 105 ; WX 333 ; N i ; B 34 -3 298 706 ;\nC 106 ; WX 333 ; N j ; B 3 -266 241 706 ;\nC 107 ; WX 611 ; N k ; B 21 -3 597 720 ;\nC 108 ; WX 333 ; N l ; B 24 -3 296 720 ;\nC 109 ; WX 889 ; N m ; B 24 -3 864 471 ;\nC 110 ; WX 611 ; N n ; B 24 -3 587 471 ;\nC 111 ; WX 556 ; N o ; B 40 -17 517 471 ;\nC 112 ; WX 611 ; N p ; B 29 -258 567 471 ;\nC 113 ; WX 611 ; N q ; B 52 -258 589 471 ;\nC 114 ; WX 389 ; N r ; B 30 -3 389 471 ;\nC 115 ; WX 444 ; N s ; B 39 -17 405 471 ;\nC 116 ; WX 333 ; N t ; B 22 -17 324 632 ;\nC 117 ; WX 611 ; N u ; B 25 -17 583 471 ;\nC 118 ; WX 556 ; N v ; B 11 -3 545 459 ;\nC 119 ; WX 833 ; N w ; B 13 -3 820 471 ;\nC 120 ; WX 500 ; N x ; B 20 -3 483 471 ;\nC 121 ; WX 556 ; N y ; B 10 -266 546 459 ;\nC 122 ; WX 500 ; N z ; B 16 -3 464 459 ;\nC 123 ; WX 310 ; N braceleft ; B 5 -117 288 725 ;\nC 124 ; WX 606 ; N bar ; B 260 0 346 720 ;\nC 125 ; WX 310 ; N braceright ; B 22 -117 305 725 ;\nC 126 ; WX 606 ; N asciitilde ; B 51 155 555 342 ;\nC 161 ; WX 278 ; N exclamdown ; B 59 -227 215 471 ;\nC 162 ; WX 500 ; N cent ; B 73 -106 450 554 ;\nC 163 ; WX 500 ; N sterling ; B -2 -19 501 676 ;\nC 164 ; WX 167 ; N fraction ; B -152 0 320 660 ;\nC 165 ; WX 500 ; N yen ; B 17 -3 483 695 ;\nC 166 ; WX 500 ; N florin ; B 11 -242 490 703 ;\nC 167 ; WX 500 ; N section ; B 30 -217 471 695 ;\nC 168 ; WX 500 ; N currency ; B 32 96 468 533 ;\nC 169 ; WX 227 ; N quotesingle ; B 45 376 181 695 ;\nC 170 ; WX 500 ; N quotedblleft ; B 34 405 466 695 ;\nC 171 ; WX 500 ; N guillemotleft ; B 36 44 463 438 ;\nC 172 ; WX 389 ; N guilsinglleft ; B 82 44 307 438 ;\nC 173 ; WX 389 ; N guilsinglright ; B 82 44 307 438 ;\nC 174 ; WX 611 ; N fi ; B 10 -3 595 720 ;\nC 175 ; WX 611 ; N fl ; B 17 -3 593 720 ;\nC 177 ; WX 500 ; N endash ; B 0 208 500 291 ;\nC 178 ; WX 500 ; N dagger ; B 29 -6 472 682 ;\nC 179 ; WX 500 ; N daggerdbl ; B 32 -245 468 682 ;\nC 180 ; WX 250 ; N periodcentered ; B 47 179 203 335 ;\nC 182 ; WX 641 ; N paragraph ; B 19 -161 599 683 ;\nC 183 ; WX 606 ; N bullet ; B 131 172 475 516 ;\nC 184 ; WX 333 ; N quotesinglbase ; B 56 -160 276 130 ;\nC 185 ; WX 500 ; N quotedblbase ; B 34 -160 466 130 ;\nC 186 ; WX 500 ; N quotedblright ; B 34 405 466 695 ;\nC 187 ; WX 500 ; N guillemotright ; B 37 44 464 438 ;\nC 188 ; WX 1000 ; N ellipsis ; B 89 -12 911 144 ;\nC 189 ; WX 1000 ; N perthousand ; B 33 -9 982 724 ;\nC 191 ; WX 444 ; N questiondown ; B 33 -231 401 471 ;\nC 193 ; WX 333 ; N grave ; B 18 506 256 691 ;\nC 194 ; WX 333 ; N acute ; B 78 506 316 691 ;\nC 195 ; WX 333 ; N circumflex ; B -2 506 335 681 ;\nC 196 ; WX 333 ; N tilde ; B -16 535 349 661 ;\nC 197 ; WX 333 ; N macron ; B 1 538 332 609 ;\nC 198 ; WX 333 ; N breve ; B 15 506 318 669 ;\nC 199 ; WX 333 ; N dotaccent ; B 100 537 234 671 ;\nC 200 ; WX 333 ; N dieresis ; B -8 537 341 671 ;\nC 202 ; WX 333 ; N ring ; B 67 500 267 700 ;\nC 203 ; WX 333 ; N cedilla ; B 73 -225 300 -7 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -56 506 390 691 ;\nC 206 ; WX 333 ; N ogonek ; B 60 -246 274 -17 ;\nC 207 ; WX 333 ; N caron ; B -2 510 335 685 ;\nC 208 ; WX 1000 ; N emdash ; B 0 208 1000 291 ;\nC 225 ; WX 1000 ; N AE ; B 12 -4 954 681 ;\nC 227 ; WX 438 ; N ordfeminine ; B 77 367 361 660 ;\nC 232 ; WX 611 ; N Lslash ; B 16 -4 577 681 ;\nC 233 ; WX 833 ; N Oslash ; B 32 -20 808 698 ;\nC 234 ; WX 1000 ; N OE ; B 43 -17 985 695 ;\nC 235 ; WX 488 ; N ordmasculine ; B 89 367 399 660 ;\nC 241 ; WX 778 ; N ae ; B 46 -17 731 471 ;\nC 245 ; WX 333 ; N dotlessi ; B 34 -3 298 471 ;\nC 248 ; WX 333 ; N lslash ; B -4 -3 334 720 ;\nC 249 ; WX 556 ; N oslash ; B 23 -18 534 471 ;\nC 250 ; WX 833 ; N oe ; B 48 -17 799 471 ;\nC 251 ; WX 611 ; N germandbls ; B 30 -17 565 720 ;\nC -1 ; WX 667 ; N Zcaron ; B 24 -3 627 909 ;\nC -1 ; WX 444 ; N ccedilla ; B 37 -225 414 471 ;\nC -1 ; WX 556 ; N ydieresis ; B 10 -266 546 691 ;\nC -1 ; WX 500 ; N atilde ; B 40 -17 478 673 ;\nC -1 ; WX 333 ; N icircumflex ; B -2 -3 335 701 ;\nC -1 ; WX 300 ; N threesuperior ; B 9 261 292 667 ;\nC -1 ; WX 500 ; N ecircumflex ; B 42 -17 461 701 ;\nC -1 ; WX 611 ; N thorn ; B 17 -258 563 720 ;\nC -1 ; WX 500 ; N egrave ; B 42 -17 461 711 ;\nC -1 ; WX 300 ; N twosuperior ; B 5 261 295 660 ;\nC -1 ; WX 500 ; N eacute ; B 42 -17 461 711 ;\nC -1 ; WX 556 ; N otilde ; B 40 -17 517 673 ;\nC -1 ; WX 778 ; N Aacute ; B 24 -3 757 915 ;\nC -1 ; WX 556 ; N ocircumflex ; B 40 -17 517 701 ;\nC -1 ; WX 556 ; N yacute ; B 10 -266 546 711 ;\nC -1 ; WX 611 ; N udieresis ; B 25 -17 583 691 ;\nC -1 ; WX 750 ; N threequarters ; B 15 -2 735 667 ;\nC -1 ; WX 500 ; N acircumflex ; B 40 -17 478 701 ;\nC -1 ; WX 833 ; N Eth ; B 10 -3 786 681 ;\nC -1 ; WX 500 ; N edieresis ; B 42 -17 461 691 ;\nC -1 ; WX 611 ; N ugrave ; B 25 -17 583 711 ;\nC -1 ; WX 998 ; N trademark ; B 38 274 961 678 ;\nC -1 ; WX 556 ; N ograve ; B 40 -17 517 711 ;\nC -1 ; WX 444 ; N scaron ; B 39 -17 405 693 ;\nC -1 ; WX 389 ; N Idieresis ; B 20 -3 369 895 ;\nC -1 ; WX 611 ; N uacute ; B 25 -17 583 711 ;\nC -1 ; WX 500 ; N agrave ; B 40 -17 478 711 ;\nC -1 ; WX 611 ; N ntilde ; B 24 -3 587 673 ;\nC -1 ; WX 500 ; N aring ; B 40 -17 478 700 ;\nC -1 ; WX 500 ; N zcaron ; B 16 -3 464 693 ;\nC -1 ; WX 389 ; N Icircumflex ; B 26 -3 363 905 ;\nC -1 ; WX 833 ; N Ntilde ; B 35 -16 798 885 ;\nC -1 ; WX 611 ; N ucircumflex ; B 25 -17 583 701 ;\nC -1 ; WX 611 ; N Ecircumflex ; B 39 -4 577 905 ;\nC -1 ; WX 389 ; N Iacute ; B 39 -3 350 915 ;\nC -1 ; WX 722 ; N Ccedilla ; B 44 -225 695 695 ;\nC -1 ; WX 833 ; N Odieresis ; B 47 -17 787 895 ;\nC -1 ; WX 611 ; N Scaron ; B 57 -17 559 909 ;\nC -1 ; WX 611 ; N Edieresis ; B 39 -4 577 895 ;\nC -1 ; WX 389 ; N Igrave ; B 39 -3 350 915 ;\nC -1 ; WX 500 ; N adieresis ; B 40 -17 478 691 ;\nC -1 ; WX 833 ; N Ograve ; B 47 -17 787 915 ;\nC -1 ; WX 611 ; N Egrave ; B 39 -4 577 915 ;\nC -1 ; WX 667 ; N Ydieresis ; B 15 -3 660 895 ;\nC -1 ; WX 747 ; N registered ; B 26 -17 720 695 ;\nC -1 ; WX 833 ; N Otilde ; B 47 -17 787 885 ;\nC -1 ; WX 750 ; N onequarter ; B 19 -2 735 665 ;\nC -1 ; WX 778 ; N Ugrave ; B 26 -17 760 915 ;\nC -1 ; WX 778 ; N Ucircumflex ; B 26 -17 760 905 ;\nC -1 ; WX 611 ; N Thorn ; B 39 -3 574 681 ;\nC -1 ; WX 606 ; N divide ; B 51 0 555 510 ;\nC -1 ; WX 778 ; N Atilde ; B 24 -3 757 885 ;\nC -1 ; WX 778 ; N Uacute ; B 26 -17 760 915 ;\nC -1 ; WX 833 ; N Ocircumflex ; B 47 -17 787 905 ;\nC -1 ; WX 606 ; N logicalnot ; B 51 114 555 396 ;\nC -1 ; WX 778 ; N Aring ; B 24 -3 757 924 ;\nC -1 ; WX 333 ; N idieresis ; B -8 -3 341 691 ;\nC -1 ; WX 333 ; N iacute ; B 34 -3 316 711 ;\nC -1 ; WX 500 ; N aacute ; B 40 -17 478 711 ;\nC -1 ; WX 606 ; N plusminus ; B 51 0 555 505 ;\nC -1 ; WX 606 ; N multiply ; B 72 21 534 483 ;\nC -1 ; WX 778 ; N Udieresis ; B 26 -17 760 895 ;\nC -1 ; WX 606 ; N minus ; B 51 212 555 298 ;\nC -1 ; WX 300 ; N onesuperior ; B 14 261 287 665 ;\nC -1 ; WX 611 ; N Eacute ; B 39 -4 577 915 ;\nC -1 ; WX 778 ; N Acircumflex ; B 24 -3 757 905 ;\nC -1 ; WX 747 ; N copyright ; B 26 -17 720 695 ;\nC -1 ; WX 778 ; N Agrave ; B 24 -3 757 915 ;\nC -1 ; WX 556 ; N odieresis ; B 40 -17 517 691 ;\nC -1 ; WX 556 ; N oacute ; B 40 -17 517 711 ;\nC -1 ; WX 400 ; N degree ; B 50 360 350 660 ;\nC -1 ; WX 333 ; N igrave ; B 18 -3 298 711 ;\nC -1 ; WX 611 ; N mu ; B 25 -225 583 471 ;\nC -1 ; WX 833 ; N Oacute ; B 47 -17 787 915 ;\nC -1 ; WX 556 ; N eth ; B 40 -17 517 720 ;\nC -1 ; WX 778 ; N Adieresis ; B 24 -3 757 895 ;\nC -1 ; WX 667 ; N Yacute ; B 15 -3 660 915 ;\nC -1 ; WX 606 ; N brokenbar ; B 260 0 346 720 ;\nC -1 ; WX 750 ; N onehalf ; B 9 -2 745 665 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 101\n\nKPX A y -70\nKPX A w -70\nKPX A v -70\nKPX A space -18\nKPX A quoteright -92\nKPX A Y -111\nKPX A W -90\nKPX A V -129\nKPX A T -92\n\nKPX F period -111\nKPX F comma -111\nKPX F A -55\n\nKPX L y -74\nKPX L space -18\nKPX L quoteright -74\nKPX L Y -92\nKPX L W -92\nKPX L V -92\nKPX L T -74\n\nKPX P period -129\nKPX P comma -129\nKPX P A -74\n\nKPX R y -30\nKPX R Y -55\nKPX R W -37\nKPX R V -74\nKPX R T -55\n\nKPX T y -90\nKPX T w -90\nKPX T u -129\nKPX T semicolon -74\nKPX T s -111\nKPX T r -111\nKPX T period -92\nKPX T o -111\nKPX T i -55\nKPX T hyphen -92\nKPX T e -111\nKPX T comma -92\nKPX T colon -74\nKPX T c -129\nKPX T a -111\nKPX T A -92\n\nKPX V y -90\nKPX V u -92\nKPX V semicolon -74\nKPX V r -111\nKPX V period -129\nKPX V o -111\nKPX V i -55\nKPX V hyphen -92\nKPX V e -111\nKPX V comma -129\nKPX V colon -74\nKPX V a -111\nKPX V A -129\n\nKPX W y -74\nKPX W u -74\nKPX W semicolon -37\nKPX W r -74\nKPX W period -37\nKPX W o -74\nKPX W i -37\nKPX W hyphen -37\nKPX W e -74\nKPX W comma -92\nKPX W colon -37\nKPX W a -74\nKPX W A -90\n\nKPX Y v -74\nKPX Y u -74\nKPX Y semicolon -55\nKPX Y q -92\nKPX Y period -74\nKPX Y p -74\nKPX Y o -74\nKPX Y i -55\nKPX Y hyphen -74\nKPX Y e -74\nKPX Y comma -74\nKPX Y colon -55\nKPX Y a -74\nKPX Y A -55\n\nKPX f quoteright 37\nKPX f f -18\n\nKPX one one -37\n\nKPX quoteleft quoteleft -55\n\nKPX quoteright t -18\nKPX quoteright space -55\nKPX quoteright s -55\nKPX quoteright quoteright -55\n\nKPX r quoteright 55\nKPX r period -55\nKPX r hyphen -18\nKPX r comma -55\n\nKPX v period -111\nKPX v comma -111\n\nKPX w period -92\nKPX w comma -92\n\nKPX y period -92\nKPX y comma -92\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 223 224 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 211 224 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 223 224 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 215 224 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 223 224 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 223 224 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 195 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 139 224 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 139 224 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 139 224 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 139 224 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 28 224 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 28 224 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 28 224 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 28 224 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 250 224 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 250 224 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 250 224 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 250 224 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 250 224 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 250 224 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 139 224 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 235 224 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 235 224 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 235 224 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 223 224 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 211 224 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 199 224 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 167 224 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 84 20 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 84 20 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 84 20 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 84 20 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 84 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 84 12 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 56 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 84 20 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 96 20 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 92 20 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 84 20 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 0 20 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex 0 20 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis 0 20 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave 0 20 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 139 12 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 112 20 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 112 20 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 112 20 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 112 20 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 112 12 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 56 8 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 151 20 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 139 20 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 139 20 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 131 20 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 144 20 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 124 20 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 84 8 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pplbi8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Mon Jul  2 22:48:39 1990\nComment UniqueID 31799\nComment VMusage 37656 48548\nFontName Palatino-BoldItalic\nFullName Palatino Bold Italic\nFamilyName Palatino\nWeight Bold\nItalicAngle -10\nIsFixedPitch false\nFontBBox -170 -271 1073 926\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.005\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.Palatino is a trademark of Linotype AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 681\nXHeight 469\nAscender 726\nDescender -271\nStartCharMetrics 228\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 58 -17 322 695 ;\nC 34 ; WX 500 ; N quotedbl ; B 137 467 493 720 ;\nC 35 ; WX 500 ; N numbersign ; B 4 0 496 673 ;\nC 36 ; WX 500 ; N dollar ; B 20 -108 477 737 ;\nC 37 ; WX 889 ; N percent ; B 56 -17 790 697 ;\nC 38 ; WX 833 ; N ampersand ; B 74 -17 811 695 ;\nC 39 ; WX 278 ; N quoteright ; B 76 431 302 720 ;\nC 40 ; WX 333 ; N parenleft ; B 58 -129 368 723 ;\nC 41 ; WX 333 ; N parenright ; B -12 -129 298 723 ;\nC 42 ; WX 444 ; N asterisk ; B 84 332 439 695 ;\nC 43 ; WX 606 ; N plus ; B 50 -5 556 501 ;\nC 44 ; WX 250 ; N comma ; B -33 -164 208 147 ;\nC 45 ; WX 389 ; N hyphen ; B 37 198 362 300 ;\nC 46 ; WX 250 ; N period ; B 48 -17 187 135 ;\nC 47 ; WX 315 ; N slash ; B 1 -17 315 720 ;\nC 48 ; WX 500 ; N zero ; B 42 -17 490 683 ;\nC 49 ; WX 500 ; N one ; B 41 -3 434 678 ;\nC 50 ; WX 500 ; N two ; B 1 -3 454 683 ;\nC 51 ; WX 500 ; N three ; B 8 -17 450 683 ;\nC 52 ; WX 500 ; N four ; B 3 -3 487 683 ;\nC 53 ; WX 500 ; N five ; B 14 -17 481 675 ;\nC 54 ; WX 500 ; N six ; B 39 -17 488 683 ;\nC 55 ; WX 500 ; N seven ; B 69 -3 544 674 ;\nC 56 ; WX 500 ; N eight ; B 26 -17 484 683 ;\nC 57 ; WX 500 ; N nine ; B 27 -17 491 683 ;\nC 58 ; WX 250 ; N colon ; B 38 -17 236 452 ;\nC 59 ; WX 250 ; N semicolon ; B -33 -164 247 452 ;\nC 60 ; WX 606 ; N less ; B 49 -21 558 517 ;\nC 61 ; WX 606 ; N equal ; B 51 106 555 390 ;\nC 62 ; WX 606 ; N greater ; B 48 -21 557 517 ;\nC 63 ; WX 444 ; N question ; B 91 -17 450 695 ;\nC 64 ; WX 833 ; N at ; B 82 -12 744 681 ;\nC 65 ; WX 722 ; N A ; B -35 -3 685 683 ;\nC 66 ; WX 667 ; N B ; B 8 -3 629 681 ;\nC 67 ; WX 685 ; N C ; B 69 -17 695 695 ;\nC 68 ; WX 778 ; N D ; B 0 -3 747 682 ;\nC 69 ; WX 611 ; N E ; B 11 -3 606 681 ;\nC 70 ; WX 556 ; N F ; B -6 -3 593 681 ;\nC 71 ; WX 778 ; N G ; B 72 -17 750 695 ;\nC 72 ; WX 778 ; N H ; B -12 -3 826 681 ;\nC 73 ; WX 389 ; N I ; B -1 -3 412 681 ;\nC 74 ; WX 389 ; N J ; B -29 -207 417 681 ;\nC 75 ; WX 722 ; N K ; B -10 -3 746 681 ;\nC 76 ; WX 611 ; N L ; B 26 -3 578 681 ;\nC 77 ; WX 944 ; N M ; B -23 -17 985 681 ;\nC 78 ; WX 778 ; N N ; B -2 -3 829 681 ;\nC 79 ; WX 833 ; N O ; B 76 -17 794 695 ;\nC 80 ; WX 667 ; N P ; B 11 -3 673 681 ;\nC 81 ; WX 833 ; N Q ; B 76 -222 794 695 ;\nC 82 ; WX 722 ; N R ; B 4 -3 697 681 ;\nC 83 ; WX 556 ; N S ; B 50 -17 517 695 ;\nC 84 ; WX 611 ; N T ; B 56 -3 674 681 ;\nC 85 ; WX 778 ; N U ; B 83 -17 825 681 ;\nC 86 ; WX 667 ; N V ; B 67 -3 745 681 ;\nC 87 ; WX 1000 ; N W ; B 67 -3 1073 689 ;\nC 88 ; WX 722 ; N X ; B -9 -3 772 681 ;\nC 89 ; WX 611 ; N Y ; B 54 -3 675 695 ;\nC 90 ; WX 667 ; N Z ; B 1 -3 676 681 ;\nC 91 ; WX 333 ; N bracketleft ; B 45 -102 381 723 ;\nC 92 ; WX 606 ; N backslash ; B 72 0 534 720 ;\nC 93 ; WX 333 ; N bracketright ; B -21 -102 315 723 ;\nC 94 ; WX 606 ; N asciicircum ; B 63 275 543 678 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 278 ; N quoteleft ; B 65 431 291 720 ;\nC 97 ; WX 556 ; N a ; B 44 -17 519 470 ;\nC 98 ; WX 537 ; N b ; B 44 -17 494 726 ;\nC 99 ; WX 444 ; N c ; B 32 -17 436 469 ;\nC 100 ; WX 556 ; N d ; B 38 -17 550 726 ;\nC 101 ; WX 444 ; N e ; B 28 -17 418 469 ;\nC 102 ; WX 333 ; N f ; B -130 -271 449 726 ; L i fi ; L l fl ;\nC 103 ; WX 500 ; N g ; B -50 -271 529 469 ;\nC 104 ; WX 556 ; N h ; B 22 -17 522 726 ;\nC 105 ; WX 333 ; N i ; B 26 -17 312 695 ;\nC 106 ; WX 333 ; N j ; B -64 -271 323 695 ;\nC 107 ; WX 556 ; N k ; B 34 -17 528 726 ;\nC 108 ; WX 333 ; N l ; B 64 -17 318 726 ;\nC 109 ; WX 833 ; N m ; B 19 -17 803 469 ;\nC 110 ; WX 556 ; N n ; B 17 -17 521 469 ;\nC 111 ; WX 556 ; N o ; B 48 -17 502 469 ;\nC 112 ; WX 556 ; N p ; B -21 -271 516 469 ;\nC 113 ; WX 537 ; N q ; B 32 -271 513 469 ;\nC 114 ; WX 389 ; N r ; B 20 -17 411 469 ;\nC 115 ; WX 444 ; N s ; B 25 -17 406 469 ;\nC 116 ; WX 389 ; N t ; B 42 -17 409 636 ;\nC 117 ; WX 556 ; N u ; B 22 -17 521 469 ;\nC 118 ; WX 556 ; N v ; B 19 -17 513 469 ;\nC 119 ; WX 833 ; N w ; B 27 -17 802 469 ;\nC 120 ; WX 500 ; N x ; B -8 -17 500 469 ;\nC 121 ; WX 556 ; N y ; B 13 -271 541 469 ;\nC 122 ; WX 500 ; N z ; B 31 -17 470 469 ;\nC 123 ; WX 333 ; N braceleft ; B 18 -105 334 720 ;\nC 124 ; WX 606 ; N bar ; B 259 0 347 720 ;\nC 125 ; WX 333 ; N braceright ; B -1 -105 315 720 ;\nC 126 ; WX 606 ; N asciitilde ; B 51 151 555 346 ;\nC 161 ; WX 333 ; N exclamdown ; B 2 -225 259 479 ;\nC 162 ; WX 500 ; N cent ; B 52 -105 456 547 ;\nC 163 ; WX 500 ; N sterling ; B 21 -5 501 683 ;\nC 164 ; WX 167 ; N fraction ; B -170 0 338 683 ;\nC 165 ; WX 500 ; N yen ; B 11 -3 538 695 ;\nC 166 ; WX 500 ; N florin ; B 8 -242 479 690 ;\nC 167 ; WX 556 ; N section ; B 47 -151 497 695 ;\nC 168 ; WX 500 ; N currency ; B 32 96 468 533 ;\nC 169 ; WX 250 ; N quotesingle ; B 127 467 293 720 ;\nC 170 ; WX 500 ; N quotedblleft ; B 65 431 511 720 ;\nC 171 ; WX 500 ; N guillemotleft ; B 35 43 458 446 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 60 43 292 446 ;\nC 173 ; WX 333 ; N guilsinglright ; B 35 40 267 443 ;\nC 174 ; WX 611 ; N fi ; B -130 -271 588 726 ;\nC 175 ; WX 611 ; N fl ; B -130 -271 631 726 ;\nC 177 ; WX 500 ; N endash ; B -12 214 512 282 ;\nC 178 ; WX 556 ; N dagger ; B 67 -3 499 685 ;\nC 179 ; WX 556 ; N daggerdbl ; B 33 -153 537 693 ;\nC 180 ; WX 250 ; N periodcentered ; B 67 172 206 324 ;\nC 182 ; WX 556 ; N paragraph ; B 14 -204 629 681 ;\nC 183 ; WX 606 ; N bullet ; B 131 172 475 516 ;\nC 184 ; WX 250 ; N quotesinglbase ; B -3 -144 220 145 ;\nC 185 ; WX 500 ; N quotedblbase ; B -18 -144 424 145 ;\nC 186 ; WX 500 ; N quotedblright ; B 73 431 519 720 ;\nC 187 ; WX 500 ; N guillemotright ; B 35 40 458 443 ;\nC 188 ; WX 1000 ; N ellipsis ; B 91 -17 896 135 ;\nC 189 ; WX 1000 ; N perthousand ; B 65 -17 912 691 ;\nC 191 ; WX 444 ; N questiondown ; B -12 -226 347 479 ;\nC 193 ; WX 333 ; N grave ; B 110 518 322 699 ;\nC 194 ; WX 333 ; N acute ; B 153 518 392 699 ;\nC 195 ; WX 333 ; N circumflex ; B 88 510 415 684 ;\nC 196 ; WX 333 ; N tilde ; B 82 535 441 654 ;\nC 197 ; WX 333 ; N macron ; B 76 538 418 608 ;\nC 198 ; WX 333 ; N breve ; B 96 518 412 680 ;\nC 199 ; WX 333 ; N dotaccent ; B 202 537 325 668 ;\nC 200 ; WX 333 ; N dieresis ; B 90 537 426 668 ;\nC 202 ; WX 556 ; N ring ; B 277 514 477 714 ;\nC 203 ; WX 333 ; N cedilla ; B 12 -218 248 5 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -28 518 409 699 ;\nC 206 ; WX 333 ; N ogonek ; B 32 -206 238 -17 ;\nC 207 ; WX 333 ; N caron ; B 113 510 445 684 ;\nC 208 ; WX 1000 ; N emdash ; B -12 214 1012 282 ;\nC 225 ; WX 944 ; N AE ; B -29 -3 927 681 ;\nC 227 ; WX 333 ; N ordfeminine ; B 47 391 355 684 ;\nC 232 ; WX 611 ; N Lslash ; B 6 -3 578 681 ;\nC 233 ; WX 833 ; N Oslash ; B 57 -54 797 730 ;\nC 234 ; WX 944 ; N OE ; B 39 -17 961 695 ;\nC 235 ; WX 333 ; N ordmasculine ; B 51 391 346 683 ;\nC 241 ; WX 738 ; N ae ; B 44 -17 711 469 ;\nC 245 ; WX 333 ; N dotlessi ; B 26 -17 293 469 ;\nC 248 ; WX 333 ; N lslash ; B 13 -17 365 726 ;\nC 249 ; WX 556 ; N oslash ; B 14 -50 522 506 ;\nC 250 ; WX 778 ; N oe ; B 48 -17 755 469 ;\nC 251 ; WX 556 ; N germandbls ; B -131 -271 549 726 ;\nC -1 ; WX 667 ; N Zcaron ; B 1 -3 676 896 ;\nC -1 ; WX 444 ; N ccedilla ; B 32 -218 436 469 ;\nC -1 ; WX 556 ; N ydieresis ; B 13 -271 541 688 ;\nC -1 ; WX 556 ; N atilde ; B 44 -17 553 666 ;\nC -1 ; WX 333 ; N icircumflex ; B 26 -17 403 704 ;\nC -1 ; WX 300 ; N threesuperior ; B 23 263 310 683 ;\nC -1 ; WX 444 ; N ecircumflex ; B 28 -17 471 704 ;\nC -1 ; WX 556 ; N thorn ; B -21 -271 516 726 ;\nC -1 ; WX 444 ; N egrave ; B 28 -17 418 719 ;\nC -1 ; WX 300 ; N twosuperior ; B 26 271 321 683 ;\nC -1 ; WX 444 ; N eacute ; B 28 -17 448 719 ;\nC -1 ; WX 556 ; N otilde ; B 48 -17 553 666 ;\nC -1 ; WX 722 ; N Aacute ; B -35 -3 685 911 ;\nC -1 ; WX 556 ; N ocircumflex ; B 48 -17 515 704 ;\nC -1 ; WX 556 ; N yacute ; B 13 -271 541 719 ;\nC -1 ; WX 556 ; N udieresis ; B 22 -17 538 688 ;\nC -1 ; WX 750 ; N threequarters ; B 18 -2 732 683 ;\nC -1 ; WX 556 ; N acircumflex ; B 44 -17 527 704 ;\nC -1 ; WX 778 ; N Eth ; B 0 -3 747 682 ;\nC -1 ; WX 444 ; N edieresis ; B 28 -17 482 688 ;\nC -1 ; WX 556 ; N ugrave ; B 22 -17 521 719 ;\nC -1 ; WX 1000 ; N trademark ; B 38 274 961 678 ;\nC -1 ; WX 556 ; N ograve ; B 48 -17 502 719 ;\nC -1 ; WX 444 ; N scaron ; B 25 -17 489 692 ;\nC -1 ; WX 389 ; N Idieresis ; B -1 -3 454 880 ;\nC -1 ; WX 556 ; N uacute ; B 22 -17 521 719 ;\nC -1 ; WX 556 ; N agrave ; B 44 -17 519 719 ;\nC -1 ; WX 556 ; N ntilde ; B 17 -17 553 666 ;\nC -1 ; WX 556 ; N aring ; B 44 -17 519 714 ;\nC -1 ; WX 500 ; N zcaron ; B 31 -17 517 692 ;\nC -1 ; WX 389 ; N Icircumflex ; B -1 -3 443 896 ;\nC -1 ; WX 778 ; N Ntilde ; B -2 -3 829 866 ;\nC -1 ; WX 556 ; N ucircumflex ; B 22 -17 521 704 ;\nC -1 ; WX 611 ; N Ecircumflex ; B 11 -3 606 896 ;\nC -1 ; WX 389 ; N Iacute ; B -1 -3 420 911 ;\nC -1 ; WX 685 ; N Ccedilla ; B 69 -218 695 695 ;\nC -1 ; WX 833 ; N Odieresis ; B 76 -17 794 880 ;\nC -1 ; WX 556 ; N Scaron ; B 50 -17 557 896 ;\nC -1 ; WX 611 ; N Edieresis ; B 11 -3 606 880 ;\nC -1 ; WX 389 ; N Igrave ; B -1 -3 412 911 ;\nC -1 ; WX 556 ; N adieresis ; B 44 -17 538 688 ;\nC -1 ; WX 833 ; N Ograve ; B 76 -17 794 911 ;\nC -1 ; WX 611 ; N Egrave ; B 11 -3 606 911 ;\nC -1 ; WX 611 ; N Ydieresis ; B 54 -3 675 880 ;\nC -1 ; WX 747 ; N registered ; B 26 -17 720 695 ;\nC -1 ; WX 833 ; N Otilde ; B 76 -17 794 866 ;\nC -1 ; WX 750 ; N onequarter ; B 18 -2 732 683 ;\nC -1 ; WX 778 ; N Ugrave ; B 83 -17 825 911 ;\nC -1 ; WX 778 ; N Ucircumflex ; B 83 -17 825 896 ;\nC -1 ; WX 667 ; N Thorn ; B 11 -3 644 681 ;\nC -1 ; WX 606 ; N divide ; B 50 -5 556 501 ;\nC -1 ; WX 722 ; N Atilde ; B -35 -3 685 866 ;\nC -1 ; WX 778 ; N Uacute ; B 83 -17 825 911 ;\nC -1 ; WX 833 ; N Ocircumflex ; B 76 -17 794 896 ;\nC -1 ; WX 606 ; N logicalnot ; B 51 107 555 390 ;\nC -1 ; WX 722 ; N Aring ; B -35 -3 685 926 ;\nC -1 ; WX 333 ; N idieresis ; B 26 -17 426 688 ;\nC -1 ; WX 333 ; N iacute ; B 26 -17 392 719 ;\nC -1 ; WX 556 ; N aacute ; B 44 -17 519 719 ;\nC -1 ; WX 606 ; N plusminus ; B 50 0 556 501 ;\nC -1 ; WX 606 ; N multiply ; B 72 17 534 479 ;\nC -1 ; WX 778 ; N Udieresis ; B 83 -17 825 880 ;\nC -1 ; WX 606 ; N minus ; B 51 204 555 292 ;\nC -1 ; WX 300 ; N onesuperior ; B 41 271 298 680 ;\nC -1 ; WX 611 ; N Eacute ; B 11 -3 606 911 ;\nC -1 ; WX 722 ; N Acircumflex ; B -35 -3 685 896 ;\nC -1 ; WX 747 ; N copyright ; B 26 -17 720 695 ;\nC -1 ; WX 722 ; N Agrave ; B -35 -3 685 911 ;\nC -1 ; WX 556 ; N odieresis ; B 48 -17 538 688 ;\nC -1 ; WX 556 ; N oacute ; B 48 -17 504 719 ;\nC -1 ; WX 400 ; N degree ; B 50 383 350 683 ;\nC -1 ; WX 333 ; N igrave ; B 26 -17 322 719 ;\nC -1 ; WX 556 ; N mu ; B -15 -232 521 469 ;\nC -1 ; WX 833 ; N Oacute ; B 76 -17 794 911 ;\nC -1 ; WX 556 ; N eth ; B 48 -17 546 726 ;\nC -1 ; WX 722 ; N Adieresis ; B -35 -3 685 880 ;\nC -1 ; WX 611 ; N Yacute ; B 54 -3 675 911 ;\nC -1 ; WX 606 ; N brokenbar ; B 259 0 347 720 ;\nC -1 ; WX 750 ; N onehalf ; B 14 -2 736 683 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 108\n\nKPX A y -55\nKPX A w -37\nKPX A v -55\nKPX A space -55\nKPX A quoteright -55\nKPX A Y -74\nKPX A W -74\nKPX A V -74\nKPX A T -55\n\nKPX F space -18\nKPX F period -111\nKPX F comma -111\nKPX F A -74\n\nKPX L y -37\nKPX L space -18\nKPX L quoteright -55\nKPX L Y -74\nKPX L W -74\nKPX L V -74\nKPX L T -74\n\nKPX P space -55\nKPX P period -129\nKPX P comma -129\nKPX P A -92\n\nKPX R y -20\nKPX R Y -37\nKPX R W -55\nKPX R V -55\nKPX R T -37\n\nKPX T y -80\nKPX T w -50\nKPX T u -92\nKPX T semicolon -55\nKPX T s -92\nKPX T r -92\nKPX T period -55\nKPX T o -111\nKPX T i -74\nKPX T hyphen -92\nKPX T e -111\nKPX T comma -55\nKPX T colon -55\nKPX T c -92\nKPX T a -111\nKPX T O -18\nKPX T A -55\n\nKPX V y -50\nKPX V u -50\nKPX V semicolon -37\nKPX V r -74\nKPX V period -111\nKPX V o -74\nKPX V i -50\nKPX V hyphen -37\nKPX V e -74\nKPX V comma -111\nKPX V colon -37\nKPX V a -92\nKPX V A -74\n\nKPX W y -30\nKPX W u -30\nKPX W semicolon -18\nKPX W r -30\nKPX W period -55\nKPX W o -55\nKPX W i -30\nKPX W e -55\nKPX W comma -55\nKPX W colon -28\nKPX W a -74\nKPX W A -74\n\nKPX Y v -30\nKPX Y u -50\nKPX Y semicolon -55\nKPX Y q -92\nKPX Y period -55\nKPX Y p -74\nKPX Y o -111\nKPX Y i -54\nKPX Y hyphen -55\nKPX Y e -92\nKPX Y comma -55\nKPX Y colon -55\nKPX Y a -111\nKPX Y A -55\n\nKPX f quoteright 37\nKPX f f -37\n\nKPX one one -55\n\nKPX quoteleft quoteleft -55\n\nKPX quoteright t -18\nKPX quoteright space -37\nKPX quoteright s -37\nKPX quoteright quoteright -55\n\nKPX r quoteright 55\nKPX r q -18\nKPX r period -55\nKPX r o -18\nKPX r h -18\nKPX r g -18\nKPX r e -18\nKPX r comma -55\nKPX r c -18\n\nKPX v period -55\nKPX v comma -55\n\nKPX w period -55\nKPX w comma -55\n\nKPX y period -37\nKPX y comma -37\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 195 212 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 195 212 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 195 212 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 195 212 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 83 212 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 195 212 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 176 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 139 212 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 139 212 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 139 212 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 139 212 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 28 212 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 28 212 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 28 212 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 28 212 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 223 212 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 250 212 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 250 212 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 250 212 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 250 212 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 250 212 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 112 212 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 223 212 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 223 212 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 223 212 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 211 212 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 151 212 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 139 212 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 167 212 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 112 20 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 112 20 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 112 20 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 112 20 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 0 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 112 12 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 56 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 56 20 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 56 20 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 56 20 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 56 20 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 0 20 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -12 20 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis 0 20 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave 0 20 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 112 12 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 112 20 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 100 20 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 112 20 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 112 20 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 112 12 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 44 8 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 112 20 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 100 20 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 112 20 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 112 20 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 112 20 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 112 20 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 72 8 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pplr8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Mon Jul  2 22:14:17 1990\nComment UniqueID 31790\nComment VMusage 36445 47337\nFontName Palatino-Roman\nFullName Palatino Roman\nFamilyName Palatino\nWeight Roman\nItalicAngle 0\nIsFixedPitch false\nFontBBox -166 -283 1021 927\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.005\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.Palatino is a trademark of Linotype AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 692\nXHeight 469\nAscender 726\nDescender -281\nStartCharMetrics 228\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 278 ; N exclam ; B 81 -5 197 694 ;\nC 34 ; WX 371 ; N quotedbl ; B 52 469 319 709 ;\nC 35 ; WX 500 ; N numbersign ; B 4 0 495 684 ;\nC 36 ; WX 500 ; N dollar ; B 30 -116 471 731 ;\nC 37 ; WX 840 ; N percent ; B 39 -20 802 709 ;\nC 38 ; WX 778 ; N ampersand ; B 43 -20 753 689 ;\nC 39 ; WX 278 ; N quoteright ; B 45 446 233 709 ;\nC 40 ; WX 333 ; N parenleft ; B 60 -215 301 726 ;\nC 41 ; WX 333 ; N parenright ; B 32 -215 273 726 ;\nC 42 ; WX 389 ; N asterisk ; B 32 342 359 689 ;\nC 43 ; WX 606 ; N plus ; B 51 7 555 512 ;\nC 44 ; WX 250 ; N comma ; B 16 -155 218 123 ;\nC 45 ; WX 333 ; N hyphen ; B 17 215 312 287 ;\nC 46 ; WX 250 ; N period ; B 67 -5 183 111 ;\nC 47 ; WX 606 ; N slash ; B 87 -119 519 726 ;\nC 48 ; WX 500 ; N zero ; B 29 -20 465 689 ;\nC 49 ; WX 500 ; N one ; B 60 -3 418 694 ;\nC 50 ; WX 500 ; N two ; B 16 -3 468 689 ;\nC 51 ; WX 500 ; N three ; B 15 -20 462 689 ;\nC 52 ; WX 500 ; N four ; B 2 -3 472 694 ;\nC 53 ; WX 500 ; N five ; B 13 -20 459 689 ;\nC 54 ; WX 500 ; N six ; B 32 -20 468 689 ;\nC 55 ; WX 500 ; N seven ; B 44 -3 497 689 ;\nC 56 ; WX 500 ; N eight ; B 30 -20 464 689 ;\nC 57 ; WX 500 ; N nine ; B 20 -20 457 689 ;\nC 58 ; WX 250 ; N colon ; B 66 -5 182 456 ;\nC 59 ; WX 250 ; N semicolon ; B 16 -153 218 456 ;\nC 60 ; WX 606 ; N less ; B 57 0 558 522 ;\nC 61 ; WX 606 ; N equal ; B 51 136 555 386 ;\nC 62 ; WX 606 ; N greater ; B 48 0 549 522 ;\nC 63 ; WX 444 ; N question ; B 43 -5 395 694 ;\nC 64 ; WX 747 ; N at ; B 24 -20 724 694 ;\nC 65 ; WX 778 ; N A ; B 15 -3 756 700 ;\nC 66 ; WX 611 ; N B ; B 26 -3 576 692 ;\nC 67 ; WX 709 ; N C ; B 22 -20 670 709 ;\nC 68 ; WX 774 ; N D ; B 22 -3 751 692 ;\nC 69 ; WX 611 ; N E ; B 22 -3 572 692 ;\nC 70 ; WX 556 ; N F ; B 22 -3 536 692 ;\nC 71 ; WX 763 ; N G ; B 22 -20 728 709 ;\nC 72 ; WX 832 ; N H ; B 22 -3 810 692 ;\nC 73 ; WX 337 ; N I ; B 22 -3 315 692 ;\nC 74 ; WX 333 ; N J ; B -15 -194 311 692 ;\nC 75 ; WX 726 ; N K ; B 22 -3 719 692 ;\nC 76 ; WX 611 ; N L ; B 22 -3 586 692 ;\nC 77 ; WX 946 ; N M ; B 16 -13 926 692 ;\nC 78 ; WX 831 ; N N ; B 17 -20 813 692 ;\nC 79 ; WX 786 ; N O ; B 22 -20 764 709 ;\nC 80 ; WX 604 ; N P ; B 22 -3 580 692 ;\nC 81 ; WX 786 ; N Q ; B 22 -176 764 709 ;\nC 82 ; WX 668 ; N R ; B 22 -3 669 692 ;\nC 83 ; WX 525 ; N S ; B 24 -20 503 709 ;\nC 84 ; WX 613 ; N T ; B 18 -3 595 692 ;\nC 85 ; WX 778 ; N U ; B 12 -20 759 692 ;\nC 86 ; WX 722 ; N V ; B 8 -9 706 692 ;\nC 87 ; WX 1000 ; N W ; B 8 -9 984 700 ;\nC 88 ; WX 667 ; N X ; B 14 -3 648 700 ;\nC 89 ; WX 667 ; N Y ; B 9 -3 654 704 ;\nC 90 ; WX 667 ; N Z ; B 15 -3 638 692 ;\nC 91 ; WX 333 ; N bracketleft ; B 79 -184 288 726 ;\nC 92 ; WX 606 ; N backslash ; B 81 0 512 726 ;\nC 93 ; WX 333 ; N bracketright ; B 45 -184 254 726 ;\nC 94 ; WX 606 ; N asciicircum ; B 51 283 554 689 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 278 ; N quoteleft ; B 45 446 233 709 ;\nC 97 ; WX 500 ; N a ; B 32 -12 471 469 ;\nC 98 ; WX 553 ; N b ; B -15 -12 508 726 ;\nC 99 ; WX 444 ; N c ; B 26 -20 413 469 ;\nC 100 ; WX 611 ; N d ; B 35 -12 579 726 ;\nC 101 ; WX 479 ; N e ; B 26 -20 448 469 ;\nC 102 ; WX 333 ; N f ; B 23 -3 341 728 ; L i fi ; L l fl ;\nC 103 ; WX 556 ; N g ; B 32 -283 544 469 ;\nC 104 ; WX 582 ; N h ; B 6 -3 572 726 ;\nC 105 ; WX 291 ; N i ; B 21 -3 271 687 ;\nC 106 ; WX 234 ; N j ; B -40 -283 167 688 ;\nC 107 ; WX 556 ; N k ; B 21 -12 549 726 ;\nC 108 ; WX 291 ; N l ; B 21 -3 271 726 ;\nC 109 ; WX 883 ; N m ; B 16 -3 869 469 ;\nC 110 ; WX 582 ; N n ; B 6 -3 572 469 ;\nC 111 ; WX 546 ; N o ; B 32 -20 514 469 ;\nC 112 ; WX 601 ; N p ; B 8 -281 554 469 ;\nC 113 ; WX 560 ; N q ; B 35 -281 560 469 ;\nC 114 ; WX 395 ; N r ; B 21 -3 374 469 ;\nC 115 ; WX 424 ; N s ; B 30 -20 391 469 ;\nC 116 ; WX 326 ; N t ; B 22 -12 319 621 ;\nC 117 ; WX 603 ; N u ; B 18 -12 581 469 ;\nC 118 ; WX 565 ; N v ; B 6 -7 539 459 ;\nC 119 ; WX 834 ; N w ; B 6 -7 808 469 ;\nC 120 ; WX 516 ; N x ; B 20 -3 496 469 ;\nC 121 ; WX 556 ; N y ; B 12 -283 544 459 ;\nC 122 ; WX 500 ; N z ; B 16 -3 466 462 ;\nC 123 ; WX 333 ; N braceleft ; B 58 -175 289 726 ;\nC 124 ; WX 606 ; N bar ; B 275 0 331 726 ;\nC 125 ; WX 333 ; N braceright ; B 44 -175 275 726 ;\nC 126 ; WX 606 ; N asciitilde ; B 51 176 555 347 ;\nC 161 ; WX 278 ; N exclamdown ; B 81 -225 197 469 ;\nC 162 ; WX 500 ; N cent ; B 61 -101 448 562 ;\nC 163 ; WX 500 ; N sterling ; B 12 -13 478 694 ;\nC 164 ; WX 167 ; N fraction ; B -166 0 337 689 ;\nC 165 ; WX 500 ; N yen ; B 5 -3 496 701 ;\nC 166 ; WX 500 ; N florin ; B 0 -262 473 706 ;\nC 167 ; WX 500 ; N section ; B 26 -219 465 709 ;\nC 168 ; WX 500 ; N currency ; B 30 96 470 531 ;\nC 169 ; WX 208 ; N quotesingle ; B 61 469 147 709 ;\nC 170 ; WX 500 ; N quotedblleft ; B 51 446 449 709 ;\nC 171 ; WX 500 ; N guillemotleft ; B 50 71 450 428 ;\nC 172 ; WX 331 ; N guilsinglleft ; B 66 71 265 428 ;\nC 173 ; WX 331 ; N guilsinglright ; B 66 71 265 428 ;\nC 174 ; WX 605 ; N fi ; B 23 -3 587 728 ;\nC 175 ; WX 608 ; N fl ; B 23 -3 590 728 ;\nC 177 ; WX 500 ; N endash ; B 0 219 500 277 ;\nC 178 ; WX 500 ; N dagger ; B 34 -5 466 694 ;\nC 179 ; WX 500 ; N daggerdbl ; B 34 -249 466 694 ;\nC 180 ; WX 250 ; N periodcentered ; B 67 203 183 319 ;\nC 182 ; WX 628 ; N paragraph ; B 39 -150 589 694 ;\nC 183 ; WX 606 ; N bullet ; B 131 172 475 516 ;\nC 184 ; WX 278 ; N quotesinglbase ; B 22 -153 210 110 ;\nC 185 ; WX 500 ; N quotedblbase ; B 51 -153 449 110 ;\nC 186 ; WX 500 ; N quotedblright ; B 51 446 449 709 ;\nC 187 ; WX 500 ; N guillemotright ; B 50 71 450 428 ;\nC 188 ; WX 1000 ; N ellipsis ; B 109 -5 891 111 ;\nC 189 ; WX 1144 ; N perthousand ; B 123 -20 1021 709 ;\nC 191 ; WX 444 ; N questiondown ; B 43 -231 395 469 ;\nC 193 ; WX 333 ; N grave ; B 31 506 255 677 ;\nC 194 ; WX 333 ; N acute ; B 78 506 302 677 ;\nC 195 ; WX 333 ; N circumflex ; B 11 510 323 677 ;\nC 196 ; WX 333 ; N tilde ; B 2 535 332 640 ;\nC 197 ; WX 333 ; N macron ; B 11 538 323 591 ;\nC 198 ; WX 333 ; N breve ; B 26 506 308 664 ;\nC 199 ; WX 250 ; N dotaccent ; B 75 537 175 637 ;\nC 200 ; WX 333 ; N dieresis ; B 17 537 316 637 ;\nC 202 ; WX 333 ; N ring ; B 67 496 267 696 ;\nC 203 ; WX 333 ; N cedilla ; B 96 -225 304 -10 ;\nC 205 ; WX 380 ; N hungarumlaut ; B 3 506 377 687 ;\nC 206 ; WX 313 ; N ogonek ; B 68 -165 245 -20 ;\nC 207 ; WX 333 ; N caron ; B 11 510 323 677 ;\nC 208 ; WX 1000 ; N emdash ; B 0 219 1000 277 ;\nC 225 ; WX 944 ; N AE ; B -10 -3 908 692 ;\nC 227 ; WX 333 ; N ordfeminine ; B 24 422 310 709 ;\nC 232 ; WX 611 ; N Lslash ; B 6 -3 586 692 ;\nC 233 ; WX 833 ; N Oslash ; B 30 -20 797 709 ;\nC 234 ; WX 998 ; N OE ; B 22 -20 962 709 ;\nC 235 ; WX 333 ; N ordmasculine ; B 10 416 323 709 ;\nC 241 ; WX 758 ; N ae ; B 30 -20 732 469 ;\nC 245 ; WX 287 ; N dotlessi ; B 21 -3 271 469 ;\nC 248 ; WX 291 ; N lslash ; B -14 -3 306 726 ;\nC 249 ; WX 556 ; N oslash ; B 16 -23 530 474 ;\nC 250 ; WX 827 ; N oe ; B 32 -20 800 469 ;\nC 251 ; WX 556 ; N germandbls ; B 23 -9 519 731 ;\nC -1 ; WX 667 ; N Zcaron ; B 15 -3 638 908 ;\nC -1 ; WX 444 ; N ccedilla ; B 26 -225 413 469 ;\nC -1 ; WX 556 ; N ydieresis ; B 12 -283 544 657 ;\nC -1 ; WX 500 ; N atilde ; B 32 -12 471 652 ;\nC -1 ; WX 287 ; N icircumflex ; B -12 -3 300 697 ;\nC -1 ; WX 300 ; N threesuperior ; B 1 266 299 689 ;\nC -1 ; WX 479 ; N ecircumflex ; B 26 -20 448 697 ;\nC -1 ; WX 601 ; N thorn ; B -2 -281 544 726 ;\nC -1 ; WX 479 ; N egrave ; B 26 -20 448 697 ;\nC -1 ; WX 300 ; N twosuperior ; B 0 273 301 689 ;\nC -1 ; WX 479 ; N eacute ; B 26 -20 448 697 ;\nC -1 ; WX 546 ; N otilde ; B 32 -20 514 652 ;\nC -1 ; WX 778 ; N Aacute ; B 15 -3 756 908 ;\nC -1 ; WX 546 ; N ocircumflex ; B 32 -20 514 697 ;\nC -1 ; WX 556 ; N yacute ; B 12 -283 544 697 ;\nC -1 ; WX 603 ; N udieresis ; B 18 -12 581 657 ;\nC -1 ; WX 750 ; N threequarters ; B 15 -3 735 689 ;\nC -1 ; WX 500 ; N acircumflex ; B 32 -12 471 697 ;\nC -1 ; WX 774 ; N Eth ; B 14 -3 751 692 ;\nC -1 ; WX 479 ; N edieresis ; B 26 -20 448 657 ;\nC -1 ; WX 603 ; N ugrave ; B 18 -12 581 697 ;\nC -1 ; WX 979 ; N trademark ; B 40 285 939 689 ;\nC -1 ; WX 546 ; N ograve ; B 32 -20 514 697 ;\nC -1 ; WX 424 ; N scaron ; B 30 -20 391 685 ;\nC -1 ; WX 337 ; N Idieresis ; B 19 -3 318 868 ;\nC -1 ; WX 603 ; N uacute ; B 18 -12 581 697 ;\nC -1 ; WX 500 ; N agrave ; B 32 -12 471 697 ;\nC -1 ; WX 582 ; N ntilde ; B 6 -3 572 652 ;\nC -1 ; WX 500 ; N aring ; B 32 -12 471 716 ;\nC -1 ; WX 500 ; N zcaron ; B 16 -3 466 685 ;\nC -1 ; WX 337 ; N Icircumflex ; B 13 -3 325 908 ;\nC -1 ; WX 831 ; N Ntilde ; B 17 -20 813 871 ;\nC -1 ; WX 603 ; N ucircumflex ; B 18 -12 581 697 ;\nC -1 ; WX 611 ; N Ecircumflex ; B 22 -3 572 908 ;\nC -1 ; WX 337 ; N Iacute ; B 22 -3 315 908 ;\nC -1 ; WX 709 ; N Ccedilla ; B 22 -225 670 709 ;\nC -1 ; WX 786 ; N Odieresis ; B 22 -20 764 868 ;\nC -1 ; WX 525 ; N Scaron ; B 24 -20 503 908 ;\nC -1 ; WX 611 ; N Edieresis ; B 22 -3 572 868 ;\nC -1 ; WX 337 ; N Igrave ; B 22 -3 315 908 ;\nC -1 ; WX 500 ; N adieresis ; B 32 -12 471 657 ;\nC -1 ; WX 786 ; N Ograve ; B 22 -20 764 908 ;\nC -1 ; WX 611 ; N Egrave ; B 22 -3 572 908 ;\nC -1 ; WX 667 ; N Ydieresis ; B 9 -3 654 868 ;\nC -1 ; WX 747 ; N registered ; B 11 -18 736 706 ;\nC -1 ; WX 786 ; N Otilde ; B 22 -20 764 883 ;\nC -1 ; WX 750 ; N onequarter ; B 30 -3 727 692 ;\nC -1 ; WX 778 ; N Ugrave ; B 12 -20 759 908 ;\nC -1 ; WX 778 ; N Ucircumflex ; B 12 -20 759 908 ;\nC -1 ; WX 604 ; N Thorn ; B 32 -3 574 692 ;\nC -1 ; WX 606 ; N divide ; B 51 10 555 512 ;\nC -1 ; WX 778 ; N Atilde ; B 15 -3 756 871 ;\nC -1 ; WX 778 ; N Uacute ; B 12 -20 759 908 ;\nC -1 ; WX 786 ; N Ocircumflex ; B 22 -20 764 908 ;\nC -1 ; WX 606 ; N logicalnot ; B 51 120 551 386 ;\nC -1 ; WX 778 ; N Aring ; B 15 -3 756 927 ;\nC -1 ; WX 287 ; N idieresis ; B -6 -3 293 657 ;\nC -1 ; WX 287 ; N iacute ; B 21 -3 279 697 ;\nC -1 ; WX 500 ; N aacute ; B 32 -12 471 697 ;\nC -1 ; WX 606 ; N plusminus ; B 51 0 555 512 ;\nC -1 ; WX 606 ; N multiply ; B 83 36 523 474 ;\nC -1 ; WX 778 ; N Udieresis ; B 12 -20 759 868 ;\nC -1 ; WX 606 ; N minus ; B 51 233 555 289 ;\nC -1 ; WX 300 ; N onesuperior ; B 31 273 269 692 ;\nC -1 ; WX 611 ; N Eacute ; B 22 -3 572 908 ;\nC -1 ; WX 778 ; N Acircumflex ; B 15 -3 756 908 ;\nC -1 ; WX 747 ; N copyright ; B 11 -18 736 706 ;\nC -1 ; WX 778 ; N Agrave ; B 15 -3 756 908 ;\nC -1 ; WX 546 ; N odieresis ; B 32 -20 514 657 ;\nC -1 ; WX 546 ; N oacute ; B 32 -20 514 697 ;\nC -1 ; WX 400 ; N degree ; B 50 389 350 689 ;\nC -1 ; WX 287 ; N igrave ; B 8 -3 271 697 ;\nC -1 ; WX 603 ; N mu ; B 18 -236 581 469 ;\nC -1 ; WX 786 ; N Oacute ; B 22 -20 764 908 ;\nC -1 ; WX 546 ; N eth ; B 32 -20 504 728 ;\nC -1 ; WX 778 ; N Adieresis ; B 15 -3 756 868 ;\nC -1 ; WX 667 ; N Yacute ; B 9 -3 654 908 ;\nC -1 ; WX 606 ; N brokenbar ; B 275 0 331 726 ;\nC -1 ; WX 750 ; N onehalf ; B 15 -3 735 692 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 111\n\nKPX A y -74\nKPX A w -74\nKPX A v -92\nKPX A space -55\nKPX A quoteright -74\nKPX A Y -111\nKPX A W -74\nKPX A V -111\nKPX A T -74\n\nKPX F period -92\nKPX F comma -92\nKPX F A -74\n\nKPX L y -55\nKPX L space -37\nKPX L quoteright -74\nKPX L Y -92\nKPX L W -74\nKPX L V -92\nKPX L T -74\n\nKPX P space -18\nKPX P period -129\nKPX P comma -129\nKPX P A -92\n\nKPX R y -37\nKPX R Y -37\nKPX R W -37\nKPX R V -55\nKPX R T -37\n\nKPX T y -90\nKPX T w -90\nKPX T u -90\nKPX T semicolon -55\nKPX T s -90\nKPX T r -90\nKPX T period -74\nKPX T o -92\nKPX T i -55\nKPX T hyphen -55\nKPX T e -92\nKPX T comma -74\nKPX T colon -55\nKPX T c -111\nKPX T a -92\nKPX T O -18\nKPX T A -74\n\nKPX V y -92\nKPX V u -92\nKPX V semicolon -55\nKPX V r -92\nKPX V period -129\nKPX V o -111\nKPX V i -55\nKPX V hyphen -74\nKPX V e -111\nKPX V comma -129\nKPX V colon -55\nKPX V a -92\nKPX V A -111\n\nKPX W y -50\nKPX W u -50\nKPX W semicolon -18\nKPX W r -74\nKPX W period -92\nKPX W o -92\nKPX W i -55\nKPX W hyphen -55\nKPX W e -92\nKPX W comma -92\nKPX W colon -18\nKPX W a -92\nKPX W A -92\n\nKPX Y v -90\nKPX Y u -90\nKPX Y space -18\nKPX Y semicolon -74\nKPX Y q -90\nKPX Y period -111\nKPX Y p -111\nKPX Y o -92\nKPX Y i -55\nKPX Y hyphen -92\nKPX Y e -92\nKPX Y comma -111\nKPX Y colon -74\nKPX Y a -92\nKPX Y A -92\n\nKPX f quoteright 55\nKPX f f -18\n\nKPX one one -55\n\nKPX quoteleft quoteleft -37\n\nKPX quoteright quoteright -37\n\nKPX r u -8\nKPX r quoteright 74\nKPX r q -18\nKPX r period -74\nKPX r o -18\nKPX r hyphen -18\nKPX r h -18\nKPX r g -18\nKPX r e -18\nKPX r d -18\nKPX r comma -74\nKPX r c -18\n\nKPX space Y -18\nKPX space A -37\n\nKPX v period -111\nKPX v comma -111\n\nKPX w period -92\nKPX w comma -92\n\nKPX y period -111\nKPX y comma -111\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 229 231 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 223 231 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 223 231 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 215 231 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 223 231 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 223 231 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 188 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 139 231 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 139 231 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 139 231 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 139 231 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 2 231 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 2 231 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 2 231 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 2 231 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 249 231 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 227 231 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 227 231 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 227 231 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 227 231 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 227 243 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 96 231 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 255 231 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 247 231 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 223 231 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 223 231 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 203 231 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 191 231 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 179 231 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 84 20 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 72 20 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 72 20 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 60 20 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 72 20 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 72 12 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 56 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 97 20 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 85 20 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 73 20 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 73 20 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -23 20 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -23 20 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -23 20 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -23 20 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 113 12 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 107 20 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 107 20 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 107 20 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 95 20 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 107 12 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 46 8 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 159 20 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 135 20 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 135 20 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 111 20 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 144 20 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 112 20 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 84 8 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pplri8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Mon Jul  2 22:37:33 1990\nComment UniqueID 31796\nComment VMusage 37415 48307\nFontName Palatino-Italic\nFullName Palatino Italic\nFamilyName Palatino\nWeight Medium\nItalicAngle -10\nIsFixedPitch false\nFontBBox -170 -276 1010 918\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.005\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.Palatino is a trademark of Linotype AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 692\nXHeight 482\nAscender 733\nDescender -276\nStartCharMetrics 228\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 76 -8 292 733 ;\nC 34 ; WX 500 ; N quotedbl ; B 140 508 455 733 ;\nC 35 ; WX 500 ; N numbersign ; B 4 0 495 692 ;\nC 36 ; WX 500 ; N dollar ; B 15 -113 452 733 ;\nC 37 ; WX 889 ; N percent ; B 74 -7 809 710 ;\nC 38 ; WX 778 ; N ampersand ; B 47 -18 766 692 ;\nC 39 ; WX 278 ; N quoteright ; B 78 488 258 733 ;\nC 40 ; WX 333 ; N parenleft ; B 54 -106 331 733 ;\nC 41 ; WX 333 ; N parenright ; B 2 -106 279 733 ;\nC 42 ; WX 389 ; N asterisk ; B 76 368 400 706 ;\nC 43 ; WX 606 ; N plus ; B 51 0 555 504 ;\nC 44 ; WX 250 ; N comma ; B 8 -143 203 123 ;\nC 45 ; WX 333 ; N hyphen ; B 19 223 304 281 ;\nC 46 ; WX 250 ; N period ; B 53 -5 158 112 ;\nC 47 ; WX 296 ; N slash ; B -40 -119 392 733 ;\nC 48 ; WX 500 ; N zero ; B 36 -11 480 699 ;\nC 49 ; WX 500 ; N one ; B 54 -3 398 699 ;\nC 50 ; WX 500 ; N two ; B 12 -3 437 699 ;\nC 51 ; WX 500 ; N three ; B 22 -11 447 699 ;\nC 52 ; WX 500 ; N four ; B 15 -3 478 699 ;\nC 53 ; WX 500 ; N five ; B 14 -11 491 693 ;\nC 54 ; WX 500 ; N six ; B 49 -11 469 699 ;\nC 55 ; WX 500 ; N seven ; B 53 -3 502 692 ;\nC 56 ; WX 500 ; N eight ; B 36 -11 469 699 ;\nC 57 ; WX 500 ; N nine ; B 32 -11 468 699 ;\nC 58 ; WX 250 ; N colon ; B 44 -5 207 458 ;\nC 59 ; WX 250 ; N semicolon ; B -9 -146 219 456 ;\nC 60 ; WX 606 ; N less ; B 53 -6 554 516 ;\nC 61 ; WX 606 ; N equal ; B 51 126 555 378 ;\nC 62 ; WX 606 ; N greater ; B 53 -6 554 516 ;\nC 63 ; WX 500 ; N question ; B 114 -8 427 706 ;\nC 64 ; WX 747 ; N at ; B 27 -18 718 706 ;\nC 65 ; WX 722 ; N A ; B -19 -3 677 705 ;\nC 66 ; WX 611 ; N B ; B 26 -6 559 692 ;\nC 67 ; WX 667 ; N C ; B 45 -18 651 706 ;\nC 68 ; WX 778 ; N D ; B 28 -3 741 692 ;\nC 69 ; WX 611 ; N E ; B 30 -3 570 692 ;\nC 70 ; WX 556 ; N F ; B 0 -3 548 692 ;\nC 71 ; WX 722 ; N G ; B 50 -18 694 706 ;\nC 72 ; WX 778 ; N H ; B -3 -3 800 692 ;\nC 73 ; WX 333 ; N I ; B 7 -3 354 692 ;\nC 74 ; WX 333 ; N J ; B -35 -206 358 692 ;\nC 75 ; WX 667 ; N K ; B 13 -3 683 692 ;\nC 76 ; WX 556 ; N L ; B 16 -3 523 692 ;\nC 77 ; WX 944 ; N M ; B -19 -18 940 692 ;\nC 78 ; WX 778 ; N N ; B 2 -11 804 692 ;\nC 79 ; WX 778 ; N O ; B 53 -18 748 706 ;\nC 80 ; WX 611 ; N P ; B 9 -3 594 692 ;\nC 81 ; WX 778 ; N Q ; B 53 -201 748 706 ;\nC 82 ; WX 667 ; N R ; B 9 -3 639 692 ;\nC 83 ; WX 556 ; N S ; B 42 -18 506 706 ;\nC 84 ; WX 611 ; N T ; B 53 -3 635 692 ;\nC 85 ; WX 778 ; N U ; B 88 -18 798 692 ;\nC 86 ; WX 722 ; N V ; B 75 -8 754 692 ;\nC 87 ; WX 944 ; N W ; B 71 -8 980 700 ;\nC 88 ; WX 722 ; N X ; B 20 -3 734 692 ;\nC 89 ; WX 667 ; N Y ; B 52 -3 675 705 ;\nC 90 ; WX 667 ; N Z ; B 20 -3 637 692 ;\nC 91 ; WX 333 ; N bracketleft ; B 18 -100 326 733 ;\nC 92 ; WX 606 ; N backslash ; B 81 0 513 733 ;\nC 93 ; WX 333 ; N bracketright ; B 7 -100 315 733 ;\nC 94 ; WX 606 ; N asciicircum ; B 51 283 554 689 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 278 ; N quoteleft ; B 78 488 258 733 ;\nC 97 ; WX 444 ; N a ; B 4 -11 406 482 ;\nC 98 ; WX 463 ; N b ; B 37 -11 433 733 ;\nC 99 ; WX 407 ; N c ; B 25 -11 389 482 ;\nC 100 ; WX 500 ; N d ; B 17 -11 483 733 ;\nC 101 ; WX 389 ; N e ; B 15 -11 374 482 ;\nC 102 ; WX 278 ; N f ; B -162 -276 413 733 ; L i fi ; L l fl ;\nC 103 ; WX 500 ; N g ; B -37 -276 498 482 ;\nC 104 ; WX 500 ; N h ; B 10 -9 471 733 ;\nC 105 ; WX 278 ; N i ; B 34 -9 264 712 ;\nC 106 ; WX 278 ; N j ; B -70 -276 265 712 ;\nC 107 ; WX 444 ; N k ; B 8 -9 449 733 ;\nC 108 ; WX 278 ; N l ; B 36 -9 251 733 ;\nC 109 ; WX 778 ; N m ; B 24 -9 740 482 ;\nC 110 ; WX 556 ; N n ; B 24 -9 514 482 ;\nC 111 ; WX 444 ; N o ; B 17 -11 411 482 ;\nC 112 ; WX 500 ; N p ; B -7 -276 465 482 ;\nC 113 ; WX 463 ; N q ; B 24 -276 432 482 ;\nC 114 ; WX 389 ; N r ; B 26 -9 384 482 ;\nC 115 ; WX 389 ; N s ; B 9 -11 345 482 ;\nC 116 ; WX 333 ; N t ; B 41 -9 310 646 ;\nC 117 ; WX 556 ; N u ; B 32 -11 512 482 ;\nC 118 ; WX 500 ; N v ; B 21 -11 477 482 ;\nC 119 ; WX 722 ; N w ; B 21 -11 699 482 ;\nC 120 ; WX 500 ; N x ; B 9 -11 484 482 ;\nC 121 ; WX 500 ; N y ; B -8 -276 490 482 ;\nC 122 ; WX 444 ; N z ; B -1 -11 416 482 ;\nC 123 ; WX 333 ; N braceleft ; B 15 -100 319 733 ;\nC 124 ; WX 606 ; N bar ; B 275 0 331 733 ;\nC 125 ; WX 333 ; N braceright ; B 14 -100 318 733 ;\nC 126 ; WX 606 ; N asciitilde ; B 51 168 555 339 ;\nC 161 ; WX 333 ; N exclamdown ; B 15 -276 233 467 ;\nC 162 ; WX 500 ; N cent ; B 56 -96 418 551 ;\nC 163 ; WX 500 ; N sterling ; B 2 -18 479 708 ;\nC 164 ; WX 167 ; N fraction ; B -170 0 337 699 ;\nC 165 ; WX 500 ; N yen ; B 35 -3 512 699 ;\nC 166 ; WX 500 ; N florin ; B 5 -276 470 708 ;\nC 167 ; WX 500 ; N section ; B 14 -220 463 706 ;\nC 168 ; WX 500 ; N currency ; B 14 115 486 577 ;\nC 169 ; WX 333 ; N quotesingle ; B 140 508 288 733 ;\nC 170 ; WX 500 ; N quotedblleft ; B 98 488 475 733 ;\nC 171 ; WX 500 ; N guillemotleft ; B 57 70 437 440 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 57 70 270 440 ;\nC 173 ; WX 333 ; N guilsinglright ; B 63 70 276 440 ;\nC 174 ; WX 528 ; N fi ; B -162 -276 502 733 ;\nC 175 ; WX 545 ; N fl ; B -162 -276 520 733 ;\nC 177 ; WX 500 ; N endash ; B -10 228 510 278 ;\nC 178 ; WX 500 ; N dagger ; B 48 0 469 692 ;\nC 179 ; WX 500 ; N daggerdbl ; B 10 -162 494 692 ;\nC 180 ; WX 250 ; N periodcentered ; B 53 195 158 312 ;\nC 182 ; WX 500 ; N paragraph ; B 33 -224 611 692 ;\nC 183 ; WX 500 ; N bullet ; B 86 182 430 526 ;\nC 184 ; WX 278 ; N quotesinglbase ; B 27 -122 211 120 ;\nC 185 ; WX 500 ; N quotedblbase ; B 43 -122 424 120 ;\nC 186 ; WX 500 ; N quotedblright ; B 98 488 475 733 ;\nC 187 ; WX 500 ; N guillemotright ; B 63 70 443 440 ;\nC 188 ; WX 1000 ; N ellipsis ; B 102 -5 873 112 ;\nC 189 ; WX 1000 ; N perthousand ; B 72 -6 929 717 ;\nC 191 ; WX 500 ; N questiondown ; B 57 -246 370 467 ;\nC 193 ; WX 333 ; N grave ; B 86 518 310 687 ;\nC 194 ; WX 333 ; N acute ; B 122 518 346 687 ;\nC 195 ; WX 333 ; N circumflex ; B 56 510 350 679 ;\nC 196 ; WX 333 ; N tilde ; B 63 535 390 638 ;\nC 197 ; WX 333 ; N macron ; B 74 538 386 589 ;\nC 198 ; WX 333 ; N breve ; B 92 518 393 677 ;\nC 199 ; WX 333 ; N dotaccent ; B 175 537 283 645 ;\nC 200 ; WX 333 ; N dieresis ; B 78 537 378 637 ;\nC 202 ; WX 333 ; N ring ; B 159 508 359 708 ;\nC 203 ; WX 333 ; N cedilla ; B -9 -216 202 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 46 518 385 730 ;\nC 206 ; WX 333 ; N ogonek ; B 38 -207 196 -18 ;\nC 207 ; WX 333 ; N caron ; B 104 510 409 679 ;\nC 208 ; WX 1000 ; N emdash ; B -10 228 1010 278 ;\nC 225 ; WX 941 ; N AE ; B -4 -3 902 692 ;\nC 227 ; WX 333 ; N ordfeminine ; B 60 404 321 699 ;\nC 232 ; WX 556 ; N Lslash ; B -16 -3 523 692 ;\nC 233 ; WX 778 ; N Oslash ; B 32 -39 762 721 ;\nC 234 ; WX 1028 ; N OE ; B 56 -18 989 706 ;\nC 235 ; WX 333 ; N ordmasculine ; B 66 404 322 699 ;\nC 241 ; WX 638 ; N ae ; B 1 -11 623 482 ;\nC 245 ; WX 278 ; N dotlessi ; B 34 -9 241 482 ;\nC 248 ; WX 278 ; N lslash ; B -10 -9 302 733 ;\nC 249 ; WX 444 ; N oslash ; B -18 -24 460 510 ;\nC 250 ; WX 669 ; N oe ; B 17 -11 654 482 ;\nC 251 ; WX 500 ; N germandbls ; B -160 -276 488 733 ;\nC -1 ; WX 667 ; N Zcaron ; B 20 -3 637 907 ;\nC -1 ; WX 407 ; N ccedilla ; B 25 -216 389 482 ;\nC -1 ; WX 500 ; N ydieresis ; B -8 -276 490 657 ;\nC -1 ; WX 444 ; N atilde ; B 4 -11 446 650 ;\nC -1 ; WX 278 ; N icircumflex ; B 29 -9 323 699 ;\nC -1 ; WX 300 ; N threesuperior ; B 28 273 304 699 ;\nC -1 ; WX 389 ; N ecircumflex ; B 15 -11 398 699 ;\nC -1 ; WX 500 ; N thorn ; B -39 -276 433 733 ;\nC -1 ; WX 389 ; N egrave ; B 15 -11 374 707 ;\nC -1 ; WX 300 ; N twosuperior ; B 13 278 290 699 ;\nC -1 ; WX 389 ; N eacute ; B 15 -11 394 707 ;\nC -1 ; WX 444 ; N otilde ; B 17 -11 446 650 ;\nC -1 ; WX 722 ; N Aacute ; B -19 -3 677 897 ;\nC -1 ; WX 444 ; N ocircumflex ; B 17 -11 411 699 ;\nC -1 ; WX 500 ; N yacute ; B -8 -276 490 707 ;\nC -1 ; WX 556 ; N udieresis ; B 32 -11 512 657 ;\nC -1 ; WX 750 ; N threequarters ; B 35 -2 715 699 ;\nC -1 ; WX 444 ; N acircumflex ; B 4 -11 406 699 ;\nC -1 ; WX 778 ; N Eth ; B 19 -3 741 692 ;\nC -1 ; WX 389 ; N edieresis ; B 15 -11 406 657 ;\nC -1 ; WX 556 ; N ugrave ; B 32 -11 512 707 ;\nC -1 ; WX 1000 ; N trademark ; B 52 285 951 689 ;\nC -1 ; WX 444 ; N ograve ; B 17 -11 411 707 ;\nC -1 ; WX 389 ; N scaron ; B 9 -11 419 687 ;\nC -1 ; WX 333 ; N Idieresis ; B 7 -3 418 847 ;\nC -1 ; WX 556 ; N uacute ; B 32 -11 512 707 ;\nC -1 ; WX 444 ; N agrave ; B 4 -11 406 707 ;\nC -1 ; WX 556 ; N ntilde ; B 24 -9 514 650 ;\nC -1 ; WX 444 ; N aring ; B 4 -11 406 728 ;\nC -1 ; WX 444 ; N zcaron ; B -1 -11 447 687 ;\nC -1 ; WX 333 ; N Icircumflex ; B 7 -3 390 889 ;\nC -1 ; WX 778 ; N Ntilde ; B 2 -11 804 866 ;\nC -1 ; WX 556 ; N ucircumflex ; B 32 -11 512 699 ;\nC -1 ; WX 611 ; N Ecircumflex ; B 30 -3 570 889 ;\nC -1 ; WX 333 ; N Iacute ; B 7 -3 406 897 ;\nC -1 ; WX 667 ; N Ccedilla ; B 45 -216 651 706 ;\nC -1 ; WX 778 ; N Odieresis ; B 53 -18 748 847 ;\nC -1 ; WX 556 ; N Scaron ; B 42 -18 539 907 ;\nC -1 ; WX 611 ; N Edieresis ; B 30 -3 570 847 ;\nC -1 ; WX 333 ; N Igrave ; B 7 -3 354 897 ;\nC -1 ; WX 444 ; N adieresis ; B 4 -11 434 657 ;\nC -1 ; WX 778 ; N Ograve ; B 53 -18 748 897 ;\nC -1 ; WX 611 ; N Egrave ; B 30 -3 570 897 ;\nC -1 ; WX 667 ; N Ydieresis ; B 52 -3 675 847 ;\nC -1 ; WX 747 ; N registered ; B 11 -18 736 706 ;\nC -1 ; WX 778 ; N Otilde ; B 53 -18 748 866 ;\nC -1 ; WX 750 ; N onequarter ; B 31 -2 715 699 ;\nC -1 ; WX 778 ; N Ugrave ; B 88 -18 798 897 ;\nC -1 ; WX 778 ; N Ucircumflex ; B 88 -18 798 889 ;\nC -1 ; WX 611 ; N Thorn ; B 9 -3 570 692 ;\nC -1 ; WX 606 ; N divide ; B 51 0 555 504 ;\nC -1 ; WX 722 ; N Atilde ; B -19 -3 677 866 ;\nC -1 ; WX 778 ; N Uacute ; B 88 -18 798 897 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 53 -18 748 889 ;\nC -1 ; WX 606 ; N logicalnot ; B 51 118 555 378 ;\nC -1 ; WX 722 ; N Aring ; B -19 -3 677 918 ;\nC -1 ; WX 278 ; N idieresis ; B 34 -9 351 657 ;\nC -1 ; WX 278 ; N iacute ; B 34 -9 331 707 ;\nC -1 ; WX 444 ; N aacute ; B 4 -11 414 707 ;\nC -1 ; WX 606 ; N plusminus ; B 51 0 555 504 ;\nC -1 ; WX 606 ; N multiply ; B 83 36 523 474 ;\nC -1 ; WX 778 ; N Udieresis ; B 88 -18 798 847 ;\nC -1 ; WX 606 ; N minus ; B 51 224 555 280 ;\nC -1 ; WX 300 ; N onesuperior ; B 61 278 285 699 ;\nC -1 ; WX 611 ; N Eacute ; B 30 -3 570 897 ;\nC -1 ; WX 722 ; N Acircumflex ; B -19 -3 677 889 ;\nC -1 ; WX 747 ; N copyright ; B 11 -18 736 706 ;\nC -1 ; WX 722 ; N Agrave ; B -19 -3 677 897 ;\nC -1 ; WX 444 ; N odieresis ; B 17 -11 434 657 ;\nC -1 ; WX 444 ; N oacute ; B 17 -11 414 707 ;\nC -1 ; WX 400 ; N degree ; B 90 389 390 689 ;\nC -1 ; WX 278 ; N igrave ; B 34 -9 271 707 ;\nC -1 ; WX 556 ; N mu ; B 15 -226 512 482 ;\nC -1 ; WX 778 ; N Oacute ; B 53 -18 748 897 ;\nC -1 ; WX 444 ; N eth ; B 17 -11 478 733 ;\nC -1 ; WX 722 ; N Adieresis ; B -19 -3 677 847 ;\nC -1 ; WX 667 ; N Yacute ; B 52 -3 675 897 ;\nC -1 ; WX 606 ; N brokenbar ; B 275 0 331 733 ;\nC -1 ; WX 750 ; N onehalf ; B 31 -2 721 699 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 106\n\nKPX A y -55\nKPX A w -37\nKPX A v -37\nKPX A space -37\nKPX A quoteright -55\nKPX A Y -55\nKPX A W -55\nKPX A V -74\nKPX A T -55\n\nKPX F period -111\nKPX F comma -111\nKPX F A -111\n\nKPX L y -37\nKPX L space -18\nKPX L quoteright -37\nKPX L Y -74\nKPX L W -74\nKPX L V -74\nKPX L T -74\n\nKPX P period -129\nKPX P comma -129\nKPX P A -129\n\nKPX R y -37\nKPX R Y -55\nKPX R W -55\nKPX R V -74\nKPX R T -55\n\nKPX T y -92\nKPX T w -92\nKPX T u -111\nKPX T semicolon -74\nKPX T s -111\nKPX T r -111\nKPX T period -74\nKPX T o -111\nKPX T i -55\nKPX T hyphen -55\nKPX T e -111\nKPX T comma -74\nKPX T colon -74\nKPX T c -111\nKPX T a -111\nKPX T O -18\nKPX T A -92\n\nKPX V y -74\nKPX V u -74\nKPX V semicolon -37\nKPX V r -92\nKPX V period -129\nKPX V o -74\nKPX V i -74\nKPX V hyphen -55\nKPX V e -92\nKPX V comma -129\nKPX V colon -37\nKPX V a -74\nKPX V A -210\n\nKPX W y -20\nKPX W u -20\nKPX W semicolon -18\nKPX W r -20\nKPX W period -55\nKPX W o -20\nKPX W i -20\nKPX W hyphen -18\nKPX W e -20\nKPX W comma -55\nKPX W colon -18\nKPX W a -20\nKPX W A -92\n\nKPX Y v -74\nKPX Y u -92\nKPX Y semicolon -74\nKPX Y q -92\nKPX Y period -92\nKPX Y p -74\nKPX Y o -111\nKPX Y i -55\nKPX Y hyphen -74\nKPX Y e -111\nKPX Y comma -92\nKPX Y colon -74\nKPX Y a -92\nKPX Y A -92\n\nKPX f quoteright 55\n\nKPX one one -55\n\nKPX quoteleft quoteleft -74\n\nKPX quoteright t -37\nKPX quoteright space -55\nKPX quoteright s -55\nKPX quoteright quoteright -74\n\nKPX r quoteright 37\nKPX r q -18\nKPX r period -74\nKPX r o -18\nKPX r h -18\nKPX r g -18\nKPX r e -18\nKPX r comma -74\nKPX r c -18\n\nKPX v period -55\nKPX v comma -55\n\nKPX w period -55\nKPX w comma -55\n\nKPX y period -37\nKPX y comma -37\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 271 210 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 261 210 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 255 210 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 235 210 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 235 210 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 255 228 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 207 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 199 210 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 179 210 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 179 210 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 167 210 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 60 210 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 40 210 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 40 210 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 28 210 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 263 228 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 283 210 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 263 210 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 255 210 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 251 210 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 263 228 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 130 228 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 277 210 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 255 210 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 235 210 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 235 210 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 227 210 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 187 210 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 179 228 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 68 20 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 56 20 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 56 20 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 44 20 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 36 20 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 56 12 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 37 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 48 20 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 48 20 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 28 20 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 16 20 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -15 20 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -27 20 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 20 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -39 20 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 112 12 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 68 20 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 56 20 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 56 20 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 36 20 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 56 12 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 10 8 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 124 20 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 112 20 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 112 20 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 100 20 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 96 20 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 84 20 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 38 8 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/psyr.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All rights reserved.\nComment Creation Date: Wed Jan 17 21:48:26 1990\nComment UniqueID 27004\nComment VMusage 28489 37622\nFontName Symbol\nFullName Symbol\nFamilyName Symbol\nWeight Medium\nItalicAngle 0\nIsFixedPitch false\nFontBBox -180 -293 1090 1010\nUnderlinePosition -98\nUnderlineThickness 54\nVersion 001.007\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All rights reserved.\nEncodingScheme FontSpecific\nStartCharMetrics 189\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 128 -17 240 672 ;\nC 34 ; WX 713 ; N universal ; B 31 0 681 705 ;\nC 35 ; WX 500 ; N numbersign ; B 20 -16 481 673 ;\nC 36 ; WX 549 ; N existential ; B 25 0 478 707 ;\nC 37 ; WX 833 ; N percent ; B 63 -36 771 655 ;\nC 38 ; WX 778 ; N ampersand ; B 41 -18 750 661 ;\nC 39 ; WX 439 ; N suchthat ; B 48 -17 414 500 ;\nC 40 ; WX 333 ; N parenleft ; B 53 -191 300 673 ;\nC 41 ; WX 333 ; N parenright ; B 30 -191 277 673 ;\nC 42 ; WX 500 ; N asteriskmath ; B 65 134 427 551 ;\nC 43 ; WX 549 ; N plus ; B 10 0 539 533 ;\nC 44 ; WX 250 ; N comma ; B 56 -152 194 104 ;\nC 45 ; WX 549 ; N minus ; B 11 233 535 288 ;\nC 46 ; WX 250 ; N period ; B 69 -17 181 95 ;\nC 47 ; WX 278 ; N slash ; B 0 -18 254 646 ;\nC 48 ; WX 500 ; N zero ; B 23 -17 471 685 ;\nC 49 ; WX 500 ; N one ; B 117 0 390 673 ;\nC 50 ; WX 500 ; N two ; B 25 0 475 686 ;\nC 51 ; WX 500 ; N three ; B 39 -17 435 685 ;\nC 52 ; WX 500 ; N four ; B 16 0 469 685 ;\nC 53 ; WX 500 ; N five ; B 29 -17 443 685 ;\nC 54 ; WX 500 ; N six ; B 36 -17 467 685 ;\nC 55 ; WX 500 ; N seven ; B 24 -16 448 673 ;\nC 56 ; WX 500 ; N eight ; B 54 -18 440 685 ;\nC 57 ; WX 500 ; N nine ; B 31 -18 460 685 ;\nC 58 ; WX 278 ; N colon ; B 81 -17 193 460 ;\nC 59 ; WX 278 ; N semicolon ; B 83 -152 221 460 ;\nC 60 ; WX 549 ; N less ; B 26 0 523 522 ;\nC 61 ; WX 549 ; N equal ; B 11 141 537 390 ;\nC 62 ; WX 549 ; N greater ; B 26 0 523 522 ;\nC 63 ; WX 444 ; N question ; B 70 -17 412 686 ;\nC 64 ; WX 549 ; N congruent ; B 11 0 537 475 ;\nC 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ;\nC 66 ; WX 667 ; N Beta ; B 29 0 592 673 ;\nC 67 ; WX 722 ; N Chi ; B -9 0 704 673 ;\nC 68 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ;\nC 70 ; WX 763 ; N Phi ; B 26 0 741 673 ;\nC 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ;\nC 72 ; WX 722 ; N Eta ; B 39 0 729 673 ;\nC 73 ; WX 333 ; N Iota ; B 32 0 316 673 ;\nC 74 ; WX 631 ; N theta1 ; B 18 -18 623 689 ;\nC 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ;\nC 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ;\nC 77 ; WX 889 ; N Mu ; B 28 0 887 673 ;\nC 78 ; WX 722 ; N Nu ; B 29 -8 720 673 ;\nC 79 ; WX 722 ; N Omicron ; B 41 -17 715 685 ;\nC 80 ; WX 768 ; N Pi ; B 25 0 745 673 ;\nC 81 ; WX 741 ; N Theta ; B 41 -17 715 685 ;\nC 82 ; WX 556 ; N Rho ; B 28 0 563 673 ;\nC 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ;\nC 84 ; WX 611 ; N Tau ; B 33 0 607 673 ;\nC 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ;\nC 86 ; WX 439 ; N sigma1 ; B 40 -233 436 500 ;\nC 87 ; WX 768 ; N Omega ; B 34 0 736 688 ;\nC 88 ; WX 645 ; N Xi ; B 40 0 599 673 ;\nC 89 ; WX 795 ; N Psi ; B 15 0 781 684 ;\nC 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ;\nC 91 ; WX 333 ; N bracketleft ; B 86 -155 299 674 ;\nC 92 ; WX 863 ; N therefore ; B 163 0 701 478 ;\nC 93 ; WX 333 ; N bracketright ; B 33 -155 246 674 ;\nC 94 ; WX 658 ; N perpendicular ; B 15 0 652 674 ;\nC 95 ; WX 500 ; N underscore ; B -2 -252 502 -206 ;\nC 96 ; WX 500 ; N radicalex ; B 480 881 1090 917 ;\nC 97 ; WX 631 ; N alpha ; B 41 -18 622 500 ;\nC 98 ; WX 549 ; N beta ; B 61 -223 515 741 ;\nC 99 ; WX 549 ; N chi ; B 12 -231 522 499 ;\nC 100 ; WX 494 ; N delta ; B 40 -19 481 740 ;\nC 101 ; WX 439 ; N epsilon ; B 22 -19 427 502 ;\nC 102 ; WX 521 ; N phi ; B 27 -224 490 671 ;\nC 103 ; WX 411 ; N gamma ; B 5 -225 484 499 ;\nC 104 ; WX 603 ; N eta ; B 0 -202 527 514 ;\nC 105 ; WX 329 ; N iota ; B 0 -17 301 503 ;\nC 106 ; WX 603 ; N phi1 ; B 36 -224 587 499 ;\nC 107 ; WX 549 ; N kappa ; B 33 0 558 501 ;\nC 108 ; WX 549 ; N lambda ; B 24 -17 548 739 ;\nC 109 ; WX 576 ; N mu ; B 33 -223 567 500 ;\nC 110 ; WX 521 ; N nu ; B -9 -16 475 507 ;\nC 111 ; WX 549 ; N omicron ; B 35 -19 501 499 ;\nC 112 ; WX 549 ; N pi ; B 10 -19 530 487 ;\nC 113 ; WX 521 ; N theta ; B 43 -17 485 690 ;\nC 114 ; WX 549 ; N rho ; B 50 -230 490 499 ;\nC 115 ; WX 603 ; N sigma ; B 30 -21 588 500 ;\nC 116 ; WX 439 ; N tau ; B 10 -19 418 500 ;\nC 117 ; WX 576 ; N upsilon ; B 7 -18 535 507 ;\nC 118 ; WX 713 ; N omega1 ; B 12 -18 671 583 ;\nC 119 ; WX 686 ; N omega ; B 42 -17 684 500 ;\nC 120 ; WX 493 ; N xi ; B 27 -224 469 766 ;\nC 121 ; WX 686 ; N psi ; B 12 -228 701 500 ;\nC 122 ; WX 494 ; N zeta ; B 60 -225 467 756 ;\nC 123 ; WX 480 ; N braceleft ; B 58 -183 397 673 ;\nC 124 ; WX 200 ; N bar ; B 65 -177 135 673 ;\nC 125 ; WX 480 ; N braceright ; B 79 -183 418 673 ;\nC 126 ; WX 549 ; N similar ; B 17 203 529 307 ;\nC 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 685 ;\nC 162 ; WX 247 ; N minute ; B 27 459 228 735 ;\nC 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ;\nC 164 ; WX 167 ; N fraction ; B -180 -12 340 677 ;\nC 165 ; WX 713 ; N infinity ; B 26 124 688 404 ;\nC 166 ; WX 500 ; N florin ; B 2 -193 494 686 ;\nC 167 ; WX 753 ; N club ; B 86 -26 660 533 ;\nC 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ;\nC 169 ; WX 753 ; N heart ; B 117 -33 631 532 ;\nC 170 ; WX 753 ; N spade ; B 113 -36 629 548 ;\nC 171 ; WX 1042 ; N arrowboth ; B 24 -15 1024 511 ;\nC 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ;\nC 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ;\nC 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ;\nC 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ;\nC 176 ; WX 400 ; N degree ; B 50 385 350 685 ;\nC 177 ; WX 549 ; N plusminus ; B 10 0 539 645 ;\nC 178 ; WX 411 ; N second ; B 20 459 413 737 ;\nC 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ;\nC 180 ; WX 549 ; N multiply ; B 17 8 533 524 ;\nC 181 ; WX 713 ; N proportional ; B 27 123 639 404 ;\nC 182 ; WX 494 ; N partialdiff ; B 26 -20 462 746 ;\nC 183 ; WX 460 ; N bullet ; B 50 113 410 473 ;\nC 184 ; WX 549 ; N divide ; B 10 71 536 456 ;\nC 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ;\nC 186 ; WX 549 ; N equivalence ; B 14 82 538 443 ;\nC 187 ; WX 549 ; N approxequal ; B 14 135 527 394 ;\nC 188 ; WX 1000 ; N ellipsis ; B 111 -17 889 95 ;\nC 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ;\nC 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ;\nC 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ;\nC 192 ; WX 823 ; N aleph ; B 175 -18 661 658 ;\nC 193 ; WX 686 ; N Ifraktur ; B 10 -53 578 740 ;\nC 194 ; WX 795 ; N Rfraktur ; B 26 -15 759 734 ;\nC 195 ; WX 987 ; N weierstrass ; B 159 -211 870 573 ;\nC 196 ; WX 768 ; N circlemultiply ; B 43 -17 733 673 ;\nC 197 ; WX 768 ; N circleplus ; B 43 -15 733 675 ;\nC 198 ; WX 823 ; N emptyset ; B 39 -24 781 719 ;\nC 199 ; WX 768 ; N intersection ; B 40 0 732 509 ;\nC 200 ; WX 768 ; N union ; B 40 -17 732 492 ;\nC 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ;\nC 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ;\nC 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ;\nC 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ;\nC 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ;\nC 206 ; WX 713 ; N element ; B 45 0 505 468 ;\nC 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ;\nC 208 ; WX 768 ; N angle ; B 26 0 738 673 ;\nC 209 ; WX 713 ; N gradient ; B 36 -19 681 718 ;\nC 210 ; WX 790 ; N registerserif ; B 50 -17 740 673 ;\nC 211 ; WX 790 ; N copyrightserif ; B 51 -15 741 675 ;\nC 212 ; WX 890 ; N trademarkserif ; B 18 293 855 673 ;\nC 213 ; WX 823 ; N product ; B 25 -101 803 751 ;\nC 214 ; WX 549 ; N radical ; B 10 -38 515 917 ;\nC 215 ; WX 250 ; N dotmath ; B 69 210 169 310 ;\nC 216 ; WX 713 ; N logicalnot ; B 15 0 680 288 ;\nC 217 ; WX 603 ; N logicaland ; B 23 0 583 454 ;\nC 218 ; WX 603 ; N logicalor ; B 30 0 578 477 ;\nC 219 ; WX 1042 ; N arrowdblboth ; B 27 -20 1023 510 ;\nC 220 ; WX 987 ; N arrowdblleft ; B 30 -15 939 513 ;\nC 221 ; WX 603 ; N arrowdblup ; B 39 2 567 911 ;\nC 222 ; WX 987 ; N arrowdblright ; B 45 -20 954 508 ;\nC 223 ; WX 603 ; N arrowdbldown ; B 44 -19 572 890 ;\nC 224 ; WX 494 ; N lozenge ; B 18 0 466 745 ;\nC 225 ; WX 329 ; N angleleft ; B 25 -198 306 746 ;\nC 226 ; WX 790 ; N registersans ; B 50 -20 740 670 ;\nC 227 ; WX 790 ; N copyrightsans ; B 49 -15 739 675 ;\nC 228 ; WX 786 ; N trademarksans ; B 5 293 725 673 ;\nC 229 ; WX 713 ; N summation ; B 14 -108 695 752 ;\nC 230 ; WX 384 ; N parenlefttp ; B 40 -293 436 926 ;\nC 231 ; WX 384 ; N parenleftex ; B 40 -85 92 925 ;\nC 232 ; WX 384 ; N parenleftbt ; B 40 -293 436 926 ;\nC 233 ; WX 384 ; N bracketlefttp ; B 0 -80 341 926 ;\nC 234 ; WX 384 ; N bracketleftex ; B 0 -79 55 925 ;\nC 235 ; WX 384 ; N bracketleftbt ; B 0 -80 340 926 ;\nC 236 ; WX 494 ; N bracelefttp ; B 201 -75 439 926 ;\nC 237 ; WX 494 ; N braceleftmid ; B 14 -85 255 935 ;\nC 238 ; WX 494 ; N braceleftbt ; B 201 -70 439 926 ;\nC 239 ; WX 494 ; N braceex ; B 201 -80 255 935 ;\nC 241 ; WX 329 ; N angleright ; B 21 -198 302 746 ;\nC 242 ; WX 274 ; N integral ; B 2 -107 291 916 ;\nC 243 ; WX 686 ; N integraltp ; B 332 -83 715 921 ;\nC 244 ; WX 686 ; N integralex ; B 332 -88 415 975 ;\nC 245 ; WX 686 ; N integralbt ; B 39 -81 415 921 ;\nC 246 ; WX 384 ; N parenrighttp ; B 54 -293 450 926 ;\nC 247 ; WX 384 ; N parenrightex ; B 398 -85 450 925 ;\nC 248 ; WX 384 ; N parenrightbt ; B 54 -293 450 926 ;\nC 249 ; WX 384 ; N bracketrighttp ; B 22 -80 360 926 ;\nC 250 ; WX 384 ; N bracketrightex ; B 305 -79 360 925 ;\nC 251 ; WX 384 ; N bracketrightbt ; B 20 -80 360 926 ;\nC 252 ; WX 494 ; N bracerighttp ; B 17 -75 255 926 ;\nC 253 ; WX 494 ; N bracerightmid ; B 201 -85 442 935 ;\nC 254 ; WX 494 ; N bracerightbt ; B 17 -70 255 926 ;\nC -1 ; WX 790 ; N apple ; B 56 -3 733 808 ;\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/ptmb8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Tue Mar 20 12:17:14 1990\nComment UniqueID 28417\nComment VMusage 30458 37350\nFontName Times-Bold\nFullName Times Bold\nFamilyName Times\nWeight Bold\nItalicAngle 0\nIsFixedPitch false\nFontBBox -168 -218 1000 935\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.007\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.Times is a trademark of Linotype AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 676\nXHeight 461\nAscender 676\nDescender -205\nStartCharMetrics 228\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ;\nC 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ;\nC 35 ; WX 500 ; N numbersign ; B 4 0 496 700 ;\nC 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ;\nC 37 ; WX 1000 ; N percent ; B 124 -14 877 692 ;\nC 38 ; WX 833 ; N ampersand ; B 62 -16 787 691 ;\nC 39 ; WX 333 ; N quoteright ; B 79 356 263 691 ;\nC 40 ; WX 333 ; N parenleft ; B 46 -168 306 694 ;\nC 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ;\nC 42 ; WX 500 ; N asterisk ; B 56 255 447 691 ;\nC 43 ; WX 570 ; N plus ; B 33 0 537 506 ;\nC 44 ; WX 250 ; N comma ; B 39 -180 223 155 ;\nC 45 ; WX 333 ; N hyphen ; B 44 171 287 287 ;\nC 46 ; WX 250 ; N period ; B 41 -13 210 156 ;\nC 47 ; WX 278 ; N slash ; B -24 -19 302 691 ;\nC 48 ; WX 500 ; N zero ; B 24 -13 476 688 ;\nC 49 ; WX 500 ; N one ; B 65 0 442 688 ;\nC 50 ; WX 500 ; N two ; B 17 0 478 688 ;\nC 51 ; WX 500 ; N three ; B 16 -14 468 688 ;\nC 52 ; WX 500 ; N four ; B 19 0 475 688 ;\nC 53 ; WX 500 ; N five ; B 22 -8 470 676 ;\nC 54 ; WX 500 ; N six ; B 28 -13 475 688 ;\nC 55 ; WX 500 ; N seven ; B 17 0 477 676 ;\nC 56 ; WX 500 ; N eight ; B 28 -13 472 688 ;\nC 57 ; WX 500 ; N nine ; B 26 -13 473 688 ;\nC 58 ; WX 333 ; N colon ; B 82 -13 251 472 ;\nC 59 ; WX 333 ; N semicolon ; B 82 -180 266 472 ;\nC 60 ; WX 570 ; N less ; B 31 -8 539 514 ;\nC 61 ; WX 570 ; N equal ; B 33 107 537 399 ;\nC 62 ; WX 570 ; N greater ; B 31 -8 539 514 ;\nC 63 ; WX 500 ; N question ; B 57 -13 445 689 ;\nC 64 ; WX 930 ; N at ; B 108 -19 822 691 ;\nC 65 ; WX 722 ; N A ; B 9 0 689 690 ;\nC 66 ; WX 667 ; N B ; B 16 0 619 676 ;\nC 67 ; WX 722 ; N C ; B 49 -19 687 691 ;\nC 68 ; WX 722 ; N D ; B 14 0 690 676 ;\nC 69 ; WX 667 ; N E ; B 16 0 641 676 ;\nC 70 ; WX 611 ; N F ; B 16 0 583 676 ;\nC 71 ; WX 778 ; N G ; B 37 -19 755 691 ;\nC 72 ; WX 778 ; N H ; B 21 0 759 676 ;\nC 73 ; WX 389 ; N I ; B 20 0 370 676 ;\nC 74 ; WX 500 ; N J ; B 3 -96 479 676 ;\nC 75 ; WX 778 ; N K ; B 30 0 769 676 ;\nC 76 ; WX 667 ; N L ; B 19 0 638 676 ;\nC 77 ; WX 944 ; N M ; B 14 0 921 676 ;\nC 78 ; WX 722 ; N N ; B 16 -18 701 676 ;\nC 79 ; WX 778 ; N O ; B 35 -19 743 691 ;\nC 80 ; WX 611 ; N P ; B 16 0 600 676 ;\nC 81 ; WX 778 ; N Q ; B 35 -176 743 691 ;\nC 82 ; WX 722 ; N R ; B 26 0 715 676 ;\nC 83 ; WX 556 ; N S ; B 35 -19 513 692 ;\nC 84 ; WX 667 ; N T ; B 31 0 636 676 ;\nC 85 ; WX 722 ; N U ; B 16 -19 701 676 ;\nC 86 ; WX 722 ; N V ; B 16 -18 701 676 ;\nC 87 ; WX 1000 ; N W ; B 19 -15 981 676 ;\nC 88 ; WX 722 ; N X ; B 16 0 699 676 ;\nC 89 ; WX 722 ; N Y ; B 15 0 699 676 ;\nC 90 ; WX 667 ; N Z ; B 28 0 634 676 ;\nC 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ;\nC 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ;\nC 93 ; WX 333 ; N bracketright ; B 32 -149 266 678 ;\nC 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333 ; N quoteleft ; B 70 356 254 691 ;\nC 97 ; WX 500 ; N a ; B 25 -14 488 473 ;\nC 98 ; WX 556 ; N b ; B 17 -14 521 676 ;\nC 99 ; WX 444 ; N c ; B 25 -14 430 473 ;\nC 100 ; WX 556 ; N d ; B 25 -14 534 676 ;\nC 101 ; WX 444 ; N e ; B 25 -14 426 473 ;\nC 102 ; WX 333 ; N f ; B 14 0 389 691 ; L i fi ; L l fl ;\nC 103 ; WX 500 ; N g ; B 28 -206 483 473 ;\nC 104 ; WX 556 ; N h ; B 16 0 534 676 ;\nC 105 ; WX 278 ; N i ; B 16 0 255 691 ;\nC 106 ; WX 333 ; N j ; B -57 -203 263 691 ;\nC 107 ; WX 556 ; N k ; B 22 0 543 676 ;\nC 108 ; WX 278 ; N l ; B 16 0 255 676 ;\nC 109 ; WX 833 ; N m ; B 16 0 814 473 ;\nC 110 ; WX 556 ; N n ; B 21 0 539 473 ;\nC 111 ; WX 500 ; N o ; B 25 -14 476 473 ;\nC 112 ; WX 556 ; N p ; B 19 -205 524 473 ;\nC 113 ; WX 556 ; N q ; B 34 -205 536 473 ;\nC 114 ; WX 444 ; N r ; B 29 0 434 473 ;\nC 115 ; WX 389 ; N s ; B 25 -14 361 473 ;\nC 116 ; WX 333 ; N t ; B 20 -12 332 630 ;\nC 117 ; WX 556 ; N u ; B 16 -14 537 461 ;\nC 118 ; WX 500 ; N v ; B 21 -14 485 461 ;\nC 119 ; WX 722 ; N w ; B 23 -14 707 461 ;\nC 120 ; WX 500 ; N x ; B 12 0 484 461 ;\nC 121 ; WX 500 ; N y ; B 16 -205 480 461 ;\nC 122 ; WX 444 ; N z ; B 21 0 420 461 ;\nC 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ;\nC 124 ; WX 220 ; N bar ; B 66 -19 154 691 ;\nC 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ;\nC 126 ; WX 520 ; N asciitilde ; B 29 173 491 333 ;\nC 161 ; WX 333 ; N exclamdown ; B 82 -203 252 501 ;\nC 162 ; WX 500 ; N cent ; B 53 -140 458 588 ;\nC 163 ; WX 500 ; N sterling ; B 21 -14 477 684 ;\nC 164 ; WX 167 ; N fraction ; B -168 -12 329 688 ;\nC 165 ; WX 500 ; N yen ; B -64 0 547 676 ;\nC 166 ; WX 500 ; N florin ; B 0 -155 498 706 ;\nC 167 ; WX 500 ; N section ; B 57 -132 443 691 ;\nC 168 ; WX 500 ; N currency ; B -26 61 526 613 ;\nC 169 ; WX 278 ; N quotesingle ; B 75 404 204 691 ;\nC 170 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ;\nC 171 ; WX 500 ; N guillemotleft ; B 23 36 473 415 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 51 36 305 415 ;\nC 173 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ;\nC 174 ; WX 556 ; N fi ; B 14 0 536 691 ;\nC 175 ; WX 556 ; N fl ; B 14 0 536 691 ;\nC 177 ; WX 500 ; N endash ; B 0 181 500 271 ;\nC 178 ; WX 500 ; N dagger ; B 47 -134 453 691 ;\nC 179 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ;\nC 180 ; WX 250 ; N periodcentered ; B 41 248 210 417 ;\nC 182 ; WX 540 ; N paragraph ; B 0 -186 519 676 ;\nC 183 ; WX 350 ; N bullet ; B 35 198 315 478 ;\nC 184 ; WX 333 ; N quotesinglbase ; B 79 -180 263 155 ;\nC 185 ; WX 500 ; N quotedblbase ; B 14 -180 468 155 ;\nC 186 ; WX 500 ; N quotedblright ; B 14 356 468 691 ;\nC 187 ; WX 500 ; N guillemotright ; B 27 36 477 415 ;\nC 188 ; WX 1000 ; N ellipsis ; B 82 -13 917 156 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ;\nC 191 ; WX 500 ; N questiondown ; B 55 -201 443 501 ;\nC 193 ; WX 333 ; N grave ; B 8 528 246 713 ;\nC 194 ; WX 333 ; N acute ; B 86 528 324 713 ;\nC 195 ; WX 333 ; N circumflex ; B -2 528 335 704 ;\nC 196 ; WX 333 ; N tilde ; B -16 547 349 674 ;\nC 197 ; WX 333 ; N macron ; B 1 565 331 637 ;\nC 198 ; WX 333 ; N breve ; B 15 528 318 691 ;\nC 199 ; WX 333 ; N dotaccent ; B 103 537 230 667 ;\nC 200 ; WX 333 ; N dieresis ; B -2 537 335 667 ;\nC 202 ; WX 333 ; N ring ; B 60 527 273 740 ;\nC 203 ; WX 333 ; N cedilla ; B 68 -218 294 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -13 528 425 713 ;\nC 206 ; WX 333 ; N ogonek ; B 90 -173 319 44 ;\nC 207 ; WX 333 ; N caron ; B -2 528 335 704 ;\nC 208 ; WX 1000 ; N emdash ; B 0 181 1000 271 ;\nC 225 ; WX 1000 ; N AE ; B 4 0 951 676 ;\nC 227 ; WX 300 ; N ordfeminine ; B -1 397 301 688 ;\nC 232 ; WX 667 ; N Lslash ; B 19 0 638 676 ;\nC 233 ; WX 778 ; N Oslash ; B 35 -74 743 737 ;\nC 234 ; WX 1000 ; N OE ; B 22 -5 981 684 ;\nC 235 ; WX 330 ; N ordmasculine ; B 18 397 312 688 ;\nC 241 ; WX 722 ; N ae ; B 33 -14 693 473 ;\nC 245 ; WX 278 ; N dotlessi ; B 16 0 255 461 ;\nC 248 ; WX 278 ; N lslash ; B -22 0 303 676 ;\nC 249 ; WX 500 ; N oslash ; B 25 -92 476 549 ;\nC 250 ; WX 722 ; N oe ; B 22 -14 696 473 ;\nC 251 ; WX 556 ; N germandbls ; B 19 -12 517 691 ;\nC -1 ; WX 667 ; N Zcaron ; B 28 0 634 914 ;\nC -1 ; WX 444 ; N ccedilla ; B 25 -218 430 473 ;\nC -1 ; WX 500 ; N ydieresis ; B 16 -205 480 667 ;\nC -1 ; WX 500 ; N atilde ; B 25 -14 488 674 ;\nC -1 ; WX 278 ; N icircumflex ; B -36 0 301 704 ;\nC -1 ; WX 300 ; N threesuperior ; B 3 268 297 688 ;\nC -1 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ;\nC -1 ; WX 556 ; N thorn ; B 19 -205 524 676 ;\nC -1 ; WX 444 ; N egrave ; B 25 -14 426 713 ;\nC -1 ; WX 300 ; N twosuperior ; B 0 275 300 688 ;\nC -1 ; WX 444 ; N eacute ; B 25 -14 426 713 ;\nC -1 ; WX 500 ; N otilde ; B 25 -14 476 674 ;\nC -1 ; WX 722 ; N Aacute ; B 9 0 689 923 ;\nC -1 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ;\nC -1 ; WX 500 ; N yacute ; B 16 -205 480 713 ;\nC -1 ; WX 556 ; N udieresis ; B 16 -14 537 667 ;\nC -1 ; WX 750 ; N threequarters ; B 23 -12 733 688 ;\nC -1 ; WX 500 ; N acircumflex ; B 25 -14 488 704 ;\nC -1 ; WX 722 ; N Eth ; B 6 0 690 676 ;\nC -1 ; WX 444 ; N edieresis ; B 25 -14 426 667 ;\nC -1 ; WX 556 ; N ugrave ; B 16 -14 537 713 ;\nC -1 ; WX 1000 ; N trademark ; B 24 271 977 676 ;\nC -1 ; WX 500 ; N ograve ; B 25 -14 476 713 ;\nC -1 ; WX 389 ; N scaron ; B 25 -14 363 704 ;\nC -1 ; WX 389 ; N Idieresis ; B 20 0 370 877 ;\nC -1 ; WX 556 ; N uacute ; B 16 -14 537 713 ;\nC -1 ; WX 500 ; N agrave ; B 25 -14 488 713 ;\nC -1 ; WX 556 ; N ntilde ; B 21 0 539 674 ;\nC -1 ; WX 500 ; N aring ; B 25 -14 488 740 ;\nC -1 ; WX 444 ; N zcaron ; B 21 0 420 704 ;\nC -1 ; WX 389 ; N Icircumflex ; B 20 0 370 914 ;\nC -1 ; WX 722 ; N Ntilde ; B 16 -18 701 884 ;\nC -1 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ;\nC -1 ; WX 389 ; N Iacute ; B 20 0 370 923 ;\nC -1 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ;\nC -1 ; WX 778 ; N Odieresis ; B 35 -19 743 877 ;\nC -1 ; WX 556 ; N Scaron ; B 35 -19 513 914 ;\nC -1 ; WX 667 ; N Edieresis ; B 16 0 641 877 ;\nC -1 ; WX 389 ; N Igrave ; B 20 0 370 923 ;\nC -1 ; WX 500 ; N adieresis ; B 25 -14 488 667 ;\nC -1 ; WX 778 ; N Ograve ; B 35 -19 743 923 ;\nC -1 ; WX 667 ; N Egrave ; B 16 0 641 923 ;\nC -1 ; WX 722 ; N Ydieresis ; B 15 0 699 877 ;\nC -1 ; WX 747 ; N registered ; B 26 -19 721 691 ;\nC -1 ; WX 778 ; N Otilde ; B 35 -19 743 884 ;\nC -1 ; WX 750 ; N onequarter ; B 28 -12 743 688 ;\nC -1 ; WX 722 ; N Ugrave ; B 16 -19 701 923 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 16 -19 701 914 ;\nC -1 ; WX 611 ; N Thorn ; B 16 0 600 676 ;\nC -1 ; WX 570 ; N divide ; B 33 -31 537 537 ;\nC -1 ; WX 722 ; N Atilde ; B 9 0 689 884 ;\nC -1 ; WX 722 ; N Uacute ; B 16 -19 701 923 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ;\nC -1 ; WX 570 ; N logicalnot ; B 33 108 537 399 ;\nC -1 ; WX 722 ; N Aring ; B 9 0 689 935 ;\nC -1 ; WX 278 ; N idieresis ; B -36 0 301 667 ;\nC -1 ; WX 278 ; N iacute ; B 16 0 290 713 ;\nC -1 ; WX 500 ; N aacute ; B 25 -14 488 713 ;\nC -1 ; WX 570 ; N plusminus ; B 33 0 537 506 ;\nC -1 ; WX 570 ; N multiply ; B 48 16 522 490 ;\nC -1 ; WX 722 ; N Udieresis ; B 16 -19 701 877 ;\nC -1 ; WX 570 ; N minus ; B 33 209 537 297 ;\nC -1 ; WX 300 ; N onesuperior ; B 28 275 273 688 ;\nC -1 ; WX 667 ; N Eacute ; B 16 0 641 923 ;\nC -1 ; WX 722 ; N Acircumflex ; B 9 0 689 914 ;\nC -1 ; WX 747 ; N copyright ; B 26 -19 721 691 ;\nC -1 ; WX 722 ; N Agrave ; B 9 0 689 923 ;\nC -1 ; WX 500 ; N odieresis ; B 25 -14 476 667 ;\nC -1 ; WX 500 ; N oacute ; B 25 -14 476 713 ;\nC -1 ; WX 400 ; N degree ; B 57 402 343 688 ;\nC -1 ; WX 278 ; N igrave ; B -26 0 255 713 ;\nC -1 ; WX 556 ; N mu ; B 33 -206 536 461 ;\nC -1 ; WX 778 ; N Oacute ; B 35 -19 743 923 ;\nC -1 ; WX 500 ; N eth ; B 25 -14 476 691 ;\nC -1 ; WX 722 ; N Adieresis ; B 9 0 689 877 ;\nC -1 ; WX 722 ; N Yacute ; B 15 0 699 928 ;\nC -1 ; WX 220 ; N brokenbar ; B 66 -19 154 691 ;\nC -1 ; WX 750 ; N onehalf ; B -7 -12 775 688 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 283\n\nKPX A y -74\nKPX A w -90\nKPX A v -100\nKPX A u -50\nKPX A quoteright -74\nKPX A quotedblright 0\nKPX A p -25\nKPX A Y -100\nKPX A W -130\nKPX A V -145\nKPX A U -50\nKPX A T -95\nKPX A Q -45\nKPX A O -45\nKPX A G -55\nKPX A C -55\n\nKPX B period 0\nKPX B comma 0\nKPX B U -10\nKPX B A -30\n\nKPX D period -20\nKPX D comma 0\nKPX D Y -40\nKPX D W -40\nKPX D V -40\nKPX D A -35\n\nKPX F r 0\nKPX F period -110\nKPX F o -25\nKPX F i 0\nKPX F e -25\nKPX F comma -92\nKPX F a -25\nKPX F A -90\n\nKPX G period 0\nKPX G comma 0\n\nKPX J u -15\nKPX J period -20\nKPX J o -15\nKPX J e -15\nKPX J comma 0\nKPX J a -15\nKPX J A -30\n\nKPX K y -45\nKPX K u -15\nKPX K o -25\nKPX K e -25\nKPX K O -30\n\nKPX L y -55\nKPX L quoteright -110\nKPX L quotedblright -20\nKPX L Y -92\nKPX L W -92\nKPX L V -92\nKPX L T -92\n\nKPX N period 0\nKPX N comma 0\nKPX N A -20\n\nKPX O period 0\nKPX O comma 0\nKPX O Y -50\nKPX O X -40\nKPX O W -50\nKPX O V -50\nKPX O T -40\nKPX O A -40\n\nKPX P period -110\nKPX P o -20\nKPX P e -20\nKPX P comma -92\nKPX P a -10\nKPX P A -74\n\nKPX Q period -20\nKPX Q comma 0\nKPX Q U -10\n\nKPX R Y -35\nKPX R W -35\nKPX R V -55\nKPX R U -30\nKPX R T -40\nKPX R O -30\n\nKPX S period 0\nKPX S comma 0\n\nKPX T y -74\nKPX T w -74\nKPX T u -92\nKPX T semicolon -74\nKPX T r -74\nKPX T period -90\nKPX T o -92\nKPX T i -18\nKPX T hyphen -92\nKPX T h 0\nKPX T e -92\nKPX T comma -74\nKPX T colon -74\nKPX T a -92\nKPX T O -18\nKPX T A -90\n\nKPX U period -50\nKPX U comma -50\nKPX U A -60\n\nKPX V u -92\nKPX V semicolon -92\nKPX V period -145\nKPX V o -100\nKPX V i -37\nKPX V hyphen -74\nKPX V e -100\nKPX V comma -129\nKPX V colon -92\nKPX V a -92\nKPX V O -45\nKPX V G -30\nKPX V A -135\n\nKPX W y -60\nKPX W u -50\nKPX W semicolon -55\nKPX W period -92\nKPX W o -75\nKPX W i -18\nKPX W hyphen -37\nKPX W h 0\nKPX W e -65\nKPX W comma -92\nKPX W colon -55\nKPX W a -65\nKPX W O -10\nKPX W A -120\n\nKPX Y u -92\nKPX Y semicolon -92\nKPX Y period -92\nKPX Y o -111\nKPX Y i -37\nKPX Y hyphen -92\nKPX Y e -111\nKPX Y comma -92\nKPX Y colon -92\nKPX Y a -85\nKPX Y O -35\nKPX Y A -110\n\nKPX a y 0\nKPX a w 0\nKPX a v -25\nKPX a t 0\nKPX a p 0\nKPX a g 0\nKPX a b 0\n\nKPX b y 0\nKPX b v -15\nKPX b u -20\nKPX b period -40\nKPX b l 0\nKPX b comma 0\nKPX b b -10\n\nKPX c y 0\nKPX c period 0\nKPX c l 0\nKPX c k 0\nKPX c h 0\nKPX c comma 0\n\nKPX colon space 0\n\nKPX comma space 0\nKPX comma quoteright -55\nKPX comma quotedblright -45\n\nKPX d y 0\nKPX d w -15\nKPX d v 0\nKPX d period 0\nKPX d d 0\nKPX d comma 0\n\nKPX e y 0\nKPX e x 0\nKPX e w 0\nKPX e v -15\nKPX e period 0\nKPX e p 0\nKPX e g 0\nKPX e comma 0\nKPX e b 0\n\nKPX f quoteright 55\nKPX f quotedblright 50\nKPX f period -15\nKPX f o -25\nKPX f l 0\nKPX f i -25\nKPX f f 0\nKPX f e 0\nKPX f dotlessi -35\nKPX f comma -15\nKPX f a 0\n\nKPX g y 0\nKPX g r 0\nKPX g period -15\nKPX g o 0\nKPX g i 0\nKPX g g 0\nKPX g e 0\nKPX g comma 0\nKPX g a 0\n\nKPX h y -15\n\nKPX i v -10\n\nKPX k y -15\nKPX k o -15\nKPX k e -10\n\nKPX l y 0\nKPX l w 0\n\nKPX m y 0\nKPX m u 0\n\nKPX n y 0\nKPX n v -40\nKPX n u 0\n\nKPX o y 0\nKPX o x 0\nKPX o w -10\nKPX o v -10\nKPX o g 0\n\nKPX p y 0\n\nKPX period quoteright -55\nKPX period quotedblright -55\n\nKPX quotedblleft quoteleft 0\nKPX quotedblleft A -10\n\nKPX quotedblright space 0\n\nKPX quoteleft quoteleft -63\nKPX quoteleft A -10\n\nKPX quoteright v -20\nKPX quoteright t 0\nKPX quoteright space -74\nKPX quoteright s -37\nKPX quoteright r -20\nKPX quoteright quoteright -63\nKPX quoteright quotedblright 0\nKPX quoteright l 0\nKPX quoteright d -20\n\nKPX r y 0\nKPX r v -10\nKPX r u 0\nKPX r t 0\nKPX r s 0\nKPX r r 0\nKPX r q -18\nKPX r period -100\nKPX r p -10\nKPX r o -18\nKPX r n -15\nKPX r m 0\nKPX r l 0\nKPX r k 0\nKPX r i 0\nKPX r hyphen -37\nKPX r g -10\nKPX r e -18\nKPX r d 0\nKPX r comma -92\nKPX r c -18\nKPX r a 0\n\nKPX s w 0\n\nKPX space quoteleft 0\nKPX space quotedblleft 0\nKPX space Y -55\nKPX space W -30\nKPX space V -45\nKPX space T -30\nKPX space A -55\n\nKPX v period -70\nKPX v o -10\nKPX v e -10\nKPX v comma -55\nKPX v a -10\n\nKPX w period -70\nKPX w o -10\nKPX w h 0\nKPX w e 0\nKPX w comma -55\nKPX w a 0\n\nKPX x e 0\n\nKPX y period -70\nKPX y o -25\nKPX y e -10\nKPX y comma -55\nKPX y a 0\n\nKPX z o 0\nKPX z e 0\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 188 210 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 188 210 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 188 210 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 188 210 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 180 195 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 188 210 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 208 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 174 210 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 174 210 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 174 210 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 174 210 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 28 210 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 28 210 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 28 210 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 28 210 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 195 210 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 223 210 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 223 210 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 223 210 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 223 210 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 223 210 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 112 210 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 222 210 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 222 210 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 222 210 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 222 210 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 210 215 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 215 210 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 167 210 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 77 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 77 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 77 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 77 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 77 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 77 0 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 69 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 62 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 62 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 62 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 62 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -34 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -34 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -34 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -34 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 112 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 84 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 84 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 84 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 84 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 84 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 28 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 105 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 105 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 105 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 105 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 84 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 84 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 56 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/ptmbi8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Tue Mar 20 13:14:55 1990\nComment UniqueID 28425\nComment VMusage 32721 39613\nFontName Times-BoldItalic\nFullName Times Bold Italic\nFamilyName Times\nWeight Bold\nItalicAngle -15\nIsFixedPitch false\nFontBBox -200 -218 996 921\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.009\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.Times is a trademark of Linotype AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 669\nXHeight 462\nAscender 699\nDescender -205\nStartCharMetrics 228\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 389 ; N exclam ; B 67 -13 370 684 ;\nC 34 ; WX 555 ; N quotedbl ; B 136 398 536 685 ;\nC 35 ; WX 500 ; N numbersign ; B -33 0 533 700 ;\nC 36 ; WX 500 ; N dollar ; B -20 -100 497 733 ;\nC 37 ; WX 833 ; N percent ; B 39 -10 793 692 ;\nC 38 ; WX 778 ; N ampersand ; B 5 -19 699 682 ;\nC 39 ; WX 333 ; N quoteright ; B 98 369 302 685 ;\nC 40 ; WX 333 ; N parenleft ; B 28 -179 344 685 ;\nC 41 ; WX 333 ; N parenright ; B -44 -179 271 685 ;\nC 42 ; WX 500 ; N asterisk ; B 65 249 456 685 ;\nC 43 ; WX 570 ; N plus ; B 33 0 537 506 ;\nC 44 ; WX 250 ; N comma ; B -60 -182 144 134 ;\nC 45 ; WX 333 ; N hyphen ; B 2 166 271 282 ;\nC 46 ; WX 250 ; N period ; B -9 -13 139 135 ;\nC 47 ; WX 278 ; N slash ; B -64 -18 342 685 ;\nC 48 ; WX 500 ; N zero ; B 17 -14 477 683 ;\nC 49 ; WX 500 ; N one ; B 5 0 419 683 ;\nC 50 ; WX 500 ; N two ; B -27 0 446 683 ;\nC 51 ; WX 500 ; N three ; B -15 -13 450 683 ;\nC 52 ; WX 500 ; N four ; B -15 0 503 683 ;\nC 53 ; WX 500 ; N five ; B -11 -13 487 669 ;\nC 54 ; WX 500 ; N six ; B 23 -15 509 679 ;\nC 55 ; WX 500 ; N seven ; B 52 0 525 669 ;\nC 56 ; WX 500 ; N eight ; B 3 -13 476 683 ;\nC 57 ; WX 500 ; N nine ; B -12 -10 475 683 ;\nC 58 ; WX 333 ; N colon ; B 23 -13 264 459 ;\nC 59 ; WX 333 ; N semicolon ; B -25 -183 264 459 ;\nC 60 ; WX 570 ; N less ; B 31 -8 539 514 ;\nC 61 ; WX 570 ; N equal ; B 33 107 537 399 ;\nC 62 ; WX 570 ; N greater ; B 31 -8 539 514 ;\nC 63 ; WX 500 ; N question ; B 79 -13 470 684 ;\nC 64 ; WX 832 ; N at ; B 63 -18 770 685 ;\nC 65 ; WX 667 ; N A ; B -67 0 593 683 ;\nC 66 ; WX 667 ; N B ; B -24 0 624 669 ;\nC 67 ; WX 667 ; N C ; B 32 -18 677 685 ;\nC 68 ; WX 722 ; N D ; B -46 0 685 669 ;\nC 69 ; WX 667 ; N E ; B -27 0 653 669 ;\nC 70 ; WX 667 ; N F ; B -13 0 660 669 ;\nC 71 ; WX 722 ; N G ; B 21 -18 706 685 ;\nC 72 ; WX 778 ; N H ; B -24 0 799 669 ;\nC 73 ; WX 389 ; N I ; B -32 0 406 669 ;\nC 74 ; WX 500 ; N J ; B -46 -99 524 669 ;\nC 75 ; WX 667 ; N K ; B -21 0 702 669 ;\nC 76 ; WX 611 ; N L ; B -22 0 590 669 ;\nC 77 ; WX 889 ; N M ; B -29 -12 917 669 ;\nC 78 ; WX 722 ; N N ; B -27 -15 748 669 ;\nC 79 ; WX 722 ; N O ; B 27 -18 691 685 ;\nC 80 ; WX 611 ; N P ; B -27 0 613 669 ;\nC 81 ; WX 722 ; N Q ; B 27 -208 691 685 ;\nC 82 ; WX 667 ; N R ; B -29 0 623 669 ;\nC 83 ; WX 556 ; N S ; B 2 -18 526 685 ;\nC 84 ; WX 611 ; N T ; B 50 0 650 669 ;\nC 85 ; WX 722 ; N U ; B 67 -18 744 669 ;\nC 86 ; WX 667 ; N V ; B 65 -18 715 669 ;\nC 87 ; WX 889 ; N W ; B 65 -18 940 669 ;\nC 88 ; WX 667 ; N X ; B -24 0 694 669 ;\nC 89 ; WX 611 ; N Y ; B 73 0 659 669 ;\nC 90 ; WX 611 ; N Z ; B -11 0 590 669 ;\nC 91 ; WX 333 ; N bracketleft ; B -37 -159 362 674 ;\nC 92 ; WX 278 ; N backslash ; B -1 -18 279 685 ;\nC 93 ; WX 333 ; N bracketright ; B -56 -157 343 674 ;\nC 94 ; WX 570 ; N asciicircum ; B 67 304 503 669 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333 ; N quoteleft ; B 128 369 332 685 ;\nC 97 ; WX 500 ; N a ; B -21 -14 455 462 ;\nC 98 ; WX 500 ; N b ; B -14 -13 444 699 ;\nC 99 ; WX 444 ; N c ; B -5 -13 392 462 ;\nC 100 ; WX 500 ; N d ; B -21 -13 517 699 ;\nC 101 ; WX 444 ; N e ; B 5 -13 398 462 ;\nC 102 ; WX 333 ; N f ; B -169 -205 446 698 ; L i fi ; L l fl ;\nC 103 ; WX 500 ; N g ; B -52 -203 478 462 ;\nC 104 ; WX 556 ; N h ; B -13 -9 498 699 ;\nC 105 ; WX 278 ; N i ; B 2 -9 263 684 ;\nC 106 ; WX 278 ; N j ; B -189 -207 279 684 ;\nC 107 ; WX 500 ; N k ; B -23 -8 483 699 ;\nC 108 ; WX 278 ; N l ; B 2 -9 290 699 ;\nC 109 ; WX 778 ; N m ; B -14 -9 722 462 ;\nC 110 ; WX 556 ; N n ; B -6 -9 493 462 ;\nC 111 ; WX 500 ; N o ; B -3 -13 441 462 ;\nC 112 ; WX 500 ; N p ; B -120 -205 446 462 ;\nC 113 ; WX 500 ; N q ; B 1 -205 471 462 ;\nC 114 ; WX 389 ; N r ; B -21 0 389 462 ;\nC 115 ; WX 389 ; N s ; B -19 -13 333 462 ;\nC 116 ; WX 278 ; N t ; B -11 -9 281 594 ;\nC 117 ; WX 556 ; N u ; B 15 -9 492 462 ;\nC 118 ; WX 444 ; N v ; B 16 -13 401 462 ;\nC 119 ; WX 667 ; N w ; B 16 -13 614 462 ;\nC 120 ; WX 500 ; N x ; B -46 -13 469 462 ;\nC 121 ; WX 444 ; N y ; B -94 -205 392 462 ;\nC 122 ; WX 389 ; N z ; B -43 -78 368 449 ;\nC 123 ; WX 348 ; N braceleft ; B 5 -187 436 686 ;\nC 124 ; WX 220 ; N bar ; B 66 -18 154 685 ;\nC 125 ; WX 348 ; N braceright ; B -129 -187 302 686 ;\nC 126 ; WX 570 ; N asciitilde ; B 54 173 516 333 ;\nC 161 ; WX 389 ; N exclamdown ; B 19 -205 322 492 ;\nC 162 ; WX 500 ; N cent ; B 42 -143 439 576 ;\nC 163 ; WX 500 ; N sterling ; B -32 -12 510 683 ;\nC 164 ; WX 167 ; N fraction ; B -169 -14 324 683 ;\nC 165 ; WX 500 ; N yen ; B 33 0 628 669 ;\nC 166 ; WX 500 ; N florin ; B -87 -156 537 707 ;\nC 167 ; WX 500 ; N section ; B 36 -143 459 685 ;\nC 168 ; WX 500 ; N currency ; B -26 34 526 586 ;\nC 169 ; WX 278 ; N quotesingle ; B 128 398 268 685 ;\nC 170 ; WX 500 ; N quotedblleft ; B 53 369 513 685 ;\nC 171 ; WX 500 ; N guillemotleft ; B 12 32 468 415 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 32 32 303 415 ;\nC 173 ; WX 333 ; N guilsinglright ; B 10 32 281 415 ;\nC 174 ; WX 556 ; N fi ; B -188 -205 514 703 ;\nC 175 ; WX 556 ; N fl ; B -186 -205 553 704 ;\nC 177 ; WX 500 ; N endash ; B -40 178 477 269 ;\nC 178 ; WX 500 ; N dagger ; B 91 -145 494 685 ;\nC 179 ; WX 500 ; N daggerdbl ; B 10 -139 493 685 ;\nC 180 ; WX 250 ; N periodcentered ; B 51 257 199 405 ;\nC 182 ; WX 500 ; N paragraph ; B -57 -193 562 669 ;\nC 183 ; WX 350 ; N bullet ; B 0 175 350 525 ;\nC 184 ; WX 333 ; N quotesinglbase ; B -5 -182 199 134 ;\nC 185 ; WX 500 ; N quotedblbase ; B -57 -182 403 134 ;\nC 186 ; WX 500 ; N quotedblright ; B 53 369 513 685 ;\nC 187 ; WX 500 ; N guillemotright ; B 12 32 468 415 ;\nC 188 ; WX 1000 ; N ellipsis ; B 40 -13 852 135 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -29 996 706 ;\nC 191 ; WX 500 ; N questiondown ; B 30 -205 421 492 ;\nC 193 ; WX 333 ; N grave ; B 85 516 297 697 ;\nC 194 ; WX 333 ; N acute ; B 139 516 379 697 ;\nC 195 ; WX 333 ; N circumflex ; B 40 516 367 690 ;\nC 196 ; WX 333 ; N tilde ; B 48 536 407 655 ;\nC 197 ; WX 333 ; N macron ; B 51 553 393 623 ;\nC 198 ; WX 333 ; N breve ; B 71 516 387 678 ;\nC 199 ; WX 333 ; N dotaccent ; B 163 525 293 655 ;\nC 200 ; WX 333 ; N dieresis ; B 55 525 397 655 ;\nC 202 ; WX 333 ; N ring ; B 127 516 340 729 ;\nC 203 ; WX 333 ; N cedilla ; B -80 -218 156 5 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 69 516 498 697 ;\nC 206 ; WX 333 ; N ogonek ; B -40 -173 189 44 ;\nC 207 ; WX 333 ; N caron ; B 79 516 411 690 ;\nC 208 ; WX 1000 ; N emdash ; B -40 178 977 269 ;\nC 225 ; WX 944 ; N AE ; B -64 0 918 669 ;\nC 227 ; WX 266 ; N ordfeminine ; B 16 399 330 685 ;\nC 232 ; WX 611 ; N Lslash ; B -22 0 590 669 ;\nC 233 ; WX 722 ; N Oslash ; B 27 -125 691 764 ;\nC 234 ; WX 944 ; N OE ; B 23 -8 946 677 ;\nC 235 ; WX 300 ; N ordmasculine ; B 56 400 347 685 ;\nC 241 ; WX 722 ; N ae ; B -5 -13 673 462 ;\nC 245 ; WX 278 ; N dotlessi ; B 2 -9 238 462 ;\nC 248 ; WX 278 ; N lslash ; B -13 -9 301 699 ;\nC 249 ; WX 500 ; N oslash ; B -3 -119 441 560 ;\nC 250 ; WX 722 ; N oe ; B 6 -13 674 462 ;\nC 251 ; WX 500 ; N germandbls ; B -200 -200 473 705 ;\nC -1 ; WX 611 ; N Zcaron ; B -11 0 590 897 ;\nC -1 ; WX 444 ; N ccedilla ; B -24 -218 392 462 ;\nC -1 ; WX 444 ; N ydieresis ; B -94 -205 438 655 ;\nC -1 ; WX 500 ; N atilde ; B -21 -14 491 655 ;\nC -1 ; WX 278 ; N icircumflex ; B -2 -9 325 690 ;\nC -1 ; WX 300 ; N threesuperior ; B 17 265 321 683 ;\nC -1 ; WX 444 ; N ecircumflex ; B 5 -13 423 690 ;\nC -1 ; WX 500 ; N thorn ; B -120 -205 446 699 ;\nC -1 ; WX 444 ; N egrave ; B 5 -13 398 697 ;\nC -1 ; WX 300 ; N twosuperior ; B 2 274 313 683 ;\nC -1 ; WX 444 ; N eacute ; B 5 -13 435 697 ;\nC -1 ; WX 500 ; N otilde ; B -3 -13 491 655 ;\nC -1 ; WX 667 ; N Aacute ; B -67 0 593 904 ;\nC -1 ; WX 500 ; N ocircumflex ; B -3 -13 451 690 ;\nC -1 ; WX 444 ; N yacute ; B -94 -205 435 697 ;\nC -1 ; WX 556 ; N udieresis ; B 15 -9 494 655 ;\nC -1 ; WX 750 ; N threequarters ; B 7 -14 726 683 ;\nC -1 ; WX 500 ; N acircumflex ; B -21 -14 455 690 ;\nC -1 ; WX 722 ; N Eth ; B -31 0 700 669 ;\nC -1 ; WX 444 ; N edieresis ; B 5 -13 443 655 ;\nC -1 ; WX 556 ; N ugrave ; B 15 -9 492 697 ;\nC -1 ; WX 1000 ; N trademark ; B 32 263 968 669 ;\nC -1 ; WX 500 ; N ograve ; B -3 -13 441 697 ;\nC -1 ; WX 389 ; N scaron ; B -19 -13 439 690 ;\nC -1 ; WX 389 ; N Idieresis ; B -32 0 445 862 ;\nC -1 ; WX 556 ; N uacute ; B 15 -9 492 697 ;\nC -1 ; WX 500 ; N agrave ; B -21 -14 455 697 ;\nC -1 ; WX 556 ; N ntilde ; B -6 -9 504 655 ;\nC -1 ; WX 500 ; N aring ; B -21 -14 455 729 ;\nC -1 ; WX 389 ; N zcaron ; B -43 -78 424 690 ;\nC -1 ; WX 389 ; N Icircumflex ; B -32 0 420 897 ;\nC -1 ; WX 722 ; N Ntilde ; B -27 -15 748 862 ;\nC -1 ; WX 556 ; N ucircumflex ; B 15 -9 492 690 ;\nC -1 ; WX 667 ; N Ecircumflex ; B -27 0 653 897 ;\nC -1 ; WX 389 ; N Iacute ; B -32 0 412 904 ;\nC -1 ; WX 667 ; N Ccedilla ; B 32 -218 677 685 ;\nC -1 ; WX 722 ; N Odieresis ; B 27 -18 691 862 ;\nC -1 ; WX 556 ; N Scaron ; B 2 -18 526 897 ;\nC -1 ; WX 667 ; N Edieresis ; B -27 0 653 862 ;\nC -1 ; WX 389 ; N Igrave ; B -32 0 406 904 ;\nC -1 ; WX 500 ; N adieresis ; B -21 -14 471 655 ;\nC -1 ; WX 722 ; N Ograve ; B 27 -18 691 904 ;\nC -1 ; WX 667 ; N Egrave ; B -27 0 653 904 ;\nC -1 ; WX 611 ; N Ydieresis ; B 73 0 659 862 ;\nC -1 ; WX 747 ; N registered ; B 30 -18 718 685 ;\nC -1 ; WX 722 ; N Otilde ; B 27 -18 691 862 ;\nC -1 ; WX 750 ; N onequarter ; B 7 -14 721 683 ;\nC -1 ; WX 722 ; N Ugrave ; B 67 -18 744 904 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 67 -18 744 897 ;\nC -1 ; WX 611 ; N Thorn ; B -27 0 573 669 ;\nC -1 ; WX 570 ; N divide ; B 33 -29 537 535 ;\nC -1 ; WX 667 ; N Atilde ; B -67 0 593 862 ;\nC -1 ; WX 722 ; N Uacute ; B 67 -18 744 904 ;\nC -1 ; WX 722 ; N Ocircumflex ; B 27 -18 691 897 ;\nC -1 ; WX 606 ; N logicalnot ; B 51 108 555 399 ;\nC -1 ; WX 667 ; N Aring ; B -67 0 593 921 ;\nC -1 ; WX 278 ; N idieresis ; B 2 -9 360 655 ;\nC -1 ; WX 278 ; N iacute ; B 2 -9 352 697 ;\nC -1 ; WX 500 ; N aacute ; B -21 -14 463 697 ;\nC -1 ; WX 570 ; N plusminus ; B 33 0 537 506 ;\nC -1 ; WX 570 ; N multiply ; B 48 16 522 490 ;\nC -1 ; WX 722 ; N Udieresis ; B 67 -18 744 862 ;\nC -1 ; WX 606 ; N minus ; B 51 209 555 297 ;\nC -1 ; WX 300 ; N onesuperior ; B 30 274 301 683 ;\nC -1 ; WX 667 ; N Eacute ; B -27 0 653 904 ;\nC -1 ; WX 667 ; N Acircumflex ; B -67 0 593 897 ;\nC -1 ; WX 747 ; N copyright ; B 30 -18 718 685 ;\nC -1 ; WX 667 ; N Agrave ; B -67 0 593 904 ;\nC -1 ; WX 500 ; N odieresis ; B -3 -13 466 655 ;\nC -1 ; WX 500 ; N oacute ; B -3 -13 463 697 ;\nC -1 ; WX 400 ; N degree ; B 83 397 369 683 ;\nC -1 ; WX 278 ; N igrave ; B 2 -9 260 697 ;\nC -1 ; WX 576 ; N mu ; B -60 -207 516 449 ;\nC -1 ; WX 722 ; N Oacute ; B 27 -18 691 904 ;\nC -1 ; WX 500 ; N eth ; B -3 -13 454 699 ;\nC -1 ; WX 667 ; N Adieresis ; B -67 0 593 862 ;\nC -1 ; WX 611 ; N Yacute ; B 73 0 659 904 ;\nC -1 ; WX 220 ; N brokenbar ; B 66 -18 154 685 ;\nC -1 ; WX 750 ; N onehalf ; B -9 -14 723 683 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 283\n\nKPX A y -74\nKPX A w -74\nKPX A v -74\nKPX A u -30\nKPX A quoteright -74\nKPX A quotedblright 0\nKPX A p 0\nKPX A Y -70\nKPX A W -100\nKPX A V -95\nKPX A U -50\nKPX A T -55\nKPX A Q -55\nKPX A O -50\nKPX A G -60\nKPX A C -65\n\nKPX B period 0\nKPX B comma 0\nKPX B U -10\nKPX B A -25\n\nKPX D period 0\nKPX D comma 0\nKPX D Y -50\nKPX D W -40\nKPX D V -50\nKPX D A -25\n\nKPX F r -50\nKPX F period -129\nKPX F o -70\nKPX F i -40\nKPX F e -100\nKPX F comma -129\nKPX F a -95\nKPX F A -100\n\nKPX G period 0\nKPX G comma 0\n\nKPX J u -40\nKPX J period -10\nKPX J o -40\nKPX J e -40\nKPX J comma -10\nKPX J a -40\nKPX J A -25\n\nKPX K y -20\nKPX K u -20\nKPX K o -25\nKPX K e -25\nKPX K O -30\n\nKPX L y -37\nKPX L quoteright -55\nKPX L quotedblright 0\nKPX L Y -37\nKPX L W -37\nKPX L V -37\nKPX L T -18\n\nKPX N period 0\nKPX N comma 0\nKPX N A -30\n\nKPX O period 0\nKPX O comma 0\nKPX O Y -50\nKPX O X -40\nKPX O W -50\nKPX O V -50\nKPX O T -40\nKPX O A -40\n\nKPX P period -129\nKPX P o -55\nKPX P e -50\nKPX P comma -129\nKPX P a -40\nKPX P A -85\n\nKPX Q period 0\nKPX Q comma 0\nKPX Q U -10\n\nKPX R Y -18\nKPX R W -18\nKPX R V -18\nKPX R U -40\nKPX R T -30\nKPX R O -40\n\nKPX S period 0\nKPX S comma 0\n\nKPX T y -37\nKPX T w -37\nKPX T u -37\nKPX T semicolon -74\nKPX T r -37\nKPX T period -92\nKPX T o -95\nKPX T i -37\nKPX T hyphen -92\nKPX T h 0\nKPX T e -92\nKPX T comma -92\nKPX T colon -74\nKPX T a -92\nKPX T O -18\nKPX T A -55\n\nKPX U period 0\nKPX U comma 0\nKPX U A -45\n\nKPX V u -55\nKPX V semicolon -74\nKPX V period -129\nKPX V o -111\nKPX V i -55\nKPX V hyphen -70\nKPX V e -111\nKPX V comma -129\nKPX V colon -74\nKPX V a -111\nKPX V O -30\nKPX V G -10\nKPX V A -85\n\nKPX W y -55\nKPX W u -55\nKPX W semicolon -55\nKPX W period -74\nKPX W o -80\nKPX W i -37\nKPX W hyphen -50\nKPX W h 0\nKPX W e -90\nKPX W comma -74\nKPX W colon -55\nKPX W a -85\nKPX W O -15\nKPX W A -74\n\nKPX Y u -92\nKPX Y semicolon -92\nKPX Y period -74\nKPX Y o -111\nKPX Y i -55\nKPX Y hyphen -92\nKPX Y e -111\nKPX Y comma -92\nKPX Y colon -92\nKPX Y a -92\nKPX Y O -25\nKPX Y A -74\n\nKPX a y 0\nKPX a w 0\nKPX a v 0\nKPX a t 0\nKPX a p 0\nKPX a g 0\nKPX a b 0\n\nKPX b y 0\nKPX b v 0\nKPX b u -20\nKPX b period -40\nKPX b l 0\nKPX b comma 0\nKPX b b -10\n\nKPX c y 0\nKPX c period 0\nKPX c l 0\nKPX c k -10\nKPX c h -10\nKPX c comma 0\n\nKPX colon space 0\n\nKPX comma space 0\nKPX comma quoteright -95\nKPX comma quotedblright -95\n\nKPX d y 0\nKPX d w 0\nKPX d v 0\nKPX d period 0\nKPX d d 0\nKPX d comma 0\n\nKPX e y 0\nKPX e x 0\nKPX e w 0\nKPX e v 0\nKPX e period 0\nKPX e p 0\nKPX e g 0\nKPX e comma 0\nKPX e b -10\n\nKPX f quoteright 55\nKPX f quotedblright 0\nKPX f period -10\nKPX f o -10\nKPX f l 0\nKPX f i 0\nKPX f f -18\nKPX f e -10\nKPX f dotlessi -30\nKPX f comma -10\nKPX f a 0\n\nKPX g y 0\nKPX g r 0\nKPX g period 0\nKPX g o 0\nKPX g i 0\nKPX g g 0\nKPX g e 0\nKPX g comma 0\nKPX g a 0\n\nKPX h y 0\n\nKPX i v 0\n\nKPX k y 0\nKPX k o -10\nKPX k e -30\n\nKPX l y 0\nKPX l w 0\n\nKPX m y 0\nKPX m u 0\n\nKPX n y 0\nKPX n v -40\nKPX n u 0\n\nKPX o y -10\nKPX o x -10\nKPX o w -25\nKPX o v -15\nKPX o g 0\n\nKPX p y 0\n\nKPX period quoteright -95\nKPX period quotedblright -95\n\nKPX quotedblleft quoteleft 0\nKPX quotedblleft A 0\n\nKPX quotedblright space 0\n\nKPX quoteleft quoteleft -74\nKPX quoteleft A 0\n\nKPX quoteright v -15\nKPX quoteright t -37\nKPX quoteright space -74\nKPX quoteright s -74\nKPX quoteright r -15\nKPX quoteright quoteright -74\nKPX quoteright quotedblright 0\nKPX quoteright l 0\nKPX quoteright d -15\n\nKPX r y 0\nKPX r v 0\nKPX r u 0\nKPX r t 0\nKPX r s 0\nKPX r r 0\nKPX r q 0\nKPX r period -65\nKPX r p 0\nKPX r o 0\nKPX r n 0\nKPX r m 0\nKPX r l 0\nKPX r k 0\nKPX r i 0\nKPX r hyphen 0\nKPX r g 0\nKPX r e 0\nKPX r d 0\nKPX r comma -65\nKPX r c 0\nKPX r a 0\n\nKPX s w 0\n\nKPX space quoteleft 0\nKPX space quotedblleft 0\nKPX space Y -70\nKPX space W -70\nKPX space V -70\nKPX space T 0\nKPX space A -37\n\nKPX v period -37\nKPX v o -15\nKPX v e -15\nKPX v comma -37\nKPX v a 0\n\nKPX w period -37\nKPX w o -15\nKPX w h 0\nKPX w e -10\nKPX w comma -37\nKPX w a -10\n\nKPX x e -10\n\nKPX y period -37\nKPX y o 0\nKPX y e 0\nKPX y comma -37\nKPX y a 0\n\nKPX z o 0\nKPX z e 0\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 172 207 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 187 207 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 167 207 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 172 207 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 157 192 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 167 207 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 167 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 172 207 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 187 207 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 187 207 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 172 207 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 33 207 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 53 207 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 48 207 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 33 207 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 210 207 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 200 207 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 230 207 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 215 207 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 200 207 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 215 207 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 112 207 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 210 207 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 230 207 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 230 207 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 200 207 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 154 207 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 169 207 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 139 207 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 84 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 84 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 74 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 74 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 84 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 84 0 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 56 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 56 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 56 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 46 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 46 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -42 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -37 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -37 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 97 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 84 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 84 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 69 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 74 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 84 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 28 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 112 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 112 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 97 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 102 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 56 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 41 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 13 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/ptmr8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Tue Mar 20 12:15:44 1990\nComment UniqueID 28416\nComment VMusage 30487 37379\nFontName Times-Roman\nFullName Times Roman\nFamilyName Times\nWeight Roman\nItalicAngle 0\nIsFixedPitch false\nFontBBox -168 -218 1000 898\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.007\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.Times is a trademark of Linotype AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 662\nXHeight 450\nAscender 683\nDescender -217\nStartCharMetrics 228\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 130 -9 238 676 ;\nC 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ;\nC 35 ; WX 500 ; N numbersign ; B 5 0 496 662 ;\nC 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ;\nC 37 ; WX 833 ; N percent ; B 61 -13 772 676 ;\nC 38 ; WX 778 ; N ampersand ; B 42 -13 750 676 ;\nC 39 ; WX 333 ; N quoteright ; B 79 433 218 676 ;\nC 40 ; WX 333 ; N parenleft ; B 48 -177 304 676 ;\nC 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ;\nC 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ;\nC 43 ; WX 564 ; N plus ; B 30 0 534 506 ;\nC 44 ; WX 250 ; N comma ; B 56 -141 195 102 ;\nC 45 ; WX 333 ; N hyphen ; B 39 194 285 257 ;\nC 46 ; WX 250 ; N period ; B 70 -11 181 100 ;\nC 47 ; WX 278 ; N slash ; B -9 -14 287 676 ;\nC 48 ; WX 500 ; N zero ; B 24 -14 476 676 ;\nC 49 ; WX 500 ; N one ; B 111 0 394 676 ;\nC 50 ; WX 500 ; N two ; B 30 0 475 676 ;\nC 51 ; WX 500 ; N three ; B 43 -14 431 676 ;\nC 52 ; WX 500 ; N four ; B 12 0 472 676 ;\nC 53 ; WX 500 ; N five ; B 32 -14 438 688 ;\nC 54 ; WX 500 ; N six ; B 34 -14 468 684 ;\nC 55 ; WX 500 ; N seven ; B 20 -8 449 662 ;\nC 56 ; WX 500 ; N eight ; B 56 -14 445 676 ;\nC 57 ; WX 500 ; N nine ; B 30 -22 459 676 ;\nC 58 ; WX 278 ; N colon ; B 81 -11 192 459 ;\nC 59 ; WX 278 ; N semicolon ; B 80 -141 219 459 ;\nC 60 ; WX 564 ; N less ; B 28 -8 536 514 ;\nC 61 ; WX 564 ; N equal ; B 30 120 534 386 ;\nC 62 ; WX 564 ; N greater ; B 28 -8 536 514 ;\nC 63 ; WX 444 ; N question ; B 68 -8 414 676 ;\nC 64 ; WX 921 ; N at ; B 116 -14 809 676 ;\nC 65 ; WX 722 ; N A ; B 15 0 706 674 ;\nC 66 ; WX 667 ; N B ; B 17 0 593 662 ;\nC 67 ; WX 667 ; N C ; B 28 -14 633 676 ;\nC 68 ; WX 722 ; N D ; B 16 0 685 662 ;\nC 69 ; WX 611 ; N E ; B 12 0 597 662 ;\nC 70 ; WX 556 ; N F ; B 12 0 546 662 ;\nC 71 ; WX 722 ; N G ; B 32 -14 709 676 ;\nC 72 ; WX 722 ; N H ; B 19 0 702 662 ;\nC 73 ; WX 333 ; N I ; B 18 0 315 662 ;\nC 74 ; WX 389 ; N J ; B 10 -14 370 662 ;\nC 75 ; WX 722 ; N K ; B 34 0 723 662 ;\nC 76 ; WX 611 ; N L ; B 12 0 598 662 ;\nC 77 ; WX 889 ; N M ; B 12 0 863 662 ;\nC 78 ; WX 722 ; N N ; B 12 -11 707 662 ;\nC 79 ; WX 722 ; N O ; B 34 -14 688 676 ;\nC 80 ; WX 556 ; N P ; B 16 0 542 662 ;\nC 81 ; WX 722 ; N Q ; B 34 -178 701 676 ;\nC 82 ; WX 667 ; N R ; B 17 0 659 662 ;\nC 83 ; WX 556 ; N S ; B 42 -14 491 676 ;\nC 84 ; WX 611 ; N T ; B 17 0 593 662 ;\nC 85 ; WX 722 ; N U ; B 14 -14 705 662 ;\nC 86 ; WX 722 ; N V ; B 16 -11 697 662 ;\nC 87 ; WX 944 ; N W ; B 5 -11 932 662 ;\nC 88 ; WX 722 ; N X ; B 10 0 704 662 ;\nC 89 ; WX 722 ; N Y ; B 22 0 703 662 ;\nC 90 ; WX 611 ; N Z ; B 9 0 597 662 ;\nC 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 ;\nC 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ;\nC 93 ; WX 333 ; N bracketright ; B 34 -156 245 662 ;\nC 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333 ; N quoteleft ; B 115 433 254 676 ;\nC 97 ; WX 444 ; N a ; B 37 -10 442 460 ;\nC 98 ; WX 500 ; N b ; B 3 -10 468 683 ;\nC 99 ; WX 444 ; N c ; B 25 -10 412 460 ;\nC 100 ; WX 500 ; N d ; B 27 -10 491 683 ;\nC 101 ; WX 444 ; N e ; B 25 -10 424 460 ;\nC 102 ; WX 333 ; N f ; B 20 0 383 683 ; L i fi ; L l fl ;\nC 103 ; WX 500 ; N g ; B 28 -218 470 460 ;\nC 104 ; WX 500 ; N h ; B 9 0 487 683 ;\nC 105 ; WX 278 ; N i ; B 16 0 253 683 ;\nC 106 ; WX 278 ; N j ; B -70 -218 194 683 ;\nC 107 ; WX 500 ; N k ; B 7 0 505 683 ;\nC 108 ; WX 278 ; N l ; B 19 0 257 683 ;\nC 109 ; WX 778 ; N m ; B 16 0 775 460 ;\nC 110 ; WX 500 ; N n ; B 16 0 485 460 ;\nC 111 ; WX 500 ; N o ; B 29 -10 470 460 ;\nC 112 ; WX 500 ; N p ; B 5 -217 470 460 ;\nC 113 ; WX 500 ; N q ; B 24 -217 488 460 ;\nC 114 ; WX 333 ; N r ; B 5 0 335 460 ;\nC 115 ; WX 389 ; N s ; B 51 -10 348 460 ;\nC 116 ; WX 278 ; N t ; B 13 -10 279 579 ;\nC 117 ; WX 500 ; N u ; B 9 -10 479 450 ;\nC 118 ; WX 500 ; N v ; B 19 -14 477 450 ;\nC 119 ; WX 722 ; N w ; B 21 -14 694 450 ;\nC 120 ; WX 500 ; N x ; B 17 0 479 450 ;\nC 121 ; WX 500 ; N y ; B 14 -218 475 450 ;\nC 122 ; WX 444 ; N z ; B 27 0 418 450 ;\nC 123 ; WX 480 ; N braceleft ; B 100 -181 350 680 ;\nC 124 ; WX 200 ; N bar ; B 67 -14 133 676 ;\nC 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ;\nC 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ;\nC 161 ; WX 333 ; N exclamdown ; B 97 -218 205 467 ;\nC 162 ; WX 500 ; N cent ; B 53 -138 448 579 ;\nC 163 ; WX 500 ; N sterling ; B 12 -8 490 676 ;\nC 164 ; WX 167 ; N fraction ; B -168 -14 331 676 ;\nC 165 ; WX 500 ; N yen ; B -53 0 512 662 ;\nC 166 ; WX 500 ; N florin ; B 7 -189 490 676 ;\nC 167 ; WX 500 ; N section ; B 70 -148 426 676 ;\nC 168 ; WX 500 ; N currency ; B -22 58 522 602 ;\nC 169 ; WX 180 ; N quotesingle ; B 48 431 133 676 ;\nC 170 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ;\nC 171 ; WX 500 ; N guillemotleft ; B 42 33 456 416 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 63 33 285 416 ;\nC 173 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ;\nC 174 ; WX 556 ; N fi ; B 31 0 521 683 ;\nC 175 ; WX 556 ; N fl ; B 32 0 521 683 ;\nC 177 ; WX 500 ; N endash ; B 0 201 500 250 ;\nC 178 ; WX 500 ; N dagger ; B 59 -149 442 676 ;\nC 179 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ;\nC 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ;\nC 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 ;\nC 183 ; WX 350 ; N bullet ; B 40 196 310 466 ;\nC 184 ; WX 333 ; N quotesinglbase ; B 79 -141 218 102 ;\nC 185 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 ;\nC 186 ; WX 444 ; N quotedblright ; B 30 433 401 676 ;\nC 187 ; WX 500 ; N guillemotright ; B 44 33 458 416 ;\nC 188 ; WX 1000 ; N ellipsis ; B 111 -11 888 100 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ;\nC 191 ; WX 444 ; N questiondown ; B 30 -218 376 466 ;\nC 193 ; WX 333 ; N grave ; B 19 507 242 678 ;\nC 194 ; WX 333 ; N acute ; B 93 507 317 678 ;\nC 195 ; WX 333 ; N circumflex ; B 11 507 322 674 ;\nC 196 ; WX 333 ; N tilde ; B 1 532 331 638 ;\nC 197 ; WX 333 ; N macron ; B 11 547 322 601 ;\nC 198 ; WX 333 ; N breve ; B 26 507 307 664 ;\nC 199 ; WX 333 ; N dotaccent ; B 118 523 216 623 ;\nC 200 ; WX 333 ; N dieresis ; B 18 523 315 623 ;\nC 202 ; WX 333 ; N ring ; B 67 512 266 711 ;\nC 203 ; WX 333 ; N cedilla ; B 52 -215 261 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -3 507 377 678 ;\nC 206 ; WX 333 ; N ogonek ; B 64 -165 249 0 ;\nC 207 ; WX 333 ; N caron ; B 11 507 322 674 ;\nC 208 ; WX 1000 ; N emdash ; B 0 201 1000 250 ;\nC 225 ; WX 889 ; N AE ; B 0 0 863 662 ;\nC 227 ; WX 276 ; N ordfeminine ; B 4 394 270 676 ;\nC 232 ; WX 611 ; N Lslash ; B 12 0 598 662 ;\nC 233 ; WX 722 ; N Oslash ; B 34 -80 688 734 ;\nC 234 ; WX 889 ; N OE ; B 30 -6 885 668 ;\nC 235 ; WX 310 ; N ordmasculine ; B 6 394 304 676 ;\nC 241 ; WX 667 ; N ae ; B 38 -10 632 460 ;\nC 245 ; WX 278 ; N dotlessi ; B 16 0 253 460 ;\nC 248 ; WX 278 ; N lslash ; B 19 0 259 683 ;\nC 249 ; WX 500 ; N oslash ; B 29 -112 470 551 ;\nC 250 ; WX 722 ; N oe ; B 30 -10 690 460 ;\nC 251 ; WX 500 ; N germandbls ; B 12 -9 468 683 ;\nC -1 ; WX 611 ; N Zcaron ; B 9 0 597 886 ;\nC -1 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ;\nC -1 ; WX 500 ; N ydieresis ; B 14 -218 475 623 ;\nC -1 ; WX 444 ; N atilde ; B 37 -10 442 638 ;\nC -1 ; WX 278 ; N icircumflex ; B -16 0 295 674 ;\nC -1 ; WX 300 ; N threesuperior ; B 15 262 291 676 ;\nC -1 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ;\nC -1 ; WX 500 ; N thorn ; B 5 -217 470 683 ;\nC -1 ; WX 444 ; N egrave ; B 25 -10 424 678 ;\nC -1 ; WX 300 ; N twosuperior ; B 1 270 296 676 ;\nC -1 ; WX 444 ; N eacute ; B 25 -10 424 678 ;\nC -1 ; WX 500 ; N otilde ; B 29 -10 470 638 ;\nC -1 ; WX 722 ; N Aacute ; B 15 0 706 890 ;\nC -1 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ;\nC -1 ; WX 500 ; N yacute ; B 14 -218 475 678 ;\nC -1 ; WX 500 ; N udieresis ; B 9 -10 479 623 ;\nC -1 ; WX 750 ; N threequarters ; B 15 -14 718 676 ;\nC -1 ; WX 444 ; N acircumflex ; B 37 -10 442 674 ;\nC -1 ; WX 722 ; N Eth ; B 16 0 685 662 ;\nC -1 ; WX 444 ; N edieresis ; B 25 -10 424 623 ;\nC -1 ; WX 500 ; N ugrave ; B 9 -10 479 678 ;\nC -1 ; WX 980 ; N trademark ; B 30 256 957 662 ;\nC -1 ; WX 500 ; N ograve ; B 29 -10 470 678 ;\nC -1 ; WX 389 ; N scaron ; B 39 -10 350 674 ;\nC -1 ; WX 333 ; N Idieresis ; B 18 0 315 835 ;\nC -1 ; WX 500 ; N uacute ; B 9 -10 479 678 ;\nC -1 ; WX 444 ; N agrave ; B 37 -10 442 678 ;\nC -1 ; WX 500 ; N ntilde ; B 16 0 485 638 ;\nC -1 ; WX 444 ; N aring ; B 37 -10 442 711 ;\nC -1 ; WX 444 ; N zcaron ; B 27 0 418 674 ;\nC -1 ; WX 333 ; N Icircumflex ; B 11 0 322 886 ;\nC -1 ; WX 722 ; N Ntilde ; B 12 -11 707 850 ;\nC -1 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ;\nC -1 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ;\nC -1 ; WX 333 ; N Iacute ; B 18 0 317 890 ;\nC -1 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ;\nC -1 ; WX 722 ; N Odieresis ; B 34 -14 688 835 ;\nC -1 ; WX 556 ; N Scaron ; B 42 -14 491 886 ;\nC -1 ; WX 611 ; N Edieresis ; B 12 0 597 835 ;\nC -1 ; WX 333 ; N Igrave ; B 18 0 315 890 ;\nC -1 ; WX 444 ; N adieresis ; B 37 -10 442 623 ;\nC -1 ; WX 722 ; N Ograve ; B 34 -14 688 890 ;\nC -1 ; WX 611 ; N Egrave ; B 12 0 597 890 ;\nC -1 ; WX 722 ; N Ydieresis ; B 22 0 703 835 ;\nC -1 ; WX 760 ; N registered ; B 38 -14 722 676 ;\nC -1 ; WX 722 ; N Otilde ; B 34 -14 688 850 ;\nC -1 ; WX 750 ; N onequarter ; B 37 -14 718 676 ;\nC -1 ; WX 722 ; N Ugrave ; B 14 -14 705 890 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 14 -14 705 886 ;\nC -1 ; WX 556 ; N Thorn ; B 16 0 542 662 ;\nC -1 ; WX 564 ; N divide ; B 30 -10 534 516 ;\nC -1 ; WX 722 ; N Atilde ; B 15 0 706 850 ;\nC -1 ; WX 722 ; N Uacute ; B 14 -14 705 890 ;\nC -1 ; WX 722 ; N Ocircumflex ; B 34 -14 688 886 ;\nC -1 ; WX 564 ; N logicalnot ; B 30 108 534 386 ;\nC -1 ; WX 722 ; N Aring ; B 15 0 706 898 ;\nC -1 ; WX 278 ; N idieresis ; B -9 0 288 623 ;\nC -1 ; WX 278 ; N iacute ; B 16 0 290 678 ;\nC -1 ; WX 444 ; N aacute ; B 37 -10 442 678 ;\nC -1 ; WX 564 ; N plusminus ; B 30 0 534 506 ;\nC -1 ; WX 564 ; N multiply ; B 38 8 527 497 ;\nC -1 ; WX 722 ; N Udieresis ; B 14 -14 705 835 ;\nC -1 ; WX 564 ; N minus ; B 30 220 534 286 ;\nC -1 ; WX 300 ; N onesuperior ; B 57 270 248 676 ;\nC -1 ; WX 611 ; N Eacute ; B 12 0 597 890 ;\nC -1 ; WX 722 ; N Acircumflex ; B 15 0 706 886 ;\nC -1 ; WX 760 ; N copyright ; B 38 -14 722 676 ;\nC -1 ; WX 722 ; N Agrave ; B 15 0 706 890 ;\nC -1 ; WX 500 ; N odieresis ; B 29 -10 470 623 ;\nC -1 ; WX 500 ; N oacute ; B 29 -10 470 678 ;\nC -1 ; WX 400 ; N degree ; B 57 390 343 676 ;\nC -1 ; WX 278 ; N igrave ; B -8 0 253 678 ;\nC -1 ; WX 500 ; N mu ; B 36 -218 512 450 ;\nC -1 ; WX 722 ; N Oacute ; B 34 -14 688 890 ;\nC -1 ; WX 500 ; N eth ; B 29 -10 471 686 ;\nC -1 ; WX 722 ; N Adieresis ; B 15 0 706 835 ;\nC -1 ; WX 722 ; N Yacute ; B 22 0 703 890 ;\nC -1 ; WX 200 ; N brokenbar ; B 67 -14 133 676 ;\nC -1 ; WX 750 ; N onehalf ; B 31 -14 746 676 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 283\n\nKPX A y -92\nKPX A w -92\nKPX A v -74\nKPX A u 0\nKPX A quoteright -111\nKPX A quotedblright 0\nKPX A p 0\nKPX A Y -105\nKPX A W -90\nKPX A V -135\nKPX A U -55\nKPX A T -111\nKPX A Q -55\nKPX A O -55\nKPX A G -40\nKPX A C -40\n\nKPX B period 0\nKPX B comma 0\nKPX B U -10\nKPX B A -35\n\nKPX D period 0\nKPX D comma 0\nKPX D Y -55\nKPX D W -30\nKPX D V -40\nKPX D A -40\n\nKPX F r 0\nKPX F period -80\nKPX F o -15\nKPX F i 0\nKPX F e 0\nKPX F comma -80\nKPX F a -15\nKPX F A -74\n\nKPX G period 0\nKPX G comma 0\n\nKPX J u 0\nKPX J period 0\nKPX J o 0\nKPX J e 0\nKPX J comma 0\nKPX J a 0\nKPX J A -60\n\nKPX K y -25\nKPX K u -15\nKPX K o -35\nKPX K e -25\nKPX K O -30\n\nKPX L y -55\nKPX L quoteright -92\nKPX L quotedblright 0\nKPX L Y -100\nKPX L W -74\nKPX L V -100\nKPX L T -92\n\nKPX N period 0\nKPX N comma 0\nKPX N A -35\n\nKPX O period 0\nKPX O comma 0\nKPX O Y -50\nKPX O X -40\nKPX O W -35\nKPX O V -50\nKPX O T -40\nKPX O A -35\n\nKPX P period -111\nKPX P o 0\nKPX P e 0\nKPX P comma -111\nKPX P a -15\nKPX P A -92\n\nKPX Q period 0\nKPX Q comma 0\nKPX Q U -10\n\nKPX R Y -65\nKPX R W -55\nKPX R V -80\nKPX R U -40\nKPX R T -60\nKPX R O -40\n\nKPX S period 0\nKPX S comma 0\n\nKPX T y -80\nKPX T w -80\nKPX T u -45\nKPX T semicolon -55\nKPX T r -35\nKPX T period -74\nKPX T o -80\nKPX T i -35\nKPX T hyphen -92\nKPX T h 0\nKPX T e -70\nKPX T comma -74\nKPX T colon -50\nKPX T a -80\nKPX T O -18\nKPX T A -93\n\nKPX U period 0\nKPX U comma 0\nKPX U A -40\n\nKPX V u -75\nKPX V semicolon -74\nKPX V period -129\nKPX V o -129\nKPX V i -60\nKPX V hyphen -100\nKPX V e -111\nKPX V comma -129\nKPX V colon -74\nKPX V a -111\nKPX V O -40\nKPX V G -15\nKPX V A -135\n\nKPX W y -73\nKPX W u -50\nKPX W semicolon -37\nKPX W period -92\nKPX W o -80\nKPX W i -40\nKPX W hyphen -65\nKPX W h 0\nKPX W e -80\nKPX W comma -92\nKPX W colon -37\nKPX W a -80\nKPX W O -10\nKPX W A -120\n\nKPX Y u -111\nKPX Y semicolon -92\nKPX Y period -129\nKPX Y o -110\nKPX Y i -55\nKPX Y hyphen -111\nKPX Y e -100\nKPX Y comma -129\nKPX Y colon -92\nKPX Y a -100\nKPX Y O -30\nKPX Y A -120\n\nKPX a y 0\nKPX a w -15\nKPX a v -20\nKPX a t 0\nKPX a p 0\nKPX a g 0\nKPX a b 0\n\nKPX b y 0\nKPX b v -15\nKPX b u -20\nKPX b period -40\nKPX b l 0\nKPX b comma 0\nKPX b b 0\n\nKPX c y -15\nKPX c period 0\nKPX c l 0\nKPX c k 0\nKPX c h 0\nKPX c comma 0\n\nKPX colon space 0\n\nKPX comma space 0\nKPX comma quoteright -70\nKPX comma quotedblright -70\n\nKPX d y 0\nKPX d w 0\nKPX d v 0\nKPX d period 0\nKPX d d 0\nKPX d comma 0\n\nKPX e y -15\nKPX e x -15\nKPX e w -25\nKPX e v -25\nKPX e period 0\nKPX e p 0\nKPX e g -15\nKPX e comma 0\nKPX e b 0\n\nKPX f quoteright 55\nKPX f quotedblright 0\nKPX f period 0\nKPX f o 0\nKPX f l 0\nKPX f i -20\nKPX f f -25\nKPX f e 0\nKPX f dotlessi -50\nKPX f comma 0\nKPX f a -10\n\nKPX g y 0\nKPX g r 0\nKPX g period 0\nKPX g o 0\nKPX g i 0\nKPX g g 0\nKPX g e 0\nKPX g comma 0\nKPX g a -5\n\nKPX h y -5\n\nKPX i v -25\n\nKPX k y -15\nKPX k o -10\nKPX k e -10\n\nKPX l y 0\nKPX l w -10\n\nKPX m y 0\nKPX m u 0\n\nKPX n y -15\nKPX n v -40\nKPX n u 0\n\nKPX o y -10\nKPX o x 0\nKPX o w -25\nKPX o v -15\nKPX o g 0\n\nKPX p y -10\n\nKPX period quoteright -70\nKPX period quotedblright -70\n\nKPX quotedblleft quoteleft 0\nKPX quotedblleft A -80\n\nKPX quotedblright space 0\n\nKPX quoteleft quoteleft -74\nKPX quoteleft A -80\n\nKPX quoteright v -50\nKPX quoteright t -18\nKPX quoteright space -74\nKPX quoteright s -55\nKPX quoteright r -50\nKPX quoteright quoteright -74\nKPX quoteright quotedblright 0\nKPX quoteright l -10\nKPX quoteright d -50\n\nKPX r y 0\nKPX r v 0\nKPX r u 0\nKPX r t 0\nKPX r s 0\nKPX r r 0\nKPX r q 0\nKPX r period -55\nKPX r p 0\nKPX r o 0\nKPX r n 0\nKPX r m 0\nKPX r l 0\nKPX r k 0\nKPX r i 0\nKPX r hyphen -20\nKPX r g -18\nKPX r e 0\nKPX r d 0\nKPX r comma -40\nKPX r c 0\nKPX r a 0\n\nKPX s w 0\n\nKPX space quoteleft 0\nKPX space quotedblleft 0\nKPX space Y -90\nKPX space W -30\nKPX space V -50\nKPX space T -18\nKPX space A -55\n\nKPX v period -65\nKPX v o -20\nKPX v e -15\nKPX v comma -65\nKPX v a -25\n\nKPX w period -65\nKPX w o -10\nKPX w h 0\nKPX w e 0\nKPX w comma -65\nKPX w a -10\n\nKPX x e -15\n\nKPX y period -65\nKPX y o 0\nKPX y e 0\nKPX y comma -65\nKPX y a 0\n\nKPX z o 0\nKPX z e 0\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 195 212 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 195 212 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 195 212 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 195 212 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 185 187 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 195 212 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 167 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 139 212 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 139 212 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 139 212 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 139 212 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 0 212 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 0 212 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 0 212 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 0 212 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 195 212 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 195 212 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 195 212 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 195 212 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 195 212 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 195 212 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 112 212 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 195 212 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 195 212 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 195 212 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 195 212 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 195 212 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 195 212 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 139 212 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 56 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 56 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 56 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 56 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 56 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 56 0 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 56 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 56 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 56 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 56 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 56 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -27 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 84 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 84 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 84 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 84 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 84 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 84 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 28 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 84 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 84 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 84 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 84 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 84 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 84 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 56 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/ptmri8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Tue Mar 20 13:14:56 1990\nComment UniqueID 28427\nComment VMusage 32912 39804\nFontName Times-Italic\nFullName Times Italic\nFamilyName Times\nWeight Medium\nItalicAngle -15.5\nIsFixedPitch false\nFontBBox -169 -217 1010 883\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.007\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.Times is a trademark of Linotype AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 653\nXHeight 441\nAscender 683\nDescender -205\nStartCharMetrics 228\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 39 -11 302 667 ;\nC 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ;\nC 35 ; WX 500 ; N numbersign ; B 2 0 540 676 ;\nC 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ;\nC 37 ; WX 833 ; N percent ; B 79 -13 790 676 ;\nC 38 ; WX 778 ; N ampersand ; B 76 -18 723 666 ;\nC 39 ; WX 333 ; N quoteright ; B 151 436 290 666 ;\nC 40 ; WX 333 ; N parenleft ; B 42 -181 315 669 ;\nC 41 ; WX 333 ; N parenright ; B 16 -180 289 669 ;\nC 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ;\nC 43 ; WX 675 ; N plus ; B 86 0 590 506 ;\nC 44 ; WX 250 ; N comma ; B -4 -129 135 101 ;\nC 45 ; WX 333 ; N hyphen ; B 49 192 282 255 ;\nC 46 ; WX 250 ; N period ; B 27 -11 138 100 ;\nC 47 ; WX 278 ; N slash ; B -65 -18 386 666 ;\nC 48 ; WX 500 ; N zero ; B 32 -7 497 676 ;\nC 49 ; WX 500 ; N one ; B 49 0 409 676 ;\nC 50 ; WX 500 ; N two ; B 12 0 452 676 ;\nC 51 ; WX 500 ; N three ; B 15 -7 465 676 ;\nC 52 ; WX 500 ; N four ; B 1 0 479 676 ;\nC 53 ; WX 500 ; N five ; B 15 -7 491 666 ;\nC 54 ; WX 500 ; N six ; B 30 -7 521 686 ;\nC 55 ; WX 500 ; N seven ; B 75 -8 537 666 ;\nC 56 ; WX 500 ; N eight ; B 30 -7 493 676 ;\nC 57 ; WX 500 ; N nine ; B 23 -17 492 676 ;\nC 58 ; WX 333 ; N colon ; B 50 -11 261 441 ;\nC 59 ; WX 333 ; N semicolon ; B 27 -129 261 441 ;\nC 60 ; WX 675 ; N less ; B 84 -8 592 514 ;\nC 61 ; WX 675 ; N equal ; B 86 120 590 386 ;\nC 62 ; WX 675 ; N greater ; B 84 -8 592 514 ;\nC 63 ; WX 500 ; N question ; B 132 -12 472 664 ;\nC 64 ; WX 920 ; N at ; B 118 -18 806 666 ;\nC 65 ; WX 611 ; N A ; B -51 0 564 668 ;\nC 66 ; WX 611 ; N B ; B -8 0 588 653 ;\nC 67 ; WX 667 ; N C ; B 66 -18 689 666 ;\nC 68 ; WX 722 ; N D ; B -8 0 700 653 ;\nC 69 ; WX 611 ; N E ; B -1 0 634 653 ;\nC 70 ; WX 611 ; N F ; B 8 0 645 653 ;\nC 71 ; WX 722 ; N G ; B 52 -18 722 666 ;\nC 72 ; WX 722 ; N H ; B -8 0 767 653 ;\nC 73 ; WX 333 ; N I ; B -8 0 384 653 ;\nC 74 ; WX 444 ; N J ; B -6 -18 491 653 ;\nC 75 ; WX 667 ; N K ; B 7 0 722 653 ;\nC 76 ; WX 556 ; N L ; B -8 0 559 653 ;\nC 77 ; WX 833 ; N M ; B -18 0 873 653 ;\nC 78 ; WX 667 ; N N ; B -20 -15 727 653 ;\nC 79 ; WX 722 ; N O ; B 60 -18 699 666 ;\nC 80 ; WX 611 ; N P ; B 0 0 605 653 ;\nC 81 ; WX 722 ; N Q ; B 59 -182 699 666 ;\nC 82 ; WX 611 ; N R ; B -13 0 588 653 ;\nC 83 ; WX 500 ; N S ; B 17 -18 508 667 ;\nC 84 ; WX 556 ; N T ; B 59 0 633 653 ;\nC 85 ; WX 722 ; N U ; B 102 -18 765 653 ;\nC 86 ; WX 611 ; N V ; B 76 -18 688 653 ;\nC 87 ; WX 833 ; N W ; B 71 -18 906 653 ;\nC 88 ; WX 611 ; N X ; B -29 0 655 653 ;\nC 89 ; WX 556 ; N Y ; B 78 0 633 653 ;\nC 90 ; WX 556 ; N Z ; B -6 0 606 653 ;\nC 91 ; WX 389 ; N bracketleft ; B 21 -153 391 663 ;\nC 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ;\nC 93 ; WX 389 ; N bracketright ; B 12 -153 382 663 ;\nC 94 ; WX 422 ; N asciicircum ; B 0 301 422 666 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333 ; N quoteleft ; B 171 436 310 666 ;\nC 97 ; WX 500 ; N a ; B 17 -11 476 441 ;\nC 98 ; WX 500 ; N b ; B 23 -11 473 683 ;\nC 99 ; WX 444 ; N c ; B 30 -11 425 441 ;\nC 100 ; WX 500 ; N d ; B 15 -13 527 683 ;\nC 101 ; WX 444 ; N e ; B 31 -11 412 441 ;\nC 102 ; WX 278 ; N f ; B -147 -207 424 678 ; L i fi ; L l fl ;\nC 103 ; WX 500 ; N g ; B 8 -206 472 441 ;\nC 104 ; WX 500 ; N h ; B 19 -9 478 683 ;\nC 105 ; WX 278 ; N i ; B 49 -11 264 654 ;\nC 106 ; WX 278 ; N j ; B -124 -207 276 654 ;\nC 107 ; WX 444 ; N k ; B 14 -11 461 683 ;\nC 108 ; WX 278 ; N l ; B 41 -11 279 683 ;\nC 109 ; WX 722 ; N m ; B 12 -9 704 441 ;\nC 110 ; WX 500 ; N n ; B 14 -9 474 441 ;\nC 111 ; WX 500 ; N o ; B 27 -11 468 441 ;\nC 112 ; WX 500 ; N p ; B -75 -205 469 441 ;\nC 113 ; WX 500 ; N q ; B 25 -209 483 441 ;\nC 114 ; WX 389 ; N r ; B 45 0 412 441 ;\nC 115 ; WX 389 ; N s ; B 16 -13 366 442 ;\nC 116 ; WX 278 ; N t ; B 37 -11 296 546 ;\nC 117 ; WX 500 ; N u ; B 42 -11 475 441 ;\nC 118 ; WX 444 ; N v ; B 21 -18 426 441 ;\nC 119 ; WX 667 ; N w ; B 16 -18 648 441 ;\nC 120 ; WX 444 ; N x ; B -27 -11 447 441 ;\nC 121 ; WX 444 ; N y ; B -24 -206 426 441 ;\nC 122 ; WX 389 ; N z ; B -2 -81 380 428 ;\nC 123 ; WX 400 ; N braceleft ; B 51 -177 407 687 ;\nC 124 ; WX 275 ; N bar ; B 105 -18 171 666 ;\nC 125 ; WX 400 ; N braceright ; B -7 -177 349 687 ;\nC 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ;\nC 161 ; WX 389 ; N exclamdown ; B 59 -205 322 473 ;\nC 162 ; WX 500 ; N cent ; B 77 -143 472 560 ;\nC 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ;\nC 164 ; WX 167 ; N fraction ; B -169 -10 337 676 ;\nC 165 ; WX 500 ; N yen ; B 27 0 603 653 ;\nC 166 ; WX 500 ; N florin ; B 25 -182 507 682 ;\nC 167 ; WX 500 ; N section ; B 53 -162 461 666 ;\nC 168 ; WX 500 ; N currency ; B -22 53 522 597 ;\nC 169 ; WX 214 ; N quotesingle ; B 132 421 241 666 ;\nC 170 ; WX 556 ; N quotedblleft ; B 166 436 514 666 ;\nC 171 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ;\nC 173 ; WX 333 ; N guilsinglright ; B 52 37 282 403 ;\nC 174 ; WX 500 ; N fi ; B -141 -207 481 681 ;\nC 175 ; WX 500 ; N fl ; B -141 -204 518 682 ;\nC 177 ; WX 500 ; N endash ; B -6 197 505 243 ;\nC 178 ; WX 500 ; N dagger ; B 101 -159 488 666 ;\nC 179 ; WX 500 ; N daggerdbl ; B 22 -143 491 666 ;\nC 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ;\nC 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ;\nC 183 ; WX 350 ; N bullet ; B 40 191 310 461 ;\nC 184 ; WX 333 ; N quotesinglbase ; B 44 -129 183 101 ;\nC 185 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ;\nC 186 ; WX 556 ; N quotedblright ; B 151 436 499 666 ;\nC 187 ; WX 500 ; N guillemotright ; B 55 37 447 403 ;\nC 188 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ;\nC 189 ; WX 1000 ; N perthousand ; B 25 -19 1010 706 ;\nC 191 ; WX 500 ; N questiondown ; B 28 -205 368 471 ;\nC 193 ; WX 333 ; N grave ; B 121 492 311 664 ;\nC 194 ; WX 333 ; N acute ; B 180 494 403 664 ;\nC 195 ; WX 333 ; N circumflex ; B 91 492 385 661 ;\nC 196 ; WX 333 ; N tilde ; B 100 517 427 624 ;\nC 197 ; WX 333 ; N macron ; B 99 532 411 583 ;\nC 198 ; WX 333 ; N breve ; B 117 492 418 650 ;\nC 199 ; WX 333 ; N dotaccent ; B 207 508 305 606 ;\nC 200 ; WX 333 ; N dieresis ; B 107 508 405 606 ;\nC 202 ; WX 333 ; N ring ; B 155 492 355 691 ;\nC 203 ; WX 333 ; N cedilla ; B -30 -217 182 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ;\nC 206 ; WX 333 ; N ogonek ; B -20 -169 200 40 ;\nC 207 ; WX 333 ; N caron ; B 121 492 426 661 ;\nC 208 ; WX 889 ; N emdash ; B -6 197 894 243 ;\nC 225 ; WX 889 ; N AE ; B -27 0 911 653 ;\nC 227 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ;\nC 232 ; WX 556 ; N Lslash ; B -8 0 559 653 ;\nC 233 ; WX 722 ; N Oslash ; B 60 -105 699 722 ;\nC 234 ; WX 944 ; N OE ; B 49 -8 964 666 ;\nC 235 ; WX 310 ; N ordmasculine ; B 67 406 362 676 ;\nC 241 ; WX 667 ; N ae ; B 23 -11 640 441 ;\nC 245 ; WX 278 ; N dotlessi ; B 49 -11 235 441 ;\nC 248 ; WX 278 ; N lslash ; B 37 -11 307 683 ;\nC 249 ; WX 500 ; N oslash ; B 28 -135 469 554 ;\nC 250 ; WX 667 ; N oe ; B 20 -12 646 441 ;\nC 251 ; WX 500 ; N germandbls ; B -168 -207 493 679 ;\nC -1 ; WX 556 ; N Zcaron ; B -6 0 606 873 ;\nC -1 ; WX 444 ; N ccedilla ; B 26 -217 425 441 ;\nC -1 ; WX 444 ; N ydieresis ; B -24 -206 441 606 ;\nC -1 ; WX 500 ; N atilde ; B 17 -11 511 624 ;\nC -1 ; WX 278 ; N icircumflex ; B 34 -11 328 661 ;\nC -1 ; WX 300 ; N threesuperior ; B 43 268 339 676 ;\nC -1 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ;\nC -1 ; WX 500 ; N thorn ; B -75 -205 469 683 ;\nC -1 ; WX 444 ; N egrave ; B 31 -11 412 664 ;\nC -1 ; WX 300 ; N twosuperior ; B 33 271 324 676 ;\nC -1 ; WX 444 ; N eacute ; B 31 -11 459 664 ;\nC -1 ; WX 500 ; N otilde ; B 27 -11 496 624 ;\nC -1 ; WX 611 ; N Aacute ; B -51 0 564 876 ;\nC -1 ; WX 500 ; N ocircumflex ; B 27 -11 468 661 ;\nC -1 ; WX 444 ; N yacute ; B -24 -206 459 664 ;\nC -1 ; WX 500 ; N udieresis ; B 42 -11 479 606 ;\nC -1 ; WX 750 ; N threequarters ; B 23 -10 736 676 ;\nC -1 ; WX 500 ; N acircumflex ; B 17 -11 476 661 ;\nC -1 ; WX 722 ; N Eth ; B -8 0 700 653 ;\nC -1 ; WX 444 ; N edieresis ; B 31 -11 451 606 ;\nC -1 ; WX 500 ; N ugrave ; B 42 -11 475 664 ;\nC -1 ; WX 980 ; N trademark ; B 30 247 957 653 ;\nC -1 ; WX 500 ; N ograve ; B 27 -11 468 664 ;\nC -1 ; WX 389 ; N scaron ; B 16 -13 454 661 ;\nC -1 ; WX 333 ; N Idieresis ; B -8 0 435 818 ;\nC -1 ; WX 500 ; N uacute ; B 42 -11 477 664 ;\nC -1 ; WX 500 ; N agrave ; B 17 -11 476 664 ;\nC -1 ; WX 500 ; N ntilde ; B 14 -9 476 624 ;\nC -1 ; WX 500 ; N aring ; B 17 -11 476 691 ;\nC -1 ; WX 389 ; N zcaron ; B -2 -81 434 661 ;\nC -1 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ;\nC -1 ; WX 667 ; N Ntilde ; B -20 -15 727 836 ;\nC -1 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ;\nC -1 ; WX 611 ; N Ecircumflex ; B -1 0 634 873 ;\nC -1 ; WX 333 ; N Iacute ; B -8 0 413 876 ;\nC -1 ; WX 667 ; N Ccedilla ; B 66 -217 689 666 ;\nC -1 ; WX 722 ; N Odieresis ; B 60 -18 699 818 ;\nC -1 ; WX 500 ; N Scaron ; B 17 -18 520 873 ;\nC -1 ; WX 611 ; N Edieresis ; B -1 0 634 818 ;\nC -1 ; WX 333 ; N Igrave ; B -8 0 384 876 ;\nC -1 ; WX 500 ; N adieresis ; B 17 -11 489 606 ;\nC -1 ; WX 722 ; N Ograve ; B 60 -18 699 876 ;\nC -1 ; WX 611 ; N Egrave ; B -1 0 634 876 ;\nC -1 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ;\nC -1 ; WX 760 ; N registered ; B 41 -18 719 666 ;\nC -1 ; WX 722 ; N Otilde ; B 60 -18 699 836 ;\nC -1 ; WX 750 ; N onequarter ; B 33 -10 736 676 ;\nC -1 ; WX 722 ; N Ugrave ; B 102 -18 765 876 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ;\nC -1 ; WX 611 ; N Thorn ; B 0 0 569 653 ;\nC -1 ; WX 675 ; N divide ; B 86 -11 590 517 ;\nC -1 ; WX 611 ; N Atilde ; B -51 0 566 836 ;\nC -1 ; WX 722 ; N Uacute ; B 102 -18 765 876 ;\nC -1 ; WX 722 ; N Ocircumflex ; B 60 -18 699 873 ;\nC -1 ; WX 675 ; N logicalnot ; B 86 108 590 386 ;\nC -1 ; WX 611 ; N Aring ; B -51 0 564 883 ;\nC -1 ; WX 278 ; N idieresis ; B 49 -11 353 606 ;\nC -1 ; WX 278 ; N iacute ; B 49 -11 356 664 ;\nC -1 ; WX 500 ; N aacute ; B 17 -11 487 664 ;\nC -1 ; WX 675 ; N plusminus ; B 86 0 590 506 ;\nC -1 ; WX 675 ; N multiply ; B 93 8 582 497 ;\nC -1 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ;\nC -1 ; WX 675 ; N minus ; B 86 220 590 286 ;\nC -1 ; WX 300 ; N onesuperior ; B 43 271 284 676 ;\nC -1 ; WX 611 ; N Eacute ; B -1 0 634 876 ;\nC -1 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ;\nC -1 ; WX 760 ; N copyright ; B 41 -18 719 666 ;\nC -1 ; WX 611 ; N Agrave ; B -51 0 564 876 ;\nC -1 ; WX 500 ; N odieresis ; B 27 -11 489 606 ;\nC -1 ; WX 500 ; N oacute ; B 27 -11 487 664 ;\nC -1 ; WX 400 ; N degree ; B 101 390 387 676 ;\nC -1 ; WX 278 ; N igrave ; B 49 -11 284 664 ;\nC -1 ; WX 500 ; N mu ; B -30 -209 497 428 ;\nC -1 ; WX 722 ; N Oacute ; B 60 -18 699 876 ;\nC -1 ; WX 500 ; N eth ; B 27 -11 482 683 ;\nC -1 ; WX 611 ; N Adieresis ; B -51 0 564 818 ;\nC -1 ; WX 556 ; N Yacute ; B 78 0 633 876 ;\nC -1 ; WX 275 ; N brokenbar ; B 105 -18 171 666 ;\nC -1 ; WX 750 ; N onehalf ; B 34 -10 749 676 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 283\n\nKPX A y -55\nKPX A w -55\nKPX A v -55\nKPX A u -20\nKPX A quoteright -37\nKPX A quotedblright 0\nKPX A p 0\nKPX A Y -55\nKPX A W -95\nKPX A V -105\nKPX A U -50\nKPX A T -37\nKPX A Q -40\nKPX A O -40\nKPX A G -35\nKPX A C -30\n\nKPX B period 0\nKPX B comma 0\nKPX B U -10\nKPX B A -25\n\nKPX D period 0\nKPX D comma 0\nKPX D Y -40\nKPX D W -40\nKPX D V -40\nKPX D A -35\n\nKPX F r -55\nKPX F period -135\nKPX F o -105\nKPX F i -45\nKPX F e -75\nKPX F comma -135\nKPX F a -75\nKPX F A -115\n\nKPX G period 0\nKPX G comma 0\n\nKPX J u -35\nKPX J period -25\nKPX J o -25\nKPX J e -25\nKPX J comma -25\nKPX J a -35\nKPX J A -40\n\nKPX K y -40\nKPX K u -40\nKPX K o -40\nKPX K e -35\nKPX K O -50\n\nKPX L y -30\nKPX L quoteright -37\nKPX L quotedblright 0\nKPX L Y -20\nKPX L W -55\nKPX L V -55\nKPX L T -20\n\nKPX N period 0\nKPX N comma 0\nKPX N A -27\n\nKPX O period 0\nKPX O comma 0\nKPX O Y -50\nKPX O X -40\nKPX O W -50\nKPX O V -50\nKPX O T -40\nKPX O A -55\n\nKPX P period -135\nKPX P o -80\nKPX P e -80\nKPX P comma -135\nKPX P a -80\nKPX P A -90\n\nKPX Q period 0\nKPX Q comma 0\nKPX Q U -10\n\nKPX R Y -18\nKPX R W -18\nKPX R V -18\nKPX R U -40\nKPX R T 0\nKPX R O -40\n\nKPX S period 0\nKPX S comma 0\n\nKPX T y -74\nKPX T w -74\nKPX T u -55\nKPX T semicolon -65\nKPX T r -55\nKPX T period -74\nKPX T o -92\nKPX T i -55\nKPX T hyphen -74\nKPX T h 0\nKPX T e -92\nKPX T comma -74\nKPX T colon -55\nKPX T a -92\nKPX T O -18\nKPX T A -50\n\nKPX U period -25\nKPX U comma -25\nKPX U A -40\n\nKPX V u -74\nKPX V semicolon -74\nKPX V period -129\nKPX V o -111\nKPX V i -74\nKPX V hyphen -55\nKPX V e -111\nKPX V comma -129\nKPX V colon -65\nKPX V a -111\nKPX V O -30\nKPX V G 0\nKPX V A -60\n\nKPX W y -70\nKPX W u -55\nKPX W semicolon -65\nKPX W period -92\nKPX W o -92\nKPX W i -55\nKPX W hyphen -37\nKPX W h 0\nKPX W e -92\nKPX W comma -92\nKPX W colon -65\nKPX W a -92\nKPX W O -25\nKPX W A -60\n\nKPX Y u -92\nKPX Y semicolon -65\nKPX Y period -92\nKPX Y o -92\nKPX Y i -74\nKPX Y hyphen -74\nKPX Y e -92\nKPX Y comma -92\nKPX Y colon -65\nKPX Y a -92\nKPX Y O -15\nKPX Y A -50\n\nKPX a y 0\nKPX a w 0\nKPX a v 0\nKPX a t 0\nKPX a p 0\nKPX a g -10\nKPX a b 0\n\nKPX b y 0\nKPX b v 0\nKPX b u -20\nKPX b period -40\nKPX b l 0\nKPX b comma 0\nKPX b b 0\n\nKPX c y 0\nKPX c period 0\nKPX c l 0\nKPX c k -20\nKPX c h -15\nKPX c comma 0\n\nKPX colon space 0\n\nKPX comma space 0\nKPX comma quoteright -140\nKPX comma quotedblright -140\n\nKPX d y 0\nKPX d w 0\nKPX d v 0\nKPX d period 0\nKPX d d 0\nKPX d comma 0\n\nKPX e y -30\nKPX e x -20\nKPX e w -15\nKPX e v -15\nKPX e period -15\nKPX e p 0\nKPX e g -40\nKPX e comma -10\nKPX e b 0\n\nKPX f quoteright 92\nKPX f quotedblright 0\nKPX f period -15\nKPX f o 0\nKPX f l 0\nKPX f i -20\nKPX f f -18\nKPX f e 0\nKPX f dotlessi -60\nKPX f comma -10\nKPX f a 0\n\nKPX g y 0\nKPX g r 0\nKPX g period -15\nKPX g o 0\nKPX g i 0\nKPX g g -10\nKPX g e -10\nKPX g comma -10\nKPX g a 0\n\nKPX h y 0\n\nKPX i v 0\n\nKPX k y -10\nKPX k o -10\nKPX k e -10\n\nKPX l y 0\nKPX l w 0\n\nKPX m y 0\nKPX m u 0\n\nKPX n y 0\nKPX n v -40\nKPX n u 0\n\nKPX o y 0\nKPX o x 0\nKPX o w 0\nKPX o v -10\nKPX o g -10\n\nKPX p y 0\n\nKPX period quoteright -140\nKPX period quotedblright -140\n\nKPX quotedblleft quoteleft 0\nKPX quotedblleft A 0\n\nKPX quotedblright space 0\n\nKPX quoteleft quoteleft -111\nKPX quoteleft A 0\n\nKPX quoteright v -10\nKPX quoteright t -30\nKPX quoteright space -111\nKPX quoteright s -40\nKPX quoteright r -25\nKPX quoteright quoteright -111\nKPX quoteright quotedblright 0\nKPX quoteright l 0\nKPX quoteright d -25\n\nKPX r y 0\nKPX r v 0\nKPX r u 0\nKPX r t 0\nKPX r s -10\nKPX r r 0\nKPX r q -37\nKPX r period -111\nKPX r p 0\nKPX r o -45\nKPX r n 0\nKPX r m 0\nKPX r l 0\nKPX r k 0\nKPX r i 0\nKPX r hyphen -20\nKPX r g -37\nKPX r e -37\nKPX r d -37\nKPX r comma -111\nKPX r c -37\nKPX r a -15\n\nKPX s w 0\n\nKPX space quoteleft 0\nKPX space quotedblleft 0\nKPX space Y -75\nKPX space W -40\nKPX space V -35\nKPX space T -18\nKPX space A -18\n\nKPX v period -74\nKPX v o 0\nKPX v e 0\nKPX v comma -74\nKPX v a 0\n\nKPX w period -74\nKPX w o 0\nKPX w h 0\nKPX w e 0\nKPX w comma -74\nKPX w a 0\n\nKPX x e 0\n\nKPX y period -55\nKPX y o 0\nKPX y e 0\nKPX y comma -55\nKPX y a 0\n\nKPX z o 0\nKPX z e 0\nEndKernPairs\nEndKernData\nStartComposites 58\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 139 212 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 144 212 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 139 212 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 149 212 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 129 192 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 139 212 ;\nCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 167 0 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 149 212 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 169 212 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 159 212 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 149 212 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 10 212 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 40 212 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 30 212 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 10 212 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 177 212 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 195 212 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 230 212 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 230 212 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 205 212 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 215 212 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 94 212 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 195 212 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 215 212 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 225 212 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 215 212 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 132 212 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 142 212 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 112 212 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 84 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 84 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 84 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 84 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 84 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 84 0 ;\nCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 56 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 56 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 56 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 46 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 56 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -47 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -57 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -52 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 49 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 84 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 74 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 84 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 84 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde 69 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron 28 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 74 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 74 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 74 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 84 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 56 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 36 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 8 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/putb8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1989, 1991 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Fri Jan 17 15:08:52 1992\nComment UniqueID 37705\nComment VMusage 33078 39970\nFontName Utopia-Bold\nFullName Utopia Bold\nFamilyName Utopia\nWeight Bold\nItalicAngle 0\nIsFixedPitch false\nFontBBox -155 -250 1249 916 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.002\nNotice Copyright (c) 1989, 1991 Adobe Systems Incorporated.  All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.\nEncodingScheme AdobeStandardEncoding\nCapHeight 692\nXHeight 490\nAscender 742\nDescender -230\nStartCharMetrics 228\nC 32 ; WX 210 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 278 ; N exclam ; B 47 -12 231 707 ;\nC 34 ; WX 473 ; N quotedbl ; B 71 407 402 707 ;\nC 35 ; WX 560 ; N numbersign ; B 14 0 547 668 ;\nC 36 ; WX 560 ; N dollar ; B 38 -104 524 748 ;\nC 37 ; WX 887 ; N percent ; B 40 -31 847 701 ;\nC 38 ; WX 748 ; N ampersand ; B 45 -12 734 680 ;\nC 39 ; WX 252 ; N quoteright ; B 40 387 212 707 ;\nC 40 ; WX 365 ; N parenleft ; B 99 -135 344 699 ;\nC 41 ; WX 365 ; N parenright ; B 21 -135 266 699 ;\nC 42 ; WX 442 ; N asterisk ; B 40 315 402 707 ;\nC 43 ; WX 600 ; N plus ; B 58 0 542 490 ;\nC 44 ; WX 280 ; N comma ; B 40 -167 226 180 ;\nC 45 ; WX 392 ; N hyphen ; B 65 203 328 298 ;\nC 46 ; WX 280 ; N period ; B 48 -12 232 174 ;\nC 47 ; WX 378 ; N slash ; B 34 -15 344 707 ;\nC 48 ; WX 560 ; N zero ; B 31 -12 530 680 ;\nC 49 ; WX 560 ; N one ; B 102 0 459 680 ;\nC 50 ; WX 560 ; N two ; B 30 0 539 680 ;\nC 51 ; WX 560 ; N three ; B 27 -12 519 680 ;\nC 52 ; WX 560 ; N four ; B 19 0 533 668 ;\nC 53 ; WX 560 ; N five ; B 43 -12 519 668 ;\nC 54 ; WX 560 ; N six ; B 30 -12 537 680 ;\nC 55 ; WX 560 ; N seven ; B 34 -12 530 668 ;\nC 56 ; WX 560 ; N eight ; B 27 -12 533 680 ;\nC 57 ; WX 560 ; N nine ; B 34 -12 523 680 ;\nC 58 ; WX 280 ; N colon ; B 48 -12 232 490 ;\nC 59 ; WX 280 ; N semicolon ; B 40 -167 232 490 ;\nC 60 ; WX 600 ; N less ; B 61 5 539 493 ;\nC 61 ; WX 600 ; N equal ; B 58 103 542 397 ;\nC 62 ; WX 600 ; N greater ; B 61 5 539 493 ;\nC 63 ; WX 456 ; N question ; B 20 -12 433 707 ;\nC 64 ; WX 833 ; N at ; B 45 -15 797 707 ;\nC 65 ; WX 644 ; N A ; B -28 0 663 692 ;\nC 66 ; WX 683 ; N B ; B 33 0 645 692 ;\nC 67 ; WX 689 ; N C ; B 42 -15 654 707 ;\nC 68 ; WX 777 ; N D ; B 33 0 735 692 ;\nC 69 ; WX 629 ; N E ; B 33 0 604 692 ;\nC 70 ; WX 593 ; N F ; B 37 0 568 692 ;\nC 71 ; WX 726 ; N G ; B 42 -15 709 707 ;\nC 72 ; WX 807 ; N H ; B 33 0 774 692 ;\nC 73 ; WX 384 ; N I ; B 33 0 351 692 ;\nC 74 ; WX 386 ; N J ; B 6 -114 361 692 ;\nC 75 ; WX 707 ; N K ; B 33 -6 719 692 ;\nC 76 ; WX 585 ; N L ; B 33 0 584 692 ;\nC 77 ; WX 918 ; N M ; B 23 0 885 692 ;\nC 78 ; WX 739 ; N N ; B 25 0 719 692 ;\nC 79 ; WX 768 ; N O ; B 42 -15 726 707 ;\nC 80 ; WX 650 ; N P ; B 33 0 623 692 ;\nC 81 ; WX 768 ; N Q ; B 42 -193 726 707 ;\nC 82 ; WX 684 ; N R ; B 33 0 686 692 ;\nC 83 ; WX 561 ; N S ; B 42 -15 533 707 ;\nC 84 ; WX 624 ; N T ; B 15 0 609 692 ;\nC 85 ; WX 786 ; N U ; B 29 -15 757 692 ;\nC 86 ; WX 645 ; N V ; B -16 0 679 692 ;\nC 87 ; WX 933 ; N W ; B -10 0 960 692 ;\nC 88 ; WX 634 ; N X ; B -19 0 671 692 ;\nC 89 ; WX 617 ; N Y ; B -12 0 655 692 ;\nC 90 ; WX 614 ; N Z ; B 0 0 606 692 ;\nC 91 ; WX 335 ; N bracketleft ; B 123 -128 308 692 ;\nC 92 ; WX 379 ; N backslash ; B 34 -15 345 707 ;\nC 93 ; WX 335 ; N bracketright ; B 27 -128 212 692 ;\nC 94 ; WX 600 ; N asciicircum ; B 56 215 544 668 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 252 ; N quoteleft ; B 40 399 212 719 ;\nC 97 ; WX 544 ; N a ; B 41 -12 561 502 ;\nC 98 ; WX 605 ; N b ; B 15 -12 571 742 ;\nC 99 ; WX 494 ; N c ; B 34 -12 484 502 ;\nC 100 ; WX 605 ; N d ; B 34 -12 596 742 ;\nC 101 ; WX 519 ; N e ; B 34 -12 505 502 ;\nC 102 ; WX 342 ; N f ; B 27 0 421 742 ; L i fi ; L l fl ;\nC 103 ; WX 533 ; N g ; B 25 -242 546 512 ;\nC 104 ; WX 631 ; N h ; B 19 0 622 742 ;\nC 105 ; WX 316 ; N i ; B 26 0 307 720 ;\nC 106 ; WX 316 ; N j ; B -12 -232 260 720 ;\nC 107 ; WX 582 ; N k ; B 19 0 595 742 ;\nC 108 ; WX 309 ; N l ; B 19 0 300 742 ;\nC 109 ; WX 948 ; N m ; B 26 0 939 502 ;\nC 110 ; WX 638 ; N n ; B 26 0 629 502 ;\nC 111 ; WX 585 ; N o ; B 34 -12 551 502 ;\nC 112 ; WX 615 ; N p ; B 19 -230 581 502 ;\nC 113 ; WX 597 ; N q ; B 34 -230 596 502 ;\nC 114 ; WX 440 ; N r ; B 26 0 442 502 ;\nC 115 ; WX 446 ; N s ; B 38 -12 425 502 ;\nC 116 ; WX 370 ; N t ; B 32 -12 373 616 ;\nC 117 ; WX 629 ; N u ; B 23 -12 620 502 ;\nC 118 ; WX 520 ; N v ; B -8 0 546 490 ;\nC 119 ; WX 774 ; N w ; B -10 0 802 490 ;\nC 120 ; WX 522 ; N x ; B -15 0 550 490 ;\nC 121 ; WX 524 ; N y ; B -12 -242 557 490 ;\nC 122 ; WX 483 ; N z ; B -1 0 480 490 ;\nC 123 ; WX 365 ; N braceleft ; B 74 -128 325 692 ;\nC 124 ; WX 284 ; N bar ; B 94 -250 190 750 ;\nC 125 ; WX 365 ; N braceright ; B 40 -128 291 692 ;\nC 126 ; WX 600 ; N asciitilde ; B 50 158 551 339 ;\nC 161 ; WX 278 ; N exclamdown ; B 47 -217 231 502 ;\nC 162 ; WX 560 ; N cent ; B 39 -15 546 678 ;\nC 163 ; WX 560 ; N sterling ; B 21 0 555 679 ;\nC 164 ; WX 100 ; N fraction ; B -155 -27 255 695 ;\nC 165 ; WX 560 ; N yen ; B 3 0 562 668 ;\nC 166 ; WX 560 ; N florin ; B -40 -135 562 691 ;\nC 167 ; WX 566 ; N section ; B 35 -115 531 707 ;\nC 168 ; WX 560 ; N currency ; B 21 73 539 596 ;\nC 169 ; WX 252 ; N quotesingle ; B 57 407 196 707 ;\nC 170 ; WX 473 ; N quotedblleft ; B 40 399 433 719 ;\nC 171 ; WX 487 ; N guillemotleft ; B 40 37 452 464 ;\nC 172 ; WX 287 ; N guilsinglleft ; B 40 37 252 464 ;\nC 173 ; WX 287 ; N guilsinglright ; B 35 37 247 464 ;\nC 174 ; WX 639 ; N fi ; B 27 0 630 742 ;\nC 175 ; WX 639 ; N fl ; B 27 0 630 742 ;\nC 177 ; WX 500 ; N endash ; B 0 209 500 292 ;\nC 178 ; WX 510 ; N dagger ; B 35 -125 475 707 ;\nC 179 ; WX 486 ; N daggerdbl ; B 35 -119 451 707 ;\nC 180 ; WX 280 ; N periodcentered ; B 48 156 232 342 ;\nC 182 ; WX 552 ; N paragraph ; B 35 -101 527 692 ;\nC 183 ; WX 455 ; N bullet ; B 50 174 405 529 ;\nC 184 ; WX 252 ; N quotesinglbase ; B 40 -153 212 167 ;\nC 185 ; WX 473 ; N quotedblbase ; B 40 -153 433 167 ;\nC 186 ; WX 473 ; N quotedblright ; B 40 387 433 707 ;\nC 187 ; WX 487 ; N guillemotright ; B 35 37 447 464 ;\nC 188 ; WX 1000 ; N ellipsis ; B 75 -12 925 174 ;\nC 189 ; WX 1289 ; N perthousand ; B 40 -31 1249 701 ;\nC 191 ; WX 456 ; N questiondown ; B 23 -217 436 502 ;\nC 193 ; WX 430 ; N grave ; B 40 511 312 740 ;\nC 194 ; WX 430 ; N acute ; B 119 511 391 740 ;\nC 195 ; WX 430 ; N circumflex ; B 28 520 402 747 ;\nC 196 ; WX 430 ; N tilde ; B 2 553 427 706 ;\nC 197 ; WX 430 ; N macron ; B 60 587 371 674 ;\nC 198 ; WX 430 ; N breve ; B 56 556 375 716 ;\nC 199 ; WX 430 ; N dotaccent ; B 136 561 294 710 ;\nC 200 ; WX 430 ; N dieresis ; B 16 561 414 710 ;\nC 202 ; WX 430 ; N ring ; B 96 540 334 762 ;\nC 203 ; WX 430 ; N cedilla ; B 136 -246 335 0 ;\nC 205 ; WX 430 ; N hungarumlaut ; B 64 521 446 751 ;\nC 206 ; WX 430 ; N ogonek ; B 105 -246 325 0 ;\nC 207 ; WX 430 ; N caron ; B 28 520 402 747 ;\nC 208 ; WX 1000 ; N emdash ; B 0 209 1000 292 ;\nC 225 ; WX 879 ; N AE ; B -77 0 854 692 ;\nC 227 ; WX 405 ; N ordfeminine ; B 28 265 395 590 ;\nC 232 ; WX 591 ; N Lslash ; B 30 0 590 692 ;\nC 233 ; WX 768 ; N Oslash ; B 42 -61 726 747 ;\nC 234 ; WX 1049 ; N OE ; B 42 0 1024 692 ;\nC 235 ; WX 427 ; N ordmasculine ; B 28 265 399 590 ;\nC 241 ; WX 806 ; N ae ; B 41 -12 792 502 ;\nC 245 ; WX 316 ; N dotlessi ; B 26 0 307 502 ;\nC 248 ; WX 321 ; N lslash ; B 16 0 332 742 ;\nC 249 ; WX 585 ; N oslash ; B 34 -51 551 535 ;\nC 250 ; WX 866 ; N oe ; B 34 -12 852 502 ;\nC 251 ; WX 662 ; N germandbls ; B 29 -12 647 742 ;\nC -1 ; WX 402 ; N onesuperior ; B 71 272 324 680 ;\nC -1 ; WX 600 ; N minus ; B 58 210 542 290 ;\nC -1 ; WX 396 ; N degree ; B 35 360 361 680 ;\nC -1 ; WX 585 ; N oacute ; B 34 -12 551 755 ;\nC -1 ; WX 768 ; N Odieresis ; B 42 -15 726 881 ;\nC -1 ; WX 585 ; N odieresis ; B 34 -12 551 710 ;\nC -1 ; WX 629 ; N Eacute ; B 33 0 604 904 ;\nC -1 ; WX 629 ; N ucircumflex ; B 23 -12 620 747 ;\nC -1 ; WX 900 ; N onequarter ; B 73 -27 814 695 ;\nC -1 ; WX 600 ; N logicalnot ; B 58 95 542 397 ;\nC -1 ; WX 629 ; N Ecircumflex ; B 33 0 604 905 ;\nC -1 ; WX 900 ; N onehalf ; B 53 -27 849 695 ;\nC -1 ; WX 768 ; N Otilde ; B 42 -15 726 876 ;\nC -1 ; WX 629 ; N uacute ; B 23 -12 620 740 ;\nC -1 ; WX 519 ; N eacute ; B 34 -12 505 755 ;\nC -1 ; WX 316 ; N iacute ; B 26 0 369 740 ;\nC -1 ; WX 629 ; N Egrave ; B 33 0 604 904 ;\nC -1 ; WX 316 ; N icircumflex ; B -28 0 346 747 ;\nC -1 ; WX 629 ; N mu ; B 23 -242 620 502 ;\nC -1 ; WX 284 ; N brokenbar ; B 94 -175 190 675 ;\nC -1 ; WX 609 ; N thorn ; B 13 -230 575 722 ;\nC -1 ; WX 644 ; N Aring ; B -28 0 663 872 ;\nC -1 ; WX 524 ; N yacute ; B -12 -242 557 740 ;\nC -1 ; WX 617 ; N Ydieresis ; B -12 0 655 881 ;\nC -1 ; WX 1090 ; N trademark ; B 38 277 1028 692 ;\nC -1 ; WX 800 ; N registered ; B 36 -15 764 707 ;\nC -1 ; WX 585 ; N ocircumflex ; B 34 -12 551 747 ;\nC -1 ; WX 644 ; N Agrave ; B -28 0 663 904 ;\nC -1 ; WX 561 ; N Scaron ; B 42 -15 533 916 ;\nC -1 ; WX 786 ; N Ugrave ; B 29 -15 757 904 ;\nC -1 ; WX 629 ; N Edieresis ; B 33 0 604 881 ;\nC -1 ; WX 786 ; N Uacute ; B 29 -15 757 904 ;\nC -1 ; WX 585 ; N otilde ; B 34 -12 551 706 ;\nC -1 ; WX 638 ; N ntilde ; B 26 0 629 706 ;\nC -1 ; WX 524 ; N ydieresis ; B -12 -242 557 710 ;\nC -1 ; WX 644 ; N Aacute ; B -28 0 663 904 ;\nC -1 ; WX 585 ; N eth ; B 34 -12 551 742 ;\nC -1 ; WX 544 ; N acircumflex ; B 41 -12 561 747 ;\nC -1 ; WX 544 ; N aring ; B 41 -12 561 762 ;\nC -1 ; WX 768 ; N Ograve ; B 42 -15 726 904 ;\nC -1 ; WX 494 ; N ccedilla ; B 34 -246 484 502 ;\nC -1 ; WX 600 ; N multiply ; B 75 20 525 476 ;\nC -1 ; WX 600 ; N divide ; B 58 6 542 494 ;\nC -1 ; WX 402 ; N twosuperior ; B 29 272 382 680 ;\nC -1 ; WX 739 ; N Ntilde ; B 25 0 719 876 ;\nC -1 ; WX 629 ; N ugrave ; B 23 -12 620 740 ;\nC -1 ; WX 786 ; N Ucircumflex ; B 29 -15 757 905 ;\nC -1 ; WX 644 ; N Atilde ; B -28 0 663 876 ;\nC -1 ; WX 483 ; N zcaron ; B -1 0 480 747 ;\nC -1 ; WX 316 ; N idieresis ; B -37 0 361 710 ;\nC -1 ; WX 644 ; N Acircumflex ; B -28 0 663 905 ;\nC -1 ; WX 384 ; N Icircumflex ; B 4 0 380 905 ;\nC -1 ; WX 617 ; N Yacute ; B -12 0 655 904 ;\nC -1 ; WX 768 ; N Oacute ; B 42 -15 726 904 ;\nC -1 ; WX 644 ; N Adieresis ; B -28 0 663 881 ;\nC -1 ; WX 614 ; N Zcaron ; B 0 0 606 916 ;\nC -1 ; WX 544 ; N agrave ; B 41 -12 561 755 ;\nC -1 ; WX 402 ; N threesuperior ; B 30 265 368 680 ;\nC -1 ; WX 585 ; N ograve ; B 34 -12 551 755 ;\nC -1 ; WX 900 ; N threequarters ; B 40 -27 842 695 ;\nC -1 ; WX 783 ; N Eth ; B 35 0 741 692 ;\nC -1 ; WX 600 ; N plusminus ; B 58 0 542 549 ;\nC -1 ; WX 629 ; N udieresis ; B 23 -12 620 710 ;\nC -1 ; WX 519 ; N edieresis ; B 34 -12 505 710 ;\nC -1 ; WX 544 ; N aacute ; B 41 -12 561 755 ;\nC -1 ; WX 316 ; N igrave ; B -47 0 307 740 ;\nC -1 ; WX 384 ; N Idieresis ; B -13 0 397 881 ;\nC -1 ; WX 544 ; N adieresis ; B 41 -12 561 710 ;\nC -1 ; WX 384 ; N Iacute ; B 33 0 423 904 ;\nC -1 ; WX 800 ; N copyright ; B 36 -15 764 707 ;\nC -1 ; WX 384 ; N Igrave ; B -31 0 351 904 ;\nC -1 ; WX 689 ; N Ccedilla ; B 42 -246 654 707 ;\nC -1 ; WX 446 ; N scaron ; B 38 -12 425 747 ;\nC -1 ; WX 519 ; N egrave ; B 34 -12 505 755 ;\nC -1 ; WX 768 ; N Ocircumflex ; B 42 -15 726 905 ;\nC -1 ; WX 640 ; N Thorn ; B 33 0 622 692 ;\nC -1 ; WX 544 ; N atilde ; B 41 -12 561 706 ;\nC -1 ; WX 786 ; N Udieresis ; B 29 -15 757 881 ;\nC -1 ; WX 519 ; N ecircumflex ; B 34 -12 505 747 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 685\n\nKPX A z 25\nKPX A y -40\nKPX A w -42\nKPX A v -48\nKPX A u -18\nKPX A t -12\nKPX A s 6\nKPX A quoteright -110\nKPX A quotedblright -80\nKPX A q -6\nKPX A p -18\nKPX A o -12\nKPX A e -6\nKPX A d -12\nKPX A c -12\nKPX A b -12\nKPX A a -6\nKPX A Y -64\nKPX A X -18\nKPX A W -54\nKPX A V -70\nKPX A U -40\nKPX A T -58\nKPX A Q -18\nKPX A O -18\nKPX A G -18\nKPX A C -18\n\nKPX B y -18\nKPX B u -12\nKPX B r -12\nKPX B o -6\nKPX B l -15\nKPX B k -15\nKPX B i -12\nKPX B h -15\nKPX B e -6\nKPX B b -10\nKPX B a -12\nKPX B W -20\nKPX B V -20\nKPX B U -25\nKPX B T -20\n\nKPX C z -5\nKPX C y -24\nKPX C u -18\nKPX C r -6\nKPX C o -12\nKPX C e -12\nKPX C a -16\nKPX C Q -6\nKPX C O -6\nKPX C G -6\nKPX C C -6\n\nKPX D u -12\nKPX D r -12\nKPX D period -40\nKPX D o -5\nKPX D i -12\nKPX D h -18\nKPX D e -5\nKPX D comma -40\nKPX D a -15\nKPX D Y -60\nKPX D W -40\nKPX D V -40\n\nKPX E y -30\nKPX E w -24\nKPX E v -24\nKPX E u -12\nKPX E t -18\nKPX E s -12\nKPX E r -4\nKPX E q -6\nKPX E period 10\nKPX E p -18\nKPX E o -6\nKPX E n -4\nKPX E m -4\nKPX E j -6\nKPX E i -6\nKPX E g -6\nKPX E e -6\nKPX E d -6\nKPX E comma 10\nKPX E c -6\nKPX E b -5\nKPX E a -4\nKPX E Y -6\nKPX E W -6\nKPX E V -6\n\nKPX F y -18\nKPX F u -12\nKPX F r -36\nKPX F quoteright 20\nKPX F quotedblright 20\nKPX F period -150\nKPX F o -36\nKPX F l -12\nKPX F i -22\nKPX F e -36\nKPX F comma -150\nKPX F a -48\nKPX F A -60\n\nKPX G y -12\nKPX G u -12\nKPX G r -18\nKPX G quotedblright -20\nKPX G n -18\nKPX G l -6\nKPX G i -12\nKPX G h -12\nKPX G a -12\n\nKPX H y -24\nKPX H u -26\nKPX H o -30\nKPX H i -18\nKPX H e -30\nKPX H a -25\n\nKPX I z -6\nKPX I y -6\nKPX I x -6\nKPX I w -18\nKPX I v -24\nKPX I u -26\nKPX I t -24\nKPX I s -18\nKPX I r -12\nKPX I p -26\nKPX I o -30\nKPX I n -18\nKPX I m -18\nKPX I l -6\nKPX I k -6\nKPX I h -6\nKPX I g -6\nKPX I f -6\nKPX I e -30\nKPX I d -30\nKPX I c -30\nKPX I b -6\nKPX I a -24\n\nKPX J y -20\nKPX J u -36\nKPX J o -35\nKPX J i -20\nKPX J e -35\nKPX J bracketright 15\nKPX J braceright 15\nKPX J a -36\n\nKPX K y -70\nKPX K w -60\nKPX K v -80\nKPX K u -42\nKPX K o -30\nKPX K l 10\nKPX K i 6\nKPX K h 10\nKPX K e -18\nKPX K a -6\nKPX K Q -36\nKPX K O -36\nKPX K G -36\nKPX K C -36\nKPX K A 20\n\nKPX L y -52\nKPX L w -58\nKPX L u -12\nKPX L quoteright -130\nKPX L quotedblright -130\nKPX L l 6\nKPX L j -6\nKPX L Y -70\nKPX L W -78\nKPX L V -95\nKPX L U -32\nKPX L T -80\nKPX L Q -12\nKPX L O -12\nKPX L G -12\nKPX L C -12\nKPX L A 30\n\nKPX M y -24\nKPX M u -36\nKPX M o -30\nKPX M n -6\nKPX M j -12\nKPX M i -12\nKPX M e -30\nKPX M d -30\nKPX M c -30\nKPX M a -25\n\nKPX N y -24\nKPX N u -30\nKPX N o -30\nKPX N i -24\nKPX N e -30\nKPX N a -30\n\nKPX O z -6\nKPX O u -6\nKPX O t -6\nKPX O s -6\nKPX O r -10\nKPX O q -6\nKPX O period -40\nKPX O p -10\nKPX O o -6\nKPX O n -10\nKPX O m -10\nKPX O l -15\nKPX O k -15\nKPX O i -6\nKPX O h -15\nKPX O g -6\nKPX O e -6\nKPX O d -6\nKPX O comma -40\nKPX O c -6\nKPX O b -15\nKPX O a -12\nKPX O Y -50\nKPX O X -40\nKPX O W -35\nKPX O V -35\nKPX O T -40\nKPX O A -30\n\nKPX P y 10\nKPX P u -18\nKPX P t -6\nKPX P s -30\nKPX P r -12\nKPX P quoteright 20\nKPX P quotedblright 20\nKPX P period -200\nKPX P o -36\nKPX P n -12\nKPX P l -15\nKPX P i -6\nKPX P hyphen -30\nKPX P h -15\nKPX P e -36\nKPX P comma -200\nKPX P a -36\nKPX P I -20\nKPX P H -20\nKPX P E -20\nKPX P A -85\n\nKPX Q u -6\nKPX Q a -18\nKPX Q Y -50\nKPX Q X -40\nKPX Q W -35\nKPX Q V -35\nKPX Q U -25\nKPX Q T -40\nKPX Q A -30\n\nKPX R y -20\nKPX R u -12\nKPX R t -25\nKPX R quoteright -10\nKPX R quotedblright -10\nKPX R o -12\nKPX R e -18\nKPX R a -6\nKPX R Y -32\nKPX R X 20\nKPX R W -18\nKPX R V -26\nKPX R U -30\nKPX R T -20\nKPX R Q -10\nKPX R O -10\nKPX R G -10\nKPX R C -10\n\nKPX S y -35\nKPX S w -30\nKPX S v -40\nKPX S u -24\nKPX S t -24\nKPX S r -10\nKPX S quoteright -15\nKPX S quotedblright -15\nKPX S p -24\nKPX S n -24\nKPX S m -24\nKPX S l -18\nKPX S k -24\nKPX S j -30\nKPX S i -12\nKPX S h -12\nKPX S a -18\n\nKPX T z -64\nKPX T y -74\nKPX T w -72\nKPX T u -74\nKPX T semicolon -50\nKPX T s -82\nKPX T r -74\nKPX T quoteright 24\nKPX T quotedblright 24\nKPX T period -95\nKPX T parenright 40\nKPX T o -90\nKPX T m -72\nKPX T i -28\nKPX T hyphen -110\nKPX T endash -40\nKPX T emdash -60\nKPX T e -80\nKPX T comma -95\nKPX T bracketright 40\nKPX T braceright 30\nKPX T a -90\nKPX T Y 12\nKPX T X 10\nKPX T W 15\nKPX T V 6\nKPX T T 30\nKPX T S -12\nKPX T Q -25\nKPX T O -25\nKPX T G -25\nKPX T C -25\nKPX T A -52\n\nKPX U z -35\nKPX U y -30\nKPX U x -30\nKPX U v -30\nKPX U t -36\nKPX U s -45\nKPX U r -50\nKPX U p -50\nKPX U n -50\nKPX U m -50\nKPX U l -12\nKPX U k -12\nKPX U i -22\nKPX U h -6\nKPX U g -40\nKPX U f -20\nKPX U d -40\nKPX U c -40\nKPX U b -12\nKPX U a -50\nKPX U A -50\n\nKPX V y -36\nKPX V u -50\nKPX V semicolon -45\nKPX V r -75\nKPX V quoteright 50\nKPX V quotedblright 36\nKPX V period -135\nKPX V parenright 80\nKPX V o -70\nKPX V i 20\nKPX V hyphen -90\nKPX V emdash -20\nKPX V e -70\nKPX V comma -135\nKPX V colon -45\nKPX V bracketright 80\nKPX V braceright 80\nKPX V a -70\nKPX V Q -20\nKPX V O -20\nKPX V G -20\nKPX V C -20\nKPX V A -60\n\nKPX W y -50\nKPX W u -46\nKPX W t -30\nKPX W semicolon -40\nKPX W r -50\nKPX W quoteright 40\nKPX W quotedblright 24\nKPX W period -100\nKPX W parenright 80\nKPX W o -60\nKPX W m -50\nKPX W i 5\nKPX W hyphen -70\nKPX W h 20\nKPX W e -60\nKPX W d -60\nKPX W comma -100\nKPX W colon -40\nKPX W bracketright 80\nKPX W braceright 70\nKPX W a -75\nKPX W T 30\nKPX W Q -20\nKPX W O -20\nKPX W G -20\nKPX W C -20\nKPX W A -58\n\nKPX X y -40\nKPX X u -24\nKPX X quoteright 15\nKPX X e -6\nKPX X a -6\nKPX X Q -24\nKPX X O -30\nKPX X G -30\nKPX X C -30\nKPX X A 20\n\nKPX Y v -50\nKPX Y u -65\nKPX Y t -46\nKPX Y semicolon -37\nKPX Y quoteright 50\nKPX Y quotedblright 36\nKPX Y q -100\nKPX Y period -90\nKPX Y parenright 60\nKPX Y o -90\nKPX Y l 25\nKPX Y i 15\nKPX Y hyphen -100\nKPX Y endash -30\nKPX Y emdash -50\nKPX Y e -90\nKPX Y d -90\nKPX Y comma -90\nKPX Y colon -60\nKPX Y bracketright 80\nKPX Y braceright 64\nKPX Y a -80\nKPX Y Y 12\nKPX Y X 12\nKPX Y W 12\nKPX Y V 12\nKPX Y T 30\nKPX Y Q -40\nKPX Y O -40\nKPX Y G -40\nKPX Y C -40\nKPX Y A -55\n\nKPX Z y -36\nKPX Z w -36\nKPX Z u -6\nKPX Z o -12\nKPX Z i -12\nKPX Z e -6\nKPX Z a -6\nKPX Z Q -18\nKPX Z O -18\nKPX Z G -18\nKPX Z C -18\nKPX Z A 25\n\nKPX a quoteright -45\nKPX a quotedblright -40\n\nKPX b y -15\nKPX b w -20\nKPX b v -20\nKPX b quoteright -45\nKPX b quotedblright -40\nKPX b period -10\nKPX b comma -10\n\nKPX braceleft Y 64\nKPX braceleft W 64\nKPX braceleft V 64\nKPX braceleft T 25\nKPX braceleft J 50\n\nKPX bracketleft Y 64\nKPX bracketleft W 64\nKPX bracketleft V 64\nKPX bracketleft T 35\nKPX bracketleft J 60\n\nKPX c quoteright -5\n\nKPX colon space -20\n\nKPX comma space -40\nKPX comma quoteright -100\nKPX comma quotedblright -100\n\nKPX d quoteright -24\nKPX d quotedblright -24\n\nKPX e z -4\nKPX e quoteright -25\nKPX e quotedblright -20\n\nKPX f quotesingle 70\nKPX f quoteright 68\nKPX f quotedblright 68\nKPX f period -10\nKPX f parenright 110\nKPX f comma -20\nKPX f bracketright 100\nKPX f braceright 80\n\nKPX g y 20\nKPX g p 20\nKPX g f 20\nKPX g comma 10\n\nKPX h quoteright -60\nKPX h quotedblright -60\n\nKPX i quoteright -20\nKPX i quotedblright -20\n\nKPX j quoteright -20\nKPX j quotedblright -20\nKPX j period -10\nKPX j comma -10\n\nKPX k quoteright -30\nKPX k quotedblright -30\n\nKPX l quoteright -24\nKPX l quotedblright -24\n\nKPX m quoteright -60\nKPX m quotedblright -60\n\nKPX n quoteright -60\nKPX n quotedblright -60\n\nKPX o z -12\nKPX o y -25\nKPX o x -18\nKPX o w -30\nKPX o v -30\nKPX o quoteright -45\nKPX o quotedblright -40\nKPX o period -10\nKPX o comma -10\n\nKPX p z -10\nKPX p y -15\nKPX p w -15\nKPX p quoteright -45\nKPX p quotedblright -60\nKPX p period -10\nKPX p comma -10\n\nKPX parenleft Y 64\nKPX parenleft W 64\nKPX parenleft V 64\nKPX parenleft T 50\nKPX parenleft J 50\n\nKPX period space -40\nKPX period quoteright -100\nKPX period quotedblright -100\n\nKPX q quoteright -50\nKPX q quotedblright -50\nKPX q period -10\nKPX q comma -10\n\nKPX quotedblleft z -26\nKPX quotedblleft w 10\nKPX quotedblleft u -40\nKPX quotedblleft t -40\nKPX quotedblleft s -32\nKPX quotedblleft r -40\nKPX quotedblleft q -70\nKPX quotedblleft p -40\nKPX quotedblleft o -70\nKPX quotedblleft n -40\nKPX quotedblleft m -40\nKPX quotedblleft g -50\nKPX quotedblleft f -30\nKPX quotedblleft e -70\nKPX quotedblleft d -70\nKPX quotedblleft c -70\nKPX quotedblleft a -60\nKPX quotedblleft Y 30\nKPX quotedblleft X 20\nKPX quotedblleft W 40\nKPX quotedblleft V 40\nKPX quotedblleft T 18\nKPX quotedblleft J -24\nKPX quotedblleft A -122\n\nKPX quotedblright space -40\nKPX quotedblright period -100\nKPX quotedblright comma -100\n\nKPX quoteleft z -26\nKPX quoteleft y -5\nKPX quoteleft x -5\nKPX quoteleft w 5\nKPX quoteleft v -5\nKPX quoteleft u -25\nKPX quoteleft t -25\nKPX quoteleft s -40\nKPX quoteleft r -40\nKPX quoteleft quoteleft -30\nKPX quoteleft q -70\nKPX quoteleft p -40\nKPX quoteleft o -70\nKPX quoteleft n -40\nKPX quoteleft m -40\nKPX quoteleft g -50\nKPX quoteleft f -10\nKPX quoteleft e -70\nKPX quoteleft d -70\nKPX quoteleft c -70\nKPX quoteleft a -60\nKPX quoteleft Y 35\nKPX quoteleft X 30\nKPX quoteleft W 35\nKPX quoteleft V 35\nKPX quoteleft T 35\nKPX quoteleft J -24\nKPX quoteleft A -122\n\nKPX quoteright v -20\nKPX quoteright t -50\nKPX quoteright space -40\nKPX quoteright s -70\nKPX quoteright r -42\nKPX quoteright quoteright -30\nKPX quoteright period -100\nKPX quoteright m -42\nKPX quoteright l -6\nKPX quoteright d -100\nKPX quoteright comma -100\n\nKPX r z 20\nKPX r y 18\nKPX r x 12\nKPX r w 30\nKPX r v 30\nKPX r u 8\nKPX r t 8\nKPX r semicolon 20\nKPX r quoteright -20\nKPX r quotedblright -10\nKPX r q -6\nKPX r period -60\nKPX r o -6\nKPX r n 8\nKPX r m 8\nKPX r l -10\nKPX r k -10\nKPX r i 8\nKPX r hyphen -60\nKPX r h -10\nKPX r g 5\nKPX r f 8\nKPX r emdash -20\nKPX r e -20\nKPX r d -20\nKPX r comma -80\nKPX r colon 20\nKPX r c -20\n\nKPX s quoteright -40\nKPX s quotedblright -40\n\nKPX semicolon space -20\n\nKPX space quotesinglbase -100\nKPX space quoteleft -40\nKPX space quotedblleft -40\nKPX space quotedblbase -100\nKPX space Y -60\nKPX space W -60\nKPX space V -60\nKPX space T -40\n\nKPX t period 15\nKPX t comma 10\n\nKPX u quoteright -60\nKPX u quotedblright -60\n\nKPX v semicolon 20\nKPX v quoteright 5\nKPX v quotedblright 10\nKPX v q -15\nKPX v period -75\nKPX v o -15\nKPX v e -15\nKPX v d -15\nKPX v comma -90\nKPX v colon 20\nKPX v c -15\nKPX v a -15\n\nKPX w semicolon 20\nKPX w quoteright 15\nKPX w quotedblright 20\nKPX w q -10\nKPX w period -60\nKPX w o -10\nKPX w e -10\nKPX w d -10\nKPX w comma -68\nKPX w colon 20\nKPX w c -10\n\nKPX x quoteright -25\nKPX x quotedblright -20\nKPX x q -6\nKPX x o -6\nKPX x e -12\nKPX x d -12\nKPX x c -12\n\nKPX y semicolon 20\nKPX y quoteright 5\nKPX y quotedblright 10\nKPX y period -72\nKPX y hyphen -20\nKPX y comma -72\nKPX y colon 20\n\nKPX z quoteright -20\nKPX z quotedblright -20\nKPX z o -6\nKPX z e -6\nKPX z d -6\nKPX z c -6\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/putbi8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1989, 1991 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Fri Jan 17 15:47:44 1992\nComment UniqueID 37716\nComment VMusage 34427 41319\nFontName Utopia-BoldItalic\nFullName Utopia Bold Italic\nFamilyName Utopia\nWeight Bold\nItalicAngle -13\nIsFixedPitch false\nFontBBox -176 -250 1262 916 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.002\nNotice Copyright (c) 1989, 1991 Adobe Systems Incorporated.  All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.\nEncodingScheme AdobeStandardEncoding\nCapHeight 692\nXHeight 502\nAscender 742\nDescender -242\nStartCharMetrics 228\nC 32 ; WX 210 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 285 ; N exclam ; B 35 -12 336 707 ;\nC 34 ; WX 455 ; N quotedbl ; B 142 407 496 707 ;\nC 35 ; WX 560 ; N numbersign ; B 37 0 606 668 ;\nC 36 ; WX 560 ; N dollar ; B 32 -104 588 748 ;\nC 37 ; WX 896 ; N percent ; B 106 -31 861 702 ;\nC 38 ; WX 752 ; N ampersand ; B 62 -12 736 680 ;\nC 39 ; WX 246 ; N quoteright ; B 95 387 294 707 ;\nC 40 ; WX 350 ; N parenleft ; B 87 -135 438 699 ;\nC 41 ; WX 350 ; N parenright ; B -32 -135 319 699 ;\nC 42 ; WX 500 ; N asterisk ; B 121 315 528 707 ;\nC 43 ; WX 600 ; N plus ; B 83 0 567 490 ;\nC 44 ; WX 280 ; N comma ; B -9 -167 207 180 ;\nC 45 ; WX 392 ; N hyphen ; B 71 203 354 298 ;\nC 46 ; WX 280 ; N period ; B 32 -12 212 166 ;\nC 47 ; WX 260 ; N slash ; B -16 -15 370 707 ;\nC 48 ; WX 560 ; N zero ; B 57 -12 583 680 ;\nC 49 ; WX 560 ; N one ; B 72 0 470 680 ;\nC 50 ; WX 560 ; N two ; B 4 0 578 680 ;\nC 51 ; WX 560 ; N three ; B 21 -12 567 680 ;\nC 52 ; WX 560 ; N four ; B 28 0 557 668 ;\nC 53 ; WX 560 ; N five ; B 23 -12 593 668 ;\nC 54 ; WX 560 ; N six ; B 56 -12 586 680 ;\nC 55 ; WX 560 ; N seven ; B 112 -12 632 668 ;\nC 56 ; WX 560 ; N eight ; B 37 -12 584 680 ;\nC 57 ; WX 560 ; N nine ; B 48 -12 570 680 ;\nC 58 ; WX 280 ; N colon ; B 32 -12 280 490 ;\nC 59 ; WX 280 ; N semicolon ; B -9 -167 280 490 ;\nC 60 ; WX 600 ; N less ; B 66 5 544 495 ;\nC 61 ; WX 600 ; N equal ; B 83 103 567 397 ;\nC 62 ; WX 600 ; N greater ; B 86 5 564 495 ;\nC 63 ; WX 454 ; N question ; B 115 -12 515 707 ;\nC 64 ; WX 828 ; N at ; B 90 -15 842 707 ;\nC 65 ; WX 634 ; N A ; B -59 0 639 692 ;\nC 66 ; WX 680 ; N B ; B 5 0 689 692 ;\nC 67 ; WX 672 ; N C ; B 76 -15 742 707 ;\nC 68 ; WX 774 ; N D ; B 5 0 784 692 ;\nC 69 ; WX 622 ; N E ; B 5 0 687 692 ;\nC 70 ; WX 585 ; N F ; B 5 0 683 692 ;\nC 71 ; WX 726 ; N G ; B 76 -15 756 707 ;\nC 72 ; WX 800 ; N H ; B 5 0 880 692 ;\nC 73 ; WX 386 ; N I ; B 5 0 466 692 ;\nC 74 ; WX 388 ; N J ; B -50 -114 477 692 ;\nC 75 ; WX 688 ; N K ; B 5 -6 823 692 ;\nC 76 ; WX 586 ; N L ; B 5 0 591 692 ;\nC 77 ; WX 921 ; N M ; B 0 0 998 692 ;\nC 78 ; WX 741 ; N N ; B -5 0 838 692 ;\nC 79 ; WX 761 ; N O ; B 78 -15 768 707 ;\nC 80 ; WX 660 ; N P ; B 5 0 694 692 ;\nC 81 ; WX 761 ; N Q ; B 78 -193 768 707 ;\nC 82 ; WX 681 ; N R ; B 5 0 696 692 ;\nC 83 ; WX 551 ; N S ; B 31 -15 570 707 ;\nC 84 ; WX 616 ; N T ; B 91 0 722 692 ;\nC 85 ; WX 776 ; N U ; B 115 -15 867 692 ;\nC 86 ; WX 630 ; N V ; B 92 0 783 692 ;\nC 87 ; WX 920 ; N W ; B 80 0 1062 692 ;\nC 88 ; WX 630 ; N X ; B -56 0 744 692 ;\nC 89 ; WX 622 ; N Y ; B 92 0 765 692 ;\nC 90 ; WX 618 ; N Z ; B -30 0 714 692 ;\nC 91 ; WX 350 ; N bracketleft ; B 56 -128 428 692 ;\nC 92 ; WX 460 ; N backslash ; B 114 -15 425 707 ;\nC 93 ; WX 350 ; N bracketright ; B -22 -128 350 692 ;\nC 94 ; WX 600 ; N asciicircum ; B 79 215 567 668 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 246 ; N quoteleft ; B 114 399 313 719 ;\nC 97 ; WX 596 ; N a ; B 26 -12 612 502 ;\nC 98 ; WX 586 ; N b ; B 34 -12 592 742 ;\nC 99 ; WX 456 ; N c ; B 38 -12 498 502 ;\nC 100 ; WX 609 ; N d ; B 29 -12 651 742 ;\nC 101 ; WX 476 ; N e ; B 38 -12 497 502 ;\nC 102 ; WX 348 ; N f ; B -129 -242 553 742 ; L i fi ; L l fl ;\nC 103 ; WX 522 ; N g ; B -14 -242 609 512 ;\nC 104 ; WX 629 ; N h ; B 44 -12 631 742 ;\nC 105 ; WX 339 ; N i ; B 66 -12 357 720 ;\nC 106 ; WX 333 ; N j ; B -120 -242 364 720 ;\nC 107 ; WX 570 ; N k ; B 39 -12 604 742 ;\nC 108 ; WX 327 ; N l ; B 62 -12 360 742 ;\nC 109 ; WX 914 ; N m ; B 46 -12 917 502 ;\nC 110 ; WX 635 ; N n ; B 45 -12 639 502 ;\nC 111 ; WX 562 ; N o ; B 42 -12 556 502 ;\nC 112 ; WX 606 ; N p ; B 0 -242 613 502 ;\nC 113 ; WX 584 ; N q ; B 29 -242 604 513 ;\nC 114 ; WX 440 ; N r ; B 51 -12 497 502 ;\nC 115 ; WX 417 ; N s ; B 10 -12 432 502 ;\nC 116 ; WX 359 ; N t ; B 68 -12 428 641 ;\nC 117 ; WX 634 ; N u ; B 71 -12 643 502 ;\nC 118 ; WX 518 ; N v ; B 68 -12 547 502 ;\nC 119 ; WX 795 ; N w ; B 70 -12 826 502 ;\nC 120 ; WX 516 ; N x ; B -26 -12 546 502 ;\nC 121 ; WX 489 ; N y ; B -49 -242 532 502 ;\nC 122 ; WX 466 ; N z ; B -17 -12 506 490 ;\nC 123 ; WX 340 ; N braceleft ; B 90 -128 439 692 ;\nC 124 ; WX 265 ; N bar ; B 117 -250 221 750 ;\nC 125 ; WX 340 ; N braceright ; B -42 -128 307 692 ;\nC 126 ; WX 600 ; N asciitilde ; B 70 157 571 338 ;\nC 161 ; WX 285 ; N exclamdown ; B -13 -217 288 502 ;\nC 162 ; WX 560 ; N cent ; B 80 -21 611 668 ;\nC 163 ; WX 560 ; N sterling ; B -4 0 583 679 ;\nC 164 ; WX 100 ; N fraction ; B -176 -27 370 695 ;\nC 165 ; WX 560 ; N yen ; B 65 0 676 668 ;\nC 166 ; WX 560 ; N florin ; B -16 -135 635 691 ;\nC 167 ; WX 568 ; N section ; B 64 -115 559 707 ;\nC 168 ; WX 560 ; N currency ; B 60 73 578 596 ;\nC 169 ; WX 246 ; N quotesingle ; B 134 376 285 707 ;\nC 170 ; WX 455 ; N quotedblleft ; B 114 399 522 719 ;\nC 171 ; WX 560 ; N guillemotleft ; B 90 37 533 464 ;\nC 172 ; WX 360 ; N guilsinglleft ; B 90 37 333 464 ;\nC 173 ; WX 360 ; N guilsinglright ; B 58 37 301 464 ;\nC 174 ; WX 651 ; N fi ; B -129 -242 655 742 ;\nC 175 ; WX 652 ; N fl ; B -129 -242 685 742 ;\nC 177 ; WX 500 ; N endash ; B 12 209 531 292 ;\nC 178 ; WX 514 ; N dagger ; B 101 -125 545 707 ;\nC 179 ; WX 490 ; N daggerdbl ; B 32 -119 528 707 ;\nC 180 ; WX 280 ; N periodcentered ; B 67 161 247 339 ;\nC 182 ; WX 580 ; N paragraph ; B 110 -101 653 692 ;\nC 183 ; WX 465 ; N bullet ; B 99 174 454 529 ;\nC 184 ; WX 246 ; N quotesinglbase ; B -17 -153 182 167 ;\nC 185 ; WX 455 ; N quotedblbase ; B -17 -153 391 167 ;\nC 186 ; WX 455 ; N quotedblright ; B 95 387 503 707 ;\nC 187 ; WX 560 ; N guillemotright ; B 58 37 502 464 ;\nC 188 ; WX 1000 ; N ellipsis ; B 85 -12 931 166 ;\nC 189 ; WX 1297 ; N perthousand ; B 106 -31 1262 702 ;\nC 191 ; WX 454 ; N questiondown ; B -10 -217 391 502 ;\nC 193 ; WX 400 ; N grave ; B 109 511 381 740 ;\nC 194 ; WX 400 ; N acute ; B 186 511 458 740 ;\nC 195 ; WX 400 ; N circumflex ; B 93 520 471 747 ;\nC 196 ; WX 400 ; N tilde ; B 94 549 502 697 ;\nC 197 ; WX 400 ; N macron ; B 133 592 459 664 ;\nC 198 ; WX 400 ; N breve ; B 146 556 469 714 ;\nC 199 ; WX 402 ; N dotaccent ; B 220 561 378 710 ;\nC 200 ; WX 400 ; N dieresis ; B 106 561 504 710 ;\nC 202 ; WX 400 ; N ring ; B 166 529 423 762 ;\nC 203 ; WX 400 ; N cedilla ; B 85 -246 292 0 ;\nC 205 ; WX 400 ; N hungarumlaut ; B 158 546 482 750 ;\nC 206 ; WX 350 ; N ogonek ; B 38 -246 253 0 ;\nC 207 ; WX 400 ; N caron ; B 130 520 508 747 ;\nC 208 ; WX 1000 ; N emdash ; B 12 209 1031 292 ;\nC 225 ; WX 890 ; N AE ; B -107 0 958 692 ;\nC 227 ; WX 444 ; N ordfeminine ; B 62 265 482 590 ;\nC 232 ; WX 592 ; N Lslash ; B 11 0 597 692 ;\nC 233 ; WX 761 ; N Oslash ; B 77 -51 769 734 ;\nC 234 ; WX 1016 ; N OE ; B 76 0 1084 692 ;\nC 235 ; WX 412 ; N ordmasculine ; B 86 265 446 590 ;\nC 241 ; WX 789 ; N ae ; B 26 -12 810 509 ;\nC 245 ; WX 339 ; N dotlessi ; B 66 -12 343 502 ;\nC 248 ; WX 339 ; N lslash ; B 18 -12 420 742 ;\nC 249 ; WX 562 ; N oslash ; B 42 -69 556 549 ;\nC 250 ; WX 811 ; N oe ; B 42 -12 832 502 ;\nC 251 ; WX 628 ; N germandbls ; B -129 -242 692 742 ;\nC -1 ; WX 402 ; N onesuperior ; B 84 272 361 680 ;\nC -1 ; WX 600 ; N minus ; B 83 210 567 290 ;\nC -1 ; WX 375 ; N degree ; B 93 360 425 680 ;\nC -1 ; WX 562 ; N oacute ; B 42 -12 572 755 ;\nC -1 ; WX 761 ; N Odieresis ; B 78 -15 768 881 ;\nC -1 ; WX 562 ; N odieresis ; B 42 -12 585 710 ;\nC -1 ; WX 622 ; N Eacute ; B 5 0 687 904 ;\nC -1 ; WX 634 ; N ucircumflex ; B 71 -12 643 747 ;\nC -1 ; WX 940 ; N onequarter ; B 104 -27 849 695 ;\nC -1 ; WX 600 ; N logicalnot ; B 83 95 567 397 ;\nC -1 ; WX 622 ; N Ecircumflex ; B 5 0 687 905 ;\nC -1 ; WX 940 ; N onehalf ; B 90 -27 898 695 ;\nC -1 ; WX 761 ; N Otilde ; B 78 -15 768 876 ;\nC -1 ; WX 634 ; N uacute ; B 71 -12 643 740 ;\nC -1 ; WX 476 ; N eacute ; B 38 -12 545 755 ;\nC -1 ; WX 339 ; N iacute ; B 66 -12 438 740 ;\nC -1 ; WX 622 ; N Egrave ; B 5 0 687 904 ;\nC -1 ; WX 339 ; N icircumflex ; B 38 -12 416 747 ;\nC -1 ; WX 634 ; N mu ; B -3 -230 643 502 ;\nC -1 ; WX 265 ; N brokenbar ; B 117 -175 221 675 ;\nC -1 ; WX 600 ; N thorn ; B -6 -242 607 700 ;\nC -1 ; WX 634 ; N Aring ; B -59 0 639 879 ;\nC -1 ; WX 489 ; N yacute ; B -49 -242 553 740 ;\nC -1 ; WX 622 ; N Ydieresis ; B 92 0 765 881 ;\nC -1 ; WX 1100 ; N trademark ; B 103 277 1093 692 ;\nC -1 ; WX 824 ; N registered ; B 91 -15 819 707 ;\nC -1 ; WX 562 ; N ocircumflex ; B 42 -12 556 747 ;\nC -1 ; WX 634 ; N Agrave ; B -59 0 639 904 ;\nC -1 ; WX 551 ; N Scaron ; B 31 -15 612 916 ;\nC -1 ; WX 776 ; N Ugrave ; B 115 -15 867 904 ;\nC -1 ; WX 622 ; N Edieresis ; B 5 0 687 881 ;\nC -1 ; WX 776 ; N Uacute ; B 115 -15 867 904 ;\nC -1 ; WX 562 ; N otilde ; B 42 -12 583 697 ;\nC -1 ; WX 635 ; N ntilde ; B 45 -12 639 697 ;\nC -1 ; WX 489 ; N ydieresis ; B -49 -242 532 710 ;\nC -1 ; WX 634 ; N Aacute ; B -59 0 678 904 ;\nC -1 ; WX 562 ; N eth ; B 42 -12 558 742 ;\nC -1 ; WX 596 ; N acircumflex ; B 26 -12 612 747 ;\nC -1 ; WX 596 ; N aring ; B 26 -12 612 762 ;\nC -1 ; WX 761 ; N Ograve ; B 78 -15 768 904 ;\nC -1 ; WX 456 ; N ccedilla ; B 38 -246 498 502 ;\nC -1 ; WX 600 ; N multiply ; B 110 22 560 478 ;\nC -1 ; WX 600 ; N divide ; B 63 7 547 493 ;\nC -1 ; WX 402 ; N twosuperior ; B 29 272 423 680 ;\nC -1 ; WX 741 ; N Ntilde ; B -5 0 838 876 ;\nC -1 ; WX 634 ; N ugrave ; B 71 -12 643 740 ;\nC -1 ; WX 776 ; N Ucircumflex ; B 115 -15 867 905 ;\nC -1 ; WX 634 ; N Atilde ; B -59 0 662 876 ;\nC -1 ; WX 466 ; N zcaron ; B -17 -12 526 747 ;\nC -1 ; WX 339 ; N idieresis ; B 46 -12 444 710 ;\nC -1 ; WX 634 ; N Acircumflex ; B -59 0 639 905 ;\nC -1 ; WX 386 ; N Icircumflex ; B 5 0 506 905 ;\nC -1 ; WX 622 ; N Yacute ; B 92 0 765 904 ;\nC -1 ; WX 761 ; N Oacute ; B 78 -15 768 904 ;\nC -1 ; WX 634 ; N Adieresis ; B -59 0 652 881 ;\nC -1 ; WX 618 ; N Zcaron ; B -30 0 714 916 ;\nC -1 ; WX 596 ; N agrave ; B 26 -12 612 755 ;\nC -1 ; WX 402 ; N threesuperior ; B 59 265 421 680 ;\nC -1 ; WX 562 ; N ograve ; B 42 -12 556 755 ;\nC -1 ; WX 940 ; N threequarters ; B 95 -27 876 695 ;\nC -1 ; WX 780 ; N Eth ; B 11 0 790 692 ;\nC -1 ; WX 600 ; N plusminus ; B 83 0 567 549 ;\nC -1 ; WX 634 ; N udieresis ; B 71 -12 643 710 ;\nC -1 ; WX 476 ; N edieresis ; B 38 -12 542 710 ;\nC -1 ; WX 596 ; N aacute ; B 26 -12 621 755 ;\nC -1 ; WX 339 ; N igrave ; B 39 -12 343 740 ;\nC -1 ; WX 386 ; N Idieresis ; B 5 0 533 881 ;\nC -1 ; WX 596 ; N adieresis ; B 26 -12 612 710 ;\nC -1 ; WX 386 ; N Iacute ; B 5 0 549 904 ;\nC -1 ; WX 824 ; N copyright ; B 91 -15 819 707 ;\nC -1 ; WX 386 ; N Igrave ; B 5 0 466 904 ;\nC -1 ; WX 672 ; N Ccedilla ; B 76 -246 742 707 ;\nC -1 ; WX 417 ; N scaron ; B 10 -12 522 747 ;\nC -1 ; WX 476 ; N egrave ; B 38 -12 497 755 ;\nC -1 ; WX 761 ; N Ocircumflex ; B 78 -15 768 905 ;\nC -1 ; WX 629 ; N Thorn ; B 5 0 660 692 ;\nC -1 ; WX 596 ; N atilde ; B 26 -12 612 697 ;\nC -1 ; WX 776 ; N Udieresis ; B 115 -15 867 881 ;\nC -1 ; WX 476 ; N ecircumflex ; B 38 -12 524 747 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 697\n\nKPX A z 18\nKPX A y -40\nKPX A x 16\nKPX A w -30\nKPX A v -30\nKPX A u -18\nKPX A t -6\nKPX A s 6\nKPX A r -6\nKPX A quoteright -92\nKPX A quotedblright -92\nKPX A p -6\nKPX A o -18\nKPX A n -12\nKPX A m -12\nKPX A l -18\nKPX A h -6\nKPX A d 4\nKPX A c -6\nKPX A b -6\nKPX A a 10\nKPX A Y -56\nKPX A X -8\nKPX A W -46\nKPX A V -75\nKPX A U -50\nKPX A T -60\nKPX A Q -30\nKPX A O -30\nKPX A G -30\nKPX A C -30\n\nKPX B y -6\nKPX B u -12\nKPX B r -6\nKPX B quoteright -20\nKPX B quotedblright -32\nKPX B o 6\nKPX B l -20\nKPX B k -10\nKPX B i -12\nKPX B h -15\nKPX B e 4\nKPX B a 10\nKPX B W -30\nKPX B V -45\nKPX B U -30\nKPX B T -20\n\nKPX C z -6\nKPX C y -18\nKPX C u -12\nKPX C r -12\nKPX C quoteright 12\nKPX C quotedblright 20\nKPX C i -6\nKPX C e -6\nKPX C a -6\nKPX C Q -12\nKPX C O -12\nKPX C G -12\nKPX C C -12\n\nKPX D y 18\nKPX D quoteright -20\nKPX D quotedblright -20\nKPX D period -20\nKPX D o 6\nKPX D h -15\nKPX D e 6\nKPX D comma -20\nKPX D a 6\nKPX D Y -80\nKPX D W -40\nKPX D V -65\n\nKPX E z -6\nKPX E y -24\nKPX E x 15\nKPX E w -30\nKPX E v -18\nKPX E u -24\nKPX E t -18\nKPX E s -6\nKPX E r -6\nKPX E quoteright 10\nKPX E q 10\nKPX E period 15\nKPX E p -12\nKPX E n -12\nKPX E m -12\nKPX E l -6\nKPX E j -6\nKPX E i -12\nKPX E g -12\nKPX E d 10\nKPX E comma 15\nKPX E a 10\n\nKPX F y -12\nKPX F u -24\nKPX F r -12\nKPX F quoteright 40\nKPX F quotedblright 35\nKPX F period -120\nKPX F o -24\nKPX F i -6\nKPX F e -24\nKPX F comma -110\nKPX F a -30\nKPX F A -45\n\nKPX G y -25\nKPX G u -22\nKPX G r -22\nKPX G quoteright -30\nKPX G quotedblright -30\nKPX G n -22\nKPX G l -24\nKPX G i -12\nKPX G h -18\nKPX G e 5\n\nKPX H y -18\nKPX H u -30\nKPX H o -25\nKPX H i -25\nKPX H e -25\nKPX H a -25\n\nKPX I z -20\nKPX I y -6\nKPX I x -6\nKPX I w -30\nKPX I v -30\nKPX I u -30\nKPX I t -18\nKPX I s -18\nKPX I r -12\nKPX I p -18\nKPX I o -25\nKPX I n -18\nKPX I m -18\nKPX I l -6\nKPX I k -6\nKPX I j -20\nKPX I i -10\nKPX I g -24\nKPX I f -6\nKPX I e -25\nKPX I d -15\nKPX I c -25\nKPX I b -6\nKPX I a -15\n\nKPX J y -12\nKPX J u -32\nKPX J quoteright 6\nKPX J quotedblright 6\nKPX J o -36\nKPX J i -30\nKPX J e -30\nKPX J braceright 15\nKPX J a -36\n\nKPX K y -70\nKPX K w -36\nKPX K v -30\nKPX K u -30\nKPX K r -24\nKPX K quoteright 36\nKPX K quotedblright 36\nKPX K o -30\nKPX K n -24\nKPX K l 10\nKPX K i -12\nKPX K h 15\nKPX K e -30\nKPX K a -12\nKPX K Q -50\nKPX K O -50\nKPX K G -50\nKPX K C -50\nKPX K A 15\n\nKPX L y -70\nKPX L w -30\nKPX L u -18\nKPX L quoteright -110\nKPX L quotedblright -110\nKPX L l -16\nKPX L j -18\nKPX L i -18\nKPX L Y -80\nKPX L W -78\nKPX L V -110\nKPX L U -42\nKPX L T -100\nKPX L Q -48\nKPX L O -48\nKPX L G -48\nKPX L C -48\nKPX L A 40\n\nKPX M y -18\nKPX M u -24\nKPX M quoteright 6\nKPX M quotedblright 6\nKPX M o -25\nKPX M n -20\nKPX M j -35\nKPX M i -20\nKPX M e -25\nKPX M d -20\nKPX M c -25\nKPX M a -20\n\nKPX N y -18\nKPX N u -24\nKPX N o -18\nKPX N i -12\nKPX N e -16\nKPX N a -22\n\nKPX O z -6\nKPX O y 12\nKPX O u -6\nKPX O t -6\nKPX O s -6\nKPX O r -6\nKPX O quoteright -20\nKPX O quotedblright -20\nKPX O q 6\nKPX O period -10\nKPX O p -6\nKPX O n -6\nKPX O m -6\nKPX O l -15\nKPX O k -10\nKPX O j -6\nKPX O h -10\nKPX O g -6\nKPX O e 6\nKPX O d 6\nKPX O comma -10\nKPX O a 6\nKPX O Y -70\nKPX O X -30\nKPX O W -35\nKPX O V -50\nKPX O T -42\nKPX O A -8\n\nKPX P y 6\nKPX P u -18\nKPX P t -6\nKPX P s -24\nKPX P r -6\nKPX P quoteright -12\nKPX P period -170\nKPX P o -24\nKPX P n -12\nKPX P l -20\nKPX P h -20\nKPX P e -24\nKPX P comma -170\nKPX P a -40\nKPX P I -45\nKPX P H -45\nKPX P E -45\nKPX P A -70\n\nKPX Q u -6\nKPX Q quoteright -20\nKPX Q quotedblright -38\nKPX Q a -6\nKPX Q Y -70\nKPX Q X -12\nKPX Q W -35\nKPX Q V -50\nKPX Q U -30\nKPX Q T -36\nKPX Q A -18\n\nKPX R y -6\nKPX R u -12\nKPX R quoteright -22\nKPX R quotedblright -22\nKPX R o -20\nKPX R e -12\nKPX R Y -45\nKPX R X 15\nKPX R W -25\nKPX R V -35\nKPX R U -40\nKPX R T -18\nKPX R Q -8\nKPX R O -8\nKPX R G -8\nKPX R C -8\nKPX R A 15\n\nKPX S y -30\nKPX S w -30\nKPX S v -20\nKPX S u -18\nKPX S t -18\nKPX S r -20\nKPX S quoteright -38\nKPX S quotedblright -50\nKPX S p -18\nKPX S n -24\nKPX S m -24\nKPX S l -20\nKPX S k -18\nKPX S j -25\nKPX S i -20\nKPX S h -12\nKPX S e -6\n\nKPX T z -48\nKPX T y -52\nKPX T w -54\nKPX T u -54\nKPX T semicolon -6\nKPX T s -60\nKPX T r -54\nKPX T quoteright 36\nKPX T quotedblright 36\nKPX T period -70\nKPX T parenright 25\nKPX T o -78\nKPX T m -54\nKPX T i -22\nKPX T hyphen -100\nKPX T h 6\nKPX T endash -40\nKPX T emdash -40\nKPX T e -78\nKPX T comma -90\nKPX T bracketright 20\nKPX T braceright 30\nKPX T a -78\nKPX T Y 12\nKPX T X 18\nKPX T W 30\nKPX T V 20\nKPX T T 40\nKPX T Q -6\nKPX T O -6\nKPX T G -6\nKPX T C -6\nKPX T A -40\n\nKPX U z -18\nKPX U x -30\nKPX U v -20\nKPX U t -24\nKPX U s -40\nKPX U r -30\nKPX U p -30\nKPX U n -30\nKPX U m -30\nKPX U l -12\nKPX U k -12\nKPX U i -24\nKPX U h -6\nKPX U g -30\nKPX U f -10\nKPX U d -30\nKPX U c -30\nKPX U b -6\nKPX U a -30\nKPX U A -40\n\nKPX V y -34\nKPX V u -42\nKPX V semicolon -45\nKPX V r -55\nKPX V quoteright 46\nKPX V quotedblright 60\nKPX V period -110\nKPX V parenright 64\nKPX V o -55\nKPX V i 15\nKPX V hyphen -60\nKPX V endash -20\nKPX V emdash -20\nKPX V e -55\nKPX V comma -110\nKPX V colon -18\nKPX V bracketright 64\nKPX V braceright 64\nKPX V a -80\nKPX V T 12\nKPX V A -70\n\nKPX W y -36\nKPX W u -30\nKPX W t -10\nKPX W semicolon -12\nKPX W r -30\nKPX W quoteright 42\nKPX W quotedblright 55\nKPX W period -80\nKPX W parenright 55\nKPX W o -55\nKPX W m -30\nKPX W i 5\nKPX W hyphen -40\nKPX W h 16\nKPX W e -55\nKPX W d -60\nKPX W comma -80\nKPX W colon -12\nKPX W bracketright 64\nKPX W braceright 64\nKPX W a -60\nKPX W T 30\nKPX W Q -5\nKPX W O -5\nKPX W G -5\nKPX W C -5\nKPX W A -45\n\nKPX X y -40\nKPX X u -30\nKPX X r -6\nKPX X quoteright 24\nKPX X quotedblright 40\nKPX X i -6\nKPX X e -18\nKPX X a -6\nKPX X Y -6\nKPX X W -6\nKPX X Q -45\nKPX X O -45\nKPX X G -45\nKPX X C -45\n\nKPX Y v -60\nKPX Y u -70\nKPX Y t -32\nKPX Y semicolon -20\nKPX Y quoteright 56\nKPX Y quotedblright 70\nKPX Y q -100\nKPX Y period -80\nKPX Y parenright 5\nKPX Y o -95\nKPX Y l 15\nKPX Y i 15\nKPX Y hyphen -110\nKPX Y endash -40\nKPX Y emdash -40\nKPX Y e -95\nKPX Y d -85\nKPX Y comma -80\nKPX Y colon -20\nKPX Y bracketright 64\nKPX Y braceright 64\nKPX Y a -85\nKPX Y Y 12\nKPX Y X 12\nKPX Y W 12\nKPX Y V 6\nKPX Y T 30\nKPX Y Q -25\nKPX Y O -25\nKPX Y G -25\nKPX Y C -25\nKPX Y A -40\n\nKPX Z y -36\nKPX Z w -36\nKPX Z u -12\nKPX Z quoteright 18\nKPX Z quotedblright 18\nKPX Z o -6\nKPX Z i -12\nKPX Z e -6\nKPX Z a -6\nKPX Z Q -20\nKPX Z O -20\nKPX Z G -20\nKPX Z C -20\nKPX Z A 30\n\nKPX a quoteright -54\nKPX a quotedblright -54\n\nKPX b y -6\nKPX b w -5\nKPX b v -5\nKPX b quoteright -30\nKPX b quotedblright -30\nKPX b period -15\nKPX b comma -15\n\nKPX braceleft Y 64\nKPX braceleft W 64\nKPX braceleft V 64\nKPX braceleft T 40\nKPX braceleft J 60\n\nKPX bracketleft Y 60\nKPX bracketleft W 64\nKPX bracketleft V 64\nKPX bracketleft T 35\nKPX bracketleft J 30\n\nKPX c quoteright 5\nKPX c quotedblright 5\n\nKPX colon space -30\n\nKPX comma space -40\nKPX comma quoteright -100\nKPX comma quotedblright -100\n\nKPX d quoteright -12\nKPX d quotedblright -12\nKPX d period 15\nKPX d comma 15\n\nKPX e y 6\nKPX e x -10\nKPX e w -10\nKPX e v -10\nKPX e quoteright -25\nKPX e quotedblright -25\n\nKPX f quoteright 120\nKPX f quotedblright 120\nKPX f period -30\nKPX f parenright 100\nKPX f comma -30\nKPX f bracketright 110\nKPX f braceright 110\n\nKPX g y 50\nKPX g quotedblright -20\nKPX g p 30\nKPX g f 42\nKPX g comma 20\n\nKPX h quoteright -78\nKPX h quotedblright -78\n\nKPX i quoteright -20\nKPX i quotedblright -20\n\nKPX j quoteright -20\nKPX j quotedblright -20\nKPX j period -20\nKPX j comma -20\n\nKPX k quoteright -38\nKPX k quotedblright -38\n\nKPX l quoteright -12\nKPX l quotedblright -12\n\nKPX m quoteright -78\nKPX m quotedblright -78\n\nKPX n quoteright -88\nKPX n quotedblright -88\n\nKPX o y -12\nKPX o x -20\nKPX o w -25\nKPX o v -25\nKPX o quoteright -50\nKPX o quotedblright -50\nKPX o period -10\nKPX o comma -10\n\nKPX p w -6\nKPX p quoteright -30\nKPX p quotedblright -52\nKPX p period -15\nKPX p comma -15\n\nKPX parenleft Y 64\nKPX parenleft W 64\nKPX parenleft V 64\nKPX parenleft T 30\nKPX parenleft J 50\n\nKPX period space -40\nKPX period quoteright -100\nKPX period quotedblright -100\n\nKPX q quoteright -40\nKPX q quotedblright -40\nKPX q period -10\nKPX q comma -5\n\nKPX quotedblleft z -30\nKPX quotedblleft x -60\nKPX quotedblleft w -12\nKPX quotedblleft v -12\nKPX quotedblleft u -12\nKPX quotedblleft t 5\nKPX quotedblleft s -30\nKPX quotedblleft r -12\nKPX quotedblleft q -50\nKPX quotedblleft p -12\nKPX quotedblleft o -30\nKPX quotedblleft n -12\nKPX quotedblleft m -12\nKPX quotedblleft l 10\nKPX quotedblleft k 10\nKPX quotedblleft h 10\nKPX quotedblleft g -30\nKPX quotedblleft e -30\nKPX quotedblleft d -50\nKPX quotedblleft c -30\nKPX quotedblleft b 24\nKPX quotedblleft a -50\nKPX quotedblleft Y 30\nKPX quotedblleft X 45\nKPX quotedblleft W 55\nKPX quotedblleft V 40\nKPX quotedblleft T 36\nKPX quotedblleft A -100\n\nKPX quotedblright space -50\nKPX quotedblright period -200\nKPX quotedblright comma -200\n\nKPX quoteleft z -30\nKPX quoteleft y 30\nKPX quoteleft x -10\nKPX quoteleft w -12\nKPX quoteleft u -12\nKPX quoteleft t -30\nKPX quoteleft s -30\nKPX quoteleft r -12\nKPX quoteleft q -30\nKPX quoteleft p -12\nKPX quoteleft o -30\nKPX quoteleft n -12\nKPX quoteleft m -12\nKPX quoteleft l 10\nKPX quoteleft k 10\nKPX quoteleft h 10\nKPX quoteleft g -30\nKPX quoteleft e -30\nKPX quoteleft d -30\nKPX quoteleft c -30\nKPX quoteleft b 24\nKPX quoteleft a -30\nKPX quoteleft Y 12\nKPX quoteleft X 46\nKPX quoteleft W 46\nKPX quoteleft V 28\nKPX quoteleft T 36\nKPX quoteleft A -100\n\nKPX quoteright v -20\nKPX quoteright space -50\nKPX quoteright s -45\nKPX quoteright r -12\nKPX quoteright period -140\nKPX quoteright m -12\nKPX quoteright l -12\nKPX quoteright d -65\nKPX quoteright comma -140\n\nKPX r z 20\nKPX r y 18\nKPX r x 12\nKPX r w 6\nKPX r v 6\nKPX r t 8\nKPX r semicolon 20\nKPX r quoteright -6\nKPX r quotedblright -6\nKPX r q -24\nKPX r period -100\nKPX r o -6\nKPX r l -12\nKPX r k -12\nKPX r hyphen -40\nKPX r h -10\nKPX r f 8\nKPX r endash -20\nKPX r e -26\nKPX r d -25\nKPX r comma -100\nKPX r colon 20\nKPX r c -12\nKPX r a -25\n\nKPX s quoteright -25\nKPX s quotedblright -30\n\nKPX semicolon space -30\n\nKPX space quotesinglbase -60\nKPX space quoteleft -60\nKPX space quotedblleft -60\nKPX space quotedblbase -60\nKPX space Y -70\nKPX space W -50\nKPX space V -70\nKPX space T -50\nKPX space A -50\n\nKPX t quoteright 15\nKPX t quotedblright 15\nKPX t period 15\nKPX t comma 15\n\nKPX u quoteright -65\nKPX u quotedblright -78\nKPX u period 20\nKPX u comma 20\n\nKPX v quoteright -10\nKPX v quotedblright -10\nKPX v q -6\nKPX v period -62\nKPX v o -6\nKPX v e -6\nKPX v d -6\nKPX v comma -62\nKPX v c -6\nKPX v a -6\n\nKPX w quoteright -10\nKPX w quotedblright -10\nKPX w period -40\nKPX w comma -50\n\nKPX x y 12\nKPX x w -6\nKPX x quoteright -30\nKPX x quotedblright -30\nKPX x q -6\nKPX x o -6\nKPX x e -6\nKPX x d -6\nKPX x c -6\n\nKPX y quoteright -10\nKPX y quotedblright -10\nKPX y q -10\nKPX y period -56\nKPX y d -10\nKPX y comma -56\n\nKPX z quoteright -40\nKPX z quotedblright -40\nKPX z o -6\nKPX z e -6\nKPX z d -6\nKPX z c -6\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/putr8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1989, 1991 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Fri Jan 17 13:38:17 1992\nComment UniqueID 37674\nComment VMusage 32991 39883\nFontName Utopia-Regular\nFullName Utopia Regular\nFamilyName Utopia\nWeight Regular\nItalicAngle 0\nIsFixedPitch false\nFontBBox -158 -250 1158 890 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.002\nNotice Copyright (c) 1989, 1991 Adobe Systems Incorporated.  All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.\nEncodingScheme AdobeStandardEncoding\nCapHeight 692\nXHeight 490\nAscender 742\nDescender -230\nStartCharMetrics 228\nC 32 ; WX 225 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 242 ; N exclam ; B 58 -12 184 707 ;\nC 34 ; WX 458 ; N quotedbl ; B 101 464 358 742 ;\nC 35 ; WX 530 ; N numbersign ; B 11 0 519 668 ;\nC 36 ; WX 530 ; N dollar ; B 44 -102 487 743 ;\nC 37 ; WX 838 ; N percent ; B 50 -25 788 700 ;\nC 38 ; WX 706 ; N ampersand ; B 46 -12 692 680 ;\nC 39 ; WX 278 ; N quoteright ; B 72 472 207 742 ;\nC 40 ; WX 350 ; N parenleft ; B 105 -128 325 692 ;\nC 41 ; WX 350 ; N parenright ; B 25 -128 245 692 ;\nC 42 ; WX 412 ; N asterisk ; B 50 356 363 707 ;\nC 43 ; WX 570 ; N plus ; B 43 0 527 490 ;\nC 44 ; WX 265 ; N comma ; B 51 -141 193 141 ;\nC 45 ; WX 392 ; N hyphen ; B 74 216 319 286 ;\nC 46 ; WX 265 ; N period ; B 70 -12 196 116 ;\nC 47 ; WX 460 ; N slash ; B 92 -15 369 707 ;\nC 48 ; WX 530 ; N zero ; B 41 -12 489 680 ;\nC 49 ; WX 530 ; N one ; B 109 0 437 680 ;\nC 50 ; WX 530 ; N two ; B 27 0 485 680 ;\nC 51 ; WX 530 ; N three ; B 27 -12 473 680 ;\nC 52 ; WX 530 ; N four ; B 19 0 493 668 ;\nC 53 ; WX 530 ; N five ; B 40 -12 480 668 ;\nC 54 ; WX 530 ; N six ; B 44 -12 499 680 ;\nC 55 ; WX 530 ; N seven ; B 41 -12 497 668 ;\nC 56 ; WX 530 ; N eight ; B 42 -12 488 680 ;\nC 57 ; WX 530 ; N nine ; B 36 -12 477 680 ;\nC 58 ; WX 265 ; N colon ; B 70 -12 196 490 ;\nC 59 ; WX 265 ; N semicolon ; B 51 -141 196 490 ;\nC 60 ; WX 570 ; N less ; B 46 1 524 499 ;\nC 61 ; WX 570 ; N equal ; B 43 111 527 389 ;\nC 62 ; WX 570 ; N greater ; B 46 1 524 499 ;\nC 63 ; WX 389 ; N question ; B 29 -12 359 707 ;\nC 64 ; WX 793 ; N at ; B 46 -15 755 707 ;\nC 65 ; WX 635 ; N A ; B -29 0 650 692 ;\nC 66 ; WX 646 ; N B ; B 35 0 595 692 ;\nC 67 ; WX 684 ; N C ; B 48 -15 649 707 ;\nC 68 ; WX 779 ; N D ; B 35 0 731 692 ;\nC 69 ; WX 606 ; N E ; B 35 0 577 692 ;\nC 70 ; WX 580 ; N F ; B 35 0 543 692 ;\nC 71 ; WX 734 ; N G ; B 48 -15 725 707 ;\nC 72 ; WX 798 ; N H ; B 35 0 763 692 ;\nC 73 ; WX 349 ; N I ; B 35 0 314 692 ;\nC 74 ; WX 350 ; N J ; B 0 -114 323 692 ;\nC 75 ; WX 658 ; N K ; B 35 -5 671 692 ;\nC 76 ; WX 568 ; N L ; B 35 0 566 692 ;\nC 77 ; WX 944 ; N M ; B 33 0 909 692 ;\nC 78 ; WX 780 ; N N ; B 34 0 753 692 ;\nC 79 ; WX 762 ; N O ; B 48 -15 714 707 ;\nC 80 ; WX 600 ; N P ; B 35 0 574 692 ;\nC 81 ; WX 762 ; N Q ; B 48 -193 714 707 ;\nC 82 ; WX 644 ; N R ; B 35 0 638 692 ;\nC 83 ; WX 541 ; N S ; B 50 -15 504 707 ;\nC 84 ; WX 621 ; N T ; B 22 0 599 692 ;\nC 85 ; WX 791 ; N U ; B 29 -15 762 692 ;\nC 86 ; WX 634 ; N V ; B -18 0 678 692 ;\nC 87 ; WX 940 ; N W ; B -13 0 977 692 ;\nC 88 ; WX 624 ; N X ; B -19 0 657 692 ;\nC 89 ; WX 588 ; N Y ; B -12 0 632 692 ;\nC 90 ; WX 610 ; N Z ; B 9 0 594 692 ;\nC 91 ; WX 330 ; N bracketleft ; B 133 -128 292 692 ;\nC 92 ; WX 460 ; N backslash ; B 91 -15 369 707 ;\nC 93 ; WX 330 ; N bracketright ; B 38 -128 197 692 ;\nC 94 ; WX 570 ; N asciicircum ; B 56 228 514 668 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 278 ; N quoteleft ; B 72 478 207 748 ;\nC 97 ; WX 523 ; N a ; B 49 -12 525 502 ;\nC 98 ; WX 598 ; N b ; B 20 -12 549 742 ;\nC 99 ; WX 496 ; N c ; B 49 -12 473 502 ;\nC 100 ; WX 598 ; N d ; B 49 -12 583 742 ;\nC 101 ; WX 514 ; N e ; B 49 -12 481 502 ;\nC 102 ; WX 319 ; N f ; B 30 0 389 742 ; L i fi ; L l fl ;\nC 103 ; WX 520 ; N g ; B 42 -242 525 512 ;\nC 104 ; WX 607 ; N h ; B 21 0 592 742 ;\nC 105 ; WX 291 ; N i ; B 32 0 276 715 ;\nC 106 ; WX 280 ; N j ; B -33 -242 214 715 ;\nC 107 ; WX 524 ; N k ; B 20 -5 538 742 ;\nC 108 ; WX 279 ; N l ; B 20 0 264 742 ;\nC 109 ; WX 923 ; N m ; B 32 0 908 502 ;\nC 110 ; WX 619 ; N n ; B 32 0 604 502 ;\nC 111 ; WX 577 ; N o ; B 49 -12 528 502 ;\nC 112 ; WX 608 ; N p ; B 25 -230 559 502 ;\nC 113 ; WX 591 ; N q ; B 49 -230 583 502 ;\nC 114 ; WX 389 ; N r ; B 32 0 386 502 ;\nC 115 ; WX 436 ; N s ; B 47 -12 400 502 ;\nC 116 ; WX 344 ; N t ; B 31 -12 342 616 ;\nC 117 ; WX 606 ; N u ; B 26 -12 591 502 ;\nC 118 ; WX 504 ; N v ; B 1 0 529 490 ;\nC 119 ; WX 768 ; N w ; B -2 0 792 490 ;\nC 120 ; WX 486 ; N x ; B 1 0 509 490 ;\nC 121 ; WX 506 ; N y ; B -5 -242 528 490 ;\nC 122 ; WX 480 ; N z ; B 19 0 462 490 ;\nC 123 ; WX 340 ; N braceleft ; B 79 -128 298 692 ;\nC 124 ; WX 228 ; N bar ; B 80 -250 148 750 ;\nC 125 ; WX 340 ; N braceright ; B 42 -128 261 692 ;\nC 126 ; WX 570 ; N asciitilde ; B 73 175 497 317 ;\nC 161 ; WX 242 ; N exclamdown ; B 58 -217 184 502 ;\nC 162 ; WX 530 ; N cent ; B 37 -10 487 675 ;\nC 163 ; WX 530 ; N sterling ; B 27 0 510 680 ;\nC 164 ; WX 150 ; N fraction ; B -158 -27 308 695 ;\nC 165 ; WX 530 ; N yen ; B -2 0 525 668 ;\nC 166 ; WX 530 ; N florin ; B -2 -135 522 691 ;\nC 167 ; WX 554 ; N section ; B 46 -115 507 707 ;\nC 168 ; WX 530 ; N currency ; B 25 90 505 578 ;\nC 169 ; WX 278 ; N quotesingle ; B 93 464 185 742 ;\nC 170 ; WX 458 ; N quotedblleft ; B 72 478 387 748 ;\nC 171 ; WX 442 ; N guillemotleft ; B 41 41 401 435 ;\nC 172 ; WX 257 ; N guilsinglleft ; B 41 41 216 435 ;\nC 173 ; WX 257 ; N guilsinglright ; B 41 41 216 435 ;\nC 174 ; WX 610 ; N fi ; B 30 0 595 742 ;\nC 175 ; WX 610 ; N fl ; B 30 0 595 742 ;\nC 177 ; WX 500 ; N endash ; B 0 221 500 279 ;\nC 178 ; WX 504 ; N dagger ; B 45 -125 459 717 ;\nC 179 ; WX 488 ; N daggerdbl ; B 45 -119 443 717 ;\nC 180 ; WX 265 ; N periodcentered ; B 70 188 196 316 ;\nC 182 ; WX 555 ; N paragraph ; B 64 -101 529 692 ;\nC 183 ; WX 409 ; N bullet ; B 45 192 364 512 ;\nC 184 ; WX 278 ; N quotesinglbase ; B 72 -125 207 145 ;\nC 185 ; WX 458 ; N quotedblbase ; B 72 -125 387 145 ;\nC 186 ; WX 458 ; N quotedblright ; B 72 472 387 742 ;\nC 187 ; WX 442 ; N guillemotright ; B 41 41 401 435 ;\nC 188 ; WX 1000 ; N ellipsis ; B 104 -12 896 116 ;\nC 189 ; WX 1208 ; N perthousand ; B 50 -25 1158 700 ;\nC 191 ; WX 389 ; N questiondown ; B 30 -217 360 502 ;\nC 193 ; WX 400 ; N grave ; B 49 542 271 723 ;\nC 194 ; WX 400 ; N acute ; B 129 542 351 723 ;\nC 195 ; WX 400 ; N circumflex ; B 47 541 353 720 ;\nC 196 ; WX 400 ; N tilde ; B 22 563 377 682 ;\nC 197 ; WX 400 ; N macron ; B 56 597 344 656 ;\nC 198 ; WX 400 ; N breve ; B 63 568 337 704 ;\nC 199 ; WX 400 ; N dotaccent ; B 140 570 260 683 ;\nC 200 ; WX 400 ; N dieresis ; B 36 570 364 683 ;\nC 202 ; WX 400 ; N ring ; B 92 550 308 752 ;\nC 203 ; WX 400 ; N cedilla ; B 163 -230 329 0 ;\nC 205 ; WX 400 ; N hungarumlaut ; B 101 546 380 750 ;\nC 206 ; WX 400 ; N ogonek ; B 103 -230 295 0 ;\nC 207 ; WX 400 ; N caron ; B 47 541 353 720 ;\nC 208 ; WX 1000 ; N emdash ; B 0 221 1000 279 ;\nC 225 ; WX 876 ; N AE ; B -63 0 847 692 ;\nC 227 ; WX 390 ; N ordfeminine ; B 40 265 364 590 ;\nC 232 ; WX 574 ; N Lslash ; B 36 0 572 692 ;\nC 233 ; WX 762 ; N Oslash ; B 48 -53 714 739 ;\nC 234 ; WX 1025 ; N OE ; B 48 0 996 692 ;\nC 235 ; WX 398 ; N ordmasculine ; B 35 265 363 590 ;\nC 241 ; WX 797 ; N ae ; B 49 -12 764 502 ;\nC 245 ; WX 291 ; N dotlessi ; B 32 0 276 502 ;\nC 248 ; WX 294 ; N lslash ; B 14 0 293 742 ;\nC 249 ; WX 577 ; N oslash ; B 49 -41 528 532 ;\nC 250 ; WX 882 ; N oe ; B 49 -12 849 502 ;\nC 251 ; WX 601 ; N germandbls ; B 22 -12 573 742 ;\nC -1 ; WX 380 ; N onesuperior ; B 81 272 307 680 ;\nC -1 ; WX 570 ; N minus ; B 43 221 527 279 ;\nC -1 ; WX 350 ; N degree ; B 37 404 313 680 ;\nC -1 ; WX 577 ; N oacute ; B 49 -12 528 723 ;\nC -1 ; WX 762 ; N Odieresis ; B 48 -15 714 841 ;\nC -1 ; WX 577 ; N odieresis ; B 49 -12 528 683 ;\nC -1 ; WX 606 ; N Eacute ; B 35 0 577 890 ;\nC -1 ; WX 606 ; N ucircumflex ; B 26 -12 591 720 ;\nC -1 ; WX 860 ; N onequarter ; B 65 -27 795 695 ;\nC -1 ; WX 570 ; N logicalnot ; B 43 102 527 389 ;\nC -1 ; WX 606 ; N Ecircumflex ; B 35 0 577 876 ;\nC -1 ; WX 860 ; N onehalf ; B 58 -27 807 695 ;\nC -1 ; WX 762 ; N Otilde ; B 48 -15 714 842 ;\nC -1 ; WX 606 ; N uacute ; B 26 -12 591 723 ;\nC -1 ; WX 514 ; N eacute ; B 49 -12 481 723 ;\nC -1 ; WX 291 ; N iacute ; B 32 0 317 723 ;\nC -1 ; WX 606 ; N Egrave ; B 35 0 577 890 ;\nC -1 ; WX 291 ; N icircumflex ; B -3 0 304 720 ;\nC -1 ; WX 606 ; N mu ; B 26 -246 591 502 ;\nC -1 ; WX 228 ; N brokenbar ; B 80 -175 148 675 ;\nC -1 ; WX 606 ; N thorn ; B 23 -230 557 722 ;\nC -1 ; WX 627 ; N Aring ; B -32 0 647 861 ;\nC -1 ; WX 506 ; N yacute ; B -5 -242 528 723 ;\nC -1 ; WX 588 ; N Ydieresis ; B -12 0 632 841 ;\nC -1 ; WX 1100 ; N trademark ; B 45 277 1048 692 ;\nC -1 ; WX 818 ; N registered ; B 45 -15 773 707 ;\nC -1 ; WX 577 ; N ocircumflex ; B 49 -12 528 720 ;\nC -1 ; WX 635 ; N Agrave ; B -29 0 650 890 ;\nC -1 ; WX 541 ; N Scaron ; B 50 -15 504 882 ;\nC -1 ; WX 791 ; N Ugrave ; B 29 -15 762 890 ;\nC -1 ; WX 606 ; N Edieresis ; B 35 0 577 841 ;\nC -1 ; WX 791 ; N Uacute ; B 29 -15 762 890 ;\nC -1 ; WX 577 ; N otilde ; B 49 -12 528 682 ;\nC -1 ; WX 619 ; N ntilde ; B 32 0 604 682 ;\nC -1 ; WX 506 ; N ydieresis ; B -5 -242 528 683 ;\nC -1 ; WX 635 ; N Aacute ; B -29 0 650 890 ;\nC -1 ; WX 577 ; N eth ; B 49 -12 528 742 ;\nC -1 ; WX 523 ; N acircumflex ; B 49 -12 525 720 ;\nC -1 ; WX 523 ; N aring ; B 49 -12 525 752 ;\nC -1 ; WX 762 ; N Ograve ; B 48 -15 714 890 ;\nC -1 ; WX 496 ; N ccedilla ; B 49 -230 473 502 ;\nC -1 ; WX 570 ; N multiply ; B 63 22 507 478 ;\nC -1 ; WX 570 ; N divide ; B 43 26 527 474 ;\nC -1 ; WX 380 ; N twosuperior ; B 32 272 348 680 ;\nC -1 ; WX 780 ; N Ntilde ; B 34 0 753 842 ;\nC -1 ; WX 606 ; N ugrave ; B 26 -12 591 723 ;\nC -1 ; WX 791 ; N Ucircumflex ; B 29 -15 762 876 ;\nC -1 ; WX 635 ; N Atilde ; B -29 0 650 842 ;\nC -1 ; WX 480 ; N zcaron ; B 19 0 462 720 ;\nC -1 ; WX 291 ; N idieresis ; B -19 0 310 683 ;\nC -1 ; WX 635 ; N Acircumflex ; B -29 0 650 876 ;\nC -1 ; WX 349 ; N Icircumflex ; B 22 0 328 876 ;\nC -1 ; WX 588 ; N Yacute ; B -12 0 632 890 ;\nC -1 ; WX 762 ; N Oacute ; B 48 -15 714 890 ;\nC -1 ; WX 635 ; N Adieresis ; B -29 0 650 841 ;\nC -1 ; WX 610 ; N Zcaron ; B 9 0 594 882 ;\nC -1 ; WX 523 ; N agrave ; B 49 -12 525 723 ;\nC -1 ; WX 380 ; N threesuperior ; B 36 265 339 680 ;\nC -1 ; WX 577 ; N ograve ; B 49 -12 528 723 ;\nC -1 ; WX 860 ; N threequarters ; B 50 -27 808 695 ;\nC -1 ; WX 785 ; N Eth ; B 20 0 737 692 ;\nC -1 ; WX 570 ; N plusminus ; B 43 0 527 556 ;\nC -1 ; WX 606 ; N udieresis ; B 26 -12 591 683 ;\nC -1 ; WX 514 ; N edieresis ; B 49 -12 481 683 ;\nC -1 ; WX 523 ; N aacute ; B 49 -12 525 723 ;\nC -1 ; WX 291 ; N igrave ; B -35 0 276 723 ;\nC -1 ; WX 349 ; N Idieresis ; B 13 0 337 841 ;\nC -1 ; WX 523 ; N adieresis ; B 49 -12 525 683 ;\nC -1 ; WX 349 ; N Iacute ; B 35 0 371 890 ;\nC -1 ; WX 818 ; N copyright ; B 45 -15 773 707 ;\nC -1 ; WX 349 ; N Igrave ; B -17 0 314 890 ;\nC -1 ; WX 680 ; N Ccedilla ; B 48 -230 649 707 ;\nC -1 ; WX 436 ; N scaron ; B 47 -12 400 720 ;\nC -1 ; WX 514 ; N egrave ; B 49 -12 481 723 ;\nC -1 ; WX 762 ; N Ocircumflex ; B 48 -15 714 876 ;\nC -1 ; WX 593 ; N Thorn ; B 35 0 556 692 ;\nC -1 ; WX 523 ; N atilde ; B 49 -12 525 682 ;\nC -1 ; WX 791 ; N Udieresis ; B 29 -15 762 841 ;\nC -1 ; WX 514 ; N ecircumflex ; B 49 -12 481 720 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 712\n\nKPX A z 6\nKPX A y -50\nKPX A w -45\nKPX A v -60\nKPX A u -25\nKPX A t -12\nKPX A quoteright -120\nKPX A quotedblright -120\nKPX A q -6\nKPX A p -18\nKPX A o -12\nKPX A e -6\nKPX A d -12\nKPX A c -12\nKPX A b -12\nKPX A Y -70\nKPX A X -6\nKPX A W -58\nKPX A V -72\nKPX A U -50\nKPX A T -70\nKPX A Q -24\nKPX A O -24\nKPX A G -24\nKPX A C -24\n\nKPX B y -18\nKPX B u -12\nKPX B r -12\nKPX B period -30\nKPX B o -6\nKPX B l -12\nKPX B i -12\nKPX B h -12\nKPX B e -6\nKPX B comma -20\nKPX B a -12\nKPX B W -25\nKPX B V -20\nKPX B U -20\nKPX B T -20\n\nKPX C z -18\nKPX C y -24\nKPX C u -18\nKPX C r -6\nKPX C o -12\nKPX C e -12\nKPX C a -12\nKPX C Q -6\nKPX C O -6\nKPX C G -6\nKPX C C -6\n\nKPX D y 6\nKPX D u -12\nKPX D r -12\nKPX D quoteright -20\nKPX D quotedblright -20\nKPX D period -60\nKPX D i -6\nKPX D h -12\nKPX D e -6\nKPX D comma -50\nKPX D a -6\nKPX D Y -45\nKPX D W -35\nKPX D V -35\n\nKPX E z -6\nKPX E y -30\nKPX E x -6\nKPX E w -24\nKPX E v -24\nKPX E u -12\nKPX E t -18\nKPX E r -4\nKPX E q -6\nKPX E p -18\nKPX E o -6\nKPX E n -4\nKPX E m -4\nKPX E l 5\nKPX E k 5\nKPX E j -6\nKPX E i -6\nKPX E g -6\nKPX E f -12\nKPX E e -6\nKPX E d -6\nKPX E c -6\nKPX E b -12\nKPX E Y -6\nKPX E W -6\nKPX E V -6\n\nKPX F y -18\nKPX F u -12\nKPX F r -20\nKPX F period -180\nKPX F o -36\nKPX F l -12\nKPX F i -10\nKPX F endash 20\nKPX F e -36\nKPX F comma -180\nKPX F a -48\nKPX F A -60\n\nKPX G y -18\nKPX G u -12\nKPX G r -5\nKPX G o 5\nKPX G n -5\nKPX G l -6\nKPX G i -12\nKPX G h -12\nKPX G e 5\nKPX G a -12\n\nKPX H y -24\nKPX H u -26\nKPX H o -30\nKPX H i -18\nKPX H e -30\nKPX H a -24\n\nKPX I z -6\nKPX I y -6\nKPX I x -6\nKPX I w -18\nKPX I v -24\nKPX I u -26\nKPX I t -24\nKPX I s -18\nKPX I r -12\nKPX I p -26\nKPX I o -30\nKPX I n -18\nKPX I m -18\nKPX I l -6\nKPX I k -6\nKPX I h -6\nKPX I g -10\nKPX I f -6\nKPX I e -30\nKPX I d -30\nKPX I c -30\nKPX I b -6\nKPX I a -24\n\nKPX J y -12\nKPX J u -36\nKPX J o -30\nKPX J i -20\nKPX J e -30\nKPX J bracketright 20\nKPX J braceright 20\nKPX J a -36\n\nKPX K y -60\nKPX K w -70\nKPX K v -70\nKPX K u -42\nKPX K o -30\nKPX K i 6\nKPX K e -24\nKPX K a -12\nKPX K Q -42\nKPX K O -42\nKPX K G -42\nKPX K C -42\n\nKPX L y -52\nKPX L w -58\nKPX L u -12\nKPX L quoteright -130\nKPX L quotedblright -50\nKPX L l 6\nKPX L j -6\nKPX L Y -70\nKPX L W -90\nKPX L V -100\nKPX L U -24\nKPX L T -100\nKPX L Q -18\nKPX L O -10\nKPX L G -18\nKPX L C -18\nKPX L A 12\n\nKPX M y -24\nKPX M u -36\nKPX M o -30\nKPX M n -6\nKPX M j -12\nKPX M i -12\nKPX M e -30\nKPX M d -30\nKPX M c -30\nKPX M a -12\n\nKPX N y -24\nKPX N u -30\nKPX N o -30\nKPX N i -24\nKPX N e -30\nKPX N a -30\n\nKPX O z -6\nKPX O u -6\nKPX O t -6\nKPX O s -6\nKPX O q -6\nKPX O period -60\nKPX O p -6\nKPX O o -6\nKPX O n -5\nKPX O m -5\nKPX O l -6\nKPX O k -6\nKPX O i -5\nKPX O h -12\nKPX O g -6\nKPX O e -6\nKPX O d -6\nKPX O comma -50\nKPX O c -6\nKPX O a -12\nKPX O Y -55\nKPX O X -24\nKPX O W -30\nKPX O V -18\nKPX O T -30\nKPX O A -18\n\nKPX P u -12\nKPX P t -6\nKPX P s -24\nKPX P r -12\nKPX P period -200\nKPX P o -30\nKPX P n -12\nKPX P l -6\nKPX P hyphen -40\nKPX P h -6\nKPX P e -30\nKPX P comma -200\nKPX P a -36\nKPX P I -6\nKPX P H -12\nKPX P E -6\nKPX P A -55\n\nKPX Q u -6\nKPX Q a -18\nKPX Q Y -30\nKPX Q X -24\nKPX Q W -24\nKPX Q V -18\nKPX Q U -30\nKPX Q T -24\nKPX Q A -18\n\nKPX R y -20\nKPX R u -12\nKPX R quoteright -20\nKPX R quotedblright -20\nKPX R o -20\nKPX R hyphen -30\nKPX R e -20\nKPX R d -20\nKPX R a -12\nKPX R Y -45\nKPX R W -24\nKPX R V -32\nKPX R U -30\nKPX R T -32\nKPX R Q -24\nKPX R O -24\nKPX R G -24\nKPX R C -24\n\nKPX S y -25\nKPX S w -30\nKPX S v -30\nKPX S u -24\nKPX S t -24\nKPX S r -20\nKPX S quoteright -10\nKPX S quotedblright -10\nKPX S q -5\nKPX S p -24\nKPX S o -12\nKPX S n -20\nKPX S m -20\nKPX S l -18\nKPX S k -24\nKPX S j -12\nKPX S i -20\nKPX S h -12\nKPX S e -12\nKPX S a -18\n\nKPX T z -64\nKPX T y -84\nKPX T w -100\nKPX T u -82\nKPX T semicolon -56\nKPX T s -82\nKPX T r -82\nKPX T quoteright 24\nKPX T period -110\nKPX T parenright 54\nKPX T o -100\nKPX T m -82\nKPX T i -34\nKPX T hyphen -100\nKPX T endash -50\nKPX T emdash -50\nKPX T e -100\nKPX T comma -110\nKPX T colon -50\nKPX T bracketright 54\nKPX T braceright 54\nKPX T a -100\nKPX T Y 12\nKPX T X 18\nKPX T W 6\nKPX T V 6\nKPX T T 12\nKPX T S -12\nKPX T Q -18\nKPX T O -18\nKPX T G -18\nKPX T C -18\nKPX T A -65\n\nKPX U z -30\nKPX U y -20\nKPX U x -30\nKPX U v -20\nKPX U t -36\nKPX U s -40\nKPX U r -40\nKPX U p -42\nKPX U n -40\nKPX U m -40\nKPX U l -12\nKPX U k -12\nKPX U i -28\nKPX U h -6\nKPX U g -50\nKPX U f -12\nKPX U d -45\nKPX U c -45\nKPX U b -12\nKPX U a -40\nKPX U A -40\n\nKPX V y -36\nKPX V u -40\nKPX V semicolon -45\nKPX V r -70\nKPX V quoteright 36\nKPX V quotedblright 20\nKPX V period -140\nKPX V parenright 85\nKPX V o -70\nKPX V i 6\nKPX V hyphen -60\nKPX V endash -20\nKPX V emdash -20\nKPX V e -70\nKPX V comma -140\nKPX V colon -45\nKPX V bracketright 64\nKPX V braceright 64\nKPX V a -60\nKPX V T 6\nKPX V Q -12\nKPX V O -12\nKPX V G -12\nKPX V C -12\nKPX V A -60\n\nKPX W y -50\nKPX W u -46\nKPX W semicolon -40\nKPX W r -45\nKPX W quoteright 36\nKPX W quotedblright 20\nKPX W period -110\nKPX W parenright 85\nKPX W o -65\nKPX W m -45\nKPX W i -10\nKPX W hyphen -40\nKPX W e -65\nKPX W d -65\nKPX W comma -100\nKPX W colon -40\nKPX W bracketright 64\nKPX W braceright 64\nKPX W a -60\nKPX W T 18\nKPX W Q -6\nKPX W O -6\nKPX W G -6\nKPX W C -6\nKPX W A -48\n\nKPX X y -18\nKPX X u -24\nKPX X quoteright 15\nKPX X e -6\nKPX X a -6\nKPX X Q -24\nKPX X O -30\nKPX X G -30\nKPX X C -30\nKPX X A 6\n\nKPX Y v -50\nKPX Y u -54\nKPX Y t -46\nKPX Y semicolon -37\nKPX Y quoteright 36\nKPX Y quotedblright 20\nKPX Y q -100\nKPX Y period -90\nKPX Y parenright 60\nKPX Y o -90\nKPX Y l 10\nKPX Y hyphen -50\nKPX Y emdash -20\nKPX Y e -90\nKPX Y d -90\nKPX Y comma -90\nKPX Y colon -50\nKPX Y bracketright 64\nKPX Y braceright 64\nKPX Y a -68\nKPX Y Y 12\nKPX Y X 12\nKPX Y W 12\nKPX Y V 12\nKPX Y T 12\nKPX Y Q -18\nKPX Y O -18\nKPX Y G -18\nKPX Y C -18\nKPX Y A -32\n\nKPX Z y -36\nKPX Z w -36\nKPX Z u -6\nKPX Z o -12\nKPX Z i -12\nKPX Z e -6\nKPX Z a -6\nKPX Z Q -20\nKPX Z O -20\nKPX Z G -30\nKPX Z C -20\nKPX Z A 20\n\nKPX a quoteright -70\nKPX a quotedblright -80\n\nKPX b y -25\nKPX b w -30\nKPX b v -35\nKPX b quoteright -70\nKPX b quotedblright -70\nKPX b period -40\nKPX b comma -40\n\nKPX braceleft Y 64\nKPX braceleft W 64\nKPX braceleft V 64\nKPX braceleft T 54\nKPX braceleft J 80\n\nKPX bracketleft Y 64\nKPX bracketleft W 64\nKPX bracketleft V 64\nKPX bracketleft T 54\nKPX bracketleft J 80\n\nKPX c quoteright -28\nKPX c quotedblright -28\nKPX c period -10\n\nKPX comma quoteright -50\nKPX comma quotedblright -50\n\nKPX d quoteright -24\nKPX d quotedblright -24\n\nKPX e z -4\nKPX e quoteright -60\nKPX e quotedblright -60\nKPX e period -20\nKPX e comma -20\n\nKPX f quotesingle 30\nKPX f quoteright 65\nKPX f quotedblright 56\nKPX f quotedbl 30\nKPX f parenright 100\nKPX f bracketright 100\nKPX f braceright 100\n\nKPX g quoteright -18\nKPX g quotedblright -10\n\nKPX h quoteright -80\nKPX h quotedblright -80\n\nKPX j quoteright -20\nKPX j quotedblright -20\nKPX j period -30\nKPX j comma -30\n\nKPX k quoteright -40\nKPX k quotedblright -40\n\nKPX l quoteright -10\nKPX l quotedblright -10\n\nKPX m quoteright -80\nKPX m quotedblright -80\n\nKPX n quoteright -80\nKPX n quotedblright -80\n\nKPX o z -12\nKPX o y -30\nKPX o x -18\nKPX o w -30\nKPX o v -30\nKPX o quoteright -70\nKPX o quotedblright -70\nKPX o period -40\nKPX o comma -40\n\nKPX p z -20\nKPX p y -25\nKPX p w -30\nKPX p quoteright -70\nKPX p quotedblright -70\nKPX p period -40\nKPX p comma -40\n\nKPX parenleft Y 64\nKPX parenleft W 64\nKPX parenleft V 64\nKPX parenleft T 64\nKPX parenleft J 80\n\nKPX period quoteright -50\nKPX period quotedblright -50\n\nKPX q quoteright -50\nKPX q quotedblright -50\nKPX q period -20\nKPX q comma -10\n\nKPX quotedblleft z -60\nKPX quotedblleft y -30\nKPX quotedblleft x -40\nKPX quotedblleft w -20\nKPX quotedblleft v -20\nKPX quotedblleft u -40\nKPX quotedblleft t -40\nKPX quotedblleft s -50\nKPX quotedblleft r -50\nKPX quotedblleft q -80\nKPX quotedblleft p -50\nKPX quotedblleft o -80\nKPX quotedblleft n -50\nKPX quotedblleft m -50\nKPX quotedblleft g -70\nKPX quotedblleft f -50\nKPX quotedblleft e -80\nKPX quotedblleft d -80\nKPX quotedblleft c -80\nKPX quotedblleft a -70\nKPX quotedblleft Z -20\nKPX quotedblleft Y 12\nKPX quotedblleft W 18\nKPX quotedblleft V 18\nKPX quotedblleft U -20\nKPX quotedblleft T 10\nKPX quotedblleft S -20\nKPX quotedblleft R -20\nKPX quotedblleft Q -20\nKPX quotedblleft P -20\nKPX quotedblleft O -30\nKPX quotedblleft N -20\nKPX quotedblleft M -20\nKPX quotedblleft L -20\nKPX quotedblleft K -20\nKPX quotedblleft J -40\nKPX quotedblleft I -20\nKPX quotedblleft H -20\nKPX quotedblleft G -30\nKPX quotedblleft F -20\nKPX quotedblleft E -20\nKPX quotedblleft D -20\nKPX quotedblleft C -30\nKPX quotedblleft B -20\nKPX quotedblleft A -130\n\nKPX quotedblright period -130\nKPX quotedblright comma -130\n\nKPX quoteleft z -40\nKPX quoteleft y -35\nKPX quoteleft x -30\nKPX quoteleft w -20\nKPX quoteleft v -20\nKPX quoteleft u -50\nKPX quoteleft t -40\nKPX quoteleft s -45\nKPX quoteleft r -50\nKPX quoteleft quoteleft -72\nKPX quoteleft q -70\nKPX quoteleft p -50\nKPX quoteleft o -70\nKPX quoteleft n -50\nKPX quoteleft m -50\nKPX quoteleft g -65\nKPX quoteleft f -40\nKPX quoteleft e -70\nKPX quoteleft d -70\nKPX quoteleft c -70\nKPX quoteleft a -60\nKPX quoteleft Z -20\nKPX quoteleft Y 18\nKPX quoteleft X 12\nKPX quoteleft W 18\nKPX quoteleft V 18\nKPX quoteleft U -20\nKPX quoteleft T 10\nKPX quoteleft R -20\nKPX quoteleft Q -20\nKPX quoteleft P -20\nKPX quoteleft O -30\nKPX quoteleft N -20\nKPX quoteleft M -20\nKPX quoteleft L -20\nKPX quoteleft K -20\nKPX quoteleft J -40\nKPX quoteleft I -20\nKPX quoteleft H -20\nKPX quoteleft G -40\nKPX quoteleft F -20\nKPX quoteleft E -20\nKPX quoteleft D -20\nKPX quoteleft C -30\nKPX quoteleft B -20\nKPX quoteleft A -130\n\nKPX quoteright v -40\nKPX quoteright t -75\nKPX quoteright s -110\nKPX quoteright r -70\nKPX quoteright quoteright -72\nKPX quoteright period -130\nKPX quoteright m -70\nKPX quoteright l -6\nKPX quoteright d -120\nKPX quoteright comma -130\n\nKPX r z 10\nKPX r y 18\nKPX r x 12\nKPX r w 18\nKPX r v 18\nKPX r u 8\nKPX r t 8\nKPX r semicolon 10\nKPX r quoteright -20\nKPX r quotedblright -20\nKPX r q -6\nKPX r period -60\nKPX r o -6\nKPX r n 8\nKPX r m 8\nKPX r k -6\nKPX r i 8\nKPX r hyphen -20\nKPX r h 6\nKPX r g -6\nKPX r f 8\nKPX r e -20\nKPX r d -20\nKPX r comma -60\nKPX r colon 10\nKPX r c -20\nKPX r a -10\n\nKPX s quoteright -40\nKPX s quotedblright -40\nKPX s period -20\nKPX s comma -10\n\nKPX space quotesinglbase -60\nKPX space quoteleft -40\nKPX space quotedblleft -40\nKPX space quotedblbase -60\nKPX space Y -60\nKPX space W -60\nKPX space V -60\nKPX space T -36\n\nKPX t quoteright -18\nKPX t quotedblright -18\n\nKPX u quoteright -30\nKPX u quotedblright -30\n\nKPX v semicolon 10\nKPX v quoteright 20\nKPX v quotedblright 20\nKPX v q -10\nKPX v period -90\nKPX v o -5\nKPX v e -5\nKPX v d -10\nKPX v comma -90\nKPX v colon 10\nKPX v c -6\nKPX v a -6\n\nKPX w semicolon 10\nKPX w quoteright 20\nKPX w quotedblright 20\nKPX w q -6\nKPX w period -80\nKPX w e -6\nKPX w d -6\nKPX w comma -75\nKPX w colon 10\nKPX w c -6\n\nKPX x quoteright -10\nKPX x quotedblright -20\nKPX x q -6\nKPX x o -6\nKPX x d -12\nKPX x c -12\n\nKPX y semicolon 10\nKPX y q -6\nKPX y period -95\nKPX y o -6\nKPX y hyphen -30\nKPX y e -6\nKPX y d -6\nKPX y comma -85\nKPX y colon 10\nKPX y c -6\n\nKPX z quoteright -20\nKPX z quotedblright -30\nKPX z o -6\nKPX z e -6\nKPX z d -6\nKPX z c -6\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/putri8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1989, 1991 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Fri Jan 17 13:15:45 1992\nComment UniqueID 37666\nComment VMusage 34143 41035\nFontName Utopia-Italic\nFullName Utopia Italic\nFamilyName Utopia\nWeight Regular\nItalicAngle -13\nIsFixedPitch false\nFontBBox -201 -250 1170 890 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.002\nNotice Copyright (c) 1989, 1991 Adobe Systems Incorporated.  All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.\nEncodingScheme AdobeStandardEncoding\nCapHeight 692\nXHeight 502\nAscender 742\nDescender -242\nStartCharMetrics 228\nC 32 ; WX 225 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 240 ; N exclam ; B 34 -12 290 707 ;\nC 34 ; WX 402 ; N quotedbl ; B 171 469 454 742 ;\nC 35 ; WX 530 ; N numbersign ; B 54 0 585 668 ;\nC 36 ; WX 530 ; N dollar ; B 31 -109 551 743 ;\nC 37 ; WX 826 ; N percent ; B 98 -25 795 702 ;\nC 38 ; WX 725 ; N ampersand ; B 60 -12 703 680 ;\nC 39 ; WX 216 ; N quoteright ; B 112 482 265 742 ;\nC 40 ; WX 350 ; N parenleft ; B 106 -128 458 692 ;\nC 41 ; WX 350 ; N parenright ; B -46 -128 306 692 ;\nC 42 ; WX 412 ; N asterisk ; B 106 356 458 707 ;\nC 43 ; WX 570 ; N plus ; B 58 0 542 490 ;\nC 44 ; WX 265 ; N comma ; B 11 -134 173 142 ;\nC 45 ; WX 392 ; N hyphen ; B 82 216 341 286 ;\nC 46 ; WX 265 ; N period ; B 47 -12 169 113 ;\nC 47 ; WX 270 ; N slash ; B 0 -15 341 707 ;\nC 48 ; WX 530 ; N zero ; B 60 -12 541 680 ;\nC 49 ; WX 530 ; N one ; B 74 0 429 680 ;\nC 50 ; WX 530 ; N two ; B -2 0 538 680 ;\nC 51 ; WX 530 ; N three ; B 19 -12 524 680 ;\nC 52 ; WX 530 ; N four ; B 32 0 509 668 ;\nC 53 ; WX 530 ; N five ; B 24 -12 550 668 ;\nC 54 ; WX 530 ; N six ; B 56 -12 551 680 ;\nC 55 ; WX 530 ; N seven ; B 130 -12 600 668 ;\nC 56 ; WX 530 ; N eight ; B 46 -12 535 680 ;\nC 57 ; WX 530 ; N nine ; B 51 -12 536 680 ;\nC 58 ; WX 265 ; N colon ; B 47 -12 248 490 ;\nC 59 ; WX 265 ; N semicolon ; B 11 -134 248 490 ;\nC 60 ; WX 570 ; N less ; B 51 1 529 497 ;\nC 61 ; WX 570 ; N equal ; B 58 111 542 389 ;\nC 62 ; WX 570 ; N greater ; B 51 1 529 497 ;\nC 63 ; WX 425 ; N question ; B 115 -12 456 707 ;\nC 64 ; WX 794 ; N at ; B 88 -15 797 707 ;\nC 65 ; WX 624 ; N A ; B -58 0 623 692 ;\nC 66 ; WX 632 ; N B ; B 3 0 636 692 ;\nC 67 ; WX 661 ; N C ; B 79 -15 723 707 ;\nC 68 ; WX 763 ; N D ; B 5 0 767 692 ;\nC 69 ; WX 596 ; N E ; B 3 0 657 692 ;\nC 70 ; WX 571 ; N F ; B 3 0 660 692 ;\nC 71 ; WX 709 ; N G ; B 79 -15 737 707 ;\nC 72 ; WX 775 ; N H ; B 5 0 857 692 ;\nC 73 ; WX 345 ; N I ; B 5 0 428 692 ;\nC 74 ; WX 352 ; N J ; B -78 -119 436 692 ;\nC 75 ; WX 650 ; N K ; B 5 -5 786 692 ;\nC 76 ; WX 565 ; N L ; B 5 0 568 692 ;\nC 77 ; WX 920 ; N M ; B -4 0 1002 692 ;\nC 78 ; WX 763 ; N N ; B -4 0 855 692 ;\nC 79 ; WX 753 ; N O ; B 79 -15 754 707 ;\nC 80 ; WX 614 ; N P ; B 5 0 646 692 ;\nC 81 ; WX 753 ; N Q ; B 79 -203 754 707 ;\nC 82 ; WX 640 ; N R ; B 5 0 642 692 ;\nC 83 ; WX 533 ; N S ; B 34 -15 542 707 ;\nC 84 ; WX 606 ; N T ; B 102 0 708 692 ;\nC 85 ; WX 794 ; N U ; B 131 -15 880 692 ;\nC 86 ; WX 637 ; N V ; B 96 0 786 692 ;\nC 87 ; WX 946 ; N W ; B 86 0 1075 692 ;\nC 88 ; WX 632 ; N X ; B -36 0 735 692 ;\nC 89 ; WX 591 ; N Y ; B 96 0 744 692 ;\nC 90 ; WX 622 ; N Z ; B -20 0 703 692 ;\nC 91 ; WX 330 ; N bracketleft ; B 69 -128 414 692 ;\nC 92 ; WX 390 ; N backslash ; B 89 -15 371 707 ;\nC 93 ; WX 330 ; N bracketright ; B -21 -128 324 692 ;\nC 94 ; WX 570 ; N asciicircum ; B 83 228 547 668 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 216 ; N quoteleft ; B 130 488 283 748 ;\nC 97 ; WX 561 ; N a ; B 31 -12 563 502 ;\nC 98 ; WX 559 ; N b ; B 47 -12 557 742 ;\nC 99 ; WX 441 ; N c ; B 46 -12 465 502 ;\nC 100 ; WX 587 ; N d ; B 37 -12 612 742 ;\nC 101 ; WX 453 ; N e ; B 45 -12 471 502 ;\nC 102 ; WX 315 ; N f ; B -107 -242 504 742 ; L i fi ; L l fl ;\nC 103 ; WX 499 ; N g ; B -5 -242 573 512 ;\nC 104 ; WX 607 ; N h ; B 57 -12 588 742 ;\nC 105 ; WX 317 ; N i ; B 79 -12 328 715 ;\nC 106 ; WX 309 ; N j ; B -95 -242 330 715 ;\nC 107 ; WX 545 ; N k ; B 57 -12 567 742 ;\nC 108 ; WX 306 ; N l ; B 76 -12 331 742 ;\nC 109 ; WX 912 ; N m ; B 63 -12 894 502 ;\nC 110 ; WX 618 ; N n ; B 63 -12 600 502 ;\nC 111 ; WX 537 ; N o ; B 49 -12 522 502 ;\nC 112 ; WX 590 ; N p ; B 22 -242 586 502 ;\nC 113 ; WX 559 ; N q ; B 38 -242 567 525 ;\nC 114 ; WX 402 ; N r ; B 69 -12 448 502 ;\nC 115 ; WX 389 ; N s ; B 19 -12 397 502 ;\nC 116 ; WX 341 ; N t ; B 84 -12 404 616 ;\nC 117 ; WX 618 ; N u ; B 89 -12 609 502 ;\nC 118 ; WX 510 ; N v ; B 84 -12 528 502 ;\nC 119 ; WX 785 ; N w ; B 87 -12 808 502 ;\nC 120 ; WX 516 ; N x ; B -4 -12 531 502 ;\nC 121 ; WX 468 ; N y ; B -40 -242 505 502 ;\nC 122 ; WX 468 ; N z ; B 4 -12 483 490 ;\nC 123 ; WX 340 ; N braceleft ; B 100 -128 423 692 ;\nC 124 ; WX 270 ; N bar ; B 130 -250 198 750 ;\nC 125 ; WX 340 ; N braceright ; B -20 -128 302 692 ;\nC 126 ; WX 570 ; N asciitilde ; B 98 176 522 318 ;\nC 161 ; WX 240 ; N exclamdown ; B -18 -217 238 502 ;\nC 162 ; WX 530 ; N cent ; B 94 -21 563 669 ;\nC 163 ; WX 530 ; N sterling ; B 9 0 549 680 ;\nC 164 ; WX 100 ; N fraction ; B -201 -24 369 698 ;\nC 165 ; WX 530 ; N yen ; B 72 0 645 668 ;\nC 166 ; WX 530 ; N florin ; B 4 -135 588 691 ;\nC 167 ; WX 530 ; N section ; B 55 -115 533 707 ;\nC 168 ; WX 530 ; N currency ; B 56 90 536 578 ;\nC 169 ; WX 216 ; N quotesingle ; B 161 469 274 742 ;\nC 170 ; WX 402 ; N quotedblleft ; B 134 488 473 748 ;\nC 171 ; WX 462 ; N guillemotleft ; B 79 41 470 435 ;\nC 172 ; WX 277 ; N guilsinglleft ; B 71 41 267 435 ;\nC 173 ; WX 277 ; N guilsinglright ; B 44 41 240 435 ;\nC 174 ; WX 607 ; N fi ; B -107 -242 589 742 ;\nC 175 ; WX 603 ; N fl ; B -107 -242 628 742 ;\nC 177 ; WX 500 ; N endash ; B 12 221 524 279 ;\nC 178 ; WX 500 ; N dagger ; B 101 -125 519 717 ;\nC 179 ; WX 490 ; N daggerdbl ; B 39 -119 509 717 ;\nC 180 ; WX 265 ; N periodcentered ; B 89 187 211 312 ;\nC 182 ; WX 560 ; N paragraph ; B 109 -101 637 692 ;\nC 183 ; WX 500 ; N bullet ; B 110 192 429 512 ;\nC 184 ; WX 216 ; N quotesinglbase ; B -7 -109 146 151 ;\nC 185 ; WX 402 ; N quotedblbase ; B -7 -109 332 151 ;\nC 186 ; WX 402 ; N quotedblright ; B 107 484 446 744 ;\nC 187 ; WX 462 ; N guillemotright ; B 29 41 420 435 ;\nC 188 ; WX 1000 ; N ellipsis ; B 85 -12 873 113 ;\nC 189 ; WX 1200 ; N perthousand ; B 98 -25 1170 702 ;\nC 191 ; WX 425 ; N questiondown ; B 3 -217 344 502 ;\nC 193 ; WX 400 ; N grave ; B 146 542 368 723 ;\nC 194 ; WX 400 ; N acute ; B 214 542 436 723 ;\nC 195 ; WX 400 ; N circumflex ; B 187 546 484 720 ;\nC 196 ; WX 400 ; N tilde ; B 137 563 492 682 ;\nC 197 ; WX 400 ; N macron ; B 193 597 489 656 ;\nC 198 ; WX 400 ; N breve ; B 227 568 501 698 ;\nC 199 ; WX 402 ; N dotaccent ; B 252 570 359 680 ;\nC 200 ; WX 400 ; N dieresis ; B 172 572 487 682 ;\nC 202 ; WX 400 ; N ring ; B 186 550 402 752 ;\nC 203 ; WX 400 ; N cedilla ; B 62 -230 241 0 ;\nC 205 ; WX 400 ; N hungarumlaut ; B 176 546 455 750 ;\nC 206 ; WX 350 ; N ogonek ; B 68 -219 248 0 ;\nC 207 ; WX 400 ; N caron ; B 213 557 510 731 ;\nC 208 ; WX 1000 ; N emdash ; B 12 221 1024 279 ;\nC 225 ; WX 880 ; N AE ; B -88 0 941 692 ;\nC 227 ; WX 425 ; N ordfeminine ; B 77 265 460 590 ;\nC 232 ; WX 571 ; N Lslash ; B 11 0 574 692 ;\nC 233 ; WX 753 ; N Oslash ; B 79 -45 754 736 ;\nC 234 ; WX 1020 ; N OE ; B 79 0 1081 692 ;\nC 235 ; WX 389 ; N ordmasculine ; B 86 265 420 590 ;\nC 241 ; WX 779 ; N ae ; B 34 -12 797 514 ;\nC 245 ; WX 317 ; N dotlessi ; B 79 -12 299 502 ;\nC 248 ; WX 318 ; N lslash ; B 45 -12 376 742 ;\nC 249 ; WX 537 ; N oslash ; B 49 -39 522 529 ;\nC 250 ; WX 806 ; N oe ; B 49 -12 824 502 ;\nC 251 ; WX 577 ; N germandbls ; B -107 -242 630 742 ;\nC -1 ; WX 370 ; N onesuperior ; B 90 272 326 680 ;\nC -1 ; WX 570 ; N minus ; B 58 221 542 279 ;\nC -1 ; WX 400 ; N degree ; B 152 404 428 680 ;\nC -1 ; WX 537 ; N oacute ; B 49 -12 530 723 ;\nC -1 ; WX 753 ; N Odieresis ; B 79 -15 754 848 ;\nC -1 ; WX 537 ; N odieresis ; B 49 -12 532 682 ;\nC -1 ; WX 596 ; N Eacute ; B 3 0 657 890 ;\nC -1 ; WX 618 ; N ucircumflex ; B 89 -12 609 720 ;\nC -1 ; WX 890 ; N onequarter ; B 97 -24 805 698 ;\nC -1 ; WX 570 ; N logicalnot ; B 58 102 542 389 ;\nC -1 ; WX 596 ; N Ecircumflex ; B 3 0 657 876 ;\nC -1 ; WX 890 ; N onehalf ; B 71 -24 812 698 ;\nC -1 ; WX 753 ; N Otilde ; B 79 -15 754 842 ;\nC -1 ; WX 618 ; N uacute ; B 89 -12 609 723 ;\nC -1 ; WX 453 ; N eacute ; B 45 -12 508 723 ;\nC -1 ; WX 317 ; N iacute ; B 79 -12 398 723 ;\nC -1 ; WX 596 ; N Egrave ; B 3 0 657 890 ;\nC -1 ; WX 317 ; N icircumflex ; B 79 -12 383 720 ;\nC -1 ; WX 618 ; N mu ; B 11 -232 609 502 ;\nC -1 ; WX 270 ; N brokenbar ; B 130 -175 198 675 ;\nC -1 ; WX 584 ; N thorn ; B 16 -242 580 700 ;\nC -1 ; WX 624 ; N Aring ; B -58 0 623 861 ;\nC -1 ; WX 468 ; N yacute ; B -40 -242 505 723 ;\nC -1 ; WX 591 ; N Ydieresis ; B 96 0 744 848 ;\nC -1 ; WX 1100 ; N trademark ; B 91 277 1094 692 ;\nC -1 ; WX 836 ; N registered ; B 91 -15 819 707 ;\nC -1 ; WX 537 ; N ocircumflex ; B 49 -12 522 720 ;\nC -1 ; WX 624 ; N Agrave ; B -58 0 623 890 ;\nC -1 ; WX 533 ; N Scaron ; B 34 -15 561 888 ;\nC -1 ; WX 794 ; N Ugrave ; B 131 -15 880 890 ;\nC -1 ; WX 596 ; N Edieresis ; B 3 0 657 848 ;\nC -1 ; WX 794 ; N Uacute ; B 131 -15 880 890 ;\nC -1 ; WX 537 ; N otilde ; B 49 -12 525 682 ;\nC -1 ; WX 618 ; N ntilde ; B 63 -12 600 682 ;\nC -1 ; WX 468 ; N ydieresis ; B -40 -242 513 682 ;\nC -1 ; WX 624 ; N Aacute ; B -58 0 642 890 ;\nC -1 ; WX 537 ; N eth ; B 47 -12 521 742 ;\nC -1 ; WX 561 ; N acircumflex ; B 31 -12 563 720 ;\nC -1 ; WX 561 ; N aring ; B 31 -12 563 752 ;\nC -1 ; WX 753 ; N Ograve ; B 79 -15 754 890 ;\nC -1 ; WX 441 ; N ccedilla ; B 46 -230 465 502 ;\nC -1 ; WX 570 ; N multiply ; B 88 22 532 478 ;\nC -1 ; WX 570 ; N divide ; B 58 25 542 475 ;\nC -1 ; WX 370 ; N twosuperior ; B 35 272 399 680 ;\nC -1 ; WX 763 ; N Ntilde ; B -4 0 855 842 ;\nC -1 ; WX 618 ; N ugrave ; B 89 -12 609 723 ;\nC -1 ; WX 794 ; N Ucircumflex ; B 131 -15 880 876 ;\nC -1 ; WX 624 ; N Atilde ; B -58 0 623 842 ;\nC -1 ; WX 468 ; N zcaron ; B 4 -12 484 731 ;\nC -1 ; WX 317 ; N idieresis ; B 79 -12 398 682 ;\nC -1 ; WX 624 ; N Acircumflex ; B -58 0 623 876 ;\nC -1 ; WX 345 ; N Icircumflex ; B 5 0 453 876 ;\nC -1 ; WX 591 ; N Yacute ; B 96 0 744 890 ;\nC -1 ; WX 753 ; N Oacute ; B 79 -15 754 890 ;\nC -1 ; WX 624 ; N Adieresis ; B -58 0 623 848 ;\nC -1 ; WX 622 ; N Zcaron ; B -20 0 703 888 ;\nC -1 ; WX 561 ; N agrave ; B 31 -12 563 723 ;\nC -1 ; WX 370 ; N threesuperior ; B 59 265 389 680 ;\nC -1 ; WX 537 ; N ograve ; B 49 -12 522 723 ;\nC -1 ; WX 890 ; N threequarters ; B 105 -24 816 698 ;\nC -1 ; WX 770 ; N Eth ; B 12 0 774 692 ;\nC -1 ; WX 570 ; N plusminus ; B 58 0 542 556 ;\nC -1 ; WX 618 ; N udieresis ; B 89 -12 609 682 ;\nC -1 ; WX 453 ; N edieresis ; B 45 -12 490 682 ;\nC -1 ; WX 561 ; N aacute ; B 31 -12 571 723 ;\nC -1 ; WX 317 ; N igrave ; B 55 -12 299 723 ;\nC -1 ; WX 345 ; N Idieresis ; B 5 0 461 848 ;\nC -1 ; WX 561 ; N adieresis ; B 31 -12 563 682 ;\nC -1 ; WX 345 ; N Iacute ; B 5 0 506 890 ;\nC -1 ; WX 836 ; N copyright ; B 91 -15 819 707 ;\nC -1 ; WX 345 ; N Igrave ; B 5 0 428 890 ;\nC -1 ; WX 661 ; N Ccedilla ; B 79 -230 723 707 ;\nC -1 ; WX 389 ; N scaron ; B 19 -12 457 731 ;\nC -1 ; WX 453 ; N egrave ; B 45 -12 471 723 ;\nC -1 ; WX 753 ; N Ocircumflex ; B 79 -15 754 876 ;\nC -1 ; WX 604 ; N Thorn ; B 5 0 616 692 ;\nC -1 ; WX 561 ; N atilde ; B 31 -12 563 682 ;\nC -1 ; WX 794 ; N Udieresis ; B 131 -15 880 848 ;\nC -1 ; WX 453 ; N ecircumflex ; B 45 -12 475 720 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 690\n\nKPX A y -20\nKPX A x 10\nKPX A w -30\nKPX A v -30\nKPX A u -10\nKPX A t -6\nKPX A s 15\nKPX A r -12\nKPX A quoteright -110\nKPX A quotedblright -110\nKPX A q 10\nKPX A p -12\nKPX A o -10\nKPX A n -18\nKPX A m -18\nKPX A l -18\nKPX A j 6\nKPX A h -6\nKPX A d 10\nKPX A c -6\nKPX A b -6\nKPX A a 12\nKPX A Y -76\nKPX A X -8\nKPX A W -80\nKPX A V -90\nKPX A U -60\nKPX A T -72\nKPX A Q -30\nKPX A O -30\nKPX A G -30\nKPX A C -30\n\nKPX B y -6\nKPX B u -20\nKPX B r -15\nKPX B quoteright -40\nKPX B quotedblright -30\nKPX B o 6\nKPX B l -20\nKPX B k -15\nKPX B i -12\nKPX B h -15\nKPX B e 6\nKPX B a 12\nKPX B W -20\nKPX B V -50\nKPX B U -50\nKPX B T -20\n\nKPX C z -6\nKPX C y -18\nKPX C u -18\nKPX C quotedblright 20\nKPX C i -5\nKPX C e -6\nKPX C a -6\n\nKPX D y 18\nKPX D u -10\nKPX D quoteright -40\nKPX D quotedblright -50\nKPX D period -30\nKPX D o 6\nKPX D i 6\nKPX D h -25\nKPX D e 6\nKPX D comma -20\nKPX D a 6\nKPX D Y -70\nKPX D W -50\nKPX D V -60\n\nKPX E z -6\nKPX E y -18\nKPX E x 5\nKPX E w -20\nKPX E v -18\nKPX E u -24\nKPX E t -18\nKPX E s 5\nKPX E r -6\nKPX E quoteright 10\nKPX E quotedblright 10\nKPX E q 10\nKPX E period 10\nKPX E p -12\nKPX E o -6\nKPX E n -12\nKPX E m -12\nKPX E l -12\nKPX E k -10\nKPX E j -6\nKPX E i -12\nKPX E g -12\nKPX E e 5\nKPX E d 10\nKPX E comma 10\nKPX E b -6\n\nKPX F y -12\nKPX F u -30\nKPX F r -18\nKPX F quoteright 15\nKPX F quotedblright 35\nKPX F period -180\nKPX F o -30\nKPX F l -6\nKPX F i -12\nKPX F e -30\nKPX F comma -170\nKPX F a -30\nKPX F A -45\n\nKPX G y -16\nKPX G u -22\nKPX G r -22\nKPX G quoteright -20\nKPX G quotedblright -20\nKPX G o 10\nKPX G n -22\nKPX G l -24\nKPX G i -12\nKPX G h -18\nKPX G e 10\nKPX G a 5\n\nKPX H y -18\nKPX H u -30\nKPX H quoteright 10\nKPX H quotedblright 10\nKPX H o -12\nKPX H i -12\nKPX H e -12\nKPX H a -12\n\nKPX I z -20\nKPX I y -6\nKPX I x -6\nKPX I w -30\nKPX I v -30\nKPX I u -30\nKPX I t -18\nKPX I s -18\nKPX I r -12\nKPX I quoteright 10\nKPX I quotedblright 10\nKPX I p -18\nKPX I o -12\nKPX I n -18\nKPX I m -18\nKPX I l -6\nKPX I k -6\nKPX I g -12\nKPX I f -6\nKPX I d -6\nKPX I c -12\nKPX I b -6\nKPX I a -6\n\nKPX J y -12\nKPX J u -36\nKPX J quoteright 6\nKPX J quotedblright 15\nKPX J o -36\nKPX J i -30\nKPX J e -36\nKPX J braceright 10\nKPX J a -36\n\nKPX K y -40\nKPX K w -30\nKPX K v -20\nKPX K u -24\nKPX K r -12\nKPX K quoteright 25\nKPX K quotedblright 40\nKPX K o -24\nKPX K n -18\nKPX K i -6\nKPX K h 6\nKPX K e -12\nKPX K a -6\nKPX K Q -24\nKPX K O -24\nKPX K G -24\nKPX K C -24\n\nKPX L y -55\nKPX L w -30\nKPX L u -18\nKPX L quoteright -110\nKPX L quotedblright -110\nKPX L l -16\nKPX L j -18\nKPX L i -18\nKPX L a 10\nKPX L Y -80\nKPX L W -90\nKPX L V -110\nKPX L U -42\nKPX L T -80\nKPX L Q -48\nKPX L O -48\nKPX L G -48\nKPX L C -48\nKPX L A 30\n\nKPX M y -18\nKPX M u -24\nKPX M quoteright 6\nKPX M quotedblright 15\nKPX M o -25\nKPX M n -12\nKPX M j -18\nKPX M i -12\nKPX M e -20\nKPX M d -10\nKPX M c -20\nKPX M a -6\n\nKPX N y -18\nKPX N u -24\nKPX N quoteright 10\nKPX N quotedblright 10\nKPX N o -25\nKPX N i -12\nKPX N e -20\nKPX N a -22\n\nKPX O z -6\nKPX O y 12\nKPX O w -10\nKPX O v -10\nKPX O u -6\nKPX O t -6\nKPX O s -6\nKPX O r -6\nKPX O quoteright -40\nKPX O quotedblright -40\nKPX O q 5\nKPX O period -20\nKPX O p -6\nKPX O n -6\nKPX O m -6\nKPX O l -20\nKPX O k -10\nKPX O j -6\nKPX O h -10\nKPX O g -6\nKPX O e 5\nKPX O d 6\nKPX O comma -10\nKPX O c 5\nKPX O b -6\nKPX O a 5\nKPX O Y -75\nKPX O X -30\nKPX O W -40\nKPX O V -60\nKPX O T -48\nKPX O A -18\n\nKPX P y 6\nKPX P u -18\nKPX P t -6\nKPX P s -24\nKPX P r -6\nKPX P period -220\nKPX P o -24\nKPX P n -12\nKPX P l -25\nKPX P h -15\nKPX P e -24\nKPX P comma -220\nKPX P a -24\nKPX P I -30\nKPX P H -30\nKPX P E -30\nKPX P A -75\n\nKPX Q u -6\nKPX Q quoteright -40\nKPX Q quotedblright -50\nKPX Q a -6\nKPX Q Y -70\nKPX Q X -12\nKPX Q W -35\nKPX Q V -60\nKPX Q U -35\nKPX Q T -36\nKPX Q A -18\n\nKPX R y -14\nKPX R u -12\nKPX R quoteright -30\nKPX R quotedblright -20\nKPX R o -12\nKPX R hyphen -20\nKPX R e -12\nKPX R Y -50\nKPX R W -30\nKPX R V -40\nKPX R U -40\nKPX R T -30\nKPX R Q -10\nKPX R O -10\nKPX R G -10\nKPX R C -10\nKPX R A -6\n\nKPX S y -30\nKPX S w -30\nKPX S v -30\nKPX S u -18\nKPX S t -30\nKPX S r -20\nKPX S quoteright -38\nKPX S quotedblright -30\nKPX S p -18\nKPX S n -24\nKPX S m -24\nKPX S l -30\nKPX S k -24\nKPX S j -25\nKPX S i -30\nKPX S h -30\nKPX S e -6\n\nKPX T z -70\nKPX T y -60\nKPX T w -64\nKPX T u -74\nKPX T semicolon -36\nKPX T s -72\nKPX T r -64\nKPX T quoteright 45\nKPX T quotedblright 50\nKPX T period -100\nKPX T parenright 54\nKPX T o -90\nKPX T m -64\nKPX T i -34\nKPX T hyphen -100\nKPX T endash -60\nKPX T emdash -60\nKPX T e -90\nKPX T comma -110\nKPX T colon -10\nKPX T bracketright 45\nKPX T braceright 54\nKPX T a -90\nKPX T Y 12\nKPX T X 18\nKPX T W 6\nKPX T T 18\nKPX T Q -12\nKPX T O -12\nKPX T G -12\nKPX T C -12\nKPX T A -56\n\nKPX U z -30\nKPX U x -40\nKPX U t -24\nKPX U s -30\nKPX U r -30\nKPX U quoteright 10\nKPX U quotedblright 10\nKPX U p -40\nKPX U n -45\nKPX U m -45\nKPX U l -12\nKPX U k -12\nKPX U i -24\nKPX U h -6\nKPX U g -30\nKPX U d -40\nKPX U c -35\nKPX U b -6\nKPX U a -40\nKPX U A -45\n\nKPX V y -46\nKPX V u -42\nKPX V semicolon -35\nKPX V r -50\nKPX V quoteright 75\nKPX V quotedblright 70\nKPX V period -130\nKPX V parenright 64\nKPX V o -62\nKPX V i -10\nKPX V hyphen -60\nKPX V endash -20\nKPX V emdash -20\nKPX V e -52\nKPX V comma -120\nKPX V colon -18\nKPX V bracketright 64\nKPX V braceright 64\nKPX V a -60\nKPX V T 6\nKPX V A -70\n\nKPX W y -42\nKPX W u -56\nKPX W t -20\nKPX W semicolon -28\nKPX W r -40\nKPX W quoteright 55\nKPX W quotedblright 60\nKPX W period -108\nKPX W parenright 64\nKPX W o -60\nKPX W m -35\nKPX W i -10\nKPX W hyphen -40\nKPX W endash -2\nKPX W emdash -10\nKPX W e -54\nKPX W d -50\nKPX W comma -108\nKPX W colon -28\nKPX W bracketright 55\nKPX W braceright 64\nKPX W a -60\nKPX W T 12\nKPX W Q -10\nKPX W O -10\nKPX W G -10\nKPX W C -10\nKPX W A -58\n\nKPX X y -35\nKPX X u -30\nKPX X r -6\nKPX X quoteright 35\nKPX X quotedblright 15\nKPX X i -6\nKPX X e -10\nKPX X a 5\nKPX X Y -6\nKPX X W -6\nKPX X Q -30\nKPX X O -30\nKPX X G -30\nKPX X C -30\nKPX X A -18\n\nKPX Y v -50\nKPX Y u -58\nKPX Y t -32\nKPX Y semicolon -36\nKPX Y quoteright 65\nKPX Y quotedblright 70\nKPX Y q -100\nKPX Y period -90\nKPX Y parenright 60\nKPX Y o -72\nKPX Y l 10\nKPX Y hyphen -95\nKPX Y endash -20\nKPX Y emdash -20\nKPX Y e -72\nKPX Y d -80\nKPX Y comma -80\nKPX Y colon -36\nKPX Y bracketright 64\nKPX Y braceright 75\nKPX Y a -82\nKPX Y Y 12\nKPX Y X 12\nKPX Y W 12\nKPX Y V 6\nKPX Y T 25\nKPX Y Q -5\nKPX Y O -5\nKPX Y G -5\nKPX Y C -5\nKPX Y A -36\n\nKPX Z y -36\nKPX Z w -36\nKPX Z u -12\nKPX Z quoteright 10\nKPX Z quotedblright 10\nKPX Z o -6\nKPX Z i -12\nKPX Z e -6\nKPX Z a -6\nKPX Z Q -30\nKPX Z O -30\nKPX Z G -30\nKPX Z C -30\nKPX Z A 12\n\nKPX a quoteright -40\nKPX a quotedblright -40\n\nKPX b y -6\nKPX b w -15\nKPX b v -15\nKPX b quoteright -50\nKPX b quotedblright -50\nKPX b period -40\nKPX b comma -30\n\nKPX braceleft Y 64\nKPX braceleft W 64\nKPX braceleft V 64\nKPX braceleft T 54\nKPX braceleft J 80\n\nKPX bracketleft Y 64\nKPX bracketleft W 64\nKPX bracketleft V 64\nKPX bracketleft T 54\nKPX bracketleft J 80\n\nKPX c quoteright -20\nKPX c quotedblright -20\n\nKPX colon space -30\n\nKPX comma space -40\nKPX comma quoteright -80\nKPX comma quotedblright -80\n\nKPX d quoteright -12\nKPX d quotedblright -12\n\nKPX e x -10\nKPX e w -10\nKPX e quoteright -30\nKPX e quotedblright -30\n\nKPX f quoteright 110\nKPX f quotedblright 110\nKPX f period -20\nKPX f parenright 100\nKPX f comma -20\nKPX f bracketright 90\nKPX f braceright 90\n\nKPX g y 30\nKPX g p 12\nKPX g f 42\n\nKPX h quoteright -80\nKPX h quotedblright -80\n\nKPX j quoteright -20\nKPX j quotedblright -20\nKPX j period -35\nKPX j comma -20\n\nKPX k quoteright -30\nKPX k quotedblright -50\n\nKPX m quoteright -80\nKPX m quotedblright -80\n\nKPX n quoteright -80\nKPX n quotedblright -80\n\nKPX o z -10\nKPX o y -20\nKPX o x -20\nKPX o w -30\nKPX o v -35\nKPX o quoteright -60\nKPX o quotedblright -50\nKPX o period -30\nKPX o comma -20\n\nKPX p z -10\nKPX p w -15\nKPX p quoteright -50\nKPX p quotedblright -70\nKPX p period -30\nKPX p comma -20\n\nKPX parenleft Y 75\nKPX parenleft W 75\nKPX parenleft V 75\nKPX parenleft T 64\nKPX parenleft J 80\n\nKPX period space -40\nKPX period quoteright -80\nKPX period quotedblright -80\n\nKPX q quoteright -20\nKPX q quotedblright -30\nKPX q period -20\nKPX q comma -10\n\nKPX quotedblleft z -30\nKPX quotedblleft x -40\nKPX quotedblleft w -12\nKPX quotedblleft v -12\nKPX quotedblleft u -12\nKPX quotedblleft t -12\nKPX quotedblleft s -30\nKPX quotedblleft r -12\nKPX quotedblleft q -40\nKPX quotedblleft p -12\nKPX quotedblleft o -30\nKPX quotedblleft n -12\nKPX quotedblleft m -12\nKPX quotedblleft l 10\nKPX quotedblleft k 10\nKPX quotedblleft h 10\nKPX quotedblleft g -30\nKPX quotedblleft e -40\nKPX quotedblleft d -40\nKPX quotedblleft c -40\nKPX quotedblleft b 24\nKPX quotedblleft a -60\nKPX quotedblleft Y 12\nKPX quotedblleft X 28\nKPX quotedblleft W 28\nKPX quotedblleft V 28\nKPX quotedblleft T 36\nKPX quotedblleft A -90\n\nKPX quotedblright space -40\nKPX quotedblright period -100\nKPX quotedblright comma -100\n\nKPX quoteleft z -30\nKPX quoteleft y -10\nKPX quoteleft x -40\nKPX quoteleft w -12\nKPX quoteleft v -12\nKPX quoteleft u -12\nKPX quoteleft t -12\nKPX quoteleft s -30\nKPX quoteleft r -12\nKPX quoteleft quoteleft -18\nKPX quoteleft q -30\nKPX quoteleft p -12\nKPX quoteleft o -30\nKPX quoteleft n -12\nKPX quoteleft m -12\nKPX quoteleft l 10\nKPX quoteleft k 10\nKPX quoteleft h 10\nKPX quoteleft g -30\nKPX quoteleft e -30\nKPX quoteleft d -30\nKPX quoteleft c -30\nKPX quoteleft b 24\nKPX quoteleft a -45\nKPX quoteleft Y 12\nKPX quoteleft X 28\nKPX quoteleft W 28\nKPX quoteleft V 28\nKPX quoteleft T 36\nKPX quoteleft A -90\n\nKPX quoteright v -35\nKPX quoteright t -35\nKPX quoteright space -40\nKPX quoteright s -55\nKPX quoteright r -25\nKPX quoteright quoteright -18\nKPX quoteright period -100\nKPX quoteright m -25\nKPX quoteright l -12\nKPX quoteright d -70\nKPX quoteright comma -100\n\nKPX r y 18\nKPX r w 6\nKPX r v 6\nKPX r t 8\nKPX r quotedblright -15\nKPX r q -24\nKPX r period -120\nKPX r o -6\nKPX r l -20\nKPX r k -20\nKPX r hyphen -30\nKPX r h -20\nKPX r f 8\nKPX r emdash -20\nKPX r e -26\nKPX r d -26\nKPX r comma -110\nKPX r c -12\nKPX r a -20\n\nKPX s quoteright -40\nKPX s quotedblright -45\n\nKPX semicolon space -30\n\nKPX space quotesinglbase -30\nKPX space quoteleft -40\nKPX space quotedblleft -40\nKPX space quotedblbase -30\nKPX space Y -70\nKPX space W -70\nKPX space V -70\n\nKPX t quoteright 10\nKPX t quotedblright -10\n\nKPX u quoteright -55\nKPX u quotedblright -50\n\nKPX v quoteright -20\nKPX v quotedblright -30\nKPX v q -6\nKPX v period -70\nKPX v o -6\nKPX v e -6\nKPX v d -6\nKPX v comma -70\nKPX v c -6\nKPX v a -6\n\nKPX w quoteright -20\nKPX w quotedblright -30\nKPX w period -62\nKPX w comma -62\n\nKPX x y 12\nKPX x w -6\nKPX x quoteright -40\nKPX x quotedblright -50\nKPX x q -6\nKPX x o -6\nKPX x e -6\nKPX x d -6\nKPX x c -6\n\nKPX y quoteright -10\nKPX y quotedblright -20\nKPX y period -70\nKPX y emdash 40\nKPX y comma -60\n\nKPX z quoteright -40\nKPX z quotedblright -50\nKPX z o -6\nKPX z e -6\nKPX z d -6\nKPX z c -6\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pzcmi8a.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Fri Dec 28 16:35:46 1990\nComment UniqueID 33936\nComment VMusage 34559 41451\nFontName ZapfChancery-MediumItalic\nFullName ITC Zapf Chancery Medium Italic\nFamilyName ITC Zapf Chancery\nWeight Medium\nItalicAngle -14\nIsFixedPitch false\nFontBBox -181 -314 1065 831\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.007\nNotice Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated.  All Rights Reserved.ITC Zapf Chancery is a registered trademark of International Typeface Corporation.\nEncodingScheme AdobeStandardEncoding\nCapHeight 708\nXHeight 438\nAscender 714\nDescender -314\nStartCharMetrics 228\nC 32 ; WX 220 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 280 ; N exclam ; B 119 -14 353 610 ;\nC 34 ; WX 220 ; N quotedbl ; B 120 343 333 610 ;\nC 35 ; WX 440 ; N numbersign ; B 83 0 521 594 ;\nC 36 ; WX 440 ; N dollar ; B 60 -144 508 709 ;\nC 37 ; WX 680 ; N percent ; B 132 -160 710 700 ;\nC 38 ; WX 780 ; N ampersand ; B 126 -16 915 610 ;\nC 39 ; WX 240 ; N quoteright ; B 168 343 338 610 ;\nC 40 ; WX 260 ; N parenleft ; B 96 -216 411 664 ;\nC 41 ; WX 220 ; N parenright ; B -13 -216 302 664 ;\nC 42 ; WX 420 ; N asterisk ; B 139 263 479 610 ;\nC 43 ; WX 520 ; N plus ; B 117 0 543 426 ;\nC 44 ; WX 220 ; N comma ; B 25 -140 213 148 ;\nC 45 ; WX 280 ; N hyphen ; B 69 190 334 248 ;\nC 46 ; WX 220 ; N period ; B 102 -14 228 128 ;\nC 47 ; WX 340 ; N slash ; B 74 -16 458 610 ;\nC 48 ; WX 440 ; N zero ; B 79 -16 538 610 ;\nC 49 ; WX 440 ; N one ; B 41 0 428 610 ;\nC 50 ; WX 440 ; N two ; B 17 -16 485 610 ;\nC 51 ; WX 440 ; N three ; B 1 -16 485 610 ;\nC 52 ; WX 440 ; N four ; B 77 -35 499 610 ;\nC 53 ; WX 440 ; N five ; B 60 -16 595 679 ;\nC 54 ; WX 440 ; N six ; B 90 -16 556 610 ;\nC 55 ; WX 440 ; N seven ; B 157 -33 561 645 ;\nC 56 ; WX 440 ; N eight ; B 65 -16 529 610 ;\nC 57 ; WX 440 ; N nine ; B 32 -16 517 610 ;\nC 58 ; WX 260 ; N colon ; B 98 -14 296 438 ;\nC 59 ; WX 240 ; N semicolon ; B 29 -140 299 438 ;\nC 60 ; WX 520 ; N less ; B 139 0 527 468 ;\nC 61 ; WX 520 ; N equal ; B 117 86 543 340 ;\nC 62 ; WX 520 ; N greater ; B 139 0 527 468 ;\nC 63 ; WX 380 ; N question ; B 150 -14 455 610 ;\nC 64 ; WX 700 ; N at ; B 127 -16 753 610 ;\nC 65 ; WX 620 ; N A ; B 13 -16 697 632 ;\nC 66 ; WX 600 ; N B ; B 85 -6 674 640 ;\nC 67 ; WX 520 ; N C ; B 93 -16 631 610 ;\nC 68 ; WX 700 ; N D ; B 86 -6 768 640 ;\nC 69 ; WX 620 ; N E ; B 91 -12 709 618 ;\nC 70 ; WX 580 ; N F ; B 120 -118 793 629 ;\nC 71 ; WX 620 ; N G ; B 148 -242 709 610 ;\nC 72 ; WX 680 ; N H ; B 18 -16 878 708 ;\nC 73 ; WX 380 ; N I ; B 99 0 504 594 ;\nC 74 ; WX 400 ; N J ; B -14 -147 538 594 ;\nC 75 ; WX 660 ; N K ; B 53 -153 844 610 ;\nC 76 ; WX 580 ; N L ; B 53 -16 657 610 ;\nC 77 ; WX 840 ; N M ; B 58 -16 1020 722 ;\nC 78 ; WX 700 ; N N ; B 85 -168 915 708 ;\nC 79 ; WX 600 ; N O ; B 94 -16 660 610 ;\nC 80 ; WX 540 ; N P ; B 42 0 658 628 ;\nC 81 ; WX 600 ; N Q ; B 84 -177 775 610 ;\nC 82 ; WX 600 ; N R ; B 58 -168 805 640 ;\nC 83 ; WX 460 ; N S ; B 45 -81 558 610 ;\nC 84 ; WX 500 ; N T ; B 63 0 744 667 ;\nC 85 ; WX 740 ; N U ; B 126 -16 792 617 ;\nC 86 ; WX 640 ; N V ; B 124 -16 810 714 ;\nC 87 ; WX 880 ; N W ; B 94 -16 1046 723 ;\nC 88 ; WX 560 ; N X ; B -30 -16 699 610 ;\nC 89 ; WX 560 ; N Y ; B 41 -168 774 647 ;\nC 90 ; WX 620 ; N Z ; B 42 -19 669 624 ;\nC 91 ; WX 240 ; N bracketleft ; B -13 -207 405 655 ;\nC 92 ; WX 480 ; N backslash ; B 140 -16 524 610 ;\nC 93 ; WX 320 ; N bracketright ; B -27 -207 391 655 ;\nC 94 ; WX 520 ; N asciicircum ; B 132 239 532 594 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 240 ; N quoteleft ; B 169 343 339 610 ;\nC 97 ; WX 420 ; N a ; B 92 -15 485 438 ;\nC 98 ; WX 420 ; N b ; B 82 -23 492 714 ;\nC 99 ; WX 340 ; N c ; B 87 -14 406 438 ;\nC 100 ; WX 440 ; N d ; B 102 -14 651 714 ;\nC 101 ; WX 340 ; N e ; B 87 -14 403 438 ;\nC 102 ; WX 320 ; N f ; B -119 -314 547 714 ; L i fi ; L l fl ;\nC 103 ; WX 400 ; N g ; B -108 -314 503 438 ;\nC 104 ; WX 440 ; N h ; B 55 -14 524 714 ;\nC 105 ; WX 240 ; N i ; B 100 -14 341 635 ;\nC 106 ; WX 220 ; N j ; B -112 -314 332 635 ;\nC 107 ; WX 440 ; N k ; B 87 -184 628 714 ;\nC 108 ; WX 240 ; N l ; B 102 -14 480 714 ;\nC 109 ; WX 620 ; N m ; B 86 -14 704 438 ;\nC 110 ; WX 460 ; N n ; B 101 -14 544 438 ;\nC 111 ; WX 400 ; N o ; B 87 -14 449 438 ;\nC 112 ; WX 440 ; N p ; B -23 -314 484 432 ;\nC 113 ; WX 400 ; N q ; B 87 -300 490 510 ;\nC 114 ; WX 300 ; N r ; B 101 -14 424 438 ;\nC 115 ; WX 320 ; N s ; B 46 -14 403 438 ;\nC 116 ; WX 320 ; N t ; B 106 -14 426 539 ;\nC 117 ; WX 460 ; N u ; B 102 -14 528 438 ;\nC 118 ; WX 440 ; N v ; B 87 -14 533 488 ;\nC 119 ; WX 680 ; N w ; B 87 -14 782 488 ;\nC 120 ; WX 420 ; N x ; B 70 -195 589 438 ;\nC 121 ; WX 400 ; N y ; B -24 -314 483 438 ;\nC 122 ; WX 440 ; N z ; B 26 -14 508 445 ;\nC 123 ; WX 240 ; N braceleft ; B 55 -207 383 655 ;\nC 124 ; WX 520 ; N bar ; B 320 -16 378 714 ;\nC 125 ; WX 240 ; N braceright ; B -10 -207 318 655 ;\nC 126 ; WX 520 ; N asciitilde ; B 123 186 539 320 ;\nC 161 ; WX 280 ; N exclamdown ; B 72 -186 306 438 ;\nC 162 ; WX 440 ; N cent ; B 122 -134 476 543 ;\nC 163 ; WX 440 ; N sterling ; B -16 -52 506 610 ;\nC 164 ; WX 60 ; N fraction ; B -181 -16 320 610 ;\nC 165 ; WX 440 ; N yen ; B -1 -168 613 647 ;\nC 166 ; WX 440 ; N florin ; B -64 -314 582 610 ;\nC 167 ; WX 420 ; N section ; B 53 -215 514 610 ;\nC 168 ; WX 440 ; N currency ; B 50 85 474 509 ;\nC 169 ; WX 160 ; N quotesingle ; B 145 343 215 610 ;\nC 170 ; WX 340 ; N quotedblleft ; B 169 343 464 610 ;\nC 171 ; WX 340 ; N guillemotleft ; B 98 24 356 414 ;\nC 172 ; WX 240 ; N guilsinglleft ; B 98 24 258 414 ;\nC 173 ; WX 260 ; N guilsinglright ; B 106 24 266 414 ;\nC 174 ; WX 520 ; N fi ; B -124 -314 605 714 ;\nC 175 ; WX 520 ; N fl ; B -124 -314 670 714 ;\nC 177 ; WX 500 ; N endash ; B 51 199 565 239 ;\nC 178 ; WX 460 ; N dagger ; B 138 -37 568 610 ;\nC 179 ; WX 480 ; N daggerdbl ; B 138 -59 533 610 ;\nC 180 ; WX 220 ; N periodcentered ; B 139 208 241 310 ;\nC 182 ; WX 500 ; N paragraph ; B 105 -199 638 594 ;\nC 183 ; WX 600 ; N bullet ; B 228 149 524 445 ;\nC 184 ; WX 180 ; N quotesinglbase ; B 21 -121 191 146 ;\nC 185 ; WX 280 ; N quotedblbase ; B -14 -121 281 146 ;\nC 186 ; WX 360 ; N quotedblright ; B 158 343 453 610 ;\nC 187 ; WX 380 ; N guillemotright ; B 117 24 375 414 ;\nC 188 ; WX 1000 ; N ellipsis ; B 124 -14 916 128 ;\nC 189 ; WX 960 ; N perthousand ; B 112 -160 1005 700 ;\nC 191 ; WX 400 ; N questiondown ; B 82 -186 387 438 ;\nC 193 ; WX 220 ; N grave ; B 193 492 339 659 ;\nC 194 ; WX 300 ; N acute ; B 265 492 422 659 ;\nC 195 ; WX 340 ; N circumflex ; B 223 482 443 649 ;\nC 196 ; WX 440 ; N tilde ; B 243 543 522 619 ;\nC 197 ; WX 440 ; N macron ; B 222 544 465 578 ;\nC 198 ; WX 440 ; N breve ; B 253 522 501 631 ;\nC 199 ; WX 220 ; N dotaccent ; B 236 522 328 610 ;\nC 200 ; WX 360 ; N dieresis ; B 243 522 469 610 ;\nC 202 ; WX 300 ; N ring ; B 240 483 416 659 ;\nC 203 ; WX 300 ; N cedilla ; B 12 -191 184 6 ;\nC 205 ; WX 400 ; N hungarumlaut ; B 208 492 495 659 ;\nC 206 ; WX 280 ; N ogonek ; B 38 -191 233 6 ;\nC 207 ; WX 340 ; N caron ; B 254 492 474 659 ;\nC 208 ; WX 1000 ; N emdash ; B 51 199 1065 239 ;\nC 225 ; WX 740 ; N AE ; B -21 -16 799 594 ;\nC 227 ; WX 260 ; N ordfeminine ; B 111 338 386 610 ;\nC 232 ; WX 580 ; N Lslash ; B 49 -16 657 610 ;\nC 233 ; WX 660 ; N Oslash ; B 83 -78 751 672 ;\nC 234 ; WX 820 ; N OE ; B 63 -16 909 610 ;\nC 235 ; WX 260 ; N ordmasculine ; B 128 339 373 610 ;\nC 241 ; WX 540 ; N ae ; B 67 -14 624 468 ;\nC 245 ; WX 240 ; N dotlessi ; B 100 -14 306 438 ;\nC 248 ; WX 300 ; N lslash ; B 121 -14 515 714 ;\nC 249 ; WX 440 ; N oslash ; B 46 -64 540 488 ;\nC 250 ; WX 560 ; N oe ; B 78 -14 628 438 ;\nC 251 ; WX 420 ; N germandbls ; B -127 -314 542 714 ;\nC -1 ; WX 340 ; N ecircumflex ; B 87 -14 433 649 ;\nC -1 ; WX 340 ; N edieresis ; B 87 -14 449 610 ;\nC -1 ; WX 420 ; N aacute ; B 92 -15 492 659 ;\nC -1 ; WX 740 ; N registered ; B 137 -16 763 610 ;\nC -1 ; WX 240 ; N icircumflex ; B 100 -14 363 649 ;\nC -1 ; WX 460 ; N udieresis ; B 102 -14 528 610 ;\nC -1 ; WX 400 ; N ograve ; B 87 -14 449 659 ;\nC -1 ; WX 460 ; N uacute ; B 102 -14 528 659 ;\nC -1 ; WX 460 ; N ucircumflex ; B 102 -14 528 649 ;\nC -1 ; WX 620 ; N Aacute ; B 13 -16 702 821 ;\nC -1 ; WX 240 ; N igrave ; B 100 -14 306 659 ;\nC -1 ; WX 380 ; N Icircumflex ; B 99 0 504 821 ;\nC -1 ; WX 340 ; N ccedilla ; B 62 -191 406 438 ;\nC -1 ; WX 420 ; N adieresis ; B 92 -15 485 610 ;\nC -1 ; WX 620 ; N Ecircumflex ; B 91 -12 709 821 ;\nC -1 ; WX 320 ; N scaron ; B 46 -14 464 659 ;\nC -1 ; WX 440 ; N thorn ; B -38 -314 505 714 ;\nC -1 ; WX 1000 ; N trademark ; B 127 187 1046 594 ;\nC -1 ; WX 340 ; N egrave ; B 87 -14 403 659 ;\nC -1 ; WX 264 ; N threesuperior ; B 59 234 348 610 ;\nC -1 ; WX 440 ; N zcaron ; B 26 -14 514 659 ;\nC -1 ; WX 420 ; N atilde ; B 92 -15 522 619 ;\nC -1 ; WX 420 ; N aring ; B 92 -15 485 659 ;\nC -1 ; WX 400 ; N ocircumflex ; B 87 -14 453 649 ;\nC -1 ; WX 620 ; N Edieresis ; B 91 -12 709 762 ;\nC -1 ; WX 660 ; N threequarters ; B 39 -16 706 610 ;\nC -1 ; WX 400 ; N ydieresis ; B -24 -314 483 610 ;\nC -1 ; WX 400 ; N yacute ; B -24 -314 483 659 ;\nC -1 ; WX 240 ; N iacute ; B 100 -14 392 659 ;\nC -1 ; WX 620 ; N Acircumflex ; B 13 -16 697 821 ;\nC -1 ; WX 740 ; N Uacute ; B 126 -16 792 821 ;\nC -1 ; WX 340 ; N eacute ; B 87 -14 462 659 ;\nC -1 ; WX 600 ; N Ograve ; B 94 -16 660 821 ;\nC -1 ; WX 420 ; N agrave ; B 92 -15 485 659 ;\nC -1 ; WX 740 ; N Udieresis ; B 126 -16 792 762 ;\nC -1 ; WX 420 ; N acircumflex ; B 92 -15 485 649 ;\nC -1 ; WX 380 ; N Igrave ; B 99 0 504 821 ;\nC -1 ; WX 264 ; N twosuperior ; B 72 234 354 610 ;\nC -1 ; WX 740 ; N Ugrave ; B 126 -16 792 821 ;\nC -1 ; WX 660 ; N onequarter ; B 56 -16 702 610 ;\nC -1 ; WX 740 ; N Ucircumflex ; B 126 -16 792 821 ;\nC -1 ; WX 460 ; N Scaron ; B 45 -81 594 831 ;\nC -1 ; WX 380 ; N Idieresis ; B 99 0 519 762 ;\nC -1 ; WX 240 ; N idieresis ; B 100 -14 369 610 ;\nC -1 ; WX 620 ; N Egrave ; B 91 -12 709 821 ;\nC -1 ; WX 600 ; N Oacute ; B 94 -16 660 821 ;\nC -1 ; WX 520 ; N divide ; B 117 -14 543 440 ;\nC -1 ; WX 620 ; N Atilde ; B 13 -16 702 771 ;\nC -1 ; WX 620 ; N Aring ; B 13 -16 697 831 ;\nC -1 ; WX 600 ; N Odieresis ; B 94 -16 660 762 ;\nC -1 ; WX 620 ; N Adieresis ; B 13 -16 709 762 ;\nC -1 ; WX 700 ; N Ntilde ; B 85 -168 915 761 ;\nC -1 ; WX 620 ; N Zcaron ; B 42 -19 669 831 ;\nC -1 ; WX 540 ; N Thorn ; B 52 0 647 623 ;\nC -1 ; WX 380 ; N Iacute ; B 99 0 532 821 ;\nC -1 ; WX 520 ; N plusminus ; B 117 0 543 436 ;\nC -1 ; WX 520 ; N multiply ; B 133 16 527 410 ;\nC -1 ; WX 620 ; N Eacute ; B 91 -12 709 821 ;\nC -1 ; WX 560 ; N Ydieresis ; B 41 -168 774 762 ;\nC -1 ; WX 264 ; N onesuperior ; B 83 244 311 610 ;\nC -1 ; WX 460 ; N ugrave ; B 102 -14 528 659 ;\nC -1 ; WX 520 ; N logicalnot ; B 117 86 543 340 ;\nC -1 ; WX 460 ; N ntilde ; B 101 -14 544 619 ;\nC -1 ; WX 600 ; N Otilde ; B 94 -16 660 761 ;\nC -1 ; WX 400 ; N otilde ; B 87 -14 502 619 ;\nC -1 ; WX 520 ; N Ccedilla ; B 93 -191 631 610 ;\nC -1 ; WX 620 ; N Agrave ; B 13 -16 697 821 ;\nC -1 ; WX 660 ; N onehalf ; B 56 -16 702 610 ;\nC -1 ; WX 700 ; N Eth ; B 86 -6 768 640 ;\nC -1 ; WX 400 ; N degree ; B 171 324 457 610 ;\nC -1 ; WX 560 ; N Yacute ; B 41 -168 774 821 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 94 -16 660 821 ;\nC -1 ; WX 400 ; N oacute ; B 87 -14 482 659 ;\nC -1 ; WX 460 ; N mu ; B 7 -314 523 438 ;\nC -1 ; WX 520 ; N minus ; B 117 184 543 242 ;\nC -1 ; WX 400 ; N eth ; B 87 -14 522 714 ;\nC -1 ; WX 400 ; N odieresis ; B 87 -14 479 610 ;\nC -1 ; WX 740 ; N copyright ; B 137 -16 763 610 ;\nC -1 ; WX 520 ; N brokenbar ; B 320 -16 378 714 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 131\n\nKPX A quoteright -40\nKPX A quotedblright -40\nKPX A U -10\nKPX A T 10\nKPX A Q 10\nKPX A O 10\nKPX A G -30\nKPX A C 20\n\nKPX D period -30\nKPX D comma -20\nKPX D Y 10\nKPX D A -10\n\nKPX F period -40\nKPX F i 10\nKPX F comma -30\n\nKPX G period -20\nKPX G comma -10\n\nKPX J period -20\nKPX J comma -10\n\nKPX K u -20\nKPX K o -20\nKPX K e -20\n\nKPX L y -10\nKPX L quoteright -25\nKPX L quotedblright -25\nKPX L W -10\nKPX L V -20\n\nKPX O period -20\nKPX O comma -10\nKPX O Y 10\nKPX O T 20\nKPX O A -20\n\nKPX P period -50\nKPX P o -10\nKPX P e -10\nKPX P comma -40\nKPX P a -20\nKPX P A -10\n\nKPX Q U -10\n\nKPX R Y 10\nKPX R W 10\nKPX R T 20\n\nKPX T o -20\nKPX T i 20\nKPX T hyphen -20\nKPX T h 20\nKPX T e -20\nKPX T a -20\nKPX T O 30\nKPX T A 10\n\nKPX V period -100\nKPX V o -20\nKPX V e -20\nKPX V comma -90\nKPX V a -20\nKPX V O 10\nKPX V G -20\n\nKPX W period -50\nKPX W o -20\nKPX W i 10\nKPX W h 10\nKPX W e -20\nKPX W comma -40\nKPX W a -20\nKPX W O 10\n\nKPX Y u -20\nKPX Y period -50\nKPX Y o -50\nKPX Y i 10\nKPX Y e -40\nKPX Y comma -40\nKPX Y a -60\n\nKPX b period -30\nKPX b l -20\nKPX b comma -20\nKPX b b -20\n\nKPX c k -10\n\nKPX comma quoteright -70\nKPX comma quotedblright -70\n\nKPX d w -20\nKPX d v -10\nKPX d d -40\n\nKPX e y 10\n\nKPX f quoteright 30\nKPX f quotedblright 30\nKPX f period -50\nKPX f f -50\nKPX f e -10\nKPX f comma -40\nKPX f a -20\n\nKPX g y 10\nKPX g period -30\nKPX g i 10\nKPX g e 10\nKPX g comma -20\nKPX g a 10\n\nKPX k y 10\nKPX k o -10\nKPX k e -20\n\nKPX m y 10\nKPX m u 10\n\nKPX n y 20\n\nKPX o period -30\nKPX o comma -20\n\nKPX p period -30\nKPX p p -10\nKPX p comma -20\n\nKPX period quoteright -80\nKPX period quotedblright -80\n\nKPX quotedblleft quoteleft 20\nKPX quotedblleft A 10\n\nKPX quoteleft quoteleft -115\nKPX quoteleft A 10\n\nKPX quoteright v 30\nKPX quoteright t 20\nKPX quoteright s -25\nKPX quoteright r 30\nKPX quoteright quoteright -115\nKPX quoteright quotedblright 20\nKPX quoteright l 20\n\nKPX r period -50\nKPX r i 10\nKPX r comma -40\n\nKPX s period -20\nKPX s comma -10\n\nKPX v period -30\nKPX v comma -20\n\nKPX w period -30\nKPX w o 10\nKPX w h 20\nKPX w comma -20\nEndKernPairs\nEndKernData\nStartComposites 56\nCC Aacute 2 ; PCC A 0 0 ; PCC acute 280 162 ;\nCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 240 172 ;\nCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 240 152 ;\nCC Agrave 2 ; PCC A 0 0 ; PCC grave 250 162 ;\nCC Aring 2 ; PCC A 0 0 ; PCC ring 260 172 ;\nCC Atilde 2 ; PCC A 0 0 ; PCC tilde 180 152 ;\nCC Eacute 2 ; PCC E 0 0 ; PCC acute 230 162 ;\nCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 180 172 ;\nCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 170 152 ;\nCC Egrave 2 ; PCC E 0 0 ; PCC grave 220 162 ;\nCC Iacute 2 ; PCC I 0 0 ; PCC acute 110 162 ;\nCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 60 172 ;\nCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 50 152 ;\nCC Igrave 2 ; PCC I 0 0 ; PCC grave 100 162 ;\nCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 210 142 ;\nCC Oacute 2 ; PCC O 0 0 ; PCC acute 160 162 ;\nCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 130 172 ;\nCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 120 152 ;\nCC Ograve 2 ; PCC O 0 0 ; PCC grave 150 162 ;\nCC Otilde 2 ; PCC O 0 0 ; PCC tilde 90 142 ;\nCC Scaron 2 ; PCC S 0 0 ; PCC caron 120 172 ;\nCC Uacute 2 ; PCC U 0 0 ; PCC acute 310 162 ;\nCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 260 172 ;\nCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 260 152 ;\nCC Ugrave 2 ; PCC U 0 0 ; PCC grave 270 162 ;\nCC Yacute 2 ; PCC Y 0 0 ; PCC acute 220 162 ;\nCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 170 152 ;\nCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 130 172 ;\nCC aacute 2 ; PCC a 0 0 ; PCC acute 70 0 ;\nCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 20 0 ;\nCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 10 0 ;\nCC agrave 2 ; PCC a 0 0 ; PCC grave 80 0 ;\nCC aring 2 ; PCC a 0 0 ; PCC ring 60 0 ;\nCC atilde 2 ; PCC a 0 0 ; PCC tilde 0 0 ;\nCC eacute 2 ; PCC e 0 0 ; PCC acute 40 0 ;\nCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex -10 0 ;\nCC edieresis 2 ; PCC e 0 0 ; PCC dieresis -20 0 ;\nCC egrave 2 ; PCC e 0 0 ; PCC grave 30 0 ;\nCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -30 0 ;\nCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -80 0 ;\nCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -100 0 ;\nCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -40 0 ;\nCC ntilde 2 ; PCC n 0 0 ; PCC tilde 10 0 ;\nCC oacute 2 ; PCC o 0 0 ; PCC acute 60 0 ;\nCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 10 0 ;\nCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 10 0 ;\nCC ograve 2 ; PCC o 0 0 ; PCC grave 60 0 ;\nCC otilde 2 ; PCC o 0 0 ; PCC tilde -20 0 ;\nCC scaron 2 ; PCC s 0 0 ; PCC caron -10 0 ;\nCC uacute 2 ; PCC u 0 0 ; PCC acute 70 0 ;\nCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 30 0 ;\nCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 20 0 ;\nCC ugrave 2 ; PCC u 0 0 ; PCC grave 50 0 ;\nCC yacute 2 ; PCC y 0 0 ; PCC acute 60 0 ;\nCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 0 0 ;\nCC zcaron 2 ; PCC z 0 0 ; PCC caron 40 0 ;\nEndComposites\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/afm/pzdr.afm",
    "content": "StartFontMetrics 2.0\nComment Copyright (c) 1985, 1987, 1988, 1989 Adobe Systems Incorporated.  All rights reserved.\nComment Creation Date: Fri Dec  1 12:57:42 1989\nComment UniqueID 26200\nComment VMusage 39281 49041\nFontName ZapfDingbats\nFullName ITC Zapf Dingbats\nFamilyName ITC Zapf Dingbats\nWeight Medium\nItalicAngle 0\nIsFixedPitch false\nFontBBox -1 -143 981 820\nUnderlinePosition -98\nUnderlineThickness 54\nVersion 001.004\nNotice Copyright (c) 1985, 1987, 1988, 1989 Adobe Systems Incorporated.  All rights reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation.\nEncodingScheme FontSpecific\nStartCharMetrics 202\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 974 ; N a1 ; B 35 72 939 621 ;\nC 34 ; WX 961 ; N a2 ; B 35 81 927 611 ;\nC 35 ; WX 974 ; N a202 ; B 35 72 939 621 ;\nC 36 ; WX 980 ; N a3 ; B 35 0 945 692 ;\nC 37 ; WX 719 ; N a4 ; B 34 139 685 566 ;\nC 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ;\nC 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ;\nC 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ;\nC 41 ; WX 690 ; N a117 ; B 35 138 655 553 ;\nC 42 ; WX 960 ; N a11 ; B 35 123 925 568 ;\nC 43 ; WX 939 ; N a12 ; B 35 134 904 559 ;\nC 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ;\nC 45 ; WX 855 ; N a14 ; B 34 59 820 632 ;\nC 46 ; WX 911 ; N a15 ; B 35 50 876 642 ;\nC 47 ; WX 933 ; N a16 ; B 35 139 899 550 ;\nC 48 ; WX 911 ; N a105 ; B 35 50 876 642 ;\nC 49 ; WX 945 ; N a17 ; B 35 139 909 553 ;\nC 50 ; WX 974 ; N a18 ; B 35 104 938 587 ;\nC 51 ; WX 755 ; N a19 ; B 34 -13 721 705 ;\nC 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ;\nC 53 ; WX 762 ; N a21 ; B 35 0 727 692 ;\nC 54 ; WX 761 ; N a22 ; B 35 0 727 692 ;\nC 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ;\nC 56 ; WX 677 ; N a24 ; B 36 -13 642 705 ;\nC 57 ; WX 763 ; N a25 ; B 35 0 728 692 ;\nC 58 ; WX 760 ; N a26 ; B 35 0 726 692 ;\nC 59 ; WX 759 ; N a27 ; B 35 0 725 692 ;\nC 60 ; WX 754 ; N a28 ; B 35 0 720 692 ;\nC 61 ; WX 494 ; N a6 ; B 35 0 460 692 ;\nC 62 ; WX 552 ; N a7 ; B 35 0 517 692 ;\nC 63 ; WX 537 ; N a8 ; B 35 0 503 692 ;\nC 64 ; WX 577 ; N a9 ; B 35 96 542 596 ;\nC 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ;\nC 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ;\nC 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ;\nC 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ;\nC 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ;\nC 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ;\nC 71 ; WX 794 ; N a34 ; B 35 -13 759 705 ;\nC 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ;\nC 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ;\nC 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ;\nC 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ;\nC 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ;\nC 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ;\nC 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ;\nC 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ;\nC 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ;\nC 81 ; WX 744 ; N a44 ; B 35 0 710 692 ;\nC 82 ; WX 723 ; N a45 ; B 35 0 688 692 ;\nC 83 ; WX 749 ; N a46 ; B 35 0 714 692 ;\nC 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ;\nC 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ;\nC 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ;\nC 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ;\nC 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ;\nC 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ;\nC 90 ; WX 759 ; N a53 ; B 35 0 725 692 ;\nC 91 ; WX 707 ; N a54 ; B 35 -13 672 704 ;\nC 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ;\nC 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ;\nC 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ;\nC 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ;\nC 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ;\nC 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ;\nC 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ;\nC 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ;\nC 100 ; WX 687 ; N a63 ; B 36 0 651 692 ;\nC 101 ; WX 696 ; N a64 ; B 35 0 661 691 ;\nC 102 ; WX 689 ; N a65 ; B 35 0 655 692 ;\nC 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ;\nC 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ;\nC 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ;\nC 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ;\nC 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ;\nC 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ;\nC 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ;\nC 110 ; WX 761 ; N a73 ; B 35 0 726 692 ;\nC 111 ; WX 762 ; N a74 ; B 35 0 727 692 ;\nC 112 ; WX 762 ; N a203 ; B 35 0 727 692 ;\nC 113 ; WX 759 ; N a75 ; B 35 0 725 692 ;\nC 114 ; WX 759 ; N a204 ; B 35 0 725 692 ;\nC 115 ; WX 892 ; N a76 ; B 35 0 858 705 ;\nC 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ;\nC 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ;\nC 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ;\nC 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ;\nC 120 ; WX 138 ; N a82 ; B 35 0 104 692 ;\nC 121 ; WX 277 ; N a83 ; B 35 0 242 692 ;\nC 122 ; WX 415 ; N a84 ; B 35 0 380 692 ;\nC 123 ; WX 392 ; N a97 ; B 35 263 357 705 ;\nC 124 ; WX 392 ; N a98 ; B 34 263 357 705 ;\nC 125 ; WX 668 ; N a99 ; B 35 263 633 705 ;\nC 126 ; WX 668 ; N a100 ; B 36 263 634 705 ;\nC 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ;\nC 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ;\nC 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ;\nC 164 ; WX 910 ; N a104 ; B 35 40 875 651 ;\nC 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ;\nC 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ;\nC 167 ; WX 760 ; N a108 ; B 0 121 758 569 ;\nC 168 ; WX 776 ; N a112 ; B 35 0 741 705 ;\nC 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ;\nC 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ;\nC 171 ; WX 626 ; N a109 ; B 34 0 591 705 ;\nC 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ;\nC 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ;\nC 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ;\nC 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ;\nC 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ;\nC 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ;\nC 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ;\nC 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ;\nC 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ;\nC 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ;\nC 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ;\nC 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ;\nC 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ;\nC 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ;\nC 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ;\nC 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ;\nC 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ;\nC 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ;\nC 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ;\nC 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ;\nC 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ;\nC 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ;\nC 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ;\nC 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ;\nC 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ;\nC 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ;\nC 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ;\nC 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ;\nC 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ;\nC 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ;\nC 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ;\nC 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ;\nC 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ;\nC 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ;\nC 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ;\nC 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ;\nC 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ;\nC 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ;\nC 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ;\nC 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ;\nC 212 ; WX 894 ; N a160 ; B 35 58 860 634 ;\nC 213 ; WX 838 ; N a161 ; B 35 152 803 540 ;\nC 214 ; WX 1016 ; N a163 ; B 34 152 981 540 ;\nC 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ;\nC 216 ; WX 748 ; N a196 ; B 35 94 698 597 ;\nC 217 ; WX 924 ; N a165 ; B 35 140 890 552 ;\nC 218 ; WX 748 ; N a192 ; B 35 94 698 597 ;\nC 219 ; WX 918 ; N a166 ; B 35 166 884 526 ;\nC 220 ; WX 927 ; N a167 ; B 35 32 892 660 ;\nC 221 ; WX 928 ; N a168 ; B 35 129 891 562 ;\nC 222 ; WX 928 ; N a169 ; B 35 128 893 563 ;\nC 223 ; WX 834 ; N a170 ; B 35 155 799 537 ;\nC 224 ; WX 873 ; N a171 ; B 35 93 838 599 ;\nC 225 ; WX 828 ; N a172 ; B 35 104 791 588 ;\nC 226 ; WX 924 ; N a173 ; B 35 98 889 594 ;\nC 227 ; WX 924 ; N a162 ; B 35 98 889 594 ;\nC 228 ; WX 917 ; N a174 ; B 35 0 882 692 ;\nC 229 ; WX 930 ; N a175 ; B 35 84 896 608 ;\nC 230 ; WX 931 ; N a176 ; B 35 84 896 608 ;\nC 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ;\nC 232 ; WX 883 ; N a178 ; B 35 71 848 623 ;\nC 233 ; WX 836 ; N a179 ; B 35 44 802 648 ;\nC 234 ; WX 836 ; N a193 ; B 35 44 802 648 ;\nC 235 ; WX 867 ; N a180 ; B 35 101 832 591 ;\nC 236 ; WX 867 ; N a199 ; B 35 101 832 591 ;\nC 237 ; WX 696 ; N a181 ; B 35 44 661 648 ;\nC 238 ; WX 696 ; N a200 ; B 35 44 661 648 ;\nC 239 ; WX 874 ; N a182 ; B 35 77 840 619 ;\nC 241 ; WX 874 ; N a201 ; B 35 73 840 615 ;\nC 242 ; WX 760 ; N a183 ; B 35 0 725 692 ;\nC 243 ; WX 946 ; N a184 ; B 35 160 911 533 ;\nC 244 ; WX 771 ; N a197 ; B 34 37 736 655 ;\nC 245 ; WX 865 ; N a185 ; B 35 207 830 481 ;\nC 246 ; WX 771 ; N a194 ; B 34 37 736 655 ;\nC 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ;\nC 248 ; WX 967 ; N a186 ; B 35 124 932 568 ;\nC 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ;\nC 250 ; WX 831 ; N a187 ; B 35 113 796 579 ;\nC 251 ; WX 873 ; N a188 ; B 36 118 838 578 ;\nC 252 ; WX 927 ; N a189 ; B 35 150 891 542 ;\nC 253 ; WX 970 ; N a190 ; B 35 76 931 616 ;\nC 254 ; WX 918 ; N a191 ; B 34 99 884 593 ;\nC -1 ; WX 410 ; N a86 ; B 35 0 375 692 ;\nC -1 ; WX 509 ; N a85 ; B 35 0 475 692 ;\nC -1 ; WX 334 ; N a95 ; B 35 0 299 692 ;\nC -1 ; WX 509 ; N a205 ; B 35 0 475 692 ;\nC -1 ; WX 390 ; N a89 ; B 35 -14 356 705 ;\nC -1 ; WX 234 ; N a87 ; B 35 -14 199 705 ;\nC -1 ; WX 276 ; N a91 ; B 35 0 242 692 ;\nC -1 ; WX 390 ; N a90 ; B 35 -14 355 705 ;\nC -1 ; WX 410 ; N a206 ; B 35 0 375 692 ;\nC -1 ; WX 317 ; N a94 ; B 35 0 283 692 ;\nC -1 ; WX 317 ; N a93 ; B 35 0 283 692 ;\nC -1 ; WX 276 ; N a92 ; B 35 0 242 692 ;\nC -1 ; WX 334 ; N a96 ; B 35 0 299 692 ;\nC -1 ; WX 234 ; N a88 ; B 35 -14 199 705 ;\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/pdfcorefonts/Courier-Bold.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Mon Jun 23 16:28:00 1997\nComment UniqueID 43048\nComment VMusage 41139 52164\nFontName Courier-Bold\nFullName Courier Bold\nFamilyName Courier\nWeight Bold\nItalicAngle 0\nIsFixedPitch true\nCharacterSet ExtendedRoman\nFontBBox -113 -250 749 801 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 003.000\nNotice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nEncodingScheme AdobeStandardEncoding\nCapHeight 562\nXHeight 439\nAscender 629\nDescender -157\nStdHW 84\nStdVW 106\nStartCharMetrics 315\nC 32 ; WX 600 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 600 ; N exclam ; B 202 -15 398 572 ;\nC 34 ; WX 600 ; N quotedbl ; B 135 277 465 562 ;\nC 35 ; WX 600 ; N numbersign ; B 56 -45 544 651 ;\nC 36 ; WX 600 ; N dollar ; B 82 -126 519 666 ;\nC 37 ; WX 600 ; N percent ; B 5 -15 595 616 ;\nC 38 ; WX 600 ; N ampersand ; B 36 -15 546 543 ;\nC 39 ; WX 600 ; N quoteright ; B 171 277 423 562 ;\nC 40 ; WX 600 ; N parenleft ; B 219 -102 461 616 ;\nC 41 ; WX 600 ; N parenright ; B 139 -102 381 616 ;\nC 42 ; WX 600 ; N asterisk ; B 91 219 509 601 ;\nC 43 ; WX 600 ; N plus ; B 71 39 529 478 ;\nC 44 ; WX 600 ; N comma ; B 123 -111 393 174 ;\nC 45 ; WX 600 ; N hyphen ; B 100 203 500 313 ;\nC 46 ; WX 600 ; N period ; B 192 -15 408 171 ;\nC 47 ; WX 600 ; N slash ; B 98 -77 502 626 ;\nC 48 ; WX 600 ; N zero ; B 87 -15 513 616 ;\nC 49 ; WX 600 ; N one ; B 81 0 539 616 ;\nC 50 ; WX 600 ; N two ; B 61 0 499 616 ;\nC 51 ; WX 600 ; N three ; B 63 -15 501 616 ;\nC 52 ; WX 600 ; N four ; B 53 0 507 616 ;\nC 53 ; WX 600 ; N five ; B 70 -15 521 601 ;\nC 54 ; WX 600 ; N six ; B 90 -15 521 616 ;\nC 55 ; WX 600 ; N seven ; B 55 0 494 601 ;\nC 56 ; WX 600 ; N eight ; B 83 -15 517 616 ;\nC 57 ; WX 600 ; N nine ; B 79 -15 510 616 ;\nC 58 ; WX 600 ; N colon ; B 191 -15 407 425 ;\nC 59 ; WX 600 ; N semicolon ; B 123 -111 408 425 ;\nC 60 ; WX 600 ; N less ; B 66 15 523 501 ;\nC 61 ; WX 600 ; N equal ; B 71 118 529 398 ;\nC 62 ; WX 600 ; N greater ; B 77 15 534 501 ;\nC 63 ; WX 600 ; N question ; B 98 -14 501 580 ;\nC 64 ; WX 600 ; N at ; B 16 -15 584 616 ;\nC 65 ; WX 600 ; N A ; B -9 0 609 562 ;\nC 66 ; WX 600 ; N B ; B 30 0 573 562 ;\nC 67 ; WX 600 ; N C ; B 22 -18 560 580 ;\nC 68 ; WX 600 ; N D ; B 30 0 594 562 ;\nC 69 ; WX 600 ; N E ; B 25 0 560 562 ;\nC 70 ; WX 600 ; N F ; B 39 0 570 562 ;\nC 71 ; WX 600 ; N G ; B 22 -18 594 580 ;\nC 72 ; WX 600 ; N H ; B 20 0 580 562 ;\nC 73 ; WX 600 ; N I ; B 77 0 523 562 ;\nC 74 ; WX 600 ; N J ; B 37 -18 601 562 ;\nC 75 ; WX 600 ; N K ; B 21 0 599 562 ;\nC 76 ; WX 600 ; N L ; B 39 0 578 562 ;\nC 77 ; WX 600 ; N M ; B -2 0 602 562 ;\nC 78 ; WX 600 ; N N ; B 8 -12 610 562 ;\nC 79 ; WX 600 ; N O ; B 22 -18 578 580 ;\nC 80 ; WX 600 ; N P ; B 48 0 559 562 ;\nC 81 ; WX 600 ; N Q ; B 32 -138 578 580 ;\nC 82 ; WX 600 ; N R ; B 24 0 599 562 ;\nC 83 ; WX 600 ; N S ; B 47 -22 553 582 ;\nC 84 ; WX 600 ; N T ; B 21 0 579 562 ;\nC 85 ; WX 600 ; N U ; B 4 -18 596 562 ;\nC 86 ; WX 600 ; N V ; B -13 0 613 562 ;\nC 87 ; WX 600 ; N W ; B -18 0 618 562 ;\nC 88 ; WX 600 ; N X ; B 12 0 588 562 ;\nC 89 ; WX 600 ; N Y ; B 12 0 589 562 ;\nC 90 ; WX 600 ; N Z ; B 62 0 539 562 ;\nC 91 ; WX 600 ; N bracketleft ; B 245 -102 475 616 ;\nC 92 ; WX 600 ; N backslash ; B 99 -77 503 626 ;\nC 93 ; WX 600 ; N bracketright ; B 125 -102 355 616 ;\nC 94 ; WX 600 ; N asciicircum ; B 108 250 492 616 ;\nC 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ;\nC 96 ; WX 600 ; N quoteleft ; B 178 277 428 562 ;\nC 97 ; WX 600 ; N a ; B 35 -15 570 454 ;\nC 98 ; WX 600 ; N b ; B 0 -15 584 626 ;\nC 99 ; WX 600 ; N c ; B 40 -15 545 459 ;\nC 100 ; WX 600 ; N d ; B 20 -15 591 626 ;\nC 101 ; WX 600 ; N e ; B 40 -15 563 454 ;\nC 102 ; WX 600 ; N f ; B 83 0 547 626 ; L i fi ; L l fl ;\nC 103 ; WX 600 ; N g ; B 30 -146 580 454 ;\nC 104 ; WX 600 ; N h ; B 5 0 592 626 ;\nC 105 ; WX 600 ; N i ; B 77 0 523 658 ;\nC 106 ; WX 600 ; N j ; B 63 -146 440 658 ;\nC 107 ; WX 600 ; N k ; B 20 0 585 626 ;\nC 108 ; WX 600 ; N l ; B 77 0 523 626 ;\nC 109 ; WX 600 ; N m ; B -22 0 626 454 ;\nC 110 ; WX 600 ; N n ; B 18 0 592 454 ;\nC 111 ; WX 600 ; N o ; B 30 -15 570 454 ;\nC 112 ; WX 600 ; N p ; B -1 -142 570 454 ;\nC 113 ; WX 600 ; N q ; B 20 -142 591 454 ;\nC 114 ; WX 600 ; N r ; B 47 0 580 454 ;\nC 115 ; WX 600 ; N s ; B 68 -17 535 459 ;\nC 116 ; WX 600 ; N t ; B 47 -15 532 562 ;\nC 117 ; WX 600 ; N u ; B -1 -15 569 439 ;\nC 118 ; WX 600 ; N v ; B -1 0 601 439 ;\nC 119 ; WX 600 ; N w ; B -18 0 618 439 ;\nC 120 ; WX 600 ; N x ; B 6 0 594 439 ;\nC 121 ; WX 600 ; N y ; B -4 -142 601 439 ;\nC 122 ; WX 600 ; N z ; B 81 0 520 439 ;\nC 123 ; WX 600 ; N braceleft ; B 160 -102 464 616 ;\nC 124 ; WX 600 ; N bar ; B 255 -250 345 750 ;\nC 125 ; WX 600 ; N braceright ; B 136 -102 440 616 ;\nC 126 ; WX 600 ; N asciitilde ; B 71 153 530 356 ;\nC 161 ; WX 600 ; N exclamdown ; B 202 -146 398 449 ;\nC 162 ; WX 600 ; N cent ; B 66 -49 518 614 ;\nC 163 ; WX 600 ; N sterling ; B 72 -28 558 611 ;\nC 164 ; WX 600 ; N fraction ; B 25 -60 576 661 ;\nC 165 ; WX 600 ; N yen ; B 10 0 590 562 ;\nC 166 ; WX 600 ; N florin ; B -30 -131 572 616 ;\nC 167 ; WX 600 ; N section ; B 83 -70 517 580 ;\nC 168 ; WX 600 ; N currency ; B 54 49 546 517 ;\nC 169 ; WX 600 ; N quotesingle ; B 227 277 373 562 ;\nC 170 ; WX 600 ; N quotedblleft ; B 71 277 535 562 ;\nC 171 ; WX 600 ; N guillemotleft ; B 8 70 553 446 ;\nC 172 ; WX 600 ; N guilsinglleft ; B 141 70 459 446 ;\nC 173 ; WX 600 ; N guilsinglright ; B 141 70 459 446 ;\nC 174 ; WX 600 ; N fi ; B 12 0 593 626 ;\nC 175 ; WX 600 ; N fl ; B 12 0 593 626 ;\nC 177 ; WX 600 ; N endash ; B 65 203 535 313 ;\nC 178 ; WX 600 ; N dagger ; B 106 -70 494 580 ;\nC 179 ; WX 600 ; N daggerdbl ; B 106 -70 494 580 ;\nC 180 ; WX 600 ; N periodcentered ; B 196 165 404 351 ;\nC 182 ; WX 600 ; N paragraph ; B 6 -70 576 580 ;\nC 183 ; WX 600 ; N bullet ; B 140 132 460 430 ;\nC 184 ; WX 600 ; N quotesinglbase ; B 175 -142 427 143 ;\nC 185 ; WX 600 ; N quotedblbase ; B 65 -142 529 143 ;\nC 186 ; WX 600 ; N quotedblright ; B 61 277 525 562 ;\nC 187 ; WX 600 ; N guillemotright ; B 47 70 592 446 ;\nC 188 ; WX 600 ; N ellipsis ; B 26 -15 574 116 ;\nC 189 ; WX 600 ; N perthousand ; B -113 -15 713 616 ;\nC 191 ; WX 600 ; N questiondown ; B 99 -146 502 449 ;\nC 193 ; WX 600 ; N grave ; B 132 508 395 661 ;\nC 194 ; WX 600 ; N acute ; B 205 508 468 661 ;\nC 195 ; WX 600 ; N circumflex ; B 103 483 497 657 ;\nC 196 ; WX 600 ; N tilde ; B 89 493 512 636 ;\nC 197 ; WX 600 ; N macron ; B 88 505 512 585 ;\nC 198 ; WX 600 ; N breve ; B 83 468 517 631 ;\nC 199 ; WX 600 ; N dotaccent ; B 230 498 370 638 ;\nC 200 ; WX 600 ; N dieresis ; B 128 498 472 638 ;\nC 202 ; WX 600 ; N ring ; B 198 481 402 678 ;\nC 203 ; WX 600 ; N cedilla ; B 205 -206 387 0 ;\nC 205 ; WX 600 ; N hungarumlaut ; B 68 488 588 661 ;\nC 206 ; WX 600 ; N ogonek ; B 169 -199 400 0 ;\nC 207 ; WX 600 ; N caron ; B 103 493 497 667 ;\nC 208 ; WX 600 ; N emdash ; B -10 203 610 313 ;\nC 225 ; WX 600 ; N AE ; B -29 0 602 562 ;\nC 227 ; WX 600 ; N ordfeminine ; B 147 196 453 580 ;\nC 232 ; WX 600 ; N Lslash ; B 39 0 578 562 ;\nC 233 ; WX 600 ; N Oslash ; B 22 -22 578 584 ;\nC 234 ; WX 600 ; N OE ; B -25 0 595 562 ;\nC 235 ; WX 600 ; N ordmasculine ; B 147 196 453 580 ;\nC 241 ; WX 600 ; N ae ; B -4 -15 601 454 ;\nC 245 ; WX 600 ; N dotlessi ; B 77 0 523 439 ;\nC 248 ; WX 600 ; N lslash ; B 77 0 523 626 ;\nC 249 ; WX 600 ; N oslash ; B 30 -24 570 463 ;\nC 250 ; WX 600 ; N oe ; B -18 -15 611 454 ;\nC 251 ; WX 600 ; N germandbls ; B 22 -15 596 626 ;\nC -1 ; WX 600 ; N Idieresis ; B 77 0 523 761 ;\nC -1 ; WX 600 ; N eacute ; B 40 -15 563 661 ;\nC -1 ; WX 600 ; N abreve ; B 35 -15 570 661 ;\nC -1 ; WX 600 ; N uhungarumlaut ; B -1 -15 628 661 ;\nC -1 ; WX 600 ; N ecaron ; B 40 -15 563 667 ;\nC -1 ; WX 600 ; N Ydieresis ; B 12 0 589 761 ;\nC -1 ; WX 600 ; N divide ; B 71 16 529 500 ;\nC -1 ; WX 600 ; N Yacute ; B 12 0 589 784 ;\nC -1 ; WX 600 ; N Acircumflex ; B -9 0 609 780 ;\nC -1 ; WX 600 ; N aacute ; B 35 -15 570 661 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 4 -18 596 780 ;\nC -1 ; WX 600 ; N yacute ; B -4 -142 601 661 ;\nC -1 ; WX 600 ; N scommaaccent ; B 68 -250 535 459 ;\nC -1 ; WX 600 ; N ecircumflex ; B 40 -15 563 657 ;\nC -1 ; WX 600 ; N Uring ; B 4 -18 596 801 ;\nC -1 ; WX 600 ; N Udieresis ; B 4 -18 596 761 ;\nC -1 ; WX 600 ; N aogonek ; B 35 -199 586 454 ;\nC -1 ; WX 600 ; N Uacute ; B 4 -18 596 784 ;\nC -1 ; WX 600 ; N uogonek ; B -1 -199 585 439 ;\nC -1 ; WX 600 ; N Edieresis ; B 25 0 560 761 ;\nC -1 ; WX 600 ; N Dcroat ; B 30 0 594 562 ;\nC -1 ; WX 600 ; N commaaccent ; B 205 -250 397 -57 ;\nC -1 ; WX 600 ; N copyright ; B 0 -18 600 580 ;\nC -1 ; WX 600 ; N Emacron ; B 25 0 560 708 ;\nC -1 ; WX 600 ; N ccaron ; B 40 -15 545 667 ;\nC -1 ; WX 600 ; N aring ; B 35 -15 570 678 ;\nC -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 610 562 ;\nC -1 ; WX 600 ; N lacute ; B 77 0 523 801 ;\nC -1 ; WX 600 ; N agrave ; B 35 -15 570 661 ;\nC -1 ; WX 600 ; N Tcommaaccent ; B 21 -250 579 562 ;\nC -1 ; WX 600 ; N Cacute ; B 22 -18 560 784 ;\nC -1 ; WX 600 ; N atilde ; B 35 -15 570 636 ;\nC -1 ; WX 600 ; N Edotaccent ; B 25 0 560 761 ;\nC -1 ; WX 600 ; N scaron ; B 68 -17 535 667 ;\nC -1 ; WX 600 ; N scedilla ; B 68 -206 535 459 ;\nC -1 ; WX 600 ; N iacute ; B 77 0 523 661 ;\nC -1 ; WX 600 ; N lozenge ; B 66 0 534 740 ;\nC -1 ; WX 600 ; N Rcaron ; B 24 0 599 790 ;\nC -1 ; WX 600 ; N Gcommaaccent ; B 22 -250 594 580 ;\nC -1 ; WX 600 ; N ucircumflex ; B -1 -15 569 657 ;\nC -1 ; WX 600 ; N acircumflex ; B 35 -15 570 657 ;\nC -1 ; WX 600 ; N Amacron ; B -9 0 609 708 ;\nC -1 ; WX 600 ; N rcaron ; B 47 0 580 667 ;\nC -1 ; WX 600 ; N ccedilla ; B 40 -206 545 459 ;\nC -1 ; WX 600 ; N Zdotaccent ; B 62 0 539 761 ;\nC -1 ; WX 600 ; N Thorn ; B 48 0 557 562 ;\nC -1 ; WX 600 ; N Omacron ; B 22 -18 578 708 ;\nC -1 ; WX 600 ; N Racute ; B 24 0 599 784 ;\nC -1 ; WX 600 ; N Sacute ; B 47 -22 553 784 ;\nC -1 ; WX 600 ; N dcaron ; B 20 -15 727 626 ;\nC -1 ; WX 600 ; N Umacron ; B 4 -18 596 708 ;\nC -1 ; WX 600 ; N uring ; B -1 -15 569 678 ;\nC -1 ; WX 600 ; N threesuperior ; B 138 222 433 616 ;\nC -1 ; WX 600 ; N Ograve ; B 22 -18 578 784 ;\nC -1 ; WX 600 ; N Agrave ; B -9 0 609 784 ;\nC -1 ; WX 600 ; N Abreve ; B -9 0 609 784 ;\nC -1 ; WX 600 ; N multiply ; B 81 39 520 478 ;\nC -1 ; WX 600 ; N uacute ; B -1 -15 569 661 ;\nC -1 ; WX 600 ; N Tcaron ; B 21 0 579 790 ;\nC -1 ; WX 600 ; N partialdiff ; B 63 -38 537 728 ;\nC -1 ; WX 600 ; N ydieresis ; B -4 -142 601 638 ;\nC -1 ; WX 600 ; N Nacute ; B 8 -12 610 784 ;\nC -1 ; WX 600 ; N icircumflex ; B 73 0 523 657 ;\nC -1 ; WX 600 ; N Ecircumflex ; B 25 0 560 780 ;\nC -1 ; WX 600 ; N adieresis ; B 35 -15 570 638 ;\nC -1 ; WX 600 ; N edieresis ; B 40 -15 563 638 ;\nC -1 ; WX 600 ; N cacute ; B 40 -15 545 661 ;\nC -1 ; WX 600 ; N nacute ; B 18 0 592 661 ;\nC -1 ; WX 600 ; N umacron ; B -1 -15 569 585 ;\nC -1 ; WX 600 ; N Ncaron ; B 8 -12 610 790 ;\nC -1 ; WX 600 ; N Iacute ; B 77 0 523 784 ;\nC -1 ; WX 600 ; N plusminus ; B 71 24 529 515 ;\nC -1 ; WX 600 ; N brokenbar ; B 255 -175 345 675 ;\nC -1 ; WX 600 ; N registered ; B 0 -18 600 580 ;\nC -1 ; WX 600 ; N Gbreve ; B 22 -18 594 784 ;\nC -1 ; WX 600 ; N Idotaccent ; B 77 0 523 761 ;\nC -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;\nC -1 ; WX 600 ; N Egrave ; B 25 0 560 784 ;\nC -1 ; WX 600 ; N racute ; B 47 0 580 661 ;\nC -1 ; WX 600 ; N omacron ; B 30 -15 570 585 ;\nC -1 ; WX 600 ; N Zacute ; B 62 0 539 784 ;\nC -1 ; WX 600 ; N Zcaron ; B 62 0 539 790 ;\nC -1 ; WX 600 ; N greaterequal ; B 26 0 523 696 ;\nC -1 ; WX 600 ; N Eth ; B 30 0 594 562 ;\nC -1 ; WX 600 ; N Ccedilla ; B 22 -206 560 580 ;\nC -1 ; WX 600 ; N lcommaaccent ; B 77 -250 523 626 ;\nC -1 ; WX 600 ; N tcaron ; B 47 -15 532 703 ;\nC -1 ; WX 600 ; N eogonek ; B 40 -199 563 454 ;\nC -1 ; WX 600 ; N Uogonek ; B 4 -199 596 562 ;\nC -1 ; WX 600 ; N Aacute ; B -9 0 609 784 ;\nC -1 ; WX 600 ; N Adieresis ; B -9 0 609 761 ;\nC -1 ; WX 600 ; N egrave ; B 40 -15 563 661 ;\nC -1 ; WX 600 ; N zacute ; B 81 0 520 661 ;\nC -1 ; WX 600 ; N iogonek ; B 77 -199 523 658 ;\nC -1 ; WX 600 ; N Oacute ; B 22 -18 578 784 ;\nC -1 ; WX 600 ; N oacute ; B 30 -15 570 661 ;\nC -1 ; WX 600 ; N amacron ; B 35 -15 570 585 ;\nC -1 ; WX 600 ; N sacute ; B 68 -17 535 661 ;\nC -1 ; WX 600 ; N idieresis ; B 77 0 523 618 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 22 -18 578 780 ;\nC -1 ; WX 600 ; N Ugrave ; B 4 -18 596 784 ;\nC -1 ; WX 600 ; N Delta ; B 6 0 594 688 ;\nC -1 ; WX 600 ; N thorn ; B -14 -142 570 626 ;\nC -1 ; WX 600 ; N twosuperior ; B 143 230 436 616 ;\nC -1 ; WX 600 ; N Odieresis ; B 22 -18 578 761 ;\nC -1 ; WX 600 ; N mu ; B -1 -142 569 439 ;\nC -1 ; WX 600 ; N igrave ; B 77 0 523 661 ;\nC -1 ; WX 600 ; N ohungarumlaut ; B 30 -15 668 661 ;\nC -1 ; WX 600 ; N Eogonek ; B 25 -199 576 562 ;\nC -1 ; WX 600 ; N dcroat ; B 20 -15 591 626 ;\nC -1 ; WX 600 ; N threequarters ; B -47 -60 648 661 ;\nC -1 ; WX 600 ; N Scedilla ; B 47 -206 553 582 ;\nC -1 ; WX 600 ; N lcaron ; B 77 0 597 626 ;\nC -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 599 562 ;\nC -1 ; WX 600 ; N Lacute ; B 39 0 578 784 ;\nC -1 ; WX 600 ; N trademark ; B -9 230 749 562 ;\nC -1 ; WX 600 ; N edotaccent ; B 40 -15 563 638 ;\nC -1 ; WX 600 ; N Igrave ; B 77 0 523 784 ;\nC -1 ; WX 600 ; N Imacron ; B 77 0 523 708 ;\nC -1 ; WX 600 ; N Lcaron ; B 39 0 637 562 ;\nC -1 ; WX 600 ; N onehalf ; B -47 -60 648 661 ;\nC -1 ; WX 600 ; N lessequal ; B 26 0 523 696 ;\nC -1 ; WX 600 ; N ocircumflex ; B 30 -15 570 657 ;\nC -1 ; WX 600 ; N ntilde ; B 18 0 592 636 ;\nC -1 ; WX 600 ; N Uhungarumlaut ; B 4 -18 638 784 ;\nC -1 ; WX 600 ; N Eacute ; B 25 0 560 784 ;\nC -1 ; WX 600 ; N emacron ; B 40 -15 563 585 ;\nC -1 ; WX 600 ; N gbreve ; B 30 -146 580 661 ;\nC -1 ; WX 600 ; N onequarter ; B -56 -60 656 661 ;\nC -1 ; WX 600 ; N Scaron ; B 47 -22 553 790 ;\nC -1 ; WX 600 ; N Scommaaccent ; B 47 -250 553 582 ;\nC -1 ; WX 600 ; N Ohungarumlaut ; B 22 -18 628 784 ;\nC -1 ; WX 600 ; N degree ; B 86 243 474 616 ;\nC -1 ; WX 600 ; N ograve ; B 30 -15 570 661 ;\nC -1 ; WX 600 ; N Ccaron ; B 22 -18 560 790 ;\nC -1 ; WX 600 ; N ugrave ; B -1 -15 569 661 ;\nC -1 ; WX 600 ; N radical ; B -19 -104 473 778 ;\nC -1 ; WX 600 ; N Dcaron ; B 30 0 594 790 ;\nC -1 ; WX 600 ; N rcommaaccent ; B 47 -250 580 454 ;\nC -1 ; WX 600 ; N Ntilde ; B 8 -12 610 759 ;\nC -1 ; WX 600 ; N otilde ; B 30 -15 570 636 ;\nC -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 599 562 ;\nC -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 578 562 ;\nC -1 ; WX 600 ; N Atilde ; B -9 0 609 759 ;\nC -1 ; WX 600 ; N Aogonek ; B -9 -199 625 562 ;\nC -1 ; WX 600 ; N Aring ; B -9 0 609 801 ;\nC -1 ; WX 600 ; N Otilde ; B 22 -18 578 759 ;\nC -1 ; WX 600 ; N zdotaccent ; B 81 0 520 638 ;\nC -1 ; WX 600 ; N Ecaron ; B 25 0 560 790 ;\nC -1 ; WX 600 ; N Iogonek ; B 77 -199 523 562 ;\nC -1 ; WX 600 ; N kcommaaccent ; B 20 -250 585 626 ;\nC -1 ; WX 600 ; N minus ; B 71 203 529 313 ;\nC -1 ; WX 600 ; N Icircumflex ; B 77 0 523 780 ;\nC -1 ; WX 600 ; N ncaron ; B 18 0 592 667 ;\nC -1 ; WX 600 ; N tcommaaccent ; B 47 -250 532 562 ;\nC -1 ; WX 600 ; N logicalnot ; B 71 103 529 413 ;\nC -1 ; WX 600 ; N odieresis ; B 30 -15 570 638 ;\nC -1 ; WX 600 ; N udieresis ; B -1 -15 569 638 ;\nC -1 ; WX 600 ; N notequal ; B 12 -47 537 563 ;\nC -1 ; WX 600 ; N gcommaaccent ; B 30 -146 580 714 ;\nC -1 ; WX 600 ; N eth ; B 58 -27 543 626 ;\nC -1 ; WX 600 ; N zcaron ; B 81 0 520 667 ;\nC -1 ; WX 600 ; N ncommaaccent ; B 18 -250 592 454 ;\nC -1 ; WX 600 ; N onesuperior ; B 153 230 447 616 ;\nC -1 ; WX 600 ; N imacron ; B 77 0 523 585 ;\nC -1 ; WX 600 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/pdfcorefonts/Courier-BoldOblique.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Mon Jun 23 16:28:46 1997\nComment UniqueID 43049\nComment VMusage 17529 79244\nFontName Courier-BoldOblique\nFullName Courier Bold Oblique\nFamilyName Courier\nWeight Bold\nItalicAngle -12\nIsFixedPitch true\nCharacterSet ExtendedRoman\nFontBBox -57 -250 869 801 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 003.000\nNotice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nEncodingScheme AdobeStandardEncoding\nCapHeight 562\nXHeight 439\nAscender 629\nDescender -157\nStdHW 84\nStdVW 106\nStartCharMetrics 315\nC 32 ; WX 600 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 600 ; N exclam ; B 215 -15 495 572 ;\nC 34 ; WX 600 ; N quotedbl ; B 211 277 585 562 ;\nC 35 ; WX 600 ; N numbersign ; B 88 -45 641 651 ;\nC 36 ; WX 600 ; N dollar ; B 87 -126 630 666 ;\nC 37 ; WX 600 ; N percent ; B 101 -15 625 616 ;\nC 38 ; WX 600 ; N ampersand ; B 61 -15 595 543 ;\nC 39 ; WX 600 ; N quoteright ; B 229 277 543 562 ;\nC 40 ; WX 600 ; N parenleft ; B 265 -102 592 616 ;\nC 41 ; WX 600 ; N parenright ; B 117 -102 444 616 ;\nC 42 ; WX 600 ; N asterisk ; B 179 219 598 601 ;\nC 43 ; WX 600 ; N plus ; B 114 39 596 478 ;\nC 44 ; WX 600 ; N comma ; B 99 -111 430 174 ;\nC 45 ; WX 600 ; N hyphen ; B 143 203 567 313 ;\nC 46 ; WX 600 ; N period ; B 206 -15 427 171 ;\nC 47 ; WX 600 ; N slash ; B 90 -77 626 626 ;\nC 48 ; WX 600 ; N zero ; B 135 -15 593 616 ;\nC 49 ; WX 600 ; N one ; B 93 0 562 616 ;\nC 50 ; WX 600 ; N two ; B 61 0 594 616 ;\nC 51 ; WX 600 ; N three ; B 71 -15 571 616 ;\nC 52 ; WX 600 ; N four ; B 81 0 559 616 ;\nC 53 ; WX 600 ; N five ; B 77 -15 621 601 ;\nC 54 ; WX 600 ; N six ; B 135 -15 652 616 ;\nC 55 ; WX 600 ; N seven ; B 147 0 622 601 ;\nC 56 ; WX 600 ; N eight ; B 115 -15 604 616 ;\nC 57 ; WX 600 ; N nine ; B 75 -15 592 616 ;\nC 58 ; WX 600 ; N colon ; B 205 -15 480 425 ;\nC 59 ; WX 600 ; N semicolon ; B 99 -111 481 425 ;\nC 60 ; WX 600 ; N less ; B 120 15 613 501 ;\nC 61 ; WX 600 ; N equal ; B 96 118 614 398 ;\nC 62 ; WX 600 ; N greater ; B 97 15 589 501 ;\nC 63 ; WX 600 ; N question ; B 183 -14 592 580 ;\nC 64 ; WX 600 ; N at ; B 65 -15 642 616 ;\nC 65 ; WX 600 ; N A ; B -9 0 632 562 ;\nC 66 ; WX 600 ; N B ; B 30 0 630 562 ;\nC 67 ; WX 600 ; N C ; B 74 -18 675 580 ;\nC 68 ; WX 600 ; N D ; B 30 0 664 562 ;\nC 69 ; WX 600 ; N E ; B 25 0 670 562 ;\nC 70 ; WX 600 ; N F ; B 39 0 684 562 ;\nC 71 ; WX 600 ; N G ; B 74 -18 675 580 ;\nC 72 ; WX 600 ; N H ; B 20 0 700 562 ;\nC 73 ; WX 600 ; N I ; B 77 0 643 562 ;\nC 74 ; WX 600 ; N J ; B 58 -18 721 562 ;\nC 75 ; WX 600 ; N K ; B 21 0 692 562 ;\nC 76 ; WX 600 ; N L ; B 39 0 636 562 ;\nC 77 ; WX 600 ; N M ; B -2 0 722 562 ;\nC 78 ; WX 600 ; N N ; B 8 -12 730 562 ;\nC 79 ; WX 600 ; N O ; B 74 -18 645 580 ;\nC 80 ; WX 600 ; N P ; B 48 0 643 562 ;\nC 81 ; WX 600 ; N Q ; B 83 -138 636 580 ;\nC 82 ; WX 600 ; N R ; B 24 0 617 562 ;\nC 83 ; WX 600 ; N S ; B 54 -22 673 582 ;\nC 84 ; WX 600 ; N T ; B 86 0 679 562 ;\nC 85 ; WX 600 ; N U ; B 101 -18 716 562 ;\nC 86 ; WX 600 ; N V ; B 84 0 733 562 ;\nC 87 ; WX 600 ; N W ; B 79 0 738 562 ;\nC 88 ; WX 600 ; N X ; B 12 0 690 562 ;\nC 89 ; WX 600 ; N Y ; B 109 0 709 562 ;\nC 90 ; WX 600 ; N Z ; B 62 0 637 562 ;\nC 91 ; WX 600 ; N bracketleft ; B 223 -102 606 616 ;\nC 92 ; WX 600 ; N backslash ; B 222 -77 496 626 ;\nC 93 ; WX 600 ; N bracketright ; B 103 -102 486 616 ;\nC 94 ; WX 600 ; N asciicircum ; B 171 250 556 616 ;\nC 95 ; WX 600 ; N underscore ; B -27 -125 585 -75 ;\nC 96 ; WX 600 ; N quoteleft ; B 297 277 487 562 ;\nC 97 ; WX 600 ; N a ; B 61 -15 593 454 ;\nC 98 ; WX 600 ; N b ; B 13 -15 636 626 ;\nC 99 ; WX 600 ; N c ; B 81 -15 631 459 ;\nC 100 ; WX 600 ; N d ; B 60 -15 645 626 ;\nC 101 ; WX 600 ; N e ; B 81 -15 605 454 ;\nC 102 ; WX 600 ; N f ; B 83 0 677 626 ; L i fi ; L l fl ;\nC 103 ; WX 600 ; N g ; B 40 -146 674 454 ;\nC 104 ; WX 600 ; N h ; B 18 0 615 626 ;\nC 105 ; WX 600 ; N i ; B 77 0 546 658 ;\nC 106 ; WX 600 ; N j ; B 36 -146 580 658 ;\nC 107 ; WX 600 ; N k ; B 33 0 643 626 ;\nC 108 ; WX 600 ; N l ; B 77 0 546 626 ;\nC 109 ; WX 600 ; N m ; B -22 0 649 454 ;\nC 110 ; WX 600 ; N n ; B 18 0 615 454 ;\nC 111 ; WX 600 ; N o ; B 71 -15 622 454 ;\nC 112 ; WX 600 ; N p ; B -32 -142 622 454 ;\nC 113 ; WX 600 ; N q ; B 60 -142 685 454 ;\nC 114 ; WX 600 ; N r ; B 47 0 655 454 ;\nC 115 ; WX 600 ; N s ; B 66 -17 608 459 ;\nC 116 ; WX 600 ; N t ; B 118 -15 567 562 ;\nC 117 ; WX 600 ; N u ; B 70 -15 592 439 ;\nC 118 ; WX 600 ; N v ; B 70 0 695 439 ;\nC 119 ; WX 600 ; N w ; B 53 0 712 439 ;\nC 120 ; WX 600 ; N x ; B 6 0 671 439 ;\nC 121 ; WX 600 ; N y ; B -21 -142 695 439 ;\nC 122 ; WX 600 ; N z ; B 81 0 614 439 ;\nC 123 ; WX 600 ; N braceleft ; B 203 -102 595 616 ;\nC 124 ; WX 600 ; N bar ; B 201 -250 505 750 ;\nC 125 ; WX 600 ; N braceright ; B 114 -102 506 616 ;\nC 126 ; WX 600 ; N asciitilde ; B 120 153 590 356 ;\nC 161 ; WX 600 ; N exclamdown ; B 196 -146 477 449 ;\nC 162 ; WX 600 ; N cent ; B 121 -49 605 614 ;\nC 163 ; WX 600 ; N sterling ; B 106 -28 650 611 ;\nC 164 ; WX 600 ; N fraction ; B 22 -60 708 661 ;\nC 165 ; WX 600 ; N yen ; B 98 0 710 562 ;\nC 166 ; WX 600 ; N florin ; B -57 -131 702 616 ;\nC 167 ; WX 600 ; N section ; B 74 -70 620 580 ;\nC 168 ; WX 600 ; N currency ; B 77 49 644 517 ;\nC 169 ; WX 600 ; N quotesingle ; B 303 277 493 562 ;\nC 170 ; WX 600 ; N quotedblleft ; B 190 277 594 562 ;\nC 171 ; WX 600 ; N guillemotleft ; B 62 70 639 446 ;\nC 172 ; WX 600 ; N guilsinglleft ; B 195 70 545 446 ;\nC 173 ; WX 600 ; N guilsinglright ; B 165 70 514 446 ;\nC 174 ; WX 600 ; N fi ; B 12 0 644 626 ;\nC 175 ; WX 600 ; N fl ; B 12 0 644 626 ;\nC 177 ; WX 600 ; N endash ; B 108 203 602 313 ;\nC 178 ; WX 600 ; N dagger ; B 175 -70 586 580 ;\nC 179 ; WX 600 ; N daggerdbl ; B 121 -70 587 580 ;\nC 180 ; WX 600 ; N periodcentered ; B 248 165 461 351 ;\nC 182 ; WX 600 ; N paragraph ; B 61 -70 700 580 ;\nC 183 ; WX 600 ; N bullet ; B 196 132 523 430 ;\nC 184 ; WX 600 ; N quotesinglbase ; B 144 -142 458 143 ;\nC 185 ; WX 600 ; N quotedblbase ; B 34 -142 560 143 ;\nC 186 ; WX 600 ; N quotedblright ; B 119 277 645 562 ;\nC 187 ; WX 600 ; N guillemotright ; B 71 70 647 446 ;\nC 188 ; WX 600 ; N ellipsis ; B 35 -15 587 116 ;\nC 189 ; WX 600 ; N perthousand ; B -45 -15 743 616 ;\nC 191 ; WX 600 ; N questiondown ; B 100 -146 509 449 ;\nC 193 ; WX 600 ; N grave ; B 272 508 503 661 ;\nC 194 ; WX 600 ; N acute ; B 312 508 609 661 ;\nC 195 ; WX 600 ; N circumflex ; B 212 483 607 657 ;\nC 196 ; WX 600 ; N tilde ; B 199 493 643 636 ;\nC 197 ; WX 600 ; N macron ; B 195 505 637 585 ;\nC 198 ; WX 600 ; N breve ; B 217 468 652 631 ;\nC 199 ; WX 600 ; N dotaccent ; B 348 498 493 638 ;\nC 200 ; WX 600 ; N dieresis ; B 246 498 595 638 ;\nC 202 ; WX 600 ; N ring ; B 319 481 528 678 ;\nC 203 ; WX 600 ; N cedilla ; B 168 -206 368 0 ;\nC 205 ; WX 600 ; N hungarumlaut ; B 171 488 729 661 ;\nC 206 ; WX 600 ; N ogonek ; B 143 -199 367 0 ;\nC 207 ; WX 600 ; N caron ; B 238 493 633 667 ;\nC 208 ; WX 600 ; N emdash ; B 33 203 677 313 ;\nC 225 ; WX 600 ; N AE ; B -29 0 708 562 ;\nC 227 ; WX 600 ; N ordfeminine ; B 188 196 526 580 ;\nC 232 ; WX 600 ; N Lslash ; B 39 0 636 562 ;\nC 233 ; WX 600 ; N Oslash ; B 48 -22 673 584 ;\nC 234 ; WX 600 ; N OE ; B 26 0 701 562 ;\nC 235 ; WX 600 ; N ordmasculine ; B 188 196 543 580 ;\nC 241 ; WX 600 ; N ae ; B 21 -15 652 454 ;\nC 245 ; WX 600 ; N dotlessi ; B 77 0 546 439 ;\nC 248 ; WX 600 ; N lslash ; B 77 0 587 626 ;\nC 249 ; WX 600 ; N oslash ; B 54 -24 638 463 ;\nC 250 ; WX 600 ; N oe ; B 18 -15 662 454 ;\nC 251 ; WX 600 ; N germandbls ; B 22 -15 629 626 ;\nC -1 ; WX 600 ; N Idieresis ; B 77 0 643 761 ;\nC -1 ; WX 600 ; N eacute ; B 81 -15 609 661 ;\nC -1 ; WX 600 ; N abreve ; B 61 -15 658 661 ;\nC -1 ; WX 600 ; N uhungarumlaut ; B 70 -15 769 661 ;\nC -1 ; WX 600 ; N ecaron ; B 81 -15 633 667 ;\nC -1 ; WX 600 ; N Ydieresis ; B 109 0 709 761 ;\nC -1 ; WX 600 ; N divide ; B 114 16 596 500 ;\nC -1 ; WX 600 ; N Yacute ; B 109 0 709 784 ;\nC -1 ; WX 600 ; N Acircumflex ; B -9 0 632 780 ;\nC -1 ; WX 600 ; N aacute ; B 61 -15 609 661 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 101 -18 716 780 ;\nC -1 ; WX 600 ; N yacute ; B -21 -142 695 661 ;\nC -1 ; WX 600 ; N scommaaccent ; B 66 -250 608 459 ;\nC -1 ; WX 600 ; N ecircumflex ; B 81 -15 607 657 ;\nC -1 ; WX 600 ; N Uring ; B 101 -18 716 801 ;\nC -1 ; WX 600 ; N Udieresis ; B 101 -18 716 761 ;\nC -1 ; WX 600 ; N aogonek ; B 61 -199 593 454 ;\nC -1 ; WX 600 ; N Uacute ; B 101 -18 716 784 ;\nC -1 ; WX 600 ; N uogonek ; B 70 -199 592 439 ;\nC -1 ; WX 600 ; N Edieresis ; B 25 0 670 761 ;\nC -1 ; WX 600 ; N Dcroat ; B 30 0 664 562 ;\nC -1 ; WX 600 ; N commaaccent ; B 151 -250 385 -57 ;\nC -1 ; WX 600 ; N copyright ; B 53 -18 667 580 ;\nC -1 ; WX 600 ; N Emacron ; B 25 0 670 708 ;\nC -1 ; WX 600 ; N ccaron ; B 81 -15 633 667 ;\nC -1 ; WX 600 ; N aring ; B 61 -15 593 678 ;\nC -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 730 562 ;\nC -1 ; WX 600 ; N lacute ; B 77 0 639 801 ;\nC -1 ; WX 600 ; N agrave ; B 61 -15 593 661 ;\nC -1 ; WX 600 ; N Tcommaaccent ; B 86 -250 679 562 ;\nC -1 ; WX 600 ; N Cacute ; B 74 -18 675 784 ;\nC -1 ; WX 600 ; N atilde ; B 61 -15 643 636 ;\nC -1 ; WX 600 ; N Edotaccent ; B 25 0 670 761 ;\nC -1 ; WX 600 ; N scaron ; B 66 -17 633 667 ;\nC -1 ; WX 600 ; N scedilla ; B 66 -206 608 459 ;\nC -1 ; WX 600 ; N iacute ; B 77 0 609 661 ;\nC -1 ; WX 600 ; N lozenge ; B 145 0 614 740 ;\nC -1 ; WX 600 ; N Rcaron ; B 24 0 659 790 ;\nC -1 ; WX 600 ; N Gcommaaccent ; B 74 -250 675 580 ;\nC -1 ; WX 600 ; N ucircumflex ; B 70 -15 597 657 ;\nC -1 ; WX 600 ; N acircumflex ; B 61 -15 607 657 ;\nC -1 ; WX 600 ; N Amacron ; B -9 0 633 708 ;\nC -1 ; WX 600 ; N rcaron ; B 47 0 655 667 ;\nC -1 ; WX 600 ; N ccedilla ; B 81 -206 631 459 ;\nC -1 ; WX 600 ; N Zdotaccent ; B 62 0 637 761 ;\nC -1 ; WX 600 ; N Thorn ; B 48 0 620 562 ;\nC -1 ; WX 600 ; N Omacron ; B 74 -18 663 708 ;\nC -1 ; WX 600 ; N Racute ; B 24 0 665 784 ;\nC -1 ; WX 600 ; N Sacute ; B 54 -22 673 784 ;\nC -1 ; WX 600 ; N dcaron ; B 60 -15 861 626 ;\nC -1 ; WX 600 ; N Umacron ; B 101 -18 716 708 ;\nC -1 ; WX 600 ; N uring ; B 70 -15 592 678 ;\nC -1 ; WX 600 ; N threesuperior ; B 193 222 526 616 ;\nC -1 ; WX 600 ; N Ograve ; B 74 -18 645 784 ;\nC -1 ; WX 600 ; N Agrave ; B -9 0 632 784 ;\nC -1 ; WX 600 ; N Abreve ; B -9 0 684 784 ;\nC -1 ; WX 600 ; N multiply ; B 104 39 606 478 ;\nC -1 ; WX 600 ; N uacute ; B 70 -15 599 661 ;\nC -1 ; WX 600 ; N Tcaron ; B 86 0 679 790 ;\nC -1 ; WX 600 ; N partialdiff ; B 91 -38 627 728 ;\nC -1 ; WX 600 ; N ydieresis ; B -21 -142 695 638 ;\nC -1 ; WX 600 ; N Nacute ; B 8 -12 730 784 ;\nC -1 ; WX 600 ; N icircumflex ; B 77 0 577 657 ;\nC -1 ; WX 600 ; N Ecircumflex ; B 25 0 670 780 ;\nC -1 ; WX 600 ; N adieresis ; B 61 -15 595 638 ;\nC -1 ; WX 600 ; N edieresis ; B 81 -15 605 638 ;\nC -1 ; WX 600 ; N cacute ; B 81 -15 649 661 ;\nC -1 ; WX 600 ; N nacute ; B 18 0 639 661 ;\nC -1 ; WX 600 ; N umacron ; B 70 -15 637 585 ;\nC -1 ; WX 600 ; N Ncaron ; B 8 -12 730 790 ;\nC -1 ; WX 600 ; N Iacute ; B 77 0 643 784 ;\nC -1 ; WX 600 ; N plusminus ; B 76 24 614 515 ;\nC -1 ; WX 600 ; N brokenbar ; B 217 -175 489 675 ;\nC -1 ; WX 600 ; N registered ; B 53 -18 667 580 ;\nC -1 ; WX 600 ; N Gbreve ; B 74 -18 684 784 ;\nC -1 ; WX 600 ; N Idotaccent ; B 77 0 643 761 ;\nC -1 ; WX 600 ; N summation ; B 15 -10 672 706 ;\nC -1 ; WX 600 ; N Egrave ; B 25 0 670 784 ;\nC -1 ; WX 600 ; N racute ; B 47 0 655 661 ;\nC -1 ; WX 600 ; N omacron ; B 71 -15 637 585 ;\nC -1 ; WX 600 ; N Zacute ; B 62 0 665 784 ;\nC -1 ; WX 600 ; N Zcaron ; B 62 0 659 790 ;\nC -1 ; WX 600 ; N greaterequal ; B 26 0 627 696 ;\nC -1 ; WX 600 ; N Eth ; B 30 0 664 562 ;\nC -1 ; WX 600 ; N Ccedilla ; B 74 -206 675 580 ;\nC -1 ; WX 600 ; N lcommaaccent ; B 77 -250 546 626 ;\nC -1 ; WX 600 ; N tcaron ; B 118 -15 627 703 ;\nC -1 ; WX 600 ; N eogonek ; B 81 -199 605 454 ;\nC -1 ; WX 600 ; N Uogonek ; B 101 -199 716 562 ;\nC -1 ; WX 600 ; N Aacute ; B -9 0 655 784 ;\nC -1 ; WX 600 ; N Adieresis ; B -9 0 632 761 ;\nC -1 ; WX 600 ; N egrave ; B 81 -15 605 661 ;\nC -1 ; WX 600 ; N zacute ; B 81 0 614 661 ;\nC -1 ; WX 600 ; N iogonek ; B 77 -199 546 658 ;\nC -1 ; WX 600 ; N Oacute ; B 74 -18 645 784 ;\nC -1 ; WX 600 ; N oacute ; B 71 -15 649 661 ;\nC -1 ; WX 600 ; N amacron ; B 61 -15 637 585 ;\nC -1 ; WX 600 ; N sacute ; B 66 -17 609 661 ;\nC -1 ; WX 600 ; N idieresis ; B 77 0 561 618 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 74 -18 645 780 ;\nC -1 ; WX 600 ; N Ugrave ; B 101 -18 716 784 ;\nC -1 ; WX 600 ; N Delta ; B 6 0 594 688 ;\nC -1 ; WX 600 ; N thorn ; B -32 -142 622 626 ;\nC -1 ; WX 600 ; N twosuperior ; B 191 230 542 616 ;\nC -1 ; WX 600 ; N Odieresis ; B 74 -18 645 761 ;\nC -1 ; WX 600 ; N mu ; B 49 -142 592 439 ;\nC -1 ; WX 600 ; N igrave ; B 77 0 546 661 ;\nC -1 ; WX 600 ; N ohungarumlaut ; B 71 -15 809 661 ;\nC -1 ; WX 600 ; N Eogonek ; B 25 -199 670 562 ;\nC -1 ; WX 600 ; N dcroat ; B 60 -15 712 626 ;\nC -1 ; WX 600 ; N threequarters ; B 8 -60 699 661 ;\nC -1 ; WX 600 ; N Scedilla ; B 54 -206 673 582 ;\nC -1 ; WX 600 ; N lcaron ; B 77 0 731 626 ;\nC -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 692 562 ;\nC -1 ; WX 600 ; N Lacute ; B 39 0 636 784 ;\nC -1 ; WX 600 ; N trademark ; B 86 230 869 562 ;\nC -1 ; WX 600 ; N edotaccent ; B 81 -15 605 638 ;\nC -1 ; WX 600 ; N Igrave ; B 77 0 643 784 ;\nC -1 ; WX 600 ; N Imacron ; B 77 0 663 708 ;\nC -1 ; WX 600 ; N Lcaron ; B 39 0 757 562 ;\nC -1 ; WX 600 ; N onehalf ; B 22 -60 716 661 ;\nC -1 ; WX 600 ; N lessequal ; B 26 0 671 696 ;\nC -1 ; WX 600 ; N ocircumflex ; B 71 -15 622 657 ;\nC -1 ; WX 600 ; N ntilde ; B 18 0 643 636 ;\nC -1 ; WX 600 ; N Uhungarumlaut ; B 101 -18 805 784 ;\nC -1 ; WX 600 ; N Eacute ; B 25 0 670 784 ;\nC -1 ; WX 600 ; N emacron ; B 81 -15 637 585 ;\nC -1 ; WX 600 ; N gbreve ; B 40 -146 674 661 ;\nC -1 ; WX 600 ; N onequarter ; B 13 -60 707 661 ;\nC -1 ; WX 600 ; N Scaron ; B 54 -22 689 790 ;\nC -1 ; WX 600 ; N Scommaaccent ; B 54 -250 673 582 ;\nC -1 ; WX 600 ; N Ohungarumlaut ; B 74 -18 795 784 ;\nC -1 ; WX 600 ; N degree ; B 173 243 570 616 ;\nC -1 ; WX 600 ; N ograve ; B 71 -15 622 661 ;\nC -1 ; WX 600 ; N Ccaron ; B 74 -18 689 790 ;\nC -1 ; WX 600 ; N ugrave ; B 70 -15 592 661 ;\nC -1 ; WX 600 ; N radical ; B 67 -104 635 778 ;\nC -1 ; WX 600 ; N Dcaron ; B 30 0 664 790 ;\nC -1 ; WX 600 ; N rcommaaccent ; B 47 -250 655 454 ;\nC -1 ; WX 600 ; N Ntilde ; B 8 -12 730 759 ;\nC -1 ; WX 600 ; N otilde ; B 71 -15 643 636 ;\nC -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 617 562 ;\nC -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 636 562 ;\nC -1 ; WX 600 ; N Atilde ; B -9 0 669 759 ;\nC -1 ; WX 600 ; N Aogonek ; B -9 -199 632 562 ;\nC -1 ; WX 600 ; N Aring ; B -9 0 632 801 ;\nC -1 ; WX 600 ; N Otilde ; B 74 -18 669 759 ;\nC -1 ; WX 600 ; N zdotaccent ; B 81 0 614 638 ;\nC -1 ; WX 600 ; N Ecaron ; B 25 0 670 790 ;\nC -1 ; WX 600 ; N Iogonek ; B 77 -199 643 562 ;\nC -1 ; WX 600 ; N kcommaaccent ; B 33 -250 643 626 ;\nC -1 ; WX 600 ; N minus ; B 114 203 596 313 ;\nC -1 ; WX 600 ; N Icircumflex ; B 77 0 643 780 ;\nC -1 ; WX 600 ; N ncaron ; B 18 0 633 667 ;\nC -1 ; WX 600 ; N tcommaaccent ; B 118 -250 567 562 ;\nC -1 ; WX 600 ; N logicalnot ; B 135 103 617 413 ;\nC -1 ; WX 600 ; N odieresis ; B 71 -15 622 638 ;\nC -1 ; WX 600 ; N udieresis ; B 70 -15 595 638 ;\nC -1 ; WX 600 ; N notequal ; B 30 -47 626 563 ;\nC -1 ; WX 600 ; N gcommaaccent ; B 40 -146 674 714 ;\nC -1 ; WX 600 ; N eth ; B 93 -27 661 626 ;\nC -1 ; WX 600 ; N zcaron ; B 81 0 643 667 ;\nC -1 ; WX 600 ; N ncommaaccent ; B 18 -250 615 454 ;\nC -1 ; WX 600 ; N onesuperior ; B 212 230 514 616 ;\nC -1 ; WX 600 ; N imacron ; B 77 0 575 585 ;\nC -1 ; WX 600 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/pdfcorefonts/Courier-Oblique.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 17:37:52 1997\nComment UniqueID 43051\nComment VMusage 16248 75829\nFontName Courier-Oblique\nFullName Courier Oblique\nFamilyName Courier\nWeight Medium\nItalicAngle -12\nIsFixedPitch true\nCharacterSet ExtendedRoman\nFontBBox -27 -250 849 805 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 003.000\nNotice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nEncodingScheme AdobeStandardEncoding\nCapHeight 562\nXHeight 426\nAscender 629\nDescender -157\nStdHW 51\nStdVW 51\nStartCharMetrics 315\nC 32 ; WX 600 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 600 ; N exclam ; B 243 -15 464 572 ;\nC 34 ; WX 600 ; N quotedbl ; B 273 328 532 562 ;\nC 35 ; WX 600 ; N numbersign ; B 133 -32 596 639 ;\nC 36 ; WX 600 ; N dollar ; B 108 -126 596 662 ;\nC 37 ; WX 600 ; N percent ; B 134 -15 599 622 ;\nC 38 ; WX 600 ; N ampersand ; B 87 -15 580 543 ;\nC 39 ; WX 600 ; N quoteright ; B 283 328 495 562 ;\nC 40 ; WX 600 ; N parenleft ; B 313 -108 572 622 ;\nC 41 ; WX 600 ; N parenright ; B 137 -108 396 622 ;\nC 42 ; WX 600 ; N asterisk ; B 212 257 580 607 ;\nC 43 ; WX 600 ; N plus ; B 129 44 580 470 ;\nC 44 ; WX 600 ; N comma ; B 157 -112 370 122 ;\nC 45 ; WX 600 ; N hyphen ; B 152 231 558 285 ;\nC 46 ; WX 600 ; N period ; B 238 -15 382 109 ;\nC 47 ; WX 600 ; N slash ; B 112 -80 604 629 ;\nC 48 ; WX 600 ; N zero ; B 154 -15 575 622 ;\nC 49 ; WX 600 ; N one ; B 98 0 515 622 ;\nC 50 ; WX 600 ; N two ; B 70 0 568 622 ;\nC 51 ; WX 600 ; N three ; B 82 -15 538 622 ;\nC 52 ; WX 600 ; N four ; B 108 0 541 622 ;\nC 53 ; WX 600 ; N five ; B 99 -15 589 607 ;\nC 54 ; WX 600 ; N six ; B 155 -15 629 622 ;\nC 55 ; WX 600 ; N seven ; B 182 0 612 607 ;\nC 56 ; WX 600 ; N eight ; B 132 -15 588 622 ;\nC 57 ; WX 600 ; N nine ; B 93 -15 574 622 ;\nC 58 ; WX 600 ; N colon ; B 238 -15 441 385 ;\nC 59 ; WX 600 ; N semicolon ; B 157 -112 441 385 ;\nC 60 ; WX 600 ; N less ; B 96 42 610 472 ;\nC 61 ; WX 600 ; N equal ; B 109 138 600 376 ;\nC 62 ; WX 600 ; N greater ; B 85 42 599 472 ;\nC 63 ; WX 600 ; N question ; B 222 -15 583 572 ;\nC 64 ; WX 600 ; N at ; B 127 -15 582 622 ;\nC 65 ; WX 600 ; N A ; B 3 0 607 562 ;\nC 66 ; WX 600 ; N B ; B 43 0 616 562 ;\nC 67 ; WX 600 ; N C ; B 93 -18 655 580 ;\nC 68 ; WX 600 ; N D ; B 43 0 645 562 ;\nC 69 ; WX 600 ; N E ; B 53 0 660 562 ;\nC 70 ; WX 600 ; N F ; B 53 0 660 562 ;\nC 71 ; WX 600 ; N G ; B 83 -18 645 580 ;\nC 72 ; WX 600 ; N H ; B 32 0 687 562 ;\nC 73 ; WX 600 ; N I ; B 96 0 623 562 ;\nC 74 ; WX 600 ; N J ; B 52 -18 685 562 ;\nC 75 ; WX 600 ; N K ; B 38 0 671 562 ;\nC 76 ; WX 600 ; N L ; B 47 0 607 562 ;\nC 77 ; WX 600 ; N M ; B 4 0 715 562 ;\nC 78 ; WX 600 ; N N ; B 7 -13 712 562 ;\nC 79 ; WX 600 ; N O ; B 94 -18 625 580 ;\nC 80 ; WX 600 ; N P ; B 79 0 644 562 ;\nC 81 ; WX 600 ; N Q ; B 95 -138 625 580 ;\nC 82 ; WX 600 ; N R ; B 38 0 598 562 ;\nC 83 ; WX 600 ; N S ; B 76 -20 650 580 ;\nC 84 ; WX 600 ; N T ; B 108 0 665 562 ;\nC 85 ; WX 600 ; N U ; B 125 -18 702 562 ;\nC 86 ; WX 600 ; N V ; B 105 -13 723 562 ;\nC 87 ; WX 600 ; N W ; B 106 -13 722 562 ;\nC 88 ; WX 600 ; N X ; B 23 0 675 562 ;\nC 89 ; WX 600 ; N Y ; B 133 0 695 562 ;\nC 90 ; WX 600 ; N Z ; B 86 0 610 562 ;\nC 91 ; WX 600 ; N bracketleft ; B 246 -108 574 622 ;\nC 92 ; WX 600 ; N backslash ; B 249 -80 468 629 ;\nC 93 ; WX 600 ; N bracketright ; B 135 -108 463 622 ;\nC 94 ; WX 600 ; N asciicircum ; B 175 354 587 622 ;\nC 95 ; WX 600 ; N underscore ; B -27 -125 584 -75 ;\nC 96 ; WX 600 ; N quoteleft ; B 343 328 457 562 ;\nC 97 ; WX 600 ; N a ; B 76 -15 569 441 ;\nC 98 ; WX 600 ; N b ; B 29 -15 625 629 ;\nC 99 ; WX 600 ; N c ; B 106 -15 608 441 ;\nC 100 ; WX 600 ; N d ; B 85 -15 640 629 ;\nC 101 ; WX 600 ; N e ; B 106 -15 598 441 ;\nC 102 ; WX 600 ; N f ; B 114 0 662 629 ; L i fi ; L l fl ;\nC 103 ; WX 600 ; N g ; B 61 -157 657 441 ;\nC 104 ; WX 600 ; N h ; B 33 0 592 629 ;\nC 105 ; WX 600 ; N i ; B 95 0 515 657 ;\nC 106 ; WX 600 ; N j ; B 52 -157 550 657 ;\nC 107 ; WX 600 ; N k ; B 58 0 633 629 ;\nC 108 ; WX 600 ; N l ; B 95 0 515 629 ;\nC 109 ; WX 600 ; N m ; B -5 0 615 441 ;\nC 110 ; WX 600 ; N n ; B 26 0 585 441 ;\nC 111 ; WX 600 ; N o ; B 102 -15 588 441 ;\nC 112 ; WX 600 ; N p ; B -24 -157 605 441 ;\nC 113 ; WX 600 ; N q ; B 85 -157 682 441 ;\nC 114 ; WX 600 ; N r ; B 60 0 636 441 ;\nC 115 ; WX 600 ; N s ; B 78 -15 584 441 ;\nC 116 ; WX 600 ; N t ; B 167 -15 561 561 ;\nC 117 ; WX 600 ; N u ; B 101 -15 572 426 ;\nC 118 ; WX 600 ; N v ; B 90 -10 681 426 ;\nC 119 ; WX 600 ; N w ; B 76 -10 695 426 ;\nC 120 ; WX 600 ; N x ; B 20 0 655 426 ;\nC 121 ; WX 600 ; N y ; B -4 -157 683 426 ;\nC 122 ; WX 600 ; N z ; B 99 0 593 426 ;\nC 123 ; WX 600 ; N braceleft ; B 233 -108 569 622 ;\nC 124 ; WX 600 ; N bar ; B 222 -250 485 750 ;\nC 125 ; WX 600 ; N braceright ; B 140 -108 477 622 ;\nC 126 ; WX 600 ; N asciitilde ; B 116 197 600 320 ;\nC 161 ; WX 600 ; N exclamdown ; B 225 -157 445 430 ;\nC 162 ; WX 600 ; N cent ; B 151 -49 588 614 ;\nC 163 ; WX 600 ; N sterling ; B 124 -21 621 611 ;\nC 164 ; WX 600 ; N fraction ; B 84 -57 646 665 ;\nC 165 ; WX 600 ; N yen ; B 120 0 693 562 ;\nC 166 ; WX 600 ; N florin ; B -26 -143 671 622 ;\nC 167 ; WX 600 ; N section ; B 104 -78 590 580 ;\nC 168 ; WX 600 ; N currency ; B 94 58 628 506 ;\nC 169 ; WX 600 ; N quotesingle ; B 345 328 460 562 ;\nC 170 ; WX 600 ; N quotedblleft ; B 262 328 541 562 ;\nC 171 ; WX 600 ; N guillemotleft ; B 92 70 652 446 ;\nC 172 ; WX 600 ; N guilsinglleft ; B 204 70 540 446 ;\nC 173 ; WX 600 ; N guilsinglright ; B 170 70 506 446 ;\nC 174 ; WX 600 ; N fi ; B 3 0 619 629 ;\nC 175 ; WX 600 ; N fl ; B 3 0 619 629 ;\nC 177 ; WX 600 ; N endash ; B 124 231 586 285 ;\nC 178 ; WX 600 ; N dagger ; B 217 -78 546 580 ;\nC 179 ; WX 600 ; N daggerdbl ; B 163 -78 546 580 ;\nC 180 ; WX 600 ; N periodcentered ; B 275 189 434 327 ;\nC 182 ; WX 600 ; N paragraph ; B 100 -78 630 562 ;\nC 183 ; WX 600 ; N bullet ; B 224 130 485 383 ;\nC 184 ; WX 600 ; N quotesinglbase ; B 185 -134 397 100 ;\nC 185 ; WX 600 ; N quotedblbase ; B 115 -134 478 100 ;\nC 186 ; WX 600 ; N quotedblright ; B 213 328 576 562 ;\nC 187 ; WX 600 ; N guillemotright ; B 58 70 618 446 ;\nC 188 ; WX 600 ; N ellipsis ; B 46 -15 575 111 ;\nC 189 ; WX 600 ; N perthousand ; B 59 -15 627 622 ;\nC 191 ; WX 600 ; N questiondown ; B 105 -157 466 430 ;\nC 193 ; WX 600 ; N grave ; B 294 497 484 672 ;\nC 194 ; WX 600 ; N acute ; B 348 497 612 672 ;\nC 195 ; WX 600 ; N circumflex ; B 229 477 581 654 ;\nC 196 ; WX 600 ; N tilde ; B 212 489 629 606 ;\nC 197 ; WX 600 ; N macron ; B 232 525 600 565 ;\nC 198 ; WX 600 ; N breve ; B 279 501 576 609 ;\nC 199 ; WX 600 ; N dotaccent ; B 373 537 478 640 ;\nC 200 ; WX 600 ; N dieresis ; B 272 537 579 640 ;\nC 202 ; WX 600 ; N ring ; B 332 463 500 627 ;\nC 203 ; WX 600 ; N cedilla ; B 197 -151 344 10 ;\nC 205 ; WX 600 ; N hungarumlaut ; B 239 497 683 672 ;\nC 206 ; WX 600 ; N ogonek ; B 189 -172 377 4 ;\nC 207 ; WX 600 ; N caron ; B 262 492 614 669 ;\nC 208 ; WX 600 ; N emdash ; B 49 231 661 285 ;\nC 225 ; WX 600 ; N AE ; B 3 0 655 562 ;\nC 227 ; WX 600 ; N ordfeminine ; B 209 249 512 580 ;\nC 232 ; WX 600 ; N Lslash ; B 47 0 607 562 ;\nC 233 ; WX 600 ; N Oslash ; B 94 -80 625 629 ;\nC 234 ; WX 600 ; N OE ; B 59 0 672 562 ;\nC 235 ; WX 600 ; N ordmasculine ; B 210 249 535 580 ;\nC 241 ; WX 600 ; N ae ; B 41 -15 626 441 ;\nC 245 ; WX 600 ; N dotlessi ; B 95 0 515 426 ;\nC 248 ; WX 600 ; N lslash ; B 95 0 587 629 ;\nC 249 ; WX 600 ; N oslash ; B 102 -80 588 506 ;\nC 250 ; WX 600 ; N oe ; B 54 -15 615 441 ;\nC 251 ; WX 600 ; N germandbls ; B 48 -15 617 629 ;\nC -1 ; WX 600 ; N Idieresis ; B 96 0 623 753 ;\nC -1 ; WX 600 ; N eacute ; B 106 -15 612 672 ;\nC -1 ; WX 600 ; N abreve ; B 76 -15 576 609 ;\nC -1 ; WX 600 ; N uhungarumlaut ; B 101 -15 723 672 ;\nC -1 ; WX 600 ; N ecaron ; B 106 -15 614 669 ;\nC -1 ; WX 600 ; N Ydieresis ; B 133 0 695 753 ;\nC -1 ; WX 600 ; N divide ; B 136 48 573 467 ;\nC -1 ; WX 600 ; N Yacute ; B 133 0 695 805 ;\nC -1 ; WX 600 ; N Acircumflex ; B 3 0 607 787 ;\nC -1 ; WX 600 ; N aacute ; B 76 -15 612 672 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 125 -18 702 787 ;\nC -1 ; WX 600 ; N yacute ; B -4 -157 683 672 ;\nC -1 ; WX 600 ; N scommaaccent ; B 78 -250 584 441 ;\nC -1 ; WX 600 ; N ecircumflex ; B 106 -15 598 654 ;\nC -1 ; WX 600 ; N Uring ; B 125 -18 702 760 ;\nC -1 ; WX 600 ; N Udieresis ; B 125 -18 702 753 ;\nC -1 ; WX 600 ; N aogonek ; B 76 -172 569 441 ;\nC -1 ; WX 600 ; N Uacute ; B 125 -18 702 805 ;\nC -1 ; WX 600 ; N uogonek ; B 101 -172 572 426 ;\nC -1 ; WX 600 ; N Edieresis ; B 53 0 660 753 ;\nC -1 ; WX 600 ; N Dcroat ; B 43 0 645 562 ;\nC -1 ; WX 600 ; N commaaccent ; B 145 -250 323 -58 ;\nC -1 ; WX 600 ; N copyright ; B 53 -18 667 580 ;\nC -1 ; WX 600 ; N Emacron ; B 53 0 660 698 ;\nC -1 ; WX 600 ; N ccaron ; B 106 -15 614 669 ;\nC -1 ; WX 600 ; N aring ; B 76 -15 569 627 ;\nC -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 712 562 ;\nC -1 ; WX 600 ; N lacute ; B 95 0 640 805 ;\nC -1 ; WX 600 ; N agrave ; B 76 -15 569 672 ;\nC -1 ; WX 600 ; N Tcommaaccent ; B 108 -250 665 562 ;\nC -1 ; WX 600 ; N Cacute ; B 93 -18 655 805 ;\nC -1 ; WX 600 ; N atilde ; B 76 -15 629 606 ;\nC -1 ; WX 600 ; N Edotaccent ; B 53 0 660 753 ;\nC -1 ; WX 600 ; N scaron ; B 78 -15 614 669 ;\nC -1 ; WX 600 ; N scedilla ; B 78 -151 584 441 ;\nC -1 ; WX 600 ; N iacute ; B 95 0 612 672 ;\nC -1 ; WX 600 ; N lozenge ; B 94 0 519 706 ;\nC -1 ; WX 600 ; N Rcaron ; B 38 0 642 802 ;\nC -1 ; WX 600 ; N Gcommaaccent ; B 83 -250 645 580 ;\nC -1 ; WX 600 ; N ucircumflex ; B 101 -15 572 654 ;\nC -1 ; WX 600 ; N acircumflex ; B 76 -15 581 654 ;\nC -1 ; WX 600 ; N Amacron ; B 3 0 607 698 ;\nC -1 ; WX 600 ; N rcaron ; B 60 0 636 669 ;\nC -1 ; WX 600 ; N ccedilla ; B 106 -151 614 441 ;\nC -1 ; WX 600 ; N Zdotaccent ; B 86 0 610 753 ;\nC -1 ; WX 600 ; N Thorn ; B 79 0 606 562 ;\nC -1 ; WX 600 ; N Omacron ; B 94 -18 628 698 ;\nC -1 ; WX 600 ; N Racute ; B 38 0 670 805 ;\nC -1 ; WX 600 ; N Sacute ; B 76 -20 650 805 ;\nC -1 ; WX 600 ; N dcaron ; B 85 -15 849 629 ;\nC -1 ; WX 600 ; N Umacron ; B 125 -18 702 698 ;\nC -1 ; WX 600 ; N uring ; B 101 -15 572 627 ;\nC -1 ; WX 600 ; N threesuperior ; B 213 240 501 622 ;\nC -1 ; WX 600 ; N Ograve ; B 94 -18 625 805 ;\nC -1 ; WX 600 ; N Agrave ; B 3 0 607 805 ;\nC -1 ; WX 600 ; N Abreve ; B 3 0 607 732 ;\nC -1 ; WX 600 ; N multiply ; B 103 43 607 470 ;\nC -1 ; WX 600 ; N uacute ; B 101 -15 602 672 ;\nC -1 ; WX 600 ; N Tcaron ; B 108 0 665 802 ;\nC -1 ; WX 600 ; N partialdiff ; B 45 -38 546 710 ;\nC -1 ; WX 600 ; N ydieresis ; B -4 -157 683 620 ;\nC -1 ; WX 600 ; N Nacute ; B 7 -13 712 805 ;\nC -1 ; WX 600 ; N icircumflex ; B 95 0 551 654 ;\nC -1 ; WX 600 ; N Ecircumflex ; B 53 0 660 787 ;\nC -1 ; WX 600 ; N adieresis ; B 76 -15 575 620 ;\nC -1 ; WX 600 ; N edieresis ; B 106 -15 598 620 ;\nC -1 ; WX 600 ; N cacute ; B 106 -15 612 672 ;\nC -1 ; WX 600 ; N nacute ; B 26 0 602 672 ;\nC -1 ; WX 600 ; N umacron ; B 101 -15 600 565 ;\nC -1 ; WX 600 ; N Ncaron ; B 7 -13 712 802 ;\nC -1 ; WX 600 ; N Iacute ; B 96 0 640 805 ;\nC -1 ; WX 600 ; N plusminus ; B 96 44 594 558 ;\nC -1 ; WX 600 ; N brokenbar ; B 238 -175 469 675 ;\nC -1 ; WX 600 ; N registered ; B 53 -18 667 580 ;\nC -1 ; WX 600 ; N Gbreve ; B 83 -18 645 732 ;\nC -1 ; WX 600 ; N Idotaccent ; B 96 0 623 753 ;\nC -1 ; WX 600 ; N summation ; B 15 -10 670 706 ;\nC -1 ; WX 600 ; N Egrave ; B 53 0 660 805 ;\nC -1 ; WX 600 ; N racute ; B 60 0 636 672 ;\nC -1 ; WX 600 ; N omacron ; B 102 -15 600 565 ;\nC -1 ; WX 600 ; N Zacute ; B 86 0 670 805 ;\nC -1 ; WX 600 ; N Zcaron ; B 86 0 642 802 ;\nC -1 ; WX 600 ; N greaterequal ; B 98 0 594 710 ;\nC -1 ; WX 600 ; N Eth ; B 43 0 645 562 ;\nC -1 ; WX 600 ; N Ccedilla ; B 93 -151 658 580 ;\nC -1 ; WX 600 ; N lcommaaccent ; B 95 -250 515 629 ;\nC -1 ; WX 600 ; N tcaron ; B 167 -15 587 717 ;\nC -1 ; WX 600 ; N eogonek ; B 106 -172 598 441 ;\nC -1 ; WX 600 ; N Uogonek ; B 124 -172 702 562 ;\nC -1 ; WX 600 ; N Aacute ; B 3 0 660 805 ;\nC -1 ; WX 600 ; N Adieresis ; B 3 0 607 753 ;\nC -1 ; WX 600 ; N egrave ; B 106 -15 598 672 ;\nC -1 ; WX 600 ; N zacute ; B 99 0 612 672 ;\nC -1 ; WX 600 ; N iogonek ; B 95 -172 515 657 ;\nC -1 ; WX 600 ; N Oacute ; B 94 -18 640 805 ;\nC -1 ; WX 600 ; N oacute ; B 102 -15 612 672 ;\nC -1 ; WX 600 ; N amacron ; B 76 -15 600 565 ;\nC -1 ; WX 600 ; N sacute ; B 78 -15 612 672 ;\nC -1 ; WX 600 ; N idieresis ; B 95 0 545 620 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 94 -18 625 787 ;\nC -1 ; WX 600 ; N Ugrave ; B 125 -18 702 805 ;\nC -1 ; WX 600 ; N Delta ; B 6 0 598 688 ;\nC -1 ; WX 600 ; N thorn ; B -24 -157 605 629 ;\nC -1 ; WX 600 ; N twosuperior ; B 230 249 535 622 ;\nC -1 ; WX 600 ; N Odieresis ; B 94 -18 625 753 ;\nC -1 ; WX 600 ; N mu ; B 72 -157 572 426 ;\nC -1 ; WX 600 ; N igrave ; B 95 0 515 672 ;\nC -1 ; WX 600 ; N ohungarumlaut ; B 102 -15 723 672 ;\nC -1 ; WX 600 ; N Eogonek ; B 53 -172 660 562 ;\nC -1 ; WX 600 ; N dcroat ; B 85 -15 704 629 ;\nC -1 ; WX 600 ; N threequarters ; B 73 -56 659 666 ;\nC -1 ; WX 600 ; N Scedilla ; B 76 -151 650 580 ;\nC -1 ; WX 600 ; N lcaron ; B 95 0 667 629 ;\nC -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 671 562 ;\nC -1 ; WX 600 ; N Lacute ; B 47 0 607 805 ;\nC -1 ; WX 600 ; N trademark ; B 75 263 742 562 ;\nC -1 ; WX 600 ; N edotaccent ; B 106 -15 598 620 ;\nC -1 ; WX 600 ; N Igrave ; B 96 0 623 805 ;\nC -1 ; WX 600 ; N Imacron ; B 96 0 628 698 ;\nC -1 ; WX 600 ; N Lcaron ; B 47 0 632 562 ;\nC -1 ; WX 600 ; N onehalf ; B 65 -57 669 665 ;\nC -1 ; WX 600 ; N lessequal ; B 98 0 645 710 ;\nC -1 ; WX 600 ; N ocircumflex ; B 102 -15 588 654 ;\nC -1 ; WX 600 ; N ntilde ; B 26 0 629 606 ;\nC -1 ; WX 600 ; N Uhungarumlaut ; B 125 -18 761 805 ;\nC -1 ; WX 600 ; N Eacute ; B 53 0 670 805 ;\nC -1 ; WX 600 ; N emacron ; B 106 -15 600 565 ;\nC -1 ; WX 600 ; N gbreve ; B 61 -157 657 609 ;\nC -1 ; WX 600 ; N onequarter ; B 65 -57 674 665 ;\nC -1 ; WX 600 ; N Scaron ; B 76 -20 672 802 ;\nC -1 ; WX 600 ; N Scommaaccent ; B 76 -250 650 580 ;\nC -1 ; WX 600 ; N Ohungarumlaut ; B 94 -18 751 805 ;\nC -1 ; WX 600 ; N degree ; B 214 269 576 622 ;\nC -1 ; WX 600 ; N ograve ; B 102 -15 588 672 ;\nC -1 ; WX 600 ; N Ccaron ; B 93 -18 672 802 ;\nC -1 ; WX 600 ; N ugrave ; B 101 -15 572 672 ;\nC -1 ; WX 600 ; N radical ; B 85 -15 765 792 ;\nC -1 ; WX 600 ; N Dcaron ; B 43 0 645 802 ;\nC -1 ; WX 600 ; N rcommaaccent ; B 60 -250 636 441 ;\nC -1 ; WX 600 ; N Ntilde ; B 7 -13 712 729 ;\nC -1 ; WX 600 ; N otilde ; B 102 -15 629 606 ;\nC -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 598 562 ;\nC -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 607 562 ;\nC -1 ; WX 600 ; N Atilde ; B 3 0 655 729 ;\nC -1 ; WX 600 ; N Aogonek ; B 3 -172 607 562 ;\nC -1 ; WX 600 ; N Aring ; B 3 0 607 750 ;\nC -1 ; WX 600 ; N Otilde ; B 94 -18 655 729 ;\nC -1 ; WX 600 ; N zdotaccent ; B 99 0 593 620 ;\nC -1 ; WX 600 ; N Ecaron ; B 53 0 660 802 ;\nC -1 ; WX 600 ; N Iogonek ; B 96 -172 623 562 ;\nC -1 ; WX 600 ; N kcommaaccent ; B 58 -250 633 629 ;\nC -1 ; WX 600 ; N minus ; B 129 232 580 283 ;\nC -1 ; WX 600 ; N Icircumflex ; B 96 0 623 787 ;\nC -1 ; WX 600 ; N ncaron ; B 26 0 614 669 ;\nC -1 ; WX 600 ; N tcommaaccent ; B 165 -250 561 561 ;\nC -1 ; WX 600 ; N logicalnot ; B 155 108 591 369 ;\nC -1 ; WX 600 ; N odieresis ; B 102 -15 588 620 ;\nC -1 ; WX 600 ; N udieresis ; B 101 -15 575 620 ;\nC -1 ; WX 600 ; N notequal ; B 43 -16 621 529 ;\nC -1 ; WX 600 ; N gcommaaccent ; B 61 -157 657 708 ;\nC -1 ; WX 600 ; N eth ; B 102 -15 639 629 ;\nC -1 ; WX 600 ; N zcaron ; B 99 0 624 669 ;\nC -1 ; WX 600 ; N ncommaaccent ; B 26 -250 585 441 ;\nC -1 ; WX 600 ; N onesuperior ; B 231 249 491 622 ;\nC -1 ; WX 600 ; N imacron ; B 95 0 543 565 ;\nC -1 ; WX 600 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/pdfcorefonts/Courier.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 17:27:09 1997\nComment UniqueID 43050\nComment VMusage 39754 50779\nFontName Courier\nFullName Courier\nFamilyName Courier\nWeight Medium\nItalicAngle 0\nIsFixedPitch true\nCharacterSet ExtendedRoman\nFontBBox -23 -250 715 805 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 003.000\nNotice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nEncodingScheme AdobeStandardEncoding\nCapHeight 562\nXHeight 426\nAscender 629\nDescender -157\nStdHW 51\nStdVW 51\nStartCharMetrics 315\nC 32 ; WX 600 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 600 ; N exclam ; B 236 -15 364 572 ;\nC 34 ; WX 600 ; N quotedbl ; B 187 328 413 562 ;\nC 35 ; WX 600 ; N numbersign ; B 93 -32 507 639 ;\nC 36 ; WX 600 ; N dollar ; B 105 -126 496 662 ;\nC 37 ; WX 600 ; N percent ; B 81 -15 518 622 ;\nC 38 ; WX 600 ; N ampersand ; B 63 -15 538 543 ;\nC 39 ; WX 600 ; N quoteright ; B 213 328 376 562 ;\nC 40 ; WX 600 ; N parenleft ; B 269 -108 440 622 ;\nC 41 ; WX 600 ; N parenright ; B 160 -108 331 622 ;\nC 42 ; WX 600 ; N asterisk ; B 116 257 484 607 ;\nC 43 ; WX 600 ; N plus ; B 80 44 520 470 ;\nC 44 ; WX 600 ; N comma ; B 181 -112 344 122 ;\nC 45 ; WX 600 ; N hyphen ; B 103 231 497 285 ;\nC 46 ; WX 600 ; N period ; B 229 -15 371 109 ;\nC 47 ; WX 600 ; N slash ; B 125 -80 475 629 ;\nC 48 ; WX 600 ; N zero ; B 106 -15 494 622 ;\nC 49 ; WX 600 ; N one ; B 96 0 505 622 ;\nC 50 ; WX 600 ; N two ; B 70 0 471 622 ;\nC 51 ; WX 600 ; N three ; B 75 -15 466 622 ;\nC 52 ; WX 600 ; N four ; B 78 0 500 622 ;\nC 53 ; WX 600 ; N five ; B 92 -15 497 607 ;\nC 54 ; WX 600 ; N six ; B 111 -15 497 622 ;\nC 55 ; WX 600 ; N seven ; B 82 0 483 607 ;\nC 56 ; WX 600 ; N eight ; B 102 -15 498 622 ;\nC 57 ; WX 600 ; N nine ; B 96 -15 489 622 ;\nC 58 ; WX 600 ; N colon ; B 229 -15 371 385 ;\nC 59 ; WX 600 ; N semicolon ; B 181 -112 371 385 ;\nC 60 ; WX 600 ; N less ; B 41 42 519 472 ;\nC 61 ; WX 600 ; N equal ; B 80 138 520 376 ;\nC 62 ; WX 600 ; N greater ; B 66 42 544 472 ;\nC 63 ; WX 600 ; N question ; B 129 -15 492 572 ;\nC 64 ; WX 600 ; N at ; B 77 -15 533 622 ;\nC 65 ; WX 600 ; N A ; B 3 0 597 562 ;\nC 66 ; WX 600 ; N B ; B 43 0 559 562 ;\nC 67 ; WX 600 ; N C ; B 41 -18 540 580 ;\nC 68 ; WX 600 ; N D ; B 43 0 574 562 ;\nC 69 ; WX 600 ; N E ; B 53 0 550 562 ;\nC 70 ; WX 600 ; N F ; B 53 0 545 562 ;\nC 71 ; WX 600 ; N G ; B 31 -18 575 580 ;\nC 72 ; WX 600 ; N H ; B 32 0 568 562 ;\nC 73 ; WX 600 ; N I ; B 96 0 504 562 ;\nC 74 ; WX 600 ; N J ; B 34 -18 566 562 ;\nC 75 ; WX 600 ; N K ; B 38 0 582 562 ;\nC 76 ; WX 600 ; N L ; B 47 0 554 562 ;\nC 77 ; WX 600 ; N M ; B 4 0 596 562 ;\nC 78 ; WX 600 ; N N ; B 7 -13 593 562 ;\nC 79 ; WX 600 ; N O ; B 43 -18 557 580 ;\nC 80 ; WX 600 ; N P ; B 79 0 558 562 ;\nC 81 ; WX 600 ; N Q ; B 43 -138 557 580 ;\nC 82 ; WX 600 ; N R ; B 38 0 588 562 ;\nC 83 ; WX 600 ; N S ; B 72 -20 529 580 ;\nC 84 ; WX 600 ; N T ; B 38 0 563 562 ;\nC 85 ; WX 600 ; N U ; B 17 -18 583 562 ;\nC 86 ; WX 600 ; N V ; B -4 -13 604 562 ;\nC 87 ; WX 600 ; N W ; B -3 -13 603 562 ;\nC 88 ; WX 600 ; N X ; B 23 0 577 562 ;\nC 89 ; WX 600 ; N Y ; B 24 0 576 562 ;\nC 90 ; WX 600 ; N Z ; B 86 0 514 562 ;\nC 91 ; WX 600 ; N bracketleft ; B 269 -108 442 622 ;\nC 92 ; WX 600 ; N backslash ; B 118 -80 482 629 ;\nC 93 ; WX 600 ; N bracketright ; B 158 -108 331 622 ;\nC 94 ; WX 600 ; N asciicircum ; B 94 354 506 622 ;\nC 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ;\nC 96 ; WX 600 ; N quoteleft ; B 224 328 387 562 ;\nC 97 ; WX 600 ; N a ; B 53 -15 559 441 ;\nC 98 ; WX 600 ; N b ; B 14 -15 575 629 ;\nC 99 ; WX 600 ; N c ; B 66 -15 529 441 ;\nC 100 ; WX 600 ; N d ; B 45 -15 591 629 ;\nC 101 ; WX 600 ; N e ; B 66 -15 548 441 ;\nC 102 ; WX 600 ; N f ; B 114 0 531 629 ; L i fi ; L l fl ;\nC 103 ; WX 600 ; N g ; B 45 -157 566 441 ;\nC 104 ; WX 600 ; N h ; B 18 0 582 629 ;\nC 105 ; WX 600 ; N i ; B 95 0 505 657 ;\nC 106 ; WX 600 ; N j ; B 82 -157 410 657 ;\nC 107 ; WX 600 ; N k ; B 43 0 580 629 ;\nC 108 ; WX 600 ; N l ; B 95 0 505 629 ;\nC 109 ; WX 600 ; N m ; B -5 0 605 441 ;\nC 110 ; WX 600 ; N n ; B 26 0 575 441 ;\nC 111 ; WX 600 ; N o ; B 62 -15 538 441 ;\nC 112 ; WX 600 ; N p ; B 9 -157 555 441 ;\nC 113 ; WX 600 ; N q ; B 45 -157 591 441 ;\nC 114 ; WX 600 ; N r ; B 60 0 559 441 ;\nC 115 ; WX 600 ; N s ; B 80 -15 513 441 ;\nC 116 ; WX 600 ; N t ; B 87 -15 530 561 ;\nC 117 ; WX 600 ; N u ; B 21 -15 562 426 ;\nC 118 ; WX 600 ; N v ; B 10 -10 590 426 ;\nC 119 ; WX 600 ; N w ; B -4 -10 604 426 ;\nC 120 ; WX 600 ; N x ; B 20 0 580 426 ;\nC 121 ; WX 600 ; N y ; B 7 -157 592 426 ;\nC 122 ; WX 600 ; N z ; B 99 0 502 426 ;\nC 123 ; WX 600 ; N braceleft ; B 182 -108 437 622 ;\nC 124 ; WX 600 ; N bar ; B 275 -250 326 750 ;\nC 125 ; WX 600 ; N braceright ; B 163 -108 418 622 ;\nC 126 ; WX 600 ; N asciitilde ; B 63 197 540 320 ;\nC 161 ; WX 600 ; N exclamdown ; B 236 -157 364 430 ;\nC 162 ; WX 600 ; N cent ; B 96 -49 500 614 ;\nC 163 ; WX 600 ; N sterling ; B 84 -21 521 611 ;\nC 164 ; WX 600 ; N fraction ; B 92 -57 509 665 ;\nC 165 ; WX 600 ; N yen ; B 26 0 574 562 ;\nC 166 ; WX 600 ; N florin ; B 4 -143 539 622 ;\nC 167 ; WX 600 ; N section ; B 113 -78 488 580 ;\nC 168 ; WX 600 ; N currency ; B 73 58 527 506 ;\nC 169 ; WX 600 ; N quotesingle ; B 259 328 341 562 ;\nC 170 ; WX 600 ; N quotedblleft ; B 143 328 471 562 ;\nC 171 ; WX 600 ; N guillemotleft ; B 37 70 563 446 ;\nC 172 ; WX 600 ; N guilsinglleft ; B 149 70 451 446 ;\nC 173 ; WX 600 ; N guilsinglright ; B 149 70 451 446 ;\nC 174 ; WX 600 ; N fi ; B 3 0 597 629 ;\nC 175 ; WX 600 ; N fl ; B 3 0 597 629 ;\nC 177 ; WX 600 ; N endash ; B 75 231 525 285 ;\nC 178 ; WX 600 ; N dagger ; B 141 -78 459 580 ;\nC 179 ; WX 600 ; N daggerdbl ; B 141 -78 459 580 ;\nC 180 ; WX 600 ; N periodcentered ; B 222 189 378 327 ;\nC 182 ; WX 600 ; N paragraph ; B 50 -78 511 562 ;\nC 183 ; WX 600 ; N bullet ; B 172 130 428 383 ;\nC 184 ; WX 600 ; N quotesinglbase ; B 213 -134 376 100 ;\nC 185 ; WX 600 ; N quotedblbase ; B 143 -134 457 100 ;\nC 186 ; WX 600 ; N quotedblright ; B 143 328 457 562 ;\nC 187 ; WX 600 ; N guillemotright ; B 37 70 563 446 ;\nC 188 ; WX 600 ; N ellipsis ; B 37 -15 563 111 ;\nC 189 ; WX 600 ; N perthousand ; B 3 -15 600 622 ;\nC 191 ; WX 600 ; N questiondown ; B 108 -157 471 430 ;\nC 193 ; WX 600 ; N grave ; B 151 497 378 672 ;\nC 194 ; WX 600 ; N acute ; B 242 497 469 672 ;\nC 195 ; WX 600 ; N circumflex ; B 124 477 476 654 ;\nC 196 ; WX 600 ; N tilde ; B 105 489 503 606 ;\nC 197 ; WX 600 ; N macron ; B 120 525 480 565 ;\nC 198 ; WX 600 ; N breve ; B 153 501 447 609 ;\nC 199 ; WX 600 ; N dotaccent ; B 249 537 352 640 ;\nC 200 ; WX 600 ; N dieresis ; B 148 537 453 640 ;\nC 202 ; WX 600 ; N ring ; B 218 463 382 627 ;\nC 203 ; WX 600 ; N cedilla ; B 224 -151 362 10 ;\nC 205 ; WX 600 ; N hungarumlaut ; B 133 497 540 672 ;\nC 206 ; WX 600 ; N ogonek ; B 211 -172 407 4 ;\nC 207 ; WX 600 ; N caron ; B 124 492 476 669 ;\nC 208 ; WX 600 ; N emdash ; B 0 231 600 285 ;\nC 225 ; WX 600 ; N AE ; B 3 0 550 562 ;\nC 227 ; WX 600 ; N ordfeminine ; B 156 249 442 580 ;\nC 232 ; WX 600 ; N Lslash ; B 47 0 554 562 ;\nC 233 ; WX 600 ; N Oslash ; B 43 -80 557 629 ;\nC 234 ; WX 600 ; N OE ; B 7 0 567 562 ;\nC 235 ; WX 600 ; N ordmasculine ; B 157 249 443 580 ;\nC 241 ; WX 600 ; N ae ; B 19 -15 570 441 ;\nC 245 ; WX 600 ; N dotlessi ; B 95 0 505 426 ;\nC 248 ; WX 600 ; N lslash ; B 95 0 505 629 ;\nC 249 ; WX 600 ; N oslash ; B 62 -80 538 506 ;\nC 250 ; WX 600 ; N oe ; B 19 -15 559 441 ;\nC 251 ; WX 600 ; N germandbls ; B 48 -15 588 629 ;\nC -1 ; WX 600 ; N Idieresis ; B 96 0 504 753 ;\nC -1 ; WX 600 ; N eacute ; B 66 -15 548 672 ;\nC -1 ; WX 600 ; N abreve ; B 53 -15 559 609 ;\nC -1 ; WX 600 ; N uhungarumlaut ; B 21 -15 580 672 ;\nC -1 ; WX 600 ; N ecaron ; B 66 -15 548 669 ;\nC -1 ; WX 600 ; N Ydieresis ; B 24 0 576 753 ;\nC -1 ; WX 600 ; N divide ; B 87 48 513 467 ;\nC -1 ; WX 600 ; N Yacute ; B 24 0 576 805 ;\nC -1 ; WX 600 ; N Acircumflex ; B 3 0 597 787 ;\nC -1 ; WX 600 ; N aacute ; B 53 -15 559 672 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 17 -18 583 787 ;\nC -1 ; WX 600 ; N yacute ; B 7 -157 592 672 ;\nC -1 ; WX 600 ; N scommaaccent ; B 80 -250 513 441 ;\nC -1 ; WX 600 ; N ecircumflex ; B 66 -15 548 654 ;\nC -1 ; WX 600 ; N Uring ; B 17 -18 583 760 ;\nC -1 ; WX 600 ; N Udieresis ; B 17 -18 583 753 ;\nC -1 ; WX 600 ; N aogonek ; B 53 -172 587 441 ;\nC -1 ; WX 600 ; N Uacute ; B 17 -18 583 805 ;\nC -1 ; WX 600 ; N uogonek ; B 21 -172 590 426 ;\nC -1 ; WX 600 ; N Edieresis ; B 53 0 550 753 ;\nC -1 ; WX 600 ; N Dcroat ; B 30 0 574 562 ;\nC -1 ; WX 600 ; N commaaccent ; B 198 -250 335 -58 ;\nC -1 ; WX 600 ; N copyright ; B 0 -18 600 580 ;\nC -1 ; WX 600 ; N Emacron ; B 53 0 550 698 ;\nC -1 ; WX 600 ; N ccaron ; B 66 -15 529 669 ;\nC -1 ; WX 600 ; N aring ; B 53 -15 559 627 ;\nC -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 593 562 ;\nC -1 ; WX 600 ; N lacute ; B 95 0 505 805 ;\nC -1 ; WX 600 ; N agrave ; B 53 -15 559 672 ;\nC -1 ; WX 600 ; N Tcommaaccent ; B 38 -250 563 562 ;\nC -1 ; WX 600 ; N Cacute ; B 41 -18 540 805 ;\nC -1 ; WX 600 ; N atilde ; B 53 -15 559 606 ;\nC -1 ; WX 600 ; N Edotaccent ; B 53 0 550 753 ;\nC -1 ; WX 600 ; N scaron ; B 80 -15 513 669 ;\nC -1 ; WX 600 ; N scedilla ; B 80 -151 513 441 ;\nC -1 ; WX 600 ; N iacute ; B 95 0 505 672 ;\nC -1 ; WX 600 ; N lozenge ; B 18 0 443 706 ;\nC -1 ; WX 600 ; N Rcaron ; B 38 0 588 802 ;\nC -1 ; WX 600 ; N Gcommaaccent ; B 31 -250 575 580 ;\nC -1 ; WX 600 ; N ucircumflex ; B 21 -15 562 654 ;\nC -1 ; WX 600 ; N acircumflex ; B 53 -15 559 654 ;\nC -1 ; WX 600 ; N Amacron ; B 3 0 597 698 ;\nC -1 ; WX 600 ; N rcaron ; B 60 0 559 669 ;\nC -1 ; WX 600 ; N ccedilla ; B 66 -151 529 441 ;\nC -1 ; WX 600 ; N Zdotaccent ; B 86 0 514 753 ;\nC -1 ; WX 600 ; N Thorn ; B 79 0 538 562 ;\nC -1 ; WX 600 ; N Omacron ; B 43 -18 557 698 ;\nC -1 ; WX 600 ; N Racute ; B 38 0 588 805 ;\nC -1 ; WX 600 ; N Sacute ; B 72 -20 529 805 ;\nC -1 ; WX 600 ; N dcaron ; B 45 -15 715 629 ;\nC -1 ; WX 600 ; N Umacron ; B 17 -18 583 698 ;\nC -1 ; WX 600 ; N uring ; B 21 -15 562 627 ;\nC -1 ; WX 600 ; N threesuperior ; B 155 240 406 622 ;\nC -1 ; WX 600 ; N Ograve ; B 43 -18 557 805 ;\nC -1 ; WX 600 ; N Agrave ; B 3 0 597 805 ;\nC -1 ; WX 600 ; N Abreve ; B 3 0 597 732 ;\nC -1 ; WX 600 ; N multiply ; B 87 43 515 470 ;\nC -1 ; WX 600 ; N uacute ; B 21 -15 562 672 ;\nC -1 ; WX 600 ; N Tcaron ; B 38 0 563 802 ;\nC -1 ; WX 600 ; N partialdiff ; B 17 -38 459 710 ;\nC -1 ; WX 600 ; N ydieresis ; B 7 -157 592 620 ;\nC -1 ; WX 600 ; N Nacute ; B 7 -13 593 805 ;\nC -1 ; WX 600 ; N icircumflex ; B 94 0 505 654 ;\nC -1 ; WX 600 ; N Ecircumflex ; B 53 0 550 787 ;\nC -1 ; WX 600 ; N adieresis ; B 53 -15 559 620 ;\nC -1 ; WX 600 ; N edieresis ; B 66 -15 548 620 ;\nC -1 ; WX 600 ; N cacute ; B 66 -15 529 672 ;\nC -1 ; WX 600 ; N nacute ; B 26 0 575 672 ;\nC -1 ; WX 600 ; N umacron ; B 21 -15 562 565 ;\nC -1 ; WX 600 ; N Ncaron ; B 7 -13 593 802 ;\nC -1 ; WX 600 ; N Iacute ; B 96 0 504 805 ;\nC -1 ; WX 600 ; N plusminus ; B 87 44 513 558 ;\nC -1 ; WX 600 ; N brokenbar ; B 275 -175 326 675 ;\nC -1 ; WX 600 ; N registered ; B 0 -18 600 580 ;\nC -1 ; WX 600 ; N Gbreve ; B 31 -18 575 732 ;\nC -1 ; WX 600 ; N Idotaccent ; B 96 0 504 753 ;\nC -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;\nC -1 ; WX 600 ; N Egrave ; B 53 0 550 805 ;\nC -1 ; WX 600 ; N racute ; B 60 0 559 672 ;\nC -1 ; WX 600 ; N omacron ; B 62 -15 538 565 ;\nC -1 ; WX 600 ; N Zacute ; B 86 0 514 805 ;\nC -1 ; WX 600 ; N Zcaron ; B 86 0 514 802 ;\nC -1 ; WX 600 ; N greaterequal ; B 98 0 502 710 ;\nC -1 ; WX 600 ; N Eth ; B 30 0 574 562 ;\nC -1 ; WX 600 ; N Ccedilla ; B 41 -151 540 580 ;\nC -1 ; WX 600 ; N lcommaaccent ; B 95 -250 505 629 ;\nC -1 ; WX 600 ; N tcaron ; B 87 -15 530 717 ;\nC -1 ; WX 600 ; N eogonek ; B 66 -172 548 441 ;\nC -1 ; WX 600 ; N Uogonek ; B 17 -172 583 562 ;\nC -1 ; WX 600 ; N Aacute ; B 3 0 597 805 ;\nC -1 ; WX 600 ; N Adieresis ; B 3 0 597 753 ;\nC -1 ; WX 600 ; N egrave ; B 66 -15 548 672 ;\nC -1 ; WX 600 ; N zacute ; B 99 0 502 672 ;\nC -1 ; WX 600 ; N iogonek ; B 95 -172 505 657 ;\nC -1 ; WX 600 ; N Oacute ; B 43 -18 557 805 ;\nC -1 ; WX 600 ; N oacute ; B 62 -15 538 672 ;\nC -1 ; WX 600 ; N amacron ; B 53 -15 559 565 ;\nC -1 ; WX 600 ; N sacute ; B 80 -15 513 672 ;\nC -1 ; WX 600 ; N idieresis ; B 95 0 505 620 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 43 -18 557 787 ;\nC -1 ; WX 600 ; N Ugrave ; B 17 -18 583 805 ;\nC -1 ; WX 600 ; N Delta ; B 6 0 598 688 ;\nC -1 ; WX 600 ; N thorn ; B -6 -157 555 629 ;\nC -1 ; WX 600 ; N twosuperior ; B 177 249 424 622 ;\nC -1 ; WX 600 ; N Odieresis ; B 43 -18 557 753 ;\nC -1 ; WX 600 ; N mu ; B 21 -157 562 426 ;\nC -1 ; WX 600 ; N igrave ; B 95 0 505 672 ;\nC -1 ; WX 600 ; N ohungarumlaut ; B 62 -15 580 672 ;\nC -1 ; WX 600 ; N Eogonek ; B 53 -172 561 562 ;\nC -1 ; WX 600 ; N dcroat ; B 45 -15 591 629 ;\nC -1 ; WX 600 ; N threequarters ; B 8 -56 593 666 ;\nC -1 ; WX 600 ; N Scedilla ; B 72 -151 529 580 ;\nC -1 ; WX 600 ; N lcaron ; B 95 0 533 629 ;\nC -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 582 562 ;\nC -1 ; WX 600 ; N Lacute ; B 47 0 554 805 ;\nC -1 ; WX 600 ; N trademark ; B -23 263 623 562 ;\nC -1 ; WX 600 ; N edotaccent ; B 66 -15 548 620 ;\nC -1 ; WX 600 ; N Igrave ; B 96 0 504 805 ;\nC -1 ; WX 600 ; N Imacron ; B 96 0 504 698 ;\nC -1 ; WX 600 ; N Lcaron ; B 47 0 554 562 ;\nC -1 ; WX 600 ; N onehalf ; B 0 -57 611 665 ;\nC -1 ; WX 600 ; N lessequal ; B 98 0 502 710 ;\nC -1 ; WX 600 ; N ocircumflex ; B 62 -15 538 654 ;\nC -1 ; WX 600 ; N ntilde ; B 26 0 575 606 ;\nC -1 ; WX 600 ; N Uhungarumlaut ; B 17 -18 590 805 ;\nC -1 ; WX 600 ; N Eacute ; B 53 0 550 805 ;\nC -1 ; WX 600 ; N emacron ; B 66 -15 548 565 ;\nC -1 ; WX 600 ; N gbreve ; B 45 -157 566 609 ;\nC -1 ; WX 600 ; N onequarter ; B 0 -57 600 665 ;\nC -1 ; WX 600 ; N Scaron ; B 72 -20 529 802 ;\nC -1 ; WX 600 ; N Scommaaccent ; B 72 -250 529 580 ;\nC -1 ; WX 600 ; N Ohungarumlaut ; B 43 -18 580 805 ;\nC -1 ; WX 600 ; N degree ; B 123 269 477 622 ;\nC -1 ; WX 600 ; N ograve ; B 62 -15 538 672 ;\nC -1 ; WX 600 ; N Ccaron ; B 41 -18 540 802 ;\nC -1 ; WX 600 ; N ugrave ; B 21 -15 562 672 ;\nC -1 ; WX 600 ; N radical ; B 3 -15 597 792 ;\nC -1 ; WX 600 ; N Dcaron ; B 43 0 574 802 ;\nC -1 ; WX 600 ; N rcommaaccent ; B 60 -250 559 441 ;\nC -1 ; WX 600 ; N Ntilde ; B 7 -13 593 729 ;\nC -1 ; WX 600 ; N otilde ; B 62 -15 538 606 ;\nC -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 588 562 ;\nC -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 554 562 ;\nC -1 ; WX 600 ; N Atilde ; B 3 0 597 729 ;\nC -1 ; WX 600 ; N Aogonek ; B 3 -172 608 562 ;\nC -1 ; WX 600 ; N Aring ; B 3 0 597 750 ;\nC -1 ; WX 600 ; N Otilde ; B 43 -18 557 729 ;\nC -1 ; WX 600 ; N zdotaccent ; B 99 0 502 620 ;\nC -1 ; WX 600 ; N Ecaron ; B 53 0 550 802 ;\nC -1 ; WX 600 ; N Iogonek ; B 96 -172 504 562 ;\nC -1 ; WX 600 ; N kcommaaccent ; B 43 -250 580 629 ;\nC -1 ; WX 600 ; N minus ; B 80 232 520 283 ;\nC -1 ; WX 600 ; N Icircumflex ; B 96 0 504 787 ;\nC -1 ; WX 600 ; N ncaron ; B 26 0 575 669 ;\nC -1 ; WX 600 ; N tcommaaccent ; B 87 -250 530 561 ;\nC -1 ; WX 600 ; N logicalnot ; B 87 108 513 369 ;\nC -1 ; WX 600 ; N odieresis ; B 62 -15 538 620 ;\nC -1 ; WX 600 ; N udieresis ; B 21 -15 562 620 ;\nC -1 ; WX 600 ; N notequal ; B 15 -16 540 529 ;\nC -1 ; WX 600 ; N gcommaaccent ; B 45 -157 566 708 ;\nC -1 ; WX 600 ; N eth ; B 62 -15 538 629 ;\nC -1 ; WX 600 ; N zcaron ; B 99 0 502 669 ;\nC -1 ; WX 600 ; N ncommaaccent ; B 26 -250 575 441 ;\nC -1 ; WX 600 ; N onesuperior ; B 172 249 428 622 ;\nC -1 ; WX 600 ; N imacron ; B 95 0 505 565 ;\nC -1 ; WX 600 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/pdfcorefonts/Helvetica-Bold.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 12:43:52 1997\nComment UniqueID 43052\nComment VMusage 37169 48194\nFontName Helvetica-Bold\nFullName Helvetica Bold\nFamilyName Helvetica\nWeight Bold\nItalicAngle 0\nIsFixedPitch false\nCharacterSet ExtendedRoman\nFontBBox -170 -228 1003 962 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated.  All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 718\nXHeight 532\nAscender 718\nDescender -207\nStdHW 118\nStdVW 140\nStartCharMetrics 315\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 90 0 244 718 ;\nC 34 ; WX 474 ; N quotedbl ; B 98 447 376 718 ;\nC 35 ; WX 556 ; N numbersign ; B 18 0 538 698 ;\nC 36 ; WX 556 ; N dollar ; B 30 -115 523 775 ;\nC 37 ; WX 889 ; N percent ; B 28 -19 861 710 ;\nC 38 ; WX 722 ; N ampersand ; B 54 -19 701 718 ;\nC 39 ; WX 278 ; N quoteright ; B 69 445 209 718 ;\nC 40 ; WX 333 ; N parenleft ; B 35 -208 314 734 ;\nC 41 ; WX 333 ; N parenright ; B 19 -208 298 734 ;\nC 42 ; WX 389 ; N asterisk ; B 27 387 362 718 ;\nC 43 ; WX 584 ; N plus ; B 40 0 544 506 ;\nC 44 ; WX 278 ; N comma ; B 64 -168 214 146 ;\nC 45 ; WX 333 ; N hyphen ; B 27 215 306 345 ;\nC 46 ; WX 278 ; N period ; B 64 0 214 146 ;\nC 47 ; WX 278 ; N slash ; B -33 -19 311 737 ;\nC 48 ; WX 556 ; N zero ; B 32 -19 524 710 ;\nC 49 ; WX 556 ; N one ; B 69 0 378 710 ;\nC 50 ; WX 556 ; N two ; B 26 0 511 710 ;\nC 51 ; WX 556 ; N three ; B 27 -19 516 710 ;\nC 52 ; WX 556 ; N four ; B 27 0 526 710 ;\nC 53 ; WX 556 ; N five ; B 27 -19 516 698 ;\nC 54 ; WX 556 ; N six ; B 31 -19 520 710 ;\nC 55 ; WX 556 ; N seven ; B 25 0 528 698 ;\nC 56 ; WX 556 ; N eight ; B 32 -19 524 710 ;\nC 57 ; WX 556 ; N nine ; B 30 -19 522 710 ;\nC 58 ; WX 333 ; N colon ; B 92 0 242 512 ;\nC 59 ; WX 333 ; N semicolon ; B 92 -168 242 512 ;\nC 60 ; WX 584 ; N less ; B 38 -8 546 514 ;\nC 61 ; WX 584 ; N equal ; B 40 87 544 419 ;\nC 62 ; WX 584 ; N greater ; B 38 -8 546 514 ;\nC 63 ; WX 611 ; N question ; B 60 0 556 727 ;\nC 64 ; WX 975 ; N at ; B 118 -19 856 737 ;\nC 65 ; WX 722 ; N A ; B 20 0 702 718 ;\nC 66 ; WX 722 ; N B ; B 76 0 669 718 ;\nC 67 ; WX 722 ; N C ; B 44 -19 684 737 ;\nC 68 ; WX 722 ; N D ; B 76 0 685 718 ;\nC 69 ; WX 667 ; N E ; B 76 0 621 718 ;\nC 70 ; WX 611 ; N F ; B 76 0 587 718 ;\nC 71 ; WX 778 ; N G ; B 44 -19 713 737 ;\nC 72 ; WX 722 ; N H ; B 71 0 651 718 ;\nC 73 ; WX 278 ; N I ; B 64 0 214 718 ;\nC 74 ; WX 556 ; N J ; B 22 -18 484 718 ;\nC 75 ; WX 722 ; N K ; B 87 0 722 718 ;\nC 76 ; WX 611 ; N L ; B 76 0 583 718 ;\nC 77 ; WX 833 ; N M ; B 69 0 765 718 ;\nC 78 ; WX 722 ; N N ; B 69 0 654 718 ;\nC 79 ; WX 778 ; N O ; B 44 -19 734 737 ;\nC 80 ; WX 667 ; N P ; B 76 0 627 718 ;\nC 81 ; WX 778 ; N Q ; B 44 -52 737 737 ;\nC 82 ; WX 722 ; N R ; B 76 0 677 718 ;\nC 83 ; WX 667 ; N S ; B 39 -19 629 737 ;\nC 84 ; WX 611 ; N T ; B 14 0 598 718 ;\nC 85 ; WX 722 ; N U ; B 72 -19 651 718 ;\nC 86 ; WX 667 ; N V ; B 19 0 648 718 ;\nC 87 ; WX 944 ; N W ; B 16 0 929 718 ;\nC 88 ; WX 667 ; N X ; B 14 0 653 718 ;\nC 89 ; WX 667 ; N Y ; B 15 0 653 718 ;\nC 90 ; WX 611 ; N Z ; B 25 0 586 718 ;\nC 91 ; WX 333 ; N bracketleft ; B 63 -196 309 722 ;\nC 92 ; WX 278 ; N backslash ; B -33 -19 311 737 ;\nC 93 ; WX 333 ; N bracketright ; B 24 -196 270 722 ;\nC 94 ; WX 584 ; N asciicircum ; B 62 323 522 698 ;\nC 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ;\nC 96 ; WX 278 ; N quoteleft ; B 69 454 209 727 ;\nC 97 ; WX 556 ; N a ; B 29 -14 527 546 ;\nC 98 ; WX 611 ; N b ; B 61 -14 578 718 ;\nC 99 ; WX 556 ; N c ; B 34 -14 524 546 ;\nC 100 ; WX 611 ; N d ; B 34 -14 551 718 ;\nC 101 ; WX 556 ; N e ; B 23 -14 528 546 ;\nC 102 ; WX 333 ; N f ; B 10 0 318 727 ; L i fi ; L l fl ;\nC 103 ; WX 611 ; N g ; B 40 -217 553 546 ;\nC 104 ; WX 611 ; N h ; B 65 0 546 718 ;\nC 105 ; WX 278 ; N i ; B 69 0 209 725 ;\nC 106 ; WX 278 ; N j ; B 3 -214 209 725 ;\nC 107 ; WX 556 ; N k ; B 69 0 562 718 ;\nC 108 ; WX 278 ; N l ; B 69 0 209 718 ;\nC 109 ; WX 889 ; N m ; B 64 0 826 546 ;\nC 110 ; WX 611 ; N n ; B 65 0 546 546 ;\nC 111 ; WX 611 ; N o ; B 34 -14 578 546 ;\nC 112 ; WX 611 ; N p ; B 62 -207 578 546 ;\nC 113 ; WX 611 ; N q ; B 34 -207 552 546 ;\nC 114 ; WX 389 ; N r ; B 64 0 373 546 ;\nC 115 ; WX 556 ; N s ; B 30 -14 519 546 ;\nC 116 ; WX 333 ; N t ; B 10 -6 309 676 ;\nC 117 ; WX 611 ; N u ; B 66 -14 545 532 ;\nC 118 ; WX 556 ; N v ; B 13 0 543 532 ;\nC 119 ; WX 778 ; N w ; B 10 0 769 532 ;\nC 120 ; WX 556 ; N x ; B 15 0 541 532 ;\nC 121 ; WX 556 ; N y ; B 10 -214 539 532 ;\nC 122 ; WX 500 ; N z ; B 20 0 480 532 ;\nC 123 ; WX 389 ; N braceleft ; B 48 -196 365 722 ;\nC 124 ; WX 280 ; N bar ; B 84 -225 196 775 ;\nC 125 ; WX 389 ; N braceright ; B 24 -196 341 722 ;\nC 126 ; WX 584 ; N asciitilde ; B 61 163 523 343 ;\nC 161 ; WX 333 ; N exclamdown ; B 90 -186 244 532 ;\nC 162 ; WX 556 ; N cent ; B 34 -118 524 628 ;\nC 163 ; WX 556 ; N sterling ; B 28 -16 541 718 ;\nC 164 ; WX 167 ; N fraction ; B -170 -19 336 710 ;\nC 165 ; WX 556 ; N yen ; B -9 0 565 698 ;\nC 166 ; WX 556 ; N florin ; B -10 -210 516 737 ;\nC 167 ; WX 556 ; N section ; B 34 -184 522 727 ;\nC 168 ; WX 556 ; N currency ; B -3 76 559 636 ;\nC 169 ; WX 238 ; N quotesingle ; B 70 447 168 718 ;\nC 170 ; WX 500 ; N quotedblleft ; B 64 454 436 727 ;\nC 171 ; WX 556 ; N guillemotleft ; B 88 76 468 484 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 83 76 250 484 ;\nC 173 ; WX 333 ; N guilsinglright ; B 83 76 250 484 ;\nC 174 ; WX 611 ; N fi ; B 10 0 542 727 ;\nC 175 ; WX 611 ; N fl ; B 10 0 542 727 ;\nC 177 ; WX 556 ; N endash ; B 0 227 556 333 ;\nC 178 ; WX 556 ; N dagger ; B 36 -171 520 718 ;\nC 179 ; WX 556 ; N daggerdbl ; B 36 -171 520 718 ;\nC 180 ; WX 278 ; N periodcentered ; B 58 172 220 334 ;\nC 182 ; WX 556 ; N paragraph ; B -8 -191 539 700 ;\nC 183 ; WX 350 ; N bullet ; B 10 194 340 524 ;\nC 184 ; WX 278 ; N quotesinglbase ; B 69 -146 209 127 ;\nC 185 ; WX 500 ; N quotedblbase ; B 64 -146 436 127 ;\nC 186 ; WX 500 ; N quotedblright ; B 64 445 436 718 ;\nC 187 ; WX 556 ; N guillemotright ; B 88 76 468 484 ;\nC 188 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ;\nC 189 ; WX 1000 ; N perthousand ; B -3 -19 1003 710 ;\nC 191 ; WX 611 ; N questiondown ; B 55 -195 551 532 ;\nC 193 ; WX 333 ; N grave ; B -23 604 225 750 ;\nC 194 ; WX 333 ; N acute ; B 108 604 356 750 ;\nC 195 ; WX 333 ; N circumflex ; B -10 604 343 750 ;\nC 196 ; WX 333 ; N tilde ; B -17 610 350 737 ;\nC 197 ; WX 333 ; N macron ; B -6 604 339 678 ;\nC 198 ; WX 333 ; N breve ; B -2 604 335 750 ;\nC 199 ; WX 333 ; N dotaccent ; B 104 614 230 729 ;\nC 200 ; WX 333 ; N dieresis ; B 6 614 327 729 ;\nC 202 ; WX 333 ; N ring ; B 59 568 275 776 ;\nC 203 ; WX 333 ; N cedilla ; B 6 -228 245 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 9 604 486 750 ;\nC 206 ; WX 333 ; N ogonek ; B 71 -228 304 0 ;\nC 207 ; WX 333 ; N caron ; B -10 604 343 750 ;\nC 208 ; WX 1000 ; N emdash ; B 0 227 1000 333 ;\nC 225 ; WX 1000 ; N AE ; B 5 0 954 718 ;\nC 227 ; WX 370 ; N ordfeminine ; B 22 401 347 737 ;\nC 232 ; WX 611 ; N Lslash ; B -20 0 583 718 ;\nC 233 ; WX 778 ; N Oslash ; B 33 -27 744 745 ;\nC 234 ; WX 1000 ; N OE ; B 37 -19 961 737 ;\nC 235 ; WX 365 ; N ordmasculine ; B 6 401 360 737 ;\nC 241 ; WX 889 ; N ae ; B 29 -14 858 546 ;\nC 245 ; WX 278 ; N dotlessi ; B 69 0 209 532 ;\nC 248 ; WX 278 ; N lslash ; B -18 0 296 718 ;\nC 249 ; WX 611 ; N oslash ; B 22 -29 589 560 ;\nC 250 ; WX 944 ; N oe ; B 34 -14 912 546 ;\nC 251 ; WX 611 ; N germandbls ; B 69 -14 579 731 ;\nC -1 ; WX 278 ; N Idieresis ; B -21 0 300 915 ;\nC -1 ; WX 556 ; N eacute ; B 23 -14 528 750 ;\nC -1 ; WX 556 ; N abreve ; B 29 -14 527 750 ;\nC -1 ; WX 611 ; N uhungarumlaut ; B 66 -14 625 750 ;\nC -1 ; WX 556 ; N ecaron ; B 23 -14 528 750 ;\nC -1 ; WX 667 ; N Ydieresis ; B 15 0 653 915 ;\nC -1 ; WX 584 ; N divide ; B 40 -42 544 548 ;\nC -1 ; WX 667 ; N Yacute ; B 15 0 653 936 ;\nC -1 ; WX 722 ; N Acircumflex ; B 20 0 702 936 ;\nC -1 ; WX 556 ; N aacute ; B 29 -14 527 750 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 72 -19 651 936 ;\nC -1 ; WX 556 ; N yacute ; B 10 -214 539 750 ;\nC -1 ; WX 556 ; N scommaaccent ; B 30 -228 519 546 ;\nC -1 ; WX 556 ; N ecircumflex ; B 23 -14 528 750 ;\nC -1 ; WX 722 ; N Uring ; B 72 -19 651 962 ;\nC -1 ; WX 722 ; N Udieresis ; B 72 -19 651 915 ;\nC -1 ; WX 556 ; N aogonek ; B 29 -224 545 546 ;\nC -1 ; WX 722 ; N Uacute ; B 72 -19 651 936 ;\nC -1 ; WX 611 ; N uogonek ; B 66 -228 545 532 ;\nC -1 ; WX 667 ; N Edieresis ; B 76 0 621 915 ;\nC -1 ; WX 722 ; N Dcroat ; B -5 0 685 718 ;\nC -1 ; WX 250 ; N commaaccent ; B 64 -228 199 -50 ;\nC -1 ; WX 737 ; N copyright ; B -11 -19 749 737 ;\nC -1 ; WX 667 ; N Emacron ; B 76 0 621 864 ;\nC -1 ; WX 556 ; N ccaron ; B 34 -14 524 750 ;\nC -1 ; WX 556 ; N aring ; B 29 -14 527 776 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 654 718 ;\nC -1 ; WX 278 ; N lacute ; B 69 0 329 936 ;\nC -1 ; WX 556 ; N agrave ; B 29 -14 527 750 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 14 -228 598 718 ;\nC -1 ; WX 722 ; N Cacute ; B 44 -19 684 936 ;\nC -1 ; WX 556 ; N atilde ; B 29 -14 527 737 ;\nC -1 ; WX 667 ; N Edotaccent ; B 76 0 621 915 ;\nC -1 ; WX 556 ; N scaron ; B 30 -14 519 750 ;\nC -1 ; WX 556 ; N scedilla ; B 30 -228 519 546 ;\nC -1 ; WX 278 ; N iacute ; B 69 0 329 750 ;\nC -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;\nC -1 ; WX 722 ; N Rcaron ; B 76 0 677 936 ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 44 -228 713 737 ;\nC -1 ; WX 611 ; N ucircumflex ; B 66 -14 545 750 ;\nC -1 ; WX 556 ; N acircumflex ; B 29 -14 527 750 ;\nC -1 ; WX 722 ; N Amacron ; B 20 0 702 864 ;\nC -1 ; WX 389 ; N rcaron ; B 18 0 373 750 ;\nC -1 ; WX 556 ; N ccedilla ; B 34 -228 524 546 ;\nC -1 ; WX 611 ; N Zdotaccent ; B 25 0 586 915 ;\nC -1 ; WX 667 ; N Thorn ; B 76 0 627 718 ;\nC -1 ; WX 778 ; N Omacron ; B 44 -19 734 864 ;\nC -1 ; WX 722 ; N Racute ; B 76 0 677 936 ;\nC -1 ; WX 667 ; N Sacute ; B 39 -19 629 936 ;\nC -1 ; WX 743 ; N dcaron ; B 34 -14 750 718 ;\nC -1 ; WX 722 ; N Umacron ; B 72 -19 651 864 ;\nC -1 ; WX 611 ; N uring ; B 66 -14 545 776 ;\nC -1 ; WX 333 ; N threesuperior ; B 8 271 326 710 ;\nC -1 ; WX 778 ; N Ograve ; B 44 -19 734 936 ;\nC -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ;\nC -1 ; WX 722 ; N Abreve ; B 20 0 702 936 ;\nC -1 ; WX 584 ; N multiply ; B 40 1 545 505 ;\nC -1 ; WX 611 ; N uacute ; B 66 -14 545 750 ;\nC -1 ; WX 611 ; N Tcaron ; B 14 0 598 936 ;\nC -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;\nC -1 ; WX 556 ; N ydieresis ; B 10 -214 539 729 ;\nC -1 ; WX 722 ; N Nacute ; B 69 0 654 936 ;\nC -1 ; WX 278 ; N icircumflex ; B -37 0 316 750 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 76 0 621 936 ;\nC -1 ; WX 556 ; N adieresis ; B 29 -14 527 729 ;\nC -1 ; WX 556 ; N edieresis ; B 23 -14 528 729 ;\nC -1 ; WX 556 ; N cacute ; B 34 -14 524 750 ;\nC -1 ; WX 611 ; N nacute ; B 65 0 546 750 ;\nC -1 ; WX 611 ; N umacron ; B 66 -14 545 678 ;\nC -1 ; WX 722 ; N Ncaron ; B 69 0 654 936 ;\nC -1 ; WX 278 ; N Iacute ; B 64 0 329 936 ;\nC -1 ; WX 584 ; N plusminus ; B 40 0 544 506 ;\nC -1 ; WX 280 ; N brokenbar ; B 84 -150 196 700 ;\nC -1 ; WX 737 ; N registered ; B -11 -19 748 737 ;\nC -1 ; WX 778 ; N Gbreve ; B 44 -19 713 936 ;\nC -1 ; WX 278 ; N Idotaccent ; B 64 0 214 915 ;\nC -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;\nC -1 ; WX 667 ; N Egrave ; B 76 0 621 936 ;\nC -1 ; WX 389 ; N racute ; B 64 0 384 750 ;\nC -1 ; WX 611 ; N omacron ; B 34 -14 578 678 ;\nC -1 ; WX 611 ; N Zacute ; B 25 0 586 936 ;\nC -1 ; WX 611 ; N Zcaron ; B 25 0 586 936 ;\nC -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;\nC -1 ; WX 722 ; N Eth ; B -5 0 685 718 ;\nC -1 ; WX 722 ; N Ccedilla ; B 44 -228 684 737 ;\nC -1 ; WX 278 ; N lcommaaccent ; B 69 -228 213 718 ;\nC -1 ; WX 389 ; N tcaron ; B 10 -6 421 878 ;\nC -1 ; WX 556 ; N eogonek ; B 23 -228 528 546 ;\nC -1 ; WX 722 ; N Uogonek ; B 72 -228 651 718 ;\nC -1 ; WX 722 ; N Aacute ; B 20 0 702 936 ;\nC -1 ; WX 722 ; N Adieresis ; B 20 0 702 915 ;\nC -1 ; WX 556 ; N egrave ; B 23 -14 528 750 ;\nC -1 ; WX 500 ; N zacute ; B 20 0 480 750 ;\nC -1 ; WX 278 ; N iogonek ; B 16 -224 249 725 ;\nC -1 ; WX 778 ; N Oacute ; B 44 -19 734 936 ;\nC -1 ; WX 611 ; N oacute ; B 34 -14 578 750 ;\nC -1 ; WX 556 ; N amacron ; B 29 -14 527 678 ;\nC -1 ; WX 556 ; N sacute ; B 30 -14 519 750 ;\nC -1 ; WX 278 ; N idieresis ; B -21 0 300 729 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 44 -19 734 936 ;\nC -1 ; WX 722 ; N Ugrave ; B 72 -19 651 936 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 611 ; N thorn ; B 62 -208 578 718 ;\nC -1 ; WX 333 ; N twosuperior ; B 9 283 324 710 ;\nC -1 ; WX 778 ; N Odieresis ; B 44 -19 734 915 ;\nC -1 ; WX 611 ; N mu ; B 66 -207 545 532 ;\nC -1 ; WX 278 ; N igrave ; B -50 0 209 750 ;\nC -1 ; WX 611 ; N ohungarumlaut ; B 34 -14 625 750 ;\nC -1 ; WX 667 ; N Eogonek ; B 76 -224 639 718 ;\nC -1 ; WX 611 ; N dcroat ; B 34 -14 650 718 ;\nC -1 ; WX 834 ; N threequarters ; B 16 -19 799 710 ;\nC -1 ; WX 667 ; N Scedilla ; B 39 -228 629 737 ;\nC -1 ; WX 400 ; N lcaron ; B 69 0 408 718 ;\nC -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 722 718 ;\nC -1 ; WX 611 ; N Lacute ; B 76 0 583 936 ;\nC -1 ; WX 1000 ; N trademark ; B 44 306 956 718 ;\nC -1 ; WX 556 ; N edotaccent ; B 23 -14 528 729 ;\nC -1 ; WX 278 ; N Igrave ; B -50 0 214 936 ;\nC -1 ; WX 278 ; N Imacron ; B -33 0 312 864 ;\nC -1 ; WX 611 ; N Lcaron ; B 76 0 583 718 ;\nC -1 ; WX 834 ; N onehalf ; B 26 -19 794 710 ;\nC -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;\nC -1 ; WX 611 ; N ocircumflex ; B 34 -14 578 750 ;\nC -1 ; WX 611 ; N ntilde ; B 65 0 546 737 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 72 -19 681 936 ;\nC -1 ; WX 667 ; N Eacute ; B 76 0 621 936 ;\nC -1 ; WX 556 ; N emacron ; B 23 -14 528 678 ;\nC -1 ; WX 611 ; N gbreve ; B 40 -217 553 750 ;\nC -1 ; WX 834 ; N onequarter ; B 26 -19 766 710 ;\nC -1 ; WX 667 ; N Scaron ; B 39 -19 629 936 ;\nC -1 ; WX 667 ; N Scommaaccent ; B 39 -228 629 737 ;\nC -1 ; WX 778 ; N Ohungarumlaut ; B 44 -19 734 936 ;\nC -1 ; WX 400 ; N degree ; B 57 426 343 712 ;\nC -1 ; WX 611 ; N ograve ; B 34 -14 578 750 ;\nC -1 ; WX 722 ; N Ccaron ; B 44 -19 684 936 ;\nC -1 ; WX 611 ; N ugrave ; B 66 -14 545 750 ;\nC -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;\nC -1 ; WX 722 ; N Dcaron ; B 76 0 685 936 ;\nC -1 ; WX 389 ; N rcommaaccent ; B 64 -228 373 546 ;\nC -1 ; WX 722 ; N Ntilde ; B 69 0 654 923 ;\nC -1 ; WX 611 ; N otilde ; B 34 -14 578 737 ;\nC -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 677 718 ;\nC -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 583 718 ;\nC -1 ; WX 722 ; N Atilde ; B 20 0 702 923 ;\nC -1 ; WX 722 ; N Aogonek ; B 20 -224 742 718 ;\nC -1 ; WX 722 ; N Aring ; B 20 0 702 962 ;\nC -1 ; WX 778 ; N Otilde ; B 44 -19 734 923 ;\nC -1 ; WX 500 ; N zdotaccent ; B 20 0 480 729 ;\nC -1 ; WX 667 ; N Ecaron ; B 76 0 621 936 ;\nC -1 ; WX 278 ; N Iogonek ; B -11 -228 222 718 ;\nC -1 ; WX 556 ; N kcommaaccent ; B 69 -228 562 718 ;\nC -1 ; WX 584 ; N minus ; B 40 197 544 309 ;\nC -1 ; WX 278 ; N Icircumflex ; B -37 0 316 936 ;\nC -1 ; WX 611 ; N ncaron ; B 65 0 546 750 ;\nC -1 ; WX 333 ; N tcommaaccent ; B 10 -228 309 676 ;\nC -1 ; WX 584 ; N logicalnot ; B 40 108 544 419 ;\nC -1 ; WX 611 ; N odieresis ; B 34 -14 578 729 ;\nC -1 ; WX 611 ; N udieresis ; B 66 -14 545 729 ;\nC -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;\nC -1 ; WX 611 ; N gcommaaccent ; B 40 -217 553 850 ;\nC -1 ; WX 611 ; N eth ; B 34 -14 578 737 ;\nC -1 ; WX 500 ; N zcaron ; B 20 0 480 750 ;\nC -1 ; WX 611 ; N ncommaaccent ; B 65 -228 546 546 ;\nC -1 ; WX 333 ; N onesuperior ; B 26 283 237 710 ;\nC -1 ; WX 278 ; N imacron ; B -8 0 285 678 ;\nC -1 ; WX 556 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 2481\nKPX A C -40\nKPX A Cacute -40\nKPX A Ccaron -40\nKPX A Ccedilla -40\nKPX A G -50\nKPX A Gbreve -50\nKPX A Gcommaaccent -50\nKPX A O -40\nKPX A Oacute -40\nKPX A Ocircumflex -40\nKPX A Odieresis -40\nKPX A Ograve -40\nKPX A Ohungarumlaut -40\nKPX A Omacron -40\nKPX A Oslash -40\nKPX A Otilde -40\nKPX A Q -40\nKPX A T -90\nKPX A Tcaron -90\nKPX A Tcommaaccent -90\nKPX A U -50\nKPX A Uacute -50\nKPX A Ucircumflex -50\nKPX A Udieresis -50\nKPX A Ugrave -50\nKPX A Uhungarumlaut -50\nKPX A Umacron -50\nKPX A Uogonek -50\nKPX A Uring -50\nKPX A V -80\nKPX A W -60\nKPX A Y -110\nKPX A Yacute -110\nKPX A Ydieresis -110\nKPX A u -30\nKPX A uacute -30\nKPX A ucircumflex -30\nKPX A udieresis -30\nKPX A ugrave -30\nKPX A uhungarumlaut -30\nKPX A umacron -30\nKPX A uogonek -30\nKPX A uring -30\nKPX A v -40\nKPX A w -30\nKPX A y -30\nKPX A yacute -30\nKPX A ydieresis -30\nKPX Aacute C -40\nKPX Aacute Cacute -40\nKPX Aacute Ccaron -40\nKPX Aacute Ccedilla -40\nKPX Aacute G -50\nKPX Aacute Gbreve -50\nKPX Aacute Gcommaaccent -50\nKPX Aacute O -40\nKPX Aacute Oacute -40\nKPX Aacute Ocircumflex -40\nKPX Aacute Odieresis -40\nKPX Aacute Ograve -40\nKPX Aacute Ohungarumlaut -40\nKPX Aacute Omacron -40\nKPX Aacute Oslash -40\nKPX Aacute Otilde -40\nKPX Aacute Q -40\nKPX Aacute T -90\nKPX Aacute Tcaron -90\nKPX Aacute Tcommaaccent -90\nKPX Aacute U -50\nKPX Aacute Uacute -50\nKPX Aacute Ucircumflex -50\nKPX Aacute Udieresis -50\nKPX Aacute Ugrave -50\nKPX Aacute Uhungarumlaut -50\nKPX Aacute Umacron -50\nKPX Aacute Uogonek -50\nKPX Aacute Uring -50\nKPX Aacute V -80\nKPX Aacute W -60\nKPX Aacute Y -110\nKPX Aacute Yacute -110\nKPX Aacute Ydieresis -110\nKPX Aacute u -30\nKPX Aacute uacute -30\nKPX Aacute ucircumflex -30\nKPX Aacute udieresis -30\nKPX Aacute ugrave -30\nKPX Aacute uhungarumlaut -30\nKPX Aacute umacron -30\nKPX Aacute uogonek -30\nKPX Aacute uring -30\nKPX Aacute v -40\nKPX Aacute w -30\nKPX Aacute y -30\nKPX Aacute yacute -30\nKPX Aacute ydieresis -30\nKPX Abreve C -40\nKPX Abreve Cacute -40\nKPX Abreve Ccaron -40\nKPX Abreve Ccedilla -40\nKPX Abreve G -50\nKPX Abreve Gbreve -50\nKPX Abreve Gcommaaccent -50\nKPX Abreve O -40\nKPX Abreve Oacute -40\nKPX Abreve Ocircumflex -40\nKPX Abreve Odieresis -40\nKPX Abreve Ograve -40\nKPX Abreve Ohungarumlaut -40\nKPX Abreve Omacron -40\nKPX Abreve Oslash -40\nKPX Abreve Otilde -40\nKPX Abreve Q -40\nKPX Abreve T -90\nKPX Abreve Tcaron -90\nKPX Abreve Tcommaaccent -90\nKPX Abreve U -50\nKPX Abreve Uacute -50\nKPX Abreve Ucircumflex -50\nKPX Abreve Udieresis -50\nKPX Abreve Ugrave -50\nKPX Abreve Uhungarumlaut -50\nKPX Abreve Umacron -50\nKPX Abreve Uogonek -50\nKPX Abreve Uring -50\nKPX Abreve V -80\nKPX Abreve W -60\nKPX Abreve Y -110\nKPX Abreve Yacute -110\nKPX Abreve Ydieresis -110\nKPX Abreve u -30\nKPX Abreve uacute -30\nKPX Abreve ucircumflex -30\nKPX Abreve udieresis -30\nKPX Abreve ugrave -30\nKPX Abreve uhungarumlaut -30\nKPX Abreve umacron -30\nKPX Abreve uogonek -30\nKPX Abreve uring -30\nKPX Abreve v -40\nKPX Abreve w -30\nKPX Abreve y -30\nKPX Abreve yacute -30\nKPX Abreve ydieresis -30\nKPX Acircumflex C -40\nKPX Acircumflex Cacute -40\nKPX Acircumflex Ccaron -40\nKPX Acircumflex Ccedilla -40\nKPX Acircumflex G -50\nKPX Acircumflex Gbreve -50\nKPX Acircumflex Gcommaaccent -50\nKPX Acircumflex O -40\nKPX Acircumflex Oacute -40\nKPX Acircumflex Ocircumflex -40\nKPX Acircumflex Odieresis -40\nKPX Acircumflex Ograve -40\nKPX Acircumflex Ohungarumlaut -40\nKPX Acircumflex Omacron -40\nKPX Acircumflex Oslash -40\nKPX Acircumflex Otilde -40\nKPX Acircumflex Q -40\nKPX Acircumflex T -90\nKPX Acircumflex Tcaron -90\nKPX Acircumflex Tcommaaccent -90\nKPX Acircumflex U -50\nKPX Acircumflex Uacute -50\nKPX Acircumflex Ucircumflex -50\nKPX Acircumflex Udieresis -50\nKPX Acircumflex Ugrave -50\nKPX Acircumflex Uhungarumlaut -50\nKPX Acircumflex Umacron -50\nKPX Acircumflex Uogonek -50\nKPX Acircumflex Uring -50\nKPX Acircumflex V -80\nKPX Acircumflex W -60\nKPX Acircumflex Y -110\nKPX Acircumflex Yacute -110\nKPX Acircumflex Ydieresis -110\nKPX Acircumflex u -30\nKPX Acircumflex uacute -30\nKPX Acircumflex ucircumflex -30\nKPX Acircumflex udieresis -30\nKPX Acircumflex ugrave -30\nKPX Acircumflex uhungarumlaut -30\nKPX Acircumflex umacron -30\nKPX Acircumflex uogonek -30\nKPX Acircumflex uring -30\nKPX Acircumflex v -40\nKPX Acircumflex w -30\nKPX Acircumflex y -30\nKPX Acircumflex yacute -30\nKPX Acircumflex ydieresis -30\nKPX Adieresis C -40\nKPX Adieresis Cacute -40\nKPX Adieresis Ccaron -40\nKPX Adieresis Ccedilla -40\nKPX Adieresis G -50\nKPX Adieresis Gbreve -50\nKPX Adieresis Gcommaaccent -50\nKPX Adieresis O -40\nKPX Adieresis Oacute -40\nKPX Adieresis Ocircumflex -40\nKPX Adieresis Odieresis -40\nKPX Adieresis Ograve -40\nKPX Adieresis Ohungarumlaut -40\nKPX Adieresis Omacron -40\nKPX Adieresis Oslash -40\nKPX Adieresis Otilde -40\nKPX Adieresis Q -40\nKPX Adieresis T -90\nKPX Adieresis Tcaron -90\nKPX Adieresis Tcommaaccent -90\nKPX Adieresis U -50\nKPX Adieresis Uacute -50\nKPX Adieresis Ucircumflex -50\nKPX Adieresis Udieresis -50\nKPX Adieresis Ugrave -50\nKPX Adieresis Uhungarumlaut -50\nKPX Adieresis Umacron -50\nKPX Adieresis Uogonek -50\nKPX Adieresis Uring -50\nKPX Adieresis V -80\nKPX Adieresis W -60\nKPX Adieresis Y -110\nKPX Adieresis Yacute -110\nKPX Adieresis Ydieresis -110\nKPX Adieresis u -30\nKPX Adieresis uacute -30\nKPX Adieresis ucircumflex -30\nKPX Adieresis udieresis -30\nKPX Adieresis ugrave -30\nKPX Adieresis uhungarumlaut -30\nKPX Adieresis umacron -30\nKPX Adieresis uogonek -30\nKPX Adieresis uring -30\nKPX Adieresis v -40\nKPX Adieresis w -30\nKPX Adieresis y -30\nKPX Adieresis yacute -30\nKPX Adieresis ydieresis -30\nKPX Agrave C -40\nKPX Agrave Cacute -40\nKPX Agrave Ccaron -40\nKPX Agrave Ccedilla -40\nKPX Agrave G -50\nKPX Agrave Gbreve -50\nKPX Agrave Gcommaaccent -50\nKPX Agrave O -40\nKPX Agrave Oacute -40\nKPX Agrave Ocircumflex -40\nKPX Agrave Odieresis -40\nKPX Agrave Ograve -40\nKPX Agrave Ohungarumlaut -40\nKPX Agrave Omacron -40\nKPX Agrave Oslash -40\nKPX Agrave Otilde -40\nKPX Agrave Q -40\nKPX Agrave T -90\nKPX Agrave Tcaron -90\nKPX Agrave Tcommaaccent -90\nKPX Agrave U -50\nKPX Agrave Uacute -50\nKPX Agrave Ucircumflex -50\nKPX Agrave Udieresis -50\nKPX Agrave Ugrave -50\nKPX Agrave Uhungarumlaut -50\nKPX Agrave Umacron -50\nKPX Agrave Uogonek -50\nKPX Agrave Uring -50\nKPX Agrave V -80\nKPX Agrave W -60\nKPX Agrave Y -110\nKPX Agrave Yacute -110\nKPX Agrave Ydieresis -110\nKPX Agrave u -30\nKPX Agrave uacute -30\nKPX Agrave ucircumflex -30\nKPX Agrave udieresis -30\nKPX Agrave ugrave -30\nKPX Agrave uhungarumlaut -30\nKPX Agrave umacron -30\nKPX Agrave uogonek -30\nKPX Agrave uring -30\nKPX Agrave v -40\nKPX Agrave w -30\nKPX Agrave y -30\nKPX Agrave yacute -30\nKPX Agrave ydieresis -30\nKPX Amacron C -40\nKPX Amacron Cacute -40\nKPX Amacron Ccaron -40\nKPX Amacron Ccedilla -40\nKPX Amacron G -50\nKPX Amacron Gbreve -50\nKPX Amacron Gcommaaccent -50\nKPX Amacron O -40\nKPX Amacron Oacute -40\nKPX Amacron Ocircumflex -40\nKPX Amacron Odieresis -40\nKPX Amacron Ograve -40\nKPX Amacron Ohungarumlaut -40\nKPX Amacron Omacron -40\nKPX Amacron Oslash -40\nKPX Amacron Otilde -40\nKPX Amacron Q -40\nKPX Amacron T -90\nKPX Amacron Tcaron -90\nKPX Amacron Tcommaaccent -90\nKPX Amacron U -50\nKPX Amacron Uacute -50\nKPX Amacron Ucircumflex -50\nKPX Amacron Udieresis -50\nKPX Amacron Ugrave -50\nKPX Amacron Uhungarumlaut -50\nKPX Amacron Umacron -50\nKPX Amacron Uogonek -50\nKPX Amacron Uring -50\nKPX Amacron V -80\nKPX Amacron W -60\nKPX Amacron Y -110\nKPX Amacron Yacute -110\nKPX Amacron Ydieresis -110\nKPX Amacron u -30\nKPX Amacron uacute -30\nKPX Amacron ucircumflex -30\nKPX Amacron udieresis -30\nKPX Amacron ugrave -30\nKPX Amacron uhungarumlaut -30\nKPX Amacron umacron -30\nKPX Amacron uogonek -30\nKPX Amacron uring -30\nKPX Amacron v -40\nKPX Amacron w -30\nKPX Amacron y -30\nKPX Amacron yacute -30\nKPX Amacron ydieresis -30\nKPX Aogonek C -40\nKPX Aogonek Cacute -40\nKPX Aogonek Ccaron -40\nKPX Aogonek Ccedilla -40\nKPX Aogonek G -50\nKPX Aogonek Gbreve -50\nKPX Aogonek Gcommaaccent -50\nKPX Aogonek O -40\nKPX Aogonek Oacute -40\nKPX Aogonek Ocircumflex -40\nKPX Aogonek Odieresis -40\nKPX Aogonek Ograve -40\nKPX Aogonek Ohungarumlaut -40\nKPX Aogonek Omacron -40\nKPX Aogonek Oslash -40\nKPX Aogonek Otilde -40\nKPX Aogonek Q -40\nKPX Aogonek T -90\nKPX Aogonek Tcaron -90\nKPX Aogonek Tcommaaccent -90\nKPX Aogonek U -50\nKPX Aogonek Uacute -50\nKPX Aogonek Ucircumflex -50\nKPX Aogonek Udieresis -50\nKPX Aogonek Ugrave -50\nKPX Aogonek Uhungarumlaut -50\nKPX Aogonek Umacron -50\nKPX Aogonek Uogonek -50\nKPX Aogonek Uring -50\nKPX Aogonek V -80\nKPX Aogonek W -60\nKPX Aogonek Y -110\nKPX Aogonek Yacute -110\nKPX Aogonek Ydieresis -110\nKPX Aogonek u -30\nKPX Aogonek uacute -30\nKPX Aogonek ucircumflex -30\nKPX Aogonek udieresis -30\nKPX Aogonek ugrave -30\nKPX Aogonek uhungarumlaut -30\nKPX Aogonek umacron -30\nKPX Aogonek uogonek -30\nKPX Aogonek uring -30\nKPX Aogonek v -40\nKPX Aogonek w -30\nKPX Aogonek y -30\nKPX Aogonek yacute -30\nKPX Aogonek ydieresis -30\nKPX Aring C -40\nKPX Aring Cacute -40\nKPX Aring Ccaron -40\nKPX Aring Ccedilla -40\nKPX Aring G -50\nKPX Aring Gbreve -50\nKPX Aring Gcommaaccent -50\nKPX Aring O -40\nKPX Aring Oacute -40\nKPX Aring Ocircumflex -40\nKPX Aring Odieresis -40\nKPX Aring Ograve -40\nKPX Aring Ohungarumlaut -40\nKPX Aring Omacron -40\nKPX Aring Oslash -40\nKPX Aring Otilde -40\nKPX Aring Q -40\nKPX Aring T -90\nKPX Aring Tcaron -90\nKPX Aring Tcommaaccent -90\nKPX Aring U -50\nKPX Aring Uacute -50\nKPX Aring Ucircumflex -50\nKPX Aring Udieresis -50\nKPX Aring Ugrave -50\nKPX Aring Uhungarumlaut -50\nKPX Aring Umacron -50\nKPX Aring Uogonek -50\nKPX Aring Uring -50\nKPX Aring V -80\nKPX Aring W -60\nKPX Aring Y -110\nKPX Aring Yacute -110\nKPX Aring Ydieresis -110\nKPX Aring u -30\nKPX Aring uacute -30\nKPX Aring ucircumflex -30\nKPX Aring udieresis -30\nKPX Aring ugrave -30\nKPX Aring uhungarumlaut -30\nKPX Aring umacron -30\nKPX Aring uogonek -30\nKPX Aring uring -30\nKPX Aring v -40\nKPX Aring w -30\nKPX Aring y -30\nKPX Aring yacute -30\nKPX Aring ydieresis -30\nKPX Atilde C -40\nKPX Atilde Cacute -40\nKPX Atilde Ccaron -40\nKPX Atilde Ccedilla -40\nKPX Atilde G -50\nKPX Atilde Gbreve -50\nKPX Atilde Gcommaaccent -50\nKPX Atilde O -40\nKPX Atilde Oacute -40\nKPX Atilde Ocircumflex -40\nKPX Atilde Odieresis -40\nKPX Atilde Ograve -40\nKPX Atilde Ohungarumlaut -40\nKPX Atilde Omacron -40\nKPX Atilde Oslash -40\nKPX Atilde Otilde -40\nKPX Atilde Q -40\nKPX Atilde T -90\nKPX Atilde Tcaron -90\nKPX Atilde Tcommaaccent -90\nKPX Atilde U -50\nKPX Atilde Uacute -50\nKPX Atilde Ucircumflex -50\nKPX Atilde Udieresis -50\nKPX Atilde Ugrave -50\nKPX Atilde Uhungarumlaut -50\nKPX Atilde Umacron -50\nKPX Atilde Uogonek -50\nKPX Atilde Uring -50\nKPX Atilde V -80\nKPX Atilde W -60\nKPX Atilde Y -110\nKPX Atilde Yacute -110\nKPX Atilde Ydieresis -110\nKPX Atilde u -30\nKPX Atilde uacute -30\nKPX Atilde ucircumflex -30\nKPX Atilde udieresis -30\nKPX Atilde ugrave -30\nKPX Atilde uhungarumlaut -30\nKPX Atilde umacron -30\nKPX Atilde uogonek -30\nKPX Atilde uring -30\nKPX Atilde v -40\nKPX Atilde w -30\nKPX Atilde y -30\nKPX Atilde yacute -30\nKPX Atilde ydieresis -30\nKPX B A -30\nKPX B Aacute -30\nKPX B Abreve -30\nKPX B Acircumflex -30\nKPX B Adieresis -30\nKPX B Agrave -30\nKPX B Amacron -30\nKPX B Aogonek -30\nKPX B Aring -30\nKPX B Atilde -30\nKPX B U -10\nKPX B Uacute -10\nKPX B Ucircumflex -10\nKPX B Udieresis -10\nKPX B Ugrave -10\nKPX B Uhungarumlaut -10\nKPX B Umacron -10\nKPX B Uogonek -10\nKPX B Uring -10\nKPX D A -40\nKPX D Aacute -40\nKPX D Abreve -40\nKPX D Acircumflex -40\nKPX D Adieresis -40\nKPX D Agrave -40\nKPX D Amacron -40\nKPX D Aogonek -40\nKPX D Aring -40\nKPX D Atilde -40\nKPX D V -40\nKPX D W -40\nKPX D Y -70\nKPX D Yacute -70\nKPX D Ydieresis -70\nKPX D comma -30\nKPX D period -30\nKPX Dcaron A -40\nKPX Dcaron Aacute -40\nKPX Dcaron Abreve -40\nKPX Dcaron Acircumflex -40\nKPX Dcaron Adieresis -40\nKPX Dcaron Agrave -40\nKPX Dcaron Amacron -40\nKPX Dcaron Aogonek -40\nKPX Dcaron Aring -40\nKPX Dcaron Atilde -40\nKPX Dcaron V -40\nKPX Dcaron W -40\nKPX Dcaron Y -70\nKPX Dcaron Yacute -70\nKPX Dcaron Ydieresis -70\nKPX Dcaron comma -30\nKPX Dcaron period -30\nKPX Dcroat A -40\nKPX Dcroat Aacute -40\nKPX Dcroat Abreve -40\nKPX Dcroat Acircumflex -40\nKPX Dcroat Adieresis -40\nKPX Dcroat Agrave -40\nKPX Dcroat Amacron -40\nKPX Dcroat Aogonek -40\nKPX Dcroat Aring -40\nKPX Dcroat Atilde -40\nKPX Dcroat V -40\nKPX Dcroat W -40\nKPX Dcroat Y -70\nKPX Dcroat Yacute -70\nKPX Dcroat Ydieresis -70\nKPX Dcroat comma -30\nKPX Dcroat period -30\nKPX F A -80\nKPX F Aacute -80\nKPX F Abreve -80\nKPX F Acircumflex -80\nKPX F Adieresis -80\nKPX F Agrave -80\nKPX F Amacron -80\nKPX F Aogonek -80\nKPX F Aring -80\nKPX F Atilde -80\nKPX F a -20\nKPX F aacute -20\nKPX F abreve -20\nKPX F acircumflex -20\nKPX F adieresis -20\nKPX F agrave -20\nKPX F amacron -20\nKPX F aogonek -20\nKPX F aring -20\nKPX F atilde -20\nKPX F comma -100\nKPX F period -100\nKPX J A -20\nKPX J Aacute -20\nKPX J Abreve -20\nKPX J Acircumflex -20\nKPX J Adieresis -20\nKPX J Agrave -20\nKPX J Amacron -20\nKPX J Aogonek -20\nKPX J Aring -20\nKPX J Atilde -20\nKPX J comma -20\nKPX J period -20\nKPX J u -20\nKPX J uacute -20\nKPX J ucircumflex -20\nKPX J udieresis -20\nKPX J ugrave -20\nKPX J uhungarumlaut -20\nKPX J umacron -20\nKPX J uogonek -20\nKPX J uring -20\nKPX K O -30\nKPX K Oacute -30\nKPX K Ocircumflex -30\nKPX K Odieresis -30\nKPX K Ograve -30\nKPX K Ohungarumlaut -30\nKPX K Omacron -30\nKPX K Oslash -30\nKPX K Otilde -30\nKPX K e -15\nKPX K eacute -15\nKPX K ecaron -15\nKPX K ecircumflex -15\nKPX K edieresis -15\nKPX K edotaccent -15\nKPX K egrave -15\nKPX K emacron -15\nKPX K eogonek -15\nKPX K o -35\nKPX K oacute -35\nKPX K ocircumflex -35\nKPX K odieresis -35\nKPX K ograve -35\nKPX K ohungarumlaut -35\nKPX K omacron -35\nKPX K oslash -35\nKPX K otilde -35\nKPX K u -30\nKPX K uacute -30\nKPX K ucircumflex -30\nKPX K udieresis -30\nKPX K ugrave -30\nKPX K uhungarumlaut -30\nKPX K umacron -30\nKPX K uogonek -30\nKPX K uring -30\nKPX K y -40\nKPX K yacute -40\nKPX K ydieresis -40\nKPX Kcommaaccent O -30\nKPX Kcommaaccent Oacute -30\nKPX Kcommaaccent Ocircumflex -30\nKPX Kcommaaccent Odieresis -30\nKPX Kcommaaccent Ograve -30\nKPX Kcommaaccent Ohungarumlaut -30\nKPX Kcommaaccent Omacron -30\nKPX Kcommaaccent Oslash -30\nKPX Kcommaaccent Otilde -30\nKPX Kcommaaccent e -15\nKPX Kcommaaccent eacute -15\nKPX Kcommaaccent ecaron -15\nKPX Kcommaaccent ecircumflex -15\nKPX Kcommaaccent edieresis -15\nKPX Kcommaaccent edotaccent -15\nKPX Kcommaaccent egrave -15\nKPX Kcommaaccent emacron -15\nKPX Kcommaaccent eogonek -15\nKPX Kcommaaccent o -35\nKPX Kcommaaccent oacute -35\nKPX Kcommaaccent ocircumflex -35\nKPX Kcommaaccent odieresis -35\nKPX Kcommaaccent ograve -35\nKPX Kcommaaccent ohungarumlaut -35\nKPX Kcommaaccent omacron -35\nKPX Kcommaaccent oslash -35\nKPX Kcommaaccent otilde -35\nKPX Kcommaaccent u -30\nKPX Kcommaaccent uacute -30\nKPX Kcommaaccent ucircumflex -30\nKPX Kcommaaccent udieresis -30\nKPX Kcommaaccent ugrave -30\nKPX Kcommaaccent uhungarumlaut -30\nKPX Kcommaaccent umacron -30\nKPX Kcommaaccent uogonek -30\nKPX Kcommaaccent uring -30\nKPX Kcommaaccent y -40\nKPX Kcommaaccent yacute -40\nKPX Kcommaaccent ydieresis -40\nKPX L T -90\nKPX L Tcaron -90\nKPX L Tcommaaccent -90\nKPX L V -110\nKPX L W -80\nKPX L Y -120\nKPX L Yacute -120\nKPX L Ydieresis -120\nKPX L quotedblright -140\nKPX L quoteright -140\nKPX L y -30\nKPX L yacute -30\nKPX L ydieresis -30\nKPX Lacute T -90\nKPX Lacute Tcaron -90\nKPX Lacute Tcommaaccent -90\nKPX Lacute V -110\nKPX Lacute W -80\nKPX Lacute Y -120\nKPX Lacute Yacute -120\nKPX Lacute Ydieresis -120\nKPX Lacute quotedblright -140\nKPX Lacute quoteright -140\nKPX Lacute y -30\nKPX Lacute yacute -30\nKPX Lacute ydieresis -30\nKPX Lcommaaccent T -90\nKPX Lcommaaccent Tcaron -90\nKPX Lcommaaccent Tcommaaccent -90\nKPX Lcommaaccent V -110\nKPX Lcommaaccent W -80\nKPX Lcommaaccent Y -120\nKPX Lcommaaccent Yacute -120\nKPX Lcommaaccent Ydieresis -120\nKPX Lcommaaccent quotedblright -140\nKPX Lcommaaccent quoteright -140\nKPX Lcommaaccent y -30\nKPX Lcommaaccent yacute -30\nKPX Lcommaaccent ydieresis -30\nKPX Lslash T -90\nKPX Lslash Tcaron -90\nKPX Lslash Tcommaaccent -90\nKPX Lslash V -110\nKPX Lslash W -80\nKPX Lslash Y -120\nKPX Lslash Yacute -120\nKPX Lslash Ydieresis -120\nKPX Lslash quotedblright -140\nKPX Lslash quoteright -140\nKPX Lslash y -30\nKPX Lslash yacute -30\nKPX Lslash ydieresis -30\nKPX O A -50\nKPX O Aacute -50\nKPX O Abreve -50\nKPX O Acircumflex -50\nKPX O Adieresis -50\nKPX O Agrave -50\nKPX O Amacron -50\nKPX O Aogonek -50\nKPX O Aring -50\nKPX O Atilde -50\nKPX O T -40\nKPX O Tcaron -40\nKPX O Tcommaaccent -40\nKPX O V -50\nKPX O W -50\nKPX O X -50\nKPX O Y -70\nKPX O Yacute -70\nKPX O Ydieresis -70\nKPX O comma -40\nKPX O period -40\nKPX Oacute A -50\nKPX Oacute Aacute -50\nKPX Oacute Abreve -50\nKPX Oacute Acircumflex -50\nKPX Oacute Adieresis -50\nKPX Oacute Agrave -50\nKPX Oacute Amacron -50\nKPX Oacute Aogonek -50\nKPX Oacute Aring -50\nKPX Oacute Atilde -50\nKPX Oacute T -40\nKPX Oacute Tcaron -40\nKPX Oacute Tcommaaccent -40\nKPX Oacute V -50\nKPX Oacute W -50\nKPX Oacute X -50\nKPX Oacute Y -70\nKPX Oacute Yacute -70\nKPX Oacute Ydieresis -70\nKPX Oacute comma -40\nKPX Oacute period -40\nKPX Ocircumflex A -50\nKPX Ocircumflex Aacute -50\nKPX Ocircumflex Abreve -50\nKPX Ocircumflex Acircumflex -50\nKPX Ocircumflex Adieresis -50\nKPX Ocircumflex Agrave -50\nKPX Ocircumflex Amacron -50\nKPX Ocircumflex Aogonek -50\nKPX Ocircumflex Aring -50\nKPX Ocircumflex Atilde -50\nKPX Ocircumflex T -40\nKPX Ocircumflex Tcaron -40\nKPX Ocircumflex Tcommaaccent -40\nKPX Ocircumflex V -50\nKPX Ocircumflex W -50\nKPX Ocircumflex X -50\nKPX Ocircumflex Y -70\nKPX Ocircumflex Yacute -70\nKPX Ocircumflex Ydieresis -70\nKPX Ocircumflex comma -40\nKPX Ocircumflex period -40\nKPX Odieresis A -50\nKPX Odieresis Aacute -50\nKPX Odieresis Abreve -50\nKPX Odieresis Acircumflex -50\nKPX Odieresis Adieresis -50\nKPX Odieresis Agrave -50\nKPX Odieresis Amacron -50\nKPX Odieresis Aogonek -50\nKPX Odieresis Aring -50\nKPX Odieresis Atilde -50\nKPX Odieresis T -40\nKPX Odieresis Tcaron -40\nKPX Odieresis Tcommaaccent -40\nKPX Odieresis V -50\nKPX Odieresis W -50\nKPX Odieresis X -50\nKPX Odieresis Y -70\nKPX Odieresis Yacute -70\nKPX Odieresis Ydieresis -70\nKPX Odieresis comma -40\nKPX Odieresis period -40\nKPX Ograve A -50\nKPX Ograve Aacute -50\nKPX Ograve Abreve -50\nKPX Ograve Acircumflex -50\nKPX Ograve Adieresis -50\nKPX Ograve Agrave -50\nKPX Ograve Amacron -50\nKPX Ograve Aogonek -50\nKPX Ograve Aring -50\nKPX Ograve Atilde -50\nKPX Ograve T -40\nKPX Ograve Tcaron -40\nKPX Ograve Tcommaaccent -40\nKPX Ograve V -50\nKPX Ograve W -50\nKPX Ograve X -50\nKPX Ograve Y -70\nKPX Ograve Yacute -70\nKPX Ograve Ydieresis -70\nKPX Ograve comma -40\nKPX Ograve period -40\nKPX Ohungarumlaut A -50\nKPX Ohungarumlaut Aacute -50\nKPX Ohungarumlaut Abreve -50\nKPX Ohungarumlaut Acircumflex -50\nKPX Ohungarumlaut Adieresis -50\nKPX Ohungarumlaut Agrave -50\nKPX Ohungarumlaut Amacron -50\nKPX Ohungarumlaut Aogonek -50\nKPX Ohungarumlaut Aring -50\nKPX Ohungarumlaut Atilde -50\nKPX Ohungarumlaut T -40\nKPX Ohungarumlaut Tcaron -40\nKPX Ohungarumlaut Tcommaaccent -40\nKPX Ohungarumlaut V -50\nKPX Ohungarumlaut W -50\nKPX Ohungarumlaut X -50\nKPX Ohungarumlaut Y -70\nKPX Ohungarumlaut Yacute -70\nKPX Ohungarumlaut Ydieresis -70\nKPX Ohungarumlaut comma -40\nKPX Ohungarumlaut period -40\nKPX Omacron A -50\nKPX Omacron Aacute -50\nKPX Omacron Abreve -50\nKPX Omacron Acircumflex -50\nKPX Omacron Adieresis -50\nKPX Omacron Agrave -50\nKPX Omacron Amacron -50\nKPX Omacron Aogonek -50\nKPX Omacron Aring -50\nKPX Omacron Atilde -50\nKPX Omacron T -40\nKPX Omacron Tcaron -40\nKPX Omacron Tcommaaccent -40\nKPX Omacron V -50\nKPX Omacron W -50\nKPX Omacron X -50\nKPX Omacron Y -70\nKPX Omacron Yacute -70\nKPX Omacron Ydieresis -70\nKPX Omacron comma -40\nKPX Omacron period -40\nKPX Oslash A -50\nKPX Oslash Aacute -50\nKPX Oslash Abreve -50\nKPX Oslash Acircumflex -50\nKPX Oslash Adieresis -50\nKPX Oslash Agrave -50\nKPX Oslash Amacron -50\nKPX Oslash Aogonek -50\nKPX Oslash Aring -50\nKPX Oslash Atilde -50\nKPX Oslash T -40\nKPX Oslash Tcaron -40\nKPX Oslash Tcommaaccent -40\nKPX Oslash V -50\nKPX Oslash W -50\nKPX Oslash X -50\nKPX Oslash Y -70\nKPX Oslash Yacute -70\nKPX Oslash Ydieresis -70\nKPX Oslash comma -40\nKPX Oslash period -40\nKPX Otilde A -50\nKPX Otilde Aacute -50\nKPX Otilde Abreve -50\nKPX Otilde Acircumflex -50\nKPX Otilde Adieresis -50\nKPX Otilde Agrave -50\nKPX Otilde Amacron -50\nKPX Otilde Aogonek -50\nKPX Otilde Aring -50\nKPX Otilde Atilde -50\nKPX Otilde T -40\nKPX Otilde Tcaron -40\nKPX Otilde Tcommaaccent -40\nKPX Otilde V -50\nKPX Otilde W -50\nKPX Otilde X -50\nKPX Otilde Y -70\nKPX Otilde Yacute -70\nKPX Otilde Ydieresis -70\nKPX Otilde comma -40\nKPX Otilde period -40\nKPX P A -100\nKPX P Aacute -100\nKPX P Abreve -100\nKPX P Acircumflex -100\nKPX P Adieresis -100\nKPX P Agrave -100\nKPX P Amacron -100\nKPX P Aogonek -100\nKPX P Aring -100\nKPX P Atilde -100\nKPX P a -30\nKPX P aacute -30\nKPX P abreve -30\nKPX P acircumflex -30\nKPX P adieresis -30\nKPX P agrave -30\nKPX P amacron -30\nKPX P aogonek -30\nKPX P aring -30\nKPX P atilde -30\nKPX P comma -120\nKPX P e -30\nKPX P eacute -30\nKPX P ecaron -30\nKPX P ecircumflex -30\nKPX P edieresis -30\nKPX P edotaccent -30\nKPX P egrave -30\nKPX P emacron -30\nKPX P eogonek -30\nKPX P o -40\nKPX P oacute -40\nKPX P ocircumflex -40\nKPX P odieresis -40\nKPX P ograve -40\nKPX P ohungarumlaut -40\nKPX P omacron -40\nKPX P oslash -40\nKPX P otilde -40\nKPX P period -120\nKPX Q U -10\nKPX Q Uacute -10\nKPX Q Ucircumflex -10\nKPX Q Udieresis -10\nKPX Q Ugrave -10\nKPX Q Uhungarumlaut -10\nKPX Q Umacron -10\nKPX Q Uogonek -10\nKPX Q Uring -10\nKPX Q comma 20\nKPX Q period 20\nKPX R O -20\nKPX R Oacute -20\nKPX R Ocircumflex -20\nKPX R Odieresis -20\nKPX R Ograve -20\nKPX R Ohungarumlaut -20\nKPX R Omacron -20\nKPX R Oslash -20\nKPX R Otilde -20\nKPX R T -20\nKPX R Tcaron -20\nKPX R Tcommaaccent -20\nKPX R U -20\nKPX R Uacute -20\nKPX R Ucircumflex -20\nKPX R Udieresis -20\nKPX R Ugrave -20\nKPX R Uhungarumlaut -20\nKPX R Umacron -20\nKPX R Uogonek -20\nKPX R Uring -20\nKPX R V -50\nKPX R W -40\nKPX R Y -50\nKPX R Yacute -50\nKPX R Ydieresis -50\nKPX Racute O -20\nKPX Racute Oacute -20\nKPX Racute Ocircumflex -20\nKPX Racute Odieresis -20\nKPX Racute Ograve -20\nKPX Racute Ohungarumlaut -20\nKPX Racute Omacron -20\nKPX Racute Oslash -20\nKPX Racute Otilde -20\nKPX Racute T -20\nKPX Racute Tcaron -20\nKPX Racute Tcommaaccent -20\nKPX Racute U -20\nKPX Racute Uacute -20\nKPX Racute Ucircumflex -20\nKPX Racute Udieresis -20\nKPX Racute Ugrave -20\nKPX Racute Uhungarumlaut -20\nKPX Racute Umacron -20\nKPX Racute Uogonek -20\nKPX Racute Uring -20\nKPX Racute V -50\nKPX Racute W -40\nKPX Racute Y -50\nKPX Racute Yacute -50\nKPX Racute Ydieresis -50\nKPX Rcaron O -20\nKPX Rcaron Oacute -20\nKPX Rcaron Ocircumflex -20\nKPX Rcaron Odieresis -20\nKPX Rcaron Ograve -20\nKPX Rcaron Ohungarumlaut -20\nKPX Rcaron Omacron -20\nKPX Rcaron Oslash -20\nKPX Rcaron Otilde -20\nKPX Rcaron T -20\nKPX Rcaron Tcaron -20\nKPX Rcaron Tcommaaccent -20\nKPX Rcaron U -20\nKPX Rcaron Uacute -20\nKPX Rcaron Ucircumflex -20\nKPX Rcaron Udieresis -20\nKPX Rcaron Ugrave -20\nKPX Rcaron Uhungarumlaut -20\nKPX Rcaron Umacron -20\nKPX Rcaron Uogonek -20\nKPX Rcaron Uring -20\nKPX Rcaron V -50\nKPX Rcaron W -40\nKPX Rcaron Y -50\nKPX Rcaron Yacute -50\nKPX Rcaron Ydieresis -50\nKPX Rcommaaccent O -20\nKPX Rcommaaccent Oacute -20\nKPX Rcommaaccent Ocircumflex -20\nKPX Rcommaaccent Odieresis -20\nKPX Rcommaaccent Ograve -20\nKPX Rcommaaccent Ohungarumlaut -20\nKPX Rcommaaccent Omacron -20\nKPX Rcommaaccent Oslash -20\nKPX Rcommaaccent Otilde -20\nKPX Rcommaaccent T -20\nKPX Rcommaaccent Tcaron -20\nKPX Rcommaaccent Tcommaaccent -20\nKPX Rcommaaccent U -20\nKPX Rcommaaccent Uacute -20\nKPX Rcommaaccent Ucircumflex -20\nKPX Rcommaaccent Udieresis -20\nKPX Rcommaaccent Ugrave -20\nKPX Rcommaaccent Uhungarumlaut -20\nKPX Rcommaaccent Umacron -20\nKPX Rcommaaccent Uogonek -20\nKPX Rcommaaccent Uring -20\nKPX Rcommaaccent V -50\nKPX Rcommaaccent W -40\nKPX Rcommaaccent Y -50\nKPX Rcommaaccent Yacute -50\nKPX Rcommaaccent Ydieresis -50\nKPX T A -90\nKPX T Aacute -90\nKPX T Abreve -90\nKPX T Acircumflex -90\nKPX T Adieresis -90\nKPX T Agrave -90\nKPX T Amacron -90\nKPX T Aogonek -90\nKPX T Aring -90\nKPX T Atilde -90\nKPX T O -40\nKPX T Oacute -40\nKPX T Ocircumflex -40\nKPX T Odieresis -40\nKPX T Ograve -40\nKPX T Ohungarumlaut -40\nKPX T Omacron -40\nKPX T Oslash -40\nKPX T Otilde -40\nKPX T a -80\nKPX T aacute -80\nKPX T abreve -80\nKPX T acircumflex -80\nKPX T adieresis -80\nKPX T agrave -80\nKPX T amacron -80\nKPX T aogonek -80\nKPX T aring -80\nKPX T atilde -80\nKPX T colon -40\nKPX T comma -80\nKPX T e -60\nKPX T eacute -60\nKPX T ecaron -60\nKPX T ecircumflex -60\nKPX T edieresis -60\nKPX T edotaccent -60\nKPX T egrave -60\nKPX T emacron -60\nKPX T eogonek -60\nKPX T hyphen -120\nKPX T o -80\nKPX T oacute -80\nKPX T ocircumflex -80\nKPX T odieresis -80\nKPX T ograve -80\nKPX T ohungarumlaut -80\nKPX T omacron -80\nKPX T oslash -80\nKPX T otilde -80\nKPX T period -80\nKPX T r -80\nKPX T racute -80\nKPX T rcommaaccent -80\nKPX T semicolon -40\nKPX T u -90\nKPX T uacute -90\nKPX T ucircumflex -90\nKPX T udieresis -90\nKPX T ugrave -90\nKPX T uhungarumlaut -90\nKPX T umacron -90\nKPX T uogonek -90\nKPX T uring -90\nKPX T w -60\nKPX T y -60\nKPX T yacute -60\nKPX T ydieresis -60\nKPX Tcaron A -90\nKPX Tcaron Aacute -90\nKPX Tcaron Abreve -90\nKPX Tcaron Acircumflex -90\nKPX Tcaron Adieresis -90\nKPX Tcaron Agrave -90\nKPX Tcaron Amacron -90\nKPX Tcaron Aogonek -90\nKPX Tcaron Aring -90\nKPX Tcaron Atilde -90\nKPX Tcaron O -40\nKPX Tcaron Oacute -40\nKPX Tcaron Ocircumflex -40\nKPX Tcaron Odieresis -40\nKPX Tcaron Ograve -40\nKPX Tcaron Ohungarumlaut -40\nKPX Tcaron Omacron -40\nKPX Tcaron Oslash -40\nKPX Tcaron Otilde -40\nKPX Tcaron a -80\nKPX Tcaron aacute -80\nKPX Tcaron abreve -80\nKPX Tcaron acircumflex -80\nKPX Tcaron adieresis -80\nKPX Tcaron agrave -80\nKPX Tcaron amacron -80\nKPX Tcaron aogonek -80\nKPX Tcaron aring -80\nKPX Tcaron atilde -80\nKPX Tcaron colon -40\nKPX Tcaron comma -80\nKPX Tcaron e -60\nKPX Tcaron eacute -60\nKPX Tcaron ecaron -60\nKPX Tcaron ecircumflex -60\nKPX Tcaron edieresis -60\nKPX Tcaron edotaccent -60\nKPX Tcaron egrave -60\nKPX Tcaron emacron -60\nKPX Tcaron eogonek -60\nKPX Tcaron hyphen -120\nKPX Tcaron o -80\nKPX Tcaron oacute -80\nKPX Tcaron ocircumflex -80\nKPX Tcaron odieresis -80\nKPX Tcaron ograve -80\nKPX Tcaron ohungarumlaut -80\nKPX Tcaron omacron -80\nKPX Tcaron oslash -80\nKPX Tcaron otilde -80\nKPX Tcaron period -80\nKPX Tcaron r -80\nKPX Tcaron racute -80\nKPX Tcaron rcommaaccent -80\nKPX Tcaron semicolon -40\nKPX Tcaron u -90\nKPX Tcaron uacute -90\nKPX Tcaron ucircumflex -90\nKPX Tcaron udieresis -90\nKPX Tcaron ugrave -90\nKPX Tcaron uhungarumlaut -90\nKPX Tcaron umacron -90\nKPX Tcaron uogonek -90\nKPX Tcaron uring -90\nKPX Tcaron w -60\nKPX Tcaron y -60\nKPX Tcaron yacute -60\nKPX Tcaron ydieresis -60\nKPX Tcommaaccent A -90\nKPX Tcommaaccent Aacute -90\nKPX Tcommaaccent Abreve -90\nKPX Tcommaaccent Acircumflex -90\nKPX Tcommaaccent Adieresis -90\nKPX Tcommaaccent Agrave -90\nKPX Tcommaaccent Amacron -90\nKPX Tcommaaccent Aogonek -90\nKPX Tcommaaccent Aring -90\nKPX Tcommaaccent Atilde -90\nKPX Tcommaaccent O -40\nKPX Tcommaaccent Oacute -40\nKPX Tcommaaccent Ocircumflex -40\nKPX Tcommaaccent Odieresis -40\nKPX Tcommaaccent Ograve -40\nKPX Tcommaaccent Ohungarumlaut -40\nKPX Tcommaaccent Omacron -40\nKPX Tcommaaccent Oslash -40\nKPX Tcommaaccent Otilde -40\nKPX Tcommaaccent a -80\nKPX Tcommaaccent aacute -80\nKPX Tcommaaccent abreve -80\nKPX Tcommaaccent acircumflex -80\nKPX Tcommaaccent adieresis -80\nKPX Tcommaaccent agrave -80\nKPX Tcommaaccent amacron -80\nKPX Tcommaaccent aogonek -80\nKPX Tcommaaccent aring -80\nKPX Tcommaaccent atilde -80\nKPX Tcommaaccent colon -40\nKPX Tcommaaccent comma -80\nKPX Tcommaaccent e -60\nKPX Tcommaaccent eacute -60\nKPX Tcommaaccent ecaron -60\nKPX Tcommaaccent ecircumflex -60\nKPX Tcommaaccent edieresis -60\nKPX Tcommaaccent edotaccent -60\nKPX Tcommaaccent egrave -60\nKPX Tcommaaccent emacron -60\nKPX Tcommaaccent eogonek -60\nKPX Tcommaaccent hyphen -120\nKPX Tcommaaccent o -80\nKPX Tcommaaccent oacute -80\nKPX Tcommaaccent ocircumflex -80\nKPX Tcommaaccent odieresis -80\nKPX Tcommaaccent ograve -80\nKPX Tcommaaccent ohungarumlaut -80\nKPX Tcommaaccent omacron -80\nKPX Tcommaaccent oslash -80\nKPX Tcommaaccent otilde -80\nKPX Tcommaaccent period -80\nKPX Tcommaaccent r -80\nKPX Tcommaaccent racute -80\nKPX Tcommaaccent rcommaaccent -80\nKPX Tcommaaccent semicolon -40\nKPX Tcommaaccent u -90\nKPX Tcommaaccent uacute -90\nKPX Tcommaaccent ucircumflex -90\nKPX Tcommaaccent udieresis -90\nKPX Tcommaaccent ugrave -90\nKPX Tcommaaccent uhungarumlaut -90\nKPX Tcommaaccent umacron -90\nKPX Tcommaaccent uogonek -90\nKPX Tcommaaccent uring -90\nKPX Tcommaaccent w -60\nKPX Tcommaaccent y -60\nKPX Tcommaaccent yacute -60\nKPX Tcommaaccent ydieresis -60\nKPX U A -50\nKPX U Aacute -50\nKPX U Abreve -50\nKPX U Acircumflex -50\nKPX U Adieresis -50\nKPX U Agrave -50\nKPX U Amacron -50\nKPX U Aogonek -50\nKPX U Aring -50\nKPX U Atilde -50\nKPX U comma -30\nKPX U period -30\nKPX Uacute A -50\nKPX Uacute Aacute -50\nKPX Uacute Abreve -50\nKPX Uacute Acircumflex -50\nKPX Uacute Adieresis -50\nKPX Uacute Agrave -50\nKPX Uacute Amacron -50\nKPX Uacute Aogonek -50\nKPX Uacute Aring -50\nKPX Uacute Atilde -50\nKPX Uacute comma -30\nKPX Uacute period -30\nKPX Ucircumflex A -50\nKPX Ucircumflex Aacute -50\nKPX Ucircumflex Abreve -50\nKPX Ucircumflex Acircumflex -50\nKPX Ucircumflex Adieresis -50\nKPX Ucircumflex Agrave -50\nKPX Ucircumflex Amacron -50\nKPX Ucircumflex Aogonek -50\nKPX Ucircumflex Aring -50\nKPX Ucircumflex Atilde -50\nKPX Ucircumflex comma -30\nKPX Ucircumflex period -30\nKPX Udieresis A -50\nKPX Udieresis Aacute -50\nKPX Udieresis Abreve -50\nKPX Udieresis Acircumflex -50\nKPX Udieresis Adieresis -50\nKPX Udieresis Agrave -50\nKPX Udieresis Amacron -50\nKPX Udieresis Aogonek -50\nKPX Udieresis Aring -50\nKPX Udieresis Atilde -50\nKPX Udieresis comma -30\nKPX Udieresis period -30\nKPX Ugrave A -50\nKPX Ugrave Aacute -50\nKPX Ugrave Abreve -50\nKPX Ugrave Acircumflex -50\nKPX Ugrave Adieresis -50\nKPX Ugrave Agrave -50\nKPX Ugrave Amacron -50\nKPX Ugrave Aogonek -50\nKPX Ugrave Aring -50\nKPX Ugrave Atilde -50\nKPX Ugrave comma -30\nKPX Ugrave period -30\nKPX Uhungarumlaut A -50\nKPX Uhungarumlaut Aacute -50\nKPX Uhungarumlaut Abreve -50\nKPX Uhungarumlaut Acircumflex -50\nKPX Uhungarumlaut Adieresis -50\nKPX Uhungarumlaut Agrave -50\nKPX Uhungarumlaut Amacron -50\nKPX Uhungarumlaut Aogonek -50\nKPX Uhungarumlaut Aring -50\nKPX Uhungarumlaut Atilde -50\nKPX Uhungarumlaut comma -30\nKPX Uhungarumlaut period -30\nKPX Umacron A -50\nKPX Umacron Aacute -50\nKPX Umacron Abreve -50\nKPX Umacron Acircumflex -50\nKPX Umacron Adieresis -50\nKPX Umacron Agrave -50\nKPX Umacron Amacron -50\nKPX Umacron Aogonek -50\nKPX Umacron Aring -50\nKPX Umacron Atilde -50\nKPX Umacron comma -30\nKPX Umacron period -30\nKPX Uogonek A -50\nKPX Uogonek Aacute -50\nKPX Uogonek Abreve -50\nKPX Uogonek Acircumflex -50\nKPX Uogonek Adieresis -50\nKPX Uogonek Agrave -50\nKPX Uogonek Amacron -50\nKPX Uogonek Aogonek -50\nKPX Uogonek Aring -50\nKPX Uogonek Atilde -50\nKPX Uogonek comma -30\nKPX Uogonek period -30\nKPX Uring A -50\nKPX Uring Aacute -50\nKPX Uring Abreve -50\nKPX Uring Acircumflex -50\nKPX Uring Adieresis -50\nKPX Uring Agrave -50\nKPX Uring Amacron -50\nKPX Uring Aogonek -50\nKPX Uring Aring -50\nKPX Uring Atilde -50\nKPX Uring comma -30\nKPX Uring period -30\nKPX V A -80\nKPX V Aacute -80\nKPX V Abreve -80\nKPX V Acircumflex -80\nKPX V Adieresis -80\nKPX V Agrave -80\nKPX V Amacron -80\nKPX V Aogonek -80\nKPX V Aring -80\nKPX V Atilde -80\nKPX V G -50\nKPX V Gbreve -50\nKPX V Gcommaaccent -50\nKPX V O -50\nKPX V Oacute -50\nKPX V Ocircumflex -50\nKPX V Odieresis -50\nKPX V Ograve -50\nKPX V Ohungarumlaut -50\nKPX V Omacron -50\nKPX V Oslash -50\nKPX V Otilde -50\nKPX V a -60\nKPX V aacute -60\nKPX V abreve -60\nKPX V acircumflex -60\nKPX V adieresis -60\nKPX V agrave -60\nKPX V amacron -60\nKPX V aogonek -60\nKPX V aring -60\nKPX V atilde -60\nKPX V colon -40\nKPX V comma -120\nKPX V e -50\nKPX V eacute -50\nKPX V ecaron -50\nKPX V ecircumflex -50\nKPX V edieresis -50\nKPX V edotaccent -50\nKPX V egrave -50\nKPX V emacron -50\nKPX V eogonek -50\nKPX V hyphen -80\nKPX V o -90\nKPX V oacute -90\nKPX V ocircumflex -90\nKPX V odieresis -90\nKPX V ograve -90\nKPX V ohungarumlaut -90\nKPX V omacron -90\nKPX V oslash -90\nKPX V otilde -90\nKPX V period -120\nKPX V semicolon -40\nKPX V u -60\nKPX V uacute -60\nKPX V ucircumflex -60\nKPX V udieresis -60\nKPX V ugrave -60\nKPX V uhungarumlaut -60\nKPX V umacron -60\nKPX V uogonek -60\nKPX V uring -60\nKPX W A -60\nKPX W Aacute -60\nKPX W Abreve -60\nKPX W Acircumflex -60\nKPX W Adieresis -60\nKPX W Agrave -60\nKPX W Amacron -60\nKPX W Aogonek -60\nKPX W Aring -60\nKPX W Atilde -60\nKPX W O -20\nKPX W Oacute -20\nKPX W Ocircumflex -20\nKPX W Odieresis -20\nKPX W Ograve -20\nKPX W Ohungarumlaut -20\nKPX W Omacron -20\nKPX W Oslash -20\nKPX W Otilde -20\nKPX W a -40\nKPX W aacute -40\nKPX W abreve -40\nKPX W acircumflex -40\nKPX W adieresis -40\nKPX W agrave -40\nKPX W amacron -40\nKPX W aogonek -40\nKPX W aring -40\nKPX W atilde -40\nKPX W colon -10\nKPX W comma -80\nKPX W e -35\nKPX W eacute -35\nKPX W ecaron -35\nKPX W ecircumflex -35\nKPX W edieresis -35\nKPX W edotaccent -35\nKPX W egrave -35\nKPX W emacron -35\nKPX W eogonek -35\nKPX W hyphen -40\nKPX W o -60\nKPX W oacute -60\nKPX W ocircumflex -60\nKPX W odieresis -60\nKPX W ograve -60\nKPX W ohungarumlaut -60\nKPX W omacron -60\nKPX W oslash -60\nKPX W otilde -60\nKPX W period -80\nKPX W semicolon -10\nKPX W u -45\nKPX W uacute -45\nKPX W ucircumflex -45\nKPX W udieresis -45\nKPX W ugrave -45\nKPX W uhungarumlaut -45\nKPX W umacron -45\nKPX W uogonek -45\nKPX W uring -45\nKPX W y -20\nKPX W yacute -20\nKPX W ydieresis -20\nKPX Y A -110\nKPX Y Aacute -110\nKPX Y Abreve -110\nKPX Y Acircumflex -110\nKPX Y Adieresis -110\nKPX Y Agrave -110\nKPX Y Amacron -110\nKPX Y Aogonek -110\nKPX Y Aring -110\nKPX Y Atilde -110\nKPX Y O -70\nKPX Y Oacute -70\nKPX Y Ocircumflex -70\nKPX Y Odieresis -70\nKPX Y Ograve -70\nKPX Y Ohungarumlaut -70\nKPX Y Omacron -70\nKPX Y Oslash -70\nKPX Y Otilde -70\nKPX Y a -90\nKPX Y aacute -90\nKPX Y abreve -90\nKPX Y acircumflex -90\nKPX Y adieresis -90\nKPX Y agrave -90\nKPX Y amacron -90\nKPX Y aogonek -90\nKPX Y aring -90\nKPX Y atilde -90\nKPX Y colon -50\nKPX Y comma -100\nKPX Y e -80\nKPX Y eacute -80\nKPX Y ecaron -80\nKPX Y ecircumflex -80\nKPX Y edieresis -80\nKPX Y edotaccent -80\nKPX Y egrave -80\nKPX Y emacron -80\nKPX Y eogonek -80\nKPX Y o -100\nKPX Y oacute -100\nKPX Y ocircumflex -100\nKPX Y odieresis -100\nKPX Y ograve -100\nKPX Y ohungarumlaut -100\nKPX Y omacron -100\nKPX Y oslash -100\nKPX Y otilde -100\nKPX Y period -100\nKPX Y semicolon -50\nKPX Y u -100\nKPX Y uacute -100\nKPX Y ucircumflex -100\nKPX Y udieresis -100\nKPX Y ugrave -100\nKPX Y uhungarumlaut -100\nKPX Y umacron -100\nKPX Y uogonek -100\nKPX Y uring -100\nKPX Yacute A -110\nKPX Yacute Aacute -110\nKPX Yacute Abreve -110\nKPX Yacute Acircumflex -110\nKPX Yacute Adieresis -110\nKPX Yacute Agrave -110\nKPX Yacute Amacron -110\nKPX Yacute Aogonek -110\nKPX Yacute Aring -110\nKPX Yacute Atilde -110\nKPX Yacute O -70\nKPX Yacute Oacute -70\nKPX Yacute Ocircumflex -70\nKPX Yacute Odieresis -70\nKPX Yacute Ograve -70\nKPX Yacute Ohungarumlaut -70\nKPX Yacute Omacron -70\nKPX Yacute Oslash -70\nKPX Yacute Otilde -70\nKPX Yacute a -90\nKPX Yacute aacute -90\nKPX Yacute abreve -90\nKPX Yacute acircumflex -90\nKPX Yacute adieresis -90\nKPX Yacute agrave -90\nKPX Yacute amacron -90\nKPX Yacute aogonek -90\nKPX Yacute aring -90\nKPX Yacute atilde -90\nKPX Yacute colon -50\nKPX Yacute comma -100\nKPX Yacute e -80\nKPX Yacute eacute -80\nKPX Yacute ecaron -80\nKPX Yacute ecircumflex -80\nKPX Yacute edieresis -80\nKPX Yacute edotaccent -80\nKPX Yacute egrave -80\nKPX Yacute emacron -80\nKPX Yacute eogonek -80\nKPX Yacute o -100\nKPX Yacute oacute -100\nKPX Yacute ocircumflex -100\nKPX Yacute odieresis -100\nKPX Yacute ograve -100\nKPX Yacute ohungarumlaut -100\nKPX Yacute omacron -100\nKPX Yacute oslash -100\nKPX Yacute otilde -100\nKPX Yacute period -100\nKPX Yacute semicolon -50\nKPX Yacute u -100\nKPX Yacute uacute -100\nKPX Yacute ucircumflex -100\nKPX Yacute udieresis -100\nKPX Yacute ugrave -100\nKPX Yacute uhungarumlaut -100\nKPX Yacute umacron -100\nKPX Yacute uogonek -100\nKPX Yacute uring -100\nKPX Ydieresis A -110\nKPX Ydieresis Aacute -110\nKPX Ydieresis Abreve -110\nKPX Ydieresis Acircumflex -110\nKPX Ydieresis Adieresis -110\nKPX Ydieresis Agrave -110\nKPX Ydieresis Amacron -110\nKPX Ydieresis Aogonek -110\nKPX Ydieresis Aring -110\nKPX Ydieresis Atilde -110\nKPX Ydieresis O -70\nKPX Ydieresis Oacute -70\nKPX Ydieresis Ocircumflex -70\nKPX Ydieresis Odieresis -70\nKPX Ydieresis Ograve -70\nKPX Ydieresis Ohungarumlaut -70\nKPX Ydieresis Omacron -70\nKPX Ydieresis Oslash -70\nKPX Ydieresis Otilde -70\nKPX Ydieresis a -90\nKPX Ydieresis aacute -90\nKPX Ydieresis abreve -90\nKPX Ydieresis acircumflex -90\nKPX Ydieresis adieresis -90\nKPX Ydieresis agrave -90\nKPX Ydieresis amacron -90\nKPX Ydieresis aogonek -90\nKPX Ydieresis aring -90\nKPX Ydieresis atilde -90\nKPX Ydieresis colon -50\nKPX Ydieresis comma -100\nKPX Ydieresis e -80\nKPX Ydieresis eacute -80\nKPX Ydieresis ecaron -80\nKPX Ydieresis ecircumflex -80\nKPX Ydieresis edieresis -80\nKPX Ydieresis edotaccent -80\nKPX Ydieresis egrave -80\nKPX Ydieresis emacron -80\nKPX Ydieresis eogonek -80\nKPX Ydieresis o -100\nKPX Ydieresis oacute -100\nKPX Ydieresis ocircumflex -100\nKPX Ydieresis odieresis -100\nKPX Ydieresis ograve -100\nKPX Ydieresis ohungarumlaut -100\nKPX Ydieresis omacron -100\nKPX Ydieresis oslash -100\nKPX Ydieresis otilde -100\nKPX Ydieresis period -100\nKPX Ydieresis semicolon -50\nKPX Ydieresis u -100\nKPX Ydieresis uacute -100\nKPX Ydieresis ucircumflex -100\nKPX Ydieresis udieresis -100\nKPX Ydieresis ugrave -100\nKPX Ydieresis uhungarumlaut -100\nKPX Ydieresis umacron -100\nKPX Ydieresis uogonek -100\nKPX Ydieresis uring -100\nKPX a g -10\nKPX a gbreve -10\nKPX a gcommaaccent -10\nKPX a v -15\nKPX a w -15\nKPX a y -20\nKPX a yacute -20\nKPX a ydieresis -20\nKPX aacute g -10\nKPX aacute gbreve -10\nKPX aacute gcommaaccent -10\nKPX aacute v -15\nKPX aacute w -15\nKPX aacute y -20\nKPX aacute yacute -20\nKPX aacute ydieresis -20\nKPX abreve g -10\nKPX abreve gbreve -10\nKPX abreve gcommaaccent -10\nKPX abreve v -15\nKPX abreve w -15\nKPX abreve y -20\nKPX abreve yacute -20\nKPX abreve ydieresis -20\nKPX acircumflex g -10\nKPX acircumflex gbreve -10\nKPX acircumflex gcommaaccent -10\nKPX acircumflex v -15\nKPX acircumflex w -15\nKPX acircumflex y -20\nKPX acircumflex yacute -20\nKPX acircumflex ydieresis -20\nKPX adieresis g -10\nKPX adieresis gbreve -10\nKPX adieresis gcommaaccent -10\nKPX adieresis v -15\nKPX adieresis w -15\nKPX adieresis y -20\nKPX adieresis yacute -20\nKPX adieresis ydieresis -20\nKPX agrave g -10\nKPX agrave gbreve -10\nKPX agrave gcommaaccent -10\nKPX agrave v -15\nKPX agrave w -15\nKPX agrave y -20\nKPX agrave yacute -20\nKPX agrave ydieresis -20\nKPX amacron g -10\nKPX amacron gbreve -10\nKPX amacron gcommaaccent -10\nKPX amacron v -15\nKPX amacron w -15\nKPX amacron y -20\nKPX amacron yacute -20\nKPX amacron ydieresis -20\nKPX aogonek g -10\nKPX aogonek gbreve -10\nKPX aogonek gcommaaccent -10\nKPX aogonek v -15\nKPX aogonek w -15\nKPX aogonek y -20\nKPX aogonek yacute -20\nKPX aogonek ydieresis -20\nKPX aring g -10\nKPX aring gbreve -10\nKPX aring gcommaaccent -10\nKPX aring v -15\nKPX aring w -15\nKPX aring y -20\nKPX aring yacute -20\nKPX aring ydieresis -20\nKPX atilde g -10\nKPX atilde gbreve -10\nKPX atilde gcommaaccent -10\nKPX atilde v -15\nKPX atilde w -15\nKPX atilde y -20\nKPX atilde yacute -20\nKPX atilde ydieresis -20\nKPX b l -10\nKPX b lacute -10\nKPX b lcommaaccent -10\nKPX b lslash -10\nKPX b u -20\nKPX b uacute -20\nKPX b ucircumflex -20\nKPX b udieresis -20\nKPX b ugrave -20\nKPX b uhungarumlaut -20\nKPX b umacron -20\nKPX b uogonek -20\nKPX b uring -20\nKPX b v -20\nKPX b y -20\nKPX b yacute -20\nKPX b ydieresis -20\nKPX c h -10\nKPX c k -20\nKPX c kcommaaccent -20\nKPX c l -20\nKPX c lacute -20\nKPX c lcommaaccent -20\nKPX c lslash -20\nKPX c y -10\nKPX c yacute -10\nKPX c ydieresis -10\nKPX cacute h -10\nKPX cacute k -20\nKPX cacute kcommaaccent -20\nKPX cacute l -20\nKPX cacute lacute -20\nKPX cacute lcommaaccent -20\nKPX cacute lslash -20\nKPX cacute y -10\nKPX cacute yacute -10\nKPX cacute ydieresis -10\nKPX ccaron h -10\nKPX ccaron k -20\nKPX ccaron kcommaaccent -20\nKPX ccaron l -20\nKPX ccaron lacute -20\nKPX ccaron lcommaaccent -20\nKPX ccaron lslash -20\nKPX ccaron y -10\nKPX ccaron yacute -10\nKPX ccaron ydieresis -10\nKPX ccedilla h -10\nKPX ccedilla k -20\nKPX ccedilla kcommaaccent -20\nKPX ccedilla l -20\nKPX ccedilla lacute -20\nKPX ccedilla lcommaaccent -20\nKPX ccedilla lslash -20\nKPX ccedilla y -10\nKPX ccedilla yacute -10\nKPX ccedilla ydieresis -10\nKPX colon space -40\nKPX comma quotedblright -120\nKPX comma quoteright -120\nKPX comma space -40\nKPX d d -10\nKPX d dcroat -10\nKPX d v -15\nKPX d w -15\nKPX d y -15\nKPX d yacute -15\nKPX d ydieresis -15\nKPX dcroat d -10\nKPX dcroat dcroat -10\nKPX dcroat v -15\nKPX dcroat w -15\nKPX dcroat y -15\nKPX dcroat yacute -15\nKPX dcroat ydieresis -15\nKPX e comma 10\nKPX e period 20\nKPX e v -15\nKPX e w -15\nKPX e x -15\nKPX e y -15\nKPX e yacute -15\nKPX e ydieresis -15\nKPX eacute comma 10\nKPX eacute period 20\nKPX eacute v -15\nKPX eacute w -15\nKPX eacute x -15\nKPX eacute y -15\nKPX eacute yacute -15\nKPX eacute ydieresis -15\nKPX ecaron comma 10\nKPX ecaron period 20\nKPX ecaron v -15\nKPX ecaron w -15\nKPX ecaron x -15\nKPX ecaron y -15\nKPX ecaron yacute -15\nKPX ecaron ydieresis -15\nKPX ecircumflex comma 10\nKPX ecircumflex period 20\nKPX ecircumflex v -15\nKPX ecircumflex w -15\nKPX ecircumflex x -15\nKPX ecircumflex y -15\nKPX ecircumflex yacute -15\nKPX ecircumflex ydieresis -15\nKPX edieresis comma 10\nKPX edieresis period 20\nKPX edieresis v -15\nKPX edieresis w -15\nKPX edieresis x -15\nKPX edieresis y -15\nKPX edieresis yacute -15\nKPX edieresis ydieresis -15\nKPX edotaccent comma 10\nKPX edotaccent period 20\nKPX edotaccent v -15\nKPX edotaccent w -15\nKPX edotaccent x -15\nKPX edotaccent y -15\nKPX edotaccent yacute -15\nKPX edotaccent ydieresis -15\nKPX egrave comma 10\nKPX egrave period 20\nKPX egrave v -15\nKPX egrave w -15\nKPX egrave x -15\nKPX egrave y -15\nKPX egrave yacute -15\nKPX egrave ydieresis -15\nKPX emacron comma 10\nKPX emacron period 20\nKPX emacron v -15\nKPX emacron w -15\nKPX emacron x -15\nKPX emacron y -15\nKPX emacron yacute -15\nKPX emacron ydieresis -15\nKPX eogonek comma 10\nKPX eogonek period 20\nKPX eogonek v -15\nKPX eogonek w -15\nKPX eogonek x -15\nKPX eogonek y -15\nKPX eogonek yacute -15\nKPX eogonek ydieresis -15\nKPX f comma -10\nKPX f e -10\nKPX f eacute -10\nKPX f ecaron -10\nKPX f ecircumflex -10\nKPX f edieresis -10\nKPX f edotaccent -10\nKPX f egrave -10\nKPX f emacron -10\nKPX f eogonek -10\nKPX f o -20\nKPX f oacute -20\nKPX f ocircumflex -20\nKPX f odieresis -20\nKPX f ograve -20\nKPX f ohungarumlaut -20\nKPX f omacron -20\nKPX f oslash -20\nKPX f otilde -20\nKPX f period -10\nKPX f quotedblright 30\nKPX f quoteright 30\nKPX g e 10\nKPX g eacute 10\nKPX g ecaron 10\nKPX g ecircumflex 10\nKPX g edieresis 10\nKPX g edotaccent 10\nKPX g egrave 10\nKPX g emacron 10\nKPX g eogonek 10\nKPX g g -10\nKPX g gbreve -10\nKPX g gcommaaccent -10\nKPX gbreve e 10\nKPX gbreve eacute 10\nKPX gbreve ecaron 10\nKPX gbreve ecircumflex 10\nKPX gbreve edieresis 10\nKPX gbreve edotaccent 10\nKPX gbreve egrave 10\nKPX gbreve emacron 10\nKPX gbreve eogonek 10\nKPX gbreve g -10\nKPX gbreve gbreve -10\nKPX gbreve gcommaaccent -10\nKPX gcommaaccent e 10\nKPX gcommaaccent eacute 10\nKPX gcommaaccent ecaron 10\nKPX gcommaaccent ecircumflex 10\nKPX gcommaaccent edieresis 10\nKPX gcommaaccent edotaccent 10\nKPX gcommaaccent egrave 10\nKPX gcommaaccent emacron 10\nKPX gcommaaccent eogonek 10\nKPX gcommaaccent g -10\nKPX gcommaaccent gbreve -10\nKPX gcommaaccent gcommaaccent -10\nKPX h y -20\nKPX h yacute -20\nKPX h ydieresis -20\nKPX k o -15\nKPX k oacute -15\nKPX k ocircumflex -15\nKPX k odieresis -15\nKPX k ograve -15\nKPX k ohungarumlaut -15\nKPX k omacron -15\nKPX k oslash -15\nKPX k otilde -15\nKPX kcommaaccent o -15\nKPX kcommaaccent oacute -15\nKPX kcommaaccent ocircumflex -15\nKPX kcommaaccent odieresis -15\nKPX kcommaaccent ograve -15\nKPX kcommaaccent ohungarumlaut -15\nKPX kcommaaccent omacron -15\nKPX kcommaaccent oslash -15\nKPX kcommaaccent otilde -15\nKPX l w -15\nKPX l y -15\nKPX l yacute -15\nKPX l ydieresis -15\nKPX lacute w -15\nKPX lacute y -15\nKPX lacute yacute -15\nKPX lacute ydieresis -15\nKPX lcommaaccent w -15\nKPX lcommaaccent y -15\nKPX lcommaaccent yacute -15\nKPX lcommaaccent ydieresis -15\nKPX lslash w -15\nKPX lslash y -15\nKPX lslash yacute -15\nKPX lslash ydieresis -15\nKPX m u -20\nKPX m uacute -20\nKPX m ucircumflex -20\nKPX m udieresis -20\nKPX m ugrave -20\nKPX m uhungarumlaut -20\nKPX m umacron -20\nKPX m uogonek -20\nKPX m uring -20\nKPX m y -30\nKPX m yacute -30\nKPX m ydieresis -30\nKPX n u -10\nKPX n uacute -10\nKPX n ucircumflex -10\nKPX n udieresis -10\nKPX n ugrave -10\nKPX n uhungarumlaut -10\nKPX n umacron -10\nKPX n uogonek -10\nKPX n uring -10\nKPX n v -40\nKPX n y -20\nKPX n yacute -20\nKPX n ydieresis -20\nKPX nacute u -10\nKPX nacute uacute -10\nKPX nacute ucircumflex -10\nKPX nacute udieresis -10\nKPX nacute ugrave -10\nKPX nacute uhungarumlaut -10\nKPX nacute umacron -10\nKPX nacute uogonek -10\nKPX nacute uring -10\nKPX nacute v -40\nKPX nacute y -20\nKPX nacute yacute -20\nKPX nacute ydieresis -20\nKPX ncaron u -10\nKPX ncaron uacute -10\nKPX ncaron ucircumflex -10\nKPX ncaron udieresis -10\nKPX ncaron ugrave -10\nKPX ncaron uhungarumlaut -10\nKPX ncaron umacron -10\nKPX ncaron uogonek -10\nKPX ncaron uring -10\nKPX ncaron v -40\nKPX ncaron y -20\nKPX ncaron yacute -20\nKPX ncaron ydieresis -20\nKPX ncommaaccent u -10\nKPX ncommaaccent uacute -10\nKPX ncommaaccent ucircumflex -10\nKPX ncommaaccent udieresis -10\nKPX ncommaaccent ugrave -10\nKPX ncommaaccent uhungarumlaut -10\nKPX ncommaaccent umacron -10\nKPX ncommaaccent uogonek -10\nKPX ncommaaccent uring -10\nKPX ncommaaccent v -40\nKPX ncommaaccent y -20\nKPX ncommaaccent yacute -20\nKPX ncommaaccent ydieresis -20\nKPX ntilde u -10\nKPX ntilde uacute -10\nKPX ntilde ucircumflex -10\nKPX ntilde udieresis -10\nKPX ntilde ugrave -10\nKPX ntilde uhungarumlaut -10\nKPX ntilde umacron -10\nKPX ntilde uogonek -10\nKPX ntilde uring -10\nKPX ntilde v -40\nKPX ntilde y -20\nKPX ntilde yacute -20\nKPX ntilde ydieresis -20\nKPX o v -20\nKPX o w -15\nKPX o x -30\nKPX o y -20\nKPX o yacute -20\nKPX o ydieresis -20\nKPX oacute v -20\nKPX oacute w -15\nKPX oacute x -30\nKPX oacute y -20\nKPX oacute yacute -20\nKPX oacute ydieresis -20\nKPX ocircumflex v -20\nKPX ocircumflex w -15\nKPX ocircumflex x -30\nKPX ocircumflex y -20\nKPX ocircumflex yacute -20\nKPX ocircumflex ydieresis -20\nKPX odieresis v -20\nKPX odieresis w -15\nKPX odieresis x -30\nKPX odieresis y -20\nKPX odieresis yacute -20\nKPX odieresis ydieresis -20\nKPX ograve v -20\nKPX ograve w -15\nKPX ograve x -30\nKPX ograve y -20\nKPX ograve yacute -20\nKPX ograve ydieresis -20\nKPX ohungarumlaut v -20\nKPX ohungarumlaut w -15\nKPX ohungarumlaut x -30\nKPX ohungarumlaut y -20\nKPX ohungarumlaut yacute -20\nKPX ohungarumlaut ydieresis -20\nKPX omacron v -20\nKPX omacron w -15\nKPX omacron x -30\nKPX omacron y -20\nKPX omacron yacute -20\nKPX omacron ydieresis -20\nKPX oslash v -20\nKPX oslash w -15\nKPX oslash x -30\nKPX oslash y -20\nKPX oslash yacute -20\nKPX oslash ydieresis -20\nKPX otilde v -20\nKPX otilde w -15\nKPX otilde x -30\nKPX otilde y -20\nKPX otilde yacute -20\nKPX otilde ydieresis -20\nKPX p y -15\nKPX p yacute -15\nKPX p ydieresis -15\nKPX period quotedblright -120\nKPX period quoteright -120\nKPX period space -40\nKPX quotedblright space -80\nKPX quoteleft quoteleft -46\nKPX quoteright d -80\nKPX quoteright dcroat -80\nKPX quoteright l -20\nKPX quoteright lacute -20\nKPX quoteright lcommaaccent -20\nKPX quoteright lslash -20\nKPX quoteright quoteright -46\nKPX quoteright r -40\nKPX quoteright racute -40\nKPX quoteright rcaron -40\nKPX quoteright rcommaaccent -40\nKPX quoteright s -60\nKPX quoteright sacute -60\nKPX quoteright scaron -60\nKPX quoteright scedilla -60\nKPX quoteright scommaaccent -60\nKPX quoteright space -80\nKPX quoteright v -20\nKPX r c -20\nKPX r cacute -20\nKPX r ccaron -20\nKPX r ccedilla -20\nKPX r comma -60\nKPX r d -20\nKPX r dcroat -20\nKPX r g -15\nKPX r gbreve -15\nKPX r gcommaaccent -15\nKPX r hyphen -20\nKPX r o -20\nKPX r oacute -20\nKPX r ocircumflex -20\nKPX r odieresis -20\nKPX r ograve -20\nKPX r ohungarumlaut -20\nKPX r omacron -20\nKPX r oslash -20\nKPX r otilde -20\nKPX r period -60\nKPX r q -20\nKPX r s -15\nKPX r sacute -15\nKPX r scaron -15\nKPX r scedilla -15\nKPX r scommaaccent -15\nKPX r t 20\nKPX r tcommaaccent 20\nKPX r v 10\nKPX r y 10\nKPX r yacute 10\nKPX r ydieresis 10\nKPX racute c -20\nKPX racute cacute -20\nKPX racute ccaron -20\nKPX racute ccedilla -20\nKPX racute comma -60\nKPX racute d -20\nKPX racute dcroat -20\nKPX racute g -15\nKPX racute gbreve -15\nKPX racute gcommaaccent -15\nKPX racute hyphen -20\nKPX racute o -20\nKPX racute oacute -20\nKPX racute ocircumflex -20\nKPX racute odieresis -20\nKPX racute ograve -20\nKPX racute ohungarumlaut -20\nKPX racute omacron -20\nKPX racute oslash -20\nKPX racute otilde -20\nKPX racute period -60\nKPX racute q -20\nKPX racute s -15\nKPX racute sacute -15\nKPX racute scaron -15\nKPX racute scedilla -15\nKPX racute scommaaccent -15\nKPX racute t 20\nKPX racute tcommaaccent 20\nKPX racute v 10\nKPX racute y 10\nKPX racute yacute 10\nKPX racute ydieresis 10\nKPX rcaron c -20\nKPX rcaron cacute -20\nKPX rcaron ccaron -20\nKPX rcaron ccedilla -20\nKPX rcaron comma -60\nKPX rcaron d -20\nKPX rcaron dcroat -20\nKPX rcaron g -15\nKPX rcaron gbreve -15\nKPX rcaron gcommaaccent -15\nKPX rcaron hyphen -20\nKPX rcaron o -20\nKPX rcaron oacute -20\nKPX rcaron ocircumflex -20\nKPX rcaron odieresis -20\nKPX rcaron ograve -20\nKPX rcaron ohungarumlaut -20\nKPX rcaron omacron -20\nKPX rcaron oslash -20\nKPX rcaron otilde -20\nKPX rcaron period -60\nKPX rcaron q -20\nKPX rcaron s -15\nKPX rcaron sacute -15\nKPX rcaron scaron -15\nKPX rcaron scedilla -15\nKPX rcaron scommaaccent -15\nKPX rcaron t 20\nKPX rcaron tcommaaccent 20\nKPX rcaron v 10\nKPX rcaron y 10\nKPX rcaron yacute 10\nKPX rcaron ydieresis 10\nKPX rcommaaccent c -20\nKPX rcommaaccent cacute -20\nKPX rcommaaccent ccaron -20\nKPX rcommaaccent ccedilla -20\nKPX rcommaaccent comma -60\nKPX rcommaaccent d -20\nKPX rcommaaccent dcroat -20\nKPX rcommaaccent g -15\nKPX rcommaaccent gbreve -15\nKPX rcommaaccent gcommaaccent -15\nKPX rcommaaccent hyphen -20\nKPX rcommaaccent o -20\nKPX rcommaaccent oacute -20\nKPX rcommaaccent ocircumflex -20\nKPX rcommaaccent odieresis -20\nKPX rcommaaccent ograve -20\nKPX rcommaaccent ohungarumlaut -20\nKPX rcommaaccent omacron -20\nKPX rcommaaccent oslash -20\nKPX rcommaaccent otilde -20\nKPX rcommaaccent period -60\nKPX rcommaaccent q -20\nKPX rcommaaccent s -15\nKPX rcommaaccent sacute -15\nKPX rcommaaccent scaron -15\nKPX rcommaaccent scedilla -15\nKPX rcommaaccent scommaaccent -15\nKPX rcommaaccent t 20\nKPX rcommaaccent tcommaaccent 20\nKPX rcommaaccent v 10\nKPX rcommaaccent y 10\nKPX rcommaaccent yacute 10\nKPX rcommaaccent ydieresis 10\nKPX s w -15\nKPX sacute w -15\nKPX scaron w -15\nKPX scedilla w -15\nKPX scommaaccent w -15\nKPX semicolon space -40\nKPX space T -100\nKPX space Tcaron -100\nKPX space Tcommaaccent -100\nKPX space V -80\nKPX space W -80\nKPX space Y -120\nKPX space Yacute -120\nKPX space Ydieresis -120\nKPX space quotedblleft -80\nKPX space quoteleft -60\nKPX v a -20\nKPX v aacute -20\nKPX v abreve -20\nKPX v acircumflex -20\nKPX v adieresis -20\nKPX v agrave -20\nKPX v amacron -20\nKPX v aogonek -20\nKPX v aring -20\nKPX v atilde -20\nKPX v comma -80\nKPX v o -30\nKPX v oacute -30\nKPX v ocircumflex -30\nKPX v odieresis -30\nKPX v ograve -30\nKPX v ohungarumlaut -30\nKPX v omacron -30\nKPX v oslash -30\nKPX v otilde -30\nKPX v period -80\nKPX w comma -40\nKPX w o -20\nKPX w oacute -20\nKPX w ocircumflex -20\nKPX w odieresis -20\nKPX w ograve -20\nKPX w ohungarumlaut -20\nKPX w omacron -20\nKPX w oslash -20\nKPX w otilde -20\nKPX w period -40\nKPX x e -10\nKPX x eacute -10\nKPX x ecaron -10\nKPX x ecircumflex -10\nKPX x edieresis -10\nKPX x edotaccent -10\nKPX x egrave -10\nKPX x emacron -10\nKPX x eogonek -10\nKPX y a -30\nKPX y aacute -30\nKPX y abreve -30\nKPX y acircumflex -30\nKPX y adieresis -30\nKPX y agrave -30\nKPX y amacron -30\nKPX y aogonek -30\nKPX y aring -30\nKPX y atilde -30\nKPX y comma -80\nKPX y e -10\nKPX y eacute -10\nKPX y ecaron -10\nKPX y ecircumflex -10\nKPX y edieresis -10\nKPX y edotaccent -10\nKPX y egrave -10\nKPX y emacron -10\nKPX y eogonek -10\nKPX y o -25\nKPX y oacute -25\nKPX y ocircumflex -25\nKPX y odieresis -25\nKPX y ograve -25\nKPX y ohungarumlaut -25\nKPX y omacron -25\nKPX y oslash -25\nKPX y otilde -25\nKPX y period -80\nKPX yacute a -30\nKPX yacute aacute -30\nKPX yacute abreve -30\nKPX yacute acircumflex -30\nKPX yacute adieresis -30\nKPX yacute agrave -30\nKPX yacute amacron -30\nKPX yacute aogonek -30\nKPX yacute aring -30\nKPX yacute atilde -30\nKPX yacute comma -80\nKPX yacute e -10\nKPX yacute eacute -10\nKPX yacute ecaron -10\nKPX yacute ecircumflex -10\nKPX yacute edieresis -10\nKPX yacute edotaccent -10\nKPX yacute egrave -10\nKPX yacute emacron -10\nKPX yacute eogonek -10\nKPX yacute o -25\nKPX yacute oacute -25\nKPX yacute ocircumflex -25\nKPX yacute odieresis -25\nKPX yacute ograve -25\nKPX yacute ohungarumlaut -25\nKPX yacute omacron -25\nKPX yacute oslash -25\nKPX yacute otilde -25\nKPX yacute period -80\nKPX ydieresis a -30\nKPX ydieresis aacute -30\nKPX ydieresis abreve -30\nKPX ydieresis acircumflex -30\nKPX ydieresis adieresis -30\nKPX ydieresis agrave -30\nKPX ydieresis amacron -30\nKPX ydieresis aogonek -30\nKPX ydieresis aring -30\nKPX ydieresis atilde -30\nKPX ydieresis comma -80\nKPX ydieresis e -10\nKPX ydieresis eacute -10\nKPX ydieresis ecaron -10\nKPX ydieresis ecircumflex -10\nKPX ydieresis edieresis -10\nKPX ydieresis edotaccent -10\nKPX ydieresis egrave -10\nKPX ydieresis emacron -10\nKPX ydieresis eogonek -10\nKPX ydieresis o -25\nKPX ydieresis oacute -25\nKPX ydieresis ocircumflex -25\nKPX ydieresis odieresis -25\nKPX ydieresis ograve -25\nKPX ydieresis ohungarumlaut -25\nKPX ydieresis omacron -25\nKPX ydieresis oslash -25\nKPX ydieresis otilde -25\nKPX ydieresis period -80\nKPX z e 10\nKPX z eacute 10\nKPX z ecaron 10\nKPX z ecircumflex 10\nKPX z edieresis 10\nKPX z edotaccent 10\nKPX z egrave 10\nKPX z emacron 10\nKPX z eogonek 10\nKPX zacute e 10\nKPX zacute eacute 10\nKPX zacute ecaron 10\nKPX zacute ecircumflex 10\nKPX zacute edieresis 10\nKPX zacute edotaccent 10\nKPX zacute egrave 10\nKPX zacute emacron 10\nKPX zacute eogonek 10\nKPX zcaron e 10\nKPX zcaron eacute 10\nKPX zcaron ecaron 10\nKPX zcaron ecircumflex 10\nKPX zcaron edieresis 10\nKPX zcaron edotaccent 10\nKPX zcaron egrave 10\nKPX zcaron emacron 10\nKPX zcaron eogonek 10\nKPX zdotaccent e 10\nKPX zdotaccent eacute 10\nKPX zdotaccent ecaron 10\nKPX zdotaccent ecircumflex 10\nKPX zdotaccent edieresis 10\nKPX zdotaccent edotaccent 10\nKPX zdotaccent egrave 10\nKPX zdotaccent emacron 10\nKPX zdotaccent eogonek 10\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/pdfcorefonts/Helvetica-BoldOblique.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 12:45:12 1997\nComment UniqueID 43053\nComment VMusage 14482 68586\nFontName Helvetica-BoldOblique\nFullName Helvetica Bold Oblique\nFamilyName Helvetica\nWeight Bold\nItalicAngle -12\nIsFixedPitch false\nCharacterSet ExtendedRoman\nFontBBox -174 -228 1114 962 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated.  All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 718\nXHeight 532\nAscender 718\nDescender -207\nStdHW 118\nStdVW 140\nStartCharMetrics 315\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 94 0 397 718 ;\nC 34 ; WX 474 ; N quotedbl ; B 193 447 529 718 ;\nC 35 ; WX 556 ; N numbersign ; B 60 0 644 698 ;\nC 36 ; WX 556 ; N dollar ; B 67 -115 622 775 ;\nC 37 ; WX 889 ; N percent ; B 136 -19 901 710 ;\nC 38 ; WX 722 ; N ampersand ; B 89 -19 732 718 ;\nC 39 ; WX 278 ; N quoteright ; B 167 445 362 718 ;\nC 40 ; WX 333 ; N parenleft ; B 76 -208 470 734 ;\nC 41 ; WX 333 ; N parenright ; B -25 -208 369 734 ;\nC 42 ; WX 389 ; N asterisk ; B 146 387 481 718 ;\nC 43 ; WX 584 ; N plus ; B 82 0 610 506 ;\nC 44 ; WX 278 ; N comma ; B 28 -168 245 146 ;\nC 45 ; WX 333 ; N hyphen ; B 73 215 379 345 ;\nC 46 ; WX 278 ; N period ; B 64 0 245 146 ;\nC 47 ; WX 278 ; N slash ; B -37 -19 468 737 ;\nC 48 ; WX 556 ; N zero ; B 86 -19 617 710 ;\nC 49 ; WX 556 ; N one ; B 173 0 529 710 ;\nC 50 ; WX 556 ; N two ; B 26 0 619 710 ;\nC 51 ; WX 556 ; N three ; B 65 -19 608 710 ;\nC 52 ; WX 556 ; N four ; B 60 0 598 710 ;\nC 53 ; WX 556 ; N five ; B 64 -19 636 698 ;\nC 54 ; WX 556 ; N six ; B 85 -19 619 710 ;\nC 55 ; WX 556 ; N seven ; B 125 0 676 698 ;\nC 56 ; WX 556 ; N eight ; B 69 -19 616 710 ;\nC 57 ; WX 556 ; N nine ; B 78 -19 615 710 ;\nC 58 ; WX 333 ; N colon ; B 92 0 351 512 ;\nC 59 ; WX 333 ; N semicolon ; B 56 -168 351 512 ;\nC 60 ; WX 584 ; N less ; B 82 -8 655 514 ;\nC 61 ; WX 584 ; N equal ; B 58 87 633 419 ;\nC 62 ; WX 584 ; N greater ; B 36 -8 609 514 ;\nC 63 ; WX 611 ; N question ; B 165 0 671 727 ;\nC 64 ; WX 975 ; N at ; B 186 -19 954 737 ;\nC 65 ; WX 722 ; N A ; B 20 0 702 718 ;\nC 66 ; WX 722 ; N B ; B 76 0 764 718 ;\nC 67 ; WX 722 ; N C ; B 107 -19 789 737 ;\nC 68 ; WX 722 ; N D ; B 76 0 777 718 ;\nC 69 ; WX 667 ; N E ; B 76 0 757 718 ;\nC 70 ; WX 611 ; N F ; B 76 0 740 718 ;\nC 71 ; WX 778 ; N G ; B 108 -19 817 737 ;\nC 72 ; WX 722 ; N H ; B 71 0 804 718 ;\nC 73 ; WX 278 ; N I ; B 64 0 367 718 ;\nC 74 ; WX 556 ; N J ; B 60 -18 637 718 ;\nC 75 ; WX 722 ; N K ; B 87 0 858 718 ;\nC 76 ; WX 611 ; N L ; B 76 0 611 718 ;\nC 77 ; WX 833 ; N M ; B 69 0 918 718 ;\nC 78 ; WX 722 ; N N ; B 69 0 807 718 ;\nC 79 ; WX 778 ; N O ; B 107 -19 823 737 ;\nC 80 ; WX 667 ; N P ; B 76 0 738 718 ;\nC 81 ; WX 778 ; N Q ; B 107 -52 823 737 ;\nC 82 ; WX 722 ; N R ; B 76 0 778 718 ;\nC 83 ; WX 667 ; N S ; B 81 -19 718 737 ;\nC 84 ; WX 611 ; N T ; B 140 0 751 718 ;\nC 85 ; WX 722 ; N U ; B 116 -19 804 718 ;\nC 86 ; WX 667 ; N V ; B 172 0 801 718 ;\nC 87 ; WX 944 ; N W ; B 169 0 1082 718 ;\nC 88 ; WX 667 ; N X ; B 14 0 791 718 ;\nC 89 ; WX 667 ; N Y ; B 168 0 806 718 ;\nC 90 ; WX 611 ; N Z ; B 25 0 737 718 ;\nC 91 ; WX 333 ; N bracketleft ; B 21 -196 462 722 ;\nC 92 ; WX 278 ; N backslash ; B 124 -19 307 737 ;\nC 93 ; WX 333 ; N bracketright ; B -18 -196 423 722 ;\nC 94 ; WX 584 ; N asciicircum ; B 131 323 591 698 ;\nC 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ;\nC 96 ; WX 278 ; N quoteleft ; B 165 454 361 727 ;\nC 97 ; WX 556 ; N a ; B 55 -14 583 546 ;\nC 98 ; WX 611 ; N b ; B 61 -14 645 718 ;\nC 99 ; WX 556 ; N c ; B 79 -14 599 546 ;\nC 100 ; WX 611 ; N d ; B 82 -14 704 718 ;\nC 101 ; WX 556 ; N e ; B 70 -14 593 546 ;\nC 102 ; WX 333 ; N f ; B 87 0 469 727 ; L i fi ; L l fl ;\nC 103 ; WX 611 ; N g ; B 38 -217 666 546 ;\nC 104 ; WX 611 ; N h ; B 65 0 629 718 ;\nC 105 ; WX 278 ; N i ; B 69 0 363 725 ;\nC 106 ; WX 278 ; N j ; B -42 -214 363 725 ;\nC 107 ; WX 556 ; N k ; B 69 0 670 718 ;\nC 108 ; WX 278 ; N l ; B 69 0 362 718 ;\nC 109 ; WX 889 ; N m ; B 64 0 909 546 ;\nC 110 ; WX 611 ; N n ; B 65 0 629 546 ;\nC 111 ; WX 611 ; N o ; B 82 -14 643 546 ;\nC 112 ; WX 611 ; N p ; B 18 -207 645 546 ;\nC 113 ; WX 611 ; N q ; B 80 -207 665 546 ;\nC 114 ; WX 389 ; N r ; B 64 0 489 546 ;\nC 115 ; WX 556 ; N s ; B 63 -14 584 546 ;\nC 116 ; WX 333 ; N t ; B 100 -6 422 676 ;\nC 117 ; WX 611 ; N u ; B 98 -14 658 532 ;\nC 118 ; WX 556 ; N v ; B 126 0 656 532 ;\nC 119 ; WX 778 ; N w ; B 123 0 882 532 ;\nC 120 ; WX 556 ; N x ; B 15 0 648 532 ;\nC 121 ; WX 556 ; N y ; B 42 -214 652 532 ;\nC 122 ; WX 500 ; N z ; B 20 0 583 532 ;\nC 123 ; WX 389 ; N braceleft ; B 94 -196 518 722 ;\nC 124 ; WX 280 ; N bar ; B 36 -225 361 775 ;\nC 125 ; WX 389 ; N braceright ; B -18 -196 407 722 ;\nC 126 ; WX 584 ; N asciitilde ; B 115 163 577 343 ;\nC 161 ; WX 333 ; N exclamdown ; B 50 -186 353 532 ;\nC 162 ; WX 556 ; N cent ; B 79 -118 599 628 ;\nC 163 ; WX 556 ; N sterling ; B 50 -16 635 718 ;\nC 164 ; WX 167 ; N fraction ; B -174 -19 487 710 ;\nC 165 ; WX 556 ; N yen ; B 60 0 713 698 ;\nC 166 ; WX 556 ; N florin ; B -50 -210 669 737 ;\nC 167 ; WX 556 ; N section ; B 61 -184 598 727 ;\nC 168 ; WX 556 ; N currency ; B 27 76 680 636 ;\nC 169 ; WX 238 ; N quotesingle ; B 165 447 321 718 ;\nC 170 ; WX 500 ; N quotedblleft ; B 160 454 588 727 ;\nC 171 ; WX 556 ; N guillemotleft ; B 135 76 571 484 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 130 76 353 484 ;\nC 173 ; WX 333 ; N guilsinglright ; B 99 76 322 484 ;\nC 174 ; WX 611 ; N fi ; B 87 0 696 727 ;\nC 175 ; WX 611 ; N fl ; B 87 0 695 727 ;\nC 177 ; WX 556 ; N endash ; B 48 227 627 333 ;\nC 178 ; WX 556 ; N dagger ; B 118 -171 626 718 ;\nC 179 ; WX 556 ; N daggerdbl ; B 46 -171 628 718 ;\nC 180 ; WX 278 ; N periodcentered ; B 110 172 276 334 ;\nC 182 ; WX 556 ; N paragraph ; B 98 -191 688 700 ;\nC 183 ; WX 350 ; N bullet ; B 83 194 420 524 ;\nC 184 ; WX 278 ; N quotesinglbase ; B 41 -146 236 127 ;\nC 185 ; WX 500 ; N quotedblbase ; B 36 -146 463 127 ;\nC 186 ; WX 500 ; N quotedblright ; B 162 445 589 718 ;\nC 187 ; WX 556 ; N guillemotright ; B 104 76 540 484 ;\nC 188 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ;\nC 189 ; WX 1000 ; N perthousand ; B 76 -19 1038 710 ;\nC 191 ; WX 611 ; N questiondown ; B 53 -195 559 532 ;\nC 193 ; WX 333 ; N grave ; B 136 604 353 750 ;\nC 194 ; WX 333 ; N acute ; B 236 604 515 750 ;\nC 195 ; WX 333 ; N circumflex ; B 118 604 471 750 ;\nC 196 ; WX 333 ; N tilde ; B 113 610 507 737 ;\nC 197 ; WX 333 ; N macron ; B 122 604 483 678 ;\nC 198 ; WX 333 ; N breve ; B 156 604 494 750 ;\nC 199 ; WX 333 ; N dotaccent ; B 235 614 385 729 ;\nC 200 ; WX 333 ; N dieresis ; B 137 614 482 729 ;\nC 202 ; WX 333 ; N ring ; B 200 568 420 776 ;\nC 203 ; WX 333 ; N cedilla ; B -37 -228 220 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 137 604 645 750 ;\nC 206 ; WX 333 ; N ogonek ; B 41 -228 264 0 ;\nC 207 ; WX 333 ; N caron ; B 149 604 502 750 ;\nC 208 ; WX 1000 ; N emdash ; B 48 227 1071 333 ;\nC 225 ; WX 1000 ; N AE ; B 5 0 1100 718 ;\nC 227 ; WX 370 ; N ordfeminine ; B 125 401 465 737 ;\nC 232 ; WX 611 ; N Lslash ; B 34 0 611 718 ;\nC 233 ; WX 778 ; N Oslash ; B 35 -27 894 745 ;\nC 234 ; WX 1000 ; N OE ; B 99 -19 1114 737 ;\nC 235 ; WX 365 ; N ordmasculine ; B 123 401 485 737 ;\nC 241 ; WX 889 ; N ae ; B 56 -14 923 546 ;\nC 245 ; WX 278 ; N dotlessi ; B 69 0 322 532 ;\nC 248 ; WX 278 ; N lslash ; B 40 0 407 718 ;\nC 249 ; WX 611 ; N oslash ; B 22 -29 701 560 ;\nC 250 ; WX 944 ; N oe ; B 82 -14 977 546 ;\nC 251 ; WX 611 ; N germandbls ; B 69 -14 657 731 ;\nC -1 ; WX 278 ; N Idieresis ; B 64 0 494 915 ;\nC -1 ; WX 556 ; N eacute ; B 70 -14 627 750 ;\nC -1 ; WX 556 ; N abreve ; B 55 -14 606 750 ;\nC -1 ; WX 611 ; N uhungarumlaut ; B 98 -14 784 750 ;\nC -1 ; WX 556 ; N ecaron ; B 70 -14 614 750 ;\nC -1 ; WX 667 ; N Ydieresis ; B 168 0 806 915 ;\nC -1 ; WX 584 ; N divide ; B 82 -42 610 548 ;\nC -1 ; WX 667 ; N Yacute ; B 168 0 806 936 ;\nC -1 ; WX 722 ; N Acircumflex ; B 20 0 706 936 ;\nC -1 ; WX 556 ; N aacute ; B 55 -14 627 750 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 116 -19 804 936 ;\nC -1 ; WX 556 ; N yacute ; B 42 -214 652 750 ;\nC -1 ; WX 556 ; N scommaaccent ; B 63 -228 584 546 ;\nC -1 ; WX 556 ; N ecircumflex ; B 70 -14 593 750 ;\nC -1 ; WX 722 ; N Uring ; B 116 -19 804 962 ;\nC -1 ; WX 722 ; N Udieresis ; B 116 -19 804 915 ;\nC -1 ; WX 556 ; N aogonek ; B 55 -224 583 546 ;\nC -1 ; WX 722 ; N Uacute ; B 116 -19 804 936 ;\nC -1 ; WX 611 ; N uogonek ; B 98 -228 658 532 ;\nC -1 ; WX 667 ; N Edieresis ; B 76 0 757 915 ;\nC -1 ; WX 722 ; N Dcroat ; B 62 0 777 718 ;\nC -1 ; WX 250 ; N commaaccent ; B 16 -228 188 -50 ;\nC -1 ; WX 737 ; N copyright ; B 56 -19 835 737 ;\nC -1 ; WX 667 ; N Emacron ; B 76 0 757 864 ;\nC -1 ; WX 556 ; N ccaron ; B 79 -14 614 750 ;\nC -1 ; WX 556 ; N aring ; B 55 -14 583 776 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 807 718 ;\nC -1 ; WX 278 ; N lacute ; B 69 0 528 936 ;\nC -1 ; WX 556 ; N agrave ; B 55 -14 583 750 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 140 -228 751 718 ;\nC -1 ; WX 722 ; N Cacute ; B 107 -19 789 936 ;\nC -1 ; WX 556 ; N atilde ; B 55 -14 619 737 ;\nC -1 ; WX 667 ; N Edotaccent ; B 76 0 757 915 ;\nC -1 ; WX 556 ; N scaron ; B 63 -14 614 750 ;\nC -1 ; WX 556 ; N scedilla ; B 63 -228 584 546 ;\nC -1 ; WX 278 ; N iacute ; B 69 0 488 750 ;\nC -1 ; WX 494 ; N lozenge ; B 90 0 564 745 ;\nC -1 ; WX 722 ; N Rcaron ; B 76 0 778 936 ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 108 -228 817 737 ;\nC -1 ; WX 611 ; N ucircumflex ; B 98 -14 658 750 ;\nC -1 ; WX 556 ; N acircumflex ; B 55 -14 583 750 ;\nC -1 ; WX 722 ; N Amacron ; B 20 0 718 864 ;\nC -1 ; WX 389 ; N rcaron ; B 64 0 530 750 ;\nC -1 ; WX 556 ; N ccedilla ; B 79 -228 599 546 ;\nC -1 ; WX 611 ; N Zdotaccent ; B 25 0 737 915 ;\nC -1 ; WX 667 ; N Thorn ; B 76 0 716 718 ;\nC -1 ; WX 778 ; N Omacron ; B 107 -19 823 864 ;\nC -1 ; WX 722 ; N Racute ; B 76 0 778 936 ;\nC -1 ; WX 667 ; N Sacute ; B 81 -19 722 936 ;\nC -1 ; WX 743 ; N dcaron ; B 82 -14 903 718 ;\nC -1 ; WX 722 ; N Umacron ; B 116 -19 804 864 ;\nC -1 ; WX 611 ; N uring ; B 98 -14 658 776 ;\nC -1 ; WX 333 ; N threesuperior ; B 91 271 441 710 ;\nC -1 ; WX 778 ; N Ograve ; B 107 -19 823 936 ;\nC -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ;\nC -1 ; WX 722 ; N Abreve ; B 20 0 729 936 ;\nC -1 ; WX 584 ; N multiply ; B 57 1 635 505 ;\nC -1 ; WX 611 ; N uacute ; B 98 -14 658 750 ;\nC -1 ; WX 611 ; N Tcaron ; B 140 0 751 936 ;\nC -1 ; WX 494 ; N partialdiff ; B 43 -21 585 750 ;\nC -1 ; WX 556 ; N ydieresis ; B 42 -214 652 729 ;\nC -1 ; WX 722 ; N Nacute ; B 69 0 807 936 ;\nC -1 ; WX 278 ; N icircumflex ; B 69 0 444 750 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 76 0 757 936 ;\nC -1 ; WX 556 ; N adieresis ; B 55 -14 594 729 ;\nC -1 ; WX 556 ; N edieresis ; B 70 -14 594 729 ;\nC -1 ; WX 556 ; N cacute ; B 79 -14 627 750 ;\nC -1 ; WX 611 ; N nacute ; B 65 0 654 750 ;\nC -1 ; WX 611 ; N umacron ; B 98 -14 658 678 ;\nC -1 ; WX 722 ; N Ncaron ; B 69 0 807 936 ;\nC -1 ; WX 278 ; N Iacute ; B 64 0 528 936 ;\nC -1 ; WX 584 ; N plusminus ; B 40 0 625 506 ;\nC -1 ; WX 280 ; N brokenbar ; B 52 -150 345 700 ;\nC -1 ; WX 737 ; N registered ; B 55 -19 834 737 ;\nC -1 ; WX 778 ; N Gbreve ; B 108 -19 817 936 ;\nC -1 ; WX 278 ; N Idotaccent ; B 64 0 397 915 ;\nC -1 ; WX 600 ; N summation ; B 14 -10 670 706 ;\nC -1 ; WX 667 ; N Egrave ; B 76 0 757 936 ;\nC -1 ; WX 389 ; N racute ; B 64 0 543 750 ;\nC -1 ; WX 611 ; N omacron ; B 82 -14 643 678 ;\nC -1 ; WX 611 ; N Zacute ; B 25 0 737 936 ;\nC -1 ; WX 611 ; N Zcaron ; B 25 0 737 936 ;\nC -1 ; WX 549 ; N greaterequal ; B 26 0 629 704 ;\nC -1 ; WX 722 ; N Eth ; B 62 0 777 718 ;\nC -1 ; WX 722 ; N Ccedilla ; B 107 -228 789 737 ;\nC -1 ; WX 278 ; N lcommaaccent ; B 30 -228 362 718 ;\nC -1 ; WX 389 ; N tcaron ; B 100 -6 608 878 ;\nC -1 ; WX 556 ; N eogonek ; B 70 -228 593 546 ;\nC -1 ; WX 722 ; N Uogonek ; B 116 -228 804 718 ;\nC -1 ; WX 722 ; N Aacute ; B 20 0 750 936 ;\nC -1 ; WX 722 ; N Adieresis ; B 20 0 716 915 ;\nC -1 ; WX 556 ; N egrave ; B 70 -14 593 750 ;\nC -1 ; WX 500 ; N zacute ; B 20 0 599 750 ;\nC -1 ; WX 278 ; N iogonek ; B -14 -224 363 725 ;\nC -1 ; WX 778 ; N Oacute ; B 107 -19 823 936 ;\nC -1 ; WX 611 ; N oacute ; B 82 -14 654 750 ;\nC -1 ; WX 556 ; N amacron ; B 55 -14 595 678 ;\nC -1 ; WX 556 ; N sacute ; B 63 -14 627 750 ;\nC -1 ; WX 278 ; N idieresis ; B 69 0 455 729 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 107 -19 823 936 ;\nC -1 ; WX 722 ; N Ugrave ; B 116 -19 804 936 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 611 ; N thorn ; B 18 -208 645 718 ;\nC -1 ; WX 333 ; N twosuperior ; B 69 283 449 710 ;\nC -1 ; WX 778 ; N Odieresis ; B 107 -19 823 915 ;\nC -1 ; WX 611 ; N mu ; B 22 -207 658 532 ;\nC -1 ; WX 278 ; N igrave ; B 69 0 326 750 ;\nC -1 ; WX 611 ; N ohungarumlaut ; B 82 -14 784 750 ;\nC -1 ; WX 667 ; N Eogonek ; B 76 -224 757 718 ;\nC -1 ; WX 611 ; N dcroat ; B 82 -14 789 718 ;\nC -1 ; WX 834 ; N threequarters ; B 99 -19 839 710 ;\nC -1 ; WX 667 ; N Scedilla ; B 81 -228 718 737 ;\nC -1 ; WX 400 ; N lcaron ; B 69 0 561 718 ;\nC -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 858 718 ;\nC -1 ; WX 611 ; N Lacute ; B 76 0 611 936 ;\nC -1 ; WX 1000 ; N trademark ; B 179 306 1109 718 ;\nC -1 ; WX 556 ; N edotaccent ; B 70 -14 593 729 ;\nC -1 ; WX 278 ; N Igrave ; B 64 0 367 936 ;\nC -1 ; WX 278 ; N Imacron ; B 64 0 496 864 ;\nC -1 ; WX 611 ; N Lcaron ; B 76 0 643 718 ;\nC -1 ; WX 834 ; N onehalf ; B 132 -19 858 710 ;\nC -1 ; WX 549 ; N lessequal ; B 29 0 676 704 ;\nC -1 ; WX 611 ; N ocircumflex ; B 82 -14 643 750 ;\nC -1 ; WX 611 ; N ntilde ; B 65 0 646 737 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 116 -19 880 936 ;\nC -1 ; WX 667 ; N Eacute ; B 76 0 757 936 ;\nC -1 ; WX 556 ; N emacron ; B 70 -14 595 678 ;\nC -1 ; WX 611 ; N gbreve ; B 38 -217 666 750 ;\nC -1 ; WX 834 ; N onequarter ; B 132 -19 806 710 ;\nC -1 ; WX 667 ; N Scaron ; B 81 -19 718 936 ;\nC -1 ; WX 667 ; N Scommaaccent ; B 81 -228 718 737 ;\nC -1 ; WX 778 ; N Ohungarumlaut ; B 107 -19 908 936 ;\nC -1 ; WX 400 ; N degree ; B 175 426 467 712 ;\nC -1 ; WX 611 ; N ograve ; B 82 -14 643 750 ;\nC -1 ; WX 722 ; N Ccaron ; B 107 -19 789 936 ;\nC -1 ; WX 611 ; N ugrave ; B 98 -14 658 750 ;\nC -1 ; WX 549 ; N radical ; B 112 -46 689 850 ;\nC -1 ; WX 722 ; N Dcaron ; B 76 0 777 936 ;\nC -1 ; WX 389 ; N rcommaaccent ; B 26 -228 489 546 ;\nC -1 ; WX 722 ; N Ntilde ; B 69 0 807 923 ;\nC -1 ; WX 611 ; N otilde ; B 82 -14 646 737 ;\nC -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 778 718 ;\nC -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 611 718 ;\nC -1 ; WX 722 ; N Atilde ; B 20 0 741 923 ;\nC -1 ; WX 722 ; N Aogonek ; B 20 -224 702 718 ;\nC -1 ; WX 722 ; N Aring ; B 20 0 702 962 ;\nC -1 ; WX 778 ; N Otilde ; B 107 -19 823 923 ;\nC -1 ; WX 500 ; N zdotaccent ; B 20 0 583 729 ;\nC -1 ; WX 667 ; N Ecaron ; B 76 0 757 936 ;\nC -1 ; WX 278 ; N Iogonek ; B -41 -228 367 718 ;\nC -1 ; WX 556 ; N kcommaaccent ; B 69 -228 670 718 ;\nC -1 ; WX 584 ; N minus ; B 82 197 610 309 ;\nC -1 ; WX 278 ; N Icircumflex ; B 64 0 484 936 ;\nC -1 ; WX 611 ; N ncaron ; B 65 0 641 750 ;\nC -1 ; WX 333 ; N tcommaaccent ; B 58 -228 422 676 ;\nC -1 ; WX 584 ; N logicalnot ; B 105 108 633 419 ;\nC -1 ; WX 611 ; N odieresis ; B 82 -14 643 729 ;\nC -1 ; WX 611 ; N udieresis ; B 98 -14 658 729 ;\nC -1 ; WX 549 ; N notequal ; B 32 -49 630 570 ;\nC -1 ; WX 611 ; N gcommaaccent ; B 38 -217 666 850 ;\nC -1 ; WX 611 ; N eth ; B 82 -14 670 737 ;\nC -1 ; WX 500 ; N zcaron ; B 20 0 586 750 ;\nC -1 ; WX 611 ; N ncommaaccent ; B 65 -228 629 546 ;\nC -1 ; WX 333 ; N onesuperior ; B 148 283 388 710 ;\nC -1 ; WX 278 ; N imacron ; B 69 0 429 678 ;\nC -1 ; WX 556 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 2481\nKPX A C -40\nKPX A Cacute -40\nKPX A Ccaron -40\nKPX A Ccedilla -40\nKPX A G -50\nKPX A Gbreve -50\nKPX A Gcommaaccent -50\nKPX A O -40\nKPX A Oacute -40\nKPX A Ocircumflex -40\nKPX A Odieresis -40\nKPX A Ograve -40\nKPX A Ohungarumlaut -40\nKPX A Omacron -40\nKPX A Oslash -40\nKPX A Otilde -40\nKPX A Q -40\nKPX A T -90\nKPX A Tcaron -90\nKPX A Tcommaaccent -90\nKPX A U -50\nKPX A Uacute -50\nKPX A Ucircumflex -50\nKPX A Udieresis -50\nKPX A Ugrave -50\nKPX A Uhungarumlaut -50\nKPX A Umacron -50\nKPX A Uogonek -50\nKPX A Uring -50\nKPX A V -80\nKPX A W -60\nKPX A Y -110\nKPX A Yacute -110\nKPX A Ydieresis -110\nKPX A u -30\nKPX A uacute -30\nKPX A ucircumflex -30\nKPX A udieresis -30\nKPX A ugrave -30\nKPX A uhungarumlaut -30\nKPX A umacron -30\nKPX A uogonek -30\nKPX A uring -30\nKPX A v -40\nKPX A w -30\nKPX A y -30\nKPX A yacute -30\nKPX A ydieresis -30\nKPX Aacute C -40\nKPX Aacute Cacute -40\nKPX Aacute Ccaron -40\nKPX Aacute Ccedilla -40\nKPX Aacute G -50\nKPX Aacute Gbreve -50\nKPX Aacute Gcommaaccent -50\nKPX Aacute O -40\nKPX Aacute Oacute -40\nKPX Aacute Ocircumflex -40\nKPX Aacute Odieresis -40\nKPX Aacute Ograve -40\nKPX Aacute Ohungarumlaut -40\nKPX Aacute Omacron -40\nKPX Aacute Oslash -40\nKPX Aacute Otilde -40\nKPX Aacute Q -40\nKPX Aacute T -90\nKPX Aacute Tcaron -90\nKPX Aacute Tcommaaccent -90\nKPX Aacute U -50\nKPX Aacute Uacute -50\nKPX Aacute Ucircumflex -50\nKPX Aacute Udieresis -50\nKPX Aacute Ugrave -50\nKPX Aacute Uhungarumlaut -50\nKPX Aacute Umacron -50\nKPX Aacute Uogonek -50\nKPX Aacute Uring -50\nKPX Aacute V -80\nKPX Aacute W -60\nKPX Aacute Y -110\nKPX Aacute Yacute -110\nKPX Aacute Ydieresis -110\nKPX Aacute u -30\nKPX Aacute uacute -30\nKPX Aacute ucircumflex -30\nKPX Aacute udieresis -30\nKPX Aacute ugrave -30\nKPX Aacute uhungarumlaut -30\nKPX Aacute umacron -30\nKPX Aacute uogonek -30\nKPX Aacute uring -30\nKPX Aacute v -40\nKPX Aacute w -30\nKPX Aacute y -30\nKPX Aacute yacute -30\nKPX Aacute ydieresis -30\nKPX Abreve C -40\nKPX Abreve Cacute -40\nKPX Abreve Ccaron -40\nKPX Abreve Ccedilla -40\nKPX Abreve G -50\nKPX Abreve Gbreve -50\nKPX Abreve Gcommaaccent -50\nKPX Abreve O -40\nKPX Abreve Oacute -40\nKPX Abreve Ocircumflex -40\nKPX Abreve Odieresis -40\nKPX Abreve Ograve -40\nKPX Abreve Ohungarumlaut -40\nKPX Abreve Omacron -40\nKPX Abreve Oslash -40\nKPX Abreve Otilde -40\nKPX Abreve Q -40\nKPX Abreve T -90\nKPX Abreve Tcaron -90\nKPX Abreve Tcommaaccent -90\nKPX Abreve U -50\nKPX Abreve Uacute -50\nKPX Abreve Ucircumflex -50\nKPX Abreve Udieresis -50\nKPX Abreve Ugrave -50\nKPX Abreve Uhungarumlaut -50\nKPX Abreve Umacron -50\nKPX Abreve Uogonek -50\nKPX Abreve Uring -50\nKPX Abreve V -80\nKPX Abreve W -60\nKPX Abreve Y -110\nKPX Abreve Yacute -110\nKPX Abreve Ydieresis -110\nKPX Abreve u -30\nKPX Abreve uacute -30\nKPX Abreve ucircumflex -30\nKPX Abreve udieresis -30\nKPX Abreve ugrave -30\nKPX Abreve uhungarumlaut -30\nKPX Abreve umacron -30\nKPX Abreve uogonek -30\nKPX Abreve uring -30\nKPX Abreve v -40\nKPX Abreve w -30\nKPX Abreve y -30\nKPX Abreve yacute -30\nKPX Abreve ydieresis -30\nKPX Acircumflex C -40\nKPX Acircumflex Cacute -40\nKPX Acircumflex Ccaron -40\nKPX Acircumflex Ccedilla -40\nKPX Acircumflex G -50\nKPX Acircumflex Gbreve -50\nKPX Acircumflex Gcommaaccent -50\nKPX Acircumflex O -40\nKPX Acircumflex Oacute -40\nKPX Acircumflex Ocircumflex -40\nKPX Acircumflex Odieresis -40\nKPX Acircumflex Ograve -40\nKPX Acircumflex Ohungarumlaut -40\nKPX Acircumflex Omacron -40\nKPX Acircumflex Oslash -40\nKPX Acircumflex Otilde -40\nKPX Acircumflex Q -40\nKPX Acircumflex T -90\nKPX Acircumflex Tcaron -90\nKPX Acircumflex Tcommaaccent -90\nKPX Acircumflex U -50\nKPX Acircumflex Uacute -50\nKPX Acircumflex Ucircumflex -50\nKPX Acircumflex Udieresis -50\nKPX Acircumflex Ugrave -50\nKPX Acircumflex Uhungarumlaut -50\nKPX Acircumflex Umacron -50\nKPX Acircumflex Uogonek -50\nKPX Acircumflex Uring -50\nKPX Acircumflex V -80\nKPX Acircumflex W -60\nKPX Acircumflex Y -110\nKPX Acircumflex Yacute -110\nKPX Acircumflex Ydieresis -110\nKPX Acircumflex u -30\nKPX Acircumflex uacute -30\nKPX Acircumflex ucircumflex -30\nKPX Acircumflex udieresis -30\nKPX Acircumflex ugrave -30\nKPX Acircumflex uhungarumlaut -30\nKPX Acircumflex umacron -30\nKPX Acircumflex uogonek -30\nKPX Acircumflex uring -30\nKPX Acircumflex v -40\nKPX Acircumflex w -30\nKPX Acircumflex y -30\nKPX Acircumflex yacute -30\nKPX Acircumflex ydieresis -30\nKPX Adieresis C -40\nKPX Adieresis Cacute -40\nKPX Adieresis Ccaron -40\nKPX Adieresis Ccedilla -40\nKPX Adieresis G -50\nKPX Adieresis Gbreve -50\nKPX Adieresis Gcommaaccent -50\nKPX Adieresis O -40\nKPX Adieresis Oacute -40\nKPX Adieresis Ocircumflex -40\nKPX Adieresis Odieresis -40\nKPX Adieresis Ograve -40\nKPX Adieresis Ohungarumlaut -40\nKPX Adieresis Omacron -40\nKPX Adieresis Oslash -40\nKPX Adieresis Otilde -40\nKPX Adieresis Q -40\nKPX Adieresis T -90\nKPX Adieresis Tcaron -90\nKPX Adieresis Tcommaaccent -90\nKPX Adieresis U -50\nKPX Adieresis Uacute -50\nKPX Adieresis Ucircumflex -50\nKPX Adieresis Udieresis -50\nKPX Adieresis Ugrave -50\nKPX Adieresis Uhungarumlaut -50\nKPX Adieresis Umacron -50\nKPX Adieresis Uogonek -50\nKPX Adieresis Uring -50\nKPX Adieresis V -80\nKPX Adieresis W -60\nKPX Adieresis Y -110\nKPX Adieresis Yacute -110\nKPX Adieresis Ydieresis -110\nKPX Adieresis u -30\nKPX Adieresis uacute -30\nKPX Adieresis ucircumflex -30\nKPX Adieresis udieresis -30\nKPX Adieresis ugrave -30\nKPX Adieresis uhungarumlaut -30\nKPX Adieresis umacron -30\nKPX Adieresis uogonek -30\nKPX Adieresis uring -30\nKPX Adieresis v -40\nKPX Adieresis w -30\nKPX Adieresis y -30\nKPX Adieresis yacute -30\nKPX Adieresis ydieresis -30\nKPX Agrave C -40\nKPX Agrave Cacute -40\nKPX Agrave Ccaron -40\nKPX Agrave Ccedilla -40\nKPX Agrave G -50\nKPX Agrave Gbreve -50\nKPX Agrave Gcommaaccent -50\nKPX Agrave O -40\nKPX Agrave Oacute -40\nKPX Agrave Ocircumflex -40\nKPX Agrave Odieresis -40\nKPX Agrave Ograve -40\nKPX Agrave Ohungarumlaut -40\nKPX Agrave Omacron -40\nKPX Agrave Oslash -40\nKPX Agrave Otilde -40\nKPX Agrave Q -40\nKPX Agrave T -90\nKPX Agrave Tcaron -90\nKPX Agrave Tcommaaccent -90\nKPX Agrave U -50\nKPX Agrave Uacute -50\nKPX Agrave Ucircumflex -50\nKPX Agrave Udieresis -50\nKPX Agrave Ugrave -50\nKPX Agrave Uhungarumlaut -50\nKPX Agrave Umacron -50\nKPX Agrave Uogonek -50\nKPX Agrave Uring -50\nKPX Agrave V -80\nKPX Agrave W -60\nKPX Agrave Y -110\nKPX Agrave Yacute -110\nKPX Agrave Ydieresis -110\nKPX Agrave u -30\nKPX Agrave uacute -30\nKPX Agrave ucircumflex -30\nKPX Agrave udieresis -30\nKPX Agrave ugrave -30\nKPX Agrave uhungarumlaut -30\nKPX Agrave umacron -30\nKPX Agrave uogonek -30\nKPX Agrave uring -30\nKPX Agrave v -40\nKPX Agrave w -30\nKPX Agrave y -30\nKPX Agrave yacute -30\nKPX Agrave ydieresis -30\nKPX Amacron C -40\nKPX Amacron Cacute -40\nKPX Amacron Ccaron -40\nKPX Amacron Ccedilla -40\nKPX Amacron G -50\nKPX Amacron Gbreve -50\nKPX Amacron Gcommaaccent -50\nKPX Amacron O -40\nKPX Amacron Oacute -40\nKPX Amacron Ocircumflex -40\nKPX Amacron Odieresis -40\nKPX Amacron Ograve -40\nKPX Amacron Ohungarumlaut -40\nKPX Amacron Omacron -40\nKPX Amacron Oslash -40\nKPX Amacron Otilde -40\nKPX Amacron Q -40\nKPX Amacron T -90\nKPX Amacron Tcaron -90\nKPX Amacron Tcommaaccent -90\nKPX Amacron U -50\nKPX Amacron Uacute -50\nKPX Amacron Ucircumflex -50\nKPX Amacron Udieresis -50\nKPX Amacron Ugrave -50\nKPX Amacron Uhungarumlaut -50\nKPX Amacron Umacron -50\nKPX Amacron Uogonek -50\nKPX Amacron Uring -50\nKPX Amacron V -80\nKPX Amacron W -60\nKPX Amacron Y -110\nKPX Amacron Yacute -110\nKPX Amacron Ydieresis -110\nKPX Amacron u -30\nKPX Amacron uacute -30\nKPX Amacron ucircumflex -30\nKPX Amacron udieresis -30\nKPX Amacron ugrave -30\nKPX Amacron uhungarumlaut -30\nKPX Amacron umacron -30\nKPX Amacron uogonek -30\nKPX Amacron uring -30\nKPX Amacron v -40\nKPX Amacron w -30\nKPX Amacron y -30\nKPX Amacron yacute -30\nKPX Amacron ydieresis -30\nKPX Aogonek C -40\nKPX Aogonek Cacute -40\nKPX Aogonek Ccaron -40\nKPX Aogonek Ccedilla -40\nKPX Aogonek G -50\nKPX Aogonek Gbreve -50\nKPX Aogonek Gcommaaccent -50\nKPX Aogonek O -40\nKPX Aogonek Oacute -40\nKPX Aogonek Ocircumflex -40\nKPX Aogonek Odieresis -40\nKPX Aogonek Ograve -40\nKPX Aogonek Ohungarumlaut -40\nKPX Aogonek Omacron -40\nKPX Aogonek Oslash -40\nKPX Aogonek Otilde -40\nKPX Aogonek Q -40\nKPX Aogonek T -90\nKPX Aogonek Tcaron -90\nKPX Aogonek Tcommaaccent -90\nKPX Aogonek U -50\nKPX Aogonek Uacute -50\nKPX Aogonek Ucircumflex -50\nKPX Aogonek Udieresis -50\nKPX Aogonek Ugrave -50\nKPX Aogonek Uhungarumlaut -50\nKPX Aogonek Umacron -50\nKPX Aogonek Uogonek -50\nKPX Aogonek Uring -50\nKPX Aogonek V -80\nKPX Aogonek W -60\nKPX Aogonek Y -110\nKPX Aogonek Yacute -110\nKPX Aogonek Ydieresis -110\nKPX Aogonek u -30\nKPX Aogonek uacute -30\nKPX Aogonek ucircumflex -30\nKPX Aogonek udieresis -30\nKPX Aogonek ugrave -30\nKPX Aogonek uhungarumlaut -30\nKPX Aogonek umacron -30\nKPX Aogonek uogonek -30\nKPX Aogonek uring -30\nKPX Aogonek v -40\nKPX Aogonek w -30\nKPX Aogonek y -30\nKPX Aogonek yacute -30\nKPX Aogonek ydieresis -30\nKPX Aring C -40\nKPX Aring Cacute -40\nKPX Aring Ccaron -40\nKPX Aring Ccedilla -40\nKPX Aring G -50\nKPX Aring Gbreve -50\nKPX Aring Gcommaaccent -50\nKPX Aring O -40\nKPX Aring Oacute -40\nKPX Aring Ocircumflex -40\nKPX Aring Odieresis -40\nKPX Aring Ograve -40\nKPX Aring Ohungarumlaut -40\nKPX Aring Omacron -40\nKPX Aring Oslash -40\nKPX Aring Otilde -40\nKPX Aring Q -40\nKPX Aring T -90\nKPX Aring Tcaron -90\nKPX Aring Tcommaaccent -90\nKPX Aring U -50\nKPX Aring Uacute -50\nKPX Aring Ucircumflex -50\nKPX Aring Udieresis -50\nKPX Aring Ugrave -50\nKPX Aring Uhungarumlaut -50\nKPX Aring Umacron -50\nKPX Aring Uogonek -50\nKPX Aring Uring -50\nKPX Aring V -80\nKPX Aring W -60\nKPX Aring Y -110\nKPX Aring Yacute -110\nKPX Aring Ydieresis -110\nKPX Aring u -30\nKPX Aring uacute -30\nKPX Aring ucircumflex -30\nKPX Aring udieresis -30\nKPX Aring ugrave -30\nKPX Aring uhungarumlaut -30\nKPX Aring umacron -30\nKPX Aring uogonek -30\nKPX Aring uring -30\nKPX Aring v -40\nKPX Aring w -30\nKPX Aring y -30\nKPX Aring yacute -30\nKPX Aring ydieresis -30\nKPX Atilde C -40\nKPX Atilde Cacute -40\nKPX Atilde Ccaron -40\nKPX Atilde Ccedilla -40\nKPX Atilde G -50\nKPX Atilde Gbreve -50\nKPX Atilde Gcommaaccent -50\nKPX Atilde O -40\nKPX Atilde Oacute -40\nKPX Atilde Ocircumflex -40\nKPX Atilde Odieresis -40\nKPX Atilde Ograve -40\nKPX Atilde Ohungarumlaut -40\nKPX Atilde Omacron -40\nKPX Atilde Oslash -40\nKPX Atilde Otilde -40\nKPX Atilde Q -40\nKPX Atilde T -90\nKPX Atilde Tcaron -90\nKPX Atilde Tcommaaccent -90\nKPX Atilde U -50\nKPX Atilde Uacute -50\nKPX Atilde Ucircumflex -50\nKPX Atilde Udieresis -50\nKPX Atilde Ugrave -50\nKPX Atilde Uhungarumlaut -50\nKPX Atilde Umacron -50\nKPX Atilde Uogonek -50\nKPX Atilde Uring -50\nKPX Atilde V -80\nKPX Atilde W -60\nKPX Atilde Y -110\nKPX Atilde Yacute -110\nKPX Atilde Ydieresis -110\nKPX Atilde u -30\nKPX Atilde uacute -30\nKPX Atilde ucircumflex -30\nKPX Atilde udieresis -30\nKPX Atilde ugrave -30\nKPX Atilde uhungarumlaut -30\nKPX Atilde umacron -30\nKPX Atilde uogonek -30\nKPX Atilde uring -30\nKPX Atilde v -40\nKPX Atilde w -30\nKPX Atilde y -30\nKPX Atilde yacute -30\nKPX Atilde ydieresis -30\nKPX B A -30\nKPX B Aacute -30\nKPX B Abreve -30\nKPX B Acircumflex -30\nKPX B Adieresis -30\nKPX B Agrave -30\nKPX B Amacron -30\nKPX B Aogonek -30\nKPX B Aring -30\nKPX B Atilde -30\nKPX B U -10\nKPX B Uacute -10\nKPX B Ucircumflex -10\nKPX B Udieresis -10\nKPX B Ugrave -10\nKPX B Uhungarumlaut -10\nKPX B Umacron -10\nKPX B Uogonek -10\nKPX B Uring -10\nKPX D A -40\nKPX D Aacute -40\nKPX D Abreve -40\nKPX D Acircumflex -40\nKPX D Adieresis -40\nKPX D Agrave -40\nKPX D Amacron -40\nKPX D Aogonek -40\nKPX D Aring -40\nKPX D Atilde -40\nKPX D V -40\nKPX D W -40\nKPX D Y -70\nKPX D Yacute -70\nKPX D Ydieresis -70\nKPX D comma -30\nKPX D period -30\nKPX Dcaron A -40\nKPX Dcaron Aacute -40\nKPX Dcaron Abreve -40\nKPX Dcaron Acircumflex -40\nKPX Dcaron Adieresis -40\nKPX Dcaron Agrave -40\nKPX Dcaron Amacron -40\nKPX Dcaron Aogonek -40\nKPX Dcaron Aring -40\nKPX Dcaron Atilde -40\nKPX Dcaron V -40\nKPX Dcaron W -40\nKPX Dcaron Y -70\nKPX Dcaron Yacute -70\nKPX Dcaron Ydieresis -70\nKPX Dcaron comma -30\nKPX Dcaron period -30\nKPX Dcroat A -40\nKPX Dcroat Aacute -40\nKPX Dcroat Abreve -40\nKPX Dcroat Acircumflex -40\nKPX Dcroat Adieresis -40\nKPX Dcroat Agrave -40\nKPX Dcroat Amacron -40\nKPX Dcroat Aogonek -40\nKPX Dcroat Aring -40\nKPX Dcroat Atilde -40\nKPX Dcroat V -40\nKPX Dcroat W -40\nKPX Dcroat Y -70\nKPX Dcroat Yacute -70\nKPX Dcroat Ydieresis -70\nKPX Dcroat comma -30\nKPX Dcroat period -30\nKPX F A -80\nKPX F Aacute -80\nKPX F Abreve -80\nKPX F Acircumflex -80\nKPX F Adieresis -80\nKPX F Agrave -80\nKPX F Amacron -80\nKPX F Aogonek -80\nKPX F Aring -80\nKPX F Atilde -80\nKPX F a -20\nKPX F aacute -20\nKPX F abreve -20\nKPX F acircumflex -20\nKPX F adieresis -20\nKPX F agrave -20\nKPX F amacron -20\nKPX F aogonek -20\nKPX F aring -20\nKPX F atilde -20\nKPX F comma -100\nKPX F period -100\nKPX J A -20\nKPX J Aacute -20\nKPX J Abreve -20\nKPX J Acircumflex -20\nKPX J Adieresis -20\nKPX J Agrave -20\nKPX J Amacron -20\nKPX J Aogonek -20\nKPX J Aring -20\nKPX J Atilde -20\nKPX J comma -20\nKPX J period -20\nKPX J u -20\nKPX J uacute -20\nKPX J ucircumflex -20\nKPX J udieresis -20\nKPX J ugrave -20\nKPX J uhungarumlaut -20\nKPX J umacron -20\nKPX J uogonek -20\nKPX J uring -20\nKPX K O -30\nKPX K Oacute -30\nKPX K Ocircumflex -30\nKPX K Odieresis -30\nKPX K Ograve -30\nKPX K Ohungarumlaut -30\nKPX K Omacron -30\nKPX K Oslash -30\nKPX K Otilde -30\nKPX K e -15\nKPX K eacute -15\nKPX K ecaron -15\nKPX K ecircumflex -15\nKPX K edieresis -15\nKPX K edotaccent -15\nKPX K egrave -15\nKPX K emacron -15\nKPX K eogonek -15\nKPX K o -35\nKPX K oacute -35\nKPX K ocircumflex -35\nKPX K odieresis -35\nKPX K ograve -35\nKPX K ohungarumlaut -35\nKPX K omacron -35\nKPX K oslash -35\nKPX K otilde -35\nKPX K u -30\nKPX K uacute -30\nKPX K ucircumflex -30\nKPX K udieresis -30\nKPX K ugrave -30\nKPX K uhungarumlaut -30\nKPX K umacron -30\nKPX K uogonek -30\nKPX K uring -30\nKPX K y -40\nKPX K yacute -40\nKPX K ydieresis -40\nKPX Kcommaaccent O -30\nKPX Kcommaaccent Oacute -30\nKPX Kcommaaccent Ocircumflex -30\nKPX Kcommaaccent Odieresis -30\nKPX Kcommaaccent Ograve -30\nKPX Kcommaaccent Ohungarumlaut -30\nKPX Kcommaaccent Omacron -30\nKPX Kcommaaccent Oslash -30\nKPX Kcommaaccent Otilde -30\nKPX Kcommaaccent e -15\nKPX Kcommaaccent eacute -15\nKPX Kcommaaccent ecaron -15\nKPX Kcommaaccent ecircumflex -15\nKPX Kcommaaccent edieresis -15\nKPX Kcommaaccent edotaccent -15\nKPX Kcommaaccent egrave -15\nKPX Kcommaaccent emacron -15\nKPX Kcommaaccent eogonek -15\nKPX Kcommaaccent o -35\nKPX Kcommaaccent oacute -35\nKPX Kcommaaccent ocircumflex -35\nKPX Kcommaaccent odieresis -35\nKPX Kcommaaccent ograve -35\nKPX Kcommaaccent ohungarumlaut -35\nKPX Kcommaaccent omacron -35\nKPX Kcommaaccent oslash -35\nKPX Kcommaaccent otilde -35\nKPX Kcommaaccent u -30\nKPX Kcommaaccent uacute -30\nKPX Kcommaaccent ucircumflex -30\nKPX Kcommaaccent udieresis -30\nKPX Kcommaaccent ugrave -30\nKPX Kcommaaccent uhungarumlaut -30\nKPX Kcommaaccent umacron -30\nKPX Kcommaaccent uogonek -30\nKPX Kcommaaccent uring -30\nKPX Kcommaaccent y -40\nKPX Kcommaaccent yacute -40\nKPX Kcommaaccent ydieresis -40\nKPX L T -90\nKPX L Tcaron -90\nKPX L Tcommaaccent -90\nKPX L V -110\nKPX L W -80\nKPX L Y -120\nKPX L Yacute -120\nKPX L Ydieresis -120\nKPX L quotedblright -140\nKPX L quoteright -140\nKPX L y -30\nKPX L yacute -30\nKPX L ydieresis -30\nKPX Lacute T -90\nKPX Lacute Tcaron -90\nKPX Lacute Tcommaaccent -90\nKPX Lacute V -110\nKPX Lacute W -80\nKPX Lacute Y -120\nKPX Lacute Yacute -120\nKPX Lacute Ydieresis -120\nKPX Lacute quotedblright -140\nKPX Lacute quoteright -140\nKPX Lacute y -30\nKPX Lacute yacute -30\nKPX Lacute ydieresis -30\nKPX Lcommaaccent T -90\nKPX Lcommaaccent Tcaron -90\nKPX Lcommaaccent Tcommaaccent -90\nKPX Lcommaaccent V -110\nKPX Lcommaaccent W -80\nKPX Lcommaaccent Y -120\nKPX Lcommaaccent Yacute -120\nKPX Lcommaaccent Ydieresis -120\nKPX Lcommaaccent quotedblright -140\nKPX Lcommaaccent quoteright -140\nKPX Lcommaaccent y -30\nKPX Lcommaaccent yacute -30\nKPX Lcommaaccent ydieresis -30\nKPX Lslash T -90\nKPX Lslash Tcaron -90\nKPX Lslash Tcommaaccent -90\nKPX Lslash V -110\nKPX Lslash W -80\nKPX Lslash Y -120\nKPX Lslash Yacute -120\nKPX Lslash Ydieresis -120\nKPX Lslash quotedblright -140\nKPX Lslash quoteright -140\nKPX Lslash y -30\nKPX Lslash yacute -30\nKPX Lslash ydieresis -30\nKPX O A -50\nKPX O Aacute -50\nKPX O Abreve -50\nKPX O Acircumflex -50\nKPX O Adieresis -50\nKPX O Agrave -50\nKPX O Amacron -50\nKPX O Aogonek -50\nKPX O Aring -50\nKPX O Atilde -50\nKPX O T -40\nKPX O Tcaron -40\nKPX O Tcommaaccent -40\nKPX O V -50\nKPX O W -50\nKPX O X -50\nKPX O Y -70\nKPX O Yacute -70\nKPX O Ydieresis -70\nKPX O comma -40\nKPX O period -40\nKPX Oacute A -50\nKPX Oacute Aacute -50\nKPX Oacute Abreve -50\nKPX Oacute Acircumflex -50\nKPX Oacute Adieresis -50\nKPX Oacute Agrave -50\nKPX Oacute Amacron -50\nKPX Oacute Aogonek -50\nKPX Oacute Aring -50\nKPX Oacute Atilde -50\nKPX Oacute T -40\nKPX Oacute Tcaron -40\nKPX Oacute Tcommaaccent -40\nKPX Oacute V -50\nKPX Oacute W -50\nKPX Oacute X -50\nKPX Oacute Y -70\nKPX Oacute Yacute -70\nKPX Oacute Ydieresis -70\nKPX Oacute comma -40\nKPX Oacute period -40\nKPX Ocircumflex A -50\nKPX Ocircumflex Aacute -50\nKPX Ocircumflex Abreve -50\nKPX Ocircumflex Acircumflex -50\nKPX Ocircumflex Adieresis -50\nKPX Ocircumflex Agrave -50\nKPX Ocircumflex Amacron -50\nKPX Ocircumflex Aogonek -50\nKPX Ocircumflex Aring -50\nKPX Ocircumflex Atilde -50\nKPX Ocircumflex T -40\nKPX Ocircumflex Tcaron -40\nKPX Ocircumflex Tcommaaccent -40\nKPX Ocircumflex V -50\nKPX Ocircumflex W -50\nKPX Ocircumflex X -50\nKPX Ocircumflex Y -70\nKPX Ocircumflex Yacute -70\nKPX Ocircumflex Ydieresis -70\nKPX Ocircumflex comma -40\nKPX Ocircumflex period -40\nKPX Odieresis A -50\nKPX Odieresis Aacute -50\nKPX Odieresis Abreve -50\nKPX Odieresis Acircumflex -50\nKPX Odieresis Adieresis -50\nKPX Odieresis Agrave -50\nKPX Odieresis Amacron -50\nKPX Odieresis Aogonek -50\nKPX Odieresis Aring -50\nKPX Odieresis Atilde -50\nKPX Odieresis T -40\nKPX Odieresis Tcaron -40\nKPX Odieresis Tcommaaccent -40\nKPX Odieresis V -50\nKPX Odieresis W -50\nKPX Odieresis X -50\nKPX Odieresis Y -70\nKPX Odieresis Yacute -70\nKPX Odieresis Ydieresis -70\nKPX Odieresis comma -40\nKPX Odieresis period -40\nKPX Ograve A -50\nKPX Ograve Aacute -50\nKPX Ograve Abreve -50\nKPX Ograve Acircumflex -50\nKPX Ograve Adieresis -50\nKPX Ograve Agrave -50\nKPX Ograve Amacron -50\nKPX Ograve Aogonek -50\nKPX Ograve Aring -50\nKPX Ograve Atilde -50\nKPX Ograve T -40\nKPX Ograve Tcaron -40\nKPX Ograve Tcommaaccent -40\nKPX Ograve V -50\nKPX Ograve W -50\nKPX Ograve X -50\nKPX Ograve Y -70\nKPX Ograve Yacute -70\nKPX Ograve Ydieresis -70\nKPX Ograve comma -40\nKPX Ograve period -40\nKPX Ohungarumlaut A -50\nKPX Ohungarumlaut Aacute -50\nKPX Ohungarumlaut Abreve -50\nKPX Ohungarumlaut Acircumflex -50\nKPX Ohungarumlaut Adieresis -50\nKPX Ohungarumlaut Agrave -50\nKPX Ohungarumlaut Amacron -50\nKPX Ohungarumlaut Aogonek -50\nKPX Ohungarumlaut Aring -50\nKPX Ohungarumlaut Atilde -50\nKPX Ohungarumlaut T -40\nKPX Ohungarumlaut Tcaron -40\nKPX Ohungarumlaut Tcommaaccent -40\nKPX Ohungarumlaut V -50\nKPX Ohungarumlaut W -50\nKPX Ohungarumlaut X -50\nKPX Ohungarumlaut Y -70\nKPX Ohungarumlaut Yacute -70\nKPX Ohungarumlaut Ydieresis -70\nKPX Ohungarumlaut comma -40\nKPX Ohungarumlaut period -40\nKPX Omacron A -50\nKPX Omacron Aacute -50\nKPX Omacron Abreve -50\nKPX Omacron Acircumflex -50\nKPX Omacron Adieresis -50\nKPX Omacron Agrave -50\nKPX Omacron Amacron -50\nKPX Omacron Aogonek -50\nKPX Omacron Aring -50\nKPX Omacron Atilde -50\nKPX Omacron T -40\nKPX Omacron Tcaron -40\nKPX Omacron Tcommaaccent -40\nKPX Omacron V -50\nKPX Omacron W -50\nKPX Omacron X -50\nKPX Omacron Y -70\nKPX Omacron Yacute -70\nKPX Omacron Ydieresis -70\nKPX Omacron comma -40\nKPX Omacron period -40\nKPX Oslash A -50\nKPX Oslash Aacute -50\nKPX Oslash Abreve -50\nKPX Oslash Acircumflex -50\nKPX Oslash Adieresis -50\nKPX Oslash Agrave -50\nKPX Oslash Amacron -50\nKPX Oslash Aogonek -50\nKPX Oslash Aring -50\nKPX Oslash Atilde -50\nKPX Oslash T -40\nKPX Oslash Tcaron -40\nKPX Oslash Tcommaaccent -40\nKPX Oslash V -50\nKPX Oslash W -50\nKPX Oslash X -50\nKPX Oslash Y -70\nKPX Oslash Yacute -70\nKPX Oslash Ydieresis -70\nKPX Oslash comma -40\nKPX Oslash period -40\nKPX Otilde A -50\nKPX Otilde Aacute -50\nKPX Otilde Abreve -50\nKPX Otilde Acircumflex -50\nKPX Otilde Adieresis -50\nKPX Otilde Agrave -50\nKPX Otilde Amacron -50\nKPX Otilde Aogonek -50\nKPX Otilde Aring -50\nKPX Otilde Atilde -50\nKPX Otilde T -40\nKPX Otilde Tcaron -40\nKPX Otilde Tcommaaccent -40\nKPX Otilde V -50\nKPX Otilde W -50\nKPX Otilde X -50\nKPX Otilde Y -70\nKPX Otilde Yacute -70\nKPX Otilde Ydieresis -70\nKPX Otilde comma -40\nKPX Otilde period -40\nKPX P A -100\nKPX P Aacute -100\nKPX P Abreve -100\nKPX P Acircumflex -100\nKPX P Adieresis -100\nKPX P Agrave -100\nKPX P Amacron -100\nKPX P Aogonek -100\nKPX P Aring -100\nKPX P Atilde -100\nKPX P a -30\nKPX P aacute -30\nKPX P abreve -30\nKPX P acircumflex -30\nKPX P adieresis -30\nKPX P agrave -30\nKPX P amacron -30\nKPX P aogonek -30\nKPX P aring -30\nKPX P atilde -30\nKPX P comma -120\nKPX P e -30\nKPX P eacute -30\nKPX P ecaron -30\nKPX P ecircumflex -30\nKPX P edieresis -30\nKPX P edotaccent -30\nKPX P egrave -30\nKPX P emacron -30\nKPX P eogonek -30\nKPX P o -40\nKPX P oacute -40\nKPX P ocircumflex -40\nKPX P odieresis -40\nKPX P ograve -40\nKPX P ohungarumlaut -40\nKPX P omacron -40\nKPX P oslash -40\nKPX P otilde -40\nKPX P period -120\nKPX Q U -10\nKPX Q Uacute -10\nKPX Q Ucircumflex -10\nKPX Q Udieresis -10\nKPX Q Ugrave -10\nKPX Q Uhungarumlaut -10\nKPX Q Umacron -10\nKPX Q Uogonek -10\nKPX Q Uring -10\nKPX Q comma 20\nKPX Q period 20\nKPX R O -20\nKPX R Oacute -20\nKPX R Ocircumflex -20\nKPX R Odieresis -20\nKPX R Ograve -20\nKPX R Ohungarumlaut -20\nKPX R Omacron -20\nKPX R Oslash -20\nKPX R Otilde -20\nKPX R T -20\nKPX R Tcaron -20\nKPX R Tcommaaccent -20\nKPX R U -20\nKPX R Uacute -20\nKPX R Ucircumflex -20\nKPX R Udieresis -20\nKPX R Ugrave -20\nKPX R Uhungarumlaut -20\nKPX R Umacron -20\nKPX R Uogonek -20\nKPX R Uring -20\nKPX R V -50\nKPX R W -40\nKPX R Y -50\nKPX R Yacute -50\nKPX R Ydieresis -50\nKPX Racute O -20\nKPX Racute Oacute -20\nKPX Racute Ocircumflex -20\nKPX Racute Odieresis -20\nKPX Racute Ograve -20\nKPX Racute Ohungarumlaut -20\nKPX Racute Omacron -20\nKPX Racute Oslash -20\nKPX Racute Otilde -20\nKPX Racute T -20\nKPX Racute Tcaron -20\nKPX Racute Tcommaaccent -20\nKPX Racute U -20\nKPX Racute Uacute -20\nKPX Racute Ucircumflex -20\nKPX Racute Udieresis -20\nKPX Racute Ugrave -20\nKPX Racute Uhungarumlaut -20\nKPX Racute Umacron -20\nKPX Racute Uogonek -20\nKPX Racute Uring -20\nKPX Racute V -50\nKPX Racute W -40\nKPX Racute Y -50\nKPX Racute Yacute -50\nKPX Racute Ydieresis -50\nKPX Rcaron O -20\nKPX Rcaron Oacute -20\nKPX Rcaron Ocircumflex -20\nKPX Rcaron Odieresis -20\nKPX Rcaron Ograve -20\nKPX Rcaron Ohungarumlaut -20\nKPX Rcaron Omacron -20\nKPX Rcaron Oslash -20\nKPX Rcaron Otilde -20\nKPX Rcaron T -20\nKPX Rcaron Tcaron -20\nKPX Rcaron Tcommaaccent -20\nKPX Rcaron U -20\nKPX Rcaron Uacute -20\nKPX Rcaron Ucircumflex -20\nKPX Rcaron Udieresis -20\nKPX Rcaron Ugrave -20\nKPX Rcaron Uhungarumlaut -20\nKPX Rcaron Umacron -20\nKPX Rcaron Uogonek -20\nKPX Rcaron Uring -20\nKPX Rcaron V -50\nKPX Rcaron W -40\nKPX Rcaron Y -50\nKPX Rcaron Yacute -50\nKPX Rcaron Ydieresis -50\nKPX Rcommaaccent O -20\nKPX Rcommaaccent Oacute -20\nKPX Rcommaaccent Ocircumflex -20\nKPX Rcommaaccent Odieresis -20\nKPX Rcommaaccent Ograve -20\nKPX Rcommaaccent Ohungarumlaut -20\nKPX Rcommaaccent Omacron -20\nKPX Rcommaaccent Oslash -20\nKPX Rcommaaccent Otilde -20\nKPX Rcommaaccent T -20\nKPX Rcommaaccent Tcaron -20\nKPX Rcommaaccent Tcommaaccent -20\nKPX Rcommaaccent U -20\nKPX Rcommaaccent Uacute -20\nKPX Rcommaaccent Ucircumflex -20\nKPX Rcommaaccent Udieresis -20\nKPX Rcommaaccent Ugrave -20\nKPX Rcommaaccent Uhungarumlaut -20\nKPX Rcommaaccent Umacron -20\nKPX Rcommaaccent Uogonek -20\nKPX Rcommaaccent Uring -20\nKPX Rcommaaccent V -50\nKPX Rcommaaccent W -40\nKPX Rcommaaccent Y -50\nKPX Rcommaaccent Yacute -50\nKPX Rcommaaccent Ydieresis -50\nKPX T A -90\nKPX T Aacute -90\nKPX T Abreve -90\nKPX T Acircumflex -90\nKPX T Adieresis -90\nKPX T Agrave -90\nKPX T Amacron -90\nKPX T Aogonek -90\nKPX T Aring -90\nKPX T Atilde -90\nKPX T O -40\nKPX T Oacute -40\nKPX T Ocircumflex -40\nKPX T Odieresis -40\nKPX T Ograve -40\nKPX T Ohungarumlaut -40\nKPX T Omacron -40\nKPX T Oslash -40\nKPX T Otilde -40\nKPX T a -80\nKPX T aacute -80\nKPX T abreve -80\nKPX T acircumflex -80\nKPX T adieresis -80\nKPX T agrave -80\nKPX T amacron -80\nKPX T aogonek -80\nKPX T aring -80\nKPX T atilde -80\nKPX T colon -40\nKPX T comma -80\nKPX T e -60\nKPX T eacute -60\nKPX T ecaron -60\nKPX T ecircumflex -60\nKPX T edieresis -60\nKPX T edotaccent -60\nKPX T egrave -60\nKPX T emacron -60\nKPX T eogonek -60\nKPX T hyphen -120\nKPX T o -80\nKPX T oacute -80\nKPX T ocircumflex -80\nKPX T odieresis -80\nKPX T ograve -80\nKPX T ohungarumlaut -80\nKPX T omacron -80\nKPX T oslash -80\nKPX T otilde -80\nKPX T period -80\nKPX T r -80\nKPX T racute -80\nKPX T rcommaaccent -80\nKPX T semicolon -40\nKPX T u -90\nKPX T uacute -90\nKPX T ucircumflex -90\nKPX T udieresis -90\nKPX T ugrave -90\nKPX T uhungarumlaut -90\nKPX T umacron -90\nKPX T uogonek -90\nKPX T uring -90\nKPX T w -60\nKPX T y -60\nKPX T yacute -60\nKPX T ydieresis -60\nKPX Tcaron A -90\nKPX Tcaron Aacute -90\nKPX Tcaron Abreve -90\nKPX Tcaron Acircumflex -90\nKPX Tcaron Adieresis -90\nKPX Tcaron Agrave -90\nKPX Tcaron Amacron -90\nKPX Tcaron Aogonek -90\nKPX Tcaron Aring -90\nKPX Tcaron Atilde -90\nKPX Tcaron O -40\nKPX Tcaron Oacute -40\nKPX Tcaron Ocircumflex -40\nKPX Tcaron Odieresis -40\nKPX Tcaron Ograve -40\nKPX Tcaron Ohungarumlaut -40\nKPX Tcaron Omacron -40\nKPX Tcaron Oslash -40\nKPX Tcaron Otilde -40\nKPX Tcaron a -80\nKPX Tcaron aacute -80\nKPX Tcaron abreve -80\nKPX Tcaron acircumflex -80\nKPX Tcaron adieresis -80\nKPX Tcaron agrave -80\nKPX Tcaron amacron -80\nKPX Tcaron aogonek -80\nKPX Tcaron aring -80\nKPX Tcaron atilde -80\nKPX Tcaron colon -40\nKPX Tcaron comma -80\nKPX Tcaron e -60\nKPX Tcaron eacute -60\nKPX Tcaron ecaron -60\nKPX Tcaron ecircumflex -60\nKPX Tcaron edieresis -60\nKPX Tcaron edotaccent -60\nKPX Tcaron egrave -60\nKPX Tcaron emacron -60\nKPX Tcaron eogonek -60\nKPX Tcaron hyphen -120\nKPX Tcaron o -80\nKPX Tcaron oacute -80\nKPX Tcaron ocircumflex -80\nKPX Tcaron odieresis -80\nKPX Tcaron ograve -80\nKPX Tcaron ohungarumlaut -80\nKPX Tcaron omacron -80\nKPX Tcaron oslash -80\nKPX Tcaron otilde -80\nKPX Tcaron period -80\nKPX Tcaron r -80\nKPX Tcaron racute -80\nKPX Tcaron rcommaaccent -80\nKPX Tcaron semicolon -40\nKPX Tcaron u -90\nKPX Tcaron uacute -90\nKPX Tcaron ucircumflex -90\nKPX Tcaron udieresis -90\nKPX Tcaron ugrave -90\nKPX Tcaron uhungarumlaut -90\nKPX Tcaron umacron -90\nKPX Tcaron uogonek -90\nKPX Tcaron uring -90\nKPX Tcaron w -60\nKPX Tcaron y -60\nKPX Tcaron yacute -60\nKPX Tcaron ydieresis -60\nKPX Tcommaaccent A -90\nKPX Tcommaaccent Aacute -90\nKPX Tcommaaccent Abreve -90\nKPX Tcommaaccent Acircumflex -90\nKPX Tcommaaccent Adieresis -90\nKPX Tcommaaccent Agrave -90\nKPX Tcommaaccent Amacron -90\nKPX Tcommaaccent Aogonek -90\nKPX Tcommaaccent Aring -90\nKPX Tcommaaccent Atilde -90\nKPX Tcommaaccent O -40\nKPX Tcommaaccent Oacute -40\nKPX Tcommaaccent Ocircumflex -40\nKPX Tcommaaccent Odieresis -40\nKPX Tcommaaccent Ograve -40\nKPX Tcommaaccent Ohungarumlaut -40\nKPX Tcommaaccent Omacron -40\nKPX Tcommaaccent Oslash -40\nKPX Tcommaaccent Otilde -40\nKPX Tcommaaccent a -80\nKPX Tcommaaccent aacute -80\nKPX Tcommaaccent abreve -80\nKPX Tcommaaccent acircumflex -80\nKPX Tcommaaccent adieresis -80\nKPX Tcommaaccent agrave -80\nKPX Tcommaaccent amacron -80\nKPX Tcommaaccent aogonek -80\nKPX Tcommaaccent aring -80\nKPX Tcommaaccent atilde -80\nKPX Tcommaaccent colon -40\nKPX Tcommaaccent comma -80\nKPX Tcommaaccent e -60\nKPX Tcommaaccent eacute -60\nKPX Tcommaaccent ecaron -60\nKPX Tcommaaccent ecircumflex -60\nKPX Tcommaaccent edieresis -60\nKPX Tcommaaccent edotaccent -60\nKPX Tcommaaccent egrave -60\nKPX Tcommaaccent emacron -60\nKPX Tcommaaccent eogonek -60\nKPX Tcommaaccent hyphen -120\nKPX Tcommaaccent o -80\nKPX Tcommaaccent oacute -80\nKPX Tcommaaccent ocircumflex -80\nKPX Tcommaaccent odieresis -80\nKPX Tcommaaccent ograve -80\nKPX Tcommaaccent ohungarumlaut -80\nKPX Tcommaaccent omacron -80\nKPX Tcommaaccent oslash -80\nKPX Tcommaaccent otilde -80\nKPX Tcommaaccent period -80\nKPX Tcommaaccent r -80\nKPX Tcommaaccent racute -80\nKPX Tcommaaccent rcommaaccent -80\nKPX Tcommaaccent semicolon -40\nKPX Tcommaaccent u -90\nKPX Tcommaaccent uacute -90\nKPX Tcommaaccent ucircumflex -90\nKPX Tcommaaccent udieresis -90\nKPX Tcommaaccent ugrave -90\nKPX Tcommaaccent uhungarumlaut -90\nKPX Tcommaaccent umacron -90\nKPX Tcommaaccent uogonek -90\nKPX Tcommaaccent uring -90\nKPX Tcommaaccent w -60\nKPX Tcommaaccent y -60\nKPX Tcommaaccent yacute -60\nKPX Tcommaaccent ydieresis -60\nKPX U A -50\nKPX U Aacute -50\nKPX U Abreve -50\nKPX U Acircumflex -50\nKPX U Adieresis -50\nKPX U Agrave -50\nKPX U Amacron -50\nKPX U Aogonek -50\nKPX U Aring -50\nKPX U Atilde -50\nKPX U comma -30\nKPX U period -30\nKPX Uacute A -50\nKPX Uacute Aacute -50\nKPX Uacute Abreve -50\nKPX Uacute Acircumflex -50\nKPX Uacute Adieresis -50\nKPX Uacute Agrave -50\nKPX Uacute Amacron -50\nKPX Uacute Aogonek -50\nKPX Uacute Aring -50\nKPX Uacute Atilde -50\nKPX Uacute comma -30\nKPX Uacute period -30\nKPX Ucircumflex A -50\nKPX Ucircumflex Aacute -50\nKPX Ucircumflex Abreve -50\nKPX Ucircumflex Acircumflex -50\nKPX Ucircumflex Adieresis -50\nKPX Ucircumflex Agrave -50\nKPX Ucircumflex Amacron -50\nKPX Ucircumflex Aogonek -50\nKPX Ucircumflex Aring -50\nKPX Ucircumflex Atilde -50\nKPX Ucircumflex comma -30\nKPX Ucircumflex period -30\nKPX Udieresis A -50\nKPX Udieresis Aacute -50\nKPX Udieresis Abreve -50\nKPX Udieresis Acircumflex -50\nKPX Udieresis Adieresis -50\nKPX Udieresis Agrave -50\nKPX Udieresis Amacron -50\nKPX Udieresis Aogonek -50\nKPX Udieresis Aring -50\nKPX Udieresis Atilde -50\nKPX Udieresis comma -30\nKPX Udieresis period -30\nKPX Ugrave A -50\nKPX Ugrave Aacute -50\nKPX Ugrave Abreve -50\nKPX Ugrave Acircumflex -50\nKPX Ugrave Adieresis -50\nKPX Ugrave Agrave -50\nKPX Ugrave Amacron -50\nKPX Ugrave Aogonek -50\nKPX Ugrave Aring -50\nKPX Ugrave Atilde -50\nKPX Ugrave comma -30\nKPX Ugrave period -30\nKPX Uhungarumlaut A -50\nKPX Uhungarumlaut Aacute -50\nKPX Uhungarumlaut Abreve -50\nKPX Uhungarumlaut Acircumflex -50\nKPX Uhungarumlaut Adieresis -50\nKPX Uhungarumlaut Agrave -50\nKPX Uhungarumlaut Amacron -50\nKPX Uhungarumlaut Aogonek -50\nKPX Uhungarumlaut Aring -50\nKPX Uhungarumlaut Atilde -50\nKPX Uhungarumlaut comma -30\nKPX Uhungarumlaut period -30\nKPX Umacron A -50\nKPX Umacron Aacute -50\nKPX Umacron Abreve -50\nKPX Umacron Acircumflex -50\nKPX Umacron Adieresis -50\nKPX Umacron Agrave -50\nKPX Umacron Amacron -50\nKPX Umacron Aogonek -50\nKPX Umacron Aring -50\nKPX Umacron Atilde -50\nKPX Umacron comma -30\nKPX Umacron period -30\nKPX Uogonek A -50\nKPX Uogonek Aacute -50\nKPX Uogonek Abreve -50\nKPX Uogonek Acircumflex -50\nKPX Uogonek Adieresis -50\nKPX Uogonek Agrave -50\nKPX Uogonek Amacron -50\nKPX Uogonek Aogonek -50\nKPX Uogonek Aring -50\nKPX Uogonek Atilde -50\nKPX Uogonek comma -30\nKPX Uogonek period -30\nKPX Uring A -50\nKPX Uring Aacute -50\nKPX Uring Abreve -50\nKPX Uring Acircumflex -50\nKPX Uring Adieresis -50\nKPX Uring Agrave -50\nKPX Uring Amacron -50\nKPX Uring Aogonek -50\nKPX Uring Aring -50\nKPX Uring Atilde -50\nKPX Uring comma -30\nKPX Uring period -30\nKPX V A -80\nKPX V Aacute -80\nKPX V Abreve -80\nKPX V Acircumflex -80\nKPX V Adieresis -80\nKPX V Agrave -80\nKPX V Amacron -80\nKPX V Aogonek -80\nKPX V Aring -80\nKPX V Atilde -80\nKPX V G -50\nKPX V Gbreve -50\nKPX V Gcommaaccent -50\nKPX V O -50\nKPX V Oacute -50\nKPX V Ocircumflex -50\nKPX V Odieresis -50\nKPX V Ograve -50\nKPX V Ohungarumlaut -50\nKPX V Omacron -50\nKPX V Oslash -50\nKPX V Otilde -50\nKPX V a -60\nKPX V aacute -60\nKPX V abreve -60\nKPX V acircumflex -60\nKPX V adieresis -60\nKPX V agrave -60\nKPX V amacron -60\nKPX V aogonek -60\nKPX V aring -60\nKPX V atilde -60\nKPX V colon -40\nKPX V comma -120\nKPX V e -50\nKPX V eacute -50\nKPX V ecaron -50\nKPX V ecircumflex -50\nKPX V edieresis -50\nKPX V edotaccent -50\nKPX V egrave -50\nKPX V emacron -50\nKPX V eogonek -50\nKPX V hyphen -80\nKPX V o -90\nKPX V oacute -90\nKPX V ocircumflex -90\nKPX V odieresis -90\nKPX V ograve -90\nKPX V ohungarumlaut -90\nKPX V omacron -90\nKPX V oslash -90\nKPX V otilde -90\nKPX V period -120\nKPX V semicolon -40\nKPX V u -60\nKPX V uacute -60\nKPX V ucircumflex -60\nKPX V udieresis -60\nKPX V ugrave -60\nKPX V uhungarumlaut -60\nKPX V umacron -60\nKPX V uogonek -60\nKPX V uring -60\nKPX W A -60\nKPX W Aacute -60\nKPX W Abreve -60\nKPX W Acircumflex -60\nKPX W Adieresis -60\nKPX W Agrave -60\nKPX W Amacron -60\nKPX W Aogonek -60\nKPX W Aring -60\nKPX W Atilde -60\nKPX W O -20\nKPX W Oacute -20\nKPX W Ocircumflex -20\nKPX W Odieresis -20\nKPX W Ograve -20\nKPX W Ohungarumlaut -20\nKPX W Omacron -20\nKPX W Oslash -20\nKPX W Otilde -20\nKPX W a -40\nKPX W aacute -40\nKPX W abreve -40\nKPX W acircumflex -40\nKPX W adieresis -40\nKPX W agrave -40\nKPX W amacron -40\nKPX W aogonek -40\nKPX W aring -40\nKPX W atilde -40\nKPX W colon -10\nKPX W comma -80\nKPX W e -35\nKPX W eacute -35\nKPX W ecaron -35\nKPX W ecircumflex -35\nKPX W edieresis -35\nKPX W edotaccent -35\nKPX W egrave -35\nKPX W emacron -35\nKPX W eogonek -35\nKPX W hyphen -40\nKPX W o -60\nKPX W oacute -60\nKPX W ocircumflex -60\nKPX W odieresis -60\nKPX W ograve -60\nKPX W ohungarumlaut -60\nKPX W omacron -60\nKPX W oslash -60\nKPX W otilde -60\nKPX W period -80\nKPX W semicolon -10\nKPX W u -45\nKPX W uacute -45\nKPX W ucircumflex -45\nKPX W udieresis -45\nKPX W ugrave -45\nKPX W uhungarumlaut -45\nKPX W umacron -45\nKPX W uogonek -45\nKPX W uring -45\nKPX W y -20\nKPX W yacute -20\nKPX W ydieresis -20\nKPX Y A -110\nKPX Y Aacute -110\nKPX Y Abreve -110\nKPX Y Acircumflex -110\nKPX Y Adieresis -110\nKPX Y Agrave -110\nKPX Y Amacron -110\nKPX Y Aogonek -110\nKPX Y Aring -110\nKPX Y Atilde -110\nKPX Y O -70\nKPX Y Oacute -70\nKPX Y Ocircumflex -70\nKPX Y Odieresis -70\nKPX Y Ograve -70\nKPX Y Ohungarumlaut -70\nKPX Y Omacron -70\nKPX Y Oslash -70\nKPX Y Otilde -70\nKPX Y a -90\nKPX Y aacute -90\nKPX Y abreve -90\nKPX Y acircumflex -90\nKPX Y adieresis -90\nKPX Y agrave -90\nKPX Y amacron -90\nKPX Y aogonek -90\nKPX Y aring -90\nKPX Y atilde -90\nKPX Y colon -50\nKPX Y comma -100\nKPX Y e -80\nKPX Y eacute -80\nKPX Y ecaron -80\nKPX Y ecircumflex -80\nKPX Y edieresis -80\nKPX Y edotaccent -80\nKPX Y egrave -80\nKPX Y emacron -80\nKPX Y eogonek -80\nKPX Y o -100\nKPX Y oacute -100\nKPX Y ocircumflex -100\nKPX Y odieresis -100\nKPX Y ograve -100\nKPX Y ohungarumlaut -100\nKPX Y omacron -100\nKPX Y oslash -100\nKPX Y otilde -100\nKPX Y period -100\nKPX Y semicolon -50\nKPX Y u -100\nKPX Y uacute -100\nKPX Y ucircumflex -100\nKPX Y udieresis -100\nKPX Y ugrave -100\nKPX Y uhungarumlaut -100\nKPX Y umacron -100\nKPX Y uogonek -100\nKPX Y uring -100\nKPX Yacute A -110\nKPX Yacute Aacute -110\nKPX Yacute Abreve -110\nKPX Yacute Acircumflex -110\nKPX Yacute Adieresis -110\nKPX Yacute Agrave -110\nKPX Yacute Amacron -110\nKPX Yacute Aogonek -110\nKPX Yacute Aring -110\nKPX Yacute Atilde -110\nKPX Yacute O -70\nKPX Yacute Oacute -70\nKPX Yacute Ocircumflex -70\nKPX Yacute Odieresis -70\nKPX Yacute Ograve -70\nKPX Yacute Ohungarumlaut -70\nKPX Yacute Omacron -70\nKPX Yacute Oslash -70\nKPX Yacute Otilde -70\nKPX Yacute a -90\nKPX Yacute aacute -90\nKPX Yacute abreve -90\nKPX Yacute acircumflex -90\nKPX Yacute adieresis -90\nKPX Yacute agrave -90\nKPX Yacute amacron -90\nKPX Yacute aogonek -90\nKPX Yacute aring -90\nKPX Yacute atilde -90\nKPX Yacute colon -50\nKPX Yacute comma -100\nKPX Yacute e -80\nKPX Yacute eacute -80\nKPX Yacute ecaron -80\nKPX Yacute ecircumflex -80\nKPX Yacute edieresis -80\nKPX Yacute edotaccent -80\nKPX Yacute egrave -80\nKPX Yacute emacron -80\nKPX Yacute eogonek -80\nKPX Yacute o -100\nKPX Yacute oacute -100\nKPX Yacute ocircumflex -100\nKPX Yacute odieresis -100\nKPX Yacute ograve -100\nKPX Yacute ohungarumlaut -100\nKPX Yacute omacron -100\nKPX Yacute oslash -100\nKPX Yacute otilde -100\nKPX Yacute period -100\nKPX Yacute semicolon -50\nKPX Yacute u -100\nKPX Yacute uacute -100\nKPX Yacute ucircumflex -100\nKPX Yacute udieresis -100\nKPX Yacute ugrave -100\nKPX Yacute uhungarumlaut -100\nKPX Yacute umacron -100\nKPX Yacute uogonek -100\nKPX Yacute uring -100\nKPX Ydieresis A -110\nKPX Ydieresis Aacute -110\nKPX Ydieresis Abreve -110\nKPX Ydieresis Acircumflex -110\nKPX Ydieresis Adieresis -110\nKPX Ydieresis Agrave -110\nKPX Ydieresis Amacron -110\nKPX Ydieresis Aogonek -110\nKPX Ydieresis Aring -110\nKPX Ydieresis Atilde -110\nKPX Ydieresis O -70\nKPX Ydieresis Oacute -70\nKPX Ydieresis Ocircumflex -70\nKPX Ydieresis Odieresis -70\nKPX Ydieresis Ograve -70\nKPX Ydieresis Ohungarumlaut -70\nKPX Ydieresis Omacron -70\nKPX Ydieresis Oslash -70\nKPX Ydieresis Otilde -70\nKPX Ydieresis a -90\nKPX Ydieresis aacute -90\nKPX Ydieresis abreve -90\nKPX Ydieresis acircumflex -90\nKPX Ydieresis adieresis -90\nKPX Ydieresis agrave -90\nKPX Ydieresis amacron -90\nKPX Ydieresis aogonek -90\nKPX Ydieresis aring -90\nKPX Ydieresis atilde -90\nKPX Ydieresis colon -50\nKPX Ydieresis comma -100\nKPX Ydieresis e -80\nKPX Ydieresis eacute -80\nKPX Ydieresis ecaron -80\nKPX Ydieresis ecircumflex -80\nKPX Ydieresis edieresis -80\nKPX Ydieresis edotaccent -80\nKPX Ydieresis egrave -80\nKPX Ydieresis emacron -80\nKPX Ydieresis eogonek -80\nKPX Ydieresis o -100\nKPX Ydieresis oacute -100\nKPX Ydieresis ocircumflex -100\nKPX Ydieresis odieresis -100\nKPX Ydieresis ograve -100\nKPX Ydieresis ohungarumlaut -100\nKPX Ydieresis omacron -100\nKPX Ydieresis oslash -100\nKPX Ydieresis otilde -100\nKPX Ydieresis period -100\nKPX Ydieresis semicolon -50\nKPX Ydieresis u -100\nKPX Ydieresis uacute -100\nKPX Ydieresis ucircumflex -100\nKPX Ydieresis udieresis -100\nKPX Ydieresis ugrave -100\nKPX Ydieresis uhungarumlaut -100\nKPX Ydieresis umacron -100\nKPX Ydieresis uogonek -100\nKPX Ydieresis uring -100\nKPX a g -10\nKPX a gbreve -10\nKPX a gcommaaccent -10\nKPX a v -15\nKPX a w -15\nKPX a y -20\nKPX a yacute -20\nKPX a ydieresis -20\nKPX aacute g -10\nKPX aacute gbreve -10\nKPX aacute gcommaaccent -10\nKPX aacute v -15\nKPX aacute w -15\nKPX aacute y -20\nKPX aacute yacute -20\nKPX aacute ydieresis -20\nKPX abreve g -10\nKPX abreve gbreve -10\nKPX abreve gcommaaccent -10\nKPX abreve v -15\nKPX abreve w -15\nKPX abreve y -20\nKPX abreve yacute -20\nKPX abreve ydieresis -20\nKPX acircumflex g -10\nKPX acircumflex gbreve -10\nKPX acircumflex gcommaaccent -10\nKPX acircumflex v -15\nKPX acircumflex w -15\nKPX acircumflex y -20\nKPX acircumflex yacute -20\nKPX acircumflex ydieresis -20\nKPX adieresis g -10\nKPX adieresis gbreve -10\nKPX adieresis gcommaaccent -10\nKPX adieresis v -15\nKPX adieresis w -15\nKPX adieresis y -20\nKPX adieresis yacute -20\nKPX adieresis ydieresis -20\nKPX agrave g -10\nKPX agrave gbreve -10\nKPX agrave gcommaaccent -10\nKPX agrave v -15\nKPX agrave w -15\nKPX agrave y -20\nKPX agrave yacute -20\nKPX agrave ydieresis -20\nKPX amacron g -10\nKPX amacron gbreve -10\nKPX amacron gcommaaccent -10\nKPX amacron v -15\nKPX amacron w -15\nKPX amacron y -20\nKPX amacron yacute -20\nKPX amacron ydieresis -20\nKPX aogonek g -10\nKPX aogonek gbreve -10\nKPX aogonek gcommaaccent -10\nKPX aogonek v -15\nKPX aogonek w -15\nKPX aogonek y -20\nKPX aogonek yacute -20\nKPX aogonek ydieresis -20\nKPX aring g -10\nKPX aring gbreve -10\nKPX aring gcommaaccent -10\nKPX aring v -15\nKPX aring w -15\nKPX aring y -20\nKPX aring yacute -20\nKPX aring ydieresis -20\nKPX atilde g -10\nKPX atilde gbreve -10\nKPX atilde gcommaaccent -10\nKPX atilde v -15\nKPX atilde w -15\nKPX atilde y -20\nKPX atilde yacute -20\nKPX atilde ydieresis -20\nKPX b l -10\nKPX b lacute -10\nKPX b lcommaaccent -10\nKPX b lslash -10\nKPX b u -20\nKPX b uacute -20\nKPX b ucircumflex -20\nKPX b udieresis -20\nKPX b ugrave -20\nKPX b uhungarumlaut -20\nKPX b umacron -20\nKPX b uogonek -20\nKPX b uring -20\nKPX b v -20\nKPX b y -20\nKPX b yacute -20\nKPX b ydieresis -20\nKPX c h -10\nKPX c k -20\nKPX c kcommaaccent -20\nKPX c l -20\nKPX c lacute -20\nKPX c lcommaaccent -20\nKPX c lslash -20\nKPX c y -10\nKPX c yacute -10\nKPX c ydieresis -10\nKPX cacute h -10\nKPX cacute k -20\nKPX cacute kcommaaccent -20\nKPX cacute l -20\nKPX cacute lacute -20\nKPX cacute lcommaaccent -20\nKPX cacute lslash -20\nKPX cacute y -10\nKPX cacute yacute -10\nKPX cacute ydieresis -10\nKPX ccaron h -10\nKPX ccaron k -20\nKPX ccaron kcommaaccent -20\nKPX ccaron l -20\nKPX ccaron lacute -20\nKPX ccaron lcommaaccent -20\nKPX ccaron lslash -20\nKPX ccaron y -10\nKPX ccaron yacute -10\nKPX ccaron ydieresis -10\nKPX ccedilla h -10\nKPX ccedilla k -20\nKPX ccedilla kcommaaccent -20\nKPX ccedilla l -20\nKPX ccedilla lacute -20\nKPX ccedilla lcommaaccent -20\nKPX ccedilla lslash -20\nKPX ccedilla y -10\nKPX ccedilla yacute -10\nKPX ccedilla ydieresis -10\nKPX colon space -40\nKPX comma quotedblright -120\nKPX comma quoteright -120\nKPX comma space -40\nKPX d d -10\nKPX d dcroat -10\nKPX d v -15\nKPX d w -15\nKPX d y -15\nKPX d yacute -15\nKPX d ydieresis -15\nKPX dcroat d -10\nKPX dcroat dcroat -10\nKPX dcroat v -15\nKPX dcroat w -15\nKPX dcroat y -15\nKPX dcroat yacute -15\nKPX dcroat ydieresis -15\nKPX e comma 10\nKPX e period 20\nKPX e v -15\nKPX e w -15\nKPX e x -15\nKPX e y -15\nKPX e yacute -15\nKPX e ydieresis -15\nKPX eacute comma 10\nKPX eacute period 20\nKPX eacute v -15\nKPX eacute w -15\nKPX eacute x -15\nKPX eacute y -15\nKPX eacute yacute -15\nKPX eacute ydieresis -15\nKPX ecaron comma 10\nKPX ecaron period 20\nKPX ecaron v -15\nKPX ecaron w -15\nKPX ecaron x -15\nKPX ecaron y -15\nKPX ecaron yacute -15\nKPX ecaron ydieresis -15\nKPX ecircumflex comma 10\nKPX ecircumflex period 20\nKPX ecircumflex v -15\nKPX ecircumflex w -15\nKPX ecircumflex x -15\nKPX ecircumflex y -15\nKPX ecircumflex yacute -15\nKPX ecircumflex ydieresis -15\nKPX edieresis comma 10\nKPX edieresis period 20\nKPX edieresis v -15\nKPX edieresis w -15\nKPX edieresis x -15\nKPX edieresis y -15\nKPX edieresis yacute -15\nKPX edieresis ydieresis -15\nKPX edotaccent comma 10\nKPX edotaccent period 20\nKPX edotaccent v -15\nKPX edotaccent w -15\nKPX edotaccent x -15\nKPX edotaccent y -15\nKPX edotaccent yacute -15\nKPX edotaccent ydieresis -15\nKPX egrave comma 10\nKPX egrave period 20\nKPX egrave v -15\nKPX egrave w -15\nKPX egrave x -15\nKPX egrave y -15\nKPX egrave yacute -15\nKPX egrave ydieresis -15\nKPX emacron comma 10\nKPX emacron period 20\nKPX emacron v -15\nKPX emacron w -15\nKPX emacron x -15\nKPX emacron y -15\nKPX emacron yacute -15\nKPX emacron ydieresis -15\nKPX eogonek comma 10\nKPX eogonek period 20\nKPX eogonek v -15\nKPX eogonek w -15\nKPX eogonek x -15\nKPX eogonek y -15\nKPX eogonek yacute -15\nKPX eogonek ydieresis -15\nKPX f comma -10\nKPX f e -10\nKPX f eacute -10\nKPX f ecaron -10\nKPX f ecircumflex -10\nKPX f edieresis -10\nKPX f edotaccent -10\nKPX f egrave -10\nKPX f emacron -10\nKPX f eogonek -10\nKPX f o -20\nKPX f oacute -20\nKPX f ocircumflex -20\nKPX f odieresis -20\nKPX f ograve -20\nKPX f ohungarumlaut -20\nKPX f omacron -20\nKPX f oslash -20\nKPX f otilde -20\nKPX f period -10\nKPX f quotedblright 30\nKPX f quoteright 30\nKPX g e 10\nKPX g eacute 10\nKPX g ecaron 10\nKPX g ecircumflex 10\nKPX g edieresis 10\nKPX g edotaccent 10\nKPX g egrave 10\nKPX g emacron 10\nKPX g eogonek 10\nKPX g g -10\nKPX g gbreve -10\nKPX g gcommaaccent -10\nKPX gbreve e 10\nKPX gbreve eacute 10\nKPX gbreve ecaron 10\nKPX gbreve ecircumflex 10\nKPX gbreve edieresis 10\nKPX gbreve edotaccent 10\nKPX gbreve egrave 10\nKPX gbreve emacron 10\nKPX gbreve eogonek 10\nKPX gbreve g -10\nKPX gbreve gbreve -10\nKPX gbreve gcommaaccent -10\nKPX gcommaaccent e 10\nKPX gcommaaccent eacute 10\nKPX gcommaaccent ecaron 10\nKPX gcommaaccent ecircumflex 10\nKPX gcommaaccent edieresis 10\nKPX gcommaaccent edotaccent 10\nKPX gcommaaccent egrave 10\nKPX gcommaaccent emacron 10\nKPX gcommaaccent eogonek 10\nKPX gcommaaccent g -10\nKPX gcommaaccent gbreve -10\nKPX gcommaaccent gcommaaccent -10\nKPX h y -20\nKPX h yacute -20\nKPX h ydieresis -20\nKPX k o -15\nKPX k oacute -15\nKPX k ocircumflex -15\nKPX k odieresis -15\nKPX k ograve -15\nKPX k ohungarumlaut -15\nKPX k omacron -15\nKPX k oslash -15\nKPX k otilde -15\nKPX kcommaaccent o -15\nKPX kcommaaccent oacute -15\nKPX kcommaaccent ocircumflex -15\nKPX kcommaaccent odieresis -15\nKPX kcommaaccent ograve -15\nKPX kcommaaccent ohungarumlaut -15\nKPX kcommaaccent omacron -15\nKPX kcommaaccent oslash -15\nKPX kcommaaccent otilde -15\nKPX l w -15\nKPX l y -15\nKPX l yacute -15\nKPX l ydieresis -15\nKPX lacute w -15\nKPX lacute y -15\nKPX lacute yacute -15\nKPX lacute ydieresis -15\nKPX lcommaaccent w -15\nKPX lcommaaccent y -15\nKPX lcommaaccent yacute -15\nKPX lcommaaccent ydieresis -15\nKPX lslash w -15\nKPX lslash y -15\nKPX lslash yacute -15\nKPX lslash ydieresis -15\nKPX m u -20\nKPX m uacute -20\nKPX m ucircumflex -20\nKPX m udieresis -20\nKPX m ugrave -20\nKPX m uhungarumlaut -20\nKPX m umacron -20\nKPX m uogonek -20\nKPX m uring -20\nKPX m y -30\nKPX m yacute -30\nKPX m ydieresis -30\nKPX n u -10\nKPX n uacute -10\nKPX n ucircumflex -10\nKPX n udieresis -10\nKPX n ugrave -10\nKPX n uhungarumlaut -10\nKPX n umacron -10\nKPX n uogonek -10\nKPX n uring -10\nKPX n v -40\nKPX n y -20\nKPX n yacute -20\nKPX n ydieresis -20\nKPX nacute u -10\nKPX nacute uacute -10\nKPX nacute ucircumflex -10\nKPX nacute udieresis -10\nKPX nacute ugrave -10\nKPX nacute uhungarumlaut -10\nKPX nacute umacron -10\nKPX nacute uogonek -10\nKPX nacute uring -10\nKPX nacute v -40\nKPX nacute y -20\nKPX nacute yacute -20\nKPX nacute ydieresis -20\nKPX ncaron u -10\nKPX ncaron uacute -10\nKPX ncaron ucircumflex -10\nKPX ncaron udieresis -10\nKPX ncaron ugrave -10\nKPX ncaron uhungarumlaut -10\nKPX ncaron umacron -10\nKPX ncaron uogonek -10\nKPX ncaron uring -10\nKPX ncaron v -40\nKPX ncaron y -20\nKPX ncaron yacute -20\nKPX ncaron ydieresis -20\nKPX ncommaaccent u -10\nKPX ncommaaccent uacute -10\nKPX ncommaaccent ucircumflex -10\nKPX ncommaaccent udieresis -10\nKPX ncommaaccent ugrave -10\nKPX ncommaaccent uhungarumlaut -10\nKPX ncommaaccent umacron -10\nKPX ncommaaccent uogonek -10\nKPX ncommaaccent uring -10\nKPX ncommaaccent v -40\nKPX ncommaaccent y -20\nKPX ncommaaccent yacute -20\nKPX ncommaaccent ydieresis -20\nKPX ntilde u -10\nKPX ntilde uacute -10\nKPX ntilde ucircumflex -10\nKPX ntilde udieresis -10\nKPX ntilde ugrave -10\nKPX ntilde uhungarumlaut -10\nKPX ntilde umacron -10\nKPX ntilde uogonek -10\nKPX ntilde uring -10\nKPX ntilde v -40\nKPX ntilde y -20\nKPX ntilde yacute -20\nKPX ntilde ydieresis -20\nKPX o v -20\nKPX o w -15\nKPX o x -30\nKPX o y -20\nKPX o yacute -20\nKPX o ydieresis -20\nKPX oacute v -20\nKPX oacute w -15\nKPX oacute x -30\nKPX oacute y -20\nKPX oacute yacute -20\nKPX oacute ydieresis -20\nKPX ocircumflex v -20\nKPX ocircumflex w -15\nKPX ocircumflex x -30\nKPX ocircumflex y -20\nKPX ocircumflex yacute -20\nKPX ocircumflex ydieresis -20\nKPX odieresis v -20\nKPX odieresis w -15\nKPX odieresis x -30\nKPX odieresis y -20\nKPX odieresis yacute -20\nKPX odieresis ydieresis -20\nKPX ograve v -20\nKPX ograve w -15\nKPX ograve x -30\nKPX ograve y -20\nKPX ograve yacute -20\nKPX ograve ydieresis -20\nKPX ohungarumlaut v -20\nKPX ohungarumlaut w -15\nKPX ohungarumlaut x -30\nKPX ohungarumlaut y -20\nKPX ohungarumlaut yacute -20\nKPX ohungarumlaut ydieresis -20\nKPX omacron v -20\nKPX omacron w -15\nKPX omacron x -30\nKPX omacron y -20\nKPX omacron yacute -20\nKPX omacron ydieresis -20\nKPX oslash v -20\nKPX oslash w -15\nKPX oslash x -30\nKPX oslash y -20\nKPX oslash yacute -20\nKPX oslash ydieresis -20\nKPX otilde v -20\nKPX otilde w -15\nKPX otilde x -30\nKPX otilde y -20\nKPX otilde yacute -20\nKPX otilde ydieresis -20\nKPX p y -15\nKPX p yacute -15\nKPX p ydieresis -15\nKPX period quotedblright -120\nKPX period quoteright -120\nKPX period space -40\nKPX quotedblright space -80\nKPX quoteleft quoteleft -46\nKPX quoteright d -80\nKPX quoteright dcroat -80\nKPX quoteright l -20\nKPX quoteright lacute -20\nKPX quoteright lcommaaccent -20\nKPX quoteright lslash -20\nKPX quoteright quoteright -46\nKPX quoteright r -40\nKPX quoteright racute -40\nKPX quoteright rcaron -40\nKPX quoteright rcommaaccent -40\nKPX quoteright s -60\nKPX quoteright sacute -60\nKPX quoteright scaron -60\nKPX quoteright scedilla -60\nKPX quoteright scommaaccent -60\nKPX quoteright space -80\nKPX quoteright v -20\nKPX r c -20\nKPX r cacute -20\nKPX r ccaron -20\nKPX r ccedilla -20\nKPX r comma -60\nKPX r d -20\nKPX r dcroat -20\nKPX r g -15\nKPX r gbreve -15\nKPX r gcommaaccent -15\nKPX r hyphen -20\nKPX r o -20\nKPX r oacute -20\nKPX r ocircumflex -20\nKPX r odieresis -20\nKPX r ograve -20\nKPX r ohungarumlaut -20\nKPX r omacron -20\nKPX r oslash -20\nKPX r otilde -20\nKPX r period -60\nKPX r q -20\nKPX r s -15\nKPX r sacute -15\nKPX r scaron -15\nKPX r scedilla -15\nKPX r scommaaccent -15\nKPX r t 20\nKPX r tcommaaccent 20\nKPX r v 10\nKPX r y 10\nKPX r yacute 10\nKPX r ydieresis 10\nKPX racute c -20\nKPX racute cacute -20\nKPX racute ccaron -20\nKPX racute ccedilla -20\nKPX racute comma -60\nKPX racute d -20\nKPX racute dcroat -20\nKPX racute g -15\nKPX racute gbreve -15\nKPX racute gcommaaccent -15\nKPX racute hyphen -20\nKPX racute o -20\nKPX racute oacute -20\nKPX racute ocircumflex -20\nKPX racute odieresis -20\nKPX racute ograve -20\nKPX racute ohungarumlaut -20\nKPX racute omacron -20\nKPX racute oslash -20\nKPX racute otilde -20\nKPX racute period -60\nKPX racute q -20\nKPX racute s -15\nKPX racute sacute -15\nKPX racute scaron -15\nKPX racute scedilla -15\nKPX racute scommaaccent -15\nKPX racute t 20\nKPX racute tcommaaccent 20\nKPX racute v 10\nKPX racute y 10\nKPX racute yacute 10\nKPX racute ydieresis 10\nKPX rcaron c -20\nKPX rcaron cacute -20\nKPX rcaron ccaron -20\nKPX rcaron ccedilla -20\nKPX rcaron comma -60\nKPX rcaron d -20\nKPX rcaron dcroat -20\nKPX rcaron g -15\nKPX rcaron gbreve -15\nKPX rcaron gcommaaccent -15\nKPX rcaron hyphen -20\nKPX rcaron o -20\nKPX rcaron oacute -20\nKPX rcaron ocircumflex -20\nKPX rcaron odieresis -20\nKPX rcaron ograve -20\nKPX rcaron ohungarumlaut -20\nKPX rcaron omacron -20\nKPX rcaron oslash -20\nKPX rcaron otilde -20\nKPX rcaron period -60\nKPX rcaron q -20\nKPX rcaron s -15\nKPX rcaron sacute -15\nKPX rcaron scaron -15\nKPX rcaron scedilla -15\nKPX rcaron scommaaccent -15\nKPX rcaron t 20\nKPX rcaron tcommaaccent 20\nKPX rcaron v 10\nKPX rcaron y 10\nKPX rcaron yacute 10\nKPX rcaron ydieresis 10\nKPX rcommaaccent c -20\nKPX rcommaaccent cacute -20\nKPX rcommaaccent ccaron -20\nKPX rcommaaccent ccedilla -20\nKPX rcommaaccent comma -60\nKPX rcommaaccent d -20\nKPX rcommaaccent dcroat -20\nKPX rcommaaccent g -15\nKPX rcommaaccent gbreve -15\nKPX rcommaaccent gcommaaccent -15\nKPX rcommaaccent hyphen -20\nKPX rcommaaccent o -20\nKPX rcommaaccent oacute -20\nKPX rcommaaccent ocircumflex -20\nKPX rcommaaccent odieresis -20\nKPX rcommaaccent ograve -20\nKPX rcommaaccent ohungarumlaut -20\nKPX rcommaaccent omacron -20\nKPX rcommaaccent oslash -20\nKPX rcommaaccent otilde -20\nKPX rcommaaccent period -60\nKPX rcommaaccent q -20\nKPX rcommaaccent s -15\nKPX rcommaaccent sacute -15\nKPX rcommaaccent scaron -15\nKPX rcommaaccent scedilla -15\nKPX rcommaaccent scommaaccent -15\nKPX rcommaaccent t 20\nKPX rcommaaccent tcommaaccent 20\nKPX rcommaaccent v 10\nKPX rcommaaccent y 10\nKPX rcommaaccent yacute 10\nKPX rcommaaccent ydieresis 10\nKPX s w -15\nKPX sacute w -15\nKPX scaron w -15\nKPX scedilla w -15\nKPX scommaaccent w -15\nKPX semicolon space -40\nKPX space T -100\nKPX space Tcaron -100\nKPX space Tcommaaccent -100\nKPX space V -80\nKPX space W -80\nKPX space Y -120\nKPX space Yacute -120\nKPX space Ydieresis -120\nKPX space quotedblleft -80\nKPX space quoteleft -60\nKPX v a -20\nKPX v aacute -20\nKPX v abreve -20\nKPX v acircumflex -20\nKPX v adieresis -20\nKPX v agrave -20\nKPX v amacron -20\nKPX v aogonek -20\nKPX v aring -20\nKPX v atilde -20\nKPX v comma -80\nKPX v o -30\nKPX v oacute -30\nKPX v ocircumflex -30\nKPX v odieresis -30\nKPX v ograve -30\nKPX v ohungarumlaut -30\nKPX v omacron -30\nKPX v oslash -30\nKPX v otilde -30\nKPX v period -80\nKPX w comma -40\nKPX w o -20\nKPX w oacute -20\nKPX w ocircumflex -20\nKPX w odieresis -20\nKPX w ograve -20\nKPX w ohungarumlaut -20\nKPX w omacron -20\nKPX w oslash -20\nKPX w otilde -20\nKPX w period -40\nKPX x e -10\nKPX x eacute -10\nKPX x ecaron -10\nKPX x ecircumflex -10\nKPX x edieresis -10\nKPX x edotaccent -10\nKPX x egrave -10\nKPX x emacron -10\nKPX x eogonek -10\nKPX y a -30\nKPX y aacute -30\nKPX y abreve -30\nKPX y acircumflex -30\nKPX y adieresis -30\nKPX y agrave -30\nKPX y amacron -30\nKPX y aogonek -30\nKPX y aring -30\nKPX y atilde -30\nKPX y comma -80\nKPX y e -10\nKPX y eacute -10\nKPX y ecaron -10\nKPX y ecircumflex -10\nKPX y edieresis -10\nKPX y edotaccent -10\nKPX y egrave -10\nKPX y emacron -10\nKPX y eogonek -10\nKPX y o -25\nKPX y oacute -25\nKPX y ocircumflex -25\nKPX y odieresis -25\nKPX y ograve -25\nKPX y ohungarumlaut -25\nKPX y omacron -25\nKPX y oslash -25\nKPX y otilde -25\nKPX y period -80\nKPX yacute a -30\nKPX yacute aacute -30\nKPX yacute abreve -30\nKPX yacute acircumflex -30\nKPX yacute adieresis -30\nKPX yacute agrave -30\nKPX yacute amacron -30\nKPX yacute aogonek -30\nKPX yacute aring -30\nKPX yacute atilde -30\nKPX yacute comma -80\nKPX yacute e -10\nKPX yacute eacute -10\nKPX yacute ecaron -10\nKPX yacute ecircumflex -10\nKPX yacute edieresis -10\nKPX yacute edotaccent -10\nKPX yacute egrave -10\nKPX yacute emacron -10\nKPX yacute eogonek -10\nKPX yacute o -25\nKPX yacute oacute -25\nKPX yacute ocircumflex -25\nKPX yacute odieresis -25\nKPX yacute ograve -25\nKPX yacute ohungarumlaut -25\nKPX yacute omacron -25\nKPX yacute oslash -25\nKPX yacute otilde -25\nKPX yacute period -80\nKPX ydieresis a -30\nKPX ydieresis aacute -30\nKPX ydieresis abreve -30\nKPX ydieresis acircumflex -30\nKPX ydieresis adieresis -30\nKPX ydieresis agrave -30\nKPX ydieresis amacron -30\nKPX ydieresis aogonek -30\nKPX ydieresis aring -30\nKPX ydieresis atilde -30\nKPX ydieresis comma -80\nKPX ydieresis e -10\nKPX ydieresis eacute -10\nKPX ydieresis ecaron -10\nKPX ydieresis ecircumflex -10\nKPX ydieresis edieresis -10\nKPX ydieresis edotaccent -10\nKPX ydieresis egrave -10\nKPX ydieresis emacron -10\nKPX ydieresis eogonek -10\nKPX ydieresis o -25\nKPX ydieresis oacute -25\nKPX ydieresis ocircumflex -25\nKPX ydieresis odieresis -25\nKPX ydieresis ograve -25\nKPX ydieresis ohungarumlaut -25\nKPX ydieresis omacron -25\nKPX ydieresis oslash -25\nKPX ydieresis otilde -25\nKPX ydieresis period -80\nKPX z e 10\nKPX z eacute 10\nKPX z ecaron 10\nKPX z ecircumflex 10\nKPX z edieresis 10\nKPX z edotaccent 10\nKPX z egrave 10\nKPX z emacron 10\nKPX z eogonek 10\nKPX zacute e 10\nKPX zacute eacute 10\nKPX zacute ecaron 10\nKPX zacute ecircumflex 10\nKPX zacute edieresis 10\nKPX zacute edotaccent 10\nKPX zacute egrave 10\nKPX zacute emacron 10\nKPX zacute eogonek 10\nKPX zcaron e 10\nKPX zcaron eacute 10\nKPX zcaron ecaron 10\nKPX zcaron ecircumflex 10\nKPX zcaron edieresis 10\nKPX zcaron edotaccent 10\nKPX zcaron egrave 10\nKPX zcaron emacron 10\nKPX zcaron eogonek 10\nKPX zdotaccent e 10\nKPX zdotaccent eacute 10\nKPX zdotaccent ecaron 10\nKPX zdotaccent ecircumflex 10\nKPX zdotaccent edieresis 10\nKPX zdotaccent edotaccent 10\nKPX zdotaccent egrave 10\nKPX zdotaccent emacron 10\nKPX zdotaccent eogonek 10\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/pdfcorefonts/Helvetica-Oblique.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 12:44:31 1997\nComment UniqueID 43055\nComment VMusage 14960 69346\nFontName Helvetica-Oblique\nFullName Helvetica Oblique\nFamilyName Helvetica\nWeight Medium\nItalicAngle -12\nIsFixedPitch false\nCharacterSet ExtendedRoman\nFontBBox -170 -225 1116 931 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated.  All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 718\nXHeight 523\nAscender 718\nDescender -207\nStdHW 76\nStdVW 88\nStartCharMetrics 315\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 278 ; N exclam ; B 90 0 340 718 ;\nC 34 ; WX 355 ; N quotedbl ; B 168 463 438 718 ;\nC 35 ; WX 556 ; N numbersign ; B 73 0 631 688 ;\nC 36 ; WX 556 ; N dollar ; B 69 -115 617 775 ;\nC 37 ; WX 889 ; N percent ; B 147 -19 889 703 ;\nC 38 ; WX 667 ; N ampersand ; B 77 -15 647 718 ;\nC 39 ; WX 222 ; N quoteright ; B 151 463 310 718 ;\nC 40 ; WX 333 ; N parenleft ; B 108 -207 454 733 ;\nC 41 ; WX 333 ; N parenright ; B -9 -207 337 733 ;\nC 42 ; WX 389 ; N asterisk ; B 165 431 475 718 ;\nC 43 ; WX 584 ; N plus ; B 85 0 606 505 ;\nC 44 ; WX 278 ; N comma ; B 56 -147 214 106 ;\nC 45 ; WX 333 ; N hyphen ; B 93 232 357 322 ;\nC 46 ; WX 278 ; N period ; B 87 0 214 106 ;\nC 47 ; WX 278 ; N slash ; B -21 -19 452 737 ;\nC 48 ; WX 556 ; N zero ; B 93 -19 608 703 ;\nC 49 ; WX 556 ; N one ; B 207 0 508 703 ;\nC 50 ; WX 556 ; N two ; B 26 0 617 703 ;\nC 51 ; WX 556 ; N three ; B 75 -19 610 703 ;\nC 52 ; WX 556 ; N four ; B 61 0 576 703 ;\nC 53 ; WX 556 ; N five ; B 68 -19 621 688 ;\nC 54 ; WX 556 ; N six ; B 91 -19 615 703 ;\nC 55 ; WX 556 ; N seven ; B 137 0 669 688 ;\nC 56 ; WX 556 ; N eight ; B 74 -19 607 703 ;\nC 57 ; WX 556 ; N nine ; B 82 -19 609 703 ;\nC 58 ; WX 278 ; N colon ; B 87 0 301 516 ;\nC 59 ; WX 278 ; N semicolon ; B 56 -147 301 516 ;\nC 60 ; WX 584 ; N less ; B 94 11 641 495 ;\nC 61 ; WX 584 ; N equal ; B 63 115 628 390 ;\nC 62 ; WX 584 ; N greater ; B 50 11 597 495 ;\nC 63 ; WX 556 ; N question ; B 161 0 610 727 ;\nC 64 ; WX 1015 ; N at ; B 215 -19 965 737 ;\nC 65 ; WX 667 ; N A ; B 14 0 654 718 ;\nC 66 ; WX 667 ; N B ; B 74 0 712 718 ;\nC 67 ; WX 722 ; N C ; B 108 -19 782 737 ;\nC 68 ; WX 722 ; N D ; B 81 0 764 718 ;\nC 69 ; WX 667 ; N E ; B 86 0 762 718 ;\nC 70 ; WX 611 ; N F ; B 86 0 736 718 ;\nC 71 ; WX 778 ; N G ; B 111 -19 799 737 ;\nC 72 ; WX 722 ; N H ; B 77 0 799 718 ;\nC 73 ; WX 278 ; N I ; B 91 0 341 718 ;\nC 74 ; WX 500 ; N J ; B 47 -19 581 718 ;\nC 75 ; WX 667 ; N K ; B 76 0 808 718 ;\nC 76 ; WX 556 ; N L ; B 76 0 555 718 ;\nC 77 ; WX 833 ; N M ; B 73 0 914 718 ;\nC 78 ; WX 722 ; N N ; B 76 0 799 718 ;\nC 79 ; WX 778 ; N O ; B 105 -19 826 737 ;\nC 80 ; WX 667 ; N P ; B 86 0 737 718 ;\nC 81 ; WX 778 ; N Q ; B 105 -56 826 737 ;\nC 82 ; WX 722 ; N R ; B 88 0 773 718 ;\nC 83 ; WX 667 ; N S ; B 90 -19 713 737 ;\nC 84 ; WX 611 ; N T ; B 148 0 750 718 ;\nC 85 ; WX 722 ; N U ; B 123 -19 797 718 ;\nC 86 ; WX 667 ; N V ; B 173 0 800 718 ;\nC 87 ; WX 944 ; N W ; B 169 0 1081 718 ;\nC 88 ; WX 667 ; N X ; B 19 0 790 718 ;\nC 89 ; WX 667 ; N Y ; B 167 0 806 718 ;\nC 90 ; WX 611 ; N Z ; B 23 0 741 718 ;\nC 91 ; WX 278 ; N bracketleft ; B 21 -196 403 722 ;\nC 92 ; WX 278 ; N backslash ; B 140 -19 291 737 ;\nC 93 ; WX 278 ; N bracketright ; B -14 -196 368 722 ;\nC 94 ; WX 469 ; N asciicircum ; B 42 264 539 688 ;\nC 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ;\nC 96 ; WX 222 ; N quoteleft ; B 165 470 323 725 ;\nC 97 ; WX 556 ; N a ; B 61 -15 559 538 ;\nC 98 ; WX 556 ; N b ; B 58 -15 584 718 ;\nC 99 ; WX 500 ; N c ; B 74 -15 553 538 ;\nC 100 ; WX 556 ; N d ; B 84 -15 652 718 ;\nC 101 ; WX 556 ; N e ; B 84 -15 578 538 ;\nC 102 ; WX 278 ; N f ; B 86 0 416 728 ; L i fi ; L l fl ;\nC 103 ; WX 556 ; N g ; B 42 -220 610 538 ;\nC 104 ; WX 556 ; N h ; B 65 0 573 718 ;\nC 105 ; WX 222 ; N i ; B 67 0 308 718 ;\nC 106 ; WX 222 ; N j ; B -60 -210 308 718 ;\nC 107 ; WX 500 ; N k ; B 67 0 600 718 ;\nC 108 ; WX 222 ; N l ; B 67 0 308 718 ;\nC 109 ; WX 833 ; N m ; B 65 0 852 538 ;\nC 110 ; WX 556 ; N n ; B 65 0 573 538 ;\nC 111 ; WX 556 ; N o ; B 83 -14 585 538 ;\nC 112 ; WX 556 ; N p ; B 14 -207 584 538 ;\nC 113 ; WX 556 ; N q ; B 84 -207 605 538 ;\nC 114 ; WX 333 ; N r ; B 77 0 446 538 ;\nC 115 ; WX 500 ; N s ; B 63 -15 529 538 ;\nC 116 ; WX 278 ; N t ; B 102 -7 368 669 ;\nC 117 ; WX 556 ; N u ; B 94 -15 600 523 ;\nC 118 ; WX 500 ; N v ; B 119 0 603 523 ;\nC 119 ; WX 722 ; N w ; B 125 0 820 523 ;\nC 120 ; WX 500 ; N x ; B 11 0 594 523 ;\nC 121 ; WX 500 ; N y ; B 15 -214 600 523 ;\nC 122 ; WX 500 ; N z ; B 31 0 571 523 ;\nC 123 ; WX 334 ; N braceleft ; B 92 -196 445 722 ;\nC 124 ; WX 260 ; N bar ; B 46 -225 332 775 ;\nC 125 ; WX 334 ; N braceright ; B 0 -196 354 722 ;\nC 126 ; WX 584 ; N asciitilde ; B 111 180 580 326 ;\nC 161 ; WX 333 ; N exclamdown ; B 77 -195 326 523 ;\nC 162 ; WX 556 ; N cent ; B 95 -115 584 623 ;\nC 163 ; WX 556 ; N sterling ; B 49 -16 634 718 ;\nC 164 ; WX 167 ; N fraction ; B -170 -19 482 703 ;\nC 165 ; WX 556 ; N yen ; B 81 0 699 688 ;\nC 166 ; WX 556 ; N florin ; B -52 -207 654 737 ;\nC 167 ; WX 556 ; N section ; B 76 -191 584 737 ;\nC 168 ; WX 556 ; N currency ; B 60 99 646 603 ;\nC 169 ; WX 191 ; N quotesingle ; B 157 463 285 718 ;\nC 170 ; WX 333 ; N quotedblleft ; B 138 470 461 725 ;\nC 171 ; WX 556 ; N guillemotleft ; B 146 108 554 446 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 137 108 340 446 ;\nC 173 ; WX 333 ; N guilsinglright ; B 111 108 314 446 ;\nC 174 ; WX 500 ; N fi ; B 86 0 587 728 ;\nC 175 ; WX 500 ; N fl ; B 86 0 585 728 ;\nC 177 ; WX 556 ; N endash ; B 51 240 623 313 ;\nC 178 ; WX 556 ; N dagger ; B 135 -159 622 718 ;\nC 179 ; WX 556 ; N daggerdbl ; B 52 -159 623 718 ;\nC 180 ; WX 278 ; N periodcentered ; B 129 190 257 315 ;\nC 182 ; WX 537 ; N paragraph ; B 126 -173 650 718 ;\nC 183 ; WX 350 ; N bullet ; B 91 202 413 517 ;\nC 184 ; WX 222 ; N quotesinglbase ; B 21 -149 180 106 ;\nC 185 ; WX 333 ; N quotedblbase ; B -6 -149 318 106 ;\nC 186 ; WX 333 ; N quotedblright ; B 124 463 448 718 ;\nC 187 ; WX 556 ; N guillemotright ; B 120 108 528 446 ;\nC 188 ; WX 1000 ; N ellipsis ; B 115 0 908 106 ;\nC 189 ; WX 1000 ; N perthousand ; B 88 -19 1029 703 ;\nC 191 ; WX 611 ; N questiondown ; B 85 -201 534 525 ;\nC 193 ; WX 333 ; N grave ; B 170 593 337 734 ;\nC 194 ; WX 333 ; N acute ; B 248 593 475 734 ;\nC 195 ; WX 333 ; N circumflex ; B 147 593 438 734 ;\nC 196 ; WX 333 ; N tilde ; B 125 606 490 722 ;\nC 197 ; WX 333 ; N macron ; B 143 627 468 684 ;\nC 198 ; WX 333 ; N breve ; B 167 595 476 731 ;\nC 199 ; WX 333 ; N dotaccent ; B 249 604 362 706 ;\nC 200 ; WX 333 ; N dieresis ; B 168 604 443 706 ;\nC 202 ; WX 333 ; N ring ; B 214 572 402 756 ;\nC 203 ; WX 333 ; N cedilla ; B 2 -225 232 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 157 593 565 734 ;\nC 206 ; WX 333 ; N ogonek ; B 43 -225 249 0 ;\nC 207 ; WX 333 ; N caron ; B 177 593 468 734 ;\nC 208 ; WX 1000 ; N emdash ; B 51 240 1067 313 ;\nC 225 ; WX 1000 ; N AE ; B 8 0 1097 718 ;\nC 227 ; WX 370 ; N ordfeminine ; B 127 405 449 737 ;\nC 232 ; WX 556 ; N Lslash ; B 41 0 555 718 ;\nC 233 ; WX 778 ; N Oslash ; B 43 -19 890 737 ;\nC 234 ; WX 1000 ; N OE ; B 98 -19 1116 737 ;\nC 235 ; WX 365 ; N ordmasculine ; B 141 405 468 737 ;\nC 241 ; WX 889 ; N ae ; B 61 -15 909 538 ;\nC 245 ; WX 278 ; N dotlessi ; B 95 0 294 523 ;\nC 248 ; WX 222 ; N lslash ; B 41 0 347 718 ;\nC 249 ; WX 611 ; N oslash ; B 29 -22 647 545 ;\nC 250 ; WX 944 ; N oe ; B 83 -15 964 538 ;\nC 251 ; WX 611 ; N germandbls ; B 67 -15 658 728 ;\nC -1 ; WX 278 ; N Idieresis ; B 91 0 458 901 ;\nC -1 ; WX 556 ; N eacute ; B 84 -15 587 734 ;\nC -1 ; WX 556 ; N abreve ; B 61 -15 578 731 ;\nC -1 ; WX 556 ; N uhungarumlaut ; B 94 -15 677 734 ;\nC -1 ; WX 556 ; N ecaron ; B 84 -15 580 734 ;\nC -1 ; WX 667 ; N Ydieresis ; B 167 0 806 901 ;\nC -1 ; WX 584 ; N divide ; B 85 -19 606 524 ;\nC -1 ; WX 667 ; N Yacute ; B 167 0 806 929 ;\nC -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ;\nC -1 ; WX 556 ; N aacute ; B 61 -15 587 734 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 123 -19 797 929 ;\nC -1 ; WX 500 ; N yacute ; B 15 -214 600 734 ;\nC -1 ; WX 500 ; N scommaaccent ; B 63 -225 529 538 ;\nC -1 ; WX 556 ; N ecircumflex ; B 84 -15 578 734 ;\nC -1 ; WX 722 ; N Uring ; B 123 -19 797 931 ;\nC -1 ; WX 722 ; N Udieresis ; B 123 -19 797 901 ;\nC -1 ; WX 556 ; N aogonek ; B 61 -220 559 538 ;\nC -1 ; WX 722 ; N Uacute ; B 123 -19 797 929 ;\nC -1 ; WX 556 ; N uogonek ; B 94 -225 600 523 ;\nC -1 ; WX 667 ; N Edieresis ; B 86 0 762 901 ;\nC -1 ; WX 722 ; N Dcroat ; B 69 0 764 718 ;\nC -1 ; WX 250 ; N commaaccent ; B 39 -225 172 -40 ;\nC -1 ; WX 737 ; N copyright ; B 54 -19 837 737 ;\nC -1 ; WX 667 ; N Emacron ; B 86 0 762 879 ;\nC -1 ; WX 500 ; N ccaron ; B 74 -15 553 734 ;\nC -1 ; WX 556 ; N aring ; B 61 -15 559 756 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 799 718 ;\nC -1 ; WX 222 ; N lacute ; B 67 0 461 929 ;\nC -1 ; WX 556 ; N agrave ; B 61 -15 559 734 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 148 -225 750 718 ;\nC -1 ; WX 722 ; N Cacute ; B 108 -19 782 929 ;\nC -1 ; WX 556 ; N atilde ; B 61 -15 592 722 ;\nC -1 ; WX 667 ; N Edotaccent ; B 86 0 762 901 ;\nC -1 ; WX 500 ; N scaron ; B 63 -15 552 734 ;\nC -1 ; WX 500 ; N scedilla ; B 63 -225 529 538 ;\nC -1 ; WX 278 ; N iacute ; B 95 0 448 734 ;\nC -1 ; WX 471 ; N lozenge ; B 88 0 540 728 ;\nC -1 ; WX 722 ; N Rcaron ; B 88 0 773 929 ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 111 -225 799 737 ;\nC -1 ; WX 556 ; N ucircumflex ; B 94 -15 600 734 ;\nC -1 ; WX 556 ; N acircumflex ; B 61 -15 559 734 ;\nC -1 ; WX 667 ; N Amacron ; B 14 0 677 879 ;\nC -1 ; WX 333 ; N rcaron ; B 77 0 508 734 ;\nC -1 ; WX 500 ; N ccedilla ; B 74 -225 553 538 ;\nC -1 ; WX 611 ; N Zdotaccent ; B 23 0 741 901 ;\nC -1 ; WX 667 ; N Thorn ; B 86 0 712 718 ;\nC -1 ; WX 778 ; N Omacron ; B 105 -19 826 879 ;\nC -1 ; WX 722 ; N Racute ; B 88 0 773 929 ;\nC -1 ; WX 667 ; N Sacute ; B 90 -19 713 929 ;\nC -1 ; WX 643 ; N dcaron ; B 84 -15 808 718 ;\nC -1 ; WX 722 ; N Umacron ; B 123 -19 797 879 ;\nC -1 ; WX 556 ; N uring ; B 94 -15 600 756 ;\nC -1 ; WX 333 ; N threesuperior ; B 90 270 436 703 ;\nC -1 ; WX 778 ; N Ograve ; B 105 -19 826 929 ;\nC -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ;\nC -1 ; WX 667 ; N Abreve ; B 14 0 685 926 ;\nC -1 ; WX 584 ; N multiply ; B 50 0 642 506 ;\nC -1 ; WX 556 ; N uacute ; B 94 -15 600 734 ;\nC -1 ; WX 611 ; N Tcaron ; B 148 0 750 929 ;\nC -1 ; WX 476 ; N partialdiff ; B 41 -38 550 714 ;\nC -1 ; WX 500 ; N ydieresis ; B 15 -214 600 706 ;\nC -1 ; WX 722 ; N Nacute ; B 76 0 799 929 ;\nC -1 ; WX 278 ; N icircumflex ; B 95 0 411 734 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 86 0 762 929 ;\nC -1 ; WX 556 ; N adieresis ; B 61 -15 559 706 ;\nC -1 ; WX 556 ; N edieresis ; B 84 -15 578 706 ;\nC -1 ; WX 500 ; N cacute ; B 74 -15 559 734 ;\nC -1 ; WX 556 ; N nacute ; B 65 0 587 734 ;\nC -1 ; WX 556 ; N umacron ; B 94 -15 600 684 ;\nC -1 ; WX 722 ; N Ncaron ; B 76 0 799 929 ;\nC -1 ; WX 278 ; N Iacute ; B 91 0 489 929 ;\nC -1 ; WX 584 ; N plusminus ; B 39 0 618 506 ;\nC -1 ; WX 260 ; N brokenbar ; B 62 -150 316 700 ;\nC -1 ; WX 737 ; N registered ; B 54 -19 837 737 ;\nC -1 ; WX 778 ; N Gbreve ; B 111 -19 799 926 ;\nC -1 ; WX 278 ; N Idotaccent ; B 91 0 377 901 ;\nC -1 ; WX 600 ; N summation ; B 15 -10 671 706 ;\nC -1 ; WX 667 ; N Egrave ; B 86 0 762 929 ;\nC -1 ; WX 333 ; N racute ; B 77 0 475 734 ;\nC -1 ; WX 556 ; N omacron ; B 83 -14 585 684 ;\nC -1 ; WX 611 ; N Zacute ; B 23 0 741 929 ;\nC -1 ; WX 611 ; N Zcaron ; B 23 0 741 929 ;\nC -1 ; WX 549 ; N greaterequal ; B 26 0 620 674 ;\nC -1 ; WX 722 ; N Eth ; B 69 0 764 718 ;\nC -1 ; WX 722 ; N Ccedilla ; B 108 -225 782 737 ;\nC -1 ; WX 222 ; N lcommaaccent ; B 25 -225 308 718 ;\nC -1 ; WX 317 ; N tcaron ; B 102 -7 501 808 ;\nC -1 ; WX 556 ; N eogonek ; B 84 -225 578 538 ;\nC -1 ; WX 722 ; N Uogonek ; B 123 -225 797 718 ;\nC -1 ; WX 667 ; N Aacute ; B 14 0 683 929 ;\nC -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ;\nC -1 ; WX 556 ; N egrave ; B 84 -15 578 734 ;\nC -1 ; WX 500 ; N zacute ; B 31 0 571 734 ;\nC -1 ; WX 222 ; N iogonek ; B -61 -225 308 718 ;\nC -1 ; WX 778 ; N Oacute ; B 105 -19 826 929 ;\nC -1 ; WX 556 ; N oacute ; B 83 -14 587 734 ;\nC -1 ; WX 556 ; N amacron ; B 61 -15 580 684 ;\nC -1 ; WX 500 ; N sacute ; B 63 -15 559 734 ;\nC -1 ; WX 278 ; N idieresis ; B 95 0 416 706 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 105 -19 826 929 ;\nC -1 ; WX 722 ; N Ugrave ; B 123 -19 797 929 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 556 ; N thorn ; B 14 -207 584 718 ;\nC -1 ; WX 333 ; N twosuperior ; B 64 281 449 703 ;\nC -1 ; WX 778 ; N Odieresis ; B 105 -19 826 901 ;\nC -1 ; WX 556 ; N mu ; B 24 -207 600 523 ;\nC -1 ; WX 278 ; N igrave ; B 95 0 310 734 ;\nC -1 ; WX 556 ; N ohungarumlaut ; B 83 -14 677 734 ;\nC -1 ; WX 667 ; N Eogonek ; B 86 -220 762 718 ;\nC -1 ; WX 556 ; N dcroat ; B 84 -15 689 718 ;\nC -1 ; WX 834 ; N threequarters ; B 130 -19 861 703 ;\nC -1 ; WX 667 ; N Scedilla ; B 90 -225 713 737 ;\nC -1 ; WX 299 ; N lcaron ; B 67 0 464 718 ;\nC -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 808 718 ;\nC -1 ; WX 556 ; N Lacute ; B 76 0 555 929 ;\nC -1 ; WX 1000 ; N trademark ; B 186 306 1056 718 ;\nC -1 ; WX 556 ; N edotaccent ; B 84 -15 578 706 ;\nC -1 ; WX 278 ; N Igrave ; B 91 0 351 929 ;\nC -1 ; WX 278 ; N Imacron ; B 91 0 483 879 ;\nC -1 ; WX 556 ; N Lcaron ; B 76 0 570 718 ;\nC -1 ; WX 834 ; N onehalf ; B 114 -19 839 703 ;\nC -1 ; WX 549 ; N lessequal ; B 26 0 666 674 ;\nC -1 ; WX 556 ; N ocircumflex ; B 83 -14 585 734 ;\nC -1 ; WX 556 ; N ntilde ; B 65 0 592 722 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 123 -19 801 929 ;\nC -1 ; WX 667 ; N Eacute ; B 86 0 762 929 ;\nC -1 ; WX 556 ; N emacron ; B 84 -15 580 684 ;\nC -1 ; WX 556 ; N gbreve ; B 42 -220 610 731 ;\nC -1 ; WX 834 ; N onequarter ; B 150 -19 802 703 ;\nC -1 ; WX 667 ; N Scaron ; B 90 -19 713 929 ;\nC -1 ; WX 667 ; N Scommaaccent ; B 90 -225 713 737 ;\nC -1 ; WX 778 ; N Ohungarumlaut ; B 105 -19 829 929 ;\nC -1 ; WX 400 ; N degree ; B 169 411 468 703 ;\nC -1 ; WX 556 ; N ograve ; B 83 -14 585 734 ;\nC -1 ; WX 722 ; N Ccaron ; B 108 -19 782 929 ;\nC -1 ; WX 556 ; N ugrave ; B 94 -15 600 734 ;\nC -1 ; WX 453 ; N radical ; B 79 -80 617 762 ;\nC -1 ; WX 722 ; N Dcaron ; B 81 0 764 929 ;\nC -1 ; WX 333 ; N rcommaaccent ; B 30 -225 446 538 ;\nC -1 ; WX 722 ; N Ntilde ; B 76 0 799 917 ;\nC -1 ; WX 556 ; N otilde ; B 83 -14 602 722 ;\nC -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 773 718 ;\nC -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 555 718 ;\nC -1 ; WX 667 ; N Atilde ; B 14 0 699 917 ;\nC -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ;\nC -1 ; WX 667 ; N Aring ; B 14 0 654 931 ;\nC -1 ; WX 778 ; N Otilde ; B 105 -19 826 917 ;\nC -1 ; WX 500 ; N zdotaccent ; B 31 0 571 706 ;\nC -1 ; WX 667 ; N Ecaron ; B 86 0 762 929 ;\nC -1 ; WX 278 ; N Iogonek ; B -33 -225 341 718 ;\nC -1 ; WX 500 ; N kcommaaccent ; B 67 -225 600 718 ;\nC -1 ; WX 584 ; N minus ; B 85 216 606 289 ;\nC -1 ; WX 278 ; N Icircumflex ; B 91 0 452 929 ;\nC -1 ; WX 556 ; N ncaron ; B 65 0 580 734 ;\nC -1 ; WX 278 ; N tcommaaccent ; B 63 -225 368 669 ;\nC -1 ; WX 584 ; N logicalnot ; B 106 108 628 390 ;\nC -1 ; WX 556 ; N odieresis ; B 83 -14 585 706 ;\nC -1 ; WX 556 ; N udieresis ; B 94 -15 600 706 ;\nC -1 ; WX 549 ; N notequal ; B 34 -35 623 551 ;\nC -1 ; WX 556 ; N gcommaaccent ; B 42 -220 610 822 ;\nC -1 ; WX 556 ; N eth ; B 81 -15 617 737 ;\nC -1 ; WX 500 ; N zcaron ; B 31 0 571 734 ;\nC -1 ; WX 556 ; N ncommaaccent ; B 65 -225 573 538 ;\nC -1 ; WX 333 ; N onesuperior ; B 166 281 371 703 ;\nC -1 ; WX 278 ; N imacron ; B 95 0 417 684 ;\nC -1 ; WX 556 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 2705\nKPX A C -30\nKPX A Cacute -30\nKPX A Ccaron -30\nKPX A Ccedilla -30\nKPX A G -30\nKPX A Gbreve -30\nKPX A Gcommaaccent -30\nKPX A O -30\nKPX A Oacute -30\nKPX A Ocircumflex -30\nKPX A Odieresis -30\nKPX A Ograve -30\nKPX A Ohungarumlaut -30\nKPX A Omacron -30\nKPX A Oslash -30\nKPX A Otilde -30\nKPX A Q -30\nKPX A T -120\nKPX A Tcaron -120\nKPX A Tcommaaccent -120\nKPX A U -50\nKPX A Uacute -50\nKPX A Ucircumflex -50\nKPX A Udieresis -50\nKPX A Ugrave -50\nKPX A Uhungarumlaut -50\nKPX A Umacron -50\nKPX A Uogonek -50\nKPX A Uring -50\nKPX A V -70\nKPX A W -50\nKPX A Y -100\nKPX A Yacute -100\nKPX A Ydieresis -100\nKPX A u -30\nKPX A uacute -30\nKPX A ucircumflex -30\nKPX A udieresis -30\nKPX A ugrave -30\nKPX A uhungarumlaut -30\nKPX A umacron -30\nKPX A uogonek -30\nKPX A uring -30\nKPX A v -40\nKPX A w -40\nKPX A y -40\nKPX A yacute -40\nKPX A ydieresis -40\nKPX Aacute C -30\nKPX Aacute Cacute -30\nKPX Aacute Ccaron -30\nKPX Aacute Ccedilla -30\nKPX Aacute G -30\nKPX Aacute Gbreve -30\nKPX Aacute Gcommaaccent -30\nKPX Aacute O -30\nKPX Aacute Oacute -30\nKPX Aacute Ocircumflex -30\nKPX Aacute Odieresis -30\nKPX Aacute Ograve -30\nKPX Aacute Ohungarumlaut -30\nKPX Aacute Omacron -30\nKPX Aacute Oslash -30\nKPX Aacute Otilde -30\nKPX Aacute Q -30\nKPX Aacute T -120\nKPX Aacute Tcaron -120\nKPX Aacute Tcommaaccent -120\nKPX Aacute U -50\nKPX Aacute Uacute -50\nKPX Aacute Ucircumflex -50\nKPX Aacute Udieresis -50\nKPX Aacute Ugrave -50\nKPX Aacute Uhungarumlaut -50\nKPX Aacute Umacron -50\nKPX Aacute Uogonek -50\nKPX Aacute Uring -50\nKPX Aacute V -70\nKPX Aacute W -50\nKPX Aacute Y -100\nKPX Aacute Yacute -100\nKPX Aacute Ydieresis -100\nKPX Aacute u -30\nKPX Aacute uacute -30\nKPX Aacute ucircumflex -30\nKPX Aacute udieresis -30\nKPX Aacute ugrave -30\nKPX Aacute uhungarumlaut -30\nKPX Aacute umacron -30\nKPX Aacute uogonek -30\nKPX Aacute uring -30\nKPX Aacute v -40\nKPX Aacute w -40\nKPX Aacute y -40\nKPX Aacute yacute -40\nKPX Aacute ydieresis -40\nKPX Abreve C -30\nKPX Abreve Cacute -30\nKPX Abreve Ccaron -30\nKPX Abreve Ccedilla -30\nKPX Abreve G -30\nKPX Abreve Gbreve -30\nKPX Abreve Gcommaaccent -30\nKPX Abreve O -30\nKPX Abreve Oacute -30\nKPX Abreve Ocircumflex -30\nKPX Abreve Odieresis -30\nKPX Abreve Ograve -30\nKPX Abreve Ohungarumlaut -30\nKPX Abreve Omacron -30\nKPX Abreve Oslash -30\nKPX Abreve Otilde -30\nKPX Abreve Q -30\nKPX Abreve T -120\nKPX Abreve Tcaron -120\nKPX Abreve Tcommaaccent -120\nKPX Abreve U -50\nKPX Abreve Uacute -50\nKPX Abreve Ucircumflex -50\nKPX Abreve Udieresis -50\nKPX Abreve Ugrave -50\nKPX Abreve Uhungarumlaut -50\nKPX Abreve Umacron -50\nKPX Abreve Uogonek -50\nKPX Abreve Uring -50\nKPX Abreve V -70\nKPX Abreve W -50\nKPX Abreve Y -100\nKPX Abreve Yacute -100\nKPX Abreve Ydieresis -100\nKPX Abreve u -30\nKPX Abreve uacute -30\nKPX Abreve ucircumflex -30\nKPX Abreve udieresis -30\nKPX Abreve ugrave -30\nKPX Abreve uhungarumlaut -30\nKPX Abreve umacron -30\nKPX Abreve uogonek -30\nKPX Abreve uring -30\nKPX Abreve v -40\nKPX Abreve w -40\nKPX Abreve y -40\nKPX Abreve yacute -40\nKPX Abreve ydieresis -40\nKPX Acircumflex C -30\nKPX Acircumflex Cacute -30\nKPX Acircumflex Ccaron -30\nKPX Acircumflex Ccedilla -30\nKPX Acircumflex G -30\nKPX Acircumflex Gbreve -30\nKPX Acircumflex Gcommaaccent -30\nKPX Acircumflex O -30\nKPX Acircumflex Oacute -30\nKPX Acircumflex Ocircumflex -30\nKPX Acircumflex Odieresis -30\nKPX Acircumflex Ograve -30\nKPX Acircumflex Ohungarumlaut -30\nKPX Acircumflex Omacron -30\nKPX Acircumflex Oslash -30\nKPX Acircumflex Otilde -30\nKPX Acircumflex Q -30\nKPX Acircumflex T -120\nKPX Acircumflex Tcaron -120\nKPX Acircumflex Tcommaaccent -120\nKPX Acircumflex U -50\nKPX Acircumflex Uacute -50\nKPX Acircumflex Ucircumflex -50\nKPX Acircumflex Udieresis -50\nKPX Acircumflex Ugrave -50\nKPX Acircumflex Uhungarumlaut -50\nKPX Acircumflex Umacron -50\nKPX Acircumflex Uogonek -50\nKPX Acircumflex Uring -50\nKPX Acircumflex V -70\nKPX Acircumflex W -50\nKPX Acircumflex Y -100\nKPX Acircumflex Yacute -100\nKPX Acircumflex Ydieresis -100\nKPX Acircumflex u -30\nKPX Acircumflex uacute -30\nKPX Acircumflex ucircumflex -30\nKPX Acircumflex udieresis -30\nKPX Acircumflex ugrave -30\nKPX Acircumflex uhungarumlaut -30\nKPX Acircumflex umacron -30\nKPX Acircumflex uogonek -30\nKPX Acircumflex uring -30\nKPX Acircumflex v -40\nKPX Acircumflex w -40\nKPX Acircumflex y -40\nKPX Acircumflex yacute -40\nKPX Acircumflex ydieresis -40\nKPX Adieresis C -30\nKPX Adieresis Cacute -30\nKPX Adieresis Ccaron -30\nKPX Adieresis Ccedilla -30\nKPX Adieresis G -30\nKPX Adieresis Gbreve -30\nKPX Adieresis Gcommaaccent -30\nKPX Adieresis O -30\nKPX Adieresis Oacute -30\nKPX Adieresis Ocircumflex -30\nKPX Adieresis Odieresis -30\nKPX Adieresis Ograve -30\nKPX Adieresis Ohungarumlaut -30\nKPX Adieresis Omacron -30\nKPX Adieresis Oslash -30\nKPX Adieresis Otilde -30\nKPX Adieresis Q -30\nKPX Adieresis T -120\nKPX Adieresis Tcaron -120\nKPX Adieresis Tcommaaccent -120\nKPX Adieresis U -50\nKPX Adieresis Uacute -50\nKPX Adieresis Ucircumflex -50\nKPX Adieresis Udieresis -50\nKPX Adieresis Ugrave -50\nKPX Adieresis Uhungarumlaut -50\nKPX Adieresis Umacron -50\nKPX Adieresis Uogonek -50\nKPX Adieresis Uring -50\nKPX Adieresis V -70\nKPX Adieresis W -50\nKPX Adieresis Y -100\nKPX Adieresis Yacute -100\nKPX Adieresis Ydieresis -100\nKPX Adieresis u -30\nKPX Adieresis uacute -30\nKPX Adieresis ucircumflex -30\nKPX Adieresis udieresis -30\nKPX Adieresis ugrave -30\nKPX Adieresis uhungarumlaut -30\nKPX Adieresis umacron -30\nKPX Adieresis uogonek -30\nKPX Adieresis uring -30\nKPX Adieresis v -40\nKPX Adieresis w -40\nKPX Adieresis y -40\nKPX Adieresis yacute -40\nKPX Adieresis ydieresis -40\nKPX Agrave C -30\nKPX Agrave Cacute -30\nKPX Agrave Ccaron -30\nKPX Agrave Ccedilla -30\nKPX Agrave G -30\nKPX Agrave Gbreve -30\nKPX Agrave Gcommaaccent -30\nKPX Agrave O -30\nKPX Agrave Oacute -30\nKPX Agrave Ocircumflex -30\nKPX Agrave Odieresis -30\nKPX Agrave Ograve -30\nKPX Agrave Ohungarumlaut -30\nKPX Agrave Omacron -30\nKPX Agrave Oslash -30\nKPX Agrave Otilde -30\nKPX Agrave Q -30\nKPX Agrave T -120\nKPX Agrave Tcaron -120\nKPX Agrave Tcommaaccent -120\nKPX Agrave U -50\nKPX Agrave Uacute -50\nKPX Agrave Ucircumflex -50\nKPX Agrave Udieresis -50\nKPX Agrave Ugrave -50\nKPX Agrave Uhungarumlaut -50\nKPX Agrave Umacron -50\nKPX Agrave Uogonek -50\nKPX Agrave Uring -50\nKPX Agrave V -70\nKPX Agrave W -50\nKPX Agrave Y -100\nKPX Agrave Yacute -100\nKPX Agrave Ydieresis -100\nKPX Agrave u -30\nKPX Agrave uacute -30\nKPX Agrave ucircumflex -30\nKPX Agrave udieresis -30\nKPX Agrave ugrave -30\nKPX Agrave uhungarumlaut -30\nKPX Agrave umacron -30\nKPX Agrave uogonek -30\nKPX Agrave uring -30\nKPX Agrave v -40\nKPX Agrave w -40\nKPX Agrave y -40\nKPX Agrave yacute -40\nKPX Agrave ydieresis -40\nKPX Amacron C -30\nKPX Amacron Cacute -30\nKPX Amacron Ccaron -30\nKPX Amacron Ccedilla -30\nKPX Amacron G -30\nKPX Amacron Gbreve -30\nKPX Amacron Gcommaaccent -30\nKPX Amacron O -30\nKPX Amacron Oacute -30\nKPX Amacron Ocircumflex -30\nKPX Amacron Odieresis -30\nKPX Amacron Ograve -30\nKPX Amacron Ohungarumlaut -30\nKPX Amacron Omacron -30\nKPX Amacron Oslash -30\nKPX Amacron Otilde -30\nKPX Amacron Q -30\nKPX Amacron T -120\nKPX Amacron Tcaron -120\nKPX Amacron Tcommaaccent -120\nKPX Amacron U -50\nKPX Amacron Uacute -50\nKPX Amacron Ucircumflex -50\nKPX Amacron Udieresis -50\nKPX Amacron Ugrave -50\nKPX Amacron Uhungarumlaut -50\nKPX Amacron Umacron -50\nKPX Amacron Uogonek -50\nKPX Amacron Uring -50\nKPX Amacron V -70\nKPX Amacron W -50\nKPX Amacron Y -100\nKPX Amacron Yacute -100\nKPX Amacron Ydieresis -100\nKPX Amacron u -30\nKPX Amacron uacute -30\nKPX Amacron ucircumflex -30\nKPX Amacron udieresis -30\nKPX Amacron ugrave -30\nKPX Amacron uhungarumlaut -30\nKPX Amacron umacron -30\nKPX Amacron uogonek -30\nKPX Amacron uring -30\nKPX Amacron v -40\nKPX Amacron w -40\nKPX Amacron y -40\nKPX Amacron yacute -40\nKPX Amacron ydieresis -40\nKPX Aogonek C -30\nKPX Aogonek Cacute -30\nKPX Aogonek Ccaron -30\nKPX Aogonek Ccedilla -30\nKPX Aogonek G -30\nKPX Aogonek Gbreve -30\nKPX Aogonek Gcommaaccent -30\nKPX Aogonek O -30\nKPX Aogonek Oacute -30\nKPX Aogonek Ocircumflex -30\nKPX Aogonek Odieresis -30\nKPX Aogonek Ograve -30\nKPX Aogonek Ohungarumlaut -30\nKPX Aogonek Omacron -30\nKPX Aogonek Oslash -30\nKPX Aogonek Otilde -30\nKPX Aogonek Q -30\nKPX Aogonek T -120\nKPX Aogonek Tcaron -120\nKPX Aogonek Tcommaaccent -120\nKPX Aogonek U -50\nKPX Aogonek Uacute -50\nKPX Aogonek Ucircumflex -50\nKPX Aogonek Udieresis -50\nKPX Aogonek Ugrave -50\nKPX Aogonek Uhungarumlaut -50\nKPX Aogonek Umacron -50\nKPX Aogonek Uogonek -50\nKPX Aogonek Uring -50\nKPX Aogonek V -70\nKPX Aogonek W -50\nKPX Aogonek Y -100\nKPX Aogonek Yacute -100\nKPX Aogonek Ydieresis -100\nKPX Aogonek u -30\nKPX Aogonek uacute -30\nKPX Aogonek ucircumflex -30\nKPX Aogonek udieresis -30\nKPX Aogonek ugrave -30\nKPX Aogonek uhungarumlaut -30\nKPX Aogonek umacron -30\nKPX Aogonek uogonek -30\nKPX Aogonek uring -30\nKPX Aogonek v -40\nKPX Aogonek w -40\nKPX Aogonek y -40\nKPX Aogonek yacute -40\nKPX Aogonek ydieresis -40\nKPX Aring C -30\nKPX Aring Cacute -30\nKPX Aring Ccaron -30\nKPX Aring Ccedilla -30\nKPX Aring G -30\nKPX Aring Gbreve -30\nKPX Aring Gcommaaccent -30\nKPX Aring O -30\nKPX Aring Oacute -30\nKPX Aring Ocircumflex -30\nKPX Aring Odieresis -30\nKPX Aring Ograve -30\nKPX Aring Ohungarumlaut -30\nKPX Aring Omacron -30\nKPX Aring Oslash -30\nKPX Aring Otilde -30\nKPX Aring Q -30\nKPX Aring T -120\nKPX Aring Tcaron -120\nKPX Aring Tcommaaccent -120\nKPX Aring U -50\nKPX Aring Uacute -50\nKPX Aring Ucircumflex -50\nKPX Aring Udieresis -50\nKPX Aring Ugrave -50\nKPX Aring Uhungarumlaut -50\nKPX Aring Umacron -50\nKPX Aring Uogonek -50\nKPX Aring Uring -50\nKPX Aring V -70\nKPX Aring W -50\nKPX Aring Y -100\nKPX Aring Yacute -100\nKPX Aring Ydieresis -100\nKPX Aring u -30\nKPX Aring uacute -30\nKPX Aring ucircumflex -30\nKPX Aring udieresis -30\nKPX Aring ugrave -30\nKPX Aring uhungarumlaut -30\nKPX Aring umacron -30\nKPX Aring uogonek -30\nKPX Aring uring -30\nKPX Aring v -40\nKPX Aring w -40\nKPX Aring y -40\nKPX Aring yacute -40\nKPX Aring ydieresis -40\nKPX Atilde C -30\nKPX Atilde Cacute -30\nKPX Atilde Ccaron -30\nKPX Atilde Ccedilla -30\nKPX Atilde G -30\nKPX Atilde Gbreve -30\nKPX Atilde Gcommaaccent -30\nKPX Atilde O -30\nKPX Atilde Oacute -30\nKPX Atilde Ocircumflex -30\nKPX Atilde Odieresis -30\nKPX Atilde Ograve -30\nKPX Atilde Ohungarumlaut -30\nKPX Atilde Omacron -30\nKPX Atilde Oslash -30\nKPX Atilde Otilde -30\nKPX Atilde Q -30\nKPX Atilde T -120\nKPX Atilde Tcaron -120\nKPX Atilde Tcommaaccent -120\nKPX Atilde U -50\nKPX Atilde Uacute -50\nKPX Atilde Ucircumflex -50\nKPX Atilde Udieresis -50\nKPX Atilde Ugrave -50\nKPX Atilde Uhungarumlaut -50\nKPX Atilde Umacron -50\nKPX Atilde Uogonek -50\nKPX Atilde Uring -50\nKPX Atilde V -70\nKPX Atilde W -50\nKPX Atilde Y -100\nKPX Atilde Yacute -100\nKPX Atilde Ydieresis -100\nKPX Atilde u -30\nKPX Atilde uacute -30\nKPX Atilde ucircumflex -30\nKPX Atilde udieresis -30\nKPX Atilde ugrave -30\nKPX Atilde uhungarumlaut -30\nKPX Atilde umacron -30\nKPX Atilde uogonek -30\nKPX Atilde uring -30\nKPX Atilde v -40\nKPX Atilde w -40\nKPX Atilde y -40\nKPX Atilde yacute -40\nKPX Atilde ydieresis -40\nKPX B U -10\nKPX B Uacute -10\nKPX B Ucircumflex -10\nKPX B Udieresis -10\nKPX B Ugrave -10\nKPX B Uhungarumlaut -10\nKPX B Umacron -10\nKPX B Uogonek -10\nKPX B Uring -10\nKPX B comma -20\nKPX B period -20\nKPX C comma -30\nKPX C period -30\nKPX Cacute comma -30\nKPX Cacute period -30\nKPX Ccaron comma -30\nKPX Ccaron period -30\nKPX Ccedilla comma -30\nKPX Ccedilla period -30\nKPX D A -40\nKPX D Aacute -40\nKPX D Abreve -40\nKPX D Acircumflex -40\nKPX D Adieresis -40\nKPX D Agrave -40\nKPX D Amacron -40\nKPX D Aogonek -40\nKPX D Aring -40\nKPX D Atilde -40\nKPX D V -70\nKPX D W -40\nKPX D Y -90\nKPX D Yacute -90\nKPX D Ydieresis -90\nKPX D comma -70\nKPX D period -70\nKPX Dcaron A -40\nKPX Dcaron Aacute -40\nKPX Dcaron Abreve -40\nKPX Dcaron Acircumflex -40\nKPX Dcaron Adieresis -40\nKPX Dcaron Agrave -40\nKPX Dcaron Amacron -40\nKPX Dcaron Aogonek -40\nKPX Dcaron Aring -40\nKPX Dcaron Atilde -40\nKPX Dcaron V -70\nKPX Dcaron W -40\nKPX Dcaron Y -90\nKPX Dcaron Yacute -90\nKPX Dcaron Ydieresis -90\nKPX Dcaron comma -70\nKPX Dcaron period -70\nKPX Dcroat A -40\nKPX Dcroat Aacute -40\nKPX Dcroat Abreve -40\nKPX Dcroat Acircumflex -40\nKPX Dcroat Adieresis -40\nKPX Dcroat Agrave -40\nKPX Dcroat Amacron -40\nKPX Dcroat Aogonek -40\nKPX Dcroat Aring -40\nKPX Dcroat Atilde -40\nKPX Dcroat V -70\nKPX Dcroat W -40\nKPX Dcroat Y -90\nKPX Dcroat Yacute -90\nKPX Dcroat Ydieresis -90\nKPX Dcroat comma -70\nKPX Dcroat period -70\nKPX F A -80\nKPX F Aacute -80\nKPX F Abreve -80\nKPX F Acircumflex -80\nKPX F Adieresis -80\nKPX F Agrave -80\nKPX F Amacron -80\nKPX F Aogonek -80\nKPX F Aring -80\nKPX F Atilde -80\nKPX F a -50\nKPX F aacute -50\nKPX F abreve -50\nKPX F acircumflex -50\nKPX F adieresis -50\nKPX F agrave -50\nKPX F amacron -50\nKPX F aogonek -50\nKPX F aring -50\nKPX F atilde -50\nKPX F comma -150\nKPX F e -30\nKPX F eacute -30\nKPX F ecaron -30\nKPX F ecircumflex -30\nKPX F edieresis -30\nKPX F edotaccent -30\nKPX F egrave -30\nKPX F emacron -30\nKPX F eogonek -30\nKPX F o -30\nKPX F oacute -30\nKPX F ocircumflex -30\nKPX F odieresis -30\nKPX F ograve -30\nKPX F ohungarumlaut -30\nKPX F omacron -30\nKPX F oslash -30\nKPX F otilde -30\nKPX F period -150\nKPX F r -45\nKPX F racute -45\nKPX F rcaron -45\nKPX F rcommaaccent -45\nKPX J A -20\nKPX J Aacute -20\nKPX J Abreve -20\nKPX J Acircumflex -20\nKPX J Adieresis -20\nKPX J Agrave -20\nKPX J Amacron -20\nKPX J Aogonek -20\nKPX J Aring -20\nKPX J Atilde -20\nKPX J a -20\nKPX J aacute -20\nKPX J abreve -20\nKPX J acircumflex -20\nKPX J adieresis -20\nKPX J agrave -20\nKPX J amacron -20\nKPX J aogonek -20\nKPX J aring -20\nKPX J atilde -20\nKPX J comma -30\nKPX J period -30\nKPX J u -20\nKPX J uacute -20\nKPX J ucircumflex -20\nKPX J udieresis -20\nKPX J ugrave -20\nKPX J uhungarumlaut -20\nKPX J umacron -20\nKPX J uogonek -20\nKPX J uring -20\nKPX K O -50\nKPX K Oacute -50\nKPX K Ocircumflex -50\nKPX K Odieresis -50\nKPX K Ograve -50\nKPX K Ohungarumlaut -50\nKPX K Omacron -50\nKPX K Oslash -50\nKPX K Otilde -50\nKPX K e -40\nKPX K eacute -40\nKPX K ecaron -40\nKPX K ecircumflex -40\nKPX K edieresis -40\nKPX K edotaccent -40\nKPX K egrave -40\nKPX K emacron -40\nKPX K eogonek -40\nKPX K o -40\nKPX K oacute -40\nKPX K ocircumflex -40\nKPX K odieresis -40\nKPX K ograve -40\nKPX K ohungarumlaut -40\nKPX K omacron -40\nKPX K oslash -40\nKPX K otilde -40\nKPX K u -30\nKPX K uacute -30\nKPX K ucircumflex -30\nKPX K udieresis -30\nKPX K ugrave -30\nKPX K uhungarumlaut -30\nKPX K umacron -30\nKPX K uogonek -30\nKPX K uring -30\nKPX K y -50\nKPX K yacute -50\nKPX K ydieresis -50\nKPX Kcommaaccent O -50\nKPX Kcommaaccent Oacute -50\nKPX Kcommaaccent Ocircumflex -50\nKPX Kcommaaccent Odieresis -50\nKPX Kcommaaccent Ograve -50\nKPX Kcommaaccent Ohungarumlaut -50\nKPX Kcommaaccent Omacron -50\nKPX Kcommaaccent Oslash -50\nKPX Kcommaaccent Otilde -50\nKPX Kcommaaccent e -40\nKPX Kcommaaccent eacute -40\nKPX Kcommaaccent ecaron -40\nKPX Kcommaaccent ecircumflex -40\nKPX Kcommaaccent edieresis -40\nKPX Kcommaaccent edotaccent -40\nKPX Kcommaaccent egrave -40\nKPX Kcommaaccent emacron -40\nKPX Kcommaaccent eogonek -40\nKPX Kcommaaccent o -40\nKPX Kcommaaccent oacute -40\nKPX Kcommaaccent ocircumflex -40\nKPX Kcommaaccent odieresis -40\nKPX Kcommaaccent ograve -40\nKPX Kcommaaccent ohungarumlaut -40\nKPX Kcommaaccent omacron -40\nKPX Kcommaaccent oslash -40\nKPX Kcommaaccent otilde -40\nKPX Kcommaaccent u -30\nKPX Kcommaaccent uacute -30\nKPX Kcommaaccent ucircumflex -30\nKPX Kcommaaccent udieresis -30\nKPX Kcommaaccent ugrave -30\nKPX Kcommaaccent uhungarumlaut -30\nKPX Kcommaaccent umacron -30\nKPX Kcommaaccent uogonek -30\nKPX Kcommaaccent uring -30\nKPX Kcommaaccent y -50\nKPX Kcommaaccent yacute -50\nKPX Kcommaaccent ydieresis -50\nKPX L T -110\nKPX L Tcaron -110\nKPX L Tcommaaccent -110\nKPX L V -110\nKPX L W -70\nKPX L Y -140\nKPX L Yacute -140\nKPX L Ydieresis -140\nKPX L quotedblright -140\nKPX L quoteright -160\nKPX L y -30\nKPX L yacute -30\nKPX L ydieresis -30\nKPX Lacute T -110\nKPX Lacute Tcaron -110\nKPX Lacute Tcommaaccent -110\nKPX Lacute V -110\nKPX Lacute W -70\nKPX Lacute Y -140\nKPX Lacute Yacute -140\nKPX Lacute Ydieresis -140\nKPX Lacute quotedblright -140\nKPX Lacute quoteright -160\nKPX Lacute y -30\nKPX Lacute yacute -30\nKPX Lacute ydieresis -30\nKPX Lcaron T -110\nKPX Lcaron Tcaron -110\nKPX Lcaron Tcommaaccent -110\nKPX Lcaron V -110\nKPX Lcaron W -70\nKPX Lcaron Y -140\nKPX Lcaron Yacute -140\nKPX Lcaron Ydieresis -140\nKPX Lcaron quotedblright -140\nKPX Lcaron quoteright -160\nKPX Lcaron y -30\nKPX Lcaron yacute -30\nKPX Lcaron ydieresis -30\nKPX Lcommaaccent T -110\nKPX Lcommaaccent Tcaron -110\nKPX Lcommaaccent Tcommaaccent -110\nKPX Lcommaaccent V -110\nKPX Lcommaaccent W -70\nKPX Lcommaaccent Y -140\nKPX Lcommaaccent Yacute -140\nKPX Lcommaaccent Ydieresis -140\nKPX Lcommaaccent quotedblright -140\nKPX Lcommaaccent quoteright -160\nKPX Lcommaaccent y -30\nKPX Lcommaaccent yacute -30\nKPX Lcommaaccent ydieresis -30\nKPX Lslash T -110\nKPX Lslash Tcaron -110\nKPX Lslash Tcommaaccent -110\nKPX Lslash V -110\nKPX Lslash W -70\nKPX Lslash Y -140\nKPX Lslash Yacute -140\nKPX Lslash Ydieresis -140\nKPX Lslash quotedblright -140\nKPX Lslash quoteright -160\nKPX Lslash y -30\nKPX Lslash yacute -30\nKPX Lslash ydieresis -30\nKPX O A -20\nKPX O Aacute -20\nKPX O Abreve -20\nKPX O Acircumflex -20\nKPX O Adieresis -20\nKPX O Agrave -20\nKPX O Amacron -20\nKPX O Aogonek -20\nKPX O Aring -20\nKPX O Atilde -20\nKPX O T -40\nKPX O Tcaron -40\nKPX O Tcommaaccent -40\nKPX O V -50\nKPX O W -30\nKPX O X -60\nKPX O Y -70\nKPX O Yacute -70\nKPX O Ydieresis -70\nKPX O comma -40\nKPX O period -40\nKPX Oacute A -20\nKPX Oacute Aacute -20\nKPX Oacute Abreve -20\nKPX Oacute Acircumflex -20\nKPX Oacute Adieresis -20\nKPX Oacute Agrave -20\nKPX Oacute Amacron -20\nKPX Oacute Aogonek -20\nKPX Oacute Aring -20\nKPX Oacute Atilde -20\nKPX Oacute T -40\nKPX Oacute Tcaron -40\nKPX Oacute Tcommaaccent -40\nKPX Oacute V -50\nKPX Oacute W -30\nKPX Oacute X -60\nKPX Oacute Y -70\nKPX Oacute Yacute -70\nKPX Oacute Ydieresis -70\nKPX Oacute comma -40\nKPX Oacute period -40\nKPX Ocircumflex A -20\nKPX Ocircumflex Aacute -20\nKPX Ocircumflex Abreve -20\nKPX Ocircumflex Acircumflex -20\nKPX Ocircumflex Adieresis -20\nKPX Ocircumflex Agrave -20\nKPX Ocircumflex Amacron -20\nKPX Ocircumflex Aogonek -20\nKPX Ocircumflex Aring -20\nKPX Ocircumflex Atilde -20\nKPX Ocircumflex T -40\nKPX Ocircumflex Tcaron -40\nKPX Ocircumflex Tcommaaccent -40\nKPX Ocircumflex V -50\nKPX Ocircumflex W -30\nKPX Ocircumflex X -60\nKPX Ocircumflex Y -70\nKPX Ocircumflex Yacute -70\nKPX Ocircumflex Ydieresis -70\nKPX Ocircumflex comma -40\nKPX Ocircumflex period -40\nKPX Odieresis A -20\nKPX Odieresis Aacute -20\nKPX Odieresis Abreve -20\nKPX Odieresis Acircumflex -20\nKPX Odieresis Adieresis -20\nKPX Odieresis Agrave -20\nKPX Odieresis Amacron -20\nKPX Odieresis Aogonek -20\nKPX Odieresis Aring -20\nKPX Odieresis Atilde -20\nKPX Odieresis T -40\nKPX Odieresis Tcaron -40\nKPX Odieresis Tcommaaccent -40\nKPX Odieresis V -50\nKPX Odieresis W -30\nKPX Odieresis X -60\nKPX Odieresis Y -70\nKPX Odieresis Yacute -70\nKPX Odieresis Ydieresis -70\nKPX Odieresis comma -40\nKPX Odieresis period -40\nKPX Ograve A -20\nKPX Ograve Aacute -20\nKPX Ograve Abreve -20\nKPX Ograve Acircumflex -20\nKPX Ograve Adieresis -20\nKPX Ograve Agrave -20\nKPX Ograve Amacron -20\nKPX Ograve Aogonek -20\nKPX Ograve Aring -20\nKPX Ograve Atilde -20\nKPX Ograve T -40\nKPX Ograve Tcaron -40\nKPX Ograve Tcommaaccent -40\nKPX Ograve V -50\nKPX Ograve W -30\nKPX Ograve X -60\nKPX Ograve Y -70\nKPX Ograve Yacute -70\nKPX Ograve Ydieresis -70\nKPX Ograve comma -40\nKPX Ograve period -40\nKPX Ohungarumlaut A -20\nKPX Ohungarumlaut Aacute -20\nKPX Ohungarumlaut Abreve -20\nKPX Ohungarumlaut Acircumflex -20\nKPX Ohungarumlaut Adieresis -20\nKPX Ohungarumlaut Agrave -20\nKPX Ohungarumlaut Amacron -20\nKPX Ohungarumlaut Aogonek -20\nKPX Ohungarumlaut Aring -20\nKPX Ohungarumlaut Atilde -20\nKPX Ohungarumlaut T -40\nKPX Ohungarumlaut Tcaron -40\nKPX Ohungarumlaut Tcommaaccent -40\nKPX Ohungarumlaut V -50\nKPX Ohungarumlaut W -30\nKPX Ohungarumlaut X -60\nKPX Ohungarumlaut Y -70\nKPX Ohungarumlaut Yacute -70\nKPX Ohungarumlaut Ydieresis -70\nKPX Ohungarumlaut comma -40\nKPX Ohungarumlaut period -40\nKPX Omacron A -20\nKPX Omacron Aacute -20\nKPX Omacron Abreve -20\nKPX Omacron Acircumflex -20\nKPX Omacron Adieresis -20\nKPX Omacron Agrave -20\nKPX Omacron Amacron -20\nKPX Omacron Aogonek -20\nKPX Omacron Aring -20\nKPX Omacron Atilde -20\nKPX Omacron T -40\nKPX Omacron Tcaron -40\nKPX Omacron Tcommaaccent -40\nKPX Omacron V -50\nKPX Omacron W -30\nKPX Omacron X -60\nKPX Omacron Y -70\nKPX Omacron Yacute -70\nKPX Omacron Ydieresis -70\nKPX Omacron comma -40\nKPX Omacron period -40\nKPX Oslash A -20\nKPX Oslash Aacute -20\nKPX Oslash Abreve -20\nKPX Oslash Acircumflex -20\nKPX Oslash Adieresis -20\nKPX Oslash Agrave -20\nKPX Oslash Amacron -20\nKPX Oslash Aogonek -20\nKPX Oslash Aring -20\nKPX Oslash Atilde -20\nKPX Oslash T -40\nKPX Oslash Tcaron -40\nKPX Oslash Tcommaaccent -40\nKPX Oslash V -50\nKPX Oslash W -30\nKPX Oslash X -60\nKPX Oslash Y -70\nKPX Oslash Yacute -70\nKPX Oslash Ydieresis -70\nKPX Oslash comma -40\nKPX Oslash period -40\nKPX Otilde A -20\nKPX Otilde Aacute -20\nKPX Otilde Abreve -20\nKPX Otilde Acircumflex -20\nKPX Otilde Adieresis -20\nKPX Otilde Agrave -20\nKPX Otilde Amacron -20\nKPX Otilde Aogonek -20\nKPX Otilde Aring -20\nKPX Otilde Atilde -20\nKPX Otilde T -40\nKPX Otilde Tcaron -40\nKPX Otilde Tcommaaccent -40\nKPX Otilde V -50\nKPX Otilde W -30\nKPX Otilde X -60\nKPX Otilde Y -70\nKPX Otilde Yacute -70\nKPX Otilde Ydieresis -70\nKPX Otilde comma -40\nKPX Otilde period -40\nKPX P A -120\nKPX P Aacute -120\nKPX P Abreve -120\nKPX P Acircumflex -120\nKPX P Adieresis -120\nKPX P Agrave -120\nKPX P Amacron -120\nKPX P Aogonek -120\nKPX P Aring -120\nKPX P Atilde -120\nKPX P a -40\nKPX P aacute -40\nKPX P abreve -40\nKPX P acircumflex -40\nKPX P adieresis -40\nKPX P agrave -40\nKPX P amacron -40\nKPX P aogonek -40\nKPX P aring -40\nKPX P atilde -40\nKPX P comma -180\nKPX P e -50\nKPX P eacute -50\nKPX P ecaron -50\nKPX P ecircumflex -50\nKPX P edieresis -50\nKPX P edotaccent -50\nKPX P egrave -50\nKPX P emacron -50\nKPX P eogonek -50\nKPX P o -50\nKPX P oacute -50\nKPX P ocircumflex -50\nKPX P odieresis -50\nKPX P ograve -50\nKPX P ohungarumlaut -50\nKPX P omacron -50\nKPX P oslash -50\nKPX P otilde -50\nKPX P period -180\nKPX Q U -10\nKPX Q Uacute -10\nKPX Q Ucircumflex -10\nKPX Q Udieresis -10\nKPX Q Ugrave -10\nKPX Q Uhungarumlaut -10\nKPX Q Umacron -10\nKPX Q Uogonek -10\nKPX Q Uring -10\nKPX R O -20\nKPX R Oacute -20\nKPX R Ocircumflex -20\nKPX R Odieresis -20\nKPX R Ograve -20\nKPX R Ohungarumlaut -20\nKPX R Omacron -20\nKPX R Oslash -20\nKPX R Otilde -20\nKPX R T -30\nKPX R Tcaron -30\nKPX R Tcommaaccent -30\nKPX R U -40\nKPX R Uacute -40\nKPX R Ucircumflex -40\nKPX R Udieresis -40\nKPX R Ugrave -40\nKPX R Uhungarumlaut -40\nKPX R Umacron -40\nKPX R Uogonek -40\nKPX R Uring -40\nKPX R V -50\nKPX R W -30\nKPX R Y -50\nKPX R Yacute -50\nKPX R Ydieresis -50\nKPX Racute O -20\nKPX Racute Oacute -20\nKPX Racute Ocircumflex -20\nKPX Racute Odieresis -20\nKPX Racute Ograve -20\nKPX Racute Ohungarumlaut -20\nKPX Racute Omacron -20\nKPX Racute Oslash -20\nKPX Racute Otilde -20\nKPX Racute T -30\nKPX Racute Tcaron -30\nKPX Racute Tcommaaccent -30\nKPX Racute U -40\nKPX Racute Uacute -40\nKPX Racute Ucircumflex -40\nKPX Racute Udieresis -40\nKPX Racute Ugrave -40\nKPX Racute Uhungarumlaut -40\nKPX Racute Umacron -40\nKPX Racute Uogonek -40\nKPX Racute Uring -40\nKPX Racute V -50\nKPX Racute W -30\nKPX Racute Y -50\nKPX Racute Yacute -50\nKPX Racute Ydieresis -50\nKPX Rcaron O -20\nKPX Rcaron Oacute -20\nKPX Rcaron Ocircumflex -20\nKPX Rcaron Odieresis -20\nKPX Rcaron Ograve -20\nKPX Rcaron Ohungarumlaut -20\nKPX Rcaron Omacron -20\nKPX Rcaron Oslash -20\nKPX Rcaron Otilde -20\nKPX Rcaron T -30\nKPX Rcaron Tcaron -30\nKPX Rcaron Tcommaaccent -30\nKPX Rcaron U -40\nKPX Rcaron Uacute -40\nKPX Rcaron Ucircumflex -40\nKPX Rcaron Udieresis -40\nKPX Rcaron Ugrave -40\nKPX Rcaron Uhungarumlaut -40\nKPX Rcaron Umacron -40\nKPX Rcaron Uogonek -40\nKPX Rcaron Uring -40\nKPX Rcaron V -50\nKPX Rcaron W -30\nKPX Rcaron Y -50\nKPX Rcaron Yacute -50\nKPX Rcaron Ydieresis -50\nKPX Rcommaaccent O -20\nKPX Rcommaaccent Oacute -20\nKPX Rcommaaccent Ocircumflex -20\nKPX Rcommaaccent Odieresis -20\nKPX Rcommaaccent Ograve -20\nKPX Rcommaaccent Ohungarumlaut -20\nKPX Rcommaaccent Omacron -20\nKPX Rcommaaccent Oslash -20\nKPX Rcommaaccent Otilde -20\nKPX Rcommaaccent T -30\nKPX Rcommaaccent Tcaron -30\nKPX Rcommaaccent Tcommaaccent -30\nKPX Rcommaaccent U -40\nKPX Rcommaaccent Uacute -40\nKPX Rcommaaccent Ucircumflex -40\nKPX Rcommaaccent Udieresis -40\nKPX Rcommaaccent Ugrave -40\nKPX Rcommaaccent Uhungarumlaut -40\nKPX Rcommaaccent Umacron -40\nKPX Rcommaaccent Uogonek -40\nKPX Rcommaaccent Uring -40\nKPX Rcommaaccent V -50\nKPX Rcommaaccent W -30\nKPX Rcommaaccent Y -50\nKPX Rcommaaccent Yacute -50\nKPX Rcommaaccent Ydieresis -50\nKPX S comma -20\nKPX S period -20\nKPX Sacute comma -20\nKPX Sacute period -20\nKPX Scaron comma -20\nKPX Scaron period -20\nKPX Scedilla comma -20\nKPX Scedilla period -20\nKPX Scommaaccent comma -20\nKPX Scommaaccent period -20\nKPX T A -120\nKPX T Aacute -120\nKPX T Abreve -120\nKPX T Acircumflex -120\nKPX T Adieresis -120\nKPX T Agrave -120\nKPX T Amacron -120\nKPX T Aogonek -120\nKPX T Aring -120\nKPX T Atilde -120\nKPX T O -40\nKPX T Oacute -40\nKPX T Ocircumflex -40\nKPX T Odieresis -40\nKPX T Ograve -40\nKPX T Ohungarumlaut -40\nKPX T Omacron -40\nKPX T Oslash -40\nKPX T Otilde -40\nKPX T a -120\nKPX T aacute -120\nKPX T abreve -60\nKPX T acircumflex -120\nKPX T adieresis -120\nKPX T agrave -120\nKPX T amacron -60\nKPX T aogonek -120\nKPX T aring -120\nKPX T atilde -60\nKPX T colon -20\nKPX T comma -120\nKPX T e -120\nKPX T eacute -120\nKPX T ecaron -120\nKPX T ecircumflex -120\nKPX T edieresis -120\nKPX T edotaccent -120\nKPX T egrave -60\nKPX T emacron -60\nKPX T eogonek -120\nKPX T hyphen -140\nKPX T o -120\nKPX T oacute -120\nKPX T ocircumflex -120\nKPX T odieresis -120\nKPX T ograve -120\nKPX T ohungarumlaut -120\nKPX T omacron -60\nKPX T oslash -120\nKPX T otilde -60\nKPX T period -120\nKPX T r -120\nKPX T racute -120\nKPX T rcaron -120\nKPX T rcommaaccent -120\nKPX T semicolon -20\nKPX T u -120\nKPX T uacute -120\nKPX T ucircumflex -120\nKPX T udieresis -120\nKPX T ugrave -120\nKPX T uhungarumlaut -120\nKPX T umacron -60\nKPX T uogonek -120\nKPX T uring -120\nKPX T w -120\nKPX T y -120\nKPX T yacute -120\nKPX T ydieresis -60\nKPX Tcaron A -120\nKPX Tcaron Aacute -120\nKPX Tcaron Abreve -120\nKPX Tcaron Acircumflex -120\nKPX Tcaron Adieresis -120\nKPX Tcaron Agrave -120\nKPX Tcaron Amacron -120\nKPX Tcaron Aogonek -120\nKPX Tcaron Aring -120\nKPX Tcaron Atilde -120\nKPX Tcaron O -40\nKPX Tcaron Oacute -40\nKPX Tcaron Ocircumflex -40\nKPX Tcaron Odieresis -40\nKPX Tcaron Ograve -40\nKPX Tcaron Ohungarumlaut -40\nKPX Tcaron Omacron -40\nKPX Tcaron Oslash -40\nKPX Tcaron Otilde -40\nKPX Tcaron a -120\nKPX Tcaron aacute -120\nKPX Tcaron abreve -60\nKPX Tcaron acircumflex -120\nKPX Tcaron adieresis -120\nKPX Tcaron agrave -120\nKPX Tcaron amacron -60\nKPX Tcaron aogonek -120\nKPX Tcaron aring -120\nKPX Tcaron atilde -60\nKPX Tcaron colon -20\nKPX Tcaron comma -120\nKPX Tcaron e -120\nKPX Tcaron eacute -120\nKPX Tcaron ecaron -120\nKPX Tcaron ecircumflex -120\nKPX Tcaron edieresis -120\nKPX Tcaron edotaccent -120\nKPX Tcaron egrave -60\nKPX Tcaron emacron -60\nKPX Tcaron eogonek -120\nKPX Tcaron hyphen -140\nKPX Tcaron o -120\nKPX Tcaron oacute -120\nKPX Tcaron ocircumflex -120\nKPX Tcaron odieresis -120\nKPX Tcaron ograve -120\nKPX Tcaron ohungarumlaut -120\nKPX Tcaron omacron -60\nKPX Tcaron oslash -120\nKPX Tcaron otilde -60\nKPX Tcaron period -120\nKPX Tcaron r -120\nKPX Tcaron racute -120\nKPX Tcaron rcaron -120\nKPX Tcaron rcommaaccent -120\nKPX Tcaron semicolon -20\nKPX Tcaron u -120\nKPX Tcaron uacute -120\nKPX Tcaron ucircumflex -120\nKPX Tcaron udieresis -120\nKPX Tcaron ugrave -120\nKPX Tcaron uhungarumlaut -120\nKPX Tcaron umacron -60\nKPX Tcaron uogonek -120\nKPX Tcaron uring -120\nKPX Tcaron w -120\nKPX Tcaron y -120\nKPX Tcaron yacute -120\nKPX Tcaron ydieresis -60\nKPX Tcommaaccent A -120\nKPX Tcommaaccent Aacute -120\nKPX Tcommaaccent Abreve -120\nKPX Tcommaaccent Acircumflex -120\nKPX Tcommaaccent Adieresis -120\nKPX Tcommaaccent Agrave -120\nKPX Tcommaaccent Amacron -120\nKPX Tcommaaccent Aogonek -120\nKPX Tcommaaccent Aring -120\nKPX Tcommaaccent Atilde -120\nKPX Tcommaaccent O -40\nKPX Tcommaaccent Oacute -40\nKPX Tcommaaccent Ocircumflex -40\nKPX Tcommaaccent Odieresis -40\nKPX Tcommaaccent Ograve -40\nKPX Tcommaaccent Ohungarumlaut -40\nKPX Tcommaaccent Omacron -40\nKPX Tcommaaccent Oslash -40\nKPX Tcommaaccent Otilde -40\nKPX Tcommaaccent a -120\nKPX Tcommaaccent aacute -120\nKPX Tcommaaccent abreve -60\nKPX Tcommaaccent acircumflex -120\nKPX Tcommaaccent adieresis -120\nKPX Tcommaaccent agrave -120\nKPX Tcommaaccent amacron -60\nKPX Tcommaaccent aogonek -120\nKPX Tcommaaccent aring -120\nKPX Tcommaaccent atilde -60\nKPX Tcommaaccent colon -20\nKPX Tcommaaccent comma -120\nKPX Tcommaaccent e -120\nKPX Tcommaaccent eacute -120\nKPX Tcommaaccent ecaron -120\nKPX Tcommaaccent ecircumflex -120\nKPX Tcommaaccent edieresis -120\nKPX Tcommaaccent edotaccent -120\nKPX Tcommaaccent egrave -60\nKPX Tcommaaccent emacron -60\nKPX Tcommaaccent eogonek -120\nKPX Tcommaaccent hyphen -140\nKPX Tcommaaccent o -120\nKPX Tcommaaccent oacute -120\nKPX Tcommaaccent ocircumflex -120\nKPX Tcommaaccent odieresis -120\nKPX Tcommaaccent ograve -120\nKPX Tcommaaccent ohungarumlaut -120\nKPX Tcommaaccent omacron -60\nKPX Tcommaaccent oslash -120\nKPX Tcommaaccent otilde -60\nKPX Tcommaaccent period -120\nKPX Tcommaaccent r -120\nKPX Tcommaaccent racute -120\nKPX Tcommaaccent rcaron -120\nKPX Tcommaaccent rcommaaccent -120\nKPX Tcommaaccent semicolon -20\nKPX Tcommaaccent u -120\nKPX Tcommaaccent uacute -120\nKPX Tcommaaccent ucircumflex -120\nKPX Tcommaaccent udieresis -120\nKPX Tcommaaccent ugrave -120\nKPX Tcommaaccent uhungarumlaut -120\nKPX Tcommaaccent umacron -60\nKPX Tcommaaccent uogonek -120\nKPX Tcommaaccent uring -120\nKPX Tcommaaccent w -120\nKPX Tcommaaccent y -120\nKPX Tcommaaccent yacute -120\nKPX Tcommaaccent ydieresis -60\nKPX U A -40\nKPX U Aacute -40\nKPX U Abreve -40\nKPX U Acircumflex -40\nKPX U Adieresis -40\nKPX U Agrave -40\nKPX U Amacron -40\nKPX U Aogonek -40\nKPX U Aring -40\nKPX U Atilde -40\nKPX U comma -40\nKPX U period -40\nKPX Uacute A -40\nKPX Uacute Aacute -40\nKPX Uacute Abreve -40\nKPX Uacute Acircumflex -40\nKPX Uacute Adieresis -40\nKPX Uacute Agrave -40\nKPX Uacute Amacron -40\nKPX Uacute Aogonek -40\nKPX Uacute Aring -40\nKPX Uacute Atilde -40\nKPX Uacute comma -40\nKPX Uacute period -40\nKPX Ucircumflex A -40\nKPX Ucircumflex Aacute -40\nKPX Ucircumflex Abreve -40\nKPX Ucircumflex Acircumflex -40\nKPX Ucircumflex Adieresis -40\nKPX Ucircumflex Agrave -40\nKPX Ucircumflex Amacron -40\nKPX Ucircumflex Aogonek -40\nKPX Ucircumflex Aring -40\nKPX Ucircumflex Atilde -40\nKPX Ucircumflex comma -40\nKPX Ucircumflex period -40\nKPX Udieresis A -40\nKPX Udieresis Aacute -40\nKPX Udieresis Abreve -40\nKPX Udieresis Acircumflex -40\nKPX Udieresis Adieresis -40\nKPX Udieresis Agrave -40\nKPX Udieresis Amacron -40\nKPX Udieresis Aogonek -40\nKPX Udieresis Aring -40\nKPX Udieresis Atilde -40\nKPX Udieresis comma -40\nKPX Udieresis period -40\nKPX Ugrave A -40\nKPX Ugrave Aacute -40\nKPX Ugrave Abreve -40\nKPX Ugrave Acircumflex -40\nKPX Ugrave Adieresis -40\nKPX Ugrave Agrave -40\nKPX Ugrave Amacron -40\nKPX Ugrave Aogonek -40\nKPX Ugrave Aring -40\nKPX Ugrave Atilde -40\nKPX Ugrave comma -40\nKPX Ugrave period -40\nKPX Uhungarumlaut A -40\nKPX Uhungarumlaut Aacute -40\nKPX Uhungarumlaut Abreve -40\nKPX Uhungarumlaut Acircumflex -40\nKPX Uhungarumlaut Adieresis -40\nKPX Uhungarumlaut Agrave -40\nKPX Uhungarumlaut Amacron -40\nKPX Uhungarumlaut Aogonek -40\nKPX Uhungarumlaut Aring -40\nKPX Uhungarumlaut Atilde -40\nKPX Uhungarumlaut comma -40\nKPX Uhungarumlaut period -40\nKPX Umacron A -40\nKPX Umacron Aacute -40\nKPX Umacron Abreve -40\nKPX Umacron Acircumflex -40\nKPX Umacron Adieresis -40\nKPX Umacron Agrave -40\nKPX Umacron Amacron -40\nKPX Umacron Aogonek -40\nKPX Umacron Aring -40\nKPX Umacron Atilde -40\nKPX Umacron comma -40\nKPX Umacron period -40\nKPX Uogonek A -40\nKPX Uogonek Aacute -40\nKPX Uogonek Abreve -40\nKPX Uogonek Acircumflex -40\nKPX Uogonek Adieresis -40\nKPX Uogonek Agrave -40\nKPX Uogonek Amacron -40\nKPX Uogonek Aogonek -40\nKPX Uogonek Aring -40\nKPX Uogonek Atilde -40\nKPX Uogonek comma -40\nKPX Uogonek period -40\nKPX Uring A -40\nKPX Uring Aacute -40\nKPX Uring Abreve -40\nKPX Uring Acircumflex -40\nKPX Uring Adieresis -40\nKPX Uring Agrave -40\nKPX Uring Amacron -40\nKPX Uring Aogonek -40\nKPX Uring Aring -40\nKPX Uring Atilde -40\nKPX Uring comma -40\nKPX Uring period -40\nKPX V A -80\nKPX V Aacute -80\nKPX V Abreve -80\nKPX V Acircumflex -80\nKPX V Adieresis -80\nKPX V Agrave -80\nKPX V Amacron -80\nKPX V Aogonek -80\nKPX V Aring -80\nKPX V Atilde -80\nKPX V G -40\nKPX V Gbreve -40\nKPX V Gcommaaccent -40\nKPX V O -40\nKPX V Oacute -40\nKPX V Ocircumflex -40\nKPX V Odieresis -40\nKPX V Ograve -40\nKPX V Ohungarumlaut -40\nKPX V Omacron -40\nKPX V Oslash -40\nKPX V Otilde -40\nKPX V a -70\nKPX V aacute -70\nKPX V abreve -70\nKPX V acircumflex -70\nKPX V adieresis -70\nKPX V agrave -70\nKPX V amacron -70\nKPX V aogonek -70\nKPX V aring -70\nKPX V atilde -70\nKPX V colon -40\nKPX V comma -125\nKPX V e -80\nKPX V eacute -80\nKPX V ecaron -80\nKPX V ecircumflex -80\nKPX V edieresis -80\nKPX V edotaccent -80\nKPX V egrave -80\nKPX V emacron -80\nKPX V eogonek -80\nKPX V hyphen -80\nKPX V o -80\nKPX V oacute -80\nKPX V ocircumflex -80\nKPX V odieresis -80\nKPX V ograve -80\nKPX V ohungarumlaut -80\nKPX V omacron -80\nKPX V oslash -80\nKPX V otilde -80\nKPX V period -125\nKPX V semicolon -40\nKPX V u -70\nKPX V uacute -70\nKPX V ucircumflex -70\nKPX V udieresis -70\nKPX V ugrave -70\nKPX V uhungarumlaut -70\nKPX V umacron -70\nKPX V uogonek -70\nKPX V uring -70\nKPX W A -50\nKPX W Aacute -50\nKPX W Abreve -50\nKPX W Acircumflex -50\nKPX W Adieresis -50\nKPX W Agrave -50\nKPX W Amacron -50\nKPX W Aogonek -50\nKPX W Aring -50\nKPX W Atilde -50\nKPX W O -20\nKPX W Oacute -20\nKPX W Ocircumflex -20\nKPX W Odieresis -20\nKPX W Ograve -20\nKPX W Ohungarumlaut -20\nKPX W Omacron -20\nKPX W Oslash -20\nKPX W Otilde -20\nKPX W a -40\nKPX W aacute -40\nKPX W abreve -40\nKPX W acircumflex -40\nKPX W adieresis -40\nKPX W agrave -40\nKPX W amacron -40\nKPX W aogonek -40\nKPX W aring -40\nKPX W atilde -40\nKPX W comma -80\nKPX W e -30\nKPX W eacute -30\nKPX W ecaron -30\nKPX W ecircumflex -30\nKPX W edieresis -30\nKPX W edotaccent -30\nKPX W egrave -30\nKPX W emacron -30\nKPX W eogonek -30\nKPX W hyphen -40\nKPX W o -30\nKPX W oacute -30\nKPX W ocircumflex -30\nKPX W odieresis -30\nKPX W ograve -30\nKPX W ohungarumlaut -30\nKPX W omacron -30\nKPX W oslash -30\nKPX W otilde -30\nKPX W period -80\nKPX W u -30\nKPX W uacute -30\nKPX W ucircumflex -30\nKPX W udieresis -30\nKPX W ugrave -30\nKPX W uhungarumlaut -30\nKPX W umacron -30\nKPX W uogonek -30\nKPX W uring -30\nKPX W y -20\nKPX W yacute -20\nKPX W ydieresis -20\nKPX Y A -110\nKPX Y Aacute -110\nKPX Y Abreve -110\nKPX Y Acircumflex -110\nKPX Y Adieresis -110\nKPX Y Agrave -110\nKPX Y Amacron -110\nKPX Y Aogonek -110\nKPX Y Aring -110\nKPX Y Atilde -110\nKPX Y O -85\nKPX Y Oacute -85\nKPX Y Ocircumflex -85\nKPX Y Odieresis -85\nKPX Y Ograve -85\nKPX Y Ohungarumlaut -85\nKPX Y Omacron -85\nKPX Y Oslash -85\nKPX Y Otilde -85\nKPX Y a -140\nKPX Y aacute -140\nKPX Y abreve -70\nKPX Y acircumflex -140\nKPX Y adieresis -140\nKPX Y agrave -140\nKPX Y amacron -70\nKPX Y aogonek -140\nKPX Y aring -140\nKPX Y atilde -140\nKPX Y colon -60\nKPX Y comma -140\nKPX Y e -140\nKPX Y eacute -140\nKPX Y ecaron -140\nKPX Y ecircumflex -140\nKPX Y edieresis -140\nKPX Y edotaccent -140\nKPX Y egrave -140\nKPX Y emacron -70\nKPX Y eogonek -140\nKPX Y hyphen -140\nKPX Y i -20\nKPX Y iacute -20\nKPX Y iogonek -20\nKPX Y o -140\nKPX Y oacute -140\nKPX Y ocircumflex -140\nKPX Y odieresis -140\nKPX Y ograve -140\nKPX Y ohungarumlaut -140\nKPX Y omacron -140\nKPX Y oslash -140\nKPX Y otilde -140\nKPX Y period -140\nKPX Y semicolon -60\nKPX Y u -110\nKPX Y uacute -110\nKPX Y ucircumflex -110\nKPX Y udieresis -110\nKPX Y ugrave -110\nKPX Y uhungarumlaut -110\nKPX Y umacron -110\nKPX Y uogonek -110\nKPX Y uring -110\nKPX Yacute A -110\nKPX Yacute Aacute -110\nKPX Yacute Abreve -110\nKPX Yacute Acircumflex -110\nKPX Yacute Adieresis -110\nKPX Yacute Agrave -110\nKPX Yacute Amacron -110\nKPX Yacute Aogonek -110\nKPX Yacute Aring -110\nKPX Yacute Atilde -110\nKPX Yacute O -85\nKPX Yacute Oacute -85\nKPX Yacute Ocircumflex -85\nKPX Yacute Odieresis -85\nKPX Yacute Ograve -85\nKPX Yacute Ohungarumlaut -85\nKPX Yacute Omacron -85\nKPX Yacute Oslash -85\nKPX Yacute Otilde -85\nKPX Yacute a -140\nKPX Yacute aacute -140\nKPX Yacute abreve -70\nKPX Yacute acircumflex -140\nKPX Yacute adieresis -140\nKPX Yacute agrave -140\nKPX Yacute amacron -70\nKPX Yacute aogonek -140\nKPX Yacute aring -140\nKPX Yacute atilde -70\nKPX Yacute colon -60\nKPX Yacute comma -140\nKPX Yacute e -140\nKPX Yacute eacute -140\nKPX Yacute ecaron -140\nKPX Yacute ecircumflex -140\nKPX Yacute edieresis -140\nKPX Yacute edotaccent -140\nKPX Yacute egrave -140\nKPX Yacute emacron -70\nKPX Yacute eogonek -140\nKPX Yacute hyphen -140\nKPX Yacute i -20\nKPX Yacute iacute -20\nKPX Yacute iogonek -20\nKPX Yacute o -140\nKPX Yacute oacute -140\nKPX Yacute ocircumflex -140\nKPX Yacute odieresis -140\nKPX Yacute ograve -140\nKPX Yacute ohungarumlaut -140\nKPX Yacute omacron -70\nKPX Yacute oslash -140\nKPX Yacute otilde -140\nKPX Yacute period -140\nKPX Yacute semicolon -60\nKPX Yacute u -110\nKPX Yacute uacute -110\nKPX Yacute ucircumflex -110\nKPX Yacute udieresis -110\nKPX Yacute ugrave -110\nKPX Yacute uhungarumlaut -110\nKPX Yacute umacron -110\nKPX Yacute uogonek -110\nKPX Yacute uring -110\nKPX Ydieresis A -110\nKPX Ydieresis Aacute -110\nKPX Ydieresis Abreve -110\nKPX Ydieresis Acircumflex -110\nKPX Ydieresis Adieresis -110\nKPX Ydieresis Agrave -110\nKPX Ydieresis Amacron -110\nKPX Ydieresis Aogonek -110\nKPX Ydieresis Aring -110\nKPX Ydieresis Atilde -110\nKPX Ydieresis O -85\nKPX Ydieresis Oacute -85\nKPX Ydieresis Ocircumflex -85\nKPX Ydieresis Odieresis -85\nKPX Ydieresis Ograve -85\nKPX Ydieresis Ohungarumlaut -85\nKPX Ydieresis Omacron -85\nKPX Ydieresis Oslash -85\nKPX Ydieresis Otilde -85\nKPX Ydieresis a -140\nKPX Ydieresis aacute -140\nKPX Ydieresis abreve -70\nKPX Ydieresis acircumflex -140\nKPX Ydieresis adieresis -140\nKPX Ydieresis agrave -140\nKPX Ydieresis amacron -70\nKPX Ydieresis aogonek -140\nKPX Ydieresis aring -140\nKPX Ydieresis atilde -70\nKPX Ydieresis colon -60\nKPX Ydieresis comma -140\nKPX Ydieresis e -140\nKPX Ydieresis eacute -140\nKPX Ydieresis ecaron -140\nKPX Ydieresis ecircumflex -140\nKPX Ydieresis edieresis -140\nKPX Ydieresis edotaccent -140\nKPX Ydieresis egrave -140\nKPX Ydieresis emacron -70\nKPX Ydieresis eogonek -140\nKPX Ydieresis hyphen -140\nKPX Ydieresis i -20\nKPX Ydieresis iacute -20\nKPX Ydieresis iogonek -20\nKPX Ydieresis o -140\nKPX Ydieresis oacute -140\nKPX Ydieresis ocircumflex -140\nKPX Ydieresis odieresis -140\nKPX Ydieresis ograve -140\nKPX Ydieresis ohungarumlaut -140\nKPX Ydieresis omacron -140\nKPX Ydieresis oslash -140\nKPX Ydieresis otilde -140\nKPX Ydieresis period -140\nKPX Ydieresis semicolon -60\nKPX Ydieresis u -110\nKPX Ydieresis uacute -110\nKPX Ydieresis ucircumflex -110\nKPX Ydieresis udieresis -110\nKPX Ydieresis ugrave -110\nKPX Ydieresis uhungarumlaut -110\nKPX Ydieresis umacron -110\nKPX Ydieresis uogonek -110\nKPX Ydieresis uring -110\nKPX a v -20\nKPX a w -20\nKPX a y -30\nKPX a yacute -30\nKPX a ydieresis -30\nKPX aacute v -20\nKPX aacute w -20\nKPX aacute y -30\nKPX aacute yacute -30\nKPX aacute ydieresis -30\nKPX abreve v -20\nKPX abreve w -20\nKPX abreve y -30\nKPX abreve yacute -30\nKPX abreve ydieresis -30\nKPX acircumflex v -20\nKPX acircumflex w -20\nKPX acircumflex y -30\nKPX acircumflex yacute -30\nKPX acircumflex ydieresis -30\nKPX adieresis v -20\nKPX adieresis w -20\nKPX adieresis y -30\nKPX adieresis yacute -30\nKPX adieresis ydieresis -30\nKPX agrave v -20\nKPX agrave w -20\nKPX agrave y -30\nKPX agrave yacute -30\nKPX agrave ydieresis -30\nKPX amacron v -20\nKPX amacron w -20\nKPX amacron y -30\nKPX amacron yacute -30\nKPX amacron ydieresis -30\nKPX aogonek v -20\nKPX aogonek w -20\nKPX aogonek y -30\nKPX aogonek yacute -30\nKPX aogonek ydieresis -30\nKPX aring v -20\nKPX aring w -20\nKPX aring y -30\nKPX aring yacute -30\nKPX aring ydieresis -30\nKPX atilde v -20\nKPX atilde w -20\nKPX atilde y -30\nKPX atilde yacute -30\nKPX atilde ydieresis -30\nKPX b b -10\nKPX b comma -40\nKPX b l -20\nKPX b lacute -20\nKPX b lcommaaccent -20\nKPX b lslash -20\nKPX b period -40\nKPX b u -20\nKPX b uacute -20\nKPX b ucircumflex -20\nKPX b udieresis -20\nKPX b ugrave -20\nKPX b uhungarumlaut -20\nKPX b umacron -20\nKPX b uogonek -20\nKPX b uring -20\nKPX b v -20\nKPX b y -20\nKPX b yacute -20\nKPX b ydieresis -20\nKPX c comma -15\nKPX c k -20\nKPX c kcommaaccent -20\nKPX cacute comma -15\nKPX cacute k -20\nKPX cacute kcommaaccent -20\nKPX ccaron comma -15\nKPX ccaron k -20\nKPX ccaron kcommaaccent -20\nKPX ccedilla comma -15\nKPX ccedilla k -20\nKPX ccedilla kcommaaccent -20\nKPX colon space -50\nKPX comma quotedblright -100\nKPX comma quoteright -100\nKPX e comma -15\nKPX e period -15\nKPX e v -30\nKPX e w -20\nKPX e x -30\nKPX e y -20\nKPX e yacute -20\nKPX e ydieresis -20\nKPX eacute comma -15\nKPX eacute period -15\nKPX eacute v -30\nKPX eacute w -20\nKPX eacute x -30\nKPX eacute y -20\nKPX eacute yacute -20\nKPX eacute ydieresis -20\nKPX ecaron comma -15\nKPX ecaron period -15\nKPX ecaron v -30\nKPX ecaron w -20\nKPX ecaron x -30\nKPX ecaron y -20\nKPX ecaron yacute -20\nKPX ecaron ydieresis -20\nKPX ecircumflex comma -15\nKPX ecircumflex period -15\nKPX ecircumflex v -30\nKPX ecircumflex w -20\nKPX ecircumflex x -30\nKPX ecircumflex y -20\nKPX ecircumflex yacute -20\nKPX ecircumflex ydieresis -20\nKPX edieresis comma -15\nKPX edieresis period -15\nKPX edieresis v -30\nKPX edieresis w -20\nKPX edieresis x -30\nKPX edieresis y -20\nKPX edieresis yacute -20\nKPX edieresis ydieresis -20\nKPX edotaccent comma -15\nKPX edotaccent period -15\nKPX edotaccent v -30\nKPX edotaccent w -20\nKPX edotaccent x -30\nKPX edotaccent y -20\nKPX edotaccent yacute -20\nKPX edotaccent ydieresis -20\nKPX egrave comma -15\nKPX egrave period -15\nKPX egrave v -30\nKPX egrave w -20\nKPX egrave x -30\nKPX egrave y -20\nKPX egrave yacute -20\nKPX egrave ydieresis -20\nKPX emacron comma -15\nKPX emacron period -15\nKPX emacron v -30\nKPX emacron w -20\nKPX emacron x -30\nKPX emacron y -20\nKPX emacron yacute -20\nKPX emacron ydieresis -20\nKPX eogonek comma -15\nKPX eogonek period -15\nKPX eogonek v -30\nKPX eogonek w -20\nKPX eogonek x -30\nKPX eogonek y -20\nKPX eogonek yacute -20\nKPX eogonek ydieresis -20\nKPX f a -30\nKPX f aacute -30\nKPX f abreve -30\nKPX f acircumflex -30\nKPX f adieresis -30\nKPX f agrave -30\nKPX f amacron -30\nKPX f aogonek -30\nKPX f aring -30\nKPX f atilde -30\nKPX f comma -30\nKPX f dotlessi -28\nKPX f e -30\nKPX f eacute -30\nKPX f ecaron -30\nKPX f ecircumflex -30\nKPX f edieresis -30\nKPX f edotaccent -30\nKPX f egrave -30\nKPX f emacron -30\nKPX f eogonek -30\nKPX f o -30\nKPX f oacute -30\nKPX f ocircumflex -30\nKPX f odieresis -30\nKPX f ograve -30\nKPX f ohungarumlaut -30\nKPX f omacron -30\nKPX f oslash -30\nKPX f otilde -30\nKPX f period -30\nKPX f quotedblright 60\nKPX f quoteright 50\nKPX g r -10\nKPX g racute -10\nKPX g rcaron -10\nKPX g rcommaaccent -10\nKPX gbreve r -10\nKPX gbreve racute -10\nKPX gbreve rcaron -10\nKPX gbreve rcommaaccent -10\nKPX gcommaaccent r -10\nKPX gcommaaccent racute -10\nKPX gcommaaccent rcaron -10\nKPX gcommaaccent rcommaaccent -10\nKPX h y -30\nKPX h yacute -30\nKPX h ydieresis -30\nKPX k e -20\nKPX k eacute -20\nKPX k ecaron -20\nKPX k ecircumflex -20\nKPX k edieresis -20\nKPX k edotaccent -20\nKPX k egrave -20\nKPX k emacron -20\nKPX k eogonek -20\nKPX k o -20\nKPX k oacute -20\nKPX k ocircumflex -20\nKPX k odieresis -20\nKPX k ograve -20\nKPX k ohungarumlaut -20\nKPX k omacron -20\nKPX k oslash -20\nKPX k otilde -20\nKPX kcommaaccent e -20\nKPX kcommaaccent eacute -20\nKPX kcommaaccent ecaron -20\nKPX kcommaaccent ecircumflex -20\nKPX kcommaaccent edieresis -20\nKPX kcommaaccent edotaccent -20\nKPX kcommaaccent egrave -20\nKPX kcommaaccent emacron -20\nKPX kcommaaccent eogonek -20\nKPX kcommaaccent o -20\nKPX kcommaaccent oacute -20\nKPX kcommaaccent ocircumflex -20\nKPX kcommaaccent odieresis -20\nKPX kcommaaccent ograve -20\nKPX kcommaaccent ohungarumlaut -20\nKPX kcommaaccent omacron -20\nKPX kcommaaccent oslash -20\nKPX kcommaaccent otilde -20\nKPX m u -10\nKPX m uacute -10\nKPX m ucircumflex -10\nKPX m udieresis -10\nKPX m ugrave -10\nKPX m uhungarumlaut -10\nKPX m umacron -10\nKPX m uogonek -10\nKPX m uring -10\nKPX m y -15\nKPX m yacute -15\nKPX m ydieresis -15\nKPX n u -10\nKPX n uacute -10\nKPX n ucircumflex -10\nKPX n udieresis -10\nKPX n ugrave -10\nKPX n uhungarumlaut -10\nKPX n umacron -10\nKPX n uogonek -10\nKPX n uring -10\nKPX n v -20\nKPX n y -15\nKPX n yacute -15\nKPX n ydieresis -15\nKPX nacute u -10\nKPX nacute uacute -10\nKPX nacute ucircumflex -10\nKPX nacute udieresis -10\nKPX nacute ugrave -10\nKPX nacute uhungarumlaut -10\nKPX nacute umacron -10\nKPX nacute uogonek -10\nKPX nacute uring -10\nKPX nacute v -20\nKPX nacute y -15\nKPX nacute yacute -15\nKPX nacute ydieresis -15\nKPX ncaron u -10\nKPX ncaron uacute -10\nKPX ncaron ucircumflex -10\nKPX ncaron udieresis -10\nKPX ncaron ugrave -10\nKPX ncaron uhungarumlaut -10\nKPX ncaron umacron -10\nKPX ncaron uogonek -10\nKPX ncaron uring -10\nKPX ncaron v -20\nKPX ncaron y -15\nKPX ncaron yacute -15\nKPX ncaron ydieresis -15\nKPX ncommaaccent u -10\nKPX ncommaaccent uacute -10\nKPX ncommaaccent ucircumflex -10\nKPX ncommaaccent udieresis -10\nKPX ncommaaccent ugrave -10\nKPX ncommaaccent uhungarumlaut -10\nKPX ncommaaccent umacron -10\nKPX ncommaaccent uogonek -10\nKPX ncommaaccent uring -10\nKPX ncommaaccent v -20\nKPX ncommaaccent y -15\nKPX ncommaaccent yacute -15\nKPX ncommaaccent ydieresis -15\nKPX ntilde u -10\nKPX ntilde uacute -10\nKPX ntilde ucircumflex -10\nKPX ntilde udieresis -10\nKPX ntilde ugrave -10\nKPX ntilde uhungarumlaut -10\nKPX ntilde umacron -10\nKPX ntilde uogonek -10\nKPX ntilde uring -10\nKPX ntilde v -20\nKPX ntilde y -15\nKPX ntilde yacute -15\nKPX ntilde ydieresis -15\nKPX o comma -40\nKPX o period -40\nKPX o v -15\nKPX o w -15\nKPX o x -30\nKPX o y -30\nKPX o yacute -30\nKPX o ydieresis -30\nKPX oacute comma -40\nKPX oacute period -40\nKPX oacute v -15\nKPX oacute w -15\nKPX oacute x -30\nKPX oacute y -30\nKPX oacute yacute -30\nKPX oacute ydieresis -30\nKPX ocircumflex comma -40\nKPX ocircumflex period -40\nKPX ocircumflex v -15\nKPX ocircumflex w -15\nKPX ocircumflex x -30\nKPX ocircumflex y -30\nKPX ocircumflex yacute -30\nKPX ocircumflex ydieresis -30\nKPX odieresis comma -40\nKPX odieresis period -40\nKPX odieresis v -15\nKPX odieresis w -15\nKPX odieresis x -30\nKPX odieresis y -30\nKPX odieresis yacute -30\nKPX odieresis ydieresis -30\nKPX ograve comma -40\nKPX ograve period -40\nKPX ograve v -15\nKPX ograve w -15\nKPX ograve x -30\nKPX ograve y -30\nKPX ograve yacute -30\nKPX ograve ydieresis -30\nKPX ohungarumlaut comma -40\nKPX ohungarumlaut period -40\nKPX ohungarumlaut v -15\nKPX ohungarumlaut w -15\nKPX ohungarumlaut x -30\nKPX ohungarumlaut y -30\nKPX ohungarumlaut yacute -30\nKPX ohungarumlaut ydieresis -30\nKPX omacron comma -40\nKPX omacron period -40\nKPX omacron v -15\nKPX omacron w -15\nKPX omacron x -30\nKPX omacron y -30\nKPX omacron yacute -30\nKPX omacron ydieresis -30\nKPX oslash a -55\nKPX oslash aacute -55\nKPX oslash abreve -55\nKPX oslash acircumflex -55\nKPX oslash adieresis -55\nKPX oslash agrave -55\nKPX oslash amacron -55\nKPX oslash aogonek -55\nKPX oslash aring -55\nKPX oslash atilde -55\nKPX oslash b -55\nKPX oslash c -55\nKPX oslash cacute -55\nKPX oslash ccaron -55\nKPX oslash ccedilla -55\nKPX oslash comma -95\nKPX oslash d -55\nKPX oslash dcroat -55\nKPX oslash e -55\nKPX oslash eacute -55\nKPX oslash ecaron -55\nKPX oslash ecircumflex -55\nKPX oslash edieresis -55\nKPX oslash edotaccent -55\nKPX oslash egrave -55\nKPX oslash emacron -55\nKPX oslash eogonek -55\nKPX oslash f -55\nKPX oslash g -55\nKPX oslash gbreve -55\nKPX oslash gcommaaccent -55\nKPX oslash h -55\nKPX oslash i -55\nKPX oslash iacute -55\nKPX oslash icircumflex -55\nKPX oslash idieresis -55\nKPX oslash igrave -55\nKPX oslash imacron -55\nKPX oslash iogonek -55\nKPX oslash j -55\nKPX oslash k -55\nKPX oslash kcommaaccent -55\nKPX oslash l -55\nKPX oslash lacute -55\nKPX oslash lcommaaccent -55\nKPX oslash lslash -55\nKPX oslash m -55\nKPX oslash n -55\nKPX oslash nacute -55\nKPX oslash ncaron -55\nKPX oslash ncommaaccent -55\nKPX oslash ntilde -55\nKPX oslash o -55\nKPX oslash oacute -55\nKPX oslash ocircumflex -55\nKPX oslash odieresis -55\nKPX oslash ograve -55\nKPX oslash ohungarumlaut -55\nKPX oslash omacron -55\nKPX oslash oslash -55\nKPX oslash otilde -55\nKPX oslash p -55\nKPX oslash period -95\nKPX oslash q -55\nKPX oslash r -55\nKPX oslash racute -55\nKPX oslash rcaron -55\nKPX oslash rcommaaccent -55\nKPX oslash s -55\nKPX oslash sacute -55\nKPX oslash scaron -55\nKPX oslash scedilla -55\nKPX oslash scommaaccent -55\nKPX oslash t -55\nKPX oslash tcommaaccent -55\nKPX oslash u -55\nKPX oslash uacute -55\nKPX oslash ucircumflex -55\nKPX oslash udieresis -55\nKPX oslash ugrave -55\nKPX oslash uhungarumlaut -55\nKPX oslash umacron -55\nKPX oslash uogonek -55\nKPX oslash uring -55\nKPX oslash v -70\nKPX oslash w -70\nKPX oslash x -85\nKPX oslash y -70\nKPX oslash yacute -70\nKPX oslash ydieresis -70\nKPX oslash z -55\nKPX oslash zacute -55\nKPX oslash zcaron -55\nKPX oslash zdotaccent -55\nKPX otilde comma -40\nKPX otilde period -40\nKPX otilde v -15\nKPX otilde w -15\nKPX otilde x -30\nKPX otilde y -30\nKPX otilde yacute -30\nKPX otilde ydieresis -30\nKPX p comma -35\nKPX p period -35\nKPX p y -30\nKPX p yacute -30\nKPX p ydieresis -30\nKPX period quotedblright -100\nKPX period quoteright -100\nKPX period space -60\nKPX quotedblright space -40\nKPX quoteleft quoteleft -57\nKPX quoteright d -50\nKPX quoteright dcroat -50\nKPX quoteright quoteright -57\nKPX quoteright r -50\nKPX quoteright racute -50\nKPX quoteright rcaron -50\nKPX quoteright rcommaaccent -50\nKPX quoteright s -50\nKPX quoteright sacute -50\nKPX quoteright scaron -50\nKPX quoteright scedilla -50\nKPX quoteright scommaaccent -50\nKPX quoteright space -70\nKPX r a -10\nKPX r aacute -10\nKPX r abreve -10\nKPX r acircumflex -10\nKPX r adieresis -10\nKPX r agrave -10\nKPX r amacron -10\nKPX r aogonek -10\nKPX r aring -10\nKPX r atilde -10\nKPX r colon 30\nKPX r comma -50\nKPX r i 15\nKPX r iacute 15\nKPX r icircumflex 15\nKPX r idieresis 15\nKPX r igrave 15\nKPX r imacron 15\nKPX r iogonek 15\nKPX r k 15\nKPX r kcommaaccent 15\nKPX r l 15\nKPX r lacute 15\nKPX r lcommaaccent 15\nKPX r lslash 15\nKPX r m 25\nKPX r n 25\nKPX r nacute 25\nKPX r ncaron 25\nKPX r ncommaaccent 25\nKPX r ntilde 25\nKPX r p 30\nKPX r period -50\nKPX r semicolon 30\nKPX r t 40\nKPX r tcommaaccent 40\nKPX r u 15\nKPX r uacute 15\nKPX r ucircumflex 15\nKPX r udieresis 15\nKPX r ugrave 15\nKPX r uhungarumlaut 15\nKPX r umacron 15\nKPX r uogonek 15\nKPX r uring 15\nKPX r v 30\nKPX r y 30\nKPX r yacute 30\nKPX r ydieresis 30\nKPX racute a -10\nKPX racute aacute -10\nKPX racute abreve -10\nKPX racute acircumflex -10\nKPX racute adieresis -10\nKPX racute agrave -10\nKPX racute amacron -10\nKPX racute aogonek -10\nKPX racute aring -10\nKPX racute atilde -10\nKPX racute colon 30\nKPX racute comma -50\nKPX racute i 15\nKPX racute iacute 15\nKPX racute icircumflex 15\nKPX racute idieresis 15\nKPX racute igrave 15\nKPX racute imacron 15\nKPX racute iogonek 15\nKPX racute k 15\nKPX racute kcommaaccent 15\nKPX racute l 15\nKPX racute lacute 15\nKPX racute lcommaaccent 15\nKPX racute lslash 15\nKPX racute m 25\nKPX racute n 25\nKPX racute nacute 25\nKPX racute ncaron 25\nKPX racute ncommaaccent 25\nKPX racute ntilde 25\nKPX racute p 30\nKPX racute period -50\nKPX racute semicolon 30\nKPX racute t 40\nKPX racute tcommaaccent 40\nKPX racute u 15\nKPX racute uacute 15\nKPX racute ucircumflex 15\nKPX racute udieresis 15\nKPX racute ugrave 15\nKPX racute uhungarumlaut 15\nKPX racute umacron 15\nKPX racute uogonek 15\nKPX racute uring 15\nKPX racute v 30\nKPX racute y 30\nKPX racute yacute 30\nKPX racute ydieresis 30\nKPX rcaron a -10\nKPX rcaron aacute -10\nKPX rcaron abreve -10\nKPX rcaron acircumflex -10\nKPX rcaron adieresis -10\nKPX rcaron agrave -10\nKPX rcaron amacron -10\nKPX rcaron aogonek -10\nKPX rcaron aring -10\nKPX rcaron atilde -10\nKPX rcaron colon 30\nKPX rcaron comma -50\nKPX rcaron i 15\nKPX rcaron iacute 15\nKPX rcaron icircumflex 15\nKPX rcaron idieresis 15\nKPX rcaron igrave 15\nKPX rcaron imacron 15\nKPX rcaron iogonek 15\nKPX rcaron k 15\nKPX rcaron kcommaaccent 15\nKPX rcaron l 15\nKPX rcaron lacute 15\nKPX rcaron lcommaaccent 15\nKPX rcaron lslash 15\nKPX rcaron m 25\nKPX rcaron n 25\nKPX rcaron nacute 25\nKPX rcaron ncaron 25\nKPX rcaron ncommaaccent 25\nKPX rcaron ntilde 25\nKPX rcaron p 30\nKPX rcaron period -50\nKPX rcaron semicolon 30\nKPX rcaron t 40\nKPX rcaron tcommaaccent 40\nKPX rcaron u 15\nKPX rcaron uacute 15\nKPX rcaron ucircumflex 15\nKPX rcaron udieresis 15\nKPX rcaron ugrave 15\nKPX rcaron uhungarumlaut 15\nKPX rcaron umacron 15\nKPX rcaron uogonek 15\nKPX rcaron uring 15\nKPX rcaron v 30\nKPX rcaron y 30\nKPX rcaron yacute 30\nKPX rcaron ydieresis 30\nKPX rcommaaccent a -10\nKPX rcommaaccent aacute -10\nKPX rcommaaccent abreve -10\nKPX rcommaaccent acircumflex -10\nKPX rcommaaccent adieresis -10\nKPX rcommaaccent agrave -10\nKPX rcommaaccent amacron -10\nKPX rcommaaccent aogonek -10\nKPX rcommaaccent aring -10\nKPX rcommaaccent atilde -10\nKPX rcommaaccent colon 30\nKPX rcommaaccent comma -50\nKPX rcommaaccent i 15\nKPX rcommaaccent iacute 15\nKPX rcommaaccent icircumflex 15\nKPX rcommaaccent idieresis 15\nKPX rcommaaccent igrave 15\nKPX rcommaaccent imacron 15\nKPX rcommaaccent iogonek 15\nKPX rcommaaccent k 15\nKPX rcommaaccent kcommaaccent 15\nKPX rcommaaccent l 15\nKPX rcommaaccent lacute 15\nKPX rcommaaccent lcommaaccent 15\nKPX rcommaaccent lslash 15\nKPX rcommaaccent m 25\nKPX rcommaaccent n 25\nKPX rcommaaccent nacute 25\nKPX rcommaaccent ncaron 25\nKPX rcommaaccent ncommaaccent 25\nKPX rcommaaccent ntilde 25\nKPX rcommaaccent p 30\nKPX rcommaaccent period -50\nKPX rcommaaccent semicolon 30\nKPX rcommaaccent t 40\nKPX rcommaaccent tcommaaccent 40\nKPX rcommaaccent u 15\nKPX rcommaaccent uacute 15\nKPX rcommaaccent ucircumflex 15\nKPX rcommaaccent udieresis 15\nKPX rcommaaccent ugrave 15\nKPX rcommaaccent uhungarumlaut 15\nKPX rcommaaccent umacron 15\nKPX rcommaaccent uogonek 15\nKPX rcommaaccent uring 15\nKPX rcommaaccent v 30\nKPX rcommaaccent y 30\nKPX rcommaaccent yacute 30\nKPX rcommaaccent ydieresis 30\nKPX s comma -15\nKPX s period -15\nKPX s w -30\nKPX sacute comma -15\nKPX sacute period -15\nKPX sacute w -30\nKPX scaron comma -15\nKPX scaron period -15\nKPX scaron w -30\nKPX scedilla comma -15\nKPX scedilla period -15\nKPX scedilla w -30\nKPX scommaaccent comma -15\nKPX scommaaccent period -15\nKPX scommaaccent w -30\nKPX semicolon space -50\nKPX space T -50\nKPX space Tcaron -50\nKPX space Tcommaaccent -50\nKPX space V -50\nKPX space W -40\nKPX space Y -90\nKPX space Yacute -90\nKPX space Ydieresis -90\nKPX space quotedblleft -30\nKPX space quoteleft -60\nKPX v a -25\nKPX v aacute -25\nKPX v abreve -25\nKPX v acircumflex -25\nKPX v adieresis -25\nKPX v agrave -25\nKPX v amacron -25\nKPX v aogonek -25\nKPX v aring -25\nKPX v atilde -25\nKPX v comma -80\nKPX v e -25\nKPX v eacute -25\nKPX v ecaron -25\nKPX v ecircumflex -25\nKPX v edieresis -25\nKPX v edotaccent -25\nKPX v egrave -25\nKPX v emacron -25\nKPX v eogonek -25\nKPX v o -25\nKPX v oacute -25\nKPX v ocircumflex -25\nKPX v odieresis -25\nKPX v ograve -25\nKPX v ohungarumlaut -25\nKPX v omacron -25\nKPX v oslash -25\nKPX v otilde -25\nKPX v period -80\nKPX w a -15\nKPX w aacute -15\nKPX w abreve -15\nKPX w acircumflex -15\nKPX w adieresis -15\nKPX w agrave -15\nKPX w amacron -15\nKPX w aogonek -15\nKPX w aring -15\nKPX w atilde -15\nKPX w comma -60\nKPX w e -10\nKPX w eacute -10\nKPX w ecaron -10\nKPX w ecircumflex -10\nKPX w edieresis -10\nKPX w edotaccent -10\nKPX w egrave -10\nKPX w emacron -10\nKPX w eogonek -10\nKPX w o -10\nKPX w oacute -10\nKPX w ocircumflex -10\nKPX w odieresis -10\nKPX w ograve -10\nKPX w ohungarumlaut -10\nKPX w omacron -10\nKPX w oslash -10\nKPX w otilde -10\nKPX w period -60\nKPX x e -30\nKPX x eacute -30\nKPX x ecaron -30\nKPX x ecircumflex -30\nKPX x edieresis -30\nKPX x edotaccent -30\nKPX x egrave -30\nKPX x emacron -30\nKPX x eogonek -30\nKPX y a -20\nKPX y aacute -20\nKPX y abreve -20\nKPX y acircumflex -20\nKPX y adieresis -20\nKPX y agrave -20\nKPX y amacron -20\nKPX y aogonek -20\nKPX y aring -20\nKPX y atilde -20\nKPX y comma -100\nKPX y e -20\nKPX y eacute -20\nKPX y ecaron -20\nKPX y ecircumflex -20\nKPX y edieresis -20\nKPX y edotaccent -20\nKPX y egrave -20\nKPX y emacron -20\nKPX y eogonek -20\nKPX y o -20\nKPX y oacute -20\nKPX y ocircumflex -20\nKPX y odieresis -20\nKPX y ograve -20\nKPX y ohungarumlaut -20\nKPX y omacron -20\nKPX y oslash -20\nKPX y otilde -20\nKPX y period -100\nKPX yacute a -20\nKPX yacute aacute -20\nKPX yacute abreve -20\nKPX yacute acircumflex -20\nKPX yacute adieresis -20\nKPX yacute agrave -20\nKPX yacute amacron -20\nKPX yacute aogonek -20\nKPX yacute aring -20\nKPX yacute atilde -20\nKPX yacute comma -100\nKPX yacute e -20\nKPX yacute eacute -20\nKPX yacute ecaron -20\nKPX yacute ecircumflex -20\nKPX yacute edieresis -20\nKPX yacute edotaccent -20\nKPX yacute egrave -20\nKPX yacute emacron -20\nKPX yacute eogonek -20\nKPX yacute o -20\nKPX yacute oacute -20\nKPX yacute ocircumflex -20\nKPX yacute odieresis -20\nKPX yacute ograve -20\nKPX yacute ohungarumlaut -20\nKPX yacute omacron -20\nKPX yacute oslash -20\nKPX yacute otilde -20\nKPX yacute period -100\nKPX ydieresis a -20\nKPX ydieresis aacute -20\nKPX ydieresis abreve -20\nKPX ydieresis acircumflex -20\nKPX ydieresis adieresis -20\nKPX ydieresis agrave -20\nKPX ydieresis amacron -20\nKPX ydieresis aogonek -20\nKPX ydieresis aring -20\nKPX ydieresis atilde -20\nKPX ydieresis comma -100\nKPX ydieresis e -20\nKPX ydieresis eacute -20\nKPX ydieresis ecaron -20\nKPX ydieresis ecircumflex -20\nKPX ydieresis edieresis -20\nKPX ydieresis edotaccent -20\nKPX ydieresis egrave -20\nKPX ydieresis emacron -20\nKPX ydieresis eogonek -20\nKPX ydieresis o -20\nKPX ydieresis oacute -20\nKPX ydieresis ocircumflex -20\nKPX ydieresis odieresis -20\nKPX ydieresis ograve -20\nKPX ydieresis ohungarumlaut -20\nKPX ydieresis omacron -20\nKPX ydieresis oslash -20\nKPX ydieresis otilde -20\nKPX ydieresis period -100\nKPX z e -15\nKPX z eacute -15\nKPX z ecaron -15\nKPX z ecircumflex -15\nKPX z edieresis -15\nKPX z edotaccent -15\nKPX z egrave -15\nKPX z emacron -15\nKPX z eogonek -15\nKPX z o -15\nKPX z oacute -15\nKPX z ocircumflex -15\nKPX z odieresis -15\nKPX z ograve -15\nKPX z ohungarumlaut -15\nKPX z omacron -15\nKPX z oslash -15\nKPX z otilde -15\nKPX zacute e -15\nKPX zacute eacute -15\nKPX zacute ecaron -15\nKPX zacute ecircumflex -15\nKPX zacute edieresis -15\nKPX zacute edotaccent -15\nKPX zacute egrave -15\nKPX zacute emacron -15\nKPX zacute eogonek -15\nKPX zacute o -15\nKPX zacute oacute -15\nKPX zacute ocircumflex -15\nKPX zacute odieresis -15\nKPX zacute ograve -15\nKPX zacute ohungarumlaut -15\nKPX zacute omacron -15\nKPX zacute oslash -15\nKPX zacute otilde -15\nKPX zcaron e -15\nKPX zcaron eacute -15\nKPX zcaron ecaron -15\nKPX zcaron ecircumflex -15\nKPX zcaron edieresis -15\nKPX zcaron edotaccent -15\nKPX zcaron egrave -15\nKPX zcaron emacron -15\nKPX zcaron eogonek -15\nKPX zcaron o -15\nKPX zcaron oacute -15\nKPX zcaron ocircumflex -15\nKPX zcaron odieresis -15\nKPX zcaron ograve -15\nKPX zcaron ohungarumlaut -15\nKPX zcaron omacron -15\nKPX zcaron oslash -15\nKPX zcaron otilde -15\nKPX zdotaccent e -15\nKPX zdotaccent eacute -15\nKPX zdotaccent ecaron -15\nKPX zdotaccent ecircumflex -15\nKPX zdotaccent edieresis -15\nKPX zdotaccent edotaccent -15\nKPX zdotaccent egrave -15\nKPX zdotaccent emacron -15\nKPX zdotaccent eogonek -15\nKPX zdotaccent o -15\nKPX zdotaccent oacute -15\nKPX zdotaccent ocircumflex -15\nKPX zdotaccent odieresis -15\nKPX zdotaccent ograve -15\nKPX zdotaccent ohungarumlaut -15\nKPX zdotaccent omacron -15\nKPX zdotaccent oslash -15\nKPX zdotaccent otilde -15\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/pdfcorefonts/Helvetica.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 12:38:23 1997\nComment UniqueID 43054\nComment VMusage 37069 48094\nFontName Helvetica\nFullName Helvetica\nFamilyName Helvetica\nWeight Medium\nItalicAngle 0\nIsFixedPitch false\nCharacterSet ExtendedRoman\nFontBBox -166 -225 1000 931 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated.  All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 718\nXHeight 523\nAscender 718\nDescender -207\nStdHW 76\nStdVW 88\nStartCharMetrics 315\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 278 ; N exclam ; B 90 0 187 718 ;\nC 34 ; WX 355 ; N quotedbl ; B 70 463 285 718 ;\nC 35 ; WX 556 ; N numbersign ; B 28 0 529 688 ;\nC 36 ; WX 556 ; N dollar ; B 32 -115 520 775 ;\nC 37 ; WX 889 ; N percent ; B 39 -19 850 703 ;\nC 38 ; WX 667 ; N ampersand ; B 44 -15 645 718 ;\nC 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ;\nC 40 ; WX 333 ; N parenleft ; B 68 -207 299 733 ;\nC 41 ; WX 333 ; N parenright ; B 34 -207 265 733 ;\nC 42 ; WX 389 ; N asterisk ; B 39 431 349 718 ;\nC 43 ; WX 584 ; N plus ; B 39 0 545 505 ;\nC 44 ; WX 278 ; N comma ; B 87 -147 191 106 ;\nC 45 ; WX 333 ; N hyphen ; B 44 232 289 322 ;\nC 46 ; WX 278 ; N period ; B 87 0 191 106 ;\nC 47 ; WX 278 ; N slash ; B -17 -19 295 737 ;\nC 48 ; WX 556 ; N zero ; B 37 -19 519 703 ;\nC 49 ; WX 556 ; N one ; B 101 0 359 703 ;\nC 50 ; WX 556 ; N two ; B 26 0 507 703 ;\nC 51 ; WX 556 ; N three ; B 34 -19 522 703 ;\nC 52 ; WX 556 ; N four ; B 25 0 523 703 ;\nC 53 ; WX 556 ; N five ; B 32 -19 514 688 ;\nC 54 ; WX 556 ; N six ; B 38 -19 518 703 ;\nC 55 ; WX 556 ; N seven ; B 37 0 523 688 ;\nC 56 ; WX 556 ; N eight ; B 38 -19 517 703 ;\nC 57 ; WX 556 ; N nine ; B 42 -19 514 703 ;\nC 58 ; WX 278 ; N colon ; B 87 0 191 516 ;\nC 59 ; WX 278 ; N semicolon ; B 87 -147 191 516 ;\nC 60 ; WX 584 ; N less ; B 48 11 536 495 ;\nC 61 ; WX 584 ; N equal ; B 39 115 545 390 ;\nC 62 ; WX 584 ; N greater ; B 48 11 536 495 ;\nC 63 ; WX 556 ; N question ; B 56 0 492 727 ;\nC 64 ; WX 1015 ; N at ; B 147 -19 868 737 ;\nC 65 ; WX 667 ; N A ; B 14 0 654 718 ;\nC 66 ; WX 667 ; N B ; B 74 0 627 718 ;\nC 67 ; WX 722 ; N C ; B 44 -19 681 737 ;\nC 68 ; WX 722 ; N D ; B 81 0 674 718 ;\nC 69 ; WX 667 ; N E ; B 86 0 616 718 ;\nC 70 ; WX 611 ; N F ; B 86 0 583 718 ;\nC 71 ; WX 778 ; N G ; B 48 -19 704 737 ;\nC 72 ; WX 722 ; N H ; B 77 0 646 718 ;\nC 73 ; WX 278 ; N I ; B 91 0 188 718 ;\nC 74 ; WX 500 ; N J ; B 17 -19 428 718 ;\nC 75 ; WX 667 ; N K ; B 76 0 663 718 ;\nC 76 ; WX 556 ; N L ; B 76 0 537 718 ;\nC 77 ; WX 833 ; N M ; B 73 0 761 718 ;\nC 78 ; WX 722 ; N N ; B 76 0 646 718 ;\nC 79 ; WX 778 ; N O ; B 39 -19 739 737 ;\nC 80 ; WX 667 ; N P ; B 86 0 622 718 ;\nC 81 ; WX 778 ; N Q ; B 39 -56 739 737 ;\nC 82 ; WX 722 ; N R ; B 88 0 684 718 ;\nC 83 ; WX 667 ; N S ; B 49 -19 620 737 ;\nC 84 ; WX 611 ; N T ; B 14 0 597 718 ;\nC 85 ; WX 722 ; N U ; B 79 -19 644 718 ;\nC 86 ; WX 667 ; N V ; B 20 0 647 718 ;\nC 87 ; WX 944 ; N W ; B 16 0 928 718 ;\nC 88 ; WX 667 ; N X ; B 19 0 648 718 ;\nC 89 ; WX 667 ; N Y ; B 14 0 653 718 ;\nC 90 ; WX 611 ; N Z ; B 23 0 588 718 ;\nC 91 ; WX 278 ; N bracketleft ; B 63 -196 250 722 ;\nC 92 ; WX 278 ; N backslash ; B -17 -19 295 737 ;\nC 93 ; WX 278 ; N bracketright ; B 28 -196 215 722 ;\nC 94 ; WX 469 ; N asciicircum ; B -14 264 483 688 ;\nC 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ;\nC 96 ; WX 222 ; N quoteleft ; B 65 470 169 725 ;\nC 97 ; WX 556 ; N a ; B 36 -15 530 538 ;\nC 98 ; WX 556 ; N b ; B 58 -15 517 718 ;\nC 99 ; WX 500 ; N c ; B 30 -15 477 538 ;\nC 100 ; WX 556 ; N d ; B 35 -15 499 718 ;\nC 101 ; WX 556 ; N e ; B 40 -15 516 538 ;\nC 102 ; WX 278 ; N f ; B 14 0 262 728 ; L i fi ; L l fl ;\nC 103 ; WX 556 ; N g ; B 40 -220 499 538 ;\nC 104 ; WX 556 ; N h ; B 65 0 491 718 ;\nC 105 ; WX 222 ; N i ; B 67 0 155 718 ;\nC 106 ; WX 222 ; N j ; B -16 -210 155 718 ;\nC 107 ; WX 500 ; N k ; B 67 0 501 718 ;\nC 108 ; WX 222 ; N l ; B 67 0 155 718 ;\nC 109 ; WX 833 ; N m ; B 65 0 769 538 ;\nC 110 ; WX 556 ; N n ; B 65 0 491 538 ;\nC 111 ; WX 556 ; N o ; B 35 -14 521 538 ;\nC 112 ; WX 556 ; N p ; B 58 -207 517 538 ;\nC 113 ; WX 556 ; N q ; B 35 -207 494 538 ;\nC 114 ; WX 333 ; N r ; B 77 0 332 538 ;\nC 115 ; WX 500 ; N s ; B 32 -15 464 538 ;\nC 116 ; WX 278 ; N t ; B 14 -7 257 669 ;\nC 117 ; WX 556 ; N u ; B 68 -15 489 523 ;\nC 118 ; WX 500 ; N v ; B 8 0 492 523 ;\nC 119 ; WX 722 ; N w ; B 14 0 709 523 ;\nC 120 ; WX 500 ; N x ; B 11 0 490 523 ;\nC 121 ; WX 500 ; N y ; B 11 -214 489 523 ;\nC 122 ; WX 500 ; N z ; B 31 0 469 523 ;\nC 123 ; WX 334 ; N braceleft ; B 42 -196 292 722 ;\nC 124 ; WX 260 ; N bar ; B 94 -225 167 775 ;\nC 125 ; WX 334 ; N braceright ; B 42 -196 292 722 ;\nC 126 ; WX 584 ; N asciitilde ; B 61 180 523 326 ;\nC 161 ; WX 333 ; N exclamdown ; B 118 -195 215 523 ;\nC 162 ; WX 556 ; N cent ; B 51 -115 513 623 ;\nC 163 ; WX 556 ; N sterling ; B 33 -16 539 718 ;\nC 164 ; WX 167 ; N fraction ; B -166 -19 333 703 ;\nC 165 ; WX 556 ; N yen ; B 3 0 553 688 ;\nC 166 ; WX 556 ; N florin ; B -11 -207 501 737 ;\nC 167 ; WX 556 ; N section ; B 43 -191 512 737 ;\nC 168 ; WX 556 ; N currency ; B 28 99 528 603 ;\nC 169 ; WX 191 ; N quotesingle ; B 59 463 132 718 ;\nC 170 ; WX 333 ; N quotedblleft ; B 38 470 307 725 ;\nC 171 ; WX 556 ; N guillemotleft ; B 97 108 459 446 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 88 108 245 446 ;\nC 173 ; WX 333 ; N guilsinglright ; B 88 108 245 446 ;\nC 174 ; WX 500 ; N fi ; B 14 0 434 728 ;\nC 175 ; WX 500 ; N fl ; B 14 0 432 728 ;\nC 177 ; WX 556 ; N endash ; B 0 240 556 313 ;\nC 178 ; WX 556 ; N dagger ; B 43 -159 514 718 ;\nC 179 ; WX 556 ; N daggerdbl ; B 43 -159 514 718 ;\nC 180 ; WX 278 ; N periodcentered ; B 77 190 202 315 ;\nC 182 ; WX 537 ; N paragraph ; B 18 -173 497 718 ;\nC 183 ; WX 350 ; N bullet ; B 18 202 333 517 ;\nC 184 ; WX 222 ; N quotesinglbase ; B 53 -149 157 106 ;\nC 185 ; WX 333 ; N quotedblbase ; B 26 -149 295 106 ;\nC 186 ; WX 333 ; N quotedblright ; B 26 463 295 718 ;\nC 187 ; WX 556 ; N guillemotright ; B 97 108 459 446 ;\nC 188 ; WX 1000 ; N ellipsis ; B 115 0 885 106 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -19 994 703 ;\nC 191 ; WX 611 ; N questiondown ; B 91 -201 527 525 ;\nC 193 ; WX 333 ; N grave ; B 14 593 211 734 ;\nC 194 ; WX 333 ; N acute ; B 122 593 319 734 ;\nC 195 ; WX 333 ; N circumflex ; B 21 593 312 734 ;\nC 196 ; WX 333 ; N tilde ; B -4 606 337 722 ;\nC 197 ; WX 333 ; N macron ; B 10 627 323 684 ;\nC 198 ; WX 333 ; N breve ; B 13 595 321 731 ;\nC 199 ; WX 333 ; N dotaccent ; B 121 604 212 706 ;\nC 200 ; WX 333 ; N dieresis ; B 40 604 293 706 ;\nC 202 ; WX 333 ; N ring ; B 75 572 259 756 ;\nC 203 ; WX 333 ; N cedilla ; B 45 -225 259 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 31 593 409 734 ;\nC 206 ; WX 333 ; N ogonek ; B 73 -225 287 0 ;\nC 207 ; WX 333 ; N caron ; B 21 593 312 734 ;\nC 208 ; WX 1000 ; N emdash ; B 0 240 1000 313 ;\nC 225 ; WX 1000 ; N AE ; B 8 0 951 718 ;\nC 227 ; WX 370 ; N ordfeminine ; B 24 405 346 737 ;\nC 232 ; WX 556 ; N Lslash ; B -20 0 537 718 ;\nC 233 ; WX 778 ; N Oslash ; B 39 -19 740 737 ;\nC 234 ; WX 1000 ; N OE ; B 36 -19 965 737 ;\nC 235 ; WX 365 ; N ordmasculine ; B 25 405 341 737 ;\nC 241 ; WX 889 ; N ae ; B 36 -15 847 538 ;\nC 245 ; WX 278 ; N dotlessi ; B 95 0 183 523 ;\nC 248 ; WX 222 ; N lslash ; B -20 0 242 718 ;\nC 249 ; WX 611 ; N oslash ; B 28 -22 537 545 ;\nC 250 ; WX 944 ; N oe ; B 35 -15 902 538 ;\nC 251 ; WX 611 ; N germandbls ; B 67 -15 571 728 ;\nC -1 ; WX 278 ; N Idieresis ; B 13 0 266 901 ;\nC -1 ; WX 556 ; N eacute ; B 40 -15 516 734 ;\nC -1 ; WX 556 ; N abreve ; B 36 -15 530 731 ;\nC -1 ; WX 556 ; N uhungarumlaut ; B 68 -15 521 734 ;\nC -1 ; WX 556 ; N ecaron ; B 40 -15 516 734 ;\nC -1 ; WX 667 ; N Ydieresis ; B 14 0 653 901 ;\nC -1 ; WX 584 ; N divide ; B 39 -19 545 524 ;\nC -1 ; WX 667 ; N Yacute ; B 14 0 653 929 ;\nC -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ;\nC -1 ; WX 556 ; N aacute ; B 36 -15 530 734 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 79 -19 644 929 ;\nC -1 ; WX 500 ; N yacute ; B 11 -214 489 734 ;\nC -1 ; WX 500 ; N scommaaccent ; B 32 -225 464 538 ;\nC -1 ; WX 556 ; N ecircumflex ; B 40 -15 516 734 ;\nC -1 ; WX 722 ; N Uring ; B 79 -19 644 931 ;\nC -1 ; WX 722 ; N Udieresis ; B 79 -19 644 901 ;\nC -1 ; WX 556 ; N aogonek ; B 36 -220 547 538 ;\nC -1 ; WX 722 ; N Uacute ; B 79 -19 644 929 ;\nC -1 ; WX 556 ; N uogonek ; B 68 -225 519 523 ;\nC -1 ; WX 667 ; N Edieresis ; B 86 0 616 901 ;\nC -1 ; WX 722 ; N Dcroat ; B 0 0 674 718 ;\nC -1 ; WX 250 ; N commaaccent ; B 87 -225 181 -40 ;\nC -1 ; WX 737 ; N copyright ; B -14 -19 752 737 ;\nC -1 ; WX 667 ; N Emacron ; B 86 0 616 879 ;\nC -1 ; WX 500 ; N ccaron ; B 30 -15 477 734 ;\nC -1 ; WX 556 ; N aring ; B 36 -15 530 756 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 646 718 ;\nC -1 ; WX 222 ; N lacute ; B 67 0 264 929 ;\nC -1 ; WX 556 ; N agrave ; B 36 -15 530 734 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 14 -225 597 718 ;\nC -1 ; WX 722 ; N Cacute ; B 44 -19 681 929 ;\nC -1 ; WX 556 ; N atilde ; B 36 -15 530 722 ;\nC -1 ; WX 667 ; N Edotaccent ; B 86 0 616 901 ;\nC -1 ; WX 500 ; N scaron ; B 32 -15 464 734 ;\nC -1 ; WX 500 ; N scedilla ; B 32 -225 464 538 ;\nC -1 ; WX 278 ; N iacute ; B 95 0 292 734 ;\nC -1 ; WX 471 ; N lozenge ; B 10 0 462 728 ;\nC -1 ; WX 722 ; N Rcaron ; B 88 0 684 929 ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 48 -225 704 737 ;\nC -1 ; WX 556 ; N ucircumflex ; B 68 -15 489 734 ;\nC -1 ; WX 556 ; N acircumflex ; B 36 -15 530 734 ;\nC -1 ; WX 667 ; N Amacron ; B 14 0 654 879 ;\nC -1 ; WX 333 ; N rcaron ; B 61 0 352 734 ;\nC -1 ; WX 500 ; N ccedilla ; B 30 -225 477 538 ;\nC -1 ; WX 611 ; N Zdotaccent ; B 23 0 588 901 ;\nC -1 ; WX 667 ; N Thorn ; B 86 0 622 718 ;\nC -1 ; WX 778 ; N Omacron ; B 39 -19 739 879 ;\nC -1 ; WX 722 ; N Racute ; B 88 0 684 929 ;\nC -1 ; WX 667 ; N Sacute ; B 49 -19 620 929 ;\nC -1 ; WX 643 ; N dcaron ; B 35 -15 655 718 ;\nC -1 ; WX 722 ; N Umacron ; B 79 -19 644 879 ;\nC -1 ; WX 556 ; N uring ; B 68 -15 489 756 ;\nC -1 ; WX 333 ; N threesuperior ; B 5 270 325 703 ;\nC -1 ; WX 778 ; N Ograve ; B 39 -19 739 929 ;\nC -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ;\nC -1 ; WX 667 ; N Abreve ; B 14 0 654 926 ;\nC -1 ; WX 584 ; N multiply ; B 39 0 545 506 ;\nC -1 ; WX 556 ; N uacute ; B 68 -15 489 734 ;\nC -1 ; WX 611 ; N Tcaron ; B 14 0 597 929 ;\nC -1 ; WX 476 ; N partialdiff ; B 13 -38 463 714 ;\nC -1 ; WX 500 ; N ydieresis ; B 11 -214 489 706 ;\nC -1 ; WX 722 ; N Nacute ; B 76 0 646 929 ;\nC -1 ; WX 278 ; N icircumflex ; B -6 0 285 734 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 86 0 616 929 ;\nC -1 ; WX 556 ; N adieresis ; B 36 -15 530 706 ;\nC -1 ; WX 556 ; N edieresis ; B 40 -15 516 706 ;\nC -1 ; WX 500 ; N cacute ; B 30 -15 477 734 ;\nC -1 ; WX 556 ; N nacute ; B 65 0 491 734 ;\nC -1 ; WX 556 ; N umacron ; B 68 -15 489 684 ;\nC -1 ; WX 722 ; N Ncaron ; B 76 0 646 929 ;\nC -1 ; WX 278 ; N Iacute ; B 91 0 292 929 ;\nC -1 ; WX 584 ; N plusminus ; B 39 0 545 506 ;\nC -1 ; WX 260 ; N brokenbar ; B 94 -150 167 700 ;\nC -1 ; WX 737 ; N registered ; B -14 -19 752 737 ;\nC -1 ; WX 778 ; N Gbreve ; B 48 -19 704 926 ;\nC -1 ; WX 278 ; N Idotaccent ; B 91 0 188 901 ;\nC -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;\nC -1 ; WX 667 ; N Egrave ; B 86 0 616 929 ;\nC -1 ; WX 333 ; N racute ; B 77 0 332 734 ;\nC -1 ; WX 556 ; N omacron ; B 35 -14 521 684 ;\nC -1 ; WX 611 ; N Zacute ; B 23 0 588 929 ;\nC -1 ; WX 611 ; N Zcaron ; B 23 0 588 929 ;\nC -1 ; WX 549 ; N greaterequal ; B 26 0 523 674 ;\nC -1 ; WX 722 ; N Eth ; B 0 0 674 718 ;\nC -1 ; WX 722 ; N Ccedilla ; B 44 -225 681 737 ;\nC -1 ; WX 222 ; N lcommaaccent ; B 67 -225 167 718 ;\nC -1 ; WX 317 ; N tcaron ; B 14 -7 329 808 ;\nC -1 ; WX 556 ; N eogonek ; B 40 -225 516 538 ;\nC -1 ; WX 722 ; N Uogonek ; B 79 -225 644 718 ;\nC -1 ; WX 667 ; N Aacute ; B 14 0 654 929 ;\nC -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ;\nC -1 ; WX 556 ; N egrave ; B 40 -15 516 734 ;\nC -1 ; WX 500 ; N zacute ; B 31 0 469 734 ;\nC -1 ; WX 222 ; N iogonek ; B -31 -225 183 718 ;\nC -1 ; WX 778 ; N Oacute ; B 39 -19 739 929 ;\nC -1 ; WX 556 ; N oacute ; B 35 -14 521 734 ;\nC -1 ; WX 556 ; N amacron ; B 36 -15 530 684 ;\nC -1 ; WX 500 ; N sacute ; B 32 -15 464 734 ;\nC -1 ; WX 278 ; N idieresis ; B 13 0 266 706 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 39 -19 739 929 ;\nC -1 ; WX 722 ; N Ugrave ; B 79 -19 644 929 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 556 ; N thorn ; B 58 -207 517 718 ;\nC -1 ; WX 333 ; N twosuperior ; B 4 281 323 703 ;\nC -1 ; WX 778 ; N Odieresis ; B 39 -19 739 901 ;\nC -1 ; WX 556 ; N mu ; B 68 -207 489 523 ;\nC -1 ; WX 278 ; N igrave ; B -13 0 184 734 ;\nC -1 ; WX 556 ; N ohungarumlaut ; B 35 -14 521 734 ;\nC -1 ; WX 667 ; N Eogonek ; B 86 -220 633 718 ;\nC -1 ; WX 556 ; N dcroat ; B 35 -15 550 718 ;\nC -1 ; WX 834 ; N threequarters ; B 45 -19 810 703 ;\nC -1 ; WX 667 ; N Scedilla ; B 49 -225 620 737 ;\nC -1 ; WX 299 ; N lcaron ; B 67 0 311 718 ;\nC -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 663 718 ;\nC -1 ; WX 556 ; N Lacute ; B 76 0 537 929 ;\nC -1 ; WX 1000 ; N trademark ; B 46 306 903 718 ;\nC -1 ; WX 556 ; N edotaccent ; B 40 -15 516 706 ;\nC -1 ; WX 278 ; N Igrave ; B -13 0 188 929 ;\nC -1 ; WX 278 ; N Imacron ; B -17 0 296 879 ;\nC -1 ; WX 556 ; N Lcaron ; B 76 0 537 718 ;\nC -1 ; WX 834 ; N onehalf ; B 43 -19 773 703 ;\nC -1 ; WX 549 ; N lessequal ; B 26 0 523 674 ;\nC -1 ; WX 556 ; N ocircumflex ; B 35 -14 521 734 ;\nC -1 ; WX 556 ; N ntilde ; B 65 0 491 722 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 79 -19 644 929 ;\nC -1 ; WX 667 ; N Eacute ; B 86 0 616 929 ;\nC -1 ; WX 556 ; N emacron ; B 40 -15 516 684 ;\nC -1 ; WX 556 ; N gbreve ; B 40 -220 499 731 ;\nC -1 ; WX 834 ; N onequarter ; B 73 -19 756 703 ;\nC -1 ; WX 667 ; N Scaron ; B 49 -19 620 929 ;\nC -1 ; WX 667 ; N Scommaaccent ; B 49 -225 620 737 ;\nC -1 ; WX 778 ; N Ohungarumlaut ; B 39 -19 739 929 ;\nC -1 ; WX 400 ; N degree ; B 54 411 346 703 ;\nC -1 ; WX 556 ; N ograve ; B 35 -14 521 734 ;\nC -1 ; WX 722 ; N Ccaron ; B 44 -19 681 929 ;\nC -1 ; WX 556 ; N ugrave ; B 68 -15 489 734 ;\nC -1 ; WX 453 ; N radical ; B -4 -80 458 762 ;\nC -1 ; WX 722 ; N Dcaron ; B 81 0 674 929 ;\nC -1 ; WX 333 ; N rcommaaccent ; B 77 -225 332 538 ;\nC -1 ; WX 722 ; N Ntilde ; B 76 0 646 917 ;\nC -1 ; WX 556 ; N otilde ; B 35 -14 521 722 ;\nC -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 684 718 ;\nC -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 537 718 ;\nC -1 ; WX 667 ; N Atilde ; B 14 0 654 917 ;\nC -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ;\nC -1 ; WX 667 ; N Aring ; B 14 0 654 931 ;\nC -1 ; WX 778 ; N Otilde ; B 39 -19 739 917 ;\nC -1 ; WX 500 ; N zdotaccent ; B 31 0 469 706 ;\nC -1 ; WX 667 ; N Ecaron ; B 86 0 616 929 ;\nC -1 ; WX 278 ; N Iogonek ; B -3 -225 211 718 ;\nC -1 ; WX 500 ; N kcommaaccent ; B 67 -225 501 718 ;\nC -1 ; WX 584 ; N minus ; B 39 216 545 289 ;\nC -1 ; WX 278 ; N Icircumflex ; B -6 0 285 929 ;\nC -1 ; WX 556 ; N ncaron ; B 65 0 491 734 ;\nC -1 ; WX 278 ; N tcommaaccent ; B 14 -225 257 669 ;\nC -1 ; WX 584 ; N logicalnot ; B 39 108 545 390 ;\nC -1 ; WX 556 ; N odieresis ; B 35 -14 521 706 ;\nC -1 ; WX 556 ; N udieresis ; B 68 -15 489 706 ;\nC -1 ; WX 549 ; N notequal ; B 12 -35 537 551 ;\nC -1 ; WX 556 ; N gcommaaccent ; B 40 -220 499 822 ;\nC -1 ; WX 556 ; N eth ; B 35 -15 522 737 ;\nC -1 ; WX 500 ; N zcaron ; B 31 0 469 734 ;\nC -1 ; WX 556 ; N ncommaaccent ; B 65 -225 491 538 ;\nC -1 ; WX 333 ; N onesuperior ; B 43 281 222 703 ;\nC -1 ; WX 278 ; N imacron ; B 5 0 272 684 ;\nC -1 ; WX 556 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 2705\nKPX A C -30\nKPX A Cacute -30\nKPX A Ccaron -30\nKPX A Ccedilla -30\nKPX A G -30\nKPX A Gbreve -30\nKPX A Gcommaaccent -30\nKPX A O -30\nKPX A Oacute -30\nKPX A Ocircumflex -30\nKPX A Odieresis -30\nKPX A Ograve -30\nKPX A Ohungarumlaut -30\nKPX A Omacron -30\nKPX A Oslash -30\nKPX A Otilde -30\nKPX A Q -30\nKPX A T -120\nKPX A Tcaron -120\nKPX A Tcommaaccent -120\nKPX A U -50\nKPX A Uacute -50\nKPX A Ucircumflex -50\nKPX A Udieresis -50\nKPX A Ugrave -50\nKPX A Uhungarumlaut -50\nKPX A Umacron -50\nKPX A Uogonek -50\nKPX A Uring -50\nKPX A V -70\nKPX A W -50\nKPX A Y -100\nKPX A Yacute -100\nKPX A Ydieresis -100\nKPX A u -30\nKPX A uacute -30\nKPX A ucircumflex -30\nKPX A udieresis -30\nKPX A ugrave -30\nKPX A uhungarumlaut -30\nKPX A umacron -30\nKPX A uogonek -30\nKPX A uring -30\nKPX A v -40\nKPX A w -40\nKPX A y -40\nKPX A yacute -40\nKPX A ydieresis -40\nKPX Aacute C -30\nKPX Aacute Cacute -30\nKPX Aacute Ccaron -30\nKPX Aacute Ccedilla -30\nKPX Aacute G -30\nKPX Aacute Gbreve -30\nKPX Aacute Gcommaaccent -30\nKPX Aacute O -30\nKPX Aacute Oacute -30\nKPX Aacute Ocircumflex -30\nKPX Aacute Odieresis -30\nKPX Aacute Ograve -30\nKPX Aacute Ohungarumlaut -30\nKPX Aacute Omacron -30\nKPX Aacute Oslash -30\nKPX Aacute Otilde -30\nKPX Aacute Q -30\nKPX Aacute T -120\nKPX Aacute Tcaron -120\nKPX Aacute Tcommaaccent -120\nKPX Aacute U -50\nKPX Aacute Uacute -50\nKPX Aacute Ucircumflex -50\nKPX Aacute Udieresis -50\nKPX Aacute Ugrave -50\nKPX Aacute Uhungarumlaut -50\nKPX Aacute Umacron -50\nKPX Aacute Uogonek -50\nKPX Aacute Uring -50\nKPX Aacute V -70\nKPX Aacute W -50\nKPX Aacute Y -100\nKPX Aacute Yacute -100\nKPX Aacute Ydieresis -100\nKPX Aacute u -30\nKPX Aacute uacute -30\nKPX Aacute ucircumflex -30\nKPX Aacute udieresis -30\nKPX Aacute ugrave -30\nKPX Aacute uhungarumlaut -30\nKPX Aacute umacron -30\nKPX Aacute uogonek -30\nKPX Aacute uring -30\nKPX Aacute v -40\nKPX Aacute w -40\nKPX Aacute y -40\nKPX Aacute yacute -40\nKPX Aacute ydieresis -40\nKPX Abreve C -30\nKPX Abreve Cacute -30\nKPX Abreve Ccaron -30\nKPX Abreve Ccedilla -30\nKPX Abreve G -30\nKPX Abreve Gbreve -30\nKPX Abreve Gcommaaccent -30\nKPX Abreve O -30\nKPX Abreve Oacute -30\nKPX Abreve Ocircumflex -30\nKPX Abreve Odieresis -30\nKPX Abreve Ograve -30\nKPX Abreve Ohungarumlaut -30\nKPX Abreve Omacron -30\nKPX Abreve Oslash -30\nKPX Abreve Otilde -30\nKPX Abreve Q -30\nKPX Abreve T -120\nKPX Abreve Tcaron -120\nKPX Abreve Tcommaaccent -120\nKPX Abreve U -50\nKPX Abreve Uacute -50\nKPX Abreve Ucircumflex -50\nKPX Abreve Udieresis -50\nKPX Abreve Ugrave -50\nKPX Abreve Uhungarumlaut -50\nKPX Abreve Umacron -50\nKPX Abreve Uogonek -50\nKPX Abreve Uring -50\nKPX Abreve V -70\nKPX Abreve W -50\nKPX Abreve Y -100\nKPX Abreve Yacute -100\nKPX Abreve Ydieresis -100\nKPX Abreve u -30\nKPX Abreve uacute -30\nKPX Abreve ucircumflex -30\nKPX Abreve udieresis -30\nKPX Abreve ugrave -30\nKPX Abreve uhungarumlaut -30\nKPX Abreve umacron -30\nKPX Abreve uogonek -30\nKPX Abreve uring -30\nKPX Abreve v -40\nKPX Abreve w -40\nKPX Abreve y -40\nKPX Abreve yacute -40\nKPX Abreve ydieresis -40\nKPX Acircumflex C -30\nKPX Acircumflex Cacute -30\nKPX Acircumflex Ccaron -30\nKPX Acircumflex Ccedilla -30\nKPX Acircumflex G -30\nKPX Acircumflex Gbreve -30\nKPX Acircumflex Gcommaaccent -30\nKPX Acircumflex O -30\nKPX Acircumflex Oacute -30\nKPX Acircumflex Ocircumflex -30\nKPX Acircumflex Odieresis -30\nKPX Acircumflex Ograve -30\nKPX Acircumflex Ohungarumlaut -30\nKPX Acircumflex Omacron -30\nKPX Acircumflex Oslash -30\nKPX Acircumflex Otilde -30\nKPX Acircumflex Q -30\nKPX Acircumflex T -120\nKPX Acircumflex Tcaron -120\nKPX Acircumflex Tcommaaccent -120\nKPX Acircumflex U -50\nKPX Acircumflex Uacute -50\nKPX Acircumflex Ucircumflex -50\nKPX Acircumflex Udieresis -50\nKPX Acircumflex Ugrave -50\nKPX Acircumflex Uhungarumlaut -50\nKPX Acircumflex Umacron -50\nKPX Acircumflex Uogonek -50\nKPX Acircumflex Uring -50\nKPX Acircumflex V -70\nKPX Acircumflex W -50\nKPX Acircumflex Y -100\nKPX Acircumflex Yacute -100\nKPX Acircumflex Ydieresis -100\nKPX Acircumflex u -30\nKPX Acircumflex uacute -30\nKPX Acircumflex ucircumflex -30\nKPX Acircumflex udieresis -30\nKPX Acircumflex ugrave -30\nKPX Acircumflex uhungarumlaut -30\nKPX Acircumflex umacron -30\nKPX Acircumflex uogonek -30\nKPX Acircumflex uring -30\nKPX Acircumflex v -40\nKPX Acircumflex w -40\nKPX Acircumflex y -40\nKPX Acircumflex yacute -40\nKPX Acircumflex ydieresis -40\nKPX Adieresis C -30\nKPX Adieresis Cacute -30\nKPX Adieresis Ccaron -30\nKPX Adieresis Ccedilla -30\nKPX Adieresis G -30\nKPX Adieresis Gbreve -30\nKPX Adieresis Gcommaaccent -30\nKPX Adieresis O -30\nKPX Adieresis Oacute -30\nKPX Adieresis Ocircumflex -30\nKPX Adieresis Odieresis -30\nKPX Adieresis Ograve -30\nKPX Adieresis Ohungarumlaut -30\nKPX Adieresis Omacron -30\nKPX Adieresis Oslash -30\nKPX Adieresis Otilde -30\nKPX Adieresis Q -30\nKPX Adieresis T -120\nKPX Adieresis Tcaron -120\nKPX Adieresis Tcommaaccent -120\nKPX Adieresis U -50\nKPX Adieresis Uacute -50\nKPX Adieresis Ucircumflex -50\nKPX Adieresis Udieresis -50\nKPX Adieresis Ugrave -50\nKPX Adieresis Uhungarumlaut -50\nKPX Adieresis Umacron -50\nKPX Adieresis Uogonek -50\nKPX Adieresis Uring -50\nKPX Adieresis V -70\nKPX Adieresis W -50\nKPX Adieresis Y -100\nKPX Adieresis Yacute -100\nKPX Adieresis Ydieresis -100\nKPX Adieresis u -30\nKPX Adieresis uacute -30\nKPX Adieresis ucircumflex -30\nKPX Adieresis udieresis -30\nKPX Adieresis ugrave -30\nKPX Adieresis uhungarumlaut -30\nKPX Adieresis umacron -30\nKPX Adieresis uogonek -30\nKPX Adieresis uring -30\nKPX Adieresis v -40\nKPX Adieresis w -40\nKPX Adieresis y -40\nKPX Adieresis yacute -40\nKPX Adieresis ydieresis -40\nKPX Agrave C -30\nKPX Agrave Cacute -30\nKPX Agrave Ccaron -30\nKPX Agrave Ccedilla -30\nKPX Agrave G -30\nKPX Agrave Gbreve -30\nKPX Agrave Gcommaaccent -30\nKPX Agrave O -30\nKPX Agrave Oacute -30\nKPX Agrave Ocircumflex -30\nKPX Agrave Odieresis -30\nKPX Agrave Ograve -30\nKPX Agrave Ohungarumlaut -30\nKPX Agrave Omacron -30\nKPX Agrave Oslash -30\nKPX Agrave Otilde -30\nKPX Agrave Q -30\nKPX Agrave T -120\nKPX Agrave Tcaron -120\nKPX Agrave Tcommaaccent -120\nKPX Agrave U -50\nKPX Agrave Uacute -50\nKPX Agrave Ucircumflex -50\nKPX Agrave Udieresis -50\nKPX Agrave Ugrave -50\nKPX Agrave Uhungarumlaut -50\nKPX Agrave Umacron -50\nKPX Agrave Uogonek -50\nKPX Agrave Uring -50\nKPX Agrave V -70\nKPX Agrave W -50\nKPX Agrave Y -100\nKPX Agrave Yacute -100\nKPX Agrave Ydieresis -100\nKPX Agrave u -30\nKPX Agrave uacute -30\nKPX Agrave ucircumflex -30\nKPX Agrave udieresis -30\nKPX Agrave ugrave -30\nKPX Agrave uhungarumlaut -30\nKPX Agrave umacron -30\nKPX Agrave uogonek -30\nKPX Agrave uring -30\nKPX Agrave v -40\nKPX Agrave w -40\nKPX Agrave y -40\nKPX Agrave yacute -40\nKPX Agrave ydieresis -40\nKPX Amacron C -30\nKPX Amacron Cacute -30\nKPX Amacron Ccaron -30\nKPX Amacron Ccedilla -30\nKPX Amacron G -30\nKPX Amacron Gbreve -30\nKPX Amacron Gcommaaccent -30\nKPX Amacron O -30\nKPX Amacron Oacute -30\nKPX Amacron Ocircumflex -30\nKPX Amacron Odieresis -30\nKPX Amacron Ograve -30\nKPX Amacron Ohungarumlaut -30\nKPX Amacron Omacron -30\nKPX Amacron Oslash -30\nKPX Amacron Otilde -30\nKPX Amacron Q -30\nKPX Amacron T -120\nKPX Amacron Tcaron -120\nKPX Amacron Tcommaaccent -120\nKPX Amacron U -50\nKPX Amacron Uacute -50\nKPX Amacron Ucircumflex -50\nKPX Amacron Udieresis -50\nKPX Amacron Ugrave -50\nKPX Amacron Uhungarumlaut -50\nKPX Amacron Umacron -50\nKPX Amacron Uogonek -50\nKPX Amacron Uring -50\nKPX Amacron V -70\nKPX Amacron W -50\nKPX Amacron Y -100\nKPX Amacron Yacute -100\nKPX Amacron Ydieresis -100\nKPX Amacron u -30\nKPX Amacron uacute -30\nKPX Amacron ucircumflex -30\nKPX Amacron udieresis -30\nKPX Amacron ugrave -30\nKPX Amacron uhungarumlaut -30\nKPX Amacron umacron -30\nKPX Amacron uogonek -30\nKPX Amacron uring -30\nKPX Amacron v -40\nKPX Amacron w -40\nKPX Amacron y -40\nKPX Amacron yacute -40\nKPX Amacron ydieresis -40\nKPX Aogonek C -30\nKPX Aogonek Cacute -30\nKPX Aogonek Ccaron -30\nKPX Aogonek Ccedilla -30\nKPX Aogonek G -30\nKPX Aogonek Gbreve -30\nKPX Aogonek Gcommaaccent -30\nKPX Aogonek O -30\nKPX Aogonek Oacute -30\nKPX Aogonek Ocircumflex -30\nKPX Aogonek Odieresis -30\nKPX Aogonek Ograve -30\nKPX Aogonek Ohungarumlaut -30\nKPX Aogonek Omacron -30\nKPX Aogonek Oslash -30\nKPX Aogonek Otilde -30\nKPX Aogonek Q -30\nKPX Aogonek T -120\nKPX Aogonek Tcaron -120\nKPX Aogonek Tcommaaccent -120\nKPX Aogonek U -50\nKPX Aogonek Uacute -50\nKPX Aogonek Ucircumflex -50\nKPX Aogonek Udieresis -50\nKPX Aogonek Ugrave -50\nKPX Aogonek Uhungarumlaut -50\nKPX Aogonek Umacron -50\nKPX Aogonek Uogonek -50\nKPX Aogonek Uring -50\nKPX Aogonek V -70\nKPX Aogonek W -50\nKPX Aogonek Y -100\nKPX Aogonek Yacute -100\nKPX Aogonek Ydieresis -100\nKPX Aogonek u -30\nKPX Aogonek uacute -30\nKPX Aogonek ucircumflex -30\nKPX Aogonek udieresis -30\nKPX Aogonek ugrave -30\nKPX Aogonek uhungarumlaut -30\nKPX Aogonek umacron -30\nKPX Aogonek uogonek -30\nKPX Aogonek uring -30\nKPX Aogonek v -40\nKPX Aogonek w -40\nKPX Aogonek y -40\nKPX Aogonek yacute -40\nKPX Aogonek ydieresis -40\nKPX Aring C -30\nKPX Aring Cacute -30\nKPX Aring Ccaron -30\nKPX Aring Ccedilla -30\nKPX Aring G -30\nKPX Aring Gbreve -30\nKPX Aring Gcommaaccent -30\nKPX Aring O -30\nKPX Aring Oacute -30\nKPX Aring Ocircumflex -30\nKPX Aring Odieresis -30\nKPX Aring Ograve -30\nKPX Aring Ohungarumlaut -30\nKPX Aring Omacron -30\nKPX Aring Oslash -30\nKPX Aring Otilde -30\nKPX Aring Q -30\nKPX Aring T -120\nKPX Aring Tcaron -120\nKPX Aring Tcommaaccent -120\nKPX Aring U -50\nKPX Aring Uacute -50\nKPX Aring Ucircumflex -50\nKPX Aring Udieresis -50\nKPX Aring Ugrave -50\nKPX Aring Uhungarumlaut -50\nKPX Aring Umacron -50\nKPX Aring Uogonek -50\nKPX Aring Uring -50\nKPX Aring V -70\nKPX Aring W -50\nKPX Aring Y -100\nKPX Aring Yacute -100\nKPX Aring Ydieresis -100\nKPX Aring u -30\nKPX Aring uacute -30\nKPX Aring ucircumflex -30\nKPX Aring udieresis -30\nKPX Aring ugrave -30\nKPX Aring uhungarumlaut -30\nKPX Aring umacron -30\nKPX Aring uogonek -30\nKPX Aring uring -30\nKPX Aring v -40\nKPX Aring w -40\nKPX Aring y -40\nKPX Aring yacute -40\nKPX Aring ydieresis -40\nKPX Atilde C -30\nKPX Atilde Cacute -30\nKPX Atilde Ccaron -30\nKPX Atilde Ccedilla -30\nKPX Atilde G -30\nKPX Atilde Gbreve -30\nKPX Atilde Gcommaaccent -30\nKPX Atilde O -30\nKPX Atilde Oacute -30\nKPX Atilde Ocircumflex -30\nKPX Atilde Odieresis -30\nKPX Atilde Ograve -30\nKPX Atilde Ohungarumlaut -30\nKPX Atilde Omacron -30\nKPX Atilde Oslash -30\nKPX Atilde Otilde -30\nKPX Atilde Q -30\nKPX Atilde T -120\nKPX Atilde Tcaron -120\nKPX Atilde Tcommaaccent -120\nKPX Atilde U -50\nKPX Atilde Uacute -50\nKPX Atilde Ucircumflex -50\nKPX Atilde Udieresis -50\nKPX Atilde Ugrave -50\nKPX Atilde Uhungarumlaut -50\nKPX Atilde Umacron -50\nKPX Atilde Uogonek -50\nKPX Atilde Uring -50\nKPX Atilde V -70\nKPX Atilde W -50\nKPX Atilde Y -100\nKPX Atilde Yacute -100\nKPX Atilde Ydieresis -100\nKPX Atilde u -30\nKPX Atilde uacute -30\nKPX Atilde ucircumflex -30\nKPX Atilde udieresis -30\nKPX Atilde ugrave -30\nKPX Atilde uhungarumlaut -30\nKPX Atilde umacron -30\nKPX Atilde uogonek -30\nKPX Atilde uring -30\nKPX Atilde v -40\nKPX Atilde w -40\nKPX Atilde y -40\nKPX Atilde yacute -40\nKPX Atilde ydieresis -40\nKPX B U -10\nKPX B Uacute -10\nKPX B Ucircumflex -10\nKPX B Udieresis -10\nKPX B Ugrave -10\nKPX B Uhungarumlaut -10\nKPX B Umacron -10\nKPX B Uogonek -10\nKPX B Uring -10\nKPX B comma -20\nKPX B period -20\nKPX C comma -30\nKPX C period -30\nKPX Cacute comma -30\nKPX Cacute period -30\nKPX Ccaron comma -30\nKPX Ccaron period -30\nKPX Ccedilla comma -30\nKPX Ccedilla period -30\nKPX D A -40\nKPX D Aacute -40\nKPX D Abreve -40\nKPX D Acircumflex -40\nKPX D Adieresis -40\nKPX D Agrave -40\nKPX D Amacron -40\nKPX D Aogonek -40\nKPX D Aring -40\nKPX D Atilde -40\nKPX D V -70\nKPX D W -40\nKPX D Y -90\nKPX D Yacute -90\nKPX D Ydieresis -90\nKPX D comma -70\nKPX D period -70\nKPX Dcaron A -40\nKPX Dcaron Aacute -40\nKPX Dcaron Abreve -40\nKPX Dcaron Acircumflex -40\nKPX Dcaron Adieresis -40\nKPX Dcaron Agrave -40\nKPX Dcaron Amacron -40\nKPX Dcaron Aogonek -40\nKPX Dcaron Aring -40\nKPX Dcaron Atilde -40\nKPX Dcaron V -70\nKPX Dcaron W -40\nKPX Dcaron Y -90\nKPX Dcaron Yacute -90\nKPX Dcaron Ydieresis -90\nKPX Dcaron comma -70\nKPX Dcaron period -70\nKPX Dcroat A -40\nKPX Dcroat Aacute -40\nKPX Dcroat Abreve -40\nKPX Dcroat Acircumflex -40\nKPX Dcroat Adieresis -40\nKPX Dcroat Agrave -40\nKPX Dcroat Amacron -40\nKPX Dcroat Aogonek -40\nKPX Dcroat Aring -40\nKPX Dcroat Atilde -40\nKPX Dcroat V -70\nKPX Dcroat W -40\nKPX Dcroat Y -90\nKPX Dcroat Yacute -90\nKPX Dcroat Ydieresis -90\nKPX Dcroat comma -70\nKPX Dcroat period -70\nKPX F A -80\nKPX F Aacute -80\nKPX F Abreve -80\nKPX F Acircumflex -80\nKPX F Adieresis -80\nKPX F Agrave -80\nKPX F Amacron -80\nKPX F Aogonek -80\nKPX F Aring -80\nKPX F Atilde -80\nKPX F a -50\nKPX F aacute -50\nKPX F abreve -50\nKPX F acircumflex -50\nKPX F adieresis -50\nKPX F agrave -50\nKPX F amacron -50\nKPX F aogonek -50\nKPX F aring -50\nKPX F atilde -50\nKPX F comma -150\nKPX F e -30\nKPX F eacute -30\nKPX F ecaron -30\nKPX F ecircumflex -30\nKPX F edieresis -30\nKPX F edotaccent -30\nKPX F egrave -30\nKPX F emacron -30\nKPX F eogonek -30\nKPX F o -30\nKPX F oacute -30\nKPX F ocircumflex -30\nKPX F odieresis -30\nKPX F ograve -30\nKPX F ohungarumlaut -30\nKPX F omacron -30\nKPX F oslash -30\nKPX F otilde -30\nKPX F period -150\nKPX F r -45\nKPX F racute -45\nKPX F rcaron -45\nKPX F rcommaaccent -45\nKPX J A -20\nKPX J Aacute -20\nKPX J Abreve -20\nKPX J Acircumflex -20\nKPX J Adieresis -20\nKPX J Agrave -20\nKPX J Amacron -20\nKPX J Aogonek -20\nKPX J Aring -20\nKPX J Atilde -20\nKPX J a -20\nKPX J aacute -20\nKPX J abreve -20\nKPX J acircumflex -20\nKPX J adieresis -20\nKPX J agrave -20\nKPX J amacron -20\nKPX J aogonek -20\nKPX J aring -20\nKPX J atilde -20\nKPX J comma -30\nKPX J period -30\nKPX J u -20\nKPX J uacute -20\nKPX J ucircumflex -20\nKPX J udieresis -20\nKPX J ugrave -20\nKPX J uhungarumlaut -20\nKPX J umacron -20\nKPX J uogonek -20\nKPX J uring -20\nKPX K O -50\nKPX K Oacute -50\nKPX K Ocircumflex -50\nKPX K Odieresis -50\nKPX K Ograve -50\nKPX K Ohungarumlaut -50\nKPX K Omacron -50\nKPX K Oslash -50\nKPX K Otilde -50\nKPX K e -40\nKPX K eacute -40\nKPX K ecaron -40\nKPX K ecircumflex -40\nKPX K edieresis -40\nKPX K edotaccent -40\nKPX K egrave -40\nKPX K emacron -40\nKPX K eogonek -40\nKPX K o -40\nKPX K oacute -40\nKPX K ocircumflex -40\nKPX K odieresis -40\nKPX K ograve -40\nKPX K ohungarumlaut -40\nKPX K omacron -40\nKPX K oslash -40\nKPX K otilde -40\nKPX K u -30\nKPX K uacute -30\nKPX K ucircumflex -30\nKPX K udieresis -30\nKPX K ugrave -30\nKPX K uhungarumlaut -30\nKPX K umacron -30\nKPX K uogonek -30\nKPX K uring -30\nKPX K y -50\nKPX K yacute -50\nKPX K ydieresis -50\nKPX Kcommaaccent O -50\nKPX Kcommaaccent Oacute -50\nKPX Kcommaaccent Ocircumflex -50\nKPX Kcommaaccent Odieresis -50\nKPX Kcommaaccent Ograve -50\nKPX Kcommaaccent Ohungarumlaut -50\nKPX Kcommaaccent Omacron -50\nKPX Kcommaaccent Oslash -50\nKPX Kcommaaccent Otilde -50\nKPX Kcommaaccent e -40\nKPX Kcommaaccent eacute -40\nKPX Kcommaaccent ecaron -40\nKPX Kcommaaccent ecircumflex -40\nKPX Kcommaaccent edieresis -40\nKPX Kcommaaccent edotaccent -40\nKPX Kcommaaccent egrave -40\nKPX Kcommaaccent emacron -40\nKPX Kcommaaccent eogonek -40\nKPX Kcommaaccent o -40\nKPX Kcommaaccent oacute -40\nKPX Kcommaaccent ocircumflex -40\nKPX Kcommaaccent odieresis -40\nKPX Kcommaaccent ograve -40\nKPX Kcommaaccent ohungarumlaut -40\nKPX Kcommaaccent omacron -40\nKPX Kcommaaccent oslash -40\nKPX Kcommaaccent otilde -40\nKPX Kcommaaccent u -30\nKPX Kcommaaccent uacute -30\nKPX Kcommaaccent ucircumflex -30\nKPX Kcommaaccent udieresis -30\nKPX Kcommaaccent ugrave -30\nKPX Kcommaaccent uhungarumlaut -30\nKPX Kcommaaccent umacron -30\nKPX Kcommaaccent uogonek -30\nKPX Kcommaaccent uring -30\nKPX Kcommaaccent y -50\nKPX Kcommaaccent yacute -50\nKPX Kcommaaccent ydieresis -50\nKPX L T -110\nKPX L Tcaron -110\nKPX L Tcommaaccent -110\nKPX L V -110\nKPX L W -70\nKPX L Y -140\nKPX L Yacute -140\nKPX L Ydieresis -140\nKPX L quotedblright -140\nKPX L quoteright -160\nKPX L y -30\nKPX L yacute -30\nKPX L ydieresis -30\nKPX Lacute T -110\nKPX Lacute Tcaron -110\nKPX Lacute Tcommaaccent -110\nKPX Lacute V -110\nKPX Lacute W -70\nKPX Lacute Y -140\nKPX Lacute Yacute -140\nKPX Lacute Ydieresis -140\nKPX Lacute quotedblright -140\nKPX Lacute quoteright -160\nKPX Lacute y -30\nKPX Lacute yacute -30\nKPX Lacute ydieresis -30\nKPX Lcaron T -110\nKPX Lcaron Tcaron -110\nKPX Lcaron Tcommaaccent -110\nKPX Lcaron V -110\nKPX Lcaron W -70\nKPX Lcaron Y -140\nKPX Lcaron Yacute -140\nKPX Lcaron Ydieresis -140\nKPX Lcaron quotedblright -140\nKPX Lcaron quoteright -160\nKPX Lcaron y -30\nKPX Lcaron yacute -30\nKPX Lcaron ydieresis -30\nKPX Lcommaaccent T -110\nKPX Lcommaaccent Tcaron -110\nKPX Lcommaaccent Tcommaaccent -110\nKPX Lcommaaccent V -110\nKPX Lcommaaccent W -70\nKPX Lcommaaccent Y -140\nKPX Lcommaaccent Yacute -140\nKPX Lcommaaccent Ydieresis -140\nKPX Lcommaaccent quotedblright -140\nKPX Lcommaaccent quoteright -160\nKPX Lcommaaccent y -30\nKPX Lcommaaccent yacute -30\nKPX Lcommaaccent ydieresis -30\nKPX Lslash T -110\nKPX Lslash Tcaron -110\nKPX Lslash Tcommaaccent -110\nKPX Lslash V -110\nKPX Lslash W -70\nKPX Lslash Y -140\nKPX Lslash Yacute -140\nKPX Lslash Ydieresis -140\nKPX Lslash quotedblright -140\nKPX Lslash quoteright -160\nKPX Lslash y -30\nKPX Lslash yacute -30\nKPX Lslash ydieresis -30\nKPX O A -20\nKPX O Aacute -20\nKPX O Abreve -20\nKPX O Acircumflex -20\nKPX O Adieresis -20\nKPX O Agrave -20\nKPX O Amacron -20\nKPX O Aogonek -20\nKPX O Aring -20\nKPX O Atilde -20\nKPX O T -40\nKPX O Tcaron -40\nKPX O Tcommaaccent -40\nKPX O V -50\nKPX O W -30\nKPX O X -60\nKPX O Y -70\nKPX O Yacute -70\nKPX O Ydieresis -70\nKPX O comma -40\nKPX O period -40\nKPX Oacute A -20\nKPX Oacute Aacute -20\nKPX Oacute Abreve -20\nKPX Oacute Acircumflex -20\nKPX Oacute Adieresis -20\nKPX Oacute Agrave -20\nKPX Oacute Amacron -20\nKPX Oacute Aogonek -20\nKPX Oacute Aring -20\nKPX Oacute Atilde -20\nKPX Oacute T -40\nKPX Oacute Tcaron -40\nKPX Oacute Tcommaaccent -40\nKPX Oacute V -50\nKPX Oacute W -30\nKPX Oacute X -60\nKPX Oacute Y -70\nKPX Oacute Yacute -70\nKPX Oacute Ydieresis -70\nKPX Oacute comma -40\nKPX Oacute period -40\nKPX Ocircumflex A -20\nKPX Ocircumflex Aacute -20\nKPX Ocircumflex Abreve -20\nKPX Ocircumflex Acircumflex -20\nKPX Ocircumflex Adieresis -20\nKPX Ocircumflex Agrave -20\nKPX Ocircumflex Amacron -20\nKPX Ocircumflex Aogonek -20\nKPX Ocircumflex Aring -20\nKPX Ocircumflex Atilde -20\nKPX Ocircumflex T -40\nKPX Ocircumflex Tcaron -40\nKPX Ocircumflex Tcommaaccent -40\nKPX Ocircumflex V -50\nKPX Ocircumflex W -30\nKPX Ocircumflex X -60\nKPX Ocircumflex Y -70\nKPX Ocircumflex Yacute -70\nKPX Ocircumflex Ydieresis -70\nKPX Ocircumflex comma -40\nKPX Ocircumflex period -40\nKPX Odieresis A -20\nKPX Odieresis Aacute -20\nKPX Odieresis Abreve -20\nKPX Odieresis Acircumflex -20\nKPX Odieresis Adieresis -20\nKPX Odieresis Agrave -20\nKPX Odieresis Amacron -20\nKPX Odieresis Aogonek -20\nKPX Odieresis Aring -20\nKPX Odieresis Atilde -20\nKPX Odieresis T -40\nKPX Odieresis Tcaron -40\nKPX Odieresis Tcommaaccent -40\nKPX Odieresis V -50\nKPX Odieresis W -30\nKPX Odieresis X -60\nKPX Odieresis Y -70\nKPX Odieresis Yacute -70\nKPX Odieresis Ydieresis -70\nKPX Odieresis comma -40\nKPX Odieresis period -40\nKPX Ograve A -20\nKPX Ograve Aacute -20\nKPX Ograve Abreve -20\nKPX Ograve Acircumflex -20\nKPX Ograve Adieresis -20\nKPX Ograve Agrave -20\nKPX Ograve Amacron -20\nKPX Ograve Aogonek -20\nKPX Ograve Aring -20\nKPX Ograve Atilde -20\nKPX Ograve T -40\nKPX Ograve Tcaron -40\nKPX Ograve Tcommaaccent -40\nKPX Ograve V -50\nKPX Ograve W -30\nKPX Ograve X -60\nKPX Ograve Y -70\nKPX Ograve Yacute -70\nKPX Ograve Ydieresis -70\nKPX Ograve comma -40\nKPX Ograve period -40\nKPX Ohungarumlaut A -20\nKPX Ohungarumlaut Aacute -20\nKPX Ohungarumlaut Abreve -20\nKPX Ohungarumlaut Acircumflex -20\nKPX Ohungarumlaut Adieresis -20\nKPX Ohungarumlaut Agrave -20\nKPX Ohungarumlaut Amacron -20\nKPX Ohungarumlaut Aogonek -20\nKPX Ohungarumlaut Aring -20\nKPX Ohungarumlaut Atilde -20\nKPX Ohungarumlaut T -40\nKPX Ohungarumlaut Tcaron -40\nKPX Ohungarumlaut Tcommaaccent -40\nKPX Ohungarumlaut V -50\nKPX Ohungarumlaut W -30\nKPX Ohungarumlaut X -60\nKPX Ohungarumlaut Y -70\nKPX Ohungarumlaut Yacute -70\nKPX Ohungarumlaut Ydieresis -70\nKPX Ohungarumlaut comma -40\nKPX Ohungarumlaut period -40\nKPX Omacron A -20\nKPX Omacron Aacute -20\nKPX Omacron Abreve -20\nKPX Omacron Acircumflex -20\nKPX Omacron Adieresis -20\nKPX Omacron Agrave -20\nKPX Omacron Amacron -20\nKPX Omacron Aogonek -20\nKPX Omacron Aring -20\nKPX Omacron Atilde -20\nKPX Omacron T -40\nKPX Omacron Tcaron -40\nKPX Omacron Tcommaaccent -40\nKPX Omacron V -50\nKPX Omacron W -30\nKPX Omacron X -60\nKPX Omacron Y -70\nKPX Omacron Yacute -70\nKPX Omacron Ydieresis -70\nKPX Omacron comma -40\nKPX Omacron period -40\nKPX Oslash A -20\nKPX Oslash Aacute -20\nKPX Oslash Abreve -20\nKPX Oslash Acircumflex -20\nKPX Oslash Adieresis -20\nKPX Oslash Agrave -20\nKPX Oslash Amacron -20\nKPX Oslash Aogonek -20\nKPX Oslash Aring -20\nKPX Oslash Atilde -20\nKPX Oslash T -40\nKPX Oslash Tcaron -40\nKPX Oslash Tcommaaccent -40\nKPX Oslash V -50\nKPX Oslash W -30\nKPX Oslash X -60\nKPX Oslash Y -70\nKPX Oslash Yacute -70\nKPX Oslash Ydieresis -70\nKPX Oslash comma -40\nKPX Oslash period -40\nKPX Otilde A -20\nKPX Otilde Aacute -20\nKPX Otilde Abreve -20\nKPX Otilde Acircumflex -20\nKPX Otilde Adieresis -20\nKPX Otilde Agrave -20\nKPX Otilde Amacron -20\nKPX Otilde Aogonek -20\nKPX Otilde Aring -20\nKPX Otilde Atilde -20\nKPX Otilde T -40\nKPX Otilde Tcaron -40\nKPX Otilde Tcommaaccent -40\nKPX Otilde V -50\nKPX Otilde W -30\nKPX Otilde X -60\nKPX Otilde Y -70\nKPX Otilde Yacute -70\nKPX Otilde Ydieresis -70\nKPX Otilde comma -40\nKPX Otilde period -40\nKPX P A -120\nKPX P Aacute -120\nKPX P Abreve -120\nKPX P Acircumflex -120\nKPX P Adieresis -120\nKPX P Agrave -120\nKPX P Amacron -120\nKPX P Aogonek -120\nKPX P Aring -120\nKPX P Atilde -120\nKPX P a -40\nKPX P aacute -40\nKPX P abreve -40\nKPX P acircumflex -40\nKPX P adieresis -40\nKPX P agrave -40\nKPX P amacron -40\nKPX P aogonek -40\nKPX P aring -40\nKPX P atilde -40\nKPX P comma -180\nKPX P e -50\nKPX P eacute -50\nKPX P ecaron -50\nKPX P ecircumflex -50\nKPX P edieresis -50\nKPX P edotaccent -50\nKPX P egrave -50\nKPX P emacron -50\nKPX P eogonek -50\nKPX P o -50\nKPX P oacute -50\nKPX P ocircumflex -50\nKPX P odieresis -50\nKPX P ograve -50\nKPX P ohungarumlaut -50\nKPX P omacron -50\nKPX P oslash -50\nKPX P otilde -50\nKPX P period -180\nKPX Q U -10\nKPX Q Uacute -10\nKPX Q Ucircumflex -10\nKPX Q Udieresis -10\nKPX Q Ugrave -10\nKPX Q Uhungarumlaut -10\nKPX Q Umacron -10\nKPX Q Uogonek -10\nKPX Q Uring -10\nKPX R O -20\nKPX R Oacute -20\nKPX R Ocircumflex -20\nKPX R Odieresis -20\nKPX R Ograve -20\nKPX R Ohungarumlaut -20\nKPX R Omacron -20\nKPX R Oslash -20\nKPX R Otilde -20\nKPX R T -30\nKPX R Tcaron -30\nKPX R Tcommaaccent -30\nKPX R U -40\nKPX R Uacute -40\nKPX R Ucircumflex -40\nKPX R Udieresis -40\nKPX R Ugrave -40\nKPX R Uhungarumlaut -40\nKPX R Umacron -40\nKPX R Uogonek -40\nKPX R Uring -40\nKPX R V -50\nKPX R W -30\nKPX R Y -50\nKPX R Yacute -50\nKPX R Ydieresis -50\nKPX Racute O -20\nKPX Racute Oacute -20\nKPX Racute Ocircumflex -20\nKPX Racute Odieresis -20\nKPX Racute Ograve -20\nKPX Racute Ohungarumlaut -20\nKPX Racute Omacron -20\nKPX Racute Oslash -20\nKPX Racute Otilde -20\nKPX Racute T -30\nKPX Racute Tcaron -30\nKPX Racute Tcommaaccent -30\nKPX Racute U -40\nKPX Racute Uacute -40\nKPX Racute Ucircumflex -40\nKPX Racute Udieresis -40\nKPX Racute Ugrave -40\nKPX Racute Uhungarumlaut -40\nKPX Racute Umacron -40\nKPX Racute Uogonek -40\nKPX Racute Uring -40\nKPX Racute V -50\nKPX Racute W -30\nKPX Racute Y -50\nKPX Racute Yacute -50\nKPX Racute Ydieresis -50\nKPX Rcaron O -20\nKPX Rcaron Oacute -20\nKPX Rcaron Ocircumflex -20\nKPX Rcaron Odieresis -20\nKPX Rcaron Ograve -20\nKPX Rcaron Ohungarumlaut -20\nKPX Rcaron Omacron -20\nKPX Rcaron Oslash -20\nKPX Rcaron Otilde -20\nKPX Rcaron T -30\nKPX Rcaron Tcaron -30\nKPX Rcaron Tcommaaccent -30\nKPX Rcaron U -40\nKPX Rcaron Uacute -40\nKPX Rcaron Ucircumflex -40\nKPX Rcaron Udieresis -40\nKPX Rcaron Ugrave -40\nKPX Rcaron Uhungarumlaut -40\nKPX Rcaron Umacron -40\nKPX Rcaron Uogonek -40\nKPX Rcaron Uring -40\nKPX Rcaron V -50\nKPX Rcaron W -30\nKPX Rcaron Y -50\nKPX Rcaron Yacute -50\nKPX Rcaron Ydieresis -50\nKPX Rcommaaccent O -20\nKPX Rcommaaccent Oacute -20\nKPX Rcommaaccent Ocircumflex -20\nKPX Rcommaaccent Odieresis -20\nKPX Rcommaaccent Ograve -20\nKPX Rcommaaccent Ohungarumlaut -20\nKPX Rcommaaccent Omacron -20\nKPX Rcommaaccent Oslash -20\nKPX Rcommaaccent Otilde -20\nKPX Rcommaaccent T -30\nKPX Rcommaaccent Tcaron -30\nKPX Rcommaaccent Tcommaaccent -30\nKPX Rcommaaccent U -40\nKPX Rcommaaccent Uacute -40\nKPX Rcommaaccent Ucircumflex -40\nKPX Rcommaaccent Udieresis -40\nKPX Rcommaaccent Ugrave -40\nKPX Rcommaaccent Uhungarumlaut -40\nKPX Rcommaaccent Umacron -40\nKPX Rcommaaccent Uogonek -40\nKPX Rcommaaccent Uring -40\nKPX Rcommaaccent V -50\nKPX Rcommaaccent W -30\nKPX Rcommaaccent Y -50\nKPX Rcommaaccent Yacute -50\nKPX Rcommaaccent Ydieresis -50\nKPX S comma -20\nKPX S period -20\nKPX Sacute comma -20\nKPX Sacute period -20\nKPX Scaron comma -20\nKPX Scaron period -20\nKPX Scedilla comma -20\nKPX Scedilla period -20\nKPX Scommaaccent comma -20\nKPX Scommaaccent period -20\nKPX T A -120\nKPX T Aacute -120\nKPX T Abreve -120\nKPX T Acircumflex -120\nKPX T Adieresis -120\nKPX T Agrave -120\nKPX T Amacron -120\nKPX T Aogonek -120\nKPX T Aring -120\nKPX T Atilde -120\nKPX T O -40\nKPX T Oacute -40\nKPX T Ocircumflex -40\nKPX T Odieresis -40\nKPX T Ograve -40\nKPX T Ohungarumlaut -40\nKPX T Omacron -40\nKPX T Oslash -40\nKPX T Otilde -40\nKPX T a -120\nKPX T aacute -120\nKPX T abreve -60\nKPX T acircumflex -120\nKPX T adieresis -120\nKPX T agrave -120\nKPX T amacron -60\nKPX T aogonek -120\nKPX T aring -120\nKPX T atilde -60\nKPX T colon -20\nKPX T comma -120\nKPX T e -120\nKPX T eacute -120\nKPX T ecaron -120\nKPX T ecircumflex -120\nKPX T edieresis -120\nKPX T edotaccent -120\nKPX T egrave -60\nKPX T emacron -60\nKPX T eogonek -120\nKPX T hyphen -140\nKPX T o -120\nKPX T oacute -120\nKPX T ocircumflex -120\nKPX T odieresis -120\nKPX T ograve -120\nKPX T ohungarumlaut -120\nKPX T omacron -60\nKPX T oslash -120\nKPX T otilde -60\nKPX T period -120\nKPX T r -120\nKPX T racute -120\nKPX T rcaron -120\nKPX T rcommaaccent -120\nKPX T semicolon -20\nKPX T u -120\nKPX T uacute -120\nKPX T ucircumflex -120\nKPX T udieresis -120\nKPX T ugrave -120\nKPX T uhungarumlaut -120\nKPX T umacron -60\nKPX T uogonek -120\nKPX T uring -120\nKPX T w -120\nKPX T y -120\nKPX T yacute -120\nKPX T ydieresis -60\nKPX Tcaron A -120\nKPX Tcaron Aacute -120\nKPX Tcaron Abreve -120\nKPX Tcaron Acircumflex -120\nKPX Tcaron Adieresis -120\nKPX Tcaron Agrave -120\nKPX Tcaron Amacron -120\nKPX Tcaron Aogonek -120\nKPX Tcaron Aring -120\nKPX Tcaron Atilde -120\nKPX Tcaron O -40\nKPX Tcaron Oacute -40\nKPX Tcaron Ocircumflex -40\nKPX Tcaron Odieresis -40\nKPX Tcaron Ograve -40\nKPX Tcaron Ohungarumlaut -40\nKPX Tcaron Omacron -40\nKPX Tcaron Oslash -40\nKPX Tcaron Otilde -40\nKPX Tcaron a -120\nKPX Tcaron aacute -120\nKPX Tcaron abreve -60\nKPX Tcaron acircumflex -120\nKPX Tcaron adieresis -120\nKPX Tcaron agrave -120\nKPX Tcaron amacron -60\nKPX Tcaron aogonek -120\nKPX Tcaron aring -120\nKPX Tcaron atilde -60\nKPX Tcaron colon -20\nKPX Tcaron comma -120\nKPX Tcaron e -120\nKPX Tcaron eacute -120\nKPX Tcaron ecaron -120\nKPX Tcaron ecircumflex -120\nKPX Tcaron edieresis -120\nKPX Tcaron edotaccent -120\nKPX Tcaron egrave -60\nKPX Tcaron emacron -60\nKPX Tcaron eogonek -120\nKPX Tcaron hyphen -140\nKPX Tcaron o -120\nKPX Tcaron oacute -120\nKPX Tcaron ocircumflex -120\nKPX Tcaron odieresis -120\nKPX Tcaron ograve -120\nKPX Tcaron ohungarumlaut -120\nKPX Tcaron omacron -60\nKPX Tcaron oslash -120\nKPX Tcaron otilde -60\nKPX Tcaron period -120\nKPX Tcaron r -120\nKPX Tcaron racute -120\nKPX Tcaron rcaron -120\nKPX Tcaron rcommaaccent -120\nKPX Tcaron semicolon -20\nKPX Tcaron u -120\nKPX Tcaron uacute -120\nKPX Tcaron ucircumflex -120\nKPX Tcaron udieresis -120\nKPX Tcaron ugrave -120\nKPX Tcaron uhungarumlaut -120\nKPX Tcaron umacron -60\nKPX Tcaron uogonek -120\nKPX Tcaron uring -120\nKPX Tcaron w -120\nKPX Tcaron y -120\nKPX Tcaron yacute -120\nKPX Tcaron ydieresis -60\nKPX Tcommaaccent A -120\nKPX Tcommaaccent Aacute -120\nKPX Tcommaaccent Abreve -120\nKPX Tcommaaccent Acircumflex -120\nKPX Tcommaaccent Adieresis -120\nKPX Tcommaaccent Agrave -120\nKPX Tcommaaccent Amacron -120\nKPX Tcommaaccent Aogonek -120\nKPX Tcommaaccent Aring -120\nKPX Tcommaaccent Atilde -120\nKPX Tcommaaccent O -40\nKPX Tcommaaccent Oacute -40\nKPX Tcommaaccent Ocircumflex -40\nKPX Tcommaaccent Odieresis -40\nKPX Tcommaaccent Ograve -40\nKPX Tcommaaccent Ohungarumlaut -40\nKPX Tcommaaccent Omacron -40\nKPX Tcommaaccent Oslash -40\nKPX Tcommaaccent Otilde -40\nKPX Tcommaaccent a -120\nKPX Tcommaaccent aacute -120\nKPX Tcommaaccent abreve -60\nKPX Tcommaaccent acircumflex -120\nKPX Tcommaaccent adieresis -120\nKPX Tcommaaccent agrave -120\nKPX Tcommaaccent amacron -60\nKPX Tcommaaccent aogonek -120\nKPX Tcommaaccent aring -120\nKPX Tcommaaccent atilde -60\nKPX Tcommaaccent colon -20\nKPX Tcommaaccent comma -120\nKPX Tcommaaccent e -120\nKPX Tcommaaccent eacute -120\nKPX Tcommaaccent ecaron -120\nKPX Tcommaaccent ecircumflex -120\nKPX Tcommaaccent edieresis -120\nKPX Tcommaaccent edotaccent -120\nKPX Tcommaaccent egrave -60\nKPX Tcommaaccent emacron -60\nKPX Tcommaaccent eogonek -120\nKPX Tcommaaccent hyphen -140\nKPX Tcommaaccent o -120\nKPX Tcommaaccent oacute -120\nKPX Tcommaaccent ocircumflex -120\nKPX Tcommaaccent odieresis -120\nKPX Tcommaaccent ograve -120\nKPX Tcommaaccent ohungarumlaut -120\nKPX Tcommaaccent omacron -60\nKPX Tcommaaccent oslash -120\nKPX Tcommaaccent otilde -60\nKPX Tcommaaccent period -120\nKPX Tcommaaccent r -120\nKPX Tcommaaccent racute -120\nKPX Tcommaaccent rcaron -120\nKPX Tcommaaccent rcommaaccent -120\nKPX Tcommaaccent semicolon -20\nKPX Tcommaaccent u -120\nKPX Tcommaaccent uacute -120\nKPX Tcommaaccent ucircumflex -120\nKPX Tcommaaccent udieresis -120\nKPX Tcommaaccent ugrave -120\nKPX Tcommaaccent uhungarumlaut -120\nKPX Tcommaaccent umacron -60\nKPX Tcommaaccent uogonek -120\nKPX Tcommaaccent uring -120\nKPX Tcommaaccent w -120\nKPX Tcommaaccent y -120\nKPX Tcommaaccent yacute -120\nKPX Tcommaaccent ydieresis -60\nKPX U A -40\nKPX U Aacute -40\nKPX U Abreve -40\nKPX U Acircumflex -40\nKPX U Adieresis -40\nKPX U Agrave -40\nKPX U Amacron -40\nKPX U Aogonek -40\nKPX U Aring -40\nKPX U Atilde -40\nKPX U comma -40\nKPX U period -40\nKPX Uacute A -40\nKPX Uacute Aacute -40\nKPX Uacute Abreve -40\nKPX Uacute Acircumflex -40\nKPX Uacute Adieresis -40\nKPX Uacute Agrave -40\nKPX Uacute Amacron -40\nKPX Uacute Aogonek -40\nKPX Uacute Aring -40\nKPX Uacute Atilde -40\nKPX Uacute comma -40\nKPX Uacute period -40\nKPX Ucircumflex A -40\nKPX Ucircumflex Aacute -40\nKPX Ucircumflex Abreve -40\nKPX Ucircumflex Acircumflex -40\nKPX Ucircumflex Adieresis -40\nKPX Ucircumflex Agrave -40\nKPX Ucircumflex Amacron -40\nKPX Ucircumflex Aogonek -40\nKPX Ucircumflex Aring -40\nKPX Ucircumflex Atilde -40\nKPX Ucircumflex comma -40\nKPX Ucircumflex period -40\nKPX Udieresis A -40\nKPX Udieresis Aacute -40\nKPX Udieresis Abreve -40\nKPX Udieresis Acircumflex -40\nKPX Udieresis Adieresis -40\nKPX Udieresis Agrave -40\nKPX Udieresis Amacron -40\nKPX Udieresis Aogonek -40\nKPX Udieresis Aring -40\nKPX Udieresis Atilde -40\nKPX Udieresis comma -40\nKPX Udieresis period -40\nKPX Ugrave A -40\nKPX Ugrave Aacute -40\nKPX Ugrave Abreve -40\nKPX Ugrave Acircumflex -40\nKPX Ugrave Adieresis -40\nKPX Ugrave Agrave -40\nKPX Ugrave Amacron -40\nKPX Ugrave Aogonek -40\nKPX Ugrave Aring -40\nKPX Ugrave Atilde -40\nKPX Ugrave comma -40\nKPX Ugrave period -40\nKPX Uhungarumlaut A -40\nKPX Uhungarumlaut Aacute -40\nKPX Uhungarumlaut Abreve -40\nKPX Uhungarumlaut Acircumflex -40\nKPX Uhungarumlaut Adieresis -40\nKPX Uhungarumlaut Agrave -40\nKPX Uhungarumlaut Amacron -40\nKPX Uhungarumlaut Aogonek -40\nKPX Uhungarumlaut Aring -40\nKPX Uhungarumlaut Atilde -40\nKPX Uhungarumlaut comma -40\nKPX Uhungarumlaut period -40\nKPX Umacron A -40\nKPX Umacron Aacute -40\nKPX Umacron Abreve -40\nKPX Umacron Acircumflex -40\nKPX Umacron Adieresis -40\nKPX Umacron Agrave -40\nKPX Umacron Amacron -40\nKPX Umacron Aogonek -40\nKPX Umacron Aring -40\nKPX Umacron Atilde -40\nKPX Umacron comma -40\nKPX Umacron period -40\nKPX Uogonek A -40\nKPX Uogonek Aacute -40\nKPX Uogonek Abreve -40\nKPX Uogonek Acircumflex -40\nKPX Uogonek Adieresis -40\nKPX Uogonek Agrave -40\nKPX Uogonek Amacron -40\nKPX Uogonek Aogonek -40\nKPX Uogonek Aring -40\nKPX Uogonek Atilde -40\nKPX Uogonek comma -40\nKPX Uogonek period -40\nKPX Uring A -40\nKPX Uring Aacute -40\nKPX Uring Abreve -40\nKPX Uring Acircumflex -40\nKPX Uring Adieresis -40\nKPX Uring Agrave -40\nKPX Uring Amacron -40\nKPX Uring Aogonek -40\nKPX Uring Aring -40\nKPX Uring Atilde -40\nKPX Uring comma -40\nKPX Uring period -40\nKPX V A -80\nKPX V Aacute -80\nKPX V Abreve -80\nKPX V Acircumflex -80\nKPX V Adieresis -80\nKPX V Agrave -80\nKPX V Amacron -80\nKPX V Aogonek -80\nKPX V Aring -80\nKPX V Atilde -80\nKPX V G -40\nKPX V Gbreve -40\nKPX V Gcommaaccent -40\nKPX V O -40\nKPX V Oacute -40\nKPX V Ocircumflex -40\nKPX V Odieresis -40\nKPX V Ograve -40\nKPX V Ohungarumlaut -40\nKPX V Omacron -40\nKPX V Oslash -40\nKPX V Otilde -40\nKPX V a -70\nKPX V aacute -70\nKPX V abreve -70\nKPX V acircumflex -70\nKPX V adieresis -70\nKPX V agrave -70\nKPX V amacron -70\nKPX V aogonek -70\nKPX V aring -70\nKPX V atilde -70\nKPX V colon -40\nKPX V comma -125\nKPX V e -80\nKPX V eacute -80\nKPX V ecaron -80\nKPX V ecircumflex -80\nKPX V edieresis -80\nKPX V edotaccent -80\nKPX V egrave -80\nKPX V emacron -80\nKPX V eogonek -80\nKPX V hyphen -80\nKPX V o -80\nKPX V oacute -80\nKPX V ocircumflex -80\nKPX V odieresis -80\nKPX V ograve -80\nKPX V ohungarumlaut -80\nKPX V omacron -80\nKPX V oslash -80\nKPX V otilde -80\nKPX V period -125\nKPX V semicolon -40\nKPX V u -70\nKPX V uacute -70\nKPX V ucircumflex -70\nKPX V udieresis -70\nKPX V ugrave -70\nKPX V uhungarumlaut -70\nKPX V umacron -70\nKPX V uogonek -70\nKPX V uring -70\nKPX W A -50\nKPX W Aacute -50\nKPX W Abreve -50\nKPX W Acircumflex -50\nKPX W Adieresis -50\nKPX W Agrave -50\nKPX W Amacron -50\nKPX W Aogonek -50\nKPX W Aring -50\nKPX W Atilde -50\nKPX W O -20\nKPX W Oacute -20\nKPX W Ocircumflex -20\nKPX W Odieresis -20\nKPX W Ograve -20\nKPX W Ohungarumlaut -20\nKPX W Omacron -20\nKPX W Oslash -20\nKPX W Otilde -20\nKPX W a -40\nKPX W aacute -40\nKPX W abreve -40\nKPX W acircumflex -40\nKPX W adieresis -40\nKPX W agrave -40\nKPX W amacron -40\nKPX W aogonek -40\nKPX W aring -40\nKPX W atilde -40\nKPX W comma -80\nKPX W e -30\nKPX W eacute -30\nKPX W ecaron -30\nKPX W ecircumflex -30\nKPX W edieresis -30\nKPX W edotaccent -30\nKPX W egrave -30\nKPX W emacron -30\nKPX W eogonek -30\nKPX W hyphen -40\nKPX W o -30\nKPX W oacute -30\nKPX W ocircumflex -30\nKPX W odieresis -30\nKPX W ograve -30\nKPX W ohungarumlaut -30\nKPX W omacron -30\nKPX W oslash -30\nKPX W otilde -30\nKPX W period -80\nKPX W u -30\nKPX W uacute -30\nKPX W ucircumflex -30\nKPX W udieresis -30\nKPX W ugrave -30\nKPX W uhungarumlaut -30\nKPX W umacron -30\nKPX W uogonek -30\nKPX W uring -30\nKPX W y -20\nKPX W yacute -20\nKPX W ydieresis -20\nKPX Y A -110\nKPX Y Aacute -110\nKPX Y Abreve -110\nKPX Y Acircumflex -110\nKPX Y Adieresis -110\nKPX Y Agrave -110\nKPX Y Amacron -110\nKPX Y Aogonek -110\nKPX Y Aring -110\nKPX Y Atilde -110\nKPX Y O -85\nKPX Y Oacute -85\nKPX Y Ocircumflex -85\nKPX Y Odieresis -85\nKPX Y Ograve -85\nKPX Y Ohungarumlaut -85\nKPX Y Omacron -85\nKPX Y Oslash -85\nKPX Y Otilde -85\nKPX Y a -140\nKPX Y aacute -140\nKPX Y abreve -70\nKPX Y acircumflex -140\nKPX Y adieresis -140\nKPX Y agrave -140\nKPX Y amacron -70\nKPX Y aogonek -140\nKPX Y aring -140\nKPX Y atilde -140\nKPX Y colon -60\nKPX Y comma -140\nKPX Y e -140\nKPX Y eacute -140\nKPX Y ecaron -140\nKPX Y ecircumflex -140\nKPX Y edieresis -140\nKPX Y edotaccent -140\nKPX Y egrave -140\nKPX Y emacron -70\nKPX Y eogonek -140\nKPX Y hyphen -140\nKPX Y i -20\nKPX Y iacute -20\nKPX Y iogonek -20\nKPX Y o -140\nKPX Y oacute -140\nKPX Y ocircumflex -140\nKPX Y odieresis -140\nKPX Y ograve -140\nKPX Y ohungarumlaut -140\nKPX Y omacron -140\nKPX Y oslash -140\nKPX Y otilde -140\nKPX Y period -140\nKPX Y semicolon -60\nKPX Y u -110\nKPX Y uacute -110\nKPX Y ucircumflex -110\nKPX Y udieresis -110\nKPX Y ugrave -110\nKPX Y uhungarumlaut -110\nKPX Y umacron -110\nKPX Y uogonek -110\nKPX Y uring -110\nKPX Yacute A -110\nKPX Yacute Aacute -110\nKPX Yacute Abreve -110\nKPX Yacute Acircumflex -110\nKPX Yacute Adieresis -110\nKPX Yacute Agrave -110\nKPX Yacute Amacron -110\nKPX Yacute Aogonek -110\nKPX Yacute Aring -110\nKPX Yacute Atilde -110\nKPX Yacute O -85\nKPX Yacute Oacute -85\nKPX Yacute Ocircumflex -85\nKPX Yacute Odieresis -85\nKPX Yacute Ograve -85\nKPX Yacute Ohungarumlaut -85\nKPX Yacute Omacron -85\nKPX Yacute Oslash -85\nKPX Yacute Otilde -85\nKPX Yacute a -140\nKPX Yacute aacute -140\nKPX Yacute abreve -70\nKPX Yacute acircumflex -140\nKPX Yacute adieresis -140\nKPX Yacute agrave -140\nKPX Yacute amacron -70\nKPX Yacute aogonek -140\nKPX Yacute aring -140\nKPX Yacute atilde -70\nKPX Yacute colon -60\nKPX Yacute comma -140\nKPX Yacute e -140\nKPX Yacute eacute -140\nKPX Yacute ecaron -140\nKPX Yacute ecircumflex -140\nKPX Yacute edieresis -140\nKPX Yacute edotaccent -140\nKPX Yacute egrave -140\nKPX Yacute emacron -70\nKPX Yacute eogonek -140\nKPX Yacute hyphen -140\nKPX Yacute i -20\nKPX Yacute iacute -20\nKPX Yacute iogonek -20\nKPX Yacute o -140\nKPX Yacute oacute -140\nKPX Yacute ocircumflex -140\nKPX Yacute odieresis -140\nKPX Yacute ograve -140\nKPX Yacute ohungarumlaut -140\nKPX Yacute omacron -70\nKPX Yacute oslash -140\nKPX Yacute otilde -140\nKPX Yacute period -140\nKPX Yacute semicolon -60\nKPX Yacute u -110\nKPX Yacute uacute -110\nKPX Yacute ucircumflex -110\nKPX Yacute udieresis -110\nKPX Yacute ugrave -110\nKPX Yacute uhungarumlaut -110\nKPX Yacute umacron -110\nKPX Yacute uogonek -110\nKPX Yacute uring -110\nKPX Ydieresis A -110\nKPX Ydieresis Aacute -110\nKPX Ydieresis Abreve -110\nKPX Ydieresis Acircumflex -110\nKPX Ydieresis Adieresis -110\nKPX Ydieresis Agrave -110\nKPX Ydieresis Amacron -110\nKPX Ydieresis Aogonek -110\nKPX Ydieresis Aring -110\nKPX Ydieresis Atilde -110\nKPX Ydieresis O -85\nKPX Ydieresis Oacute -85\nKPX Ydieresis Ocircumflex -85\nKPX Ydieresis Odieresis -85\nKPX Ydieresis Ograve -85\nKPX Ydieresis Ohungarumlaut -85\nKPX Ydieresis Omacron -85\nKPX Ydieresis Oslash -85\nKPX Ydieresis Otilde -85\nKPX Ydieresis a -140\nKPX Ydieresis aacute -140\nKPX Ydieresis abreve -70\nKPX Ydieresis acircumflex -140\nKPX Ydieresis adieresis -140\nKPX Ydieresis agrave -140\nKPX Ydieresis amacron -70\nKPX Ydieresis aogonek -140\nKPX Ydieresis aring -140\nKPX Ydieresis atilde -70\nKPX Ydieresis colon -60\nKPX Ydieresis comma -140\nKPX Ydieresis e -140\nKPX Ydieresis eacute -140\nKPX Ydieresis ecaron -140\nKPX Ydieresis ecircumflex -140\nKPX Ydieresis edieresis -140\nKPX Ydieresis edotaccent -140\nKPX Ydieresis egrave -140\nKPX Ydieresis emacron -70\nKPX Ydieresis eogonek -140\nKPX Ydieresis hyphen -140\nKPX Ydieresis i -20\nKPX Ydieresis iacute -20\nKPX Ydieresis iogonek -20\nKPX Ydieresis o -140\nKPX Ydieresis oacute -140\nKPX Ydieresis ocircumflex -140\nKPX Ydieresis odieresis -140\nKPX Ydieresis ograve -140\nKPX Ydieresis ohungarumlaut -140\nKPX Ydieresis omacron -140\nKPX Ydieresis oslash -140\nKPX Ydieresis otilde -140\nKPX Ydieresis period -140\nKPX Ydieresis semicolon -60\nKPX Ydieresis u -110\nKPX Ydieresis uacute -110\nKPX Ydieresis ucircumflex -110\nKPX Ydieresis udieresis -110\nKPX Ydieresis ugrave -110\nKPX Ydieresis uhungarumlaut -110\nKPX Ydieresis umacron -110\nKPX Ydieresis uogonek -110\nKPX Ydieresis uring -110\nKPX a v -20\nKPX a w -20\nKPX a y -30\nKPX a yacute -30\nKPX a ydieresis -30\nKPX aacute v -20\nKPX aacute w -20\nKPX aacute y -30\nKPX aacute yacute -30\nKPX aacute ydieresis -30\nKPX abreve v -20\nKPX abreve w -20\nKPX abreve y -30\nKPX abreve yacute -30\nKPX abreve ydieresis -30\nKPX acircumflex v -20\nKPX acircumflex w -20\nKPX acircumflex y -30\nKPX acircumflex yacute -30\nKPX acircumflex ydieresis -30\nKPX adieresis v -20\nKPX adieresis w -20\nKPX adieresis y -30\nKPX adieresis yacute -30\nKPX adieresis ydieresis -30\nKPX agrave v -20\nKPX agrave w -20\nKPX agrave y -30\nKPX agrave yacute -30\nKPX agrave ydieresis -30\nKPX amacron v -20\nKPX amacron w -20\nKPX amacron y -30\nKPX amacron yacute -30\nKPX amacron ydieresis -30\nKPX aogonek v -20\nKPX aogonek w -20\nKPX aogonek y -30\nKPX aogonek yacute -30\nKPX aogonek ydieresis -30\nKPX aring v -20\nKPX aring w -20\nKPX aring y -30\nKPX aring yacute -30\nKPX aring ydieresis -30\nKPX atilde v -20\nKPX atilde w -20\nKPX atilde y -30\nKPX atilde yacute -30\nKPX atilde ydieresis -30\nKPX b b -10\nKPX b comma -40\nKPX b l -20\nKPX b lacute -20\nKPX b lcommaaccent -20\nKPX b lslash -20\nKPX b period -40\nKPX b u -20\nKPX b uacute -20\nKPX b ucircumflex -20\nKPX b udieresis -20\nKPX b ugrave -20\nKPX b uhungarumlaut -20\nKPX b umacron -20\nKPX b uogonek -20\nKPX b uring -20\nKPX b v -20\nKPX b y -20\nKPX b yacute -20\nKPX b ydieresis -20\nKPX c comma -15\nKPX c k -20\nKPX c kcommaaccent -20\nKPX cacute comma -15\nKPX cacute k -20\nKPX cacute kcommaaccent -20\nKPX ccaron comma -15\nKPX ccaron k -20\nKPX ccaron kcommaaccent -20\nKPX ccedilla comma -15\nKPX ccedilla k -20\nKPX ccedilla kcommaaccent -20\nKPX colon space -50\nKPX comma quotedblright -100\nKPX comma quoteright -100\nKPX e comma -15\nKPX e period -15\nKPX e v -30\nKPX e w -20\nKPX e x -30\nKPX e y -20\nKPX e yacute -20\nKPX e ydieresis -20\nKPX eacute comma -15\nKPX eacute period -15\nKPX eacute v -30\nKPX eacute w -20\nKPX eacute x -30\nKPX eacute y -20\nKPX eacute yacute -20\nKPX eacute ydieresis -20\nKPX ecaron comma -15\nKPX ecaron period -15\nKPX ecaron v -30\nKPX ecaron w -20\nKPX ecaron x -30\nKPX ecaron y -20\nKPX ecaron yacute -20\nKPX ecaron ydieresis -20\nKPX ecircumflex comma -15\nKPX ecircumflex period -15\nKPX ecircumflex v -30\nKPX ecircumflex w -20\nKPX ecircumflex x -30\nKPX ecircumflex y -20\nKPX ecircumflex yacute -20\nKPX ecircumflex ydieresis -20\nKPX edieresis comma -15\nKPX edieresis period -15\nKPX edieresis v -30\nKPX edieresis w -20\nKPX edieresis x -30\nKPX edieresis y -20\nKPX edieresis yacute -20\nKPX edieresis ydieresis -20\nKPX edotaccent comma -15\nKPX edotaccent period -15\nKPX edotaccent v -30\nKPX edotaccent w -20\nKPX edotaccent x -30\nKPX edotaccent y -20\nKPX edotaccent yacute -20\nKPX edotaccent ydieresis -20\nKPX egrave comma -15\nKPX egrave period -15\nKPX egrave v -30\nKPX egrave w -20\nKPX egrave x -30\nKPX egrave y -20\nKPX egrave yacute -20\nKPX egrave ydieresis -20\nKPX emacron comma -15\nKPX emacron period -15\nKPX emacron v -30\nKPX emacron w -20\nKPX emacron x -30\nKPX emacron y -20\nKPX emacron yacute -20\nKPX emacron ydieresis -20\nKPX eogonek comma -15\nKPX eogonek period -15\nKPX eogonek v -30\nKPX eogonek w -20\nKPX eogonek x -30\nKPX eogonek y -20\nKPX eogonek yacute -20\nKPX eogonek ydieresis -20\nKPX f a -30\nKPX f aacute -30\nKPX f abreve -30\nKPX f acircumflex -30\nKPX f adieresis -30\nKPX f agrave -30\nKPX f amacron -30\nKPX f aogonek -30\nKPX f aring -30\nKPX f atilde -30\nKPX f comma -30\nKPX f dotlessi -28\nKPX f e -30\nKPX f eacute -30\nKPX f ecaron -30\nKPX f ecircumflex -30\nKPX f edieresis -30\nKPX f edotaccent -30\nKPX f egrave -30\nKPX f emacron -30\nKPX f eogonek -30\nKPX f o -30\nKPX f oacute -30\nKPX f ocircumflex -30\nKPX f odieresis -30\nKPX f ograve -30\nKPX f ohungarumlaut -30\nKPX f omacron -30\nKPX f oslash -30\nKPX f otilde -30\nKPX f period -30\nKPX f quotedblright 60\nKPX f quoteright 50\nKPX g r -10\nKPX g racute -10\nKPX g rcaron -10\nKPX g rcommaaccent -10\nKPX gbreve r -10\nKPX gbreve racute -10\nKPX gbreve rcaron -10\nKPX gbreve rcommaaccent -10\nKPX gcommaaccent r -10\nKPX gcommaaccent racute -10\nKPX gcommaaccent rcaron -10\nKPX gcommaaccent rcommaaccent -10\nKPX h y -30\nKPX h yacute -30\nKPX h ydieresis -30\nKPX k e -20\nKPX k eacute -20\nKPX k ecaron -20\nKPX k ecircumflex -20\nKPX k edieresis -20\nKPX k edotaccent -20\nKPX k egrave -20\nKPX k emacron -20\nKPX k eogonek -20\nKPX k o -20\nKPX k oacute -20\nKPX k ocircumflex -20\nKPX k odieresis -20\nKPX k ograve -20\nKPX k ohungarumlaut -20\nKPX k omacron -20\nKPX k oslash -20\nKPX k otilde -20\nKPX kcommaaccent e -20\nKPX kcommaaccent eacute -20\nKPX kcommaaccent ecaron -20\nKPX kcommaaccent ecircumflex -20\nKPX kcommaaccent edieresis -20\nKPX kcommaaccent edotaccent -20\nKPX kcommaaccent egrave -20\nKPX kcommaaccent emacron -20\nKPX kcommaaccent eogonek -20\nKPX kcommaaccent o -20\nKPX kcommaaccent oacute -20\nKPX kcommaaccent ocircumflex -20\nKPX kcommaaccent odieresis -20\nKPX kcommaaccent ograve -20\nKPX kcommaaccent ohungarumlaut -20\nKPX kcommaaccent omacron -20\nKPX kcommaaccent oslash -20\nKPX kcommaaccent otilde -20\nKPX m u -10\nKPX m uacute -10\nKPX m ucircumflex -10\nKPX m udieresis -10\nKPX m ugrave -10\nKPX m uhungarumlaut -10\nKPX m umacron -10\nKPX m uogonek -10\nKPX m uring -10\nKPX m y -15\nKPX m yacute -15\nKPX m ydieresis -15\nKPX n u -10\nKPX n uacute -10\nKPX n ucircumflex -10\nKPX n udieresis -10\nKPX n ugrave -10\nKPX n uhungarumlaut -10\nKPX n umacron -10\nKPX n uogonek -10\nKPX n uring -10\nKPX n v -20\nKPX n y -15\nKPX n yacute -15\nKPX n ydieresis -15\nKPX nacute u -10\nKPX nacute uacute -10\nKPX nacute ucircumflex -10\nKPX nacute udieresis -10\nKPX nacute ugrave -10\nKPX nacute uhungarumlaut -10\nKPX nacute umacron -10\nKPX nacute uogonek -10\nKPX nacute uring -10\nKPX nacute v -20\nKPX nacute y -15\nKPX nacute yacute -15\nKPX nacute ydieresis -15\nKPX ncaron u -10\nKPX ncaron uacute -10\nKPX ncaron ucircumflex -10\nKPX ncaron udieresis -10\nKPX ncaron ugrave -10\nKPX ncaron uhungarumlaut -10\nKPX ncaron umacron -10\nKPX ncaron uogonek -10\nKPX ncaron uring -10\nKPX ncaron v -20\nKPX ncaron y -15\nKPX ncaron yacute -15\nKPX ncaron ydieresis -15\nKPX ncommaaccent u -10\nKPX ncommaaccent uacute -10\nKPX ncommaaccent ucircumflex -10\nKPX ncommaaccent udieresis -10\nKPX ncommaaccent ugrave -10\nKPX ncommaaccent uhungarumlaut -10\nKPX ncommaaccent umacron -10\nKPX ncommaaccent uogonek -10\nKPX ncommaaccent uring -10\nKPX ncommaaccent v -20\nKPX ncommaaccent y -15\nKPX ncommaaccent yacute -15\nKPX ncommaaccent ydieresis -15\nKPX ntilde u -10\nKPX ntilde uacute -10\nKPX ntilde ucircumflex -10\nKPX ntilde udieresis -10\nKPX ntilde ugrave -10\nKPX ntilde uhungarumlaut -10\nKPX ntilde umacron -10\nKPX ntilde uogonek -10\nKPX ntilde uring -10\nKPX ntilde v -20\nKPX ntilde y -15\nKPX ntilde yacute -15\nKPX ntilde ydieresis -15\nKPX o comma -40\nKPX o period -40\nKPX o v -15\nKPX o w -15\nKPX o x -30\nKPX o y -30\nKPX o yacute -30\nKPX o ydieresis -30\nKPX oacute comma -40\nKPX oacute period -40\nKPX oacute v -15\nKPX oacute w -15\nKPX oacute x -30\nKPX oacute y -30\nKPX oacute yacute -30\nKPX oacute ydieresis -30\nKPX ocircumflex comma -40\nKPX ocircumflex period -40\nKPX ocircumflex v -15\nKPX ocircumflex w -15\nKPX ocircumflex x -30\nKPX ocircumflex y -30\nKPX ocircumflex yacute -30\nKPX ocircumflex ydieresis -30\nKPX odieresis comma -40\nKPX odieresis period -40\nKPX odieresis v -15\nKPX odieresis w -15\nKPX odieresis x -30\nKPX odieresis y -30\nKPX odieresis yacute -30\nKPX odieresis ydieresis -30\nKPX ograve comma -40\nKPX ograve period -40\nKPX ograve v -15\nKPX ograve w -15\nKPX ograve x -30\nKPX ograve y -30\nKPX ograve yacute -30\nKPX ograve ydieresis -30\nKPX ohungarumlaut comma -40\nKPX ohungarumlaut period -40\nKPX ohungarumlaut v -15\nKPX ohungarumlaut w -15\nKPX ohungarumlaut x -30\nKPX ohungarumlaut y -30\nKPX ohungarumlaut yacute -30\nKPX ohungarumlaut ydieresis -30\nKPX omacron comma -40\nKPX omacron period -40\nKPX omacron v -15\nKPX omacron w -15\nKPX omacron x -30\nKPX omacron y -30\nKPX omacron yacute -30\nKPX omacron ydieresis -30\nKPX oslash a -55\nKPX oslash aacute -55\nKPX oslash abreve -55\nKPX oslash acircumflex -55\nKPX oslash adieresis -55\nKPX oslash agrave -55\nKPX oslash amacron -55\nKPX oslash aogonek -55\nKPX oslash aring -55\nKPX oslash atilde -55\nKPX oslash b -55\nKPX oslash c -55\nKPX oslash cacute -55\nKPX oslash ccaron -55\nKPX oslash ccedilla -55\nKPX oslash comma -95\nKPX oslash d -55\nKPX oslash dcroat -55\nKPX oslash e -55\nKPX oslash eacute -55\nKPX oslash ecaron -55\nKPX oslash ecircumflex -55\nKPX oslash edieresis -55\nKPX oslash edotaccent -55\nKPX oslash egrave -55\nKPX oslash emacron -55\nKPX oslash eogonek -55\nKPX oslash f -55\nKPX oslash g -55\nKPX oslash gbreve -55\nKPX oslash gcommaaccent -55\nKPX oslash h -55\nKPX oslash i -55\nKPX oslash iacute -55\nKPX oslash icircumflex -55\nKPX oslash idieresis -55\nKPX oslash igrave -55\nKPX oslash imacron -55\nKPX oslash iogonek -55\nKPX oslash j -55\nKPX oslash k -55\nKPX oslash kcommaaccent -55\nKPX oslash l -55\nKPX oslash lacute -55\nKPX oslash lcommaaccent -55\nKPX oslash lslash -55\nKPX oslash m -55\nKPX oslash n -55\nKPX oslash nacute -55\nKPX oslash ncaron -55\nKPX oslash ncommaaccent -55\nKPX oslash ntilde -55\nKPX oslash o -55\nKPX oslash oacute -55\nKPX oslash ocircumflex -55\nKPX oslash odieresis -55\nKPX oslash ograve -55\nKPX oslash ohungarumlaut -55\nKPX oslash omacron -55\nKPX oslash oslash -55\nKPX oslash otilde -55\nKPX oslash p -55\nKPX oslash period -95\nKPX oslash q -55\nKPX oslash r -55\nKPX oslash racute -55\nKPX oslash rcaron -55\nKPX oslash rcommaaccent -55\nKPX oslash s -55\nKPX oslash sacute -55\nKPX oslash scaron -55\nKPX oslash scedilla -55\nKPX oslash scommaaccent -55\nKPX oslash t -55\nKPX oslash tcommaaccent -55\nKPX oslash u -55\nKPX oslash uacute -55\nKPX oslash ucircumflex -55\nKPX oslash udieresis -55\nKPX oslash ugrave -55\nKPX oslash uhungarumlaut -55\nKPX oslash umacron -55\nKPX oslash uogonek -55\nKPX oslash uring -55\nKPX oslash v -70\nKPX oslash w -70\nKPX oslash x -85\nKPX oslash y -70\nKPX oslash yacute -70\nKPX oslash ydieresis -70\nKPX oslash z -55\nKPX oslash zacute -55\nKPX oslash zcaron -55\nKPX oslash zdotaccent -55\nKPX otilde comma -40\nKPX otilde period -40\nKPX otilde v -15\nKPX otilde w -15\nKPX otilde x -30\nKPX otilde y -30\nKPX otilde yacute -30\nKPX otilde ydieresis -30\nKPX p comma -35\nKPX p period -35\nKPX p y -30\nKPX p yacute -30\nKPX p ydieresis -30\nKPX period quotedblright -100\nKPX period quoteright -100\nKPX period space -60\nKPX quotedblright space -40\nKPX quoteleft quoteleft -57\nKPX quoteright d -50\nKPX quoteright dcroat -50\nKPX quoteright quoteright -57\nKPX quoteright r -50\nKPX quoteright racute -50\nKPX quoteright rcaron -50\nKPX quoteright rcommaaccent -50\nKPX quoteright s -50\nKPX quoteright sacute -50\nKPX quoteright scaron -50\nKPX quoteright scedilla -50\nKPX quoteright scommaaccent -50\nKPX quoteright space -70\nKPX r a -10\nKPX r aacute -10\nKPX r abreve -10\nKPX r acircumflex -10\nKPX r adieresis -10\nKPX r agrave -10\nKPX r amacron -10\nKPX r aogonek -10\nKPX r aring -10\nKPX r atilde -10\nKPX r colon 30\nKPX r comma -50\nKPX r i 15\nKPX r iacute 15\nKPX r icircumflex 15\nKPX r idieresis 15\nKPX r igrave 15\nKPX r imacron 15\nKPX r iogonek 15\nKPX r k 15\nKPX r kcommaaccent 15\nKPX r l 15\nKPX r lacute 15\nKPX r lcommaaccent 15\nKPX r lslash 15\nKPX r m 25\nKPX r n 25\nKPX r nacute 25\nKPX r ncaron 25\nKPX r ncommaaccent 25\nKPX r ntilde 25\nKPX r p 30\nKPX r period -50\nKPX r semicolon 30\nKPX r t 40\nKPX r tcommaaccent 40\nKPX r u 15\nKPX r uacute 15\nKPX r ucircumflex 15\nKPX r udieresis 15\nKPX r ugrave 15\nKPX r uhungarumlaut 15\nKPX r umacron 15\nKPX r uogonek 15\nKPX r uring 15\nKPX r v 30\nKPX r y 30\nKPX r yacute 30\nKPX r ydieresis 30\nKPX racute a -10\nKPX racute aacute -10\nKPX racute abreve -10\nKPX racute acircumflex -10\nKPX racute adieresis -10\nKPX racute agrave -10\nKPX racute amacron -10\nKPX racute aogonek -10\nKPX racute aring -10\nKPX racute atilde -10\nKPX racute colon 30\nKPX racute comma -50\nKPX racute i 15\nKPX racute iacute 15\nKPX racute icircumflex 15\nKPX racute idieresis 15\nKPX racute igrave 15\nKPX racute imacron 15\nKPX racute iogonek 15\nKPX racute k 15\nKPX racute kcommaaccent 15\nKPX racute l 15\nKPX racute lacute 15\nKPX racute lcommaaccent 15\nKPX racute lslash 15\nKPX racute m 25\nKPX racute n 25\nKPX racute nacute 25\nKPX racute ncaron 25\nKPX racute ncommaaccent 25\nKPX racute ntilde 25\nKPX racute p 30\nKPX racute period -50\nKPX racute semicolon 30\nKPX racute t 40\nKPX racute tcommaaccent 40\nKPX racute u 15\nKPX racute uacute 15\nKPX racute ucircumflex 15\nKPX racute udieresis 15\nKPX racute ugrave 15\nKPX racute uhungarumlaut 15\nKPX racute umacron 15\nKPX racute uogonek 15\nKPX racute uring 15\nKPX racute v 30\nKPX racute y 30\nKPX racute yacute 30\nKPX racute ydieresis 30\nKPX rcaron a -10\nKPX rcaron aacute -10\nKPX rcaron abreve -10\nKPX rcaron acircumflex -10\nKPX rcaron adieresis -10\nKPX rcaron agrave -10\nKPX rcaron amacron -10\nKPX rcaron aogonek -10\nKPX rcaron aring -10\nKPX rcaron atilde -10\nKPX rcaron colon 30\nKPX rcaron comma -50\nKPX rcaron i 15\nKPX rcaron iacute 15\nKPX rcaron icircumflex 15\nKPX rcaron idieresis 15\nKPX rcaron igrave 15\nKPX rcaron imacron 15\nKPX rcaron iogonek 15\nKPX rcaron k 15\nKPX rcaron kcommaaccent 15\nKPX rcaron l 15\nKPX rcaron lacute 15\nKPX rcaron lcommaaccent 15\nKPX rcaron lslash 15\nKPX rcaron m 25\nKPX rcaron n 25\nKPX rcaron nacute 25\nKPX rcaron ncaron 25\nKPX rcaron ncommaaccent 25\nKPX rcaron ntilde 25\nKPX rcaron p 30\nKPX rcaron period -50\nKPX rcaron semicolon 30\nKPX rcaron t 40\nKPX rcaron tcommaaccent 40\nKPX rcaron u 15\nKPX rcaron uacute 15\nKPX rcaron ucircumflex 15\nKPX rcaron udieresis 15\nKPX rcaron ugrave 15\nKPX rcaron uhungarumlaut 15\nKPX rcaron umacron 15\nKPX rcaron uogonek 15\nKPX rcaron uring 15\nKPX rcaron v 30\nKPX rcaron y 30\nKPX rcaron yacute 30\nKPX rcaron ydieresis 30\nKPX rcommaaccent a -10\nKPX rcommaaccent aacute -10\nKPX rcommaaccent abreve -10\nKPX rcommaaccent acircumflex -10\nKPX rcommaaccent adieresis -10\nKPX rcommaaccent agrave -10\nKPX rcommaaccent amacron -10\nKPX rcommaaccent aogonek -10\nKPX rcommaaccent aring -10\nKPX rcommaaccent atilde -10\nKPX rcommaaccent colon 30\nKPX rcommaaccent comma -50\nKPX rcommaaccent i 15\nKPX rcommaaccent iacute 15\nKPX rcommaaccent icircumflex 15\nKPX rcommaaccent idieresis 15\nKPX rcommaaccent igrave 15\nKPX rcommaaccent imacron 15\nKPX rcommaaccent iogonek 15\nKPX rcommaaccent k 15\nKPX rcommaaccent kcommaaccent 15\nKPX rcommaaccent l 15\nKPX rcommaaccent lacute 15\nKPX rcommaaccent lcommaaccent 15\nKPX rcommaaccent lslash 15\nKPX rcommaaccent m 25\nKPX rcommaaccent n 25\nKPX rcommaaccent nacute 25\nKPX rcommaaccent ncaron 25\nKPX rcommaaccent ncommaaccent 25\nKPX rcommaaccent ntilde 25\nKPX rcommaaccent p 30\nKPX rcommaaccent period -50\nKPX rcommaaccent semicolon 30\nKPX rcommaaccent t 40\nKPX rcommaaccent tcommaaccent 40\nKPX rcommaaccent u 15\nKPX rcommaaccent uacute 15\nKPX rcommaaccent ucircumflex 15\nKPX rcommaaccent udieresis 15\nKPX rcommaaccent ugrave 15\nKPX rcommaaccent uhungarumlaut 15\nKPX rcommaaccent umacron 15\nKPX rcommaaccent uogonek 15\nKPX rcommaaccent uring 15\nKPX rcommaaccent v 30\nKPX rcommaaccent y 30\nKPX rcommaaccent yacute 30\nKPX rcommaaccent ydieresis 30\nKPX s comma -15\nKPX s period -15\nKPX s w -30\nKPX sacute comma -15\nKPX sacute period -15\nKPX sacute w -30\nKPX scaron comma -15\nKPX scaron period -15\nKPX scaron w -30\nKPX scedilla comma -15\nKPX scedilla period -15\nKPX scedilla w -30\nKPX scommaaccent comma -15\nKPX scommaaccent period -15\nKPX scommaaccent w -30\nKPX semicolon space -50\nKPX space T -50\nKPX space Tcaron -50\nKPX space Tcommaaccent -50\nKPX space V -50\nKPX space W -40\nKPX space Y -90\nKPX space Yacute -90\nKPX space Ydieresis -90\nKPX space quotedblleft -30\nKPX space quoteleft -60\nKPX v a -25\nKPX v aacute -25\nKPX v abreve -25\nKPX v acircumflex -25\nKPX v adieresis -25\nKPX v agrave -25\nKPX v amacron -25\nKPX v aogonek -25\nKPX v aring -25\nKPX v atilde -25\nKPX v comma -80\nKPX v e -25\nKPX v eacute -25\nKPX v ecaron -25\nKPX v ecircumflex -25\nKPX v edieresis -25\nKPX v edotaccent -25\nKPX v egrave -25\nKPX v emacron -25\nKPX v eogonek -25\nKPX v o -25\nKPX v oacute -25\nKPX v ocircumflex -25\nKPX v odieresis -25\nKPX v ograve -25\nKPX v ohungarumlaut -25\nKPX v omacron -25\nKPX v oslash -25\nKPX v otilde -25\nKPX v period -80\nKPX w a -15\nKPX w aacute -15\nKPX w abreve -15\nKPX w acircumflex -15\nKPX w adieresis -15\nKPX w agrave -15\nKPX w amacron -15\nKPX w aogonek -15\nKPX w aring -15\nKPX w atilde -15\nKPX w comma -60\nKPX w e -10\nKPX w eacute -10\nKPX w ecaron -10\nKPX w ecircumflex -10\nKPX w edieresis -10\nKPX w edotaccent -10\nKPX w egrave -10\nKPX w emacron -10\nKPX w eogonek -10\nKPX w o -10\nKPX w oacute -10\nKPX w ocircumflex -10\nKPX w odieresis -10\nKPX w ograve -10\nKPX w ohungarumlaut -10\nKPX w omacron -10\nKPX w oslash -10\nKPX w otilde -10\nKPX w period -60\nKPX x e -30\nKPX x eacute -30\nKPX x ecaron -30\nKPX x ecircumflex -30\nKPX x edieresis -30\nKPX x edotaccent -30\nKPX x egrave -30\nKPX x emacron -30\nKPX x eogonek -30\nKPX y a -20\nKPX y aacute -20\nKPX y abreve -20\nKPX y acircumflex -20\nKPX y adieresis -20\nKPX y agrave -20\nKPX y amacron -20\nKPX y aogonek -20\nKPX y aring -20\nKPX y atilde -20\nKPX y comma -100\nKPX y e -20\nKPX y eacute -20\nKPX y ecaron -20\nKPX y ecircumflex -20\nKPX y edieresis -20\nKPX y edotaccent -20\nKPX y egrave -20\nKPX y emacron -20\nKPX y eogonek -20\nKPX y o -20\nKPX y oacute -20\nKPX y ocircumflex -20\nKPX y odieresis -20\nKPX y ograve -20\nKPX y ohungarumlaut -20\nKPX y omacron -20\nKPX y oslash -20\nKPX y otilde -20\nKPX y period -100\nKPX yacute a -20\nKPX yacute aacute -20\nKPX yacute abreve -20\nKPX yacute acircumflex -20\nKPX yacute adieresis -20\nKPX yacute agrave -20\nKPX yacute amacron -20\nKPX yacute aogonek -20\nKPX yacute aring -20\nKPX yacute atilde -20\nKPX yacute comma -100\nKPX yacute e -20\nKPX yacute eacute -20\nKPX yacute ecaron -20\nKPX yacute ecircumflex -20\nKPX yacute edieresis -20\nKPX yacute edotaccent -20\nKPX yacute egrave -20\nKPX yacute emacron -20\nKPX yacute eogonek -20\nKPX yacute o -20\nKPX yacute oacute -20\nKPX yacute ocircumflex -20\nKPX yacute odieresis -20\nKPX yacute ograve -20\nKPX yacute ohungarumlaut -20\nKPX yacute omacron -20\nKPX yacute oslash -20\nKPX yacute otilde -20\nKPX yacute period -100\nKPX ydieresis a -20\nKPX ydieresis aacute -20\nKPX ydieresis abreve -20\nKPX ydieresis acircumflex -20\nKPX ydieresis adieresis -20\nKPX ydieresis agrave -20\nKPX ydieresis amacron -20\nKPX ydieresis aogonek -20\nKPX ydieresis aring -20\nKPX ydieresis atilde -20\nKPX ydieresis comma -100\nKPX ydieresis e -20\nKPX ydieresis eacute -20\nKPX ydieresis ecaron -20\nKPX ydieresis ecircumflex -20\nKPX ydieresis edieresis -20\nKPX ydieresis edotaccent -20\nKPX ydieresis egrave -20\nKPX ydieresis emacron -20\nKPX ydieresis eogonek -20\nKPX ydieresis o -20\nKPX ydieresis oacute -20\nKPX ydieresis ocircumflex -20\nKPX ydieresis odieresis -20\nKPX ydieresis ograve -20\nKPX ydieresis ohungarumlaut -20\nKPX ydieresis omacron -20\nKPX ydieresis oslash -20\nKPX ydieresis otilde -20\nKPX ydieresis period -100\nKPX z e -15\nKPX z eacute -15\nKPX z ecaron -15\nKPX z ecircumflex -15\nKPX z edieresis -15\nKPX z edotaccent -15\nKPX z egrave -15\nKPX z emacron -15\nKPX z eogonek -15\nKPX z o -15\nKPX z oacute -15\nKPX z ocircumflex -15\nKPX z odieresis -15\nKPX z ograve -15\nKPX z ohungarumlaut -15\nKPX z omacron -15\nKPX z oslash -15\nKPX z otilde -15\nKPX zacute e -15\nKPX zacute eacute -15\nKPX zacute ecaron -15\nKPX zacute ecircumflex -15\nKPX zacute edieresis -15\nKPX zacute edotaccent -15\nKPX zacute egrave -15\nKPX zacute emacron -15\nKPX zacute eogonek -15\nKPX zacute o -15\nKPX zacute oacute -15\nKPX zacute ocircumflex -15\nKPX zacute odieresis -15\nKPX zacute ograve -15\nKPX zacute ohungarumlaut -15\nKPX zacute omacron -15\nKPX zacute oslash -15\nKPX zacute otilde -15\nKPX zcaron e -15\nKPX zcaron eacute -15\nKPX zcaron ecaron -15\nKPX zcaron ecircumflex -15\nKPX zcaron edieresis -15\nKPX zcaron edotaccent -15\nKPX zcaron egrave -15\nKPX zcaron emacron -15\nKPX zcaron eogonek -15\nKPX zcaron o -15\nKPX zcaron oacute -15\nKPX zcaron ocircumflex -15\nKPX zcaron odieresis -15\nKPX zcaron ograve -15\nKPX zcaron ohungarumlaut -15\nKPX zcaron omacron -15\nKPX zcaron oslash -15\nKPX zcaron otilde -15\nKPX zdotaccent e -15\nKPX zdotaccent eacute -15\nKPX zdotaccent ecaron -15\nKPX zdotaccent ecircumflex -15\nKPX zdotaccent edieresis -15\nKPX zdotaccent edotaccent -15\nKPX zdotaccent egrave -15\nKPX zdotaccent emacron -15\nKPX zdotaccent eogonek -15\nKPX zdotaccent o -15\nKPX zdotaccent oacute -15\nKPX zdotaccent ocircumflex -15\nKPX zdotaccent odieresis -15\nKPX zdotaccent ograve -15\nKPX zdotaccent ohungarumlaut -15\nKPX zdotaccent omacron -15\nKPX zdotaccent oslash -15\nKPX zdotaccent otilde -15\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/pdfcorefonts/Symbol.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved.\nComment Creation Date: Thu May  1 15:12:25 1997\nComment UniqueID 43064\nComment VMusage 30820 39997\nFontName Symbol\nFullName Symbol\nFamilyName Symbol\nWeight Medium\nItalicAngle 0\nIsFixedPitch false\nCharacterSet Special\nFontBBox -180 -293 1090 1010 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 001.008\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved.\nEncodingScheme FontSpecific\nStdHW 92\nStdVW 85\nStartCharMetrics 190\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 128 -17 240 672 ;\nC 34 ; WX 713 ; N universal ; B 31 0 681 705 ;\nC 35 ; WX 500 ; N numbersign ; B 20 -16 481 673 ;\nC 36 ; WX 549 ; N existential ; B 25 0 478 707 ;\nC 37 ; WX 833 ; N percent ; B 63 -36 771 655 ;\nC 38 ; WX 778 ; N ampersand ; B 41 -18 750 661 ;\nC 39 ; WX 439 ; N suchthat ; B 48 -17 414 500 ;\nC 40 ; WX 333 ; N parenleft ; B 53 -191 300 673 ;\nC 41 ; WX 333 ; N parenright ; B 30 -191 277 673 ;\nC 42 ; WX 500 ; N asteriskmath ; B 65 134 427 551 ;\nC 43 ; WX 549 ; N plus ; B 10 0 539 533 ;\nC 44 ; WX 250 ; N comma ; B 56 -152 194 104 ;\nC 45 ; WX 549 ; N minus ; B 11 233 535 288 ;\nC 46 ; WX 250 ; N period ; B 69 -17 181 95 ;\nC 47 ; WX 278 ; N slash ; B 0 -18 254 646 ;\nC 48 ; WX 500 ; N zero ; B 24 -14 476 685 ;\nC 49 ; WX 500 ; N one ; B 117 0 390 673 ;\nC 50 ; WX 500 ; N two ; B 25 0 475 685 ;\nC 51 ; WX 500 ; N three ; B 43 -14 435 685 ;\nC 52 ; WX 500 ; N four ; B 15 0 469 685 ;\nC 53 ; WX 500 ; N five ; B 32 -14 445 690 ;\nC 54 ; WX 500 ; N six ; B 34 -14 468 685 ;\nC 55 ; WX 500 ; N seven ; B 24 -16 448 673 ;\nC 56 ; WX 500 ; N eight ; B 56 -14 445 685 ;\nC 57 ; WX 500 ; N nine ; B 30 -18 459 685 ;\nC 58 ; WX 278 ; N colon ; B 81 -17 193 460 ;\nC 59 ; WX 278 ; N semicolon ; B 83 -152 221 460 ;\nC 60 ; WX 549 ; N less ; B 26 0 523 522 ;\nC 61 ; WX 549 ; N equal ; B 11 141 537 390 ;\nC 62 ; WX 549 ; N greater ; B 26 0 523 522 ;\nC 63 ; WX 444 ; N question ; B 70 -17 412 686 ;\nC 64 ; WX 549 ; N congruent ; B 11 0 537 475 ;\nC 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ;\nC 66 ; WX 667 ; N Beta ; B 29 0 592 673 ;\nC 67 ; WX 722 ; N Chi ; B -9 0 704 673 ;\nC 68 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ;\nC 70 ; WX 763 ; N Phi ; B 26 0 741 673 ;\nC 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ;\nC 72 ; WX 722 ; N Eta ; B 39 0 729 673 ;\nC 73 ; WX 333 ; N Iota ; B 32 0 316 673 ;\nC 74 ; WX 631 ; N theta1 ; B 18 -18 623 689 ;\nC 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ;\nC 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ;\nC 77 ; WX 889 ; N Mu ; B 28 0 887 673 ;\nC 78 ; WX 722 ; N Nu ; B 29 -8 720 673 ;\nC 79 ; WX 722 ; N Omicron ; B 41 -17 715 685 ;\nC 80 ; WX 768 ; N Pi ; B 25 0 745 673 ;\nC 81 ; WX 741 ; N Theta ; B 41 -17 715 685 ;\nC 82 ; WX 556 ; N Rho ; B 28 0 563 673 ;\nC 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ;\nC 84 ; WX 611 ; N Tau ; B 33 0 607 673 ;\nC 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ;\nC 86 ; WX 439 ; N sigma1 ; B 40 -233 436 500 ;\nC 87 ; WX 768 ; N Omega ; B 34 0 736 688 ;\nC 88 ; WX 645 ; N Xi ; B 40 0 599 673 ;\nC 89 ; WX 795 ; N Psi ; B 15 0 781 684 ;\nC 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ;\nC 91 ; WX 333 ; N bracketleft ; B 86 -155 299 674 ;\nC 92 ; WX 863 ; N therefore ; B 163 0 701 487 ;\nC 93 ; WX 333 ; N bracketright ; B 33 -155 246 674 ;\nC 94 ; WX 658 ; N perpendicular ; B 15 0 652 674 ;\nC 95 ; WX 500 ; N underscore ; B -2 -125 502 -75 ;\nC 96 ; WX 500 ; N radicalex ; B 480 881 1090 917 ;\nC 97 ; WX 631 ; N alpha ; B 41 -18 622 500 ;\nC 98 ; WX 549 ; N beta ; B 61 -223 515 741 ;\nC 99 ; WX 549 ; N chi ; B 12 -231 522 499 ;\nC 100 ; WX 494 ; N delta ; B 40 -19 481 740 ;\nC 101 ; WX 439 ; N epsilon ; B 22 -19 427 502 ;\nC 102 ; WX 521 ; N phi ; B 28 -224 492 673 ;\nC 103 ; WX 411 ; N gamma ; B 5 -225 484 499 ;\nC 104 ; WX 603 ; N eta ; B 0 -202 527 514 ;\nC 105 ; WX 329 ; N iota ; B 0 -17 301 503 ;\nC 106 ; WX 603 ; N phi1 ; B 36 -224 587 499 ;\nC 107 ; WX 549 ; N kappa ; B 33 0 558 501 ;\nC 108 ; WX 549 ; N lambda ; B 24 -17 548 739 ;\nC 109 ; WX 576 ; N mu ; B 33 -223 567 500 ;\nC 110 ; WX 521 ; N nu ; B -9 -16 475 507 ;\nC 111 ; WX 549 ; N omicron ; B 35 -19 501 499 ;\nC 112 ; WX 549 ; N pi ; B 10 -19 530 487 ;\nC 113 ; WX 521 ; N theta ; B 43 -17 485 690 ;\nC 114 ; WX 549 ; N rho ; B 50 -230 490 499 ;\nC 115 ; WX 603 ; N sigma ; B 30 -21 588 500 ;\nC 116 ; WX 439 ; N tau ; B 10 -19 418 500 ;\nC 117 ; WX 576 ; N upsilon ; B 7 -18 535 507 ;\nC 118 ; WX 713 ; N omega1 ; B 12 -18 671 583 ;\nC 119 ; WX 686 ; N omega ; B 42 -17 684 500 ;\nC 120 ; WX 493 ; N xi ; B 27 -224 469 766 ;\nC 121 ; WX 686 ; N psi ; B 12 -228 701 500 ;\nC 122 ; WX 494 ; N zeta ; B 60 -225 467 756 ;\nC 123 ; WX 480 ; N braceleft ; B 58 -183 397 673 ;\nC 124 ; WX 200 ; N bar ; B 65 -293 135 707 ;\nC 125 ; WX 480 ; N braceright ; B 79 -183 418 673 ;\nC 126 ; WX 549 ; N similar ; B 17 203 529 307 ;\nC 160 ; WX 750 ; N Euro ; B 20 -12 714 685 ;\nC 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 685 ;\nC 162 ; WX 247 ; N minute ; B 27 459 228 735 ;\nC 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ;\nC 164 ; WX 167 ; N fraction ; B -180 -12 340 677 ;\nC 165 ; WX 713 ; N infinity ; B 26 124 688 404 ;\nC 166 ; WX 500 ; N florin ; B 2 -193 494 686 ;\nC 167 ; WX 753 ; N club ; B 86 -26 660 533 ;\nC 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ;\nC 169 ; WX 753 ; N heart ; B 117 -33 631 532 ;\nC 170 ; WX 753 ; N spade ; B 113 -36 629 548 ;\nC 171 ; WX 1042 ; N arrowboth ; B 24 -15 1024 511 ;\nC 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ;\nC 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ;\nC 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ;\nC 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ;\nC 176 ; WX 400 ; N degree ; B 50 385 350 685 ;\nC 177 ; WX 549 ; N plusminus ; B 10 0 539 645 ;\nC 178 ; WX 411 ; N second ; B 20 459 413 737 ;\nC 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ;\nC 180 ; WX 549 ; N multiply ; B 17 8 533 524 ;\nC 181 ; WX 713 ; N proportional ; B 27 123 639 404 ;\nC 182 ; WX 494 ; N partialdiff ; B 26 -20 462 746 ;\nC 183 ; WX 460 ; N bullet ; B 50 113 410 473 ;\nC 184 ; WX 549 ; N divide ; B 10 71 536 456 ;\nC 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ;\nC 186 ; WX 549 ; N equivalence ; B 14 82 538 443 ;\nC 187 ; WX 549 ; N approxequal ; B 14 135 527 394 ;\nC 188 ; WX 1000 ; N ellipsis ; B 111 -17 889 95 ;\nC 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ;\nC 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ;\nC 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ;\nC 192 ; WX 823 ; N aleph ; B 175 -18 661 658 ;\nC 193 ; WX 686 ; N Ifraktur ; B 10 -53 578 740 ;\nC 194 ; WX 795 ; N Rfraktur ; B 26 -15 759 734 ;\nC 195 ; WX 987 ; N weierstrass ; B 159 -211 870 573 ;\nC 196 ; WX 768 ; N circlemultiply ; B 43 -17 733 673 ;\nC 197 ; WX 768 ; N circleplus ; B 43 -15 733 675 ;\nC 198 ; WX 823 ; N emptyset ; B 39 -24 781 719 ;\nC 199 ; WX 768 ; N intersection ; B 40 0 732 509 ;\nC 200 ; WX 768 ; N union ; B 40 -17 732 492 ;\nC 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ;\nC 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ;\nC 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ;\nC 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ;\nC 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ;\nC 206 ; WX 713 ; N element ; B 45 0 505 468 ;\nC 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ;\nC 208 ; WX 768 ; N angle ; B 26 0 738 673 ;\nC 209 ; WX 713 ; N gradient ; B 36 -19 681 718 ;\nC 210 ; WX 790 ; N registerserif ; B 50 -17 740 673 ;\nC 211 ; WX 790 ; N copyrightserif ; B 51 -15 741 675 ;\nC 212 ; WX 890 ; N trademarkserif ; B 18 293 855 673 ;\nC 213 ; WX 823 ; N product ; B 25 -101 803 751 ;\nC 214 ; WX 549 ; N radical ; B 10 -38 515 917 ;\nC 215 ; WX 250 ; N dotmath ; B 69 210 169 310 ;\nC 216 ; WX 713 ; N logicalnot ; B 15 0 680 288 ;\nC 217 ; WX 603 ; N logicaland ; B 23 0 583 454 ;\nC 218 ; WX 603 ; N logicalor ; B 30 0 578 477 ;\nC 219 ; WX 1042 ; N arrowdblboth ; B 27 -20 1023 510 ;\nC 220 ; WX 987 ; N arrowdblleft ; B 30 -15 939 513 ;\nC 221 ; WX 603 ; N arrowdblup ; B 39 2 567 911 ;\nC 222 ; WX 987 ; N arrowdblright ; B 45 -20 954 508 ;\nC 223 ; WX 603 ; N arrowdbldown ; B 44 -19 572 890 ;\nC 224 ; WX 494 ; N lozenge ; B 18 0 466 745 ;\nC 225 ; WX 329 ; N angleleft ; B 25 -198 306 746 ;\nC 226 ; WX 790 ; N registersans ; B 50 -20 740 670 ;\nC 227 ; WX 790 ; N copyrightsans ; B 49 -15 739 675 ;\nC 228 ; WX 786 ; N trademarksans ; B 5 293 725 673 ;\nC 229 ; WX 713 ; N summation ; B 14 -108 695 752 ;\nC 230 ; WX 384 ; N parenlefttp ; B 24 -293 436 926 ;\nC 231 ; WX 384 ; N parenleftex ; B 24 -85 108 925 ;\nC 232 ; WX 384 ; N parenleftbt ; B 24 -293 436 926 ;\nC 233 ; WX 384 ; N bracketlefttp ; B 0 -80 349 926 ;\nC 234 ; WX 384 ; N bracketleftex ; B 0 -79 77 925 ;\nC 235 ; WX 384 ; N bracketleftbt ; B 0 -80 349 926 ;\nC 236 ; WX 494 ; N bracelefttp ; B 209 -85 445 925 ;\nC 237 ; WX 494 ; N braceleftmid ; B 20 -85 284 935 ;\nC 238 ; WX 494 ; N braceleftbt ; B 209 -75 445 935 ;\nC 239 ; WX 494 ; N braceex ; B 209 -85 284 935 ;\nC 241 ; WX 329 ; N angleright ; B 21 -198 302 746 ;\nC 242 ; WX 274 ; N integral ; B 2 -107 291 916 ;\nC 243 ; WX 686 ; N integraltp ; B 308 -88 675 920 ;\nC 244 ; WX 686 ; N integralex ; B 308 -88 378 975 ;\nC 245 ; WX 686 ; N integralbt ; B 11 -87 378 921 ;\nC 246 ; WX 384 ; N parenrighttp ; B 54 -293 466 926 ;\nC 247 ; WX 384 ; N parenrightex ; B 382 -85 466 925 ;\nC 248 ; WX 384 ; N parenrightbt ; B 54 -293 466 926 ;\nC 249 ; WX 384 ; N bracketrighttp ; B 22 -80 371 926 ;\nC 250 ; WX 384 ; N bracketrightex ; B 294 -79 371 925 ;\nC 251 ; WX 384 ; N bracketrightbt ; B 22 -80 371 926 ;\nC 252 ; WX 494 ; N bracerighttp ; B 48 -85 284 925 ;\nC 253 ; WX 494 ; N bracerightmid ; B 209 -85 473 935 ;\nC 254 ; WX 494 ; N bracerightbt ; B 48 -75 284 935 ;\nC -1 ; WX 790 ; N apple ; B 56 -3 733 808 ;\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/pdfcorefonts/Times-Bold.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 12:52:56 1997\nComment UniqueID 43065\nComment VMusage 41636 52661\nFontName Times-Bold\nFullName Times Bold\nFamilyName Times\nWeight Bold\nItalicAngle 0\nIsFixedPitch false\nCharacterSet ExtendedRoman\nFontBBox -168 -218 1000 935 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 676\nXHeight 461\nAscender 683\nDescender -217\nStdHW 44\nStdVW 139\nStartCharMetrics 315\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ;\nC 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ;\nC 35 ; WX 500 ; N numbersign ; B 4 0 496 700 ;\nC 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ;\nC 37 ; WX 1000 ; N percent ; B 124 -14 877 692 ;\nC 38 ; WX 833 ; N ampersand ; B 62 -16 787 691 ;\nC 39 ; WX 333 ; N quoteright ; B 79 356 263 691 ;\nC 40 ; WX 333 ; N parenleft ; B 46 -168 306 694 ;\nC 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ;\nC 42 ; WX 500 ; N asterisk ; B 56 255 447 691 ;\nC 43 ; WX 570 ; N plus ; B 33 0 537 506 ;\nC 44 ; WX 250 ; N comma ; B 39 -180 223 155 ;\nC 45 ; WX 333 ; N hyphen ; B 44 171 287 287 ;\nC 46 ; WX 250 ; N period ; B 41 -13 210 156 ;\nC 47 ; WX 278 ; N slash ; B -24 -19 302 691 ;\nC 48 ; WX 500 ; N zero ; B 24 -13 476 688 ;\nC 49 ; WX 500 ; N one ; B 65 0 442 688 ;\nC 50 ; WX 500 ; N two ; B 17 0 478 688 ;\nC 51 ; WX 500 ; N three ; B 16 -14 468 688 ;\nC 52 ; WX 500 ; N four ; B 19 0 475 688 ;\nC 53 ; WX 500 ; N five ; B 22 -8 470 676 ;\nC 54 ; WX 500 ; N six ; B 28 -13 475 688 ;\nC 55 ; WX 500 ; N seven ; B 17 0 477 676 ;\nC 56 ; WX 500 ; N eight ; B 28 -13 472 688 ;\nC 57 ; WX 500 ; N nine ; B 26 -13 473 688 ;\nC 58 ; WX 333 ; N colon ; B 82 -13 251 472 ;\nC 59 ; WX 333 ; N semicolon ; B 82 -180 266 472 ;\nC 60 ; WX 570 ; N less ; B 31 -8 539 514 ;\nC 61 ; WX 570 ; N equal ; B 33 107 537 399 ;\nC 62 ; WX 570 ; N greater ; B 31 -8 539 514 ;\nC 63 ; WX 500 ; N question ; B 57 -13 445 689 ;\nC 64 ; WX 930 ; N at ; B 108 -19 822 691 ;\nC 65 ; WX 722 ; N A ; B 9 0 689 690 ;\nC 66 ; WX 667 ; N B ; B 16 0 619 676 ;\nC 67 ; WX 722 ; N C ; B 49 -19 687 691 ;\nC 68 ; WX 722 ; N D ; B 14 0 690 676 ;\nC 69 ; WX 667 ; N E ; B 16 0 641 676 ;\nC 70 ; WX 611 ; N F ; B 16 0 583 676 ;\nC 71 ; WX 778 ; N G ; B 37 -19 755 691 ;\nC 72 ; WX 778 ; N H ; B 21 0 759 676 ;\nC 73 ; WX 389 ; N I ; B 20 0 370 676 ;\nC 74 ; WX 500 ; N J ; B 3 -96 479 676 ;\nC 75 ; WX 778 ; N K ; B 30 0 769 676 ;\nC 76 ; WX 667 ; N L ; B 19 0 638 676 ;\nC 77 ; WX 944 ; N M ; B 14 0 921 676 ;\nC 78 ; WX 722 ; N N ; B 16 -18 701 676 ;\nC 79 ; WX 778 ; N O ; B 35 -19 743 691 ;\nC 80 ; WX 611 ; N P ; B 16 0 600 676 ;\nC 81 ; WX 778 ; N Q ; B 35 -176 743 691 ;\nC 82 ; WX 722 ; N R ; B 26 0 715 676 ;\nC 83 ; WX 556 ; N S ; B 35 -19 513 692 ;\nC 84 ; WX 667 ; N T ; B 31 0 636 676 ;\nC 85 ; WX 722 ; N U ; B 16 -19 701 676 ;\nC 86 ; WX 722 ; N V ; B 16 -18 701 676 ;\nC 87 ; WX 1000 ; N W ; B 19 -15 981 676 ;\nC 88 ; WX 722 ; N X ; B 16 0 699 676 ;\nC 89 ; WX 722 ; N Y ; B 15 0 699 676 ;\nC 90 ; WX 667 ; N Z ; B 28 0 634 676 ;\nC 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ;\nC 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ;\nC 93 ; WX 333 ; N bracketright ; B 32 -149 266 678 ;\nC 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333 ; N quoteleft ; B 70 356 254 691 ;\nC 97 ; WX 500 ; N a ; B 25 -14 488 473 ;\nC 98 ; WX 556 ; N b ; B 17 -14 521 676 ;\nC 99 ; WX 444 ; N c ; B 25 -14 430 473 ;\nC 100 ; WX 556 ; N d ; B 25 -14 534 676 ;\nC 101 ; WX 444 ; N e ; B 25 -14 426 473 ;\nC 102 ; WX 333 ; N f ; B 14 0 389 691 ; L i fi ; L l fl ;\nC 103 ; WX 500 ; N g ; B 28 -206 483 473 ;\nC 104 ; WX 556 ; N h ; B 16 0 534 676 ;\nC 105 ; WX 278 ; N i ; B 16 0 255 691 ;\nC 106 ; WX 333 ; N j ; B -57 -203 263 691 ;\nC 107 ; WX 556 ; N k ; B 22 0 543 676 ;\nC 108 ; WX 278 ; N l ; B 16 0 255 676 ;\nC 109 ; WX 833 ; N m ; B 16 0 814 473 ;\nC 110 ; WX 556 ; N n ; B 21 0 539 473 ;\nC 111 ; WX 500 ; N o ; B 25 -14 476 473 ;\nC 112 ; WX 556 ; N p ; B 19 -205 524 473 ;\nC 113 ; WX 556 ; N q ; B 34 -205 536 473 ;\nC 114 ; WX 444 ; N r ; B 29 0 434 473 ;\nC 115 ; WX 389 ; N s ; B 25 -14 361 473 ;\nC 116 ; WX 333 ; N t ; B 20 -12 332 630 ;\nC 117 ; WX 556 ; N u ; B 16 -14 537 461 ;\nC 118 ; WX 500 ; N v ; B 21 -14 485 461 ;\nC 119 ; WX 722 ; N w ; B 23 -14 707 461 ;\nC 120 ; WX 500 ; N x ; B 12 0 484 461 ;\nC 121 ; WX 500 ; N y ; B 16 -205 480 461 ;\nC 122 ; WX 444 ; N z ; B 21 0 420 461 ;\nC 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ;\nC 124 ; WX 220 ; N bar ; B 66 -218 154 782 ;\nC 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ;\nC 126 ; WX 520 ; N asciitilde ; B 29 173 491 333 ;\nC 161 ; WX 333 ; N exclamdown ; B 82 -203 252 501 ;\nC 162 ; WX 500 ; N cent ; B 53 -140 458 588 ;\nC 163 ; WX 500 ; N sterling ; B 21 -14 477 684 ;\nC 164 ; WX 167 ; N fraction ; B -168 -12 329 688 ;\nC 165 ; WX 500 ; N yen ; B -64 0 547 676 ;\nC 166 ; WX 500 ; N florin ; B 0 -155 498 706 ;\nC 167 ; WX 500 ; N section ; B 57 -132 443 691 ;\nC 168 ; WX 500 ; N currency ; B -26 61 526 613 ;\nC 169 ; WX 278 ; N quotesingle ; B 75 404 204 691 ;\nC 170 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ;\nC 171 ; WX 500 ; N guillemotleft ; B 23 36 473 415 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 51 36 305 415 ;\nC 173 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ;\nC 174 ; WX 556 ; N fi ; B 14 0 536 691 ;\nC 175 ; WX 556 ; N fl ; B 14 0 536 691 ;\nC 177 ; WX 500 ; N endash ; B 0 181 500 271 ;\nC 178 ; WX 500 ; N dagger ; B 47 -134 453 691 ;\nC 179 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ;\nC 180 ; WX 250 ; N periodcentered ; B 41 248 210 417 ;\nC 182 ; WX 540 ; N paragraph ; B 0 -186 519 676 ;\nC 183 ; WX 350 ; N bullet ; B 35 198 315 478 ;\nC 184 ; WX 333 ; N quotesinglbase ; B 79 -180 263 155 ;\nC 185 ; WX 500 ; N quotedblbase ; B 14 -180 468 155 ;\nC 186 ; WX 500 ; N quotedblright ; B 14 356 468 691 ;\nC 187 ; WX 500 ; N guillemotright ; B 27 36 477 415 ;\nC 188 ; WX 1000 ; N ellipsis ; B 82 -13 917 156 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ;\nC 191 ; WX 500 ; N questiondown ; B 55 -201 443 501 ;\nC 193 ; WX 333 ; N grave ; B 8 528 246 713 ;\nC 194 ; WX 333 ; N acute ; B 86 528 324 713 ;\nC 195 ; WX 333 ; N circumflex ; B -2 528 335 704 ;\nC 196 ; WX 333 ; N tilde ; B -16 547 349 674 ;\nC 197 ; WX 333 ; N macron ; B 1 565 331 637 ;\nC 198 ; WX 333 ; N breve ; B 15 528 318 691 ;\nC 199 ; WX 333 ; N dotaccent ; B 103 536 258 691 ;\nC 200 ; WX 333 ; N dieresis ; B -2 537 335 667 ;\nC 202 ; WX 333 ; N ring ; B 60 527 273 740 ;\nC 203 ; WX 333 ; N cedilla ; B 68 -218 294 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -13 528 425 713 ;\nC 206 ; WX 333 ; N ogonek ; B 90 -193 319 24 ;\nC 207 ; WX 333 ; N caron ; B -2 528 335 704 ;\nC 208 ; WX 1000 ; N emdash ; B 0 181 1000 271 ;\nC 225 ; WX 1000 ; N AE ; B 4 0 951 676 ;\nC 227 ; WX 300 ; N ordfeminine ; B -1 397 301 688 ;\nC 232 ; WX 667 ; N Lslash ; B 19 0 638 676 ;\nC 233 ; WX 778 ; N Oslash ; B 35 -74 743 737 ;\nC 234 ; WX 1000 ; N OE ; B 22 -5 981 684 ;\nC 235 ; WX 330 ; N ordmasculine ; B 18 397 312 688 ;\nC 241 ; WX 722 ; N ae ; B 33 -14 693 473 ;\nC 245 ; WX 278 ; N dotlessi ; B 16 0 255 461 ;\nC 248 ; WX 278 ; N lslash ; B -22 0 303 676 ;\nC 249 ; WX 500 ; N oslash ; B 25 -92 476 549 ;\nC 250 ; WX 722 ; N oe ; B 22 -14 696 473 ;\nC 251 ; WX 556 ; N germandbls ; B 19 -12 517 691 ;\nC -1 ; WX 389 ; N Idieresis ; B 20 0 370 877 ;\nC -1 ; WX 444 ; N eacute ; B 25 -14 426 713 ;\nC -1 ; WX 500 ; N abreve ; B 25 -14 488 691 ;\nC -1 ; WX 556 ; N uhungarumlaut ; B 16 -14 557 713 ;\nC -1 ; WX 444 ; N ecaron ; B 25 -14 426 704 ;\nC -1 ; WX 722 ; N Ydieresis ; B 15 0 699 877 ;\nC -1 ; WX 570 ; N divide ; B 33 -31 537 537 ;\nC -1 ; WX 722 ; N Yacute ; B 15 0 699 923 ;\nC -1 ; WX 722 ; N Acircumflex ; B 9 0 689 914 ;\nC -1 ; WX 500 ; N aacute ; B 25 -14 488 713 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 16 -19 701 914 ;\nC -1 ; WX 500 ; N yacute ; B 16 -205 480 713 ;\nC -1 ; WX 389 ; N scommaaccent ; B 25 -218 361 473 ;\nC -1 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ;\nC -1 ; WX 722 ; N Uring ; B 16 -19 701 935 ;\nC -1 ; WX 722 ; N Udieresis ; B 16 -19 701 877 ;\nC -1 ; WX 500 ; N aogonek ; B 25 -193 504 473 ;\nC -1 ; WX 722 ; N Uacute ; B 16 -19 701 923 ;\nC -1 ; WX 556 ; N uogonek ; B 16 -193 539 461 ;\nC -1 ; WX 667 ; N Edieresis ; B 16 0 641 877 ;\nC -1 ; WX 722 ; N Dcroat ; B 6 0 690 676 ;\nC -1 ; WX 250 ; N commaaccent ; B 47 -218 203 -50 ;\nC -1 ; WX 747 ; N copyright ; B 26 -19 721 691 ;\nC -1 ; WX 667 ; N Emacron ; B 16 0 641 847 ;\nC -1 ; WX 444 ; N ccaron ; B 25 -14 430 704 ;\nC -1 ; WX 500 ; N aring ; B 25 -14 488 740 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 16 -188 701 676 ;\nC -1 ; WX 278 ; N lacute ; B 16 0 297 923 ;\nC -1 ; WX 500 ; N agrave ; B 25 -14 488 713 ;\nC -1 ; WX 667 ; N Tcommaaccent ; B 31 -218 636 676 ;\nC -1 ; WX 722 ; N Cacute ; B 49 -19 687 923 ;\nC -1 ; WX 500 ; N atilde ; B 25 -14 488 674 ;\nC -1 ; WX 667 ; N Edotaccent ; B 16 0 641 901 ;\nC -1 ; WX 389 ; N scaron ; B 25 -14 363 704 ;\nC -1 ; WX 389 ; N scedilla ; B 25 -218 361 473 ;\nC -1 ; WX 278 ; N iacute ; B 16 0 289 713 ;\nC -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;\nC -1 ; WX 722 ; N Rcaron ; B 26 0 715 914 ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 37 -218 755 691 ;\nC -1 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ;\nC -1 ; WX 500 ; N acircumflex ; B 25 -14 488 704 ;\nC -1 ; WX 722 ; N Amacron ; B 9 0 689 847 ;\nC -1 ; WX 444 ; N rcaron ; B 29 0 434 704 ;\nC -1 ; WX 444 ; N ccedilla ; B 25 -218 430 473 ;\nC -1 ; WX 667 ; N Zdotaccent ; B 28 0 634 901 ;\nC -1 ; WX 611 ; N Thorn ; B 16 0 600 676 ;\nC -1 ; WX 778 ; N Omacron ; B 35 -19 743 847 ;\nC -1 ; WX 722 ; N Racute ; B 26 0 715 923 ;\nC -1 ; WX 556 ; N Sacute ; B 35 -19 513 923 ;\nC -1 ; WX 672 ; N dcaron ; B 25 -14 681 682 ;\nC -1 ; WX 722 ; N Umacron ; B 16 -19 701 847 ;\nC -1 ; WX 556 ; N uring ; B 16 -14 537 740 ;\nC -1 ; WX 300 ; N threesuperior ; B 3 268 297 688 ;\nC -1 ; WX 778 ; N Ograve ; B 35 -19 743 923 ;\nC -1 ; WX 722 ; N Agrave ; B 9 0 689 923 ;\nC -1 ; WX 722 ; N Abreve ; B 9 0 689 901 ;\nC -1 ; WX 570 ; N multiply ; B 48 16 522 490 ;\nC -1 ; WX 556 ; N uacute ; B 16 -14 537 713 ;\nC -1 ; WX 667 ; N Tcaron ; B 31 0 636 914 ;\nC -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;\nC -1 ; WX 500 ; N ydieresis ; B 16 -205 480 667 ;\nC -1 ; WX 722 ; N Nacute ; B 16 -18 701 923 ;\nC -1 ; WX 278 ; N icircumflex ; B -37 0 300 704 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ;\nC -1 ; WX 500 ; N adieresis ; B 25 -14 488 667 ;\nC -1 ; WX 444 ; N edieresis ; B 25 -14 426 667 ;\nC -1 ; WX 444 ; N cacute ; B 25 -14 430 713 ;\nC -1 ; WX 556 ; N nacute ; B 21 0 539 713 ;\nC -1 ; WX 556 ; N umacron ; B 16 -14 537 637 ;\nC -1 ; WX 722 ; N Ncaron ; B 16 -18 701 914 ;\nC -1 ; WX 389 ; N Iacute ; B 20 0 370 923 ;\nC -1 ; WX 570 ; N plusminus ; B 33 0 537 506 ;\nC -1 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ;\nC -1 ; WX 747 ; N registered ; B 26 -19 721 691 ;\nC -1 ; WX 778 ; N Gbreve ; B 37 -19 755 901 ;\nC -1 ; WX 389 ; N Idotaccent ; B 20 0 370 901 ;\nC -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;\nC -1 ; WX 667 ; N Egrave ; B 16 0 641 923 ;\nC -1 ; WX 444 ; N racute ; B 29 0 434 713 ;\nC -1 ; WX 500 ; N omacron ; B 25 -14 476 637 ;\nC -1 ; WX 667 ; N Zacute ; B 28 0 634 923 ;\nC -1 ; WX 667 ; N Zcaron ; B 28 0 634 914 ;\nC -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;\nC -1 ; WX 722 ; N Eth ; B 6 0 690 676 ;\nC -1 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ;\nC -1 ; WX 278 ; N lcommaaccent ; B 16 -218 255 676 ;\nC -1 ; WX 416 ; N tcaron ; B 20 -12 425 815 ;\nC -1 ; WX 444 ; N eogonek ; B 25 -193 426 473 ;\nC -1 ; WX 722 ; N Uogonek ; B 16 -193 701 676 ;\nC -1 ; WX 722 ; N Aacute ; B 9 0 689 923 ;\nC -1 ; WX 722 ; N Adieresis ; B 9 0 689 877 ;\nC -1 ; WX 444 ; N egrave ; B 25 -14 426 713 ;\nC -1 ; WX 444 ; N zacute ; B 21 0 420 713 ;\nC -1 ; WX 278 ; N iogonek ; B 16 -193 274 691 ;\nC -1 ; WX 778 ; N Oacute ; B 35 -19 743 923 ;\nC -1 ; WX 500 ; N oacute ; B 25 -14 476 713 ;\nC -1 ; WX 500 ; N amacron ; B 25 -14 488 637 ;\nC -1 ; WX 389 ; N sacute ; B 25 -14 361 713 ;\nC -1 ; WX 278 ; N idieresis ; B -37 0 300 667 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ;\nC -1 ; WX 722 ; N Ugrave ; B 16 -19 701 923 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 556 ; N thorn ; B 19 -205 524 676 ;\nC -1 ; WX 300 ; N twosuperior ; B 0 275 300 688 ;\nC -1 ; WX 778 ; N Odieresis ; B 35 -19 743 877 ;\nC -1 ; WX 556 ; N mu ; B 33 -206 536 461 ;\nC -1 ; WX 278 ; N igrave ; B -27 0 255 713 ;\nC -1 ; WX 500 ; N ohungarumlaut ; B 25 -14 529 713 ;\nC -1 ; WX 667 ; N Eogonek ; B 16 -193 644 676 ;\nC -1 ; WX 556 ; N dcroat ; B 25 -14 534 676 ;\nC -1 ; WX 750 ; N threequarters ; B 23 -12 733 688 ;\nC -1 ; WX 556 ; N Scedilla ; B 35 -218 513 692 ;\nC -1 ; WX 394 ; N lcaron ; B 16 0 412 682 ;\nC -1 ; WX 778 ; N Kcommaaccent ; B 30 -218 769 676 ;\nC -1 ; WX 667 ; N Lacute ; B 19 0 638 923 ;\nC -1 ; WX 1000 ; N trademark ; B 24 271 977 676 ;\nC -1 ; WX 444 ; N edotaccent ; B 25 -14 426 691 ;\nC -1 ; WX 389 ; N Igrave ; B 20 0 370 923 ;\nC -1 ; WX 389 ; N Imacron ; B 20 0 370 847 ;\nC -1 ; WX 667 ; N Lcaron ; B 19 0 652 682 ;\nC -1 ; WX 750 ; N onehalf ; B -7 -12 775 688 ;\nC -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;\nC -1 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ;\nC -1 ; WX 556 ; N ntilde ; B 21 0 539 674 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 16 -19 701 923 ;\nC -1 ; WX 667 ; N Eacute ; B 16 0 641 923 ;\nC -1 ; WX 444 ; N emacron ; B 25 -14 426 637 ;\nC -1 ; WX 500 ; N gbreve ; B 28 -206 483 691 ;\nC -1 ; WX 750 ; N onequarter ; B 28 -12 743 688 ;\nC -1 ; WX 556 ; N Scaron ; B 35 -19 513 914 ;\nC -1 ; WX 556 ; N Scommaaccent ; B 35 -218 513 692 ;\nC -1 ; WX 778 ; N Ohungarumlaut ; B 35 -19 743 923 ;\nC -1 ; WX 400 ; N degree ; B 57 402 343 688 ;\nC -1 ; WX 500 ; N ograve ; B 25 -14 476 713 ;\nC -1 ; WX 722 ; N Ccaron ; B 49 -19 687 914 ;\nC -1 ; WX 556 ; N ugrave ; B 16 -14 537 713 ;\nC -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;\nC -1 ; WX 722 ; N Dcaron ; B 14 0 690 914 ;\nC -1 ; WX 444 ; N rcommaaccent ; B 29 -218 434 473 ;\nC -1 ; WX 722 ; N Ntilde ; B 16 -18 701 884 ;\nC -1 ; WX 500 ; N otilde ; B 25 -14 476 674 ;\nC -1 ; WX 722 ; N Rcommaaccent ; B 26 -218 715 676 ;\nC -1 ; WX 667 ; N Lcommaaccent ; B 19 -218 638 676 ;\nC -1 ; WX 722 ; N Atilde ; B 9 0 689 884 ;\nC -1 ; WX 722 ; N Aogonek ; B 9 -193 699 690 ;\nC -1 ; WX 722 ; N Aring ; B 9 0 689 935 ;\nC -1 ; WX 778 ; N Otilde ; B 35 -19 743 884 ;\nC -1 ; WX 444 ; N zdotaccent ; B 21 0 420 691 ;\nC -1 ; WX 667 ; N Ecaron ; B 16 0 641 914 ;\nC -1 ; WX 389 ; N Iogonek ; B 20 -193 370 676 ;\nC -1 ; WX 556 ; N kcommaaccent ; B 22 -218 543 676 ;\nC -1 ; WX 570 ; N minus ; B 33 209 537 297 ;\nC -1 ; WX 389 ; N Icircumflex ; B 20 0 370 914 ;\nC -1 ; WX 556 ; N ncaron ; B 21 0 539 704 ;\nC -1 ; WX 333 ; N tcommaaccent ; B 20 -218 332 630 ;\nC -1 ; WX 570 ; N logicalnot ; B 33 108 537 399 ;\nC -1 ; WX 500 ; N odieresis ; B 25 -14 476 667 ;\nC -1 ; WX 556 ; N udieresis ; B 16 -14 537 667 ;\nC -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;\nC -1 ; WX 500 ; N gcommaaccent ; B 28 -206 483 829 ;\nC -1 ; WX 500 ; N eth ; B 25 -14 476 691 ;\nC -1 ; WX 444 ; N zcaron ; B 21 0 420 704 ;\nC -1 ; WX 556 ; N ncommaaccent ; B 21 -218 539 473 ;\nC -1 ; WX 300 ; N onesuperior ; B 28 275 273 688 ;\nC -1 ; WX 278 ; N imacron ; B -8 0 272 637 ;\nC -1 ; WX 500 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 2242\nKPX A C -55\nKPX A Cacute -55\nKPX A Ccaron -55\nKPX A Ccedilla -55\nKPX A G -55\nKPX A Gbreve -55\nKPX A Gcommaaccent -55\nKPX A O -45\nKPX A Oacute -45\nKPX A Ocircumflex -45\nKPX A Odieresis -45\nKPX A Ograve -45\nKPX A Ohungarumlaut -45\nKPX A Omacron -45\nKPX A Oslash -45\nKPX A Otilde -45\nKPX A Q -45\nKPX A T -95\nKPX A Tcaron -95\nKPX A Tcommaaccent -95\nKPX A U -50\nKPX A Uacute -50\nKPX A Ucircumflex -50\nKPX A Udieresis -50\nKPX A Ugrave -50\nKPX A Uhungarumlaut -50\nKPX A Umacron -50\nKPX A Uogonek -50\nKPX A Uring -50\nKPX A V -145\nKPX A W -130\nKPX A Y -100\nKPX A Yacute -100\nKPX A Ydieresis -100\nKPX A p -25\nKPX A quoteright -74\nKPX A u -50\nKPX A uacute -50\nKPX A ucircumflex -50\nKPX A udieresis -50\nKPX A ugrave -50\nKPX A uhungarumlaut -50\nKPX A umacron -50\nKPX A uogonek -50\nKPX A uring -50\nKPX A v -100\nKPX A w -90\nKPX A y -74\nKPX A yacute -74\nKPX A ydieresis -74\nKPX Aacute C -55\nKPX Aacute Cacute -55\nKPX Aacute Ccaron -55\nKPX Aacute Ccedilla -55\nKPX Aacute G -55\nKPX Aacute Gbreve -55\nKPX Aacute Gcommaaccent -55\nKPX Aacute O -45\nKPX Aacute Oacute -45\nKPX Aacute Ocircumflex -45\nKPX Aacute Odieresis -45\nKPX Aacute Ograve -45\nKPX Aacute Ohungarumlaut -45\nKPX Aacute Omacron -45\nKPX Aacute Oslash -45\nKPX Aacute Otilde -45\nKPX Aacute Q -45\nKPX Aacute T -95\nKPX Aacute Tcaron -95\nKPX Aacute Tcommaaccent -95\nKPX Aacute U -50\nKPX Aacute Uacute -50\nKPX Aacute Ucircumflex -50\nKPX Aacute Udieresis -50\nKPX Aacute Ugrave -50\nKPX Aacute Uhungarumlaut -50\nKPX Aacute Umacron -50\nKPX Aacute Uogonek -50\nKPX Aacute Uring -50\nKPX Aacute V -145\nKPX Aacute W -130\nKPX Aacute Y -100\nKPX Aacute Yacute -100\nKPX Aacute Ydieresis -100\nKPX Aacute p -25\nKPX Aacute quoteright -74\nKPX Aacute u -50\nKPX Aacute uacute -50\nKPX Aacute ucircumflex -50\nKPX Aacute udieresis -50\nKPX Aacute ugrave -50\nKPX Aacute uhungarumlaut -50\nKPX Aacute umacron -50\nKPX Aacute uogonek -50\nKPX Aacute uring -50\nKPX Aacute v -100\nKPX Aacute w -90\nKPX Aacute y -74\nKPX Aacute yacute -74\nKPX Aacute ydieresis -74\nKPX Abreve C -55\nKPX Abreve Cacute -55\nKPX Abreve Ccaron -55\nKPX Abreve Ccedilla -55\nKPX Abreve G -55\nKPX Abreve Gbreve -55\nKPX Abreve Gcommaaccent -55\nKPX Abreve O -45\nKPX Abreve Oacute -45\nKPX Abreve Ocircumflex -45\nKPX Abreve Odieresis -45\nKPX Abreve Ograve -45\nKPX Abreve Ohungarumlaut -45\nKPX Abreve Omacron -45\nKPX Abreve Oslash -45\nKPX Abreve Otilde -45\nKPX Abreve Q -45\nKPX Abreve T -95\nKPX Abreve Tcaron -95\nKPX Abreve Tcommaaccent -95\nKPX Abreve U -50\nKPX Abreve Uacute -50\nKPX Abreve Ucircumflex -50\nKPX Abreve Udieresis -50\nKPX Abreve Ugrave -50\nKPX Abreve Uhungarumlaut -50\nKPX Abreve Umacron -50\nKPX Abreve Uogonek -50\nKPX Abreve Uring -50\nKPX Abreve V -145\nKPX Abreve W -130\nKPX Abreve Y -100\nKPX Abreve Yacute -100\nKPX Abreve Ydieresis -100\nKPX Abreve p -25\nKPX Abreve quoteright -74\nKPX Abreve u -50\nKPX Abreve uacute -50\nKPX Abreve ucircumflex -50\nKPX Abreve udieresis -50\nKPX Abreve ugrave -50\nKPX Abreve uhungarumlaut -50\nKPX Abreve umacron -50\nKPX Abreve uogonek -50\nKPX Abreve uring -50\nKPX Abreve v -100\nKPX Abreve w -90\nKPX Abreve y -74\nKPX Abreve yacute -74\nKPX Abreve ydieresis -74\nKPX Acircumflex C -55\nKPX Acircumflex Cacute -55\nKPX Acircumflex Ccaron -55\nKPX Acircumflex Ccedilla -55\nKPX Acircumflex G -55\nKPX Acircumflex Gbreve -55\nKPX Acircumflex Gcommaaccent -55\nKPX Acircumflex O -45\nKPX Acircumflex Oacute -45\nKPX Acircumflex Ocircumflex -45\nKPX Acircumflex Odieresis -45\nKPX Acircumflex Ograve -45\nKPX Acircumflex Ohungarumlaut -45\nKPX Acircumflex Omacron -45\nKPX Acircumflex Oslash -45\nKPX Acircumflex Otilde -45\nKPX Acircumflex Q -45\nKPX Acircumflex T -95\nKPX Acircumflex Tcaron -95\nKPX Acircumflex Tcommaaccent -95\nKPX Acircumflex U -50\nKPX Acircumflex Uacute -50\nKPX Acircumflex Ucircumflex -50\nKPX Acircumflex Udieresis -50\nKPX Acircumflex Ugrave -50\nKPX Acircumflex Uhungarumlaut -50\nKPX Acircumflex Umacron -50\nKPX Acircumflex Uogonek -50\nKPX Acircumflex Uring -50\nKPX Acircumflex V -145\nKPX Acircumflex W -130\nKPX Acircumflex Y -100\nKPX Acircumflex Yacute -100\nKPX Acircumflex Ydieresis -100\nKPX Acircumflex p -25\nKPX Acircumflex quoteright -74\nKPX Acircumflex u -50\nKPX Acircumflex uacute -50\nKPX Acircumflex ucircumflex -50\nKPX Acircumflex udieresis -50\nKPX Acircumflex ugrave -50\nKPX Acircumflex uhungarumlaut -50\nKPX Acircumflex umacron -50\nKPX Acircumflex uogonek -50\nKPX Acircumflex uring -50\nKPX Acircumflex v -100\nKPX Acircumflex w -90\nKPX Acircumflex y -74\nKPX Acircumflex yacute -74\nKPX Acircumflex ydieresis -74\nKPX Adieresis C -55\nKPX Adieresis Cacute -55\nKPX Adieresis Ccaron -55\nKPX Adieresis Ccedilla -55\nKPX Adieresis G -55\nKPX Adieresis Gbreve -55\nKPX Adieresis Gcommaaccent -55\nKPX Adieresis O -45\nKPX Adieresis Oacute -45\nKPX Adieresis Ocircumflex -45\nKPX Adieresis Odieresis -45\nKPX Adieresis Ograve -45\nKPX Adieresis Ohungarumlaut -45\nKPX Adieresis Omacron -45\nKPX Adieresis Oslash -45\nKPX Adieresis Otilde -45\nKPX Adieresis Q -45\nKPX Adieresis T -95\nKPX Adieresis Tcaron -95\nKPX Adieresis Tcommaaccent -95\nKPX Adieresis U -50\nKPX Adieresis Uacute -50\nKPX Adieresis Ucircumflex -50\nKPX Adieresis Udieresis -50\nKPX Adieresis Ugrave -50\nKPX Adieresis Uhungarumlaut -50\nKPX Adieresis Umacron -50\nKPX Adieresis Uogonek -50\nKPX Adieresis Uring -50\nKPX Adieresis V -145\nKPX Adieresis W -130\nKPX Adieresis Y -100\nKPX Adieresis Yacute -100\nKPX Adieresis Ydieresis -100\nKPX Adieresis p -25\nKPX Adieresis quoteright -74\nKPX Adieresis u -50\nKPX Adieresis uacute -50\nKPX Adieresis ucircumflex -50\nKPX Adieresis udieresis -50\nKPX Adieresis ugrave -50\nKPX Adieresis uhungarumlaut -50\nKPX Adieresis umacron -50\nKPX Adieresis uogonek -50\nKPX Adieresis uring -50\nKPX Adieresis v -100\nKPX Adieresis w -90\nKPX Adieresis y -74\nKPX Adieresis yacute -74\nKPX Adieresis ydieresis -74\nKPX Agrave C -55\nKPX Agrave Cacute -55\nKPX Agrave Ccaron -55\nKPX Agrave Ccedilla -55\nKPX Agrave G -55\nKPX Agrave Gbreve -55\nKPX Agrave Gcommaaccent -55\nKPX Agrave O -45\nKPX Agrave Oacute -45\nKPX Agrave Ocircumflex -45\nKPX Agrave Odieresis -45\nKPX Agrave Ograve -45\nKPX Agrave Ohungarumlaut -45\nKPX Agrave Omacron -45\nKPX Agrave Oslash -45\nKPX Agrave Otilde -45\nKPX Agrave Q -45\nKPX Agrave T -95\nKPX Agrave Tcaron -95\nKPX Agrave Tcommaaccent -95\nKPX Agrave U -50\nKPX Agrave Uacute -50\nKPX Agrave Ucircumflex -50\nKPX Agrave Udieresis -50\nKPX Agrave Ugrave -50\nKPX Agrave Uhungarumlaut -50\nKPX Agrave Umacron -50\nKPX Agrave Uogonek -50\nKPX Agrave Uring -50\nKPX Agrave V -145\nKPX Agrave W -130\nKPX Agrave Y -100\nKPX Agrave Yacute -100\nKPX Agrave Ydieresis -100\nKPX Agrave p -25\nKPX Agrave quoteright -74\nKPX Agrave u -50\nKPX Agrave uacute -50\nKPX Agrave ucircumflex -50\nKPX Agrave udieresis -50\nKPX Agrave ugrave -50\nKPX Agrave uhungarumlaut -50\nKPX Agrave umacron -50\nKPX Agrave uogonek -50\nKPX Agrave uring -50\nKPX Agrave v -100\nKPX Agrave w -90\nKPX Agrave y -74\nKPX Agrave yacute -74\nKPX Agrave ydieresis -74\nKPX Amacron C -55\nKPX Amacron Cacute -55\nKPX Amacron Ccaron -55\nKPX Amacron Ccedilla -55\nKPX Amacron G -55\nKPX Amacron Gbreve -55\nKPX Amacron Gcommaaccent -55\nKPX Amacron O -45\nKPX Amacron Oacute -45\nKPX Amacron Ocircumflex -45\nKPX Amacron Odieresis -45\nKPX Amacron Ograve -45\nKPX Amacron Ohungarumlaut -45\nKPX Amacron Omacron -45\nKPX Amacron Oslash -45\nKPX Amacron Otilde -45\nKPX Amacron Q -45\nKPX Amacron T -95\nKPX Amacron Tcaron -95\nKPX Amacron Tcommaaccent -95\nKPX Amacron U -50\nKPX Amacron Uacute -50\nKPX Amacron Ucircumflex -50\nKPX Amacron Udieresis -50\nKPX Amacron Ugrave -50\nKPX Amacron Uhungarumlaut -50\nKPX Amacron Umacron -50\nKPX Amacron Uogonek -50\nKPX Amacron Uring -50\nKPX Amacron V -145\nKPX Amacron W -130\nKPX Amacron Y -100\nKPX Amacron Yacute -100\nKPX Amacron Ydieresis -100\nKPX Amacron p -25\nKPX Amacron quoteright -74\nKPX Amacron u -50\nKPX Amacron uacute -50\nKPX Amacron ucircumflex -50\nKPX Amacron udieresis -50\nKPX Amacron ugrave -50\nKPX Amacron uhungarumlaut -50\nKPX Amacron umacron -50\nKPX Amacron uogonek -50\nKPX Amacron uring -50\nKPX Amacron v -100\nKPX Amacron w -90\nKPX Amacron y -74\nKPX Amacron yacute -74\nKPX Amacron ydieresis -74\nKPX Aogonek C -55\nKPX Aogonek Cacute -55\nKPX Aogonek Ccaron -55\nKPX Aogonek Ccedilla -55\nKPX Aogonek G -55\nKPX Aogonek Gbreve -55\nKPX Aogonek Gcommaaccent -55\nKPX Aogonek O -45\nKPX Aogonek Oacute -45\nKPX Aogonek Ocircumflex -45\nKPX Aogonek Odieresis -45\nKPX Aogonek Ograve -45\nKPX Aogonek Ohungarumlaut -45\nKPX Aogonek Omacron -45\nKPX Aogonek Oslash -45\nKPX Aogonek Otilde -45\nKPX Aogonek Q -45\nKPX Aogonek T -95\nKPX Aogonek Tcaron -95\nKPX Aogonek Tcommaaccent -95\nKPX Aogonek U -50\nKPX Aogonek Uacute -50\nKPX Aogonek Ucircumflex -50\nKPX Aogonek Udieresis -50\nKPX Aogonek Ugrave -50\nKPX Aogonek Uhungarumlaut -50\nKPX Aogonek Umacron -50\nKPX Aogonek Uogonek -50\nKPX Aogonek Uring -50\nKPX Aogonek V -145\nKPX Aogonek W -130\nKPX Aogonek Y -100\nKPX Aogonek Yacute -100\nKPX Aogonek Ydieresis -100\nKPX Aogonek p -25\nKPX Aogonek quoteright -74\nKPX Aogonek u -50\nKPX Aogonek uacute -50\nKPX Aogonek ucircumflex -50\nKPX Aogonek udieresis -50\nKPX Aogonek ugrave -50\nKPX Aogonek uhungarumlaut -50\nKPX Aogonek umacron -50\nKPX Aogonek uogonek -50\nKPX Aogonek uring -50\nKPX Aogonek v -100\nKPX Aogonek w -90\nKPX Aogonek y -34\nKPX Aogonek yacute -34\nKPX Aogonek ydieresis -34\nKPX Aring C -55\nKPX Aring Cacute -55\nKPX Aring Ccaron -55\nKPX Aring Ccedilla -55\nKPX Aring G -55\nKPX Aring Gbreve -55\nKPX Aring Gcommaaccent -55\nKPX Aring O -45\nKPX Aring Oacute -45\nKPX Aring Ocircumflex -45\nKPX Aring Odieresis -45\nKPX Aring Ograve -45\nKPX Aring Ohungarumlaut -45\nKPX Aring Omacron -45\nKPX Aring Oslash -45\nKPX Aring Otilde -45\nKPX Aring Q -45\nKPX Aring T -95\nKPX Aring Tcaron -95\nKPX Aring Tcommaaccent -95\nKPX Aring U -50\nKPX Aring Uacute -50\nKPX Aring Ucircumflex -50\nKPX Aring Udieresis -50\nKPX Aring Ugrave -50\nKPX Aring Uhungarumlaut -50\nKPX Aring Umacron -50\nKPX Aring Uogonek -50\nKPX Aring Uring -50\nKPX Aring V -145\nKPX Aring W -130\nKPX Aring Y -100\nKPX Aring Yacute -100\nKPX Aring Ydieresis -100\nKPX Aring p -25\nKPX Aring quoteright -74\nKPX Aring u -50\nKPX Aring uacute -50\nKPX Aring ucircumflex -50\nKPX Aring udieresis -50\nKPX Aring ugrave -50\nKPX Aring uhungarumlaut -50\nKPX Aring umacron -50\nKPX Aring uogonek -50\nKPX Aring uring -50\nKPX Aring v -100\nKPX Aring w -90\nKPX Aring y -74\nKPX Aring yacute -74\nKPX Aring ydieresis -74\nKPX Atilde C -55\nKPX Atilde Cacute -55\nKPX Atilde Ccaron -55\nKPX Atilde Ccedilla -55\nKPX Atilde G -55\nKPX Atilde Gbreve -55\nKPX Atilde Gcommaaccent -55\nKPX Atilde O -45\nKPX Atilde Oacute -45\nKPX Atilde Ocircumflex -45\nKPX Atilde Odieresis -45\nKPX Atilde Ograve -45\nKPX Atilde Ohungarumlaut -45\nKPX Atilde Omacron -45\nKPX Atilde Oslash -45\nKPX Atilde Otilde -45\nKPX Atilde Q -45\nKPX Atilde T -95\nKPX Atilde Tcaron -95\nKPX Atilde Tcommaaccent -95\nKPX Atilde U -50\nKPX Atilde Uacute -50\nKPX Atilde Ucircumflex -50\nKPX Atilde Udieresis -50\nKPX Atilde Ugrave -50\nKPX Atilde Uhungarumlaut -50\nKPX Atilde Umacron -50\nKPX Atilde Uogonek -50\nKPX Atilde Uring -50\nKPX Atilde V -145\nKPX Atilde W -130\nKPX Atilde Y -100\nKPX Atilde Yacute -100\nKPX Atilde Ydieresis -100\nKPX Atilde p -25\nKPX Atilde quoteright -74\nKPX Atilde u -50\nKPX Atilde uacute -50\nKPX Atilde ucircumflex -50\nKPX Atilde udieresis -50\nKPX Atilde ugrave -50\nKPX Atilde uhungarumlaut -50\nKPX Atilde umacron -50\nKPX Atilde uogonek -50\nKPX Atilde uring -50\nKPX Atilde v -100\nKPX Atilde w -90\nKPX Atilde y -74\nKPX Atilde yacute -74\nKPX Atilde ydieresis -74\nKPX B A -30\nKPX B Aacute -30\nKPX B Abreve -30\nKPX B Acircumflex -30\nKPX B Adieresis -30\nKPX B Agrave -30\nKPX B Amacron -30\nKPX B Aogonek -30\nKPX B Aring -30\nKPX B Atilde -30\nKPX B U -10\nKPX B Uacute -10\nKPX B Ucircumflex -10\nKPX B Udieresis -10\nKPX B Ugrave -10\nKPX B Uhungarumlaut -10\nKPX B Umacron -10\nKPX B Uogonek -10\nKPX B Uring -10\nKPX D A -35\nKPX D Aacute -35\nKPX D Abreve -35\nKPX D Acircumflex -35\nKPX D Adieresis -35\nKPX D Agrave -35\nKPX D Amacron -35\nKPX D Aogonek -35\nKPX D Aring -35\nKPX D Atilde -35\nKPX D V -40\nKPX D W -40\nKPX D Y -40\nKPX D Yacute -40\nKPX D Ydieresis -40\nKPX D period -20\nKPX Dcaron A -35\nKPX Dcaron Aacute -35\nKPX Dcaron Abreve -35\nKPX Dcaron Acircumflex -35\nKPX Dcaron Adieresis -35\nKPX Dcaron Agrave -35\nKPX Dcaron Amacron -35\nKPX Dcaron Aogonek -35\nKPX Dcaron Aring -35\nKPX Dcaron Atilde -35\nKPX Dcaron V -40\nKPX Dcaron W -40\nKPX Dcaron Y -40\nKPX Dcaron Yacute -40\nKPX Dcaron Ydieresis -40\nKPX Dcaron period -20\nKPX Dcroat A -35\nKPX Dcroat Aacute -35\nKPX Dcroat Abreve -35\nKPX Dcroat Acircumflex -35\nKPX Dcroat Adieresis -35\nKPX Dcroat Agrave -35\nKPX Dcroat Amacron -35\nKPX Dcroat Aogonek -35\nKPX Dcroat Aring -35\nKPX Dcroat Atilde -35\nKPX Dcroat V -40\nKPX Dcroat W -40\nKPX Dcroat Y -40\nKPX Dcroat Yacute -40\nKPX Dcroat Ydieresis -40\nKPX Dcroat period -20\nKPX F A -90\nKPX F Aacute -90\nKPX F Abreve -90\nKPX F Acircumflex -90\nKPX F Adieresis -90\nKPX F Agrave -90\nKPX F Amacron -90\nKPX F Aogonek -90\nKPX F Aring -90\nKPX F Atilde -90\nKPX F a -25\nKPX F aacute -25\nKPX F abreve -25\nKPX F acircumflex -25\nKPX F adieresis -25\nKPX F agrave -25\nKPX F amacron -25\nKPX F aogonek -25\nKPX F aring -25\nKPX F atilde -25\nKPX F comma -92\nKPX F e -25\nKPX F eacute -25\nKPX F ecaron -25\nKPX F ecircumflex -25\nKPX F edieresis -25\nKPX F edotaccent -25\nKPX F egrave -25\nKPX F emacron -25\nKPX F eogonek -25\nKPX F o -25\nKPX F oacute -25\nKPX F ocircumflex -25\nKPX F odieresis -25\nKPX F ograve -25\nKPX F ohungarumlaut -25\nKPX F omacron -25\nKPX F oslash -25\nKPX F otilde -25\nKPX F period -110\nKPX J A -30\nKPX J Aacute -30\nKPX J Abreve -30\nKPX J Acircumflex -30\nKPX J Adieresis -30\nKPX J Agrave -30\nKPX J Amacron -30\nKPX J Aogonek -30\nKPX J Aring -30\nKPX J Atilde -30\nKPX J a -15\nKPX J aacute -15\nKPX J abreve -15\nKPX J acircumflex -15\nKPX J adieresis -15\nKPX J agrave -15\nKPX J amacron -15\nKPX J aogonek -15\nKPX J aring -15\nKPX J atilde -15\nKPX J e -15\nKPX J eacute -15\nKPX J ecaron -15\nKPX J ecircumflex -15\nKPX J edieresis -15\nKPX J edotaccent -15\nKPX J egrave -15\nKPX J emacron -15\nKPX J eogonek -15\nKPX J o -15\nKPX J oacute -15\nKPX J ocircumflex -15\nKPX J odieresis -15\nKPX J ograve -15\nKPX J ohungarumlaut -15\nKPX J omacron -15\nKPX J oslash -15\nKPX J otilde -15\nKPX J period -20\nKPX J u -15\nKPX J uacute -15\nKPX J ucircumflex -15\nKPX J udieresis -15\nKPX J ugrave -15\nKPX J uhungarumlaut -15\nKPX J umacron -15\nKPX J uogonek -15\nKPX J uring -15\nKPX K O -30\nKPX K Oacute -30\nKPX K Ocircumflex -30\nKPX K Odieresis -30\nKPX K Ograve -30\nKPX K Ohungarumlaut -30\nKPX K Omacron -30\nKPX K Oslash -30\nKPX K Otilde -30\nKPX K e -25\nKPX K eacute -25\nKPX K ecaron -25\nKPX K ecircumflex -25\nKPX K edieresis -25\nKPX K edotaccent -25\nKPX K egrave -25\nKPX K emacron -25\nKPX K eogonek -25\nKPX K o -25\nKPX K oacute -25\nKPX K ocircumflex -25\nKPX K odieresis -25\nKPX K ograve -25\nKPX K ohungarumlaut -25\nKPX K omacron -25\nKPX K oslash -25\nKPX K otilde -25\nKPX K u -15\nKPX K uacute -15\nKPX K ucircumflex -15\nKPX K udieresis -15\nKPX K ugrave -15\nKPX K uhungarumlaut -15\nKPX K umacron -15\nKPX K uogonek -15\nKPX K uring -15\nKPX K y -45\nKPX K yacute -45\nKPX K ydieresis -45\nKPX Kcommaaccent O -30\nKPX Kcommaaccent Oacute -30\nKPX Kcommaaccent Ocircumflex -30\nKPX Kcommaaccent Odieresis -30\nKPX Kcommaaccent Ograve -30\nKPX Kcommaaccent Ohungarumlaut -30\nKPX Kcommaaccent Omacron -30\nKPX Kcommaaccent Oslash -30\nKPX Kcommaaccent Otilde -30\nKPX Kcommaaccent e -25\nKPX Kcommaaccent eacute -25\nKPX Kcommaaccent ecaron -25\nKPX Kcommaaccent ecircumflex -25\nKPX Kcommaaccent edieresis -25\nKPX Kcommaaccent edotaccent -25\nKPX Kcommaaccent egrave -25\nKPX Kcommaaccent emacron -25\nKPX Kcommaaccent eogonek -25\nKPX Kcommaaccent o -25\nKPX Kcommaaccent oacute -25\nKPX Kcommaaccent ocircumflex -25\nKPX Kcommaaccent odieresis -25\nKPX Kcommaaccent ograve -25\nKPX Kcommaaccent ohungarumlaut -25\nKPX Kcommaaccent omacron -25\nKPX Kcommaaccent oslash -25\nKPX Kcommaaccent otilde -25\nKPX Kcommaaccent u -15\nKPX Kcommaaccent uacute -15\nKPX Kcommaaccent ucircumflex -15\nKPX Kcommaaccent udieresis -15\nKPX Kcommaaccent ugrave -15\nKPX Kcommaaccent uhungarumlaut -15\nKPX Kcommaaccent umacron -15\nKPX Kcommaaccent uogonek -15\nKPX Kcommaaccent uring -15\nKPX Kcommaaccent y -45\nKPX Kcommaaccent yacute -45\nKPX Kcommaaccent ydieresis -45\nKPX L T -92\nKPX L Tcaron -92\nKPX L Tcommaaccent -92\nKPX L V -92\nKPX L W -92\nKPX L Y -92\nKPX L Yacute -92\nKPX L Ydieresis -92\nKPX L quotedblright -20\nKPX L quoteright -110\nKPX L y -55\nKPX L yacute -55\nKPX L ydieresis -55\nKPX Lacute T -92\nKPX Lacute Tcaron -92\nKPX Lacute Tcommaaccent -92\nKPX Lacute V -92\nKPX Lacute W -92\nKPX Lacute Y -92\nKPX Lacute Yacute -92\nKPX Lacute Ydieresis -92\nKPX Lacute quotedblright -20\nKPX Lacute quoteright -110\nKPX Lacute y -55\nKPX Lacute yacute -55\nKPX Lacute ydieresis -55\nKPX Lcommaaccent T -92\nKPX Lcommaaccent Tcaron -92\nKPX Lcommaaccent Tcommaaccent -92\nKPX Lcommaaccent V -92\nKPX Lcommaaccent W -92\nKPX Lcommaaccent Y -92\nKPX Lcommaaccent Yacute -92\nKPX Lcommaaccent Ydieresis -92\nKPX Lcommaaccent quotedblright -20\nKPX Lcommaaccent quoteright -110\nKPX Lcommaaccent y -55\nKPX Lcommaaccent yacute -55\nKPX Lcommaaccent ydieresis -55\nKPX Lslash T -92\nKPX Lslash Tcaron -92\nKPX Lslash Tcommaaccent -92\nKPX Lslash V -92\nKPX Lslash W -92\nKPX Lslash Y -92\nKPX Lslash Yacute -92\nKPX Lslash Ydieresis -92\nKPX Lslash quotedblright -20\nKPX Lslash quoteright -110\nKPX Lslash y -55\nKPX Lslash yacute -55\nKPX Lslash ydieresis -55\nKPX N A -20\nKPX N Aacute -20\nKPX N Abreve -20\nKPX N Acircumflex -20\nKPX N Adieresis -20\nKPX N Agrave -20\nKPX N Amacron -20\nKPX N Aogonek -20\nKPX N Aring -20\nKPX N Atilde -20\nKPX Nacute A -20\nKPX Nacute Aacute -20\nKPX Nacute Abreve -20\nKPX Nacute Acircumflex -20\nKPX Nacute Adieresis -20\nKPX Nacute Agrave -20\nKPX Nacute Amacron -20\nKPX Nacute Aogonek -20\nKPX Nacute Aring -20\nKPX Nacute Atilde -20\nKPX Ncaron A -20\nKPX Ncaron Aacute -20\nKPX Ncaron Abreve -20\nKPX Ncaron Acircumflex -20\nKPX Ncaron Adieresis -20\nKPX Ncaron Agrave -20\nKPX Ncaron Amacron -20\nKPX Ncaron Aogonek -20\nKPX Ncaron Aring -20\nKPX Ncaron Atilde -20\nKPX Ncommaaccent A -20\nKPX Ncommaaccent Aacute -20\nKPX Ncommaaccent Abreve -20\nKPX Ncommaaccent Acircumflex -20\nKPX Ncommaaccent Adieresis -20\nKPX Ncommaaccent Agrave -20\nKPX Ncommaaccent Amacron -20\nKPX Ncommaaccent Aogonek -20\nKPX Ncommaaccent Aring -20\nKPX Ncommaaccent Atilde -20\nKPX Ntilde A -20\nKPX Ntilde Aacute -20\nKPX Ntilde Abreve -20\nKPX Ntilde Acircumflex -20\nKPX Ntilde Adieresis -20\nKPX Ntilde Agrave -20\nKPX Ntilde Amacron -20\nKPX Ntilde Aogonek -20\nKPX Ntilde Aring -20\nKPX Ntilde Atilde -20\nKPX O A -40\nKPX O Aacute -40\nKPX O Abreve -40\nKPX O Acircumflex -40\nKPX O Adieresis -40\nKPX O Agrave -40\nKPX O Amacron -40\nKPX O Aogonek -40\nKPX O Aring -40\nKPX O Atilde -40\nKPX O T -40\nKPX O Tcaron -40\nKPX O Tcommaaccent -40\nKPX O V -50\nKPX O W -50\nKPX O X -40\nKPX O Y -50\nKPX O Yacute -50\nKPX O Ydieresis -50\nKPX Oacute A -40\nKPX Oacute Aacute -40\nKPX Oacute Abreve -40\nKPX Oacute Acircumflex -40\nKPX Oacute Adieresis -40\nKPX Oacute Agrave -40\nKPX Oacute Amacron -40\nKPX Oacute Aogonek -40\nKPX Oacute Aring -40\nKPX Oacute Atilde -40\nKPX Oacute T -40\nKPX Oacute Tcaron -40\nKPX Oacute Tcommaaccent -40\nKPX Oacute V -50\nKPX Oacute W -50\nKPX Oacute X -40\nKPX Oacute Y -50\nKPX Oacute Yacute -50\nKPX Oacute Ydieresis -50\nKPX Ocircumflex A -40\nKPX Ocircumflex Aacute -40\nKPX Ocircumflex Abreve -40\nKPX Ocircumflex Acircumflex -40\nKPX Ocircumflex Adieresis -40\nKPX Ocircumflex Agrave -40\nKPX Ocircumflex Amacron -40\nKPX Ocircumflex Aogonek -40\nKPX Ocircumflex Aring -40\nKPX Ocircumflex Atilde -40\nKPX Ocircumflex T -40\nKPX Ocircumflex Tcaron -40\nKPX Ocircumflex Tcommaaccent -40\nKPX Ocircumflex V -50\nKPX Ocircumflex W -50\nKPX Ocircumflex X -40\nKPX Ocircumflex Y -50\nKPX Ocircumflex Yacute -50\nKPX Ocircumflex Ydieresis -50\nKPX Odieresis A -40\nKPX Odieresis Aacute -40\nKPX Odieresis Abreve -40\nKPX Odieresis Acircumflex -40\nKPX Odieresis Adieresis -40\nKPX Odieresis Agrave -40\nKPX Odieresis Amacron -40\nKPX Odieresis Aogonek -40\nKPX Odieresis Aring -40\nKPX Odieresis Atilde -40\nKPX Odieresis T -40\nKPX Odieresis Tcaron -40\nKPX Odieresis Tcommaaccent -40\nKPX Odieresis V -50\nKPX Odieresis W -50\nKPX Odieresis X -40\nKPX Odieresis Y -50\nKPX Odieresis Yacute -50\nKPX Odieresis Ydieresis -50\nKPX Ograve A -40\nKPX Ograve Aacute -40\nKPX Ograve Abreve -40\nKPX Ograve Acircumflex -40\nKPX Ograve Adieresis -40\nKPX Ograve Agrave -40\nKPX Ograve Amacron -40\nKPX Ograve Aogonek -40\nKPX Ograve Aring -40\nKPX Ograve Atilde -40\nKPX Ograve T -40\nKPX Ograve Tcaron -40\nKPX Ograve Tcommaaccent -40\nKPX Ograve V -50\nKPX Ograve W -50\nKPX Ograve X -40\nKPX Ograve Y -50\nKPX Ograve Yacute -50\nKPX Ograve Ydieresis -50\nKPX Ohungarumlaut A -40\nKPX Ohungarumlaut Aacute -40\nKPX Ohungarumlaut Abreve -40\nKPX Ohungarumlaut Acircumflex -40\nKPX Ohungarumlaut Adieresis -40\nKPX Ohungarumlaut Agrave -40\nKPX Ohungarumlaut Amacron -40\nKPX Ohungarumlaut Aogonek -40\nKPX Ohungarumlaut Aring -40\nKPX Ohungarumlaut Atilde -40\nKPX Ohungarumlaut T -40\nKPX Ohungarumlaut Tcaron -40\nKPX Ohungarumlaut Tcommaaccent -40\nKPX Ohungarumlaut V -50\nKPX Ohungarumlaut W -50\nKPX Ohungarumlaut X -40\nKPX Ohungarumlaut Y -50\nKPX Ohungarumlaut Yacute -50\nKPX Ohungarumlaut Ydieresis -50\nKPX Omacron A -40\nKPX Omacron Aacute -40\nKPX Omacron Abreve -40\nKPX Omacron Acircumflex -40\nKPX Omacron Adieresis -40\nKPX Omacron Agrave -40\nKPX Omacron Amacron -40\nKPX Omacron Aogonek -40\nKPX Omacron Aring -40\nKPX Omacron Atilde -40\nKPX Omacron T -40\nKPX Omacron Tcaron -40\nKPX Omacron Tcommaaccent -40\nKPX Omacron V -50\nKPX Omacron W -50\nKPX Omacron X -40\nKPX Omacron Y -50\nKPX Omacron Yacute -50\nKPX Omacron Ydieresis -50\nKPX Oslash A -40\nKPX Oslash Aacute -40\nKPX Oslash Abreve -40\nKPX Oslash Acircumflex -40\nKPX Oslash Adieresis -40\nKPX Oslash Agrave -40\nKPX Oslash Amacron -40\nKPX Oslash Aogonek -40\nKPX Oslash Aring -40\nKPX Oslash Atilde -40\nKPX Oslash T -40\nKPX Oslash Tcaron -40\nKPX Oslash Tcommaaccent -40\nKPX Oslash V -50\nKPX Oslash W -50\nKPX Oslash X -40\nKPX Oslash Y -50\nKPX Oslash Yacute -50\nKPX Oslash Ydieresis -50\nKPX Otilde A -40\nKPX Otilde Aacute -40\nKPX Otilde Abreve -40\nKPX Otilde Acircumflex -40\nKPX Otilde Adieresis -40\nKPX Otilde Agrave -40\nKPX Otilde Amacron -40\nKPX Otilde Aogonek -40\nKPX Otilde Aring -40\nKPX Otilde Atilde -40\nKPX Otilde T -40\nKPX Otilde Tcaron -40\nKPX Otilde Tcommaaccent -40\nKPX Otilde V -50\nKPX Otilde W -50\nKPX Otilde X -40\nKPX Otilde Y -50\nKPX Otilde Yacute -50\nKPX Otilde Ydieresis -50\nKPX P A -74\nKPX P Aacute -74\nKPX P Abreve -74\nKPX P Acircumflex -74\nKPX P Adieresis -74\nKPX P Agrave -74\nKPX P Amacron -74\nKPX P Aogonek -74\nKPX P Aring -74\nKPX P Atilde -74\nKPX P a -10\nKPX P aacute -10\nKPX P abreve -10\nKPX P acircumflex -10\nKPX P adieresis -10\nKPX P agrave -10\nKPX P amacron -10\nKPX P aogonek -10\nKPX P aring -10\nKPX P atilde -10\nKPX P comma -92\nKPX P e -20\nKPX P eacute -20\nKPX P ecaron -20\nKPX P ecircumflex -20\nKPX P edieresis -20\nKPX P edotaccent -20\nKPX P egrave -20\nKPX P emacron -20\nKPX P eogonek -20\nKPX P o -20\nKPX P oacute -20\nKPX P ocircumflex -20\nKPX P odieresis -20\nKPX P ograve -20\nKPX P ohungarumlaut -20\nKPX P omacron -20\nKPX P oslash -20\nKPX P otilde -20\nKPX P period -110\nKPX Q U -10\nKPX Q Uacute -10\nKPX Q Ucircumflex -10\nKPX Q Udieresis -10\nKPX Q Ugrave -10\nKPX Q Uhungarumlaut -10\nKPX Q Umacron -10\nKPX Q Uogonek -10\nKPX Q Uring -10\nKPX Q period -20\nKPX R O -30\nKPX R Oacute -30\nKPX R Ocircumflex -30\nKPX R Odieresis -30\nKPX R Ograve -30\nKPX R Ohungarumlaut -30\nKPX R Omacron -30\nKPX R Oslash -30\nKPX R Otilde -30\nKPX R T -40\nKPX R Tcaron -40\nKPX R Tcommaaccent -40\nKPX R U -30\nKPX R Uacute -30\nKPX R Ucircumflex -30\nKPX R Udieresis -30\nKPX R Ugrave -30\nKPX R Uhungarumlaut -30\nKPX R Umacron -30\nKPX R Uogonek -30\nKPX R Uring -30\nKPX R V -55\nKPX R W -35\nKPX R Y -35\nKPX R Yacute -35\nKPX R Ydieresis -35\nKPX Racute O -30\nKPX Racute Oacute -30\nKPX Racute Ocircumflex -30\nKPX Racute Odieresis -30\nKPX Racute Ograve -30\nKPX Racute Ohungarumlaut -30\nKPX Racute Omacron -30\nKPX Racute Oslash -30\nKPX Racute Otilde -30\nKPX Racute T -40\nKPX Racute Tcaron -40\nKPX Racute Tcommaaccent -40\nKPX Racute U -30\nKPX Racute Uacute -30\nKPX Racute Ucircumflex -30\nKPX Racute Udieresis -30\nKPX Racute Ugrave -30\nKPX Racute Uhungarumlaut -30\nKPX Racute Umacron -30\nKPX Racute Uogonek -30\nKPX Racute Uring -30\nKPX Racute V -55\nKPX Racute W -35\nKPX Racute Y -35\nKPX Racute Yacute -35\nKPX Racute Ydieresis -35\nKPX Rcaron O -30\nKPX Rcaron Oacute -30\nKPX Rcaron Ocircumflex -30\nKPX Rcaron Odieresis -30\nKPX Rcaron Ograve -30\nKPX Rcaron Ohungarumlaut -30\nKPX Rcaron Omacron -30\nKPX Rcaron Oslash -30\nKPX Rcaron Otilde -30\nKPX Rcaron T -40\nKPX Rcaron Tcaron -40\nKPX Rcaron Tcommaaccent -40\nKPX Rcaron U -30\nKPX Rcaron Uacute -30\nKPX Rcaron Ucircumflex -30\nKPX Rcaron Udieresis -30\nKPX Rcaron Ugrave -30\nKPX Rcaron Uhungarumlaut -30\nKPX Rcaron Umacron -30\nKPX Rcaron Uogonek -30\nKPX Rcaron Uring -30\nKPX Rcaron V -55\nKPX Rcaron W -35\nKPX Rcaron Y -35\nKPX Rcaron Yacute -35\nKPX Rcaron Ydieresis -35\nKPX Rcommaaccent O -30\nKPX Rcommaaccent Oacute -30\nKPX Rcommaaccent Ocircumflex -30\nKPX Rcommaaccent Odieresis -30\nKPX Rcommaaccent Ograve -30\nKPX Rcommaaccent Ohungarumlaut -30\nKPX Rcommaaccent Omacron -30\nKPX Rcommaaccent Oslash -30\nKPX Rcommaaccent Otilde -30\nKPX Rcommaaccent T -40\nKPX Rcommaaccent Tcaron -40\nKPX Rcommaaccent Tcommaaccent -40\nKPX Rcommaaccent U -30\nKPX Rcommaaccent Uacute -30\nKPX Rcommaaccent Ucircumflex -30\nKPX Rcommaaccent Udieresis -30\nKPX Rcommaaccent Ugrave -30\nKPX Rcommaaccent Uhungarumlaut -30\nKPX Rcommaaccent Umacron -30\nKPX Rcommaaccent Uogonek -30\nKPX Rcommaaccent Uring -30\nKPX Rcommaaccent V -55\nKPX Rcommaaccent W -35\nKPX Rcommaaccent Y -35\nKPX Rcommaaccent Yacute -35\nKPX Rcommaaccent Ydieresis -35\nKPX T A -90\nKPX T Aacute -90\nKPX T Abreve -90\nKPX T Acircumflex -90\nKPX T Adieresis -90\nKPX T Agrave -90\nKPX T Amacron -90\nKPX T Aogonek -90\nKPX T Aring -90\nKPX T Atilde -90\nKPX T O -18\nKPX T Oacute -18\nKPX T Ocircumflex -18\nKPX T Odieresis -18\nKPX T Ograve -18\nKPX T Ohungarumlaut -18\nKPX T Omacron -18\nKPX T Oslash -18\nKPX T Otilde -18\nKPX T a -92\nKPX T aacute -92\nKPX T abreve -52\nKPX T acircumflex -52\nKPX T adieresis -52\nKPX T agrave -52\nKPX T amacron -52\nKPX T aogonek -92\nKPX T aring -92\nKPX T atilde -52\nKPX T colon -74\nKPX T comma -74\nKPX T e -92\nKPX T eacute -92\nKPX T ecaron -92\nKPX T ecircumflex -92\nKPX T edieresis -52\nKPX T edotaccent -92\nKPX T egrave -52\nKPX T emacron -52\nKPX T eogonek -92\nKPX T hyphen -92\nKPX T i -18\nKPX T iacute -18\nKPX T iogonek -18\nKPX T o -92\nKPX T oacute -92\nKPX T ocircumflex -92\nKPX T odieresis -92\nKPX T ograve -92\nKPX T ohungarumlaut -92\nKPX T omacron -92\nKPX T oslash -92\nKPX T otilde -92\nKPX T period -90\nKPX T r -74\nKPX T racute -74\nKPX T rcaron -74\nKPX T rcommaaccent -74\nKPX T semicolon -74\nKPX T u -92\nKPX T uacute -92\nKPX T ucircumflex -92\nKPX T udieresis -92\nKPX T ugrave -92\nKPX T uhungarumlaut -92\nKPX T umacron -92\nKPX T uogonek -92\nKPX T uring -92\nKPX T w -74\nKPX T y -34\nKPX T yacute -34\nKPX T ydieresis -34\nKPX Tcaron A -90\nKPX Tcaron Aacute -90\nKPX Tcaron Abreve -90\nKPX Tcaron Acircumflex -90\nKPX Tcaron Adieresis -90\nKPX Tcaron Agrave -90\nKPX Tcaron Amacron -90\nKPX Tcaron Aogonek -90\nKPX Tcaron Aring -90\nKPX Tcaron Atilde -90\nKPX Tcaron O -18\nKPX Tcaron Oacute -18\nKPX Tcaron Ocircumflex -18\nKPX Tcaron Odieresis -18\nKPX Tcaron Ograve -18\nKPX Tcaron Ohungarumlaut -18\nKPX Tcaron Omacron -18\nKPX Tcaron Oslash -18\nKPX Tcaron Otilde -18\nKPX Tcaron a -92\nKPX Tcaron aacute -92\nKPX Tcaron abreve -52\nKPX Tcaron acircumflex -52\nKPX Tcaron adieresis -52\nKPX Tcaron agrave -52\nKPX Tcaron amacron -52\nKPX Tcaron aogonek -92\nKPX Tcaron aring -92\nKPX Tcaron atilde -52\nKPX Tcaron colon -74\nKPX Tcaron comma -74\nKPX Tcaron e -92\nKPX Tcaron eacute -92\nKPX Tcaron ecaron -92\nKPX Tcaron ecircumflex -92\nKPX Tcaron edieresis -52\nKPX Tcaron edotaccent -92\nKPX Tcaron egrave -52\nKPX Tcaron emacron -52\nKPX Tcaron eogonek -92\nKPX Tcaron hyphen -92\nKPX Tcaron i -18\nKPX Tcaron iacute -18\nKPX Tcaron iogonek -18\nKPX Tcaron o -92\nKPX Tcaron oacute -92\nKPX Tcaron ocircumflex -92\nKPX Tcaron odieresis -92\nKPX Tcaron ograve -92\nKPX Tcaron ohungarumlaut -92\nKPX Tcaron omacron -92\nKPX Tcaron oslash -92\nKPX Tcaron otilde -92\nKPX Tcaron period -90\nKPX Tcaron r -74\nKPX Tcaron racute -74\nKPX Tcaron rcaron -74\nKPX Tcaron rcommaaccent -74\nKPX Tcaron semicolon -74\nKPX Tcaron u -92\nKPX Tcaron uacute -92\nKPX Tcaron ucircumflex -92\nKPX Tcaron udieresis -92\nKPX Tcaron ugrave -92\nKPX Tcaron uhungarumlaut -92\nKPX Tcaron umacron -92\nKPX Tcaron uogonek -92\nKPX Tcaron uring -92\nKPX Tcaron w -74\nKPX Tcaron y -34\nKPX Tcaron yacute -34\nKPX Tcaron ydieresis -34\nKPX Tcommaaccent A -90\nKPX Tcommaaccent Aacute -90\nKPX Tcommaaccent Abreve -90\nKPX Tcommaaccent Acircumflex -90\nKPX Tcommaaccent Adieresis -90\nKPX Tcommaaccent Agrave -90\nKPX Tcommaaccent Amacron -90\nKPX Tcommaaccent Aogonek -90\nKPX Tcommaaccent Aring -90\nKPX Tcommaaccent Atilde -90\nKPX Tcommaaccent O -18\nKPX Tcommaaccent Oacute -18\nKPX Tcommaaccent Ocircumflex -18\nKPX Tcommaaccent Odieresis -18\nKPX Tcommaaccent Ograve -18\nKPX Tcommaaccent Ohungarumlaut -18\nKPX Tcommaaccent Omacron -18\nKPX Tcommaaccent Oslash -18\nKPX Tcommaaccent Otilde -18\nKPX Tcommaaccent a -92\nKPX Tcommaaccent aacute -92\nKPX Tcommaaccent abreve -52\nKPX Tcommaaccent acircumflex -52\nKPX Tcommaaccent adieresis -52\nKPX Tcommaaccent agrave -52\nKPX Tcommaaccent amacron -52\nKPX Tcommaaccent aogonek -92\nKPX Tcommaaccent aring -92\nKPX Tcommaaccent atilde -52\nKPX Tcommaaccent colon -74\nKPX Tcommaaccent comma -74\nKPX Tcommaaccent e -92\nKPX Tcommaaccent eacute -92\nKPX Tcommaaccent ecaron -92\nKPX Tcommaaccent ecircumflex -92\nKPX Tcommaaccent edieresis -52\nKPX Tcommaaccent edotaccent -92\nKPX Tcommaaccent egrave -52\nKPX Tcommaaccent emacron -52\nKPX Tcommaaccent eogonek -92\nKPX Tcommaaccent hyphen -92\nKPX Tcommaaccent i -18\nKPX Tcommaaccent iacute -18\nKPX Tcommaaccent iogonek -18\nKPX Tcommaaccent o -92\nKPX Tcommaaccent oacute -92\nKPX Tcommaaccent ocircumflex -92\nKPX Tcommaaccent odieresis -92\nKPX Tcommaaccent ograve -92\nKPX Tcommaaccent ohungarumlaut -92\nKPX Tcommaaccent omacron -92\nKPX Tcommaaccent oslash -92\nKPX Tcommaaccent otilde -92\nKPX Tcommaaccent period -90\nKPX Tcommaaccent r -74\nKPX Tcommaaccent racute -74\nKPX Tcommaaccent rcaron -74\nKPX Tcommaaccent rcommaaccent -74\nKPX Tcommaaccent semicolon -74\nKPX Tcommaaccent u -92\nKPX Tcommaaccent uacute -92\nKPX Tcommaaccent ucircumflex -92\nKPX Tcommaaccent udieresis -92\nKPX Tcommaaccent ugrave -92\nKPX Tcommaaccent uhungarumlaut -92\nKPX Tcommaaccent umacron -92\nKPX Tcommaaccent uogonek -92\nKPX Tcommaaccent uring -92\nKPX Tcommaaccent w -74\nKPX Tcommaaccent y -34\nKPX Tcommaaccent yacute -34\nKPX Tcommaaccent ydieresis -34\nKPX U A -60\nKPX U Aacute -60\nKPX U Abreve -60\nKPX U Acircumflex -60\nKPX U Adieresis -60\nKPX U Agrave -60\nKPX U Amacron -60\nKPX U Aogonek -60\nKPX U Aring -60\nKPX U Atilde -60\nKPX U comma -50\nKPX U period -50\nKPX Uacute A -60\nKPX Uacute Aacute -60\nKPX Uacute Abreve -60\nKPX Uacute Acircumflex -60\nKPX Uacute Adieresis -60\nKPX Uacute Agrave -60\nKPX Uacute Amacron -60\nKPX Uacute Aogonek -60\nKPX Uacute Aring -60\nKPX Uacute Atilde -60\nKPX Uacute comma -50\nKPX Uacute period -50\nKPX Ucircumflex A -60\nKPX Ucircumflex Aacute -60\nKPX Ucircumflex Abreve -60\nKPX Ucircumflex Acircumflex -60\nKPX Ucircumflex Adieresis -60\nKPX Ucircumflex Agrave -60\nKPX Ucircumflex Amacron -60\nKPX Ucircumflex Aogonek -60\nKPX Ucircumflex Aring -60\nKPX Ucircumflex Atilde -60\nKPX Ucircumflex comma -50\nKPX Ucircumflex period -50\nKPX Udieresis A -60\nKPX Udieresis Aacute -60\nKPX Udieresis Abreve -60\nKPX Udieresis Acircumflex -60\nKPX Udieresis Adieresis -60\nKPX Udieresis Agrave -60\nKPX Udieresis Amacron -60\nKPX Udieresis Aogonek -60\nKPX Udieresis Aring -60\nKPX Udieresis Atilde -60\nKPX Udieresis comma -50\nKPX Udieresis period -50\nKPX Ugrave A -60\nKPX Ugrave Aacute -60\nKPX Ugrave Abreve -60\nKPX Ugrave Acircumflex -60\nKPX Ugrave Adieresis -60\nKPX Ugrave Agrave -60\nKPX Ugrave Amacron -60\nKPX Ugrave Aogonek -60\nKPX Ugrave Aring -60\nKPX Ugrave Atilde -60\nKPX Ugrave comma -50\nKPX Ugrave period -50\nKPX Uhungarumlaut A -60\nKPX Uhungarumlaut Aacute -60\nKPX Uhungarumlaut Abreve -60\nKPX Uhungarumlaut Acircumflex -60\nKPX Uhungarumlaut Adieresis -60\nKPX Uhungarumlaut Agrave -60\nKPX Uhungarumlaut Amacron -60\nKPX Uhungarumlaut Aogonek -60\nKPX Uhungarumlaut Aring -60\nKPX Uhungarumlaut Atilde -60\nKPX Uhungarumlaut comma -50\nKPX Uhungarumlaut period -50\nKPX Umacron A -60\nKPX Umacron Aacute -60\nKPX Umacron Abreve -60\nKPX Umacron Acircumflex -60\nKPX Umacron Adieresis -60\nKPX Umacron Agrave -60\nKPX Umacron Amacron -60\nKPX Umacron Aogonek -60\nKPX Umacron Aring -60\nKPX Umacron Atilde -60\nKPX Umacron comma -50\nKPX Umacron period -50\nKPX Uogonek A -60\nKPX Uogonek Aacute -60\nKPX Uogonek Abreve -60\nKPX Uogonek Acircumflex -60\nKPX Uogonek Adieresis -60\nKPX Uogonek Agrave -60\nKPX Uogonek Amacron -60\nKPX Uogonek Aogonek -60\nKPX Uogonek Aring -60\nKPX Uogonek Atilde -60\nKPX Uogonek comma -50\nKPX Uogonek period -50\nKPX Uring A -60\nKPX Uring Aacute -60\nKPX Uring Abreve -60\nKPX Uring Acircumflex -60\nKPX Uring Adieresis -60\nKPX Uring Agrave -60\nKPX Uring Amacron -60\nKPX Uring Aogonek -60\nKPX Uring Aring -60\nKPX Uring Atilde -60\nKPX Uring comma -50\nKPX Uring period -50\nKPX V A -135\nKPX V Aacute -135\nKPX V Abreve -135\nKPX V Acircumflex -135\nKPX V Adieresis -135\nKPX V Agrave -135\nKPX V Amacron -135\nKPX V Aogonek -135\nKPX V Aring -135\nKPX V Atilde -135\nKPX V G -30\nKPX V Gbreve -30\nKPX V Gcommaaccent -30\nKPX V O -45\nKPX V Oacute -45\nKPX V Ocircumflex -45\nKPX V Odieresis -45\nKPX V Ograve -45\nKPX V Ohungarumlaut -45\nKPX V Omacron -45\nKPX V Oslash -45\nKPX V Otilde -45\nKPX V a -92\nKPX V aacute -92\nKPX V abreve -92\nKPX V acircumflex -92\nKPX V adieresis -92\nKPX V agrave -92\nKPX V amacron -92\nKPX V aogonek -92\nKPX V aring -92\nKPX V atilde -92\nKPX V colon -92\nKPX V comma -129\nKPX V e -100\nKPX V eacute -100\nKPX V ecaron -100\nKPX V ecircumflex -100\nKPX V edieresis -100\nKPX V edotaccent -100\nKPX V egrave -100\nKPX V emacron -100\nKPX V eogonek -100\nKPX V hyphen -74\nKPX V i -37\nKPX V iacute -37\nKPX V icircumflex -37\nKPX V idieresis -37\nKPX V igrave -37\nKPX V imacron -37\nKPX V iogonek -37\nKPX V o -100\nKPX V oacute -100\nKPX V ocircumflex -100\nKPX V odieresis -100\nKPX V ograve -100\nKPX V ohungarumlaut -100\nKPX V omacron -100\nKPX V oslash -100\nKPX V otilde -100\nKPX V period -145\nKPX V semicolon -92\nKPX V u -92\nKPX V uacute -92\nKPX V ucircumflex -92\nKPX V udieresis -92\nKPX V ugrave -92\nKPX V uhungarumlaut -92\nKPX V umacron -92\nKPX V uogonek -92\nKPX V uring -92\nKPX W A -120\nKPX W Aacute -120\nKPX W Abreve -120\nKPX W Acircumflex -120\nKPX W Adieresis -120\nKPX W Agrave -120\nKPX W Amacron -120\nKPX W Aogonek -120\nKPX W Aring -120\nKPX W Atilde -120\nKPX W O -10\nKPX W Oacute -10\nKPX W Ocircumflex -10\nKPX W Odieresis -10\nKPX W Ograve -10\nKPX W Ohungarumlaut -10\nKPX W Omacron -10\nKPX W Oslash -10\nKPX W Otilde -10\nKPX W a -65\nKPX W aacute -65\nKPX W abreve -65\nKPX W acircumflex -65\nKPX W adieresis -65\nKPX W agrave -65\nKPX W amacron -65\nKPX W aogonek -65\nKPX W aring -65\nKPX W atilde -65\nKPX W colon -55\nKPX W comma -92\nKPX W e -65\nKPX W eacute -65\nKPX W ecaron -65\nKPX W ecircumflex -65\nKPX W edieresis -65\nKPX W edotaccent -65\nKPX W egrave -65\nKPX W emacron -65\nKPX W eogonek -65\nKPX W hyphen -37\nKPX W i -18\nKPX W iacute -18\nKPX W iogonek -18\nKPX W o -75\nKPX W oacute -75\nKPX W ocircumflex -75\nKPX W odieresis -75\nKPX W ograve -75\nKPX W ohungarumlaut -75\nKPX W omacron -75\nKPX W oslash -75\nKPX W otilde -75\nKPX W period -92\nKPX W semicolon -55\nKPX W u -50\nKPX W uacute -50\nKPX W ucircumflex -50\nKPX W udieresis -50\nKPX W ugrave -50\nKPX W uhungarumlaut -50\nKPX W umacron -50\nKPX W uogonek -50\nKPX W uring -50\nKPX W y -60\nKPX W yacute -60\nKPX W ydieresis -60\nKPX Y A -110\nKPX Y Aacute -110\nKPX Y Abreve -110\nKPX Y Acircumflex -110\nKPX Y Adieresis -110\nKPX Y Agrave -110\nKPX Y Amacron -110\nKPX Y Aogonek -110\nKPX Y Aring -110\nKPX Y Atilde -110\nKPX Y O -35\nKPX Y Oacute -35\nKPX Y Ocircumflex -35\nKPX Y Odieresis -35\nKPX Y Ograve -35\nKPX Y Ohungarumlaut -35\nKPX Y Omacron -35\nKPX Y Oslash -35\nKPX Y Otilde -35\nKPX Y a -85\nKPX Y aacute -85\nKPX Y abreve -85\nKPX Y acircumflex -85\nKPX Y adieresis -85\nKPX Y agrave -85\nKPX Y amacron -85\nKPX Y aogonek -85\nKPX Y aring -85\nKPX Y atilde -85\nKPX Y colon -92\nKPX Y comma -92\nKPX Y e -111\nKPX Y eacute -111\nKPX Y ecaron -111\nKPX Y ecircumflex -111\nKPX Y edieresis -71\nKPX Y edotaccent -111\nKPX Y egrave -71\nKPX Y emacron -71\nKPX Y eogonek -111\nKPX Y hyphen -92\nKPX Y i -37\nKPX Y iacute -37\nKPX Y iogonek -37\nKPX Y o -111\nKPX Y oacute -111\nKPX Y ocircumflex -111\nKPX Y odieresis -111\nKPX Y ograve -111\nKPX Y ohungarumlaut -111\nKPX Y omacron -111\nKPX Y oslash -111\nKPX Y otilde -111\nKPX Y period -92\nKPX Y semicolon -92\nKPX Y u -92\nKPX Y uacute -92\nKPX Y ucircumflex -92\nKPX Y udieresis -92\nKPX Y ugrave -92\nKPX Y uhungarumlaut -92\nKPX Y umacron -92\nKPX Y uogonek -92\nKPX Y uring -92\nKPX Yacute A -110\nKPX Yacute Aacute -110\nKPX Yacute Abreve -110\nKPX Yacute Acircumflex -110\nKPX Yacute Adieresis -110\nKPX Yacute Agrave -110\nKPX Yacute Amacron -110\nKPX Yacute Aogonek -110\nKPX Yacute Aring -110\nKPX Yacute Atilde -110\nKPX Yacute O -35\nKPX Yacute Oacute -35\nKPX Yacute Ocircumflex -35\nKPX Yacute Odieresis -35\nKPX Yacute Ograve -35\nKPX Yacute Ohungarumlaut -35\nKPX Yacute Omacron -35\nKPX Yacute Oslash -35\nKPX Yacute Otilde -35\nKPX Yacute a -85\nKPX Yacute aacute -85\nKPX Yacute abreve -85\nKPX Yacute acircumflex -85\nKPX Yacute adieresis -85\nKPX Yacute agrave -85\nKPX Yacute amacron -85\nKPX Yacute aogonek -85\nKPX Yacute aring -85\nKPX Yacute atilde -85\nKPX Yacute colon -92\nKPX Yacute comma -92\nKPX Yacute e -111\nKPX Yacute eacute -111\nKPX Yacute ecaron -111\nKPX Yacute ecircumflex -111\nKPX Yacute edieresis -71\nKPX Yacute edotaccent -111\nKPX Yacute egrave -71\nKPX Yacute emacron -71\nKPX Yacute eogonek -111\nKPX Yacute hyphen -92\nKPX Yacute i -37\nKPX Yacute iacute -37\nKPX Yacute iogonek -37\nKPX Yacute o -111\nKPX Yacute oacute -111\nKPX Yacute ocircumflex -111\nKPX Yacute odieresis -111\nKPX Yacute ograve -111\nKPX Yacute ohungarumlaut -111\nKPX Yacute omacron -111\nKPX Yacute oslash -111\nKPX Yacute otilde -111\nKPX Yacute period -92\nKPX Yacute semicolon -92\nKPX Yacute u -92\nKPX Yacute uacute -92\nKPX Yacute ucircumflex -92\nKPX Yacute udieresis -92\nKPX Yacute ugrave -92\nKPX Yacute uhungarumlaut -92\nKPX Yacute umacron -92\nKPX Yacute uogonek -92\nKPX Yacute uring -92\nKPX Ydieresis A -110\nKPX Ydieresis Aacute -110\nKPX Ydieresis Abreve -110\nKPX Ydieresis Acircumflex -110\nKPX Ydieresis Adieresis -110\nKPX Ydieresis Agrave -110\nKPX Ydieresis Amacron -110\nKPX Ydieresis Aogonek -110\nKPX Ydieresis Aring -110\nKPX Ydieresis Atilde -110\nKPX Ydieresis O -35\nKPX Ydieresis Oacute -35\nKPX Ydieresis Ocircumflex -35\nKPX Ydieresis Odieresis -35\nKPX Ydieresis Ograve -35\nKPX Ydieresis Ohungarumlaut -35\nKPX Ydieresis Omacron -35\nKPX Ydieresis Oslash -35\nKPX Ydieresis Otilde -35\nKPX Ydieresis a -85\nKPX Ydieresis aacute -85\nKPX Ydieresis abreve -85\nKPX Ydieresis acircumflex -85\nKPX Ydieresis adieresis -85\nKPX Ydieresis agrave -85\nKPX Ydieresis amacron -85\nKPX Ydieresis aogonek -85\nKPX Ydieresis aring -85\nKPX Ydieresis atilde -85\nKPX Ydieresis colon -92\nKPX Ydieresis comma -92\nKPX Ydieresis e -111\nKPX Ydieresis eacute -111\nKPX Ydieresis ecaron -111\nKPX Ydieresis ecircumflex -111\nKPX Ydieresis edieresis -71\nKPX Ydieresis edotaccent -111\nKPX Ydieresis egrave -71\nKPX Ydieresis emacron -71\nKPX Ydieresis eogonek -111\nKPX Ydieresis hyphen -92\nKPX Ydieresis i -37\nKPX Ydieresis iacute -37\nKPX Ydieresis iogonek -37\nKPX Ydieresis o -111\nKPX Ydieresis oacute -111\nKPX Ydieresis ocircumflex -111\nKPX Ydieresis odieresis -111\nKPX Ydieresis ograve -111\nKPX Ydieresis ohungarumlaut -111\nKPX Ydieresis omacron -111\nKPX Ydieresis oslash -111\nKPX Ydieresis otilde -111\nKPX Ydieresis period -92\nKPX Ydieresis semicolon -92\nKPX Ydieresis u -92\nKPX Ydieresis uacute -92\nKPX Ydieresis ucircumflex -92\nKPX Ydieresis udieresis -92\nKPX Ydieresis ugrave -92\nKPX Ydieresis uhungarumlaut -92\nKPX Ydieresis umacron -92\nKPX Ydieresis uogonek -92\nKPX Ydieresis uring -92\nKPX a v -25\nKPX aacute v -25\nKPX abreve v -25\nKPX acircumflex v -25\nKPX adieresis v -25\nKPX agrave v -25\nKPX amacron v -25\nKPX aogonek v -25\nKPX aring v -25\nKPX atilde v -25\nKPX b b -10\nKPX b period -40\nKPX b u -20\nKPX b uacute -20\nKPX b ucircumflex -20\nKPX b udieresis -20\nKPX b ugrave -20\nKPX b uhungarumlaut -20\nKPX b umacron -20\nKPX b uogonek -20\nKPX b uring -20\nKPX b v -15\nKPX comma quotedblright -45\nKPX comma quoteright -55\nKPX d w -15\nKPX dcroat w -15\nKPX e v -15\nKPX eacute v -15\nKPX ecaron v -15\nKPX ecircumflex v -15\nKPX edieresis v -15\nKPX edotaccent v -15\nKPX egrave v -15\nKPX emacron v -15\nKPX eogonek v -15\nKPX f comma -15\nKPX f dotlessi -35\nKPX f i -25\nKPX f o -25\nKPX f oacute -25\nKPX f ocircumflex -25\nKPX f odieresis -25\nKPX f ograve -25\nKPX f ohungarumlaut -25\nKPX f omacron -25\nKPX f oslash -25\nKPX f otilde -25\nKPX f period -15\nKPX f quotedblright 50\nKPX f quoteright 55\nKPX g period -15\nKPX gbreve period -15\nKPX gcommaaccent period -15\nKPX h y -15\nKPX h yacute -15\nKPX h ydieresis -15\nKPX i v -10\nKPX iacute v -10\nKPX icircumflex v -10\nKPX idieresis v -10\nKPX igrave v -10\nKPX imacron v -10\nKPX iogonek v -10\nKPX k e -10\nKPX k eacute -10\nKPX k ecaron -10\nKPX k ecircumflex -10\nKPX k edieresis -10\nKPX k edotaccent -10\nKPX k egrave -10\nKPX k emacron -10\nKPX k eogonek -10\nKPX k o -15\nKPX k oacute -15\nKPX k ocircumflex -15\nKPX k odieresis -15\nKPX k ograve -15\nKPX k ohungarumlaut -15\nKPX k omacron -15\nKPX k oslash -15\nKPX k otilde -15\nKPX k y -15\nKPX k yacute -15\nKPX k ydieresis -15\nKPX kcommaaccent e -10\nKPX kcommaaccent eacute -10\nKPX kcommaaccent ecaron -10\nKPX kcommaaccent ecircumflex -10\nKPX kcommaaccent edieresis -10\nKPX kcommaaccent edotaccent -10\nKPX kcommaaccent egrave -10\nKPX kcommaaccent emacron -10\nKPX kcommaaccent eogonek -10\nKPX kcommaaccent o -15\nKPX kcommaaccent oacute -15\nKPX kcommaaccent ocircumflex -15\nKPX kcommaaccent odieresis -15\nKPX kcommaaccent ograve -15\nKPX kcommaaccent ohungarumlaut -15\nKPX kcommaaccent omacron -15\nKPX kcommaaccent oslash -15\nKPX kcommaaccent otilde -15\nKPX kcommaaccent y -15\nKPX kcommaaccent yacute -15\nKPX kcommaaccent ydieresis -15\nKPX n v -40\nKPX nacute v -40\nKPX ncaron v -40\nKPX ncommaaccent v -40\nKPX ntilde v -40\nKPX o v -10\nKPX o w -10\nKPX oacute v -10\nKPX oacute w -10\nKPX ocircumflex v -10\nKPX ocircumflex w -10\nKPX odieresis v -10\nKPX odieresis w -10\nKPX ograve v -10\nKPX ograve w -10\nKPX ohungarumlaut v -10\nKPX ohungarumlaut w -10\nKPX omacron v -10\nKPX omacron w -10\nKPX oslash v -10\nKPX oslash w -10\nKPX otilde v -10\nKPX otilde w -10\nKPX period quotedblright -55\nKPX period quoteright -55\nKPX quotedblleft A -10\nKPX quotedblleft Aacute -10\nKPX quotedblleft Abreve -10\nKPX quotedblleft Acircumflex -10\nKPX quotedblleft Adieresis -10\nKPX quotedblleft Agrave -10\nKPX quotedblleft Amacron -10\nKPX quotedblleft Aogonek -10\nKPX quotedblleft Aring -10\nKPX quotedblleft Atilde -10\nKPX quoteleft A -10\nKPX quoteleft Aacute -10\nKPX quoteleft Abreve -10\nKPX quoteleft Acircumflex -10\nKPX quoteleft Adieresis -10\nKPX quoteleft Agrave -10\nKPX quoteleft Amacron -10\nKPX quoteleft Aogonek -10\nKPX quoteleft Aring -10\nKPX quoteleft Atilde -10\nKPX quoteleft quoteleft -63\nKPX quoteright d -20\nKPX quoteright dcroat -20\nKPX quoteright quoteright -63\nKPX quoteright r -20\nKPX quoteright racute -20\nKPX quoteright rcaron -20\nKPX quoteright rcommaaccent -20\nKPX quoteright s -37\nKPX quoteright sacute -37\nKPX quoteright scaron -37\nKPX quoteright scedilla -37\nKPX quoteright scommaaccent -37\nKPX quoteright space -74\nKPX quoteright v -20\nKPX r c -18\nKPX r cacute -18\nKPX r ccaron -18\nKPX r ccedilla -18\nKPX r comma -92\nKPX r e -18\nKPX r eacute -18\nKPX r ecaron -18\nKPX r ecircumflex -18\nKPX r edieresis -18\nKPX r edotaccent -18\nKPX r egrave -18\nKPX r emacron -18\nKPX r eogonek -18\nKPX r g -10\nKPX r gbreve -10\nKPX r gcommaaccent -10\nKPX r hyphen -37\nKPX r n -15\nKPX r nacute -15\nKPX r ncaron -15\nKPX r ncommaaccent -15\nKPX r ntilde -15\nKPX r o -18\nKPX r oacute -18\nKPX r ocircumflex -18\nKPX r odieresis -18\nKPX r ograve -18\nKPX r ohungarumlaut -18\nKPX r omacron -18\nKPX r oslash -18\nKPX r otilde -18\nKPX r p -10\nKPX r period -100\nKPX r q -18\nKPX r v -10\nKPX racute c -18\nKPX racute cacute -18\nKPX racute ccaron -18\nKPX racute ccedilla -18\nKPX racute comma -92\nKPX racute e -18\nKPX racute eacute -18\nKPX racute ecaron -18\nKPX racute ecircumflex -18\nKPX racute edieresis -18\nKPX racute edotaccent -18\nKPX racute egrave -18\nKPX racute emacron -18\nKPX racute eogonek -18\nKPX racute g -10\nKPX racute gbreve -10\nKPX racute gcommaaccent -10\nKPX racute hyphen -37\nKPX racute n -15\nKPX racute nacute -15\nKPX racute ncaron -15\nKPX racute ncommaaccent -15\nKPX racute ntilde -15\nKPX racute o -18\nKPX racute oacute -18\nKPX racute ocircumflex -18\nKPX racute odieresis -18\nKPX racute ograve -18\nKPX racute ohungarumlaut -18\nKPX racute omacron -18\nKPX racute oslash -18\nKPX racute otilde -18\nKPX racute p -10\nKPX racute period -100\nKPX racute q -18\nKPX racute v -10\nKPX rcaron c -18\nKPX rcaron cacute -18\nKPX rcaron ccaron -18\nKPX rcaron ccedilla -18\nKPX rcaron comma -92\nKPX rcaron e -18\nKPX rcaron eacute -18\nKPX rcaron ecaron -18\nKPX rcaron ecircumflex -18\nKPX rcaron edieresis -18\nKPX rcaron edotaccent -18\nKPX rcaron egrave -18\nKPX rcaron emacron -18\nKPX rcaron eogonek -18\nKPX rcaron g -10\nKPX rcaron gbreve -10\nKPX rcaron gcommaaccent -10\nKPX rcaron hyphen -37\nKPX rcaron n -15\nKPX rcaron nacute -15\nKPX rcaron ncaron -15\nKPX rcaron ncommaaccent -15\nKPX rcaron ntilde -15\nKPX rcaron o -18\nKPX rcaron oacute -18\nKPX rcaron ocircumflex -18\nKPX rcaron odieresis -18\nKPX rcaron ograve -18\nKPX rcaron ohungarumlaut -18\nKPX rcaron omacron -18\nKPX rcaron oslash -18\nKPX rcaron otilde -18\nKPX rcaron p -10\nKPX rcaron period -100\nKPX rcaron q -18\nKPX rcaron v -10\nKPX rcommaaccent c -18\nKPX rcommaaccent cacute -18\nKPX rcommaaccent ccaron -18\nKPX rcommaaccent ccedilla -18\nKPX rcommaaccent comma -92\nKPX rcommaaccent e -18\nKPX rcommaaccent eacute -18\nKPX rcommaaccent ecaron -18\nKPX rcommaaccent ecircumflex -18\nKPX rcommaaccent edieresis -18\nKPX rcommaaccent edotaccent -18\nKPX rcommaaccent egrave -18\nKPX rcommaaccent emacron -18\nKPX rcommaaccent eogonek -18\nKPX rcommaaccent g -10\nKPX rcommaaccent gbreve -10\nKPX rcommaaccent gcommaaccent -10\nKPX rcommaaccent hyphen -37\nKPX rcommaaccent n -15\nKPX rcommaaccent nacute -15\nKPX rcommaaccent ncaron -15\nKPX rcommaaccent ncommaaccent -15\nKPX rcommaaccent ntilde -15\nKPX rcommaaccent o -18\nKPX rcommaaccent oacute -18\nKPX rcommaaccent ocircumflex -18\nKPX rcommaaccent odieresis -18\nKPX rcommaaccent ograve -18\nKPX rcommaaccent ohungarumlaut -18\nKPX rcommaaccent omacron -18\nKPX rcommaaccent oslash -18\nKPX rcommaaccent otilde -18\nKPX rcommaaccent p -10\nKPX rcommaaccent period -100\nKPX rcommaaccent q -18\nKPX rcommaaccent v -10\nKPX space A -55\nKPX space Aacute -55\nKPX space Abreve -55\nKPX space Acircumflex -55\nKPX space Adieresis -55\nKPX space Agrave -55\nKPX space Amacron -55\nKPX space Aogonek -55\nKPX space Aring -55\nKPX space Atilde -55\nKPX space T -30\nKPX space Tcaron -30\nKPX space Tcommaaccent -30\nKPX space V -45\nKPX space W -30\nKPX space Y -55\nKPX space Yacute -55\nKPX space Ydieresis -55\nKPX v a -10\nKPX v aacute -10\nKPX v abreve -10\nKPX v acircumflex -10\nKPX v adieresis -10\nKPX v agrave -10\nKPX v amacron -10\nKPX v aogonek -10\nKPX v aring -10\nKPX v atilde -10\nKPX v comma -55\nKPX v e -10\nKPX v eacute -10\nKPX v ecaron -10\nKPX v ecircumflex -10\nKPX v edieresis -10\nKPX v edotaccent -10\nKPX v egrave -10\nKPX v emacron -10\nKPX v eogonek -10\nKPX v o -10\nKPX v oacute -10\nKPX v ocircumflex -10\nKPX v odieresis -10\nKPX v ograve -10\nKPX v ohungarumlaut -10\nKPX v omacron -10\nKPX v oslash -10\nKPX v otilde -10\nKPX v period -70\nKPX w comma -55\nKPX w o -10\nKPX w oacute -10\nKPX w ocircumflex -10\nKPX w odieresis -10\nKPX w ograve -10\nKPX w ohungarumlaut -10\nKPX w omacron -10\nKPX w oslash -10\nKPX w otilde -10\nKPX w period -70\nKPX y comma -55\nKPX y e -10\nKPX y eacute -10\nKPX y ecaron -10\nKPX y ecircumflex -10\nKPX y edieresis -10\nKPX y edotaccent -10\nKPX y egrave -10\nKPX y emacron -10\nKPX y eogonek -10\nKPX y o -25\nKPX y oacute -25\nKPX y ocircumflex -25\nKPX y odieresis -25\nKPX y ograve -25\nKPX y ohungarumlaut -25\nKPX y omacron -25\nKPX y oslash -25\nKPX y otilde -25\nKPX y period -70\nKPX yacute comma -55\nKPX yacute e -10\nKPX yacute eacute -10\nKPX yacute ecaron -10\nKPX yacute ecircumflex -10\nKPX yacute edieresis -10\nKPX yacute edotaccent -10\nKPX yacute egrave -10\nKPX yacute emacron -10\nKPX yacute eogonek -10\nKPX yacute o -25\nKPX yacute oacute -25\nKPX yacute ocircumflex -25\nKPX yacute odieresis -25\nKPX yacute ograve -25\nKPX yacute ohungarumlaut -25\nKPX yacute omacron -25\nKPX yacute oslash -25\nKPX yacute otilde -25\nKPX yacute period -70\nKPX ydieresis comma -55\nKPX ydieresis e -10\nKPX ydieresis eacute -10\nKPX ydieresis ecaron -10\nKPX ydieresis ecircumflex -10\nKPX ydieresis edieresis -10\nKPX ydieresis edotaccent -10\nKPX ydieresis egrave -10\nKPX ydieresis emacron -10\nKPX ydieresis eogonek -10\nKPX ydieresis o -25\nKPX ydieresis oacute -25\nKPX ydieresis ocircumflex -25\nKPX ydieresis odieresis -25\nKPX ydieresis ograve -25\nKPX ydieresis ohungarumlaut -25\nKPX ydieresis omacron -25\nKPX ydieresis oslash -25\nKPX ydieresis otilde -25\nKPX ydieresis period -70\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/pdfcorefonts/Times-BoldItalic.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 13:04:06 1997\nComment UniqueID 43066\nComment VMusage 45874 56899\nFontName Times-BoldItalic\nFullName Times Bold Italic\nFamilyName Times\nWeight Bold\nItalicAngle -15\nIsFixedPitch false\nCharacterSet ExtendedRoman\nFontBBox -200 -218 996 921 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 669\nXHeight 462\nAscender 683\nDescender -217\nStdHW 42\nStdVW 121\nStartCharMetrics 315\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 389 ; N exclam ; B 67 -13 370 684 ;\nC 34 ; WX 555 ; N quotedbl ; B 136 398 536 685 ;\nC 35 ; WX 500 ; N numbersign ; B -33 0 533 700 ;\nC 36 ; WX 500 ; N dollar ; B -20 -100 497 733 ;\nC 37 ; WX 833 ; N percent ; B 39 -10 793 692 ;\nC 38 ; WX 778 ; N ampersand ; B 5 -19 699 682 ;\nC 39 ; WX 333 ; N quoteright ; B 98 369 302 685 ;\nC 40 ; WX 333 ; N parenleft ; B 28 -179 344 685 ;\nC 41 ; WX 333 ; N parenright ; B -44 -179 271 685 ;\nC 42 ; WX 500 ; N asterisk ; B 65 249 456 685 ;\nC 43 ; WX 570 ; N plus ; B 33 0 537 506 ;\nC 44 ; WX 250 ; N comma ; B -60 -182 144 134 ;\nC 45 ; WX 333 ; N hyphen ; B 2 166 271 282 ;\nC 46 ; WX 250 ; N period ; B -9 -13 139 135 ;\nC 47 ; WX 278 ; N slash ; B -64 -18 342 685 ;\nC 48 ; WX 500 ; N zero ; B 17 -14 477 683 ;\nC 49 ; WX 500 ; N one ; B 5 0 419 683 ;\nC 50 ; WX 500 ; N two ; B -27 0 446 683 ;\nC 51 ; WX 500 ; N three ; B -15 -13 450 683 ;\nC 52 ; WX 500 ; N four ; B -15 0 503 683 ;\nC 53 ; WX 500 ; N five ; B -11 -13 487 669 ;\nC 54 ; WX 500 ; N six ; B 23 -15 509 679 ;\nC 55 ; WX 500 ; N seven ; B 52 0 525 669 ;\nC 56 ; WX 500 ; N eight ; B 3 -13 476 683 ;\nC 57 ; WX 500 ; N nine ; B -12 -10 475 683 ;\nC 58 ; WX 333 ; N colon ; B 23 -13 264 459 ;\nC 59 ; WX 333 ; N semicolon ; B -25 -183 264 459 ;\nC 60 ; WX 570 ; N less ; B 31 -8 539 514 ;\nC 61 ; WX 570 ; N equal ; B 33 107 537 399 ;\nC 62 ; WX 570 ; N greater ; B 31 -8 539 514 ;\nC 63 ; WX 500 ; N question ; B 79 -13 470 684 ;\nC 64 ; WX 832 ; N at ; B 63 -18 770 685 ;\nC 65 ; WX 667 ; N A ; B -67 0 593 683 ;\nC 66 ; WX 667 ; N B ; B -24 0 624 669 ;\nC 67 ; WX 667 ; N C ; B 32 -18 677 685 ;\nC 68 ; WX 722 ; N D ; B -46 0 685 669 ;\nC 69 ; WX 667 ; N E ; B -27 0 653 669 ;\nC 70 ; WX 667 ; N F ; B -13 0 660 669 ;\nC 71 ; WX 722 ; N G ; B 21 -18 706 685 ;\nC 72 ; WX 778 ; N H ; B -24 0 799 669 ;\nC 73 ; WX 389 ; N I ; B -32 0 406 669 ;\nC 74 ; WX 500 ; N J ; B -46 -99 524 669 ;\nC 75 ; WX 667 ; N K ; B -21 0 702 669 ;\nC 76 ; WX 611 ; N L ; B -22 0 590 669 ;\nC 77 ; WX 889 ; N M ; B -29 -12 917 669 ;\nC 78 ; WX 722 ; N N ; B -27 -15 748 669 ;\nC 79 ; WX 722 ; N O ; B 27 -18 691 685 ;\nC 80 ; WX 611 ; N P ; B -27 0 613 669 ;\nC 81 ; WX 722 ; N Q ; B 27 -208 691 685 ;\nC 82 ; WX 667 ; N R ; B -29 0 623 669 ;\nC 83 ; WX 556 ; N S ; B 2 -18 526 685 ;\nC 84 ; WX 611 ; N T ; B 50 0 650 669 ;\nC 85 ; WX 722 ; N U ; B 67 -18 744 669 ;\nC 86 ; WX 667 ; N V ; B 65 -18 715 669 ;\nC 87 ; WX 889 ; N W ; B 65 -18 940 669 ;\nC 88 ; WX 667 ; N X ; B -24 0 694 669 ;\nC 89 ; WX 611 ; N Y ; B 73 0 659 669 ;\nC 90 ; WX 611 ; N Z ; B -11 0 590 669 ;\nC 91 ; WX 333 ; N bracketleft ; B -37 -159 362 674 ;\nC 92 ; WX 278 ; N backslash ; B -1 -18 279 685 ;\nC 93 ; WX 333 ; N bracketright ; B -56 -157 343 674 ;\nC 94 ; WX 570 ; N asciicircum ; B 67 304 503 669 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333 ; N quoteleft ; B 128 369 332 685 ;\nC 97 ; WX 500 ; N a ; B -21 -14 455 462 ;\nC 98 ; WX 500 ; N b ; B -14 -13 444 699 ;\nC 99 ; WX 444 ; N c ; B -5 -13 392 462 ;\nC 100 ; WX 500 ; N d ; B -21 -13 517 699 ;\nC 101 ; WX 444 ; N e ; B 5 -13 398 462 ;\nC 102 ; WX 333 ; N f ; B -169 -205 446 698 ; L i fi ; L l fl ;\nC 103 ; WX 500 ; N g ; B -52 -203 478 462 ;\nC 104 ; WX 556 ; N h ; B -13 -9 498 699 ;\nC 105 ; WX 278 ; N i ; B 2 -9 263 684 ;\nC 106 ; WX 278 ; N j ; B -189 -207 279 684 ;\nC 107 ; WX 500 ; N k ; B -23 -8 483 699 ;\nC 108 ; WX 278 ; N l ; B 2 -9 290 699 ;\nC 109 ; WX 778 ; N m ; B -14 -9 722 462 ;\nC 110 ; WX 556 ; N n ; B -6 -9 493 462 ;\nC 111 ; WX 500 ; N o ; B -3 -13 441 462 ;\nC 112 ; WX 500 ; N p ; B -120 -205 446 462 ;\nC 113 ; WX 500 ; N q ; B 1 -205 471 462 ;\nC 114 ; WX 389 ; N r ; B -21 0 389 462 ;\nC 115 ; WX 389 ; N s ; B -19 -13 333 462 ;\nC 116 ; WX 278 ; N t ; B -11 -9 281 594 ;\nC 117 ; WX 556 ; N u ; B 15 -9 492 462 ;\nC 118 ; WX 444 ; N v ; B 16 -13 401 462 ;\nC 119 ; WX 667 ; N w ; B 16 -13 614 462 ;\nC 120 ; WX 500 ; N x ; B -46 -13 469 462 ;\nC 121 ; WX 444 ; N y ; B -94 -205 392 462 ;\nC 122 ; WX 389 ; N z ; B -43 -78 368 449 ;\nC 123 ; WX 348 ; N braceleft ; B 5 -187 436 686 ;\nC 124 ; WX 220 ; N bar ; B 66 -218 154 782 ;\nC 125 ; WX 348 ; N braceright ; B -129 -187 302 686 ;\nC 126 ; WX 570 ; N asciitilde ; B 54 173 516 333 ;\nC 161 ; WX 389 ; N exclamdown ; B 19 -205 322 492 ;\nC 162 ; WX 500 ; N cent ; B 42 -143 439 576 ;\nC 163 ; WX 500 ; N sterling ; B -32 -12 510 683 ;\nC 164 ; WX 167 ; N fraction ; B -169 -14 324 683 ;\nC 165 ; WX 500 ; N yen ; B 33 0 628 669 ;\nC 166 ; WX 500 ; N florin ; B -87 -156 537 707 ;\nC 167 ; WX 500 ; N section ; B 36 -143 459 685 ;\nC 168 ; WX 500 ; N currency ; B -26 34 526 586 ;\nC 169 ; WX 278 ; N quotesingle ; B 128 398 268 685 ;\nC 170 ; WX 500 ; N quotedblleft ; B 53 369 513 685 ;\nC 171 ; WX 500 ; N guillemotleft ; B 12 32 468 415 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 32 32 303 415 ;\nC 173 ; WX 333 ; N guilsinglright ; B 10 32 281 415 ;\nC 174 ; WX 556 ; N fi ; B -188 -205 514 703 ;\nC 175 ; WX 556 ; N fl ; B -186 -205 553 704 ;\nC 177 ; WX 500 ; N endash ; B -40 178 477 269 ;\nC 178 ; WX 500 ; N dagger ; B 91 -145 494 685 ;\nC 179 ; WX 500 ; N daggerdbl ; B 10 -139 493 685 ;\nC 180 ; WX 250 ; N periodcentered ; B 51 257 199 405 ;\nC 182 ; WX 500 ; N paragraph ; B -57 -193 562 669 ;\nC 183 ; WX 350 ; N bullet ; B 0 175 350 525 ;\nC 184 ; WX 333 ; N quotesinglbase ; B -5 -182 199 134 ;\nC 185 ; WX 500 ; N quotedblbase ; B -57 -182 403 134 ;\nC 186 ; WX 500 ; N quotedblright ; B 53 369 513 685 ;\nC 187 ; WX 500 ; N guillemotright ; B 12 32 468 415 ;\nC 188 ; WX 1000 ; N ellipsis ; B 40 -13 852 135 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -29 996 706 ;\nC 191 ; WX 500 ; N questiondown ; B 30 -205 421 492 ;\nC 193 ; WX 333 ; N grave ; B 85 516 297 697 ;\nC 194 ; WX 333 ; N acute ; B 139 516 379 697 ;\nC 195 ; WX 333 ; N circumflex ; B 40 516 367 690 ;\nC 196 ; WX 333 ; N tilde ; B 48 536 407 655 ;\nC 197 ; WX 333 ; N macron ; B 51 553 393 623 ;\nC 198 ; WX 333 ; N breve ; B 71 516 387 678 ;\nC 199 ; WX 333 ; N dotaccent ; B 163 550 298 684 ;\nC 200 ; WX 333 ; N dieresis ; B 55 550 402 684 ;\nC 202 ; WX 333 ; N ring ; B 127 516 340 729 ;\nC 203 ; WX 333 ; N cedilla ; B -80 -218 156 5 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 69 516 498 697 ;\nC 206 ; WX 333 ; N ogonek ; B 15 -183 244 34 ;\nC 207 ; WX 333 ; N caron ; B 79 516 411 690 ;\nC 208 ; WX 1000 ; N emdash ; B -40 178 977 269 ;\nC 225 ; WX 944 ; N AE ; B -64 0 918 669 ;\nC 227 ; WX 266 ; N ordfeminine ; B 16 399 330 685 ;\nC 232 ; WX 611 ; N Lslash ; B -22 0 590 669 ;\nC 233 ; WX 722 ; N Oslash ; B 27 -125 691 764 ;\nC 234 ; WX 944 ; N OE ; B 23 -8 946 677 ;\nC 235 ; WX 300 ; N ordmasculine ; B 56 400 347 685 ;\nC 241 ; WX 722 ; N ae ; B -5 -13 673 462 ;\nC 245 ; WX 278 ; N dotlessi ; B 2 -9 238 462 ;\nC 248 ; WX 278 ; N lslash ; B -7 -9 307 699 ;\nC 249 ; WX 500 ; N oslash ; B -3 -119 441 560 ;\nC 250 ; WX 722 ; N oe ; B 6 -13 674 462 ;\nC 251 ; WX 500 ; N germandbls ; B -200 -200 473 705 ;\nC -1 ; WX 389 ; N Idieresis ; B -32 0 450 862 ;\nC -1 ; WX 444 ; N eacute ; B 5 -13 435 697 ;\nC -1 ; WX 500 ; N abreve ; B -21 -14 471 678 ;\nC -1 ; WX 556 ; N uhungarumlaut ; B 15 -9 610 697 ;\nC -1 ; WX 444 ; N ecaron ; B 5 -13 467 690 ;\nC -1 ; WX 611 ; N Ydieresis ; B 73 0 659 862 ;\nC -1 ; WX 570 ; N divide ; B 33 -29 537 535 ;\nC -1 ; WX 611 ; N Yacute ; B 73 0 659 904 ;\nC -1 ; WX 667 ; N Acircumflex ; B -67 0 593 897 ;\nC -1 ; WX 500 ; N aacute ; B -21 -14 463 697 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 67 -18 744 897 ;\nC -1 ; WX 444 ; N yacute ; B -94 -205 435 697 ;\nC -1 ; WX 389 ; N scommaaccent ; B -19 -218 333 462 ;\nC -1 ; WX 444 ; N ecircumflex ; B 5 -13 423 690 ;\nC -1 ; WX 722 ; N Uring ; B 67 -18 744 921 ;\nC -1 ; WX 722 ; N Udieresis ; B 67 -18 744 862 ;\nC -1 ; WX 500 ; N aogonek ; B -21 -183 455 462 ;\nC -1 ; WX 722 ; N Uacute ; B 67 -18 744 904 ;\nC -1 ; WX 556 ; N uogonek ; B 15 -183 492 462 ;\nC -1 ; WX 667 ; N Edieresis ; B -27 0 653 862 ;\nC -1 ; WX 722 ; N Dcroat ; B -31 0 700 669 ;\nC -1 ; WX 250 ; N commaaccent ; B -36 -218 131 -50 ;\nC -1 ; WX 747 ; N copyright ; B 30 -18 718 685 ;\nC -1 ; WX 667 ; N Emacron ; B -27 0 653 830 ;\nC -1 ; WX 444 ; N ccaron ; B -5 -13 467 690 ;\nC -1 ; WX 500 ; N aring ; B -21 -14 455 729 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B -27 -218 748 669 ;\nC -1 ; WX 278 ; N lacute ; B 2 -9 392 904 ;\nC -1 ; WX 500 ; N agrave ; B -21 -14 455 697 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 50 -218 650 669 ;\nC -1 ; WX 667 ; N Cacute ; B 32 -18 677 904 ;\nC -1 ; WX 500 ; N atilde ; B -21 -14 491 655 ;\nC -1 ; WX 667 ; N Edotaccent ; B -27 0 653 862 ;\nC -1 ; WX 389 ; N scaron ; B -19 -13 424 690 ;\nC -1 ; WX 389 ; N scedilla ; B -19 -218 333 462 ;\nC -1 ; WX 278 ; N iacute ; B 2 -9 352 697 ;\nC -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;\nC -1 ; WX 667 ; N Rcaron ; B -29 0 623 897 ;\nC -1 ; WX 722 ; N Gcommaaccent ; B 21 -218 706 685 ;\nC -1 ; WX 556 ; N ucircumflex ; B 15 -9 492 690 ;\nC -1 ; WX 500 ; N acircumflex ; B -21 -14 455 690 ;\nC -1 ; WX 667 ; N Amacron ; B -67 0 593 830 ;\nC -1 ; WX 389 ; N rcaron ; B -21 0 424 690 ;\nC -1 ; WX 444 ; N ccedilla ; B -5 -218 392 462 ;\nC -1 ; WX 611 ; N Zdotaccent ; B -11 0 590 862 ;\nC -1 ; WX 611 ; N Thorn ; B -27 0 573 669 ;\nC -1 ; WX 722 ; N Omacron ; B 27 -18 691 830 ;\nC -1 ; WX 667 ; N Racute ; B -29 0 623 904 ;\nC -1 ; WX 556 ; N Sacute ; B 2 -18 531 904 ;\nC -1 ; WX 608 ; N dcaron ; B -21 -13 675 708 ;\nC -1 ; WX 722 ; N Umacron ; B 67 -18 744 830 ;\nC -1 ; WX 556 ; N uring ; B 15 -9 492 729 ;\nC -1 ; WX 300 ; N threesuperior ; B 17 265 321 683 ;\nC -1 ; WX 722 ; N Ograve ; B 27 -18 691 904 ;\nC -1 ; WX 667 ; N Agrave ; B -67 0 593 904 ;\nC -1 ; WX 667 ; N Abreve ; B -67 0 593 885 ;\nC -1 ; WX 570 ; N multiply ; B 48 16 522 490 ;\nC -1 ; WX 556 ; N uacute ; B 15 -9 492 697 ;\nC -1 ; WX 611 ; N Tcaron ; B 50 0 650 897 ;\nC -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;\nC -1 ; WX 444 ; N ydieresis ; B -94 -205 443 655 ;\nC -1 ; WX 722 ; N Nacute ; B -27 -15 748 904 ;\nC -1 ; WX 278 ; N icircumflex ; B -3 -9 324 690 ;\nC -1 ; WX 667 ; N Ecircumflex ; B -27 0 653 897 ;\nC -1 ; WX 500 ; N adieresis ; B -21 -14 476 655 ;\nC -1 ; WX 444 ; N edieresis ; B 5 -13 448 655 ;\nC -1 ; WX 444 ; N cacute ; B -5 -13 435 697 ;\nC -1 ; WX 556 ; N nacute ; B -6 -9 493 697 ;\nC -1 ; WX 556 ; N umacron ; B 15 -9 492 623 ;\nC -1 ; WX 722 ; N Ncaron ; B -27 -15 748 897 ;\nC -1 ; WX 389 ; N Iacute ; B -32 0 432 904 ;\nC -1 ; WX 570 ; N plusminus ; B 33 0 537 506 ;\nC -1 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ;\nC -1 ; WX 747 ; N registered ; B 30 -18 718 685 ;\nC -1 ; WX 722 ; N Gbreve ; B 21 -18 706 885 ;\nC -1 ; WX 389 ; N Idotaccent ; B -32 0 406 862 ;\nC -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;\nC -1 ; WX 667 ; N Egrave ; B -27 0 653 904 ;\nC -1 ; WX 389 ; N racute ; B -21 0 407 697 ;\nC -1 ; WX 500 ; N omacron ; B -3 -13 462 623 ;\nC -1 ; WX 611 ; N Zacute ; B -11 0 590 904 ;\nC -1 ; WX 611 ; N Zcaron ; B -11 0 590 897 ;\nC -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;\nC -1 ; WX 722 ; N Eth ; B -31 0 700 669 ;\nC -1 ; WX 667 ; N Ccedilla ; B 32 -218 677 685 ;\nC -1 ; WX 278 ; N lcommaaccent ; B -42 -218 290 699 ;\nC -1 ; WX 366 ; N tcaron ; B -11 -9 434 754 ;\nC -1 ; WX 444 ; N eogonek ; B 5 -183 398 462 ;\nC -1 ; WX 722 ; N Uogonek ; B 67 -183 744 669 ;\nC -1 ; WX 667 ; N Aacute ; B -67 0 593 904 ;\nC -1 ; WX 667 ; N Adieresis ; B -67 0 593 862 ;\nC -1 ; WX 444 ; N egrave ; B 5 -13 398 697 ;\nC -1 ; WX 389 ; N zacute ; B -43 -78 407 697 ;\nC -1 ; WX 278 ; N iogonek ; B -20 -183 263 684 ;\nC -1 ; WX 722 ; N Oacute ; B 27 -18 691 904 ;\nC -1 ; WX 500 ; N oacute ; B -3 -13 463 697 ;\nC -1 ; WX 500 ; N amacron ; B -21 -14 467 623 ;\nC -1 ; WX 389 ; N sacute ; B -19 -13 407 697 ;\nC -1 ; WX 278 ; N idieresis ; B 2 -9 364 655 ;\nC -1 ; WX 722 ; N Ocircumflex ; B 27 -18 691 897 ;\nC -1 ; WX 722 ; N Ugrave ; B 67 -18 744 904 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 500 ; N thorn ; B -120 -205 446 699 ;\nC -1 ; WX 300 ; N twosuperior ; B 2 274 313 683 ;\nC -1 ; WX 722 ; N Odieresis ; B 27 -18 691 862 ;\nC -1 ; WX 576 ; N mu ; B -60 -207 516 449 ;\nC -1 ; WX 278 ; N igrave ; B 2 -9 259 697 ;\nC -1 ; WX 500 ; N ohungarumlaut ; B -3 -13 582 697 ;\nC -1 ; WX 667 ; N Eogonek ; B -27 -183 653 669 ;\nC -1 ; WX 500 ; N dcroat ; B -21 -13 552 699 ;\nC -1 ; WX 750 ; N threequarters ; B 7 -14 726 683 ;\nC -1 ; WX 556 ; N Scedilla ; B 2 -218 526 685 ;\nC -1 ; WX 382 ; N lcaron ; B 2 -9 448 708 ;\nC -1 ; WX 667 ; N Kcommaaccent ; B -21 -218 702 669 ;\nC -1 ; WX 611 ; N Lacute ; B -22 0 590 904 ;\nC -1 ; WX 1000 ; N trademark ; B 32 263 968 669 ;\nC -1 ; WX 444 ; N edotaccent ; B 5 -13 398 655 ;\nC -1 ; WX 389 ; N Igrave ; B -32 0 406 904 ;\nC -1 ; WX 389 ; N Imacron ; B -32 0 461 830 ;\nC -1 ; WX 611 ; N Lcaron ; B -22 0 671 718 ;\nC -1 ; WX 750 ; N onehalf ; B -9 -14 723 683 ;\nC -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;\nC -1 ; WX 500 ; N ocircumflex ; B -3 -13 451 690 ;\nC -1 ; WX 556 ; N ntilde ; B -6 -9 504 655 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 67 -18 744 904 ;\nC -1 ; WX 667 ; N Eacute ; B -27 0 653 904 ;\nC -1 ; WX 444 ; N emacron ; B 5 -13 439 623 ;\nC -1 ; WX 500 ; N gbreve ; B -52 -203 478 678 ;\nC -1 ; WX 750 ; N onequarter ; B 7 -14 721 683 ;\nC -1 ; WX 556 ; N Scaron ; B 2 -18 553 897 ;\nC -1 ; WX 556 ; N Scommaaccent ; B 2 -218 526 685 ;\nC -1 ; WX 722 ; N Ohungarumlaut ; B 27 -18 723 904 ;\nC -1 ; WX 400 ; N degree ; B 83 397 369 683 ;\nC -1 ; WX 500 ; N ograve ; B -3 -13 441 697 ;\nC -1 ; WX 667 ; N Ccaron ; B 32 -18 677 897 ;\nC -1 ; WX 556 ; N ugrave ; B 15 -9 492 697 ;\nC -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;\nC -1 ; WX 722 ; N Dcaron ; B -46 0 685 897 ;\nC -1 ; WX 389 ; N rcommaaccent ; B -67 -218 389 462 ;\nC -1 ; WX 722 ; N Ntilde ; B -27 -15 748 862 ;\nC -1 ; WX 500 ; N otilde ; B -3 -13 491 655 ;\nC -1 ; WX 667 ; N Rcommaaccent ; B -29 -218 623 669 ;\nC -1 ; WX 611 ; N Lcommaaccent ; B -22 -218 590 669 ;\nC -1 ; WX 667 ; N Atilde ; B -67 0 593 862 ;\nC -1 ; WX 667 ; N Aogonek ; B -67 -183 604 683 ;\nC -1 ; WX 667 ; N Aring ; B -67 0 593 921 ;\nC -1 ; WX 722 ; N Otilde ; B 27 -18 691 862 ;\nC -1 ; WX 389 ; N zdotaccent ; B -43 -78 368 655 ;\nC -1 ; WX 667 ; N Ecaron ; B -27 0 653 897 ;\nC -1 ; WX 389 ; N Iogonek ; B -32 -183 406 669 ;\nC -1 ; WX 500 ; N kcommaaccent ; B -23 -218 483 699 ;\nC -1 ; WX 606 ; N minus ; B 51 209 555 297 ;\nC -1 ; WX 389 ; N Icircumflex ; B -32 0 450 897 ;\nC -1 ; WX 556 ; N ncaron ; B -6 -9 523 690 ;\nC -1 ; WX 278 ; N tcommaaccent ; B -62 -218 281 594 ;\nC -1 ; WX 606 ; N logicalnot ; B 51 108 555 399 ;\nC -1 ; WX 500 ; N odieresis ; B -3 -13 471 655 ;\nC -1 ; WX 556 ; N udieresis ; B 15 -9 499 655 ;\nC -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;\nC -1 ; WX 500 ; N gcommaaccent ; B -52 -203 478 767 ;\nC -1 ; WX 500 ; N eth ; B -3 -13 454 699 ;\nC -1 ; WX 389 ; N zcaron ; B -43 -78 424 690 ;\nC -1 ; WX 556 ; N ncommaaccent ; B -6 -218 493 462 ;\nC -1 ; WX 300 ; N onesuperior ; B 30 274 301 683 ;\nC -1 ; WX 278 ; N imacron ; B 2 -9 294 623 ;\nC -1 ; WX 500 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 2038\nKPX A C -65\nKPX A Cacute -65\nKPX A Ccaron -65\nKPX A Ccedilla -65\nKPX A G -60\nKPX A Gbreve -60\nKPX A Gcommaaccent -60\nKPX A O -50\nKPX A Oacute -50\nKPX A Ocircumflex -50\nKPX A Odieresis -50\nKPX A Ograve -50\nKPX A Ohungarumlaut -50\nKPX A Omacron -50\nKPX A Oslash -50\nKPX A Otilde -50\nKPX A Q -55\nKPX A T -55\nKPX A Tcaron -55\nKPX A Tcommaaccent -55\nKPX A U -50\nKPX A Uacute -50\nKPX A Ucircumflex -50\nKPX A Udieresis -50\nKPX A Ugrave -50\nKPX A Uhungarumlaut -50\nKPX A Umacron -50\nKPX A Uogonek -50\nKPX A Uring -50\nKPX A V -95\nKPX A W -100\nKPX A Y -70\nKPX A Yacute -70\nKPX A Ydieresis -70\nKPX A quoteright -74\nKPX A u -30\nKPX A uacute -30\nKPX A ucircumflex -30\nKPX A udieresis -30\nKPX A ugrave -30\nKPX A uhungarumlaut -30\nKPX A umacron -30\nKPX A uogonek -30\nKPX A uring -30\nKPX A v -74\nKPX A w -74\nKPX A y -74\nKPX A yacute -74\nKPX A ydieresis -74\nKPX Aacute C -65\nKPX Aacute Cacute -65\nKPX Aacute Ccaron -65\nKPX Aacute Ccedilla -65\nKPX Aacute G -60\nKPX Aacute Gbreve -60\nKPX Aacute Gcommaaccent -60\nKPX Aacute O -50\nKPX Aacute Oacute -50\nKPX Aacute Ocircumflex -50\nKPX Aacute Odieresis -50\nKPX Aacute Ograve -50\nKPX Aacute Ohungarumlaut -50\nKPX Aacute Omacron -50\nKPX Aacute Oslash -50\nKPX Aacute Otilde -50\nKPX Aacute Q -55\nKPX Aacute T -55\nKPX Aacute Tcaron -55\nKPX Aacute Tcommaaccent -55\nKPX Aacute U -50\nKPX Aacute Uacute -50\nKPX Aacute Ucircumflex -50\nKPX Aacute Udieresis -50\nKPX Aacute Ugrave -50\nKPX Aacute Uhungarumlaut -50\nKPX Aacute Umacron -50\nKPX Aacute Uogonek -50\nKPX Aacute Uring -50\nKPX Aacute V -95\nKPX Aacute W -100\nKPX Aacute Y -70\nKPX Aacute Yacute -70\nKPX Aacute Ydieresis -70\nKPX Aacute quoteright -74\nKPX Aacute u -30\nKPX Aacute uacute -30\nKPX Aacute ucircumflex -30\nKPX Aacute udieresis -30\nKPX Aacute ugrave -30\nKPX Aacute uhungarumlaut -30\nKPX Aacute umacron -30\nKPX Aacute uogonek -30\nKPX Aacute uring -30\nKPX Aacute v -74\nKPX Aacute w -74\nKPX Aacute y -74\nKPX Aacute yacute -74\nKPX Aacute ydieresis -74\nKPX Abreve C -65\nKPX Abreve Cacute -65\nKPX Abreve Ccaron -65\nKPX Abreve Ccedilla -65\nKPX Abreve G -60\nKPX Abreve Gbreve -60\nKPX Abreve Gcommaaccent -60\nKPX Abreve O -50\nKPX Abreve Oacute -50\nKPX Abreve Ocircumflex -50\nKPX Abreve Odieresis -50\nKPX Abreve Ograve -50\nKPX Abreve Ohungarumlaut -50\nKPX Abreve Omacron -50\nKPX Abreve Oslash -50\nKPX Abreve Otilde -50\nKPX Abreve Q -55\nKPX Abreve T -55\nKPX Abreve Tcaron -55\nKPX Abreve Tcommaaccent -55\nKPX Abreve U -50\nKPX Abreve Uacute -50\nKPX Abreve Ucircumflex -50\nKPX Abreve Udieresis -50\nKPX Abreve Ugrave -50\nKPX Abreve Uhungarumlaut -50\nKPX Abreve Umacron -50\nKPX Abreve Uogonek -50\nKPX Abreve Uring -50\nKPX Abreve V -95\nKPX Abreve W -100\nKPX Abreve Y -70\nKPX Abreve Yacute -70\nKPX Abreve Ydieresis -70\nKPX Abreve quoteright -74\nKPX Abreve u -30\nKPX Abreve uacute -30\nKPX Abreve ucircumflex -30\nKPX Abreve udieresis -30\nKPX Abreve ugrave -30\nKPX Abreve uhungarumlaut -30\nKPX Abreve umacron -30\nKPX Abreve uogonek -30\nKPX Abreve uring -30\nKPX Abreve v -74\nKPX Abreve w -74\nKPX Abreve y -74\nKPX Abreve yacute -74\nKPX Abreve ydieresis -74\nKPX Acircumflex C -65\nKPX Acircumflex Cacute -65\nKPX Acircumflex Ccaron -65\nKPX Acircumflex Ccedilla -65\nKPX Acircumflex G -60\nKPX Acircumflex Gbreve -60\nKPX Acircumflex Gcommaaccent -60\nKPX Acircumflex O -50\nKPX Acircumflex Oacute -50\nKPX Acircumflex Ocircumflex -50\nKPX Acircumflex Odieresis -50\nKPX Acircumflex Ograve -50\nKPX Acircumflex Ohungarumlaut -50\nKPX Acircumflex Omacron -50\nKPX Acircumflex Oslash -50\nKPX Acircumflex Otilde -50\nKPX Acircumflex Q -55\nKPX Acircumflex T -55\nKPX Acircumflex Tcaron -55\nKPX Acircumflex Tcommaaccent -55\nKPX Acircumflex U -50\nKPX Acircumflex Uacute -50\nKPX Acircumflex Ucircumflex -50\nKPX Acircumflex Udieresis -50\nKPX Acircumflex Ugrave -50\nKPX Acircumflex Uhungarumlaut -50\nKPX Acircumflex Umacron -50\nKPX Acircumflex Uogonek -50\nKPX Acircumflex Uring -50\nKPX Acircumflex V -95\nKPX Acircumflex W -100\nKPX Acircumflex Y -70\nKPX Acircumflex Yacute -70\nKPX Acircumflex Ydieresis -70\nKPX Acircumflex quoteright -74\nKPX Acircumflex u -30\nKPX Acircumflex uacute -30\nKPX Acircumflex ucircumflex -30\nKPX Acircumflex udieresis -30\nKPX Acircumflex ugrave -30\nKPX Acircumflex uhungarumlaut -30\nKPX Acircumflex umacron -30\nKPX Acircumflex uogonek -30\nKPX Acircumflex uring -30\nKPX Acircumflex v -74\nKPX Acircumflex w -74\nKPX Acircumflex y -74\nKPX Acircumflex yacute -74\nKPX Acircumflex ydieresis -74\nKPX Adieresis C -65\nKPX Adieresis Cacute -65\nKPX Adieresis Ccaron -65\nKPX Adieresis Ccedilla -65\nKPX Adieresis G -60\nKPX Adieresis Gbreve -60\nKPX Adieresis Gcommaaccent -60\nKPX Adieresis O -50\nKPX Adieresis Oacute -50\nKPX Adieresis Ocircumflex -50\nKPX Adieresis Odieresis -50\nKPX Adieresis Ograve -50\nKPX Adieresis Ohungarumlaut -50\nKPX Adieresis Omacron -50\nKPX Adieresis Oslash -50\nKPX Adieresis Otilde -50\nKPX Adieresis Q -55\nKPX Adieresis T -55\nKPX Adieresis Tcaron -55\nKPX Adieresis Tcommaaccent -55\nKPX Adieresis U -50\nKPX Adieresis Uacute -50\nKPX Adieresis Ucircumflex -50\nKPX Adieresis Udieresis -50\nKPX Adieresis Ugrave -50\nKPX Adieresis Uhungarumlaut -50\nKPX Adieresis Umacron -50\nKPX Adieresis Uogonek -50\nKPX Adieresis Uring -50\nKPX Adieresis V -95\nKPX Adieresis W -100\nKPX Adieresis Y -70\nKPX Adieresis Yacute -70\nKPX Adieresis Ydieresis -70\nKPX Adieresis quoteright -74\nKPX Adieresis u -30\nKPX Adieresis uacute -30\nKPX Adieresis ucircumflex -30\nKPX Adieresis udieresis -30\nKPX Adieresis ugrave -30\nKPX Adieresis uhungarumlaut -30\nKPX Adieresis umacron -30\nKPX Adieresis uogonek -30\nKPX Adieresis uring -30\nKPX Adieresis v -74\nKPX Adieresis w -74\nKPX Adieresis y -74\nKPX Adieresis yacute -74\nKPX Adieresis ydieresis -74\nKPX Agrave C -65\nKPX Agrave Cacute -65\nKPX Agrave Ccaron -65\nKPX Agrave Ccedilla -65\nKPX Agrave G -60\nKPX Agrave Gbreve -60\nKPX Agrave Gcommaaccent -60\nKPX Agrave O -50\nKPX Agrave Oacute -50\nKPX Agrave Ocircumflex -50\nKPX Agrave Odieresis -50\nKPX Agrave Ograve -50\nKPX Agrave Ohungarumlaut -50\nKPX Agrave Omacron -50\nKPX Agrave Oslash -50\nKPX Agrave Otilde -50\nKPX Agrave Q -55\nKPX Agrave T -55\nKPX Agrave Tcaron -55\nKPX Agrave Tcommaaccent -55\nKPX Agrave U -50\nKPX Agrave Uacute -50\nKPX Agrave Ucircumflex -50\nKPX Agrave Udieresis -50\nKPX Agrave Ugrave -50\nKPX Agrave Uhungarumlaut -50\nKPX Agrave Umacron -50\nKPX Agrave Uogonek -50\nKPX Agrave Uring -50\nKPX Agrave V -95\nKPX Agrave W -100\nKPX Agrave Y -70\nKPX Agrave Yacute -70\nKPX Agrave Ydieresis -70\nKPX Agrave quoteright -74\nKPX Agrave u -30\nKPX Agrave uacute -30\nKPX Agrave ucircumflex -30\nKPX Agrave udieresis -30\nKPX Agrave ugrave -30\nKPX Agrave uhungarumlaut -30\nKPX Agrave umacron -30\nKPX Agrave uogonek -30\nKPX Agrave uring -30\nKPX Agrave v -74\nKPX Agrave w -74\nKPX Agrave y -74\nKPX Agrave yacute -74\nKPX Agrave ydieresis -74\nKPX Amacron C -65\nKPX Amacron Cacute -65\nKPX Amacron Ccaron -65\nKPX Amacron Ccedilla -65\nKPX Amacron G -60\nKPX Amacron Gbreve -60\nKPX Amacron Gcommaaccent -60\nKPX Amacron O -50\nKPX Amacron Oacute -50\nKPX Amacron Ocircumflex -50\nKPX Amacron Odieresis -50\nKPX Amacron Ograve -50\nKPX Amacron Ohungarumlaut -50\nKPX Amacron Omacron -50\nKPX Amacron Oslash -50\nKPX Amacron Otilde -50\nKPX Amacron Q -55\nKPX Amacron T -55\nKPX Amacron Tcaron -55\nKPX Amacron Tcommaaccent -55\nKPX Amacron U -50\nKPX Amacron Uacute -50\nKPX Amacron Ucircumflex -50\nKPX Amacron Udieresis -50\nKPX Amacron Ugrave -50\nKPX Amacron Uhungarumlaut -50\nKPX Amacron Umacron -50\nKPX Amacron Uogonek -50\nKPX Amacron Uring -50\nKPX Amacron V -95\nKPX Amacron W -100\nKPX Amacron Y -70\nKPX Amacron Yacute -70\nKPX Amacron Ydieresis -70\nKPX Amacron quoteright -74\nKPX Amacron u -30\nKPX Amacron uacute -30\nKPX Amacron ucircumflex -30\nKPX Amacron udieresis -30\nKPX Amacron ugrave -30\nKPX Amacron uhungarumlaut -30\nKPX Amacron umacron -30\nKPX Amacron uogonek -30\nKPX Amacron uring -30\nKPX Amacron v -74\nKPX Amacron w -74\nKPX Amacron y -74\nKPX Amacron yacute -74\nKPX Amacron ydieresis -74\nKPX Aogonek C -65\nKPX Aogonek Cacute -65\nKPX Aogonek Ccaron -65\nKPX Aogonek Ccedilla -65\nKPX Aogonek G -60\nKPX Aogonek Gbreve -60\nKPX Aogonek Gcommaaccent -60\nKPX Aogonek O -50\nKPX Aogonek Oacute -50\nKPX Aogonek Ocircumflex -50\nKPX Aogonek Odieresis -50\nKPX Aogonek Ograve -50\nKPX Aogonek Ohungarumlaut -50\nKPX Aogonek Omacron -50\nKPX Aogonek Oslash -50\nKPX Aogonek Otilde -50\nKPX Aogonek Q -55\nKPX Aogonek T -55\nKPX Aogonek Tcaron -55\nKPX Aogonek Tcommaaccent -55\nKPX Aogonek U -50\nKPX Aogonek Uacute -50\nKPX Aogonek Ucircumflex -50\nKPX Aogonek Udieresis -50\nKPX Aogonek Ugrave -50\nKPX Aogonek Uhungarumlaut -50\nKPX Aogonek Umacron -50\nKPX Aogonek Uogonek -50\nKPX Aogonek Uring -50\nKPX Aogonek V -95\nKPX Aogonek W -100\nKPX Aogonek Y -70\nKPX Aogonek Yacute -70\nKPX Aogonek Ydieresis -70\nKPX Aogonek quoteright -74\nKPX Aogonek u -30\nKPX Aogonek uacute -30\nKPX Aogonek ucircumflex -30\nKPX Aogonek udieresis -30\nKPX Aogonek ugrave -30\nKPX Aogonek uhungarumlaut -30\nKPX Aogonek umacron -30\nKPX Aogonek uogonek -30\nKPX Aogonek uring -30\nKPX Aogonek v -74\nKPX Aogonek w -74\nKPX Aogonek y -34\nKPX Aogonek yacute -34\nKPX Aogonek ydieresis -34\nKPX Aring C -65\nKPX Aring Cacute -65\nKPX Aring Ccaron -65\nKPX Aring Ccedilla -65\nKPX Aring G -60\nKPX Aring Gbreve -60\nKPX Aring Gcommaaccent -60\nKPX Aring O -50\nKPX Aring Oacute -50\nKPX Aring Ocircumflex -50\nKPX Aring Odieresis -50\nKPX Aring Ograve -50\nKPX Aring Ohungarumlaut -50\nKPX Aring Omacron -50\nKPX Aring Oslash -50\nKPX Aring Otilde -50\nKPX Aring Q -55\nKPX Aring T -55\nKPX Aring Tcaron -55\nKPX Aring Tcommaaccent -55\nKPX Aring U -50\nKPX Aring Uacute -50\nKPX Aring Ucircumflex -50\nKPX Aring Udieresis -50\nKPX Aring Ugrave -50\nKPX Aring Uhungarumlaut -50\nKPX Aring Umacron -50\nKPX Aring Uogonek -50\nKPX Aring Uring -50\nKPX Aring V -95\nKPX Aring W -100\nKPX Aring Y -70\nKPX Aring Yacute -70\nKPX Aring Ydieresis -70\nKPX Aring quoteright -74\nKPX Aring u -30\nKPX Aring uacute -30\nKPX Aring ucircumflex -30\nKPX Aring udieresis -30\nKPX Aring ugrave -30\nKPX Aring uhungarumlaut -30\nKPX Aring umacron -30\nKPX Aring uogonek -30\nKPX Aring uring -30\nKPX Aring v -74\nKPX Aring w -74\nKPX Aring y -74\nKPX Aring yacute -74\nKPX Aring ydieresis -74\nKPX Atilde C -65\nKPX Atilde Cacute -65\nKPX Atilde Ccaron -65\nKPX Atilde Ccedilla -65\nKPX Atilde G -60\nKPX Atilde Gbreve -60\nKPX Atilde Gcommaaccent -60\nKPX Atilde O -50\nKPX Atilde Oacute -50\nKPX Atilde Ocircumflex -50\nKPX Atilde Odieresis -50\nKPX Atilde Ograve -50\nKPX Atilde Ohungarumlaut -50\nKPX Atilde Omacron -50\nKPX Atilde Oslash -50\nKPX Atilde Otilde -50\nKPX Atilde Q -55\nKPX Atilde T -55\nKPX Atilde Tcaron -55\nKPX Atilde Tcommaaccent -55\nKPX Atilde U -50\nKPX Atilde Uacute -50\nKPX Atilde Ucircumflex -50\nKPX Atilde Udieresis -50\nKPX Atilde Ugrave -50\nKPX Atilde Uhungarumlaut -50\nKPX Atilde Umacron -50\nKPX Atilde Uogonek -50\nKPX Atilde Uring -50\nKPX Atilde V -95\nKPX Atilde W -100\nKPX Atilde Y -70\nKPX Atilde Yacute -70\nKPX Atilde Ydieresis -70\nKPX Atilde quoteright -74\nKPX Atilde u -30\nKPX Atilde uacute -30\nKPX Atilde ucircumflex -30\nKPX Atilde udieresis -30\nKPX Atilde ugrave -30\nKPX Atilde uhungarumlaut -30\nKPX Atilde umacron -30\nKPX Atilde uogonek -30\nKPX Atilde uring -30\nKPX Atilde v -74\nKPX Atilde w -74\nKPX Atilde y -74\nKPX Atilde yacute -74\nKPX Atilde ydieresis -74\nKPX B A -25\nKPX B Aacute -25\nKPX B Abreve -25\nKPX B Acircumflex -25\nKPX B Adieresis -25\nKPX B Agrave -25\nKPX B Amacron -25\nKPX B Aogonek -25\nKPX B Aring -25\nKPX B Atilde -25\nKPX B U -10\nKPX B Uacute -10\nKPX B Ucircumflex -10\nKPX B Udieresis -10\nKPX B Ugrave -10\nKPX B Uhungarumlaut -10\nKPX B Umacron -10\nKPX B Uogonek -10\nKPX B Uring -10\nKPX D A -25\nKPX D Aacute -25\nKPX D Abreve -25\nKPX D Acircumflex -25\nKPX D Adieresis -25\nKPX D Agrave -25\nKPX D Amacron -25\nKPX D Aogonek -25\nKPX D Aring -25\nKPX D Atilde -25\nKPX D V -50\nKPX D W -40\nKPX D Y -50\nKPX D Yacute -50\nKPX D Ydieresis -50\nKPX Dcaron A -25\nKPX Dcaron Aacute -25\nKPX Dcaron Abreve -25\nKPX Dcaron Acircumflex -25\nKPX Dcaron Adieresis -25\nKPX Dcaron Agrave -25\nKPX Dcaron Amacron -25\nKPX Dcaron Aogonek -25\nKPX Dcaron Aring -25\nKPX Dcaron Atilde -25\nKPX Dcaron V -50\nKPX Dcaron W -40\nKPX Dcaron Y -50\nKPX Dcaron Yacute -50\nKPX Dcaron Ydieresis -50\nKPX Dcroat A -25\nKPX Dcroat Aacute -25\nKPX Dcroat Abreve -25\nKPX Dcroat Acircumflex -25\nKPX Dcroat Adieresis -25\nKPX Dcroat Agrave -25\nKPX Dcroat Amacron -25\nKPX Dcroat Aogonek -25\nKPX Dcroat Aring -25\nKPX Dcroat Atilde -25\nKPX Dcroat V -50\nKPX Dcroat W -40\nKPX Dcroat Y -50\nKPX Dcroat Yacute -50\nKPX Dcroat Ydieresis -50\nKPX F A -100\nKPX F Aacute -100\nKPX F Abreve -100\nKPX F Acircumflex -100\nKPX F Adieresis -100\nKPX F Agrave -100\nKPX F Amacron -100\nKPX F Aogonek -100\nKPX F Aring -100\nKPX F Atilde -100\nKPX F a -95\nKPX F aacute -95\nKPX F abreve -95\nKPX F acircumflex -95\nKPX F adieresis -95\nKPX F agrave -95\nKPX F amacron -95\nKPX F aogonek -95\nKPX F aring -95\nKPX F atilde -95\nKPX F comma -129\nKPX F e -100\nKPX F eacute -100\nKPX F ecaron -100\nKPX F ecircumflex -100\nKPX F edieresis -100\nKPX F edotaccent -100\nKPX F egrave -100\nKPX F emacron -100\nKPX F eogonek -100\nKPX F i -40\nKPX F iacute -40\nKPX F icircumflex -40\nKPX F idieresis -40\nKPX F igrave -40\nKPX F imacron -40\nKPX F iogonek -40\nKPX F o -70\nKPX F oacute -70\nKPX F ocircumflex -70\nKPX F odieresis -70\nKPX F ograve -70\nKPX F ohungarumlaut -70\nKPX F omacron -70\nKPX F oslash -70\nKPX F otilde -70\nKPX F period -129\nKPX F r -50\nKPX F racute -50\nKPX F rcaron -50\nKPX F rcommaaccent -50\nKPX J A -25\nKPX J Aacute -25\nKPX J Abreve -25\nKPX J Acircumflex -25\nKPX J Adieresis -25\nKPX J Agrave -25\nKPX J Amacron -25\nKPX J Aogonek -25\nKPX J Aring -25\nKPX J Atilde -25\nKPX J a -40\nKPX J aacute -40\nKPX J abreve -40\nKPX J acircumflex -40\nKPX J adieresis -40\nKPX J agrave -40\nKPX J amacron -40\nKPX J aogonek -40\nKPX J aring -40\nKPX J atilde -40\nKPX J comma -10\nKPX J e -40\nKPX J eacute -40\nKPX J ecaron -40\nKPX J ecircumflex -40\nKPX J edieresis -40\nKPX J edotaccent -40\nKPX J egrave -40\nKPX J emacron -40\nKPX J eogonek -40\nKPX J o -40\nKPX J oacute -40\nKPX J ocircumflex -40\nKPX J odieresis -40\nKPX J ograve -40\nKPX J ohungarumlaut -40\nKPX J omacron -40\nKPX J oslash -40\nKPX J otilde -40\nKPX J period -10\nKPX J u -40\nKPX J uacute -40\nKPX J ucircumflex -40\nKPX J udieresis -40\nKPX J ugrave -40\nKPX J uhungarumlaut -40\nKPX J umacron -40\nKPX J uogonek -40\nKPX J uring -40\nKPX K O -30\nKPX K Oacute -30\nKPX K Ocircumflex -30\nKPX K Odieresis -30\nKPX K Ograve -30\nKPX K Ohungarumlaut -30\nKPX K Omacron -30\nKPX K Oslash -30\nKPX K Otilde -30\nKPX K e -25\nKPX K eacute -25\nKPX K ecaron -25\nKPX K ecircumflex -25\nKPX K edieresis -25\nKPX K edotaccent -25\nKPX K egrave -25\nKPX K emacron -25\nKPX K eogonek -25\nKPX K o -25\nKPX K oacute -25\nKPX K ocircumflex -25\nKPX K odieresis -25\nKPX K ograve -25\nKPX K ohungarumlaut -25\nKPX K omacron -25\nKPX K oslash -25\nKPX K otilde -25\nKPX K u -20\nKPX K uacute -20\nKPX K ucircumflex -20\nKPX K udieresis -20\nKPX K ugrave -20\nKPX K uhungarumlaut -20\nKPX K umacron -20\nKPX K uogonek -20\nKPX K uring -20\nKPX K y -20\nKPX K yacute -20\nKPX K ydieresis -20\nKPX Kcommaaccent O -30\nKPX Kcommaaccent Oacute -30\nKPX Kcommaaccent Ocircumflex -30\nKPX Kcommaaccent Odieresis -30\nKPX Kcommaaccent Ograve -30\nKPX Kcommaaccent Ohungarumlaut -30\nKPX Kcommaaccent Omacron -30\nKPX Kcommaaccent Oslash -30\nKPX Kcommaaccent Otilde -30\nKPX Kcommaaccent e -25\nKPX Kcommaaccent eacute -25\nKPX Kcommaaccent ecaron -25\nKPX Kcommaaccent ecircumflex -25\nKPX Kcommaaccent edieresis -25\nKPX Kcommaaccent edotaccent -25\nKPX Kcommaaccent egrave -25\nKPX Kcommaaccent emacron -25\nKPX Kcommaaccent eogonek -25\nKPX Kcommaaccent o -25\nKPX Kcommaaccent oacute -25\nKPX Kcommaaccent ocircumflex -25\nKPX Kcommaaccent odieresis -25\nKPX Kcommaaccent ograve -25\nKPX Kcommaaccent ohungarumlaut -25\nKPX Kcommaaccent omacron -25\nKPX Kcommaaccent oslash -25\nKPX Kcommaaccent otilde -25\nKPX Kcommaaccent u -20\nKPX Kcommaaccent uacute -20\nKPX Kcommaaccent ucircumflex -20\nKPX Kcommaaccent udieresis -20\nKPX Kcommaaccent ugrave -20\nKPX Kcommaaccent uhungarumlaut -20\nKPX Kcommaaccent umacron -20\nKPX Kcommaaccent uogonek -20\nKPX Kcommaaccent uring -20\nKPX Kcommaaccent y -20\nKPX Kcommaaccent yacute -20\nKPX Kcommaaccent ydieresis -20\nKPX L T -18\nKPX L Tcaron -18\nKPX L Tcommaaccent -18\nKPX L V -37\nKPX L W -37\nKPX L Y -37\nKPX L Yacute -37\nKPX L Ydieresis -37\nKPX L quoteright -55\nKPX L y -37\nKPX L yacute -37\nKPX L ydieresis -37\nKPX Lacute T -18\nKPX Lacute Tcaron -18\nKPX Lacute Tcommaaccent -18\nKPX Lacute V -37\nKPX Lacute W -37\nKPX Lacute Y -37\nKPX Lacute Yacute -37\nKPX Lacute Ydieresis -37\nKPX Lacute quoteright -55\nKPX Lacute y -37\nKPX Lacute yacute -37\nKPX Lacute ydieresis -37\nKPX Lcommaaccent T -18\nKPX Lcommaaccent Tcaron -18\nKPX Lcommaaccent Tcommaaccent -18\nKPX Lcommaaccent V -37\nKPX Lcommaaccent W -37\nKPX Lcommaaccent Y -37\nKPX Lcommaaccent Yacute -37\nKPX Lcommaaccent Ydieresis -37\nKPX Lcommaaccent quoteright -55\nKPX Lcommaaccent y -37\nKPX Lcommaaccent yacute -37\nKPX Lcommaaccent ydieresis -37\nKPX Lslash T -18\nKPX Lslash Tcaron -18\nKPX Lslash Tcommaaccent -18\nKPX Lslash V -37\nKPX Lslash W -37\nKPX Lslash Y -37\nKPX Lslash Yacute -37\nKPX Lslash Ydieresis -37\nKPX Lslash quoteright -55\nKPX Lslash y -37\nKPX Lslash yacute -37\nKPX Lslash ydieresis -37\nKPX N A -30\nKPX N Aacute -30\nKPX N Abreve -30\nKPX N Acircumflex -30\nKPX N Adieresis -30\nKPX N Agrave -30\nKPX N Amacron -30\nKPX N Aogonek -30\nKPX N Aring -30\nKPX N Atilde -30\nKPX Nacute A -30\nKPX Nacute Aacute -30\nKPX Nacute Abreve -30\nKPX Nacute Acircumflex -30\nKPX Nacute Adieresis -30\nKPX Nacute Agrave -30\nKPX Nacute Amacron -30\nKPX Nacute Aogonek -30\nKPX Nacute Aring -30\nKPX Nacute Atilde -30\nKPX Ncaron A -30\nKPX Ncaron Aacute -30\nKPX Ncaron Abreve -30\nKPX Ncaron Acircumflex -30\nKPX Ncaron Adieresis -30\nKPX Ncaron Agrave -30\nKPX Ncaron Amacron -30\nKPX Ncaron Aogonek -30\nKPX Ncaron Aring -30\nKPX Ncaron Atilde -30\nKPX Ncommaaccent A -30\nKPX Ncommaaccent Aacute -30\nKPX Ncommaaccent Abreve -30\nKPX Ncommaaccent Acircumflex -30\nKPX Ncommaaccent Adieresis -30\nKPX Ncommaaccent Agrave -30\nKPX Ncommaaccent Amacron -30\nKPX Ncommaaccent Aogonek -30\nKPX Ncommaaccent Aring -30\nKPX Ncommaaccent Atilde -30\nKPX Ntilde A -30\nKPX Ntilde Aacute -30\nKPX Ntilde Abreve -30\nKPX Ntilde Acircumflex -30\nKPX Ntilde Adieresis -30\nKPX Ntilde Agrave -30\nKPX Ntilde Amacron -30\nKPX Ntilde Aogonek -30\nKPX Ntilde Aring -30\nKPX Ntilde Atilde -30\nKPX O A -40\nKPX O Aacute -40\nKPX O Abreve -40\nKPX O Acircumflex -40\nKPX O Adieresis -40\nKPX O Agrave -40\nKPX O Amacron -40\nKPX O Aogonek -40\nKPX O Aring -40\nKPX O Atilde -40\nKPX O T -40\nKPX O Tcaron -40\nKPX O Tcommaaccent -40\nKPX O V -50\nKPX O W -50\nKPX O X -40\nKPX O Y -50\nKPX O Yacute -50\nKPX O Ydieresis -50\nKPX Oacute A -40\nKPX Oacute Aacute -40\nKPX Oacute Abreve -40\nKPX Oacute Acircumflex -40\nKPX Oacute Adieresis -40\nKPX Oacute Agrave -40\nKPX Oacute Amacron -40\nKPX Oacute Aogonek -40\nKPX Oacute Aring -40\nKPX Oacute Atilde -40\nKPX Oacute T -40\nKPX Oacute Tcaron -40\nKPX Oacute Tcommaaccent -40\nKPX Oacute V -50\nKPX Oacute W -50\nKPX Oacute X -40\nKPX Oacute Y -50\nKPX Oacute Yacute -50\nKPX Oacute Ydieresis -50\nKPX Ocircumflex A -40\nKPX Ocircumflex Aacute -40\nKPX Ocircumflex Abreve -40\nKPX Ocircumflex Acircumflex -40\nKPX Ocircumflex Adieresis -40\nKPX Ocircumflex Agrave -40\nKPX Ocircumflex Amacron -40\nKPX Ocircumflex Aogonek -40\nKPX Ocircumflex Aring -40\nKPX Ocircumflex Atilde -40\nKPX Ocircumflex T -40\nKPX Ocircumflex Tcaron -40\nKPX Ocircumflex Tcommaaccent -40\nKPX Ocircumflex V -50\nKPX Ocircumflex W -50\nKPX Ocircumflex X -40\nKPX Ocircumflex Y -50\nKPX Ocircumflex Yacute -50\nKPX Ocircumflex Ydieresis -50\nKPX Odieresis A -40\nKPX Odieresis Aacute -40\nKPX Odieresis Abreve -40\nKPX Odieresis Acircumflex -40\nKPX Odieresis Adieresis -40\nKPX Odieresis Agrave -40\nKPX Odieresis Amacron -40\nKPX Odieresis Aogonek -40\nKPX Odieresis Aring -40\nKPX Odieresis Atilde -40\nKPX Odieresis T -40\nKPX Odieresis Tcaron -40\nKPX Odieresis Tcommaaccent -40\nKPX Odieresis V -50\nKPX Odieresis W -50\nKPX Odieresis X -40\nKPX Odieresis Y -50\nKPX Odieresis Yacute -50\nKPX Odieresis Ydieresis -50\nKPX Ograve A -40\nKPX Ograve Aacute -40\nKPX Ograve Abreve -40\nKPX Ograve Acircumflex -40\nKPX Ograve Adieresis -40\nKPX Ograve Agrave -40\nKPX Ograve Amacron -40\nKPX Ograve Aogonek -40\nKPX Ograve Aring -40\nKPX Ograve Atilde -40\nKPX Ograve T -40\nKPX Ograve Tcaron -40\nKPX Ograve Tcommaaccent -40\nKPX Ograve V -50\nKPX Ograve W -50\nKPX Ograve X -40\nKPX Ograve Y -50\nKPX Ograve Yacute -50\nKPX Ograve Ydieresis -50\nKPX Ohungarumlaut A -40\nKPX Ohungarumlaut Aacute -40\nKPX Ohungarumlaut Abreve -40\nKPX Ohungarumlaut Acircumflex -40\nKPX Ohungarumlaut Adieresis -40\nKPX Ohungarumlaut Agrave -40\nKPX Ohungarumlaut Amacron -40\nKPX Ohungarumlaut Aogonek -40\nKPX Ohungarumlaut Aring -40\nKPX Ohungarumlaut Atilde -40\nKPX Ohungarumlaut T -40\nKPX Ohungarumlaut Tcaron -40\nKPX Ohungarumlaut Tcommaaccent -40\nKPX Ohungarumlaut V -50\nKPX Ohungarumlaut W -50\nKPX Ohungarumlaut X -40\nKPX Ohungarumlaut Y -50\nKPX Ohungarumlaut Yacute -50\nKPX Ohungarumlaut Ydieresis -50\nKPX Omacron A -40\nKPX Omacron Aacute -40\nKPX Omacron Abreve -40\nKPX Omacron Acircumflex -40\nKPX Omacron Adieresis -40\nKPX Omacron Agrave -40\nKPX Omacron Amacron -40\nKPX Omacron Aogonek -40\nKPX Omacron Aring -40\nKPX Omacron Atilde -40\nKPX Omacron T -40\nKPX Omacron Tcaron -40\nKPX Omacron Tcommaaccent -40\nKPX Omacron V -50\nKPX Omacron W -50\nKPX Omacron X -40\nKPX Omacron Y -50\nKPX Omacron Yacute -50\nKPX Omacron Ydieresis -50\nKPX Oslash A -40\nKPX Oslash Aacute -40\nKPX Oslash Abreve -40\nKPX Oslash Acircumflex -40\nKPX Oslash Adieresis -40\nKPX Oslash Agrave -40\nKPX Oslash Amacron -40\nKPX Oslash Aogonek -40\nKPX Oslash Aring -40\nKPX Oslash Atilde -40\nKPX Oslash T -40\nKPX Oslash Tcaron -40\nKPX Oslash Tcommaaccent -40\nKPX Oslash V -50\nKPX Oslash W -50\nKPX Oslash X -40\nKPX Oslash Y -50\nKPX Oslash Yacute -50\nKPX Oslash Ydieresis -50\nKPX Otilde A -40\nKPX Otilde Aacute -40\nKPX Otilde Abreve -40\nKPX Otilde Acircumflex -40\nKPX Otilde Adieresis -40\nKPX Otilde Agrave -40\nKPX Otilde Amacron -40\nKPX Otilde Aogonek -40\nKPX Otilde Aring -40\nKPX Otilde Atilde -40\nKPX Otilde T -40\nKPX Otilde Tcaron -40\nKPX Otilde Tcommaaccent -40\nKPX Otilde V -50\nKPX Otilde W -50\nKPX Otilde X -40\nKPX Otilde Y -50\nKPX Otilde Yacute -50\nKPX Otilde Ydieresis -50\nKPX P A -85\nKPX P Aacute -85\nKPX P Abreve -85\nKPX P Acircumflex -85\nKPX P Adieresis -85\nKPX P Agrave -85\nKPX P Amacron -85\nKPX P Aogonek -85\nKPX P Aring -85\nKPX P Atilde -85\nKPX P a -40\nKPX P aacute -40\nKPX P abreve -40\nKPX P acircumflex -40\nKPX P adieresis -40\nKPX P agrave -40\nKPX P amacron -40\nKPX P aogonek -40\nKPX P aring -40\nKPX P atilde -40\nKPX P comma -129\nKPX P e -50\nKPX P eacute -50\nKPX P ecaron -50\nKPX P ecircumflex -50\nKPX P edieresis -50\nKPX P edotaccent -50\nKPX P egrave -50\nKPX P emacron -50\nKPX P eogonek -50\nKPX P o -55\nKPX P oacute -55\nKPX P ocircumflex -55\nKPX P odieresis -55\nKPX P ograve -55\nKPX P ohungarumlaut -55\nKPX P omacron -55\nKPX P oslash -55\nKPX P otilde -55\nKPX P period -129\nKPX Q U -10\nKPX Q Uacute -10\nKPX Q Ucircumflex -10\nKPX Q Udieresis -10\nKPX Q Ugrave -10\nKPX Q Uhungarumlaut -10\nKPX Q Umacron -10\nKPX Q Uogonek -10\nKPX Q Uring -10\nKPX R O -40\nKPX R Oacute -40\nKPX R Ocircumflex -40\nKPX R Odieresis -40\nKPX R Ograve -40\nKPX R Ohungarumlaut -40\nKPX R Omacron -40\nKPX R Oslash -40\nKPX R Otilde -40\nKPX R T -30\nKPX R Tcaron -30\nKPX R Tcommaaccent -30\nKPX R U -40\nKPX R Uacute -40\nKPX R Ucircumflex -40\nKPX R Udieresis -40\nKPX R Ugrave -40\nKPX R Uhungarumlaut -40\nKPX R Umacron -40\nKPX R Uogonek -40\nKPX R Uring -40\nKPX R V -18\nKPX R W -18\nKPX R Y -18\nKPX R Yacute -18\nKPX R Ydieresis -18\nKPX Racute O -40\nKPX Racute Oacute -40\nKPX Racute Ocircumflex -40\nKPX Racute Odieresis -40\nKPX Racute Ograve -40\nKPX Racute Ohungarumlaut -40\nKPX Racute Omacron -40\nKPX Racute Oslash -40\nKPX Racute Otilde -40\nKPX Racute T -30\nKPX Racute Tcaron -30\nKPX Racute Tcommaaccent -30\nKPX Racute U -40\nKPX Racute Uacute -40\nKPX Racute Ucircumflex -40\nKPX Racute Udieresis -40\nKPX Racute Ugrave -40\nKPX Racute Uhungarumlaut -40\nKPX Racute Umacron -40\nKPX Racute Uogonek -40\nKPX Racute Uring -40\nKPX Racute V -18\nKPX Racute W -18\nKPX Racute Y -18\nKPX Racute Yacute -18\nKPX Racute Ydieresis -18\nKPX Rcaron O -40\nKPX Rcaron Oacute -40\nKPX Rcaron Ocircumflex -40\nKPX Rcaron Odieresis -40\nKPX Rcaron Ograve -40\nKPX Rcaron Ohungarumlaut -40\nKPX Rcaron Omacron -40\nKPX Rcaron Oslash -40\nKPX Rcaron Otilde -40\nKPX Rcaron T -30\nKPX Rcaron Tcaron -30\nKPX Rcaron Tcommaaccent -30\nKPX Rcaron U -40\nKPX Rcaron Uacute -40\nKPX Rcaron Ucircumflex -40\nKPX Rcaron Udieresis -40\nKPX Rcaron Ugrave -40\nKPX Rcaron Uhungarumlaut -40\nKPX Rcaron Umacron -40\nKPX Rcaron Uogonek -40\nKPX Rcaron Uring -40\nKPX Rcaron V -18\nKPX Rcaron W -18\nKPX Rcaron Y -18\nKPX Rcaron Yacute -18\nKPX Rcaron Ydieresis -18\nKPX Rcommaaccent O -40\nKPX Rcommaaccent Oacute -40\nKPX Rcommaaccent Ocircumflex -40\nKPX Rcommaaccent Odieresis -40\nKPX Rcommaaccent Ograve -40\nKPX Rcommaaccent Ohungarumlaut -40\nKPX Rcommaaccent Omacron -40\nKPX Rcommaaccent Oslash -40\nKPX Rcommaaccent Otilde -40\nKPX Rcommaaccent T -30\nKPX Rcommaaccent Tcaron -30\nKPX Rcommaaccent Tcommaaccent -30\nKPX Rcommaaccent U -40\nKPX Rcommaaccent Uacute -40\nKPX Rcommaaccent Ucircumflex -40\nKPX Rcommaaccent Udieresis -40\nKPX Rcommaaccent Ugrave -40\nKPX Rcommaaccent Uhungarumlaut -40\nKPX Rcommaaccent Umacron -40\nKPX Rcommaaccent Uogonek -40\nKPX Rcommaaccent Uring -40\nKPX Rcommaaccent V -18\nKPX Rcommaaccent W -18\nKPX Rcommaaccent Y -18\nKPX Rcommaaccent Yacute -18\nKPX Rcommaaccent Ydieresis -18\nKPX T A -55\nKPX T Aacute -55\nKPX T Abreve -55\nKPX T Acircumflex -55\nKPX T Adieresis -55\nKPX T Agrave -55\nKPX T Amacron -55\nKPX T Aogonek -55\nKPX T Aring -55\nKPX T Atilde -55\nKPX T O -18\nKPX T Oacute -18\nKPX T Ocircumflex -18\nKPX T Odieresis -18\nKPX T Ograve -18\nKPX T Ohungarumlaut -18\nKPX T Omacron -18\nKPX T Oslash -18\nKPX T Otilde -18\nKPX T a -92\nKPX T aacute -92\nKPX T abreve -92\nKPX T acircumflex -92\nKPX T adieresis -92\nKPX T agrave -92\nKPX T amacron -92\nKPX T aogonek -92\nKPX T aring -92\nKPX T atilde -92\nKPX T colon -74\nKPX T comma -92\nKPX T e -92\nKPX T eacute -92\nKPX T ecaron -92\nKPX T ecircumflex -92\nKPX T edieresis -52\nKPX T edotaccent -92\nKPX T egrave -52\nKPX T emacron -52\nKPX T eogonek -92\nKPX T hyphen -92\nKPX T i -37\nKPX T iacute -37\nKPX T iogonek -37\nKPX T o -95\nKPX T oacute -95\nKPX T ocircumflex -95\nKPX T odieresis -95\nKPX T ograve -95\nKPX T ohungarumlaut -95\nKPX T omacron -95\nKPX T oslash -95\nKPX T otilde -95\nKPX T period -92\nKPX T r -37\nKPX T racute -37\nKPX T rcaron -37\nKPX T rcommaaccent -37\nKPX T semicolon -74\nKPX T u -37\nKPX T uacute -37\nKPX T ucircumflex -37\nKPX T udieresis -37\nKPX T ugrave -37\nKPX T uhungarumlaut -37\nKPX T umacron -37\nKPX T uogonek -37\nKPX T uring -37\nKPX T w -37\nKPX T y -37\nKPX T yacute -37\nKPX T ydieresis -37\nKPX Tcaron A -55\nKPX Tcaron Aacute -55\nKPX Tcaron Abreve -55\nKPX Tcaron Acircumflex -55\nKPX Tcaron Adieresis -55\nKPX Tcaron Agrave -55\nKPX Tcaron Amacron -55\nKPX Tcaron Aogonek -55\nKPX Tcaron Aring -55\nKPX Tcaron Atilde -55\nKPX Tcaron O -18\nKPX Tcaron Oacute -18\nKPX Tcaron Ocircumflex -18\nKPX Tcaron Odieresis -18\nKPX Tcaron Ograve -18\nKPX Tcaron Ohungarumlaut -18\nKPX Tcaron Omacron -18\nKPX Tcaron Oslash -18\nKPX Tcaron Otilde -18\nKPX Tcaron a -92\nKPX Tcaron aacute -92\nKPX Tcaron abreve -92\nKPX Tcaron acircumflex -92\nKPX Tcaron adieresis -92\nKPX Tcaron agrave -92\nKPX Tcaron amacron -92\nKPX Tcaron aogonek -92\nKPX Tcaron aring -92\nKPX Tcaron atilde -92\nKPX Tcaron colon -74\nKPX Tcaron comma -92\nKPX Tcaron e -92\nKPX Tcaron eacute -92\nKPX Tcaron ecaron -92\nKPX Tcaron ecircumflex -92\nKPX Tcaron edieresis -52\nKPX Tcaron edotaccent -92\nKPX Tcaron egrave -52\nKPX Tcaron emacron -52\nKPX Tcaron eogonek -92\nKPX Tcaron hyphen -92\nKPX Tcaron i -37\nKPX Tcaron iacute -37\nKPX Tcaron iogonek -37\nKPX Tcaron o -95\nKPX Tcaron oacute -95\nKPX Tcaron ocircumflex -95\nKPX Tcaron odieresis -95\nKPX Tcaron ograve -95\nKPX Tcaron ohungarumlaut -95\nKPX Tcaron omacron -95\nKPX Tcaron oslash -95\nKPX Tcaron otilde -95\nKPX Tcaron period -92\nKPX Tcaron r -37\nKPX Tcaron racute -37\nKPX Tcaron rcaron -37\nKPX Tcaron rcommaaccent -37\nKPX Tcaron semicolon -74\nKPX Tcaron u -37\nKPX Tcaron uacute -37\nKPX Tcaron ucircumflex -37\nKPX Tcaron udieresis -37\nKPX Tcaron ugrave -37\nKPX Tcaron uhungarumlaut -37\nKPX Tcaron umacron -37\nKPX Tcaron uogonek -37\nKPX Tcaron uring -37\nKPX Tcaron w -37\nKPX Tcaron y -37\nKPX Tcaron yacute -37\nKPX Tcaron ydieresis -37\nKPX Tcommaaccent A -55\nKPX Tcommaaccent Aacute -55\nKPX Tcommaaccent Abreve -55\nKPX Tcommaaccent Acircumflex -55\nKPX Tcommaaccent Adieresis -55\nKPX Tcommaaccent Agrave -55\nKPX Tcommaaccent Amacron -55\nKPX Tcommaaccent Aogonek -55\nKPX Tcommaaccent Aring -55\nKPX Tcommaaccent Atilde -55\nKPX Tcommaaccent O -18\nKPX Tcommaaccent Oacute -18\nKPX Tcommaaccent Ocircumflex -18\nKPX Tcommaaccent Odieresis -18\nKPX Tcommaaccent Ograve -18\nKPX Tcommaaccent Ohungarumlaut -18\nKPX Tcommaaccent Omacron -18\nKPX Tcommaaccent Oslash -18\nKPX Tcommaaccent Otilde -18\nKPX Tcommaaccent a -92\nKPX Tcommaaccent aacute -92\nKPX Tcommaaccent abreve -92\nKPX Tcommaaccent acircumflex -92\nKPX Tcommaaccent adieresis -92\nKPX Tcommaaccent agrave -92\nKPX Tcommaaccent amacron -92\nKPX Tcommaaccent aogonek -92\nKPX Tcommaaccent aring -92\nKPX Tcommaaccent atilde -92\nKPX Tcommaaccent colon -74\nKPX Tcommaaccent comma -92\nKPX Tcommaaccent e -92\nKPX Tcommaaccent eacute -92\nKPX Tcommaaccent ecaron -92\nKPX Tcommaaccent ecircumflex -92\nKPX Tcommaaccent edieresis -52\nKPX Tcommaaccent edotaccent -92\nKPX Tcommaaccent egrave -52\nKPX Tcommaaccent emacron -52\nKPX Tcommaaccent eogonek -92\nKPX Tcommaaccent hyphen -92\nKPX Tcommaaccent i -37\nKPX Tcommaaccent iacute -37\nKPX Tcommaaccent iogonek -37\nKPX Tcommaaccent o -95\nKPX Tcommaaccent oacute -95\nKPX Tcommaaccent ocircumflex -95\nKPX Tcommaaccent odieresis -95\nKPX Tcommaaccent ograve -95\nKPX Tcommaaccent ohungarumlaut -95\nKPX Tcommaaccent omacron -95\nKPX Tcommaaccent oslash -95\nKPX Tcommaaccent otilde -95\nKPX Tcommaaccent period -92\nKPX Tcommaaccent r -37\nKPX Tcommaaccent racute -37\nKPX Tcommaaccent rcaron -37\nKPX Tcommaaccent rcommaaccent -37\nKPX Tcommaaccent semicolon -74\nKPX Tcommaaccent u -37\nKPX Tcommaaccent uacute -37\nKPX Tcommaaccent ucircumflex -37\nKPX Tcommaaccent udieresis -37\nKPX Tcommaaccent ugrave -37\nKPX Tcommaaccent uhungarumlaut -37\nKPX Tcommaaccent umacron -37\nKPX Tcommaaccent uogonek -37\nKPX Tcommaaccent uring -37\nKPX Tcommaaccent w -37\nKPX Tcommaaccent y -37\nKPX Tcommaaccent yacute -37\nKPX Tcommaaccent ydieresis -37\nKPX U A -45\nKPX U Aacute -45\nKPX U Abreve -45\nKPX U Acircumflex -45\nKPX U Adieresis -45\nKPX U Agrave -45\nKPX U Amacron -45\nKPX U Aogonek -45\nKPX U Aring -45\nKPX U Atilde -45\nKPX Uacute A -45\nKPX Uacute Aacute -45\nKPX Uacute Abreve -45\nKPX Uacute Acircumflex -45\nKPX Uacute Adieresis -45\nKPX Uacute Agrave -45\nKPX Uacute Amacron -45\nKPX Uacute Aogonek -45\nKPX Uacute Aring -45\nKPX Uacute Atilde -45\nKPX Ucircumflex A -45\nKPX Ucircumflex Aacute -45\nKPX Ucircumflex Abreve -45\nKPX Ucircumflex Acircumflex -45\nKPX Ucircumflex Adieresis -45\nKPX Ucircumflex Agrave -45\nKPX Ucircumflex Amacron -45\nKPX Ucircumflex Aogonek -45\nKPX Ucircumflex Aring -45\nKPX Ucircumflex Atilde -45\nKPX Udieresis A -45\nKPX Udieresis Aacute -45\nKPX Udieresis Abreve -45\nKPX Udieresis Acircumflex -45\nKPX Udieresis Adieresis -45\nKPX Udieresis Agrave -45\nKPX Udieresis Amacron -45\nKPX Udieresis Aogonek -45\nKPX Udieresis Aring -45\nKPX Udieresis Atilde -45\nKPX Ugrave A -45\nKPX Ugrave Aacute -45\nKPX Ugrave Abreve -45\nKPX Ugrave Acircumflex -45\nKPX Ugrave Adieresis -45\nKPX Ugrave Agrave -45\nKPX Ugrave Amacron -45\nKPX Ugrave Aogonek -45\nKPX Ugrave Aring -45\nKPX Ugrave Atilde -45\nKPX Uhungarumlaut A -45\nKPX Uhungarumlaut Aacute -45\nKPX Uhungarumlaut Abreve -45\nKPX Uhungarumlaut Acircumflex -45\nKPX Uhungarumlaut Adieresis -45\nKPX Uhungarumlaut Agrave -45\nKPX Uhungarumlaut Amacron -45\nKPX Uhungarumlaut Aogonek -45\nKPX Uhungarumlaut Aring -45\nKPX Uhungarumlaut Atilde -45\nKPX Umacron A -45\nKPX Umacron Aacute -45\nKPX Umacron Abreve -45\nKPX Umacron Acircumflex -45\nKPX Umacron Adieresis -45\nKPX Umacron Agrave -45\nKPX Umacron Amacron -45\nKPX Umacron Aogonek -45\nKPX Umacron Aring -45\nKPX Umacron Atilde -45\nKPX Uogonek A -45\nKPX Uogonek Aacute -45\nKPX Uogonek Abreve -45\nKPX Uogonek Acircumflex -45\nKPX Uogonek Adieresis -45\nKPX Uogonek Agrave -45\nKPX Uogonek Amacron -45\nKPX Uogonek Aogonek -45\nKPX Uogonek Aring -45\nKPX Uogonek Atilde -45\nKPX Uring A -45\nKPX Uring Aacute -45\nKPX Uring Abreve -45\nKPX Uring Acircumflex -45\nKPX Uring Adieresis -45\nKPX Uring Agrave -45\nKPX Uring Amacron -45\nKPX Uring Aogonek -45\nKPX Uring Aring -45\nKPX Uring Atilde -45\nKPX V A -85\nKPX V Aacute -85\nKPX V Abreve -85\nKPX V Acircumflex -85\nKPX V Adieresis -85\nKPX V Agrave -85\nKPX V Amacron -85\nKPX V Aogonek -85\nKPX V Aring -85\nKPX V Atilde -85\nKPX V G -10\nKPX V Gbreve -10\nKPX V Gcommaaccent -10\nKPX V O -30\nKPX V Oacute -30\nKPX V Ocircumflex -30\nKPX V Odieresis -30\nKPX V Ograve -30\nKPX V Ohungarumlaut -30\nKPX V Omacron -30\nKPX V Oslash -30\nKPX V Otilde -30\nKPX V a -111\nKPX V aacute -111\nKPX V abreve -111\nKPX V acircumflex -111\nKPX V adieresis -111\nKPX V agrave -111\nKPX V amacron -111\nKPX V aogonek -111\nKPX V aring -111\nKPX V atilde -111\nKPX V colon -74\nKPX V comma -129\nKPX V e -111\nKPX V eacute -111\nKPX V ecaron -111\nKPX V ecircumflex -111\nKPX V edieresis -71\nKPX V edotaccent -111\nKPX V egrave -71\nKPX V emacron -71\nKPX V eogonek -111\nKPX V hyphen -70\nKPX V i -55\nKPX V iacute -55\nKPX V iogonek -55\nKPX V o -111\nKPX V oacute -111\nKPX V ocircumflex -111\nKPX V odieresis -111\nKPX V ograve -111\nKPX V ohungarumlaut -111\nKPX V omacron -111\nKPX V oslash -111\nKPX V otilde -111\nKPX V period -129\nKPX V semicolon -74\nKPX V u -55\nKPX V uacute -55\nKPX V ucircumflex -55\nKPX V udieresis -55\nKPX V ugrave -55\nKPX V uhungarumlaut -55\nKPX V umacron -55\nKPX V uogonek -55\nKPX V uring -55\nKPX W A -74\nKPX W Aacute -74\nKPX W Abreve -74\nKPX W Acircumflex -74\nKPX W Adieresis -74\nKPX W Agrave -74\nKPX W Amacron -74\nKPX W Aogonek -74\nKPX W Aring -74\nKPX W Atilde -74\nKPX W O -15\nKPX W Oacute -15\nKPX W Ocircumflex -15\nKPX W Odieresis -15\nKPX W Ograve -15\nKPX W Ohungarumlaut -15\nKPX W Omacron -15\nKPX W Oslash -15\nKPX W Otilde -15\nKPX W a -85\nKPX W aacute -85\nKPX W abreve -85\nKPX W acircumflex -85\nKPX W adieresis -85\nKPX W agrave -85\nKPX W amacron -85\nKPX W aogonek -85\nKPX W aring -85\nKPX W atilde -85\nKPX W colon -55\nKPX W comma -74\nKPX W e -90\nKPX W eacute -90\nKPX W ecaron -90\nKPX W ecircumflex -90\nKPX W edieresis -50\nKPX W edotaccent -90\nKPX W egrave -50\nKPX W emacron -50\nKPX W eogonek -90\nKPX W hyphen -50\nKPX W i -37\nKPX W iacute -37\nKPX W iogonek -37\nKPX W o -80\nKPX W oacute -80\nKPX W ocircumflex -80\nKPX W odieresis -80\nKPX W ograve -80\nKPX W ohungarumlaut -80\nKPX W omacron -80\nKPX W oslash -80\nKPX W otilde -80\nKPX W period -74\nKPX W semicolon -55\nKPX W u -55\nKPX W uacute -55\nKPX W ucircumflex -55\nKPX W udieresis -55\nKPX W ugrave -55\nKPX W uhungarumlaut -55\nKPX W umacron -55\nKPX W uogonek -55\nKPX W uring -55\nKPX W y -55\nKPX W yacute -55\nKPX W ydieresis -55\nKPX Y A -74\nKPX Y Aacute -74\nKPX Y Abreve -74\nKPX Y Acircumflex -74\nKPX Y Adieresis -74\nKPX Y Agrave -74\nKPX Y Amacron -74\nKPX Y Aogonek -74\nKPX Y Aring -74\nKPX Y Atilde -74\nKPX Y O -25\nKPX Y Oacute -25\nKPX Y Ocircumflex -25\nKPX Y Odieresis -25\nKPX Y Ograve -25\nKPX Y Ohungarumlaut -25\nKPX Y Omacron -25\nKPX Y Oslash -25\nKPX Y Otilde -25\nKPX Y a -92\nKPX Y aacute -92\nKPX Y abreve -92\nKPX Y acircumflex -92\nKPX Y adieresis -92\nKPX Y agrave -92\nKPX Y amacron -92\nKPX Y aogonek -92\nKPX Y aring -92\nKPX Y atilde -92\nKPX Y colon -92\nKPX Y comma -92\nKPX Y e -111\nKPX Y eacute -111\nKPX Y ecaron -111\nKPX Y ecircumflex -71\nKPX Y edieresis -71\nKPX Y edotaccent -111\nKPX Y egrave -71\nKPX Y emacron -71\nKPX Y eogonek -111\nKPX Y hyphen -92\nKPX Y i -55\nKPX Y iacute -55\nKPX Y iogonek -55\nKPX Y o -111\nKPX Y oacute -111\nKPX Y ocircumflex -111\nKPX Y odieresis -111\nKPX Y ograve -111\nKPX Y ohungarumlaut -111\nKPX Y omacron -111\nKPX Y oslash -111\nKPX Y otilde -111\nKPX Y period -74\nKPX Y semicolon -92\nKPX Y u -92\nKPX Y uacute -92\nKPX Y ucircumflex -92\nKPX Y udieresis -92\nKPX Y ugrave -92\nKPX Y uhungarumlaut -92\nKPX Y umacron -92\nKPX Y uogonek -92\nKPX Y uring -92\nKPX Yacute A -74\nKPX Yacute Aacute -74\nKPX Yacute Abreve -74\nKPX Yacute Acircumflex -74\nKPX Yacute Adieresis -74\nKPX Yacute Agrave -74\nKPX Yacute Amacron -74\nKPX Yacute Aogonek -74\nKPX Yacute Aring -74\nKPX Yacute Atilde -74\nKPX Yacute O -25\nKPX Yacute Oacute -25\nKPX Yacute Ocircumflex -25\nKPX Yacute Odieresis -25\nKPX Yacute Ograve -25\nKPX Yacute Ohungarumlaut -25\nKPX Yacute Omacron -25\nKPX Yacute Oslash -25\nKPX Yacute Otilde -25\nKPX Yacute a -92\nKPX Yacute aacute -92\nKPX Yacute abreve -92\nKPX Yacute acircumflex -92\nKPX Yacute adieresis -92\nKPX Yacute agrave -92\nKPX Yacute amacron -92\nKPX Yacute aogonek -92\nKPX Yacute aring -92\nKPX Yacute atilde -92\nKPX Yacute colon -92\nKPX Yacute comma -92\nKPX Yacute e -111\nKPX Yacute eacute -111\nKPX Yacute ecaron -111\nKPX Yacute ecircumflex -71\nKPX Yacute edieresis -71\nKPX Yacute edotaccent -111\nKPX Yacute egrave -71\nKPX Yacute emacron -71\nKPX Yacute eogonek -111\nKPX Yacute hyphen -92\nKPX Yacute i -55\nKPX Yacute iacute -55\nKPX Yacute iogonek -55\nKPX Yacute o -111\nKPX Yacute oacute -111\nKPX Yacute ocircumflex -111\nKPX Yacute odieresis -111\nKPX Yacute ograve -111\nKPX Yacute ohungarumlaut -111\nKPX Yacute omacron -111\nKPX Yacute oslash -111\nKPX Yacute otilde -111\nKPX Yacute period -74\nKPX Yacute semicolon -92\nKPX Yacute u -92\nKPX Yacute uacute -92\nKPX Yacute ucircumflex -92\nKPX Yacute udieresis -92\nKPX Yacute ugrave -92\nKPX Yacute uhungarumlaut -92\nKPX Yacute umacron -92\nKPX Yacute uogonek -92\nKPX Yacute uring -92\nKPX Ydieresis A -74\nKPX Ydieresis Aacute -74\nKPX Ydieresis Abreve -74\nKPX Ydieresis Acircumflex -74\nKPX Ydieresis Adieresis -74\nKPX Ydieresis Agrave -74\nKPX Ydieresis Amacron -74\nKPX Ydieresis Aogonek -74\nKPX Ydieresis Aring -74\nKPX Ydieresis Atilde -74\nKPX Ydieresis O -25\nKPX Ydieresis Oacute -25\nKPX Ydieresis Ocircumflex -25\nKPX Ydieresis Odieresis -25\nKPX Ydieresis Ograve -25\nKPX Ydieresis Ohungarumlaut -25\nKPX Ydieresis Omacron -25\nKPX Ydieresis Oslash -25\nKPX Ydieresis Otilde -25\nKPX Ydieresis a -92\nKPX Ydieresis aacute -92\nKPX Ydieresis abreve -92\nKPX Ydieresis acircumflex -92\nKPX Ydieresis adieresis -92\nKPX Ydieresis agrave -92\nKPX Ydieresis amacron -92\nKPX Ydieresis aogonek -92\nKPX Ydieresis aring -92\nKPX Ydieresis atilde -92\nKPX Ydieresis colon -92\nKPX Ydieresis comma -92\nKPX Ydieresis e -111\nKPX Ydieresis eacute -111\nKPX Ydieresis ecaron -111\nKPX Ydieresis ecircumflex -71\nKPX Ydieresis edieresis -71\nKPX Ydieresis edotaccent -111\nKPX Ydieresis egrave -71\nKPX Ydieresis emacron -71\nKPX Ydieresis eogonek -111\nKPX Ydieresis hyphen -92\nKPX Ydieresis i -55\nKPX Ydieresis iacute -55\nKPX Ydieresis iogonek -55\nKPX Ydieresis o -111\nKPX Ydieresis oacute -111\nKPX Ydieresis ocircumflex -111\nKPX Ydieresis odieresis -111\nKPX Ydieresis ograve -111\nKPX Ydieresis ohungarumlaut -111\nKPX Ydieresis omacron -111\nKPX Ydieresis oslash -111\nKPX Ydieresis otilde -111\nKPX Ydieresis period -74\nKPX Ydieresis semicolon -92\nKPX Ydieresis u -92\nKPX Ydieresis uacute -92\nKPX Ydieresis ucircumflex -92\nKPX Ydieresis udieresis -92\nKPX Ydieresis ugrave -92\nKPX Ydieresis uhungarumlaut -92\nKPX Ydieresis umacron -92\nKPX Ydieresis uogonek -92\nKPX Ydieresis uring -92\nKPX b b -10\nKPX b period -40\nKPX b u -20\nKPX b uacute -20\nKPX b ucircumflex -20\nKPX b udieresis -20\nKPX b ugrave -20\nKPX b uhungarumlaut -20\nKPX b umacron -20\nKPX b uogonek -20\nKPX b uring -20\nKPX c h -10\nKPX c k -10\nKPX c kcommaaccent -10\nKPX cacute h -10\nKPX cacute k -10\nKPX cacute kcommaaccent -10\nKPX ccaron h -10\nKPX ccaron k -10\nKPX ccaron kcommaaccent -10\nKPX ccedilla h -10\nKPX ccedilla k -10\nKPX ccedilla kcommaaccent -10\nKPX comma quotedblright -95\nKPX comma quoteright -95\nKPX e b -10\nKPX eacute b -10\nKPX ecaron b -10\nKPX ecircumflex b -10\nKPX edieresis b -10\nKPX edotaccent b -10\nKPX egrave b -10\nKPX emacron b -10\nKPX eogonek b -10\nKPX f comma -10\nKPX f dotlessi -30\nKPX f e -10\nKPX f eacute -10\nKPX f edotaccent -10\nKPX f eogonek -10\nKPX f f -18\nKPX f o -10\nKPX f oacute -10\nKPX f ocircumflex -10\nKPX f ograve -10\nKPX f ohungarumlaut -10\nKPX f oslash -10\nKPX f otilde -10\nKPX f period -10\nKPX f quoteright 55\nKPX k e -30\nKPX k eacute -30\nKPX k ecaron -30\nKPX k ecircumflex -30\nKPX k edieresis -30\nKPX k edotaccent -30\nKPX k egrave -30\nKPX k emacron -30\nKPX k eogonek -30\nKPX k o -10\nKPX k oacute -10\nKPX k ocircumflex -10\nKPX k odieresis -10\nKPX k ograve -10\nKPX k ohungarumlaut -10\nKPX k omacron -10\nKPX k oslash -10\nKPX k otilde -10\nKPX kcommaaccent e -30\nKPX kcommaaccent eacute -30\nKPX kcommaaccent ecaron -30\nKPX kcommaaccent ecircumflex -30\nKPX kcommaaccent edieresis -30\nKPX kcommaaccent edotaccent -30\nKPX kcommaaccent egrave -30\nKPX kcommaaccent emacron -30\nKPX kcommaaccent eogonek -30\nKPX kcommaaccent o -10\nKPX kcommaaccent oacute -10\nKPX kcommaaccent ocircumflex -10\nKPX kcommaaccent odieresis -10\nKPX kcommaaccent ograve -10\nKPX kcommaaccent ohungarumlaut -10\nKPX kcommaaccent omacron -10\nKPX kcommaaccent oslash -10\nKPX kcommaaccent otilde -10\nKPX n v -40\nKPX nacute v -40\nKPX ncaron v -40\nKPX ncommaaccent v -40\nKPX ntilde v -40\nKPX o v -15\nKPX o w -25\nKPX o x -10\nKPX o y -10\nKPX o yacute -10\nKPX o ydieresis -10\nKPX oacute v -15\nKPX oacute w -25\nKPX oacute x -10\nKPX oacute y -10\nKPX oacute yacute -10\nKPX oacute ydieresis -10\nKPX ocircumflex v -15\nKPX ocircumflex w -25\nKPX ocircumflex x -10\nKPX ocircumflex y -10\nKPX ocircumflex yacute -10\nKPX ocircumflex ydieresis -10\nKPX odieresis v -15\nKPX odieresis w -25\nKPX odieresis x -10\nKPX odieresis y -10\nKPX odieresis yacute -10\nKPX odieresis ydieresis -10\nKPX ograve v -15\nKPX ograve w -25\nKPX ograve x -10\nKPX ograve y -10\nKPX ograve yacute -10\nKPX ograve ydieresis -10\nKPX ohungarumlaut v -15\nKPX ohungarumlaut w -25\nKPX ohungarumlaut x -10\nKPX ohungarumlaut y -10\nKPX ohungarumlaut yacute -10\nKPX ohungarumlaut ydieresis -10\nKPX omacron v -15\nKPX omacron w -25\nKPX omacron x -10\nKPX omacron y -10\nKPX omacron yacute -10\nKPX omacron ydieresis -10\nKPX oslash v -15\nKPX oslash w -25\nKPX oslash x -10\nKPX oslash y -10\nKPX oslash yacute -10\nKPX oslash ydieresis -10\nKPX otilde v -15\nKPX otilde w -25\nKPX otilde x -10\nKPX otilde y -10\nKPX otilde yacute -10\nKPX otilde ydieresis -10\nKPX period quotedblright -95\nKPX period quoteright -95\nKPX quoteleft quoteleft -74\nKPX quoteright d -15\nKPX quoteright dcroat -15\nKPX quoteright quoteright -74\nKPX quoteright r -15\nKPX quoteright racute -15\nKPX quoteright rcaron -15\nKPX quoteright rcommaaccent -15\nKPX quoteright s -74\nKPX quoteright sacute -74\nKPX quoteright scaron -74\nKPX quoteright scedilla -74\nKPX quoteright scommaaccent -74\nKPX quoteright space -74\nKPX quoteright t -37\nKPX quoteright tcommaaccent -37\nKPX quoteright v -15\nKPX r comma -65\nKPX r period -65\nKPX racute comma -65\nKPX racute period -65\nKPX rcaron comma -65\nKPX rcaron period -65\nKPX rcommaaccent comma -65\nKPX rcommaaccent period -65\nKPX space A -37\nKPX space Aacute -37\nKPX space Abreve -37\nKPX space Acircumflex -37\nKPX space Adieresis -37\nKPX space Agrave -37\nKPX space Amacron -37\nKPX space Aogonek -37\nKPX space Aring -37\nKPX space Atilde -37\nKPX space V -70\nKPX space W -70\nKPX space Y -70\nKPX space Yacute -70\nKPX space Ydieresis -70\nKPX v comma -37\nKPX v e -15\nKPX v eacute -15\nKPX v ecaron -15\nKPX v ecircumflex -15\nKPX v edieresis -15\nKPX v edotaccent -15\nKPX v egrave -15\nKPX v emacron -15\nKPX v eogonek -15\nKPX v o -15\nKPX v oacute -15\nKPX v ocircumflex -15\nKPX v odieresis -15\nKPX v ograve -15\nKPX v ohungarumlaut -15\nKPX v omacron -15\nKPX v oslash -15\nKPX v otilde -15\nKPX v period -37\nKPX w a -10\nKPX w aacute -10\nKPX w abreve -10\nKPX w acircumflex -10\nKPX w adieresis -10\nKPX w agrave -10\nKPX w amacron -10\nKPX w aogonek -10\nKPX w aring -10\nKPX w atilde -10\nKPX w comma -37\nKPX w e -10\nKPX w eacute -10\nKPX w ecaron -10\nKPX w ecircumflex -10\nKPX w edieresis -10\nKPX w edotaccent -10\nKPX w egrave -10\nKPX w emacron -10\nKPX w eogonek -10\nKPX w o -15\nKPX w oacute -15\nKPX w ocircumflex -15\nKPX w odieresis -15\nKPX w ograve -15\nKPX w ohungarumlaut -15\nKPX w omacron -15\nKPX w oslash -15\nKPX w otilde -15\nKPX w period -37\nKPX x e -10\nKPX x eacute -10\nKPX x ecaron -10\nKPX x ecircumflex -10\nKPX x edieresis -10\nKPX x edotaccent -10\nKPX x egrave -10\nKPX x emacron -10\nKPX x eogonek -10\nKPX y comma -37\nKPX y period -37\nKPX yacute comma -37\nKPX yacute period -37\nKPX ydieresis comma -37\nKPX ydieresis period -37\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/pdfcorefonts/Times-Italic.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 12:56:55 1997\nComment UniqueID 43067\nComment VMusage 47727 58752\nFontName Times-Italic\nFullName Times Italic\nFamilyName Times\nWeight Medium\nItalicAngle -15.5\nIsFixedPitch false\nCharacterSet ExtendedRoman\nFontBBox -169 -217 1010 883 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 653\nXHeight 441\nAscender 683\nDescender -217\nStdHW 32\nStdVW 76\nStartCharMetrics 315\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 39 -11 302 667 ;\nC 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ;\nC 35 ; WX 500 ; N numbersign ; B 2 0 540 676 ;\nC 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ;\nC 37 ; WX 833 ; N percent ; B 79 -13 790 676 ;\nC 38 ; WX 778 ; N ampersand ; B 76 -18 723 666 ;\nC 39 ; WX 333 ; N quoteright ; B 151 436 290 666 ;\nC 40 ; WX 333 ; N parenleft ; B 42 -181 315 669 ;\nC 41 ; WX 333 ; N parenright ; B 16 -180 289 669 ;\nC 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ;\nC 43 ; WX 675 ; N plus ; B 86 0 590 506 ;\nC 44 ; WX 250 ; N comma ; B -4 -129 135 101 ;\nC 45 ; WX 333 ; N hyphen ; B 49 192 282 255 ;\nC 46 ; WX 250 ; N period ; B 27 -11 138 100 ;\nC 47 ; WX 278 ; N slash ; B -65 -18 386 666 ;\nC 48 ; WX 500 ; N zero ; B 32 -7 497 676 ;\nC 49 ; WX 500 ; N one ; B 49 0 409 676 ;\nC 50 ; WX 500 ; N two ; B 12 0 452 676 ;\nC 51 ; WX 500 ; N three ; B 15 -7 465 676 ;\nC 52 ; WX 500 ; N four ; B 1 0 479 676 ;\nC 53 ; WX 500 ; N five ; B 15 -7 491 666 ;\nC 54 ; WX 500 ; N six ; B 30 -7 521 686 ;\nC 55 ; WX 500 ; N seven ; B 75 -8 537 666 ;\nC 56 ; WX 500 ; N eight ; B 30 -7 493 676 ;\nC 57 ; WX 500 ; N nine ; B 23 -17 492 676 ;\nC 58 ; WX 333 ; N colon ; B 50 -11 261 441 ;\nC 59 ; WX 333 ; N semicolon ; B 27 -129 261 441 ;\nC 60 ; WX 675 ; N less ; B 84 -8 592 514 ;\nC 61 ; WX 675 ; N equal ; B 86 120 590 386 ;\nC 62 ; WX 675 ; N greater ; B 84 -8 592 514 ;\nC 63 ; WX 500 ; N question ; B 132 -12 472 664 ;\nC 64 ; WX 920 ; N at ; B 118 -18 806 666 ;\nC 65 ; WX 611 ; N A ; B -51 0 564 668 ;\nC 66 ; WX 611 ; N B ; B -8 0 588 653 ;\nC 67 ; WX 667 ; N C ; B 66 -18 689 666 ;\nC 68 ; WX 722 ; N D ; B -8 0 700 653 ;\nC 69 ; WX 611 ; N E ; B -1 0 634 653 ;\nC 70 ; WX 611 ; N F ; B 8 0 645 653 ;\nC 71 ; WX 722 ; N G ; B 52 -18 722 666 ;\nC 72 ; WX 722 ; N H ; B -8 0 767 653 ;\nC 73 ; WX 333 ; N I ; B -8 0 384 653 ;\nC 74 ; WX 444 ; N J ; B -6 -18 491 653 ;\nC 75 ; WX 667 ; N K ; B 7 0 722 653 ;\nC 76 ; WX 556 ; N L ; B -8 0 559 653 ;\nC 77 ; WX 833 ; N M ; B -18 0 873 653 ;\nC 78 ; WX 667 ; N N ; B -20 -15 727 653 ;\nC 79 ; WX 722 ; N O ; B 60 -18 699 666 ;\nC 80 ; WX 611 ; N P ; B 0 0 605 653 ;\nC 81 ; WX 722 ; N Q ; B 59 -182 699 666 ;\nC 82 ; WX 611 ; N R ; B -13 0 588 653 ;\nC 83 ; WX 500 ; N S ; B 17 -18 508 667 ;\nC 84 ; WX 556 ; N T ; B 59 0 633 653 ;\nC 85 ; WX 722 ; N U ; B 102 -18 765 653 ;\nC 86 ; WX 611 ; N V ; B 76 -18 688 653 ;\nC 87 ; WX 833 ; N W ; B 71 -18 906 653 ;\nC 88 ; WX 611 ; N X ; B -29 0 655 653 ;\nC 89 ; WX 556 ; N Y ; B 78 0 633 653 ;\nC 90 ; WX 556 ; N Z ; B -6 0 606 653 ;\nC 91 ; WX 389 ; N bracketleft ; B 21 -153 391 663 ;\nC 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ;\nC 93 ; WX 389 ; N bracketright ; B 12 -153 382 663 ;\nC 94 ; WX 422 ; N asciicircum ; B 0 301 422 666 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333 ; N quoteleft ; B 171 436 310 666 ;\nC 97 ; WX 500 ; N a ; B 17 -11 476 441 ;\nC 98 ; WX 500 ; N b ; B 23 -11 473 683 ;\nC 99 ; WX 444 ; N c ; B 30 -11 425 441 ;\nC 100 ; WX 500 ; N d ; B 15 -13 527 683 ;\nC 101 ; WX 444 ; N e ; B 31 -11 412 441 ;\nC 102 ; WX 278 ; N f ; B -147 -207 424 678 ; L i fi ; L l fl ;\nC 103 ; WX 500 ; N g ; B 8 -206 472 441 ;\nC 104 ; WX 500 ; N h ; B 19 -9 478 683 ;\nC 105 ; WX 278 ; N i ; B 49 -11 264 654 ;\nC 106 ; WX 278 ; N j ; B -124 -207 276 654 ;\nC 107 ; WX 444 ; N k ; B 14 -11 461 683 ;\nC 108 ; WX 278 ; N l ; B 41 -11 279 683 ;\nC 109 ; WX 722 ; N m ; B 12 -9 704 441 ;\nC 110 ; WX 500 ; N n ; B 14 -9 474 441 ;\nC 111 ; WX 500 ; N o ; B 27 -11 468 441 ;\nC 112 ; WX 500 ; N p ; B -75 -205 469 441 ;\nC 113 ; WX 500 ; N q ; B 25 -209 483 441 ;\nC 114 ; WX 389 ; N r ; B 45 0 412 441 ;\nC 115 ; WX 389 ; N s ; B 16 -13 366 442 ;\nC 116 ; WX 278 ; N t ; B 37 -11 296 546 ;\nC 117 ; WX 500 ; N u ; B 42 -11 475 441 ;\nC 118 ; WX 444 ; N v ; B 21 -18 426 441 ;\nC 119 ; WX 667 ; N w ; B 16 -18 648 441 ;\nC 120 ; WX 444 ; N x ; B -27 -11 447 441 ;\nC 121 ; WX 444 ; N y ; B -24 -206 426 441 ;\nC 122 ; WX 389 ; N z ; B -2 -81 380 428 ;\nC 123 ; WX 400 ; N braceleft ; B 51 -177 407 687 ;\nC 124 ; WX 275 ; N bar ; B 105 -217 171 783 ;\nC 125 ; WX 400 ; N braceright ; B -7 -177 349 687 ;\nC 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ;\nC 161 ; WX 389 ; N exclamdown ; B 59 -205 322 473 ;\nC 162 ; WX 500 ; N cent ; B 77 -143 472 560 ;\nC 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ;\nC 164 ; WX 167 ; N fraction ; B -169 -10 337 676 ;\nC 165 ; WX 500 ; N yen ; B 27 0 603 653 ;\nC 166 ; WX 500 ; N florin ; B 25 -182 507 682 ;\nC 167 ; WX 500 ; N section ; B 53 -162 461 666 ;\nC 168 ; WX 500 ; N currency ; B -22 53 522 597 ;\nC 169 ; WX 214 ; N quotesingle ; B 132 421 241 666 ;\nC 170 ; WX 556 ; N quotedblleft ; B 166 436 514 666 ;\nC 171 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ;\nC 173 ; WX 333 ; N guilsinglright ; B 52 37 282 403 ;\nC 174 ; WX 500 ; N fi ; B -141 -207 481 681 ;\nC 175 ; WX 500 ; N fl ; B -141 -204 518 682 ;\nC 177 ; WX 500 ; N endash ; B -6 197 505 243 ;\nC 178 ; WX 500 ; N dagger ; B 101 -159 488 666 ;\nC 179 ; WX 500 ; N daggerdbl ; B 22 -143 491 666 ;\nC 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ;\nC 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ;\nC 183 ; WX 350 ; N bullet ; B 40 191 310 461 ;\nC 184 ; WX 333 ; N quotesinglbase ; B 44 -129 183 101 ;\nC 185 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ;\nC 186 ; WX 556 ; N quotedblright ; B 151 436 499 666 ;\nC 187 ; WX 500 ; N guillemotright ; B 55 37 447 403 ;\nC 188 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ;\nC 189 ; WX 1000 ; N perthousand ; B 25 -19 1010 706 ;\nC 191 ; WX 500 ; N questiondown ; B 28 -205 368 471 ;\nC 193 ; WX 333 ; N grave ; B 121 492 311 664 ;\nC 194 ; WX 333 ; N acute ; B 180 494 403 664 ;\nC 195 ; WX 333 ; N circumflex ; B 91 492 385 661 ;\nC 196 ; WX 333 ; N tilde ; B 100 517 427 624 ;\nC 197 ; WX 333 ; N macron ; B 99 532 411 583 ;\nC 198 ; WX 333 ; N breve ; B 117 492 418 650 ;\nC 199 ; WX 333 ; N dotaccent ; B 207 548 305 646 ;\nC 200 ; WX 333 ; N dieresis ; B 107 548 405 646 ;\nC 202 ; WX 333 ; N ring ; B 155 492 355 691 ;\nC 203 ; WX 333 ; N cedilla ; B -30 -217 182 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ;\nC 206 ; WX 333 ; N ogonek ; B 20 -169 203 40 ;\nC 207 ; WX 333 ; N caron ; B 121 492 426 661 ;\nC 208 ; WX 889 ; N emdash ; B -6 197 894 243 ;\nC 225 ; WX 889 ; N AE ; B -27 0 911 653 ;\nC 227 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ;\nC 232 ; WX 556 ; N Lslash ; B -8 0 559 653 ;\nC 233 ; WX 722 ; N Oslash ; B 60 -105 699 722 ;\nC 234 ; WX 944 ; N OE ; B 49 -8 964 666 ;\nC 235 ; WX 310 ; N ordmasculine ; B 67 406 362 676 ;\nC 241 ; WX 667 ; N ae ; B 23 -11 640 441 ;\nC 245 ; WX 278 ; N dotlessi ; B 49 -11 235 441 ;\nC 248 ; WX 278 ; N lslash ; B 41 -11 312 683 ;\nC 249 ; WX 500 ; N oslash ; B 28 -135 469 554 ;\nC 250 ; WX 667 ; N oe ; B 20 -12 646 441 ;\nC 251 ; WX 500 ; N germandbls ; B -168 -207 493 679 ;\nC -1 ; WX 333 ; N Idieresis ; B -8 0 435 818 ;\nC -1 ; WX 444 ; N eacute ; B 31 -11 459 664 ;\nC -1 ; WX 500 ; N abreve ; B 17 -11 502 650 ;\nC -1 ; WX 500 ; N uhungarumlaut ; B 42 -11 580 664 ;\nC -1 ; WX 444 ; N ecaron ; B 31 -11 482 661 ;\nC -1 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ;\nC -1 ; WX 675 ; N divide ; B 86 -11 590 517 ;\nC -1 ; WX 556 ; N Yacute ; B 78 0 633 876 ;\nC -1 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ;\nC -1 ; WX 500 ; N aacute ; B 17 -11 487 664 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ;\nC -1 ; WX 444 ; N yacute ; B -24 -206 459 664 ;\nC -1 ; WX 389 ; N scommaaccent ; B 16 -217 366 442 ;\nC -1 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ;\nC -1 ; WX 722 ; N Uring ; B 102 -18 765 883 ;\nC -1 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ;\nC -1 ; WX 500 ; N aogonek ; B 17 -169 476 441 ;\nC -1 ; WX 722 ; N Uacute ; B 102 -18 765 876 ;\nC -1 ; WX 500 ; N uogonek ; B 42 -169 477 441 ;\nC -1 ; WX 611 ; N Edieresis ; B -1 0 634 818 ;\nC -1 ; WX 722 ; N Dcroat ; B -8 0 700 653 ;\nC -1 ; WX 250 ; N commaaccent ; B 8 -217 133 -50 ;\nC -1 ; WX 760 ; N copyright ; B 41 -18 719 666 ;\nC -1 ; WX 611 ; N Emacron ; B -1 0 634 795 ;\nC -1 ; WX 444 ; N ccaron ; B 30 -11 482 661 ;\nC -1 ; WX 500 ; N aring ; B 17 -11 476 691 ;\nC -1 ; WX 667 ; N Ncommaaccent ; B -20 -187 727 653 ;\nC -1 ; WX 278 ; N lacute ; B 41 -11 395 876 ;\nC -1 ; WX 500 ; N agrave ; B 17 -11 476 664 ;\nC -1 ; WX 556 ; N Tcommaaccent ; B 59 -217 633 653 ;\nC -1 ; WX 667 ; N Cacute ; B 66 -18 690 876 ;\nC -1 ; WX 500 ; N atilde ; B 17 -11 511 624 ;\nC -1 ; WX 611 ; N Edotaccent ; B -1 0 634 818 ;\nC -1 ; WX 389 ; N scaron ; B 16 -13 454 661 ;\nC -1 ; WX 389 ; N scedilla ; B 16 -217 366 442 ;\nC -1 ; WX 278 ; N iacute ; B 49 -11 355 664 ;\nC -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ;\nC -1 ; WX 611 ; N Rcaron ; B -13 0 588 873 ;\nC -1 ; WX 722 ; N Gcommaaccent ; B 52 -217 722 666 ;\nC -1 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ;\nC -1 ; WX 500 ; N acircumflex ; B 17 -11 476 661 ;\nC -1 ; WX 611 ; N Amacron ; B -51 0 564 795 ;\nC -1 ; WX 389 ; N rcaron ; B 45 0 434 661 ;\nC -1 ; WX 444 ; N ccedilla ; B 30 -217 425 441 ;\nC -1 ; WX 556 ; N Zdotaccent ; B -6 0 606 818 ;\nC -1 ; WX 611 ; N Thorn ; B 0 0 569 653 ;\nC -1 ; WX 722 ; N Omacron ; B 60 -18 699 795 ;\nC -1 ; WX 611 ; N Racute ; B -13 0 588 876 ;\nC -1 ; WX 500 ; N Sacute ; B 17 -18 508 876 ;\nC -1 ; WX 544 ; N dcaron ; B 15 -13 658 683 ;\nC -1 ; WX 722 ; N Umacron ; B 102 -18 765 795 ;\nC -1 ; WX 500 ; N uring ; B 42 -11 475 691 ;\nC -1 ; WX 300 ; N threesuperior ; B 43 268 339 676 ;\nC -1 ; WX 722 ; N Ograve ; B 60 -18 699 876 ;\nC -1 ; WX 611 ; N Agrave ; B -51 0 564 876 ;\nC -1 ; WX 611 ; N Abreve ; B -51 0 564 862 ;\nC -1 ; WX 675 ; N multiply ; B 93 8 582 497 ;\nC -1 ; WX 500 ; N uacute ; B 42 -11 477 664 ;\nC -1 ; WX 556 ; N Tcaron ; B 59 0 633 873 ;\nC -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ;\nC -1 ; WX 444 ; N ydieresis ; B -24 -206 441 606 ;\nC -1 ; WX 667 ; N Nacute ; B -20 -15 727 876 ;\nC -1 ; WX 278 ; N icircumflex ; B 33 -11 327 661 ;\nC -1 ; WX 611 ; N Ecircumflex ; B -1 0 634 873 ;\nC -1 ; WX 500 ; N adieresis ; B 17 -11 489 606 ;\nC -1 ; WX 444 ; N edieresis ; B 31 -11 451 606 ;\nC -1 ; WX 444 ; N cacute ; B 30 -11 459 664 ;\nC -1 ; WX 500 ; N nacute ; B 14 -9 477 664 ;\nC -1 ; WX 500 ; N umacron ; B 42 -11 485 583 ;\nC -1 ; WX 667 ; N Ncaron ; B -20 -15 727 873 ;\nC -1 ; WX 333 ; N Iacute ; B -8 0 433 876 ;\nC -1 ; WX 675 ; N plusminus ; B 86 0 590 506 ;\nC -1 ; WX 275 ; N brokenbar ; B 105 -142 171 708 ;\nC -1 ; WX 760 ; N registered ; B 41 -18 719 666 ;\nC -1 ; WX 722 ; N Gbreve ; B 52 -18 722 862 ;\nC -1 ; WX 333 ; N Idotaccent ; B -8 0 384 818 ;\nC -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;\nC -1 ; WX 611 ; N Egrave ; B -1 0 634 876 ;\nC -1 ; WX 389 ; N racute ; B 45 0 431 664 ;\nC -1 ; WX 500 ; N omacron ; B 27 -11 495 583 ;\nC -1 ; WX 556 ; N Zacute ; B -6 0 606 876 ;\nC -1 ; WX 556 ; N Zcaron ; B -6 0 606 873 ;\nC -1 ; WX 549 ; N greaterequal ; B 26 0 523 658 ;\nC -1 ; WX 722 ; N Eth ; B -8 0 700 653 ;\nC -1 ; WX 667 ; N Ccedilla ; B 66 -217 689 666 ;\nC -1 ; WX 278 ; N lcommaaccent ; B 22 -217 279 683 ;\nC -1 ; WX 300 ; N tcaron ; B 37 -11 407 681 ;\nC -1 ; WX 444 ; N eogonek ; B 31 -169 412 441 ;\nC -1 ; WX 722 ; N Uogonek ; B 102 -184 765 653 ;\nC -1 ; WX 611 ; N Aacute ; B -51 0 564 876 ;\nC -1 ; WX 611 ; N Adieresis ; B -51 0 564 818 ;\nC -1 ; WX 444 ; N egrave ; B 31 -11 412 664 ;\nC -1 ; WX 389 ; N zacute ; B -2 -81 431 664 ;\nC -1 ; WX 278 ; N iogonek ; B 49 -169 264 654 ;\nC -1 ; WX 722 ; N Oacute ; B 60 -18 699 876 ;\nC -1 ; WX 500 ; N oacute ; B 27 -11 487 664 ;\nC -1 ; WX 500 ; N amacron ; B 17 -11 495 583 ;\nC -1 ; WX 389 ; N sacute ; B 16 -13 431 664 ;\nC -1 ; WX 278 ; N idieresis ; B 49 -11 352 606 ;\nC -1 ; WX 722 ; N Ocircumflex ; B 60 -18 699 873 ;\nC -1 ; WX 722 ; N Ugrave ; B 102 -18 765 876 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 500 ; N thorn ; B -75 -205 469 683 ;\nC -1 ; WX 300 ; N twosuperior ; B 33 271 324 676 ;\nC -1 ; WX 722 ; N Odieresis ; B 60 -18 699 818 ;\nC -1 ; WX 500 ; N mu ; B -30 -209 497 428 ;\nC -1 ; WX 278 ; N igrave ; B 49 -11 284 664 ;\nC -1 ; WX 500 ; N ohungarumlaut ; B 27 -11 590 664 ;\nC -1 ; WX 611 ; N Eogonek ; B -1 -169 634 653 ;\nC -1 ; WX 500 ; N dcroat ; B 15 -13 572 683 ;\nC -1 ; WX 750 ; N threequarters ; B 23 -10 736 676 ;\nC -1 ; WX 500 ; N Scedilla ; B 17 -217 508 667 ;\nC -1 ; WX 300 ; N lcaron ; B 41 -11 407 683 ;\nC -1 ; WX 667 ; N Kcommaaccent ; B 7 -217 722 653 ;\nC -1 ; WX 556 ; N Lacute ; B -8 0 559 876 ;\nC -1 ; WX 980 ; N trademark ; B 30 247 957 653 ;\nC -1 ; WX 444 ; N edotaccent ; B 31 -11 412 606 ;\nC -1 ; WX 333 ; N Igrave ; B -8 0 384 876 ;\nC -1 ; WX 333 ; N Imacron ; B -8 0 441 795 ;\nC -1 ; WX 611 ; N Lcaron ; B -8 0 586 653 ;\nC -1 ; WX 750 ; N onehalf ; B 34 -10 749 676 ;\nC -1 ; WX 549 ; N lessequal ; B 26 0 523 658 ;\nC -1 ; WX 500 ; N ocircumflex ; B 27 -11 468 661 ;\nC -1 ; WX 500 ; N ntilde ; B 14 -9 476 624 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 102 -18 765 876 ;\nC -1 ; WX 611 ; N Eacute ; B -1 0 634 876 ;\nC -1 ; WX 444 ; N emacron ; B 31 -11 457 583 ;\nC -1 ; WX 500 ; N gbreve ; B 8 -206 487 650 ;\nC -1 ; WX 750 ; N onequarter ; B 33 -10 736 676 ;\nC -1 ; WX 500 ; N Scaron ; B 17 -18 520 873 ;\nC -1 ; WX 500 ; N Scommaaccent ; B 17 -217 508 667 ;\nC -1 ; WX 722 ; N Ohungarumlaut ; B 60 -18 699 876 ;\nC -1 ; WX 400 ; N degree ; B 101 390 387 676 ;\nC -1 ; WX 500 ; N ograve ; B 27 -11 468 664 ;\nC -1 ; WX 667 ; N Ccaron ; B 66 -18 689 873 ;\nC -1 ; WX 500 ; N ugrave ; B 42 -11 475 664 ;\nC -1 ; WX 453 ; N radical ; B 2 -60 452 768 ;\nC -1 ; WX 722 ; N Dcaron ; B -8 0 700 873 ;\nC -1 ; WX 389 ; N rcommaaccent ; B -3 -217 412 441 ;\nC -1 ; WX 667 ; N Ntilde ; B -20 -15 727 836 ;\nC -1 ; WX 500 ; N otilde ; B 27 -11 496 624 ;\nC -1 ; WX 611 ; N Rcommaaccent ; B -13 -187 588 653 ;\nC -1 ; WX 556 ; N Lcommaaccent ; B -8 -217 559 653 ;\nC -1 ; WX 611 ; N Atilde ; B -51 0 566 836 ;\nC -1 ; WX 611 ; N Aogonek ; B -51 -169 566 668 ;\nC -1 ; WX 611 ; N Aring ; B -51 0 564 883 ;\nC -1 ; WX 722 ; N Otilde ; B 60 -18 699 836 ;\nC -1 ; WX 389 ; N zdotaccent ; B -2 -81 380 606 ;\nC -1 ; WX 611 ; N Ecaron ; B -1 0 634 873 ;\nC -1 ; WX 333 ; N Iogonek ; B -8 -169 384 653 ;\nC -1 ; WX 444 ; N kcommaaccent ; B 14 -187 461 683 ;\nC -1 ; WX 675 ; N minus ; B 86 220 590 286 ;\nC -1 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ;\nC -1 ; WX 500 ; N ncaron ; B 14 -9 510 661 ;\nC -1 ; WX 278 ; N tcommaaccent ; B 2 -217 296 546 ;\nC -1 ; WX 675 ; N logicalnot ; B 86 108 590 386 ;\nC -1 ; WX 500 ; N odieresis ; B 27 -11 489 606 ;\nC -1 ; WX 500 ; N udieresis ; B 42 -11 479 606 ;\nC -1 ; WX 549 ; N notequal ; B 12 -29 537 541 ;\nC -1 ; WX 500 ; N gcommaaccent ; B 8 -206 472 706 ;\nC -1 ; WX 500 ; N eth ; B 27 -11 482 683 ;\nC -1 ; WX 389 ; N zcaron ; B -2 -81 434 661 ;\nC -1 ; WX 500 ; N ncommaaccent ; B 14 -187 474 441 ;\nC -1 ; WX 300 ; N onesuperior ; B 43 271 284 676 ;\nC -1 ; WX 278 ; N imacron ; B 46 -11 311 583 ;\nC -1 ; WX 500 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 2321\nKPX A C -30\nKPX A Cacute -30\nKPX A Ccaron -30\nKPX A Ccedilla -30\nKPX A G -35\nKPX A Gbreve -35\nKPX A Gcommaaccent -35\nKPX A O -40\nKPX A Oacute -40\nKPX A Ocircumflex -40\nKPX A Odieresis -40\nKPX A Ograve -40\nKPX A Ohungarumlaut -40\nKPX A Omacron -40\nKPX A Oslash -40\nKPX A Otilde -40\nKPX A Q -40\nKPX A T -37\nKPX A Tcaron -37\nKPX A Tcommaaccent -37\nKPX A U -50\nKPX A Uacute -50\nKPX A Ucircumflex -50\nKPX A Udieresis -50\nKPX A Ugrave -50\nKPX A Uhungarumlaut -50\nKPX A Umacron -50\nKPX A Uogonek -50\nKPX A Uring -50\nKPX A V -105\nKPX A W -95\nKPX A Y -55\nKPX A Yacute -55\nKPX A Ydieresis -55\nKPX A quoteright -37\nKPX A u -20\nKPX A uacute -20\nKPX A ucircumflex -20\nKPX A udieresis -20\nKPX A ugrave -20\nKPX A uhungarumlaut -20\nKPX A umacron -20\nKPX A uogonek -20\nKPX A uring -20\nKPX A v -55\nKPX A w -55\nKPX A y -55\nKPX A yacute -55\nKPX A ydieresis -55\nKPX Aacute C -30\nKPX Aacute Cacute -30\nKPX Aacute Ccaron -30\nKPX Aacute Ccedilla -30\nKPX Aacute G -35\nKPX Aacute Gbreve -35\nKPX Aacute Gcommaaccent -35\nKPX Aacute O -40\nKPX Aacute Oacute -40\nKPX Aacute Ocircumflex -40\nKPX Aacute Odieresis -40\nKPX Aacute Ograve -40\nKPX Aacute Ohungarumlaut -40\nKPX Aacute Omacron -40\nKPX Aacute Oslash -40\nKPX Aacute Otilde -40\nKPX Aacute Q -40\nKPX Aacute T -37\nKPX Aacute Tcaron -37\nKPX Aacute Tcommaaccent -37\nKPX Aacute U -50\nKPX Aacute Uacute -50\nKPX Aacute Ucircumflex -50\nKPX Aacute Udieresis -50\nKPX Aacute Ugrave -50\nKPX Aacute Uhungarumlaut -50\nKPX Aacute Umacron -50\nKPX Aacute Uogonek -50\nKPX Aacute Uring -50\nKPX Aacute V -105\nKPX Aacute W -95\nKPX Aacute Y -55\nKPX Aacute Yacute -55\nKPX Aacute Ydieresis -55\nKPX Aacute quoteright -37\nKPX Aacute u -20\nKPX Aacute uacute -20\nKPX Aacute ucircumflex -20\nKPX Aacute udieresis -20\nKPX Aacute ugrave -20\nKPX Aacute uhungarumlaut -20\nKPX Aacute umacron -20\nKPX Aacute uogonek -20\nKPX Aacute uring -20\nKPX Aacute v -55\nKPX Aacute w -55\nKPX Aacute y -55\nKPX Aacute yacute -55\nKPX Aacute ydieresis -55\nKPX Abreve C -30\nKPX Abreve Cacute -30\nKPX Abreve Ccaron -30\nKPX Abreve Ccedilla -30\nKPX Abreve G -35\nKPX Abreve Gbreve -35\nKPX Abreve Gcommaaccent -35\nKPX Abreve O -40\nKPX Abreve Oacute -40\nKPX Abreve Ocircumflex -40\nKPX Abreve Odieresis -40\nKPX Abreve Ograve -40\nKPX Abreve Ohungarumlaut -40\nKPX Abreve Omacron -40\nKPX Abreve Oslash -40\nKPX Abreve Otilde -40\nKPX Abreve Q -40\nKPX Abreve T -37\nKPX Abreve Tcaron -37\nKPX Abreve Tcommaaccent -37\nKPX Abreve U -50\nKPX Abreve Uacute -50\nKPX Abreve Ucircumflex -50\nKPX Abreve Udieresis -50\nKPX Abreve Ugrave -50\nKPX Abreve Uhungarumlaut -50\nKPX Abreve Umacron -50\nKPX Abreve Uogonek -50\nKPX Abreve Uring -50\nKPX Abreve V -105\nKPX Abreve W -95\nKPX Abreve Y -55\nKPX Abreve Yacute -55\nKPX Abreve Ydieresis -55\nKPX Abreve quoteright -37\nKPX Abreve u -20\nKPX Abreve uacute -20\nKPX Abreve ucircumflex -20\nKPX Abreve udieresis -20\nKPX Abreve ugrave -20\nKPX Abreve uhungarumlaut -20\nKPX Abreve umacron -20\nKPX Abreve uogonek -20\nKPX Abreve uring -20\nKPX Abreve v -55\nKPX Abreve w -55\nKPX Abreve y -55\nKPX Abreve yacute -55\nKPX Abreve ydieresis -55\nKPX Acircumflex C -30\nKPX Acircumflex Cacute -30\nKPX Acircumflex Ccaron -30\nKPX Acircumflex Ccedilla -30\nKPX Acircumflex G -35\nKPX Acircumflex Gbreve -35\nKPX Acircumflex Gcommaaccent -35\nKPX Acircumflex O -40\nKPX Acircumflex Oacute -40\nKPX Acircumflex Ocircumflex -40\nKPX Acircumflex Odieresis -40\nKPX Acircumflex Ograve -40\nKPX Acircumflex Ohungarumlaut -40\nKPX Acircumflex Omacron -40\nKPX Acircumflex Oslash -40\nKPX Acircumflex Otilde -40\nKPX Acircumflex Q -40\nKPX Acircumflex T -37\nKPX Acircumflex Tcaron -37\nKPX Acircumflex Tcommaaccent -37\nKPX Acircumflex U -50\nKPX Acircumflex Uacute -50\nKPX Acircumflex Ucircumflex -50\nKPX Acircumflex Udieresis -50\nKPX Acircumflex Ugrave -50\nKPX Acircumflex Uhungarumlaut -50\nKPX Acircumflex Umacron -50\nKPX Acircumflex Uogonek -50\nKPX Acircumflex Uring -50\nKPX Acircumflex V -105\nKPX Acircumflex W -95\nKPX Acircumflex Y -55\nKPX Acircumflex Yacute -55\nKPX Acircumflex Ydieresis -55\nKPX Acircumflex quoteright -37\nKPX Acircumflex u -20\nKPX Acircumflex uacute -20\nKPX Acircumflex ucircumflex -20\nKPX Acircumflex udieresis -20\nKPX Acircumflex ugrave -20\nKPX Acircumflex uhungarumlaut -20\nKPX Acircumflex umacron -20\nKPX Acircumflex uogonek -20\nKPX Acircumflex uring -20\nKPX Acircumflex v -55\nKPX Acircumflex w -55\nKPX Acircumflex y -55\nKPX Acircumflex yacute -55\nKPX Acircumflex ydieresis -55\nKPX Adieresis C -30\nKPX Adieresis Cacute -30\nKPX Adieresis Ccaron -30\nKPX Adieresis Ccedilla -30\nKPX Adieresis G -35\nKPX Adieresis Gbreve -35\nKPX Adieresis Gcommaaccent -35\nKPX Adieresis O -40\nKPX Adieresis Oacute -40\nKPX Adieresis Ocircumflex -40\nKPX Adieresis Odieresis -40\nKPX Adieresis Ograve -40\nKPX Adieresis Ohungarumlaut -40\nKPX Adieresis Omacron -40\nKPX Adieresis Oslash -40\nKPX Adieresis Otilde -40\nKPX Adieresis Q -40\nKPX Adieresis T -37\nKPX Adieresis Tcaron -37\nKPX Adieresis Tcommaaccent -37\nKPX Adieresis U -50\nKPX Adieresis Uacute -50\nKPX Adieresis Ucircumflex -50\nKPX Adieresis Udieresis -50\nKPX Adieresis Ugrave -50\nKPX Adieresis Uhungarumlaut -50\nKPX Adieresis Umacron -50\nKPX Adieresis Uogonek -50\nKPX Adieresis Uring -50\nKPX Adieresis V -105\nKPX Adieresis W -95\nKPX Adieresis Y -55\nKPX Adieresis Yacute -55\nKPX Adieresis Ydieresis -55\nKPX Adieresis quoteright -37\nKPX Adieresis u -20\nKPX Adieresis uacute -20\nKPX Adieresis ucircumflex -20\nKPX Adieresis udieresis -20\nKPX Adieresis ugrave -20\nKPX Adieresis uhungarumlaut -20\nKPX Adieresis umacron -20\nKPX Adieresis uogonek -20\nKPX Adieresis uring -20\nKPX Adieresis v -55\nKPX Adieresis w -55\nKPX Adieresis y -55\nKPX Adieresis yacute -55\nKPX Adieresis ydieresis -55\nKPX Agrave C -30\nKPX Agrave Cacute -30\nKPX Agrave Ccaron -30\nKPX Agrave Ccedilla -30\nKPX Agrave G -35\nKPX Agrave Gbreve -35\nKPX Agrave Gcommaaccent -35\nKPX Agrave O -40\nKPX Agrave Oacute -40\nKPX Agrave Ocircumflex -40\nKPX Agrave Odieresis -40\nKPX Agrave Ograve -40\nKPX Agrave Ohungarumlaut -40\nKPX Agrave Omacron -40\nKPX Agrave Oslash -40\nKPX Agrave Otilde -40\nKPX Agrave Q -40\nKPX Agrave T -37\nKPX Agrave Tcaron -37\nKPX Agrave Tcommaaccent -37\nKPX Agrave U -50\nKPX Agrave Uacute -50\nKPX Agrave Ucircumflex -50\nKPX Agrave Udieresis -50\nKPX Agrave Ugrave -50\nKPX Agrave Uhungarumlaut -50\nKPX Agrave Umacron -50\nKPX Agrave Uogonek -50\nKPX Agrave Uring -50\nKPX Agrave V -105\nKPX Agrave W -95\nKPX Agrave Y -55\nKPX Agrave Yacute -55\nKPX Agrave Ydieresis -55\nKPX Agrave quoteright -37\nKPX Agrave u -20\nKPX Agrave uacute -20\nKPX Agrave ucircumflex -20\nKPX Agrave udieresis -20\nKPX Agrave ugrave -20\nKPX Agrave uhungarumlaut -20\nKPX Agrave umacron -20\nKPX Agrave uogonek -20\nKPX Agrave uring -20\nKPX Agrave v -55\nKPX Agrave w -55\nKPX Agrave y -55\nKPX Agrave yacute -55\nKPX Agrave ydieresis -55\nKPX Amacron C -30\nKPX Amacron Cacute -30\nKPX Amacron Ccaron -30\nKPX Amacron Ccedilla -30\nKPX Amacron G -35\nKPX Amacron Gbreve -35\nKPX Amacron Gcommaaccent -35\nKPX Amacron O -40\nKPX Amacron Oacute -40\nKPX Amacron Ocircumflex -40\nKPX Amacron Odieresis -40\nKPX Amacron Ograve -40\nKPX Amacron Ohungarumlaut -40\nKPX Amacron Omacron -40\nKPX Amacron Oslash -40\nKPX Amacron Otilde -40\nKPX Amacron Q -40\nKPX Amacron T -37\nKPX Amacron Tcaron -37\nKPX Amacron Tcommaaccent -37\nKPX Amacron U -50\nKPX Amacron Uacute -50\nKPX Amacron Ucircumflex -50\nKPX Amacron Udieresis -50\nKPX Amacron Ugrave -50\nKPX Amacron Uhungarumlaut -50\nKPX Amacron Umacron -50\nKPX Amacron Uogonek -50\nKPX Amacron Uring -50\nKPX Amacron V -105\nKPX Amacron W -95\nKPX Amacron Y -55\nKPX Amacron Yacute -55\nKPX Amacron Ydieresis -55\nKPX Amacron quoteright -37\nKPX Amacron u -20\nKPX Amacron uacute -20\nKPX Amacron ucircumflex -20\nKPX Amacron udieresis -20\nKPX Amacron ugrave -20\nKPX Amacron uhungarumlaut -20\nKPX Amacron umacron -20\nKPX Amacron uogonek -20\nKPX Amacron uring -20\nKPX Amacron v -55\nKPX Amacron w -55\nKPX Amacron y -55\nKPX Amacron yacute -55\nKPX Amacron ydieresis -55\nKPX Aogonek C -30\nKPX Aogonek Cacute -30\nKPX Aogonek Ccaron -30\nKPX Aogonek Ccedilla -30\nKPX Aogonek G -35\nKPX Aogonek Gbreve -35\nKPX Aogonek Gcommaaccent -35\nKPX Aogonek O -40\nKPX Aogonek Oacute -40\nKPX Aogonek Ocircumflex -40\nKPX Aogonek Odieresis -40\nKPX Aogonek Ograve -40\nKPX Aogonek Ohungarumlaut -40\nKPX Aogonek Omacron -40\nKPX Aogonek Oslash -40\nKPX Aogonek Otilde -40\nKPX Aogonek Q -40\nKPX Aogonek T -37\nKPX Aogonek Tcaron -37\nKPX Aogonek Tcommaaccent -37\nKPX Aogonek U -50\nKPX Aogonek Uacute -50\nKPX Aogonek Ucircumflex -50\nKPX Aogonek Udieresis -50\nKPX Aogonek Ugrave -50\nKPX Aogonek Uhungarumlaut -50\nKPX Aogonek Umacron -50\nKPX Aogonek Uogonek -50\nKPX Aogonek Uring -50\nKPX Aogonek V -105\nKPX Aogonek W -95\nKPX Aogonek Y -55\nKPX Aogonek Yacute -55\nKPX Aogonek Ydieresis -55\nKPX Aogonek quoteright -37\nKPX Aogonek u -20\nKPX Aogonek uacute -20\nKPX Aogonek ucircumflex -20\nKPX Aogonek udieresis -20\nKPX Aogonek ugrave -20\nKPX Aogonek uhungarumlaut -20\nKPX Aogonek umacron -20\nKPX Aogonek uogonek -20\nKPX Aogonek uring -20\nKPX Aogonek v -55\nKPX Aogonek w -55\nKPX Aogonek y -55\nKPX Aogonek yacute -55\nKPX Aogonek ydieresis -55\nKPX Aring C -30\nKPX Aring Cacute -30\nKPX Aring Ccaron -30\nKPX Aring Ccedilla -30\nKPX Aring G -35\nKPX Aring Gbreve -35\nKPX Aring Gcommaaccent -35\nKPX Aring O -40\nKPX Aring Oacute -40\nKPX Aring Ocircumflex -40\nKPX Aring Odieresis -40\nKPX Aring Ograve -40\nKPX Aring Ohungarumlaut -40\nKPX Aring Omacron -40\nKPX Aring Oslash -40\nKPX Aring Otilde -40\nKPX Aring Q -40\nKPX Aring T -37\nKPX Aring Tcaron -37\nKPX Aring Tcommaaccent -37\nKPX Aring U -50\nKPX Aring Uacute -50\nKPX Aring Ucircumflex -50\nKPX Aring Udieresis -50\nKPX Aring Ugrave -50\nKPX Aring Uhungarumlaut -50\nKPX Aring Umacron -50\nKPX Aring Uogonek -50\nKPX Aring Uring -50\nKPX Aring V -105\nKPX Aring W -95\nKPX Aring Y -55\nKPX Aring Yacute -55\nKPX Aring Ydieresis -55\nKPX Aring quoteright -37\nKPX Aring u -20\nKPX Aring uacute -20\nKPX Aring ucircumflex -20\nKPX Aring udieresis -20\nKPX Aring ugrave -20\nKPX Aring uhungarumlaut -20\nKPX Aring umacron -20\nKPX Aring uogonek -20\nKPX Aring uring -20\nKPX Aring v -55\nKPX Aring w -55\nKPX Aring y -55\nKPX Aring yacute -55\nKPX Aring ydieresis -55\nKPX Atilde C -30\nKPX Atilde Cacute -30\nKPX Atilde Ccaron -30\nKPX Atilde Ccedilla -30\nKPX Atilde G -35\nKPX Atilde Gbreve -35\nKPX Atilde Gcommaaccent -35\nKPX Atilde O -40\nKPX Atilde Oacute -40\nKPX Atilde Ocircumflex -40\nKPX Atilde Odieresis -40\nKPX Atilde Ograve -40\nKPX Atilde Ohungarumlaut -40\nKPX Atilde Omacron -40\nKPX Atilde Oslash -40\nKPX Atilde Otilde -40\nKPX Atilde Q -40\nKPX Atilde T -37\nKPX Atilde Tcaron -37\nKPX Atilde Tcommaaccent -37\nKPX Atilde U -50\nKPX Atilde Uacute -50\nKPX Atilde Ucircumflex -50\nKPX Atilde Udieresis -50\nKPX Atilde Ugrave -50\nKPX Atilde Uhungarumlaut -50\nKPX Atilde Umacron -50\nKPX Atilde Uogonek -50\nKPX Atilde Uring -50\nKPX Atilde V -105\nKPX Atilde W -95\nKPX Atilde Y -55\nKPX Atilde Yacute -55\nKPX Atilde Ydieresis -55\nKPX Atilde quoteright -37\nKPX Atilde u -20\nKPX Atilde uacute -20\nKPX Atilde ucircumflex -20\nKPX Atilde udieresis -20\nKPX Atilde ugrave -20\nKPX Atilde uhungarumlaut -20\nKPX Atilde umacron -20\nKPX Atilde uogonek -20\nKPX Atilde uring -20\nKPX Atilde v -55\nKPX Atilde w -55\nKPX Atilde y -55\nKPX Atilde yacute -55\nKPX Atilde ydieresis -55\nKPX B A -25\nKPX B Aacute -25\nKPX B Abreve -25\nKPX B Acircumflex -25\nKPX B Adieresis -25\nKPX B Agrave -25\nKPX B Amacron -25\nKPX B Aogonek -25\nKPX B Aring -25\nKPX B Atilde -25\nKPX B U -10\nKPX B Uacute -10\nKPX B Ucircumflex -10\nKPX B Udieresis -10\nKPX B Ugrave -10\nKPX B Uhungarumlaut -10\nKPX B Umacron -10\nKPX B Uogonek -10\nKPX B Uring -10\nKPX D A -35\nKPX D Aacute -35\nKPX D Abreve -35\nKPX D Acircumflex -35\nKPX D Adieresis -35\nKPX D Agrave -35\nKPX D Amacron -35\nKPX D Aogonek -35\nKPX D Aring -35\nKPX D Atilde -35\nKPX D V -40\nKPX D W -40\nKPX D Y -40\nKPX D Yacute -40\nKPX D Ydieresis -40\nKPX Dcaron A -35\nKPX Dcaron Aacute -35\nKPX Dcaron Abreve -35\nKPX Dcaron Acircumflex -35\nKPX Dcaron Adieresis -35\nKPX Dcaron Agrave -35\nKPX Dcaron Amacron -35\nKPX Dcaron Aogonek -35\nKPX Dcaron Aring -35\nKPX Dcaron Atilde -35\nKPX Dcaron V -40\nKPX Dcaron W -40\nKPX Dcaron Y -40\nKPX Dcaron Yacute -40\nKPX Dcaron Ydieresis -40\nKPX Dcroat A -35\nKPX Dcroat Aacute -35\nKPX Dcroat Abreve -35\nKPX Dcroat Acircumflex -35\nKPX Dcroat Adieresis -35\nKPX Dcroat Agrave -35\nKPX Dcroat Amacron -35\nKPX Dcroat Aogonek -35\nKPX Dcroat Aring -35\nKPX Dcroat Atilde -35\nKPX Dcroat V -40\nKPX Dcroat W -40\nKPX Dcroat Y -40\nKPX Dcroat Yacute -40\nKPX Dcroat Ydieresis -40\nKPX F A -115\nKPX F Aacute -115\nKPX F Abreve -115\nKPX F Acircumflex -115\nKPX F Adieresis -115\nKPX F Agrave -115\nKPX F Amacron -115\nKPX F Aogonek -115\nKPX F Aring -115\nKPX F Atilde -115\nKPX F a -75\nKPX F aacute -75\nKPX F abreve -75\nKPX F acircumflex -75\nKPX F adieresis -75\nKPX F agrave -75\nKPX F amacron -75\nKPX F aogonek -75\nKPX F aring -75\nKPX F atilde -75\nKPX F comma -135\nKPX F e -75\nKPX F eacute -75\nKPX F ecaron -75\nKPX F ecircumflex -75\nKPX F edieresis -75\nKPX F edotaccent -75\nKPX F egrave -75\nKPX F emacron -75\nKPX F eogonek -75\nKPX F i -45\nKPX F iacute -45\nKPX F icircumflex -45\nKPX F idieresis -45\nKPX F igrave -45\nKPX F imacron -45\nKPX F iogonek -45\nKPX F o -105\nKPX F oacute -105\nKPX F ocircumflex -105\nKPX F odieresis -105\nKPX F ograve -105\nKPX F ohungarumlaut -105\nKPX F omacron -105\nKPX F oslash -105\nKPX F otilde -105\nKPX F period -135\nKPX F r -55\nKPX F racute -55\nKPX F rcaron -55\nKPX F rcommaaccent -55\nKPX J A -40\nKPX J Aacute -40\nKPX J Abreve -40\nKPX J Acircumflex -40\nKPX J Adieresis -40\nKPX J Agrave -40\nKPX J Amacron -40\nKPX J Aogonek -40\nKPX J Aring -40\nKPX J Atilde -40\nKPX J a -35\nKPX J aacute -35\nKPX J abreve -35\nKPX J acircumflex -35\nKPX J adieresis -35\nKPX J agrave -35\nKPX J amacron -35\nKPX J aogonek -35\nKPX J aring -35\nKPX J atilde -35\nKPX J comma -25\nKPX J e -25\nKPX J eacute -25\nKPX J ecaron -25\nKPX J ecircumflex -25\nKPX J edieresis -25\nKPX J edotaccent -25\nKPX J egrave -25\nKPX J emacron -25\nKPX J eogonek -25\nKPX J o -25\nKPX J oacute -25\nKPX J ocircumflex -25\nKPX J odieresis -25\nKPX J ograve -25\nKPX J ohungarumlaut -25\nKPX J omacron -25\nKPX J oslash -25\nKPX J otilde -25\nKPX J period -25\nKPX J u -35\nKPX J uacute -35\nKPX J ucircumflex -35\nKPX J udieresis -35\nKPX J ugrave -35\nKPX J uhungarumlaut -35\nKPX J umacron -35\nKPX J uogonek -35\nKPX J uring -35\nKPX K O -50\nKPX K Oacute -50\nKPX K Ocircumflex -50\nKPX K Odieresis -50\nKPX K Ograve -50\nKPX K Ohungarumlaut -50\nKPX K Omacron -50\nKPX K Oslash -50\nKPX K Otilde -50\nKPX K e -35\nKPX K eacute -35\nKPX K ecaron -35\nKPX K ecircumflex -35\nKPX K edieresis -35\nKPX K edotaccent -35\nKPX K egrave -35\nKPX K emacron -35\nKPX K eogonek -35\nKPX K o -40\nKPX K oacute -40\nKPX K ocircumflex -40\nKPX K odieresis -40\nKPX K ograve -40\nKPX K ohungarumlaut -40\nKPX K omacron -40\nKPX K oslash -40\nKPX K otilde -40\nKPX K u -40\nKPX K uacute -40\nKPX K ucircumflex -40\nKPX K udieresis -40\nKPX K ugrave -40\nKPX K uhungarumlaut -40\nKPX K umacron -40\nKPX K uogonek -40\nKPX K uring -40\nKPX K y -40\nKPX K yacute -40\nKPX K ydieresis -40\nKPX Kcommaaccent O -50\nKPX Kcommaaccent Oacute -50\nKPX Kcommaaccent Ocircumflex -50\nKPX Kcommaaccent Odieresis -50\nKPX Kcommaaccent Ograve -50\nKPX Kcommaaccent Ohungarumlaut -50\nKPX Kcommaaccent Omacron -50\nKPX Kcommaaccent Oslash -50\nKPX Kcommaaccent Otilde -50\nKPX Kcommaaccent e -35\nKPX Kcommaaccent eacute -35\nKPX Kcommaaccent ecaron -35\nKPX Kcommaaccent ecircumflex -35\nKPX Kcommaaccent edieresis -35\nKPX Kcommaaccent edotaccent -35\nKPX Kcommaaccent egrave -35\nKPX Kcommaaccent emacron -35\nKPX Kcommaaccent eogonek -35\nKPX Kcommaaccent o -40\nKPX Kcommaaccent oacute -40\nKPX Kcommaaccent ocircumflex -40\nKPX Kcommaaccent odieresis -40\nKPX Kcommaaccent ograve -40\nKPX Kcommaaccent ohungarumlaut -40\nKPX Kcommaaccent omacron -40\nKPX Kcommaaccent oslash -40\nKPX Kcommaaccent otilde -40\nKPX Kcommaaccent u -40\nKPX Kcommaaccent uacute -40\nKPX Kcommaaccent ucircumflex -40\nKPX Kcommaaccent udieresis -40\nKPX Kcommaaccent ugrave -40\nKPX Kcommaaccent uhungarumlaut -40\nKPX Kcommaaccent umacron -40\nKPX Kcommaaccent uogonek -40\nKPX Kcommaaccent uring -40\nKPX Kcommaaccent y -40\nKPX Kcommaaccent yacute -40\nKPX Kcommaaccent ydieresis -40\nKPX L T -20\nKPX L Tcaron -20\nKPX L Tcommaaccent -20\nKPX L V -55\nKPX L W -55\nKPX L Y -20\nKPX L Yacute -20\nKPX L Ydieresis -20\nKPX L quoteright -37\nKPX L y -30\nKPX L yacute -30\nKPX L ydieresis -30\nKPX Lacute T -20\nKPX Lacute Tcaron -20\nKPX Lacute Tcommaaccent -20\nKPX Lacute V -55\nKPX Lacute W -55\nKPX Lacute Y -20\nKPX Lacute Yacute -20\nKPX Lacute Ydieresis -20\nKPX Lacute quoteright -37\nKPX Lacute y -30\nKPX Lacute yacute -30\nKPX Lacute ydieresis -30\nKPX Lcommaaccent T -20\nKPX Lcommaaccent Tcaron -20\nKPX Lcommaaccent Tcommaaccent -20\nKPX Lcommaaccent V -55\nKPX Lcommaaccent W -55\nKPX Lcommaaccent Y -20\nKPX Lcommaaccent Yacute -20\nKPX Lcommaaccent Ydieresis -20\nKPX Lcommaaccent quoteright -37\nKPX Lcommaaccent y -30\nKPX Lcommaaccent yacute -30\nKPX Lcommaaccent ydieresis -30\nKPX Lslash T -20\nKPX Lslash Tcaron -20\nKPX Lslash Tcommaaccent -20\nKPX Lslash V -55\nKPX Lslash W -55\nKPX Lslash Y -20\nKPX Lslash Yacute -20\nKPX Lslash Ydieresis -20\nKPX Lslash quoteright -37\nKPX Lslash y -30\nKPX Lslash yacute -30\nKPX Lslash ydieresis -30\nKPX N A -27\nKPX N Aacute -27\nKPX N Abreve -27\nKPX N Acircumflex -27\nKPX N Adieresis -27\nKPX N Agrave -27\nKPX N Amacron -27\nKPX N Aogonek -27\nKPX N Aring -27\nKPX N Atilde -27\nKPX Nacute A -27\nKPX Nacute Aacute -27\nKPX Nacute Abreve -27\nKPX Nacute Acircumflex -27\nKPX Nacute Adieresis -27\nKPX Nacute Agrave -27\nKPX Nacute Amacron -27\nKPX Nacute Aogonek -27\nKPX Nacute Aring -27\nKPX Nacute Atilde -27\nKPX Ncaron A -27\nKPX Ncaron Aacute -27\nKPX Ncaron Abreve -27\nKPX Ncaron Acircumflex -27\nKPX Ncaron Adieresis -27\nKPX Ncaron Agrave -27\nKPX Ncaron Amacron -27\nKPX Ncaron Aogonek -27\nKPX Ncaron Aring -27\nKPX Ncaron Atilde -27\nKPX Ncommaaccent A -27\nKPX Ncommaaccent Aacute -27\nKPX Ncommaaccent Abreve -27\nKPX Ncommaaccent Acircumflex -27\nKPX Ncommaaccent Adieresis -27\nKPX Ncommaaccent Agrave -27\nKPX Ncommaaccent Amacron -27\nKPX Ncommaaccent Aogonek -27\nKPX Ncommaaccent Aring -27\nKPX Ncommaaccent Atilde -27\nKPX Ntilde A -27\nKPX Ntilde Aacute -27\nKPX Ntilde Abreve -27\nKPX Ntilde Acircumflex -27\nKPX Ntilde Adieresis -27\nKPX Ntilde Agrave -27\nKPX Ntilde Amacron -27\nKPX Ntilde Aogonek -27\nKPX Ntilde Aring -27\nKPX Ntilde Atilde -27\nKPX O A -55\nKPX O Aacute -55\nKPX O Abreve -55\nKPX O Acircumflex -55\nKPX O Adieresis -55\nKPX O Agrave -55\nKPX O Amacron -55\nKPX O Aogonek -55\nKPX O Aring -55\nKPX O Atilde -55\nKPX O T -40\nKPX O Tcaron -40\nKPX O Tcommaaccent -40\nKPX O V -50\nKPX O W -50\nKPX O X -40\nKPX O Y -50\nKPX O Yacute -50\nKPX O Ydieresis -50\nKPX Oacute A -55\nKPX Oacute Aacute -55\nKPX Oacute Abreve -55\nKPX Oacute Acircumflex -55\nKPX Oacute Adieresis -55\nKPX Oacute Agrave -55\nKPX Oacute Amacron -55\nKPX Oacute Aogonek -55\nKPX Oacute Aring -55\nKPX Oacute Atilde -55\nKPX Oacute T -40\nKPX Oacute Tcaron -40\nKPX Oacute Tcommaaccent -40\nKPX Oacute V -50\nKPX Oacute W -50\nKPX Oacute X -40\nKPX Oacute Y -50\nKPX Oacute Yacute -50\nKPX Oacute Ydieresis -50\nKPX Ocircumflex A -55\nKPX Ocircumflex Aacute -55\nKPX Ocircumflex Abreve -55\nKPX Ocircumflex Acircumflex -55\nKPX Ocircumflex Adieresis -55\nKPX Ocircumflex Agrave -55\nKPX Ocircumflex Amacron -55\nKPX Ocircumflex Aogonek -55\nKPX Ocircumflex Aring -55\nKPX Ocircumflex Atilde -55\nKPX Ocircumflex T -40\nKPX Ocircumflex Tcaron -40\nKPX Ocircumflex Tcommaaccent -40\nKPX Ocircumflex V -50\nKPX Ocircumflex W -50\nKPX Ocircumflex X -40\nKPX Ocircumflex Y -50\nKPX Ocircumflex Yacute -50\nKPX Ocircumflex Ydieresis -50\nKPX Odieresis A -55\nKPX Odieresis Aacute -55\nKPX Odieresis Abreve -55\nKPX Odieresis Acircumflex -55\nKPX Odieresis Adieresis -55\nKPX Odieresis Agrave -55\nKPX Odieresis Amacron -55\nKPX Odieresis Aogonek -55\nKPX Odieresis Aring -55\nKPX Odieresis Atilde -55\nKPX Odieresis T -40\nKPX Odieresis Tcaron -40\nKPX Odieresis Tcommaaccent -40\nKPX Odieresis V -50\nKPX Odieresis W -50\nKPX Odieresis X -40\nKPX Odieresis Y -50\nKPX Odieresis Yacute -50\nKPX Odieresis Ydieresis -50\nKPX Ograve A -55\nKPX Ograve Aacute -55\nKPX Ograve Abreve -55\nKPX Ograve Acircumflex -55\nKPX Ograve Adieresis -55\nKPX Ograve Agrave -55\nKPX Ograve Amacron -55\nKPX Ograve Aogonek -55\nKPX Ograve Aring -55\nKPX Ograve Atilde -55\nKPX Ograve T -40\nKPX Ograve Tcaron -40\nKPX Ograve Tcommaaccent -40\nKPX Ograve V -50\nKPX Ograve W -50\nKPX Ograve X -40\nKPX Ograve Y -50\nKPX Ograve Yacute -50\nKPX Ograve Ydieresis -50\nKPX Ohungarumlaut A -55\nKPX Ohungarumlaut Aacute -55\nKPX Ohungarumlaut Abreve -55\nKPX Ohungarumlaut Acircumflex -55\nKPX Ohungarumlaut Adieresis -55\nKPX Ohungarumlaut Agrave -55\nKPX Ohungarumlaut Amacron -55\nKPX Ohungarumlaut Aogonek -55\nKPX Ohungarumlaut Aring -55\nKPX Ohungarumlaut Atilde -55\nKPX Ohungarumlaut T -40\nKPX Ohungarumlaut Tcaron -40\nKPX Ohungarumlaut Tcommaaccent -40\nKPX Ohungarumlaut V -50\nKPX Ohungarumlaut W -50\nKPX Ohungarumlaut X -40\nKPX Ohungarumlaut Y -50\nKPX Ohungarumlaut Yacute -50\nKPX Ohungarumlaut Ydieresis -50\nKPX Omacron A -55\nKPX Omacron Aacute -55\nKPX Omacron Abreve -55\nKPX Omacron Acircumflex -55\nKPX Omacron Adieresis -55\nKPX Omacron Agrave -55\nKPX Omacron Amacron -55\nKPX Omacron Aogonek -55\nKPX Omacron Aring -55\nKPX Omacron Atilde -55\nKPX Omacron T -40\nKPX Omacron Tcaron -40\nKPX Omacron Tcommaaccent -40\nKPX Omacron V -50\nKPX Omacron W -50\nKPX Omacron X -40\nKPX Omacron Y -50\nKPX Omacron Yacute -50\nKPX Omacron Ydieresis -50\nKPX Oslash A -55\nKPX Oslash Aacute -55\nKPX Oslash Abreve -55\nKPX Oslash Acircumflex -55\nKPX Oslash Adieresis -55\nKPX Oslash Agrave -55\nKPX Oslash Amacron -55\nKPX Oslash Aogonek -55\nKPX Oslash Aring -55\nKPX Oslash Atilde -55\nKPX Oslash T -40\nKPX Oslash Tcaron -40\nKPX Oslash Tcommaaccent -40\nKPX Oslash V -50\nKPX Oslash W -50\nKPX Oslash X -40\nKPX Oslash Y -50\nKPX Oslash Yacute -50\nKPX Oslash Ydieresis -50\nKPX Otilde A -55\nKPX Otilde Aacute -55\nKPX Otilde Abreve -55\nKPX Otilde Acircumflex -55\nKPX Otilde Adieresis -55\nKPX Otilde Agrave -55\nKPX Otilde Amacron -55\nKPX Otilde Aogonek -55\nKPX Otilde Aring -55\nKPX Otilde Atilde -55\nKPX Otilde T -40\nKPX Otilde Tcaron -40\nKPX Otilde Tcommaaccent -40\nKPX Otilde V -50\nKPX Otilde W -50\nKPX Otilde X -40\nKPX Otilde Y -50\nKPX Otilde Yacute -50\nKPX Otilde Ydieresis -50\nKPX P A -90\nKPX P Aacute -90\nKPX P Abreve -90\nKPX P Acircumflex -90\nKPX P Adieresis -90\nKPX P Agrave -90\nKPX P Amacron -90\nKPX P Aogonek -90\nKPX P Aring -90\nKPX P Atilde -90\nKPX P a -80\nKPX P aacute -80\nKPX P abreve -80\nKPX P acircumflex -80\nKPX P adieresis -80\nKPX P agrave -80\nKPX P amacron -80\nKPX P aogonek -80\nKPX P aring -80\nKPX P atilde -80\nKPX P comma -135\nKPX P e -80\nKPX P eacute -80\nKPX P ecaron -80\nKPX P ecircumflex -80\nKPX P edieresis -80\nKPX P edotaccent -80\nKPX P egrave -80\nKPX P emacron -80\nKPX P eogonek -80\nKPX P o -80\nKPX P oacute -80\nKPX P ocircumflex -80\nKPX P odieresis -80\nKPX P ograve -80\nKPX P ohungarumlaut -80\nKPX P omacron -80\nKPX P oslash -80\nKPX P otilde -80\nKPX P period -135\nKPX Q U -10\nKPX Q Uacute -10\nKPX Q Ucircumflex -10\nKPX Q Udieresis -10\nKPX Q Ugrave -10\nKPX Q Uhungarumlaut -10\nKPX Q Umacron -10\nKPX Q Uogonek -10\nKPX Q Uring -10\nKPX R O -40\nKPX R Oacute -40\nKPX R Ocircumflex -40\nKPX R Odieresis -40\nKPX R Ograve -40\nKPX R Ohungarumlaut -40\nKPX R Omacron -40\nKPX R Oslash -40\nKPX R Otilde -40\nKPX R U -40\nKPX R Uacute -40\nKPX R Ucircumflex -40\nKPX R Udieresis -40\nKPX R Ugrave -40\nKPX R Uhungarumlaut -40\nKPX R Umacron -40\nKPX R Uogonek -40\nKPX R Uring -40\nKPX R V -18\nKPX R W -18\nKPX R Y -18\nKPX R Yacute -18\nKPX R Ydieresis -18\nKPX Racute O -40\nKPX Racute Oacute -40\nKPX Racute Ocircumflex -40\nKPX Racute Odieresis -40\nKPX Racute Ograve -40\nKPX Racute Ohungarumlaut -40\nKPX Racute Omacron -40\nKPX Racute Oslash -40\nKPX Racute Otilde -40\nKPX Racute U -40\nKPX Racute Uacute -40\nKPX Racute Ucircumflex -40\nKPX Racute Udieresis -40\nKPX Racute Ugrave -40\nKPX Racute Uhungarumlaut -40\nKPX Racute Umacron -40\nKPX Racute Uogonek -40\nKPX Racute Uring -40\nKPX Racute V -18\nKPX Racute W -18\nKPX Racute Y -18\nKPX Racute Yacute -18\nKPX Racute Ydieresis -18\nKPX Rcaron O -40\nKPX Rcaron Oacute -40\nKPX Rcaron Ocircumflex -40\nKPX Rcaron Odieresis -40\nKPX Rcaron Ograve -40\nKPX Rcaron Ohungarumlaut -40\nKPX Rcaron Omacron -40\nKPX Rcaron Oslash -40\nKPX Rcaron Otilde -40\nKPX Rcaron U -40\nKPX Rcaron Uacute -40\nKPX Rcaron Ucircumflex -40\nKPX Rcaron Udieresis -40\nKPX Rcaron Ugrave -40\nKPX Rcaron Uhungarumlaut -40\nKPX Rcaron Umacron -40\nKPX Rcaron Uogonek -40\nKPX Rcaron Uring -40\nKPX Rcaron V -18\nKPX Rcaron W -18\nKPX Rcaron Y -18\nKPX Rcaron Yacute -18\nKPX Rcaron Ydieresis -18\nKPX Rcommaaccent O -40\nKPX Rcommaaccent Oacute -40\nKPX Rcommaaccent Ocircumflex -40\nKPX Rcommaaccent Odieresis -40\nKPX Rcommaaccent Ograve -40\nKPX Rcommaaccent Ohungarumlaut -40\nKPX Rcommaaccent Omacron -40\nKPX Rcommaaccent Oslash -40\nKPX Rcommaaccent Otilde -40\nKPX Rcommaaccent U -40\nKPX Rcommaaccent Uacute -40\nKPX Rcommaaccent Ucircumflex -40\nKPX Rcommaaccent Udieresis -40\nKPX Rcommaaccent Ugrave -40\nKPX Rcommaaccent Uhungarumlaut -40\nKPX Rcommaaccent Umacron -40\nKPX Rcommaaccent Uogonek -40\nKPX Rcommaaccent Uring -40\nKPX Rcommaaccent V -18\nKPX Rcommaaccent W -18\nKPX Rcommaaccent Y -18\nKPX Rcommaaccent Yacute -18\nKPX Rcommaaccent Ydieresis -18\nKPX T A -50\nKPX T Aacute -50\nKPX T Abreve -50\nKPX T Acircumflex -50\nKPX T Adieresis -50\nKPX T Agrave -50\nKPX T Amacron -50\nKPX T Aogonek -50\nKPX T Aring -50\nKPX T Atilde -50\nKPX T O -18\nKPX T Oacute -18\nKPX T Ocircumflex -18\nKPX T Odieresis -18\nKPX T Ograve -18\nKPX T Ohungarumlaut -18\nKPX T Omacron -18\nKPX T Oslash -18\nKPX T Otilde -18\nKPX T a -92\nKPX T aacute -92\nKPX T abreve -92\nKPX T acircumflex -92\nKPX T adieresis -92\nKPX T agrave -92\nKPX T amacron -92\nKPX T aogonek -92\nKPX T aring -92\nKPX T atilde -92\nKPX T colon -55\nKPX T comma -74\nKPX T e -92\nKPX T eacute -92\nKPX T ecaron -92\nKPX T ecircumflex -52\nKPX T edieresis -52\nKPX T edotaccent -92\nKPX T egrave -52\nKPX T emacron -52\nKPX T eogonek -92\nKPX T hyphen -74\nKPX T i -55\nKPX T iacute -55\nKPX T iogonek -55\nKPX T o -92\nKPX T oacute -92\nKPX T ocircumflex -92\nKPX T odieresis -92\nKPX T ograve -92\nKPX T ohungarumlaut -92\nKPX T omacron -92\nKPX T oslash -92\nKPX T otilde -92\nKPX T period -74\nKPX T r -55\nKPX T racute -55\nKPX T rcaron -55\nKPX T rcommaaccent -55\nKPX T semicolon -65\nKPX T u -55\nKPX T uacute -55\nKPX T ucircumflex -55\nKPX T udieresis -55\nKPX T ugrave -55\nKPX T uhungarumlaut -55\nKPX T umacron -55\nKPX T uogonek -55\nKPX T uring -55\nKPX T w -74\nKPX T y -74\nKPX T yacute -74\nKPX T ydieresis -34\nKPX Tcaron A -50\nKPX Tcaron Aacute -50\nKPX Tcaron Abreve -50\nKPX Tcaron Acircumflex -50\nKPX Tcaron Adieresis -50\nKPX Tcaron Agrave -50\nKPX Tcaron Amacron -50\nKPX Tcaron Aogonek -50\nKPX Tcaron Aring -50\nKPX Tcaron Atilde -50\nKPX Tcaron O -18\nKPX Tcaron Oacute -18\nKPX Tcaron Ocircumflex -18\nKPX Tcaron Odieresis -18\nKPX Tcaron Ograve -18\nKPX Tcaron Ohungarumlaut -18\nKPX Tcaron Omacron -18\nKPX Tcaron Oslash -18\nKPX Tcaron Otilde -18\nKPX Tcaron a -92\nKPX Tcaron aacute -92\nKPX Tcaron abreve -92\nKPX Tcaron acircumflex -92\nKPX Tcaron adieresis -92\nKPX Tcaron agrave -92\nKPX Tcaron amacron -92\nKPX Tcaron aogonek -92\nKPX Tcaron aring -92\nKPX Tcaron atilde -92\nKPX Tcaron colon -55\nKPX Tcaron comma -74\nKPX Tcaron e -92\nKPX Tcaron eacute -92\nKPX Tcaron ecaron -92\nKPX Tcaron ecircumflex -52\nKPX Tcaron edieresis -52\nKPX Tcaron edotaccent -92\nKPX Tcaron egrave -52\nKPX Tcaron emacron -52\nKPX Tcaron eogonek -92\nKPX Tcaron hyphen -74\nKPX Tcaron i -55\nKPX Tcaron iacute -55\nKPX Tcaron iogonek -55\nKPX Tcaron o -92\nKPX Tcaron oacute -92\nKPX Tcaron ocircumflex -92\nKPX Tcaron odieresis -92\nKPX Tcaron ograve -92\nKPX Tcaron ohungarumlaut -92\nKPX Tcaron omacron -92\nKPX Tcaron oslash -92\nKPX Tcaron otilde -92\nKPX Tcaron period -74\nKPX Tcaron r -55\nKPX Tcaron racute -55\nKPX Tcaron rcaron -55\nKPX Tcaron rcommaaccent -55\nKPX Tcaron semicolon -65\nKPX Tcaron u -55\nKPX Tcaron uacute -55\nKPX Tcaron ucircumflex -55\nKPX Tcaron udieresis -55\nKPX Tcaron ugrave -55\nKPX Tcaron uhungarumlaut -55\nKPX Tcaron umacron -55\nKPX Tcaron uogonek -55\nKPX Tcaron uring -55\nKPX Tcaron w -74\nKPX Tcaron y -74\nKPX Tcaron yacute -74\nKPX Tcaron ydieresis -34\nKPX Tcommaaccent A -50\nKPX Tcommaaccent Aacute -50\nKPX Tcommaaccent Abreve -50\nKPX Tcommaaccent Acircumflex -50\nKPX Tcommaaccent Adieresis -50\nKPX Tcommaaccent Agrave -50\nKPX Tcommaaccent Amacron -50\nKPX Tcommaaccent Aogonek -50\nKPX Tcommaaccent Aring -50\nKPX Tcommaaccent Atilde -50\nKPX Tcommaaccent O -18\nKPX Tcommaaccent Oacute -18\nKPX Tcommaaccent Ocircumflex -18\nKPX Tcommaaccent Odieresis -18\nKPX Tcommaaccent Ograve -18\nKPX Tcommaaccent Ohungarumlaut -18\nKPX Tcommaaccent Omacron -18\nKPX Tcommaaccent Oslash -18\nKPX Tcommaaccent Otilde -18\nKPX Tcommaaccent a -92\nKPX Tcommaaccent aacute -92\nKPX Tcommaaccent abreve -92\nKPX Tcommaaccent acircumflex -92\nKPX Tcommaaccent adieresis -92\nKPX Tcommaaccent agrave -92\nKPX Tcommaaccent amacron -92\nKPX Tcommaaccent aogonek -92\nKPX Tcommaaccent aring -92\nKPX Tcommaaccent atilde -92\nKPX Tcommaaccent colon -55\nKPX Tcommaaccent comma -74\nKPX Tcommaaccent e -92\nKPX Tcommaaccent eacute -92\nKPX Tcommaaccent ecaron -92\nKPX Tcommaaccent ecircumflex -52\nKPX Tcommaaccent edieresis -52\nKPX Tcommaaccent edotaccent -92\nKPX Tcommaaccent egrave -52\nKPX Tcommaaccent emacron -52\nKPX Tcommaaccent eogonek -92\nKPX Tcommaaccent hyphen -74\nKPX Tcommaaccent i -55\nKPX Tcommaaccent iacute -55\nKPX Tcommaaccent iogonek -55\nKPX Tcommaaccent o -92\nKPX Tcommaaccent oacute -92\nKPX Tcommaaccent ocircumflex -92\nKPX Tcommaaccent odieresis -92\nKPX Tcommaaccent ograve -92\nKPX Tcommaaccent ohungarumlaut -92\nKPX Tcommaaccent omacron -92\nKPX Tcommaaccent oslash -92\nKPX Tcommaaccent otilde -92\nKPX Tcommaaccent period -74\nKPX Tcommaaccent r -55\nKPX Tcommaaccent racute -55\nKPX Tcommaaccent rcaron -55\nKPX Tcommaaccent rcommaaccent -55\nKPX Tcommaaccent semicolon -65\nKPX Tcommaaccent u -55\nKPX Tcommaaccent uacute -55\nKPX Tcommaaccent ucircumflex -55\nKPX Tcommaaccent udieresis -55\nKPX Tcommaaccent ugrave -55\nKPX Tcommaaccent uhungarumlaut -55\nKPX Tcommaaccent umacron -55\nKPX Tcommaaccent uogonek -55\nKPX Tcommaaccent uring -55\nKPX Tcommaaccent w -74\nKPX Tcommaaccent y -74\nKPX Tcommaaccent yacute -74\nKPX Tcommaaccent ydieresis -34\nKPX U A -40\nKPX U Aacute -40\nKPX U Abreve -40\nKPX U Acircumflex -40\nKPX U Adieresis -40\nKPX U Agrave -40\nKPX U Amacron -40\nKPX U Aogonek -40\nKPX U Aring -40\nKPX U Atilde -40\nKPX U comma -25\nKPX U period -25\nKPX Uacute A -40\nKPX Uacute Aacute -40\nKPX Uacute Abreve -40\nKPX Uacute Acircumflex -40\nKPX Uacute Adieresis -40\nKPX Uacute Agrave -40\nKPX Uacute Amacron -40\nKPX Uacute Aogonek -40\nKPX Uacute Aring -40\nKPX Uacute Atilde -40\nKPX Uacute comma -25\nKPX Uacute period -25\nKPX Ucircumflex A -40\nKPX Ucircumflex Aacute -40\nKPX Ucircumflex Abreve -40\nKPX Ucircumflex Acircumflex -40\nKPX Ucircumflex Adieresis -40\nKPX Ucircumflex Agrave -40\nKPX Ucircumflex Amacron -40\nKPX Ucircumflex Aogonek -40\nKPX Ucircumflex Aring -40\nKPX Ucircumflex Atilde -40\nKPX Ucircumflex comma -25\nKPX Ucircumflex period -25\nKPX Udieresis A -40\nKPX Udieresis Aacute -40\nKPX Udieresis Abreve -40\nKPX Udieresis Acircumflex -40\nKPX Udieresis Adieresis -40\nKPX Udieresis Agrave -40\nKPX Udieresis Amacron -40\nKPX Udieresis Aogonek -40\nKPX Udieresis Aring -40\nKPX Udieresis Atilde -40\nKPX Udieresis comma -25\nKPX Udieresis period -25\nKPX Ugrave A -40\nKPX Ugrave Aacute -40\nKPX Ugrave Abreve -40\nKPX Ugrave Acircumflex -40\nKPX Ugrave Adieresis -40\nKPX Ugrave Agrave -40\nKPX Ugrave Amacron -40\nKPX Ugrave Aogonek -40\nKPX Ugrave Aring -40\nKPX Ugrave Atilde -40\nKPX Ugrave comma -25\nKPX Ugrave period -25\nKPX Uhungarumlaut A -40\nKPX Uhungarumlaut Aacute -40\nKPX Uhungarumlaut Abreve -40\nKPX Uhungarumlaut Acircumflex -40\nKPX Uhungarumlaut Adieresis -40\nKPX Uhungarumlaut Agrave -40\nKPX Uhungarumlaut Amacron -40\nKPX Uhungarumlaut Aogonek -40\nKPX Uhungarumlaut Aring -40\nKPX Uhungarumlaut Atilde -40\nKPX Uhungarumlaut comma -25\nKPX Uhungarumlaut period -25\nKPX Umacron A -40\nKPX Umacron Aacute -40\nKPX Umacron Abreve -40\nKPX Umacron Acircumflex -40\nKPX Umacron Adieresis -40\nKPX Umacron Agrave -40\nKPX Umacron Amacron -40\nKPX Umacron Aogonek -40\nKPX Umacron Aring -40\nKPX Umacron Atilde -40\nKPX Umacron comma -25\nKPX Umacron period -25\nKPX Uogonek A -40\nKPX Uogonek Aacute -40\nKPX Uogonek Abreve -40\nKPX Uogonek Acircumflex -40\nKPX Uogonek Adieresis -40\nKPX Uogonek Agrave -40\nKPX Uogonek Amacron -40\nKPX Uogonek Aogonek -40\nKPX Uogonek Aring -40\nKPX Uogonek Atilde -40\nKPX Uogonek comma -25\nKPX Uogonek period -25\nKPX Uring A -40\nKPX Uring Aacute -40\nKPX Uring Abreve -40\nKPX Uring Acircumflex -40\nKPX Uring Adieresis -40\nKPX Uring Agrave -40\nKPX Uring Amacron -40\nKPX Uring Aogonek -40\nKPX Uring Aring -40\nKPX Uring Atilde -40\nKPX Uring comma -25\nKPX Uring period -25\nKPX V A -60\nKPX V Aacute -60\nKPX V Abreve -60\nKPX V Acircumflex -60\nKPX V Adieresis -60\nKPX V Agrave -60\nKPX V Amacron -60\nKPX V Aogonek -60\nKPX V Aring -60\nKPX V Atilde -60\nKPX V O -30\nKPX V Oacute -30\nKPX V Ocircumflex -30\nKPX V Odieresis -30\nKPX V Ograve -30\nKPX V Ohungarumlaut -30\nKPX V Omacron -30\nKPX V Oslash -30\nKPX V Otilde -30\nKPX V a -111\nKPX V aacute -111\nKPX V abreve -111\nKPX V acircumflex -111\nKPX V adieresis -111\nKPX V agrave -111\nKPX V amacron -111\nKPX V aogonek -111\nKPX V aring -111\nKPX V atilde -111\nKPX V colon -65\nKPX V comma -129\nKPX V e -111\nKPX V eacute -111\nKPX V ecaron -111\nKPX V ecircumflex -111\nKPX V edieresis -71\nKPX V edotaccent -111\nKPX V egrave -71\nKPX V emacron -71\nKPX V eogonek -111\nKPX V hyphen -55\nKPX V i -74\nKPX V iacute -74\nKPX V icircumflex -34\nKPX V idieresis -34\nKPX V igrave -34\nKPX V imacron -34\nKPX V iogonek -74\nKPX V o -111\nKPX V oacute -111\nKPX V ocircumflex -111\nKPX V odieresis -111\nKPX V ograve -111\nKPX V ohungarumlaut -111\nKPX V omacron -111\nKPX V oslash -111\nKPX V otilde -111\nKPX V period -129\nKPX V semicolon -74\nKPX V u -74\nKPX V uacute -74\nKPX V ucircumflex -74\nKPX V udieresis -74\nKPX V ugrave -74\nKPX V uhungarumlaut -74\nKPX V umacron -74\nKPX V uogonek -74\nKPX V uring -74\nKPX W A -60\nKPX W Aacute -60\nKPX W Abreve -60\nKPX W Acircumflex -60\nKPX W Adieresis -60\nKPX W Agrave -60\nKPX W Amacron -60\nKPX W Aogonek -60\nKPX W Aring -60\nKPX W Atilde -60\nKPX W O -25\nKPX W Oacute -25\nKPX W Ocircumflex -25\nKPX W Odieresis -25\nKPX W Ograve -25\nKPX W Ohungarumlaut -25\nKPX W Omacron -25\nKPX W Oslash -25\nKPX W Otilde -25\nKPX W a -92\nKPX W aacute -92\nKPX W abreve -92\nKPX W acircumflex -92\nKPX W adieresis -92\nKPX W agrave -92\nKPX W amacron -92\nKPX W aogonek -92\nKPX W aring -92\nKPX W atilde -92\nKPX W colon -65\nKPX W comma -92\nKPX W e -92\nKPX W eacute -92\nKPX W ecaron -92\nKPX W ecircumflex -92\nKPX W edieresis -52\nKPX W edotaccent -92\nKPX W egrave -52\nKPX W emacron -52\nKPX W eogonek -92\nKPX W hyphen -37\nKPX W i -55\nKPX W iacute -55\nKPX W iogonek -55\nKPX W o -92\nKPX W oacute -92\nKPX W ocircumflex -92\nKPX W odieresis -92\nKPX W ograve -92\nKPX W ohungarumlaut -92\nKPX W omacron -92\nKPX W oslash -92\nKPX W otilde -92\nKPX W period -92\nKPX W semicolon -65\nKPX W u -55\nKPX W uacute -55\nKPX W ucircumflex -55\nKPX W udieresis -55\nKPX W ugrave -55\nKPX W uhungarumlaut -55\nKPX W umacron -55\nKPX W uogonek -55\nKPX W uring -55\nKPX W y -70\nKPX W yacute -70\nKPX W ydieresis -70\nKPX Y A -50\nKPX Y Aacute -50\nKPX Y Abreve -50\nKPX Y Acircumflex -50\nKPX Y Adieresis -50\nKPX Y Agrave -50\nKPX Y Amacron -50\nKPX Y Aogonek -50\nKPX Y Aring -50\nKPX Y Atilde -50\nKPX Y O -15\nKPX Y Oacute -15\nKPX Y Ocircumflex -15\nKPX Y Odieresis -15\nKPX Y Ograve -15\nKPX Y Ohungarumlaut -15\nKPX Y Omacron -15\nKPX Y Oslash -15\nKPX Y Otilde -15\nKPX Y a -92\nKPX Y aacute -92\nKPX Y abreve -92\nKPX Y acircumflex -92\nKPX Y adieresis -92\nKPX Y agrave -92\nKPX Y amacron -92\nKPX Y aogonek -92\nKPX Y aring -92\nKPX Y atilde -92\nKPX Y colon -65\nKPX Y comma -92\nKPX Y e -92\nKPX Y eacute -92\nKPX Y ecaron -92\nKPX Y ecircumflex -92\nKPX Y edieresis -52\nKPX Y edotaccent -92\nKPX Y egrave -52\nKPX Y emacron -52\nKPX Y eogonek -92\nKPX Y hyphen -74\nKPX Y i -74\nKPX Y iacute -74\nKPX Y icircumflex -34\nKPX Y idieresis -34\nKPX Y igrave -34\nKPX Y imacron -34\nKPX Y iogonek -74\nKPX Y o -92\nKPX Y oacute -92\nKPX Y ocircumflex -92\nKPX Y odieresis -92\nKPX Y ograve -92\nKPX Y ohungarumlaut -92\nKPX Y omacron -92\nKPX Y oslash -92\nKPX Y otilde -92\nKPX Y period -92\nKPX Y semicolon -65\nKPX Y u -92\nKPX Y uacute -92\nKPX Y ucircumflex -92\nKPX Y udieresis -92\nKPX Y ugrave -92\nKPX Y uhungarumlaut -92\nKPX Y umacron -92\nKPX Y uogonek -92\nKPX Y uring -92\nKPX Yacute A -50\nKPX Yacute Aacute -50\nKPX Yacute Abreve -50\nKPX Yacute Acircumflex -50\nKPX Yacute Adieresis -50\nKPX Yacute Agrave -50\nKPX Yacute Amacron -50\nKPX Yacute Aogonek -50\nKPX Yacute Aring -50\nKPX Yacute Atilde -50\nKPX Yacute O -15\nKPX Yacute Oacute -15\nKPX Yacute Ocircumflex -15\nKPX Yacute Odieresis -15\nKPX Yacute Ograve -15\nKPX Yacute Ohungarumlaut -15\nKPX Yacute Omacron -15\nKPX Yacute Oslash -15\nKPX Yacute Otilde -15\nKPX Yacute a -92\nKPX Yacute aacute -92\nKPX Yacute abreve -92\nKPX Yacute acircumflex -92\nKPX Yacute adieresis -92\nKPX Yacute agrave -92\nKPX Yacute amacron -92\nKPX Yacute aogonek -92\nKPX Yacute aring -92\nKPX Yacute atilde -92\nKPX Yacute colon -65\nKPX Yacute comma -92\nKPX Yacute e -92\nKPX Yacute eacute -92\nKPX Yacute ecaron -92\nKPX Yacute ecircumflex -92\nKPX Yacute edieresis -52\nKPX Yacute edotaccent -92\nKPX Yacute egrave -52\nKPX Yacute emacron -52\nKPX Yacute eogonek -92\nKPX Yacute hyphen -74\nKPX Yacute i -74\nKPX Yacute iacute -74\nKPX Yacute icircumflex -34\nKPX Yacute idieresis -34\nKPX Yacute igrave -34\nKPX Yacute imacron -34\nKPX Yacute iogonek -74\nKPX Yacute o -92\nKPX Yacute oacute -92\nKPX Yacute ocircumflex -92\nKPX Yacute odieresis -92\nKPX Yacute ograve -92\nKPX Yacute ohungarumlaut -92\nKPX Yacute omacron -92\nKPX Yacute oslash -92\nKPX Yacute otilde -92\nKPX Yacute period -92\nKPX Yacute semicolon -65\nKPX Yacute u -92\nKPX Yacute uacute -92\nKPX Yacute ucircumflex -92\nKPX Yacute udieresis -92\nKPX Yacute ugrave -92\nKPX Yacute uhungarumlaut -92\nKPX Yacute umacron -92\nKPX Yacute uogonek -92\nKPX Yacute uring -92\nKPX Ydieresis A -50\nKPX Ydieresis Aacute -50\nKPX Ydieresis Abreve -50\nKPX Ydieresis Acircumflex -50\nKPX Ydieresis Adieresis -50\nKPX Ydieresis Agrave -50\nKPX Ydieresis Amacron -50\nKPX Ydieresis Aogonek -50\nKPX Ydieresis Aring -50\nKPX Ydieresis Atilde -50\nKPX Ydieresis O -15\nKPX Ydieresis Oacute -15\nKPX Ydieresis Ocircumflex -15\nKPX Ydieresis Odieresis -15\nKPX Ydieresis Ograve -15\nKPX Ydieresis Ohungarumlaut -15\nKPX Ydieresis Omacron -15\nKPX Ydieresis Oslash -15\nKPX Ydieresis Otilde -15\nKPX Ydieresis a -92\nKPX Ydieresis aacute -92\nKPX Ydieresis abreve -92\nKPX Ydieresis acircumflex -92\nKPX Ydieresis adieresis -92\nKPX Ydieresis agrave -92\nKPX Ydieresis amacron -92\nKPX Ydieresis aogonek -92\nKPX Ydieresis aring -92\nKPX Ydieresis atilde -92\nKPX Ydieresis colon -65\nKPX Ydieresis comma -92\nKPX Ydieresis e -92\nKPX Ydieresis eacute -92\nKPX Ydieresis ecaron -92\nKPX Ydieresis ecircumflex -92\nKPX Ydieresis edieresis -52\nKPX Ydieresis edotaccent -92\nKPX Ydieresis egrave -52\nKPX Ydieresis emacron -52\nKPX Ydieresis eogonek -92\nKPX Ydieresis hyphen -74\nKPX Ydieresis i -74\nKPX Ydieresis iacute -74\nKPX Ydieresis icircumflex -34\nKPX Ydieresis idieresis -34\nKPX Ydieresis igrave -34\nKPX Ydieresis imacron -34\nKPX Ydieresis iogonek -74\nKPX Ydieresis o -92\nKPX Ydieresis oacute -92\nKPX Ydieresis ocircumflex -92\nKPX Ydieresis odieresis -92\nKPX Ydieresis ograve -92\nKPX Ydieresis ohungarumlaut -92\nKPX Ydieresis omacron -92\nKPX Ydieresis oslash -92\nKPX Ydieresis otilde -92\nKPX Ydieresis period -92\nKPX Ydieresis semicolon -65\nKPX Ydieresis u -92\nKPX Ydieresis uacute -92\nKPX Ydieresis ucircumflex -92\nKPX Ydieresis udieresis -92\nKPX Ydieresis ugrave -92\nKPX Ydieresis uhungarumlaut -92\nKPX Ydieresis umacron -92\nKPX Ydieresis uogonek -92\nKPX Ydieresis uring -92\nKPX a g -10\nKPX a gbreve -10\nKPX a gcommaaccent -10\nKPX aacute g -10\nKPX aacute gbreve -10\nKPX aacute gcommaaccent -10\nKPX abreve g -10\nKPX abreve gbreve -10\nKPX abreve gcommaaccent -10\nKPX acircumflex g -10\nKPX acircumflex gbreve -10\nKPX acircumflex gcommaaccent -10\nKPX adieresis g -10\nKPX adieresis gbreve -10\nKPX adieresis gcommaaccent -10\nKPX agrave g -10\nKPX agrave gbreve -10\nKPX agrave gcommaaccent -10\nKPX amacron g -10\nKPX amacron gbreve -10\nKPX amacron gcommaaccent -10\nKPX aogonek g -10\nKPX aogonek gbreve -10\nKPX aogonek gcommaaccent -10\nKPX aring g -10\nKPX aring gbreve -10\nKPX aring gcommaaccent -10\nKPX atilde g -10\nKPX atilde gbreve -10\nKPX atilde gcommaaccent -10\nKPX b period -40\nKPX b u -20\nKPX b uacute -20\nKPX b ucircumflex -20\nKPX b udieresis -20\nKPX b ugrave -20\nKPX b uhungarumlaut -20\nKPX b umacron -20\nKPX b uogonek -20\nKPX b uring -20\nKPX c h -15\nKPX c k -20\nKPX c kcommaaccent -20\nKPX cacute h -15\nKPX cacute k -20\nKPX cacute kcommaaccent -20\nKPX ccaron h -15\nKPX ccaron k -20\nKPX ccaron kcommaaccent -20\nKPX ccedilla h -15\nKPX ccedilla k -20\nKPX ccedilla kcommaaccent -20\nKPX comma quotedblright -140\nKPX comma quoteright -140\nKPX e comma -10\nKPX e g -40\nKPX e gbreve -40\nKPX e gcommaaccent -40\nKPX e period -15\nKPX e v -15\nKPX e w -15\nKPX e x -20\nKPX e y -30\nKPX e yacute -30\nKPX e ydieresis -30\nKPX eacute comma -10\nKPX eacute g -40\nKPX eacute gbreve -40\nKPX eacute gcommaaccent -40\nKPX eacute period -15\nKPX eacute v -15\nKPX eacute w -15\nKPX eacute x -20\nKPX eacute y -30\nKPX eacute yacute -30\nKPX eacute ydieresis -30\nKPX ecaron comma -10\nKPX ecaron g -40\nKPX ecaron gbreve -40\nKPX ecaron gcommaaccent -40\nKPX ecaron period -15\nKPX ecaron v -15\nKPX ecaron w -15\nKPX ecaron x -20\nKPX ecaron y -30\nKPX ecaron yacute -30\nKPX ecaron ydieresis -30\nKPX ecircumflex comma -10\nKPX ecircumflex g -40\nKPX ecircumflex gbreve -40\nKPX ecircumflex gcommaaccent -40\nKPX ecircumflex period -15\nKPX ecircumflex v -15\nKPX ecircumflex w -15\nKPX ecircumflex x -20\nKPX ecircumflex y -30\nKPX ecircumflex yacute -30\nKPX ecircumflex ydieresis -30\nKPX edieresis comma -10\nKPX edieresis g -40\nKPX edieresis gbreve -40\nKPX edieresis gcommaaccent -40\nKPX edieresis period -15\nKPX edieresis v -15\nKPX edieresis w -15\nKPX edieresis x -20\nKPX edieresis y -30\nKPX edieresis yacute -30\nKPX edieresis ydieresis -30\nKPX edotaccent comma -10\nKPX edotaccent g -40\nKPX edotaccent gbreve -40\nKPX edotaccent gcommaaccent -40\nKPX edotaccent period -15\nKPX edotaccent v -15\nKPX edotaccent w -15\nKPX edotaccent x -20\nKPX edotaccent y -30\nKPX edotaccent yacute -30\nKPX edotaccent ydieresis -30\nKPX egrave comma -10\nKPX egrave g -40\nKPX egrave gbreve -40\nKPX egrave gcommaaccent -40\nKPX egrave period -15\nKPX egrave v -15\nKPX egrave w -15\nKPX egrave x -20\nKPX egrave y -30\nKPX egrave yacute -30\nKPX egrave ydieresis -30\nKPX emacron comma -10\nKPX emacron g -40\nKPX emacron gbreve -40\nKPX emacron gcommaaccent -40\nKPX emacron period -15\nKPX emacron v -15\nKPX emacron w -15\nKPX emacron x -20\nKPX emacron y -30\nKPX emacron yacute -30\nKPX emacron ydieresis -30\nKPX eogonek comma -10\nKPX eogonek g -40\nKPX eogonek gbreve -40\nKPX eogonek gcommaaccent -40\nKPX eogonek period -15\nKPX eogonek v -15\nKPX eogonek w -15\nKPX eogonek x -20\nKPX eogonek y -30\nKPX eogonek yacute -30\nKPX eogonek ydieresis -30\nKPX f comma -10\nKPX f dotlessi -60\nKPX f f -18\nKPX f i -20\nKPX f iogonek -20\nKPX f period -15\nKPX f quoteright 92\nKPX g comma -10\nKPX g e -10\nKPX g eacute -10\nKPX g ecaron -10\nKPX g ecircumflex -10\nKPX g edieresis -10\nKPX g edotaccent -10\nKPX g egrave -10\nKPX g emacron -10\nKPX g eogonek -10\nKPX g g -10\nKPX g gbreve -10\nKPX g gcommaaccent -10\nKPX g period -15\nKPX gbreve comma -10\nKPX gbreve e -10\nKPX gbreve eacute -10\nKPX gbreve ecaron -10\nKPX gbreve ecircumflex -10\nKPX gbreve edieresis -10\nKPX gbreve edotaccent -10\nKPX gbreve egrave -10\nKPX gbreve emacron -10\nKPX gbreve eogonek -10\nKPX gbreve g -10\nKPX gbreve gbreve -10\nKPX gbreve gcommaaccent -10\nKPX gbreve period -15\nKPX gcommaaccent comma -10\nKPX gcommaaccent e -10\nKPX gcommaaccent eacute -10\nKPX gcommaaccent ecaron -10\nKPX gcommaaccent ecircumflex -10\nKPX gcommaaccent edieresis -10\nKPX gcommaaccent edotaccent -10\nKPX gcommaaccent egrave -10\nKPX gcommaaccent emacron -10\nKPX gcommaaccent eogonek -10\nKPX gcommaaccent g -10\nKPX gcommaaccent gbreve -10\nKPX gcommaaccent gcommaaccent -10\nKPX gcommaaccent period -15\nKPX k e -10\nKPX k eacute -10\nKPX k ecaron -10\nKPX k ecircumflex -10\nKPX k edieresis -10\nKPX k edotaccent -10\nKPX k egrave -10\nKPX k emacron -10\nKPX k eogonek -10\nKPX k o -10\nKPX k oacute -10\nKPX k ocircumflex -10\nKPX k odieresis -10\nKPX k ograve -10\nKPX k ohungarumlaut -10\nKPX k omacron -10\nKPX k oslash -10\nKPX k otilde -10\nKPX k y -10\nKPX k yacute -10\nKPX k ydieresis -10\nKPX kcommaaccent e -10\nKPX kcommaaccent eacute -10\nKPX kcommaaccent ecaron -10\nKPX kcommaaccent ecircumflex -10\nKPX kcommaaccent edieresis -10\nKPX kcommaaccent edotaccent -10\nKPX kcommaaccent egrave -10\nKPX kcommaaccent emacron -10\nKPX kcommaaccent eogonek -10\nKPX kcommaaccent o -10\nKPX kcommaaccent oacute -10\nKPX kcommaaccent ocircumflex -10\nKPX kcommaaccent odieresis -10\nKPX kcommaaccent ograve -10\nKPX kcommaaccent ohungarumlaut -10\nKPX kcommaaccent omacron -10\nKPX kcommaaccent oslash -10\nKPX kcommaaccent otilde -10\nKPX kcommaaccent y -10\nKPX kcommaaccent yacute -10\nKPX kcommaaccent ydieresis -10\nKPX n v -40\nKPX nacute v -40\nKPX ncaron v -40\nKPX ncommaaccent v -40\nKPX ntilde v -40\nKPX o g -10\nKPX o gbreve -10\nKPX o gcommaaccent -10\nKPX o v -10\nKPX oacute g -10\nKPX oacute gbreve -10\nKPX oacute gcommaaccent -10\nKPX oacute v -10\nKPX ocircumflex g -10\nKPX ocircumflex gbreve -10\nKPX ocircumflex gcommaaccent -10\nKPX ocircumflex v -10\nKPX odieresis g -10\nKPX odieresis gbreve -10\nKPX odieresis gcommaaccent -10\nKPX odieresis v -10\nKPX ograve g -10\nKPX ograve gbreve -10\nKPX ograve gcommaaccent -10\nKPX ograve v -10\nKPX ohungarumlaut g -10\nKPX ohungarumlaut gbreve -10\nKPX ohungarumlaut gcommaaccent -10\nKPX ohungarumlaut v -10\nKPX omacron g -10\nKPX omacron gbreve -10\nKPX omacron gcommaaccent -10\nKPX omacron v -10\nKPX oslash g -10\nKPX oslash gbreve -10\nKPX oslash gcommaaccent -10\nKPX oslash v -10\nKPX otilde g -10\nKPX otilde gbreve -10\nKPX otilde gcommaaccent -10\nKPX otilde v -10\nKPX period quotedblright -140\nKPX period quoteright -140\nKPX quoteleft quoteleft -111\nKPX quoteright d -25\nKPX quoteright dcroat -25\nKPX quoteright quoteright -111\nKPX quoteright r -25\nKPX quoteright racute -25\nKPX quoteright rcaron -25\nKPX quoteright rcommaaccent -25\nKPX quoteright s -40\nKPX quoteright sacute -40\nKPX quoteright scaron -40\nKPX quoteright scedilla -40\nKPX quoteright scommaaccent -40\nKPX quoteright space -111\nKPX quoteright t -30\nKPX quoteright tcommaaccent -30\nKPX quoteright v -10\nKPX r a -15\nKPX r aacute -15\nKPX r abreve -15\nKPX r acircumflex -15\nKPX r adieresis -15\nKPX r agrave -15\nKPX r amacron -15\nKPX r aogonek -15\nKPX r aring -15\nKPX r atilde -15\nKPX r c -37\nKPX r cacute -37\nKPX r ccaron -37\nKPX r ccedilla -37\nKPX r comma -111\nKPX r d -37\nKPX r dcroat -37\nKPX r e -37\nKPX r eacute -37\nKPX r ecaron -37\nKPX r ecircumflex -37\nKPX r edieresis -37\nKPX r edotaccent -37\nKPX r egrave -37\nKPX r emacron -37\nKPX r eogonek -37\nKPX r g -37\nKPX r gbreve -37\nKPX r gcommaaccent -37\nKPX r hyphen -20\nKPX r o -45\nKPX r oacute -45\nKPX r ocircumflex -45\nKPX r odieresis -45\nKPX r ograve -45\nKPX r ohungarumlaut -45\nKPX r omacron -45\nKPX r oslash -45\nKPX r otilde -45\nKPX r period -111\nKPX r q -37\nKPX r s -10\nKPX r sacute -10\nKPX r scaron -10\nKPX r scedilla -10\nKPX r scommaaccent -10\nKPX racute a -15\nKPX racute aacute -15\nKPX racute abreve -15\nKPX racute acircumflex -15\nKPX racute adieresis -15\nKPX racute agrave -15\nKPX racute amacron -15\nKPX racute aogonek -15\nKPX racute aring -15\nKPX racute atilde -15\nKPX racute c -37\nKPX racute cacute -37\nKPX racute ccaron -37\nKPX racute ccedilla -37\nKPX racute comma -111\nKPX racute d -37\nKPX racute dcroat -37\nKPX racute e -37\nKPX racute eacute -37\nKPX racute ecaron -37\nKPX racute ecircumflex -37\nKPX racute edieresis -37\nKPX racute edotaccent -37\nKPX racute egrave -37\nKPX racute emacron -37\nKPX racute eogonek -37\nKPX racute g -37\nKPX racute gbreve -37\nKPX racute gcommaaccent -37\nKPX racute hyphen -20\nKPX racute o -45\nKPX racute oacute -45\nKPX racute ocircumflex -45\nKPX racute odieresis -45\nKPX racute ograve -45\nKPX racute ohungarumlaut -45\nKPX racute omacron -45\nKPX racute oslash -45\nKPX racute otilde -45\nKPX racute period -111\nKPX racute q -37\nKPX racute s -10\nKPX racute sacute -10\nKPX racute scaron -10\nKPX racute scedilla -10\nKPX racute scommaaccent -10\nKPX rcaron a -15\nKPX rcaron aacute -15\nKPX rcaron abreve -15\nKPX rcaron acircumflex -15\nKPX rcaron adieresis -15\nKPX rcaron agrave -15\nKPX rcaron amacron -15\nKPX rcaron aogonek -15\nKPX rcaron aring -15\nKPX rcaron atilde -15\nKPX rcaron c -37\nKPX rcaron cacute -37\nKPX rcaron ccaron -37\nKPX rcaron ccedilla -37\nKPX rcaron comma -111\nKPX rcaron d -37\nKPX rcaron dcroat -37\nKPX rcaron e -37\nKPX rcaron eacute -37\nKPX rcaron ecaron -37\nKPX rcaron ecircumflex -37\nKPX rcaron edieresis -37\nKPX rcaron edotaccent -37\nKPX rcaron egrave -37\nKPX rcaron emacron -37\nKPX rcaron eogonek -37\nKPX rcaron g -37\nKPX rcaron gbreve -37\nKPX rcaron gcommaaccent -37\nKPX rcaron hyphen -20\nKPX rcaron o -45\nKPX rcaron oacute -45\nKPX rcaron ocircumflex -45\nKPX rcaron odieresis -45\nKPX rcaron ograve -45\nKPX rcaron ohungarumlaut -45\nKPX rcaron omacron -45\nKPX rcaron oslash -45\nKPX rcaron otilde -45\nKPX rcaron period -111\nKPX rcaron q -37\nKPX rcaron s -10\nKPX rcaron sacute -10\nKPX rcaron scaron -10\nKPX rcaron scedilla -10\nKPX rcaron scommaaccent -10\nKPX rcommaaccent a -15\nKPX rcommaaccent aacute -15\nKPX rcommaaccent abreve -15\nKPX rcommaaccent acircumflex -15\nKPX rcommaaccent adieresis -15\nKPX rcommaaccent agrave -15\nKPX rcommaaccent amacron -15\nKPX rcommaaccent aogonek -15\nKPX rcommaaccent aring -15\nKPX rcommaaccent atilde -15\nKPX rcommaaccent c -37\nKPX rcommaaccent cacute -37\nKPX rcommaaccent ccaron -37\nKPX rcommaaccent ccedilla -37\nKPX rcommaaccent comma -111\nKPX rcommaaccent d -37\nKPX rcommaaccent dcroat -37\nKPX rcommaaccent e -37\nKPX rcommaaccent eacute -37\nKPX rcommaaccent ecaron -37\nKPX rcommaaccent ecircumflex -37\nKPX rcommaaccent edieresis -37\nKPX rcommaaccent edotaccent -37\nKPX rcommaaccent egrave -37\nKPX rcommaaccent emacron -37\nKPX rcommaaccent eogonek -37\nKPX rcommaaccent g -37\nKPX rcommaaccent gbreve -37\nKPX rcommaaccent gcommaaccent -37\nKPX rcommaaccent hyphen -20\nKPX rcommaaccent o -45\nKPX rcommaaccent oacute -45\nKPX rcommaaccent ocircumflex -45\nKPX rcommaaccent odieresis -45\nKPX rcommaaccent ograve -45\nKPX rcommaaccent ohungarumlaut -45\nKPX rcommaaccent omacron -45\nKPX rcommaaccent oslash -45\nKPX rcommaaccent otilde -45\nKPX rcommaaccent period -111\nKPX rcommaaccent q -37\nKPX rcommaaccent s -10\nKPX rcommaaccent sacute -10\nKPX rcommaaccent scaron -10\nKPX rcommaaccent scedilla -10\nKPX rcommaaccent scommaaccent -10\nKPX space A -18\nKPX space Aacute -18\nKPX space Abreve -18\nKPX space Acircumflex -18\nKPX space Adieresis -18\nKPX space Agrave -18\nKPX space Amacron -18\nKPX space Aogonek -18\nKPX space Aring -18\nKPX space Atilde -18\nKPX space T -18\nKPX space Tcaron -18\nKPX space Tcommaaccent -18\nKPX space V -35\nKPX space W -40\nKPX space Y -75\nKPX space Yacute -75\nKPX space Ydieresis -75\nKPX v comma -74\nKPX v period -74\nKPX w comma -74\nKPX w period -74\nKPX y comma -55\nKPX y period -55\nKPX yacute comma -55\nKPX yacute period -55\nKPX ydieresis comma -55\nKPX ydieresis period -55\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/pdfcorefonts/Times-Roman.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 12:49:17 1997\nComment UniqueID 43068\nComment VMusage 43909 54934\nFontName Times-Roman\nFullName Times Roman\nFamilyName Times\nWeight Roman\nItalicAngle 0\nIsFixedPitch false\nCharacterSet ExtendedRoman\nFontBBox -168 -218 1000 898 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 662\nXHeight 450\nAscender 683\nDescender -217\nStdHW 28\nStdVW 84\nStartCharMetrics 315\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 130 -9 238 676 ;\nC 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ;\nC 35 ; WX 500 ; N numbersign ; B 5 0 496 662 ;\nC 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ;\nC 37 ; WX 833 ; N percent ; B 61 -13 772 676 ;\nC 38 ; WX 778 ; N ampersand ; B 42 -13 750 676 ;\nC 39 ; WX 333 ; N quoteright ; B 79 433 218 676 ;\nC 40 ; WX 333 ; N parenleft ; B 48 -177 304 676 ;\nC 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ;\nC 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ;\nC 43 ; WX 564 ; N plus ; B 30 0 534 506 ;\nC 44 ; WX 250 ; N comma ; B 56 -141 195 102 ;\nC 45 ; WX 333 ; N hyphen ; B 39 194 285 257 ;\nC 46 ; WX 250 ; N period ; B 70 -11 181 100 ;\nC 47 ; WX 278 ; N slash ; B -9 -14 287 676 ;\nC 48 ; WX 500 ; N zero ; B 24 -14 476 676 ;\nC 49 ; WX 500 ; N one ; B 111 0 394 676 ;\nC 50 ; WX 500 ; N two ; B 30 0 475 676 ;\nC 51 ; WX 500 ; N three ; B 43 -14 431 676 ;\nC 52 ; WX 500 ; N four ; B 12 0 472 676 ;\nC 53 ; WX 500 ; N five ; B 32 -14 438 688 ;\nC 54 ; WX 500 ; N six ; B 34 -14 468 684 ;\nC 55 ; WX 500 ; N seven ; B 20 -8 449 662 ;\nC 56 ; WX 500 ; N eight ; B 56 -14 445 676 ;\nC 57 ; WX 500 ; N nine ; B 30 -22 459 676 ;\nC 58 ; WX 278 ; N colon ; B 81 -11 192 459 ;\nC 59 ; WX 278 ; N semicolon ; B 80 -141 219 459 ;\nC 60 ; WX 564 ; N less ; B 28 -8 536 514 ;\nC 61 ; WX 564 ; N equal ; B 30 120 534 386 ;\nC 62 ; WX 564 ; N greater ; B 28 -8 536 514 ;\nC 63 ; WX 444 ; N question ; B 68 -8 414 676 ;\nC 64 ; WX 921 ; N at ; B 116 -14 809 676 ;\nC 65 ; WX 722 ; N A ; B 15 0 706 674 ;\nC 66 ; WX 667 ; N B ; B 17 0 593 662 ;\nC 67 ; WX 667 ; N C ; B 28 -14 633 676 ;\nC 68 ; WX 722 ; N D ; B 16 0 685 662 ;\nC 69 ; WX 611 ; N E ; B 12 0 597 662 ;\nC 70 ; WX 556 ; N F ; B 12 0 546 662 ;\nC 71 ; WX 722 ; N G ; B 32 -14 709 676 ;\nC 72 ; WX 722 ; N H ; B 19 0 702 662 ;\nC 73 ; WX 333 ; N I ; B 18 0 315 662 ;\nC 74 ; WX 389 ; N J ; B 10 -14 370 662 ;\nC 75 ; WX 722 ; N K ; B 34 0 723 662 ;\nC 76 ; WX 611 ; N L ; B 12 0 598 662 ;\nC 77 ; WX 889 ; N M ; B 12 0 863 662 ;\nC 78 ; WX 722 ; N N ; B 12 -11 707 662 ;\nC 79 ; WX 722 ; N O ; B 34 -14 688 676 ;\nC 80 ; WX 556 ; N P ; B 16 0 542 662 ;\nC 81 ; WX 722 ; N Q ; B 34 -178 701 676 ;\nC 82 ; WX 667 ; N R ; B 17 0 659 662 ;\nC 83 ; WX 556 ; N S ; B 42 -14 491 676 ;\nC 84 ; WX 611 ; N T ; B 17 0 593 662 ;\nC 85 ; WX 722 ; N U ; B 14 -14 705 662 ;\nC 86 ; WX 722 ; N V ; B 16 -11 697 662 ;\nC 87 ; WX 944 ; N W ; B 5 -11 932 662 ;\nC 88 ; WX 722 ; N X ; B 10 0 704 662 ;\nC 89 ; WX 722 ; N Y ; B 22 0 703 662 ;\nC 90 ; WX 611 ; N Z ; B 9 0 597 662 ;\nC 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 ;\nC 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ;\nC 93 ; WX 333 ; N bracketright ; B 34 -156 245 662 ;\nC 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333 ; N quoteleft ; B 115 433 254 676 ;\nC 97 ; WX 444 ; N a ; B 37 -10 442 460 ;\nC 98 ; WX 500 ; N b ; B 3 -10 468 683 ;\nC 99 ; WX 444 ; N c ; B 25 -10 412 460 ;\nC 100 ; WX 500 ; N d ; B 27 -10 491 683 ;\nC 101 ; WX 444 ; N e ; B 25 -10 424 460 ;\nC 102 ; WX 333 ; N f ; B 20 0 383 683 ; L i fi ; L l fl ;\nC 103 ; WX 500 ; N g ; B 28 -218 470 460 ;\nC 104 ; WX 500 ; N h ; B 9 0 487 683 ;\nC 105 ; WX 278 ; N i ; B 16 0 253 683 ;\nC 106 ; WX 278 ; N j ; B -70 -218 194 683 ;\nC 107 ; WX 500 ; N k ; B 7 0 505 683 ;\nC 108 ; WX 278 ; N l ; B 19 0 257 683 ;\nC 109 ; WX 778 ; N m ; B 16 0 775 460 ;\nC 110 ; WX 500 ; N n ; B 16 0 485 460 ;\nC 111 ; WX 500 ; N o ; B 29 -10 470 460 ;\nC 112 ; WX 500 ; N p ; B 5 -217 470 460 ;\nC 113 ; WX 500 ; N q ; B 24 -217 488 460 ;\nC 114 ; WX 333 ; N r ; B 5 0 335 460 ;\nC 115 ; WX 389 ; N s ; B 51 -10 348 460 ;\nC 116 ; WX 278 ; N t ; B 13 -10 279 579 ;\nC 117 ; WX 500 ; N u ; B 9 -10 479 450 ;\nC 118 ; WX 500 ; N v ; B 19 -14 477 450 ;\nC 119 ; WX 722 ; N w ; B 21 -14 694 450 ;\nC 120 ; WX 500 ; N x ; B 17 0 479 450 ;\nC 121 ; WX 500 ; N y ; B 14 -218 475 450 ;\nC 122 ; WX 444 ; N z ; B 27 0 418 450 ;\nC 123 ; WX 480 ; N braceleft ; B 100 -181 350 680 ;\nC 124 ; WX 200 ; N bar ; B 67 -218 133 782 ;\nC 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ;\nC 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ;\nC 161 ; WX 333 ; N exclamdown ; B 97 -218 205 467 ;\nC 162 ; WX 500 ; N cent ; B 53 -138 448 579 ;\nC 163 ; WX 500 ; N sterling ; B 12 -8 490 676 ;\nC 164 ; WX 167 ; N fraction ; B -168 -14 331 676 ;\nC 165 ; WX 500 ; N yen ; B -53 0 512 662 ;\nC 166 ; WX 500 ; N florin ; B 7 -189 490 676 ;\nC 167 ; WX 500 ; N section ; B 70 -148 426 676 ;\nC 168 ; WX 500 ; N currency ; B -22 58 522 602 ;\nC 169 ; WX 180 ; N quotesingle ; B 48 431 133 676 ;\nC 170 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ;\nC 171 ; WX 500 ; N guillemotleft ; B 42 33 456 416 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 63 33 285 416 ;\nC 173 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ;\nC 174 ; WX 556 ; N fi ; B 31 0 521 683 ;\nC 175 ; WX 556 ; N fl ; B 32 0 521 683 ;\nC 177 ; WX 500 ; N endash ; B 0 201 500 250 ;\nC 178 ; WX 500 ; N dagger ; B 59 -149 442 676 ;\nC 179 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ;\nC 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ;\nC 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 ;\nC 183 ; WX 350 ; N bullet ; B 40 196 310 466 ;\nC 184 ; WX 333 ; N quotesinglbase ; B 79 -141 218 102 ;\nC 185 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 ;\nC 186 ; WX 444 ; N quotedblright ; B 30 433 401 676 ;\nC 187 ; WX 500 ; N guillemotright ; B 44 33 458 416 ;\nC 188 ; WX 1000 ; N ellipsis ; B 111 -11 888 100 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ;\nC 191 ; WX 444 ; N questiondown ; B 30 -218 376 466 ;\nC 193 ; WX 333 ; N grave ; B 19 507 242 678 ;\nC 194 ; WX 333 ; N acute ; B 93 507 317 678 ;\nC 195 ; WX 333 ; N circumflex ; B 11 507 322 674 ;\nC 196 ; WX 333 ; N tilde ; B 1 532 331 638 ;\nC 197 ; WX 333 ; N macron ; B 11 547 322 601 ;\nC 198 ; WX 333 ; N breve ; B 26 507 307 664 ;\nC 199 ; WX 333 ; N dotaccent ; B 118 581 216 681 ;\nC 200 ; WX 333 ; N dieresis ; B 18 581 315 681 ;\nC 202 ; WX 333 ; N ring ; B 67 512 266 711 ;\nC 203 ; WX 333 ; N cedilla ; B 52 -215 261 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -3 507 377 678 ;\nC 206 ; WX 333 ; N ogonek ; B 62 -165 243 0 ;\nC 207 ; WX 333 ; N caron ; B 11 507 322 674 ;\nC 208 ; WX 1000 ; N emdash ; B 0 201 1000 250 ;\nC 225 ; WX 889 ; N AE ; B 0 0 863 662 ;\nC 227 ; WX 276 ; N ordfeminine ; B 4 394 270 676 ;\nC 232 ; WX 611 ; N Lslash ; B 12 0 598 662 ;\nC 233 ; WX 722 ; N Oslash ; B 34 -80 688 734 ;\nC 234 ; WX 889 ; N OE ; B 30 -6 885 668 ;\nC 235 ; WX 310 ; N ordmasculine ; B 6 394 304 676 ;\nC 241 ; WX 667 ; N ae ; B 38 -10 632 460 ;\nC 245 ; WX 278 ; N dotlessi ; B 16 0 253 460 ;\nC 248 ; WX 278 ; N lslash ; B 19 0 259 683 ;\nC 249 ; WX 500 ; N oslash ; B 29 -112 470 551 ;\nC 250 ; WX 722 ; N oe ; B 30 -10 690 460 ;\nC 251 ; WX 500 ; N germandbls ; B 12 -9 468 683 ;\nC -1 ; WX 333 ; N Idieresis ; B 18 0 315 835 ;\nC -1 ; WX 444 ; N eacute ; B 25 -10 424 678 ;\nC -1 ; WX 444 ; N abreve ; B 37 -10 442 664 ;\nC -1 ; WX 500 ; N uhungarumlaut ; B 9 -10 501 678 ;\nC -1 ; WX 444 ; N ecaron ; B 25 -10 424 674 ;\nC -1 ; WX 722 ; N Ydieresis ; B 22 0 703 835 ;\nC -1 ; WX 564 ; N divide ; B 30 -10 534 516 ;\nC -1 ; WX 722 ; N Yacute ; B 22 0 703 890 ;\nC -1 ; WX 722 ; N Acircumflex ; B 15 0 706 886 ;\nC -1 ; WX 444 ; N aacute ; B 37 -10 442 678 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 14 -14 705 886 ;\nC -1 ; WX 500 ; N yacute ; B 14 -218 475 678 ;\nC -1 ; WX 389 ; N scommaaccent ; B 51 -218 348 460 ;\nC -1 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ;\nC -1 ; WX 722 ; N Uring ; B 14 -14 705 898 ;\nC -1 ; WX 722 ; N Udieresis ; B 14 -14 705 835 ;\nC -1 ; WX 444 ; N aogonek ; B 37 -165 469 460 ;\nC -1 ; WX 722 ; N Uacute ; B 14 -14 705 890 ;\nC -1 ; WX 500 ; N uogonek ; B 9 -155 487 450 ;\nC -1 ; WX 611 ; N Edieresis ; B 12 0 597 835 ;\nC -1 ; WX 722 ; N Dcroat ; B 16 0 685 662 ;\nC -1 ; WX 250 ; N commaaccent ; B 59 -218 184 -50 ;\nC -1 ; WX 760 ; N copyright ; B 38 -14 722 676 ;\nC -1 ; WX 611 ; N Emacron ; B 12 0 597 813 ;\nC -1 ; WX 444 ; N ccaron ; B 25 -10 412 674 ;\nC -1 ; WX 444 ; N aring ; B 37 -10 442 711 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 12 -198 707 662 ;\nC -1 ; WX 278 ; N lacute ; B 19 0 290 890 ;\nC -1 ; WX 444 ; N agrave ; B 37 -10 442 678 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 17 -218 593 662 ;\nC -1 ; WX 667 ; N Cacute ; B 28 -14 633 890 ;\nC -1 ; WX 444 ; N atilde ; B 37 -10 442 638 ;\nC -1 ; WX 611 ; N Edotaccent ; B 12 0 597 835 ;\nC -1 ; WX 389 ; N scaron ; B 39 -10 350 674 ;\nC -1 ; WX 389 ; N scedilla ; B 51 -215 348 460 ;\nC -1 ; WX 278 ; N iacute ; B 16 0 290 678 ;\nC -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ;\nC -1 ; WX 667 ; N Rcaron ; B 17 0 659 886 ;\nC -1 ; WX 722 ; N Gcommaaccent ; B 32 -218 709 676 ;\nC -1 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ;\nC -1 ; WX 444 ; N acircumflex ; B 37 -10 442 674 ;\nC -1 ; WX 722 ; N Amacron ; B 15 0 706 813 ;\nC -1 ; WX 333 ; N rcaron ; B 5 0 335 674 ;\nC -1 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ;\nC -1 ; WX 611 ; N Zdotaccent ; B 9 0 597 835 ;\nC -1 ; WX 556 ; N Thorn ; B 16 0 542 662 ;\nC -1 ; WX 722 ; N Omacron ; B 34 -14 688 813 ;\nC -1 ; WX 667 ; N Racute ; B 17 0 659 890 ;\nC -1 ; WX 556 ; N Sacute ; B 42 -14 491 890 ;\nC -1 ; WX 588 ; N dcaron ; B 27 -10 589 695 ;\nC -1 ; WX 722 ; N Umacron ; B 14 -14 705 813 ;\nC -1 ; WX 500 ; N uring ; B 9 -10 479 711 ;\nC -1 ; WX 300 ; N threesuperior ; B 15 262 291 676 ;\nC -1 ; WX 722 ; N Ograve ; B 34 -14 688 890 ;\nC -1 ; WX 722 ; N Agrave ; B 15 0 706 890 ;\nC -1 ; WX 722 ; N Abreve ; B 15 0 706 876 ;\nC -1 ; WX 564 ; N multiply ; B 38 8 527 497 ;\nC -1 ; WX 500 ; N uacute ; B 9 -10 479 678 ;\nC -1 ; WX 611 ; N Tcaron ; B 17 0 593 886 ;\nC -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ;\nC -1 ; WX 500 ; N ydieresis ; B 14 -218 475 623 ;\nC -1 ; WX 722 ; N Nacute ; B 12 -11 707 890 ;\nC -1 ; WX 278 ; N icircumflex ; B -16 0 295 674 ;\nC -1 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ;\nC -1 ; WX 444 ; N adieresis ; B 37 -10 442 623 ;\nC -1 ; WX 444 ; N edieresis ; B 25 -10 424 623 ;\nC -1 ; WX 444 ; N cacute ; B 25 -10 413 678 ;\nC -1 ; WX 500 ; N nacute ; B 16 0 485 678 ;\nC -1 ; WX 500 ; N umacron ; B 9 -10 479 601 ;\nC -1 ; WX 722 ; N Ncaron ; B 12 -11 707 886 ;\nC -1 ; WX 333 ; N Iacute ; B 18 0 317 890 ;\nC -1 ; WX 564 ; N plusminus ; B 30 0 534 506 ;\nC -1 ; WX 200 ; N brokenbar ; B 67 -143 133 707 ;\nC -1 ; WX 760 ; N registered ; B 38 -14 722 676 ;\nC -1 ; WX 722 ; N Gbreve ; B 32 -14 709 876 ;\nC -1 ; WX 333 ; N Idotaccent ; B 18 0 315 835 ;\nC -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;\nC -1 ; WX 611 ; N Egrave ; B 12 0 597 890 ;\nC -1 ; WX 333 ; N racute ; B 5 0 335 678 ;\nC -1 ; WX 500 ; N omacron ; B 29 -10 470 601 ;\nC -1 ; WX 611 ; N Zacute ; B 9 0 597 890 ;\nC -1 ; WX 611 ; N Zcaron ; B 9 0 597 886 ;\nC -1 ; WX 549 ; N greaterequal ; B 26 0 523 666 ;\nC -1 ; WX 722 ; N Eth ; B 16 0 685 662 ;\nC -1 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ;\nC -1 ; WX 278 ; N lcommaaccent ; B 19 -218 257 683 ;\nC -1 ; WX 326 ; N tcaron ; B 13 -10 318 722 ;\nC -1 ; WX 444 ; N eogonek ; B 25 -165 424 460 ;\nC -1 ; WX 722 ; N Uogonek ; B 14 -165 705 662 ;\nC -1 ; WX 722 ; N Aacute ; B 15 0 706 890 ;\nC -1 ; WX 722 ; N Adieresis ; B 15 0 706 835 ;\nC -1 ; WX 444 ; N egrave ; B 25 -10 424 678 ;\nC -1 ; WX 444 ; N zacute ; B 27 0 418 678 ;\nC -1 ; WX 278 ; N iogonek ; B 16 -165 265 683 ;\nC -1 ; WX 722 ; N Oacute ; B 34 -14 688 890 ;\nC -1 ; WX 500 ; N oacute ; B 29 -10 470 678 ;\nC -1 ; WX 444 ; N amacron ; B 37 -10 442 601 ;\nC -1 ; WX 389 ; N sacute ; B 51 -10 348 678 ;\nC -1 ; WX 278 ; N idieresis ; B -9 0 288 623 ;\nC -1 ; WX 722 ; N Ocircumflex ; B 34 -14 688 886 ;\nC -1 ; WX 722 ; N Ugrave ; B 14 -14 705 890 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 500 ; N thorn ; B 5 -217 470 683 ;\nC -1 ; WX 300 ; N twosuperior ; B 1 270 296 676 ;\nC -1 ; WX 722 ; N Odieresis ; B 34 -14 688 835 ;\nC -1 ; WX 500 ; N mu ; B 36 -218 512 450 ;\nC -1 ; WX 278 ; N igrave ; B -8 0 253 678 ;\nC -1 ; WX 500 ; N ohungarumlaut ; B 29 -10 491 678 ;\nC -1 ; WX 611 ; N Eogonek ; B 12 -165 597 662 ;\nC -1 ; WX 500 ; N dcroat ; B 27 -10 500 683 ;\nC -1 ; WX 750 ; N threequarters ; B 15 -14 718 676 ;\nC -1 ; WX 556 ; N Scedilla ; B 42 -215 491 676 ;\nC -1 ; WX 344 ; N lcaron ; B 19 0 347 695 ;\nC -1 ; WX 722 ; N Kcommaaccent ; B 34 -198 723 662 ;\nC -1 ; WX 611 ; N Lacute ; B 12 0 598 890 ;\nC -1 ; WX 980 ; N trademark ; B 30 256 957 662 ;\nC -1 ; WX 444 ; N edotaccent ; B 25 -10 424 623 ;\nC -1 ; WX 333 ; N Igrave ; B 18 0 315 890 ;\nC -1 ; WX 333 ; N Imacron ; B 11 0 322 813 ;\nC -1 ; WX 611 ; N Lcaron ; B 12 0 598 676 ;\nC -1 ; WX 750 ; N onehalf ; B 31 -14 746 676 ;\nC -1 ; WX 549 ; N lessequal ; B 26 0 523 666 ;\nC -1 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ;\nC -1 ; WX 500 ; N ntilde ; B 16 0 485 638 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 14 -14 705 890 ;\nC -1 ; WX 611 ; N Eacute ; B 12 0 597 890 ;\nC -1 ; WX 444 ; N emacron ; B 25 -10 424 601 ;\nC -1 ; WX 500 ; N gbreve ; B 28 -218 470 664 ;\nC -1 ; WX 750 ; N onequarter ; B 37 -14 718 676 ;\nC -1 ; WX 556 ; N Scaron ; B 42 -14 491 886 ;\nC -1 ; WX 556 ; N Scommaaccent ; B 42 -218 491 676 ;\nC -1 ; WX 722 ; N Ohungarumlaut ; B 34 -14 688 890 ;\nC -1 ; WX 400 ; N degree ; B 57 390 343 676 ;\nC -1 ; WX 500 ; N ograve ; B 29 -10 470 678 ;\nC -1 ; WX 667 ; N Ccaron ; B 28 -14 633 886 ;\nC -1 ; WX 500 ; N ugrave ; B 9 -10 479 678 ;\nC -1 ; WX 453 ; N radical ; B 2 -60 452 768 ;\nC -1 ; WX 722 ; N Dcaron ; B 16 0 685 886 ;\nC -1 ; WX 333 ; N rcommaaccent ; B 5 -218 335 460 ;\nC -1 ; WX 722 ; N Ntilde ; B 12 -11 707 850 ;\nC -1 ; WX 500 ; N otilde ; B 29 -10 470 638 ;\nC -1 ; WX 667 ; N Rcommaaccent ; B 17 -198 659 662 ;\nC -1 ; WX 611 ; N Lcommaaccent ; B 12 -218 598 662 ;\nC -1 ; WX 722 ; N Atilde ; B 15 0 706 850 ;\nC -1 ; WX 722 ; N Aogonek ; B 15 -165 738 674 ;\nC -1 ; WX 722 ; N Aring ; B 15 0 706 898 ;\nC -1 ; WX 722 ; N Otilde ; B 34 -14 688 850 ;\nC -1 ; WX 444 ; N zdotaccent ; B 27 0 418 623 ;\nC -1 ; WX 611 ; N Ecaron ; B 12 0 597 886 ;\nC -1 ; WX 333 ; N Iogonek ; B 18 -165 315 662 ;\nC -1 ; WX 500 ; N kcommaaccent ; B 7 -218 505 683 ;\nC -1 ; WX 564 ; N minus ; B 30 220 534 286 ;\nC -1 ; WX 333 ; N Icircumflex ; B 11 0 322 886 ;\nC -1 ; WX 500 ; N ncaron ; B 16 0 485 674 ;\nC -1 ; WX 278 ; N tcommaaccent ; B 13 -218 279 579 ;\nC -1 ; WX 564 ; N logicalnot ; B 30 108 534 386 ;\nC -1 ; WX 500 ; N odieresis ; B 29 -10 470 623 ;\nC -1 ; WX 500 ; N udieresis ; B 9 -10 479 623 ;\nC -1 ; WX 549 ; N notequal ; B 12 -31 537 547 ;\nC -1 ; WX 500 ; N gcommaaccent ; B 28 -218 470 749 ;\nC -1 ; WX 500 ; N eth ; B 29 -10 471 686 ;\nC -1 ; WX 444 ; N zcaron ; B 27 0 418 674 ;\nC -1 ; WX 500 ; N ncommaaccent ; B 16 -218 485 460 ;\nC -1 ; WX 300 ; N onesuperior ; B 57 270 248 676 ;\nC -1 ; WX 278 ; N imacron ; B 6 0 271 601 ;\nC -1 ; WX 500 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 2073\nKPX A C -40\nKPX A Cacute -40\nKPX A Ccaron -40\nKPX A Ccedilla -40\nKPX A G -40\nKPX A Gbreve -40\nKPX A Gcommaaccent -40\nKPX A O -55\nKPX A Oacute -55\nKPX A Ocircumflex -55\nKPX A Odieresis -55\nKPX A Ograve -55\nKPX A Ohungarumlaut -55\nKPX A Omacron -55\nKPX A Oslash -55\nKPX A Otilde -55\nKPX A Q -55\nKPX A T -111\nKPX A Tcaron -111\nKPX A Tcommaaccent -111\nKPX A U -55\nKPX A Uacute -55\nKPX A Ucircumflex -55\nKPX A Udieresis -55\nKPX A Ugrave -55\nKPX A Uhungarumlaut -55\nKPX A Umacron -55\nKPX A Uogonek -55\nKPX A Uring -55\nKPX A V -135\nKPX A W -90\nKPX A Y -105\nKPX A Yacute -105\nKPX A Ydieresis -105\nKPX A quoteright -111\nKPX A v -74\nKPX A w -92\nKPX A y -92\nKPX A yacute -92\nKPX A ydieresis -92\nKPX Aacute C -40\nKPX Aacute Cacute -40\nKPX Aacute Ccaron -40\nKPX Aacute Ccedilla -40\nKPX Aacute G -40\nKPX Aacute Gbreve -40\nKPX Aacute Gcommaaccent -40\nKPX Aacute O -55\nKPX Aacute Oacute -55\nKPX Aacute Ocircumflex -55\nKPX Aacute Odieresis -55\nKPX Aacute Ograve -55\nKPX Aacute Ohungarumlaut -55\nKPX Aacute Omacron -55\nKPX Aacute Oslash -55\nKPX Aacute Otilde -55\nKPX Aacute Q -55\nKPX Aacute T -111\nKPX Aacute Tcaron -111\nKPX Aacute Tcommaaccent -111\nKPX Aacute U -55\nKPX Aacute Uacute -55\nKPX Aacute Ucircumflex -55\nKPX Aacute Udieresis -55\nKPX Aacute Ugrave -55\nKPX Aacute Uhungarumlaut -55\nKPX Aacute Umacron -55\nKPX Aacute Uogonek -55\nKPX Aacute Uring -55\nKPX Aacute V -135\nKPX Aacute W -90\nKPX Aacute Y -105\nKPX Aacute Yacute -105\nKPX Aacute Ydieresis -105\nKPX Aacute quoteright -111\nKPX Aacute v -74\nKPX Aacute w -92\nKPX Aacute y -92\nKPX Aacute yacute -92\nKPX Aacute ydieresis -92\nKPX Abreve C -40\nKPX Abreve Cacute -40\nKPX Abreve Ccaron -40\nKPX Abreve Ccedilla -40\nKPX Abreve G -40\nKPX Abreve Gbreve -40\nKPX Abreve Gcommaaccent -40\nKPX Abreve O -55\nKPX Abreve Oacute -55\nKPX Abreve Ocircumflex -55\nKPX Abreve Odieresis -55\nKPX Abreve Ograve -55\nKPX Abreve Ohungarumlaut -55\nKPX Abreve Omacron -55\nKPX Abreve Oslash -55\nKPX Abreve Otilde -55\nKPX Abreve Q -55\nKPX Abreve T -111\nKPX Abreve Tcaron -111\nKPX Abreve Tcommaaccent -111\nKPX Abreve U -55\nKPX Abreve Uacute -55\nKPX Abreve Ucircumflex -55\nKPX Abreve Udieresis -55\nKPX Abreve Ugrave -55\nKPX Abreve Uhungarumlaut -55\nKPX Abreve Umacron -55\nKPX Abreve Uogonek -55\nKPX Abreve Uring -55\nKPX Abreve V -135\nKPX Abreve W -90\nKPX Abreve Y -105\nKPX Abreve Yacute -105\nKPX Abreve Ydieresis -105\nKPX Abreve quoteright -111\nKPX Abreve v -74\nKPX Abreve w -92\nKPX Abreve y -92\nKPX Abreve yacute -92\nKPX Abreve ydieresis -92\nKPX Acircumflex C -40\nKPX Acircumflex Cacute -40\nKPX Acircumflex Ccaron -40\nKPX Acircumflex Ccedilla -40\nKPX Acircumflex G -40\nKPX Acircumflex Gbreve -40\nKPX Acircumflex Gcommaaccent -40\nKPX Acircumflex O -55\nKPX Acircumflex Oacute -55\nKPX Acircumflex Ocircumflex -55\nKPX Acircumflex Odieresis -55\nKPX Acircumflex Ograve -55\nKPX Acircumflex Ohungarumlaut -55\nKPX Acircumflex Omacron -55\nKPX Acircumflex Oslash -55\nKPX Acircumflex Otilde -55\nKPX Acircumflex Q -55\nKPX Acircumflex T -111\nKPX Acircumflex Tcaron -111\nKPX Acircumflex Tcommaaccent -111\nKPX Acircumflex U -55\nKPX Acircumflex Uacute -55\nKPX Acircumflex Ucircumflex -55\nKPX Acircumflex Udieresis -55\nKPX Acircumflex Ugrave -55\nKPX Acircumflex Uhungarumlaut -55\nKPX Acircumflex Umacron -55\nKPX Acircumflex Uogonek -55\nKPX Acircumflex Uring -55\nKPX Acircumflex V -135\nKPX Acircumflex W -90\nKPX Acircumflex Y -105\nKPX Acircumflex Yacute -105\nKPX Acircumflex Ydieresis -105\nKPX Acircumflex quoteright -111\nKPX Acircumflex v -74\nKPX Acircumflex w -92\nKPX Acircumflex y -92\nKPX Acircumflex yacute -92\nKPX Acircumflex ydieresis -92\nKPX Adieresis C -40\nKPX Adieresis Cacute -40\nKPX Adieresis Ccaron -40\nKPX Adieresis Ccedilla -40\nKPX Adieresis G -40\nKPX Adieresis Gbreve -40\nKPX Adieresis Gcommaaccent -40\nKPX Adieresis O -55\nKPX Adieresis Oacute -55\nKPX Adieresis Ocircumflex -55\nKPX Adieresis Odieresis -55\nKPX Adieresis Ograve -55\nKPX Adieresis Ohungarumlaut -55\nKPX Adieresis Omacron -55\nKPX Adieresis Oslash -55\nKPX Adieresis Otilde -55\nKPX Adieresis Q -55\nKPX Adieresis T -111\nKPX Adieresis Tcaron -111\nKPX Adieresis Tcommaaccent -111\nKPX Adieresis U -55\nKPX Adieresis Uacute -55\nKPX Adieresis Ucircumflex -55\nKPX Adieresis Udieresis -55\nKPX Adieresis Ugrave -55\nKPX Adieresis Uhungarumlaut -55\nKPX Adieresis Umacron -55\nKPX Adieresis Uogonek -55\nKPX Adieresis Uring -55\nKPX Adieresis V -135\nKPX Adieresis W -90\nKPX Adieresis Y -105\nKPX Adieresis Yacute -105\nKPX Adieresis Ydieresis -105\nKPX Adieresis quoteright -111\nKPX Adieresis v -74\nKPX Adieresis w -92\nKPX Adieresis y -92\nKPX Adieresis yacute -92\nKPX Adieresis ydieresis -92\nKPX Agrave C -40\nKPX Agrave Cacute -40\nKPX Agrave Ccaron -40\nKPX Agrave Ccedilla -40\nKPX Agrave G -40\nKPX Agrave Gbreve -40\nKPX Agrave Gcommaaccent -40\nKPX Agrave O -55\nKPX Agrave Oacute -55\nKPX Agrave Ocircumflex -55\nKPX Agrave Odieresis -55\nKPX Agrave Ograve -55\nKPX Agrave Ohungarumlaut -55\nKPX Agrave Omacron -55\nKPX Agrave Oslash -55\nKPX Agrave Otilde -55\nKPX Agrave Q -55\nKPX Agrave T -111\nKPX Agrave Tcaron -111\nKPX Agrave Tcommaaccent -111\nKPX Agrave U -55\nKPX Agrave Uacute -55\nKPX Agrave Ucircumflex -55\nKPX Agrave Udieresis -55\nKPX Agrave Ugrave -55\nKPX Agrave Uhungarumlaut -55\nKPX Agrave Umacron -55\nKPX Agrave Uogonek -55\nKPX Agrave Uring -55\nKPX Agrave V -135\nKPX Agrave W -90\nKPX Agrave Y -105\nKPX Agrave Yacute -105\nKPX Agrave Ydieresis -105\nKPX Agrave quoteright -111\nKPX Agrave v -74\nKPX Agrave w -92\nKPX Agrave y -92\nKPX Agrave yacute -92\nKPX Agrave ydieresis -92\nKPX Amacron C -40\nKPX Amacron Cacute -40\nKPX Amacron Ccaron -40\nKPX Amacron Ccedilla -40\nKPX Amacron G -40\nKPX Amacron Gbreve -40\nKPX Amacron Gcommaaccent -40\nKPX Amacron O -55\nKPX Amacron Oacute -55\nKPX Amacron Ocircumflex -55\nKPX Amacron Odieresis -55\nKPX Amacron Ograve -55\nKPX Amacron Ohungarumlaut -55\nKPX Amacron Omacron -55\nKPX Amacron Oslash -55\nKPX Amacron Otilde -55\nKPX Amacron Q -55\nKPX Amacron T -111\nKPX Amacron Tcaron -111\nKPX Amacron Tcommaaccent -111\nKPX Amacron U -55\nKPX Amacron Uacute -55\nKPX Amacron Ucircumflex -55\nKPX Amacron Udieresis -55\nKPX Amacron Ugrave -55\nKPX Amacron Uhungarumlaut -55\nKPX Amacron Umacron -55\nKPX Amacron Uogonek -55\nKPX Amacron Uring -55\nKPX Amacron V -135\nKPX Amacron W -90\nKPX Amacron Y -105\nKPX Amacron Yacute -105\nKPX Amacron Ydieresis -105\nKPX Amacron quoteright -111\nKPX Amacron v -74\nKPX Amacron w -92\nKPX Amacron y -92\nKPX Amacron yacute -92\nKPX Amacron ydieresis -92\nKPX Aogonek C -40\nKPX Aogonek Cacute -40\nKPX Aogonek Ccaron -40\nKPX Aogonek Ccedilla -40\nKPX Aogonek G -40\nKPX Aogonek Gbreve -40\nKPX Aogonek Gcommaaccent -40\nKPX Aogonek O -55\nKPX Aogonek Oacute -55\nKPX Aogonek Ocircumflex -55\nKPX Aogonek Odieresis -55\nKPX Aogonek Ograve -55\nKPX Aogonek Ohungarumlaut -55\nKPX Aogonek Omacron -55\nKPX Aogonek Oslash -55\nKPX Aogonek Otilde -55\nKPX Aogonek Q -55\nKPX Aogonek T -111\nKPX Aogonek Tcaron -111\nKPX Aogonek Tcommaaccent -111\nKPX Aogonek U -55\nKPX Aogonek Uacute -55\nKPX Aogonek Ucircumflex -55\nKPX Aogonek Udieresis -55\nKPX Aogonek Ugrave -55\nKPX Aogonek Uhungarumlaut -55\nKPX Aogonek Umacron -55\nKPX Aogonek Uogonek -55\nKPX Aogonek Uring -55\nKPX Aogonek V -135\nKPX Aogonek W -90\nKPX Aogonek Y -105\nKPX Aogonek Yacute -105\nKPX Aogonek Ydieresis -105\nKPX Aogonek quoteright -111\nKPX Aogonek v -74\nKPX Aogonek w -52\nKPX Aogonek y -52\nKPX Aogonek yacute -52\nKPX Aogonek ydieresis -52\nKPX Aring C -40\nKPX Aring Cacute -40\nKPX Aring Ccaron -40\nKPX Aring Ccedilla -40\nKPX Aring G -40\nKPX Aring Gbreve -40\nKPX Aring Gcommaaccent -40\nKPX Aring O -55\nKPX Aring Oacute -55\nKPX Aring Ocircumflex -55\nKPX Aring Odieresis -55\nKPX Aring Ograve -55\nKPX Aring Ohungarumlaut -55\nKPX Aring Omacron -55\nKPX Aring Oslash -55\nKPX Aring Otilde -55\nKPX Aring Q -55\nKPX Aring T -111\nKPX Aring Tcaron -111\nKPX Aring Tcommaaccent -111\nKPX Aring U -55\nKPX Aring Uacute -55\nKPX Aring Ucircumflex -55\nKPX Aring Udieresis -55\nKPX Aring Ugrave -55\nKPX Aring Uhungarumlaut -55\nKPX Aring Umacron -55\nKPX Aring Uogonek -55\nKPX Aring Uring -55\nKPX Aring V -135\nKPX Aring W -90\nKPX Aring Y -105\nKPX Aring Yacute -105\nKPX Aring Ydieresis -105\nKPX Aring quoteright -111\nKPX Aring v -74\nKPX Aring w -92\nKPX Aring y -92\nKPX Aring yacute -92\nKPX Aring ydieresis -92\nKPX Atilde C -40\nKPX Atilde Cacute -40\nKPX Atilde Ccaron -40\nKPX Atilde Ccedilla -40\nKPX Atilde G -40\nKPX Atilde Gbreve -40\nKPX Atilde Gcommaaccent -40\nKPX Atilde O -55\nKPX Atilde Oacute -55\nKPX Atilde Ocircumflex -55\nKPX Atilde Odieresis -55\nKPX Atilde Ograve -55\nKPX Atilde Ohungarumlaut -55\nKPX Atilde Omacron -55\nKPX Atilde Oslash -55\nKPX Atilde Otilde -55\nKPX Atilde Q -55\nKPX Atilde T -111\nKPX Atilde Tcaron -111\nKPX Atilde Tcommaaccent -111\nKPX Atilde U -55\nKPX Atilde Uacute -55\nKPX Atilde Ucircumflex -55\nKPX Atilde Udieresis -55\nKPX Atilde Ugrave -55\nKPX Atilde Uhungarumlaut -55\nKPX Atilde Umacron -55\nKPX Atilde Uogonek -55\nKPX Atilde Uring -55\nKPX Atilde V -135\nKPX Atilde W -90\nKPX Atilde Y -105\nKPX Atilde Yacute -105\nKPX Atilde Ydieresis -105\nKPX Atilde quoteright -111\nKPX Atilde v -74\nKPX Atilde w -92\nKPX Atilde y -92\nKPX Atilde yacute -92\nKPX Atilde ydieresis -92\nKPX B A -35\nKPX B Aacute -35\nKPX B Abreve -35\nKPX B Acircumflex -35\nKPX B Adieresis -35\nKPX B Agrave -35\nKPX B Amacron -35\nKPX B Aogonek -35\nKPX B Aring -35\nKPX B Atilde -35\nKPX B U -10\nKPX B Uacute -10\nKPX B Ucircumflex -10\nKPX B Udieresis -10\nKPX B Ugrave -10\nKPX B Uhungarumlaut -10\nKPX B Umacron -10\nKPX B Uogonek -10\nKPX B Uring -10\nKPX D A -40\nKPX D Aacute -40\nKPX D Abreve -40\nKPX D Acircumflex -40\nKPX D Adieresis -40\nKPX D Agrave -40\nKPX D Amacron -40\nKPX D Aogonek -40\nKPX D Aring -40\nKPX D Atilde -40\nKPX D V -40\nKPX D W -30\nKPX D Y -55\nKPX D Yacute -55\nKPX D Ydieresis -55\nKPX Dcaron A -40\nKPX Dcaron Aacute -40\nKPX Dcaron Abreve -40\nKPX Dcaron Acircumflex -40\nKPX Dcaron Adieresis -40\nKPX Dcaron Agrave -40\nKPX Dcaron Amacron -40\nKPX Dcaron Aogonek -40\nKPX Dcaron Aring -40\nKPX Dcaron Atilde -40\nKPX Dcaron V -40\nKPX Dcaron W -30\nKPX Dcaron Y -55\nKPX Dcaron Yacute -55\nKPX Dcaron Ydieresis -55\nKPX Dcroat A -40\nKPX Dcroat Aacute -40\nKPX Dcroat Abreve -40\nKPX Dcroat Acircumflex -40\nKPX Dcroat Adieresis -40\nKPX Dcroat Agrave -40\nKPX Dcroat Amacron -40\nKPX Dcroat Aogonek -40\nKPX Dcroat Aring -40\nKPX Dcroat Atilde -40\nKPX Dcroat V -40\nKPX Dcroat W -30\nKPX Dcroat Y -55\nKPX Dcroat Yacute -55\nKPX Dcroat Ydieresis -55\nKPX F A -74\nKPX F Aacute -74\nKPX F Abreve -74\nKPX F Acircumflex -74\nKPX F Adieresis -74\nKPX F Agrave -74\nKPX F Amacron -74\nKPX F Aogonek -74\nKPX F Aring -74\nKPX F Atilde -74\nKPX F a -15\nKPX F aacute -15\nKPX F abreve -15\nKPX F acircumflex -15\nKPX F adieresis -15\nKPX F agrave -15\nKPX F amacron -15\nKPX F aogonek -15\nKPX F aring -15\nKPX F atilde -15\nKPX F comma -80\nKPX F o -15\nKPX F oacute -15\nKPX F ocircumflex -15\nKPX F odieresis -15\nKPX F ograve -15\nKPX F ohungarumlaut -15\nKPX F omacron -15\nKPX F oslash -15\nKPX F otilde -15\nKPX F period -80\nKPX J A -60\nKPX J Aacute -60\nKPX J Abreve -60\nKPX J Acircumflex -60\nKPX J Adieresis -60\nKPX J Agrave -60\nKPX J Amacron -60\nKPX J Aogonek -60\nKPX J Aring -60\nKPX J Atilde -60\nKPX K O -30\nKPX K Oacute -30\nKPX K Ocircumflex -30\nKPX K Odieresis -30\nKPX K Ograve -30\nKPX K Ohungarumlaut -30\nKPX K Omacron -30\nKPX K Oslash -30\nKPX K Otilde -30\nKPX K e -25\nKPX K eacute -25\nKPX K ecaron -25\nKPX K ecircumflex -25\nKPX K edieresis -25\nKPX K edotaccent -25\nKPX K egrave -25\nKPX K emacron -25\nKPX K eogonek -25\nKPX K o -35\nKPX K oacute -35\nKPX K ocircumflex -35\nKPX K odieresis -35\nKPX K ograve -35\nKPX K ohungarumlaut -35\nKPX K omacron -35\nKPX K oslash -35\nKPX K otilde -35\nKPX K u -15\nKPX K uacute -15\nKPX K ucircumflex -15\nKPX K udieresis -15\nKPX K ugrave -15\nKPX K uhungarumlaut -15\nKPX K umacron -15\nKPX K uogonek -15\nKPX K uring -15\nKPX K y -25\nKPX K yacute -25\nKPX K ydieresis -25\nKPX Kcommaaccent O -30\nKPX Kcommaaccent Oacute -30\nKPX Kcommaaccent Ocircumflex -30\nKPX Kcommaaccent Odieresis -30\nKPX Kcommaaccent Ograve -30\nKPX Kcommaaccent Ohungarumlaut -30\nKPX Kcommaaccent Omacron -30\nKPX Kcommaaccent Oslash -30\nKPX Kcommaaccent Otilde -30\nKPX Kcommaaccent e -25\nKPX Kcommaaccent eacute -25\nKPX Kcommaaccent ecaron -25\nKPX Kcommaaccent ecircumflex -25\nKPX Kcommaaccent edieresis -25\nKPX Kcommaaccent edotaccent -25\nKPX Kcommaaccent egrave -25\nKPX Kcommaaccent emacron -25\nKPX Kcommaaccent eogonek -25\nKPX Kcommaaccent o -35\nKPX Kcommaaccent oacute -35\nKPX Kcommaaccent ocircumflex -35\nKPX Kcommaaccent odieresis -35\nKPX Kcommaaccent ograve -35\nKPX Kcommaaccent ohungarumlaut -35\nKPX Kcommaaccent omacron -35\nKPX Kcommaaccent oslash -35\nKPX Kcommaaccent otilde -35\nKPX Kcommaaccent u -15\nKPX Kcommaaccent uacute -15\nKPX Kcommaaccent ucircumflex -15\nKPX Kcommaaccent udieresis -15\nKPX Kcommaaccent ugrave -15\nKPX Kcommaaccent uhungarumlaut -15\nKPX Kcommaaccent umacron -15\nKPX Kcommaaccent uogonek -15\nKPX Kcommaaccent uring -15\nKPX Kcommaaccent y -25\nKPX Kcommaaccent yacute -25\nKPX Kcommaaccent ydieresis -25\nKPX L T -92\nKPX L Tcaron -92\nKPX L Tcommaaccent -92\nKPX L V -100\nKPX L W -74\nKPX L Y -100\nKPX L Yacute -100\nKPX L Ydieresis -100\nKPX L quoteright -92\nKPX L y -55\nKPX L yacute -55\nKPX L ydieresis -55\nKPX Lacute T -92\nKPX Lacute Tcaron -92\nKPX Lacute Tcommaaccent -92\nKPX Lacute V -100\nKPX Lacute W -74\nKPX Lacute Y -100\nKPX Lacute Yacute -100\nKPX Lacute Ydieresis -100\nKPX Lacute quoteright -92\nKPX Lacute y -55\nKPX Lacute yacute -55\nKPX Lacute ydieresis -55\nKPX Lcaron quoteright -92\nKPX Lcaron y -55\nKPX Lcaron yacute -55\nKPX Lcaron ydieresis -55\nKPX Lcommaaccent T -92\nKPX Lcommaaccent Tcaron -92\nKPX Lcommaaccent Tcommaaccent -92\nKPX Lcommaaccent V -100\nKPX Lcommaaccent W -74\nKPX Lcommaaccent Y -100\nKPX Lcommaaccent Yacute -100\nKPX Lcommaaccent Ydieresis -100\nKPX Lcommaaccent quoteright -92\nKPX Lcommaaccent y -55\nKPX Lcommaaccent yacute -55\nKPX Lcommaaccent ydieresis -55\nKPX Lslash T -92\nKPX Lslash Tcaron -92\nKPX Lslash Tcommaaccent -92\nKPX Lslash V -100\nKPX Lslash W -74\nKPX Lslash Y -100\nKPX Lslash Yacute -100\nKPX Lslash Ydieresis -100\nKPX Lslash quoteright -92\nKPX Lslash y -55\nKPX Lslash yacute -55\nKPX Lslash ydieresis -55\nKPX N A -35\nKPX N Aacute -35\nKPX N Abreve -35\nKPX N Acircumflex -35\nKPX N Adieresis -35\nKPX N Agrave -35\nKPX N Amacron -35\nKPX N Aogonek -35\nKPX N Aring -35\nKPX N Atilde -35\nKPX Nacute A -35\nKPX Nacute Aacute -35\nKPX Nacute Abreve -35\nKPX Nacute Acircumflex -35\nKPX Nacute Adieresis -35\nKPX Nacute Agrave -35\nKPX Nacute Amacron -35\nKPX Nacute Aogonek -35\nKPX Nacute Aring -35\nKPX Nacute Atilde -35\nKPX Ncaron A -35\nKPX Ncaron Aacute -35\nKPX Ncaron Abreve -35\nKPX Ncaron Acircumflex -35\nKPX Ncaron Adieresis -35\nKPX Ncaron Agrave -35\nKPX Ncaron Amacron -35\nKPX Ncaron Aogonek -35\nKPX Ncaron Aring -35\nKPX Ncaron Atilde -35\nKPX Ncommaaccent A -35\nKPX Ncommaaccent Aacute -35\nKPX Ncommaaccent Abreve -35\nKPX Ncommaaccent Acircumflex -35\nKPX Ncommaaccent Adieresis -35\nKPX Ncommaaccent Agrave -35\nKPX Ncommaaccent Amacron -35\nKPX Ncommaaccent Aogonek -35\nKPX Ncommaaccent Aring -35\nKPX Ncommaaccent Atilde -35\nKPX Ntilde A -35\nKPX Ntilde Aacute -35\nKPX Ntilde Abreve -35\nKPX Ntilde Acircumflex -35\nKPX Ntilde Adieresis -35\nKPX Ntilde Agrave -35\nKPX Ntilde Amacron -35\nKPX Ntilde Aogonek -35\nKPX Ntilde Aring -35\nKPX Ntilde Atilde -35\nKPX O A -35\nKPX O Aacute -35\nKPX O Abreve -35\nKPX O Acircumflex -35\nKPX O Adieresis -35\nKPX O Agrave -35\nKPX O Amacron -35\nKPX O Aogonek -35\nKPX O Aring -35\nKPX O Atilde -35\nKPX O T -40\nKPX O Tcaron -40\nKPX O Tcommaaccent -40\nKPX O V -50\nKPX O W -35\nKPX O X -40\nKPX O Y -50\nKPX O Yacute -50\nKPX O Ydieresis -50\nKPX Oacute A -35\nKPX Oacute Aacute -35\nKPX Oacute Abreve -35\nKPX Oacute Acircumflex -35\nKPX Oacute Adieresis -35\nKPX Oacute Agrave -35\nKPX Oacute Amacron -35\nKPX Oacute Aogonek -35\nKPX Oacute Aring -35\nKPX Oacute Atilde -35\nKPX Oacute T -40\nKPX Oacute Tcaron -40\nKPX Oacute Tcommaaccent -40\nKPX Oacute V -50\nKPX Oacute W -35\nKPX Oacute X -40\nKPX Oacute Y -50\nKPX Oacute Yacute -50\nKPX Oacute Ydieresis -50\nKPX Ocircumflex A -35\nKPX Ocircumflex Aacute -35\nKPX Ocircumflex Abreve -35\nKPX Ocircumflex Acircumflex -35\nKPX Ocircumflex Adieresis -35\nKPX Ocircumflex Agrave -35\nKPX Ocircumflex Amacron -35\nKPX Ocircumflex Aogonek -35\nKPX Ocircumflex Aring -35\nKPX Ocircumflex Atilde -35\nKPX Ocircumflex T -40\nKPX Ocircumflex Tcaron -40\nKPX Ocircumflex Tcommaaccent -40\nKPX Ocircumflex V -50\nKPX Ocircumflex W -35\nKPX Ocircumflex X -40\nKPX Ocircumflex Y -50\nKPX Ocircumflex Yacute -50\nKPX Ocircumflex Ydieresis -50\nKPX Odieresis A -35\nKPX Odieresis Aacute -35\nKPX Odieresis Abreve -35\nKPX Odieresis Acircumflex -35\nKPX Odieresis Adieresis -35\nKPX Odieresis Agrave -35\nKPX Odieresis Amacron -35\nKPX Odieresis Aogonek -35\nKPX Odieresis Aring -35\nKPX Odieresis Atilde -35\nKPX Odieresis T -40\nKPX Odieresis Tcaron -40\nKPX Odieresis Tcommaaccent -40\nKPX Odieresis V -50\nKPX Odieresis W -35\nKPX Odieresis X -40\nKPX Odieresis Y -50\nKPX Odieresis Yacute -50\nKPX Odieresis Ydieresis -50\nKPX Ograve A -35\nKPX Ograve Aacute -35\nKPX Ograve Abreve -35\nKPX Ograve Acircumflex -35\nKPX Ograve Adieresis -35\nKPX Ograve Agrave -35\nKPX Ograve Amacron -35\nKPX Ograve Aogonek -35\nKPX Ograve Aring -35\nKPX Ograve Atilde -35\nKPX Ograve T -40\nKPX Ograve Tcaron -40\nKPX Ograve Tcommaaccent -40\nKPX Ograve V -50\nKPX Ograve W -35\nKPX Ograve X -40\nKPX Ograve Y -50\nKPX Ograve Yacute -50\nKPX Ograve Ydieresis -50\nKPX Ohungarumlaut A -35\nKPX Ohungarumlaut Aacute -35\nKPX Ohungarumlaut Abreve -35\nKPX Ohungarumlaut Acircumflex -35\nKPX Ohungarumlaut Adieresis -35\nKPX Ohungarumlaut Agrave -35\nKPX Ohungarumlaut Amacron -35\nKPX Ohungarumlaut Aogonek -35\nKPX Ohungarumlaut Aring -35\nKPX Ohungarumlaut Atilde -35\nKPX Ohungarumlaut T -40\nKPX Ohungarumlaut Tcaron -40\nKPX Ohungarumlaut Tcommaaccent -40\nKPX Ohungarumlaut V -50\nKPX Ohungarumlaut W -35\nKPX Ohungarumlaut X -40\nKPX Ohungarumlaut Y -50\nKPX Ohungarumlaut Yacute -50\nKPX Ohungarumlaut Ydieresis -50\nKPX Omacron A -35\nKPX Omacron Aacute -35\nKPX Omacron Abreve -35\nKPX Omacron Acircumflex -35\nKPX Omacron Adieresis -35\nKPX Omacron Agrave -35\nKPX Omacron Amacron -35\nKPX Omacron Aogonek -35\nKPX Omacron Aring -35\nKPX Omacron Atilde -35\nKPX Omacron T -40\nKPX Omacron Tcaron -40\nKPX Omacron Tcommaaccent -40\nKPX Omacron V -50\nKPX Omacron W -35\nKPX Omacron X -40\nKPX Omacron Y -50\nKPX Omacron Yacute -50\nKPX Omacron Ydieresis -50\nKPX Oslash A -35\nKPX Oslash Aacute -35\nKPX Oslash Abreve -35\nKPX Oslash Acircumflex -35\nKPX Oslash Adieresis -35\nKPX Oslash Agrave -35\nKPX Oslash Amacron -35\nKPX Oslash Aogonek -35\nKPX Oslash Aring -35\nKPX Oslash Atilde -35\nKPX Oslash T -40\nKPX Oslash Tcaron -40\nKPX Oslash Tcommaaccent -40\nKPX Oslash V -50\nKPX Oslash W -35\nKPX Oslash X -40\nKPX Oslash Y -50\nKPX Oslash Yacute -50\nKPX Oslash Ydieresis -50\nKPX Otilde A -35\nKPX Otilde Aacute -35\nKPX Otilde Abreve -35\nKPX Otilde Acircumflex -35\nKPX Otilde Adieresis -35\nKPX Otilde Agrave -35\nKPX Otilde Amacron -35\nKPX Otilde Aogonek -35\nKPX Otilde Aring -35\nKPX Otilde Atilde -35\nKPX Otilde T -40\nKPX Otilde Tcaron -40\nKPX Otilde Tcommaaccent -40\nKPX Otilde V -50\nKPX Otilde W -35\nKPX Otilde X -40\nKPX Otilde Y -50\nKPX Otilde Yacute -50\nKPX Otilde Ydieresis -50\nKPX P A -92\nKPX P Aacute -92\nKPX P Abreve -92\nKPX P Acircumflex -92\nKPX P Adieresis -92\nKPX P Agrave -92\nKPX P Amacron -92\nKPX P Aogonek -92\nKPX P Aring -92\nKPX P Atilde -92\nKPX P a -15\nKPX P aacute -15\nKPX P abreve -15\nKPX P acircumflex -15\nKPX P adieresis -15\nKPX P agrave -15\nKPX P amacron -15\nKPX P aogonek -15\nKPX P aring -15\nKPX P atilde -15\nKPX P comma -111\nKPX P period -111\nKPX Q U -10\nKPX Q Uacute -10\nKPX Q Ucircumflex -10\nKPX Q Udieresis -10\nKPX Q Ugrave -10\nKPX Q Uhungarumlaut -10\nKPX Q Umacron -10\nKPX Q Uogonek -10\nKPX Q Uring -10\nKPX R O -40\nKPX R Oacute -40\nKPX R Ocircumflex -40\nKPX R Odieresis -40\nKPX R Ograve -40\nKPX R Ohungarumlaut -40\nKPX R Omacron -40\nKPX R Oslash -40\nKPX R Otilde -40\nKPX R T -60\nKPX R Tcaron -60\nKPX R Tcommaaccent -60\nKPX R U -40\nKPX R Uacute -40\nKPX R Ucircumflex -40\nKPX R Udieresis -40\nKPX R Ugrave -40\nKPX R Uhungarumlaut -40\nKPX R Umacron -40\nKPX R Uogonek -40\nKPX R Uring -40\nKPX R V -80\nKPX R W -55\nKPX R Y -65\nKPX R Yacute -65\nKPX R Ydieresis -65\nKPX Racute O -40\nKPX Racute Oacute -40\nKPX Racute Ocircumflex -40\nKPX Racute Odieresis -40\nKPX Racute Ograve -40\nKPX Racute Ohungarumlaut -40\nKPX Racute Omacron -40\nKPX Racute Oslash -40\nKPX Racute Otilde -40\nKPX Racute T -60\nKPX Racute Tcaron -60\nKPX Racute Tcommaaccent -60\nKPX Racute U -40\nKPX Racute Uacute -40\nKPX Racute Ucircumflex -40\nKPX Racute Udieresis -40\nKPX Racute Ugrave -40\nKPX Racute Uhungarumlaut -40\nKPX Racute Umacron -40\nKPX Racute Uogonek -40\nKPX Racute Uring -40\nKPX Racute V -80\nKPX Racute W -55\nKPX Racute Y -65\nKPX Racute Yacute -65\nKPX Racute Ydieresis -65\nKPX Rcaron O -40\nKPX Rcaron Oacute -40\nKPX Rcaron Ocircumflex -40\nKPX Rcaron Odieresis -40\nKPX Rcaron Ograve -40\nKPX Rcaron Ohungarumlaut -40\nKPX Rcaron Omacron -40\nKPX Rcaron Oslash -40\nKPX Rcaron Otilde -40\nKPX Rcaron T -60\nKPX Rcaron Tcaron -60\nKPX Rcaron Tcommaaccent -60\nKPX Rcaron U -40\nKPX Rcaron Uacute -40\nKPX Rcaron Ucircumflex -40\nKPX Rcaron Udieresis -40\nKPX Rcaron Ugrave -40\nKPX Rcaron Uhungarumlaut -40\nKPX Rcaron Umacron -40\nKPX Rcaron Uogonek -40\nKPX Rcaron Uring -40\nKPX Rcaron V -80\nKPX Rcaron W -55\nKPX Rcaron Y -65\nKPX Rcaron Yacute -65\nKPX Rcaron Ydieresis -65\nKPX Rcommaaccent O -40\nKPX Rcommaaccent Oacute -40\nKPX Rcommaaccent Ocircumflex -40\nKPX Rcommaaccent Odieresis -40\nKPX Rcommaaccent Ograve -40\nKPX Rcommaaccent Ohungarumlaut -40\nKPX Rcommaaccent Omacron -40\nKPX Rcommaaccent Oslash -40\nKPX Rcommaaccent Otilde -40\nKPX Rcommaaccent T -60\nKPX Rcommaaccent Tcaron -60\nKPX Rcommaaccent Tcommaaccent -60\nKPX Rcommaaccent U -40\nKPX Rcommaaccent Uacute -40\nKPX Rcommaaccent Ucircumflex -40\nKPX Rcommaaccent Udieresis -40\nKPX Rcommaaccent Ugrave -40\nKPX Rcommaaccent Uhungarumlaut -40\nKPX Rcommaaccent Umacron -40\nKPX Rcommaaccent Uogonek -40\nKPX Rcommaaccent Uring -40\nKPX Rcommaaccent V -80\nKPX Rcommaaccent W -55\nKPX Rcommaaccent Y -65\nKPX Rcommaaccent Yacute -65\nKPX Rcommaaccent Ydieresis -65\nKPX T A -93\nKPX T Aacute -93\nKPX T Abreve -93\nKPX T Acircumflex -93\nKPX T Adieresis -93\nKPX T Agrave -93\nKPX T Amacron -93\nKPX T Aogonek -93\nKPX T Aring -93\nKPX T Atilde -93\nKPX T O -18\nKPX T Oacute -18\nKPX T Ocircumflex -18\nKPX T Odieresis -18\nKPX T Ograve -18\nKPX T Ohungarumlaut -18\nKPX T Omacron -18\nKPX T Oslash -18\nKPX T Otilde -18\nKPX T a -80\nKPX T aacute -80\nKPX T abreve -80\nKPX T acircumflex -80\nKPX T adieresis -40\nKPX T agrave -40\nKPX T amacron -40\nKPX T aogonek -80\nKPX T aring -80\nKPX T atilde -40\nKPX T colon -50\nKPX T comma -74\nKPX T e -70\nKPX T eacute -70\nKPX T ecaron -70\nKPX T ecircumflex -70\nKPX T edieresis -30\nKPX T edotaccent -70\nKPX T egrave -70\nKPX T emacron -30\nKPX T eogonek -70\nKPX T hyphen -92\nKPX T i -35\nKPX T iacute -35\nKPX T iogonek -35\nKPX T o -80\nKPX T oacute -80\nKPX T ocircumflex -80\nKPX T odieresis -80\nKPX T ograve -80\nKPX T ohungarumlaut -80\nKPX T omacron -80\nKPX T oslash -80\nKPX T otilde -80\nKPX T period -74\nKPX T r -35\nKPX T racute -35\nKPX T rcaron -35\nKPX T rcommaaccent -35\nKPX T semicolon -55\nKPX T u -45\nKPX T uacute -45\nKPX T ucircumflex -45\nKPX T udieresis -45\nKPX T ugrave -45\nKPX T uhungarumlaut -45\nKPX T umacron -45\nKPX T uogonek -45\nKPX T uring -45\nKPX T w -80\nKPX T y -80\nKPX T yacute -80\nKPX T ydieresis -80\nKPX Tcaron A -93\nKPX Tcaron Aacute -93\nKPX Tcaron Abreve -93\nKPX Tcaron Acircumflex -93\nKPX Tcaron Adieresis -93\nKPX Tcaron Agrave -93\nKPX Tcaron Amacron -93\nKPX Tcaron Aogonek -93\nKPX Tcaron Aring -93\nKPX Tcaron Atilde -93\nKPX Tcaron O -18\nKPX Tcaron Oacute -18\nKPX Tcaron Ocircumflex -18\nKPX Tcaron Odieresis -18\nKPX Tcaron Ograve -18\nKPX Tcaron Ohungarumlaut -18\nKPX Tcaron Omacron -18\nKPX Tcaron Oslash -18\nKPX Tcaron Otilde -18\nKPX Tcaron a -80\nKPX Tcaron aacute -80\nKPX Tcaron abreve -80\nKPX Tcaron acircumflex -80\nKPX Tcaron adieresis -40\nKPX Tcaron agrave -40\nKPX Tcaron amacron -40\nKPX Tcaron aogonek -80\nKPX Tcaron aring -80\nKPX Tcaron atilde -40\nKPX Tcaron colon -50\nKPX Tcaron comma -74\nKPX Tcaron e -70\nKPX Tcaron eacute -70\nKPX Tcaron ecaron -70\nKPX Tcaron ecircumflex -30\nKPX Tcaron edieresis -30\nKPX Tcaron edotaccent -70\nKPX Tcaron egrave -70\nKPX Tcaron emacron -30\nKPX Tcaron eogonek -70\nKPX Tcaron hyphen -92\nKPX Tcaron i -35\nKPX Tcaron iacute -35\nKPX Tcaron iogonek -35\nKPX Tcaron o -80\nKPX Tcaron oacute -80\nKPX Tcaron ocircumflex -80\nKPX Tcaron odieresis -80\nKPX Tcaron ograve -80\nKPX Tcaron ohungarumlaut -80\nKPX Tcaron omacron -80\nKPX Tcaron oslash -80\nKPX Tcaron otilde -80\nKPX Tcaron period -74\nKPX Tcaron r -35\nKPX Tcaron racute -35\nKPX Tcaron rcaron -35\nKPX Tcaron rcommaaccent -35\nKPX Tcaron semicolon -55\nKPX Tcaron u -45\nKPX Tcaron uacute -45\nKPX Tcaron ucircumflex -45\nKPX Tcaron udieresis -45\nKPX Tcaron ugrave -45\nKPX Tcaron uhungarumlaut -45\nKPX Tcaron umacron -45\nKPX Tcaron uogonek -45\nKPX Tcaron uring -45\nKPX Tcaron w -80\nKPX Tcaron y -80\nKPX Tcaron yacute -80\nKPX Tcaron ydieresis -80\nKPX Tcommaaccent A -93\nKPX Tcommaaccent Aacute -93\nKPX Tcommaaccent Abreve -93\nKPX Tcommaaccent Acircumflex -93\nKPX Tcommaaccent Adieresis -93\nKPX Tcommaaccent Agrave -93\nKPX Tcommaaccent Amacron -93\nKPX Tcommaaccent Aogonek -93\nKPX Tcommaaccent Aring -93\nKPX Tcommaaccent Atilde -93\nKPX Tcommaaccent O -18\nKPX Tcommaaccent Oacute -18\nKPX Tcommaaccent Ocircumflex -18\nKPX Tcommaaccent Odieresis -18\nKPX Tcommaaccent Ograve -18\nKPX Tcommaaccent Ohungarumlaut -18\nKPX Tcommaaccent Omacron -18\nKPX Tcommaaccent Oslash -18\nKPX Tcommaaccent Otilde -18\nKPX Tcommaaccent a -80\nKPX Tcommaaccent aacute -80\nKPX Tcommaaccent abreve -80\nKPX Tcommaaccent acircumflex -80\nKPX Tcommaaccent adieresis -40\nKPX Tcommaaccent agrave -40\nKPX Tcommaaccent amacron -40\nKPX Tcommaaccent aogonek -80\nKPX Tcommaaccent aring -80\nKPX Tcommaaccent atilde -40\nKPX Tcommaaccent colon -50\nKPX Tcommaaccent comma -74\nKPX Tcommaaccent e -70\nKPX Tcommaaccent eacute -70\nKPX Tcommaaccent ecaron -70\nKPX Tcommaaccent ecircumflex -30\nKPX Tcommaaccent edieresis -30\nKPX Tcommaaccent edotaccent -70\nKPX Tcommaaccent egrave -30\nKPX Tcommaaccent emacron -70\nKPX Tcommaaccent eogonek -70\nKPX Tcommaaccent hyphen -92\nKPX Tcommaaccent i -35\nKPX Tcommaaccent iacute -35\nKPX Tcommaaccent iogonek -35\nKPX Tcommaaccent o -80\nKPX Tcommaaccent oacute -80\nKPX Tcommaaccent ocircumflex -80\nKPX Tcommaaccent odieresis -80\nKPX Tcommaaccent ograve -80\nKPX Tcommaaccent ohungarumlaut -80\nKPX Tcommaaccent omacron -80\nKPX Tcommaaccent oslash -80\nKPX Tcommaaccent otilde -80\nKPX Tcommaaccent period -74\nKPX Tcommaaccent r -35\nKPX Tcommaaccent racute -35\nKPX Tcommaaccent rcaron -35\nKPX Tcommaaccent rcommaaccent -35\nKPX Tcommaaccent semicolon -55\nKPX Tcommaaccent u -45\nKPX Tcommaaccent uacute -45\nKPX Tcommaaccent ucircumflex -45\nKPX Tcommaaccent udieresis -45\nKPX Tcommaaccent ugrave -45\nKPX Tcommaaccent uhungarumlaut -45\nKPX Tcommaaccent umacron -45\nKPX Tcommaaccent uogonek -45\nKPX Tcommaaccent uring -45\nKPX Tcommaaccent w -80\nKPX Tcommaaccent y -80\nKPX Tcommaaccent yacute -80\nKPX Tcommaaccent ydieresis -80\nKPX U A -40\nKPX U Aacute -40\nKPX U Abreve -40\nKPX U Acircumflex -40\nKPX U Adieresis -40\nKPX U Agrave -40\nKPX U Amacron -40\nKPX U Aogonek -40\nKPX U Aring -40\nKPX U Atilde -40\nKPX Uacute A -40\nKPX Uacute Aacute -40\nKPX Uacute Abreve -40\nKPX Uacute Acircumflex -40\nKPX Uacute Adieresis -40\nKPX Uacute Agrave -40\nKPX Uacute Amacron -40\nKPX Uacute Aogonek -40\nKPX Uacute Aring -40\nKPX Uacute Atilde -40\nKPX Ucircumflex A -40\nKPX Ucircumflex Aacute -40\nKPX Ucircumflex Abreve -40\nKPX Ucircumflex Acircumflex -40\nKPX Ucircumflex Adieresis -40\nKPX Ucircumflex Agrave -40\nKPX Ucircumflex Amacron -40\nKPX Ucircumflex Aogonek -40\nKPX Ucircumflex Aring -40\nKPX Ucircumflex Atilde -40\nKPX Udieresis A -40\nKPX Udieresis Aacute -40\nKPX Udieresis Abreve -40\nKPX Udieresis Acircumflex -40\nKPX Udieresis Adieresis -40\nKPX Udieresis Agrave -40\nKPX Udieresis Amacron -40\nKPX Udieresis Aogonek -40\nKPX Udieresis Aring -40\nKPX Udieresis Atilde -40\nKPX Ugrave A -40\nKPX Ugrave Aacute -40\nKPX Ugrave Abreve -40\nKPX Ugrave Acircumflex -40\nKPX Ugrave Adieresis -40\nKPX Ugrave Agrave -40\nKPX Ugrave Amacron -40\nKPX Ugrave Aogonek -40\nKPX Ugrave Aring -40\nKPX Ugrave Atilde -40\nKPX Uhungarumlaut A -40\nKPX Uhungarumlaut Aacute -40\nKPX Uhungarumlaut Abreve -40\nKPX Uhungarumlaut Acircumflex -40\nKPX Uhungarumlaut Adieresis -40\nKPX Uhungarumlaut Agrave -40\nKPX Uhungarumlaut Amacron -40\nKPX Uhungarumlaut Aogonek -40\nKPX Uhungarumlaut Aring -40\nKPX Uhungarumlaut Atilde -40\nKPX Umacron A -40\nKPX Umacron Aacute -40\nKPX Umacron Abreve -40\nKPX Umacron Acircumflex -40\nKPX Umacron Adieresis -40\nKPX Umacron Agrave -40\nKPX Umacron Amacron -40\nKPX Umacron Aogonek -40\nKPX Umacron Aring -40\nKPX Umacron Atilde -40\nKPX Uogonek A -40\nKPX Uogonek Aacute -40\nKPX Uogonek Abreve -40\nKPX Uogonek Acircumflex -40\nKPX Uogonek Adieresis -40\nKPX Uogonek Agrave -40\nKPX Uogonek Amacron -40\nKPX Uogonek Aogonek -40\nKPX Uogonek Aring -40\nKPX Uogonek Atilde -40\nKPX Uring A -40\nKPX Uring Aacute -40\nKPX Uring Abreve -40\nKPX Uring Acircumflex -40\nKPX Uring Adieresis -40\nKPX Uring Agrave -40\nKPX Uring Amacron -40\nKPX Uring Aogonek -40\nKPX Uring Aring -40\nKPX Uring Atilde -40\nKPX V A -135\nKPX V Aacute -135\nKPX V Abreve -135\nKPX V Acircumflex -135\nKPX V Adieresis -135\nKPX V Agrave -135\nKPX V Amacron -135\nKPX V Aogonek -135\nKPX V Aring -135\nKPX V Atilde -135\nKPX V G -15\nKPX V Gbreve -15\nKPX V Gcommaaccent -15\nKPX V O -40\nKPX V Oacute -40\nKPX V Ocircumflex -40\nKPX V Odieresis -40\nKPX V Ograve -40\nKPX V Ohungarumlaut -40\nKPX V Omacron -40\nKPX V Oslash -40\nKPX V Otilde -40\nKPX V a -111\nKPX V aacute -111\nKPX V abreve -111\nKPX V acircumflex -71\nKPX V adieresis -71\nKPX V agrave -71\nKPX V amacron -71\nKPX V aogonek -111\nKPX V aring -111\nKPX V atilde -71\nKPX V colon -74\nKPX V comma -129\nKPX V e -111\nKPX V eacute -111\nKPX V ecaron -71\nKPX V ecircumflex -71\nKPX V edieresis -71\nKPX V edotaccent -111\nKPX V egrave -71\nKPX V emacron -71\nKPX V eogonek -111\nKPX V hyphen -100\nKPX V i -60\nKPX V iacute -60\nKPX V icircumflex -20\nKPX V idieresis -20\nKPX V igrave -20\nKPX V imacron -20\nKPX V iogonek -60\nKPX V o -129\nKPX V oacute -129\nKPX V ocircumflex -129\nKPX V odieresis -89\nKPX V ograve -89\nKPX V ohungarumlaut -129\nKPX V omacron -89\nKPX V oslash -129\nKPX V otilde -89\nKPX V period -129\nKPX V semicolon -74\nKPX V u -75\nKPX V uacute -75\nKPX V ucircumflex -75\nKPX V udieresis -75\nKPX V ugrave -75\nKPX V uhungarumlaut -75\nKPX V umacron -75\nKPX V uogonek -75\nKPX V uring -75\nKPX W A -120\nKPX W Aacute -120\nKPX W Abreve -120\nKPX W Acircumflex -120\nKPX W Adieresis -120\nKPX W Agrave -120\nKPX W Amacron -120\nKPX W Aogonek -120\nKPX W Aring -120\nKPX W Atilde -120\nKPX W O -10\nKPX W Oacute -10\nKPX W Ocircumflex -10\nKPX W Odieresis -10\nKPX W Ograve -10\nKPX W Ohungarumlaut -10\nKPX W Omacron -10\nKPX W Oslash -10\nKPX W Otilde -10\nKPX W a -80\nKPX W aacute -80\nKPX W abreve -80\nKPX W acircumflex -80\nKPX W adieresis -80\nKPX W agrave -80\nKPX W amacron -80\nKPX W aogonek -80\nKPX W aring -80\nKPX W atilde -80\nKPX W colon -37\nKPX W comma -92\nKPX W e -80\nKPX W eacute -80\nKPX W ecaron -80\nKPX W ecircumflex -80\nKPX W edieresis -40\nKPX W edotaccent -80\nKPX W egrave -40\nKPX W emacron -40\nKPX W eogonek -80\nKPX W hyphen -65\nKPX W i -40\nKPX W iacute -40\nKPX W iogonek -40\nKPX W o -80\nKPX W oacute -80\nKPX W ocircumflex -80\nKPX W odieresis -80\nKPX W ograve -80\nKPX W ohungarumlaut -80\nKPX W omacron -80\nKPX W oslash -80\nKPX W otilde -80\nKPX W period -92\nKPX W semicolon -37\nKPX W u -50\nKPX W uacute -50\nKPX W ucircumflex -50\nKPX W udieresis -50\nKPX W ugrave -50\nKPX W uhungarumlaut -50\nKPX W umacron -50\nKPX W uogonek -50\nKPX W uring -50\nKPX W y -73\nKPX W yacute -73\nKPX W ydieresis -73\nKPX Y A -120\nKPX Y Aacute -120\nKPX Y Abreve -120\nKPX Y Acircumflex -120\nKPX Y Adieresis -120\nKPX Y Agrave -120\nKPX Y Amacron -120\nKPX Y Aogonek -120\nKPX Y Aring -120\nKPX Y Atilde -120\nKPX Y O -30\nKPX Y Oacute -30\nKPX Y Ocircumflex -30\nKPX Y Odieresis -30\nKPX Y Ograve -30\nKPX Y Ohungarumlaut -30\nKPX Y Omacron -30\nKPX Y Oslash -30\nKPX Y Otilde -30\nKPX Y a -100\nKPX Y aacute -100\nKPX Y abreve -100\nKPX Y acircumflex -100\nKPX Y adieresis -60\nKPX Y agrave -60\nKPX Y amacron -60\nKPX Y aogonek -100\nKPX Y aring -100\nKPX Y atilde -60\nKPX Y colon -92\nKPX Y comma -129\nKPX Y e -100\nKPX Y eacute -100\nKPX Y ecaron -100\nKPX Y ecircumflex -100\nKPX Y edieresis -60\nKPX Y edotaccent -100\nKPX Y egrave -60\nKPX Y emacron -60\nKPX Y eogonek -100\nKPX Y hyphen -111\nKPX Y i -55\nKPX Y iacute -55\nKPX Y iogonek -55\nKPX Y o -110\nKPX Y oacute -110\nKPX Y ocircumflex -110\nKPX Y odieresis -70\nKPX Y ograve -70\nKPX Y ohungarumlaut -110\nKPX Y omacron -70\nKPX Y oslash -110\nKPX Y otilde -70\nKPX Y period -129\nKPX Y semicolon -92\nKPX Y u -111\nKPX Y uacute -111\nKPX Y ucircumflex -111\nKPX Y udieresis -71\nKPX Y ugrave -71\nKPX Y uhungarumlaut -111\nKPX Y umacron -71\nKPX Y uogonek -111\nKPX Y uring -111\nKPX Yacute A -120\nKPX Yacute Aacute -120\nKPX Yacute Abreve -120\nKPX Yacute Acircumflex -120\nKPX Yacute Adieresis -120\nKPX Yacute Agrave -120\nKPX Yacute Amacron -120\nKPX Yacute Aogonek -120\nKPX Yacute Aring -120\nKPX Yacute Atilde -120\nKPX Yacute O -30\nKPX Yacute Oacute -30\nKPX Yacute Ocircumflex -30\nKPX Yacute Odieresis -30\nKPX Yacute Ograve -30\nKPX Yacute Ohungarumlaut -30\nKPX Yacute Omacron -30\nKPX Yacute Oslash -30\nKPX Yacute Otilde -30\nKPX Yacute a -100\nKPX Yacute aacute -100\nKPX Yacute abreve -100\nKPX Yacute acircumflex -100\nKPX Yacute adieresis -60\nKPX Yacute agrave -60\nKPX Yacute amacron -60\nKPX Yacute aogonek -100\nKPX Yacute aring -100\nKPX Yacute atilde -60\nKPX Yacute colon -92\nKPX Yacute comma -129\nKPX Yacute e -100\nKPX Yacute eacute -100\nKPX Yacute ecaron -100\nKPX Yacute ecircumflex -100\nKPX Yacute edieresis -60\nKPX Yacute edotaccent -100\nKPX Yacute egrave -60\nKPX Yacute emacron -60\nKPX Yacute eogonek -100\nKPX Yacute hyphen -111\nKPX Yacute i -55\nKPX Yacute iacute -55\nKPX Yacute iogonek -55\nKPX Yacute o -110\nKPX Yacute oacute -110\nKPX Yacute ocircumflex -110\nKPX Yacute odieresis -70\nKPX Yacute ograve -70\nKPX Yacute ohungarumlaut -110\nKPX Yacute omacron -70\nKPX Yacute oslash -110\nKPX Yacute otilde -70\nKPX Yacute period -129\nKPX Yacute semicolon -92\nKPX Yacute u -111\nKPX Yacute uacute -111\nKPX Yacute ucircumflex -111\nKPX Yacute udieresis -71\nKPX Yacute ugrave -71\nKPX Yacute uhungarumlaut -111\nKPX Yacute umacron -71\nKPX Yacute uogonek -111\nKPX Yacute uring -111\nKPX Ydieresis A -120\nKPX Ydieresis Aacute -120\nKPX Ydieresis Abreve -120\nKPX Ydieresis Acircumflex -120\nKPX Ydieresis Adieresis -120\nKPX Ydieresis Agrave -120\nKPX Ydieresis Amacron -120\nKPX Ydieresis Aogonek -120\nKPX Ydieresis Aring -120\nKPX Ydieresis Atilde -120\nKPX Ydieresis O -30\nKPX Ydieresis Oacute -30\nKPX Ydieresis Ocircumflex -30\nKPX Ydieresis Odieresis -30\nKPX Ydieresis Ograve -30\nKPX Ydieresis Ohungarumlaut -30\nKPX Ydieresis Omacron -30\nKPX Ydieresis Oslash -30\nKPX Ydieresis Otilde -30\nKPX Ydieresis a -100\nKPX Ydieresis aacute -100\nKPX Ydieresis abreve -100\nKPX Ydieresis acircumflex -100\nKPX Ydieresis adieresis -60\nKPX Ydieresis agrave -60\nKPX Ydieresis amacron -60\nKPX Ydieresis aogonek -100\nKPX Ydieresis aring -100\nKPX Ydieresis atilde -100\nKPX Ydieresis colon -92\nKPX Ydieresis comma -129\nKPX Ydieresis e -100\nKPX Ydieresis eacute -100\nKPX Ydieresis ecaron -100\nKPX Ydieresis ecircumflex -100\nKPX Ydieresis edieresis -60\nKPX Ydieresis edotaccent -100\nKPX Ydieresis egrave -60\nKPX Ydieresis emacron -60\nKPX Ydieresis eogonek -100\nKPX Ydieresis hyphen -111\nKPX Ydieresis i -55\nKPX Ydieresis iacute -55\nKPX Ydieresis iogonek -55\nKPX Ydieresis o -110\nKPX Ydieresis oacute -110\nKPX Ydieresis ocircumflex -110\nKPX Ydieresis odieresis -70\nKPX Ydieresis ograve -70\nKPX Ydieresis ohungarumlaut -110\nKPX Ydieresis omacron -70\nKPX Ydieresis oslash -110\nKPX Ydieresis otilde -70\nKPX Ydieresis period -129\nKPX Ydieresis semicolon -92\nKPX Ydieresis u -111\nKPX Ydieresis uacute -111\nKPX Ydieresis ucircumflex -111\nKPX Ydieresis udieresis -71\nKPX Ydieresis ugrave -71\nKPX Ydieresis uhungarumlaut -111\nKPX Ydieresis umacron -71\nKPX Ydieresis uogonek -111\nKPX Ydieresis uring -111\nKPX a v -20\nKPX a w -15\nKPX aacute v -20\nKPX aacute w -15\nKPX abreve v -20\nKPX abreve w -15\nKPX acircumflex v -20\nKPX acircumflex w -15\nKPX adieresis v -20\nKPX adieresis w -15\nKPX agrave v -20\nKPX agrave w -15\nKPX amacron v -20\nKPX amacron w -15\nKPX aogonek v -20\nKPX aogonek w -15\nKPX aring v -20\nKPX aring w -15\nKPX atilde v -20\nKPX atilde w -15\nKPX b period -40\nKPX b u -20\nKPX b uacute -20\nKPX b ucircumflex -20\nKPX b udieresis -20\nKPX b ugrave -20\nKPX b uhungarumlaut -20\nKPX b umacron -20\nKPX b uogonek -20\nKPX b uring -20\nKPX b v -15\nKPX c y -15\nKPX c yacute -15\nKPX c ydieresis -15\nKPX cacute y -15\nKPX cacute yacute -15\nKPX cacute ydieresis -15\nKPX ccaron y -15\nKPX ccaron yacute -15\nKPX ccaron ydieresis -15\nKPX ccedilla y -15\nKPX ccedilla yacute -15\nKPX ccedilla ydieresis -15\nKPX comma quotedblright -70\nKPX comma quoteright -70\nKPX e g -15\nKPX e gbreve -15\nKPX e gcommaaccent -15\nKPX e v -25\nKPX e w -25\nKPX e x -15\nKPX e y -15\nKPX e yacute -15\nKPX e ydieresis -15\nKPX eacute g -15\nKPX eacute gbreve -15\nKPX eacute gcommaaccent -15\nKPX eacute v -25\nKPX eacute w -25\nKPX eacute x -15\nKPX eacute y -15\nKPX eacute yacute -15\nKPX eacute ydieresis -15\nKPX ecaron g -15\nKPX ecaron gbreve -15\nKPX ecaron gcommaaccent -15\nKPX ecaron v -25\nKPX ecaron w -25\nKPX ecaron x -15\nKPX ecaron y -15\nKPX ecaron yacute -15\nKPX ecaron ydieresis -15\nKPX ecircumflex g -15\nKPX ecircumflex gbreve -15\nKPX ecircumflex gcommaaccent -15\nKPX ecircumflex v -25\nKPX ecircumflex w -25\nKPX ecircumflex x -15\nKPX ecircumflex y -15\nKPX ecircumflex yacute -15\nKPX ecircumflex ydieresis -15\nKPX edieresis g -15\nKPX edieresis gbreve -15\nKPX edieresis gcommaaccent -15\nKPX edieresis v -25\nKPX edieresis w -25\nKPX edieresis x -15\nKPX edieresis y -15\nKPX edieresis yacute -15\nKPX edieresis ydieresis -15\nKPX edotaccent g -15\nKPX edotaccent gbreve -15\nKPX edotaccent gcommaaccent -15\nKPX edotaccent v -25\nKPX edotaccent w -25\nKPX edotaccent x -15\nKPX edotaccent y -15\nKPX edotaccent yacute -15\nKPX edotaccent ydieresis -15\nKPX egrave g -15\nKPX egrave gbreve -15\nKPX egrave gcommaaccent -15\nKPX egrave v -25\nKPX egrave w -25\nKPX egrave x -15\nKPX egrave y -15\nKPX egrave yacute -15\nKPX egrave ydieresis -15\nKPX emacron g -15\nKPX emacron gbreve -15\nKPX emacron gcommaaccent -15\nKPX emacron v -25\nKPX emacron w -25\nKPX emacron x -15\nKPX emacron y -15\nKPX emacron yacute -15\nKPX emacron ydieresis -15\nKPX eogonek g -15\nKPX eogonek gbreve -15\nKPX eogonek gcommaaccent -15\nKPX eogonek v -25\nKPX eogonek w -25\nKPX eogonek x -15\nKPX eogonek y -15\nKPX eogonek yacute -15\nKPX eogonek ydieresis -15\nKPX f a -10\nKPX f aacute -10\nKPX f abreve -10\nKPX f acircumflex -10\nKPX f adieresis -10\nKPX f agrave -10\nKPX f amacron -10\nKPX f aogonek -10\nKPX f aring -10\nKPX f atilde -10\nKPX f dotlessi -50\nKPX f f -25\nKPX f i -20\nKPX f iacute -20\nKPX f quoteright 55\nKPX g a -5\nKPX g aacute -5\nKPX g abreve -5\nKPX g acircumflex -5\nKPX g adieresis -5\nKPX g agrave -5\nKPX g amacron -5\nKPX g aogonek -5\nKPX g aring -5\nKPX g atilde -5\nKPX gbreve a -5\nKPX gbreve aacute -5\nKPX gbreve abreve -5\nKPX gbreve acircumflex -5\nKPX gbreve adieresis -5\nKPX gbreve agrave -5\nKPX gbreve amacron -5\nKPX gbreve aogonek -5\nKPX gbreve aring -5\nKPX gbreve atilde -5\nKPX gcommaaccent a -5\nKPX gcommaaccent aacute -5\nKPX gcommaaccent abreve -5\nKPX gcommaaccent acircumflex -5\nKPX gcommaaccent adieresis -5\nKPX gcommaaccent agrave -5\nKPX gcommaaccent amacron -5\nKPX gcommaaccent aogonek -5\nKPX gcommaaccent aring -5\nKPX gcommaaccent atilde -5\nKPX h y -5\nKPX h yacute -5\nKPX h ydieresis -5\nKPX i v -25\nKPX iacute v -25\nKPX icircumflex v -25\nKPX idieresis v -25\nKPX igrave v -25\nKPX imacron v -25\nKPX iogonek v -25\nKPX k e -10\nKPX k eacute -10\nKPX k ecaron -10\nKPX k ecircumflex -10\nKPX k edieresis -10\nKPX k edotaccent -10\nKPX k egrave -10\nKPX k emacron -10\nKPX k eogonek -10\nKPX k o -10\nKPX k oacute -10\nKPX k ocircumflex -10\nKPX k odieresis -10\nKPX k ograve -10\nKPX k ohungarumlaut -10\nKPX k omacron -10\nKPX k oslash -10\nKPX k otilde -10\nKPX k y -15\nKPX k yacute -15\nKPX k ydieresis -15\nKPX kcommaaccent e -10\nKPX kcommaaccent eacute -10\nKPX kcommaaccent ecaron -10\nKPX kcommaaccent ecircumflex -10\nKPX kcommaaccent edieresis -10\nKPX kcommaaccent edotaccent -10\nKPX kcommaaccent egrave -10\nKPX kcommaaccent emacron -10\nKPX kcommaaccent eogonek -10\nKPX kcommaaccent o -10\nKPX kcommaaccent oacute -10\nKPX kcommaaccent ocircumflex -10\nKPX kcommaaccent odieresis -10\nKPX kcommaaccent ograve -10\nKPX kcommaaccent ohungarumlaut -10\nKPX kcommaaccent omacron -10\nKPX kcommaaccent oslash -10\nKPX kcommaaccent otilde -10\nKPX kcommaaccent y -15\nKPX kcommaaccent yacute -15\nKPX kcommaaccent ydieresis -15\nKPX l w -10\nKPX lacute w -10\nKPX lcommaaccent w -10\nKPX lslash w -10\nKPX n v -40\nKPX n y -15\nKPX n yacute -15\nKPX n ydieresis -15\nKPX nacute v -40\nKPX nacute y -15\nKPX nacute yacute -15\nKPX nacute ydieresis -15\nKPX ncaron v -40\nKPX ncaron y -15\nKPX ncaron yacute -15\nKPX ncaron ydieresis -15\nKPX ncommaaccent v -40\nKPX ncommaaccent y -15\nKPX ncommaaccent yacute -15\nKPX ncommaaccent ydieresis -15\nKPX ntilde v -40\nKPX ntilde y -15\nKPX ntilde yacute -15\nKPX ntilde ydieresis -15\nKPX o v -15\nKPX o w -25\nKPX o y -10\nKPX o yacute -10\nKPX o ydieresis -10\nKPX oacute v -15\nKPX oacute w -25\nKPX oacute y -10\nKPX oacute yacute -10\nKPX oacute ydieresis -10\nKPX ocircumflex v -15\nKPX ocircumflex w -25\nKPX ocircumflex y -10\nKPX ocircumflex yacute -10\nKPX ocircumflex ydieresis -10\nKPX odieresis v -15\nKPX odieresis w -25\nKPX odieresis y -10\nKPX odieresis yacute -10\nKPX odieresis ydieresis -10\nKPX ograve v -15\nKPX ograve w -25\nKPX ograve y -10\nKPX ograve yacute -10\nKPX ograve ydieresis -10\nKPX ohungarumlaut v -15\nKPX ohungarumlaut w -25\nKPX ohungarumlaut y -10\nKPX ohungarumlaut yacute -10\nKPX ohungarumlaut ydieresis -10\nKPX omacron v -15\nKPX omacron w -25\nKPX omacron y -10\nKPX omacron yacute -10\nKPX omacron ydieresis -10\nKPX oslash v -15\nKPX oslash w -25\nKPX oslash y -10\nKPX oslash yacute -10\nKPX oslash ydieresis -10\nKPX otilde v -15\nKPX otilde w -25\nKPX otilde y -10\nKPX otilde yacute -10\nKPX otilde ydieresis -10\nKPX p y -10\nKPX p yacute -10\nKPX p ydieresis -10\nKPX period quotedblright -70\nKPX period quoteright -70\nKPX quotedblleft A -80\nKPX quotedblleft Aacute -80\nKPX quotedblleft Abreve -80\nKPX quotedblleft Acircumflex -80\nKPX quotedblleft Adieresis -80\nKPX quotedblleft Agrave -80\nKPX quotedblleft Amacron -80\nKPX quotedblleft Aogonek -80\nKPX quotedblleft Aring -80\nKPX quotedblleft Atilde -80\nKPX quoteleft A -80\nKPX quoteleft Aacute -80\nKPX quoteleft Abreve -80\nKPX quoteleft Acircumflex -80\nKPX quoteleft Adieresis -80\nKPX quoteleft Agrave -80\nKPX quoteleft Amacron -80\nKPX quoteleft Aogonek -80\nKPX quoteleft Aring -80\nKPX quoteleft Atilde -80\nKPX quoteleft quoteleft -74\nKPX quoteright d -50\nKPX quoteright dcroat -50\nKPX quoteright l -10\nKPX quoteright lacute -10\nKPX quoteright lcommaaccent -10\nKPX quoteright lslash -10\nKPX quoteright quoteright -74\nKPX quoteright r -50\nKPX quoteright racute -50\nKPX quoteright rcaron -50\nKPX quoteright rcommaaccent -50\nKPX quoteright s -55\nKPX quoteright sacute -55\nKPX quoteright scaron -55\nKPX quoteright scedilla -55\nKPX quoteright scommaaccent -55\nKPX quoteright space -74\nKPX quoteright t -18\nKPX quoteright tcommaaccent -18\nKPX quoteright v -50\nKPX r comma -40\nKPX r g -18\nKPX r gbreve -18\nKPX r gcommaaccent -18\nKPX r hyphen -20\nKPX r period -55\nKPX racute comma -40\nKPX racute g -18\nKPX racute gbreve -18\nKPX racute gcommaaccent -18\nKPX racute hyphen -20\nKPX racute period -55\nKPX rcaron comma -40\nKPX rcaron g -18\nKPX rcaron gbreve -18\nKPX rcaron gcommaaccent -18\nKPX rcaron hyphen -20\nKPX rcaron period -55\nKPX rcommaaccent comma -40\nKPX rcommaaccent g -18\nKPX rcommaaccent gbreve -18\nKPX rcommaaccent gcommaaccent -18\nKPX rcommaaccent hyphen -20\nKPX rcommaaccent period -55\nKPX space A -55\nKPX space Aacute -55\nKPX space Abreve -55\nKPX space Acircumflex -55\nKPX space Adieresis -55\nKPX space Agrave -55\nKPX space Amacron -55\nKPX space Aogonek -55\nKPX space Aring -55\nKPX space Atilde -55\nKPX space T -18\nKPX space Tcaron -18\nKPX space Tcommaaccent -18\nKPX space V -50\nKPX space W -30\nKPX space Y -90\nKPX space Yacute -90\nKPX space Ydieresis -90\nKPX v a -25\nKPX v aacute -25\nKPX v abreve -25\nKPX v acircumflex -25\nKPX v adieresis -25\nKPX v agrave -25\nKPX v amacron -25\nKPX v aogonek -25\nKPX v aring -25\nKPX v atilde -25\nKPX v comma -65\nKPX v e -15\nKPX v eacute -15\nKPX v ecaron -15\nKPX v ecircumflex -15\nKPX v edieresis -15\nKPX v edotaccent -15\nKPX v egrave -15\nKPX v emacron -15\nKPX v eogonek -15\nKPX v o -20\nKPX v oacute -20\nKPX v ocircumflex -20\nKPX v odieresis -20\nKPX v ograve -20\nKPX v ohungarumlaut -20\nKPX v omacron -20\nKPX v oslash -20\nKPX v otilde -20\nKPX v period -65\nKPX w a -10\nKPX w aacute -10\nKPX w abreve -10\nKPX w acircumflex -10\nKPX w adieresis -10\nKPX w agrave -10\nKPX w amacron -10\nKPX w aogonek -10\nKPX w aring -10\nKPX w atilde -10\nKPX w comma -65\nKPX w o -10\nKPX w oacute -10\nKPX w ocircumflex -10\nKPX w odieresis -10\nKPX w ograve -10\nKPX w ohungarumlaut -10\nKPX w omacron -10\nKPX w oslash -10\nKPX w otilde -10\nKPX w period -65\nKPX x e -15\nKPX x eacute -15\nKPX x ecaron -15\nKPX x ecircumflex -15\nKPX x edieresis -15\nKPX x edotaccent -15\nKPX x egrave -15\nKPX x emacron -15\nKPX x eogonek -15\nKPX y comma -65\nKPX y period -65\nKPX yacute comma -65\nKPX yacute period -65\nKPX ydieresis comma -65\nKPX ydieresis period -65\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/pdfcorefonts/ZapfDingbats.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.\nComment Creation Date: Thu May  1 15:14:13 1997\nComment UniqueID 43082\nComment VMusage 45775 55535\nFontName ZapfDingbats\nFullName ITC Zapf Dingbats\nFamilyName ZapfDingbats\nWeight Medium\nItalicAngle 0\nIsFixedPitch false\nCharacterSet Special\nFontBBox -1 -143 981 820 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation.\nEncodingScheme FontSpecific\nStdHW 28\nStdVW 90\nStartCharMetrics 202\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 974 ; N a1 ; B 35 72 939 621 ;\nC 34 ; WX 961 ; N a2 ; B 35 81 927 611 ;\nC 35 ; WX 974 ; N a202 ; B 35 72 939 621 ;\nC 36 ; WX 980 ; N a3 ; B 35 0 945 692 ;\nC 37 ; WX 719 ; N a4 ; B 34 139 685 566 ;\nC 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ;\nC 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ;\nC 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ;\nC 41 ; WX 690 ; N a117 ; B 34 138 655 553 ;\nC 42 ; WX 960 ; N a11 ; B 35 123 925 568 ;\nC 43 ; WX 939 ; N a12 ; B 35 134 904 559 ;\nC 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ;\nC 45 ; WX 855 ; N a14 ; B 34 59 820 632 ;\nC 46 ; WX 911 ; N a15 ; B 35 50 876 642 ;\nC 47 ; WX 933 ; N a16 ; B 35 139 899 550 ;\nC 48 ; WX 911 ; N a105 ; B 35 50 876 642 ;\nC 49 ; WX 945 ; N a17 ; B 35 139 909 553 ;\nC 50 ; WX 974 ; N a18 ; B 35 104 938 587 ;\nC 51 ; WX 755 ; N a19 ; B 34 -13 721 705 ;\nC 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ;\nC 53 ; WX 762 ; N a21 ; B 35 0 727 692 ;\nC 54 ; WX 761 ; N a22 ; B 35 0 727 692 ;\nC 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ;\nC 56 ; WX 677 ; N a24 ; B 36 -13 642 705 ;\nC 57 ; WX 763 ; N a25 ; B 35 0 728 692 ;\nC 58 ; WX 760 ; N a26 ; B 35 0 726 692 ;\nC 59 ; WX 759 ; N a27 ; B 35 0 725 692 ;\nC 60 ; WX 754 ; N a28 ; B 35 0 720 692 ;\nC 61 ; WX 494 ; N a6 ; B 35 0 460 692 ;\nC 62 ; WX 552 ; N a7 ; B 35 0 517 692 ;\nC 63 ; WX 537 ; N a8 ; B 35 0 503 692 ;\nC 64 ; WX 577 ; N a9 ; B 35 96 542 596 ;\nC 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ;\nC 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ;\nC 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ;\nC 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ;\nC 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ;\nC 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ;\nC 71 ; WX 794 ; N a34 ; B 35 -13 759 705 ;\nC 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ;\nC 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ;\nC 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ;\nC 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ;\nC 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ;\nC 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ;\nC 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ;\nC 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ;\nC 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ;\nC 81 ; WX 744 ; N a44 ; B 35 0 710 692 ;\nC 82 ; WX 723 ; N a45 ; B 35 0 688 692 ;\nC 83 ; WX 749 ; N a46 ; B 35 0 714 692 ;\nC 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ;\nC 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ;\nC 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ;\nC 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ;\nC 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ;\nC 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ;\nC 90 ; WX 759 ; N a53 ; B 35 0 725 692 ;\nC 91 ; WX 707 ; N a54 ; B 35 -13 672 704 ;\nC 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ;\nC 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ;\nC 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ;\nC 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ;\nC 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ;\nC 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ;\nC 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ;\nC 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ;\nC 100 ; WX 687 ; N a63 ; B 36 0 651 692 ;\nC 101 ; WX 696 ; N a64 ; B 35 0 661 691 ;\nC 102 ; WX 689 ; N a65 ; B 35 0 655 692 ;\nC 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ;\nC 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ;\nC 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ;\nC 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ;\nC 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ;\nC 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ;\nC 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ;\nC 110 ; WX 761 ; N a73 ; B 35 0 726 692 ;\nC 111 ; WX 762 ; N a74 ; B 35 0 727 692 ;\nC 112 ; WX 762 ; N a203 ; B 35 0 727 692 ;\nC 113 ; WX 759 ; N a75 ; B 35 0 725 692 ;\nC 114 ; WX 759 ; N a204 ; B 35 0 725 692 ;\nC 115 ; WX 892 ; N a76 ; B 35 0 858 705 ;\nC 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ;\nC 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ;\nC 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ;\nC 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ;\nC 120 ; WX 138 ; N a82 ; B 35 0 104 692 ;\nC 121 ; WX 277 ; N a83 ; B 35 0 242 692 ;\nC 122 ; WX 415 ; N a84 ; B 35 0 380 692 ;\nC 123 ; WX 392 ; N a97 ; B 35 263 357 705 ;\nC 124 ; WX 392 ; N a98 ; B 34 263 357 705 ;\nC 125 ; WX 668 ; N a99 ; B 35 263 633 705 ;\nC 126 ; WX 668 ; N a100 ; B 36 263 634 705 ;\nC 128 ; WX 390 ; N a89 ; B 35 -14 356 705 ;\nC 129 ; WX 390 ; N a90 ; B 35 -14 355 705 ;\nC 130 ; WX 317 ; N a93 ; B 35 0 283 692 ;\nC 131 ; WX 317 ; N a94 ; B 35 0 283 692 ;\nC 132 ; WX 276 ; N a91 ; B 35 0 242 692 ;\nC 133 ; WX 276 ; N a92 ; B 35 0 242 692 ;\nC 134 ; WX 509 ; N a205 ; B 35 0 475 692 ;\nC 135 ; WX 509 ; N a85 ; B 35 0 475 692 ;\nC 136 ; WX 410 ; N a206 ; B 35 0 375 692 ;\nC 137 ; WX 410 ; N a86 ; B 35 0 375 692 ;\nC 138 ; WX 234 ; N a87 ; B 35 -14 199 705 ;\nC 139 ; WX 234 ; N a88 ; B 35 -14 199 705 ;\nC 140 ; WX 334 ; N a95 ; B 35 0 299 692 ;\nC 141 ; WX 334 ; N a96 ; B 35 0 299 692 ;\nC 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ;\nC 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ;\nC 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ;\nC 164 ; WX 910 ; N a104 ; B 35 40 875 651 ;\nC 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ;\nC 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ;\nC 167 ; WX 760 ; N a108 ; B 0 121 758 569 ;\nC 168 ; WX 776 ; N a112 ; B 35 0 741 705 ;\nC 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ;\nC 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ;\nC 171 ; WX 626 ; N a109 ; B 34 0 591 705 ;\nC 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ;\nC 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ;\nC 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ;\nC 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ;\nC 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ;\nC 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ;\nC 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ;\nC 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ;\nC 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ;\nC 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ;\nC 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ;\nC 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ;\nC 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ;\nC 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ;\nC 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ;\nC 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ;\nC 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ;\nC 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ;\nC 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ;\nC 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ;\nC 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ;\nC 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ;\nC 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ;\nC 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ;\nC 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ;\nC 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ;\nC 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ;\nC 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ;\nC 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ;\nC 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ;\nC 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ;\nC 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ;\nC 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ;\nC 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ;\nC 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ;\nC 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ;\nC 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ;\nC 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ;\nC 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ;\nC 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ;\nC 212 ; WX 894 ; N a160 ; B 35 58 860 634 ;\nC 213 ; WX 838 ; N a161 ; B 35 152 803 540 ;\nC 214 ; WX 1016 ; N a163 ; B 34 152 981 540 ;\nC 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ;\nC 216 ; WX 748 ; N a196 ; B 35 94 698 597 ;\nC 217 ; WX 924 ; N a165 ; B 35 140 890 552 ;\nC 218 ; WX 748 ; N a192 ; B 35 94 698 597 ;\nC 219 ; WX 918 ; N a166 ; B 35 166 884 526 ;\nC 220 ; WX 927 ; N a167 ; B 35 32 892 660 ;\nC 221 ; WX 928 ; N a168 ; B 35 129 891 562 ;\nC 222 ; WX 928 ; N a169 ; B 35 128 893 563 ;\nC 223 ; WX 834 ; N a170 ; B 35 155 799 537 ;\nC 224 ; WX 873 ; N a171 ; B 35 93 838 599 ;\nC 225 ; WX 828 ; N a172 ; B 35 104 791 588 ;\nC 226 ; WX 924 ; N a173 ; B 35 98 889 594 ;\nC 227 ; WX 924 ; N a162 ; B 35 98 889 594 ;\nC 228 ; WX 917 ; N a174 ; B 35 0 882 692 ;\nC 229 ; WX 930 ; N a175 ; B 35 84 896 608 ;\nC 230 ; WX 931 ; N a176 ; B 35 84 896 608 ;\nC 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ;\nC 232 ; WX 883 ; N a178 ; B 35 71 848 623 ;\nC 233 ; WX 836 ; N a179 ; B 35 44 802 648 ;\nC 234 ; WX 836 ; N a193 ; B 35 44 802 648 ;\nC 235 ; WX 867 ; N a180 ; B 35 101 832 591 ;\nC 236 ; WX 867 ; N a199 ; B 35 101 832 591 ;\nC 237 ; WX 696 ; N a181 ; B 35 44 661 648 ;\nC 238 ; WX 696 ; N a200 ; B 35 44 661 648 ;\nC 239 ; WX 874 ; N a182 ; B 35 77 840 619 ;\nC 241 ; WX 874 ; N a201 ; B 35 73 840 615 ;\nC 242 ; WX 760 ; N a183 ; B 35 0 725 692 ;\nC 243 ; WX 946 ; N a184 ; B 35 160 911 533 ;\nC 244 ; WX 771 ; N a197 ; B 34 37 736 655 ;\nC 245 ; WX 865 ; N a185 ; B 35 207 830 481 ;\nC 246 ; WX 771 ; N a194 ; B 34 37 736 655 ;\nC 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ;\nC 248 ; WX 967 ; N a186 ; B 35 124 932 568 ;\nC 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ;\nC 250 ; WX 831 ; N a187 ; B 35 113 796 579 ;\nC 251 ; WX 873 ; N a188 ; B 36 118 838 578 ;\nC 252 ; WX 927 ; N a189 ; B 35 150 891 542 ;\nC 253 ; WX 970 ; N a190 ; B 35 76 931 616 ;\nC 254 ; WX 918 ; N a191 ; B 34 99 884 593 ;\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/fonts/ttf/LICENSE_STIX",
    "content": "The STIX fonts distributed with matplotlib have been modified from\ntheir canonical form.  They have been converted from OTF to TTF format\nusing Fontforge and this script:\n\n  #!/usr/bin/env fontforge\n  i=1\n  while ( i<$argc )\n    Open($argv[i])\n    Generate($argv[i]:r + \".ttf\")\n    i = i+1\n  endloop\n\nThe original STIX Font License begins below.\n\n-----------------------------------------------------------\n\nSTIX Font License\n\n24 May 2010\n\nCopyright (c) 2001-2010 by the STI Pub Companies, consisting of the American\nInstitute of Physics, the American Chemical Society, the American Mathematical\nSociety, the American Physical Society, Elsevier, Inc., and The Institute of\nElectrical and Electronic Engineers, Inc. (www.stixfonts.org), with Reserved\nFont Name STIX Fonts, STIX Fonts (TM) is a  trademark of The Institute of\nElectrical and Electronics Engineers, Inc.\n\nPortions copyright (c) 1998-2003 by MicroPress, Inc. (www.micropress-inc.com),\nwith Reserved Font Name TM Math. To obtain additional mathematical fonts, please\ncontact MicroPress, Inc., 68-30 Harrow Street, Forest Hills, NY 11375, USA,\nPhone: (718) 575-1816.\n\nPortions copyright (c) 1990 by Elsevier, Inc.\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded,\nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/back.ppm",
    "content": "P6\n24 24\n255\nk<(v$v\"s*{Jһe&u#))(&#\u001f\u001dr){9&,01.,)&#\u001f\u001b\u001cm{X@&1;AB=4-)%!\u001d\u001a\u001blzS{\"}.<IQSLTh+'#\u001f\u001a\u0017\u001alz%u*4DSac^8($ \u001b\u0017\u0014|#us {,6GWkj8)$ \u001b\u0017\u0013\u0019l|s>$+3CR^7($\u001f\u001b\u0017\u0012\u0014t9&w&*.:Uˈʏ˔\u001a\u0016\u0012\u000fz\u001fq\u001es$(+Pt\u0015\u0011\f{\u0017iz\u001dr!%(s\u0013\u000f~\u000by\u0017jz!s\u001f\"%7u\u0011\r|\tw\u001bk{,w\u001c\u001e!#1lged\u0013\u000f~\u000bz\nt(tK\u001a\u001b\u001d\u001f 0ݼ+\u0019\u0016\u0013\u0010\r{\tv\u000enK撹 u\u0017\u0019\u001b\u001c\u001c-ݺ(\u0016\u0013\u0010\r|\nx\u0006s\u001ak{2x\u0014\u0015\u0017\u0017\u0018\u0018*۹%\u0012\u000f\r{\nx\u0007t\nn=曼+z\u0011\u0012\u0013\u0014\u0014\u0013&F\u0010\u000e}\fz\tw\u0007s\u0007o!m}[0\u000e}\u000f~\u000f\u000f\u000f~\u000e}\r|\fz\nx\bu\u0006r\u0006o\u001fl{QG\u0015~\u000by\u000by\u000by\nx\tv\bu\u0006s\u0004p\u000fo,s性6yD0\fv\u0006r\u0005q\u000br)z-vSݏ^A><}P"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/back.xpm",
    "content": "/* XPM */\nstatic char *back[] = {\n/* columns rows colors chars-per-pixel */\n\"24 24 130 2\",\n\"   c #17697A\",\n\".  c #1B6B7A\",\n\"X  c #216D7D\",\n\"o  c #066F8C\",\n\"O  c #0C6E85\",\n\"+  c #0F6F89\",\n\"@  c #04708F\",\n\"#  c #0B728F\",\n\"$  c #067291\",\n\"%  c #097593\",\n\"&  c #0B7995\",\n\"*  c #0E7D99\",\n\"=  c #14748A\",\n\"-  c #1D7280\",\n\";  c #147C92\",\n\":  c #127E9B\",\n\">  c #1A7F94\",\n\",  c #237483\",\n\"<  c #217C8B\",\n\"1  c #2A7584\",\n\"2  c #2A7A8B\",\n\"3  c #297A92\",\n\"4  c #347886\",\n\"5  c #3D7E8D\",\n\"6  c #12829D\",\n\"7  c #1F8395\",\n\"8  c #1B8498\",\n\"9  c #1586A0\",\n\"0  c #1688A1\",\n\"q  c #1A8CA4\",\n\"w  c #1E92A9\",\n\"e  c #248595\",\n\"r  c #25859B\",\n\"t  c #258A9B\",\n\"y  c #2A879B\",\n\"u  c #2D8C9E\",\n\"i  c #308095\",\n\"p  c #3B8293\",\n\"a  c #398499\",\n\"s  c #3E8A9D\",\n\"d  c #298DA1\",\n\"f  c #2195AB\",\n\"g  c #2398AE\",\n\"h  c #299AAC\",\n\"j  c #259BB0\",\n\"k  c #289EB2\",\n\"l  c #3086A1\",\n\"z  c #308FA0\",\n\"x  c #3192A2\",\n\"c  c #3799A9\",\n\"v  c #2AA1B5\",\n\"b  c #2DA5B8\",\n\"n  c #37A0AF\",\n\"m  c #32ABBD\",\n\"M  c #38A0B0\",\n\"N  c #36B0C1\",\n\"B  c #3AB6C6\",\n\"V  c #3CB8C7\",\n\"C  c #3DBAC8\",\n\"Z  c #41808F\",\n\"A  c #408797\",\n\"S  c #45899D\",\n\"D  c #518A9A\",\n\"F  c #4B8CA0\",\n\"G  c #4697AB\",\n\"H  c #4A92A4\",\n\"J  c #5C91A0\",\n\"K  c #539AB1\",\n\"L  c #589DB4\",\n\"P  c #50A9B6\",\n\"I  c #54B1BC\",\n\"U  c #659DAF\",\n\"Y  c #64A9B7\",\n\"T  c #66ADBA\",\n\"R  c #6BA2B6\",\n\"E  c #6CB0BD\",\n\"W  c #7FA8B7\",\n\"Q  c #74B2BF\",\n\"!  c #41BECC\",\n\"~  c #5EBEC6\",\n\"^  c #68B7C2\",\n\"/  c #73ACC4\",\n\"(  c #7BAFC5\",\n\")  c #43C1CE\",\n\"_  c #47C6D2\",\n\"`  c #4ACAD5\",\n\"'  c #5EC2C9\",\n\"]  c #52D4DD\",\n\"[  c #57DBE3\",\n\"{  c #6ACFD3\",\n\"}  c #61E7EC\",\n\"|  c #63EAEF\",\n\" . c #6BF5F7\",\n\".. c #80A7B2\",\n\"X. c #8FB1BC\",\n\"o. c #8DB5C9\",\n\"O. c #86B6D0\",\n\"+. c #88BAD2\",\n\"@. c #92B9CE\",\n\"#. c #9BBCCD\",\n\"$. c #91BDD6\",\n\"%. c #9CBDD2\",\n\"&. c #8AC1CA\",\n\"*. c #94C4CD\",\n\"=. c #93C7D0\",\n\"-. c #A9D3DC\",\n\";. c #B8CBD7\",\n\":. c #ADD9E1\",\n\">. c #B6CDE0\",\n\",. c #B7D0E4\",\n\"<. c #BDD3E9\",\n\"1. c #BADDE4\",\n\"2. c #BDE0E7\",\n\"3. c #BEE2E8\",\n\"4. c #C3D3DF\",\n\"5. c #D3DBDD\",\n\"6. c #C2D6EA\",\n\"7. c #C6D8EA\",\n\"8. c #CAD9E9\",\n\"9. c #D7DFE7\",\n\"0. c #D3DDE8\",\n\"q. c #C0E4EA\",\n\"w. c #C3E9EE\",\n\"e. c #C2EDF0\",\n\"r. c #C8EEF2\",\n\"t. c #C6F2F4\",\n\"y. c #CAF1F4\",\n\"u. c #DCE1E7\",\n\"i. c #D9E0E8\",\n\"p. c #E5E5E6\",\n/* pixels */\n\"p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.\",\n\"p.p.p.p.p.p.p.p.i.8.6.<.,.7.8.i.p.p.p.p.p.p.p.p.\",\n\"p.p.p.p.p.p.u.,.R a 1 , X 2 H +.<.9.p.p.p.p.p.p.\",\n\"p.p.p.p.p.8.U X e h v v v f 8 X 2 $.8.p.p.p.p.p.\",\n\"p.p.p.p.6.p y b b m b b v g g w 8 . L 7.p.p.p.p.\",\n\"p.p.p.8.s e b V ! ) C N v v k w w 0 . K 8.p.p.p.\",\n\"p.p.u.( < b C ` ] ] ] I E v v w w q 6 . +.9.p.p.\",\n\"p.p.6., h m ) ] } | ' 3.3.n v g w w 0 ; , 6.p.p.\",\n\"p.u./ - v N _ [  .{ t.y.w.n v f g q 0 6 . / u.p.\",\n\"p.0.x t v m ) ] ' 3.y.t.w.n v g w q 9 6 = a 0.p.\",\n\"p.6.< g v b V I 3.t.t.r.q.&.&.&.*.q 6 6 * - 8.p.\",\n\"p.6.X g v v P 3.t.t.r.3.2.2.2.2.1.Q 9 * &   6.p.\",\n\"p.<.- f g v =.3.q.q.2.2.2.2.2.2.2.Q 6 6 *   6.p.\",\n\"p.6., w f g c :.3.3.2.2.2.2.2.2.1./ 6 & % . 6.p.\",\n\"p.8.1 q w f g x -.3.2.2.2.E T T Y 6 : % % 1 0.p.\",\n\"p.9.F > q w f f x -.2.2.2.d q 6 6 * * % O F 9.p.\",\n\"p.p.@.- q q q q w u -.1.1.d 9 6 6 * & $ . %.p.p.\",\n\"p.p.0.4 6 9 0 0 0 0 y -.,.r 6 * & % $ O p 0.p.p.\",\n\"p.p.p.#.2 9 9 9 9 9 9 r G 6 * * % $ @ X >.p.p.p.\",\n\"p.p.p.p.J 3 & * * * * * * & % $ $ @ . o.p.p.p.p.\",\n\"p.p.p.p.p.D S : % & & % % $ $ @ O 1 %.p.p.p.p.p.\",\n\"p.p.p.p.p.p...4 S a % $ $ # 3 4 D 4.p.p.p.p.p.p.\",\n\"p.p.p.p.p.p.p.5.o.J 5 5 5 D ..;.p.p.p.p.p.p.p.p.\",\n\"p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.\"\n};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/filesave.xpm",
    "content": "/* XPM */\nstatic char *filesave1a[] = {\n/* width height ncolors chars_per_pixel */\n\"24 24 301 2\",\n/* colors */\n\"   c #7CA3B5\",\n\" . c #374F64\",\n\" X c #7898A7\",\n\" o c #2D4C64\",\n\" O c #B3815D\",\n\" + c #845646\",\n\" @ c #5C7F92\",\n\" # c #28465F\",\n\" $ c #27465E\",\n\" % c #79A3B5\",\n\" & c #03496C\",\n\" * c #899CA7\",\n\" = c #02476B\",\n\" - c #01476A\",\n\" ; c #044063\",\n\" : c #7B95A3\",\n\" > c #81949F\",\n\" , c #B6C9D3\",\n\" < c #085374\",\n\" 1 c #AF7F5C\",\n\" 2 c #7893A0\",\n\" 3 c #B4C7D1\",\n\" 4 c #7E929C\",\n\" 5 c #064F72\",\n\" 6 c #A16E41\",\n\" 7 c #A06C40\",\n\" 8 c #044D70\",\n\" 9 c #9F6C3F\",\n\" 0 c #B0C3CD\",\n\" q c #195E7E\",\n\" w c #AFC3CC\",\n\" e c #175C7C\",\n\" r c #6B8C9D\",\n\" t c #546376\",\n\" y c #96AEBA\",\n\" u c #ACBFC9\",\n\" i c #155A7A\",\n\" p c #135878\",\n\" a c #A9BDC6\",\n\" s c #0B597A\",\n\" d c #A9BBC6\",\n\" f c #205271\",\n\" g c #125677\",\n\" h c #034265\",\n\" j c #0A5779\",\n\" k c #095778\",\n\" l c #4E5D70\",\n\" z c #A6B9C3\",\n\" x c #304B63\",\n\" c c #7396A8\",\n\" v c #8FA6B3\",\n\" b c #4B5B6D\",\n\" n c #A4B7C1\",\n\" m c #0B5070\",\n\" M c #A0B3BD\",\n\" N c #0B5B7D\",\n\" B c #374E63\",\n\" V c #364C62\",\n\" C c #7E96A2\",\n\" Z c #B4825D\",\n\" A c #7795A5\",\n\" S c #2D4B63\",\n\" D c #92A5AF\",\n\" F c #2B4961\",\n\" G c #29475F\",\n\" H c #8EA1AB\",\n\" J c #27455D\",\n\" K c #86A0AD\",\n\" L c #9BAFBB\",\n\" P c #8A9DA7\",\n\" I c #98ADB8\",\n\" U c #014669\",\n\" Y c #8699A3\",\n\" T c #004468\",\n\" R c #8497A1\",\n\" E c #82959F\",\n\" W c #B1805D\",\n\" Q c #B0805C\",\n\" ! c #90A5B0\",\n\" ~ c #A47143\",\n\" ^ c #7E919B\",\n\" / c #A16D40\",\n\" ( c #044C6F\",\n\" ) c #7A8D97\",\n\" _ c #195D7D\",\n\" ` c #ADC0C9\",\n\" ' c #768993\",\n\" ] c #94ABB7\",\n\" [ c #0B5879\",\n\" { c #92A9B5\",\n\" } c #095677\",\n\" | c #085476\",\n\".  c #075275\",\n\".. c #AD7E5C\",\n\".X c #AC7C5B\",\n\".o c #6F91A3\",\n\".O c #1F415B\",\n\".+ c #0C5C7D\",\n\".@ c #0B5C7C\",\n\".# c #5F7486\",\n\".$ c #738593\",\n\".% c #708190\",\n\".& c #A4B8C3\",\n\".* c #7492A1\",\n\".= c #566A7D\",\n\".- c #7BA3B5\",\n\".; c #687988\",\n\".: c #526679\",\n\".> c #285874\",\n\"., c #3A677F\",\n\".< c #BCCFD7\",\n\".1 c #6C8699\",\n\".2 c #B9CBD4\",\n\".3 c #0A5374\",\n\".4 c #A57243\",\n\".5 c #3C748E\",\n\".6 c #A37041\",\n\".7 c #27465F\",\n\".8 c #305975\",\n\".9 c #77A3B4\",\n\".0 c #9BB0BD\",\n\".q c #044B6E\",\n\".w c #705047\",\n\".e c #03496D\",\n\".r c #819DAA\",\n\".t c #01476B\",\n\".y c #43778E\",\n\".u c #658295\",\n\".i c #085375\",\n\".p c #AE7F5C\",\n\".a c #075174\",\n\".s c #065173\",\n\".d c #8DA4AF\",\n\".f c #7A8C99\",\n\".g c #768895\",\n\".h c #1F405A\",\n\".j c #0C5B7C\",\n\".k c #0B597B\",\n\".l c #0A597A\",\n\".z c #A7BBC5\",\n\".x c #105676\",\n\".c c #095779\",\n\".v c #374C61\",\n\".b c #4A596D\",\n\".n c #73919F\",\n\".m c #718F9D\",\n\".M c #536579\",\n\".N c #7A99A9\",\n\".B c #95A9B3\",\n\".V c #A4B9C5\",\n\".C c #2E4D65\",\n\".Z c #A67343\",\n\".A c #B2805C\",\n\".S c #4A7187\",\n\".D c #335C77\",\n\".F c #9FB5C0\",\n\".G c #224863\",\n\".H c #28475F\",\n\".J c #8EA1AC\",\n\".K c #27455E\",\n\".L c #26455D\",\n\".P c #587C8E\",\n\".I c #839EAB\",\n\".U c #02486B\",\n\".Y c #293E56\",\n\".T c #01466A\",\n\".R c #8699A4\",\n\".E c #7F9AA7\",\n\".W c #729CAE\",\n\".Q c #8DAAB8\",\n\".! c #044163\",\n\".~ c #7D98A5\",\n\".^ c #8397A1\",\n\"./ c #93A7B4\",\n\".( c #AE7E5B\",\n\".) c #A26F42\",\n\"._ c #065072\",\n\".` c #B3C6D0\",\n\".' c #054E71\",\n\".] c #B1C4CE\",\n\".[ c #044C70\",\n\".{ c #9F6B3F\",\n\".} c #798D97\",\n\".| c #AEC2CB\",\n\"X  c #6C8D9E\",\n\"X. c #ACC0C9\",\n\"XX c #ABBEC8\",\n\"Xo c #145979\",\n\"XO c #516073\",\n\"X+ c #125777\",\n\"X@ c #505E72\",\n\"X# c #0A5879\",\n\"X$ c #728590\",\n\"X% c #095678\",\n\"X& c #40768D\",\n\"X* c #304A63\",\n\"X= c #7295A7\",\n\"X- c #889FAC\",\n\"X; c #9DB0BA\",\n\"X: c #0B5C7D\",\n\"X> c #99ACB6\",\n\"X, c #034568\",\n\"X< c #7A4C38\",\n\"X1 c #024367\",\n\"X2 c #4F768B\",\n\"X3 c #374D63\",\n\"X4 c #304E66\",\n\"X5 c #364D62\",\n\"X6 c #8DA7B4\",\n\"X7 c #2C4A62\",\n\"X8 c #7594A3\",\n\"X9 c #8BA5B2\",\n\"X0 c #91A4AE\",\n\"Xq c #576C7F\",\n\"Xw c #2A4860\",\n\"Xe c #89A3B0\",\n\"Xr c #28465E\",\n\"Xt c #9DB2BD\",\n\"Xy c #8DA0AA\",\n\"Xu c #8B9EA8\",\n\"Xi c #899CA6\",\n\"Xp c #879AA4\",\n\"Xa c #014569\",\n\"Xs c #213E57\",\n\"Xd c #004568\",\n\"Xf c #96AAB6\",\n\"Xg c #8598A2\",\n\"Xh c #45778E\",\n\"Xj c #8396A0\",\n\"Xk c #684A3D\",\n\"Xl c #B1815D\",\n\"Xz c #81949E\",\n\"Xx c #7F929C\",\n\"Xc c #A26E41\",\n\"Xv c #7192A2\",\n\"Xb c #7D909A\",\n\"Xn c #7B8E98\",\n\"Xm c #B0C3CC\",\n\"XM c #034B6E\",\n\"XN c #175C7B\",\n\"XB c #778A94\",\n\"XV c #155A79\",\n\"XC c #536174\",\n\"XZ c #FFFFFF\",\n\"XA c #41758D\",\n\"XS c #085376\",\n\"XD c #075375\",\n\"XF c #7194A5\",\n\"XG c #065174\",\n\"XH c #AD7D5C\",\n\"XJ c #9BB4C1\",\n\"XK c #8AA2AD\",\n\"XL c #7CA2B3\",\n\"XP c #6D8EA1\",\n\"XI c #97B0BD\",\n\"XU c #768896\",\n\"XY c #DDE0E4\",\n\"XT c #1D2A42\",\n\"XR c #0B5B7C\",\n\"XE c #7C9BA9\",\n\"XW c #91AAB7\",\n\"XQ c #3E758D\",\n\"X! c #8DA6B3\",\n\"X~ c #D5D8DC\",\n\"X^ c #6D7E8D\",\n\"X/ c #55697C\",\n\"X( c #7AA2B4\",\n\"X) c #28435D\",\n\"X_ c #53677A\",\n\"X` c #708D9D\",\n\"X' c #516578\",\n\"X] c #839CA9\",\n\"X[ c #4F6376\",\n\"X{ c #4D6174\",\n\"X} c #004467\",\n\"X| c #BACCD5\",\n\"o  c #B1805C\",\n\"o. c #B6C8D1\",\n\"oX c #034A6D\",\n\"oo c #02486C\",\n\"oO c #01466B\",\n\"o+ c #1F516E\",\n\"o@ c #095476\",\n\"o# c #075274\",\n\"o$ c #AE7E5C\",\n\"o% c #B2C6D0\",\n\"o& c #6E8FA1\",\n\"o* c #5F7B8F\",\n\"o= c #899FAB\",\n\"o- c #20415B\",\n\"o; c #95ADBA\",\n\"o: c #1F415A\",\n\"o> c #135979\",\n\"o, c #0B5A7B\",\n\"o< c #125778\",\n\"o1 c #185674\",\n\"o2 c #0A587A\",\n\"o3 c #41768F\",\n\"o4 c #2F4A63\",\n\"o5 c #A1B4BF\",\n\"o6 c None\",\n/* pixels */\n\"XZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZ\",\n\"XZ.+.+.@.+X:X: NXRXRXRXRXRXRXRXRXRXRXR.jo,o,.+XZ\",\n\".+XRo2 [X<.Z.4 ~ ~ ~.6.)Xc 6 6 / 7 9.{XkXM.q k.+\",\n\".+.,o*.3 + Z O.AXlo  W Q 1.po$.(XH...X.wo+.1 f s\",\n\".j.uX~ m.9.<.2 3 0 u d.&o5Xt L IXf./ !.5.8XY.D.l\",\n\"XRo1.> < %X|o..].Q cX=XFXv.oo&XPX  rX]XQX1.!X,.l\",\n\"XR |XDo@X( ,o%.|X2 G.H #.7 $.K.K.L.L @X&Xa T -.l\",\n\"o,. .aXS.-.` w u.V.F.0 y ] { v.dXKX-o=o3 U T -.l\",\n\"o,.s._o#XLXmX. a.So-o-o-.O.Oo:.h.h.h.P.y.T T -.l\",\n\".k 5.'o#   ` a zX6XE.N X AX8.*.n.mX` CXhoO T -.l\",\n\".l.' 8XG.WXJXIo;XWX!X9Xe K.I.r.E.~ : 2XA.T T -.l\",\n\".l (.q.[ q _ eXN iXVXoXoXoo> p po<X+ g.xXa T -.l\",\n\"o2XMoX &.U.t U T T T T T T T T T T T T T T T -.l\",\n\"X# &oo.U -Xa T T T T T T T T T T T T T T T T -o2\",\n\" j.U.t.TXa T T T T T T T T T T T T T T T T T -o2\",\n\".c.TXaXd T T h ; ; ; ; ; ; ; ; ; ;.! T T T T.to2\",\n\"X% T T T T TX).#Xq.M.:.=X/X_X'X[X{.Y T T T T.to2\",\n\"X% T T T T To4XX tXTXT.f.BX0XyXi R . T T T T =o2\",\n\"X% T T T T To4.zXCXTXTXU D H *XgXz B T T T T =o2\",\n\"X% T T T T To4 nXOXTXT.$.J P Y >XbX3 T T T T =o2\",\n\"X% T T T T T x MX@XTXT.%Xu.R E ^.}X5 T T T T =o2\",\n\"X# T T T T T xX; lXTXTX^XpXj 4 ) ' V T T T T.e.l\",\n\"o,.i T T T TX*X>.;.b b.g.^XxXnXBX$.vX} T T.e.l.+\",\n\"XZ.k jX%X%X%.GX4.C o SX7 FXw GXr JXs } k k.l.+XZ\"\n};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/forward.ppm",
    "content": "P6\n24 24\n255\nk<(v$v\"s*{Jһe&u#))(&#\u001f\u001dr){9&,01.,)&#\u001f\u001b\u001cm{X@&1;AB=4-)%!\u001d\u001a\u001blzS{\"}.<IQSLAd+'#\u001f\u001a\u0017\u001alz%u*4DSacXX($ \u001b\u0017\u0014|#us {,6GWkq]S$ \u001b\u0017\u0013\u0019l|s>$+3CR^aVM\u001f\u001b\u0017\u0012\u0014t9&w&*.:jЎ،׉Ն\u001a\u0016\u0012\u000fz\u001fq\u001es$(+/\u0015\u0011\f{\u0017iz\u001dr!%(+}㍾\u000f~\u000by\u0017jz!s\u001f\"%'{ƿ\u0011\r|\tw\u001bk{,w\u001c\u001e!#_̈ɈɆȼ\u0013\u000f~\u000bz\nt(tK\u001a\u001b\u001d\u001f !! &\u0013\u0010\r{\tv\u000enK撹 u\u0017\u0019\u001b\u001c\u001c\u001d\u001c\u001b\u0013\u0010\r|\nx\u0006s\u001ak{2x\u0014\u0015\u0017\u0017\u0018\u0018\u0018\u0018\u0012\u000f\r{\nx\u0007t\nn=曼+z\u0011\u0012\u0013\u0014\u0014\u0013\u0013D\u0010\u000e}\fz\tw\u0007s\u0007o!m}[0\u000e}\u000f~\u000f\u000f\u000f~\u000e}\r|\fz\nx\bu\u0006r\u0006o\u001fl{QG\u0015~\u000by\u000by\u000by\nx\tv\bu\u0006s\u0004p\u000fo,s性6yD0\fv\u0006r\u0005q\u000br)z-vSݏ^A><}P"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/forward.xpm",
    "content": "/* XPM */\nstatic char *forward[] = {\n/* columns rows colors chars-per-pixel */\n\"24 24 124 2\",\n\"   c #17697A\",\n\".  c #1B6B7A\",\n\"X  c #216D7D\",\n\"o  c #066F8C\",\n\"O  c #0C6E85\",\n\"+  c #0F6F89\",\n\"@  c #04708F\",\n\"#  c #0B728F\",\n\"$  c #067291\",\n\"%  c #097593\",\n\"&  c #0B7995\",\n\"*  c #0E7D99\",\n\"=  c #14748A\",\n\"-  c #1D7280\",\n\";  c #147C92\",\n\":  c #127E9B\",\n\">  c #1A7F94\",\n\",  c #237483\",\n\"<  c #217C8B\",\n\"1  c #2A7584\",\n\"2  c #2A7A8B\",\n\"3  c #297A92\",\n\"4  c #347886\",\n\"5  c #3D7E8D\",\n\"6  c #12829D\",\n\"7  c #1F8395\",\n\"8  c #1A8499\",\n\"9  c #1586A0\",\n\"0  c #1788A2\",\n\"q  c #1A8CA4\",\n\"w  c #1E91A9\",\n\"e  c #248595\",\n\"r  c #258A9B\",\n\"t  c #308095\",\n\"y  c #3B8293\",\n\"u  c #398499\",\n\"i  c #3E8A9D\",\n\"p  c #268FA3\",\n\"a  c #2195AB\",\n\"s  c #2398AE\",\n\"d  c #299AAC\",\n\"f  c #259BB0\",\n\"g  c #289EB2\",\n\"h  c #3086A1\",\n\"j  c #2AA1B5\",\n\"k  c #2EA5B9\",\n\"l  c #32ABBD\",\n\"z  c #36B0C1\",\n\"x  c #3AB6C6\",\n\"c  c #3CB8C7\",\n\"v  c #3DBAC8\",\n\"b  c #41808F\",\n\"n  c #408797\",\n\"m  c #45899D\",\n\"M  c #518A9A\",\n\"N  c #4B8CA0\",\n\"B  c #4497AA\",\n\"V  c #4A92A4\",\n\"C  c #5C91A0\",\n\"Z  c #539AB1\",\n\"A  c #589DB4\",\n\"S  c #5FB0BD\",\n\"D  c #659DAF\",\n\"F  c #6BA2B6\",\n\"G  c #7FA8B7\",\n\"H  c #41BDCB\",\n\"J  c #4DBBC5\",\n\"K  c #53BFC9\",\n\"L  c #58BCC7\",\n\"P  c #64B6C2\",\n\"I  c #73ACC4\",\n\"U  c #7BAFC5\",\n\"Y  c #7BBBC6\",\n\"T  c #7DBDC8\",\n\"R  c #43C1CE\",\n\"E  c #47C6D2\",\n\"W  c #4ACAD5\",\n\"Q  c #52D4DD\",\n\"!  c #56DAE2\",\n\"~  c #58DCE4\",\n\"^  c #5DE3E9\",\n\"/  c #6AC7D0\",\n\"(  c #61E7EC\",\n\")  c #63EAEF\",\n\"_  c #6BF5F7\",\n\"`  c #71FCFD\",\n\"'  c #80A7B2\",\n\"]  c #8FB1BC\",\n\"[  c #86BEC8\",\n\"{  c #8DB5C9\",\n\"}  c #8DBEC7\",\n\"|  c #86B6D0\",\n\" . c #88BAD2\",\n\".. c #92B9CE\",\n\"X. c #9BBCCD\",\n\"o. c #91BDD6\",\n\"O. c #9CBDD2\",\n\"+. c #83C5CE\",\n\"@. c #88C0CA\",\n\"#. c #89CED5\",\n\"$. c #8CD1D7\",\n\"%. c #8ED3D8\",\n\"&. c #AED5DD\",\n\"*. c #B8CBD7\",\n\"=. c #B3D7DF\",\n\"-. c #B6CDE0\",\n\";. c #B7D0E4\",\n\":. c #B4DAE2\",\n\">. c #BDD3E9\",\n\",. c #BADDE4\",\n\"<. c #BDE0E7\",\n\"1. c #BEE2E8\",\n\"2. c #C3D3DF\",\n\"3. c #D3DBDD\",\n\"4. c #C2D6EA\",\n\"5. c #C6D8EA\",\n\"6. c #CAD9E9\",\n\"7. c #D7DFE7\",\n\"8. c #D3DDE8\",\n\"9. c #C0E4EA\",\n\"0. c #C4E9EE\",\n\"q. c #DCE1E7\",\n\"w. c #D9E0E8\",\n\"e. c #E5E5E6\",\n/* pixels */\n\"e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.\",\n\"e.e.e.e.e.e.e.e.w.6.4.>.>.4.6.w.e.e.e.e.e.e.e.e.\",\n\"e.e.e.e.e.e.w.;.F y 1 , , 2 V  .>.8.e.e.e.e.e.e.\",\n\"e.e.e.e.e.6.D 1 e d j f d a 8 . 2 o.6.e.e.e.e.e.\",\n\"e.e.e.e.4.y e k k l k k j f s w 8 X A 5.e.e.e.e.\",\n\"e.e.e.6.i e k c R R v l j j s s q 0 . Z 6.e.e.e.\",\n\"e.e.q.U < k v W Q Q Q J S j j w w q 6 . | q.e.e.\",\n\"e.e.4., d l R Q ( ( Q E 1.<.j s a q 0 ; , 4.e.e.\",\n\"e.7.I > k z E ! _ ` ^ E 0.9.=.d w q 0 6 - I q.e.\",\n\"e.8.i r j l v Q ^ ( ~ J 0.9.9.=.w q 0 6 = u 8.e.\",\n\"e.4.1 s j k x / %.%.#.+.9.9.9.<.:.q 9 6 * - 5.e.\",\n\"e.>.- s g j l +.0.0.0.1.9.<.<.<.,.:.9 6 &   4.e.\",\n\"e.>.X w s g j T 9.9.9.9.<.<.<.,.,.,.} * &   4.e.\",\n\"e.4., w a s f T 9.<.<.1.<.<.<.,.,.&.6 & % . 4.e.\",\n\"e.6.2 q w a s S @.@.@.@.<.,.,.=.&.6 * & % 1 8.e.\",\n\"e.w.m 7 q w w a a a a r ,.,.9.=.6 * * % O M 7.e.\",\n\"e.e...- 0 q q w w w q 8 ,.,.:.6 * * % %   O.e.e.\",\n\"e.e.8.4 6 9 9 9 0 q 0 6 :.:.6 * * & % O 5 8.e.e.\",\n\"e.e.e.X.2 6 6 6 6 6 6 6 B * * & % $ o X -.e.e.e.\",\n\"e.e.e.e.C t * 6 * 6 * * & & & % $ o . { e.e.e.e.\",\n\"e.e.e.e.e.M m : & & & & % % @ o + 1 O.e.e.e.e.e.\",\n\"e.e.e.e.e.e.G 4 m u & $ @ # 3 1 M >.e.e.e.e.e.e.\",\n\"e.e.e.e.e.e.e.3.] C b 5 5 M G *.e.e.e.e.e.e.e.e.\",\n\"e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.\"\n};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/hand.ppm",
    "content": "P6\n24 24\n255\npVpɸ쓻TSX쓼WVZ씽c\\\\얿pggø呺ГӓӖՑ|okȸcQU^nq[SPVSPdLPU[ituk\\UQMIEXhOQT[`g`UZWURPuƸ쓼ZW[쓼UTX쓻QPW쒺NMU쐺JIRiTmø"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/hand.xpm",
    "content": "/* XPM */\nstatic char *hand[] = {\n/* columns rows colors chars-per-pixel */\n\"24 24 118 2\",\n\"   c #459BB5\",\n\".  c #4C9EB2\",\n\"X  c #509AB2\",\n\"o  c #509BB3\",\n\"O  c #529DB4\",\n\"+  c #529EB5\",\n\"@  c #539FB6\",\n\"#  c #549EB5\",\n\"$  c #589CB4\",\n\"%  c #4FA0B6\",\n\"&  c #49A0B9\",\n\"*  c #49A1B9\",\n\"=  c #4AA2BA\",\n\"-  c #4DA6BD\",\n\";  c #4EA7BE\",\n\":  c #50A3B7\",\n\">  c #55A0B7\",\n\",  c #51A5B8\",\n\"<  c #53A7BA\",\n\"1  c #55A2B8\",\n\"2  c #56A3B9\",\n\"3  c #57A3B9\",\n\"4  c #57A4BA\",\n\"5  c #54A8BB\",\n\"6  c #55A8BB\",\n\"7  c #58A5BB\",\n\"8  c #58A7BB\",\n\"9  c #5AA8BD\",\n\"0  c #5BA9BD\",\n\"q  c #5CAABF\",\n\"w  c #64A5BD\",\n\"e  c #63A8BE\",\n\"r  c #69A7BE\",\n\"t  c #50AAC0\",\n\"y  c #51ABC1\",\n\"u  c #53ADC3\",\n\"i  c #54AEC4\",\n\"p  c #55B0C5\",\n\"a  c #56B1C6\",\n\"s  c #57B2C7\",\n\"d  c #57B3C7\",\n\"f  c #5BB0C1\",\n\"g  c #5BB1C2\",\n\"h  c #5AB6CA\",\n\"j  c #5BB7CB\",\n\"k  c #5CB9CC\",\n\"l  c #5CB9CD\",\n\"z  c #5EBCCE\",\n\"x  c #68ABC2\",\n\"c  c #6DABC3\",\n\"v  c #60B7C7\",\n\"b  c #67B0C3\",\n\"n  c #6BB4C8\",\n\"m  c #60BFD1\",\n\"M  c #70ADC4\",\n\"N  c #75ACC6\",\n\"B  c #70B1C9\",\n\"V  c #63C1D3\",\n\"C  c #67C7D7\",\n\"Z  c #67C8D8\",\n\"A  c #69CADA\",\n\"S  c #6BCCDB\",\n\"D  c #6ED0DE\",\n\"F  c #6FD2DF\",\n\"G  c #70D3E1\",\n\"H  c #71D3E1\",\n\"J  c #74D8E5\",\n\"K  c #75D9E5\",\n\"L  c #7CE3ED\",\n\"P  c #7FE6EF\",\n\"I  c #90BAD0\",\n\"U  c #91BAD0\",\n\"Y  c #93BBD1\",\n\"T  c #92BAD2\",\n\"R  c #93BBD2\",\n\"E  c #93BCD3\",\n\"W  c #94BDD4\",\n\"Q  c #96BFD5\",\n\"!  c #91C2D6\",\n\"~  c #82EAF3\",\n\"^  c #ACCBE5\",\n\"/  c #AFCCE5\",\n\"(  c #BAD2EB\",\n\")  c #B8D2EC\",\n\"_  c #BDD3EA\",\n\"`  c #BCD4EB\",\n\"'  c #BED4EA\",\n\"]  c #BFD5EB\",\n\"[  c #BDD5EC\",\n\"{  c #C0D5EB\",\n\"}  c #C2D6EA\",\n\"|  c #C2D6EB\",\n\" . c #C3D7EA\",\n\".. c #C5D7E9\",\n\"X. c #C4D7EA\",\n\"o. c #C6D8EA\",\n\"O. c #C6D8EB\",\n\"+. c #C7D9EA\",\n\"@. c #C9D9EA\",\n\"#. c #CBDAE9\",\n\"$. c #CDDBE9\",\n\"%. c #CCDBEA\",\n\"&. c #CEDBE9\",\n\"*. c #D7DFE7\",\n\"=. c #D0DCE9\",\n\"-. c #D2DDE8\",\n\";. c #D4DEE8\",\n\":. c #D5DFE9\",\n\">. c #D7DFE8\",\n\",. c #DAE0E7\",\n\"<. c #DBE1E7\",\n\"1. c #DFE3E7\",\n\"2. c #D8E0E8\",\n\"3. c #DAE1E8\",\n\"4. c #E2E4E6\",\n\"5. c #E3E5E6\",\n\"6. c #E5E5E6\",\n\"7. c #E6E6E6\",\n/* pixels */\n\"7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.\",\n\"7.7.7.7.7.7.7.4.>.$.| _ _ | @.*.7.7.7.7.7.7.7.7.\",\n\"7.7.7.7.7.7.3.] ) ) ) ) ) ) ( ( ] *.7.7.7.7.7.7.\",\n\"7.7.7.7.7.@.) ) ) ) ) ) ) ) ) ) ) ) @.7.7.7.7.7.\",\n\"7.7.7.7...) ) ) ) ) ) ) ) ) ) ) ) ) ) ..7.7.7.7.\",\n\"7.7.7.@.) ) ) ) ) ) / N 1 n ) ) ) ) ) ) @.7.7.7.\",\n\"7.7.3.) ) ) ) ) ) ) R u u 7 ) ) ) ) ) ) ) 3.7.7.\",\n\"7.7.| ) ) ) ) ) ) ) W s i 0 ) ) ) ) ) ) ) | 7.7.\",\n\"7.<.) ) ) ) ) ) ) ) W V l q ) ) ) ) ) ) ) ) 1.7.\",\n\"7.$.) ) ) ) ) ) ) ) W F C b ) ) ) ) ) ) ) ) -.7.\",\n\"7. .) ) ) / E E E Q ! P D n ) ) ) ) ) ) ) ) @.7.\",\n\"7.] ) ) ) e y i z D P ~ H f < : 1 @ X w ) ) ..7.\",\n\"7.( ) ) ) . ; i j S K K S k i y - =   $ ) ) ..7.\",\n\"7.| ) ) ) b % , 5 q j Z V 5 0 4 1 @ X N ) )  .7.\",\n\"7.#.) ) ) ) ) ) ( ( W j i q ) ) ) ) ) ) ) ) $.7.\",\n\"7.2.) ) ) ) ) ) ) ) Q i i 6 ) ) ) ) ) ) ) ) <.7.\",\n\"7.7.( ) ) ) ) ) ) ) E ; ; 5 ) ) ) ) ) ) ) ] 7.7.\",\n\"7.7.2.) ) ) ) ) ) ) E - ; 1 ) ) ) ) ) ) ) -.7.7.\",\n\"7.7.7.| ) ) ) ) ) ) I = = O ( ) ) ) ) ( ..7.7.7.\",\n\"7.7.7.4.] ) ) ) ) ) ^ r # c ) ) ) ) ) ] 4.7.7.7.\",\n\"7.7.7.7.4. .) ) ) ) ) ) ) ) ) ) ) ) ] 4.7.7.7.7.\",\n\"7.7.7.7.7.7.-.( ) ) ) ) ) ) ) ( ( -.7.7.7.7.7.7.\",\n\"7.7.7.7.7.7.7.4.-.+.] ) ) (  .-.4.7.7.7.7.7.7.7.\",\n\"7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.\"\n};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/home.ppm",
    "content": "P6\n24 24\n255\np$\"hfsgsecVx\u001f#2Dy00usݳяjO־w\u001e!<Q=X5Lw/.usݳ$`Mw\u001e!<R>Y4Q/K#;w/.usݳڌ-s\u0018\u001a:O@[6R0L&B\"?!:w/.us䰆w\u001a\u001b<O>Xy\u001f'-56>,2!9\"? ;w/.ghx\u001e\u001d=O=Uh\u001d\u001fs11\u001e6\"? ;w/.s\u0019\u001c>R@[f!#n11!8\"?!:w/.Թu\u001b\u001e=RE^d !i//'?\"?#;w/.Թu\u001b\u001eAVJbh-/кf+*)A\"?#;w.-ؿw\u001d!DYKdg)+ſvo^XJʵe))+A\"?\u001d2l\u001e\u001d{--AUIa??mqqj٨Ԗ}ҙOD4ɻҔy43&9m\u000e\u0013̲漢GP@?p|~wnљݳԘ~eUkhϙn$\"ɥv41r}tcԗإӕ|cLyoϙzscҐՙюxaJyoϙzraΆЍ̈́q]Fyoϙzr`{́zjVByoϙzscptoaP<yoϙutfehcXI6ynϙp|~tdY]XN@.ynϙp|~scMPME7(ynΙn~D=P8P8P8O6O5a?keԓbleeeeeeeeNsy"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/home.xpm",
    "content": "/* XPM */\nstatic char *home[] = {\n/* columns rows colors chars-per-pixel */\n\"24 24 237 2\",\n\"   c #6D0E13\",\n\".  c #681D1F\",\n\"X  c #6C1E1D\",\n\"o  c #73181A\",\n\"O  c #73191C\",\n\"+  c #771A1B\",\n\"@  c #751B1E\",\n\"#  c #781E1D\",\n\"$  c #771D21\",\n\"%  c #771E21\",\n\"&  c #781F23\",\n\"*  c #791F27\",\n\"=  c #642021\",\n\"-  c #662123\",\n\";  c #652929\",\n\":  c #67292B\",\n\">  c #662B2A\",\n\",  c #6E2422\",\n\"<  c #682D2F\",\n\"1  c #692F2F\",\n\"2  c #6E3131\",\n\"3  c #702422\",\n\"4  c #772E2D\",\n\"5  c #772F2E\",\n\"6  c #7B2D2D\",\n\"7  c #7F2C32\",\n\"8  c #733131\",\n\"9  c #763431\",\n\"0  c #793030\",\n\"q  c #793433\",\n\"w  c #4E7379\",\n\"e  c #6D7171\",\n\"r  c #707C7E\",\n\"t  c #727D7F\",\n\"y  c #6E7E81\",\n\"u  c #628287\",\n\"i  c #658489\",\n\"p  c #6C8A8F\",\n\"a  c #758081\",\n\"s  c #7A8485\",\n\"d  c #7F989C\",\n\"f  c #981D32\",\n\"g  c #9B1E36\",\n\"h  c #882D35\",\n\"j  c #833F3F\",\n\"k  c #8D363E\",\n\"l  c #992139\",\n\"z  c #9B2138\",\n\"x  c #992639\",\n\"c  c #A2213A\",\n\"v  c #A3203B\",\n\"b  c #A2233B\",\n\"n  c #A0273F\",\n\"m  c #AB223F\",\n\"M  c #A12941\",\n\"N  c #A22B41\",\n\"B  c #AB2642\",\n\"V  c #A13244\",\n\"C  c #AD354C\",\n\"Z  c #AE3A4F\",\n\"A  c #AF3D52\",\n\"S  c #B32F4B\",\n\"D  c #B4304C\",\n\"F  c #B03C4F\",\n\"G  c #B13D4F\",\n\"H  c #B33451\",\n\"J  c #B63652\",\n\"K  c #B13C51\",\n\"L  c #B03E52\",\n\"P  c #B23C52\",\n\"I  c #B83D55\",\n\"U  c #B93E58\",\n\"Y  c #BC3D58\",\n\"T  c #BD3E59\",\n\"R  c #854434\",\n\"E  c #83403F\",\n\"W  c #81443D\",\n\"Q  c #8F4F35\",\n\"!  c #8F4F36\",\n\"~  c #905038\",\n\"^  c #9D613F\",\n\"/  c #9D4750\",\n\"(  c #92584A\",\n\")  c #986356\",\n\"_  c #976866\",\n\"`  c #9C6768\",\n\"'  c #9C6B65\",\n\"]  c #9A6B68\",\n\"[  c #9F7573\",\n\"{  c #B14155\",\n\"}  c #B34156\",\n\"|  c #B64459\",\n\" . c #BC405B\",\n\".. c #BE405B\",\n\"X. c #BD455E\",\n\"o. c #BD4961\",\n\"O. c #BF4A62\",\n\"+. c #A0604D\",\n\"@. c #A16A4F\",\n\"#. c #A46F5E\",\n\"$. c #A57260\",\n\"%. c #A57261\",\n\"&. c #A47363\",\n\"*. c #A57363\",\n\"=. c #A57365\",\n\"-. c #A57367\",\n\";. c #A57463\",\n\":. c #A47464\",\n\">. c #A47466\",\n\",. c #A7776E\",\n\"<. c #A7796E\",\n\"1. c #A7796F\",\n\"2. c #AC7F76\",\n\"3. c #C24B64\",\n\"4. c #B6846A\",\n\"5. c #DA8C2D\",\n\"6. c #EFAB24\",\n\"7. c #EFAC28\",\n\"8. c #F0AF2E\",\n\"9. c #F1B136\",\n\"0. c #F1B137\",\n\"q. c #F1B33C\",\n\"w. c #D2994F\",\n\"e. c #E8B255\",\n\"r. c #F1B540\",\n\"t. c #F2B542\",\n\"y. c #F2B645\",\n\"u. c #F2B746\",\n\"i. c #F1B849\",\n\"p. c #F1B94A\",\n\"a. c #F1B94C\",\n\"s. c #F2BA4D\",\n\"d. c #F2BA4E\",\n\"f. c #F2BA50\",\n\"g. c #F2BD56\",\n\"h. c #F3BD58\",\n\"j. c #F3BE59\",\n\"k. c #F3BF5D\",\n\"l. c #F3C061\",\n\"z. c #F4C263\",\n\"x. c #F4C265\",\n\"c. c #F4C368\",\n\"v. c #F4C46A\",\n\"b. c #F4C56F\",\n\"n. c #F5C670\",\n\"m. c #F5C671\",\n\"M. c #F5C774\",\n\"N. c #F5C878\",\n\"B. c #F5C97A\",\n\"V. c #F5C97B\",\n\"C. c #F6C97C\",\n\"Z. c #F6CA7D\",\n\"A. c #F6CA7E\",\n\"S. c #8D8382\",\n\"D. c #918483\",\n\"F. c #988B8A\",\n\"G. c #9D8F8E\",\n\"H. c #949293\",\n\"J. c #93A0A2\",\n\"K. c #99A3A4\",\n\"L. c #A59897\",\n\"P. c #B99488\",\n\"I. c #B49C9B\",\n\"U. c gray63\",\n\"Y. c #A2A2A2\",\n\"T. c gray68\",\n\"R. c #BCA2A2\",\n\"E. c #BFACAB\",\n\"W. c #B1B1B1\",\n\"Q. c gray70\",\n\"!. c #B5B0B0\",\n\"~. c gray71\",\n\"^. c #BAB5B5\",\n\"/. c gray74\",\n\"(. c gray\",\n\"). c #C9A5AA\",\n\"_. c #C1BCBC\",\n\"`. c #CCB2B4\",\n\"'. c #C9BBBA\",\n\"]. c #D4B9BD\",\n\"[. c #E4B086\",\n\"{. c #D6BEC1\",\n\"}. c #D8BFC3\",\n\"|. c #F7CC81\",\n\" X c #F7CD84\",\n\".X c #F7CE86\",\n\"XX c #F8D08D\",\n\"oX c #F8D18E\",\n\"OX c #F8D18F\",\n\"+X c #F6D199\",\n\"@X c #F8D290\",\n\"#X c #F9D395\",\n\"$X c #F9D496\",\n\"%X c #F9D497\",\n\"&X c #F9D498\",\n\"*X c #F9D599\",\n\"=X c #FAD8A5\",\n\"-X c #FAD9A8\",\n\";X c #FBDDB3\",\n\":X c #C6C1C1\",\n\">X c gray77\",\n\",X c #C5C5C5\",\n\"<X c #C9C1C1\",\n\"1X c #CACACA\",\n\"2X c #CDCDCD\",\n\"3X c #CECECE\",\n\"4X c gray81\",\n\"5X c #D2C7C6\",\n\"6X c #D6C2C5\",\n\"7X c #D4CAC9\",\n\"8X c #D7CDCD\",\n\"9X c #D9C2C6\",\n\"0X c #D8C7C9\",\n\"qX c #D0D0D0\",\n\"wX c #D2D2D2\",\n\"eX c LightGray\",\n\"rX c gray83\",\n\"tX c gray84\",\n\"yX c #D7D7D7\",\n\"uX c #D8D8D8\",\n\"iX c gainsboro\",\n\"pX c #DDDDDD\",\n\"aX c #DFDFDF\",\n\"sX c #E3E0E0\",\n\"dX c gray89\",\n\"fX c #E6E6E6\",\n\"gX c #ECECEC\",\n\"hX c gray93\",\n\"jX c #EEEEEE\",\n\"kX c gray94\",\n\"lX c #F1F1F1\",\n\"zX c #F3F3F3\",\n\"xX c #F4F4F4\",\n\"cX c #F6F6F6\",\n\"vX c #F9F9F9\",\n\"bX c #FEFEFE\",\n\"nX c gray100\",\n/* pixels */\n\"fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX\",\n\"fXfXfXfXfXfXfXfXfXfXfX0X3 5XfXfXfXfXfXfXfXfXfXfX\",\n\"fXfXfXfXfX_ =.=.) fX6X% V 0 7XfXfXfXfXfXfXfXfXfX\",\n\"fXfXfXfXfX[ ;XOX@.{.% P T C 5 7XfXfXfXfXfXfXfXfX\",\n\"fXfXfXfXfX[ ;X6.( % A Y H S b 5 7XfXfXfXfXfXfXfX\",\n\"fXfXfXfXfX[ ;X5.+ A T H D B B c 5 5XfXfXfXfXfXfX\",\n\"fXfXfXfXfX[ [.+ P T * h k 5 g B v 5 5XfXfXfXfXfX\",\n\"fXfXfXfXfX` # G I . L.iXdX{.8 g m v 5 7XfXfXfXfX\",\n\"fXfXfXfX6XO P T - G.>XzXgXpX>X2 z m c 5 7XfXfXfX\",\n\"fXfXfX].@ A X.= F.(.tXbXxXfXtX(.1 n m c 5 7XfXfX\",\n\"fXfX].@ } O.< S.~.2XbXbXcXjXaX4X~.> M B c 5 5XfX\",\n\"fX9X% | 3.: S.T.,X).4.' ( P.sXuX1X!.; N B f X fX\",\n\"fX6 { o.j e W.(.I.4.-X$XZ.w.R '.eXwXH.q x   `.fX\",\n\"fXR./ j 5Xt U.jX,.+X;X&XZ.x.e.] kX4XK.8X, ).fXfX\",\n\"fXfX9 5XfXt U.nX&.$X=X#XZ.z.a.1.xX4XK.fXfXfXfXfX\",\n\"fXfXfXfXfXs U.nX*.@X&XOXN.l.p.1.xX4XK.fXfXfXfXfX\",\n\"fXfXfXfXfXs U.nX*..XOX|.M.j.u.2.lX3XK.fXfXfXfXfX\",\n\"fXfXfXfXfXs U.nX$.C.A.C.v.g.t.<.zX3XK.fXfXfXfXfX\",\n\"fXfXfXfXfXs U.nX&.m.M.b.z.d.q.<.zX3XK.fXfXfXfXfX\",\n\"fXfXfXfXfXa U.nX:.x.c.z.g.p.0.<.zX3XK.fXfXfXfXfX\",\n\"fXfXfXfXfXt U.nX:.j.k.j.a.r.7.1.xX8XK.fXfXfXfXfX\",\n\"fXfXfXfXfXt U.nX&.a.f.d.u.q.7.1.xX3XK.fXfXfXfXfX\",\n\"fXfXfXfXfXy Q.vXW ~ ~ ~ ! ! ^ ' kXeXJ.fXfXfXfXfX\",\n\"fXfXfXfXfXu d d d p i i i i i i i i w fXfXfXfXfX\"\n};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/move.ppm",
    "content": "P6\n24 24\n255\n[y)pd榽W\u000e^~-qh\u0015b\u000e^~\u000e^~={-r\u001dh\u0011`\u000e^~\u0011`\u001ae$l5w\u000e^~)o:y\u000e^~)oD\u000e^~)o\"kD\u000e^~)o$m摰%l\u0013ammmmm#k\u000f^\u001ehmtzzz\u0014a/sM\u0017d\u000e^~\u000e^~\u000e^~\u000e^~\u000e^~\u000e^~\u000e^~\u000e^~\u0014b\u000e^~\u000e^~\u000e^~\u000e^~\u000e^~\u000e^~\u000e^~\u000e^~\u001ceXcV\u0018e\u000e^~\u000e^~\u000e^~\u000e^~\u000e^~\u000e^~\u000e^~\u000e^~\u0014b\u000e^~\u000e^~\u000e^~\u000e^~\u000e^~\u000e^~\u000e^~\u000e^~\u0011`Kdn9y\u0010`_____\u001af\u000e_~\u001bfmf___\u0013a(n_+p5w\u000e^~)o,q5w\u000e^~)o5w\u000e^~)o5w\u000e^~)o,q\u001cg\u0011`\u000e^~\u000f_\u0014b$lZ\u000e^~\u000e^~\u000e^~D榽H\u000e^~-qu(ndY"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/move.xpm",
    "content": "/* XPM */\nstatic char *move[] = {\n/* columns rows colors chars-per-pixel */\n\"24 24 26 1\",\n\"  c black\",\n\". c #0B5D7D\",\n\"X c #0B5D7E\",\n\"o c #0B5E7D\",\n\"O c #0D5979\",\n\"+ c #0D5B7D\",\n\"@ c #0C5C7C\",\n\"# c #0C5C7D\",\n\"$ c #0C5D7D\",\n\"% c #0D5C7D\",\n\"& c #0D5D7D\",\n\"* c #0C5C7E\",\n\"= c #0C5D7E\",\n\"- c #0D5C7E\",\n\"; c #0D5D7E\",\n\": c #0C5E7D\",\n\"> c #0C5E7E\",\n\", c #0D5E7E\",\n\"< c #0E5C7E\",\n\"1 c #0E5C7F\",\n\"2 c #004080\",\n\"3 c #095B80\",\n\"4 c #0D5D80\",\n\"5 c #0E5C80\",\n\"6 c #006080\",\n\"7 c None\",\n/* pixels */\n\"777777777777777777777777\",\n\"77777777772o677777777777\",\n\"7777777777<<o77777777777\",\n\"777777777<oo<<7777777777\",\n\"77777777X<o<o<1777777777\",\n\"77777777X@oo<oo277777777\",\n\"7777777777oo<77777777777\",\n\"7777777777<o<77777777777\",\n\"7777777777@o<77777777777\",\n\"777o<77777<o@77777,<7777\",\n\"77<@o<<<<o<o<<<o,@@,6777\",\n\"2oo<ooo<o<o<ooo<@:<@<<o7\",\n\"<<oo<ooo<oo@ooo<<<<,o<*7\",\n\"7oo<o,<,<<o<<<@o6*,<<<77\",\n\"777o<77777oo<77777**7777\",\n\"7777777777oo<77777777777\",\n\"7777777777o@<77777777777\",\n\"7777777777oo<77777777777\",\n\"77777777ooo<ooo277777777\",\n\"77777777X<oo<oO777777777\",\n\"777777777<<o<<7777777777\",\n\"7777777777o<o77777777777\",\n\"77777777772<677777777777\",\n\"777777777777777777777777\"\n};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/stock_close.xpm",
    "content": "/* XPM */\nstatic char * stock_close_xpm[] = {\n\"16 16 2 1\",\n\" \tg None\",\n\".\tg #000000\",\n\"                \",\n\"                \",\n\"   .      .     \",\n\"    .    ...    \",\n\"    ..  ....    \",\n\"     .. ...     \",\n\"     .....      \",\n\"      ...       \",\n\"     .....      \",\n\"    .......     \",\n\"   ...  ....    \",\n\"  ...    ....   \",\n\" ...      ..    \",\n\"                \",\n\"                \",\n\"                \"};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/stock_down.xpm",
    "content": "/* XPM */\nstatic char * stock_down_xpm[] = {\n\"16 16 25 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"+\tc #B5C9DC\",\n\"@\tc #9BB6D0\",\n\"#\tc #91B0CC\",\n\"$\tc #49749C\",\n\"%\tc #456F96\",\n\"&\tc #AFC5DA\",\n\"*\tc #A0BAD3\",\n\"=\tc #9EB8D1\",\n\"-\tc #3F6588\",\n\";\tc #375978\",\n\">\tc #B2C7DB\",\n\",\tc #9CB7D1\",\n\"'\tc #9AB5CF\",\n\")\tc #B6CADD\",\n\"!\tc #5B88B2\",\n\"~\tc #A4BDD5\",\n\"{\tc #2A435B\",\n\"]\tc #5080AD\",\n\"^\tc #97B3CE\",\n\"/\tc #080D11\",\n\"(\tc #5F8BB4\",\n\"_\tc #95B2CE\",\n\":\tc #4C79A3\",\n\"                \",\n\"                \",\n\"    .......     \",\n\"    .+@#$%.     \",\n\"    .&*=-;.     \",\n\"    .>,'-;.     \",\n\"    .),'-;.     \",\n\"    .)@@-;.     \",\n\" ....)',-;....  \",\n\"  .!=~*,---{.   \",\n\"   .],,,--{.    \",\n\"    .]^*-{.     \",\n\"     /(_{.      \",\n\"      .:.       \",\n\"       .        \",\n\"                \"};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/stock_left.xpm",
    "content": "/* XPM */\nstatic char * stock_left_xpm[] = {\n\"16 16 26 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"+\tc #C4D4E3\",\n\"@\tc #A3BCD4\",\n\"#\tc #A6BED5\",\n\"$\tc #AAC1D7\",\n\"%\tc #ABC2D8\",\n\"&\tc #AFC5DA\",\n\"*\tc #AEC4D9\",\n\"=\tc #6892B9\",\n\"-\tc #9CB7D1\",\n\";\tc #A4BDD5\",\n\">\tc #9FB9D2\",\n\",\tc #9BB6D0\",\n\"'\tc #9AB5CF\",\n\")\tc #49759E\",\n\"!\tc #1C2D3D\",\n\"~\tc #C5D5E4\",\n\"{\tc #A0BAD3\",\n\"]\tc #9EB8D1\",\n\"^\tc #4B78A2\",\n\"/\tc #2A435B\",\n\"(\tc #3F6588\",\n\"_\tc #34536F\",\n\":\tc #29425A\",\n\"<\tc #2D4760\",\n\"                \",\n\"       .        \",\n\"      ..        \",\n\"     .+.        \",\n\"    .+@.......  \",\n\"   .+#$%&%*@=.  \",\n\"  .+-;@>,,>').  \",\n\" !~>{]]->>>>^.  \",\n\"  ./((((((((_.  \",\n\"   ./((:::::<.  \",\n\"    ./(.......  \",\n\"     ./.        \",\n\"      ..        \",\n\"       .        \",\n\"                \",\n\"                \"};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/stock_refresh.xpm",
    "content": "/* XPM */\nstatic char * stock_refresh_xpm[] = {\n\"16 16 16 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"+\tc #8FA8BE\",\n\"@\tc #D5DEE6\",\n\"#\tc #BBCBD8\",\n\"$\tc #A6BACB\",\n\"%\tc #A2B7C9\",\n\"&\tc #83A0B8\",\n\"*\tc #7393AE\",\n\"=\tc #4F6F8A\",\n\"-\tc #48667F\",\n\";\tc #92ABC0\",\n\">\tc #33485A\",\n\",\tc #22303B\",\n\"'\tc #7897B1\",\n\")\tc #4B6A84\",\n\"                \",\n\"     .          \",\n\"   ..+.         \",\n\"  .@#$%.        \",\n\" .&*==-.        \",\n\" .;>.,.         \",\n\" .'. .     .    \",\n\" .).       ..   \",\n\"  ..       .@.  \",\n\"   .     . .=.  \",\n\"        .@.>=.  \",\n\"       .@===>.  \",\n\"       .'=>>.   \",\n\"        .'..    \",\n\"         .      \",\n\"                \"};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/stock_right.xpm",
    "content": "/* XPM */\nstatic char * stock_right_xpm[] = {\n\"16 16 25 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"+\tc #5B88B2\",\n\"@\tc #9EB8D1\",\n\"#\tc #5080AD\",\n\"$\tc #B5C9DC\",\n\"%\tc #AFC5DA\",\n\"&\tc #B2C7DB\",\n\"*\tc #B6CADD\",\n\"=\tc #A4BDD5\",\n\"-\tc #9CB7D1\",\n\";\tc #080D11\",\n\">\tc #9BB6D0\",\n\",\tc #A0BAD3\",\n\"'\tc #9AB5CF\",\n\")\tc #97B3CE\",\n\"!\tc #5F8BB4\",\n\"~\tc #91B0CC\",\n\"{\tc #95B2CE\",\n\"]\tc #4C79A3\",\n\"^\tc #49749C\",\n\"/\tc #3F6588\",\n\"(\tc #2A435B\",\n\"_\tc #456F96\",\n\":\tc #375978\",\n\"                \",\n\"        .       \",\n\"        ..      \",\n\"        .+.     \",\n\"  .......@#.    \",\n\"  .$%&***=-#;   \",\n\"  .>,-->',-)!.  \",\n\"  .~@''>---,{]. \",\n\"  .^////////(.  \",\n\"  ._::::://(.   \",\n\"  ......./(.    \",\n\"        .(.     \",\n\"        ..      \",\n\"        .       \",\n\"                \",\n\"                \"};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/stock_save_as.xpm",
    "content": "/* XPM */\nstatic char * stock_save_as_xpm[] = {\n\"16 16 111 2\",\n\"  \tc None\",\n\". \tc #000000\",\n\"+ \tc #F7F8FA\",\n\"@ \tc #CBDDEB\",\n\"# \tc #C88A80\",\n\"$ \tc #D18F84\",\n\"% \tc #CF8D82\",\n\"& \tc #A49626\",\n\"* \tc #634A1E\",\n\"= \tc #A8BBCC\",\n\"- \tc #BFD5E8\",\n\"; \tc #DBE7F1\",\n\"> \tc #8DA9BE\",\n\", \tc #B7877E\",\n\"' \tc #C77568\",\n\") \tc #C77467\",\n\"! \tc #C57366\",\n\"~ \tc #FCEB3D\",\n\"{ \tc #F7B544\",\n\"] \tc #61522E\",\n\"^ \tc #72899A\",\n\"/ \tc #54697C\",\n\"( \tc #CFE0ED\",\n\"_ \tc #D7D7D7\",\n\": \tc #FEFEFE\",\n\"< \tc #FCFCFC\",\n\"[ \tc #F9DF39\",\n\"} \tc #F7B545\",\n\"| \tc #6C5F34\",\n\"1 \tc #B4B4B4\",\n\"2 \tc #84A0B5\",\n\"3 \tc #4F6475\",\n\"4 \tc #D6D6D6\",\n\"5 \tc #F8D837\",\n\"6 \tc #EFB44D\",\n\"7 \tc #584D2B\",\n\"8 \tc #8F8F8F\",\n\"9 \tc #F1F1F1\",\n\"0 \tc #819AAE\",\n\"a \tc #496072\",\n\"b \tc #FDFDFD\",\n\"c \tc #F6D236\",\n\"d \tc #EDA43E\",\n\"e \tc #584E2B\",\n\"f \tc #AAAAAA\",\n\"g \tc #D3D3D3\",\n\"h \tc #485F71\",\n\"i \tc #D5D5D5\",\n\"j \tc #D7AE74\",\n\"k \tc #61562F\",\n\"l \tc #737373\",\n\"m \tc #C5C5C5\",\n\"n \tc #B0B0B0\",\n\"o \tc #7F98AC\",\n\"p \tc #EDEDED\",\n\"q \tc #4F4115\",\n\"r \tc #8D8D8D\",\n\"s \tc #EBEBEB\",\n\"t \tc #ECECEC\",\n\"u \tc #ACBDCB\",\n\"v \tc #6F767D\",\n\"w \tc #9AA3AC\",\n\"x \tc #BFCBD6\",\n\"y \tc #BDC9D4\",\n\"z \tc #A1B6C4\",\n\"A \tc #8BA7BC\",\n\"B \tc #809CB0\",\n\"C \tc #6C8394\",\n\"D \tc #7D97AB\",\n\"E \tc #7D97AC\",\n\"F \tc #A4ACB8\",\n\"G \tc #B9B9B9\",\n\"H \tc #C7C7C7\",\n\"I \tc #E1E1E1\",\n\"J \tc #D4D4D4\",\n\"K \tc #9C9D9D\",\n\"L \tc #2F4656\",\n\"M \tc #80868C\",\n\"N \tc #183042\",\n\"O \tc #33495A\",\n\"P \tc #132D3C\",\n\"Q \tc #586D80\",\n\"R \tc #97A5B0\",\n\"S \tc #86A4B9\",\n\"T \tc #CDCDCD\",\n\"U \tc #2E4353\",\n\"V \tc #5A7082\",\n\"W \tc #BFBFBF\",\n\"X \tc #112835\",\n\"Y \tc #9DA9B0\",\n\"Z \tc #6B7882\",\n\"` \tc #829DB1\",\n\" .\tc #CBCBCB\",\n\"..\tc #E5E5E5\",\n\"+.\tc #213648\",\n\"@.\tc #5F7989\",\n\"#.\tc #C2C2C2\",\n\"$.\tc #B2B2B2\",\n\"%.\tc #112C3A\",\n\"&.\tc #9FA9B0\",\n\"*.\tc #59636D\",\n\"=.\tc #A1A1A1\",\n\"-.\tc #C0C0C0\",\n\";.\tc #909090\",\n\">.\tc #868686\",\n\",.\tc #6E6E6E\",\n\"'.\tc #7A7A7A\",\n\").\tc #2D3949\",\n\"!.\tc #3E4F5C\",\n\"~.\tc #80878F\",\n\"{.\tc #1A3140\",\n\"  . . . . . . . . . . . . . .   \",\n\". + @ # $ $ $ $ % . & * . = - . \",\n\". ; > , ' ) ) ! . ~ { ] . ^ / . \",\n\". ( > _ : : < . [ } | . 1 2 3 . \",\n\". ( > _ _ 4 . 5 6 7 . 8 9 0 a . \",\n\". ( > _ b . c d e . f g 9 0 h . \",\n\". ( > _ i . j k . l m n 9 o a . \",\n\". ( > p . q . . r g s s t 0 a . \",\n\". ( > u . . v w x x x y z 0 a . \",\n\". ( > A B C 0 0 0 0 D E 0 0 a . \",\n\". ( > A F G G H I J K L M 0 a . \",\n\". ( > 2 m m N O i m G P Q R a . \",\n\". ( S 0 m T U V m m W X V Y a . \",\n\". Z ` o  ...+.@.m #.$.%.V &.a . \",\n\". . *.3 =.-.;.;.>.,.'.).!.~.{.. \",\n\"  . . . . . . . . . . . . . .   \"};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/stock_up.xpm",
    "content": "/* XPM */\nstatic char * stock_up_xpm[] = {\n\"16 16 26 1\",\n\" \tc None\",\n\".\tc #1C2D3D\",\n\"+\tc #000000\",\n\"@\tc #C5D5E4\",\n\"#\tc #C4D4E3\",\n\"$\tc #9FB9D2\",\n\"%\tc #2A435B\",\n\"&\tc #9CB7D1\",\n\"*\tc #A0BAD3\",\n\"=\tc #3F6588\",\n\"-\tc #A6BED5\",\n\";\tc #A4BDD5\",\n\">\tc #9EB8D1\",\n\",\tc #A3BCD4\",\n\"'\tc #AAC1D7\",\n\")\tc #ABC2D8\",\n\"!\tc #29425A\",\n\"~\tc #AFC5DA\",\n\"{\tc #9BB6D0\",\n\"]\tc #AEC4D9\",\n\"^\tc #9AB5CF\",\n\"/\tc #6892B9\",\n\"(\tc #49759E\",\n\"_\tc #4B78A2\",\n\":\tc #34536F\",\n\"<\tc #2D4760\",\n\"                \",\n\"       .        \",\n\"      +@+       \",\n\"     +#$%+      \",\n\"    +#&*=%+     \",\n\"   +#-;>==%+    \",\n\"  +#,',>===%+   \",\n\" ++++)$&=!++++  \",\n\"    +~{$=!+     \",\n\"    +){$=!+     \",\n\"    +]$$=!+     \",\n\"    +,^$=!+     \",\n\"    +/(_:<+     \",\n\"    +++++++     \",\n\"                \",\n\"                \"};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/stock_zoom-in.xpm",
    "content": "/* XPM */\nstatic char * stock_zoom_in_xpm[] = {\n\"16 16 42 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"+\tc #262626\",\n\"@\tc #C5C5C5\",\n\"#\tc #EEEEEE\",\n\"$\tc #EDEDED\",\n\"%\tc #ABABAB\",\n\"&\tc #464646\",\n\"*\tc #878787\",\n\"=\tc #F1F1F1\",\n\"-\tc #FEFEFE\",\n\";\tc #FDFDFD\",\n\">\tc #FCFCFC\",\n\",\tc #EAEAEA\",\n\"'\tc #707070\",\n\")\tc #252525\",\n\"!\tc #282828\",\n\"~\tc #FBFBFB\",\n\"{\tc #E8E8E8\",\n\"]\tc #B0B0B0\",\n\"^\tc #FFFFFF\",\n\"/\tc #050505\",\n\"(\tc #040404\",\n\"_\tc #FAFAFA\",\n\":\tc #A4A4A4\",\n\"<\tc #090909\",\n\"[\tc #242424\",\n\"}\tc #E5E5E5\",\n\"|\tc #E4E4E4\",\n\"1\tc #F9F9F9\",\n\"2\tc #BABABA\",\n\"3\tc #E7E7E7\",\n\"4\tc #858585\",\n\"5\tc #E3E3E3\",\n\"6\tc #6D6D6D\",\n\"7\tc #A1A1A1\",\n\"8\tc #202020\",\n\"9\tc #686868\",\n\"0\tc #343434\",\n\"a\tc #797979\",\n\"b\tc #3A3A3A\",\n\"c\tc #1F1F1F\",\n\"    ....        \",\n\"  .+@#$%&.      \",\n\" .*=--;>,'.     \",\n\" &=--)!;~{&     \",\n\".]--^/(;>_:.    \",\n\".#-//<(([_}.    \",\n\".$;[(../[_|.    \",\n\".%>;;((~_12.    \",\n\" &,~><)_13&     \",\n\" .4{___156.     \",\n\"  .&:}|7&....   \",\n\"    ....  88..  \",\n\"          .90.. \",\n\"           .ab..\",\n\"            .9c.\",\n\"             .. \"};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/stock_zoom-out.xpm",
    "content": "/* XPM */\nstatic char * stock_zoom_out_xpm[] = {\n\"16 16 40 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"+\tc #262626\",\n\"@\tc #C5C5C5\",\n\"#\tc #EEEEEE\",\n\"$\tc #EDEDED\",\n\"%\tc #ABABAB\",\n\"&\tc #464646\",\n\"*\tc #878787\",\n\"=\tc #F1F1F1\",\n\"-\tc #FEFEFE\",\n\";\tc #FDFDFD\",\n\">\tc #FCFCFC\",\n\",\tc #EAEAEA\",\n\"'\tc #707070\",\n\")\tc #FBFBFB\",\n\"!\tc #E8E8E8\",\n\"~\tc #B0B0B0\",\n\"{\tc #FFFFFF\",\n\"]\tc #FAFAFA\",\n\"^\tc #A4A4A4\",\n\"/\tc #050505\",\n\"(\tc #090909\",\n\"_\tc #040404\",\n\":\tc #242424\",\n\"<\tc #E5E5E5\",\n\"[\tc #E4E4E4\",\n\"}\tc #F9F9F9\",\n\"|\tc #BABABA\",\n\"1\tc #E7E7E7\",\n\"2\tc #858585\",\n\"3\tc #E3E3E3\",\n\"4\tc #6D6D6D\",\n\"5\tc #A1A1A1\",\n\"6\tc #202020\",\n\"7\tc #686868\",\n\"8\tc #343434\",\n\"9\tc #797979\",\n\"0\tc #3A3A3A\",\n\"a\tc #1F1F1F\",\n\"    ....        \",\n\"  .+@#$%&.      \",\n\" .*=--;>,'.     \",\n\" &=----;)!&     \",\n\".~--{--;>]^.    \",\n\".#-//(__:]<.    \",\n\".$;:_../:][.    \",\n\".%>;;;>)]}|.    \",\n\" &,)>))]}1&     \",\n\" .2!]]]}34.     \",\n\"  .&^<[5&....   \",\n\"    ....  66..  \",\n\"          .78.. \",\n\"           .90..\",\n\"            .7a.\",\n\"             .. \"};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/subplots.xpm",
    "content": "/* XPM */\nstatic char * subplots_xpm[] = {\n\"24 24 218 2\",\n\"  \tc None\",\n\". \tc #000000\",\n\"+ \tc #2C2C2C\",\n\"@ \tc #3B3B3B\",\n\"# \tc #004300\",\n\"$ \tc #007300\",\n\"% \tc #F2F2F2\",\n\"& \tc #F4F4F4\",\n\"* \tc #F3F3F3\",\n\"= \tc #F1F1F1\",\n\"- \tc #A9A9A9\",\n\"; \tc #3C583C\",\n\"> \tc #48D848\",\n\", \tc #58DC58\",\n\"' \tc #479447\",\n\") \tc #6F6F6F\",\n\"! \tc #ECECEC\",\n\"~ \tc #D8D8D8\",\n\"{ \tc #858585\",\n\"] \tc #3A3A3A\",\n\"^ \tc #CFCFCF\",\n\"/ \tc #B7B7B7\",\n\"( \tc #B9B9B9\",\n\"_ \tc #374037\",\n\": \tc #3AC13A\",\n\"< \tc #62D562\",\n\"[ \tc #79DA79\",\n\"} \tc #5FD45F\",\n\"| \tc #2F5E2F\",\n\"1 \tc #BBBBBB\",\n\"2 \tc #C2C2C2\",\n\"3 \tc #C5C5C5\",\n\"4 \tc #161616\",\n\"5 \tc #393939\",\n\"6 \tc #CDCDCD\",\n\"7 \tc #A5A5A5\",\n\"8 \tc #808080\",\n\"9 \tc #383838\",\n\"0 \tc #202020\",\n\"a \tc #686868\",\n\"b \tc #D9D9D9\",\n\"c \tc #CACACA\",\n\"d \tc #A0A0A0\",\n\"e \tc #6686A5\",\n\"f \tc #518FCC\",\n\"g \tc #5694CF\",\n\"h \tc #5B98D1\",\n\"i \tc #609DD4\",\n\"j \tc #65A1D6\",\n\"k \tc #6AA6D9\",\n\"l \tc #6FAADB\",\n\"m \tc #75AFDE\",\n\"n \tc #7AB3E1\",\n\"o \tc #7FB8E3\",\n\"p \tc #91C3E8\",\n\"q \tc #A3CEED\",\n\"r \tc #CFE6F6\",\n\"s \tc #373737\",\n\"t \tc #C8C8C8\",\n\"u \tc #6888A6\",\n\"v \tc #5693CE\",\n\"w \tc #47759E\",\n\"x \tc #32506B\",\n\"y \tc #34526C\",\n\"z \tc #37546D\",\n\"A \tc #39576E\",\n\"B \tc #3C5970\",\n\"C \tc #3E5B71\",\n\"D \tc #7CA2BE\",\n\"E \tc #ADD4EF\",\n\"F \tc #A9D3EF\",\n\"G \tc #D2E8F7\",\n\"H \tc #353535\",\n\"I \tc #9A9A9A\",\n\"J \tc #303030\",\n\"K \tc #39526A\",\n\"L \tc #5A98D1\",\n\"M \tc #29435C\",\n\"N \tc #1F1F1F\",\n\"O \tc #2E2E2E\",\n\"P \tc #191919\",\n\"Q \tc #2A2D48\",\n\"R \tc #141414\",\n\"S \tc #242424\",\n\"T \tc #586B78\",\n\"U \tc #AED7F1\",\n\"V \tc #4D5860\",\n\"W \tc #5A5A5A\",\n\"X \tc #171717\",\n\"Y \tc #314E31\",\n\"Z \tc #32BA32\",\n\"` \tc #2C3F51\",\n\" .\tc #5F9CD3\",\n\"..\tc #848484\",\n\"+.\tc #ACACAC\",\n\"@.\tc #656565\",\n\"#.\tc #6F7DA9\",\n\"$.\tc #565656\",\n\"%.\tc #AAAAAA\",\n\"&.\tc #999999\",\n\"*.\tc #0B0D0F\",\n\"=.\tc #B2DAF3\",\n\"-.\tc #3A6242\",\n\";.\tc #44B144\",\n\">.\tc #000900\",\n\",.\tc #0C460C\",\n\"'.\tc #3ECD3E\",\n\").\tc #5BCE5B\",\n\"!.\tc #2E4152\",\n\"~.\tc #64A0D6\",\n\"{.\tc #8D8D8D\",\n\"].\tc #6A6A6A\",\n\"^.\tc #95AFCD\",\n\"/.\tc #5F5F5F\",\n\"(.\tc #A2A2A2\",\n\"_.\tc #B6DDF5\",\n\":.\tc #47664F\",\n\"<.\tc #6EE16E\",\n\"[.\tc #0D930D\",\n\"}.\tc #002600\",\n\"|.\tc #001900\",\n\"1.\tc #0D9D0D\",\n\"2.\tc #52D252\",\n\"3.\tc #76D576\",\n\"4.\tc #2F4253\",\n\"5.\tc #69A4D8\",\n\"6.\tc #7F7F7F\",\n\"7.\tc #BAE1F7\",\n\"8.\tc #4B6753\",\n\"9.\tc #8FEA8F\",\n\"0.\tc #21A121\",\n\"a.\tc #00A600\",\n\"b.\tc #0C160C\",\n\"c.\tc #63D063\",\n\"d.\tc #314353\",\n\"e.\tc #6EA8DA\",\n\"f.\tc #FFFFFF\",\n\"g.\tc #BDE4F9\",\n\"h.\tc #37633F\",\n\"i.\tc #8BE98B\",\n\"j.\tc #0E5A0E\",\n\"k.\tc #4C4C4C\",\n\"l.\tc #308130\",\n\"m.\tc #324554\",\n\"n.\tc #89BAE2\",\n\"o.\tc #C0E6FA\",\n\"p.\tc #38593F\",\n\"q.\tc #457745\",\n\"r.\tc #333333\",\n\"s.\tc #B6B6B6\",\n\"t.\tc #6D6D6D\",\n\"u.\tc #5C768C\",\n\"v.\tc #8BBCE4\",\n\"w.\tc #191C1E\",\n\"x.\tc #181D1F\",\n\"y.\tc #C2E9FC\",\n\"z.\tc #95A4AB\",\n\"A.\tc #BFBFBF\",\n\"B.\tc #7C99B0\",\n\"C.\tc #8DBFE5\",\n\"D.\tc #92A6B5\",\n\"E.\tc #181C1E\",\n\"F.\tc #A0BECD\",\n\"G.\tc #C4ECFE\",\n\"H.\tc #E1F5FF\",\n\"I.\tc #EFEFEF\",\n\"J.\tc #7E9BB1\",\n\"K.\tc #8FC1E7\",\n\"L.\tc #C0DDF2\",\n\"M.\tc #C3E0F4\",\n\"N.\tc #C6E2F5\",\n\"O.\tc #C8E4F6\",\n\"P.\tc #C8E5F7\",\n\"Q.\tc #C8E6F8\",\n\"R.\tc #C8E8F9\",\n\"S.\tc #C7E9FB\",\n\"T.\tc #C7EBFC\",\n\"U.\tc #C6ECFE\",\n\"V.\tc #C4EDFF\",\n\"W.\tc #E0F5FF\",\n\"X.\tc #819DB2\",\n\"Y.\tc #92C4E9\",\n\"Z.\tc #BBDBF2\",\n\"`.\tc #4B575F\",\n\" +\tc #30383D\",\n\".+\tc #31393E\",\n\"++\tc #323A3E\",\n\"@+\tc #3B454A\",\n\"#+\tc #A2BFCD\",\n\"$+\tc #C8EDFE\",\n\"%+\tc #C6EDFF\",\n\"&+\tc #C2ECFF\",\n\"*+\tc #DFF5FF\",\n\"=+\tc #F0F0F0\",\n\"-+\tc #B8B8B8\",\n\";+\tc #E7E7E7\",\n\">+\tc #4B554B\",\n\",+\tc #4FD34F\",\n\"'+\tc #7BE87B\",\n\")+\tc #9BF09B\",\n\"!+\tc #78E778\",\n\"~+\tc #407040\",\n\"{+\tc #8C8C8C\",\n\"]+\tc #DADADA\",\n\"^+\tc #DBDBDB\",\n\"/+\tc #A8A8A8\",\n\"(+\tc #385438\",\n\"_+\tc #4DD64D\",\n\":+\tc #60DB60\",\n\"<+\tc #459145\",\n\"[+\tc #767676\",\n\"}+\tc #DFDFDF\",\n\"|+\tc #E0E0E0\",\n\"1+\tc #E1E1E1\",\n\"2+\tc #E2E2E2\",\n\"3+\tc #0B0B0B\",\n\"4+\tc #003900\",\n\"5+\tc #017301\",\n\"                                                \",\n\"                                                \",\n\"                      . .                       \",\n\"      . + @ . . . . . # $ . . . . . . . .       \",\n\"      + % & & * = - ; > , ' ) ! ! ! ~ ~ { .     \",\n\"      ] ^ / ( ( ( _ : < [ } | { 1 1 2 3 3 4     \",\n\"      5 6 7 8 8 8 9 0 0 0 0 + a 8 8 8 8 b .     \",\n\"      9 c d e f g h i j k l m n o p q r ! .     \",\n\"      s t d u v h w x y z A B C D E F G ! .     \",\n\"      H I J K L M N O P Q Q R + S T U V W .     \",\n\"      X Y Z `  .. ..+.@.#.#.$.%.&.*.=.-.;.>.    \",\n\"    . ,.'.).!.~.. {.%.].^.^./.+.(.. _.:.<.[.}.  \",\n\"    |.1.2.3.4.5.. 6.6.6.6.6.6.6.6.. 7.8.9.0.a.. \",\n\"      b.;.c.d.e.. f.f.f.f.f.f.f.f.. g.h.i.j..   \",\n\"      N k.l.m.n.. f.f.f.f.f.f.f.f.. o.p.q..     \",\n\"      r.s.t.u.v.w.^ f.f.f.f.f.f.^ x.y.z.%..     \",\n\"      r.A.(.B.C.D.E.. . . . . . x.F.G.H.I..     \",\n\"      r.A.(.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.I..     \",\n\"      r.A.(.X.Y.Z.`. +.+.+++@+#+$+%+&+*+=+.     \",\n\"      P A.-+;+f.f.>+,+'+)+!+~+/ f.f.f.f.=+.     \",\n\"      . {+^ ]+]+^+/+(+_+:+<+[+}+|+|+1+1+2+.     \",\n\"        3+. . . . . . 4+5+. . . . . . . 9 .     \",\n\"                      . .                       \",\n\"                                                \"};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/zoom_to_rect.ppm",
    "content": "P6\n24 24\n255\nξܑTًOݠpeӠk߷ޑRȗԙ~a2ܖ^yעϊoTe։LФҤҥԪޮZѡӗ|`ZݘVۦ~խݿ߽ݺۺܫ۹Ȝ|ﺃأΈmUiْ[Ѷ޷ڲתگڣly^VّT޵ӵݍ՝ޟޙۓ،Ԅπ̓ҼI×T_Ŕؔ؈׵њpкۤӺߔ^LFDB:zҷٽݏ߱۞Ҵ׸ڊg\\XSNGxзڲ׃ЖΒ̍ʈǃÅĤ٭~ʾoifb]X٧yȸtnlhdx֑Ϣծ۱ۭܰ٬آԨ޷ۤԡ՝Ѡӥҿϖږږږږږږږڗۗۗۗۗۗۗۗۊ"
  },
  {
    "path": "OptolithiumGui/mpl-data/images/zoom_to_rect.xpm",
    "content": "/* XPM */\nstatic char *zoom_to_rect[] = {\n/* columns rows colors chars-per-pixel */\n\"24 24 241 2\",\n\"   c #3A889D\",\n\".  c #428DA1\",\n\"X  c #448DA3\",\n\"o  c #468EA5\",\n\"O  c #4790A3\",\n\"+  c #4E94A7\",\n\"@  c #4C91A8\",\n\"#  c #5397AA\",\n\"$  c #589AAD\",\n\"%  c #589CAC\",\n\"&  c #5D9FAF\",\n\"*  c #5C9CB0\",\n\"=  c #5E9DB1\",\n\"-  c #62A2B1\",\n\";  c #64A5B3\",\n\":  c #66A4B4\",\n\">  c #67A5B7\",\n\",  c #68A7B5\",\n\"<  c #69A6B6\",\n\"1  c #6CA9B7\",\n\"2  c #6EABB9\",\n\"3  c #6FABB9\",\n\"4  c #74AFBC\",\n\"5  c #78B1BE\",\n\"6  c #78B2BC\",\n\"7  c #7AB3BF\",\n\"8  c #79BEC8\",\n\"9  c #7EC1CA\",\n\"0  c #D77F32\",\n\"q  c #B78F5F\",\n\"w  c #C39754\",\n\"e  c #D6894C\",\n\"r  c #D98B4F\",\n\"t  c #D99154\",\n\"y  c #DE9152\",\n\"u  c #DC9154\",\n\"i  c #D9925B\",\n\"p  c #DC965E\",\n\"a  c #DD9856\",\n\"s  c #C89C7C\",\n\"d  c #D19A70\",\n\"f  c #DAA36C\",\n\"g  c #DDA070\",\n\"h  c #DBA67E\",\n\"j  c #E0985A\",\n\"k  c #E8A949\",\n\"l  c #ECB556\",\n\"z  c #EFBB5A\",\n\"x  c #F3BD55\",\n\"c  c #F4BC54\",\n\"v  c #E5A165\",\n\"b  c #E4AD69\",\n\"n  c #EBAF6B\",\n\"m  c #E8B365\",\n\"M  c #EBB079\",\n\"N  c #F4C05E\",\n\"B  c #F4C061\",\n\"V  c #F5C160\",\n\"C  c #F6C56D\",\n\"Z  c #F6C66F\",\n\"A  c #F7C979\",\n\"S  c #F7CA7C\",\n\"D  c #F7CB7E\",\n\"F  c #BCA88D\",\n\"G  c #AFB9B8\",\n\"H  c #83B9C3\",\n\"J  c #85BCC4\",\n\"K  c #88BCC7\",\n\"L  c #8ABDC7\",\n\"P  c #8DBFCA\",\n\"I  c #91BFC9\",\n\"U  c #80C3CC\",\n\"Y  c #83C3CD\",\n\"T  c #82C4CF\",\n\"R  c #84C5CF\",\n\"E  c #8AC7D1\",\n\"W  c #88C9D5\",\n\"Q  c #8ACBD7\",\n\"!  c #8DC8D1\",\n\"~  c #8CCAD4\",\n\"^  c #8DCBD5\",\n\"/  c #8FCAD4\",\n\"(  c #92C1CC\",\n\")  c #91C5CF\",\n\"_  c #96C4CE\",\n\"`  c #99C4C5\",\n\"'  c #97C5D0\",\n\"]  c #93C8D2\",\n\"[  c #94CDD7\",\n\"{  c #93CED8\",\n\"}  c #97C9DE\",\n\"|  c #94CED8\",\n\" . c #97CFD8\",\n\".. c #9DCAD1\",\n\"X. c #9ECAD2\",\n\"o. c #9FCBD3\",\n\"O. c #96D0DA\",\n\"+. c #97D1DB\",\n\"@. c #99D1DB\",\n\"#. c #98D2DC\",\n\"$. c #9DD4DE\",\n\"%. c #9ED4DE\",\n\"&. c #9FD5E0\",\n\"*. c #A1C8D1\",\n\"=. c #A0CAD3\",\n\"-. c #A3CAD2\",\n\";. c #A1CBD4\",\n\":. c #A1CCD5\",\n\">. c #A2CCD4\",\n\",. c #A2CDD5\",\n\"<. c #A4CAD2\",\n\"1. c #A4CBD2\",\n\"2. c #A4CBD3\",\n\"3. c #A7CBD3\",\n\"4. c #A5CBD4\",\n\"5. c #A5CCD2\",\n\"6. c #A4CCD4\",\n\"7. c #A4CCD5\",\n\"8. c #A8C9D0\",\n\"9. c #A9CAD0\",\n\"0. c #AACAD0\",\n\"q. c #A9CBD5\",\n\"w. c #A8CDD4\",\n\"e. c #A4D1D7\",\n\"r. c #A7D0D9\",\n\"t. c #ADD0D4\",\n\"y. c #AAD1D9\",\n\"u. c #AAD1DA\",\n\"i. c #ABD2DB\",\n\"p. c #ACD3D8\",\n\"a. c #ADD5D9\",\n\"s. c #ACD4DB\",\n\"d. c #AED5DB\",\n\"f. c #ADD4DD\",\n\"g. c #B4CCD6\",\n\"h. c #B5CFD6\",\n\"j. c #B2D3D7\",\n\"k. c #B2D4D7\",\n\"l. c #B4D4D7\",\n\"z. c #B0D6DB\",\n\"x. c #B1D7DB\",\n\"c. c #B1D7DC\",\n\"v. c #B7D1DB\",\n\"b. c #B7D6D9\",\n\"n. c #B7D6DA\",\n\"m. c #B5D6DD\",\n\"M. c #B1D8DB\",\n\"N. c #B6D8DF\",\n\"B. c #B7DADF\",\n\"V. c #B9D0D8\",\n\"C. c #B9D1D9\",\n\"Z. c #B8D6DA\",\n\"A. c #BAD7DB\",\n\"S. c #BAD7DC\",\n\"D. c #BAD9DE\",\n\"F. c #BDD9DD\",\n\"G. c #BEDADE\",\n\"H. c #BFD7E0\",\n\"J. c #B8DBE0\",\n\"K. c #BBDCE1\",\n\"L. c #BFDCE0\",\n\"P. c #BEDEE3\",\n\"I. c #BEDFE3\",\n\"U. c #BFDFE4\",\n\"Y. c #DEAE87\",\n\"T. c #DEB597\",\n\"R. c #DFB797\",\n\"E. c #EFBA83\",\n\"W. c #F8CE88\",\n\"Q. c #F8CF8A\",\n\"!. c #F4C897\",\n\"~. c #F9D397\",\n\"^. c #F9D499\",\n\"/. c #E2C0A5\",\n\"(. c #E2CEBE\",\n\"). c #F6D1A1\",\n\"_. c #F8D3A0\",\n\"`. c #F9D7A2\",\n\"'. c #FAD8A3\",\n\"]. c #C0DBDF\",\n\"[. c #C1DBDF\",\n\"{. c #C1D8E1\",\n\"}. c #C2DCE1\",\n\"|. c #C6DEE2\",\n\" X c #C6DEE3\",\n\".X c #C9D8E3\",\n\"XX c #C9D9E5\",\n\"oX c #C9D9E6\",\n\"OX c #C8DFE3\",\n\"+X c #CAD9E9\",\n\"@X c #CDDBE9\",\n\"#X c #CEDBE9\",\n\"$X c #CFDCE9\",\n\"%X c #D4DEE7\",\n\"&X c #D0DCE9\",\n\"*X c #D0DDE9\",\n\"=X c #D1DDE9\",\n\"-X c #D2DDE8\",\n\";X c #D5DFE9\",\n\":X c #C1E0E5\",\n\">X c #C4E2E7\",\n\",X c #C5E3E7\",\n\"<X c #C7E3E8\",\n\"1X c #C9E5EA\",\n\"2X c #CBE6EB\",\n\"3X c #CCE7EB\",\n\"4X c #CEE7EC\",\n\"5X c #CEE0F0\",\n\"6X c #D0E9EE\",\n\"7X c #D1E9EE\",\n\"8X c #D3EAEF\",\n\"9X c #DBE1E7\",\n\"0X c #D4EBF0\",\n\"qX c #D5EBF0\",\n\"wX c #DBE8F7\",\n\"eX c #D8EDF2\",\n\"rX c #D9EEF3\",\n\"tX c #DBEFF5\",\n\"yX c #DCE9F7\",\n\"uX c #DAE8F8\",\n\"iX c #DDE9F8\",\n\"pX c #DEEAF8\",\n\"aX c #DEF0F6\",\n\"sX c #DFF1F6\",\n\"dX c #E2D0C3\",\n\"fX c #E3D9D1\",\n\"gX c #E5DFDB\",\n\"hX c #F2D5C1\",\n\"jX c #E5E2DF\",\n\"kX c #E2E4E7\",\n\"lX c #E5E3E2\",\n\"zX c #E5E5E6\",\n\"xX c #E4E6E7\",\n\"cX c #E6E6E6\",\n\"vX c #E2F4F9\",\n\"bX c #E3F4F9\",\n\"nX c #EDF3FB\",\n\"mX c #F0F4FB\",\n\"MX c #F2F5FB\",\n\"NX c #F9F9FD\",\n\"BX c #FEFCFE\",\n/* pixels */\n\"cXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcX\",\n\"cXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcX\",\n\"cXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcX(.j r jX\",\n\"cXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXlXd v ^.n R.\",\n\"cXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcX/.y !.~.W.z 0 \",\n\"cXcXcXcXcXkX&X$X$X$X&XcXcXcXcXfXp M `.W.Z x m e \",\n\"cXcXcXcX@X.X9.<.<.4.9.oX;XcXY.j _.~.S N z a h gX\",\n\"cXcXkX+Xq.f.L.].F.A.S.i.V.s E.'.W.Z x b i dXcXcX\",\n\"cXcX$X*.B.>XOX>X}.F.B.k.i.G f A N l t R.lXcXcXcX\",\n\"cX&X4.m.~ &.e.%.#.{ Q R 9 ] F k w q ` { { ~ cXcX\",\n\"kX.Xf.}.{ aXbXaXrX7X1X}.L.e.l.d hXBXBXBXBX#.cXcX\",\n\"&X9.A.}. .aXbXsXrX7X1X}.J.x.4.yXBXBXBXBXBX#.cXcX\",\n\"$X4.A.[.[ rXaX= @ o X .   7 o.iXBXBXBXBXBX#.cXcX\",\n\"$X*.b.F.^ 7X8X8X7X2X>XI.J.x.X.iXBXBXBXBXBX#.cXcX\",\n\"&X<.l.Z.E 4X4X> * $ + + O 6 ;.iXBXBXBXBXBX#.cXcX\",\n\"&X9.b.k.U <X<X' _ ( ( L H J 4.iXBXBXBXBXBX#.cXcX\",\n\"cXoXi.w.9 I.I.3 > : - & % L {.mXBXBXBXBXBX#.cXcX\",\n\"cX%XV.i.8 D.D.4 2 1 , ; 6 ( wXBXBXBXBXBXBX#.cXcX\",\n\"cXcX&Xg.] ;.z.M.x.a.p.4.3.5XNXBXBXBXBXBXBX#.cXcX\",\n\"cXcXcX9X} S.;.;.X.*.<.F.uXNXBXBXBXBXBXBXBX#.cXcX\",\n\"cXcXcXcXE nXiXiXyXiXiXmXBXBXBXBXBXBXBXBXBX#.cXcX\",\n\"cXcXcXcXU +.+.+.+.+.+.+.{ +.+.+.+.+.+.+.+.Q cXcX\",\n\"cXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcX\",\n\"cXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcX\"\n};\n"
  },
  {
    "path": "OptolithiumGui/mpl-data/lineprops.glade",
    "content": "<?xml version=\"1.0\" standalone=\"no\"?> <!--*- mode: xml -*-->\n<!DOCTYPE glade-interface SYSTEM \"http://glade.gnome.org/glade-2.0.dtd\">\n\n<glade-interface>\n\n<widget class=\"GtkDialog\" id=\"dialog_lineprops\">\n  <property name=\"visible\">True</property>\n  <property name=\"title\" translatable=\"yes\">Line Properties</property>\n  <property name=\"type\">GTK_WINDOW_TOPLEVEL</property>\n  <property name=\"window_position\">GTK_WIN_POS_NONE</property>\n  <property name=\"modal\">False</property>\n  <property name=\"resizable\">True</property>\n  <property name=\"destroy_with_parent\">False</property>\n  <property name=\"decorated\">True</property>\n  <property name=\"skip_taskbar_hint\">False</property>\n  <property name=\"skip_pager_hint\">False</property>\n  <property name=\"type_hint\">GDK_WINDOW_TYPE_HINT_DIALOG</property>\n  <property name=\"gravity\">GDK_GRAVITY_NORTH_WEST</property>\n  <property name=\"has_separator\">True</property>\n\n  <child internal-child=\"vbox\">\n    <widget class=\"GtkVBox\" id=\"dialog-vbox2\">\n      <property name=\"visible\">True</property>\n      <property name=\"homogeneous\">False</property>\n      <property name=\"spacing\">0</property>\n\n      <child internal-child=\"action_area\">\n\t<widget class=\"GtkHButtonBox\" id=\"dialog-action_area2\">\n\t  <property name=\"visible\">True</property>\n\t  <property name=\"layout_style\">GTK_BUTTONBOX_END</property>\n\n\t  <child>\n\t    <widget class=\"GtkButton\" id=\"dialog_lineprops_cancelbutton\">\n\t      <property name=\"visible\">True</property>\n\t      <property name=\"can_default\">True</property>\n\t      <property name=\"can_focus\">True</property>\n\t      <property name=\"label\">gtk-cancel</property>\n\t      <property name=\"use_stock\">True</property>\n\t      <property name=\"relief\">GTK_RELIEF_NORMAL</property>\n\t      <property name=\"focus_on_click\">True</property>\n\t      <property name=\"response_id\">-6</property>\n\t      <signal name=\"clicked\" handler=\"on_dialog_lineprops_cancelbutton_clicked\" last_modification_time=\"Mon, 07 Nov 2005 20:52:05 GMT\"/>\n\t    </widget>\n\t  </child>\n\n\t  <child>\n\t    <widget class=\"GtkButton\" id=\"dialog_lineprops_okbutton\">\n\t      <property name=\"visible\">True</property>\n\t      <property name=\"can_default\">True</property>\n\t      <property name=\"can_focus\">True</property>\n\t      <property name=\"label\">gtk-ok</property>\n\t      <property name=\"use_stock\">True</property>\n\t      <property name=\"relief\">GTK_RELIEF_NORMAL</property>\n\t      <property name=\"focus_on_click\">True</property>\n\t      <property name=\"response_id\">-5</property>\n\t      <signal name=\"clicked\" handler=\"on_dialog_lineprops_okbutton_clicked\" last_modification_time=\"Mon, 07 Nov 2005 20:51:43 GMT\"/>\n\t    </widget>\n\t  </child>\n\t</widget>\n\t<packing>\n\t  <property name=\"padding\">0</property>\n\t  <property name=\"expand\">False</property>\n\t  <property name=\"fill\">True</property>\n\t  <property name=\"pack_type\">GTK_PACK_END</property>\n\t</packing>\n      </child>\n\n      <child>\n\t<widget class=\"GtkVBox\" id=\"vbox_lineprops\">\n\t  <property name=\"visible\">True</property>\n\t  <property name=\"homogeneous\">False</property>\n\t  <property name=\"spacing\">0</property>\n\n\t  <child>\n\t    <widget class=\"GtkComboBox\" id=\"combobox_lineprops\">\n\t      <property name=\"visible\">True</property>\n\t      <property name=\"items\" translatable=\"yes\"></property>\n\t      <signal name=\"changed\" handler=\"on_combobox_lineprops_changed\" last_modification_time=\"Mon, 07 Nov 2005 20:40:07 GMT\"/>\n\t    </widget>\n\t    <packing>\n\t      <property name=\"padding\">0</property>\n\t      <property name=\"expand\">True</property>\n\t      <property name=\"fill\">True</property>\n\t    </packing>\n\t  </child>\n\n\t  <child>\n\t    <widget class=\"GtkFrame\" id=\"frame6\">\n\t      <property name=\"visible\">True</property>\n\t      <property name=\"label_xalign\">0</property>\n\t      <property name=\"label_yalign\">0.5</property>\n\t      <property name=\"shadow_type\">GTK_SHADOW_NONE</property>\n\n\t      <child>\n\t\t<widget class=\"GtkAlignment\" id=\"alignment9\">\n\t\t  <property name=\"visible\">True</property>\n\t\t  <property name=\"xalign\">0.5</property>\n\t\t  <property name=\"yalign\">0.5</property>\n\t\t  <property name=\"xscale\">1</property>\n\t\t  <property name=\"yscale\">1</property>\n\t\t  <property name=\"top_padding\">0</property>\n\t\t  <property name=\"bottom_padding\">0</property>\n\t\t  <property name=\"left_padding\">12</property>\n\t\t  <property name=\"right_padding\">0</property>\n\n\t\t  <child>\n\t\t    <widget class=\"GtkVBox\" id=\"vbox5\">\n\t\t      <property name=\"visible\">True</property>\n\t\t      <property name=\"homogeneous\">False</property>\n\t\t      <property name=\"spacing\">0</property>\n\n\t\t      <child>\n\t\t\t<widget class=\"GtkTable\" id=\"table_lineprops\">\n\t\t\t  <property name=\"visible\">True</property>\n\t\t\t  <property name=\"n_rows\">2</property>\n\t\t\t  <property name=\"n_columns\">3</property>\n\t\t\t  <property name=\"homogeneous\">False</property>\n\t\t\t  <property name=\"row_spacing\">0</property>\n\t\t\t  <property name=\"column_spacing\">0</property>\n\n\t\t\t  <child>\n\t\t\t    <widget class=\"GtkLabel\" id=\"label11\">\n\t\t\t      <property name=\"visible\">True</property>\n\t\t\t      <property name=\"label\" translatable=\"yes\">Marker</property>\n\t\t\t      <property name=\"use_underline\">False</property>\n\t\t\t      <property name=\"use_markup\">False</property>\n\t\t\t      <property name=\"justify\">GTK_JUSTIFY_LEFT</property>\n\t\t\t      <property name=\"wrap\">False</property>\n\t\t\t      <property name=\"selectable\">False</property>\n\t\t\t      <property name=\"xalign\">0.5</property>\n\t\t\t      <property name=\"yalign\">0.5</property>\n\t\t\t      <property name=\"xpad\">0</property>\n\t\t\t      <property name=\"ypad\">0</property>\n\t\t\t    </widget>\n\t\t\t    <packing>\n\t\t\t      <property name=\"left_attach\">0</property>\n\t\t\t      <property name=\"right_attach\">1</property>\n\t\t\t      <property name=\"top_attach\">1</property>\n\t\t\t      <property name=\"bottom_attach\">2</property>\n\t\t\t      <property name=\"x_options\">fill</property>\n\t\t\t      <property name=\"y_options\"></property>\n\t\t\t    </packing>\n\t\t\t  </child>\n\n\t\t\t  <child>\n\t\t\t    <widget class=\"GtkComboBox\" id=\"combobox_linestyles\">\n\t\t\t      <property name=\"visible\">True</property>\n\t\t\t      <property name=\"items\" translatable=\"yes\"></property>\n\t\t\t      <signal name=\"changed\" handler=\"on_combobox_linestyle_changed\" last_modification_time=\"Mon, 07 Nov 2005 20:43:56 GMT\"/>\n\t\t\t    </widget>\n\t\t\t    <packing>\n\t\t\t      <property name=\"left_attach\">1</property>\n\t\t\t      <property name=\"right_attach\">2</property>\n\t\t\t      <property name=\"top_attach\">0</property>\n\t\t\t      <property name=\"bottom_attach\">1</property>\n\t\t\t      <property name=\"y_options\">fill</property>\n\t\t\t    </packing>\n\t\t\t  </child>\n\n\t\t\t  <child>\n\t\t\t    <widget class=\"GtkComboBox\" id=\"combobox_markers\">\n\t\t\t      <property name=\"visible\">True</property>\n\t\t\t      <property name=\"items\" translatable=\"yes\"></property>\n\t\t\t      <signal name=\"changed\" handler=\"on_combobox_marker_changed\" last_modification_time=\"Mon, 07 Nov 2005 20:43:14 GMT\"/>\n\t\t\t    </widget>\n\t\t\t    <packing>\n\t\t\t      <property name=\"left_attach\">1</property>\n\t\t\t      <property name=\"right_attach\">2</property>\n\t\t\t      <property name=\"top_attach\">1</property>\n\t\t\t      <property name=\"bottom_attach\">2</property>\n\t\t\t      <property name=\"x_options\">fill</property>\n\t\t\t      <property name=\"y_options\">fill</property>\n\t\t\t    </packing>\n\t\t\t  </child>\n\n\t\t\t  <child>\n\t\t\t    <widget class=\"GtkColorButton\" id=\"colorbutton_linestyle\">\n\t\t\t      <property name=\"visible\">True</property>\n\t\t\t      <property name=\"can_focus\">True</property>\n\t\t\t      <property name=\"use_alpha\">True</property>\n\t\t\t      <property name=\"title\" translatable=\"yes\">Line color</property>\n\t\t\t      <property name=\"focus_on_click\">True</property>\n\t\t\t      <signal name=\"color_set\" handler=\"on_colorbutton_linestyle_color_set\" last_modification_time=\"Mon, 07 Nov 2005 22:13:40 GMT\"/>\n\t\t\t    </widget>\n\t\t\t    <packing>\n\t\t\t      <property name=\"left_attach\">2</property>\n\t\t\t      <property name=\"right_attach\">3</property>\n\t\t\t      <property name=\"top_attach\">0</property>\n\t\t\t      <property name=\"bottom_attach\">1</property>\n\t\t\t      <property name=\"x_options\">fill</property>\n\t\t\t      <property name=\"y_options\"></property>\n\t\t\t    </packing>\n\t\t\t  </child>\n\n\t\t\t  <child>\n\t\t\t    <widget class=\"GtkColorButton\" id=\"colorbutton_markerface\">\n\t\t\t      <property name=\"visible\">True</property>\n\t\t\t      <property name=\"can_focus\">True</property>\n\t\t\t      <property name=\"use_alpha\">False</property>\n\t\t\t      <property name=\"title\" translatable=\"yes\">Marker color</property>\n\t\t\t      <property name=\"focus_on_click\">True</property>\n\t\t\t      <signal name=\"color_set\" handler=\"on_colorbutton_markerface_color_set\" last_modification_time=\"Mon, 07 Nov 2005 22:14:00 GMT\"/>\n\t\t\t    </widget>\n\t\t\t    <packing>\n\t\t\t      <property name=\"left_attach\">2</property>\n\t\t\t      <property name=\"right_attach\">3</property>\n\t\t\t      <property name=\"top_attach\">1</property>\n\t\t\t      <property name=\"bottom_attach\">2</property>\n\t\t\t      <property name=\"x_options\">fill</property>\n\t\t\t      <property name=\"y_options\"></property>\n\t\t\t    </packing>\n\t\t\t  </child>\n\n\t\t\t  <child>\n\t\t\t    <widget class=\"GtkLabel\" id=\"label_linestyle\">\n\t\t\t      <property name=\"visible\">True</property>\n\t\t\t      <property name=\"label\" translatable=\"yes\">Line style</property>\n\t\t\t      <property name=\"use_underline\">False</property>\n\t\t\t      <property name=\"use_markup\">False</property>\n\t\t\t      <property name=\"justify\">GTK_JUSTIFY_LEFT</property>\n\t\t\t      <property name=\"wrap\">False</property>\n\t\t\t      <property name=\"selectable\">False</property>\n\t\t\t      <property name=\"xalign\">0.5</property>\n\t\t\t      <property name=\"yalign\">0.5</property>\n\t\t\t      <property name=\"xpad\">0</property>\n\t\t\t      <property name=\"ypad\">0</property>\n\t\t\t    </widget>\n\t\t\t    <packing>\n\t\t\t      <property name=\"left_attach\">0</property>\n\t\t\t      <property name=\"right_attach\">1</property>\n\t\t\t      <property name=\"top_attach\">0</property>\n\t\t\t      <property name=\"bottom_attach\">1</property>\n\t\t\t      <property name=\"x_options\">fill</property>\n\t\t\t      <property name=\"y_options\"></property>\n\t\t\t    </packing>\n\t\t\t  </child>\n\t\t\t</widget>\n\t\t\t<packing>\n\t\t\t  <property name=\"padding\">0</property>\n\t\t\t  <property name=\"expand\">True</property>\n\t\t\t  <property name=\"fill\">True</property>\n\t\t\t</packing>\n\t\t      </child>\n\t\t    </widget>\n\t\t  </child>\n\t\t</widget>\n\t      </child>\n\n\t      <child>\n\t\t<widget class=\"GtkLabel\" id=\"fram_lineprops\">\n\t\t  <property name=\"visible\">True</property>\n\t\t  <property name=\"label\" translatable=\"yes\">&lt;b&gt;Line properties&lt;/b&gt;</property>\n\t\t  <property name=\"use_underline\">False</property>\n\t\t  <property name=\"use_markup\">True</property>\n\t\t  <property name=\"justify\">GTK_JUSTIFY_LEFT</property>\n\t\t  <property name=\"wrap\">False</property>\n\t\t  <property name=\"selectable\">False</property>\n\t\t  <property name=\"xalign\">0.5</property>\n\t\t  <property name=\"yalign\">0.5</property>\n\t\t  <property name=\"xpad\">0</property>\n\t\t  <property name=\"ypad\">0</property>\n\t\t</widget>\n\t\t<packing>\n\t\t  <property name=\"type\">label_item</property>\n\t\t</packing>\n\t      </child>\n\t    </widget>\n\t    <packing>\n\t      <property name=\"padding\">0</property>\n\t      <property name=\"expand\">True</property>\n\t      <property name=\"fill\">True</property>\n\t    </packing>\n\t  </child>\n\t</widget>\n\t<packing>\n\t  <property name=\"padding\">0</property>\n\t  <property name=\"expand\">True</property>\n\t  <property name=\"fill\">True</property>\n\t</packing>\n      </child>\n    </widget>\n  </child>\n</widget>\n\n</glade-interface>\n"
  },
  {
    "path": "OptolithiumGui/options/__init__.py",
    "content": "# -*- coding: utf-8 -*-\r\n\r\n# This file is part of Optolithium lithography modelling software.\r\n#\r\n# Copyright (C) 2015 Alexei Gladkikh\r\n#\r\n# This software is dual-licensed: you can redistribute it and/or modify\r\n# it under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version only for NON-COMMERCIAL usage.\r\n#\r\n# This program is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n#\r\n# If you are interested in other licensing models, including a commercial-\r\n# license, please contact the author at gladkikhalexei@gmail.com\r\n\r\nfrom options.structures import Options, OptionsLoadErrors\r\nfrom options.common import Abstract, Variable, Numeric, Enum\r\n\r\n__author__ = 'Alexei Gladkikh'"
  },
  {
    "path": "OptolithiumGui/options/common.py",
    "content": "# -*- coding: utf-8 -*-\r\n\r\n# This file is part of Optolithium lithography modelling software.\r\n#\r\n# Copyright (C) 2015 Alexei Gladkikh\r\n#\r\n# This software is dual-licensed: you can redistribute it and/or modify\r\n# it under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version only for NON-COMMERCIAL usage.\r\n#\r\n# This program is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n#\r\n# If you are interested in other licensing models, including a commercial-\r\n# license, please contact the author at gladkikhalexei@gmail.com\r\n\r\nimport logging as module_logging\r\nfrom database.base import SignalsMeta, Float, Integer, String\r\nimport helpers\r\n\r\n__author__ = 'Alexei Gladkikh'\r\n\r\n\r\nlogging = module_logging.getLogger(__name__)\r\nlogging.setLevel(module_logging.INFO)\r\nhelpers.logStreamEnable(logging)\r\n\r\n\r\nclass ReportTemplates(object):\r\n\r\n    header = (\r\n        \"\"\"<table border=\"0\">\r\n            <tr class=\"report\">\r\n                <td class=\"report-icon\"><img src=\"%(icon)s\"/></td>\r\n                <td class=\"report-name\">%(name)s</td>\r\n                <td class=\"report-value\"></td>\r\n            </tr>\r\n            %(body)s\r\n        </table>\"\"\"\r\n    )\r\n\r\n    value = (\r\n        \"\"\"<tr class=\"report\">\r\n                <td class=\"report-icon\"></td>\r\n                <td class=\"report-name\">%(name)s</td>\r\n                <td class=\"report-value\">%(value)s</td>\r\n        </tr>\"\"\"\r\n    )\r\n\r\n    subvalue = (\r\n        \"\"\"<tr class=\"report\">\r\n                <td class=\"report-icon\"></td>\r\n                <td class=\"report-name\"><div class=\"report-subvalue\">%(name)s</div></td>\r\n                <td class=\"report-value\">%(value)s</td>\r\n        </tr>\"\"\"\r\n    )\r\n\r\n    composite = (\r\n        \"\"\"<tr>\r\n            <td colspan=\"3\">%s</td>\r\n        </tr>\"\"\"\r\n    )\r\n\r\n\r\nclass Abstract(object):\r\n\r\n    key = \"value\"\r\n\r\n    def __init__(self, dtype):\r\n        self.__dtype = dtype()\r\n        self.__values = {None: self}\r\n\r\n    def __get__(self, instance, owner):\r\n        if instance not in self.__values:\r\n            raise KeyError(\"Value of %s [%s] hasn't set yet\" % (instance.name, owner))\r\n\r\n        return self.__values[instance]\r\n\r\n    def __set__(self, instance, value):\r\n        real_type = self.__dtype.python_type\r\n        if not isinstance(value, real_type):\r\n            raise TypeError(\"Option value of %s can be assigned only to %s type value (input is %s)\" %\r\n                            (instance.name, real_type.__name__, type(value).__name__))\r\n        if instance not in self.__values or self.__values[instance] != value:\r\n            # previous = \"Undefined\" if instance not in self.__values else self.__values[instance]\r\n            # logging.info(\"%s.%s: %s -> %s\" % (instance.name, self.key, previous, value))\r\n            self.__values[instance] = value\r\n            instance.signals[Abstract].emit()\r\n\r\n    @staticmethod\r\n    def get_concrete(instance):\r\n        \"\"\":rtype: Abstract\"\"\"\r\n        return getattr(instance.__class__, Abstract.key)\r\n\r\n    @property\r\n    def type(self):\r\n        return self.__dtype\r\n\r\n\r\nclass Enum(Abstract):\r\n\r\n    def __init__(self, variants, raise_constraint=True):\r\n        \"\"\"\r\n        :param list of string variants: List of the possible value for enumeration\r\n        :param bool raise_constraint: If True - then exception will be raised if try to set value not from variants\r\n        \"\"\"\r\n        super(Enum, self).__init__(dtype=String)\r\n\r\n        if not isinstance(variants, list):\r\n            raise TypeError(\"Variants input parameter must be list of the acceptable values\")\r\n\r\n        if not all([isinstance(v, basestring) for v in variants]):\r\n            raise TypeError(\"Each variants member must be string type\")\r\n\r\n        self.__raise_constraint = raise_constraint\r\n        self.__variants = variants\r\n\r\n    def __set__(self, instance, value):\r\n        if not isinstance(value, basestring):\r\n            raise TypeError(\"Value input parameter must be string\")\r\n\r\n        if value not in self.__variants:\r\n            if self.__raise_constraint:\r\n                raise ValueError(\"Enumeration of %s set to value not in possible list: %s\" % (instance.name, value))\r\n\r\n        super(Enum, self).__set__(instance, value)\r\n\r\n    @property\r\n    def variants(self):\r\n        return self.__variants\r\n\r\n\r\nclass Numeric(Abstract):\r\n\r\n    orm_cast = {\r\n        float: Float,\r\n        int: Integer,\r\n        long: Integer\r\n    }\r\n\r\n    def __init__(self, vmin=None, vmax=None, dtype=float, precision=None, raise_constraint=False):\r\n\r\n        if dtype not in Numeric.orm_cast:\r\n            raise TypeError(\"Numeric class only support the next types: int, float! Input value is %s\" % dtype.__name__)\r\n\r\n        super(Numeric, self).__init__(dtype=Numeric.orm_cast[dtype])\r\n\r\n        self.__raise_constraint = raise_constraint\r\n        self.__precision = precision\r\n\r\n        if vmin is not None:\r\n            if type(vmin) != dtype:\r\n                raise TypeError(\"Minimum value type must be identical to value type\")\r\n            self.__min_value = vmin\r\n        else:\r\n            self.__min_value = None\r\n\r\n        if vmax is not None:\r\n            if type(vmax) != dtype:\r\n                raise TypeError(\"Maximum value type must be identical to value type\")\r\n            self.__max_value = vmax\r\n        else:\r\n            self.__max_value = None\r\n\r\n    @property\r\n    def min(self):\r\n        return self.__min_value\r\n\r\n    @property\r\n    def max(self):\r\n        return self.__max_value\r\n\r\n    @property\r\n    def precision(self):\r\n        return self.__precision\r\n\r\n    def higher_max(self, value):\r\n        return self.max is not None and value > self.max\r\n\r\n    def lower_min(self, value):\r\n        return self.min is not None and value < self.min\r\n\r\n    def within_constraint(self, value):\r\n        return not self.higher_max(value) and not self.lower_min(value)\r\n\r\n    def __set__(self, instance, value):\r\n        if self.__raise_constraint and not self.within_constraint(value):\r\n            raise ValueError(\"Numeric of %s set to the outside constraint value: %s\" % (instance.name, value))\r\n\r\n        if self.higher_max(value):\r\n            value = self.max\r\n        elif self.lower_min(value):\r\n            value = self.min\r\n\r\n        if type(value) == float and self.__precision is not None:\r\n            value = round(value, self.__precision)\r\n\r\n        super(Numeric, self).__set__(instance, value)\r\n\r\n\r\nclass AttributedProperty(property):\r\n\r\n    def __init__(self, fget=None, fset=None, fdel=None, doc=None, **kwargs):\r\n\r\n        super(AttributedProperty, self).__init__(fget, fset, fdel, doc)\r\n        self.key = kwargs.pop(\"key\")\r\n        self.type = kwargs.pop(\"dtype\")()\r\n        self.precision = kwargs.pop(\"precision\", None)\r\n        if kwargs:\r\n            raise NotImplementedError(\"The next attributes is unimplemented: %s\" % kwargs)\r\n\r\n\r\nclass Variable(object):\r\n\r\n    SignalsClass = SignalsMeta.CreateSignalsClass(\"SignalsClass\", [Abstract.key])\r\n\r\n    value = None\r\n    count = 0\r\n\r\n    def __init__(self, ftype, value=None, name=None):\r\n        \"\"\"\r\n        :param str or None name: Object name\r\n        :param value: Initial options value\r\n        :param name: Option name\r\n        \"\"\"\r\n        self.__name = \"%s_%d\" % (Variable.__name__, Variable.count) if name is None else name\r\n        self.__signals = Variable.SignalsClass(self)\r\n        if value is not None:\r\n            self.value = value\r\n        Variable.count += 1\r\n\r\n    @property\r\n    def name(self):\r\n        return self.__name\r\n\r\n    @property\r\n    def signals(self):\r\n        return self.__signals\r\n\r\n    def __new__(cls, ftype, *args, **kwargs):\r\n        class_ = type(cls.__name__, (cls, ), {\"value\": ftype})\r\n        return object.__new__(class_)\r\n\r\n    def report(self):\r\n        return ReportTemplates.value % {\"name\": self.name, \"value\": self.value}"
  },
  {
    "path": "OptolithiumGui/options/structures.py",
    "content": "# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport bson\nimport os\nimport numpy\nimport logging as module_logging\n\nfrom pcpi import PluginNotFoundError\nfrom resources import Resources\nfrom options.common import Abstract, Variable, Numeric, Enum, ReportTemplates, AttributedProperty\nfrom qt import QtCore, connect, Slot, disconnect, Signal, GlobalSignals\nfrom database import orm\nfrom metrics import VARIATE_HEIGHT_FALSE, VARIATE_HEIGHT_TRUE, MASK_CLEAR, MASK_OPAQUE\n\nimport config\nimport helpers\n\nimport optolithiumc as oplc\n\n\n__author__ = 'Alexei Gladkikh'\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.DEBUG)\nhelpers.logStreamEnable(logging)\n\n\nPARAMETRIC_NAME = \"Parametric\"\nRESIST_TYPE = \"Resist\"\nLAYER_TYPE = \"Layer\"\nSUBSTRATE_TYPE = \"Substrate\"\n\n\ndef get_field(p_object, abstract_field):\n    if hasattr(abstract_field, \"get_concrete\"):\n        return abstract_field.get_concrete(p_object)\n    else:\n        return abstract_field\n\n\nclass OptionsLoadErrors(Exception):\n\n    def __init__(self, errors, p_object):\n        self.errors = errors\n        self.p_object = p_object\n\n    def __iter__(self):\n        return self.errors.__iter__()\n\n\nclass OptionsParseError(Exception):\n    pass\n\n\nclass AbstractReportOption(object):\n\n    icon = None\n\n    @property\n    def identifier(self):\n        return self.__class__.__name__\n\n    def report_header(self):\n        return ReportTemplates.header % {\"icon\": Resources(self.icon, \"url\"), \"name\": self.identifier, \"body\": \"%s\"}\n\n    def report(self):\n        raise NotImplementedError\n\n\nclass AbstractOptionsBase(QtCore.QObject, AbstractReportOption):\n\n    changed = Signal()\n\n    def __init__(self, *args, **kwargs):\n        super(AbstractOptionsBase, self).__init__(*args, **kwargs)\n        self.__saved = True\n        self.__simulated = True\n\n    def _connect_signals(self):\n        for var in self.__dict__.values():\n            if isinstance(var, Variable):\n                connect(var.signals[Abstract], self.onOptionChanged)\n        connect(self.changed, GlobalSignals.onChanged)\n\n    def _set_composite_variable(self, name, value):\n        vname = \"_%s__%s\" % (self.__class__.__name__, name)\n        if getattr(self, vname) is not None:\n            for variable in getattr(self, vname).variables:\n                # print(variable.signals[Abstract])\n                disconnect(variable.signals[Abstract], self.onOptionChanged)\n\n        setattr(self, vname, value)\n\n        if value is not None:\n            for variable in getattr(self, vname).variables:\n                connect(variable.signals[Abstract], self.onOptionChanged)\n\n        self.onOptionChanged()\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def onOptionChanged(self):\n        # emit_required = self.__saved or self.__simulated\n        # sender_str = \" by %s\" % self.sender() if self.sender() else \"\"\n        # logging.info(\"Options <%s> has been changed (saved = %s simulated = %s)%s\" %\n        #              (self.identifier, self.__saved, self.__simulated, sender_str))\n        self.__saved = False\n        self.__simulated = False\n        # if emit_required:\n        self.changed.emit()\n\n    @property\n    def is_saved(self):\n        return self.__saved\n\n    @property\n    def is_simulated(self):\n        return self.__simulated\n\n    def saved(self, emit=True):\n        # logging.info(\"Save options, emit = %s\" % emit)\n        self.__saved = True\n        if emit:\n            self.changed.emit()\n\n    def simulated(self):\n        self.__simulated = True\n        # if emit:\n        #     self.changed.emit()\n\n    @classmethod\n    def default(cls):\n        raise NotImplementedError\n\n    @classmethod\n    def empty(cls):\n        raise NotImplementedError\n\n    @classmethod\n    def load(cls, data):\n        raise NotImplementedError\n\n    def assign(self, other):\n        \"\"\":type other: AbstractOptionsBase\"\"\"\n        self.__saved = other.__saved\n        self.__simulated = other.__simulated\n\n    def export(self):\n        raise NotImplementedError\n\n\nclass Numerics(AbstractOptionsBase):\n\n    icon = \"icons/Numerics\"\n\n    scalar = \"Scalar\"\n    vector = \"Vector\"\n\n    def __init__(self, model, speed, grid_xy, grid_z):\n        super(Numerics, self).__init__()\n\n        self.calculation_model = Variable(\n            Enum(variants=[Numerics.scalar, Numerics.vector]),\n            value=model, name=\"Model\")\n\n        self.speed_factor = Variable(\n            Numeric(vmin=0, vmax=10, dtype=int),\n            value=speed, name=\"SpeedFactor\")\n\n        self.grid_xy = Variable(\n            Numeric(vmin=1.0, vmax=50.0, dtype=float, precision=1),\n            value=grid_xy, name=\"GridXY\")\n\n        self.grid_z = Variable(\n            Numeric(vmin=1.0, vmax=50.0, dtype=float, precision=1),\n            value=grid_z, name=\"GridZ\")\n\n        self._connect_signals()\n\n    @property\n    def source_stepxy(self):\n        return config.SOURCE_SHAPE_STEP_MAP[self.speed_factor.value]\n\n    def assign(self, other):\n        \"\"\":type other: Numerics\"\"\"\n        self.calculation_model.value = other.calculation_model.value\n        self.speed_factor.value = other.speed_factor.value\n        self.grid_xy.value = other.grid_xy.value\n        self.grid_z.value = other.grid_z.value\n\n    @classmethod\n    def default(cls):\n        return cls(model=Numerics.scalar, speed=5, grid_xy=5.0, grid_z=5.0)\n\n    @classmethod\n    def empty(cls):\n        return cls(model=None, speed=None, grid_xy=None, grid_z=None)\n\n    @classmethod\n    def load(cls, data):\n        return cls.empty().parse(data)\n\n    def report(self):\n        template = self.report_header()\n        body = \"\\n\".join([\n            self.calculation_model.report(),\n            self.speed_factor.report(),\n            self.grid_xy.report(),\n            self.grid_z.report()\n        ])\n        return template % body\n\n    def export(self):\n        return {\n            self.calculation_model.name: self.calculation_model.value,\n            self.speed_factor.name: self.speed_factor.value,\n            self.grid_xy.name: self.grid_xy.value,\n            self.grid_z.name: self.grid_z.value\n        }\n\n    def parse(self, data):\n        \"\"\":type data: dict\"\"\"\n        self.calculation_model.value = data[self.calculation_model.name]\n        self.speed_factor.value = data[self.speed_factor.name]\n        self.grid_xy.value = data[self.grid_xy.name]\n        self.grid_z.value = data[self.grid_z.name]\n        return self\n\n\nclass WaferStackLayer(AbstractReportOption):\n\n    def __init__(self, material, is_parametric=False):\n        \"\"\"\n        :type material: orm.Generic\n        :type is_parametric: bool\n        \"\"\"\n        self._material = material\n        self._is_parametric = is_parametric\n\n    def connect_with(self, slot):\n        raise NotImplementedError\n\n    def disconnect_from(self, slot):\n        raise NotImplementedError\n\n    @property\n    def is_parametric(self):\n        return self._is_parametric\n\n    @staticmethod\n    def _create_parametric_material(wavelength, real, imag):\n        \"\"\"\n        :type wavelength: float\n        :type real: float\n        :type imag: float\n        \"\"\"\n        material = orm.Material(\n            name=PARAMETRIC_NAME,\n            data=[orm.MaterialData(wavelength=wavelength, real=real, imag=imag)],\n            desc=\"Parametric material n=%.2f k=+%.2fi @ %.0f nm\" % (real, imag, wavelength))\n        return material\n\n    @classmethod\n    def default_parametric(cls, wavelength):\n        \"\"\":rtype: WaferStackLayer\"\"\"\n        raise NotImplementedError\n\n    @classmethod\n    def db_stored(cls, material, *args):\n        \"\"\"\n        :type material: orm.Material\n        :rtype: WaferStackLayer\n        \"\"\"\n        raise NotImplementedError\n\n    @property\n    def wavelength(self):\n        \"\"\":rtype: list of float\"\"\"\n        raise NotImplementedError\n\n    @property\n    def refraction(self):\n        \"\"\"\n        :return: Refractive index real, image lists\n        :rtype: list of float, list of float\n        \"\"\"\n        raise NotImplementedError\n\n    @property\n    def type(self):\n        \"\"\":rtype: str\"\"\"\n        raise NotImplementedError\n\n    def refraction_at(self, wavelength):\n        wvl = self.wavelength\n        real, imag = self.refraction\n        re = numpy.interp(wavelength, wvl, real)\n        im = numpy.interp(wavelength, wvl, imag)\n        return re, im\n\n    def export(self):\n        raise NotImplementedError\n\n    @classmethod\n    def load(cls, data):\n        raise NotImplementedError\n\n    def convert2core(self):\n        raise NotImplementedError\n\n\nclass MaterialLayer(WaferStackLayer):\n    \"\"\"Class describe wafer stack layer which has predefined material data (for example Substrate)\"\"\"\n\n    icon = \"icons/Material\"\n\n    SignalsClass = orm.SignalsMeta.CreateSignalsClass(\"MaterialLayer\", [\"real\", \"imag\"], db_columns=False)\n\n    def __init__(self, material, is_parametric=False):\n        \"\"\"\n        :type material: orm.Material\n        :type is_parametric: bool\n        \"\"\"\n        self.__signals = self.__class__.SignalsClass(self)\n        WaferStackLayer.__init__(self, material, is_parametric)\n\n    def connect_with(self, slot):\n        if self.is_parametric:\n            connect(self.signals[MaterialLayer.real], slot)\n            connect(self.signals[MaterialLayer.imag], slot)\n\n    def disconnect_from(self, slot):\n        if self.is_parametric:\n            disconnect(self.signals[MaterialLayer.real], slot)\n            disconnect(self.signals[MaterialLayer.imag], slot)\n\n    @property\n    def signals(self):\n        return self.__signals\n\n    @property\n    def name(self):\n        return self._material.name\n\n    @property\n    def wavelength(self):\n        \"\"\":rtype: list of float\"\"\"\n        return [d.wavelength for d in self._material.data]\n\n    @property\n    def refraction(self):\n        \"\"\"\n        :return: Refractive index real, image lists\n        :rtype: list of float, list of float\n        \"\"\"\n        return zip(*self._material.data)\n\n    # ------------------------------------------------------------------------------------------------------------------\n    # These refraction properties are only appropriate for parametric object\n    # where only one material data item is contained in the material data list.\n\n    _real_error_string = \"Property 'real' is only available for parametric object\"\n\n    def _get_real(self):\n        if not self.is_parametric:\n            raise NotImplementedError(self._real_error_string)\n        return self._material.data[0].real\n\n    def _set_real(self, value):\n        if not self.is_parametric:\n            raise NotImplementedError(self._real_error_string)\n        if self._material.data[0].real != value:\n            self._material.data[0].real = value\n            self.signals[MaterialLayer.real].emit()\n\n    real = AttributedProperty(\n        _get_real, _set_real,\n        key=\"real\", dtype=orm.Float,\n        precision=orm.MaterialData.real.precision)\n\n    _imag_error_string = \"Property 'imag' is only available for parametric object\"\n\n    def _get_imag(self):\n        if not self.is_parametric:\n            raise NotImplementedError(self._imag_error_string)\n        return self._material.data[0].imag\n\n    def _set_imag(self, value):\n        if not self.is_parametric:\n            raise NotImplementedError(self._imag_error_string)\n        if self._material.data[0].imag != value:\n            self._material.data[0].imag = value\n            self.signals[MaterialLayer.imag].emit()\n\n    imag = AttributedProperty(\n        _get_imag, _set_imag,\n        key=\"imag\", dtype=orm.Float,\n        precision=orm.MaterialData.imag.precision)\n\n    def export(self):\n        return {\n            \"Type\": self.type,\n            \"Parametric\": self.is_parametric,\n            \"Material\": self._material.export()\n        }\n\n    @classmethod\n    def load(cls, data):\n        \"\"\":type data: dict\"\"\"\n        return cls(orm.Material.load(data[\"Material\"]), data[\"Parametric\"])\n\n\nclass Substrate(MaterialLayer):\n\n    @classmethod\n    def parametric(cls, wavelength, real, imag):\n        \"\"\"\n        :type wavelength: float\n        :type real: float\n        :type imag: float\n        \"\"\"\n        material = MaterialLayer._create_parametric_material(wavelength, real,  imag)\n        return cls(material, is_parametric=True)\n\n    @classmethod\n    def default_parametric(cls, wavelength):\n        \"\"\"\n        :type wavelength: float\n        :rtype: Substrate\n        \"\"\"\n        return cls.parametric(\n            wavelength,\n            config.DEFAULT_LAYER_REAL_INDEX,\n            config.DEFAULT_LAYER_IMAG_INDEX)\n\n    @classmethod\n    def db_stored(cls, material, *args):\n        \"\"\"\n        :type material: orm.Material\n        :rtype: Substrate\n        \"\"\"\n        return cls(material)\n\n    @property\n    def type(self):\n        return SUBSTRATE_TYPE\n\n    def report(self):\n        body = [\n            ReportTemplates.value % {\"name\": \"Name\", \"value\": \"%(order)d:\" + self._material.name},\n            ReportTemplates.value % {\"name\": \"Refractive\", \"value\": \"%(index)s\"},\n        ]\n        template = self.report_header()\n        return template % \"\\n\".join(body)\n\n    def convert2core(self):\n        real, imag = self.refraction[0], self.refraction[1]\n        if len(self.wavelength) > 1:\n            return oplc.StandardWaferLayer(\n                oplc.SUBSTRATE_LAYER, numpy.asfortranarray(self.wavelength),\n                numpy.asfortranarray(real), numpy.asfortranarray(imag))\n        else:\n            return oplc.ConstantWaferLayer(oplc.SUBSTRATE_LAYER, real[0], imag[0])\n\n\nclass StandardLayer(MaterialLayer):\n    \"\"\"Class describe wafer stack layer that has both a predefined material and thickness\"\"\"\n\n    SignalsClass = orm.SignalsMeta.CreateSignalsClass(\"StandardLayer\", [\"real\", \"imag\", \"thickness\"], db_columns=False)\n\n    def __init__(self, material, thickness, is_parametric=False):\n        \"\"\"\n        :type material: orm.Material\n        :type thickness: float\n        :type is_parametric: bool\n        \"\"\"\n        MaterialLayer.__init__(self, material, is_parametric)\n        self._thickness = Variable(Numeric(vmin=0.0, vmax=10000.0, precision=1), value=thickness, name=\"Thickness\")\n\n    def connect_with(self, slot):\n        super(StandardLayer, self).connect_with(slot)\n        connect(self.signals[StandardLayer.thickness], slot)\n\n    def disconnect_from(self, slot):\n        super(StandardLayer, self).disconnect_from(slot)\n        disconnect(self.signals[StandardLayer.thickness], slot)\n\n    @classmethod\n    def parametric(cls, wavelength, real, imag, thickness):\n        \"\"\"\n        :type wavelength: float\n        :type real: float\n        :type imag: float\n        :type thickness: float\n        \"\"\"\n        material = MaterialLayer._create_parametric_material(wavelength, real,  imag)\n        return cls(material, thickness, is_parametric=True)\n\n    @classmethod\n    def default_parametric(cls, wavelength):\n        \"\"\"\n        :type wavelength: float\n        :rtype: StandardLayer\n        \"\"\"\n        return cls.parametric(\n            wavelength,\n            config.DEFAULT_LAYER_REAL_INDEX,\n            config.DEFAULT_LAYER_IMAG_INDEX,\n            config.DEFAULT_LAYER_THICKNESS)\n\n    @classmethod\n    def db_stored(cls, material, *args):\n        \"\"\"\n        :type material: orm.Material\n        :rtype: StandardLayer\n        \"\"\"\n        thickness = args[0]\n        return cls(material, thickness)\n\n    def _get_thickness(self):\n        return self._thickness.value\n\n    def _set_thickness(self, value):\n        if self._thickness.value != value:\n            self._thickness.value = value\n            self.signals[StandardLayer.thickness].emit()\n\n    thickness = AttributedProperty(_get_thickness, _set_thickness, key=\"thickness\", dtype=orm.Float)\n\n    @property\n    def type(self):\n        return LAYER_TYPE\n\n    def export(self):\n        result = super(StandardLayer, self).export()\n        result.update({\"Thickness\": self.thickness})\n        return result\n\n    @classmethod\n    def load(cls, data):\n        \"\"\":type data: dict\"\"\"\n        return cls(\n            material=orm.Material.load(data[\"Material\"]),\n            thickness=data[\"Thickness\"],\n            is_parametric=data[\"Parametric\"])\n\n    def report(self):\n        body = [\n            ReportTemplates.value % {\"name\": \"Name\", \"value\": \"%(order)d:\" + self._material.name},\n            ReportTemplates.value % {\"name\": \"Thickness\", \"value\": self.thickness},\n            ReportTemplates.value % {\"name\": \"Refractive\", \"value\": \"%(index)s\"},\n        ]\n        template = self.report_header()\n        return template % \"\\n\".join(body)\n\n    def convert2core(self):\n        real, imag = self.refraction[0], self.refraction[1]\n        if len(self.wavelength) > 1:\n            return oplc.StandardWaferLayer(\n                oplc.SUBSTRATE_LAYER, self.thickness, numpy.asfortranarray(self.wavelength),\n                numpy.asfortranarray(real), numpy.asfortranarray(imag))\n        else:\n            return oplc.ConstantWaferLayer(oplc.SUBSTRATE_LAYER, self.thickness, real[0], imag[0])\n\n\nclass Resist(AbstractOptionsBase, StandardLayer):\n    \"\"\"Class redefined from database material to resist\"\"\"\n\n    icon = \"icons/Resist\"\n\n    def __init__(self, material, thickness):\n        \"\"\"\n        :type material: orm.Resist\n        :type thickness: float\n        \"\"\"\n        AbstractOptionsBase.__init__(self)\n        StandardLayer.__init__(self, material, thickness)\n\n    def connect_with(self, slot):\n        super(Resist, self).connect_with(slot)\n        connect(self._material.peb.signals[orm.PebParameters.ea], slot)\n        connect(self._material.peb.signals[orm.PebParameters.ln_ar], slot)\n\n        connect(self._material.exposure.signals[orm.ExposureParameters.wavelength], slot)\n        connect(self._material.exposure.signals[orm.ExposureParameters.a], slot)\n        connect(self._material.exposure.signals[orm.ExposureParameters.b], slot)\n        connect(self._material.exposure.signals[orm.ExposureParameters.c], slot)\n        connect(self._material.exposure.signals[orm.ExposureParameters.n], slot)\n\n        if isinstance(self._material.developer, orm.DeveloperExpr):\n            for obj in self._material.developer.object_values:\n                connect(obj.signals[orm.DeveloperExprArgValue.value], slot)\n\n    def disconnect_from(self, slot):\n        super(Resist, self).disconnect_from(slot)\n        disconnect(self._material.peb.signals[orm.PebParameters.ea], slot)\n        disconnect(self._material.peb.signals[orm.PebParameters.ln_ar], slot)\n\n        disconnect(self._material.exposure.signals[orm.ExposureParameters.wavelength], slot)\n        disconnect(self._material.exposure.signals[orm.ExposureParameters.a], slot)\n        disconnect(self._material.exposure.signals[orm.ExposureParameters.b], slot)\n        disconnect(self._material.exposure.signals[orm.ExposureParameters.c], slot)\n        disconnect(self._material.exposure.signals[orm.ExposureParameters.n], slot)\n\n        if isinstance(self._material.developer, orm.DeveloperExpr):\n            for obj in self._material.developer.object_values:\n                disconnect(obj.signals[orm.DeveloperExprArgValue.value], slot)\n\n    @classmethod\n    def default_parametric(cls, wavelength):\n        raise NotImplementedError\n\n    @classmethod\n    def db_stored(cls, material, *args):\n        raise NotImplementedError\n\n    @property\n    def db(self):\n        \"\"\":rtype: orm.Resist\"\"\"\n        return self._material\n\n    @property\n    def name(self):\n        return self._material.name\n\n    @name.setter\n    def name(self, value):\n        self._material.name = value\n        self.onOptionChanged()\n\n    @property\n    def exposure(self):\n        \"\"\":rtype: orm.ExposureParameters\"\"\"\n        return self._material.exposure\n\n    @property\n    def peb(self):\n        \"\"\":rtype: orm.PebParameters\"\"\"\n        return self._material.peb\n\n    @property\n    def developer(self):\n        \"\"\":rtype: orm.DeveloperInterface\"\"\"\n        return self._material.developer\n\n    @developer.setter\n    def developer(self, value):\n        \"\"\":type value: orm.DeveloperInterface\"\"\"\n        if self._material.developer is not value:\n            self._material.developer = value\n            self.onOptionChanged()\n\n    @property\n    def wavelength(self):\n        \"\"\":rtype: list of float\"\"\"\n        # Because refraction of the resist changes linear depend on wavelength so list of refractions and\n        # wavelengths return to refraction_at method automatically calculate it.\n        return [0.0, self._material.exposure.wavelength]\n\n    @property\n    def refraction(self):\n        \"\"\"\n        :return: Refractive index real, image lists\n        :rtype: list of float, list of float\n        \"\"\"\n        re = self._material.exposure.n\n        # k = w/4/pi*(A+B)/1000\n        ab = (self._material.exposure.a + self._material.exposure.b)*1e-3\n        im = self._material.exposure.wavelength/4.0/numpy.pi * ab\n        return [re, re], [0.0, im]\n\n    @property\n    def type(self):\n        return RESIST_TYPE\n\n    def report(self):\n        body = [\n            ReportTemplates.value % {\"name\": \"Name\", \"value\": self._material.name},\n            ReportTemplates.value % {\"name\": \"Thickness\", \"value\": self.thickness},\n            ReportTemplates.value % {\"name\": \"<i>Exposure</i>\", \"value\": \"\"},\n            ReportTemplates.subvalue % {\"name\": \"Wavelength\", \"value\": self._material.exposure.wavelength},\n            ReportTemplates.subvalue % {\"name\": \"Refractive\", \"value\": self._material.exposure.n},\n            ReportTemplates.subvalue % {\"name\": \"Dill A\", \"value\": self._material.exposure.a},\n            ReportTemplates.subvalue % {\"name\": \"Dill B\", \"value\": self._material.exposure.b},\n            ReportTemplates.subvalue % {\"name\": \"Dill C\", \"value\": self._material.exposure.c},\n            ReportTemplates.value % {\"name\": \"<i>Post Exposure Bake</i>\", \"value\": \"\"},\n            ReportTemplates.subvalue % {\"name\": \"Ln(Ar)\", \"value\": self._material.peb.ln_ar},\n            ReportTemplates.subvalue % {\"name\": \"Ea\", \"value\": self._material.peb.ea},\n            ReportTemplates.value % {\"name\": \"<i>Development</i>\", \"value\": \"\"},\n        ]\n\n        if isinstance(self._material.developer, orm.DeveloperExpr):\n            body.append(ReportTemplates.subvalue % {\"name\": \"Developer\", \"value\": self._material.developer.name})\n            for arg, value in zip(self._material.developer.model.args, self._material.developer.values):\n                body.append(ReportTemplates.subvalue % {\"name\": arg.name, \"value\": value})\n        elif isinstance(self._material.developer, orm.DeveloperSheet):\n            body.append(ReportTemplates.subvalue % {\"name\": \"Developer\", \"value\": self._material.developer.name})\n        else:\n            body.append(ReportTemplates.subvalue % {\"name\": \"Developer\", \"value\": \"Undefined\"})\n\n        template = self.report_header()\n        return template % \"\\n\".join(body)\n\n    def assign(self, other):\n        \"\"\":type other: Resist\"\"\"\n        self.thickness = other.thickness\n        self._material.assign(other._material)\n        self.onOptionChanged()\n\n    def export(self):\n        return {\n            \"Type\": self.type,\n            \"Thickness\": self.thickness,\n            \"Material\": self._material.export()\n        }\n\n    @classmethod\n    def load(cls, data):\n        \"\"\":type data: dict\"\"\"\n        return cls(material=orm.Resist.load(data[\"Material\"]), thickness=data[\"Thickness\"])\n\n    def parse(self, data):\n        \"\"\":type data: dict\"\"\"\n        self._material.parse(data[\"Material\"])\n        self.thickness = data[\"Thickness\"]\n\n    def convert2core(self):\n        exposure = self._material.exposure.convert2core()\n        peb = self._material.peb.convert2core()\n        developer = self._material.developer.convert2core()\n        return oplc.ResistWaferLayer(self.thickness, exposure, peb, developer)\n\n\nclass WaferProcess(AbstractOptionsBase):\n\n    icon = \"icons/WaferStack\"\n\n    _resist_key = 0\n    _substrate_key = -1\n\n    def __init__(self, stack_layers=None):\n        \"\"\"\n        :type stack_layers: list of WaferStackLayer or None\n        \"\"\"\n        super(WaferProcess, self).__init__()\n\n        self._stack = list()\n        \"\"\":type: list of WaferStackLayer\"\"\"\n\n        if stack_layers is not None:\n            for layer in stack_layers:\n                if not isinstance(layer, WaferStackLayer):\n                    raise TypeError(\"Value must be WaferStackLayer\")\n                layer.connect_with(self.onOptionChanged)\n                self._stack.append(layer)\n\n        self.imaging_tool = None\n        \"\"\":type: ImagingTool\"\"\"\n\n        connect(self.changed, GlobalSignals.onChanged)\n\n    def insert(self, index, stack_layer):\n        \"\"\"\n        :type index: int\n        :type stack_layer: WaferStackLayer\n        \"\"\"\n        if not isinstance(stack_layer, WaferStackLayer):\n            raise TypeError(\"Value must be WaferStackLayer\")\n\n        stack_layer.connect_with(self.onOptionChanged)\n        self._stack.insert(index, stack_layer)\n        self.onOptionChanged()\n\n    def remove(self, index):\n        \"\"\":type index: int\"\"\"\n        self._stack[index].disconnect_from(self.onOptionChanged)\n        del self._stack[index]\n        self.onOptionChanged()\n\n    def __iter__(self):\n        return self._stack.__iter__()\n\n    def __setitem__(self, key, value):\n        \"\"\"\n        :type key: int\n        :type value: WaferStackLayer\n        \"\"\"\n        if not isinstance(value, WaferStackLayer):\n            raise TypeError(\"Value must be WaferStackLayer\")\n        # if key in self._stack:\n        #     self._link_layer(self._stack[key], action=disconnect)\n        # self._stack[key] = value\n        if key == WaferProcess._resist_key:\n            self._stack[key] = value\n        else:\n            self.remove(key)\n            self.insert(key, value)\n            self.onOptionChanged()\n\n    def __getitem__(self, item):\n        \"\"\"\n        :type item: int\n        :rtype: WaferStackLayer\n        \"\"\"\n        return self._stack[item]\n\n    def __len__(self):\n        \"\"\":rtype: int\"\"\"\n        return len(self._stack)\n\n    @property\n    def resist(self):\n        \"\"\":rtype: Resist\"\"\"\n        return self[WaferProcess._resist_key]\n\n    @resist.setter\n    def resist(self, value):\n        \"\"\":type value: Resist\"\"\"\n        if self.resist is not value:\n            self.resist.disconnect_from(self.onOptionChanged)\n            if WaferProcess._resist_key in self:\n                # noinspection PyUnresolvedReferences\n                disconnect(self[WaferProcess._resist_key].changed, self.onOptionChanged)\n            self[WaferProcess._resist_key] = value\n            # noinspection PyUnresolvedReferences\n            connect(self[WaferProcess._resist_key].changed, self.onOptionChanged)\n            self.resist.connect_with(self.onOptionChanged)\n\n    @property\n    def substrate(self):\n        \"\"\":rtype: Substrate\"\"\"\n        return self[WaferProcess._substrate_key]\n\n    @staticmethod\n    def _create_default_substrate():\n        substrate = orm.Material(\n            name=config.DEFAULT_SUBSTRATE_MATERIAL_NAME,\n            data=[orm.MaterialData(wavelength=362.5, real=6.308, imag=2.88)],\n            desc=\"Default substrate material, n=6.308+2.88i @ 362.5 nm\")\n        return substrate\n\n    @staticmethod\n    def _create_default_devrate():\n        dev_rate = orm.DeveloperSheet(\n            name=config.DEFAULT_DEV_RATE_NAME,\n            is_depth=False,\n            data=[orm.DeveloperSheetData(pac=0.0, rate=100.0),\n                  orm.DeveloperSheetData(pac=0.3, rate=90.0),\n                  orm.DeveloperSheetData(pac=0.7, rate=10.0),\n                  orm.DeveloperSheetData(pac=1.0, rate=0.1)],\n            desc=\"Default development rate data\")\n        return dev_rate\n\n    @staticmethod\n    def _create_default_resist():\n        exposure = orm.ExposureParameters(wavelength=365.0, a=0.5, b=0.5, c=0.01, n=1.5)\n        peb = orm.PebParameters(ea=30.0, ln_ar=40.0)\n        dev_rate = WaferProcess._create_default_devrate()\n\n        resist = orm.Resist(\n            name=config.DEFAULT_RESIST_NAME, comment=\"Default resist data\",\n            exposure=exposure, peb=peb, developer=dev_rate)\n\n        return resist\n\n    # noinspection PyMethodOverriding\n    @classmethod\n    def default(cls):\n        \"\"\":rtype: WaferProcess\"\"\"\n        resist = Resist(WaferProcess._create_default_resist(), config.DEFAULT_LAYER_THICKNESS)\n        substrate = Substrate(WaferProcess._create_default_substrate())\n        return cls([resist, substrate])\n\n    @classmethod\n    def empty(cls):\n        return cls()\n\n    @classmethod\n    def load(cls, data):\n        stack_layers = []\n        for layer_data in data:\n            if layer_data[\"Type\"] == RESIST_TYPE:\n                layer = Resist.load(layer_data)\n            elif layer_data[\"Type\"] == LAYER_TYPE:\n                layer = StandardLayer.load(layer_data)\n            elif layer_data[\"Type\"] == SUBSTRATE_TYPE:\n                layer = Substrate.load(layer_data)\n            else:\n                raise KeyError(\"Unknown layer type: %s\" % layer_data[\"Type\"])\n            stack_layers.append(layer)\n        return cls(stack_layers=stack_layers)\n\n    def __del__(self):\n        # FIXME: This is workaround for strange error when exit: _stack not found in wafer_process\n        pass\n\n    def saved(self, emit=True):\n        self.resist.saved(emit=False)\n        super(WaferProcess, self).saved(emit)\n\n    def report(self):\n        template = self.report_header()\n        body = \"\\n\".join(\n            [ReportTemplates.composite % layer.report() %\n             {\n                 \"order\": len(self._stack)-order-1,\n                 # \"index\": \"%.2f%+.2fi\" % layer.refraction_at(self.resist.material.exposure.wavelength)\n                 \"index\": \"%.2f%+.2fi\" % layer.refraction_at(self.resist.exposure.wavelength)\n             }\n             for order, layer in enumerate(self._stack)\n             if not isinstance(layer, Resist)])\n        return template % body\n\n    def export(self):\n        return [layer.export() for layer in self._stack]\n\n    def assign(self, other):\n        \"\"\":type other: WaferProcess\"\"\"\n        # Delete all layers except the resist (first layer)\n        while len(self) != 1:\n            self.remove(-1)\n\n        for layer in other:\n            if isinstance(layer, Resist):\n                self.resist.assign(layer)\n            else:\n                layer.connect_with(self.onOptionChanged)\n                self._stack.append(layer)\n\n    def parse(self, data):\n        \"\"\":type data: dict\"\"\"\n        stack_layers = []\n\n        # Delete all layers except the resist (first layer)\n        while len(self) != 1:\n            self.remove(-1)\n\n        for layer_data in data:\n            if layer_data[\"Type\"] == RESIST_TYPE:\n                # self.resist.parse(layer_data)\n                self.resist = Resist.load(layer_data)\n            elif layer_data[\"Type\"] == LAYER_TYPE:\n                stack_layers.append(StandardLayer.load(layer_data))\n            elif layer_data[\"Type\"] == SUBSTRATE_TYPE:\n                stack_layers.append(Substrate.load(layer_data))\n\n        # self._stack[WaferProcess._resist_key+1:] = stack_layers\n        for layer in stack_layers:\n            layer.connect_with(self.onOptionChanged)\n            self._stack.append(layer)\n\n    def convert2core(self):\n        result = oplc.WaferStack()\n\n        for wafer_layer in reversed(self):\n            result.push(wafer_layer.convert2core())\n\n        nenv = self.imaging_tool.immersion.value if self.imaging_tool.immersion_enabled else oplc.air_nk.real\n        core_env_layer = oplc.ConstantWaferLayer(oplc.ENVIRONMENT_LAYER, nenv, 0.0)\n        result.push(core_env_layer)\n\n        return result\n\n\nclass Mask(AbstractOptionsBase):\n\n    icon = \"icons/Mask\"\n\n    mask_type_map = {0: \"1D\", 1: \"2D\"}\n\n    def __init__(self, container):\n        \"\"\":type container: orm.Mask | orm.ConcretePluginMask\"\"\"\n        super(Mask, self).__init__()\n        self.__container = None\n        self.container = container\n        self._connect_signals()\n\n    @property\n    def container(self):\n        return self.__container\n\n    @container.setter\n    def container(self, value):\n        if self.__container is not value:\n            if self.__container is not None:\n                disconnect(self.__container.signals[orm.Mask.background], self.onOptionChanged)\n                disconnect(self.__container.signals[orm.Mask.phase], self.onOptionChanged)\n            self._set_composite_variable(\"container\", value)\n            connect(self.__container.signals[orm.Mask.background], self.onOptionChanged)\n            connect(self.__container.signals[orm.Mask.phase], self.onOptionChanged)\n\n    def report(self):\n        body = [\n            ReportTemplates.value % {\"name\": \"Name\", \"value\": self.container.name},\n            ReportTemplates.value % {\"name\": \"Dimensions\", \"value\": \"%sD\" % self.container.dimensions},\n        ]\n        if isinstance(self.container, orm.ConcretePluginMask):\n            body.append(ReportTemplates.value % {\"name\": \"Type\", \"value\": \"Plugin\"})\n            for arg, value in zip(self.container.variables, self.container.values):\n                body.append(ReportTemplates.subvalue % {\"name\": arg.name, \"value\": value})\n        elif isinstance(self.container, orm.Mask):\n            body.append(ReportTemplates.value % {\"name\": \"Type\", \"value\": \"Database\"})\n\n        template = self.report_header()\n        return template % \"\\n\".join(body)\n\n    @staticmethod\n    def default_container():\n        region_transmit = 1.0\n        bg_transmit = 0.0\n\n        feature = 250.0\n        pitch = 800.0\n        height = 800.0\n\n        name = \"Line %s/%s\" % (feature, pitch)\n        description = \"Binary dense line mask with feature = %s and pitch = %s size\" % (feature, pitch)\n        boundary = orm.Geometry.rectangle(-pitch/2.0, -height/2.0, pitch/2.0, height/2.0)\n        sim_region = boundary.clone()\n        points = [orm.Point(-feature/2.0, -height/2.0), orm.Point(-feature/2.0, height/2.0),\n                  orm.Point(feature/2.0, height/2.0), orm.Point(feature/2.0, -height/2.0)]\n        regions = [orm.Region(region_transmit, 0.0, orm.GeometryShape.Polygon, points)]\n        return orm.Mask(name, bg_transmit, 0.0, boundary, sim_region, regions, desc=description)\n\n    @classmethod\n    def default(cls):\n        return cls(container=Mask.default_container())\n\n    @classmethod\n    def empty(cls):\n        return cls(container=None)\n\n    @classmethod\n    def load(cls, data):\n        \"\"\":type data: dict\"\"\"\n        return cls.empty().parse(data)\n\n    def assign(self, other):\n        \"\"\":type other: Mask\"\"\"\n        self.container = other.container.clone()\n\n    def export(self):\n        return self.container.export()\n\n    def parse(self, data):\n        \"\"\":type data: dict\"\"\"\n        if data[orm.Generic.type.key] == str(orm.GenericType.Mask):\n            self.container = orm.Mask.load(data)\n        elif data[orm.Generic.type.key] == str(orm.GenericType.AbstractPluginMask):\n            self.container = orm.ConcretePluginMask.load(data)\n        else:\n            raise orm.UnknownObjectTypeError(data[orm.Generic.type.key])\n        return self\n\n    def convert2core(self):\n        container = self.container\n        points = oplc.Points2dArray([oplc.Point2d(*p) for p in container.boundary.points])\n        boundary = oplc.Box(points, container.background, container.phase)\n        regions = oplc.RegionsArray()\n        for region in container.regions:\n            points = oplc.Points2dArray([oplc.Point2d(p.x, p.y) for p in region.points])\n            regions.append(oplc.Region(points, region.transmittance, region.phase))\n        return oplc.Mask(regions, boundary)\n\n\nclass ImagingTool(AbstractOptionsBase):\n\n    icon = \"icons/ImagingTool\"\n\n    pupil_filter_key = \"PupilFilter\"\n    source_shape_key = \"SourceShape\"\n\n    def __init__(self, wavelength, numerical_aperture, reduction_ratio, flare,\n                 immersion, immersion_enabled, source_shape, pupil_filter):\n        \"\"\"\n        :param float wavelength: Imaging tool nominal wavelength\n        :param float numerical_aperture: Imaging tool projection lenses nominal numerical aperture\n        :param float reduction_ratio: Imaging tool projection lenses reduction ratio\n        :param float flare: Imaging tool parasitic flare (empirical parameter)\n        :param float or None immersion: Refraction index of immersion layer above resist (None if not applicable)\n        :param bool immersion_enabled: If True immersion data is valid and enabled\n        :param orm.SourceShape or orm.ConcretePluginSourceShape source_shape: Source shape of the imaging tool\n        :param orm.PupilFilter or orm.ConcretePluginPupilFilter or None pupil_filter: Projection lenses pupil filter\n            of the imaging tool (None - no)\n        \"\"\"\n        super(ImagingTool, self).__init__()\n        self.__source_shape = source_shape\n        self.__pupil_filter = pupil_filter\n\n        self.wavelength = Variable(\n            Numeric(vmin=0.0001, vmax=1000.0, dtype=float),\n            value=wavelength, name=\"Wavelength\")\n        self.numerical_aperture = Variable(\n            Numeric(vmin=0.0001, vmax=1.0, dtype=float),\n            value=numerical_aperture, name=\"Numerical Aperture\")\n        self.reduction_ratio = Variable(\n            Numeric(vmin=1.0, vmax=10.0, dtype=float),\n            value=reduction_ratio, name=\"Reduction Ratio\")\n        self.flare = Variable(\n            Numeric(vmin=0.0, vmax=1.0, dtype=float),\n            value=flare, name=\"Flare\")\n\n        immersion = 1.44 if immersion is None else immersion\n\n        self.immersion = Variable(\n            Numeric(vmin=1.0, vmax=3.0, dtype=float),\n            value=immersion, name=\"Immersion\")\n\n        self.__immersion_enabled = immersion_enabled\n\n        self.numerics = None\n        \"\"\":type: Numerics\"\"\"\n\n        self._connect_signals()\n\n    @property\n    def source_shape(self):\n        return self.__source_shape\n\n    @source_shape.setter\n    def source_shape(self, value):\n        \"\"\":type value: orm.SourceShape or orm.ConcretePluginSourceShape\"\"\"\n        if self.__source_shape is not value:\n            self._set_composite_variable(\"source_shape\", value)\n            self.__source_shape.numerics = self.numerics\n\n    @property\n    def pupil_filter(self):\n        return self.__pupil_filter\n\n    @pupil_filter.setter\n    def pupil_filter(self, value):\n        if self.__pupil_filter is not value:\n            self._set_composite_variable(\"pupil_filter\", value)\n\n    @property\n    def immersion_enabled(self):\n        return self.__immersion_enabled\n\n    @immersion_enabled.setter\n    def immersion_enabled(self, value):\n        if self.__immersion_enabled != value:\n            self.__immersion_enabled = value\n            self.onOptionChanged()\n\n    def report(self):\n        body = [\n            self.wavelength.report(),\n            self.numerical_aperture.report(),\n            self.reduction_ratio.report(),\n            self.flare.report()\n        ]\n        if self.immersion_enabled:\n            body.append(self.immersion.report())\n\n        body.append(ReportTemplates.value % {\"name\": \"Source Shape\", \"value\": self.source_shape.name})\n        if isinstance(self.source_shape, orm.ConcretePluginSourceShape):\n            body.append(ReportTemplates.subvalue % {\"name\": \"Type\", \"value\": \"Plugin\"})\n            for arg, value in zip(self.source_shape.variables, self.source_shape.values):\n                body.append(ReportTemplates.subvalue % {\"name\": arg.name, \"value\": value})\n        elif isinstance(self.source_shape, orm.SourceShape):\n            body.append(ReportTemplates.subvalue % {\"name\": \"Type\", \"value\": \"Database\"})\n\n        if self.pupil_filter is not None:\n            body.append(ReportTemplates.value % {\"name\": \"Pupil Filter\", \"value\": self.pupil_filter.name})\n            if isinstance(self.pupil_filter, orm.ConcretePluginPupilFilter):\n                body.append(ReportTemplates.subvalue % {\"name\": \"Type\", \"value\": \"Plugin\"})\n                for arg, value in zip(self.pupil_filter.variables, self.pupil_filter.values):\n                    body.append(ReportTemplates.subvalue % {\"name\": arg.name, \"value\": value})\n            elif isinstance(self.pupil_filter, orm.PupilFilter):\n                body.append(ReportTemplates.subvalue % {\"name\": \"Type\", \"value\": \"Database\"})\n\n        template = self.report_header()\n        return template % \"\\n\".join(body)\n\n    @classmethod\n    def default(cls):\n        default_source_shape = orm.SourceShape(\n            name=\"CoherentDefault\",\n            data=[orm.SourceShapeData(x=0.0, y=0.0, intensity=1.0)],\n            desc=\"Default ideal conventional coherent source shape\")\n        return cls(\n            wavelength=365.0,\n            numerical_aperture=0.51,\n            reduction_ratio=1.0,\n            flare=0.0,\n            immersion=None,\n            immersion_enabled=False,\n            source_shape=default_source_shape,\n            pupil_filter=None)\n\n    @classmethod\n    def empty(cls):\n        return cls(\n            wavelength=None,\n            numerical_aperture=None,\n            reduction_ratio=None,\n            flare=None,\n            immersion=None,\n            immersion_enabled=False,\n            source_shape=None,\n            pupil_filter=None\n        )\n\n    def export(self):\n        if self.pupil_filter is not None:\n            pupil_filter = {ImagingTool.pupil_filter_key: self.pupil_filter.export()}\n        else:\n            pupil_filter = {}\n\n        if self.immersion_enabled:\n            immersion = {self.immersion.name: self.immersion.value}\n        else:\n            immersion = {}\n\n        result = {\n            self.wavelength.name: self.wavelength.value,\n            self.numerical_aperture.name: self.numerical_aperture.value,\n            self.reduction_ratio.name: self.reduction_ratio.value,\n            self.flare.name: self.flare.value,\n            ImagingTool.source_shape_key: self.source_shape.export(),\n        }\n\n        result.update(pupil_filter)\n        result.update(immersion)\n\n        return result\n\n    def assign(self, other):\n        \"\"\":type other: ImagingTool\"\"\"\n        self.wavelength.value = other.wavelength.value\n        self.numerical_aperture.value = other.numerical_aperture.value\n        self.reduction_ratio.value = other.reduction_ratio.value\n        self.flare.value = other.flare.value\n        self.immersion.value = other.immersion.value\n        self.immersion_enabled = other.immersion_enabled\n        self.source_shape = other.source_shape.clone()\n        self.pupil_filter = other.pupil_filter.clone() if other.pupil_filter is not None else None\n\n    def parse(self, data):\n        \"\"\":type data: dict\"\"\"\n        self.wavelength.value = float(data[self.wavelength.name])\n        self.numerical_aperture.value = float(data[self.numerical_aperture.name])\n        self.reduction_ratio.value = float(data[self.reduction_ratio.name])\n        self.flare.value = float(data[self.flare.name])\n\n        source_shape_data = data[ImagingTool.source_shape_key]\n        typename = source_shape_data[orm.Generic.type.key]\n        if typename == str(orm.GenericType.SourceShape):\n            self.source_shape = orm.SourceShape.load(source_shape_data)\n        elif typename == str(orm.GenericType.AbstractPluginSourceShape):\n            self.source_shape = orm.ConcretePluginSourceShape.load(source_shape_data)\n        else:\n            raise orm.UnknownObjectTypeError(typename)\n\n        try:\n            immersion = float(data[self.immersion.name])\n        except KeyError:\n            self.immersion_enabled = False\n        else:\n            self.immersion.value = immersion\n            self.immersion_enabled = True\n\n        try:\n            pupil_filter_data = data[ImagingTool.pupil_filter_key]\n        except KeyError:\n            self.pupil_filter = None\n        else:\n            typename = pupil_filter_data[orm.Generic.type.key]\n            if typename == str(orm.GenericType.PupilFilter):\n                self.pupil_filter = orm.PupilFilter.load(pupil_filter_data)\n            elif typename == str(orm.GenericType.AbstractPluginPupilFilter):\n                self.pupil_filter = orm.ConcretePluginPupilFilter.load(pupil_filter_data)\n            else:\n                raise orm.UnknownObjectTypeError(typename)\n\n        return self\n\n    @classmethod\n    def load(cls, data):\n        return cls.empty().parse(data)\n\n    def convert2core(self):\n        stepx = stepy = self.numerics.source_stepxy\n        model = self.source_shape.convert2core()\n        source_shape = oplc.SourceShape(model, stepx, stepy)\n        pupil_filter = self.pupil_filter.convert2core() \\\n            if self.pupil_filter is not None else oplc.PupilFilterModelEmpty()\n        immersion = self.immersion.value if self.immersion_enabled else oplc.air_nk.real\n        return oplc.ImagingTool(\n            source_shape, pupil_filter,\n            self.wavelength.value, self.numerical_aperture.value,\n            self.reduction_ratio.value, self.flare.value, immersion)\n\n\nclass ExposureFocus(AbstractOptionsBase):\n\n    icon = \"icons/ExposureAndFocus\"\n\n    top = \"Top\"\n    middle = \"Middle\"\n    bottom = \"Bottom\"\n\n    up = \"Up\"\n    down = \"Down\"\n\n    _dir_ = {up: -1.0, down: 1.0}\n\n    def __init__(self, exposure, focus, correctable, relative_to, direction):\n        \"\"\"\n        :param float exposure: Exposure value\n        :param float focus: Focus value\n        :param float correctable: Dose correctable coefficient\n        :param str relative_to: Focal position relative to\n        :param str direction: Positive direction of focal position\n        \"\"\"\n        super(ExposureFocus, self).__init__()\n\n        self.exposure = Variable(\n            Numeric(vmin=0.0, vmax=1000.0, dtype=float),\n            value=exposure, name=\"Exposure\")\n\n        self.focus = Variable(\n            Numeric(vmin=-10.0, vmax=10.0, dtype=float),\n            value=focus, name=\"Focus\")\n\n        self.dose_correctable = Variable(\n            Numeric(vmin=0.0, vmax=100.0, dtype=float),\n            value=correctable, name=\"DoseCorrectable\")\n\n        self.focal_relative_to = Variable(\n            Enum(variants=[ExposureFocus.top, ExposureFocus.middle, ExposureFocus.bottom]),\n            value=relative_to, name=\"FocalRelativeTo\")\n\n        self.focal_direction = Variable(\n            Enum(variants=[ExposureFocus.up, ExposureFocus.down]),\n            value=direction, name=\"FocalDirection\")\n\n        # Link to the wafer process (simplify the calculation)\n        self.wafer_process = None\n        \"\"\":type: WaferProcess\"\"\"\n\n        self._connect_signals()\n\n    _rel_ = {\n        top: lambda v: 0.0,\n        middle: lambda v: float(v)/2.0,\n        bottom: lambda v: float(v)\n    }\n\n    def assign(self, other):\n        \"\"\":type other: ExposureFocus\"\"\"\n        self.exposure.value = other.exposure.value\n        self.focus.value = other.focus.value\n        self.dose_correctable.value = other.dose_correctable.value\n        self.focal_relative_to.value = other.focal_relative_to.value\n        self.focal_direction.value = other.focal_direction.value\n\n    @property\n    def focal_plane(self):\n        \"\"\"\n        Calculate focus relative to the top of Resist\n        :rtype: float\n        \"\"\"\n        # noinspection PyCallingNonCallable\n        base = ExposureFocus._rel_[self.focal_relative_to.value](self.wafer_process.resist.thickness)\n        direction = ExposureFocus._dir_[self.focal_direction.value]\n        return direction * 1E3*self.focus.value + base\n\n    @classmethod\n    def default(cls):\n        return cls(\n            exposure=50.0,\n            focus=0.0,\n            correctable=1.0,\n            relative_to=ExposureFocus.top,\n            direction=ExposureFocus.up\n        )\n\n    @classmethod\n    def empty(cls):\n        return cls(\n            exposure=None,\n            focus=None,\n            correctable=None,\n            relative_to=None,\n            direction=None\n        )\n\n    @classmethod\n    def load(cls, data):\n        return cls.empty().parse(data)\n\n    def report(self):\n        template = self.report_header()\n        body = \"\\n\".join([\n            self.exposure.report(),\n            self.focus.report(),\n            self.dose_correctable.report(),\n            self.focal_relative_to.report(),\n            self.focal_direction.report(),\n        ])\n        return template % body\n\n    def export(self):\n        return {\n            self.exposure.name: self.exposure.value,\n            self.focus.name: self.focus.value,\n            self.dose_correctable.name: self.dose_correctable.value,\n            self.focal_relative_to.name: self.focal_relative_to.value,\n            self.focal_direction.name: self.focal_direction.value\n        }\n\n    def parse(self, data):\n        \"\"\":type data: dict\"\"\"\n        self.exposure.value = data[self.exposure.name]\n        self.focus.value = data[self.focus.name]\n        self.dose_correctable.value = data[self.dose_correctable.name]\n        self.focal_relative_to.value = data[self.focal_relative_to.name]\n        self.focal_direction.value = data[self.focal_direction.name]\n        return self\n\n    def convert2core(self):\n        focus_top = self.focal_plane\n        exposure = self.exposure.value\n        correctable = self.dose_correctable.value\n        return oplc.Exposure(focus_top, exposure, correctable)\n\n\nclass PostExposureBake(AbstractOptionsBase):\n\n    icon = \"icons/PEB\"\n\n    def __init__(self, time, temp):\n        super(PostExposureBake, self).__init__()\n        self.time = Variable(Numeric(vmin=0.0, vmax=500.0, precision=1), value=time, name=\"PebTime\")\n        self.temp = Variable(Numeric(vmin=0.0, vmax=300.0, precision=1), value=temp, name=\"PebTemp\")\n        self._connect_signals()\n\n    def assign(self, other):\n        \"\"\":type other: PostExposureBake\"\"\"\n        self.time.value = other.time.value\n        self.temp.value = other.temp.value\n\n    def parse(self, data):\n        \"\"\"\n        :type data: dict\n        :rtype: PostExposureBake\n        \"\"\"\n        self.time.value = data[self.time.name]\n        self.temp.value = data[self.temp.name]\n        return self\n\n    @classmethod\n    def default(cls):\n        return cls(time=50.0, temp=115.0)\n\n    @classmethod\n    def empty(cls):\n        return cls(time=None, temp=None)\n\n    @classmethod\n    def load(cls, data):\n        return cls.empty().parse(data)\n\n    def report(self):\n        template = self.report_header()\n        body = \"\\n\".join([\n            self.time.report(),\n            self.temp.report(),\n        ])\n        return template % body\n\n    def export(self):\n        return {\n            self.time.name: self.time.value,\n            self.temp.name: self.temp.value\n        }\n\n    def convert2core(self):\n        return oplc.PostExposureBake(self.time.value, self.temp.value)\n\n\nclass Development(AbstractOptionsBase):\n\n    icon = \"icons/Development\"\n\n    def __init__(self, time):\n        super(Development, self).__init__()\n        self.develop_time = Variable(\n            Numeric(vmin=0.0, vmax=5000.0, precision=1),\n            value=time, name=\"DevelopmentTime\")\n        self._connect_signals()\n\n    def assign(self, other):\n        \"\"\":type other: Development\"\"\"\n        self.develop_time.value = other.develop_time.value\n\n    @classmethod\n    def default(cls):\n        return cls(time=60.0)\n\n    @classmethod\n    def empty(cls):\n        return cls(time=None)\n\n    @classmethod\n    def load(cls, data):\n        return cls.empty().parse(data)\n\n    def report(self):\n        template = self.report_header()\n        return template % self.develop_time.report()\n\n    def export(self):\n        return {self.develop_time.name: self.develop_time.value}\n\n    def parse(self, data):\n        \"\"\":type data: dict\"\"\"\n        self.develop_time.value = data[self.develop_time.name]\n        return self\n\n    def convert2core(self):\n        return oplc.Development(self.develop_time.value)\n\n\nclass Metrology(AbstractOptionsBase):\n\n    icon = \"icons/Metrology\"\n\n    def __init__(self, measurement_height, var_meas_height, aerial_image_level, image_in_resist_level,\n                 latent_image_level, peb_latent_image_level, mask_tonality, cd_bias):\n        super(Metrology, self).__init__()\n\n        self.measurement_height = Variable(\n            Numeric(vmin=0.0, vmax=100.0, precision=2),\n            value=measurement_height, name=\"Measurement Height\")\n\n        self.variate_meas_height = Variable(\n            Enum(variants=[VARIATE_HEIGHT_FALSE, VARIATE_HEIGHT_TRUE]),\n            value=var_meas_height, name=\"Variate measurement height\")\n\n        self.aerial_image_level = Variable(\n            Numeric(vmin=0.0, precision=3),\n            value=aerial_image_level, name=\"Aerial Image Intensity Level\")\n\n        self.image_in_resist_level = Variable(\n            Numeric(vmin=0.0, precision=3),\n            value=image_in_resist_level, name=\"Image In Resist Intensity Level\")\n\n        self.latent_image_level = Variable(\n            Numeric(vmin=0.0, precision=3),\n            value=latent_image_level, name=\"Exposed Latent Image PAC Level\")\n\n        self.peb_latent_image_level = Variable(\n            Numeric(vmin=0.0, precision=3),\n            value=peb_latent_image_level, name=\"PEB Latent Image PAC Level\")\n\n        self.mask_tonality = Variable(\n            Enum(variants=[MASK_CLEAR, MASK_OPAQUE]),\n            value=mask_tonality, name=\"Mask tonality\")\n\n        self.cd_bias = Variable(\n            Numeric(vmin=0.0, precision=3),\n            value=cd_bias, name=\"Resist Profile Bias\")\n\n    def assign(self, other):\n        \"\"\":type other: Metrology\"\"\"\n        self.measurement_height.value = other.measurement_height.value\n        self.variate_meas_height.value = other.variate_meas_height.value\n        self.aerial_image_level.value = other.aerial_image_level.value\n        self.image_in_resist_level.value = other.image_in_resist_level.value\n        self.latent_image_level.value = other.latent_image_level.value\n        self.peb_latent_image_level.value = other.peb_latent_image_level.value\n        self.mask_tonality.value = other.mask_tonality.value\n        self.cd_bias.value = other.cd_bias.value\n\n    @classmethod\n    def default(cls):\n        return cls(\n            measurement_height=5.0,\n            var_meas_height=VARIATE_HEIGHT_FALSE,\n            aerial_image_level=0.3,\n            image_in_resist_level=0.3,\n            latent_image_level=0.5,\n            peb_latent_image_level=0.5,\n            mask_tonality=MASK_OPAQUE,\n            cd_bias=0.0,\n        )\n\n    @classmethod\n    def empty(cls):\n        return cls(\n            measurement_height=None,\n            var_meas_height=None,\n            aerial_image_level=None,\n            image_in_resist_level=None,\n            latent_image_level=None,\n            peb_latent_image_level=None,\n            mask_tonality=None,\n            cd_bias=None,\n        )\n\n    @classmethod\n    def load(cls, data):\n        return cls.empty().parse(data)\n\n    def report(self):\n        template = self.report_header()\n        body = \"\\n\".join([\n            self.measurement_height.report(),\n            self.variate_meas_height.report(),\n            self.aerial_image_level.report(),\n            self.image_in_resist_level.report(),\n            self.latent_image_level.report(),\n            self.peb_latent_image_level.report(),\n            self.mask_tonality.report(),\n            self.cd_bias.report(),\n        ])\n        return template % body\n\n    def export(self):\n        return {\n            self.measurement_height.name: self.measurement_height.value,\n            self.variate_meas_height.name: self.variate_meas_height.value,\n            self.aerial_image_level.name: self.aerial_image_level.value,\n            self.image_in_resist_level.name: self.image_in_resist_level.value,\n            self.latent_image_level.name: self.latent_image_level.value,\n            self.peb_latent_image_level.name: self.peb_latent_image_level.value,\n            self.mask_tonality.name: self.mask_tonality.value,\n            self.cd_bias.name: self.cd_bias.value,\n        }\n\n    def parse(self, data):\n        \"\"\":type data: dict\"\"\"\n        self.measurement_height.value = data[self.measurement_height.name]\n        self.variate_meas_height.value = data[self.variate_meas_height.name]\n        self.aerial_image_level.value = data[self.aerial_image_level.name]\n        self.image_in_resist_level.value = data[self.image_in_resist_level.name]\n        self.latent_image_level.value = data[self.latent_image_level.name]\n        self.peb_latent_image_level.value = data[self.peb_latent_image_level.name]\n        self.mask_tonality.value = data[self.mask_tonality.name]\n        self.cd_bias.value = data[self.cd_bias.name]\n        return self\n\n\nclass Options(AbstractOptionsBase):\n\n    def __init__(self, numerics, wafer_process, mask, imaging_tool,\n                 exposure_focus, peb, development, metrology, path=None, coupled=False):\n        \"\"\"\n        :type numerics: Numerics\n        :type wafer_process: WaferProcess\n        :type mask: Mask\n        :type imaging_tool: ImagingTool\n        :type exposure_focus: ExposureFocus\n        :type peb: PostExposureBake\n        :type development: Development\n        :type metrology: Metrology\n        :type path: str or None\n        :param bool coupled: If true then Options coupled with file on disk\n        \"\"\"\n        super(Options, self).__init__()\n\n        self._folder = None\n        \"\"\":type: str\"\"\"\n\n        self._filename = None\n        \"\"\":type: str\"\"\"\n\n        self.numerics = numerics\n        \"\"\":type: Numerics\"\"\"\n        self.wafer_process = wafer_process\n        \"\"\":type: WaferProcess\"\"\"\n        self.mask = mask\n        \"\"\":type: Mask\"\"\"\n        self.imaging_tool = imaging_tool\n        \"\"\":type: ImagingTool\"\"\"\n        self.exposure_focus = exposure_focus\n        \"\"\":type: ExposureFocus\"\"\"\n        self.peb = peb\n        \"\"\":type: PostExposureBake\"\"\"\n        self.development = development\n        \"\"\":type: Development\"\"\"\n        self.metrology = metrology\n        \"\"\":type: Metrology\"\"\"\n\n        self.imaging_tool.numerics = self.numerics\n        self.wafer_process.imaging_tool = self.imaging_tool\n        self.exposure_focus.wafer_process = self.wafer_process\n\n        self.__groups = [\n            self.numerics, self.wafer_process, self.mask,\n            self.imaging_tool, self.exposure_focus,\n            self.peb, self.development, self.metrology]\n        \"\"\":type: list of AbstractOptionsBase\"\"\"\n\n        self.__coupled = coupled\n        self.path = path\n\n        connect(GlobalSignals.changed, self.onOptionChanged)\n\n    def assign(self, other):\n        \"\"\":type other: Options\"\"\"\n        super(Options, self).assign(other)\n        disconnect(GlobalSignals.changed, other.onOptionChanged)\n        for group in self.__groups:\n            other_group = filter(lambda g: isinstance(g, type(group)), other.groups)[0]\n            group.assign(other_group)\n        self.path = other.path\n        self.__coupled = other.coupled\n        connect(GlobalSignals.changed, other.onOptionChanged)\n        self.changed.emit()\n\n    @property\n    def groups(self):\n        return self.__groups\n\n    @property\n    def path(self):\n        return os.path.join(self._folder, self._filename)\n\n    @path.setter\n    def path(self, value):\n        if value is not None:\n            folder, filename = os.path.split(value)\n            self._folder = folder\n            self._filename = filename\n        else:\n            self._folder = os.path.expanduser(\"~\")\n            self._filename = config.DEFAULT_OPTIONS_NAME\n\n    @property\n    def filename(self):\n        return self._filename\n\n    @property\n    def folder(self):\n        return self._folder\n\n    @property\n    def coupled(self):\n        \"\"\"\n        :return: True if options has been already coupled with the file on disk\n        :rtype: bool\n        \"\"\"\n        return self.__coupled\n\n    def couple_with(self, path):\n        # logging.info(\"Couple with: %s\" % path)\n        self.path = path\n        self.__coupled = True\n        for group in self.__groups:\n            group.saved(emit=False)\n        self.saved()\n\n    @classmethod\n    def default(cls):\n        \"\"\":rtype: Options\"\"\"\n        default_options = cls(\n            numerics=Numerics.default(),\n            wafer_process=WaferProcess.default(),\n            mask=Mask.default(),\n            imaging_tool=ImagingTool.default(),\n            exposure_focus=ExposureFocus.default(),\n            peb=PostExposureBake.default(),\n            development=Development.default(),\n            metrology=Metrology.default(),\n        )\n        return default_options\n\n    @classmethod\n    def empty(cls):\n        return cls(\n            numerics=Numerics.empty(),\n            wafer_process=WaferProcess.empty(),\n            mask=Mask.empty(),\n            imaging_tool=ImagingTool.empty(),\n            exposure_focus=ExposureFocus.empty(),\n            peb=PostExposureBake.empty(),\n            development=Development.empty(),\n            metrology=Metrology.empty(),\n        )\n\n    def report(self):\n        return (\"\"\"<table border=\"0\">\n            <tr>\n                <td valign=\"top\">%(numerics)s</td>\n                <td valign=\"top\">%(exposure_focus)s</td>\n            </tr>\n            <tr>\n\n                <td valign=\"top\">%(wafer_process)s</td>\n                <td valign=\"top\">%(resist)s</td>\n            </tr>\n            <tr>\n                <td valign=\"top\">%(mask)s</td>\n                <td valign=\"top\">%(imaging_tool)s</td>\n            </tr>\n            <tr>\n                <td valign=\"top\">%(development)s</td>\n                <td valign=\"top\">%(peb)s</td>\n            </tr>\n            <tr>\n                <td valign=\"top\">%(metrology)s</td>\n            </tr>\n        </table>\"\"\" % {\n            \"numerics\": self.numerics.report(),\n            \"wafer_process\": self.wafer_process.report(),\n            \"resist\": self.wafer_process.resist.report(),\n            \"mask\": self.mask.report(),\n            \"imaging_tool\": self.imaging_tool.report(),\n            \"exposure_focus\": self.exposure_focus.report(),\n            \"peb\": self.peb.report(),\n            \"development\": self.development.report(),\n            \"metrology\": self.metrology.report(),\n        })\n\n    def export(self):\n        return {group.identifier: group.export() for group in self.groups}\n\n    def save(self, path):\n        if not path:\n            return\n\n        data = self.export()\n\n        # import json\n        # logging.info(\"Save data:\\n%s\" % json.dumps(data, indent=4))\n        # import time\n        # time.sleep(0.1)\n\n        with open(path, \"wb\") as options_file:\n            options_file.write(bson.dumps(data))\n\n        self.couple_with(path)\n\n    def open(self, path):\n        if not path:\n            return\n\n        with open(path, \"rb\") as options_file:\n            data = bson.loads(options_file.read())\n\n        # import json\n        # logging.info(\"Parse data:\\n%s\" % json.dumps(data, indent=4))\n        # import time\n        # time.sleep(0.1)\n\n        errors = []\n\n        for group in self.__groups:\n            try:\n                # logging.debug(\"Load options group %s\" % group.name)\n                group_data = data[group.identifier]\n                try:\n                    group.parse(group_data)\n                except PluginNotFoundError as error:\n                    group.assign(type(group).default())\n                    errors.append(OptionsParseError(error.message))\n                except orm.UnknownObjectTypeError as error:\n                    group.assign(type(group).default())\n                    errors.append(OptionsParseError(error.message))\n            except KeyError:\n                group.assign(type(group).default())\n                errors.append(OptionsParseError(\"%s data not found in file\" % group.identifier))\n\n        self.couple_with(path)\n\n        if errors:\n            raise OptionsLoadErrors(errors, self)\n\n    @classmethod\n    def load(cls, path):\n        \"\"\"\n        :rtype: Options\n        \"\"\"\n        with open(path, \"rb\") as options_file:\n            data = bson.loads(options_file.read())\n\n        # import json\n        # logging.info(\"Load data:\\n%s\" % json.dumps(data, indent=4))\n        # import time\n        # time.sleep(0.1)\n\n        errors = []\n        kwargs = dict()\n\n        for group_class in [Numerics, WaferProcess, Mask, ImagingTool, ExposureFocus, PostExposureBake, Development]:\n            try:\n                logging.debug(\"Load options group %s\" % group_class.name)\n                group_data = data[group_class.name]\n                try:\n                    kwargs[group_class.name] = group_class.load(group_data)\n                except PluginNotFoundError as error:\n                    kwargs[group_class.name] = group_class.default()\n                    errors.append(OptionsParseError(error.message))\n                except orm.UnknownObjectTypeError as error:\n                    kwargs[group_class.name] = group_class.default()\n                    errors.append(OptionsParseError(error.message))\n            except KeyError:\n                kwargs[group_class.name] = group_class.default()\n                errors.append(OptionsParseError(\"%s data not found in file\" % group_class.name))\n\n        result = cls(\n            numerics=kwargs[Numerics.identifier], wafer_process=kwargs[WaferProcess.identifier], mask=kwargs[Mask.identifier],\n            imaging_tool=kwargs[ImagingTool.identifier], exposure_focus=kwargs[ExposureFocus.identifier],\n            peb=kwargs[PostExposureBake.identifier], development=kwargs[Development.identifier])\n\n        result.couple_with(path)\n\n        if errors:\n            raise OptionsLoadErrors(errors, result)\n\n        return result"
  },
  {
    "path": "OptolithiumGui/optolithium.py",
    "content": "#!/usr/bin/env python\r\n# -*- coding: utf-8 -*-\r\n\r\n# This file is part of Optolithium lithography modelling software.\r\n#\r\n# Copyright (C) 2015 Alexei Gladkikh\r\n#\r\n# This software is dual-licensed: you can redistribute it and/or modify\r\n# it under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version only for NON-COMMERCIAL usage.\r\n#\r\n# This program is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n#\r\n# If you are interested in other licensing models, including a commercial-\r\n# license, please contact the author at gladkikhalexei@gmail.com\r\n\r\nimport os\r\nimport logging as module_logging\r\nimport sys\r\nimport webbrowser\r\nimport psutil\r\n\r\nfrom qt import QtCore, QtGui, connect, Slot, backend_name\r\nfrom qt import core_version as QtCoreVersion\r\nfrom qt import version as QtBackendVersion\r\n\r\nos.environ[\"MATPLOTLIBDATA\"] = os.path.join(os.path.abspath(os.curdir), \"mpl-data\")\r\nfrom matplotlib import __version__ as matplotlib_version\r\n\r\nfrom views.controls import ControlBar, ControlsView\r\nfrom views.common import QStackedWidget, QuestionBox, ErrorBox, ExtendedErrorBox, msgBox\r\nfrom views.dbview import DatabaseView\r\nfrom views.summary import SummaryView\r\nfrom views.numerics import NumericsView\r\nfrom views.wafer import WaferProcessView\r\nfrom views.resist import ResistView\r\nfrom views.mask import MaskView\r\nfrom views.imaging import ImagingView\r\nfrom views.exposure import ExposureFocusView\r\nfrom views.peb import PostExposureBakeView\r\nfrom views.development import DevelopmentView\r\nfrom views.metrology import MetrologyView\r\nfrom views.diffraction import DiffractionPatternView\r\nfrom views.simulations import AerialImageView, ImageInResistView, LatentImageView, \\\r\n    PebLatentImageView, DevelopContoursView, ResistProfileView\r\nfrom views.sets import SimulationSets\r\nfrom views.appconfig import AppConfigurationView\r\n\r\nfrom resources import Resources\r\nfrom database.common import ApplicationDatabase\r\nfrom database.dbparser import GenericParser, GenericParserError\r\nfrom config import MEGABYTE\r\nfrom optolithiumc import OPTOLITHIUM_CORE_VERSION\r\n\r\nimport config\r\nimport helpers\r\nimport options\r\nimport plugins\r\n\r\nimport core\r\n\r\n\r\n__author__ = 'Alexei Gladkikh'\r\nfrom info import __version__\r\n\r\n\r\nlogging = module_logging.getLogger(__name__)\r\nlogging.setLevel(module_logging.INFO)\r\nhelpers.logStreamEnable(logging)\r\n\r\n\r\nclass AboutWindow(QtGui.QDialog):\r\n\r\n    def __init__(self, parent):\r\n        \"\"\":type parent: QtGui.QMainWindow\"\"\"\r\n        QtGui.QDialog.__init__(self, parent)\r\n\r\n        self.setWindowTitle(\"About\")\r\n        self.setWindowIcon(parent.windowIcon())\r\n\r\n        logo_banner = os.path.join(os.getcwd(), \"icons/Banner.png\")\r\n        self.__program_banner = QtGui.QLabel(self)\r\n        self.__program_banner.setPixmap(QtGui.QPixmap(logo_banner))\r\n        self.__program_banner.setAlignment(QtCore.Qt.AlignCenter)\r\n\r\n        self.__close_button = QtGui.QPushButton(\"Close\", self)\r\n        self.__close_button.setMaximumWidth(config.MAXIMUM_DIALOG_BUTTON_WIDTH)\r\n        connect(self.__close_button.clicked, self.close)\r\n        self.__info_box = QtGui.QGroupBox(\"Information\", self)\r\n        self.__info_layout = QtGui.QFormLayout(self.__info_box)\r\n        widget_t = QtGui.QLabel\r\n        self.__info_layout.addRow(\"Application:\", widget_t(config.APPLICATION_NAME + \" \" + __version__))\r\n        self.__info_layout.addRow(\"Author:\", widget_t(__author__))\r\n        self.__info_layout.addRow(\"Core version:\", widget_t(OPTOLITHIUM_CORE_VERSION))\r\n        self.__info_layout.addRow(\"Python version:\", widget_t(sys.version))\r\n        self.__info_layout.addRow(\"%s version:\" % backend_name, widget_t(QtBackendVersion))\r\n        self.__info_layout.addRow(\"Qt4 version:\", widget_t(QtCoreVersion))\r\n        self.__info_layout.addRow(\"Matplotlib version:\", widget_t(matplotlib_version))\r\n\r\n        self.__layout = QtGui.QGridLayout(self)\r\n        self.__layout.addWidget(self.__program_banner, 0, 0, 1, 2)\r\n        self.__layout.addWidget(self.__info_box, 1, 0, 1, 2)\r\n        self.__layout.addWidget(self.__close_button, 2, 1)\r\n\r\n\r\nclass MemoryUsageView(QtGui.QProgressBar):\r\n    STYLE = \"\"\"\r\n    QProgressBar{\r\n        text-align: center\r\n    }\r\n\r\n    QProgressBar::chunk {\r\n        width: 10px;\r\n        margin: 0px;\r\n    }\r\n    \"\"\"\r\n\r\n    def __init__(self, parent, pid):\r\n        QtGui.QProgressBar.__init__(self, parent)\r\n        self.__process = psutil.Process(pid)\r\n        self.setStyleSheet(MemoryUsageView.STYLE)\r\n        self.setFormat(\"%v MiB\")\r\n        self.update_memory()\r\n\r\n    def update_memory(self):\r\n        usage = psutil.virtual_memory()\r\n        meminfo = self.__process.get_memory_info()\r\n        total = int(usage.total/MEGABYTE)\r\n        free = int(usage.available/MEGABYTE)\r\n        required = int(meminfo.rss/MEGABYTE)\r\n        self.setMaximum(free + required)\r\n        self.setValue(required)\r\n        self.setToolTip(\"Available: %d MiB\\nTotal: %d MiB\" % (free, total))\r\n\r\n\r\nclass StatusBar(QtGui.QStatusBar):\r\n\r\n    def __init__(self, parent):\r\n        QtGui.QStatusBar.__init__(self, parent)\r\n        self.setObjectName(\"StatusBar\")\r\n        self.__mem_usage = MemoryUsageView(self, os.getpid())\r\n        self.__mem_usage.setMaximumWidth(200)\r\n        self.addPermanentWidget(self.__mem_usage)\r\n        self.__mem_update_timer = QtCore.QTimer(self)\r\n        connect(self.__mem_update_timer.timeout, self.__mem_usage.update_memory)\r\n        self.__mem_update_timer.start(config.Configuration.memory_update_interval)\r\n\r\n\r\nclass MainWindow(QtGui.QMainWindow):\r\n\r\n    def __init__(self):\r\n        QtGui.QMainWindow.__init__(self)\r\n        \r\n        Resources.load(os.getcwd(), [\"icons\", \"xhtml\"], icon_driver=QtGui.QIcon)\r\n\r\n        self.tabs = dict()\r\n        \"\"\":type: dict from str to QtGui.QWidget\"\"\"\r\n\r\n        self.tabs_stack = None\r\n        \"\"\":type: QStackedWidget\"\"\"\r\n\r\n        self.window_layout = None\r\n        \"\"\":type: QtGui.QLayout\"\"\"\r\n\r\n        self.controls_view = None\r\n        \"\"\":type: ControlsView\"\"\"\r\n\r\n        self.about_window = None\r\n        \"\"\":type: AboutWindow\"\"\"\r\n\r\n        self.dbparser = None\r\n        \"\"\":type: GenericParser\"\"\"\r\n\r\n        self.appdb = None\r\n        \"\"\":type: database.ApplicationDatabase\"\"\"\r\n\r\n        self.plugins = None\r\n        \"\"\":type: plugins.Container\"\"\"\r\n\r\n        self.my_state = None\r\n        self.my_geometry = None\r\n\r\n        self.resize(1080, 760)\r\n        self.center()\r\n\r\n        try:\r\n            config.openLayerMapConfig(config.Configuration.layer_map_path)\r\n        except config.LayerMapConfig.ParseError:\r\n            ErrorBox(self, \"Can't parse '%s' GDSII layer mapping file!\" % config.Configuration.layer_map_path)\r\n            sys.exit(-1)\r\n\r\n        self.configure_dbparser()\r\n        self.configure_database()\r\n        self.configure_plugins()\r\n        self.configure_windows()\r\n\r\n        self.appconfig = AppConfigurationView(self)\r\n\r\n        # Create initial options object\r\n        self.options = options.Options.default()\r\n\r\n        self.core = core.Core(self.options)\r\n\r\n        connect(self.options.changed, self.setApplicationTitle)\r\n        self.setApplicationTitle()\r\n        self.setWindowIcon(QtGui.QIcon(\"icons/Logo.png\"))\r\n\r\n        self.configure_controls()\r\n        self.configure_window_state()\r\n\r\n        logging.info(\"Configure status bar\")\r\n        self.status_bar = StatusBar(self)\r\n        self.setStatusBar(self.status_bar)\r\n        self.statusBar().showMessage(\"Ready\")\r\n\r\n        self.state_changed = False\r\n\r\n        logging.info(\"Configuration done\")\r\n\r\n        logging.info(\"Loading options\")\r\n        if len(sys.argv) > 1:\r\n            path = sys.argv[1]\r\n            self._open_options(path)\r\n\r\n        self.show()\r\n\r\n    # noinspection PyPep8Naming\r\n    @Slot()\r\n    def setApplicationTitle(self):\r\n        self.setWindowTitle(\"%s - [%s]%s\" % (\r\n            config.APPLICATION_NAME,\r\n            self.options.filename,\r\n            \" *\" if not self.options.is_saved else \"\"))\r\n\r\n    # noinspection PyArgumentList\r\n    def center(self):\r\n        frame = self.frameGeometry()\r\n        screen = QtGui.QApplication.desktop().screenNumber(QtGui.QApplication.desktop().cursor().pos())\r\n        center = QtGui.QApplication.desktop().screenGeometry(screen).center()\r\n        frame.moveCenter(center)\r\n        self.move(frame.topLeft())\r\n\r\n    def configure_dbparser(self):\r\n        try:\r\n            self.dbparser = GenericParser()\r\n\r\n        except GenericParserError as error:\r\n            ErrorBox(self, \"Critical error in database parser: %s\" % error.message)\r\n            sys.exit(-1)\r\n\r\n    def configure_database(self):\r\n        logging.info(\"Configure application database\")\r\n\r\n        try:\r\n            self.appdb = ApplicationDatabase.open(config.Configuration.db_path, create=True)\r\n\r\n        except ApplicationDatabase.DefaultObjectsError as missing_defaults:\r\n            reply = QuestionBox(self, \"Default objects %s not found in the database.\\n\"\r\n                                      \"Do you want to create these objects?\\n\"\r\n                                      \"Note: otherwise program will be closed.\" % missing_defaults.message,\r\n                                msgBox.Yes | msgBox.No, msgBox.Yes)\r\n            if reply == msgBox.Yes:\r\n                self.appdb = missing_defaults.fix()\r\n            else:\r\n                sys.exit(0)\r\n\r\n        except ApplicationDatabase.OperationError as error:\r\n            reply = QuestionBox(self,\r\n                                \"Application database can't be opened:\\n%s\\n\"\r\n                                \"Do you want to replace it with the empty compatible database?\\n\"\r\n                                \"Note: if you select Yes all previous data will be erased!\" % error.message,\r\n                                msgBox.Yes | msgBox.No, msgBox.No)\r\n            if reply == msgBox.Yes:\r\n                self.appdb = ApplicationDatabase.create(config.Configuration.db_path, rewrite=True)\r\n            else:\r\n                sys.exit(0)\r\n\r\n        self.appdb.parser = self.dbparser\r\n\r\n        # FIXME: Handle case when database can't be created for specified path\r\n\r\n    def configure_plugins(self):\r\n        logging.info(\"Configure application plugins\")\r\n        self.plugins = plugins.Container.load(*config.Configuration.plugin_paths)\r\n        inspector = plugins.Inspector(self.appdb)\r\n        for plugin in self.plugins:\r\n            try:\r\n                inspector.verify(plugin)\r\n            except ApplicationDatabase.SqlError as error:\r\n                logging.info(\"Can't acquire plugin '%s': %s\" % (plugin.entry.name, error.message))\r\n            except plugins.Inspector.CommonError as error:\r\n                logging.info(\"Verification plugin error '%s': %s\" % (plugin.entry.name, error.message))\r\n\r\n        dll_plugin_names = {plugin.entry.name for plugin in self.plugins}\r\n        db_plugin_names = set()\r\n        for table in self.appdb.plugin_tables:\r\n            db_plugin_names.update([str(p_object.name) for p_object in self.appdb[table]])\r\n\r\n        missed_plugins = db_plugin_names - dll_plugin_names\r\n        for plugin_name in missed_plugins:\r\n            reply = QuestionBox(self, \"Plugin %s wasn't loaded and must be removed from the application database. \"\r\n                                      \"Do you want continue? If canceled you can try to fix missed dynamic library. \"\r\n                                      \"Note: if you continue all dependent objects also will be deleted.\" % plugin_name,\r\n                                msgBox.Yes | msgBox.Cancel, msgBox.Cancel)\r\n\r\n            if reply == msgBox.Cancel:\r\n                sys.exit(0)\r\n\r\n            self.appdb.remove(plugin_name)\r\n\r\n    def configure_windows(self):\r\n        logging.info(\"Configure application windows\")\r\n        self.about_window = AboutWindow(self)\r\n\r\n    def configure_window_state(self):\r\n        self.controls_view[\"Parameters\"][\"Numerics\"].trigger()\r\n        # self.controls_view[\"Parameters\"][\"Summary\"].trigger()\r\n\r\n    def save_state(self):\r\n        self.my_state = self.saveState()\r\n        self.my_geometry = self.saveGeometry()\r\n\r\n    def load_state(self):\r\n        self.restoreState(self.my_state)\r\n        self.restoreGeometry(self.my_geometry)\r\n\r\n    def options_modified_handler(self):\r\n        \"\"\"\r\n        Check whether options has been modified and ask user to save it before reset options.\r\n\r\n        :return: True - if action accepted and False if rejected\r\n        :rtype: bool\r\n        \"\"\"\r\n        if not self.options.is_saved:\r\n            reply = QuestionBox(\r\n                self, \"Options data had been changed but not saved.\\n\"\r\n                      \"Do you want save it to %s?\" % self.options.filename,\r\n                msgBox.Cancel | msgBox.No | msgBox.Yes)\r\n            if reply == msgBox.Yes:\r\n                self.save_options()\r\n                return True\r\n            elif reply == msgBox.No:\r\n                return True\r\n            else:\r\n                return False\r\n        else:\r\n            return True\r\n\r\n    def closeEvent(self, event):\r\n        if self.options_modified_handler():\r\n            event.accept()\r\n        else:\r\n            event.ignore()\r\n\r\n    @Slot()\r\n    def new_options(self):\r\n        if self.options_modified_handler():\r\n            default_options = self.options.default()\r\n            self.options.assign(default_options)\r\n            for tab in self.tabs.values():\r\n                tab.reset()\r\n\r\n    @Slot()\r\n    def save_options(self):\r\n        if not self.options.coupled:\r\n            path, _ = QtGui.QFileDialog.getSaveFileName(\r\n                self.centralWidget(), \"Save Options As...\", self.options.path, config.OPTIONS_EXTENSION)\r\n        else:\r\n            path = self.options.path\r\n\r\n        self.options.save(path)\r\n        self.statusBar().showMessage(\"Options has been successfully saved to %s\" % path,\r\n                                     config.STATUS_BAR_MESSAGE_DURATION)\r\n\r\n    @Slot()\r\n    def save_options_as(self):\r\n        path, _ = QtGui.QFileDialog.getSaveFileName(\r\n            self.centralWidget(), \"Save Options As...\", self.options.path, config.OPTIONS_EXTENSION)\r\n\r\n        self.options.save(path)\r\n        self.statusBar().showMessage(\"Options has been successfully saved to %s\" % path,\r\n                                     config.STATUS_BAR_MESSAGE_DURATION)\r\n\r\n    def _open_options(self, path):\r\n        try:\r\n            self.options.open(path)\r\n        except options.OptionsLoadErrors as errors:\r\n            error_box = ExtendedErrorBox(\r\n                \"Options load errors occurred\",\r\n                \"During loading given option file %s the errors occurred; default values will be loaded\" % path,\r\n                str(\"\\n\").join([error.message for error in errors]))\r\n            reply = error_box.exec_()\r\n            if reply == error_box.Close:\r\n                sys.exit(-1)\r\n\r\n        for tab in self.tabs.values():\r\n            tab.reset()\r\n\r\n        self.statusBar().showMessage(\"Options has been successfully loaded from %s\" % path,\r\n                                     config.STATUS_BAR_MESSAGE_DURATION)\r\n\r\n        logging.info(\"Options has been successfully loaded from %s\" % path)\r\n\r\n    @Slot()\r\n    def load_options(self):\r\n        if self.options_modified_handler():\r\n            path, _ = QtGui.QFileDialog.getOpenFileName(\r\n                self.centralWidget(), \"Open Options\", self.options.path, config.OPTIONS_EXTENSION)\r\n            self._open_options(path)\r\n\r\n    # noinspection PyPep8Naming\r\n    def changeStackView(self):\r\n        sender_name = str(self.sender().objectName())\r\n        widget = self.tabs[sender_name]\r\n        self.tabs_stack.setCurrentWidget(widget)\r\n\r\n    # noinspection PyPep8Naming,PyMethodMayBeStatic\r\n    def onWebsiteOpen(self):\r\n        webbrowser.open(config.APPLICATION_WEBSITE)\r\n\r\n    # noinspection PyPep8Naming\r\n    def onPrint(self):\r\n        dialog = QtGui.QPrintDialog()\r\n        if dialog.exec_() == QtGui.QDialog.Accepted:\r\n            self.tabs[\"Parameters.Summary\"].print_(dialog.printer())\r\n\r\n    # noinspection PyPep8Naming\r\n    def onPrintPreview(self):\r\n        dialog = QtGui.QPrintPreviewDialog()\r\n        connect(dialog.paintRequested, self.tabs[\"Parameters.Summary\"].print_)\r\n        dialog.exec_()\r\n\r\n    # noinspection PyPep8Naming,PyMethodMayBeStatic\r\n    def onPageSetup(self):\r\n        dialog = QtGui.QPageSetupDialog()\r\n        dialog.exec_()\r\n\r\n    def configure_controls(self):\r\n        logging.info(\"Configure window controls\")\r\n        controls_data = [\r\n            ControlsView.ControlData(name=\"File\", text=\"&File\", actions=[\r\n                ControlBar.ActionData(\r\n                    name=\"New\",\r\n                    text=\"&New\",\r\n                    icon=Resources(\"icons/NewFile\"),\r\n                    callback=self.new_options,\r\n                    status_tip=\"Create a new document\",\r\n                    shortcut=\"Ctrl+N\"),\r\n                ControlBar.ActionData(\r\n                    name=\"Open\",\r\n                    text=\"&Open\",\r\n                    icon=Resources(\"icons/Open\"),\r\n                    callback=self.load_options,\r\n                    status_tip=\"Open an existing document\",\r\n                    shortcut=\"Ctrl+O\"),\r\n                ControlBar.ActionData(\r\n                    name=\"Save\",\r\n                    text=\"&Save\",\r\n                    icon=Resources(\"icons/Save\"),\r\n                    callback=self.save_options,\r\n                    status_tip=\"Save the active document\"),\r\n                ControlBar.ActionData(\r\n                    name=\"SaveAs\",\r\n                    text=\"Save As ...\",\r\n                    callback=self.save_options_as,\r\n                    status_tip=\"Save the active document with a new name\"),\r\n                None,\r\n                ControlBar.ActionData(\r\n                    name=\"Preferences\",\r\n                    text=\"&Preferences\",\r\n                    callback=self.appconfig.exec_,\r\n                    icon=Resources(\"icons/Preferences\"),\r\n                    status_tip=\"Edit preferences settings\"),\r\n                None,\r\n                ControlBar.ActionData(\r\n                    name=\"Print\",\r\n                    text=\"Print...\",\r\n                    callback=self.onPrint,\r\n                    status_tip=\"Print the active document\",\r\n                    shortcut=\"Ctrl+P\"),\r\n                ControlBar.ActionData(\r\n                    name=\"PrintPreview\",\r\n                    text=\"Print Preview\",\r\n                    callback=self.onPrintPreview,\r\n                    status_tip=\"Display a preview of the report\"),\r\n                ControlBar.ActionData(\r\n                    name=\"PrintSetup\",\r\n                    text=\"Print Setup...\",\r\n                    # callback=self.onPageSetup,\r\n                    status_tip=\"Change the printer and printing options\"),\r\n                None,\r\n                ControlBar.ActionData(\r\n                    name=\"Exit\",\r\n                    text=\"&Exit\",\r\n                    icon=Resources(\"icons/Exit\"),\r\n                    callback=self.close,\r\n                    status_tip=\"Quit the application; prompts to save document\",\r\n                    shortcut=\"Ctrl+Q\")\r\n            ]),\r\n            ControlsView.ControlData(name=\"View\", text=\"&View\", actions=[\r\n                ControlBar.ActionData(\r\n                    name=\"Database\",\r\n                    text=\"&Database\",\r\n                    icon=Resources(\"icons/Database\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"%s database storage\" % config.APPLICATION_NAME),\r\n                ControlBar.ActionData(\r\n                    name=\"Queue\",\r\n                    text=\"&Queue\",\r\n                    icon=Resources(\"icons/Queue\"),\r\n                    status_tip=\"Show the sim_region queue window\"),\r\n                ControlBar.ActionData(\r\n                    name=\"Warnings\",\r\n                    text=\"&Warnings\",\r\n                    status_tip=\"Show the warning list window\")\r\n            ]),\r\n            ControlsView.ControlData(name=\"Parameters\", text=\"&Parameters\", actions=[\r\n                ControlBar.ActionData(\r\n                    name=\"Numerics\",\r\n                    text=\"&Numerics\",\r\n                    icon=Resources(\"icons/Numerics\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Numerics\"),\r\n                ControlBar.ActionData(\r\n                    name=\"WaferProcesses\",\r\n                    text=\"&Wafer Processes\",\r\n                    icon=Resources(\"icons/WaferStack\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Wafer Processes\"),\r\n                ControlBar.ActionData(\r\n                    name=\"Resist\",\r\n                    text=\"&Resist\",\r\n                    icon=Resources(\"icons/Resist\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Resist\"),\r\n                ControlBar.ActionData(\r\n                    name=\"CoatAndPrebake\",\r\n                    text=\"&Coat and prebake\",\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Coat and prebake\"),\r\n                ControlBar.ActionData(\r\n                    name=\"Mask\",\r\n                    text=\"&Mask\",\r\n                    icon=Resources(\"icons/Mask\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Mask\"),\r\n                ControlBar.ActionData(\r\n                    name=\"ImagingTool\",\r\n                    text=\"&Imaging Tool\",\r\n                    icon=Resources(\"icons/ImagingTool\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Imaging Tool\"),\r\n                ControlBar.ActionData(\r\n                    name=\"ExposureAndFocus\",\r\n                    text=\"&Exposure and Focus\",\r\n                    icon=Resources(\"icons/ExposureAndFocus\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Exposure and Focus\"),\r\n                ControlBar.ActionData(\r\n                    name=\"PostExposureBake\",\r\n                    text=\"&Post Exposure Bake\",\r\n                    icon=Resources(\"icons/PEB\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Post Exposure Bake\"),\r\n                ControlBar.ActionData(\r\n                    name=\"Development\",\r\n                    text=\"&Development\",\r\n                    icon=Resources(\"icons/Development\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Development\"),\r\n                ControlBar.ActionData(\r\n                    name=\"Metrology\",\r\n                    text=\"M&etrology\",\r\n                    icon=Resources(\"icons/Metrology\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Metrology\"),\r\n                ControlBar.ActionData(\r\n                    name=\"Summary\",\r\n                    text=\"&Summary\",\r\n                    icon=Resources(\"icons/Summary\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Summary\")\r\n            ]),\r\n            ControlsView.ControlData(name=\"Simulation\", text=\"&Simulations\", actions=[\r\n                ControlBar.ActionData(\r\n                    name=\"DiffractionPattern\",\r\n                    text=\"&Diffraction Pattern\",\r\n                    icon=Resources(\"icons/DiffractionPattern\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Diffraction Pattern\"),\r\n                ControlBar.ActionData(\r\n                    name=\"AerialImage\",\r\n                    text=\"&Aerial Image\",\r\n                    icon=Resources(\"icons/AerialImage\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Aerial Image\"),\r\n                ControlBar.ActionData(\r\n                    name=\"ImageInResist\",\r\n                    text=\"&Image in Resist\",\r\n                    icon=Resources(\"icons/ImageInResist\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Image in Resist\"),\r\n                ControlBar.ActionData(\r\n                    name=\"ExposedLatentImage\",\r\n                    text=\"&Exposed Latent Image\",\r\n                    icon=Resources(\"icons/LatentImage\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Exposed Latent Image\"),\r\n                ControlBar.ActionData(\r\n                    name=\"PEBLatentImage\",\r\n                    text=\"&PEB Latent Image\",\r\n                    icon=Resources(\"icons/PostBakeImage\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"PEB Latent Image\"),\r\n                ControlBar.ActionData(\r\n                    name=\"DevelopTimeContours\",\r\n                    text=\"&Develop Time Contours\",\r\n                    icon=Resources(\"icons/DevelopTimeContours\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Develop Time Contours\"),\r\n                ControlBar.ActionData(\r\n                    name=\"ResistProfile\",\r\n                    text=\"&Resist Profile\",\r\n                    icon=Resources(\"icons/ResistProfile\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Resist Profile\"),\r\n                None,\r\n                ControlBar.ActionData(\r\n                    name=\"SimulationSets\",\r\n                    text=\"&Simulation Sets\",\r\n                    icon=Resources(\"icons/SimulationSets\"),\r\n                    callback=self.changeStackView,\r\n                    status_tip=\"Simulation Sets\")\r\n            ]),\r\n            ControlsView.ControlData(name=\"Help\", text=\"&Help\", actions=[\r\n                ControlBar.ActionData(\r\n                    name=\"Manual\",\r\n                    text=\"&Manual\",\r\n                    icon=Resources(\"icons/Help\"),\r\n                    status_tip=\"Application manual of %s\" % config.APPLICATION_NAME),\r\n                ControlBar.ActionData(\r\n                    name=\"About\",\r\n                    text=\"&About %s\" % config.APPLICATION_NAME,\r\n                    icon=Resources(\"icons/About\"),\r\n                    callback=self.about_window.show,\r\n                    status_tip=\"Display program information, version, copyright and etc\"),\r\n                ControlBar.ActionData(\r\n                    name=\"Warnings\",\r\n                    text=\"%s website\" % config.APPLICATION_NAME,\r\n                    icon=Resources(\"icons/Website\"),\r\n                    callback=self.onWebsiteOpen,\r\n                    status_tip=\"Launch browser to %s project website\" % config.APPLICATION_NAME)\r\n            ]),\r\n        ]\r\n\r\n        controls_group = [(\"View\", \"Parameters\", \"Simulation\")]\r\n\r\n        logging.info(\"Create controls view\")\r\n        self.controls_view = ControlsView(self, controls_data, controls_group)\r\n\r\n        logging.info(\"Create database view\")\r\n        self.tabs[\"View.Database\"] = DatabaseView(self, self.appdb)\r\n        \r\n        logging.info(\"Create numerics view\")\r\n        self.tabs[\"Parameters.Numerics\"] = NumericsView(self, self.options)\r\n\r\n        logging.info(\"Create wafer processes view\")\r\n        self.tabs[\"Parameters.WaferProcesses\"] = WaferProcessView(\r\n            self, self.options.wafer_process, self.appdb)\r\n\r\n        logging.info(\"Create resist view\")\r\n        self.tabs[\"Parameters.Resist\"] = ResistView(\r\n            self, self.options.wafer_process, self.options.peb.temp, self.appdb)\r\n\r\n        logging.info(\"Create mask view\")\r\n        self.tabs[\"Parameters.Mask\"] = MaskView(self, self.options, self.appdb)\r\n\r\n        logging.info(\"Create imaging tool view\")\r\n        self.tabs[\"Parameters.ImagingTool\"] = ImagingView(self, self.options, self.appdb)\r\n\r\n        logging.info(\"Create exposure and focus view\")\r\n        self.tabs[\"Parameters.ExposureAndFocus\"] = ExposureFocusView(\r\n            self, self.options.exposure_focus, self.options.wafer_process)\r\n\r\n        logging.info(\"Create post exposure bake view\")\r\n        self.tabs[\"Parameters.PostExposureBake\"] = PostExposureBakeView(self, self.options)\r\n\r\n        logging.info(\"Create development view\")\r\n        self.tabs[\"Parameters.Development\"] = DevelopmentView(\r\n            self, self.options.development, self.options.wafer_process)\r\n\r\n        logging.info(\"Create metrology view\")\r\n        self.tabs[\"Parameters.Metrology\"] = MetrologyView(self, self.options)\r\n\r\n        logging.info(\"Create summary view\")\r\n        self.tabs[\"Parameters.Summary\"] = SummaryView(self, self.options)\r\n\r\n        logging.info(\"Create diffraction pattern simulation view\")\r\n        self.tabs[\"Simulation.DiffractionPattern\"] = DiffractionPatternView(self, self.core)\r\n\r\n        logging.info(\"Create aerial image simulation view\")\r\n        self.tabs[\"Simulation.AerialImage\"] = AerialImageView(self, self.core.aerial_image, self.options)\r\n\r\n        logging.info(\"Create image in resist simulation view\")\r\n        self.tabs[\"Simulation.ImageInResist\"] = ImageInResistView(self, self.core.image_in_resist, self.options)\r\n\r\n        logging.info(\"Create exposed latent image simulation view\")\r\n        self.tabs[\"Simulation.ExposedLatentImage\"] = LatentImageView(self, self.core.latent_image, self.options)\r\n\r\n        logging.info(\"Create peb latent image simulation view\")\r\n        self.tabs[\"Simulation.PEBLatentImage\"] = PebLatentImageView(self, self.core.peb_latent_image, self.options)\r\n\r\n        logging.info(\"Create develop time contours simulation view\")\r\n        self.tabs[\"Simulation.DevelopTimeContours\"] = \\\r\n            DevelopContoursView(self, self.core.develop_contours, self.options)\r\n\r\n        logging.info(\"Create resist profile simulation view\")\r\n        self.tabs[\"Simulation.ResistProfile\"] = ResistProfileView(self, self.core.resist_profile, self.options)\r\n\r\n        logging.info(\"Create simulation sets view\")\r\n        self.tabs[\"Simulation.SimulationSets\"] = SimulationSets(self, self.core)\r\n\r\n        logging.info(\"Configure stack widget\")\r\n        window = QtGui.QWidget()\r\n        self.setCentralWidget(window)\r\n        self.tabs_stack = QStackedWidget(window)\r\n\r\n        self.window_layout = QtGui.QHBoxLayout(window)\r\n        self.window_layout.addWidget(self.tabs_stack)\r\n\r\n        # self.scroll_widget = QtGui.QScrollArea()\r\n        # self.scroll_widget.setWidget(window)\r\n        # self.scroll_widget.setWidgetResizable(True)\r\n\r\n        for control in self.tabs.values():\r\n            self.tabs_stack.addWidget(control)\r\n"
  },
  {
    "path": "OptolithiumGui/pcpi.py",
    "content": "# This file is part of Optolithium lithography modelling software.\r\n#\r\n# Copyright (C) 2015 Alexei Gladkikh\r\n#\r\n# This software is dual-licensed: you can redistribute it and/or modify\r\n# it under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version only for NON-COMMERCIAL usage.\r\n#\r\n# This program is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n#\r\n# If you are interested in other licensing models, including a commercial-\r\n# license, please contact the author at gladkikhalexei@gmail.com\r\n\r\n\r\nfrom ctypes import POINTER, CFUNCTYPE, Structure, cast\r\nfrom ctypes import c_void_p, c_char_p, c_double, c_int\r\nimport inspect\r\n\r\n\r\n__author__ = 'Alexei Gladkikh'\r\n\r\n\r\nclass PluginCommonError(Exception):\r\n    pass\r\n\r\n\r\nclass PluginNotFoundError(PluginCommonError):\r\n    pass\r\n\r\n\r\nclass PluginRegistry(object):\r\n\r\n    def __init__(self):\r\n        self.__container_id = dict()\r\n        self.__container_name = dict()\r\n\r\n    def get_by_id(self, plugin_id):\r\n        \"\"\":rtype: plugins.Plugin\"\"\"\r\n        try:\r\n            return self.__container_id[plugin_id]\r\n        except KeyError:\r\n            raise PluginNotFoundError(\"Plugin with id %s not found\" % plugin_id)\r\n\r\n    def get_by_name(self, plugin_name):\r\n        \"\"\":rtype: plugins.Plugin\"\"\"\r\n        try:\r\n            return self.__container_name[plugin_name]\r\n        except KeyError:\r\n            raise PluginNotFoundError(\"Plugin with name %s not found\" % plugin_name)\r\n\r\n    def add_plugin(self, plugin):\r\n        \"\"\":type plugin: plugins.Plugin\"\"\"\r\n        self.__container_id[plugin.record.id] = plugin\r\n        self.__container_name[plugin.record.name] = plugin\r\n\r\n\r\n# Plugin registry must be in pcpi module not in plugins module otherwise it result in circular imports\r\nPLUGIN_REGISTRY = PluginRegistry()\r\n\r\n\r\nclass CPluginInterface(Structure):\r\n    plugin_id = None\r\n    \"\"\":type: int\"\"\"\r\n    name = None\r\n    \"\"\":type: str\"\"\"\r\n    desc = None\r\n    \"\"\":type: str\"\"\"\r\n\r\n\r\ndef deref(p):\r\n    return p.contents.value if p else None\r\n\r\n\r\ndef ro_property(attribute):\r\n    return property(fget=lambda self: getattr(self, attribute))\r\n\r\n\r\ndef rw_property(attribute):\r\n    return property(fget=lambda self: getattr(self, attribute),\r\n                    fset=lambda self, value: setattr(self, attribute, value))\r\n\r\n\r\n# noinspection PyPep8Naming\r\nclass _variable_part_t(Structure):\r\n    _fields_ = [\r\n        (\"_name\", c_char_p),\r\n        (\"_defv\", c_double),\r\n        (\"_min\", POINTER(c_double)),\r\n        (\"_max\", POINTER(c_double))\r\n    ]\r\n\r\n    name = property(lambda self: self._name)\r\n    \"\"\":type: str\"\"\"\r\n    defv = property(lambda self: self._defv)\r\n    \"\"\":type: float\"\"\"\r\n    min = property(lambda self: deref(self._min))\r\n    \"\"\":type: float or None\"\"\"\r\n    max = property(lambda self: deref(self._max))\r\n    \"\"\":type: float or None\"\"\"\r\n\r\n    def __str__(self):\r\n        vmin = \"Min %.2f, \" % self.min if self.min is not None else str()\r\n        vmax = \"Max %.2f\" % self.max if self.max is not None else str()\r\n        return \"Name: \\\"%s\\\", %s%s Default: %.2f\" % (self.name, vmin, vmax, self.defv)\r\n\r\n\r\n# ------------------------------------------ Development model Plugin --------------------------------------------------\r\n\r\n\r\n# noinspection PyPep8Naming\r\nclass dev_model_arg_t(_variable_part_t):\r\n    pass\r\n\r\n\r\n# Return value: double\r\n# Parameters: pac, depth, values\r\ndev_model_expr_t = CFUNCTYPE(c_double, c_double, c_double, POINTER(c_double))\r\n\r\n\r\n# noinspection PyPep8Naming\r\nclass dev_model_t(CPluginInterface):\r\n    plugin_id = 1\r\n\r\n    _fields_ = [\r\n        (\"_prolith_id\", POINTER(c_int)),\r\n        (\"_name\", c_char_p),\r\n        (\"_desc\", c_char_p),\r\n        (\"_expr\", dev_model_expr_t),\r\n        (\"_args_count\", c_int),\r\n        (\"_args\", POINTER(dev_model_arg_t))\r\n    ]\r\n\r\n    prolith_id = property(lambda self: deref(self._prolith_id))\r\n    \"\"\":type: int or None\"\"\"\r\n    name = property(lambda self: self._name)\r\n    \"\"\":type: str\"\"\"\r\n    desc = property(lambda self: self._desc)\r\n    \"\"\":type: str\"\"\"\r\n    expr = property(lambda self: self._expr)\r\n    \"\"\":type: dev_model_expr_t\"\"\"\r\n    args_count = property(lambda self: self._args_count)\r\n    \"\"\":type: int\"\"\"\r\n    args = property(lambda self: self._args)\r\n    \"\"\":type: list of dev_model_arg_t\"\"\"\r\n\r\n    def __str__(self):\r\n        args = \"\\n\".join([\"\\t%d. %s\" % (k, self.args[k]) for k in xrange(self.args_count)])\r\n        return (\"Name: \\\"%s\\\"\\nDesc: %s\\nExpr: %s\\nCount: %d\\nProlith Id: %s\\nArgs:\\n%s\" %\r\n                (self.name, self.desc, self.expr, self.args_count, self.prolith_id, args))\r\n\r\n\r\n# ------------------------------------------------ Mask Plugin ---------------------------------------------------------\r\n\r\n\r\n# noinspection PyPep8Naming\r\nclass point_t(Structure):\r\n\r\n    _fields_ = [\r\n        (\"_x\", c_double),\r\n        (\"_y\", c_double)\r\n    ]\r\n\r\n    x = rw_property(\"_x\")\r\n    \"\"\":type: float\"\"\"\r\n    y = rw_property(\"_y\")\r\n    \"\"\":type: float\"\"\"\r\n\r\n\r\n# noinspection PyPep8Naming\r\nclass mask_region_t(Structure):\r\n\r\n    _fields_ = [\r\n        (\"_transmittance\", c_double),\r\n        (\"_phase\", c_double),\r\n        (\"_length\", c_int),\r\n        (\"_points\", POINTER(point_t))\r\n    ]\r\n\r\n    transmittance = rw_property(\"_transmittance\")\r\n    \"\"\":type: float\"\"\"\r\n    phase = rw_property(\"_phase\")\r\n    \"\"\":type: float\"\"\"\r\n    length = ro_property(\"_length\")\r\n    \"\"\":type: int\"\"\"\r\n    points = ro_property(\"_points\")\r\n    \"\"\":type: list of point_t\"\"\"\r\n\r\n\r\n# noinspection PyPep8Naming\r\nclass mask_parameter_t(_variable_part_t):\r\n    pass\r\n\r\n\r\n# noinspection PyPep8Naming\r\nclass mask_t(Structure):\r\n\r\n    _fields_ = [\r\n        (\"_boundary\", mask_region_t),\r\n        (\"_regions_count\", c_int),\r\n        (\"_regions\", POINTER(mask_region_t)),\r\n    ]\r\n\r\n    boundary = ro_property(\"_boundary\")\r\n    \"\"\":type: mask_region_t\"\"\"\r\n    regions_count = ro_property(\"_regions_count\")\r\n    \"\"\":type: int\"\"\"\r\n    regions = ro_property(\"_regions\")\r\n    \"\"\":type: list of mask_region_t\"\"\"\r\n\r\n\r\n# Return value: int - status (0 - Ok)\r\n# Parameters: mask, parameters\r\nmask_create_t = CFUNCTYPE(c_int, POINTER(mask_t), POINTER(c_double))\r\n\r\n\r\n# noinspection PyPep8Naming\r\nclass mask_plugin_t(CPluginInterface):\r\n    plugin_id = 0\r\n\r\n    _fields_ = [\r\n        (\"_name\", c_char_p),\r\n        (\"_desc\", c_char_p),\r\n        (\"_dimensions\", c_int),\r\n        (\"_create\", mask_create_t),\r\n        (\"_parameters_count\", c_int),\r\n        (\"_parameters\", POINTER(mask_parameter_t))\r\n    ]\r\n\r\n    name = ro_property(\"_name\")\r\n    \"\"\":type: str\"\"\"\r\n    desc = ro_property(\"_desc\")\r\n    \"\"\":type: str\"\"\"\r\n    dimensions = ro_property(\"_dimensions\")\r\n    \"\"\":type: int\"\"\"\r\n    create = ro_property(\"_create\")\r\n    \"\"\":type: mask_create_t\"\"\"\r\n    parameters_count = ro_property(\"_parameters_count\")\r\n    \"\"\":type: int\"\"\"\r\n    parameters = ro_property(\"_parameters\")\r\n    \"\"\":type: mask_parameter_t\"\"\"\r\n\r\n\r\n# --------------------------------------------- Source Shape Plugin ----------------------------------------------------\r\n\r\n# noinspection PyPep8Naming\r\nclass source_shape_parameter_t(_variable_part_t):\r\n    pass\r\n\r\n\r\n# Return value: double - intensity value\r\n# Parameters: direction cosine x, y, and parameters\r\nsource_shape_expr_t = CFUNCTYPE(c_double, c_double, c_double, POINTER(c_double))\r\n\r\n\r\n# noinspection PyPep8Naming\r\nclass source_shape_plugin_t(CPluginInterface):\r\n    plugin_id = 2\r\n\r\n    _fields_ = [\r\n        (\"_name\", c_char_p),\r\n        (\"_desc\", c_char_p),\r\n        (\"_expression\", source_shape_expr_t),\r\n        (\"_parameters_count\", c_int),\r\n        (\"_parameters\", POINTER(source_shape_parameter_t))\r\n    ]\r\n\r\n    name = ro_property(\"_name\")\r\n    \"\"\":type: str\"\"\"\r\n    desc = ro_property(\"_desc\")\r\n    \"\"\":type: str\"\"\"\r\n    expr = ro_property(\"_expression\")\r\n    \"\"\":type: source_shape_expr_t\"\"\"\r\n    parameters_count = ro_property(\"_parameters_count\")\r\n    \"\"\":type: int\"\"\"\r\n    parameters = ro_property(\"_parameters\")\r\n    \"\"\":type: source_shape_parameter_t\"\"\"\r\n\r\n\r\n# --------------------------------------------- Pupil Filter Plugin ----------------------------------------------------\r\n\r\n# noinspection PyPep8Naming\r\nclass pupil_filter_parameter_t(_variable_part_t):\r\n    pass\r\n\r\n\r\n# noinspection PyPep8Naming\r\nclass c_complex(Structure):\r\n    _fields_ = [(\"_real\", c_double), (\"_imag\", c_double)]\r\n    real = rw_property(\"_real\")\r\n    imag = rw_property(\"_imag\")\r\n\r\n\r\n# Return value: double - diffraction term coefficient value\r\n# Parameters: direction cosine x, y, and parameters\r\npupil_filter_expr_t = CFUNCTYPE(c_complex, c_double, c_double, POINTER(c_double))\r\n\r\n\r\n# noinspection PyPep8Naming\r\nclass pupil_filter_plugin_t(CPluginInterface):\r\n    plugin_id = 5\r\n\r\n    _fields_ = [\r\n        (\"_name\", c_char_p),\r\n        (\"_desc\", c_char_p),\r\n        (\"_expression\", pupil_filter_expr_t),\r\n        (\"_parameters_count\", c_int),\r\n        (\"_parameters\", POINTER(pupil_filter_parameter_t))\r\n    ]\r\n\r\n    name = ro_property(\"_name\")\r\n    \"\"\":type: str\"\"\"\r\n    desc = ro_property(\"_desc\")\r\n    \"\"\":type: str\"\"\"\r\n    expr = ro_property(\"_expression\")\r\n    \"\"\":type: pupil_filter_expr_t\"\"\"\r\n    parameters_count = ro_property(\"_parameters_count\")\r\n    \"\"\":type: int\"\"\"\r\n    parameters = ro_property(\"_parameters\")\r\n    \"\"\":type: pupil_filter_parameter_t\"\"\"\r\n\r\n\r\n# ----------------------------------------------------------------------------------------------------------------------\r\n\r\n\r\nplugin_types = {cls.plugin_id: cls for cls in globals().values()\r\n                if inspect.isclass(cls) and issubclass(cls, CPluginInterface) and cls.plugin_id is not None}\r\n\r\n\r\nENTRY_POINT = \"PluginDescriptor\"\r\n\r\n\r\n# noinspection PyPep8Naming\r\nclass plugin_descriptor_t(Structure):\r\n    _fields_ = [\r\n        (\"_plugin_type\", c_int),\r\n        (\"_plugin_entry\", c_void_p)\r\n    ]\r\n\r\n    plugin_type = property(lambda self: self._plugin_type)\r\n    \"\"\":type: int\"\"\"\r\n\r\n    @property\r\n    def plugin_entry(self):\r\n        \"\"\":rtype: CPluginInterface\"\"\"\r\n        return cast(self._plugin_entry, POINTER(plugin_types[self.plugin_type])).contents"
  },
  {
    "path": "OptolithiumGui/physc.py",
    "content": "__author__ = 'Alexei Gladkikh'\r\n\r\nR = 1.9872e-3\r\nT0 = -273.15\r\n\r\nAIR_N = 1.0002926\r\nAIR_K = 0.0"
  },
  {
    "path": "OptolithiumGui/plugins.py",
    "content": "# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport os\nimport logging as module_logging\nimport ctypes\nimport sys\n\nfrom database import orm\n\nimport config\nimport helpers\nimport pcpi\n\n\n__author__ = 'Alexei Gladkikh'\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.DEBUG)\nhelpers.logStreamEnable(logging)\n\n\nclass System(object):\n\n    def _darwin_free_lib(self, handle):\n        self._dylib.dlclose(handle)\n\n    def _linux_free_lib(self, handle):\n        self._libdl.dlclose(handle)\n\n    def _windows_free_lib(self, handle):\n        self._windll.kernel32.FreeLibrary(handle)\n\n    def __init__(self):\n        if sys.platform.startswith(config.darwin):\n            self._dylib = ctypes.cdll.LoadLibrary(\"libdl.dylib\")\n        elif os.name == config.posix:\n            self._libdl = ctypes.cdll.LoadLibrary(\"libdl.so\")\n        elif os.name == config.nt:\n            self._windll = ctypes.windll\n\n        self._free_library = {\n            config.darwin: self._darwin_free_lib,\n            config.nt: self._windows_free_lib,\n            config.posix: self._linux_free_lib\n        }\n\n    # noinspection PyProtectedMember\n    def free_library(self, library):\n        handle = library._handle\n        # noinspection PyCallingNonCallable\n        return self._free_library[os.name](handle)\n\n    # noinspection PyMethodMayBeStatic,PyPep8Naming\n    @property\n    def SharedLibraryLoadError(self):\n        # noinspection PyUnresolvedReferences\n        return WindowsError\n\n\nsystem = System()\n\n\nclass Plugin(object):\n\n    class LoadError(Exception):\n        def __init__(self, *args, **kwargs):\n            super(Plugin.LoadError, self).__init__(*args, **kwargs)\n\n    def __init__(self, library_path, library, plugin_desc):\n        \"\"\"\n        :param str library_path: Path to the library\n        :param library: Module handle of the plugin library\n        :param plugin_descriptor_t plugin_desc: C plugin descriptor\n        \"\"\"\n        self._library_path = library_path\n        self._library = library\n        self._plugin_desc = plugin_desc\n\n        self.record = None\n        \"\"\":type: orm.Generic or None\"\"\"\n\n    @property\n    def type(self):\n        \"\"\":rtype: int\"\"\"\n        return self._plugin_desc.plugin_type\n\n    @property\n    def entry(self):\n        \"\"\":rtype: CPluginInterface\"\"\"\n        return self._plugin_desc.plugin_entry\n\n    @property\n    def path(self):\n        \"\"\":rtype: str\"\"\"\n        return self._library_path\n\n    @classmethod\n    def load(cls, library_path):\n        \"\"\"\n        :param str library_path: Path to the file of plugin shared library\n        \"\"\"\n        try:\n            library = ctypes.cdll.LoadLibrary(library_path)\n        except system.SharedLibraryLoadError:\n            raise Plugin.LoadError(\"File \\\"%s\\\" is not valid shared object and can't be loaded\" % library_path)\n\n        try:\n            plugin_desc = pcpi.plugin_descriptor_t.in_dll(library, pcpi.ENTRY_POINT)\n        except ValueError:\n            system.free_library(library)\n            raise Plugin.LoadError(\"Plugin entry point not found: \\\"%s\\\"\" % library_path)\n\n        if plugin_desc.plugin_type not in pcpi.plugin_types:\n            plugin_type = plugin_desc.plugin_type\n            system.free_library(library)\n            raise Plugin.LoadError(\"Unsupported plugin type \\\"%s\\\" of \\\"%s\\\"\" % (plugin_type, library_path))\n\n        return cls(library_path, library, plugin_desc)\n\n    def unload(self):\n        system.free_library(self._library)\n        self._library_path = None\n        self._library = None\n        self._plugin_desc = None\n\n\nclass Container(object):\n\n    @staticmethod\n    def _clean_plugins_dict():\n        \"\"\":rtype: dict[int, list[Plugin]]\"\"\"\n        return {possible_type: list() for possible_type in pcpi.plugin_types}\n\n    def __init__(self):\n        self._plugins_directory = self._clean_plugins_dict()\n\n    def load_path(self, *plugins_path):\n        \"\"\"\n        Enumerate plugin file in directories. Structure of the one directory is follow:\n        + plugins:\n          + masks:\n            - line.dll\n            - space.dll\n          + dev_models:\n            - mack.dll\n            - enhanced.dll\n            - notch.dll\n          + source_shapes:\n            - conventional.dll\n            - annular.dll\n            - coherent.dll\n\n        :param tuple[str] plugins_path: List of of root directories for plugins\n        \"\"\"\n        if not plugins_path:\n            plugins_path = [config.Configuration.SYSTEM_PLUGINS_PATH]\n\n        for path in plugins_path:\n            if not os.path.isdir(path):\n                logging.warning(\"Plugin path '%s' not existed or not is directory omitted\" % path)\n                continue\n\n            for dir_name in os.listdir(path):\n                dir_path = os.path.join(path, dir_name)\n\n                if not os.path.isdir(dir_path):\n                    continue\n\n                for filename in os.listdir(dir_path):\n                    _, ext = os.path.splitext(filename)\n                    if ext != config.shared_ext:\n                        continue\n\n                    filepath = os.path.join(dir_path, filename)\n\n                    if self.is_loaded(filepath):\n                        logging.info(\"Plugin already loaded \\\"%s\\\"\" % filepath)\n                        continue\n\n                    try:\n                        plugin = Plugin.load(filepath)\n                    except Plugin.LoadError as error:\n                        logging.warning(error.message)\n                    else:\n                        self._plugins_directory[plugin.type].append(plugin)\n                        logging.info(\"Plugin library load: \\\"%s\\\"\" % filepath)\n\n    def __iter__(self):\n        \"\"\":rtype: __generator[Plugin]\"\"\"\n        for plugins in self._plugins_directory.values():\n            for plugin in plugins:\n                yield plugin\n\n    def next(self):\n        \"\"\":rtype: Plugin\"\"\"\n        return next(self)\n\n    def is_loaded(self, filepath):\n        \"\"\"\n        :param str filepath: Plugin file path\n        :rtype: bool\n        \"\"\"\n        for plugin in self:\n            if plugin.path == filepath:\n                return True\n        return False\n\n    @classmethod\n    def load(cls, *plugins_path):\n        container = cls()\n        container.load_path(*plugins_path)\n        return container\n\n    def unload(self):\n        for plugin in self:\n            plugin.unload()\n            del plugin\n        self._plugins_directory = self._clean_plugins_dict()\n\n\nclass Inspector(object):\n\n    Load = 0\n    Verify = 1\n\n    class CommonError(Exception):\n        def __init__(self, *args, **kwargs):\n            super(Inspector.CommonError, self).__init__(*args, **kwargs)\n\n    class VerifyError(CommonError):\n        def __init__(self, *args, **kwargs):\n            super(Inspector.VerifyError, self).__init__(*args, **kwargs)\n            self.message = \"Verify of %s\" % self.message\n\n    class DevelopmentModelVerifyError(VerifyError):\n        def __init__(self, *args, **kwargs):\n            super(Inspector.DevelopmentModelVerifyError, self).__init__(*args, **kwargs)\n            self.message = \"Development model: %s\" % self.message\n\n    class PluginMaskVerifyError(VerifyError):\n        def __init__(self, *args, **kwargs):\n            super(Inspector.PluginMaskVerifyError, self).__init__(*args, **kwargs)\n            self.message = \"Plugin mask: %s\" % self.message\n\n    class PluginSourceShapeVerifyError(VerifyError):\n        def __init__(self, *args, **kwargs):\n            super(Inspector.PluginSourceShapeVerifyError, self).__init__(*args, **kwargs)\n            self.message = \"Source shape: %s\" % self.message\n\n    class PluginPupilFilterVerifyError(VerifyError):\n        def __init__(self, *args, **kwargs):\n            super(Inspector.PluginPupilFilterVerifyError, self).__init__(*args, **kwargs)\n            self.message = \"Pupil filter: %s\" % self.message\n\n    @staticmethod\n    def _load_development_model(plugin):\n        \"\"\":type plugin: Plugin\"\"\"\n        entry = plugin.entry\n        \"\"\":type: dev_model_t\"\"\"\n        args = [orm.DevelopmentModelArg(entry.args[k].name, k, entry.args[k].defv, entry.args[k].min, entry.args[k].max)\n                for k in xrange(entry.args_count)]\n        return orm.DevelopmentModel(name=entry.name, args=args, desc=entry.desc, prolith_id=entry.prolith_id)\n\n    @staticmethod\n    def _verify_development_model(plugin, record):\n        \"\"\"\n        :param Plugin plugin: Descriptor of the loaded plugin\n        :param orm.DevelopmentModel record: Database record of this plugin\n        \"\"\"\n        entry = plugin.entry\n        \"\"\":type: pcpi.dev_model_t\"\"\"\n\n        if record.name != entry.name:\n            raise Inspector.DevelopmentModelVerifyError(\"Names not equals: %s != %s\" % (record.name, entry.name))\n\n        if len(record.args) != entry.args_count:\n            raise Inspector.DevelopmentModelVerifyError(\n                \"Plugin expression arguments not equal to saved: %d != %d\" %\n                (len(record.args), entry.args_count))\n\n        for rarg in record.args:\n            earg = entry.args[rarg.ord]\n            if rarg.name != earg.name:\n                raise Inspector.DevelopmentModelVerifyError(\n                    \"Argument names not equals: %s != %s\" % (rarg.name, earg.name))\n            if rarg.max != earg.max:\n                raise Inspector.DevelopmentModelVerifyError(\n                    \"Maximum values not equals: %s != %s\" % (rarg.max, earg.max))\n            if rarg.min != earg.min:\n                raise Inspector.DevelopmentModelVerifyError(\n                    \"Minimum values not equals: %s != %s\" % (rarg.min, earg.min))\n\n    @staticmethod\n    def _load_standard_plugin(plugin, plg_type, prm_type):\n        entry = plugin.entry\n        prms = [prm_type(\n            entry.parameters[k].name, k, entry.parameters[k].defv,\n            entry.parameters[k].min, entry.parameters[k].max) for k in xrange(entry.parameters_count)]\n        return plg_type(name=entry.name, prms=prms, desc=entry.desc)\n\n    @staticmethod\n    def _verify_standard_plugin(plugin, record, err_type):\n        \"\"\"\n        :param Plugin plugin: Descriptor of the loaded plugin\n        :param record: Database record of this plugin\n        :param type err_type: Error type to raise if necessary\n        \"\"\"\n        entry = plugin.entry\n        \"\"\":type: pcpi.mask_t\"\"\"\n\n        if record.name != entry.name:\n            raise err_type(\"Names not equals: %s != %s\" % (record.name, entry.name))\n\n        if len(record.prms) != entry.parameters_count:\n            raise err_type(\"Plugin parameters not equal to saved: %d != %d\" % (len(record.prms), entry.parameters_count))\n\n        for rprm in record.prms:\n            eprm = entry.parameters[rprm.ord]\n            if rprm.name != eprm.name:\n                raise err_type(\"Parameters names not equals: %s != %s\" % (rprm.name, eprm.name))\n            if rprm.max != eprm.max:\n                raise err_type(\"Maximum values not equals: %s != %s\" % (rprm.max, eprm.max))\n            if rprm.min != eprm.min:\n                raise err_type(\"Minimum values not equals: %s != %s\" % (rprm.min, eprm.min))\n\n    @staticmethod\n    def _load_mask_plugin(plugin):\n        \"\"\":type plugin: Plugin\"\"\"\n        entry = plugin.entry\n        prms = [orm.AbstractPluginMaskPrm(\n            entry.parameters[k].name, k, entry.parameters[k].defv,\n            entry.parameters[k].min, entry.parameters[k].max) for k in xrange(entry.parameters_count)]\n        return orm.AbstractPluginMask(name=entry.name, prms=prms, desc=entry.desc, dims=entry.dimensions)\n\n    @staticmethod\n    def _verify_mask_plugin(plugin, record):\n        \"\"\"\n        :param Plugin plugin: Descriptor of the loaded plugin\n        :param orm.AbstractPluginMask record: Database record of this plugin\n        \"\"\"\n        Inspector._verify_standard_plugin(plugin, record, Inspector.PluginMaskVerifyError)\n\n    @staticmethod\n    def _load_source_shape_plugin(plugin):\n        \"\"\":type plugin: Plugin\"\"\"\n        return Inspector._load_standard_plugin(plugin, orm.AbstractPluginSourceShape, orm.AbstractPluginSourceShapePrm)\n\n    @staticmethod\n    def _verify_source_shape_plugin(plugin, record):\n        \"\"\"\n        :param Plugin plugin: Descriptor of the loaded plugin\n        :param orm.AbstractPluginSourceShape record: Database record of this plugin\n        \"\"\"\n        Inspector._verify_standard_plugin(plugin, record, Inspector.PluginSourceShapeVerifyError)\n\n    @staticmethod\n    def _load_pupil_filter_plugin(plugin):\n        \"\"\":type plugin: Plugin\"\"\"\n        return Inspector._load_standard_plugin(plugin, orm.AbstractPluginPupilFilter, orm.AbstractPluginPupilFilterPrm)\n\n    @staticmethod\n    def _verify_pupil_filter_plugin(plugin, record):\n        \"\"\"\n        :param Plugin plugin: Descriptor of the loaded plugin\n        :param orm.AbstractPluginPupilFilter record: Database record of this plugin\n        \"\"\"\n        Inspector._verify_standard_plugin(plugin, record, Inspector.PluginPupilFilterVerifyError)\n\n    def __init__(self, database):\n        \"\"\"\n        :type database: database.ApplicationDatabase\n        \"\"\"\n        self._plugin_map = {\n            orm.AbstractPluginMask.cpi.plugin_id: (self._load_mask_plugin, self._verify_mask_plugin),\n            orm.AbstractPluginSourceShape.cpi.plugin_id:\n                (self._load_source_shape_plugin, self._verify_source_shape_plugin),\n            orm.AbstractPluginPupilFilter.cpi.plugin_id:\n                (self._load_pupil_filter_plugin, self._verify_pupil_filter_plugin),\n            orm.DevelopmentModel.cpi.plugin_id: (self._load_development_model, self._verify_development_model),\n        }\n\n        self._database = database\n\n    def verify(self, plugin):\n        \"\"\":type plugin: Plugin\"\"\"\n        table = orm.get_table_by_plugin(plugin)\n\n        try:\n            routines = self._plugin_map[plugin.type]\n        except KeyError:\n            raise Inspector.CommonError(\n                \"Plugin verification routines not found! \"\n                \"Plugin type with index '%d' is not supported now.\" % plugin.type)\n\n        try:\n            record = self._database[table].filter(table.name == plugin.entry.name).one()\n        except orm.NoResultFound:\n            record = routines[Inspector.Load](plugin)\n            self._database.add(record)\n        else:\n            routines[Inspector.Verify](plugin, record)\n\n        plugin.record = record\n\n        # Save plugin expression in the registry\n        pcpi.PLUGIN_REGISTRY.add_plugin(plugin)"
  },
  {
    "path": "OptolithiumGui/qt.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport PySide\nimport PySide.QtCore as _QtCore\nimport PySide.QtGui as _QtGui\nimport PySide.QtWebKit as _QtWebKit\n\nimport helpers\nimport logging as module_logging\n\n\nbackend_name = 'PySide'\n\n\n__author__ = 'Alexei Gladkikh'\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.INFO)\nhelpers.logStreamEnable(logging)\n\n\nQtCore = _QtCore\nQtGui = _QtGui\nQtWebKit = _QtWebKit\n\n\nSignal = QtCore.Signal\nSlot = QtCore.Slot\n\n\ncore_version = QtCore.__version__\nversion = PySide.__version__\n\n\ndef connect(signal, *slots, **kwargs):\n    \"\"\"\n    :type signal: Signal\n    :type slot: Slot\n    \"\"\"\n    connection_type = kwargs.get(\"connection_type\", QtCore.Qt.AutoConnection)\n    logging.debug(\"Connect %s with %s\" % (signal, slots))\n    for slot in slots:\n        # noinspection PyUnresolvedReferences\n        signal.connect(slot, connection_type)\n\n\ndef disconnect(signal, slot):\n    \"\"\"\n    :type signal: Signal\n    :type slot: Slot\n    \"\"\"\n    logging.debug(\"Disconnect %s with %s\" % (signal, slot))\n    # noinspection PyUnresolvedReferences\n    signal.disconnect(slot)\n\n\nclass _GlobalSignalsClass(QtCore.QObject):\n\n    changed = Signal()\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def onChanged(self):\n        # noinspection PyUnresolvedReferences\n        self.changed.emit()\n\n\nGlobalSignals = _GlobalSignalsClass()\n"
  },
  {
    "path": "OptolithiumGui/resources.py",
    "content": "# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport os\nimport sys\n\nif os.name == \"nt\":\n    basis = sys.executable if hasattr(sys, 'frozen') else sys.argv[0]\n    basepath = os.path.split(basis)[0]\n    os.environ['PATH'] = basepath + os.pathsep + os.environ['PATH']\n\nimport magic\nfrom magic.api import MagicError\nimport helpers\nimport logging as module_logging\n\n\n__author__ = 'Alexei Gladkikh'\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.INFO)\nhelpers.logStreamEnable(logging)\n\n\nclass Resource(object):\n\n    # In windows platform prefix must be file:\\\\ and in linux file:/\n    html_prefix = {\n        \"nt\": \"file:\\\\\",\n        \"posix\": \"file:\"\n    }\n\n    def __init__(self, path):\n        if not os.path.isabs(path):\n            path = os.path.abspath(path)\n\n        logging.debug(\"Loading resources %s\" % path)\n        self.__path = path\n        self.__url = Resource.html_prefix[os.name] + path\n\n    @property\n    def path(self):\n        return self.__path\n\n    @property\n    def url(self):\n        return self.__url\n\n\nclass PlainText(Resource):\n    def __init__(self, *args):\n        path = args[0]\n        super(PlainText, self).__init__(path)\n        with open(path) as data_file:\n            self.__data = data_file.read()\n\n    @property\n    def data(self):\n        return self.__data\n\n\nclass Icon(Resource):\n    def __init__(self, *args):\n        path, icon_driver = args[0], args[1]\n        super(Icon, self).__init__(path)\n        self.__data = icon_driver(path)\n\n    @property\n    def data(self):\n        return self.__data\n\n\n_ResourceFactory = {\n    \"text\": PlainText,\n    \"application\": PlainText,\n    \"image\": Icon\n}\n\n\nclass DummyIcon(object):\n    def __init__(self, path):\n        self.__path = path\n\n\nclass Resources(object):\n\n    _instance = None\n\n    # FIXME: Quirk to load magic library (must be fixed by mean of the recompiling of libmagic1 library)\n    try:\n        _magic = magic.Magic(flags=magic.MAGIC_MIME_TYPE)\n    except MagicError:\n        _magic = magic.Magic(paths=[\"share/misc/magic\"], flags=magic.MAGIC_MIME_TYPE)\n\n    def __new__(cls, resource=None, attribute=None, data=None):\n        if not cls._instance:\n            cls._instance = super(Resources, cls).__new__(cls)\n            return cls._instance\n        else:\n            return cls._instance.get_item_attribute(resource, attribute)\n\n    # noinspection PyUnusedLocal\n    def __init__(self, resource=None, data=None):\n        if isinstance(self, Resources):\n            self.__data = data\n\n    @classmethod\n    def load(cls, basepath, directories, icon_driver=None):\n        if icon_driver is None:\n            logging.warning(\"Icons driver was not set!\")\n            icon_driver = DummyIcon\n\n        data = dict()\n        for directory in directories:\n            data[directory] = dict()\n            resource_directory = os.path.join(basepath, directory)\n            for filename in os.listdir(resource_directory):\n                path = os.path.join(resource_directory, filename)\n                mime_type = cls._magic.id_filename(path)\n                if mime_type is not None:\n                    mime = mime_type.split('/')[0]\n                    try:\n                        resource_class = _ResourceFactory[mime]\n                    except KeyError:\n                        logging.warning(\"Can't load resource (unknown mime %s): %s\" % (mime, path))\n                    else:\n                        resource_name = helpers.GetFilename(filename).split('.')[0]\n                        data[directory][resource_name] = resource_class(path, icon_driver)\n                else:\n                    logging.warning(\"Can't load resource (mime not determined): %s\" % path)\n\n        return cls(data=data)\n\n    def get_item_attribute(self, item, attribute=None):\n        attribute = \"data\" if attribute is None else attribute\n\n        if '/' not in item:\n            return [getattr(v, attribute) for v in self.__data[item].values()]\n        else:\n            directory, name = item.split('/')\n            return getattr(self.__data[directory][name], attribute)\n\n\nif __name__ == \"__main__\":\n    import PyQt4.QtGui as QtGui\n    app = QtGui.QApplication(sys.argv)\n    Resources.load(os.getcwd(), [\"icons\", \"ddl\"],  QtGui.QIcon)\n    print Resources(\"icons/No\")\n    print Resources(\"icons/Resist\", \"url\")\n    print Resources(\"ddl\")\n    main_window = QtGui.QMainWindow()\n    main_window.show()\n    sys.exit(app.exec_())"
  },
  {
    "path": "OptolithiumGui/setup.py",
    "content": "# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\n\nimport os\nimport sys\nimport time\nimport hashlib\nimport shutil\nfrom distutils.extension import Extension\nfrom Cython.Build import cythonize\nfrom info import __name__ as name\nfrom info import __version__ as version\n\n\n__author__ = 'Alexei Gladkikh'\n\nDO_CYTHONIZE = False\n\nshared_ext = {\"nt\": \".pyd\", \"posix\": \".so\"}[os.name]\n\n\ntry:\n    from cx_Freeze import setup, Executable\nexcept ImportError:\n    setup = None\n    Executable = None\n\n\nTEMP_CYTHON_C_DIR = \"build/temp_c\"\nTEMP_CYTHON_SHARED_DIR = \"build/temp_shared\"\n\n\nCYTHON_EXTENSIONS = [\n    Extension(\"optolithium\", [\"optolithium.py\"]),\n    Extension(\"pcpi\", [\"pcpi.py\"]),\n    Extension(\"physc\", [\"physc.py\"]),\n    Extension(\"plugins\", [\"plugins.py\"]),\n    Extension(\"qt\", [\"qt.py\"]),\n    Extension(\"resources\", [\"resources.py\"]),\n    Extension(\"config\", [\"config.py\"]),\n    Extension(\"core\", [\"core.py\"]),\n    Extension(\"auxmath\", [\"auxmath.py\"]),\n    Extension(\"metrics\", [\"metrics.py\"]),\n    Extension(\"options.structures\", [\"options/structures.py\"]),\n    Extension(\"options.common\", [\"options/common.py\"]),\n    Extension(\"database.common\", [\"database/common.py\"]),\n    Extension(\"database.dbparser\", [\"database/dbparser.py\"]),\n    Extension(\"database.Enum\", [\"database/Enum.py\"]),\n    Extension(\"database.orm\", [\"database/orm.py\"]),\n    Extension(\"database.settings\", [\"database/settings.py\"]),\n    Extension(\"views.common\", [\"views/common.py\"]),\n    Extension(\"views.controls\", [\"views/controls.py\"]),\n    Extension(\"views.dbview\", [\"views/dbview.py\"]),\n    Extension(\"views.development\", [\"views/development.py\"]),\n    Extension(\"views.metrology\", [\"views/metrology.py\"]),\n    Extension(\"views.exposure\", [\"views/exposure.py\"]),\n    Extension(\"views.numerics\", [\"views/numerics.py\"]),\n    Extension(\"views.peb\", [\"views/peb.py\"]),\n    Extension(\"views.resist\", [\"views/resist.py\"]),\n    Extension(\"views.summary\", [\"views/summary.py\"]),\n    Extension(\"views.wafer\", [\"views/wafer.py\"]),\n    Extension(\"views.diffraction\", [\"views/diffraction.py\"]),\n    Extension(\"views.simulations\", [\"views/simulations.py\"]),\n]\n\nif os.name == \"nt\":\n    WINLIBS = [\n        \"zlib1.dll\",\n        \"magic.dll\",\n        \"regex2.dll\"\n    ]\nelse:\n    WINLIBS = []\n\n# Dependencies are automatically detected, but it might need fine tuning.\nCX_BUILD_OPTIONS = {\n    # \"icon\": \"icons/ResistProfile.png\",\n    \"packages\": [\n        \"database\",\n        \"views\",\n        \"PySide.QtCore\",\n        \"PySide.QtGui\",\n        \"PySide.QtWebKit\",\n        \"sqlalchemy\",\n        \"matplotlib.figure\",\n        \"matplotlib.backends.backend_qt4agg\",\n        \"scipy.interpolate\",\n        \"scipy.linalg\",\n        \"scipy.special\",\n        \"scipy.sparse\",\n        \"gdsii\",\n        \"magic\",\n    ],\n    \"includes\": [\n        \"sqlalchemy.dialects.sqlite\",\n        \"config\",\n        \"core\",\n        \"auxmath\",\n        \"metrics\",\n        \"options\",\n        \"optolithium\",\n        \"optolithiumc\",\n        \"helpers\",\n        \"clipper\",\n        \"pcpi\",\n        \"physc\",\n        \"plugins\",\n        \"qt\",\n        \"resources\",\n        \"webbrowser\",\n        \"psutil\",\n        \"magic\",\n        \"bson\",\n        \"json\",\n    ],\n    \"include_files\": [\n        \"matplotlibrc\", \n        \"icons/\", \n        \"plugins/\", \n        \"xhtml/\", \n        \"share/\", \n        \"_clipper\" + shared_ext,\n        \"_optolithiumc\" + shared_ext,\n    ] + WINLIBS,\n    \"excludes\": [\n        \"apport\",\n        \"apt\",\n        \"PyQt4\",\n        \"_tkinter\",\n        \"Tkinter\",\n        # \"unittest\",\n        \"numpy.distutils\",\n        # \"numpy.testing\",\n        \"setuptools\",\n        \"serial\",\n        \"pysqlite2\",\n        \"apt\",\n        \"compiler\",\n        \"backports\",\n        \"curses\",\n        # \"distutils\",\n        \"email\",\n        \"glib\",\n        \"gobject\",\n        \"importlib\",\n        \"_markerlib\",\n        \"nose\",\n        \"pydoc\",\n        \"pydoc_data\",\n        # \"opcode\",\n        \"ast\",\n        \"BaseHTTPServer\",\n        \"cgi\",\n        \"doctest\",\n        \"_MozillaCookieJar\",\n        \"SimpleHTTPServer\",\n        \"_codecs_cn\",\n        \"_codecs_hk\",\n        \"_codecs_iso2022\",\n        \"_codecs_jp\",\n        \"_codecs_kr\",\n        \"_codecs_tw\",\n        # \"matplotlib._delaunay\",\n        \"urllib.datetime\",\n        \"urllib._heapq\",\n        \"urllib.readline\",\n    ],\n    #\"exclude_files\": [\n    #    \"/usr/lib/pymodules/python2.7/matplotlib/mpl-data/fonts/ttf/cmsy10.ttf\",\n    #]\n}\n\n\ndef cmp_hash(file1, file2):\n    with open(file1, \"rb\") as tmp:\n        text1 = tmp.read()\n\n    with open(file2, \"rb\") as tmp:\n        text2 = tmp.read()\n\n    hash1 = hashlib.md5()\n    hash1.update(text1)\n    hash1 = hash1.hexdigest()\n\n    hash2 = hashlib.md5()\n    hash2.update(text2)\n    hash2 = hash2.hexdigest()\n\n    return hash1 == hash2\n\n\ndef restore_cython_files(tmp_dir, extensions, ext):\n    if os.path.exists(tmp_dir):\n        for extension in extensions:\n            for src in extension.sources:\n                path, x = os.path.splitext(src)\n                real_path = path + ext\n                if os.path.exists(os.path.join(tmp_dir, real_path)):\n                    os.rename(os.path.join(tmp_dir, real_path), real_path)\n\n\ndef save_cython_files(tmp_dir, extensions, ext):\n    if not os.path.exists(tmp_dir):\n        os.makedirs(tmp_dir)\n    else:\n        shutil.rmtree(tmp_dir)\n        os.makedirs(tmp_dir)\n\n    for extension in extensions:\n        for src in extension.sources:\n            path, x = os.path.splitext(src)\n            real_path = path + ext\n\n            if not os.path.exists(os.path.join(tmp_dir, real_path)):\n                print \"Move %s to %s\" % (real_path, os.path.join(tmp_dir, real_path))\n                os.renames(real_path, os.path.join(tmp_dir, real_path))\n\n            elif cmp_hash(real_path, os.path.join(tmp_dir, real_path)):\n                print \"Move %s to %s\" % (real_path, os.path.join(tmp_dir, real_path))\n                os.renames(real_path, os.path.join(tmp_dir, real_path))\n\n\ndef main():\n    # GUI applications require a different base on Windows (the default is for a console application).\n    base = None\n    if sys.platform == \"win32\":\n        base = \"Win32GUI\"\n        exe_ext = \".exe\"\n    else:\n        exe_ext = \"\"\n\n    if DO_CYTHONIZE:\n        restore_cython_files(TEMP_CYTHON_C_DIR, CYTHON_EXTENSIONS, ext=\".c\")\n        restore_cython_files(TEMP_CYTHON_SHARED_DIR, CYTHON_EXTENSIONS, ext=shared_ext)\n        sys.argv = [sys.argv[0], \"build_ext\", \"--inplace\"]\n        print(\"Build Cython extensions\")\n        setup(name=name, version=version, ext_modules=cythonize(CYTHON_EXTENSIONS))\n        save_cython_files(TEMP_CYTHON_C_DIR, CYTHON_EXTENSIONS, ext=\".c\")\n\n    sys.argv = [sys.argv[0], \"build\"]\n\n    print(\"Build project\")\n    \n    setup(name=name,\n          version=version,\n          description=\"Optolithium Application\",\n          options={\"build_exe\": CX_BUILD_OPTIONS},\n          executables=[Executable(\n              script=\"main.py\",\n              targetName=name + exe_ext,\n              base=base,\n              icon=\"icon.ico\")])\n    \n    if DO_CYTHONIZE:\n        save_cython_files(TEMP_CYTHON_SHARED_DIR, CYTHON_EXTENSIONS, ext=shared_ext)\n\n\nif __name__ == \"__main__\":\n    start_time = time.time()\n    main()\n    print(\"Build Optolithium project done in: %s s\" % (time.time() - start_time))\n"
  },
  {
    "path": "OptolithiumGui/share/data/Air-Vacuum.MAT",
    "content": "[Version]\r\n1.2.3.4\r\n\r\n[Parameters]\r\nAir Vacuum\t\t\t\t\t;Material Name\r\n\r\n\r\n;data in wavelength (nm), n, k\r\n[Data]\r\n100.00000  1.00000  0.00000\r\n"
  },
  {
    "path": "OptolithiumGui/share/data/Si Dioxide.MAT",
    "content": "[Version]\r\n1.2.3.4\r\n\r\n[Parameters]\r\nSi Dioxide\t\t\t\t\t;Material Name\r\n\r\n\r\n;data in wavelength (nm), n, k\r\n[Data]\r\n10.00000  0.98740  0.00970\r\n10.20000  0.98650  0.00850\r\n10.40000  0.98510  0.00830\r\n10.60000  0.98410  0.00960\r\n10.80000  0.98480  0.00990\r\n11.00000  0.98440  0.00900\r\n11.20000  0.98220  0.00930\r\n11.40000  0.98280  0.01590\r\n11.60000  0.98670  0.01060\r\n11.80000  0.98580  0.00750\r\n12.00000  0.98390  0.00650\r\n12.20000  0.98230  0.00680\r\n12.40000  0.98130  0.00700\r\n12.60000  0.98030  0.00730\r\n12.80000  0.97940  0.00760\r\n13.00000  0.97890  0.00760\r\n13.20000  0.97780  0.00830\r\n13.40000  0.97700  0.00870\r\n13.60000  0.97610  0.00930\r\n13.80000  0.97470  0.01030\r\n15.00000  0.96340  0.01990\r\n16.00000  0.96080  0.02260\r\n17.00000  0.95620  0.02440\r\n18.00000  0.95090  0.02810\r\n19.00000  0.94580  0.03350\r\n20.00000  0.94160  0.03740\r\n21.00000  0.93860  0.04370\r\n22.00000  0.93280  0.04620\r\n23.00000  0.92710  0.05200\r\n24.00000  0.92220  0.05780\r\n25.00000  0.91640  0.06500\r\n26.00000  0.91050  0.07260\r\n27.00000  0.92070  0.06800\r\n28.00000  0.91750  0.07500\r\n29.00000  0.91370  0.08200\r\n30.00000  0.91300  0.09000\r\n31.00000  0.90700  0.09200\r\n32.00000  0.90100  0.09400\r\n33.00000  0.89500  0.09800\r\n34.00000  0.88800  0.10700\r\n35.00000  0.88200  0.11300\r\n36.00000  0.87700  0.12000\r\n37.00000  0.87000  0.12800\r\n38.00000  0.86600  0.13700\r\n39.00000  0.85800  0.14400\r\n40.00000  0.85100  0.15600\r\n41.00000  0.84500  0.16900\r\n42.00000  0.83900  0.18000\r\n43.00000  0.83300  0.19000\r\n44.00000  0.82700  0.20200\r\n45.00000  0.82200  0.21800\r\n46.00000  0.81700  0.23300\r\n47.00000  0.81300  0.25000\r\n48.00000  0.80800  0.27000\r\n49.00000  0.80400  0.28200\r\n49.59000  0.73300  0.32500\r\n50.00000  0.80300  0.30000\r\n51.00000  0.80400  0.32200\r\n52.00000  0.80600  0.34300\r\n53.00000  0.81100  0.36600\r\n54.00000  0.81700  0.38500\r\n55.00000  0.82200  0.40800\r\n56.00000  0.82900  0.43000\r\n57.00000  0.83300  0.45000\r\n58.00000  0.84300  0.47000\r\n59.00000  0.85100  0.48200\r\n60.00000  0.86200  0.49700\r\n63.58000  0.87900  0.61300\r\n65.26000  0.90200  0.64500\r\n67.01000  0.92700  0.67700\r\n68.88000  0.95700  0.71200\r\n69.85000  0.97500  0.73100\r\n70.85000  0.99900  0.75000\r\n71.87000  1.03000  0.76300\r\n72.93000  1.07200  0.76800\r\n74.02000  1.12400  0.76500\r\n75.14000  1.13700  0.75500\r\n76.30000  1.15600  0.73700\r\n77.49000  1.17200  0.71700\r\n78.72000  1.17800  0.70300\r\n79.99000  1.17200  0.69600\r\n81.30000  1.16700  0.69900\r\n82.66000  1.16800  0.71100\r\n84.05000  1.17500  0.73900\r\n85.51000  1.19500  0.77100\r\n87.00000  1.22500  0.79900\r\n88.56000  1.26500  0.80800\r\n90.17000  1.32000  0.79500\r\n91.84000  1.36300  0.77500\r\n93.57000  1.37100  0.75500\r\n95.37000  1.36800  0.74700\r\n97.24000  1.37200  0.76600\r\n99.19000  1.38300  0.79300\r\n101.20000  1.41000  0.82400\r\n103.30000  1.47500  0.86100\r\n105.10000  1.55400  0.87400\r\n106.90000  1.63500  0.85900\r\n108.80000  1.71600  0.81000\r\n110.70000  1.76600  0.71800\r\n112.70000  1.73900  0.56900\r\n113.70000  1.68700  0.56500\r\n114.80000  1.58700  0.61800\r\n115.90000  1.51300  0.72500\r\n117.00000  1.49200  0.91400\r\n118.10000  1.56700  1.11000\r\n118.70000  1.64500  1.13600\r\n119.20000  1.77200  1.13000\r\n119.80000  1.91900  1.04500\r\n120.40000  2.04800  0.92500\r\n121.00000  2.15200  0.81000\r\n122.80000  2.33200  0.46000\r\n124.00000  2.33000  0.32300\r\n125.20000  2.29200  0.23600\r\n126.50000  2.24300  0.16800\r\n127.80000  2.19000  0.11900\r\n129.10001  2.14000  0.07700\r\n130.50000  2.09200  0.05610\r\n131.89999  2.04700  0.04300\r\n133.30000  2.00600  0.03390\r\n134.80000  1.96900  0.02710\r\n136.20000  1.93500  0.02280\r\n137.80000  1.90400  0.01890\r\n139.30000  1.87600  0.01560\r\n140.89999  1.85000  0.01320\r\n142.50000  1.82500  0.01090\r\n144.20000  1.80300  0.00838\r\n145.89999  1.78300  0.00557\r\n147.60001  1.76400  0.00317\r\n149.39999  1.74700  0.00000\r\n153.10001  1.71600  0.00000\r\n159.00000  1.67600  0.00000\r\n167.50000  1.63300  0.00000\r\n177.10001  1.60000  0.00000\r\n183.70000  1.58200  0.00000\r\n190.70000  1.56700  0.00000\r\n198.39999  1.55400  0.00000\r\n206.60001  1.54300  0.00000\r\n213.89999  1.53400  0.00000\r\n214.39999  1.53400  0.00000\r\n226.70000  1.52300  0.00000\r\n230.20000  1.52000  0.00000\r\n237.80000  1.51500  0.00000\r\n239.89999  1.51300  0.00000\r\n248.30000  1.50800  0.00000\r\n265.20001  1.50000  0.00000\r\n269.89999  1.49800  0.00000\r\n275.29999  1.49600  0.00000\r\n280.29999  1.49400  0.00000\r\n289.39999  1.49100  0.00000\r\n296.70001  1.48900  0.00000\r\n302.20001  1.48700  0.00000\r\n330.29999  1.48100  0.00000\r\n334.10001  1.48000  0.00000\r\n340.39999  1.47900  0.00000\r\n346.60001  1.47700  0.00000\r\n361.10001  1.47500  0.00000\r\n365.00000  1.47400  0.00000\r\n404.70001  1.47000  0.00000\r\n435.79999  1.46700  0.00000\r\n467.79999  1.46400  0.00000\r\n486.10001  1.46300  0.00000\r\n508.60001  1.46200  0.00000\r\n546.00000  1.46000  0.00000\r\n576.90002  1.45900  0.00000\r\n579.00000  1.45900  0.00000\r\n587.59998  1.45800  0.00000\r\n589.29999  1.45800  0.00000\r\n643.79999  1.45700  0.00000\r\n656.29999  1.45600  0.00000\r\n667.79999  1.45600  0.00000\r\n706.50000  1.45500  0.00000\r\n"
  },
  {
    "path": "OptolithiumGui/share/data/Si Nitride.MAT",
    "content": "[Version]\r\n1.2.3.4\r\n\r\n[Parameters]\r\nSi Nitride\t\t\t\t\t;Material Name\r\n\r\n\r\n;data in wavelength (nm), n, k\r\n[Data]\r\n51.66000  0.65500  0.42000\r\n53.91000  0.62500  0.48100\r\n56.36000  0.61100  0.56000\r\n59.04000  0.61700  0.64700\r\n61.99000  0.63500  0.74300\r\n65.26000  0.67600  0.84100\r\n68.88000  0.73500  0.93600\r\n72.93000  0.81000  1.03000\r\n77.49000  0.90200  1.11000\r\n82.66000  1.00100  1.18000\r\n88.56000  1.11100  1.26000\r\n95.37000  1.24700  1.35000\r\n103.30000  1.41700  1.43000\r\n112.70000  1.65700  1.52000\r\n118.10000  1.82700  1.53000\r\n124.00000  2.00000  1.49000\r\n130.50000  2.16200  1.44000\r\n137.80000  2.32600  1.32000\r\n145.89999  2.49200  1.16000\r\n155.00000  2.65100  0.96000\r\n165.30000  2.75300  0.75000\r\n177.10001  2.75200  0.49000\r\n183.70000  2.72400  0.38000\r\n190.70000  2.68200  0.27000\r\n198.39999  2.62000  0.17000\r\n206.60001  2.54100  0.10000\r\n215.60001  2.46400  0.06000\r\n225.39999  2.39300  0.03000\r\n236.20000  2.33100  0.01000\r\n248.00000  2.27800  0.00000\r\n261.00000  2.23400  0.00000\r\n275.50000  2.19800  0.00000\r\n291.70001  2.16700  0.00000\r\n310.00000  2.14100  0.00000\r\n354.20001  2.09900  0.00000\r\n413.29999  2.06600  0.00000\r\n495.89999  2.04100  0.00000\r\n619.90002  2.02200  0.00000\r\n826.59998  2.00800  0.00000\r\n"
  },
  {
    "path": "OptolithiumGui/share/data/Silicon.MAT",
    "content": "[Version]\r\n1.2.3.4\r\n\r\n[Parameters]\r\nSilicon\t\t\t\t\t;Material Name\r\n\r\n\r\n;data in wavelength (nm), n, k\r\n[Data]\r\n9.99800  0.99773  0.02060\r\n10.25000  0.99856  0.02120\r\n10.51000  0.99958  0.02190\r\n10.78000  1.00080  0.02260\r\n11.07000  1.00240  0.02330\r\n11.27000  1.00390  0.02390\r\n11.59000  1.00700  0.02470\r\n11.92000  1.01320  0.02560\r\n12.16000  1.02410  0.02620\r\n12.20000  1.02500  0.02400\r\n12.30000  1.03000  0.00500\r\n12.40000  1.03200  0.00154\r\n12.50000  1.03400  0.00100\r\n12.60000  1.03400  0.00102\r\n12.80000  1.03400  0.00109\r\n13.00000  1.03000  0.00113\r\n13.20000  1.02200  0.00120\r\n13.60000  1.00800  0.00130\r\n14.00000  1.00000  0.00143\r\n15.00000  0.99300  0.00178\r\n16.00000  0.99100  0.00215\r\n17.00000  0.98800  0.00254\r\n18.00000  0.98500  0.00297\r\n19.00000  0.98200  0.00343\r\n20.00000  0.97800  0.00393\r\n21.00000  0.97600  0.00443\r\n22.00000  0.97200  0.00500\r\n23.00000  0.96800  0.00553\r\n24.00000  0.96400  0.00610\r\n25.00000  0.96000  0.00670\r\n26.00000  0.95600  0.00730\r\n27.00000  0.95200  0.00785\r\n28.00000  0.94700  0.00840\r\n29.00000  0.94200  0.00900\r\n30.00000  0.93700  0.00950\r\n31.00000  0.93000  0.01000\r\n32.00000  0.92500  0.01040\r\n33.00000  0.91800  0.01000\r\n34.00000  0.91300  0.01130\r\n35.00000  0.90600  0.01170\r\n36.00000  0.89900  0.01210\r\n37.00000  0.89300  0.01240\r\n38.00000  0.88500  0.01280\r\n39.00000  0.87700  0.01320\r\n40.00000  0.86900  0.01350\r\n41.00000  0.86000  0.01380\r\n42.00000  0.85300  0.01420\r\n43.00000  0.84300  0.01470\r\n44.00000  0.83400  0.01520\r\n45.00000  0.82400  0.01580\r\n46.00000  0.81400  0.01680\r\n47.00000  0.80300  0.01780\r\n48.00000  0.79200  0.01920\r\n49.00000  0.77800  0.02050\r\n50.00000  0.76600  0.02230\r\n51.00000  0.75200  0.02430\r\n52.00000  0.73700  0.02640\r\n53.00000  0.72200  0.02920\r\n54.00000  0.70600  0.03250\r\n55.00000  0.69100  0.03650\r\n56.00000  0.67500  0.04050\r\n57.00000  0.65900  0.04550\r\n58.00000  0.64400  0.05100\r\n59.00000  0.62700  0.05800\r\n60.00000  0.61000  0.06500\r\n61.00000  0.59000  0.07400\r\n62.00000  0.56700  0.08350\r\n63.00000  0.54900  0.09300\r\n64.00000  0.53000  0.10000\r\n65.00000  0.51300  0.11300\r\n65.26000  0.51400  0.16300\r\n67.02000  0.48500  0.18900\r\n68.88000  0.45500  0.21900\r\n69.85000  0.44000  0.23700\r\n70.85000  0.42600  0.25500\r\n71.87000  0.41100  0.27500\r\n72.93000  0.39700  0.29600\r\n73.80000  0.38600  0.31400\r\n74.24000  0.37900  0.32300\r\n74.69000  0.37400  0.33300\r\n75.14000  0.36900  0.34200\r\n76.30000  0.35700  0.36700\r\n77.49000  0.34500  0.39400\r\n78.72000  0.33300  0.42100\r\n79.99000  0.32300  0.45000\r\n81.30000  0.31300  0.47900\r\n82.66000  0.30400  0.51000\r\n84.06000  0.29600  0.54100\r\n85.51000  0.28800  0.57300\r\n87.00000  0.28100  0.60700\r\n88.56000  0.27500  0.64100\r\n90.17000  0.26900  0.67700\r\n91.84000  0.26500  0.71400\r\n93.57000  0.26100  0.75200\r\n95.37000  0.25800  0.79200\r\n97.24000  0.25600  0.83300\r\n99.19000  0.25500  0.87500\r\n101.20000  0.25600  0.91800\r\n103.30000  0.25700  0.96300\r\n105.50000  0.25900  1.01000\r\n107.80000  0.26300  1.06000\r\n110.20000  0.26700  1.11000\r\n112.70000  0.27200  1.16000\r\n115.30000  0.27800  1.21000\r\n118.10000  0.28600  1.26000\r\n121.00000  0.29500  1.32000\r\n124.00000  0.30600  1.38000\r\n127.20000  0.31800  1.45000\r\n130.50000  0.33200  1.51000\r\n134.00000  0.34800  1.58000\r\n137.80000  0.36700  1.66000\r\n141.70000  0.38900  1.73000\r\n145.89999  0.41400  1.82000\r\n155.00000  0.47800  2.00000\r\n165.30000  0.56300  2.21000\r\n177.10001  0.68200  2.45000\r\n183.70000  0.75600  2.58000\r\n190.70000  0.84700  2.73000\r\n198.39999  0.96800  2.89000\r\n206.60001  1.01000  2.91000\r\n208.70000  1.06600  2.94000\r\n210.89999  1.08800  2.99000\r\n213.00000  1.11900  3.03000\r\n215.30000  1.15500  3.07000\r\n217.50000  1.18000  3.11000\r\n219.80000  1.22200  3.17000\r\n222.20000  1.26500  3.23000\r\n224.60001  1.31900  3.29000\r\n227.10001  1.38900  3.33000\r\n229.60001  1.47100  3.37000\r\n232.20000  1.54800  3.36000\r\n234.80000  1.58500  3.35000\r\n237.50000  1.59200  3.35000\r\n240.30000  1.58200  3.38000\r\n243.10001  1.57100  3.43000\r\n246.00000  1.56800  3.50000\r\n249.00000  1.57500  3.60000\r\n252.00000  1.59100  3.71000\r\n255.10001  1.61800  3.84000\r\n258.29999  1.65800  3.98000\r\n261.60001  1.71300  4.15000\r\n264.89999  1.79400  4.35000\r\n268.39999  1.92700  4.59000\r\n271.89999  2.14000  4.85000\r\n275.50000  2.45100  5.08000\r\n279.20001  2.83300  5.26000\r\n283.10001  3.27700  5.38000\r\n287.00000  3.84900  5.44000\r\n291.00000  4.52500  5.16000\r\n295.20001  4.88800  4.64000\r\n299.50000  4.99900  4.20000\r\n303.89999  5.02100  3.88000\r\n308.39999  5.01500  3.65000\r\n313.10001  5.01000  3.48000\r\n317.89999  5.01600  3.35000\r\n322.89999  5.04000  3.24000\r\n328.00000  5.07900  3.15000\r\n333.29999  5.13400  3.08000\r\n338.79999  5.20400  3.02000\r\n344.39999  5.29600  2.99000\r\n350.20001  5.44200  2.99000\r\n356.29999  5.73300  3.03000\r\n362.50000  6.30800  2.88000\r\n369.00000  6.79600  2.17000\r\n375.70001  6.70900  1.32000\r\n382.70001  6.31600  0.81000\r\n389.89999  5.94800  0.56000\r\n397.39999  5.65400  0.42000\r\n405.20001  5.42000  0.33000\r\n413.29999  5.22200  0.27000\r\n421.70001  5.05800  0.23000\r\n430.50000  4.91600  0.19000\r\n439.70001  4.79100  0.17000\r\n449.20001  4.68200  0.15000\r\n459.20001  4.58300  0.13000\r\n469.60001  4.49500  0.12000\r\n480.60001  4.41600  0.09000\r\n492.00000  4.34300  0.08000\r\n499.89999  4.29800  0.07000\r\n504.00000  4.27700  0.07000\r\n508.10001  4.25500  0.07200\r\n512.29999  4.23500  0.06000\r\n516.59998  4.21500  0.06000\r\n520.90002  4.19600  0.05600\r\n525.40002  4.17700  0.05300\r\n529.90002  4.15900  0.04300\r\n534.40002  4.14000  0.04500\r\n539.09998  4.12300  0.04800\r\n543.79999  4.10600  0.04400\r\n548.59998  4.08900  0.04400\r\n553.50000  4.07300  0.03200\r\n558.50000  4.05700  0.03800\r\n563.59998  4.04200  0.03200\r\n568.70001  4.02600  0.03400\r\n574.00000  4.01200  0.03000\r\n579.40002  3.99700  0.02700\r\n584.79999  3.98300  0.03000\r\n590.40002  3.96900  0.03000\r\n596.09998  3.95600  0.02700\r\n601.90002  3.94300  0.02500\r\n607.79999  3.93100  0.02500\r\n613.79999  3.91800  0.02400\r\n619.90002  3.90600  0.02200\r\n626.20001  3.89300  0.02200\r\n632.59998  3.88200  0.01900\r\n639.09998  3.87000  0.01800\r\n645.79999  3.85800  0.01700\r\n"
  },
  {
    "path": "OptolithiumGui/share/data/a-Polysilicon.MAT",
    "content": "[Version]\r\n1.2.3.4\r\n\r\n[Parameters]\r\na-Polysilicon\t\t\t\t\t;Material Name\r\n\r\n\r\n;data in wavelength (nm), n, k\r\n[Data]\r\n24.80000  0.99500  0.02350\r\n25.30000  0.99200  0.02420\r\n25.83000  0.99000  0.02500\r\n26.38000  0.98800  0.02580\r\n26.95000  0.98600  0.02670\r\n27.55000  0.98400  0.02750\r\n28.18000  0.98100  0.02850\r\n28.83000  0.97900  0.02940\r\n29.52000  0.97600  0.03040\r\n30.24000  0.97300  0.03140\r\n31.00000  0.97000  0.03260\r\n31.79000  0.96700  0.03370\r\n32.63000  0.96300  0.03500\r\n33.51000  0.95900  0.03640\r\n34.44000  0.95500  0.03790\r\n35.42000  0.95000  0.03950\r\n36.47000  0.94500  0.04130\r\n37.57000  0.93900  0.04330\r\n38.75000  0.93300  0.04550\r\n40.00000  0.92600  0.04800\r\n41.33000  0.91800  0.05080\r\n42.75000  0.90900  0.05410\r\n44.28000  0.89900  0.05790\r\n45.92000  0.88800  0.06230\r\n47.69000  0.87600  0.06750\r\n49.59000  0.86200  0.07370\r\n51.66000  0.84600  0.08120\r\n53.91000  0.82800  0.09030\r\n56.36000  0.80800  0.10100\r\n59.04000  0.78500  0.11500\r\n61.99000  0.75800  0.13200\r\n65.26000  0.72700  0.15400\r\n68.88000  0.69100  0.18100\r\n72.93000  0.65100  0.21600\r\n77.49000  0.60300  0.26100\r\n82.66000  0.54900  0.32100\r\n88.56000  0.48500  0.40300\r\n95.37000  0.41000  0.51900\r\n103.30000  0.32700  0.72600\r\n107.80000  0.36300  0.84700\r\n112.70000  0.39200  0.94600\r\n118.10000  0.42300  1.04000\r\n124.00000  0.45900  1.14000\r\n130.50000  0.49700  1.24000\r\n137.80000  0.54300  1.35000\r\n145.89999  0.59700  1.47000\r\n155.00000  0.66000  1.60000\r\n165.30000  0.73500  1.74000\r\n177.10001  0.83200  1.89000\r\n190.70000  0.95100  2.07000\r\n206.60001  1.11000  2.28000\r\n225.39999  1.35000  2.51000\r\n248.00000  1.69000  2.76000\r\n258.29999  1.86000  2.85000\r\n269.50000  2.07000  2.93000\r\n281.79999  2.30000  2.99000\r\n295.20001  2.56000  3.04000\r\n310.00000  2.87000  3.06000\r\n326.29999  3.21000  3.00000\r\n344.39999  3.55000  2.88000\r\n354.29999  3.73000  2.79000\r\n364.70001  3.90000  2.66000\r\n387.50000  4.17000  2.38000\r\n413.29999  4.38000  2.02000\r\n442.79999  4.47000  1.64000\r\n476.89999  4.49000  1.28000\r\n496.00000  4.47000  1.12000\r\n516.59998  4.46000  0.97000\r\n563.59998  4.36000  0.69000\r\n619.90002  4.23000  0.46100\r\n652.59998  4.17000  0.36300\r\n688.79999  4.09000  0.27100\r\n"
  },
  {
    "path": "OptolithiumGui/share/data/fivebar.MSK",
    "content": "[Version]\r\n1.2.3.4\r\n\r\n[Parameters]\r\nfivebar\t\t\t\t\t\t;2D Mask Name\r\n6000.000, 3000.000, -3000.000, -3000.000\t;Mask dimensions [top,right,bottom,left] (nm)\r\n5000.000, 2250.000, -2250.000, -2250.000\t;Simulation region [top,right,bottom,left] (nm)\r\n1.000\t\t\t\t\t\t;Background intensity transmittance\r\n0.000\t\t\t\t\t\t;Background phase (degrees)\r\n20.000\t\t\t\t\t\t;critical shape step size for automatic generation of [CSE] data (nm)\r\n0\t\t\t\t\t\t;1 = generate new [CSE] data when putting into PROLITH Database\r\n0\t\t\t\t\t\t;1 = mask is clean (no overlaps), 0 = clean mask during import\r\n\r\n\r\n[Data]\r\nPolygon(0.0000, 0.00, 0)\r\n{\r\n   -1575.000, 1500.000\r\n   -1225.000, 1500.000\r\n   -1225.000, -1500.000\r\n   -1575.000, -1500.000\r\n}\r\n\r\n\r\nPolygon(0.0000, 0.00, 0)\r\n{\r\n   -875.000, 1500.000\r\n   -525.000, 1500.000\r\n   -525.000, -1500.000\r\n   -875.000, -1500.000\r\n}\r\n\r\n\r\nPolygon(0.0000, 0.00, 0)\r\n{\r\n   -175.000, 4000.000\r\n   175.000, 4000.000\r\n   175.000, -1500.000\r\n   -175.000, -1500.000\r\n}\r\n\r\n\r\nPolygon(0.0000, 0.00, 0)\r\n{\r\n   525.000, 1500.000\r\n   875.000, 1500.000\r\n   875.000, -1500.000\r\n   525.000, -1500.000\r\n}\r\n\r\n\r\nPolygon(0.0000, 0.00, 0)\r\n{\r\n   1225.000, 1500.000\r\n   1575.000, 1500.000\r\n   1575.000, -1500.000\r\n   1225.000, -1500.000\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "OptolithiumGui/share/data/i-line.res",
    "content": "[Version]\r\n1.2.3.4\r\n\r\n[Parameters]\r\nResist i-line\r\nUnknown\r\n0\r\n1\r\n0\r\n\r\n[Comments]\r\nExample of test i-line (365 nm) photoresist file \r\n\r\n[Develop Parameters]\r\n1\r\n3\t\t\t\t\t\t\t;Dev model (1=Mack, 2=Enhanced, 3=Notch)\r\nUser Defined\r\n105.0\t\t\t\t\t\t;Development Rmax (nm/s)\r\n0.025\t\t\t\t\t\t;Development Rmin (nm/s)\r\n1.500\t\t\t\t\t\t;Development n\r\n0.700\t\t\t\t\t\t;Development Notch Mth\r\n13.500\t\t\t\t\t\t;Development Notch n\r\n1.000\r\n10.000\r\n\r\n[PAB Parameters]\r\n1\r\n1000.000\r\n1.000\r\n\r\n[PEB Parameters]\r\n1\r\n32.50\t\t\t\t\t\t;PEB Diffusivity Ea (kcal/mole)\r\n46.000\t\t\t\t\t\t;PEB Diffusivity Ln(Ar) (nm2/s)\r\n\r\n\r\n;wavelength    A      B      C      Unexposed n   Completely Exposed n\r\n;   (nm)     (1/um) (1/um) (cm2/mJ)\r\n[Exposure Parameters]\r\n1\t\t\t\t\t\t\r\n365.000  0.800  0.040  0.010  1.5  1.5\r\n"
  },
  {
    "path": "OptolithiumGui/share/misc/magic",
    "content": "# Magic\n# Magic data for file(1) command.\n# Machine-generated from src/cmd/file/magdir/*; edit there only!\n# Format is described in magic(files), where:\n# files is 5 on V7 and BSD, 4 on SV, and ?? in the SVID.\n\n#------------------------------------------------------------------------------\n# Localstuff:  file(1) magic for locally observed files\n#\n# $File: Localstuff,v 1.4 2003/03/23 04:17:27 christos Exp $\n# Add any locally observed files here.  Remember:\n# text if readable, executable if runnable binary, data if unreadable.\n#------------------------------------------------------------------------------\n# acorn:  file(1) magic for files found on Acorn systems\n#\n\n# RISC OS Chunk File Format\n# From RISC OS Programmer's Reference Manual, Appendix D\n# We guess the file type from the type of the first chunk.\n0\tlelong\t\t0xc3cbc6c5\tRISC OS Chunk data\n>12\tstring\t\tOBJ_\t\t\\b, AOF object\n>12\tstring\t\tLIB_\t\t\\b, ALF library\n\n# RISC OS AIF, contains \"SWI OS_Exit\" at offset 16.\n16\tlelong\t\t0xef000011\tRISC OS AIF executable\n\n# RISC OS Draw files\n# From RISC OS Programmer's Reference Manual, Appendix E\n0\tstring \t\tDraw\t\tRISC OS Draw file data\n\n# RISC OS new format font files\n# From RISC OS Programmer's Reference Manual, Appendix E\n0\tstring\t\tFONT\\0\t\tRISC OS outline font data,\n>5\tbyte\t\tx\t\tversion %d\n0\tstring\t\tFONT\\1\t\tRISC OS 1bpp font data,\n>5\tbyte\t\tx\t\tversion %d\n0\tstring\t\tFONT\\4\t\tRISC OS 4bpp font data\n>5\tbyte\t\tx\t\tversion %d\n\n# RISC OS Music files\n# From RISC OS Programmer's Reference Manual, Appendix E\n0\tstring\t\tMaestro\\r\tRISC OS music file\n>8\tbyte\t\tx\t\tversion %d\n\n>8\tbyte\t\tx\t\ttype %d\n\n# Digital Symphony data files\n# From: Bernard Jungen (bern8817@euphonynet.be)\n0\t\tstring\t\\x02\\x01\\x13\\x13\\x13\\x01\\x0d\\x10\tDigital Symphony sound sample (RISC OS),\n>8\t\tbyte\tx\tversion %d,\n>9\t\tpstring\tx\tnamed \"%s\",\n>(9.b+19)\tbyte\t=0\t8-bit logarithmic\n>(9.b+19)\tbyte\t=1\tLZW-compressed linear\n>(9.b+19)\tbyte\t=2\t8-bit linear signed\n>(9.b+19)\tbyte\t=3\t16-bit linear signed\n>(9.b+19)\tbyte\t=4\tSigmaDelta-compressed linear\n>(9.b+19)\tbyte\t=5\tSigmaDelta-compressed logarithmic\n>(9.b+19)\tbyte\t>5\tunknown format\n\n0\tstring\t\\x02\\x01\\x13\\x13\\x14\\x12\\x01\\x0b\tDigital Symphony song (RISC OS),\n>8\tbyte\tx\tversion %d,\n>9\tbyte\t=1\t1 voice,\n>9\tbyte\t!1\t%d voices,\n>10\tleshort\t=1\t1 track,\n>10\tleshort\t!1\t%d tracks,\n>12\tleshort\t=1\t1 pattern\n>12\tleshort\t!1\t%d patterns\n\n0\tstring\t\\x02\\x01\\x13\\x13\\x10\\x14\\x12\\x0e\n>9\tbyte\t=0\tDigital Symphony sequence (RISC OS),\n>>8\tbyte\tx\tversion %d,\n>>10\tbyte\t=1\t1 line,\n>>10\tbyte\t!1\t%d lines,\n>>11\tleshort\t=1\t1 position\n>>11\tleshort\t!1\t%d positions\n>9\tbyte\t=1\tDigital Symphony pattern data (RISC OS),\n>>8\tbyte\tx\tversion %d,\n>>10\tleshort\t=1\t1 pattern\n>>10\tleshort\t!1\t%d patterns\n\n#------------------------------------------------------------------------------\n# adi: file(1) magic for ADi's objects\n# From Gregory McGarry <g.mcgarry@ieee.org>\n#\n0\tleshort\t\t0x521c\t\tCOFF DSP21k\n>18\tlelong\t\t&02\t\texecutable,\n>18\tlelong\t\t^02\n>>18\tlelong\t\t&01\t\tstatic object,\n>>18\tlelong\t\t^01\t\trelocatable object,\n>18\tlelong\t\t&010\t\tstripped\n>18\tlelong\t\t^010\t\tnot stripped\n\n#------------------------------------------------------------------------------\n# adventure: file(1) magic for Adventure game files\n#\n# from Allen Garvin <earendil@faeryland.tamu-commerce.edu>\n# Edited by Dave Chapeskie <dchapes@ddm.on.ca> Jun 28, 1998\n# Edited by Chris Chittleborough <cchittleborough@yahoo.com.au>, March 2002\n#\n# ALAN\n# I assume there are other, lower versions, but these are the only ones I\n# saw in the archive.\n0\tbeshort\t0x0206\tALAN game data\n>2\tbyte\t<10\tversion 2.6%d\n\n\n# Infocom (see z-machine)\n#------------------------------------------------------------------------------\n# Z-machine:  file(1) magic for Z-machine binaries.\n#\n# This will match ${TEX_BASE}/texmf/omega/ocp/char2uni/inbig5.ocp which\n# appears to be a version-0 Z-machine binary.\n#\n# The (false match) message is to correct that behavior.  Perhaps it is\n# not needed.\n#\n16\tbelong&0xfe00f0f0\t0x3030\tInfocom game data\n>0\tubyte\t\t\t0\t(false match)\n>0\tubyte\t\t\t>0\t(Z-machine %d,\n>>2\tubeshort\t\tx\tRelease %d /\n>>18\tstring\t\t\t>\\0\tSerial %.6s)\n\n#------------------------------------------------------------------------------\n# Glulx:  file(1) magic for Glulx binaries.\n#\n# I haven't checked for false matches yet.\n#\n0\tstring\t\t\tGlul\tGlulx game data\n>4\tbeshort\t\t\tx\t(Version %d\n>>6\tbyte\t\t\tx\t\\b.%d\n>>8\tbyte\t\t\tx\t\\b.%d)\n>36\tstring\t\t\tInfo\tCompiled by Inform\n\n\n\n# For Quetzal and blorb magic see iff\n\n\n# TADS (Text Adventure Development System)\n#  All files are machine-independent (games compile to byte-code) and are tagged\n#  with a version string of the form \"V2.<digit>.<digit>\\0\" (but TADS 3 is\n#  on the way).\n#  Game files start with \"TADS2 bin\\n\\r\\032\\0\" then the compiler version.\n0\tstring\tTADS2\\ bin\tTADS\n>9\tbelong  !0x0A0D1A00\tgame data, CORRUPTED\n>9\tbelong\t 0x0A0D1A00\n>>13\tstring\t>\\0\t\t%s game data\n#  Resource files start with \"TADS2 rsc\\n\\r\\032\\0\" then the compiler version.\n0\tstring\tTADS2\\ rsc\tTADS\n>9\tbelong  !0x0A0D1A00\tresource data, CORRUPTED\n>9\tbelong\t 0x0A0D1A00\n>>13\tstring\t>\\0\t\t%s resource data\n#  Some saved game files start with \"TADS2 save/g\\n\\r\\032\\0\", a little-endian\n#  2-byte length N, the N-char name of the game file *without* a NUL (darn!),\n# \"TADS2 save\\n\\r\\032\\0\" and the interpreter version. \n0\tstring\tTADS2\\ save/g\tTADS\n>12\tbelong\t!0x0A0D1A00\tsaved game data, CORRUPTED\n>12\tbelong\t 0x0A0D1A00\n>>(16.s+32) string >\\0\t\t%s saved game data\n#  Other saved game files start with \"TADS2 save\\n\\r\\032\\0\" and the interpreter\n#  version.\n0\tstring\tTADS2\\ save\tTADS\n>10\tbelong\t!0x0A0D1A00\tsaved game data, CORRUPTED\n>10\tbelong\t 0x0A0D1A00\n>>14\tstring\t>\\0\t\t%s saved game data\n\n# Danny Milosavljevic <danny.milo@gmx.net>\n# this are adrift (adventure game standard) game files, extension .taf\n# depending on version magic continues with 0x93453E6139FA (V 4.0)\n# 0x9445376139FA (V 3.90)\n# 0x9445366139FA (V 3.80)\n# this is from source (http://www.adrift.org.uk/) and I have some taf\n# files, and checked them.\n#0\tbelong\t0x3C423FC9\n#>4\tbelong\t0x6A87C2CF\tAdrift game file\n#!:mime\tapplication/x-adrift\n#------------------------------------------------------------------------------\n# allegro:  file(1) magic for Allegro datafiles\n# Toby Deshane <hac@shoelace.digivill.net>\n#\n0 belong 0x736C6821   Allegro datafile (packed)\n0 belong 0x736C682E   Allegro datafile (not packed/autodetect)\n0 belong 0x736C682B   Allegro datafile (appended exe data)\n\n#------------------------------------------------------------------------------\n# alliant:  file(1) magic for Alliant FX series a.out files\n#\n# If the FX series is the one that had a processor with a 68K-derived\n# instruction set, the \"short\" should probably become \"beshort\" and the\n# \"long\" should probably become \"belong\".\n# If it's the i860-based one, they should probably become either the\n# big-endian or little-endian versions, depending on the mode they ran\n# the 860 in....\n#\n0\tshort\t\t0420\t\t0420 Alliant virtual executable\n>2\tshort\t\t&0x0020\t\tcommon library\n>16\tlong\t\t>0\t\tnot stripped\n0\tshort\t\t0421\t\t0421 Alliant compact executable\n>2\tshort\t\t&0x0020\t\tcommon library\n>16\tlong\t\t>0\t\tnot stripped\n#------------------------------------------------------------------------------\n# alpha architecture description\n#\n\n0\tleshort\t\t0603\t\tCOFF format alpha\n>22\tleshort&030000\t!020000\t\texecutable\n>24\tleshort\t\t0410\t\tpure\n>24\tleshort\t\t0413\t\tpaged\n>22\tleshort&020000\t!0\t\tdynamically linked\n>16\tlelong\t\t!0\t\tnot stripped\n>16\tlelong\t\t0\t\tstripped\n>22\tleshort&030000\t020000\t\tshared library\n>24\tleshort\t\t0407\t\tobject\n>27\tbyte\t\tx\t\t- version %d\n>26\tbyte\t\tx\t\t\b.%d\n>28\tbyte\t\tx\t\t\b-%d\n\n# Basic recognition of Digital UNIX core dumps - Mike Bremford <mike@opac.bl.uk>\n#\n# The actual magic number is just \"Core\", followed by a 2-byte version\n# number; however, treating any file that begins with \"Core\" as a Digital\n# UNIX core dump file may produce too many false hits, so we include one\n# byte of the version number as well; DU 5.0 appears only to be up to\n# version 2.\n#\n0\tstring\t\tCore\\001\tAlpha COFF format core dump (Digital UNIX)\n>24\tstring\t\t>\\0\t\t\\b, from '%s'\n0\tstring\t\tCore\\002\tAlpha COFF format core dump (Digital UNIX)\n>24\tstring\t\t>\\0\t\t\\b, from '%s'\n\n#------------------------------------------------------------------------------\n# amanda:  file(1) magic for amanda file format\n#\n0\tstring\tAMANDA:\\ \t\tAMANDA \n>8\tstring\tTAPESTART\\ DATE\t\ttape header file,\n>>23\tstring\tX\n>>>25\tstring\t>\\ \t\t\tUnused %s\n>>23\tstring\t>\\ \t\t\tDATE %s\n>8\tstring\tFILE\\ \t\t\tdump file,\n>>13\tstring\t>\\ \t\t\tDATE %s\n#------------------------------------------------------------------------------\n# amigaos:  file(1) magic for AmigaOS binary formats:\n\n#\n# From ignatios@cs.uni-bonn.de (Ignatios Souvatzis)\n#\n0\tbelong\t\t0x000003fa\tAmigaOS shared library\n0\tbelong\t\t0x000003f3\tAmigaOS loadseg()ble executable/binary\n0\tbelong\t\t0x000003e7\tAmigaOS object/library data\n#\n0\tbeshort\t\t0xe310\t\tAmiga Workbench\n>2\tbeshort\t\t1\t\t\n>>48\tbyte\t\t1\t\tdisk icon\n>>48\tbyte\t\t2\t\tdrawer icon\n>>48\tbyte\t\t3\t\ttool icon\n>>48\tbyte\t\t4\t\tproject icon\n>>48\tbyte\t\t5\t\tgarbage icon\n>>48\tbyte\t\t6\t\tdevice icon\n>>48\tbyte\t\t7\t\tkickstart icon\n>>48\tbyte\t\t8\t\tworkbench application icon\n>2\tbeshort\t\t>1\t\ticon, vers. %d\n#\n# various sound formats from the Amiga\n# G=F6tz Waschk <waschk@informatik.uni-rostock.de>\n#\n0\tstring\t\tFC14\t\tFuture Composer 1.4 Module sound file\n0\tstring\t\tSMOD\t\tFuture Composer 1.3 Module sound file\n0\tstring\t\tAON4artofnoise\tArt Of Noise Module sound file\n1\tstring\t\tMUGICIAN/SOFTEYES Mugician Module sound file\n58\tstring\t\tSIDMON\\ II\\ -\\ THE\tSidmon 2.0 Module sound file\n0\tstring\t\tSynth4.0\tSynthesis Module sound file\n0\tstring\t\tARP.\t\tThe Holy Noise Module sound file\n0\tstring\t\tBeEp\\0\t\tJamCracker Module sound file\n0\tstring\t\tCOSO\\0\t\tHippel-COSO Module sound file\n# Too simple (short, pure ASCII, deep), MPi\n#26\tstring\t\tV.3\t\tBrian Postma's Soundmon Module sound file v3\n#26\tstring\t\tBPSM\t\tBrian Postma's Soundmon Module sound file v3\n#26\tstring\t\tV.2\t\tBrian Postma's Soundmon Module sound file v2\n\n# The following are from: \"Stefan A. Haubenthal\" <polluks@web.de>\n0\tbeshort\t\t0x0f00\t\tAmigaOS bitmap font\n0\tbeshort\t\t0x0f03\t\tAmigaOS outline font\n0\tbelong\t\t0x80001001\tAmigaOS outline tag\n0\tstring\t\t##\\ version\tcatalog translation\n0\tstring\t\tEMOD\\0\t\tAmiga E module\n8\tstring\t\tECXM\\0\t\tECX module\n0\tstring/c\t@database\tAmigaGuide file\n\n# Amiga disk types\n# \n0\tstring\t\tRDSK\t\tRigid Disk Block\n>160\tstring\t\tx\t\ton %.24s\n0\tstring\t\tDOS\\0\t\tAmiga DOS disk\n0\tstring\t\tDOS\\1\t\tAmiga FFS disk\n0\tstring\t\tDOS\\2\t\tAmiga Inter DOS disk\n0\tstring\t\tDOS\\3\t\tAmiga Inter FFS disk\n0\tstring\t\tDOS\\4\t\tAmiga Fastdir DOS disk\n0\tstring\t\tDOS\\5\t\tAmiga Fastdir FFS disk\n0\tstring\t\tKICK\t\tKickstart disk\n\n# From: Alex Beregszaszi <alex@fsn.hu>\n0\tstring\t\tLZX\t\tLZX compressed archive (Amiga)\n\n\n#------------------------------------------------------------------------------\n# animation:  file(1) magic for animation/movie formats\n#\n# animation formats\n# MPEG, FLI, DL originally from vax@ccwf.cc.utexas.edu (VaX#n8)\n# FLC, SGI, Apple originally from Daniel Quinlan (quinlan@yggdrasil.com)\n\n# SGI and Apple formats\n0\tstring\t\tMOVI\t\tSilicon Graphics movie file\n!:mime\tvideo/x-sgi-movie\n4       string          moov            Apple QuickTime\n!:mime\tvideo/quicktime\n>12     string          mvhd            \\b movie (fast start)\n>12     string          mdra            \\b URL\n>12     string          cmov            \\b movie (fast start, compressed header)\n>12     string          rmra            \\b multiple URLs\n4       string          mdat            Apple QuickTime movie (unoptimized)\n!:mime\tvideo/quicktime\n#4       string          wide            Apple QuickTime movie (unoptimized)\n#!:mime\tvideo/quicktime\n#4       string          skip            Apple QuickTime movie (modified)\n#!:mime\tvideo/quicktime\n#4       string          free            Apple QuickTime movie (modified)\n#!:mime\tvideo/quicktime\n4       string          idsc            Apple QuickTime image (fast start)\n!:mime\timage/x-quicktime\n#4       string          idat            Apple QuickTime image (unoptimized)\n#!:mime\timage/x-quicktime\n4       string          pckg            Apple QuickTime compressed archive\n!:mime\tapplication/x-quicktime-player\n4\tstring/B\tjP\t\tJPEG 2000 image\n!:mime\timage/jp2\n4\tstring\t\tftyp\t\tISO Media\n>8\tstring\t\tisom\t\t\\b, MPEG v4 system, version 1\n!:mime\tvideo/mp4\n>8\tstring\t\tiso2\t\t\\b, MPEG v4 system, part 12 revision\n>8\tstring\t\tmp41\t\t\\b, MPEG v4 system, version 1\n!:mime\tvideo/mp4\n>8\tstring\t\tmp42\t\t\\b, MPEG v4 system, version 2\n!:mime\tvideo/mp4\n>8\tstring\t\tmp7t\t\t\\b, MPEG v4 system, MPEG v7 XML\n>8\tstring\t\tmp7b\t\t\\b, MPEG v4 system, MPEG v7 binary XML\n>8\tstring/B\tjp2\t\t\\b, JPEG 2000\n!:mime\timage/jp2\n>8\tstring\t\t3gp\t\t\\b, MPEG v4 system, 3GPP\n!:mime\tvideo/3gpp\n>>11\tbyte\t\t4\t\t\\b v4 (H.263/AMR GSM 6.10)\n>>11\tbyte\t\t5\t\t\\b v5 (H.263/AMR GSM 6.10)\n>>11\tbyte\t\t6\t\t\\b v6 (ITU H.264/AMR GSM 6.10)\n>8\tstring\t\tmmp4\t\t\\b, MPEG v4 system, 3GPP Mobile\n!:mime\tvideo/mp4\n>8\tstring\t\tavc1\t\t\\b, MPEG v4 system, 3GPP JVT AVC\n!:mime\tvideo/3gpp\n>8\tstring/B\tM4A\t\t\\b, MPEG v4 system, iTunes AAC-LC\n!:mime\taudio/mp4\n>8\tstring/B\tM4V\t\t\\b, MPEG v4 system, iTunes AVC-LC\n!:mime\tvideo/mp4\n>8\tstring/B\tM4P\t\t\\b, MPEG v4 system, iTunes AES encrypted\n>8\tstring/B\tM4B\t\t\\b, MPEG v4 system, iTunes bookmarked\n>8\tstring/B\tqt\t\t\\b, Apple QuickTime movie\n!:mime\tvideo/quicktime\n\n# MPEG sequences\n# Scans for all common MPEG header start codes\n0\t belong\t\t    0x00000001     \n>4\t byte&0x1F\t    0x07\t   JVT NAL sequence, H.264 video\n>>5      byte               66             \\b, baseline\n>>5      byte               77             \\b, main\n>>5      byte               88             \\b, extended\n>>7      byte               x              \\b @ L %u\n0        belong&0xFFFFFF00  0x00000100     \n>3       byte               0xBA           MPEG sequence\n>>4      byte               &0x40          \\b, v2, program multiplex\n>>4      byte               ^0x40          \\b, v1, system multiplex\n>3       byte               0xBB           MPEG sequence, v1/2, multiplex (missing pack header)\n>3       byte&0x1F          0x07           MPEG sequence, H.264 video\n>>4      byte               66             \\b, baseline\n>>4      byte               77             \\b, main\n>>4      byte               88             \\b, extended\n>>6      byte               x              \\b @ L %u\n>3       byte               0xB0           MPEG sequence, v4\n>>5      belong             0x000001B5\n>>>9     byte               &0x80\n>>>>10   byte&0xF0          16             \\b, video\n>>>>10   byte&0xF0          32             \\b, still texture\n>>>>10   byte&0xF0          48             \\b, mesh\n>>>>10   byte&0xF0          64             \\b, face\n>>>9     byte&0xF8          8              \\b, video\n>>>9     byte&0xF8          16             \\b, still texture\n>>>9     byte&0xF8          24             \\b, mesh\n>>>9     byte&0xF8          32             \\b, face\n>>4      byte               1              \\b, simple @ L1\n>>4      byte               2              \\b, simple @ L2\n>>4      byte               3              \\b, simple @ L3\n>>4      byte               4              \\b, simple @ L0\n>>4      byte               17             \\b, simple scalable @ L1\n>>4      byte               18             \\b, simple scalable @ L2\n>>4      byte               33             \\b, core @ L1\n>>4      byte               34             \\b, core @ L2\n>>4      byte               50             \\b, main @ L2\n>>4      byte               51             \\b, main @ L3\n>>4      byte               53             \\b, main @ L4\n>>4      byte               66             \\b, n-bit @ L2\n>>4      byte               81             \\b, scalable texture @ L1\n>>4      byte               97             \\b, simple face animation @ L1\n>>4      byte               98             \\b, simple face animation @ L2\n>>4      byte               99             \\b, simple face basic animation @ L1\n>>4      byte               100            \\b, simple face basic animation @ L2\n>>4      byte               113            \\b, basic animation text @ L1\n>>4      byte               114            \\b, basic animation text @ L2\n>>4      byte               129            \\b, hybrid @ L1\n>>4      byte               130            \\b, hybrid @ L2\n>>4      byte               145            \\b, advanced RT simple @ L!\n>>4      byte               146            \\b, advanced RT simple @ L2\n>>4      byte               147            \\b, advanced RT simple @ L3\n>>4      byte               148            \\b, advanced RT simple @ L4\n>>4      byte               161            \\b, core scalable @ L1\n>>4      byte               162            \\b, core scalable @ L2\n>>4      byte               163            \\b, core scalable @ L3\n>>4      byte               177            \\b, advanced coding efficiency @ L1\n>>4      byte               178            \\b, advanced coding efficiency @ L2\n>>4      byte               179            \\b, advanced coding efficiency @ L3\n>>4      byte               180            \\b, advanced coding efficiency @ L4\n>>4      byte               193            \\b, advanced core @ L1\n>>4      byte               194            \\b, advanced core @ L2\n>>4      byte               209            \\b, advanced scalable texture @ L1\n>>4      byte               210            \\b, advanced scalable texture @ L2\n>>4      byte               211            \\b, advanced scalable texture @ L3\n>>4      byte               225            \\b, simple studio @ L1\n>>4      byte               226            \\b, simple studio @ L2\n>>4      byte               227            \\b, simple studio @ L3\n>>4      byte               228            \\b, simple studio @ L4\n>>4      byte               229            \\b, core studio @ L1\n>>4      byte               230            \\b, core studio @ L2\n>>4      byte               231            \\b, core studio @ L3\n>>4      byte               232            \\b, core studio @ L4\n>>4      byte               240            \\b, advanced simple @ L0\n>>4      byte               241            \\b, advanced simple @ L1\n>>4      byte               242            \\b, advanced simple @ L2\n>>4      byte               243            \\b, advanced simple @ L3\n>>4      byte               244            \\b, advanced simple @ L4\n>>4      byte               245            \\b, advanced simple @ L5\n>>4      byte               247            \\b, advanced simple @ L3b\n>>4      byte               248            \\b, FGS @ L0\n>>4      byte               249            \\b, FGS @ L1\n>>4      byte               250            \\b, FGS @ L2\n>>4      byte               251            \\b, FGS @ L3\n>>4      byte               252            \\b, FGS @ L4\n>>4      byte               253            \\b, FGS @ L5\n>3       byte               0xB5           MPEG sequence, v4\n>>4      byte               &0x80\n>>>5     byte&0xF0          16             \\b, video (missing profile header)\n>>>5     byte&0xF0          32             \\b, still texture (missing profile header)\n>>>5     byte&0xF0          48             \\b, mesh (missing profile header)\n>>>5     byte&0xF0          64             \\b, face (missing profile header)\n>>4      byte&0xF8          8              \\b, video (missing profile header)\n>>4      byte&0xF8          16             \\b, still texture (missing profile header)\n>>4      byte&0xF8          24             \\b, mesh (missing profile header)\n>>4      byte&0xF8          32             \\b, face (missing profile header)\n>3       byte               0xB3           MPEG sequence\n>>12     belong             0x000001B8     \\b, v1, progressive Y'CbCr 4:2:0 video\n>>12     belong             0x000001B2     \\b, v1, progressive Y'CbCr 4:2:0 video\n>>12     belong             0x000001B5     \\b, v2,\n>>>16    byte&0x0F          1              \\b HP\n>>>16    byte&0x0F          2              \\b Spt\n>>>16    byte&0x0F          3              \\b SNR\n>>>16    byte&0x0F          4              \\b MP\n>>>16    byte&0x0F          5              \\b SP\n>>>17    byte&0xF0          64             \\b@HL\n>>>17    byte&0xF0          96             \\b@H-14\n>>>17    byte&0xF0          128            \\b@ML\n>>>17    byte&0xF0          160            \\b@LL\n>>>17    byte               &0x08          \\b progressive\n>>>17    byte               ^0x08          \\b interlaced\n>>>17    byte&0x06          2              \\b Y'CbCr 4:2:0 video\n>>>17    byte&0x06          4              \\b Y'CbCr 4:2:2 video\n>>>17    byte&0x06          6              \\b Y'CbCr 4:4:4 video\n>>11     byte               &0x02\n>>>75    byte               &0x01\n>>>>140  belong             0x000001B8     \\b, v1, progressive Y'CbCr 4:2:0 video\n>>>>140  belong             0x000001B2     \\b, v1, progressive Y'CbCr 4:2:0 video\n>>>>140  belong             0x000001B5     \\b, v2,\n>>>>>144 byte&0x0F          1              \\b HP\n>>>>>144 byte&0x0F          2              \\b Spt\n>>>>>144 byte&0x0F          3              \\b SNR\n>>>>>144 byte&0x0F          4              \\b MP\n>>>>>144 byte&0x0F          5              \\b SP\n>>>>>145 byte&0xF0          64             \\b@HL\n>>>>>145 byte&0xF0          96             \\b@H-14\n>>>>>145 byte&0xF0          128            \\b@ML\n>>>>>145 byte&0xF0          160            \\b@LL\n>>>>>145 byte               &0x08          \\b progressive\n>>>>>145 byte               ^0x08          \\b interlaced\n>>>>>145 byte&0x06          2              \\b Y'CbCr 4:2:0 video\n>>>>>145 byte&0x06          4              \\b Y'CbCr 4:2:2 video\n>>>>>145 byte&0x06          6              \\b Y'CbCr 4:4:4 video\n>>76    belong             0x000001B8     \\b, v1, progressive Y'CbCr 4:2:0 video\n>>76    belong             0x000001B2     \\b, v1, progressive Y'CbCr 4:2:0 video\n>>76    belong             0x000001B5     \\b, v2,\n>>>80   byte&0x0F          1              \\b HP\n>>>80   byte&0x0F          2              \\b Spt\n>>>80   byte&0x0F          3              \\b SNR\n>>>80   byte&0x0F          4              \\b MP\n>>>80   byte&0x0F          5              \\b SP\n>>>81   byte&0xF0          64             \\b@HL\n>>>81   byte&0xF0          96             \\b@H-14\n>>>81   byte&0xF0          128            \\b@ML\n>>>81   byte&0xF0          160            \\b@LL\n>>>81   byte               &0x08          \\b progressive\n>>>81   byte               ^0x08          \\b interlaced\n>>>81   byte&0x06          2              \\b Y'CbCr 4:2:0 video\n>>>81   byte&0x06          4              \\b Y'CbCr 4:2:2 video\n>>>81   byte&0x06          6              \\b Y'CbCr 4:4:4 video\n>>4      belong&0xFFFFFF00  0x78043800     \\b, HD-TV 1920P\n>>>7     byte&0xF0          0x10           \\b, 16:9\n>>4      belong&0xFFFFFF00  0x50002D00     \\b, SD-TV 1280I\n>>>7     byte&0xF0          0x10           \\b, 16:9\n>>4      belong&0xFFFFFF00  0x30024000     \\b, PAL Capture\n>>>7     byte&0xF0          0x10           \\b, 4:3\n>>4      beshort&0xFFF0     0x2C00         \\b, 4CIF\n>>>5     beshort&0x0FFF     0x01E0         \\b NTSC\n>>>5     beshort&0x0FFF     0x0240         \\b PAL\n>>>7     byte&0xF0          0x20           \\b, 4:3\n>>>7     byte&0xF0          0x30           \\b, 16:9\n>>>7     byte&0xF0          0x40           \\b, 11:5\n>>>7     byte&0xF0          0x80           \\b, PAL 4:3\n>>>7     byte&0xF0          0xC0           \\b, NTSC 4:3\n>>4      belong&0xFFFFFF00  0x2801E000     \\b, LD-TV 640P\n>>>7     byte&0xF0          0x10           \\b, 4:3\n>>4      belong&0xFFFFFF00  0x1400F000     \\b, 320x240\n>>>7     byte&0xF0          0x10           \\b, 4:3\n>>4      belong&0xFFFFFF00  0x0F00A000     \\b, 240x160\n>>>7     byte&0xF0          0x10           \\b, 4:3\n>>4      belong&0xFFFFFF00  0x0A007800     \\b, 160x120\n>>>7     byte&0xF0          0x10           \\b, 4:3\n>>4      beshort&0xFFF0     0x1600         \\b, CIF\n>>>5     beshort&0x0FFF     0x00F0         \\b NTSC\n>>>5     beshort&0x0FFF     0x0120         \\b PAL\n>>>7     byte&0xF0          0x20           \\b, 4:3\n>>>7     byte&0xF0          0x30           \\b, 16:9\n>>>7     byte&0xF0          0x40           \\b, 11:5\n>>>7     byte&0xF0          0x80           \\b, PAL 4:3\n>>>7     byte&0xF0          0xC0           \\b, NTSC 4:3\n>>>5     beshort&0x0FFF     0x0240         \\b PAL 625\n>>>>7    byte&0xF0          0x20           \\b, 4:3\n>>>>7    byte&0xF0          0x30           \\b, 16:9\n>>>>7    byte&0xF0          0x40           \\b, 11:5\n>>4      beshort&0xFFF0     0x2D00         \\b, CCIR/ITU\n>>>5     beshort&0x0FFF     0x01E0         \\b NTSC 525\n>>>5     beshort&0x0FFF     0x0240         \\b PAL 625\n>>>7     byte&0xF0          0x20           \\b, 4:3\n>>>7     byte&0xF0          0x30           \\b, 16:9\n>>>7     byte&0xF0          0x40           \\b, 11:5\n>>4      beshort&0xFFF0     0x1E00         \\b, SVCD\n>>>5     beshort&0x0FFF     0x01E0         \\b NTSC 525\n>>>5     beshort&0x0FFF     0x0240         \\b PAL 625\n>>>7     byte&0xF0          0x20           \\b, 4:3\n>>>7     byte&0xF0          0x30           \\b, 16:9\n>>>7     byte&0xF0          0x40           \\b, 11:5\n>>7      byte&0x0F          1              \\b, 23.976 fps\n>>7      byte&0x0F          2              \\b, 24 fps\n>>7      byte&0x0F          3              \\b, 25 fps\n>>7      byte&0x0F          4              \\b, 29.97 fps\n>>7      byte&0x0F          5              \\b, 30 fps\n>>7      byte&0x0F          6              \\b, 50 fps\n>>7      byte&0x0F          7              \\b, 59.94 fps\n>>7      byte&0x0F          8              \\b, 60 fps\n>>11     byte               &0x04          \\b, Constrained\n\n# MPEG ADTS Audio (*.mpx/mxa/aac)\n# from dreesen@math.fu-berlin.de\n# modified to fully support MPEG ADTS\n\n# MP3, M1A\n# modified by Joerg Jenderek\n# GRR the original test are too common for many DOS files\n# so don't accept as MP3 until we've tested the rate\n0       beshort&0xFFFE  0xFFFA\n# rates\n>2      byte&0xF0       0x10           MPEG ADTS, layer III, v1,  32 kbps\n!:mime\taudio/mpeg\n>2      byte&0xF0       0x20           MPEG ADTS, layer III, v1,  40 kbps\n!:mime\taudio/mpeg\n>2      byte&0xF0       0x30           MPEG ADTS, layer III, v1,  48 kbps\n!:mime\taudio/mpeg\n>2      byte&0xF0       0x40           MPEG ADTS, layer III, v1,  56 kbps\n!:mime\taudio/mpeg\n>2      byte&0xF0       0x50           MPEG ADTS, layer III, v1,  64 kbps\n!:mime\taudio/mpeg\n>2      byte&0xF0       0x60           MPEG ADTS, layer III, v1,  80 kbps\n!:mime\taudio/mpeg\n>2      byte&0xF0       0x70           MPEG ADTS, layer III, v1,  96 kbps\n!:mime\taudio/mpeg\n>2      byte&0xF0       0x80           MPEG ADTS, layer III, v1, 112 kbps\n!:mime\taudio/mpeg\n>2      byte&0xF0       0x90           MPEG ADTS, layer III, v1, 128 kbps\n!:mime\taudio/mpeg\n>2      byte&0xF0       0xA0           MPEG ADTS, layer III, v1, 160 kbps\n!:mime\taudio/mpeg\n>2      byte&0xF0       0xB0           MPEG ADTS, layer III, v1, 192 kbps\n!:mime\taudio/mpeg\n>2      byte&0xF0       0xC0           MPEG ADTS, layer III, v1, 224 kbps\n!:mime\taudio/mpeg\n>2      byte&0xF0       0xD0           MPEG ADTS, layer III, v1, 256 kbps\n!:mime\taudio/mpeg\n>2      byte&0xF0       0xE0           MPEG ADTS, layer III, v1, 320 kbps\n!:mime\taudio/mpeg\n# timing\n>2      byte&0x0C       0x00           \\b, 44.1 kHz\n>2      byte&0x0C       0x04           \\b, 48 kHz\n>2      byte&0x0C       0x08           \\b, 32 kHz\n# channels/options\n>3      byte&0xC0       0x00           \\b, Stereo\n>3      byte&0xC0       0x40           \\b, JntStereo\n>3      byte&0xC0       0x80           \\b, 2x Monaural\n>3      byte&0xC0       0xC0           \\b, Monaural\n#>1     byte            ^0x01          \\b, Data Verify\n#>2     byte            &0x02          \\b, Packet Pad\n#>2     byte            &0x01          \\b, Custom Flag\n#>3     byte            &0x08          \\b, Copyrighted\n#>3     byte            &0x04          \\b, Original Source\n#>3     byte&0x03       1              \\b, NR: 50/15 ms\n#>3     byte&0x03       3              \\b, NR: CCIT J.17\n\n# MP2, M1A\n0       beshort&0xFFFE  0xFFFC         MPEG ADTS, layer II, v1\n!:mime\taudio/mpeg\n# rates\n>2      byte&0xF0       0x10           \\b,  32 kbps\n>2      byte&0xF0       0x20           \\b,  48 kbps\n>2      byte&0xF0       0x30           \\b,  56 kbps\n>2      byte&0xF0       0x40           \\b,  64 kbps\n>2      byte&0xF0       0x50           \\b,  80 kbps\n>2      byte&0xF0       0x60           \\b,  96 kbps\n>2      byte&0xF0       0x70           \\b, 112 kbps\n>2      byte&0xF0       0x80           \\b, 128 kbps\n>2      byte&0xF0       0x90           \\b, 160 kbps\n>2      byte&0xF0       0xA0           \\b, 192 kbps\n>2      byte&0xF0       0xB0           \\b, 224 kbps\n>2      byte&0xF0       0xC0           \\b, 256 kbps\n>2      byte&0xF0       0xD0           \\b, 320 kbps\n>2      byte&0xF0       0xE0           \\b, 384 kbps\n# timing\n>2      byte&0x0C       0x00           \\b, 44.1 kHz\n>2      byte&0x0C       0x04           \\b, 48 kHz\n>2      byte&0x0C       0x08           \\b, 32 kHz\n# channels/options\n>3      byte&0xC0       0x00           \\b, Stereo\n>3      byte&0xC0       0x40           \\b, JntStereo\n>3      byte&0xC0       0x80           \\b, 2x Monaural\n>3      byte&0xC0       0xC0           \\b, Monaural\n#>1     byte            ^0x01          \\b, Data Verify\n#>2     byte            &0x02          \\b, Packet Pad\n#>2     byte            &0x01          \\b, Custom Flag\n#>3     byte            &0x08          \\b, Copyrighted\n#>3     byte            &0x04          \\b, Original Source\n#>3     byte&0x03       1              \\b, NR: 50/15 ms\n#>3     byte&0x03       3              \\b, NR: CCIT J.17\n\n# MPA, M1A\n# updated by Joerg Jenderek\n# GRR the original test are too common for many DOS files, so test 32 <= kbits <= 448\n# GRR this test is still too general as it catches a BOM of UTF-16 files (0xFFFE)\n# FIXME: Almost all little endian UTF-16 text with BOM are clobbered by these entries\n#0\tbeshort&0xFFFE\t\t0xFFFE\t\n#>2\tubyte&0xF0\t>0x0F\t\t\n#>>2\tubyte&0xF0\t<0xE1\t\tMPEG ADTS, layer I, v1\n## rate\n#>>>2      byte&0xF0       0x10           \\b,  32 kbps\n#>>>2      byte&0xF0       0x20           \\b,  64 kbps\n#>>>2      byte&0xF0       0x30           \\b,  96 kbps\n#>>>2      byte&0xF0       0x40           \\b, 128 kbps\n#>>>2      byte&0xF0       0x50           \\b, 160 kbps\n#>>>2      byte&0xF0       0x60           \\b, 192 kbps\n#>>>2      byte&0xF0       0x70           \\b, 224 kbps\n#>>>2      byte&0xF0       0x80           \\b, 256 kbps\n#>>>2      byte&0xF0       0x90           \\b, 288 kbps\n#>>>2      byte&0xF0       0xA0           \\b, 320 kbps\n#>>>2      byte&0xF0       0xB0           \\b, 352 kbps\n#>>>2      byte&0xF0       0xC0           \\b, 384 kbps\n#>>>2      byte&0xF0       0xD0           \\b, 416 kbps\n#>>>2      byte&0xF0       0xE0           \\b, 448 kbps\n## timing\n#>>>2      byte&0x0C       0x00           \\b, 44.1 kHz\n#>>>2      byte&0x0C       0x04           \\b, 48 kHz\n#>>>2      byte&0x0C       0x08           \\b, 32 kHz\n## channels/options\n#>>>3      byte&0xC0       0x00           \\b, Stereo\n#>>>3      byte&0xC0       0x40           \\b, JntStereo\n#>>>3      byte&0xC0       0x80           \\b, 2x Monaural\n#>>>3      byte&0xC0       0xC0           \\b, Monaural\n##>1     byte            ^0x01          \\b, Data Verify\n##>2     byte            &0x02          \\b, Packet Pad\n##>2     byte            &0x01          \\b, Custom Flag\n##>3     byte            &0x08          \\b, Copyrighted\n##>3     byte            &0x04          \\b, Original Source\n##>3     byte&0x03       1              \\b, NR: 50/15 ms\n##>3     byte&0x03       3              \\b, NR: CCIT J.17\n\n# MP3, M2A\n0       beshort&0xFFFE  0xFFF2         MPEG ADTS, layer III, v2\n!:mime\taudio/mpeg\n# rate\n>2      byte&0xF0       0x10           \\b,   8 kbps\n>2      byte&0xF0       0x20           \\b,  16 kbps\n>2      byte&0xF0       0x30           \\b,  24 kbps\n>2      byte&0xF0       0x40           \\b,  32 kbps\n>2      byte&0xF0       0x50           \\b,  40 kbps\n>2      byte&0xF0       0x60           \\b,  48 kbps\n>2      byte&0xF0       0x70           \\b,  56 kbps\n>2      byte&0xF0       0x80           \\b,  64 kbps\n>2      byte&0xF0       0x90           \\b,  80 kbps\n>2      byte&0xF0       0xA0           \\b,  96 kbps\n>2      byte&0xF0       0xB0           \\b, 112 kbps\n>2      byte&0xF0       0xC0           \\b, 128 kbps\n>2      byte&0xF0       0xD0           \\b, 144 kbps\n>2      byte&0xF0       0xE0           \\b, 160 kbps\n# timing\n>2      byte&0x0C       0x00           \\b, 22.05 kHz\n>2      byte&0x0C       0x04           \\b, 24 kHz\n>2      byte&0x0C       0x08           \\b, 16 kHz\n# channels/options\n>3      byte&0xC0       0x00           \\b, Stereo\n>3      byte&0xC0       0x40           \\b, JntStereo\n>3      byte&0xC0       0x80           \\b, 2x Monaural\n>3      byte&0xC0       0xC0           \\b, Monaural\n#>1     byte            ^0x01          \\b, Data Verify\n#>2     byte            &0x02          \\b, Packet Pad\n#>2     byte            &0x01          \\b, Custom Flag\n#>3     byte            &0x08          \\b, Copyrighted\n#>3     byte            &0x04          \\b, Original Source\n#>3     byte&0x03       1              \\b, NR: 50/15 ms\n#>3     byte&0x03       3              \\b, NR: CCIT J.17\n\n# MP2, M2A\n0       beshort&0xFFFE  0xFFF4         MPEG ADTS, layer II, v2\n# rate \n>2      byte&0xF0       0x10           \\b,   8 kbps\n>2      byte&0xF0       0x20           \\b,  16 kbps \n>2      byte&0xF0       0x30           \\b,  24 kbps\n>2      byte&0xF0       0x40           \\b,  32 kbps\n>2      byte&0xF0       0x50           \\b,  40 kbps\n>2      byte&0xF0       0x60           \\b,  48 kbps\n>2      byte&0xF0       0x70           \\b,  56 kbps\n>2      byte&0xF0       0x80           \\b,  64 kbps\n>2      byte&0xF0       0x90           \\b,  80 kbps\n>2      byte&0xF0       0xA0           \\b,  96 kbps\n>2      byte&0xF0       0xB0           \\b, 112 kbps\n>2      byte&0xF0       0xC0           \\b, 128 kbps\n>2      byte&0xF0       0xD0           \\b, 144 kbps\n>2      byte&0xF0       0xE0           \\b, 160 kbps\n# timing\n>2      byte&0x0C       0x00           \\b, 22.05 kHz\n>2      byte&0x0C       0x04           \\b, 24 kHz\n>2      byte&0x0C       0x08           \\b, 16 kHz\n# channels/options\n>3      byte&0xC0       0x00           \\b, Stereo\n>3      byte&0xC0       0x40           \\b, JntStereo\n>3      byte&0xC0       0x80           \\b, 2x Monaural\n>3      byte&0xC0       0xC0           \\b, Monaural\n#>1     byte            ^0x01          \\b, Data Verify\n#>2     byte            &0x02          \\b, Packet Pad\n#>2     byte            &0x01          \\b, Custom Flag\n#>3     byte            &0x08          \\b, Copyrighted\n#>3     byte            &0x04          \\b, Original Source\n#>3     byte&0x03       1              \\b, NR: 50/15 ms\n#>3     byte&0x03       3              \\b, NR: CCIT J.17\n\n# MPA, M2A\n0       beshort&0xFFFE  0xFFF6         MPEG ADTS, layer I, v2\n# rate\n>2      byte&0xF0       0x10           \\b,  32 kbps\n>2      byte&0xF0       0x20           \\b,  48 kbps\n>2      byte&0xF0       0x30           \\b,  56 kbps\n>2      byte&0xF0       0x40           \\b,  64 kbps\n>2      byte&0xF0       0x50           \\b,  80 kbps\n>2      byte&0xF0       0x60           \\b,  96 kbps\n>2      byte&0xF0       0x70           \\b, 112 kbps\n>2      byte&0xF0       0x80           \\b, 128 kbps\n>2      byte&0xF0       0x90           \\b, 144 kbps\n>2      byte&0xF0       0xA0           \\b, 160 kbps\n>2      byte&0xF0       0xB0           \\b, 176 kbps\n>2      byte&0xF0       0xC0           \\b, 192 kbps\n>2      byte&0xF0       0xD0           \\b, 224 kbps\n>2      byte&0xF0       0xE0           \\b, 256 kbps\n# timing\n>2      byte&0x0C       0x00           \\b, 22.05 kHz\n>2      byte&0x0C       0x04           \\b, 24 kHz\n>2      byte&0x0C       0x08           \\b, 16 kHz\n# channels/options\n>3      byte&0xC0       0x00           \\b, Stereo\n>3      byte&0xC0       0x40           \\b, JntStereo\n>3      byte&0xC0       0x80           \\b, 2x Monaural\n>3      byte&0xC0       0xC0           \\b, Monaural\n#>1     byte            ^0x01          \\b, Data Verify\n#>2     byte            &0x02          \\b, Packet Pad\n#>2     byte            &0x01          \\b, Custom Flag\n#>3     byte            &0x08          \\b, Copyrighted\n#>3     byte            &0x04          \\b, Original Source\n#>3     byte&0x03       1              \\b, NR: 50/15 ms\n#>3     byte&0x03       3              \\b, NR: CCIT J.17\n\n# MP3, M25A\n0       beshort&0xFFFE  0xFFE2         MPEG ADTS, layer III,  v2.5\n# rate  \n>2      byte&0xF0       0x10           \\b,   8 kbps\n>2      byte&0xF0       0x20           \\b,  16 kbps\n>2      byte&0xF0       0x30           \\b,  24 kbps\n>2      byte&0xF0       0x40           \\b,  32 kbps\n>2      byte&0xF0       0x50           \\b,  40 kbps\n>2      byte&0xF0       0x60           \\b,  48 kbps\n>2      byte&0xF0       0x70           \\b,  56 kbps\n>2      byte&0xF0       0x80           \\b,  64 kbps\n>2      byte&0xF0       0x90           \\b,  80 kbps\n>2      byte&0xF0       0xA0           \\b,  96 kbps\n>2      byte&0xF0       0xB0           \\b, 112 kbps\n>2      byte&0xF0       0xC0           \\b, 128 kbps\n>2      byte&0xF0       0xD0           \\b, 144 kbps\n>2      byte&0xF0       0xE0           \\b, 160 kbps\n# timing\n>2      byte&0x0C       0x00           \\b, 11.025 kHz\n>2      byte&0x0C       0x04           \\b, 12 kHz\n>2      byte&0x0C       0x08           \\b, 8 kHz\n# channels/options\n>3      byte&0xC0       0x00           \\b, Stereo\n>3      byte&0xC0       0x40           \\b, JntStereo\n>3      byte&0xC0       0x80           \\b, 2x Monaural\n>3      byte&0xC0       0xC0           \\b, Monaural\n#>1     byte            ^0x01          \\b, Data Verify\n#>2     byte            &0x02          \\b, Packet Pad\n#>2     byte            &0x01          \\b, Custom Flag\n#>3     byte            &0x08          \\b, Copyrighted\n#>3     byte            &0x04          \\b, Original Source\n#>3     byte&0x03       1              \\b, NR: 50/15 ms\n#>3     byte&0x03       3              \\b, NR: CCIT J.17\n\n# AAC (aka MPEG-2 NBC audio) and MPEG-4 audio\n\n# Stored AAC streams (instead of the MP4 format)\n0       string          ADIF           MPEG ADIF, AAC\n!:mime\taudio/x-hx-aac-adif\n>4      byte            &0x80\n>>13    byte            &0x10          \\b, VBR\n>>13    byte            ^0x10          \\b, CBR\n>>16    byte&0x1E       0x02           \\b, single stream\n>>16    byte&0x1E       0x04           \\b, 2 streams\n>>16    byte&0x1E       0x06           \\b, 3 streams\n>>16    byte            &0x08          \\b, 4 or more streams\n>>16    byte            &0x10          \\b, 8 or more streams\n>>4    byte            &0x80          \\b, Copyrighted\n>>13   byte            &0x40          \\b, Original Source\n>>13   byte            &0x20          \\b, Home Flag\n>4      byte            ^0x80\n>>4     byte            &0x10          \\b, VBR\n>>4     byte            ^0x10          \\b, CBR\n>>7     byte&0x1E       0x02           \\b, single stream\n>>7     byte&0x1E       0x04           \\b, 2 streams\n>>7     byte&0x1E       0x06           \\b, 3 streams\n>>7     byte            &0x08          \\b, 4 or more streams\n>>7     byte            &0x10          \\b, 8 or more streams\n>>4    byte            &0x40          \\b, Original Stream(s)\n>>4    byte            &0x20          \\b, Home Source\n\n# Live or stored single AAC stream (used with MPEG-2 systems)\n0       beshort&0xFFF6  0xFFF0         MPEG ADTS, AAC\n!:mime\taudio/x-hx-aac-adts\n>1      byte            &0x08          \\b, v2\n>1      byte            ^0x08          \\b, v4\n# profile\n>>2     byte            &0xC0          \\b LTP\n>2      byte&0xc0       0x00           \\b Main\n>2      byte&0xc0       0x40           \\b LC\n>2      byte&0xc0       0x80           \\b SSR\n# timing\n>2      byte&0x3c       0x00           \\b, 96 kHz\n>2      byte&0x3c       0x04           \\b, 88.2 kHz\n>2      byte&0x3c       0x08           \\b, 64 kHz\n>2      byte&0x3c       0x0c           \\b, 48 kHz\n>2      byte&0x3c       0x10           \\b, 44.1 kHz\n>2      byte&0x3c       0x14           \\b, 32 kHz\n>2      byte&0x3c       0x18           \\b, 24 kHz\n>2      byte&0x3c       0x1c           \\b, 22.05 kHz\n>2      byte&0x3c       0x20           \\b, 16 kHz\n>2      byte&0x3c       0x24           \\b, 12 kHz\n>2      byte&0x3c       0x28           \\b, 11.025 kHz\n>2      byte&0x3c       0x2c           \\b, 8 kHz\n# channels\n>2      beshort&0x01c0  0x0040         \\b, monaural\n>2      beshort&0x01c0  0x0080         \\b, stereo\n>2      beshort&0x01c0  0x00c0         \\b, stereo + center\n>2      beshort&0x01c0  0x0100         \\b, stereo+center+LFE\n>2      beshort&0x01c0  0x0140         \\b, surround\n>2      beshort&0x01c0  0x0180         \\b, surround + LFE\n>2      beshort         &0x01C0        \\b, surround + side\n#>1     byte            ^0x01           \\b, Data Verify\n#>2     byte            &0x02           \\b, Custom Flag\n#>3     byte            &0x20           \\b, Original Stream\n#>3     byte            &0x10           \\b, Home Source\n#>3     byte            &0x08           \\b, Copyrighted\n\n# Live MPEG-4 audio streams (instead of RTP FlexMux)\n0       beshort&0xFFE0  0x56E0         MPEG-4 LOAS\n!:mime\taudio/x-mp4a-latm\n#>1     beshort&0x1FFF  x              \\b, %u byte packet\n>3      byte&0xE0       0x40\n>>4     byte&0x3C       0x04           \\b, single stream\n>>4     byte&0x3C       0x08           \\b, 2 streams\n>>4     byte&0x3C       0x0C           \\b, 3 streams\n>>4     byte            &0x08          \\b, 4 or more streams\n>>4     byte            &0x20          \\b, 8 or more streams\n>3      byte&0xC0       0\n>>4     byte&0x78       0x08           \\b, single stream\n>>4     byte&0x78       0x10           \\b, 2 streams\n>>4     byte&0x78       0x18           \\b, 3 streams\n>>4     byte            &0x20          \\b, 4 or more streams\n>>4     byte            &0x40          \\b, 8 or more streams\n# This magic isn't strong enough (matches plausible ISO-8859-1 text)\n#0       beshort         0x4DE1         MPEG-4 LO-EP audio stream\n#!:mime\taudio/x-mp4a-latm\n\n# Summary: FLI animation format\n# Created by: Daniel Quinlan <quinlan@yggdrasil.com>\n# Modified by (1): Abel Cheung <abelcheung@gmail.com> (avoid over-generic detection)\n4\tleshort\t\t0xAF11\n# standard FLI always has 320x200 resolution and 8 bit color\n>8\tleshort\t\t320\n>>10\tleshort\t\t200\n>>>12\tleshort\t\t8\t\t\tFLI animation, 320x200x8\n!:mime\tvideo/x-fli\n>>>>6\tleshort\t\tx\t\t\t\\b, %d frames\n# frame speed is multiple of 1/70s\n>>>>16\tleshort\t\tx\t\t\t\\b, %d/70s per frame\n\n# Summary: FLC animation format\n# Created by: Daniel Quinlan <quinlan@yggdrasil.com>\n# Modified by (1): Abel Cheung <abelcheung@gmail.com> (avoid over-generic detection)\n4\tleshort\t\t0xAF12\n# standard FLC always use 8 bit color\n>12\tleshort\t\t8\t\t\tFLC animation\n!:mime\tvideo/x-flc\n>>8\tleshort\t\tx\t\t\t\\b, %d\n>>10\tleshort\t\tx\t\t\t\\bx%dx8\n>>6\tuleshort\tx\t\t\t\\b, %d frames\n>>16\tuleshort\tx\t\t\t\\b, %dms per frame\n\n# DL animation format\n# XXX - collision with most `mips' magic\n#\n# I couldn't find a real magic number for these, however, this\n# -appears- to work.  Note that it might catch other files, too, so be\n# careful!\n#\n# Note that title and author appear in the two 20-byte chunks\n# at decimal offsets 2 and 22, respectively, but they are XOR'ed with\n# 255 (hex FF)!  The DL format is really bad.\n#\n#0\tbyte\t1\tDL version 1, medium format (160x100, 4 images/screen)\n#!:mime\tvideo/x-unknown\n#>42\tbyte\tx\t- %d screens,\n#>43\tbyte\tx\t%d commands\n#0\tbyte\t2\tDL version 2\n#!:mime\tvideo/x-unknown\n#>1\tbyte\t1\t- large format (320x200,1 image/screen),\n#>1\tbyte\t2\t- medium format (160x100,4 images/screen),\n#>1\tbyte\t>2\t- unknown format,\n#>42\tbyte\tx\t%d screens,\n#>43\tbyte\tx\t%d commands\n# Based on empirical evidence, DL version 3 have several nulls following the\n# \\003.  Most of them start with non-null values at hex offset 0x34 or so.\n#0\tstring\t\\3\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\tDL version 3\n\n# iso 13818 transport stream\n#\n# from Oskar Schirmer <schirmer@scara.com> Feb 3, 2001 (ISO 13818.1)\n# (the following is a little bit restrictive and works fine for a stream\n#  that starts with PAT properly. it won't work for stream data, that is\n#  cut from an input device data right in the middle, but this shouldn't\n#  disturb)\n# syncbyte      8 bit\t0x47\n# error_ind     1 bit\t-\n# payload_start 1 bit\t1\n# priority      1 bit\t-\n# PID          13 bit\t0x0000\n# scrambling    2 bit\t-\n# adaptfld_ctrl 2 bit\t1 or 3\n# conti_count   4 bit\t0\n0\tbelong&0xFF5FFF1F\t0x47400010\tMPEG transport stream data\n>188\tbyte\t\t\t!0x47\t\tCORRUPTED\n\n# DIF digital video file format <mpruett@sgi.com>\n0\tbelong&0xffffff00\t0x1f070000      DIF\n>4\tbyte\t\t\t&0x01\t\t(DVCPRO) movie file\n>4\tbyte\t\t\t^0x01\t\t(DV) movie file\n>3\tbyte\t\t\t&0x80\t\t(PAL)\n>3\tbyte\t\t\t^0x80\t\t(NTSC)\n\n# Microsoft Advanced Streaming Format (ASF) <mpruett@sgi.com>\n0\tbelong\t\t\t0x3026b275\tMicrosoft ASF\n\n# MNG Video Format, <URL:http://www.libpng.org/pub/mng/spec/>\n0\tstring\t\t\t\\x8aMNG\t\tMNG video data,\n!:mime\tvideo/x-mng\n>4\tbelong\t\t\t!0x0d0a1a0a\tCORRUPTED,\n>4\tbelong\t\t\t0x0d0a1a0a\n>>16    belong\tx\t\t\t\t%ld x\n>>20    belong\tx\t\t\t\t%ld\n\n# JNG Video Format, <URL:http://www.libpng.org/pub/mng/spec/>\n0\tstring\t\t\t\\x8bJNG\t\tJNG video data,\n!:mime\tvideo/x-jng\n>4\tbelong\t\t\t!0x0d0a1a0a\tCORRUPTED,\n>4\tbelong\t\t\t0x0d0a1a0a\n>>16    belong\tx\t\t\t\t%ld x\n>>20    belong\tx\t\t\t\t%ld\n\n# Vivo video (Wolfram Kleff)\n3\tstring\t\t\\x0D\\x0AVersion:Vivo\tVivo video data\n\n# VRML (Virtual Reality Modelling Language)\n0       string/b        #VRML\\ V1.0\\ ascii\tVRML 1 file\n!:mime\tmodel/vrml\n0\tstring/b\t#VRML\\ V2.0\\ utf8\tISO/IEC 14772 VRML 97 file\n!:mime\tmodel/vrml\n\n# X3D (Extensible 3D) [http://www.web3d.org/specifications/x3d-3.0.dtd]\n# From Michel Briand <michelbriand@free.fr>\n0\tstring\t\t\\<?xml\\ version=\"\n!:strength +1\n>20\tsearch/1000/cb  \\<!DOCTYPE\\ X3D\t\tX3D (Extensible 3D) model xml text\n!:mime model/x3d\n\n#---------------------------------------------------------------------------\n# HVQM4: compressed movie format designed by Hudson for Nintendo GameCube\n# From Mark Sheppard <msheppard@climax.co.uk>, 2002-10-03\n#\n0\tstring\t\tHVQM4\t\t%s\n>6\tstring\t\t>\\0\t\tv%s\n>0\tbyte\t\tx\t\tGameCube movie,\n>0x34\tubeshort\tx\t\t%d x\n>0x36\tubeshort\tx\t\t%d,\n>0x26\tubeshort\tx\t\t%dµs,\n>0x42\tubeshort\t0\t\tno audio\n>0x42\tubeshort\t>0\t\t%dHz audio\n\n# From: \"Stefan A. Haubenthal\" <polluks@web.de>\n0\tstring\t\tDVDVIDEO-VTS\tVideo title set,\n>0x21\tbyte\t\tx\t\tv%x\n0\tstring\t\tDVDVIDEO-VMG\tVideo manager,\n>0x21\tbyte\t\tx\t\tv%x\n\n# From: Behan Webster <behanw@websterwood.com>\n# NuppelVideo used by Mythtv (*.nuv)\n# Note: there are two identical stanzas here differing only in the\n# initial string matched. It used to be done with a regex, but we're\n# trying to get rid of those.\n0\tstring\t\tNuppelVideo\tMythTV NuppelVideo\n>12\tstring\t\tx\t\tv%s\n>20\tlelong\t\tx\t\t(%d\n>24\tlelong\t\tx\t\t\\bx%d),\n>36\tstring\t\tP\t\t\\bprogressive,\n>36\tstring\t\tI\t\t\\binterlaced,\n>40\tledouble\tx\t\t\\baspect:%.2f,\n>48\tledouble\tx\t\t\\bfps:%.2f\n0\tstring\t\tMythTV\t\tMythTV NuppelVideo\n>12\tstring\t\tx\t\tv%s\n>20\tlelong\t\tx\t\t(%d\n>24\tlelong\t\tx\t\t\\bx%d),\n>36\tstring\t\tP\t\t\\bprogressive,\n>36\tstring\t\tI\t\t\\binterlaced,\n>40\tledouble\tx\t\t\\baspect:%.2f,\n>48\tledouble\tx\t\t\\bfps:%.2f\n\n#\t\t\t\t\t\tMPEG file\n# MPEG sequences\n# FIXME: This section is from the old magic.mime file and needs integrating with the rest\n0       belong             0x000001BA\n>4      byte               &0x40\n!:mime\tvideo/mp2p\n>4      byte               ^0x40\n!:mime\tvideo/mpeg\n0       belong             0x000001BB\n!:mime\tvideo/mpeg\n0       belong             0x000001B0\n!:mime\tvideo/mp4v-es\n0       belong             0x000001B5\n!:mime\tvideo/mp4v-es\n0       belong             0x000001B3\n!:mime\tvideo/mpv\n0       belong&0xFF5FFF1F  0x47400010\n!:mime\tvideo/mp2t\n0       belong             0x00000001\n>4      byte&0x1F\t   0x07\n!:mime\tvideo/h264\n\n# Type: Bink Video\n# URL:  http://wiki.multimedia.cx/index.php?title=3DBink_Container\n# From: <hoehle@users.sourceforge.net>  2008-07-18\n0\tstring\t\tBIK\tBink Video\n>3\tregex\t\t=[a-z]\trev.%s\n#>4\tulelong\t\tx\tsize %d\n>20\tulelong\t\tx\t\\b, %d\n>24\tulelong\t\tx\t\\bx%d\n>8\tulelong\t\tx\t\\b, %d frames\n>32\tulelong\t\tx\tat rate %d/\n>28\tulelong\t\t>1\t\\b%d\n>40\tulelong\t\t=0\t\\b, no audio\n>40\tulelong\t\t!0\t\\b, %d audio track\n>>40\tulelong\t\t!1\t\\bs\n# follow properties of the first audio track only\n>>48\tuleshort\tx\t%dHz\n>>51\tbyte&0x20\t0\tmono\n>>51\tbyte&0x20\t!0\tstereo\n#>>51\tbyte&0x10\t0\tFFT\n#>>51\tbyte&0x10\t!0\tDCT\n\n#------------------------------------------------------------------------------\n# apl:  file(1) magic for APL (see also \"pdp\" and \"vax\" for other APL\n#       workspaces)\n#\n0\tlong\t\t0100554\t\tAPL workspace (Ken's original?)\n#------------------------------------------------------------------------------\n# apple:  file(1) magic for Apple file formats\n#\n0\tsearch/1\tFiLeStArTfIlEsTaRt\tbinscii (apple ][) text\n0\tstring\t\t\\x0aGL\t\t\tBinary II (apple ][) data\n0\tstring\t\t\\x76\\xff\t\tSqueezed (apple ][) data\n0\tstring\t\tNuFile\t\t\tNuFile archive (apple ][) data\n0\tstring\t\tN\\xf5F\\xe9l\\xe5\t\tNuFile archive (apple ][) data\n0\tbelong\t\t0x00051600\t\tAppleSingle encoded Macintosh file\n0\tbelong\t\t0x00051607\t\tAppleDouble encoded Macintosh file\n\n# Type: Apple Emulator 2IMG format\n# From: Radek Vokal <rvokal@redhat.com>\n0\tstring\t\t2IMG\tApple ][ 2IMG Disk Image\n>4\tstring\t\tXGS!\t\\b, XGS\n>4\tstring\t\tCTKG\t\\b, Catakig\n>4\tstring\t\tShIm\t\\b, Sheppy's ImageMaker\n>4\tstring\t\tWOOF\t\\b, Sweet 16\n>4\tstring\t\tB2TR\t\\b, Bernie ][ the Rescue\n>4\tstring\t\t!nfc\t\\b, ASIMOV2\n>4\tstring\t\tx\t\\b, Unknown Format\n>0xc\tbyte\t\t00\t\\b, DOS 3.3 sector order\n>>0x10\tbyte\t\t00\t\\b, Volume 254\n>>0x10\tbyte&0x7f\tx\t\\b, Volume %u\n>0xc\tbyte\t\t01\t\\b, ProDOS sector order\n>>0x14\tshort\t\tx\t\\b, %u Blocks\n>0xc\tbyte\t\t02\t\\b, NIB data\n\n# magic for Newton PDA package formats\n# from Ruda Moura <ruda@helllabs.org>\n0\tstring\tpackage0\tNewton package, NOS 1.x,\n>12\tbelong\t&0x80000000\tAutoRemove,\n>12\tbelong\t&0x40000000\tCopyProtect,\n>12\tbelong\t&0x10000000\tNoCompression,\n>12\tbelong\t&0x04000000\tRelocation,\n>12\tbelong\t&0x02000000\tUseFasterCompression,\n>16\tbelong\tx\t\tversion %d\n\n0\tstring\tpackage1\tNewton package, NOS 2.x,\n>12\tbelong\t&0x80000000\tAutoRemove,\n>12\tbelong\t&0x40000000\tCopyProtect,\n>12\tbelong\t&0x10000000\tNoCompression,\n>12\tbelong\t&0x04000000\tRelocation,\n>12\tbelong\t&0x02000000\tUseFasterCompression,\n>16\tbelong\tx\t\tversion %d\n\n0\tstring\tpackage4\tNewton package,\n>8\tbyte\t8\t\tNOS 1.x,\n>8\tbyte\t9\t\tNOS 2.x,\n>12\tbelong\t&0x80000000\tAutoRemove,\n>12\tbelong\t&0x40000000\tCopyProtect,\n>12\tbelong\t&0x10000000\tNoCompression,\n\n# The following entries for the Apple II are for files that have\n# been transferred as raw binary data from an Apple, without having\n# been encapsulated by any of the above archivers.\n#\n# In general, Apple II formats are hard to identify because Apple DOS\n# and especially Apple ProDOS have strong typing in the file system and\n# therefore programmers never felt much need to include type information\n# in the files themselves.\n#\n# Eric Fischer <enf@pobox.com>\n\n# AppleWorks word processor:\n#\n# This matches the standard tab stops for an AppleWorks file, but if\n# a file has a tab stop set in the first four columns this will fail.\n#\n# The \"O\" is really the magic number, but that's so common that it's\n# necessary to check the tab stops that follow it to avoid false positives.\n\n4       string          O====   AppleWorks word processor data\n>85     byte&0x01       >0      \\b, zoomed\n>90     byte&0x01       >0      \\b, paginated\n>92     byte&0x01       >0      \\b, with mail merge\n#>91    byte            x       \\b, left margin %d\n\n# AppleWorks database:\n#\n# This isn't really a magic number, but it's the closest thing to one\n# that I could find.  The 1 and 2 really mean \"order in which you defined\n# categories\" and \"left to right, top to bottom,\" respectively; the D and R\n# mean that the cursor should move either down or right when you press Return.\n\n#30\tstring\t\t\\x01D\tAppleWorks database data\n#30\tstring\t\t\\x02D\tAppleWorks database data\n#30\tstring\t\t\\x01R\tAppleWorks database data\n#30\tstring\t\t\\x02R\tAppleWorks database data\n\n# AppleWorks spreadsheet:\n#\n# Likewise, this isn't really meant as a magic number.  The R or C means\n# row- or column-order recalculation; the A or M means automatic or manual\n# recalculation.\n\n#131\tstring\t\tRA\tAppleWorks spreadsheet data\n#131\tstring\t\tRM\tAppleWorks spreadsheet data\n#131\tstring\t\tCA\tAppleWorks spreadsheet data\n#131\tstring\t\tCM\tAppleWorks spreadsheet data\n\n# Applesoft BASIC:\n#\n# This is incredibly sloppy, but will be true if the program was\n# written at its usual memory location of 2048 and its first line\n# number is less than 256.  Yuck.\n\n0       belong&0xff00ff 0x80000 Applesoft BASIC program data\n#>2     leshort         x       \\b, first line number %d\n\n# ORCA/EZ assembler:\n# \n# This will not identify ORCA/M source files, since those have\n# some sort of date code instead of the two zero bytes at 6 and 7\n# XXX Conflicts with ELF\n#4       belong&0xff00ffff       0x01000000      ORCA/EZ assembler source data\n#>5      byte                    x               \\b, build number %d\n\n# Broderbund Fantavision\n#\n# I don't know what these values really mean, but they seem to recur.\n# Will they cause too many conflicts?\n\n# Probably :-)\n#2\tbelong&0xFF00FF\t\t0x040008\tFantavision movie data\n\n# Some attempts at images.\n#\n# These are actually just bit-for-bit dumps of the frame buffer, so\n# there's really no reasonably way to distinguish them except for their\n# address (if preserved) -- 8192 or 16384 -- and their length -- 8192\n# or, occasionally, 8184.\n#\n# Nevertheless this will manage to catch a lot of images that happen\n# to have a solid-colored line at the bottom of the screen.\n\n# GRR: Magic too weak\n#8144\tstring\t\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\tApple II image with white background\n#8144\tstring\t\\x55\\x2A\\x55\\x2A\\x55\\x2A\\x55\\x2A\tApple II image with purple background\n#8144\tstring\t\\x2A\\x55\\x2A\\x55\\x2A\\x55\\x2A\\x55\tApple II image with green background\n#8144\tstring\t\\xD5\\xAA\\xD5\\xAA\\xD5\\xAA\\xD5\\xAA\tApple II image with blue background\n#8144\tstring\t\\xAA\\xD5\\xAA\\xD5\\xAA\\xD5\\xAA\\xD5\tApple II image with orange background\n\n# Beagle Bros. Apple Mechanic fonts\n\n0\tbelong&0xFF00FFFF\t0x6400D000\tApple Mechanic font\n\n# Apple Universal Disk Image Format (UDIF) - dmg files.\n# From Johan Gade.\n# These entries are disabled for now until we fix the following issues.\n#\n# Note there might be some problems with the \"VAX COFF executable\" \n# entry. Note this entry should be placed before the mac filesystem section, \n# particularly the \"Apple Partition data\" entry.\n#\n# The intended meaning of these tests is, that the file is only of the \n# specified type if both of the lines are correct - i.e. if the first\n# line matches and the second doesn't then it is not of that type.\n#\n#0\tlong\t0x7801730d\n#>4\tlong\t0x62626060\tUDIF read-only zlib-compressed image (UDZO)\n#\n# Note that this entry is recognized correctly by the \"Apple Partition \n# data\" entry - however since this entry is more specific - this\n# information seems to be more useful.\n#0\tlong\t0x45520200\n#>0x410\tstring\tdisk\\ image\tUDIF read/write image (UDRW)\n\n# From: Toby Peterson <toby@apple.com>\n0\tstring\tbplist00\tApple binary property list\n\n# Apple binary property list (bplist)\n#  Assumes version bytes are hex.\n#  Provides content hints for version 0 files. Assumes that the root\n#  object is the first object (true for CoreFoundation implementation).\n# From: David Remahl <dremahl@apple.com>\n0\t\tstring\tbplist\n>6\t\tbyte\tx\t\\bCoreFoundation binary property list data, version 0x%c\n>>7\t\tbyte\tx\t\\b%c\n>6\t\tstring\t\t00\t\t\\b\n>>8\t\tbyte&0xF0\t0x00\t\\b\n>>>8\tbyte&0x0F\t0x00\t\\b, root type: null\n>>>8\tbyte&0x0F\t0x08\t\\b, root type: false boolean\n>>>8\tbyte&0x0F\t0x09\t\\b, root type: true boolean\n>>8\t\tbyte&0xF0\t0x10\t\\b, root type: integer\n>>8\t\tbyte&0xF0\t0x20\t\\b, root type: real\n>>8\t\tbyte&0xF0\t0x30\t\\b, root type: date\n>>8\t\tbyte&0xF0\t0x40    \\b, root type: data\n>>8\t\tbyte&0xF0\t0x50\t\\b, root type: ascii string\n>>8\t\tbyte&0xF0\t0x60\t\\b, root type: unicode string\n>>8\t\tbyte&0xF0\t0x80\t\\b, root type: uid (CORRUPT)\n>>8\t\tbyte&0xF0\t0xa0\t\\b, root type: array\n>>8\t\tbyte&0xF0\t0xd0\t\\b, root type: dictionary\n\n# Apple/NeXT typedstream data\n#  Serialization format used by NeXT and Apple for various\n#  purposes in YellowStep/Cocoa, including some nib files.\n# From: David Remahl <dremahl@apple.com>\n2\t\tstring\t\ttypedstream\tNeXT/Apple typedstream data, big endian\n>0\t\tbyte\t\tx\t\t\\b, version %hhd\n>0\t\tbyte\t\t<5\t\t\\b\n>>13\tbyte\t\t0x81\t\\b\n>>>14\tubeshort\tx\t\t\\b, system %hd\n2\t\tstring\t\tstreamtyped NeXT/Apple typedstream data, little endian\n>0\t\tbyte\t\tx\t\t\\b, version %hhd\n>0\t\tbyte\t\t<5\t\t\\b\n>>13\tbyte\t\t0x81\t\\b\n>>>14\tuleshort\tx\t\t\\b, system %hd\n\n#------------------------------------------------------------------------------\n# CAF: Apple CoreAudio File Format\n#\n# Container format for high-end audio purposes.\n# From: David Remahl <dremahl@apple.com>\n#\n0\tstring\t\tcaff\t\tCoreAudio Format audio file\n>4\tbeshort\t\t<10\t\tversion %d\n>6\tbeshort\t\tx\n\n\n#------------------------------------------------------------------------------\n# Keychain database files\n0\tstring\t\tkych\t\tMac OS X Keychain File\n\n#------------------------------------------------------------------------------\n# Code Signing related file types\n0\tbelong\t\t0xfade0c00\tMac OS X Code Requirement\n>8\tbelong\t\t1\t\t\t(opExpr)\n>4\tbelong\t\tx\t\t\t- %d bytes\n\n0\tbelong\t\t0xfade0c01\tMac OS X Code Requirement Set\n>8\tbelong\t\t>1\t\t\tcontaining %d items\n>4\tbelong\t\tx\t\t\t- %d bytes\n\n0\tbelong\t\t0xfade0c02\tMac OS X Code Directory\n>8\tbelong\t\tx\t\t\tversion %x\n>12\tbelong\t\t>0\t\t\tflags 0x%x\n>4\tbelong\t\tx\t\t\t- %d bytes\n\n0\tbelong\t\t0xfade0cc0\tMac OS X Detached Code Signature (non-executable)\n>4\tbelong\t\tx\t\t\t- %d bytes\n\n0\tbelong\t\t0xfade0cc1\tMac OS X Detached Code Signature\n>8\tbelong\t\t>1\t\t\t(%d elements)\n>4\tbelong\t\tx\t\t\t- %d bytes\n\n# From: \"Nelson A. de Oliveira\" <naoliv@gmail.com>\n# .vdi\n4\tstring innotek\\ VirtualBox\\ Disk\\ Image %s\n\n#------------------------------------------------------------------------------\n# applix:  file(1) magic for Applixware\n# From: Peter Soos <sp@osb.hu>\n#\n0\tstring\t\t*BEGIN\t\tApplixware\n>7\tstring\t\tWORDS\t\t\tWords Document\n>7\tstring\t\tGRAPHICS\t\tGraphic\n>7\tstring\t\tRASTER\t\t\tBitmap\n>7\tstring\t\tSPREADSHEETS\t\tSpreadsheet\n>7\tstring\t\tMACRO\t\t\tMacro\n>7\tstring\t\tBUILDER\t\t\tBuilder Object\n#------------------------------------------------------------------------------\n# archive:  file(1) magic for archive formats (see also \"msdos\" for self-\n#           extracting compressed archives)\n#\n# cpio, ar, arc, arj, hpack, lha/lharc, rar, squish, uc2, zip, zoo, etc.\n# pre-POSIX \"tar\" archives are handled in the C code.\n\n# POSIX tar archives\n257\tstring\t\tustar\\0\t\tPOSIX tar archive\n!:mime\tapplication/x-tar # encoding: posix\n257\tstring\t\tustar\\040\\040\\0\tGNU tar archive\n!:mime\tapplication/x-tar # encoding: gnu\n\n# cpio archives\n#\n# Yes, the top two \"cpio archive\" formats *are* supposed to just be \"short\".\n# The idea is to indicate archives produced on machines with the same\n# byte order as the machine running \"file\" with \"cpio archive\", and\n# to indicate archives produced on machines with the opposite byte order\n# from the machine running \"file\" with \"byte-swapped cpio archive\".\n#\n# The SVR4 \"cpio(4)\" hints that there are additional formats, but they\n# are defined as \"short\"s; I think all the new formats are\n# character-header formats and thus are strings, not numbers.\n0\tshort\t\t070707\t\tcpio archive\n!:mime\tapplication/x-cpio\n0\tshort\t\t0143561\t\tbyte-swapped cpio archive\n!:mime\tapplication/x-cpio # encoding: swapped\n0\tstring\t\t070707\t\tASCII cpio archive (pre-SVR4 or odc)\n0\tstring\t\t070701\t\tASCII cpio archive (SVR4 with no CRC)\n0\tstring\t\t070702\t\tASCII cpio archive (SVR4 with CRC)\n\n# Debian package (needs to go before regular portable archives)\n#\n0\tstring\t\t=!<arch>\\ndebian\n!:mime\tapplication/x-debian-package\n>8\tstring\t\tdebian-split\tpart of multipart Debian package\n>8\tstring\t\tdebian-binary\tDebian binary package\n>8\tstring\t\t!debian\n>68\tstring\t\t>\\0\t\t(format %s)\n# These next two lines do not work, because a bzip2 Debian archive\n# still uses gzip for the control.tar (first in the archive).  Only\n# data.tar varies, and the location of its filename varies too.\n# file/libmagic does not current have support for ascii-string based\n# (offsets) as of 2005-09-15.\n#>81\tstring\t\tbz2\t\t\\b, uses bzip2 compression\n#>84\tstring\t\tgz\t\t\\b, uses gzip compression\n#>136\tledate\t\tx\t\tcreated: %s\n\n# other archives\n0\tlong\t\t0177555\t\tvery old archive\n0\tshort\t\t0177555\t\tvery old PDP-11 archive\n0\tlong\t\t0177545\t\told archive\n0\tshort\t\t0177545\t\told PDP-11 archive\n0\tlong\t\t0100554\t\tapl workspace\n0\tstring\t\t=<ar>\t\tarchive\n!:mime\tapplication/x-archive\n\n# MIPS archive (needs to go before regular portable archives)\n#\n0\tstring\t=!<arch>\\n__________E\tMIPS archive\n>20\tstring\tU\t\t\twith MIPS Ucode members\n>21\tstring\tL\t\t\twith MIPSEL members\n>21\tstring\tB\t\t\twith MIPSEB members\n>19\tstring\tL\t\t\tand an EL hash table\n>19\tstring\tB\t\t\tand an EB hash table\n>22\tstring\tX\t\t\t-- out of date\n\n0\tsearch/1\t-h-\t\tSoftware Tools format archive text\n\n#\n# XXX - why are there multiple <ar> thingies?  Note that 0x213c6172 is\n# \"!<ar\", so, for new-style (4.xBSD/SVR2andup) archives, we have:\n#\n# 0\tstring\t\t=!<arch>\t\tcurrent ar archive\n# 0\tlong\t\t0x213c6172\tarchive file\n#\n# and for SVR1 archives, we have:\n#\n# 0\tstring\t\t\\<ar>\t\tSystem V Release 1 ar archive\n# 0\tstring\t\t=<ar>\t\tarchive\n#\n# XXX - did Aegis really store shared libraries, breakpointed modules,\n# and absolute code program modules in the same format as new-style\n# \"ar\" archives?\n#\n0\tstring\t\t=!<arch>\t\tcurrent ar archive\n!:mime\tapplication/x-archive\n>8\tstring\t\t__.SYMDEF\trandom library\n>0\tbelong\t\t=65538\t\t- pre SR9.5\n>0\tbelong\t\t=65539\t\t- post SR9.5\n>0\tbeshort\t\t2\t\t- object archive\n>0\tbeshort\t\t3\t\t- shared library module\n>0\tbeshort\t\t4\t\t- debug break-pointed module\n>0\tbeshort\t\t5\t\t- absolute code program module\n0\tstring\t\t\\<ar>\t\tSystem V Release 1 ar archive\n0\tstring\t\t=<ar>\t\tarchive\n#\n# XXX - from \"vax\", which appears to collect a bunch of byte-swapped\n# thingies, to help you recognize VAX files on big-endian machines;\n# with \"leshort\", \"lelong\", and \"string\", that's no longer necessary....\n#\n0\tbelong\t\t0x65ff0000\tVAX 3.0 archive\n0\tbelong\t\t0x3c61723e\tVAX 5.0 archive\n#\n0\tlong\t\t0x213c6172\tarchive file\n0\tlelong\t\t0177555\t\tvery old VAX archive\n0\tleshort\t\t0177555\t\tvery old PDP-11 archive\n#\n# XXX - \"pdp\" claims that 0177545 can have an __.SYMDEF member and thus\n# be a random library (it said 0xff65 rather than 0177545).\n#\n0\tlelong\t\t0177545\t\told VAX archive\n>8\tstring\t\t__.SYMDEF\trandom library\n0\tleshort\t\t0177545\t\told PDP-11 archive\n>8\tstring\t\t__.SYMDEF\trandom library\n#\n# From \"pdp\" (but why a 4-byte quantity?)\n#\n0\tlelong\t\t0x39bed\t\tPDP-11 old archive\n0\tlelong\t\t0x39bee\t\tPDP-11 4.0 archive\n\n# ARC archiver, from Daniel Quinlan (quinlan@yggdrasil.com)\n#\n# The first byte is the magic (0x1a), byte 2 is the compression type for\n# the first file (0x01 through 0x09), and bytes 3 to 15 are the MS-DOS\n# filename of the first file (null terminated).  Since some types collide\n# we only test some types on basis of frequency: 0x08 (83%), 0x09 (5%),\n# 0x02 (5%), 0x03 (3%), 0x04 (2%), 0x06 (2%).  0x01 collides with terminfo.\n0\tlelong&0x8080ffff\t0x0000081a\tARC archive data, dynamic LZW\n!:mime\tapplication/x-arc\n0\tlelong&0x8080ffff\t0x0000091a\tARC archive data, squashed\n!:mime\tapplication/x-arc\n0\tlelong&0x8080ffff\t0x0000021a\tARC archive data, uncompressed\n!:mime\tapplication/x-arc\n0\tlelong&0x8080ffff\t0x0000031a\tARC archive data, packed\n!:mime\tapplication/x-arc\n0\tlelong&0x8080ffff\t0x0000041a\tARC archive data, squeezed\n!:mime\tapplication/x-arc\n0\tlelong&0x8080ffff\t0x0000061a\tARC archive data, crunched\n!:mime\tapplication/x-arc\n# [JW] stuff taken from idarc, obviously ARC successors:\n0\tlelong&0x8080ffff\t0x00000a1a\tPAK archive data\n!:mime\tapplication/x-arc\n0\tlelong&0x8080ffff\t0x0000141a\tARC+ archive data\n!:mime\tapplication/x-arc\n0\tlelong&0x8080ffff\t0x0000481a\tHYP archive data\n!:mime\tapplication/x-arc\n\n# Acorn archive formats (Disaster prone simpleton, m91dps@ecs.ox.ac.uk)\n# I can't create either SPARK or ArcFS archives so I have not tested this stuff\n# [GRR:  the original entries collide with ARC, above; replaced with combined\n#  version (not tested)]\n#0\tbyte\t\t0x1a\t\tRISC OS archive (spark format)\n0\tstring\t\t\\032archive\tRISC OS archive (ArcFS format)\n0       string          Archive\\000     RISC OS archive (ArcFS format)\n\n# All these were taken from idarc, many could not be verified. Unfortunately,\n# there were many low-quality sigs, i.e. easy to trigger false positives.\n# Please notify me of any real-world fishy/ambiguous signatures and I'll try\n# to get my hands on the actual archiver and see if I find something better. [JW]\n# probably many can be enhanced by finding some 0-byte or control char near the start\n\n# idarc calls this Crush/Uncompressed... *shrug*\n0\tstring\tCRUSH Crush archive data\n# Squeeze It (.sqz)\n0\tstring\tHLSQZ Squeeze It archive data\n# SQWEZ\n0\tstring\tSQWEZ SQWEZ archive data\n# HPack (.hpk)\n0\tstring\tHPAK HPack archive data\n# HAP\n0\tstring\t\\x91\\x33HF HAP archive data\n# MD/MDCD\n0\tstring\tMDmd MDCD archive data\n# LIM\n0\tstring\tLIM\\x1a LIM archive data\n# SAR\n3\tstring\tLH5 SAR archive data\n# BSArc/BS2\n0\tstring\t\\212\\3SB \\0 BSArc/BS2 archive data\n# MAR\n2\tstring\t=-ah MAR archive data\n# ACB\n0\tbelong&0x00f800ff\t0x00800000 ACB archive data\n# CPZ\n# TODO, this is what idarc says: 0\tstring\t\\0\\0\\0 CPZ archive data\n# JRC\n0\tstring\tJRchive JRC archive data\n# Quantum\n0\tstring\tDS\\0 Quantum archive data\n# ReSOF\n0\tstring\tPK\\3\\6 ReSOF archive data\n# QuArk\n0\tstring\t7\\4 QuArk archive data\n# YAC\n14\tstring\tYC YAC archive data\n# X1\n0\tstring\tX1 X1 archive data\n0\tstring\tXhDr X1 archive data\n# CDC Codec (.dqt)\n0\tbelong&0xffffe000\t0x76ff2000 CDC Codec archive data\n# AMGC\n0\tstring\t\\xad6\" AMGC archive data\n# NuLIB\n0\tstring\tNõFélå NuLIB archive data\n# PakLeo\n0\tstring\tLEOLZW PAKLeo archive data\n# ChArc\n0\tstring\tSChF ChArc archive data\n# PSA\n0\tstring\tPSA PSA archive data\n# CrossePAC\n0\tstring\tDSIGDCC CrossePAC archive data\n# Freeze\n0\tstring\t\\x1f\\x9f\\x4a\\x10\\x0a Freeze archive data\n# KBoom\n0\tstring\t¨MP¨ KBoom archive data\n# NSQ, must go after CDC Codec\n0\tstring\t\\x76\\xff NSQ archive data\n# DPA\n0\tstring\tDirk\\ Paehl DPA archive data\n# BA\n# TODO: idarc says \"bytes 0-2 == bytes 3-5\"\n# TTComp\n0\tstring\t\\0\\6 TTComp archive data\n# ESP, could this conflict with Easy Software Products' (e.g.ESP ghostscript) documentation?\n0\tstring\tESP ESP archive data\n# ZPack\n0\tstring\t\\1ZPK\\1 ZPack archive data\n# Sky\n0\tstring\t\\xbc\\x40 Sky archive data\n# UFA\n0\tstring\tUFA UFA archive data\n# Dry\n0\tstring\t=-H2O DRY archive data\n# FoxSQZ\n0\tstring\tFOXSQZ FoxSQZ archive data\n# AR7\n0\tstring\t,AR7 AR7 archive data\n# PPMZ\n0\tstring\tPPMZ PPMZ archive data\n# MS Compress\n4\tstring\t\\x88\\xf0\\x27 MS Compress archive data\n# updated by Joerg Jenderek\n>9\tstring\t\\0\t\t\n>>0\tstring\tKWAJ\t\t\n>>>7\tstring\t\\321\\003\tMS Compress archive data\n>>>>14\tulong\t>0\t\t\\b, original size: %ld bytes\n>>>>18\t\tubyte\t>0x65  \t\n>>>>>18\t\tstring\tx    \t\\b, was %.8s\n>>>>>(10.b-4)\tstring\tx    \t\\b.%.3s\n# MP3 (archiver, not lossy audio compression)\n0\tstring\tMP3\\x1a MP3-Archiver archive data\n# ZET\n0\tstring\tOZÝ ZET archive data\n# TSComp\n0\tstring\t\\x65\\x5d\\x13\\x8c\\x08\\x01\\x03\\x00 TSComp archive data\n# ARQ\n0\tstring\tgW\\4\\1 ARQ archive data\n# Squash\n3\tstring\tOctSqu Squash archive data\n# Terse\n0\tstring\t\\5\\1\\1\\0 Terse archive data\n# PUCrunch\n0\tstring\t\\x01\\x08\\x0b\\x08\\xef\\x00\\x9e\\x32\\x30\\x36\\x31 PUCrunch archive data\n# UHarc\n0\tstring\tUHA UHarc archive data\n# ABComp\n0\tstring\t\\2AB ABComp archive data\n0\tstring\t\\3AB2 ABComp archive data\n# CMP\n0\tstring\tCO\\0 CMP archive data\n# Splint\n0\tstring\t\\x93\\xb9\\x06 Splint archive data\n# InstallShield\n0\tstring\t \\x13\\x5d\\x65\\x8c InstallShield Z archive Data\n# Gather\n1\tstring\tGTH Gather archive data\n# BOA\n0\tstring\tBOA BOA archive data\n# RAX\n0\tstring\tULEB\\xa RAX archive data\n# Xtreme\n0\tstring\tULEB\\0 Xtreme archive data\n# Pack Magic\n0\tstring\t@â\\1\\0 Pack Magic archive data\n# BTS\n0\tbelong&0xfeffffff\t0x1a034465 BTS archive data\n# ELI 5750\n0\tstring\tOra\\  ELI 5750 archive data\n# QFC\n0\tstring\t\\x1aFC\\x1a QFC archive data\n0\tstring\t\\x1aQF\\x1a QFC archive data\n# PRO-PACK\n0\tstring\tRNC PRO-PACK archive data\n# 777\n0\tstring\t777 777 archive data\n# LZS221\n0\tstring\tsTaC LZS221 archive data\n# HPA\n0\tstring\tHPA HPA archive data\n# Arhangel\n0\tstring\tLG Arhangel archive data\n# EXP1, uses bzip2\n0\tstring\t0123456789012345BZh EXP1 archive data\n# IMP\n0\tstring\tIMP\\xa IMP archive data\n# NRV\n0\tstring\t\\x00\\x9E\\x6E\\x72\\x76\\xFF NRV archive data\n# Squish\n0\tstring\t\\x73\\xb2\\x90\\xf4 Squish archive data\n# Par\n0\tstring\tPHILIPP Par archive data\n0\tstring\tPAR Par archive data\n# HIT\n0\tstring\tUB HIT archive data\n# SBX\n0\tbelong&0xfffff000\t0x53423000 SBX archive data\n# NaShrink\n0\tstring\tNSK NaShrink archive data\n# SAPCAR\n0\tstring\t#\\ CAR\\ archive\\ header SAPCAR archive data\n0\tstring\tCAR\\ 2.00RG SAPCAR archive data\n# Disintegrator\n0\tstring\tDST Disintegrator archive data\n# ASD\n0\tstring\tASD ASD archive data\n# InstallShield CAB\n0\tstring\tISc( InstallShield CAB\n# TOP4\n0\tstring\tT4\\x1a TOP4 archive data\n# BatComp left out: sig looks like COM executable\n# so TODO: get real 4dos batcomp file and find sig\n# BlakHole\n0\tstring\tBH\\5\\7 BlakHole archive data\n# BIX\n0\tstring\tBIX0 BIX archive data\n# ChiefLZA\n0\tstring\tChfLZ ChiefLZA archive data\n# Blink\n0\tstring\tBlink Blink archive data\n# Logitech Compress\n0\tstring\t\\xda\\xfa Logitech Compress archive data\n# ARS-Sfx (FIXME: really a SFX? then goto COM/EXE)\n1\tstring\t(C)\\ STEPANYUK ARS-Sfx archive data\n# AKT/AKT32\n0\tstring\tAKT32 AKT32 archive data\n0\tstring\tAKT AKT archive data\n# NPack\n0\tstring\tMSTSM NPack archive data\n# PFT\n0\tstring\t\\0\\x50\\0\\x14 PFT archive data\n# SemOne\n0\tstring\tSEM SemOne archive data\n# PPMD\n0\tstring\t\\x8f\\xaf\\xac\\x84 PPMD archive data\n# FIZ\n0\tstring\tFIZ FIZ archive data\n# MSXiE\n0\tbelong&0xfffff0f0\t0x4d530000 MSXiE archive data\n# DeepFreezer\n0\tbelong&0xfffffff0\t0x797a3030 DeepFreezer archive data\n# DC\n0\tstring\t=<DC- DC archive data\n# TPac\n0\tstring\t\\4TPAC\\3 TPac archive data\n# Ai\n0\tstring\tAi\\1\\1\\0 Ai archive data\n0\tstring\tAi\\1\\0\\0 Ai archive data\n# Ai32\n0\tstring\tAi\\2\\0 Ai32 archive data\n0\tstring\tAi\\2\\1 Ai32 archive data\n# SBC\n0\tstring\tSBC SBC archive data\n# Ybs\n0\tstring\tYBS Ybs archive data\n# DitPack\n0\tstring\t\\x9e\\0\\0 DitPack archive data\n# DMS\n0\tstring\tDMS! DMS archive data\n# EPC\n0\tstring\t\\x8f\\xaf\\xac\\x8c EPC archive data\n# VSARC\n0\tstring\tVS\\x1a VSARC archive data\n# PDZ\n0\tstring\tPDZ PDZ archive data\n# ReDuq\n0\tstring\trdqx ReDuq archive data\n# GCA\n0\tstring\tGCAX GCA archive data\n# PPMN\n0\tstring\tpN PPMN archive data\n# WinImage\n3\tstring\tWINIMAGE WinImage archive data\n# Compressia\n0\tstring\tCMP0CMP Compressia archive data\n# UHBC\n0\tstring\tUHB UHBC archive data\n# WinHKI\n0\tstring\t\\x61\\x5C\\x04\\x05 WinHKI archive data\n# WWPack data file\n0\tstring\tWWP WWPack archive data\n# BSN (BSA, PTS-DOS)\n0\tstring\t\\xffBSG BSN archive data\n1\tstring\t\\xffBSG BSN archive data\n3\tstring\t\\xffBSG BSN archive data\n1\tstring\t\\0\\xae\\2 BSN archive data\n1\tstring\t\\0\\xae\\3 BSN archive data\n1\tstring\t\\0\\xae\\7 BSN archive data\n# AIN\n0\tstring\t\\x33\\x18 AIN archive data\n0\tstring\t\\x33\\x17 AIN archive data\n# XPA32\n0\tstring\txpa\\0\\1 XPA32 archive data\n# SZip (TODO: doesn't catch all versions)\n0\tstring\tSZ\\x0a\\4 SZip archive data\n# XPack DiskImage\n0\tstring\tjm XPack DiskImage archive data\n# XPack Data\n0\tstring\txpa XPack archive data\n# XPack Single Data\n0\tstring\tÍ\\ jm XPack single archive data\n\n# TODO: missing due to unknown magic/magic at end of file:\n#DWC\n#ARG\n#ZAR\n#PC/3270\n#InstallIt\n#RKive\n#RK\n#XPack Diskimage\n\n# These were inspired by idarc, but actually verified\n# Dzip archiver (.dz)\n0\tstring\tDZ Dzip archive data\n>2\tbyte\tx \\b, version %i\n>3\tbyte\tx \\b.%i\n# ZZip archiver (.zz)\n0\tstring\tZZ\\ \\0\\0 ZZip archive data\n0\tstring\tZZ0 ZZip archive data\n# PAQ archiver (.paq)\n0\tstring\t\\xaa\\x40\\x5f\\x77\\x1f\\xe5\\x82\\x0d PAQ archive data\n0\tstring\tPAQ PAQ archive data\n>3\tbyte&0xf0\t0x30\n>>3\tbyte\tx (v%c)\n# JAR archiver (.j), this is the successor to ARJ, not Java's JAR (which is essentially ZIP)\n0xe\tstring\t\\x1aJar\\x1b JAR (ARJ Software, Inc.) archive data\n0\tstring\tJARCS JAR (ARJ Software, Inc.) archive data\n\n# ARJ archiver (jason@jarthur.Claremont.EDU)\n0\tleshort\t\t0xea60\t\tARJ archive data\n!:mime\tapplication/x-arj\n>5\tbyte\t\tx\t\t\\b, v%d,\n>8\tbyte\t\t&0x04\t\tmulti-volume,\n>8\tbyte\t\t&0x10\t\tslash-switched,\n>8\tbyte\t\t&0x20\t\tbackup,\n>34\tstring\t\tx\t\toriginal name: %s,\n>7\tbyte\t\t0\t\tos: MS-DOS\n>7\tbyte\t\t1\t\tos: PRIMOS\n>7\tbyte\t\t2\t\tos: Unix\n>7\tbyte\t\t3\t\tos: Amiga\n>7\tbyte\t\t4\t\tos: Macintosh\n>7\tbyte\t\t5\t\tos: OS/2\n>7\tbyte\t\t6\t\tos: Apple ][ GS\n>7\tbyte\t\t7\t\tos: Atari ST\n>7\tbyte\t\t8\t\tos: NeXT\n>7\tbyte\t\t9\t\tos: VAX/VMS\n>3\tbyte\t\t>0\t\t%d]\n# [JW] idarc says this is also possible\n2\tleshort\t\t0xea60\t\tARJ archive data\n\n# HA archiver (Greg Roelofs, newt@uchicago.edu)\n# This is a really bad format. A file containing HAWAII will match this...\n#0\tstring\t\tHA\t\tHA archive data,\n#>2\tleshort\t\t=1\t\t1 file,\n#>2\tleshort\t\t>1\t\t%u files,\n#>4\tbyte&0x0f\t=0\t\tfirst is type CPY\n#>4\tbyte&0x0f\t=1\t\tfirst is type ASC\n#>4\tbyte&0x0f\t=2\t\tfirst is type HSC\n#>4\tbyte&0x0f\t=0x0e\t\tfirst is type DIR\n#>4\tbyte&0x0f\t=0x0f\t\tfirst is type SPECIAL\n# suggestion: at least identify small archives (<1024 files)\n0  belong&0xffff00fc 0x48410000 HA archive data\n>2\tleshort\t\t=1\t\t1 file,\n>2\tleshort\t\t>1\t\t%u files,\n>4\tbyte&0x0f\t=0\t\tfirst is type CPY\n>4\tbyte&0x0f\t=1\t\tfirst is type ASC\n>4\tbyte&0x0f\t=2\t\tfirst is type HSC\n>4\tbyte&0x0f\t=0x0e\t\tfirst is type DIR\n>4\tbyte&0x0f\t=0x0f\t\tfirst is type SPECIAL\n\n# HPACK archiver (Peter Gutmann, pgut1@cs.aukuni.ac.nz)\n0\tstring\t\tHPAK\t\tHPACK archive data\n\n# JAM Archive volume format, by Dmitry.Kohmanyuk@UA.net\n0\tstring\t\t\\351,\\001JAM\\ \t\tJAM archive,\n>7\tstring\t\t>\\0\t\t\tversion %.4s\n>0x26\tbyte\t\t=0x27\t\t\t-\n>>0x2b\tstring          >\\0\t\t\tlabel %.11s,\n>>0x27\tlelong\t\tx\t\t\tserial %08x,\n>>0x36\tstring\t\t>\\0\t\t\tfstype %.8s\n\n# LHARC/LHA archiver (Greg Roelofs, newt@uchicago.edu)\n2\tstring\t\t-lh0-\t\tLHarc 1.x/ARX archive data [lh0]\n!:mime\tapplication/x-lharc\n2\tstring\t\t-lh1-\t\tLHarc 1.x/ARX archive data [lh1]\n!:mime\tapplication/x-lharc\n2\tstring\t\t-lz4-\t\tLHarc 1.x archive data [lz4]\n!:mime\tapplication/x-lharc\n2\tstring\t\t-lz5-\t\tLHarc 1.x archive data [lz5]\n!:mime\tapplication/x-lharc\n#\t[never seen any but the last; -lh4- reported in comp.compression:]\n2\tstring\t\t-lzs-\t\tLHa/LZS archive data [lzs]\n!:mime\tapplication/x-lha\n2\tstring\t\t-lh\\40-\t\tLHa 2.x? archive data [lh ]\n!:mime\tapplication/x-lha\n2\tstring\t\t-lhd-\t\tLHa 2.x? archive data [lhd]\n!:mime\tapplication/x-lha\n2\tstring\t\t-lh2-\t\tLHa 2.x? archive data [lh2]\n!:mime\tapplication/x-lha\n2\tstring\t\t-lh3-\t\tLHa 2.x? archive data [lh3]\n!:mime\tapplication/x-lha\n2\tstring\t\t-lh4-\t\tLHa (2.x) archive data [lh4]\n!:mime\tapplication/x-lha\n2\tstring\t\t-lh5-\t\tLHa (2.x) archive data [lh5]\n!:mime\tapplication/x-lha\n2\tstring\t\t-lh6-\t\tLHa (2.x) archive data [lh6]\n!:mime\tapplication/x-lha\n2\tstring\t\t-lh7-\t\tLHa (2.x)/LHark archive data [lh7]\n!:mime\tapplication/x-lha\n>20\tbyte\t\tx\t\t- header level %d\n# taken from idarc [JW]\n2   string      -lZ         PUT archive data\n2   string      -lz         LZS archive data \n2   string      -sw1-       Swag archive data\n\n# RAR archiver (Greg Roelofs, newt@uchicago.edu)\n0\tstring\t\tRar!\t\tRAR archive data,\n!:mime\tapplication/x-rar\n>44\tbyte\t\tx\t\tv%0x,\n>10\tbyte\t\t>0\t\tflags:\n>>10\tbyte\t\t&0x01\t\tArchive volume,\n>>10\tbyte\t\t&0x02\t\tCommented,\n>>10\tbyte\t\t&0x04\t\tLocked,\n>>10\tbyte\t\t&0x08\t\tSolid,\n>>10\tbyte\t\t&0x20\t\tAuthenticated,\n>35\tbyte\t\t0\t\tos: MS-DOS\n>35\tbyte\t\t1\t\tos: OS/2\n>35\tbyte\t\t2\t\tos: Win32\n>35\tbyte\t\t3\t\tos: Unix\n# some old version? idarc says:\n0   string      RE\\x7e\\x5e  RAR archive data\n\n# SQUISH archiver (Greg Roelofs, newt@uchicago.edu)\n0\tstring\t\tSQSH\t\tsquished archive data (Acorn RISCOS)\n\n# UC2 archiver (Greg Roelofs, newt@uchicago.edu)\n# [JW] see exe section for self-extracting version\n0\tstring\t\tUC2\\x1a\t\tUC2 archive data\n\n# ZIP archives (Greg Roelofs, c/o zip-bugs@wkuvx1.wku.edu)\n0\tstring\t\tPK\\003\\004\n>4\tbyte\t\t0x00\t\tZip archive data\n!:mime\tapplication/zip\n>4\tbyte\t\t0x09\t\tZip archive data, at least v0.9 to extract\n!:mime\tapplication/zip\n>4\tbyte\t\t0x0a\t\tZip archive data, at least v1.0 to extract\n!:mime\tapplication/zip\n>4\tbyte\t\t0x0b\t\tZip archive data, at least v1.1 to extract\n!:mime\tapplication/zip\n>0x161\tstring\t\tWINZIP          Zip archive data, WinZIP self-extracting\n!:mime\tapplication/zip\n>4\tbyte\t\t0x14\n>>30\tubelong\t\t!0x6d696d65\tZip archive data, at least v2.0 to extract\n!:mime\tapplication/zip\n\n# OpenOffice.org / KOffice / StarOffice documents\n# Listed here because they ARE zip files\n#\n# From: Abel Cheung <abel@oaka.org>\n>4\tbyte\t\t0x14\n>>30\tstring\t\tmimetype\n\n# KOffice (1.2 or above) formats\n>>>50\tstring\tvnd.kde.\t\tKOffice (>=1.2)\n>>>>58\tstring\tkarbon\t\t\tKarbon document\n>>>>58\tstring\tkchart\t\t\tKChart document\n>>>>58\tstring\tkformula\t\tKFormula document\n>>>>58\tstring\tkivio\t\t\tKivio document\n>>>>58\tstring\tkontour\t\t\tKontour document\n>>>>58\tstring\tkpresenter\t\tKPresenter document\n>>>>58\tstring\tkspread\t\t\tKSpread document\n>>>>58\tstring\tkword\t\t\tKWord document\n\n# OpenOffice formats (for OpenOffice 1.x / StarOffice 6/7)\n>>>50\tstring\tvnd.sun.xml.\t\tOpenOffice.org 1.x\n>>>>62\tstring\twriter\t\t\tWriter\n>>>>>68\tbyte\t!0x2e\t\t\tdocument\n>>>>>68\tstring\t.template\t\ttemplate\n>>>>>68\tstring\t.global\t\t\tglobal document\n>>>>62\tstring\tcalc\t\t\tCalc\n>>>>>66\tbyte\t!0x2e\t\t\tspreadsheet\n>>>>>66\tstring\t.template\t\ttemplate\n>>>>62\tstring\tdraw\t\t\tDraw\n>>>>>66\tbyte\t!0x2e\t\t\tdocument\n>>>>>66\tstring\t.template\t\ttemplate\n>>>>62\tstring\timpress\t\t\tImpress\n>>>>>69\tbyte\t!0x2e\t\t\tpresentation\n>>>>>69\tstring\t.template\t\ttemplate\n>>>>62\tstring\tmath\t\t\tMath document\n>>>>62\tstring\tbase\t\t\tDatabase file\n\n# OpenDocument formats (for OpenOffice 2.x / StarOffice >= 8)\n# http://lists.oasis-open.org/archives/office/200505/msg00006.html\n>>>50\tstring\tvnd.oasis.opendocument.\tOpenDocument\n>>>>73\tstring\ttext\n>>>>>77\tbyte\t!0x2d\t\t\tText\n!:mime\tapplication/vnd.oasis.opendocument.text\n>>>>>77\tstring\t-template\t\tText Template\n>>>>>77\tstring\t-web\t\t\tHTML Document Template\n>>>>>77\tstring\t-master\t\t\tMaster Document\n>>>>73\tstring\tgraphics\t\tDrawing\n>>>>>81\tstring\t-template\t\tTemplate\n>>>>73\tstring\tpresentation\t\tPresentation\n>>>>>85\tstring\t-template\t\tTemplate\n>>>>73\tstring\tspreadsheet\t\tSpreadsheet\n>>>>>84\tstring\t-template\t\tTemplate\n>>>>73\tstring\tchart\t\t\tChart\n>>>>>78\tstring\t-template\t\tTemplate\n>>>>73\tstring\tformula\t\t\tFormula\n>>>>>80\tstring\t-template\t\tTemplate\n>>>>73\tstring\tdatabase\t\tDatabase\n>>>>73\tstring\timage\t\t\tImage\n\n# Zoo archiver\n20\tlelong\t\t0xfdc4a7dc\tZoo archive data\n!:mime\tapplication/x-zoo\n>4\tbyte\t\t>48\t\t\\b, v%c.\n>>6\tbyte\t\t>47\t\t\\b%c\n>>>7\tbyte\t\t>47\t\t\\b%c\n>32\tbyte\t\t>0\t\t\\b, modify: v%d\n>>33\tbyte\t\tx\t\t\\b.%d+\n>42\tlelong\t\t0xfdc4a7dc\t\\b,\n>>70\tbyte\t\t>0\t\textract: v%d\n>>>71\tbyte\t\tx\t\t\\b.%d+\n\n# Shell archives\n10\tstring\t\t#\\ This\\ is\\ a\\ shell\\ archive\tshell archive text\n!:mime\tapplication/octet-stream\n\n#\n# LBR. NB: May conflict with the questionable \n#          \"binary Computer Graphics Metafile\" format.\n#\n0       string  \\0\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\0\\0    LBR archive data\n#\n# PMA (CP/M derivative of LHA)\n#\n2       string          -pm0-           PMarc archive data [pm0]\n2       string          -pm1-           PMarc archive data [pm1]\n2       string          -pm2-           PMarc archive data [pm2]\n2       string          -pms-           PMarc SFX archive (CP/M, DOS)\n5       string          -pc1-           PopCom compressed executable (CP/M)\n\n# From Rafael Laboissiere <rafael@laboissiere.net>\n# The Project Revision Control System (see\n# http://prcs.sourceforge.net) generates a packaged project\n# file which is recognized by the following entry: \n0\tleshort\t\t0xeb81\tPRCS packaged project\n\n# Microsoft cabinets \n# by David Necas (Yeti) <yeti@physics.muni.cz>\n#0\tstring\tMSCF\\0\\0\\0\\0\tMicrosoft cabinet file data,\n#>25\tbyte\tx\t\tv%d\n#>24\tbyte\tx\t\t\\b.%d\n# MPi: All CABs have version 1.3, so this is pointless.\n# Better magic in debian-additions.\n\n# GTKtalog catalogs \n# by David Necas (Yeti) <yeti@physics.muni.cz>\n4\tstring\tgtktalog\\ \tGTKtalog catalog data,\n>13\tstring\t3\t\tversion 3\n>>14\tbeshort\t0x677a\t\t(gzipped)\n>>14\tbeshort\t!0x677a\t\t(not gzipped)\n>13\tstring\t>3\t\tversion %s\n\n############################################################################\n# Parity archive reconstruction file, the 'par' file format now used on Usenet.\n0       string          PAR\\0\tPARity archive data\n>48\tleshort\t\t=0\t- Index file\n>48\tleshort\t\t>0\t- file number %d\n\n# Felix von Leitner <felix-file@fefe.de>\n0\tstring\td8:announce\tBitTorrent file\n!:mime\tapplication/x-bittorrent\n\n# Atari MSA archive - Teemu Hukkanen <tjhukkan@iki.fi>\n0       beshort 0x0e0f          Atari MSA archive data\n>2      beshort x       \t\\b, %d sectors per track\n>4      beshort 0       \t\\b, 1 sided\n>4      beshort 1       \t\\b, 2 sided\n>6      beshort x       \t\\b, starting track: %d\n>8      beshort x       \t\\b, ending track: %d\n\n# Alternate ZIP string (amc@arwen.cs.berkeley.edu)\n0\tstring\tPK00PK\\003\\004\tZip archive data\n\n# ACE archive (from http://www.wotsit.org/download.asp?f=ace)\n# by Stefan `Sec` Zehl <sec@42.org>\n7\tstring\t\t**ACE**\t\tACE archive data\n>15\tbyte\t>0\t\tversion %d\n>16\tbyte\t=0x00\t\t\\b, from MS-DOS\n>16\tbyte\t=0x01\t\t\\b, from OS/2\n>16\tbyte\t=0x02\t\t\\b, from Win/32\n>16\tbyte\t=0x03\t\t\\b, from Unix\n>16\tbyte\t=0x04\t\t\\b, from MacOS\n>16\tbyte\t=0x05\t\t\\b, from WinNT\n>16\tbyte\t=0x06\t\t\\b, from Primos\n>16\tbyte\t=0x07\t\t\\b, from AppleGS\n>16\tbyte\t=0x08\t\t\\b, from Atari\n>16\tbyte\t=0x09\t\t\\b, from Vax/VMS\n>16\tbyte\t=0x0A\t\t\\b, from Amiga\n>16\tbyte\t=0x0B\t\t\\b, from Next\n>14\tbyte\tx\t\t\\b, version %d to extract\n>5\tleshort &0x0080\t\t\\b, multiple volumes,\n>>17\tbyte\tx\t\t\\b (part %d),\n>5\tleshort &0x0002\t\t\\b, contains comment\n>5\tleshort\t&0x0200\t\t\\b, sfx\n>5\tleshort\t&0x0400\t\t\\b, small dictionary\n>5\tleshort\t&0x0800\t\t\\b, multi-volume\n>5\tleshort\t&0x1000\t\t\\b, contains AV-String\n>>30\tstring\t\\x16*UNREGISTERED\\x20VERSION*\t(unregistered)\n>5\tleshort &0x2000\t\t\\b, with recovery record\n>5\tleshort &0x4000\t\t\\b, locked\n>5\tleshort &0x8000\t\t\\b, solid\n# Date in MS-DOS format (whatever that is)\n#>18\tlelong\tx\t\tCreated on\n\n# sfArk : compression program for Soundfonts (sf2) by Dirk Jagdmann\n# <doj@cubic.org>\n0x1A\tstring\tsfArk\t\tsfArk compressed Soundfont\n>0x15\tstring\t2\n>>0x1\tstring\t>\\0\t\tVersion %s\n>>0x2A\tstring\t>\\0\t\t: %s\n\n# DR-DOS 7.03 Packed File *.??_\n0\tstring\tPacked\\ File\\ \tPersonal NetWare Packed File\n>12\tstring\tx    \t\t\\b, was \"%.12s\"\n\n# EET archive\n# From: Tilman Sauerbeck <tilman@code-monkey.de>\n0\tbelong\t0x1ee7ff00\tEET archive\n!:mime\tapplication/x-eet\n\n# rzip archives\n0\tstring\tRZIP\t\trzip compressed data\n>4\tbyte\tx\t\t- version %d\n>5\tbyte\tx\t\t\\b.%d\n>6\tbelong\tx\t\t(%d bytes)\n\n# From: \"Robert Dale\" <robdale@gmail.com>\n0\tbelong\t123\t\tdar archive,\n>4\tbelong\tx\t\tlabel \"%.8x\n>>8\tbelong\tx\t\t%.8x\n>>>12\tbeshort\tx\t\t%.4x\"\n>14\tbyte\t0x54\t\tend slice\n>14\tbeshort\t0x4e4e\t\tmulti-part\n>14\tbeshort\t0x4e53\t\tmulti-part, with -S\n\n# Symbian installation files\n#  http://www.thouky.co.uk/software/psifs/sis.html\n#  http://developer.symbian.com/main/downloads/papers/SymbianOSv91/softwareinstallsis.pdf\n8\tlelong\t0x10000419\tSymbian installation file\n!:mime\tapplication/vnd.symbian.install\n>4\tlelong\t0x1000006D\t(EPOC release 3/4/5)\n>4\tlelong\t0x10003A12\t(EPOC release 6)\n0\tlelong\t0x10201A7A\tSymbian installation file (Symbian OS 9.x)\n!:mime\tx-epoc/x-sisx-app\n\n# From \"Nelson A. de Oliveira\" <naoliv@gmail.com>\n0\tstring\tMPQ\\032\t\tMoPaQ (MPQ) archive\n\n# From: Dirk Jagdmann <doj@cubic.org>\n# xar archive format: http://code.google.com/p/xar/\n0\tstring\txar!\t\txar archive\n>6\tbeshort\tx\t\t- version %ld\n\n# From: \"Nelson A. de Oliveira\" <naoliv@gmail.com>\n# .kgb\n0\tstring KGB_arch\t\tKGB Archiver file\n>10\tstring x\t\twith compression level %.1s\n\n# xar (eXtensible ARchiver) archive\n# From: \"David Remahl\" <dremahl@apple.com>\n0\tstring\txar!\t\txar archive\n#>4\tbeshort\tx\t\theader size %d\n>6\tbeshort\tx\t\tversion %d,\n#>8\tquad\tx\t\tcompressed TOC: %d,\n#>16\tquad\tx\t\tuncompressed TOC: %d,\n>24\tbelong\t0\t\tno checksum\n>24\tbelong\t1\t\tSHA-1 checksum\n>24\tbelong\t2\t\tMD5 checksum\n\n\n#------------------------------------------------------------------------------\n# asterix:  file(1) magic for Aster*x; SunOS 5.5.1 gave the 4-character\n# strings as \"long\" - we assume they're just strings:\n# From: guy@netapp.com (Guy Harris)\n#\n0\tstring\t\t*STA\t\tAster*x\n>7\tstring\t\tWORD\t\t\tWords Document\n>7\tstring\t\tGRAP\t\t\tGraphic\n>7\tstring\t\tSPRE\t\t\tSpreadsheet\n>7\tstring\t\tMACR\t\t\tMacro\n0\tstring\t\t2278\t\tAster*x Version 2\n>29\tbyte\t\t0x36\t\t\tWords Document\n>29\tbyte\t\t0x35\t\t\tGraphic\n>29\tbyte\t\t0x32\t\t\tSpreadsheet\n>29\tbyte\t\t0x38\t\t\tMacro\n\n\n#------------------------------------------------------------------------------\n# att3b:  file(1) magic for AT&T 3B machines\n#\n# The `versions' should be un-commented if they work for you.\n# (Was the problem just one of endianness?)\n#\n# 3B20\n#\n# The 3B20 conflicts with SCCS.\n#0\tbeshort\t\t0550\t\t3b20 COFF executable\n#>12\tbelong\t\t>0\t\tnot stripped\n#>22\tbeshort\t\t>0\t\t- version %ld\n#0\tbeshort\t\t0551\t\t3b20 COFF executable (TV)\n#>12\tbelong\t\t>0\t\tnot stripped\n#>22\tbeshort\t\t>0\t\t- version %ld\n#\n# WE32K\n#\n0\tbeshort\t\t0560\t\tWE32000 COFF\n>18\tbeshort\t\t^00000020\tobject\n>18\tbeshort\t\t&00000020\texecutable\n>12\tbelong\t\t>0\t\tnot stripped\n>18\tbeshort\t\t^00010000\tN/A on 3b2/300 w/paging\n>18\tbeshort\t\t&00020000\t32100 required\n>18\tbeshort\t\t&00040000\tand MAU hardware required\n>20\tbeshort\t\t0407\t\t(impure)\n>20\tbeshort\t\t0410\t\t(pure)\n>20\tbeshort\t\t0413\t\t(demand paged)\n>20\tbeshort\t\t0443\t\t(target shared library)\n>22\tbeshort\t\t>0\t\t- version %ld\n0\tbeshort\t\t0561\t\tWE32000 COFF executable (TV)\n>12\tbelong\t\t>0\t\tnot stripped\n#>18\tbeshort\t\t&00020000\t- 32100 required\n#>18\tbeshort\t\t&00040000\tand MAU hardware required\n#>22\tbeshort\t\t>0\t\t- version %ld\n#\n# core file for 3b2 \n0\tstring\t\t\\000\\004\\036\\212\\200\t3b2 core file\n>364\tstring\t\t>\\0\t\tof '%s'\n#------------------------------------------------------------------------------\n# audio:  file(1) magic for sound formats (see also \"iff\")\n#\n# Jan Nicolai Langfeldt (janl@ifi.uio.no), Dan Quinlan (quinlan@yggdrasil.com),\n# and others\n#\n\n# Sun/NeXT audio data\n0\tstring\t\t.snd\t\tSun/NeXT audio data:\n>12\tbelong\t\t1\t\t8-bit ISDN mu-law,\n!:mime\taudio/basic\n>12\tbelong\t\t2\t\t8-bit linear PCM [REF-PCM],\n!:mime\taudio/basic\n>12\tbelong\t\t3\t\t16-bit linear PCM,\n!:mime\taudio/basic\n>12\tbelong\t\t4\t\t24-bit linear PCM,\n!:mime\taudio/basic\n>12\tbelong\t\t5\t\t32-bit linear PCM,\n!:mime\taudio/basic\n>12\tbelong\t\t6\t\t32-bit IEEE floating point,\n!:mime\taudio/basic\n>12\tbelong\t\t7\t\t64-bit IEEE floating point,\n!:mime\taudio/basic\n>12\tbelong\t\t8\t\tFragmented sample data,\n>12\tbelong\t\t10\t\tDSP program,\n>12\tbelong\t\t11\t\t8-bit fixed point,\n>12\tbelong\t\t12\t\t16-bit fixed point,\n>12\tbelong\t\t13\t\t24-bit fixed point,\n>12\tbelong\t\t14\t\t32-bit fixed point,\n>12\tbelong\t\t18\t\t16-bit linear with emphasis,\n>12\tbelong\t\t19\t\t16-bit linear compressed,\n>12\tbelong\t\t20\t\t16-bit linear with emphasis and compression,\n>12\tbelong\t\t21\t\tMusic kit DSP commands,\n>12\tbelong\t\t23\t\t8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice enc.),\n!:mime  audio/x-adpcm\n>12\tbelong\t\t24\t\tcompressed (8-bit CCITT G.722 ADPCM)\n>12\tbelong\t\t25\t\tcompressed (3-bit CCITT G.723.3 ADPCM),\n>12\tbelong\t\t26\t\tcompressed (5-bit CCITT G.723.5 ADPCM),\n>12\tbelong\t\t27\t\t8-bit A-law (CCITT G.711),\n>20\tbelong\t\t1\t\tmono,\n>20\tbelong\t\t2\t\tstereo,\n>20\tbelong\t\t4\t\tquad,\n>16\tbelong\t\t>0\t\t%d Hz\n\n# DEC systems (e.g. DECstation 5000) use a variant of the Sun/NeXT format\n# that uses little-endian encoding and has a different magic number\n0\tlelong\t\t0x0064732E\tDEC audio data:\n>12\tlelong\t\t1\t\t8-bit ISDN mu-law,\n!:mime\taudio/x-dec-basic\n>12\tlelong\t\t2\t\t8-bit linear PCM [REF-PCM],\n!:mime\taudio/x-dec-basic\n>12\tlelong\t\t3\t\t16-bit linear PCM,\n!:mime\taudio/x-dec-basic\n>12\tlelong\t\t4\t\t24-bit linear PCM,\n!:mime\taudio/x-dec-basic\n>12\tlelong\t\t5\t\t32-bit linear PCM,\n!:mime\taudio/x-dec-basic\n>12\tlelong\t\t6\t\t32-bit IEEE floating point,\n!:mime\taudio/x-dec-basic\n>12\tlelong\t\t7\t\t64-bit IEEE floating point,\n!:mime\taudio/x-dec-basic\n>12\tbelong\t\t8\t\tFragmented sample data,\n>12\tbelong\t\t10\t\tDSP program,\n>12\tbelong\t\t11\t\t8-bit fixed point,\n>12\tbelong\t\t12\t\t16-bit fixed point,\n>12\tbelong\t\t13\t\t24-bit fixed point,\n>12\tbelong\t\t14\t\t32-bit fixed point,\n>12\tbelong\t\t18\t\t16-bit linear with emphasis,\n>12\tbelong\t\t19\t\t16-bit linear compressed,\n>12\tbelong\t\t20\t\t16-bit linear with emphasis and compression,\n>12\tbelong\t\t21\t\tMusic kit DSP commands,\n>12\tlelong\t\t23\t\t8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice enc.),\n!:mime\taudio/x-dec-basic\n>12\tbelong\t\t24\t\tcompressed (8-bit CCITT G.722 ADPCM)\n>12\tbelong\t\t25\t\tcompressed (3-bit CCITT G.723.3 ADPCM),\n>12\tbelong\t\t26\t\tcompressed (5-bit CCITT G.723.5 ADPCM),\n>12\tbelong\t\t27\t\t8-bit A-law (CCITT G.711),\n>20\tlelong\t\t1\t\tmono,\n>20\tlelong\t\t2\t\tstereo,\n>20\tlelong\t\t4\t\tquad,\n>16\tlelong\t\t>0\t\t%d Hz\n\n# Creative Labs AUDIO stuff\n0\tstring\tMThd\t\t\tStandard MIDI data\n!:mime\taudio/midi\n>8 \tbeshort\tx\t\t\t(format %d)\n>10\tbeshort\tx\t\t\tusing %d track\n>10\tbeshort\t\t>1\t\t\\bs\n>12\tbeshort&0x7fff\tx\t\tat 1/%d\n>12\tbeshort&0x8000\t>0\t\tSMPTE\n\n0\tstring\tCTMF\t\t\tCreative Music (CMF) data\n!:mime\taudio/x-unknown\n0\tstring\tSBI\t\t\tSoundBlaster instrument data\n!:mime\taudio/x-unknown\n0\tstring\tCreative\\ Voice\\ File\tCreative Labs voice data\n!:mime\taudio/x-unknown\n# is this next line right?  it came this way...\n>19\tbyte\t0x1A\n>23\tbyte\t>0\t\t\t- version %d\n>22\tbyte\t>0\t\t\t\\b.%d\n\n# first entry is also the string \"NTRK\"\n0\tbelong\t\t0x4e54524b\tMultiTrack sound data\n>4\tbelong\t\tx\t\t- version %ld\n\n# Extended MOD format (*.emd) (Greg Roelofs, newt@uchicago.edu); NOT TESTED\n# [based on posting 940824 by \"Dirk/Elastik\", husberg@lehtori.cc.tut.fi]\n0\tstring\t\tEMOD\t\tExtended MOD sound data,\n>4\tbyte&0xf0\tx\t\tversion %d\n>4\tbyte&0x0f\tx\t\t\\b.%d,\n>45\tbyte\t\tx\t\t%d instruments\n>83\tbyte\t\t0\t\t(module)\n>83\tbyte\t\t1\t\t(song)\n\n# Real Audio (Magic .ra\\0375)\n0\tbelong\t\t0x2e7261fd\tRealAudio sound file\n!:mime\taudio/x-pn-realaudio\n0\tstring\t\t.RMF\t\tRealMedia file\n!:mime\tapplication/vnd.rn-realmedia\n#video/x-pn-realvideo\n#video/vnd.rn-realvideo\n#application/vnd.rn-realmedia\n#\tsigh, there are many mimes for that but the above are the most common.\n\n# MTM/669/FAR/S3M/ULT/XM format checking [Aaron Eppert, aeppert@dialin.ind.net]\n# Oct 31, 1995\n# fixed by <doj@cubic.org> 2003-06-24\n# Too short...\n#0\tstring\t\tMTM\t\tMultiTracker Module sound file\n#0\tstring\t\tif\t\tComposer 669 Module sound data\n#0\tstring\t\tJN\t\tComposer 669 Module sound data (extended format)\n0\tstring\t\tMAS_U\t\tULT(imate) Module sound data\n\n#0\tstring\t\tFAR\t\tModule sound data\n#>4\tstring\t\t>\\15\t\tTitle: \"%s\"\n\n0x2c\tstring\t\tSCRM\t\tScreamTracker III Module sound data\n>0\tstring\t\t>\\0\t\tTitle: \"%s\"\n\n# Gravis UltraSound patches\n# From <ache@nagual.ru>\n\n0\tstring\t\tGF1PATCH110\\0ID#000002\\0\tGUS patch\n0\tstring\t\tGF1PATCH100\\0ID#000002\\0\tOld GUS\tpatch\n\n# mime types according to http://www.geocities.com/nevilo/mod.htm:\n#\taudio/it\t.it\n#\taudio/x-zipped-it\t.itz\n#\taudio/xm\tfasttracker modules\n#\taudio/x-s3m\tscreamtracker modules\n#\taudio/s3m\tscreamtracker modules\n#\taudio/x-zipped-mod\tmdz\n#\taudio/mod\tmod\n#\taudio/x-mod\tAll modules (mod, s3m, 669, mtm, med, xm, it, mdz, stm, itz, xmz, s3z)\n\n#\n# Taken from loader code from mikmod version 2.14\n# by Steve McIntyre (stevem@chiark.greenend.org.uk)\n# <doj@cubic.org> added title printing on 2003-06-24\n0\tstring\tMAS_UTrack_V00\n>14\tstring\t>/0\t\tultratracker V1.%.1s module sound data\n!:mime\taudio/x-mod\n#audio/x-tracker-module\n\n0\tstring\tUN05\t\tMikMod UNI format module sound data\n\n0\tstring\tExtended\\ Module: Fasttracker II module sound data\n!:mime\taudio/x-mod\n#audio/x-tracker-module\n>17\tstring\t>\\0\t\tTitle: \"%s\"\n\n21\tstring/c\t=!SCREAM!\tScreamtracker 2 module sound data\n!:mime\taudio/x-mod\n#audio/x-screamtracker-module\n21\tstring\tBMOD2STM\tScreamtracker 2 module sound data\n!:mime\taudio/x-mod\n#audio/x-screamtracker-module\n1080\tstring\tM.K.\t\t4-channel Protracker module sound data\n!:mime\taudio/x-mod\n#audio/x-protracker-module\n>0\tstring\t>\\0\t\tTitle: \"%s\"\n1080\tstring\tM!K!\t\t4-channel Protracker module sound data\n!:mime\taudio/x-mod\n#audio/x-protracker-module\n>0\tstring\t>\\0\t\tTitle: \"%s\"\n1080\tstring\tFLT4\t\t4-channel Startracker module sound data\n!:mime\taudio/x-mod\n#audio/x-startracker-module\n>0\tstring\t>\\0\t\tTitle: \"%s\"\n1080\tstring\tFLT8\t\t8-channel Startracker module sound data\n!:mime\taudio/x-mod\n#audio/x-startracker-module\n>0\tstring\t>\\0\t\tTitle: \"%s\"\n1080\tstring\t4CHN\t\t4-channel Fasttracker module sound data\n!:mime\taudio/x-mod\n#audio/x-fasttracker-module\n>0\tstring\t>\\0\t\tTitle: \"%s\"\n1080\tstring\t6CHN\t\t6-channel Fasttracker module sound data\n!:mime\taudio/x-mod\n#audio/x-fasttracker-module\n>0\tstring\t>\\0\t\tTitle: \"%s\"\n1080\tstring\t8CHN\t\t8-channel Fasttracker module sound data\n!:mime\taudio/x-mod\n#audio/x-fasttracker-module\n>0\tstring\t>\\0\t\tTitle: \"%s\"\n1080\tstring\tCD81\t\t8-channel Octalyser module sound data\n!:mime\taudio/x-mod\n#audio/x-octalysertracker-module\n>0\tstring\t>\\0\t\tTitle: \"%s\"\n1080\tstring\tOKTA\t\t8-channel Octalyzer module sound data\n!:mime\taudio/x-mod\n#audio/x-octalysertracker-module\n>0\tstring\t>\\0\t\tTitle: \"%s\"\n# Not good enough.\n#1082\tstring\tCH\n#>1080\tstring\t>/0\t\t%.2s-channel Fasttracker \"oktalyzer\" module sound data\n1080\tstring\t16CN\t\t16-channel Taketracker module sound data\n!:mime\taudio/x-mod\n#audio/x-taketracker-module\n>0\tstring\t>\\0\t\tTitle: \"%s\"\n1080\tstring\t32CN\t\t32-channel Taketracker module sound data\n!:mime\taudio/x-mod\n#audio/x-taketracker-module\n>0\tstring\t>\\0\t\tTitle: \"%s\"\n\n# TOC sound files -Trevor Johnson <trevor@jpj.net>\n#\n0       string          TOC             TOC sound file\n\n# sidfiles <pooka@iki.fi>\n# added name,author,(c) and new RSID type by <doj@cubic.org> 2003-06-24\n0\tstring\t\tSIDPLAY\\ INFOFILE\tSidplay info file\n\n0\tstring\t\tPSID\t\t\tPlaySID v2.2+ (AMIGA) sidtune\n>4\tbeshort\t\t>0\t\t\tw/ header v%d,\n>14\tbeshort\t\t=1\t\t\tsingle song,\n>14\tbeshort\t\t>1\t\t\t%d songs,\n>16\tbeshort\t\t>0\t\t\tdefault song: %d\n>0x16\tstring\t\t>\\0\t\t\tname: \"%s\"\n>0x36\tstring\t\t>\\0\t\t\tauthor: \"%s\"\n>0x56\tstring\t\t>\\0\t\t\tcopyright: \"%s\"\n\n0\tstring\t\tRSID\t\t\tRSID sidtune PlaySID compatible\n>4\tbeshort\t\t>0\t\t\tw/ header v%d,\n>14\tbeshort\t\t=1\t\t\tsingle song,\n>14\tbeshort\t\t>1\t\t\t%d songs,\n>16\tbeshort\t\t>0\t\t\tdefault song: %d\n>0x16\tstring\t\t>\\0\t\t\tname: \"%s\"\n>0x36\tstring\t\t>\\0\t\t\tauthor: \"%s\"\n>0x56\tstring\t\t>\\0\t\t\tcopyright: \"%s\"\n\n# IRCAM <mpruett@sgi.com>\n# VAX and MIPS files are little-endian; Sun and NeXT are big-endian\n0\tbelong\t\t0x64a30100\t\tIRCAM file (VAX)\n0\tbelong\t\t0x64a30200\t\tIRCAM file (Sun)\n0\tbelong\t\t0x64a30300\t\tIRCAM file (MIPS little-endian)\n0\tbelong\t\t0x64a30400\t\tIRCAM file (NeXT)\n\n# NIST SPHERE <mpruett@sgi.com>\n0\tstring\t\tNIST_1A\\n\\ \\ \\ 1024\\n\tNIST SPHERE file\n\n# Sample Vision <mpruett@sgi.com>\n0\tstring\t\tSOUND\\ SAMPLE\\ DATA\\ \tSample Vision file\n\n# Audio Visual Research <tonigonenstein@users.sourceforge.net>\n0\tstring\t\t2BIT\t\t\tAudio Visual Research file,\n>12\tbeshort\t\t=0\t\t\tmono,\n>12\tbeshort\t\t=-1\t\t\tstereo,\n>14\tbeshort\t\tx\t\t\t%d bits\n>16\tbeshort\t\t=0\t\t\tunsigned,\n>16\tbeshort\t\t=-1\t\t\tsigned,\n>22\tbelong&0x00ffffff\tx\t\t%d Hz,\n>18\tbeshort\t\t=0\t\t\tno loop,\n>18\tbeshort\t\t=-1\t\t\tloop,\n>21\tubyte\t\t<128\t\t\tnote %d,\n>22\tbyte\t\t=0\t\t\treplay 5.485 KHz\n>22\tbyte\t\t=1\t\t\treplay 8.084 KHz\n>22\tbyte\t\t=2\t\t\treplay 10.971 Khz\n>22\tbyte\t\t=3\t\t\treplay 16.168 Khz\n>22\tbyte\t\t=4\t\t\treplay 21.942 KHz\n>22\tbyte\t\t=5\t\t\treplay 32.336 KHz\n>22\tbyte\t\t=6\t\t\treplay 43.885 KHz\n>22\tbyte\t\t=7\t\t\treplay 47.261 KHz\n\n# SGI SoundTrack <mpruett@sgi.com>\n0\tstring\t\t_SGI_SoundTrack\t\tSGI SoundTrack project file\n# ID3 version 2 tags <waschk@informatik.uni-rostock.de>\n0\tstring\t\tID3\tAudio file with ID3 version 2\n>3\tbyte\t\tx\t\\b.%d\n>4\tbyte\t\tx\t\\b.%d\n>>5\tbyte\t\t&0x80\t\\b, unsynchronized frames\n>>5\tbyte\t\t&0x40\t\\b, extended header\n>>5\tbyte\t\t&0x20\t\\b, experimental\n>>5\tbyte\t\t&0x10\t\\b, footer present\n>(6.I)\tindirect\tx\t\\b, contains: \n\n# NSF (NES sound file) magic\n0\tstring\t\tNESM\\x1a\tNES Sound File\n>14\tstring\t\t>\\0\t\t(\"%s\" by\n>46\tstring\t\t>\\0\t\t%s, copyright\n>78\tstring\t\t>\\0\t\t%s),\n>5\tbyte\t\tx\t\tversion %d,\n>6\tbyte\t\tx\t\t%d tracks,\n>122\tbyte&0x2\t=1\t\tdual PAL/NTSC\n>122\tbyte&0x1\t=1\t\tPAL\n>122\tbyte&0x1\t=0\t\tNTSC\n\n# Impulse tracker module (audio/x-it)\n0\tstring\t\tIMPM\t\tImpulse Tracker module sound data -\n!:mime\taudio/x-mod\n>4\tstring\t\t>\\0\t\t\"%s\"\n>40\tleshort\t\t!0\t\tcompatible w/ITv%x\n>42\tleshort\t\t!0\t\tcreated w/ITv%x\n\n# Imago Orpheus module (audio/x-imf)\n60\tstring\t\tIM10\t\tImago Orpheus module sound data -\n>0\tstring\t\t>\\0\t\t\"%s\"\n\n# From <collver1@attbi.com>\n# These are the /etc/magic entries to decode modules, instruments, and\n# samples in Impulse Tracker's native format.\n\n0\tstring\t\tIMPS\t\tImpulse Tracker Sample\n>18\tbyte\t\t&2\t\t16 bit\n>18\tbyte\t\t^2\t\t8 bit\n>18\tbyte\t\t&4\t\tstereo\n>18\tbyte\t\t^4\t\tmono\n0\tstring\t\tIMPI\t\tImpulse Tracker Instrument\n>28\tleshort\t\t!0\t\tITv%x\n>30\tbyte\t\t!0\t\t%d samples\n\n# Yamaha TX Wave:  file(1) magic for Yamaha TX Wave audio files\n# From <collver1@attbi.com>\n0\tstring\t\tLM8953\t\tYamaha TX Wave\n>22\tbyte\t\t0x49\t\tlooped\n>22\tbyte\t\t0xC9\t\tnon-looped\n>23\tbyte\t\t1\t\t33kHz\n>23\tbyte\t\t2\t\t50kHz\n>23\tbyte\t\t3\t\t16kHz\n\n# scream tracker:  file(1) magic for Scream Tracker sample files\n#\n# From <collver1@attbi.com>\n76\tstring\t\tSCRS\t\tScream Tracker Sample\n>0\tbyte\t\t1\t\tsample\n>0\tbyte\t\t2\t\tadlib melody\n>0\tbyte\t\t>2\t\tadlib drum\n>31\tbyte\t\t&2\t\tstereo\n>31\tbyte\t\t^2\t\tmono\n>31\tbyte\t\t&4\t\t16bit little endian\n>31\tbyte\t\t^4\t\t8bit\n>30\tbyte\t\t0\t\tunpacked\n>30\tbyte\t\t1\t\tpacked\n\n# audio\n# From: Cory Dikkers <cdikkers@swbell.net>\n0\tstring\t\tMMD0\t\tMED music file, version 0\n0\tstring\t\tMMD1\t\tOctaMED Pro music file, version 1\n0\tstring\t\tMMD3\t\tOctaMED Soundstudio music file, version 3\n0\tstring\t\tOctaMEDCmpr\tOctaMED Soundstudio compressed file\n0\tstring\t\tMED\t\tMED_Song\n0\tstring\t\tSymM\t\tSymphonie SymMOD music file\n#\n0\tstring\t\tTHX\t\tAHX version\n>3\tbyte\t\t=0\t\t1 module data\n>3\tbyte\t\t=1\t\t2 module data\n#\n0\tstring\t\tOKTASONG\tOktalyzer module data\n#\n0\tstring\t\tDIGI\\ Booster\\ module\\0\t%s\n>20\tbyte\t\t>0\t\t%c\n>>21\tbyte\t\t>0\t\t\\b%c\n>>>22\tbyte\t\t>0\t\t\\b%c\n>>>>23\tbyte\t\t>0\t\t\\b%c\n>610\tstring\t\t>\\0\t\t\\b, \"%s\"\n#\n0\tstring\t\tDBM0\t   \tDIGI Booster Pro Module\n>4\tbyte\t\t>0\t\tV%X.\n>>5\tbyte\t\tx\t\t\\b%02X\n>16\tstring\t\t>\\0\t\t\\b, \"%s\"\n#\n0\tstring\t\tFTMN\t\tFaceTheMusic module\n>16\tstring\t\t>\\0d\t\t\\b, \"%s\"\n\n# From: <doj@cubic.org> 2003-06-24\n0\tstring\t\tAMShdr\\32\tVelvet Studio AMS Module v2.2\n0\tstring\t\tExtreme\t\tExtreme Tracker AMS Module v1.3\n0\tstring\t\tDDMF\t\tXtracker DMF Module\n>4\tbyte\t\tx\t\tv%i\n>0xD\tstring\t\t>\\0\t\tTitle: \"%s\"\n>0x2B\tstring\t\t>\\0\t\tComposer: \"%s\"\n0\tstring\t\tDSM\\32\t\tDynamic Studio Module DSM\n0\tstring\t\tSONG\t\tDigiTrekker DTM Module\n0\tstring\t\tDMDL\t\tDigiTrakker MDL Module\n0\tstring\t\tPSM\\32\t\tProtracker Studio PSM Module\n44\tstring\t\tPTMF\t\tPoly Tracker PTM Module\n>0\tstring\t\t>\\32\t\tTitle: \"%s\"\n0\tstring\t\tMT20\t\tMadTracker 2.0 Module MT2\n0\tstring\t\tRAD\\40by\\40REALiTY!! RAD Adlib Tracker Module RAD\n0\tstring\t\tRTMM\t\tRTM Module\n0x426\tstring\t\tMaDoKaN96\tXMS Adlib Module\n>0\tstring\t\t>\\0\t\tComposer: \"%s\"\n0\tstring\t\tAMF\t\tAMF Module\n>4\tstring\t\t>\\0\t\tTitle: \"%s\"\n0\tstring\t\tMODINFO1\tOpen Cubic Player Module Inforation MDZ\n0\tstring\t\tExtended\\40Instrument: Fast Tracker II Instrument\n\n# From: Takeshi Hamasaki <hma@syd.odn.ne.jp>\n# NOA Nancy Codec file\n0\tstring\t\t\\210NOA\\015\\012\\032\tNOA Nancy Codec Movie file\n# Yamaha SMAF format\n0\tstring\t\tMMMD\t\tYamaha SMAF file\n# Sharp Jisaku Melody format for PDC\n0\tstring\t\t\\001Sharp\\040JisakuMelody\tSHARP Cell-Phone ringing Melody\n>20\tstring\t\tVer01.00\tVer. 1.00\n>>32\tbyte\t\tx\t\t, %d tracks\n\n# Free lossless audio codec <http://flac.sourceforge.net>\n# From: Przemyslaw Augustyniak <silvathraec@rpg.pl>\n0\tstring\t\t\tfLaC\t\tFLAC audio bitstream data\n!:mime\taudio/x-flac\n>4\tbyte&0x7f\t\t>0\t\t\\b, unknown version\n>4\tbyte&0x7f\t\t0\t\t\\b\n# some common bits/sample values\n>>20\tbeshort&0x1f0\t\t0x030\t\t\\b, 4 bit\n>>20\tbeshort&0x1f0\t\t0x050\t\t\\b, 6 bit\n>>20\tbeshort&0x1f0\t\t0x070\t\t\\b, 8 bit\n>>20\tbeshort&0x1f0\t\t0x0b0\t\t\\b, 12 bit\n>>20\tbeshort&0x1f0\t\t0x0f0\t\t\\b, 16 bit\n>>20\tbeshort&0x1f0\t\t0x170\t\t\\b, 24 bit\n>>20\tbyte&0xe\t\t0x0\t\t\\b, mono\n>>20\tbyte&0xe\t\t0x2\t\t\\b, stereo\n>>20\tbyte&0xe\t\t0x4\t\t\\b, 3 channels\n>>20\tbyte&0xe\t\t0x6\t\t\\b, 4 channels\n>>20\tbyte&0xe\t\t0x8\t\t\\b, 5 channels\n>>20\tbyte&0xe\t\t0xa\t\t\\b, 6 channels\n>>20\tbyte&0xe\t\t0xc\t\t\\b, 7 channels\n>>20\tbyte&0xe\t\t0xe\t\t\\b, 8 channels\n# some common sample rates\n>>17\tbelong&0xfffff0\t\t0x0ac440\t\\b, 44.1 kHz\n>>17\tbelong&0xfffff0\t\t0x0bb800\t\\b, 48 kHz\n>>17\tbelong&0xfffff0\t\t0x07d000\t\\b, 32 kHz\n>>17\tbelong&0xfffff0\t\t0x056220\t\\b, 22.05 kHz\n>>17\tbelong&0xfffff0\t\t0x05dc00\t\\b, 24 kHz\n>>17\tbelong&0xfffff0\t\t0x03e800\t\\b, 16 kHz\n>>17\tbelong&0xfffff0\t\t0x02b110\t\\b, 11.025 kHz\n>>17\tbelong&0xfffff0\t\t0x02ee00\t\\b, 12 kHz\n>>17\tbelong&0xfffff0\t\t0x01f400\t\\b, 8 kHz\n>>17\tbelong&0xfffff0\t\t0x177000\t\\b, 96 kHz\n>>17\tbelong&0xfffff0\t\t0x0fa000\t\\b, 64 kHz\n>>21\tbyte&0xf\t\t>0\t\t\\b, >4G samples\n>>21\tbyte&0xf\t\t0\t\t\\b\n>>>22\tbelong\t\t\t>0\t\t\\b, %u samples\n>>>22\tbelong\t\t\t0\t\t\\b, length unknown\n\n# (ISDN) VBOX voice message file (Wolfram Kleff)\n0       string          VBOX            VBOX voice message data\n\n# ReBorn Song Files (.rbs)\n# David J. Singer <doc@deadvirgins.org.uk>\n8       string          RB40             RBS Song file\n>29     string          ReBorn           created by ReBorn\n>37     string          Propellerhead    created by ReBirth\n\n# Synthesizer Generator and Kimwitu share their file format\n0\tstring\t\tA#S#C#S#S#L#V#3\t    Synthesizer Generator or Kimwitu data\n# Kimwitu++ uses a slightly different magic\n0\tstring\t\tA#S#C#S#S#L#HUB\t    Kimwitu++ data\n\n# From \"Simon Hosie\n0       string  TFMX-SONG       TFMX module sound data\n\n# Monkey's Audio compressed audio format (.ape)\n# From danny.milo@gmx.net (Danny Milosavljevic)\n# New version from Abel Cheung <abel (@) oaka.org>\n0\t\tstring\t\tMAC\\040\t\tMonkey's Audio compressed format\n>4\t\tuleshort\t>0x0F8B\t\tversion %d\n>>(0x08.l)\tuleshort\t=1000\t\twith fast compression\n>>(0x08.l)\tuleshort\t=2000\t\twith normal compression\n>>(0x08.l)\tuleshort\t=3000\t\twith high compression\n>>(0x08.l)\tuleshort\t=4000\t\twith extra high compression\n>>(0x08.l)\tuleshort\t=5000\t\twith insane compression\n>>(0x08.l+18)\tuleshort\t=1\t\t\\b, mono\n>>(0x08.l+18)\tuleshort\t=2\t\t\\b, stereo\n>>(0x08.l+20)\tulelong\t\tx\t\t\\b, sample rate %d\n>4\t\tuleshort\t<0x0F8C\t\tversion %d\n>>6\t\tuleshort\t=1000\t\twith fast compression\n>>6\t\tuleshort\t=2000\t\twith normal compression\n>>6\t\tuleshort\t=3000\t\twith high compression\n>>6\t\tuleshort\t=4000\t\twith extra high compression\n>>6\t\tuleshort\t=5000\t\twith insane compression\n>>10\t\tuleshort\t=1\t\t\\b, mono\n>>10\t\tuleshort\t=2\t\t\\b, stereo\n>>12\t\tulelong\t\tx\t\t\\b, sample rate %d\n\n# adlib sound files\n# From Gürkan Sengün <gurkan@linuks.mine.nu>, http://www.linuks.mine.nu\n0    \tstring\t\tRAWADATA\tRdosPlay RAW\n\n1068\tstring\t\tRoR\t\tAMUSIC Adlib Tracker\n\n0\tstring\t\tJCH\t\tEdLib\n\n0\tstring\t\tmpu401tr\tMPU-401 Trakker\n\n0\tstring\t\tSAdT\t\tSurprise! Adlib Tracker\n>4\tbyte\t\tx\t\tVersion %d\n\n0\tstring\t\tXAD!\t\teXotic ADlib\n\n0\tstring\t\tofTAZ!\t\teXtra Simple Music\n\n# Spectrum 128 tunes (.ay files).\n# From: Emanuel Haupt <ehaupt@critical.ch>\n0\tstring\t\tZXAYEMUL\tSpectrum 128 tune\n\n0\tstring\t\t\\0BONK\t\tBONK,\n#>5\tbyte\t\tx\t\tversion %d\n>14\tbyte\t\tx\t\t%d channel(s),\n>15\tbyte\t\t=1\t\tlossless,\n>15\tbyte\t\t=0\t\tlossy,\n>16\tbyte\t\tx\t\tmid-side\n\n384\tstring\t\tLockStream\tLockStream Embedded file (mostly MP3 on old Nokia phones)\n\n# format VQF (proprietary codec for sound)\n# some infos on the header file available at :\n# http://www.twinvq.org/english/technology_format.html\n0\tstring\t\tTWIN97012000\tVQF data\n>27\tshort\t\t0\t\t\\b, Mono\n>27\tshort\t\t1\t\t\\b, Stereo\n>31\tshort \t\t>0\t\t\\b, %d kbit/s\n>35\tshort \t\t>0\t\t\\b, %d kHz\n\n# Nelson A. de Oliveira (naoliv@gmail.com)\n# .eqf\n0\tstring\tWinamp\\ EQ\\ library\\ file\t%s\n# it will match only versions like v<digit>.<digit>\n# Since I saw only eqf files with version v1.1 I think that it's OK\n>23\tstring\tx\t\\b%.4s\n# .preset\n0\tstring\t[Equalizer\\ preset]\tXMMS equalizer preset\n# .m3u\n0\tsearch/1\t#EXTM3U \tM3U playlist text\n# .pls\n0\tsearch/1\t[playlist]\tPLS playlist text\n# licq.conf\n1\tstring\t[licq]\t\t\tLICQ configuration file\n\n# Atari ST audio files by Dirk Jagdmann <doj@cubic.org>\n0\tstring\t\tICE!\t\tSNDH Atari ST music\n0\tstring\t\tSC68\\ Music-file\\ /\\ (c)\\ (BeN)jami\tsc68 Atari ST music\n\n# musepak support From: \"Jiri Pejchal\" <jiri.pejchal@gmail.com>\n0       string          MP+     Musepack audio\n>3      byte            255     \\b, SV pre8\n>3      byte&0xF        0x6     \\b, SV 6\n>3      byte&0xF        0x8     \\b, SV 8\n>3      byte&0xF        0x7     \\b, SV 7\n>>3     byte&0xF0       0x0     \\b.0\n>>3     byte&0xF0       0x10    \\b.1\n>>3     byte&0xF0       240     \\b.15\n>>10    byte&0xF0       0x0     \\b, no profile\n>>10    byte&0xF0       0x10    \\b, profile 'Unstable/Experimental'\n>>10    byte&0xF0       0x50    \\b, quality 0\n>>10    byte&0xF0       0x60    \\b, quality 1\n>>10    byte&0xF0       0x70    \\b, quality 2 (Telephone)\n>>10    byte&0xF0       0x80    \\b, quality 3 (Thumb)\n>>10    byte&0xF0       0x90    \\b, quality 4 (Radio)\n>>10    byte&0xF0       0xA0    \\b, quality 5 (Standard)\n>>10    byte&0xF0       0xB0    \\b, quality 6 (Xtreme)\n>>10    byte&0xF0       0xC0    \\b, quality 7 (Insane)\n>>10    byte&0xF0       0xD0    \\b, quality 8 (BrainDead)\n>>10    byte&0xF0       0xE0    \\b, quality 9\n>>10    byte&0xF0       0xF0    \\b, quality 10\n>>27    byte            0x0     \\b, Buschmann 1.7.0-9, Klemm 0.90-1.05\n>>27    byte            102     \\b, Beta 1.02\n>>27    byte            104     \\b, Beta 1.04\n>>27    byte            105     \\b, Alpha 1.05\n>>27    byte            106     \\b, Beta 1.06\n>>27    byte            110     \\b, Release 1.1\n>>27    byte            111     \\b, Alpha 1.11\n>>27    byte            112     \\b, Beta 1.12\n>>27    byte            113     \\b, Alpha 1.13\n>>27    byte            114     \\b, Beta 1.14\n>>27    byte            115     \\b, Alpha 1.15\n\n# IMY\n# from http://filext.com/detaillist.php?extdetail=IMY\n# http://cellphones.about.com/od/cellularfaqs/f/rf_imelody.htm\n# http://download.ncl.ie/doc/api/ie/ncl/media/music/IMelody.html\n# http://www.wx800.com/msg/download/irda/iMelody.pdf\n0\tstring\tBEGIN:IMELODY\tiMelody Ringtone Format\n\n# From: \"Mateus Caruccio\" <mateus@caruccio.com>\n# guitar pro v3,4,5 from http://filext.com/file-extension/gp3\n0\tstring\t\\030FICHIER\\ GUITAR\\ PRO\\ v3.\tGuitar Pro Ver. 3 Tablature\n\n# From: \"Leslie P. Polzer\" <leslie.polzer@gmx.net>\n60\tstring\tSONG\t\tSoundFX Module sound file\n\n# Type: Adaptive Multi-Rate Codec\n# URL:  http://filext.com/detaillist.php?extdetail=AMR\n# From: Russell Coker <russell@coker.com.au>\n0\tstring\t#!AMR\t\tAdaptive Multi-Rate Codec (GSM telephony)\n#----------------------------------------------------------------\n# basis: file(1) magic for BBx/Pro5-files\n#      Oliver Dammer <dammer@olida.de>\t 2005/11/07\n# http://www.basis.com business-basic-files.\n#\n0\tstring\t\t\\074\\074bbx\\076\\076\tBBx\n>7\tstring\t\t\\000\t\t\tindexed file\n>7\tstring\t\t\\001\t\t\tserial file\n>7\tstring\t\t\\002\t\t\tkeyed file\n>>13\tshort\t\t0\t\t\t(sort)\n>7\tstring\t\t\\004\t\t\tprogram\n>>18\tbyte\t\tx\t\t\t(LEVEL %d)\n>>>23\tstring\t\t>\\000\t\t\tpsaved\n>7\tstring\t\t\\006\t\t\tmkeyed file\n>>13\tshort\t\t0\t\t\t(sort)\n>>8\tstring\t\t\\000\t\t\t(mkey)\n#------------------------------------------------------------------------------\n# bFLT: file(1) magic for BFLT uclinux binary files\n#\n# From Philippe De Muyter <phdm@macqel.be>\n#\n0\tstring\t\tbFLT\t\tBFLT executable\n>4\tbelong\t\tx\t\t- version %ld\n>4\tbelong\t\t4\n>>36\tbelong&0x1\t0x1\t\tram\n>>36\tbelong&0x2\t0x2\t\tgotpic\n>>36\tbelong&0x4\t0x4\t\tgzip\n>>36\tbelong&0x8\t0x8\t\tgzdata\n#------------------------------------------------------------------------------\n# blender: file(1) magic for Blender 3D related files\n#\n# Native format rule v1.2. For questions use the developers list \n# http://lists.blender.org/mailman/listinfo/bf-committers\n# GLOB chunk was moved near start and provides subversion info since 2.42 \n\n0\t\tstring\t=BLENDER\tBlender3D,\n>7\t\tstring\t=_\t\tsaved as 32-bits\n>>8\t\tstring\t=v\t\tlittle endian\n>>>9\t\tbyte\tx\t\twith version %c.\n>>>10\t\tbyte\tx\t\t\\b%c\n>>>11\t\tbyte\tx\t\t\\b%c\n>>>0x40\t\tstring\t=GLOB\t\t\\b.\n>>>>0x58\tleshort\tx\t\t\\b%.4d\n>>8\t\tstring\t=V\t\tbig endian\n>>>9\t\tbyte\tx\t\twith version %c.\n>>>10\t\tbyte\tx\t\t\\b%c\n>>>11\t\tbyte\tx\t\t\\b%c\n>>>0x40\t\tstring\t=GLOB\t\t\\b.\n>>>>0x58\tbeshort\tx\t\t\\b%.4d\n>7\t\tstring\t=-\t\tsaved as 64-bits\n>>8\t\tstring\t=v\t\tlittle endian\n>>9\t\tbyte\tx\t\twith version %c.\n>>10\t\tbyte\tx\t\t\\b%c\n>>11\t\tbyte\tx\t\t\\b%c\n>>0x44\t\tstring\t=GLOB\t\t\\b.\n>>>0x60\t\tleshort\tx\t\t\\b%.4d\n>>8\t\tstring\t=V\t\tbig endian\n>>>9\t\tbyte\tx\t\twith version %c.\n>>>10\t\tbyte\tx\t\t\\b%c\n>>>11\t\tbyte\tx\t\t\\b%c\n>>>0x44\t\tstring\t=GLOB\t\t\\b.\n>>>>0x60\tbeshort\tx\t\t\\b%.4d\n\n# Scripts that run in the embeded Python interpreter\n0\t\tstring\t#!BPY\t\tBlender3D BPython script\n\n#------------------------------------------------------------------------------\n# blit:  file(1) magic for 68K Blit stuff as seen from 680x0 machine\n#\n# Note that this 0407 conflicts with several other a.out formats...\n#\n# XXX - should this be redone with \"be\" and \"le\", so that it works on\n# little-endian machines as well?  If so, what's the deal with\n# \"VAX-order\" and \"VAX-order2\"?\n#\n#0\tlong\t\t0407\t\t68K Blit (standalone) executable\n#0\tshort\t\t0407\t\tVAX-order2 68K Blit (standalone) executable\n0\tshort\t\t03401\t\tVAX-order 68K Blit (standalone) executable\n0\tlong\t\t0406\t\t68k Blit mpx/mux executable\n0\tshort\t\t0406\t\tVAX-order2 68k Blit mpx/mux executable\n0\tshort\t\t03001\t\tVAX-order 68k Blit mpx/mux executable\n# Need more values for WE32 DMD executables.\n# Note that 0520 is the same as COFF\n#0\tshort\t\t0520\t\ttty630 layers executable\n#\n# i80960 b.out objects and archives\n#\n0\tlong\t\t0x10d\t\ti960 b.out relocatable object\n>16\tlong\t\t>0\t\tnot stripped\n#\n# b.out archive (hp-rt on i960)\n0\tstring\t\t=!<bout>\tb.out archive\n>8\tstring\t\t__.SYMDEF\trandom library\n#------------------------------------------------------------------------------\n# bsdi:  file(1) magic for BSD/OS (from BSDI) objects\n#\n\n0\tlelong\t\t0314\t\t386 compact demand paged pure executable\n>16\tlelong\t\t>0\t\tnot stripped\n>32\tbyte\t\t0x6a\t\t(uses shared libs)\n\n0\tlelong\t\t0407\t\t386 executable\n>16\tlelong\t\t>0\t\tnot stripped\n>32\tbyte\t\t0x6a\t\t(uses shared libs)\n\n0\tlelong\t\t0410\t\t386 pure executable\n>16\tlelong\t\t>0\t\tnot stripped\n>32\tbyte\t\t0x6a\t\t(uses shared libs)\n\n0\tlelong\t\t0413\t\t386 demand paged pure executable\n>16\tlelong\t\t>0\t\tnot stripped\n>32\tbyte\t\t0x6a\t\t(uses shared libs)\n\n# same as in SunOS 4.x, except for static shared libraries\n0\tbelong&077777777\t0600413\t\tsparc demand paged\n>0\tbyte\t\t&0x80\n>>20\tbelong\t\t<4096\t\tshared library\n>>20\tbelong\t\t=4096\t\tdynamically linked executable\n>>20\tbelong\t\t>4096\t\tdynamically linked executable\n>0\tbyte\t\t^0x80\t\texecutable\n>16\tbelong\t\t>0\t\tnot stripped\n>36\tbelong\t\t0xb4100001\t(uses shared libs)\n\n0\tbelong&077777777\t0600410\t\tsparc pure\n>0\tbyte\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t^0x80\t\texecutable\n>16\tbelong\t\t>0\t\tnot stripped\n>36\tbelong\t\t0xb4100001\t(uses shared libs)\n\n0\tbelong&077777777\t0600407\t\tsparc\n>0\tbyte\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t^0x80\t\texecutable\n>16\tbelong\t\t>0\t\tnot stripped\n>36\tbelong\t\t0xb4100001\t(uses shared libs)\n#------------------------------------------------------------------------------\n# BTSnoop:  file(1) magic for BTSnoop files\n#\n# From <marcel@holtmann.org>\n0\tstring\t\tbtsnoop\\0\t\tBTSnoop\n>8\tbelong\t\tx\t\t\tversion %d,\n>12\tbelong\t\t1001\t\t\tUnencapsulated HCI\n>12\tbelong\t\t1002\t\t\tHCI UART (H4)\n>12\tbelong\t\t1003\t\t\tHCI BCSP\n>12\tbelong\t\t1004\t\t\tHCI Serial (H5)\n>>12\tbelong\t\tx\t\t\ttype %d\n#------------------------------------------------------------------------------\n# c-lang:  file(1) magic for C programs (or REXX)\n#\n\n# XPM icons (Greg Roelofs, newt@uchicago.edu)\n# if you uncomment \"/*\" for C/REXX below, also uncomment this entry\n#0\tstring\t\t/*\\ XPM\\ */\tX pixmap image data\n#!:mime\timage/x-xpmi\n\n# 3DS (3d Studio files) Conflicts with diff output 0x3d '='\n#16\tbeshort\t\t0x3d3d\t\timage/x-3ds\n\n# this first will upset you if you're a PL/1 shop...\n# in which case rm it; ascmagic will catch real C programs\n#0\tsearch/1\t/*\t\tC or REXX program text\n#0\tsearch/1\t//\t\tC++ program text\n\n# From: Mikhail Teterin <mi@aldan.algebra.com> \n0\tstring\t\tcscope\t\tcscope reference data\n>7\tstring\t\tx\t\tversion %.2s\n# We skip the path here, because it is often long (so file will\n# truncate it) and mostly redundant.\n# The inverted index functionality was added some time betwen\n# versions 11 and 15, so look for -q if version is above 14:\n>7\tstring\t\t>14\n>>10\tsearch/100\t\\ -q\\ \t\twith inverted index\n>10\tsearch/100\t\\ -c\\ \t\ttext (non-compressed)\n#------------------------------------------------------------------------------\n# c64:  file(1) magic for various commodore 64 related files\n#\n# From: Dirk Jagdmann <doj@cubic.org>\n\n0x16500\tbelong\t\t0x12014100\tD64 Image\n0x16500\tbelong\t\t0x12014180\tD71 Image\n0x61800 belong\t\t0x28034400\tD81 Image\n0\tstring\t\tC64\\40CARTRIDGE\tCCS C64 Emultar Cartridge Image\n0\tbelong\t\t0x43154164\tX64 Image\n\n0\tstring\t\tGCR-1541\tGCR Image\n>8\tbyte\t\tx\t\tversion: %i\n>9\tbyte\t\tx\t\ttracks: %i\n\n9\tstring\t\tPSUR\t\tARC archive (c64)\n2\tstring\t\t-LH1-\t\tLHA archive (c64)\n\n0\tstring\t\tC64File\t\tPC64 Emulator file\n>8\tstring\t\t>\\0\t\t\"%s\"\n0\tstring\t\tC64Image\tPC64 Freezer Image\n\n0\tbeshort\t\t0x38CD\t\tC64 PCLink Image\n0\tstring\t\tCBM\\144\\0\\0\tPower 64 C64 Emulator Snapshot\n\n0\tbelong\t\t0xFF424CFF\tWRAptor packer (c64)\n\n0\tstring\t\tC64S\\x20tape\\x20file\tT64 tape Image\n>32\tleshort\t\tx\t\tVersion:0x%x\n>36\tleshort\t\t!0\t\tEntries:%i\n>40\tstring\t\tx\t\tName:%.24s\n\n0\tstring\t\tC64\\x20tape\\x20image\\x20file\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\tT64 tape Image\n>32\tleshort\t\tx\t\tVersion:0x%x\n>36\tleshort\t\t!0\t\tEntries:%i\n>40\tstring\t\tx\t\tName:%.24s\n\n0\tstring\t\tC64S\\x20tape\\x20image\\x20file\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\tT64 tape Image\n>32\tleshort\t\tx\t\tVersion:0x%x\n>36\tleshort\t\t!0\t\tEntries:%i\n>40\tstring\t\tx\t\tName:%.24s\n\n#------------------------------------------------------------------------------\n# autocad:  file(1) magic for cad files\n#\n\n# AutoCAD DWG versions R13/R14 (www.autodesk.com)\n# Written December 01, 2003 by Lester Hightower\n# Based on the DWG File Format Specifications at http://www.opendwg.org/\n0\tstring\t       \\101\\103\\061\\060\\061\t\t   AutoCAD\n>5\tstring\t       \\062\\000\\000\\000\\000\t\t   DWG ver. R13\n>5\tstring\t       \\064\\000\\000\\000\\000\t\t   DWG ver. R14\n\n# Microstation DGN/CIT Files (www.bentley.com)\n# Last updated July 29, 2005 by Lester Hightower\n# DGN is the default file extension of Microstation/Intergraph CAD files.\n# CIT is the proprietary raster format (similar to TIFF) used to attach\n# raster underlays to Microstation DGN (vector) drawings.\n# \n# http://www.wotsit.org/search.asp\n# http://filext.com/detaillist.php?extdetail=DGN\n# http://filext.com/detaillist.php?extdetail=CIT\n#\n# http://www.bentley.com/products/default.cfm?objectid=97F351F5-9C35-4E5E-89C2\n# 3F86C928&method=display&p_objectid=97F351F5-9C35-4E5E-89C280A93F86C928\n# http://www.bentley.com/products/default.cfm?objectid=A5C2FD43-3AC9-4C71-B682\n# 721C479F&method=display&p_objectid=A5C2FD43-3AC9-4C71-B682C7BE721C479F\n0\tstring\t\\010\\011\\376\t\t\tMicrostation\n>3\tstring\t\\002\n>>30\tstring\t\\026\\105\t\t\tDGNFile\n>>30\tstring\t\\034\\105\t\t\tDGNFile\n>>30\tstring\t\\073\\107\t\t\tDGNFile\n>>30\tstring\t\\073\\110\t\t\tDGNFile\n>>30\tstring\t\\106\\107\t\t\tDGNFile\n>>30\tstring\t\\110\\103\t\t\tDGNFile\n>>30\tstring\t\\120\\104\t\t\tDGNFile\n>>30\tstring\t\\172\\104\t\t\tDGNFile\n>>30\tstring\t\\172\\105\t\t\tDGNFile\n>>30\tstring\t\\172\\106\t\t\tDGNFile\n>>30\tstring\t\\234\\106\t\t\tDGNFile\n>>30\tstring\t\\273\\105\t\t\tDGNFile\n>>30\tstring\t\\306\\106\t\t\tDGNFile\n>>30\tstring\t\\310\\104\t\t\tDGNFile\n>>30\tstring\t\\341\\104\t\t\tDGNFile\n>>30\tstring\t\\372\\103\t\t\tDGNFile\n>>30\tstring\t\\372\\104\t\t\tDGNFile\n>>30\tstring\t\\372\\106\t\t\tDGNFile\n>>30\tstring\t\\376\\103\t\t\tDGNFile\n>4\tstring\t\\030\\000\\000\t\t\tCITFile\n>4\tstring\t\\030\\000\\003\t\t\tCITFile\n\n# AutoCad, from Nahuel Greco\n# AutoCAD DWG versions R12/R13/R14 (www.autodesk.com)\n0\tstring AC1012\tAutoCad (release 12)\n0\tstring AC1013\tAutoCad (release 13)\n0\tstring AC1014\tAutoCad (release 14)\n\n# CAD: file(1) magic for computer aided design files\n# Phillip Griffith <phillip dot griffith at gmail dot com>\n# AutoCAD magic taken from the Open Design Alliance's OpenDWG specifications.\n#\n0\tbelong\t0x08051700\tBentley/Intergraph MicroStation DGN cell library\n0\tbelong\t0x0809fe02\tBentley/Intergraph MicroStation DGN vector CAD\n0\tbelong\t0xc809fe02\tBentley/Intergraph MicroStation DGN vector CAD\n0\tbeshort\t0x0809\t\tBentley/Intergraph MicroStation\n>0x02\tbyte\t0xfe\n>>0x04\tbeshort\t0x1800\t\tCIT raster CAD\n0\tstring\tAC1012\t\tAutoDesk AutoCAD R13\n0\tstring\tAC1014\t\tAutoDesk AutoCAD R14 \n0\tstring\tAC1015\t\tAutoDesk AutoCAD R2000\n#------------------------------------------------------------------------------\n# Cafe Babes unite!\n#\n# Since Java bytecode and Mach-O fat-files have the same magic number, the test\n# must be performed in the same \"magic\" sequence to get both right.  The long\n# at offset 4 in a mach-O fat file tells the number of architectures; the short at\n# offset 4 in a Java bytecode file is the JVM minor version and the\n# short at offset 6 is the JVM major version.  Since there are only \n# only 18 labeled Mach-O architectures at current, and the first released \n# Java class format was version 43.0, we can safely choose any number\n# between 18 and 39 to test the number of architectures against\n# (and use as a hack). Let's not use 18, because the Mach-O people\n# might add another one or two as time goes by...\n#\n0\tbelong\t\t0xcafebabe\n!:mime\tapplication/x-java-applet\n>4\tbelong\t\t>30\t\tcompiled Java class data,\n>>6\tbeshort\t\tx\t        version %d.\n>>4\tbeshort\t\tx       \t\\b%d\n# Which is which?\n#>>4\tbelong\t\t0x032d\t\t(Java 1.0)\n#>>4\tbelong\t\t0x032d\t\t(Java 1.1)\n>>4\tbelong\t\t0x002e\t\t(Java 1.2)\n>>4\tbelong\t\t0x002f\t\t(Java 1.3)\n>>4\tbelong\t\t0x0030\t\t(Java 1.4)\n>>4\tbelong\t\t0x0031\t\t(Java 1.5)\n>>4\tbelong\t\t0x0032\t\t(Java 1.6)\n\n\n0\tbelong\t\t0xcafebabe\n>4\tbelong\t\t1\t\tMach-O fat file with 1 architecture\n>4\tbelong\t\t>1\n>>4\tbelong\t\t<20\t\tMach-O fat file with %ld architectures\n\n0\tbelong\t\t0xcafed00d\tJAR compressed with pack200,\n>>5\tbyte\t\tx\t\tversion %d.\n>>4\tbyte\t\tx\t\t\\b%d\n!:mime\tapplication/x-java-pack200\n#------------------------------------------------------------------------------\n# CDDB: file(1) magic for CDDB(tm) format CD text data files\n#\n# From <steve@gracenote.com>\n#\n# This is the /etc/magic entry to decode datafiles as used by\n# CDDB-enabled CD player applications.\n#\n\n0\tsearch/1/b\t#\\040xmcd\tCDDB(tm) format CD text data\n\n#------------------------------------------------------------------------------\n# chord: file(1) magic for Chord music sheet typesetting utility input files\n#\n# From Philippe De Muyter <phdm@macqel.be>\n# File format is actually free, but many distributed files begin with `{title'\n#\n0\tstring\t\t{title\t\tChord text file\n\n#------------------------------------------------------------------------------\n# cisco:  file(1) magic for cisco Systems routers\n#\n# Most cisco file-formats are covered by the generic elf code\n#\n# Microcode files are non-ELF, 0x8501 conflicts with NetBSD/alpha.\n0\tbelong&0xffffff00\t0x85011400  cisco IOS microcode\n>7\tstring\t\t>\\0\t\t    for '%s'\n0\tbelong&0xffffff00\t0x8501cb00  cisco IOS experimental microcode\n>7\tstring\t\t>\\0\t\t    for '%s'\n#------------------------------------------------------------------------------\n# citrus locale declaration\n#\n\n0\tstring\t\tRuneCT\t\tCitrus locale declaration for LC_CTYPE\n\n\n#------------------------------------------------------------------------------\n# clarion:  file(1) magic for # Clarion Personal/Professional Developer\n# (v2 and above)\n# From: Julien Blache <jb@jblache.org>\n\n# Database files\n# signature\n0\tleshort\t0x3343\tClarion Developer (v2 and above) data file\n# attributes\n>2\tleshort\t&0x0001\t\\b, locked\n>2\tleshort\t&0x0004\t\\b, encrypted\n>2\tleshort\t&0x0008\t\\b, memo file exists\n>2\tleshort\t&0x0010\t\\b, compressed\n>2\tleshort\t&0x0040\t\\b, read only\n# number of records\n>5\tlelong\tx\t\\b, %ld records\n\n# Memo files\n0\tleshort\t0x334d\tClarion Developer (v2 and above) memo data\n\n# Key/Index files\n# No magic? :(\n\n# Help files\n0\tleshort\t0x49e0\tClarion Developer (v2 and above) help data\n\n#------------------------------------------------------------------------------\n# claris:  file(1) magic for claris\n# \"H. Nanosecond\" <aldomel@ix.netcom.com>\n# Claris Works a word processor, etc.\n# Version 3.0\n\n# .pct claris works clip art files\n#0000000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\n#*\n#0001000 #010 250 377 377 377 377 000 213 000 230 000 021 002 377 014 000\n#null to byte 1000 octal\n514\tstring\t\\377\\377\\377\\377\\000\tClaris clip art?\n>0\tstring\t\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\tyes.\n514\tstring\t\\377\\377\\377\\377\\001\tClaris clip art?\n>0\tstring\t\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\tyes.\n\n# Claris works files\n# .cwk\n0\tstring\t\\002\\000\\210\\003\\102\\117\\102\\117\\000\\001\\206 Claris works document\n# .plt\n0\tstring\t\\020\\341\\000\\000\\010\\010\tClaris Works pallete files .plt\n\n# .msp a dictionary file I am not sure about this I have only one .msp file\n0\tstring\t\\002\\271\\262\\000\\040\\002\\000\\164\tClaris works dictionary\n\n# .usp are user dictionary bits\n# I am not sure about a magic header:\n#0000000 001 123 160 146 070 125 104 040 136 123 015 012 160 157 144 151\n#        soh   S   p   f   8   U   D  sp   ^   S  cr  nl   p   o   d   i\n#0000020 141 164 162 151 163 164 040 136 123 015 012 144 151 166 040 043\n#          a   t   r   i   s   t  sp   ^   S  cr  nl   d   i   v  sp   #\n\n# .mth Thesaurus\n# starts with \\0 but no magic header\n\n# .chy Hyphenation file\n# I am not sure: 000 210 034 000 000\n\n# other claris files\n#./windows/claris/useng.ndx: data\n#./windows/claris/xtndtran.l32: data\n#./windows/claris/xtndtran.lst: data\n#./windows/claris/clworks.lbl: data\n#./windows/claris/clworks.prf: data\n#./windows/claris/userd.spl: data\n\n#------------------------------------------------------------------------------\n# clipper:  file(1) magic for Intergraph (formerly Fairchild) Clipper.\n#\n# XXX - what byte order does the Clipper use?\n#\n# XXX - what's the \"!\" stuff:\n#\n# >18\tshort\t\t!074000,000000\tC1 R1 \n# >18\tshort\t\t!074000,004000\tC2 R1\n# >18\tshort\t\t!074000,010000\tC3 R1\n# >18\tshort\t\t!074000,074000\tTEST\n#\n# I shall assume it's ANDing the field with the first value and\n# comparing it with the second, and rewrite it as:\n#\n# >18\tshort&074000\t000000\t\tC1 R1 \n# >18\tshort&074000\t004000\t\tC2 R1\n# >18\tshort&074000\t010000\t\tC3 R1\n# >18\tshort&074000\t074000\t\tTEST\n#\n# as SVR3.1's \"file\" doesn't support anything of the \"!074000,000000\"\n# sort, nor does SunOS 4.x, so either it's something Intergraph added\n# in CLIX, or something AT&T added in SVR3.2 or later, or something\n# somebody else thought was a good idea; it's not documented in the\n# man page for this version of \"magic\", nor does it appear to be\n# implemented (at least not after I blew off the bogus code to turn\n# old-style \"&\"s into new-style \"&\"s, which just didn't work at all).\n#\n0\tshort\t\t0575\t\tCLIPPER COFF executable (VAX #)\n>20\tshort\t\t0407\t\t(impure)\n>20\tshort\t\t0410\t\t(5.2 compatible)\n>20\tshort\t\t0411\t\t(pure)\n>20\tshort\t\t0413\t\t(demand paged)\n>20\tshort\t\t0443\t\t(target shared library)\n>12\tlong\t\t>0\t\tnot stripped\n>22\tshort\t\t>0\t\t- version %ld\n0\tshort\t\t0577\t\tCLIPPER COFF executable\n>18\tshort&074000\t000000\t\tC1 R1 \n>18\tshort&074000\t004000\t\tC2 R1\n>18\tshort&074000\t010000\t\tC3 R1\n>18\tshort&074000\t074000\t\tTEST\n>20\tshort\t\t0407\t\t(impure)\n>20\tshort\t\t0410\t\t(pure)\n>20\tshort\t\t0411\t\t(separate I&D)\n>20\tshort\t\t0413\t\t(paged)\n>20\tshort\t\t0443\t\t(target shared library)\n>12\tlong\t\t>0\t\tnot stripped\n>22\tshort\t\t>0\t\t- version %ld\n>48\tlong&01\t\t01\t\talignment trap enabled\n>52\tbyte\t\t1\t\t-Ctnc\n>52\tbyte\t\t2\t\t-Ctsw\n>52\tbyte\t\t3\t\t-Ctpw\n>52\tbyte\t\t4\t\t-Ctcb\n>53\tbyte\t\t1\t\t-Cdnc\n>53\tbyte\t\t2\t\t-Cdsw\n>53\tbyte\t\t3\t\t-Cdpw\n>53\tbyte\t\t4\t\t-Cdcb\n>54\tbyte\t\t1\t\t-Csnc\n>54\tbyte\t\t2\t\t-Cssw\n>54\tbyte\t\t3\t\t-Cspw\n>54\tbyte\t\t4\t\t-Cscb\n4\tstring\t\tpipe\t\tCLIPPER instruction trace\n4\tstring\t\tprof\t\tCLIPPER instruction profile\n\n#------------------------------------------------------------------------------\n# commands:  file(1) magic for various shells and interpreters\n#\n#0\tstring\t\t:\t\t\tshell archive or script for antique kernel text\n0\tstring/b\t#!\\ /bin/sh\t\tPOSIX shell script text executable\n!:mime\ttext/x-shellscript\n0\tstring/b\t#!\\ /bin/csh\t\tC shell script text executable\n!:mime\ttext/x-shellscript\n# korn shell magic, sent by George Wu, gwu@clyde.att.com\n0\tstring/b\t#!\\ /bin/ksh\t\tKorn shell script text executable\n!:mime\ttext/x-shellscript\n0\tstring/b \t#!\\ /bin/tcsh\t\tTenex C shell script text executable\n!:mime\ttext/x-shellscript\n0\tstring/b \t#!\\ /usr/local/tcsh\tTenex C shell script text executable\n!:mime\ttext/x-shellscript\n0\tstring/b\t#!\\ /usr/local/bin/tcsh\tTenex C shell script text executable\n!:mime\ttext/x-shellscript\n\n#\n# zsh/ash/ae/nawk/gawk magic from cameron@cs.unsw.oz.au (Cameron Simpson)\n0\tstring/b\t#!\\ /bin/zsh\t\tPaul Falstad's zsh script text executable\n!:mime\ttext/x-shellscript\n0\tstring/b\t#!\\ /usr/bin/zsh\tPaul Falstad's zsh script text executable\n!:mime\ttext/x-shellscript\n0\tstring/b\t#!\\ /usr/local/bin/zsh\tPaul Falstad's zsh script text executable\n!:mime\ttext/x-shellscript\n0\tstring/b\t#!\\ /usr/local/bin/ash\tNeil Brown's ash script text executable\n!:mime\ttext/x-shellscript\n0\tstring/b\t#!\\ /usr/local/bin/ae\tNeil Brown's ae script text executable\n!:mime\ttext/x-shellscript\n0\tstring/b\t#!\\ /bin/nawk\t\tnew awk script text executable\n!:mime\ttext/x-nawk\n0\tstring/b\t#!\\ /usr/bin/nawk\tnew awk script text executable\n!:mime\ttext/x-nawk\n0\tstring/b\t#!\\ /usr/local/bin/nawk\tnew awk script text executable\n!:mime\ttext/x-nawk\n0\tstring/b\t#!\\ /bin/gawk\t\tGNU awk script text executable\n!:mime\ttext/x-gawk\n0\tstring/b\t#!\\ /usr/bin/gawk\tGNU awk script text executable\n!:mime\ttext/x-gawk\n0\tstring/b\t#!\\ /usr/local/bin/gawk\tGNU awk script text executable\n!:mime\ttext/x-gawk\n#\n0\tstring/b\t#!\\ /bin/awk\t\tawk script text executable\n!:mime\ttext/x-awk\n0\tstring/b\t#!\\ /usr/bin/awk\tawk script text executable\n!:mime\ttext/x-awk\n# update to distinguish from *.vcf files\n# this is broken because postscript has /EBEGIN{ for example.\n#0\tsearch/Bb\tBEGIN {\t\t\tawk script text\n\n# AT&T Bell Labs' Plan 9 shell\n0\tstring/b\t#!\\ /bin/rc\tPlan 9 rc shell script text executable\n\n# bash shell magic, from Peter Tobias (tobias@server.et-inf.fho-emden.de)\n0\tstring/b\t#!\\ /bin/bash\tBourne-Again shell script text executable\n!:mime\ttext/x-shellscript\n0\tstring/b\t#!\\ /usr/local/bin/bash\tBourne-Again shell script text executable\n!:mime\ttext/x-shellscript\n\n# using env\n0\tstring\t\t#!/usr/bin/env\t\ta\n>15\tstring\t\t>\\0\t\t\t%s script text executable\n0\tstring\t\t#!\\ /usr/bin/env\ta\n>16\tstring\t\t>\\0\t\t\t%s script text executable\n\n# PHP scripts\n# Ulf Harnhammar <ulfh@update.uu.se>\n0\tsearch/1/c\t=<?php\t\t\tPHP script text\n!:mime\ttext/x-php\n0\tsearch/1\t=<?\\n\t\t\tPHP script text\n!:mime\ttext/x-php\n0\tsearch/1\t=<?\\r\t\t\tPHP script text\n!:mime\ttext/x-php\n0\tsearch/1/b\t#!\\ /usr/local/bin/php\tPHP script text executable\n!:mime\ttext/x-php\n0\tsearch/1/b\t#!\\ /usr/bin/php\tPHP script text executable\n!:mime\ttext/x-php\n\n0\tstring\t\tZend\\x00\t\tPHP script Zend Optimizer data\n\n0\tstring\t\t$!\t\t\tDCL command file\n\n#----------------------------------------------------------------------------\n# communication\n\n# TTCN is the Tree and Tabular Combined Notation described in ISO 9646-3.\n# It is used for conformance testing of communication protocols.\n# Added by W. Borgert <debacle@debian.org>.\n0\tstring\t\t$Suite\t\t\tTTCN Abstract Test Suite\n>&1\tstring\t\t$SuiteId\n>>&1\tstring\t\t>\\n\t\t\t%s\n>&2\tstring\t\t$SuiteId\n>>&1\tstring\t\t>\\n\t\t\t%s\n>&3\tstring\t\t$SuiteId\n>>&1\tstring\t\t>\\n\t\t\t%s\n\n# MSC (message sequence charts) are a formal description technique,\n# described in ITU-T Z.120, mainly used for communication protocols.\n# Added by W. Borgert <debacle@debian.org>.\n0\tstring\t\tmscdocument\tMessage Sequence Chart (document)\n0\tstring\t\tmsc\t\tMessage Sequence Chart (chart)\n0\tstring\t\tsubmsc\t\tMessage Sequence Chart (subchart)\n\n#------------------------------------------------------------------------------\n# compress:  file(1) magic for pure-compression formats (no archives)\n#\n# compress, gzip, pack, compact, huf, squeeze, crunch, freeze, yabba, etc.\n#\n# Formats for various forms of compressed data\n# Formats for \"compress\" proper have been moved into \"compress.c\",\n# because it tries to uncompress it to figure out what's inside.\n\n# standard unix compress\n0\tstring\t\t\\037\\235\tcompress'd data\n!:mime\tapplication/x-compress\n!:apple\tLZIVZIVU\n>2\tbyte&0x80\t>0\t\tblock compressed\n>2\tbyte&0x1f\tx\t\t%d bits\n\n# gzip (GNU zip, not to be confused with Info-ZIP or PKWARE zip archiver)\n#   Edited by Chris Chittleborough <cchittleborough@yahoo.com.au>, March 2002\n#\t* Original filename is only at offset 10 if \"extra field\" absent\n#\t* Produce shorter output - notably, only report compression methods\n#\t  other than 8 (\"deflate\", the only method defined in RFC 1952).\n0       string          \\037\\213        gzip compressed data\n!:mime\tapplication/x-gzip\n>2\tbyte\t\t<8\t\t\\b, reserved method\n>2\tbyte\t\t>8\t\t\\b, unknown method\n>3\tbyte\t\t&0x01\t\t\\b, ASCII\n>3\tbyte\t\t&0x02\t\t\\b, has CRC\n>3\tbyte\t\t&0x04\t\t\\b, extra field\n>3\tbyte&0xC\t=0x08\n>>10\tstring\t\tx\t\t\\b, was \"%s\"\n>3\tbyte\t\t&0x10\t\t\\b, has comment\n>9\tbyte\t\t=0x00\t\t\\b, from FAT filesystem (MS-DOS, OS/2, NT)\n>9\tbyte\t\t=0x01\t\t\\b, from Amiga\n>9\tbyte\t\t=0x02\t\t\\b, from VMS\n>9\tbyte\t\t=0x03\t\t\\b, from Unix\n>9\tbyte\t\t=0x04\t\t\\b, from VM/CMS\n>9\tbyte\t\t=0x05\t\t\\b, from Atari\n>9\tbyte\t\t=0x06\t\t\\b, from HPFS filesystem (OS/2, NT)\n>9\tbyte\t\t=0x07\t\t\\b, from MacOS\n>9\tbyte\t\t=0x08\t\t\\b, from Z-System\n>9\tbyte\t\t=0x09\t\t\\b, from CP/M\n>9\tbyte\t\t=0x0A\t\t\\b, from TOPS/20\n>9\tbyte\t\t=0x0B\t\t\\b, from NTFS filesystem (NT)\n>9\tbyte\t\t=0x0C\t\t\\b, from QDOS\n>9\tbyte\t\t=0x0D\t\t\\b, from Acorn RISCOS\n>3\tbyte\t\t&0x10\t\t\\b, comment\n>3\tbyte\t\t&0x20\t\t\\b, encrypted\n>4\tledate\t\t>0\t\t\\b, last modified: %s\n>8\tbyte\t\t2\t\t\\b, max compression\n>8\tbyte\t\t4\t\t\\b, max speed\n\n# packed data, Huffman (minimum redundancy) codes on a byte-by-byte basis\n0\tstring\t\t\\037\\036\tpacked data\n!:mime\tapplication/octet-stream\n>2\tbelong\t\t>1\t\t\\b, %d characters originally\n>2\tbelong\t\t=1\t\t\\b, %d character originally\n#\n# This magic number is byte-order-independent.\n0\tshort\t\t0x1f1f\t\told packed data\n!:mime\tapplication/octet-stream\n\n# XXX - why *two* entries for \"compacted data\", one of which is\n# byte-order independent, and one of which is byte-order dependent?\n#\n0\tshort\t\t0x1fff\t\tcompacted data\n!:mime\tapplication/octet-stream\n# This string is valid for SunOS (BE) and a matching \"short\" is listed\n# in the Ultrix (LE) magic file.\n0\tstring\t\t\\377\\037\tcompacted data\n!:mime\tapplication/octet-stream\n0\tshort\t\t0145405\t\thuf output\n!:mime\tapplication/octet-stream\n\n# bzip2\n0\tstring\t\tBZh\t\tbzip2 compressed data\n!:mime\tapplication/x-bzip2\n>3\tbyte\t\t>47\t\t\\b, block size = %c00k\n\n# lzip\n0\tstring\t\tLZIP\t\tlzip compressed data\n!:mime application/x-lzip\n>4\tbyte\t\tx\t\t\\b, version: %d\n\n# squeeze and crunch\n# Michael Haardt <michael@cantor.informatik.rwth-aachen.de>\n0\tbeshort\t\t0x76FF\t\tsqueezed data,\n>4\tstring\t\tx\t\toriginal name %s\n0\tbeshort\t\t0x76FE\t\tcrunched data,\n>2\tstring\t\tx\t\toriginal name %s\n0\tbeshort\t\t0x76FD\t\tLZH compressed data,\n>2\tstring\t\tx\t\toriginal name %s\n\n# Freeze\n0\tstring\t\t\\037\\237\tfrozen file 2.1\n0\tstring\t\t\\037\\236\tfrozen file 1.0 (or gzip 0.5)\n\n# SCO compress -H (LZH)\n0\tstring\t\t\\037\\240\tSCO compress -H (LZH) data\n\n# European GSM 06.10 is a provisional standard for full-rate speech\n# transcoding, prI-ETS 300 036, which uses RPE/LTP (residual pulse\n# excitation/long term prediction) coding at 13 kbit/s.\n#\n# There's only a magic nibble (4 bits); that nibble repeats every 33\n# bytes.  This isn't suited for use, but maybe we can use it someday.\n#\n# This will cause very short GSM files to be declared as data and\n# mismatches to be declared as data too!\n#0\tbyte&0xF0\t0xd0\t\tdata\n#>33\tbyte&0xF0\t0xd0\n#>66\tbyte&0xF0\t0xd0\n#>99\tbyte&0xF0\t0xd0\n#>132\tbyte&0xF0\t0xd0\t\tGSM 06.10 compressed audio\n\n# bzip\ta block-sorting file compressor\n#\tby Julian Seward <sewardj@cs.man.ac.uk> and others\n#\n#0\tstring\t\tBZ\t\tbzip compressed data\n#>2\tbyte\t\tx\t\t\\b, version: %c\n#>3\tstring\t\t=1\t\t\\b, compression block size 100k\n#>3\tstring\t\t=2\t\t\\b, compression block size 200k\n#>3\tstring\t\t=3\t\t\\b, compression block size 300k\n#>3\tstring\t\t=4\t\t\\b, compression block size 400k\n#>3\tstring\t\t=5\t\t\\b, compression block size 500k\n#>3\tstring\t\t=6\t\t\\b, compression block size 600k\n#>3\tstring\t\t=7\t\t\\b, compression block size 700k\n#>3\tstring\t\t=8\t\t\\b, compression block size 800k\n#>3\tstring\t\t=9\t\t\\b, compression block size 900k\n\n# lzop from <markus.oberhumer@jk.uni-linz.ac.at>\n0\tstring\t\t\\x89\\x4c\\x5a\\x4f\\x00\\x0d\\x0a\\x1a\\x0a\tlzop compressed data\n>9\tbeshort\t\t<0x0940\n>>9\tbyte&0xf0\t=0x00\t\t- version 0.\n>>9\tbeshort&0x0fff\tx\t\t\\b%03x,\n>>13\tbyte\t\t1\t\tLZO1X-1,\n>>13\tbyte\t\t2\t\tLZO1X-1(15),\n>>13\tbyte\t\t3\t\tLZO1X-999,\n## >>22\tbedate\t\t>0\t\tlast modified: %s,\n>>14\tbyte\t\t=0x00\t\tos: MS-DOS\n>>14\tbyte\t\t=0x01\t\tos: Amiga\n>>14\tbyte\t\t=0x02\t\tos: VMS\n>>14\tbyte\t\t=0x03\t\tos: Unix\n>>14\tbyte\t\t=0x05\t\tos: Atari\n>>14\tbyte\t\t=0x06\t\tos: OS/2\n>>14\tbyte\t\t=0x07\t\tos: MacOS\n>>14\tbyte\t\t=0x0A\t\tos: Tops/20\n>>14\tbyte\t\t=0x0B\t\tos: WinNT\n>>14\tbyte\t\t=0x0E\t\tos: Win32\n>9\tbeshort\t\t>0x0939\n>>9\tbyte&0xf0\t=0x00\t\t- version 0.\n>>9\tbyte&0xf0\t=0x10\t\t- version 1.\n>>9\tbyte&0xf0\t=0x20\t\t- version 2.\n>>9\tbeshort&0x0fff\tx\t\t\\b%03x,\n>>15\tbyte\t\t1\t\tLZO1X-1,\n>>15\tbyte\t\t2\t\tLZO1X-1(15),\n>>15\tbyte\t\t3\t\tLZO1X-999,\n## >>25\tbedate\t\t>0\t\tlast modified: %s,\n>>17\tbyte\t\t=0x00\t\tos: MS-DOS\n>>17\tbyte\t\t=0x01\t\tos: Amiga\n>>17\tbyte\t\t=0x02\t\tos: VMS\n>>17\tbyte\t\t=0x03\t\tos: Unix\n>>17\tbyte\t\t=0x05\t\tos: Atari\n>>17\tbyte\t\t=0x06\t\tos: OS/2\n>>17\tbyte\t\t=0x07\t\tos: MacOS\n>>17\tbyte\t\t=0x0A\t\tos: Tops/20\n>>17\tbyte\t\t=0x0B\t\tos: WinNT\n>>17\tbyte\t\t=0x0E\t\tos: Win32\n\n# 4.3BSD-Quasijarus Strong Compression\n# http://minnie.tuhs.org/Quasijarus/compress.html\n0\tstring\t\t\\037\\241\tQuasijarus strong compressed data\n\n# From: Cory Dikkers <cdikkers@swbell.net>\n0\tstring\t\tXPKF\t\tAmiga xpkf.library compressed data\n0\tstring\t\tPP11\t\tPower Packer 1.1 compressed data\n0\tstring\t\tPP20\t\tPower Packer 2.0 compressed data,\n>4\tbelong\t\t0x09090909\tfast compression\n>4\tbelong\t\t0x090A0A0A\tmediocre compression\n>4\tbelong\t\t0x090A0B0B\tgood compression\n>4\tbelong\t\t0x090A0C0C\tvery good compression\n>4\tbelong\t\t0x090A0C0D\tbest compression\n\n# 7-zip archiver, from Thomas Klausner (wiz@danbala.tuwien.ac.at)\n# http://www.7-zip.org or DOC/7zFormat.txt \n#\n0\tstring\t\t7z\\274\\257\\047\\034\t7-zip archive data,\n>6\tbyte\t\tx\t\t\tversion %d\n>7\tbyte\t\tx\t\t\t\\b.%d\n\n# Type: LZMA\n# URL:  http://www.7-zip.org/sdk.html\n# From: Robert Millan <rmh@aybabtu.com> and Reuben Thomas <rrt@sc3d.org>\n# Commented out because apparently not reliable (according to Debian\n# bug #364260)\n#0\tstring\t\t]\\000\\000\\200\\000\tLZMA compressed data\n\n# http://tukaani.org/xz/xz-file-format.txt\n0\tustring\t\t\\xFD7zXZ\\x00\t\txz compressed data\n!:mime\tapplication/x-xz\n\n# AFX compressed files (Wolfram Kleff)\n2\tstring\t\t-afx-\t\tAFX compressed file data\n\n# Supplementary magic data for the file(1) command to support\n# rzip(1).  The format is described in magic(5).\n#\n# Copyright (C) 2003 by Andrew Tridgell.  You may do whatever you want with\n# this file.\n#\n0\tstring\t\tRZIP\t\trzip compressed data\n>4\tbyte\t\tx\t\t- version %d\n>5\tbyte\t\tx\t\t\\b.%d\n>6\tbelong\t\tx\t\t(%d bytes)\n\n# Type: XZ\n# URL: http://tukaani.org/xz/\n0\tstring\t\t\\xfd\\x37\\x7a\\x58\\x5a\\x00\tXZ compressed data\n!:mime application/x-xz\n#------------------------------------------------------------------------------\n# Console game magic\n# Toby Deshane <hac@shoelace.digivill.net>\n#    ines:  file(1) magic for Marat's iNES Nintendo Entertainment System\n#           ROM dump format\n\n0 string NES\\032 iNES ROM dump,\n>4 byte  x     %dx16k PRG\n>5 byte  x     \\b, %dx8k CHR\n>6 byte&0x01  =0x1  \\b, [Vert.]\n>6 byte&0x01  =0x0  \\b, [Horiz.]\n>6 byte&0x02  =0x2  \\b, [SRAM]\n>6 byte&0x04  =0x4  \\b, [Trainer]\n>6 byte&0x04  =0x8  \\b, [4-Scr]\n\n#------------------------------------------------------------------------------\n# gameboy:  file(1) magic for the Nintendo (Color) Gameboy raw ROM format\n#\n0x104 belong 0xCEED6666 Gameboy ROM:\n>0x134 string >\\0 \"%.16s\"\n>0x146 byte 0x03  \\b,[SGB]\n>0x147 byte 0x00  \\b, [ROM ONLY]\n>0x147 byte 0x01  \\b, [ROM+MBC1]\n>0x147 byte 0x02  \\b, [ROM+MBC1+RAM]\n>0x147 byte 0x03  \\b, [ROM+MBC1+RAM+BATT]\n>0x147 byte 0x05  \\b, [ROM+MBC2]\n>0x147 byte 0x06  \\b, [ROM+MBC2+BATTERY]\n>0x147 byte 0x08  \\b, [ROM+RAM]\n>0x147 byte 0x09  \\b, [ROM+RAM+BATTERY]\n>0x147 byte 0x0B  \\b, [ROM+MMM01]\n>0x147 byte 0x0C  \\b, [ROM+MMM01+SRAM]\n>0x147 byte 0x0D  \\b, [ROM+MMM01+SRAM+BATT]\n>0x147 byte 0x0F  \\b, [ROM+MBC3+TIMER+BATT]\n>0x147 byte 0x10  \\b, [ROM+MBC3+TIMER+RAM+BATT]\n>0x147 byte 0x11  \\b, [ROM+MBC3]\n>0x147 byte 0x12  \\b, [ROM+MBC3+RAM]\n>0x147 byte 0x13  \\b, [ROM+MBC3+RAM+BATT]\n>0x147 byte 0x19  \\b, [ROM+MBC5]\n>0x147 byte 0x1A  \\b, [ROM+MBC5+RAM]\n>0x147 byte 0x1B  \\b, [ROM+MBC5+RAM+BATT]\n>0x147 byte 0x1C  \\b, [ROM+MBC5+RUMBLE]\n>0x147 byte 0x1D  \\b, [ROM+MBC5+RUMBLE+SRAM]\n>0x147 byte 0x1E  \\b, [ROM+MBC5+RUMBLE+SRAM+BATT]\n>0x147 byte 0x1F  \\b, [Pocket Camera]\n>0x147 byte 0xFD  \\b, [Bandai TAMA5]\n>0x147 byte 0xFE  \\b, [Hudson HuC-3]\n>0x147 byte 0xFF  \\b, [Hudson HuC-1]\n\n>0x148 byte 0     \\b, ROM: 256Kbit\n>0x148 byte 1     \\b, ROM: 512Kbit\n>0x148 byte 2     \\b, ROM: 1Mbit\n>0x148 byte 3     \\b, ROM: 2Mbit\n>0x148 byte 4     \\b, ROM: 4Mbit\n>0x148 byte 5     \\b, ROM: 8Mbit\n>0x148 byte 6     \\b, ROM: 16Mbit\n>0x148 byte 0x52  \\b, ROM: 9Mbit\n>0x148 byte 0x53  \\b, ROM: 10Mbit\n>0x148 byte 0x54  \\b, ROM: 12Mbit\n\n>0x149 byte 1     \\b, RAM: 16Kbit\n>0x149 byte 2     \\b, RAM: 64Kbit\n>0x149 byte 3     \\b, RAM: 128Kbit\n>0x149 byte 4     \\b, RAM: 1Mbit\n\n#>0x14e long  x     \\b, CRC: %x\n\n#------------------------------------------------------------------------------\n# genesis:  file(1) magic for the Sega MegaDrive/Genesis raw ROM format\n#\n0x100 string SEGA  Sega MegaDrive/Genesis raw ROM dump\n>0x120 string >\\0 Name: \"%.16s\"\n>0x110 string >\\0 %.16s\n>0x1B0 string RA with SRAM\n\n#------------------------------------------------------------------------------\n# genesis:  file(1) magic for the Super MegaDrive ROM dump format\n#\n0x280 string EAGN  Super MagicDrive ROM dump\n>0 byte x %dx16k blocks\n>2 byte 0 \\b, last in series or standalone\n>2 byte >0 \\b, split ROM\n>8 byte 0xAA\n>9 byte 0xBB\n\n#------------------------------------------------------------------------------\n# genesis:  file(1) alternate magic for the Super MegaDrive ROM dump format\n#\n0x280 string EAMG  Super MagicDrive ROM dump\n>0 byte x %dx16k blocks\n>2 byte x \\b, last in series or standalone\n>8 byte 0xAA\n>9 byte 0xBB\n\n#------------------------------------------------------------------------------\n# smsgg:  file(1) magic for Sega Master System and Game Gear ROM dumps\n#\n# Does not detect all images.  Very preliminary guesswork.  Need more data\n# on format.\n#\n# FIXME: need a little more info...;P\n#\n#0 byte 0xF3\n#>1 byte 0xED  Sega Master System/Game Gear ROM dump\n#>1 byte 0x31  Sega Master System/Game Gear ROM dump\n#>1 byte 0xDB  Sega Master System/Game Gear ROM dump\n#>1 byte 0xAF  Sega Master System/Game Gear ROM dump\n#>1 byte 0xC3  Sega Master System/Game Gear ROM dump\n\n#------------------------------------------------------------------------------\n# dreamcast:  file(1) uncertain magic for the Sega Dreamcast VMU image format\n#\n0 belong 0x21068028   Sega Dreamcast VMU game image\n0 string LCDi         Dream Animator file\n\n#------------------------------------------------------------------------------\n# v64: file(1) uncertain magic for the V64 format N64 ROM dumps\n#\n0 belong 0x37804012    V64 Nintendo 64 ROM dump\n\n# From: \"Nelson A. de Oliveira\" <naoliv@gmail.com>\n# Nintendo .nds\n192\tstring\t\\044\\377\\256Qi\\232\tNintendo DS Game ROM Image\n# Nintendo .gba\n0\tstring\t\\056\\000\\000\\352$\\377\\256Qi\tNintendo Game Boy Advance ROM Image\n\n#------------------------------------------------------------------------------\n# msx: file(1) magic for MSX game cartridge dumps\n# Too simple - MPi\n#0 beshort 0x4142 MSX game cartridge dump \n\n#------------------------------------------------------------------------------\n# Sony Playstation executables (Adam Sjoegren <asjo@diku.dk>) :\n0\tstring\tPS-X\\ EXE\tSony Playstation executable\n#  Area:\n>113\tstring\tx\t\t(%s)\n\n#------------------------------------------------------------------------------\n# Microsoft Xbox executables .xbe (Esa Hyytiä <ehyytia@cc.hut.fi>)\n0       string          XBEH            XBE, Microsoft Xbox executable\n# probabilistic checks whether signed or not\n>0x0004 ulelong =0x0\n>>&2    ulelong =0x0\n>>>&2   ulelong =0x0  \\b, not signed\n>0x0004 ulelong >0\n>>&2    ulelong >0\n>>>&2   ulelong >0    \\b, signed\n# expect base address of 0x10000\n>0x0104               ulelong =0x10000\n>>(0x0118-0x0FF60)    ulelong&0x80000007  0x80000007 \\b, all regions\n>>(0x0118-0x0FF60)    ulelong&0x80000007  !0x80000007\n>>>(0x0118-0x0FF60)   ulelong >0           (regions:\n>>>>(0x0118-0x0FF60)  ulelong &0x00000001  NA\n>>>>(0x0118-0x0FF60)  ulelong &0x00000002  Japan\n>>>>(0x0118-0x0FF60)  ulelong &0x00000004  Rest_of_World\n>>>>(0x0118-0x0FF60)  ulelong &0x80000000  Manufacturer\n>>>(0x0118-0x0FF60)   ulelong >0           \\b)\n\n# --------------------------------\n# Microsoft Xbox data file formats\n0       string          XIP0            XIP, Microsoft Xbox data\n0       string          XTF0            XTF, Microsoft Xbox data\n\n# Atari Lynx cartridge dump (EXE/BLL header)\n# From: \"Stefan A. Haubenthal\" <polluks@web.de>\n\n0\tbeshort\t\t0x8008\t\tLynx cartridge,\n>2\tbeshort\t\tx\t\tRAM start $%04x\n>6\tstring\t\tBS93\n\n# Opera file system that is used on the 3DO console\n# From: Serge van den Boom <svdb@stack.nl>\n0\tstring\t\t\\x01ZZZZZ\\x01\t3DO \"Opera\" file system\n\n# From Gürkan Sengün <gurkan@linuks.mine.nu>, www.linuks.mine.nu\n0\tstring\t\tGBS\t\tNintendo Gameboy Music/Audio Data\n12\tstring\t\tGameBoy\\ Music\\ Module\tNintendo Gameboy Music Module\n\n# Playstations Patch Files from: From: Thomas Klausner <tk@giga.or.at>\n0\tstring\tPPF30\t\t\tPlaystation Patch File version 3.0\n>5\tbyte\t0\t\t\t\\b, PPF 1.0 patch\n>5\tbyte\t1\t\t\t\\b, PPF 2.0 patch\n>5\tbyte\t2\t\t\t\\b, PPF 3.0 patch\n>>56\tbyte\t0\t\t\t\\b, Imagetype BIN (any)\n>>56\tbyte\t1\t\t\t\\b, Imagetype GI (PrimoDVD)\n>>57\tbyte\t0\t\t\t\\b, Blockcheck disabled\n>>57\tbyte\t1\t\t\t\\b, Blockcheck enabled\n>>58\tbyte\t0\t\t\t\\b, Undo data not available\n>>58\tbyte\t1\t\t\t\\b, Undo data available\n>6\tstring\tx\t\t\t\\b, description: %s\n\n0\tstring\tPPF20\t\t\tPlaystation Patch File version 2.0\n>5\tbyte\t0\t\t\t\\b, PPF 1.0 patch\n>5\tbyte\t1\t\t\t\\b, PPF 2.0 patch\n>>56\tlelong\t>0\t\t\t\\b, size of file to patch %d\n>6\tstring\tx\t\t\t\\b, description: %s\n\n0\tstring\tPPF10\t\t\tPlaystation Patch File version 1.0\n>5\tbyte\t0\t\t\t\\b, Simple Encoding\n>6\tstring\tx\t\t\t\\b, description: %s\n\n# From: Daniel Dawson <ddawson@icehouse.net>\n# SNES9x .smv \"movie\" file format.\n0\t\tstring\t\tSMV\\x1A\tSNES9x input recording\n>0x4\t\tlelong\t\tx\t\\b, version %d\n# version 4 is latest so far \n>0x4\t\tlelong\t\t<5\n>>0x8\t\tledate\t\tx\t\\b, recorded at %s\n>>0xc\t\tlelong\t\t>0\t\\b, rerecorded %d times\n>>0x10\t\tlelong\t\tx\t\\b, %d frames long\n>>0x14\t\tbyte\t\t>0\t\\b, data for controller(s):\n>>>0x14\t\tbyte\t\t&0x1\t#1\n>>>0x14\t\tbyte\t\t&0x2\t#2\n>>>0x14\t\tbyte\t\t&0x4\t#3\n>>>0x14\t\tbyte\t\t&0x8\t#4\n>>>0x14\t\tbyte\t\t&0x10\t#5\n>>0x15\t\tbyte\t\t^0x1\t\\b, begins from snapshot\n>>0x15\t\tbyte\t\t&0x1\t\\b, begins from reset\n>>0x15\t\tbyte\t\t^0x2\t\\b, NTSC standard\n>>0x15\t\tbyte\t\t&0x2\t\\b, PAL standard\n>>0x17\t\tbyte\t\t&0x1    \\b, settings:\n# WIP1Timing not used as of version 4\n>>>0x4\t\tlelong\t\t<4\n>>>>0x17\tbyte\t\t&0x2\tWIP1Timing\n>>>0x17\t\tbyte\t\t&0x4\tLeft+Right\n>>>0x17\t\tbyte\t\t&0x8\tVolumeEnvX\n>>>0x17\t\tbyte\t\t&0x10\tFakeMute\n>>>0x17\t\tbyte\t\t&0x20\tSyncSound\n# New flag as of version 4\n>>>0x4\t\tlelong\t\t>3\n>>>>0x17\tbyte\t\t&0x80\tNoCPUShutdown\n>>0x4\t\tlelong\t\t<4\n>>>0x18\t\tlelong\t\t>0x23\n>>>>0x20\tleshort\t\t!0\n>>>>>0x20\tlestring16\tx\t\\b, metadata: \"%s\"\n>>0x4\t\tlelong\t\t>3\n>>>0x24\t\tbyte\t\t>0\t\\b, port 1:\n>>>>0x24\tbyte\t\t1\tjoypad\n>>>>0x24\tbyte\t\t2\tmouse\n>>>>0x24\tbyte\t\t3\tSuperScope\n>>>>0x24\tbyte\t\t4\tJustifier\n>>>>0x24\tbyte\t\t5\tmultitap\n>>>0x24\t\tbyte\t\t>0\t\\b, port 2:\n>>>>0x25\tbyte\t\t1\tjoypad\n>>>>0x25\tbyte\t\t2\tmouse\n>>>>0x25\tbyte\t\t3\tSuperScope\n>>>>0x25\tbyte\t\t4\tJustifier\n>>>>0x25\tbyte\t\t5\tmultitap\n>>>0x18\t\tlelong\t\t>0x43\n>>>>0x40\tleshort\t\t!0\n>>>>>0x40\tlestring16\tx\t\\b, metadata: \"%s\"\n>>0x17\t\tbyte\t\t&0x40   \\b, ROM:\n>>>(0x18.l-26)\tlelong\t\tx\tCRC32 0x%08x\n>>>(0x18.l-23)\tstring\t\tx\t\"%s\"\n\n#------------------------------------------------------------------------------\n# convex:  file(1) magic for Convex boxes\n#\n# Convexes are big-endian.\n#\n# /*\\\n#  * Below are the magic numbers and tests added for Convex.\n#  * Added at beginning, because they are expected to be used most.\n# \\*/\n0\tbelong\t0507\tConvex old-style object\n>16\tbelong\t>0\tnot stripped\n0\tbelong\t0513\tConvex old-style demand paged executable\n>16\tbelong\t>0\tnot stripped\n0\tbelong\t0515\tConvex old-style pre-paged executable\n>16\tbelong\t>0\tnot stripped\n0\tbelong\t0517\tConvex old-style pre-paged, non-swapped executable\n>16\tbelong\t>0\tnot stripped\n0\tbelong\t0x011257\tCore file\n#\n# The following are a series of dump format magic numbers.  Each one\n# corresponds to a drastically different dump format.  The first on is\n# the original dump format on a 4.1 BSD or earlier file system.  The\n# second marks the change between the 4.1 file system and the 4.2 file\n# system.  The Third marks the changing of the block size from 1K\n# to 2K to be compatible with an IDC file system.  The fourth indicates\n# a dump that is dependent on Convex Storage Manager, because data in\n# secondary storage is not physically contained within the dump.\n# The restore program uses these number to determine how the data is\n# to be extracted.\n#\n24\tbelong\t=60011\tdump format, 4.1 BSD or earlier\n24\tbelong\t=60012\tdump format, 4.2 or 4.3 BSD without IDC\n24\tbelong\t=60013\tdump format, 4.2 or 4.3 BSD (IDC compatible)\n24\tbelong\t=60014\tdump format, Convex Storage Manager by-reference dump\n#\n# what follows is a bunch of bit-mask checks on the flags field of the opthdr.\n# If there is no `=' sign, assume just checking for whether the bit is set?\n#\n0\tbelong\t0601\t\tConvex SOFF\n>88\tbelong&0x000f0000\t=0x00000000\tc1\n>88\tbelong\t\t\t&0x00010000\tc2\n>88\tbelong\t\t\t&0x00020000\tc2mp\n>88\tbelong\t\t\t&0x00040000\tparallel\n>88\tbelong\t\t\t&0x00080000\tintrinsic\n>88\tbelong\t\t\t&0x00000001\tdemand paged\n>88\tbelong\t\t\t&0x00000002\tpre-paged\n>88\tbelong\t\t\t&0x00000004\tnon-swapped\n>88\tbelong\t\t\t&0x00000008\tPOSIX\n#\n>84\tbelong\t\t\t&0x80000000\texecutable\n>84\tbelong\t\t\t&0x40000000\tobject\n>84\tbelong&0x20000000\t=0\t\tnot stripped\n>84\tbelong&0x18000000\t=0x00000000\tnative fpmode\n>84\tbelong&0x18000000\t=0x10000000\tieee fpmode\n>84\tbelong&0x18000000\t=0x18000000\tundefined fpmode\n#\n0\tbelong\t\t\t0605\t\tConvex SOFF core\n#\n0\tbelong\t\t\t0607\t\tConvex SOFF checkpoint\n>88\tbelong&0x000f0000\t=0x00000000\tc1\n>88\tbelong\t\t\t&0x00010000\tc2\n>88\tbelong\t\t\t&0x00020000\tc2mp\n>88\tbelong\t\t\t&0x00040000\tparallel\n>88\tbelong\t\t\t&0x00080000\tintrinsic\n>88\tbelong\t\t\t&0x00000008\tPOSIX\n#\n>84\tbelong&0x18000000\t=0x00000000\tnative fpmode\n>84\tbelong&0x18000000\t=0x10000000\tieee fpmode\n>84\tbelong&0x18000000\t=0x18000000\tundefined fpmode\n\n#------------------------------------------------------------------------------\n# cracklib:  file (1) magic for cracklib v2.7\n\n0\tlelong\t0x70775631\tCracklib password index, little endian\n>4\tlong\t>0\t\t(%i words)\n>4\tlong\t0\t\t(\"64-bit\")\n>>8\tlong\t>-1\t\t(%i words)\n0\tbelong\t0x70775631\tCracklib password index, big endian\n>4\tbelong\t>-1\t\t(%i words)\n# really bellong 0x0000000070775631\n0\tsearch/1\t\\0\\0\\0\\0pwV1\tCracklib password index, big endian (\"64-bit\")\n>12\tbelong\t>0\t\t(%i words)\n# ----------------------------------------------------------------------------\n# ctags:  file (1) magic for Exuberant Ctags files\n# From: Alexander Mai <mai@migdal.ikp.physik.tu-darmstadt.de>\n0\tsearch/1\t=!_TAG\tExuberant Ctags tag file text\n\n#------------------------------------------------------------------------------\n# dact:  file(1) magic for DACT compressed files\n#\n0\tlong\t\t0x444354C3\tDACT compressed data\n>4\tbyte\t\t>-1\t\t(version %i.\n>5\tbyte\t\t>-1\t\t$BS%i.\n>6\tbyte\t\t>-1\t\t$BS%i)\n>7\tlong\t\t>0\t\t$BS, original size: %i bytes\n>15\tlong\t\t>30\t\t$BS, block size: %i bytes\n\n#------------------------------------------------------------------------------\n# database:  file(1) magic for various databases\n#\n# extracted from header/code files by Graeme Wilford (eep2gw@ee.surrey.ac.uk)\n#\n#\n# GDBM magic numbers\n#  Will be maintained as part of the GDBM distribution in the future.\n#  <downsj@teeny.org>\n0\tbelong\t0x13579ace\tGNU dbm 1.x or ndbm database, big endian\n!:mime\tapplication/x-gdbm\n0\tlelong\t0x13579ace\tGNU dbm 1.x or ndbm database, little endian\n!:mime\tapplication/x-gdbm\n0\tstring\tGDBM\t\tGNU dbm 2.x database\n!:mime\tapplication/x-gdbm\n#\n# Berkeley DB\n#\n# Ian Darwin's file /etc/magic files: big/little-endian version.\n#\n# Hash 1.85/1.86 databases store metadata in network byte order.\n# Btree 1.85/1.86 databases store the metadata in host byte order.\n# Hash and Btree 2.X and later databases store the metadata in host byte order.\n\n0\tlong\t0x00061561\tBerkeley DB\n!:mime\tapplication/x-dbm\n>8\tbelong\t4321\n>>4\tbelong\t>2\t\t1.86\n>>4\tbelong\t<3\t\t1.85\n>>4\tbelong\t>0\t\t(Hash, version %d, native byte-order)\n>8\tbelong\t1234\n>>4\tbelong\t>2\t\t1.86\n>>4\tbelong\t<3\t\t1.85\n>>4\tbelong\t>0\t\t(Hash, version %d, little-endian)\n\n0\tbelong\t0x00061561\tBerkeley DB\n>8\tbelong\t4321\n>>4\tbelong\t>2\t\t1.86\n>>4\tbelong\t<3\t\t1.85\n>>4\tbelong\t>0\t\t(Hash, version %d, big-endian)\n>8\tbelong\t1234\n>>4\tbelong\t>2\t\t1.86\n>>4\tbelong\t<3\t\t1.85\n>>4\tbelong\t>0\t\t(Hash, version %d, native byte-order)\n\n0\tlong\t0x00053162\tBerkeley DB 1.85/1.86\n>4\tlong\t>0\t\t(Btree, version %d, native byte-order)\n0\tbelong\t0x00053162\tBerkeley DB 1.85/1.86\n>4\tbelong\t>0\t\t(Btree, version %d, big-endian)\n0\tlelong\t0x00053162\tBerkeley DB 1.85/1.86\n>4\tlelong\t>0\t\t(Btree, version %d, little-endian)\n\n12\tlong\t0x00061561\tBerkeley DB\n>16\tlong\t>0\t\t(Hash, version %d, native byte-order)\n12\tbelong\t0x00061561\tBerkeley DB\n>16\tbelong\t>0\t\t(Hash, version %d, big-endian)\n12\tlelong\t0x00061561\tBerkeley DB\n>16\tlelong\t>0\t\t(Hash, version %d, little-endian)\n\n12\tlong\t0x00053162\tBerkeley DB\n>16\tlong\t>0\t\t(Btree, version %d, native byte-order)\n12\tbelong\t0x00053162\tBerkeley DB\n>16\tbelong\t>0\t\t(Btree, version %d, big-endian)\n12\tlelong\t0x00053162\tBerkeley DB\n>16\tlelong\t>0\t\t(Btree, version %d, little-endian)\n\n12\tlong\t0x00042253\tBerkeley DB\n>16\tlong\t>0\t\t(Queue, version %d, native byte-order)\n12\tbelong\t0x00042253\tBerkeley DB\n>16\tbelong\t>0\t\t(Queue, version %d, big-endian)\n12\tlelong\t0x00042253\tBerkeley DB\n>16\tlelong\t>0\t\t(Queue, version %d, little-endian)\n\n# From Max Bowsher.\n12\tlong\t0x00040988\tBerkeley DB\n>16\tlong\t>0\t\t(Log, version %d, native byte-order)\n12\tbelong\t0x00040988\tBerkeley DB \n>16\tbelong\t>0\t\t(Log, version %d, big-endian)\n12\tlelong\t0x00040988\tBerkeley DB\n>16\tlelong\t>0\t\t(Log, version %d, little-endian)\n\n#\n#\n# Round Robin Database Tool by Tobias Oetiker <oetiker@ee.ethz.ch>\n0\tstring\tRRD\t\tRRDTool DB\n>4\tstring\tx\t\tversion %s\n#----------------------------------------------------------------------\n# ROOT: file(1) magic for ROOT databases\n#\n0       string  root\\0  ROOT file\n>4      belong  x       Version %d\n>33     belong  x       (Compression: %d)\n\n# XXX: Weak magic.\n# Alex Ott <ott@jet.msk.su>\n## Paradox file formats\n#2\t  leshort\t0x0800\tParadox \n#>0x39\t  byte\t\t3\tv. 3.0 \n#>0x39\t  byte\t\t4\tv. 3.5 \n#>0x39\t  byte\t\t9\tv. 4.x \n#>0x39\t  byte\t\t10\tv. 5.x \n#>0x39\t  byte\t\t11\tv. 5.x \n#>0x39\t  byte\t\t12\tv. 7.x \n#>>0x04\t  byte\t\t0\tindexed .DB data file \n#>>0x04\t  byte\t\t1\tprimary index .PX file \n#>>0x04\t  byte\t\t2\tnon-indexed .DB data file \n#>>0x04\t  byte\t\t3\tnon-incrementing secondary index .Xnn file \n#>>0x04\t  byte\t\t4\tsecondary index .Ynn file \n#>>0x04\t  byte\t\t5\tincrementing secondary index .Xnn file \n#>>0x04\t  byte\t\t6\tnon-incrementing secondary index .XGn file \n#>>0x04\t  byte\t\t7\tsecondary index .YGn file \n#>>>0x04\t  byte\t\t8\tincrementing secondary index .XGn file \n\n## XBase database files\n#0      byte       0x02\t\n#>8     leshort\t  >0\n#>>12   leshort    0\tFoxBase \n#!:mime\tapplication/x-dbf\n#>>>0x04\tlelong\t\t0\t\t(no records)\n#>>>0x04\tlelong\t\t>0\t\t(%ld records)\n#\n#0      byte       0x03\t\n#!:mime\tapplication/x-dbf\n#>8     leshort\t  >0\n#>>12   leshort    0\tFoxBase+, FoxPro, dBaseIII+, dBaseIV, no memo \n#>>>0x04\tlelong\t\t0\t\t(no records)\n#>>>0x04\tlelong\t\t>0\t\t(%ld records)\n#\n#0      byte       0x04\t\n#!:mime\tapplication/x-dbf\n#>8     leshort\t  >0\n#>>12   leshort    0\tdBASE IV no memo file \n#>>>0x04\tlelong\t\t0\t\t(no records)\n#>>>0x04\tlelong\t\t>0\t\t(%ld records)\n#\n#0      byte       0x05\t\n#!:mime\tapplication/x-dbf\n#>8     leshort\t  >0\n#>>12   leshort    0\tdBASE V no memo file \n#>>>0x04\tlelong\t\t0\t\t(no records)\n#>>>0x04\tlelong\t\t>0\t\t(%ld records)\n#\n#0      byte       0x30\n#!:mime\tapplication/x-dbf\n#>8     leshort\t  >0\n#>>12   leshort    0\tVisual FoxPro \n#>>>0x04\tlelong\t\t0\t\t(no records)\n#>>>0x04\tlelong\t\t>0\t\t(%ld records)\n#\n#0      byte       0x43\n#!:mime\tapplication/x-dbf\n#>8     leshort\t  >0\n#>>12   leshort    0\tFlagShip with memo var size \n#>>>0x04\tlelong\t\t0\t\t(no records)\n#>>>0x04\tlelong\t\t>0\t\t(%ld records)\n#\n#0      byte       0x7b\n#!:mime\tapplication/x-dbf\n#>8     leshort\t  >0\n#>>12   leshort    0\tdBASEIV with memo \n#>>>0x04\tlelong\t\t0\t\t(no records)\n#>>>0x04\tlelong\t\t>0\t\t(%ld records)\n#\n#0      byte       0x83\t\n#!:mime\tapplication/x-dbf\n#>8     leshort\t  >0\n#>>12   leshort    0\tFoxBase+, dBaseIII+ with memo \n#>>>0x04\tlelong\t\t0\t\t(no records)\n#>>>0x04\tlelong\t\t>0\t\t(%ld records)\n#\n#0      byte       0x8b\n#!:mime\tapplication/x-dbf\n#>8     leshort\t  >0\n#>>12   leshort    0\tdBaseIV with memo \n#>>>0x04\tlelong\t\t0\t\t(no records)\n#>>>0x04\tlelong\t\t>0\t\t(%ld records)\n#\n#0      byte       0x8e\t\n#!:mime\tapplication/x-dbf\n#>8     leshort\t  >0\n#>>12   leshort    0\tdBaseIV with SQL Table \n#>>>0x04\tlelong\t\t0\t\t(no records)\n#>>>0x04\tlelong\t\t>0\t\t(%ld records)\n#\n#0      byte       0xb3\n#!:mime\tapplication/x-dbf\n#>8     leshort\t  >0\n#>>12   leshort    0\tFlagShip with .dbt memo \n#>>>0x04\tlelong\t\t0\t\t(no records)\n#>>>0x04\tlelong\t\t>0\t\t(%ld records)\n#\n#0      byte       0xf5\n#!:mime\tapplication/x-dbf\n#>8     leshort\t  >0\n#>>12   leshort    0\tFoxPro with memo \n#>>>0x04\tlelong\t\t0\t\t(no records)\n#>>>0x04\tlelong\t\t>0\t\t(%ld records)\n#\n#0\tleshort\t\t0x0006\t\tDBase 3 index file\n\n# MS Access database\n4\tstring\tStandard\\ Jet\\ DB\tMicrosoft Access Database\n!:mime\tapplication/x-msaccess\n\n# TDB database from Samba et al - Martin Pool <mbp@samba.org>\n0\tstring\tTDB\\ file\t\tTDB database\n>32\tlelong\t0x2601196D\t\tversion 6, little-endian\n>>36\tlelong\tx\t\t\thash size %d bytes\n\n# SE Linux policy database\n0       lelong  0xf97cff8c      SE Linux policy\n>16     lelong  x               v%d\n>20     lelong  1      MLS\n>24     lelong  x       %d symbols\n>28     lelong  x       %d ocons\n\n# ICE authority file data (Wolfram Kleff)\n2\tstring\t\tICE\t\tICE authority data\n\n# X11 Xauthority file (Wolfram Kleff)\n10\tstring\t\tMIT-MAGIC-COOKIE-1\tX11 Xauthority data\n11\tstring\t\tMIT-MAGIC-COOKIE-1\tX11 Xauthority data\n12\tstring\t\tMIT-MAGIC-COOKIE-1\tX11 Xauthority data\n13\tstring\t\tMIT-MAGIC-COOKIE-1\tX11 Xauthority data\n14\tstring\t\tMIT-MAGIC-COOKIE-1\tX11 Xauthority data\n15\tstring\t\tMIT-MAGIC-COOKIE-1\tX11 Xauthority data\n16\tstring\t\tMIT-MAGIC-COOKIE-1\tX11 Xauthority data\n17\tstring\t\tMIT-MAGIC-COOKIE-1\tX11 Xauthority data\n18\tstring\t\tMIT-MAGIC-COOKIE-1\tX11 Xauthority data\n\n# From: Maxime Henrion <mux@FreeBSD.org>\n# PostgreSQL's custom dump format, Maxime Henrion <mux@FreeBSD.org>\n0\tstring\t\tPGDMP\t\tPostgreSQL custom database dump\n>5\tbyte\t\tx\t\t- v%d\n>6\tbyte\t\tx\t\t\\b.%d\n>5\tbeshort\t\t<0x101\t\t\\b-0\n>5\tbeshort\t\t>0x100\n>>7\tbyte\t\tx\t\t\\b-%d\n\n# Type: Advanced Data Format (ADF) database\n# URL:  http://www.grc.nasa.gov/WWW/cgns/adf/\n# From: Nicolas Chauvat <nicolas.chauvat@logilab.fr>\n0\tstring\t@(#)ADF\\ Database\tCGNS Advanced Data Format\n\n# Tokyo Cabinet magic data\n# http://tokyocabinet.sourceforge.net/index.html\n0\tstring\t\tToKyO\\ CaBiNeT\\n\tTokyo Cabinet\n>14\tstring\t\tx\t\t\t\\b (%s)\n>32\tbyte\t\t0\t\t\t\\b, Hash\n!:mime\tapplication/x-tokyocabinet-hash\n>32\tbyte\t\t1\t\t\t\\b, B+ tree\n!:mime\tapplication/x-tokyocabinet-btree\n>32\tbyte\t\t2\t\t\t\\b, Fixed-length\n!:mime\tapplication/x-tokyocabinet-fixed\n>32\tbyte\t\t3\t\t\t\\b, Table\n!:mime\tapplication/x-tokyocabinet-table\n>33\tbyte\t\t&1\t\t\t\\b, [open]\n>33\tbyte\t\t&2\t\t\t\\b, [fatal]\n>34\tbyte\t\tx\t\t\t\\b, apow=%d\n>35\tbyte\t\tx\t\t\t\\b, fpow=%d\n>36\tbyte\t\t&0x01\t\t\t\\b, [large]\n>36\tbyte\t\t&0x02\t\t\t\\b, [deflate]\n>36\tbyte\t\t&0x04\t\t\t\\b, [bzip]\n>36\tbyte\t\t&0x08\t\t\t\\b, [tcbs]\n>36\tbyte\t\t&0x10\t\t\t\\b, [excodec]\n>40\tlequad\t\tx\t\t\t\\b, bnum=%lld\n>48\tlequad\t\tx\t\t\t\\b, rnum=%lld\n>56\tlequad\t\tx\t\t\t\\b, fsiz=%lld\n\n#------------------------------------------------------------------------------\n# diamond:  file(1) magic for Diamond system\n#\n# ... diamond is a multi-media mail and electronic conferencing system....\n#\n# XXX - I think it was either renamed Slate, or replaced by Slate....\n#\n#\tThe full deal is too long...\n#0\tstring\t<list>\\n<protocol\\ bbn-multimedia-format>\tDiamond Multimedia Document\n0\tstring\t=<list>\\n<protocol\\ bbn-m\tDiamond Multimedia Document\n#------------------------------------------------------------------------------\n# diff:  file(1) magic for diff(1) output\n#\n0\tsearch/1\tdiff\\ \t\tdiff output text\n!:mime\ttext/x-diff\n0\tsearch/1\t***\\ \t\tdiff output text\n!:mime\ttext/x-diff\n0\tsearch/1\tOnly\\ in\\ \tdiff output text\n!:mime\ttext/x-diff\n0\tsearch/1\tCommon\\ subdirectories:\\ \tdiff output text\n!:mime\ttext/x-diff\n\n0\tsearch/1\tIndex:\t\tRCS/CVS diff output text\n!:mime\ttext/x-diff\n#  Digital UNIX - Info\n#\n0\tstring\t=!<arch>\\n________64E\tAlpha archive\n>22\tstring\tX\t\t\t-- out of date\n#\n# Alpha COFF Based Executables\n# The stripped stuff really needs to be an 8 byte (64 bit) compare,\n# but this works\n0\tleshort\t\t0x183\t\tCOFF format alpha\n>22\tleshort&020000\t&010000\t\tsharable library,\n>22\tleshort&020000\t^010000\t\tdynamically linked,\n>24\tleshort\t\t0410\t\tpure\n>24\tleshort\t\t0413\t\tdemand paged\n>8\tlelong\t\t>0\t\texecutable or object module, not stripped\n>8\tlelong\t\t0\n>>12\tlelong\t\t0\t\texecutable or object module, stripped\n>>12\tlelong\t\t>0\t\texecutable or object module, not stripped\n>27     byte            >0              - version %d.\n>26     byte            >0              %d-\n>28     leshort         >0              %d\n#\n# The next is incomplete, we could tell more about this format,\n# but its not worth it.\n0\tleshort\t\t0x188\tAlpha compressed COFF\n0\tleshort\t\t0x18f\tAlpha u-code object\n#\n#\n# Some other interesting Digital formats,\n0\tstring\t\\377\\377\\177\t\tddis/ddif\n0\tstring\t\\377\\377\\174\t\tddis/dots archive\n0\tstring\t\\377\\377\\176\t\tddis/dtif table data\n0\tstring\t\\033c\\033\t\tLN03 output\n0\tlong\t04553207\t\tX image\n#\n0\tstring\t=!<PDF>!\\n\t\tprofiling data file\n#\n# Locale data tables (MIPS and Alpha).\n#\n0\tshort\t\t0x0501\t\tlocale data table\n>6\tshort\t\t0x24\t\tfor MIPS\n>6\tshort\t\t0x40\t\tfor Alpha\n# ATSC A/53 aka AC-3 aka Dolby Digital <ashitaka@gmx.at>\n# from http://www.atsc.org/standards/a_52a.pdf\n# corrections, additions, etc. are always welcome!\n#\n# syncword\n0       beshort         0x0b77  ATSC A/52 aka AC-3 aka Dolby Digital stream,\n# fscod\n>4      byte&0xc0       0x00    48 kHz,\n>4      byte&0xc0       0x40    44.1 kHz,\n>4      byte&0xc0       0x80    32 kHz,\n# is this one used for 96 kHz?\n>4      byte&0xc0       0xc0    reserved frequency,\n#\n>5\tbyte&7 = 0\t\t\\b, complete main (CM)\n>5\tbyte&7 = 1\t\t\\b, music and effects (ME)\n>5\tbyte&7 = 2\t\t\\b, visually impaired (VI)\n>5\tbyte&7 = 3\t\t\\b, hearing impaired (HI)\n>5\tbyte&7 = 4\t\t\\b, dialogue (D)\n>5\tbyte&7 = 5\t\t\\b, commentary (C)\n>5\tbyte&7 = 6\t\t\\b, emergency (E)\n# acmod\n>6      byte&0xe0       0x00    1+1 front,\n>6      byte&0xe0       0x20    1 front/0 rear,\n>6      byte&0xe0       0x40    2 front/0 rear,\n>6      byte&0xe0       0x60    3 front/0 rear,\n>6      byte&0xe0       0x80    2 front/1 rear,\n>6      byte&0xe0       0xa0    3 front/1 rear,\n>6      byte&0xe0       0xc0    2 front/2 rear,\n>6      byte&0xe0       0xe0    3 front/2 rear,\n# lfeon (these may be incorrect)\n>7      byte&0x40       0x00    LFE off,\n>7      byte&0x40       0x40    LFE on,\n#\n>4\tbyte&0x3e = 0x00\t\\b, 32 kbit/s\n>4\tbyte&0x3e = 0x02        \\b, 40 kbit/s\n>4\tbyte&0x3e = 0x04        \\b, 48 kbit/s\n>4\tbyte&0x3e = 0x06        \\b, 56 kbit/s\n>4\tbyte&0x3e = 0x08        \\b, 64 kbit/s\n>4\tbyte&0x3e = 0x0a        \\b, 80 kbit/s\n>4\tbyte&0x3e = 0x0c        \\b, 96 kbit/s\n>4\tbyte&0x3e = 0x0e        \\b, 112 kbit/s\n>4\tbyte&0x3e = 0x10        \\b, 128 kbit/s\n>4\tbyte&0x3e = 0x12        \\b, 160 kbit/s\n>4\tbyte&0x3e = 0x14        \\b, 192 kbit/s\n>4\tbyte&0x3e = 0x16        \\b, 224 kbit/s\n>4\tbyte&0x3e = 0x18        \\b, 256 kbit/s\n>4\tbyte&0x3e = 0x1a        \\b, 320 kbit/s\n>4\tbyte&0x3e = 0x1c        \\b, 384 kbit/s\n>4\tbyte&0x3e = 0x1e        \\b, 448 kbit/s\n>4\tbyte&0x3e = 0x20        \\b, 512 kbit/s\n>4\tbyte&0x3e = 0x22        \\b, 576 kbit/s\n>4\tbyte&0x3e = 0x24        \\b, 640 kbit/s\n# dsurmod (these may be incorrect)\n>6      beshort&0x0180  0x0000  Dolby Surround not indicated\n>6      beshort&0x0180  0x0080  not Dolby Surround encoded\n>6      beshort&0x0180  0x0100  Dolby Surround encoded\n>6      beshort&0x0180  0x0180  reserved Dolby Surround mode\n\n#------------------------------------------------------------------------------\n# dump:  file(1) magic for dump file format--for new and old dump filesystems\n#\n# We specify both byte orders in order to recognize byte-swapped dumps.\n#\n24\tbelong\t60012\t\tnew-fs dump file (big endian),\n>4\tbedate\tx\t\tPrevious dump %s,\n>8\tbedate\tx\t\tThis dump %s,\n>12\tbelong\t>0\t\tVolume %ld,\n>692\tbelong\t0\t\tLevel zero, type:\n>692\tbelong\t>0\t\tLevel %d, type:\n>0\tbelong\t1\t\ttape header,\n>0\tbelong\t2\t\tbeginning of file record,\n>0\tbelong\t3\t\tmap of inodes on tape,\n>0\tbelong\t4\t\tcontinuation of file record,\n>0\tbelong\t5\t\tend of volume,\n>0\tbelong\t6\t\tmap of inodes deleted,\n>0\tbelong\t7\t\tend of medium (for floppy),\n>676\tstring\t>\\0\t\tLabel %s,\n>696\tstring\t>\\0\t\tFilesystem %s,\n>760\tstring\t>\\0\t\tDevice %s,\n>824\tstring\t>\\0\t\tHost %s,\n>888\tbelong\t>0\t\tFlags %x\n\n24\tbelong\t60011\t\told-fs dump file (big endian),\n#>4\tbedate\tx\t\tPrevious dump %s,\n#>8\tbedate\tx\t\tThis dump %s,\n>12\tbelong\t>0\t\tVolume %ld,\n>692\tbelong\t0\t\tLevel zero, type:\n>692\tbelong\t>0\t\tLevel %d, type:\n>0\tbelong\t1\t\ttape header,\n>0\tbelong\t2\t\tbeginning of file record,\n>0\tbelong\t3\t\tmap of inodes on tape,\n>0\tbelong\t4\t\tcontinuation of file record,\n>0\tbelong\t5\t\tend of volume,\n>0\tbelong\t6\t\tmap of inodes deleted,\n>0\tbelong\t7\t\tend of medium (for floppy),\n>676\tstring\t>\\0\t\tLabel %s,\n>696\tstring\t>\\0\t\tFilesystem %s,\n>760\tstring\t>\\0\t\tDevice %s,\n>824\tstring\t>\\0\t\tHost %s,\n>888\tbelong\t>0\t\tFlags %x\n\n24\tlelong\t60012\t\tnew-fs dump file (little endian),\n>4\tledate\tx\t\tThis dump %s,\n>8\tledate\tx\t\tPrevious dump %s,\n>12\tlelong\t>0\t\tVolume %ld,\n>692\tlelong\t0\t\tLevel zero, type:\n>692\tlelong\t>0\t\tLevel %d, type:\n>0\tlelong\t1\t\ttape header,\n>0\tlelong\t2\t\tbeginning of file record,\n>0\tlelong\t3\t\tmap of inodes on tape,\n>0\tlelong\t4\t\tcontinuation of file record,\n>0\tlelong\t5\t\tend of volume,\n>0\tlelong\t6\t\tmap of inodes deleted,\n>0\tlelong\t7\t\tend of medium (for floppy),\n>676\tstring\t>\\0\t\tLabel %s,\n>696\tstring\t>\\0\t\tFilesystem %s,\n>760\tstring\t>\\0\t\tDevice %s,\n>824\tstring\t>\\0\t\tHost %s,\n>888\tlelong\t>0\t\tFlags %x\n\n24\tlelong\t60011\t\told-fs dump file (little endian),\n#>4\tledate\tx\t\tPrevious dump %s,\n#>8\tledate\tx\t\tThis dump %s,\n>12\tlelong\t>0\t\tVolume %ld,\n>692\tlelong\t0\t\tLevel zero, type:\n>692\tlelong\t>0\t\tLevel %d, type:\n>0\tlelong\t1\t\ttape header,\n>0\tlelong\t2\t\tbeginning of file record,\n>0\tlelong\t3\t\tmap of inodes on tape,\n>0\tlelong\t4\t\tcontinuation of file record,\n>0\tlelong\t5\t\tend of volume,\n>0\tlelong\t6\t\tmap of inodes deleted,\n>0\tlelong\t7\t\tend of medium (for floppy),\n>676\tstring\t>\\0\t\tLabel %s,\n>696\tstring\t>\\0\t\tFilesystem %s,\n>760\tstring\t>\\0\t\tDevice %s,\n>824\tstring\t>\\0\t\tHost %s,\n>888\tlelong\t>0\t\tFlags %x\n\n18\tleshort\t60011\t\told-fs dump file (16-bit, assuming PDP-11 endianness),\n>2\tmedate\tx\t\tPrevious dump %s,\n>6\tmedate\tx\t\tThis dump %s,\n>10\tleshort\t>0\t\tVolume %ld,\n>0\tleshort\t1\t\ttape header.\n>0\tleshort\t2\t\tbeginning of file record.\n>0\tleshort\t3\t\tmap of inodes on tape.\n>0\tleshort\t4\t\tcontinuation of file record.\n>0\tleshort\t5\t\tend of volume.\n>0\tleshort\t6\t\tmap of inodes deleted.\n>0\tleshort\t7\t\tend of medium (for floppy).\n\n24\tbelong\t0x19540119\tnew-fs dump file (ufs2, big endian),\n>896\tbeqdate\tx\t\tPrevious dump %s,\n>904\tbeqdate\tx\t\tThis dump %s,\n>12\tbelong\t>0\t\tVolume %ld,\n>692\tbelong\t0\t\tLevel zero, type:\n>692\tbelong\t>0\t\tLevel %d, type:\n>0\tbelong\t1\t\ttape header,\n>0\tbelong\t2\t\tbeginning of file record,\n>0\tbelong\t3\t\tmap of inodes on tape,\n>0\tbelong\t4\t\tcontinuation of file record,\n>0\tbelong\t5\t\tend of volume,\n>0\tbelong\t6\t\tmap of inodes deleted,\n>0\tbelong\t7\t\tend of medium (for floppy),\n>676\tstring\t>\\0\t\tLabel %s,\n>696\tstring\t>\\0\t\tFilesystem %s,\n>760\tstring\t>\\0\t\tDevice %s,\n>824\tstring\t>\\0\t\tHost %s,\n>888\tbelong\t>0\t\tFlags %x\n\n24\tlelong\t0x19540119\tnew-fs dump file (ufs2, little endian),\n>896\tleqdate\tx\t\tThis dump %s,\n>904\tleqdate\tx\t\tPrevious dump %s,\n>12\tlelong\t>0\t\tVolume %ld,\n>692\tlelong\t0\t\tLevel zero, type:\n>692\tlelong\t>0\t\tLevel %d, type:\n>0\tlelong\t1\t\ttape header,\n>0\tlelong\t2\t\tbeginning of file record,\n>0\tlelong\t3\t\tmap of inodes on tape,\n>0\tlelong\t4\t\tcontinuation of file record,\n>0\tlelong\t5\t\tend of volume,\n>0\tlelong\t6\t\tmap of inodes deleted,\n>0\tlelong\t7\t\tend of medium (for floppy),\n>676\tstring\t>\\0\t\tLabel %s,\n>696\tstring\t>\\0\t\tFilesystem %s,\n>760\tstring\t>\\0\t\tDevice %s,\n>824\tstring\t>\\0\t\tHost %s,\n>888\tlelong\t>0\t\tFlags %x\n\n#------------------------------------------------------------------------------\n# Dyadic: file(1) magic for Dyalog APL.\n#\n0 \tbyte\t0xaa\n>1\tbyte\t<4\t\tDyalog APL\n>>1\tbyte\t0x00\t\tincomplete workspace\n>>1\tbyte\t0x01\t\tcomponent file\n>>1\tbyte\t0x02\t\texternal variable\n>>1\tbyte\t0x03\t\tworkspace\n>>2\tbyte\tx\t\tversion %d\n>>3\tbyte\tx\t\t.%d\n\n#------------------------------------------------------------------------------\n# T602 editor documents \n# by David Necas <yeti@physics.muni.cz>\n0\tstring\t@CT\\ \tT602 document data,\n>4\tstring\t0\tKamenicky\n>4\tstring\t1\tCP 852\n>4\tstring\t2\tKOI8-CS\n>4\tstring\t>2\tunknown encoding\n\n# Vi IMproved Encrypted file \n# by David Necas <yeti@physics.muni.cz>\n0\tstring\tVimCrypt~\tVim encrypted file data\n# Vi IMproved Swap file\n# by Sven Wegener <swegener@gentoo.org>\n0\tstring\tb0VIM\\ \t\tVim swap file\n>&0\tstring\t>\\0\t\t\\b, version %s\n\n#------------------------------------------------------------------------------\n# efi:  file(1) magic for Universal EFI binaries\n\n0\tlelong\t0x0ef1fab9\n>4\tlelong\t1\t\tUniversal EFI binary with 1 architecture\n>>&0\tlelong\t7\t\t\\b, i386\n>>&0\tlelong\t0x01000007\t\\b, x86_64\n>4\tlelong\t2\t\tUniversal EFI binary with 2 architectures\n>>&0\tlelong\t7\t\t\\b, i386\n>>&0\tlelong\t0x01000007\t\\b, x86_64\n>>&20\tlelong\t7\t\t\\b, i386\n>>&20\tlelong\t0x01000007\t\\b, x86_64\n>4\tlelong\t>2\t\tUniversal EFI binary with %ld architectures\n\n#------------------------------------------------------------------------------\n# elf:  file(1) magic for ELF executables\n#\n# We have to check the byte order flag to see what byte order all the\n# other stuff in the header is in.\n#\n# What're the correct byte orders for the nCUBE and the Fujitsu VPP500?\n#\n# Created by: unknown\n# Modified by (1): Daniel Quinlan <quinlan@yggdrasil.com>\n# Modified by (2): Peter Tobias <tobias@server.et-inf.fho-emden.de> (core support)\n# Modified by (3): Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de> (fix of core support)\n# Modified by (4): <gerardo.cacciari@gmail.com> (VMS Itanium)\n# Modified by (5): Matthias Urlichs <smurf@debian.org> (Listing of many architectures)\n0\tstring\t\t\\177ELF\t\tELF\n>4\tbyte\t\t0\t\tinvalid class\n>4\tbyte\t\t1\t\t32-bit\n>4\tbyte\t\t2\t\t64-bit\n>5\tbyte\t\t0\t\tinvalid byte order\n>5\tbyte\t\t1\t\tLSB\n>>16\tleshort\t\t0\t\tno file type,\n!:strength *2\n!:mime\tapplication/octet-stream\n>>16\tleshort\t\t1\t\trelocatable,\n!:mime\tapplication/x-object\n>>16\tleshort\t\t2\t\texecutable,\n!:mime\tapplication/x-executable\n>>16\tleshort\t\t3\t\tshared object,\n!:mime\tapplication/x-sharedlib\n>>16\tleshort\t\t4\t\tcore file\n!:mime\tapplication/x-coredump\n# Core file detection is not reliable.\n#>>>(0x38+0xcc) string\t>\\0\t\tof '%s'\n#>>>(0x38+0x10) lelong\t>0\t\t(signal %d),\n>>16\tleshort\t\t&0xff00\t\tprocessor-specific,\n>>18\tleshort\t\t0\t\tno machine,\n>>18\tleshort\t\t1\t\tAT&T WE32100 - invalid byte order,\n>>18\tleshort\t\t2\t\tSPARC - invalid byte order,\n>>18\tleshort\t\t3\t\tIntel 80386,\n>>18\tleshort\t\t4\t\tMotorola\n>>>36\tlelong\t\t&0x01000000\t68000 - invalid byte order,\n>>>36\tlelong\t\t&0x00810000\tCPU32 - invalid byte order,\n>>>36\tlelong\t\t0\t\t68020 - invalid byte order,\n>>18\tleshort\t\t5\t\tMotorola 88000 - invalid byte order,\n>>18\tleshort\t\t6\t\tIntel 80486,\n>>18\tleshort\t\t7\t\tIntel 80860,\n# The official e_machine number for MIPS is now #8, regardless of endianness.\n# The second number (#10) will be deprecated later. For now, we still\n# say something if #10 is encountered, but only gory details for #8.\n>>18\tleshort\t\t8\t\tMIPS,\n>>>36\tlelong\t\t&0x20\t\tN32\n>>18\tleshort\t\t10\t\tMIPS,\n>>>36\tlelong\t\t&0x20\t\tN32\n>>18\tleshort\t\t8\n# only for 32-bit\n>>>4\tbyte\t\t1\n>>>>36  lelong&0xf0000000\t0x00000000\tMIPS-I\n>>>>36  lelong&0xf0000000\t0x10000000\tMIPS-II\n>>>>36  lelong&0xf0000000\t0x20000000\tMIPS-III\n>>>>36  lelong&0xf0000000\t0x30000000\tMIPS-IV\n>>>>36  lelong&0xf0000000\t0x40000000\tMIPS-V\n>>>>36  lelong&0xf0000000\t0x50000000\tMIPS32\n>>>>36  lelong&0xf0000000\t0x60000000\tMIPS64\n>>>>36  lelong&0xf0000000\t0x70000000\tMIPS32 rel2\n>>>>36  lelong&0xf0000000\t0x80000000\tMIPS64 rel2\n# only for 64-bit\n>>>4\tbyte\t\t2\n>>>>48  lelong&0xf0000000\t0x00000000\tMIPS-I\n>>>>48  lelong&0xf0000000\t0x10000000\tMIPS-II\n>>>>48  lelong&0xf0000000\t0x20000000\tMIPS-III\n>>>>48  lelong&0xf0000000\t0x30000000\tMIPS-IV\n>>>>48  lelong&0xf0000000\t0x40000000\tMIPS-V\n>>>>48  lelong&0xf0000000\t0x50000000\tMIPS32\n>>>>48  lelong&0xf0000000\t0x60000000\tMIPS64\n>>>>48  lelong&0xf0000000\t0x70000000\tMIPS32 rel2\n>>>>48  lelong&0xf0000000\t0x80000000\tMIPS64 rel2\n>>18\tleshort\t\t9\t\tAmdahl - invalid byte order,\n>>18\tleshort\t\t10\t\tMIPS (deprecated),\n>>18\tleshort\t\t11\t\tRS6000 - invalid byte order,\n>>18\tleshort\t\t15\t\tPA-RISC - invalid byte order,\n>>>50\tleshort\t\t0x0214\t\t2.0\n>>>48\tleshort\t\t&0x0008\t\t(LP64),\n>>18\tleshort\t\t16\t\tnCUBE,\n>>18\tleshort\t\t17\t\tFujitsu VPP500,\n>>18\tleshort\t\t18\t\tSPARC32PLUS - invalid byte order,\n>>18\tleshort\t\t20\t\tPowerPC,\n>>18\tleshort\t\t22\t\tIBM S/390,\n>>18\tleshort\t\t36\t\tNEC V800,\n>>18\tleshort\t\t37\t\tFujitsu FR20,\n>>18\tleshort\t\t38\t\tTRW RH-32,\n>>18\tleshort\t\t39\t\tMotorola RCE,\n>>18\tleshort\t\t40\t\tARM,\n>>18\tleshort\t\t41\t\tAlpha,\n>>18\tleshort\t\t0xa390\t\tIBM S/390 (obsolete),\n>>18\tleshort\t\t42\t\tRenesas SH,\n>>18\tleshort\t\t43\t\tSPARC V9 - invalid byte order,\n>>18\tleshort\t\t44\t\tSiemens Tricore Embedded Processor,\n>>18\tleshort\t\t45\t\tArgonaut RISC Core, Argonaut Technologies Inc.,\n>>18\tleshort\t\t46\t\tRenesas H8/300,\n>>18\tleshort\t\t47\t\tRenesas H8/300H,\n>>18\tleshort\t\t48\t\tRenesas H8S,\n>>18\tleshort\t\t49\t\tRenesas H8/500,\n>>18\tleshort\t\t50\t\tIA-64,\n>>18\tleshort\t\t51\t\tStanford MIPS-X,\n>>18\tleshort\t\t52\t\tMotorola Coldfire,\n>>18\tleshort\t\t53\t\tMotorola M68HC12,\n>>18\tleshort\t\t54\t\tFujitsu MMA,\n>>18\tleshort\t\t55\t\tSiemens PCP,\n>>18\tleshort\t\t56\t\tSony nCPU,\n>>18\tleshort\t\t57\t\tDenso NDR1,\n>>18\tleshort\t\t58\t\tStart*Core,\n>>18\tleshort\t\t59\t\tToyota ME16,\n>>18\tleshort\t\t60\t\tST100,\n>>18\tleshort\t\t61\t\tTinyj emb.,\n>>18\tleshort\t\t62\t\tx86-64,\n>>18\tleshort\t\t63\t\tSony DSP,\n>>18\tleshort\t\t66\t\tFX66,\n>>18\tleshort\t\t67\t\tST9+ 8/16 bit,\n>>18\tleshort\t\t68\t\tST7 8 bit,\n>>18\tleshort\t\t69\t\tMC68HC16,\n>>18\tleshort\t\t70\t\tMC68HC11,\n>>18\tleshort\t\t71\t\tMC68HC08,\n>>18\tleshort\t\t72\t\tMC68HC05,\n>>18\tleshort\t\t73\t\tSGI SVx,\n>>18\tleshort\t\t74\t\tST19 8 bit,\n>>18\tleshort\t\t75\t\tDigital VAX,\n>>18\tleshort\t\t76\t\tAxis cris,\n>>18\tleshort\t\t77\t\tInfineon 32-bit embedded,\n>>18\tleshort\t\t78\t\tElement 14 64-bit DSP,\n>>18\tleshort\t\t79\t\tLSI Logic 16-bit DSP,\n>>18\tleshort\t\t80\t\tMMIX,\n>>18\tleshort\t\t81\t\tHarvard machine-independent,\n>>18\tleshort\t\t82\t\tSiTera Prism,\n>>18\tleshort\t\t83\t\tAtmel AVR 8-bit,\n>>18\tleshort\t\t84\t\tFujitsu FR30,\n>>18\tleshort\t\t85\t\tMitsubishi D10V,\n>>18\tleshort\t\t86\t\tMitsubishi D30V,\n>>18\tleshort\t\t87\t\tNEC v850,\n>>18\tleshort\t\t88\t\tRenesas M32R,\n>>18\tleshort\t\t89\t\tMatsushita MN10300,\n>>18\tleshort\t\t90\t\tMatsushita MN10200,\n>>18\tleshort\t\t91\t\tpicoJava,\n>>18\tleshort\t\t92\t\tOpenRISC,\n>>18\tleshort\t\t93\t\tARC Cores Tangent-A5,\n>>18\tleshort\t\t94\t\tTensilica Xtensa,\n>>18\tleshort\t\t97\t\tNatSemi 32k,\n>>18\tleshort\t\t106\t\tAnalog Devices Blackfin,\n>>18\tleshort\t\t113\t\tAltera Nios II,\n>>18\tleshort\t\t0xae\t\tMETA,\n>>18\tleshort\t\t0x3426\t\tOpenRISC (obsolete),\n>>18\tleshort\t\t0x8472\t\tOpenRISC (obsolete),\n>>18\tleshort\t\t0x9026\t\tAlpha (unofficial),\n>>20\tlelong\t\t0\t\tinvalid version\n>>20\tlelong\t\t1\t\tversion 1\n>>36\tlelong\t\t1\t\tMathCoPro/FPU/MAU Required\n>5\tbyte\t\t2\t\tMSB\n>>16\tbeshort\t\t0\t\tno file type,\n!:mime\tapplication/octet-stream\n>>16\tbeshort\t\t1\t\trelocatable,\n!:mime\tapplication/x-object\n>>16\tbeshort\t\t2\t\texecutable,\n!:mime\tapplication/x-executable\n>>16\tbeshort\t\t3\t\tshared object,\n!:mime\tapplication/x-sharedlib\n>>16\tbeshort\t\t4\t\tcore file,\n!:mime\tapplication/x-coredump\n#>>>(0x38+0xcc) string\t>\\0\t\tof '%s'\n#>>>(0x38+0x10) belong\t>0\t\t(signal %d),\n>>16\tbeshort\t\t&0xff00\t\tprocessor-specific,\n>>18\tbeshort\t\t0\t\tno machine,\n>>18\tbeshort\t\t1\t\tAT&T WE32100,\n>>18\tbeshort\t\t2\t\tSPARC,\n>>18\tbeshort\t\t3\t\tIntel 80386 - invalid byte order,\n>>18\tbeshort\t\t4\t\tMotorola\n>>>36\tbelong\t\t&0x01000000\t68000,\n>>>36\tbelong\t\t&0x00810000\tCPU32,\n>>>36\tbelong\t\t0\t\t68020,\n>>18\tbeshort\t\t5\t\tMotorola 88000,\n>>18\tbeshort\t\t6\t\tIntel 80486 - invalid byte order,\n>>18\tbeshort\t\t7\t\tIntel 80860,\n# only for MIPS - see comment in little-endian section above.\n>>18\tbeshort\t\t8\t\tMIPS,\n>>>36\tbelong\t\t&0x20\t\tN32\n>>18\tbeshort\t\t10\t\tMIPS,\n>>>36\tbelong\t\t&0x20\t\tN32\n>>18\tbeshort\t\t8\n# only for 32-bit\n>>>4\tbyte\t\t1\n>>>>36  belong&0xf0000000\t0x00000000\tMIPS-I\n>>>>36  belong&0xf0000000\t0x10000000\tMIPS-II\n>>>>36  belong&0xf0000000\t0x20000000\tMIPS-III\n>>>>36  belong&0xf0000000\t0x30000000\tMIPS-IV\n>>>>36  belong&0xf0000000\t0x40000000\tMIPS-V\n>>>>36  belong&0xf0000000\t0x50000000\tMIPS32\n>>>>36  belong&0xf0000000\t0x60000000\tMIPS64\n>>>>36  belong&0xf0000000\t0x70000000\tMIPS32 rel2\n>>>>36  belong&0xf0000000\t0x80000000\tMIPS64 rel2\n# only for 64-bit\n>>>4\tbyte\t\t2\n>>>>48\tbelong&0xf0000000\t0x00000000\tMIPS-I\n>>>>48\tbelong&0xf0000000\t0x10000000\tMIPS-II\n>>>>48\tbelong&0xf0000000\t0x20000000\tMIPS-III\n>>>>48\tbelong&0xf0000000\t0x30000000\tMIPS-IV\n>>>>48\tbelong&0xf0000000\t0x40000000\tMIPS-V\n>>>>48\tbelong&0xf0000000\t0x50000000\tMIPS32\n>>>>48\tbelong&0xf0000000\t0x60000000\tMIPS64\n>>>>48\tbelong&0xf0000000\t0x70000000\tMIPS32 rel2\n>>>>48\tbelong&0xf0000000\t0x80000000\tMIPS64 rel2\n>>18\tbeshort\t\t9\t\tAmdahl,\n>>18\tbeshort\t\t10\t\tMIPS (deprecated),\n>>18\tbeshort\t\t11\t\tRS6000,\n>>18\tbeshort\t\t15\t\tPA-RISC\n>>>50\tbeshort\t\t0x0214\t\t2.0\n>>>48\tbeshort\t\t&0x0008\t\t(LP64)\n>>18\tbeshort\t\t16\t\tnCUBE,\n>>18\tbeshort\t\t17\t\tFujitsu VPP500,\n>>18\tbeshort\t\t18\t\tSPARC32PLUS,\n>>>36\tbelong&0xffff00\t0x000100\tV8+ Required,\n>>>36\tbelong&0xffff00\t0x000200\tSun UltraSPARC1 Extensions Required,\n>>>36\tbelong&0xffff00\t0x000400\tHaL R1 Extensions Required,\n>>>36\tbelong&0xffff00\t0x000800\tSun UltraSPARC3 Extensions Required,\n>>18\tbeshort\t\t20\t\tPowerPC or cisco 4500,\n>>18\tbeshort\t\t21\t\t64-bit PowerPC or cisco 7500,\n>>18\tbeshort\t\t22\t\tIBM S/390,\n>>18\tbeshort\t\t23\t\tCell SPU,\n>>18\tbeshort\t\t24\t\tcisco SVIP,\n>>18\tbeshort\t\t25\t\tcisco 7200,\n>>18\tbeshort\t\t36\t\tNEC V800 or cisco 12000,\n>>18\tbeshort\t\t37\t\tFujitsu FR20,\n>>18\tbeshort\t\t38\t\tTRW RH-32,\n>>18\tbeshort\t\t39\t\tMotorola RCE,\n>>18\tbeshort\t\t40\t\tARM,\n>>18\tbeshort\t\t41\t\tAlpha,\n>>18\tbeshort\t\t42\t\tRenesas SH,\n>>18\tbeshort\t\t43\t\tSPARC V9,\n>>>48\tbelong&0xffff00\t0x000200\tSun UltraSPARC1 Extensions Required,\n>>>48\tbelong&0xffff00\t0x000400\tHaL R1 Extensions Required,\n>>>48\tbelong&0xffff00\t0x000800\tSun UltraSPARC3 Extensions Required,\n>>>48\tbelong&0x3\t0\t\ttotal store ordering,\n>>>48\tbelong&0x3\t1\t\tpartial store ordering,\n>>>48\tbelong&0x3\t2\t\trelaxed memory ordering,\n>>18\tbeshort\t\t44\t\tSiemens Tricore Embedded Processor,\n>>18\tbeshort\t\t45\t\tArgonaut RISC Core, Argonaut Technologies Inc.,\n>>18\tbeshort\t\t46\t\tRenesas H8/300,\n>>18\tbeshort\t\t47\t\tRenesas H8/300H,\n>>18\tbeshort\t\t48\t\tRenesas H8S,\n>>18\tbeshort\t\t49\t\tRenesas H8/500,\n>>18\tbeshort\t\t50\t\tIA-64,\n>>18\tbeshort\t\t51\t\tStanford MIPS-X,\n>>18\tbeshort\t\t52\t\tMotorola Coldfire,\n>>18\tbeshort\t\t53\t\tMotorola M68HC12,\n>>18\tbeshort\t\t73\t\tCray NV1,\n>>18\tbeshort\t\t75\t\tDigital VAX,\n>>18\tbeshort\t\t88\t\tRenesas M32R,\n>>18\tleshort\t\t92\t\tOpenRISC,\n>>18\tleshort\t\t0x3426\t\tOpenRISC (obsolete),\n>>18\tleshort\t\t0x8472\t\tOpenRISC (obsolete),\n>>18\tbeshort\t\t94\t\tTensilica Xtensa,\n>>18\tbeshort\t\t97\t\tNatSemi 32k,\n>>18\tbeshort\t\t0x18ad\t\tAVR32 (unofficial),\n>>18\tbeshort\t\t0x9026\t\tAlpha (unofficial),\n>>18\tbeshort\t\t0xa390\t\tIBM S/390 (obsolete),\n>>20\tbelong\t\t0\t\tinvalid version\n>>20\tbelong\t\t1\t\tversion 1\n>>36\tbelong\t\t1\t\tMathCoPro/FPU/MAU Required\n# Up to now only 0, 1 and 2 are defined; I've seen a file with 0x83, it seemed\n# like proper ELF, but extracting the string had bad results.\n>4      byte            <0x80\n>>8\tstring\t\t>\\0\t\t(%s)\n>8\tstring\t\t\\0\n>>7\tbyte\t\t0\t\t(SYSV)\n>>7\tbyte\t\t1\t\t(HP-UX)\n>>7\tbyte\t\t2\t\t(NetBSD)\n>>7\tbyte\t\t3\t\t(GNU/Linux)\n>>7\tbyte\t\t4\t\t(GNU/Hurd)\n>>7\tbyte\t\t5\t\t(86Open)\n>>7\tbyte\t\t6\t\t(Solaris)\n>>7\tbyte\t\t7\t\t(Monterey)\n>>7\tbyte\t\t8\t\t(IRIX)\n>>7\tbyte\t\t9\t\t(FreeBSD)\n>>7\tbyte\t\t10\t\t(Tru64)\n>>7\tbyte\t\t11\t\t(Novell Modesto)\n>>7\tbyte\t\t12\t\t(OpenBSD)\n>8      string          \\2\n>>7     byte            13              (OpenVMS)\n>>7\tbyte\t\t97\t\t(ARM)\n>>7\tbyte\t\t255\t\t(embedded)\n\n#------------------------------------------------------------------------------\n# encore:  file(1) magic for Encore machines\n#\n# XXX - needs to have the byte order specified (NS32K was little-endian,\n# dunno whether they run the 88K in little-endian mode or not).\n#\n0\tshort\t\t0x154\t\tEncore\n>20\tshort\t\t0x107\t\texecutable\n>20\tshort\t\t0x108\t\tpure executable\n>20\tshort\t\t0x10b\t\tdemand-paged executable\n>20\tshort\t\t0x10f\t\tunsupported executable\n>12\tlong\t\t>0\t\tnot stripped\n>22\tshort\t\t>0\t\t- version %ld\n>22\tshort\t\t0\t\t-\n#>4\tdate\t\tx\t\tstamp %s\n0\tshort\t\t0x155\t\tEncore unsupported executable\n>12\tlong\t\t>0\t\tnot stripped\n>22\tshort\t\t>0\t\t- version %ld\n>22\tshort\t\t0\t\t-\n#>4\tdate\t\tx\t\tstamp %s\n#------------------------------------------------------------------------------\n# EPOC : file(1) magic for EPOC documents [Psion Series 5/Osaris/Geofox 1]\n# Stefan Praszalowicz (hpicollo@worldnet.fr)\n# Useful information for improving this file can be found at:\n# http://software.frodo.looijaard.name/psiconv/formats/Index.html\n0\tlelong\t\t0x10000037\n>4\tlelong\t\t0x1000006D\n>>8\tlelong\t\t0x1000007F\tPsion Word\n>>8\tlelong\t\t0x10000088\tPsion Sheet\n>>8\tlelong\t\t0x1000007D\tPsion Sketch\n>>8\tlelong\t\t0x10000085\tPsion TextEd\n\n#------------------------------------------------------------------------------\n# erlang:  file(1) magic for Erlang JAM and BEAM files\n# URL:  http://www.erlang.org/faq/x779.html#AEN812\n\n# OTP R3-R4\n0\tstring\t\\0177BEAM!\tOld Erlang BEAM file\n>6\tshort\t>0\t\t- version %d\n\n# OTP R5 and onwards\n0\tstring\tFOR1\n>8\tstring\tBEAM\t\tErlang BEAM file\n\n# 4.2 version may have a copyright notice!\n4\tstring\tTue\\ Jan\\ 22\\ 14:32:44\\ MET\\ 1991\tErlang JAM file - version 4.2\n79\tstring\tTue\\ Jan\\ 22\\ 14:32:44\\ MET\\ 1991\tErlang JAM file - version 4.2\n\n4\tstring\t1.0\\ Fri\\ Feb\\ 3\\ 09:55:56\\ MET\\ 1995\tErlang JAM file - version 4.3\n\n#------------------------------------------------------------------------------\n# ESRI Shapefile format (.shp .shx .dbf=DBaseIII)\n# Based on info from\n# <URL:http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf>\n0\tbelong\t9994\tESRI Shapefile\n>4\tbelong\t=0\n>8\tbelong\t=0\n>12\tbelong\t=0\n>16\tbelong\t=0\n>20\tbelong\t=0\n>28\tlelong\tx\tversion %d\n>24\tbelong\tx\tlength %d\n>32\tlelong\t=0\ttype Null Shape\n>32\tlelong\t=1\ttype Point\n>32\tlelong\t=3\ttype PolyLine\n>32\tlelong\t=5\ttype Polygon\n>32\tlelong\t=8\ttype MultiPoint\n>32\tlelong\t=11\ttype PointZ\n>32\tlelong\t=13\ttype PolyLineZ\n>32\tlelong\t=15\ttype PolygonZ\n>32\tlelong\t=18\ttype MultiPointZ\n>32\tlelong\t=21\ttype PointM\n>32\tlelong\t=23\ttype PolyLineM\n>32\tlelong\t=25\ttype PolygonM\n>32\tlelong\t=28\ttype MultiPointM\n>32\tlelong\t=31\ttype MultiPatch\n\n#------------------------------------------------------------------------------\n# fcs: file(1) magic for FCS (Flow Cytometry Standard) data files\n# From Roger Leigh <roger@whinlatter.uklinux.net>\n0       string          FCS1.0          Flow Cytometry Standard (FCS) data, version 1.0\n0       string          FCS2.0          Flow Cytometry Standard (FCS) data, version 2.0\n0       string          FCS3.0          Flow Cytometry Standard (FCS) data, version 3.0\n\n\n#------------------------------------------------------------------------------\n# filesystems:  file(1) magic for different filesystems\n#\n0\tstring\t\\366\\366\\366\\366\tPC formatted floppy with no filesystem\n# Sun disk labels\n# From /usr/include/sun/dklabel.h:\n0774\tbeshort\t\t0xdabe\t\t\n# modified by Joerg Jenderek, because original test\n# succeeds for Cabinet archive dao360.dl_ with negative blocks\n>0770\tlong\t\t>0\t\tSun disk label\n>>0\tstring\t\tx\t\t'%s\n>>>31\tstring\t\t>\\0\t\t\\b%s\n>>>>63\tstring\t\t>\\0\t\t\\b%s\n>>>>>95\tstring\t\t>\\0\t\t\\b%s\n>>0\tstring\t\tx\t\t\\b'\n>>0734\tshort\t\t>0\t\t%d rpm,\n>>0736\tshort\t\t>0\t\t%d phys cys,\n>>0740\tshort\t\t>0\t\t%d alts/cyl,\n>>0746\tshort\t\t>0\t\t%d interleave,\n>>0750\tshort\t\t>0\t\t%d data cyls,\n>>0752\tshort\t\t>0\t\t%d alt cyls,\n>>0754\tshort\t\t>0\t\t%d heads/partition,\n>>0756\tshort\t\t>0\t\t%d sectors/track,\n>>0764\tlong\t\t>0\t\tstart cyl %ld,\n>>0770\tlong\t\tx\t\t%ld blocks\n# Is there a boot block written 1 sector in?\n>512    belong&077777777\t0600407\t\\b, boot block present\n# Joerg Jenderek: Smart Boot Manager backup file is 41 byte header + first sectors of disc\n# (http://btmgr.sourceforge.net/docs/user-guide-3.html)\n0\t\tstring\tSBMBAKUP_\tSmart Boot Manager backup file\n>9\t\tstring\tx\t\t\\b, version %-5.5s\n>>14\t\tstring\t=_\t\t\n>>>15\t\tstring\tx\t\t%-.1s\n>>>>16\t\tstring\t=_\t\t\\b.\n>>>>>17\t\tstring\tx\t\t\\b%-.1s\n>>>>>>18\tstring\t=_\t\t\\b.\n>>>>>>>19\tstring\tx\t\t\\b%-.1s\n>>>22\t\tubyte\t0\t\t\n>>>>21\t\tubyte\tx\t\t\\b, from drive 0x%x\n>>>22\t\tubyte\t>0\t\t\n>>>>21\t\tstring\tx\t\t\\b, from drive %s\n\n# Joerg Jenderek\n# DOS Emulator image is 128 byte, null right padded header + harddisc image\n0\tstring\tDOSEMU\\0\t\t\t\n>0x27E\tleshort\t0xAA55\t\t\t\n#offset is 128\n>>19\tubyte\t128\t\t\t\n>>>(19.b-1)\tubyte\t0x0\tDOS Emulator image\n>>>>7\tulelong\t>0\t\t\\b, %u heads\n>>>>11\tulelong\t>0\t\t\\b, %d sectors/track\n>>>>15\tulelong\t>0\t\t\\b, %d cylinders\n\n# updated by Joerg Jenderek at Sep 2007\n# only for sector sizes with 512 or more Bytes\n0x1FE\tleshort\t0xAA55\t\t\tx86 boot sector\n# to do also for sectors < than 512 Bytes and some other files, GRR\n#30\tsearch/481\t\\x55\\xAA\tx86 boot sector\n# not for BeOS floppy 1440k, MBRs\n#(11.s-2) uleshort\t0xAA55\t\tx86 boot sector\n>2\tstring\tOSBS\t\t\t\\b, OS/BS MBR\n# J\\xf6rg Jenderek <joerg dot jenderek at web dot de>\n>0x8C\tstring\tInvalid\\ partition\\ table\t\\b, MS-DOS MBR\n# dr-dos with some upper-, lowercase variants\n>0x9D\tstring\tInvalid\\ partition\\ table$\t\n>>181\tstring\tNo\\ Operating\\ System$\t\t\n>>>201\tstring\tOperating\\ System\\ load\\ error$\t\\b, DR-DOS MBR, Version 7.01 to 7.03\n>0x9D\tstring\tInvalid\\ partition\\ table$\t\n>>181\tstring\tNo\\ operating\\ system$\t\t\n>>>201\tstring\tOperating\\ system\\ load\\ error$\t\\b, DR-DOS MBR, Version 7.01 to 7.03\n>342\tstring\tInvalid\\ partition\\ table$\t\n>>366\tstring\tNo\\ operating\\ system$\t\t\n>>>386\tstring\tOperating\\ system\\ load\\ error$\t\\b, DR-DOS MBR, version 7.01 to 7.03\n>295\tstring\tNEWLDR\\0\t\t\t\t\n>>302\tstring\tBad\\ PT\\ $\t\t\t\t\n>>>310\tstring\tNo\\ OS\\ $\t\t\t\t\n>>>>317\tstring\tOS\\ load\\ err$\t\t\t\t\n>>>>>329\tstring\tMoved\\ or\\ missing\\ IBMBIO.LDR\\n\\r\t\n>>>>>>358\tstring\tPress\\ any\\ key\\ to\\ continue.\\n\\r$\t\n>>>>>>>387\tstring\tCopyright\\ (c)\\ 1984,1998\t\n>>>>>>>>411\tstring\tCaldera\\ Inc.\\0\t\t\\b, DR-DOS MBR (IBMBIO.LDR)\n>0x10F\tstring\tUng\\201ltige\\ Partitionstabelle\t\\b, MS-DOS MBR, german version 4.10.1998, 4.10.2222\n>>0x1B8\tubelong\t>0\t\t\t\t\\b, Serial 0x%-.4x\n>0x8B\tstring\tUng\\201ltige\\ Partitionstabelle\t\\b, MS-DOS MBR, german version 5.00 to 4.00.950\n>271\tstring\tInvalid\\ partition\\ table\\0\t\t\n>>295\tstring\tError\\ loading\\ operating\\ system\\0\t\n>>>326\tstring\tMissing\\ operating\\ system\\0\t\t\\b, mbr\n#\n>139\tstring\tInvalid\\ partition\\ table\\0\t\t\n>>163\tstring\tError\\ loading\\ operating\\ system\\0\t\n>>>194\tstring\tMissing\\ operating\\ system\\0\t\t\\b, Microsoft Windows XP mbr\n# http://www.heise.de/ct/05/09/006/ page 184\n#HKEY_LOCAL_MACHINE\\SYSTEM\\MountedDevices\\DosDevices\\?:=Serial4Bytes+8Bytes\n>>>>0x1B8\tulelong\t>0\t\t\t\t\\b,Serial 0x%-.4x\n>300\tstring\tInvalid\\ partition\\ table\\0\t\n>>324\tstring\tError\\ loading\\ operating\\ system\\0\n>>>355\tstring\tMissing\\ operating\\ system\\0\t\t\\b, Microsoft Windows XP MBR\n#??>>>389\tstring\tInvalid\\ system\\ disk\t\t\n>>>>0x1B8\tulelong\t>0\t\t\t\t\\b, Serial 0x%-.4x\n>300\tstring\tUng\\201ltige\\ Partitionstabelle\n#split string to avoid error: String too long\n>>328\tstring\tFehler\\ beim\\ Laden\\ \t\n>>>346\tstring\tdes\\ Betriebssystems\t\n>>>>366\tstring\tBetriebssystem\\ nicht\\ vorhanden\t\\b, Microsoft Windows XP MBR (german)\n>>>>>0x1B8\tulelong\t>0\t\t\t\t\\b, Serial 0x%-.4x\n#>0x145\tstring\tDefault:\\ F\t\t\t\t\\b, FREE-DOS MBR\n#>0x14B\tstring\tDefault:\\ F\t\t\t\t\\b, FREE-DOS 1.0 MBR\n>0x145\tsearch/7\tDefault:\\ F\t\t\t\\b, FREE-DOS MBR\n#>>313\t\tstring\tF0\\ .\\ .\\ .\t\t\t\n#>>>322\t\tstring\tdisk\\ 1\t\t\t\t\n#>>>>382\tstring\tFAT3\t\t\t\t\n>64\tstring\tno\\ active\\ partition\\ found\t\n>>96\tstring\tread\\ error\\ while\\ reading\\ drive\t\\b, FREE-DOS Beta 0.9 MBR\n# Ranish Partition Manager http://www.ranish.com/part/\n>387\tsearch/4\t\\0\\ Error!\\r\t\t\t\n>>378\tsearch/7\tVirus! \t\t\t\t\n>>>397\tsearch/4\tBooting\\ \t\t\t\n>>>>408\tsearch/4\tHD1/\\0\t \t\t\t\\b, Ranish MBR (\n>>>>>416\tstring\tWriting\\ changes...\t\t\\b2.37\n>>>>>>438\tubyte\t\tx\t\t\t\\b,0x%x dots\n>>>>>>440\tubyte\t\t>0\t\t\t\\b,virus check\n>>>>>>441\tubyte\t\t>0\t\t\t\\b,partition %c\n#2.38,2.42,2.44\n>>>>>416\tstring\t!Writing\\ changes...\t\t\\b\n>>>>>>418\tubyte\t1\t\t\t\t\\bvirus check,\n>>>>>>419\tubyte\tx\t\t\t\t\\b0x%x seconds\n>>>>>>420\tubyte&0x0F\t>0\t\t\t\\b,partition\n>>>>>>>420\tubyte&0x0F\t<5\t\t\t\\b %x\n>>>>>>>420\tubyte&0x0F\t0Xf\t\t\t\\b ask\n>>>>>420\tubyte\t\tx\t\t\t\\b)\n#\n>271\tstring\tOperating\\ system\\ loading \t\t\n>>296\tstring\terror\\r\t\t\t\t\t\\b, SYSLINUX MBR (2.10)\n# http://www.acronis.de/\n>362\tstring\tMBR\\ Error\\ \\0\\r\t\t\t\n>>376\tstring\tress\\ any\\ key\\ to\\ \t\t\t\n>>>392\tstring\tboot\\ from\\ floppy...\\0\t\t\t\\b, Acronis MBR\n# added by Joerg Jenderek\n# http://www.visopsys.org/\n# http://partitionlogic.org.uk/\n>309\tstring\tNo\\ bootable\\ partition\\ found\\r\t\n>>339\tstring\tI/O\\ Error\\ reading\\ boot\\ sector\\r\t\\b, Visopsys MBR\n>349\tstring\tNo\\ bootable\\ partition\\ found\\r\t\n>>379\tstring\tI/O\\ Error\\ reading\\ boot\\ sector\\r\t\\b, simple Visopsys MBR\n# bootloader, bootmanager\n>0x40\tstring\tSBML\t\t\t\t\n# label with 11 characters of FAT 12 bit filesystem\n>>43\tstring\tSMART\\ BTMGR\t\t\t\n>>>430\tstring\tSBMK\\ Bad!\\r\t\t\t\\b, Smart Boot Manager\n# OEM-ID not always \"SBM\"\n#>>>>3\tstrings\tSBM\t\t\t\t\n>>>>6\tstring\t>\\0                             \\b, version %s\n>382\tstring\tXOSLLOADXCF\t\t\t\\b, eXtended Operating System Loader\n>6\tstring\tLILO\t\t\t\t\\b, LInux i386 boot LOader\n>>120\tstring\tLILO\t\t\t\t\\b, version 22.3.4 SuSe\n>>172\tstring\tLILO\t\t\t\t\\b, version 22.5.8 Debian\n# updated by Joerg Jenderek at Oct 2008\n# variables according to grub-0.97/stage1/stage1.S or\n# http://www.gnu.org/software/grub/manual/grub.html#Embedded-data\n# usual values are marked with comments to get only informations of strange GRUB loaders\n>342\t\tsearch/60\t\\0Geom\\0\t\n#>0\t\tulelong\t\tx\t\t%x=0x009048EB ,\t0x2a9048EB  0\n>>0x41\t\tubyte\t\t<2\t\t\n>>>0x3E\t\tubyte\t\t>2\t\t\\b; GRand Unified Bootloader\n# 0x3 for 0.5.95,0.93,0.94,0.96 0x4 for 1.90 \n>>>>0x3E\tubyte\t\tx\t\t\\b, stage1 version 0x%x\n#If it is 0xFF, use a drive passed by BIOS\n>>>>0x40\tubyte\t\t<0xFF\t\t\\b, boot drive 0x%x\n# in most case 0,1,0x2e for GRUB 0.5.95\n>>>>0x41\tubyte\t\t>0\t\t\\b, LBA flag 0x%x\n>>>>0x42\tuleshort\t<0x8000\t\t\\b, stage2 address 0x%x\n#>>>>0x42\tuleshort\t=0x8000\t\t\\b, stage2 address 0x%x (usual)\n>>>>0x42\tuleshort\t>0x8000\t\t\\b, stage2 address 0x%x\n#>>>>0x44\tulelong\t\t=1\t\t\\b, 1st sector stage2 0x%x (default)\n>>>>0x44\tulelong\t\t>1\t\t\\b, 1st sector stage2 0x%x\n>>>>0x48\tuleshort\t<0x800\t\t\\b, stage2 segment 0x%x\n#>>>>0x48\tuleshort\t=0x800\t\t\\b, stage2 segment 0x%x (usual)\n>>>>0x48\tuleshort\t>0x800\t\t\\b, stage2 segment 0x%x\n>>>>402\t\tstring\tGeom\\0Hard\\ Disk\\0Read\\0\\ Error\\0\n>>>>>394\tstring\tstage1\t\t\t\\b, GRUB version 0.5.95\n>>>>382\t\tstring\tGeom\\0Hard\\ Disk\\0Read\\0\\ Error\\0\n>>>>>376\tstring\tGRUB\\ \\0\t\t\\b, GRUB version 0.93 or 1.94\n>>>>383\t\tstring\tGeom\\0Hard\\ Disk\\0Read\\0\\ Error\\0\n>>>>>377\tstring\tGRUB\\ \\0\t\t\\b, GRUB version 0.94\n>>>>385\t\tstring\tGeom\\0Hard\\ Disk\\0Read\\0\\ Error\\0\n>>>>>379\tstring\tGRUB\\ \\0\t\t\\b, GRUB version 0.95 or 0.96\n>>>>391\t\tstring\tGeom\\0Hard\\ Disk\\0Read\\0\\ Error\\0\n>>>>>385\tstring\tGRUB\\ \\0\t\t\\b, GRUB version 0.97\n#unkown version\n>>>343\t\tstring\tGeom\\0Read\\0\\ Error\\0\t\n>>>>321\t\tstring\tLoading\\ stage1.5\t\\b, GRUB version x.y\n>>>380\t\tstring\tGeom\\0Hard\\ Disk\\0Read\\0\\ Error\\0\n>>>>374\t\tstring\tGRUB\\ \\0\t\t\\b, GRUB version n.m\n# http://syslinux.zytor.com/\n>478\tstring\tBoot\\ failed\\r\t\t\t\n>>495\tstring\tLDLINUX\\ SYS\t\t\t\\b, SYSLINUX bootloader (1.62)\n>480\tstring\tBoot\\ failed\\r\t\t\t\n>>495\tstring\tLDLINUX\\ SYS\t\t\t\\b, SYSLINUX bootloader (2.06 or 2.11)\n>484\tstring\tBoot\\ error\\r\t\t\t\\b, SYSLINUX bootloader (3.11)\n>395\tstring\tchksum\\0\\ ERROR!\\0\t\t\\b, Gujin bootloader\n# http://www.bcdwb.de/bcdw/index_e.htm\n>3\tstring\tBCDL\t\t\t\t\n>>498\tstring\tBCDL\\ \\ \\ \\ BIN\t\t\t\\b, Bootable CD Loader (1.50Z)\n# mbr partion table entries\n# OEM-ID does not contain MicroSoft,NEWLDR,DOS,SYSLINUX,or MTOOLs\n>3\t\t\tstring\t\t!MS\n>>3\t\t\tstring\t\t!SYSLINUX\n>>>3\t\t\tstring\t\t!MTOOL\n>>>>3\t\t\tstring\t\t!NEWLDR\n>>>>>5\t\t\tstring\t\t!DOS\n# not FAT (32 bit)\n>>>>>>82\t\tstring\t\t!FAT32\n#not Linux kernel\n>>>>>>>514\t\tstring\t\t!HdrS\n#not BeOS\n>>>>>>>>422\t\tstring\t\t!Be\\ Boot\\ Loader\n# active flag 0 or 0x80 and type > 0\n>>>>>>>>>446\t\tubyte\t\t<0x81\t\n>>>>>>>>>>446\t\tubyte&0x7F\t0\t\n>>>>>>>>>>>450\t\tubyte\t\t>0\t\\b; partition 1: ID=0x%x\n>>>>>>>>>>>>446\t\tubyte\t\t0x80\t\\b, active\n>>>>>>>>>>>>447\t\tubyte\t\tx\t\\b, starthead %u\n#>>>>>>>>>>>>448\t\tubyte\t\tx\t\\b, start C_S: 0x%x\n#>>>>>>>>>>>>448\t\tubeshort&1023\tx\t\\b, startcylinder? %d\n>>>>>>>>>>>>454\t\tulelong\t\tx\t\\b, startsector %u\n>>>>>>>>>>>>458\t\tulelong\t\tx\t\\b, %u sectors\n#\n>>>>>>>>>462\t\tubyte\t\t<0x81\t\n>>>>>>>>>>462\t\tubyte&0x7F\t0\t\t\n>>>>>>>>>>>466\t\tubyte\t\t>0\t\\b; partition 2: ID=0x%x\n>>>>>>>>>>>>462\t\tubyte\t\t0x80\t\\b, active\n>>>>>>>>>>>>463\t\tubyte\t\tx\t\\b, starthead %u\n#>>>>>>>>>>>>464\t\tubyte\t\tx\t\\b, start C_S: 0x%x\n#>>>>>>>>>>>>464\t\tubeshort&1023\tx\t\\b, startcylinder? %d\n>>>>>>>>>>>>470\t\tulelong\t\tx\t\\b, startsector %u\n>>>>>>>>>>>>474\t\tulelong\t\tx\t\\b, %u sectors\n#\n>>>>>>>>>478\t\tubyte\t\t<0x81\t\t\n>>>>>>>>>>478\t\tubyte&0x7F\t0\t\t\n>>>>>>>>>>>482\t\tubyte\t\t>0\t\\b; partition 3: ID=0x%x\n>>>>>>>>>>>>478\t\tubyte\t\t0x80\t\\b, active\n>>>>>>>>>>>>479\t\tubyte\t\tx\t\\b, starthead %u\n#>>>>>>>>>>>>480\t\tubyte\t\tx\t\\b, start C_S: 0x%x\n#>>>>>>>>>>>>481\t\tubyte\t\tx\t\\b, start C2S: 0x%x\n#>>>>>>>>>>>>480\t\tubeshort&1023\tx\t\\b, startcylinder? %d\n>>>>>>>>>>>>486\t\tulelong\t\tx\t\\b, startsector %u\n>>>>>>>>>>>>490\t\tulelong\t\tx\t\\b, %u sectors\n#\n>>>>>>>>>494\t\tubyte\t\t<0x81\t\n>>>>>>>>>>494\t\tubyte&0x7F\t0\t\t\n>>>>>>>>>>>498\t\tubyte\t\t>0\t\\b; partition 4: ID=0x%x\n>>>>>>>>>>>>494\t\tubyte\t\t0x80\t\\b, active\n>>>>>>>>>>>>495\t\tubyte\t\tx\t\\b, starthead %u\n#>>>>>>>>>>>>496\t\tubyte\t\tx\t\\b, start C_S: 0x%x\n#>>>>>>>>>>>>496\t\tubeshort&1023\tx\t\\b, startcylinder? %d\n>>>>>>>>>>>>502\t\tulelong\t\tx\t\\b, startsector %u\n>>>>>>>>>>>>506\t\tulelong\t\tx\t\\b, %u sectors\n# mbr partion table entries end\n# http://www.acronis.de/\n#FAT label=ACRONIS\\ SZ\n#OEM-ID=BOOTWIZ0\n>442\tstring\tNon-system\\ disk,\\ \t\n>>459\tstring\tpress\\ any\\ key...\\x7\\0\t\t\\b, Acronis Startup Recovery Loader\n# DOS names like F11.SYS are 8 right space padded bytes+3 bytes\n>>>477\t\tubyte&0xDF\t>0\t\t\n>>>>477\t\tstring\t\tx \t\t\\b %-.3s\n>>>>>480\tubyte&0xDF\t>0\t\t\n>>>>>>480\tstring\t\tx \t\t\\b%-.5s\n>>>>485\t\tubyte&0xDF\t>0\t\t\n>>>>>485\tstring\t\tx \t\t\\b.%-.3s\n#\n>185\tstring\tFDBOOT\\ Version\\ \t\t\t\n>>204\tstring\t\\rNo\\ Systemdisk.\\ \t\t\t\n>>>220\tstring\tBooting\\ from\\ harddisk.\\n\\r\t\t\n>>>245\tstring\tCannot\\ load\\ from\\ harddisk.\\n\\r\t\n>>>>273 string\tInsert\\ Systemdisk\\ \t\t\t\n>>>>>291 string and\\ press\\ any\\ key.\\n\\r\t\t\\b, FDBOOT harddisk Bootloader\n>>>>>>200 string\t>\\0                             \\b, version %-3s\n>242\tstring\tBootsector\\ from\\ C.H.\\ Hochst\\204\t\n>>278\tstring\tNo\\ Systemdisk.\\ \t\t\t\n>>>293\tstring\tBooting\\ from\\ harddisk.\\n\\r\t\t\n>>>441\tstring\tCannot\\ load\\ from\\ harddisk.\\n\\r\t\n>>>>469 string\tInsert\\ Systemdisk\\ \t\t\t\n>>>>>487 string and\\ press\\ any\\ key.\\n\\r\t\t\\b, WinImage harddisk Bootloader\n>>>>>>209 string\t>\\0                             \\b, version %-4.4s\n>(1.b+2)\tubyte\t\t0xe\t\t\t\n>>(1.b+3)\tubyte\t\t0x1f\t\t\t\n>>>(1.b+4)\tubyte\t\t0xbe\t\t\t\n>>>>(1.b+5)\tubyte\t\t0x77\t\t\t\n>>>>(1.b+6)\tubyte\t\t0x7c\t\t\t\n>>>>>(1.b+7)\tubyte\t\t0xac\t\t\t\n>>>>>>(1.b+8)\tubyte\t\t0x22\t\t\t\n>>>>>>>(1.b+9)\tubyte\t\t0xc0\t\t\t\n>>>>>>>>(1.b+10)\tubyte\t0x74\t\t\t\n>>>>>>>>>(1.b+11)\tubyte\t0xb\t\t\t\n>>>>>>>>>>(1.b+12)\tubyte\t0x56\t\t\t\n>>>>>>>>>>(1.b+13)\tubyte\t0xb4\t\t\t\\b, mkdosfs boot message display\n>214\tstring\tPlease\\ try\\ to\\ install\\ FreeDOS\\ \t\\b, DOS Emulator boot message display\n#>>244\tstring\tfrom\\ dosemu-freedos-*-bin.tgz\\r\t\n#>>>170\tstring\tSorry,\\ could\\ not\\ load\\ an\\ \t\t\n#>>>>195\tstring\toperating\\ system.\\r\\n\t\t\n#\n>103\tstring\tThis\\ is\\ not\\ a\\ bootable\\ disk.\\ \t\n>>132\tstring\tPlease\\ insert\\ a\\ bootable\\ \t\t\n>>>157\tstring\tfloppy\\ and\\r\\n\t\t\t\t\n>>>>169\tstring\tpress\\ any\\ key\\ to\\ try\\ again...\\r\t\\b, FREE-DOS message display\n#\n>66\tstring\tSolaris\\ Boot\\ Sector    \t\t\n>>99\tstring\tIncomplete\\ MDBoot\\ load.\t\t\n>>>89\tstring\tVersion \t\t\t\t\\b, Sun Solaris Bootloader\n>>>>97\tbyte\tx\t\t\t\t\tversion %c\n#\n>408\tstring\tOS/2\\ !!\\ SYS01475\\r\\0\t\t\t\n>>429\tstring\tOS/2\\ !!\\ SYS02025\\r\\0\t\t\t\n>>>450\tstring\tOS/2\\ !!\\ SYS02027\\r\\0\t\t\t\n>>>469\tstring\tOS2BOOT\\ \\ \\ \\ \t\t\t\t\\b, IBM OS/2 Warp bootloader\n#\n>409\tstring\tOS/2\\ !!\\ SYS01475\\r\\0\t\t\t\n>>430\tstring\tOS/2\\ !!\\ SYS02025\\r\\0\t\t\t\n>>>451\tstring\tOS/2\\ !!\\ SYS02027\\r\\0\t\t\t\n>>>470\tstring\tOS2BOOT\\ \\ \\ \\ \t\t\t\t\\b, IBM OS/2 Warp Bootloader\n>112\t\tstring\tThis\\ disk\\ is\\ not\\ bootable\\r\t\t\t\n>>142\t\tstring\tIf\\ you\\ wish\\ to\\ make\\ it\\ bootable\t\t\n>>>176\t\tstring\trun\\ the\\ DOS\\ program\\ SYS\\  \t\t\t\n>>>200\t\tstring\tafter\\ the\\r\t\t\t\t\t\n>>>>216\t\tstring\tsystem\\ has\\ been\\ loaded\\r\\n\t\t\t\n>>>>>242\tstring\tPlease\\ insert\\ a\\ DOS\\ diskette\\ \t\t\n>>>>>271\tstring\tinto\\r\\n\\ the\\ drive\\ and\\ \t\t\t\n>>>>>>292\tstring\tstrike\\ any\\ key...\\0\t\t\\b, IBM OS/2 Warp message display\n# XP\n>430\tstring\tNTLDR\\ is\\ missing\\xFF\\r\\n\t\t\n>>449\tstring\tDisk\\ error\\xFF\\r\\n\t\t\t\n>>>462\tstring\tPress\\ any\\ key\\ to\\ restart\\r\t\t\\b, Microsoft Windows XP Bootloader\n# DOS names like NTLDR,CMLDR,$LDR$ are 8 right space padded bytes+3 bytes\n>>>>417\t\tubyte&0xDF\t>0\t\t\t\n>>>>>417\tstring\t\tx\t\t\t%-.5s\n>>>>>>422\tubyte&0xDF\t>0\t\t\t\n>>>>>>>422\tstring\t\tx \t\t\t\\b%-.3s\n>>>>>425\tubyte&0xDF\t>0\t\t\t\n>>>>>>425\tstring\t\t>\\ \t\t\t\\b.%-.3s\n#\n>>>>371\t\tubyte\t\t>0x20\t\t\t\n>>>>>368\tubyte&0xDF\t>0\t\t\t\n>>>>>>368\tstring\t\tx \t\t\t%-.5s\n>>>>>>>373\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>373\tstring\t\tx \t\t\t\\b%-.3s\n>>>>>>376\tubyte&0xDF\t>0\t\t\t\n>>>>>>>376\tstring\t\tx \t\t\t\\b.%-.3s\n#\n>430\tstring\tNTLDR\\ nicht\\ gefunden\\xFF\\r\\n\t\t\n>>453\tstring\tDatentr\\204gerfehler\\xFF\\r\\n\t\t\n>>>473\tstring\tNeustart\\ mit\\ beliebiger\\ Taste\\r\t\\b, Microsoft Windows XP Bootloader (german)\n>>>>417\t\tubyte&0xDF\t>0\t\t\t\n>>>>>417\tstring\t\tx\t\t\t%-.5s\n>>>>>>422\tubyte&0xDF\t>0\t\t\t\n>>>>>>>422\tstring\t\tx \t\t\t\\b%-.3s\n>>>>>425\tubyte&0xDF\t>0\t\t\t\n>>>>>>425\tstring\t\t>\\ \t\t\t\\b.%-.3s\n# offset variant\n>>>>379\tstring\t\\0\t\t\t\t\t\n>>>>>368\tubyte&0xDF\t>0\t\t\t\n>>>>>>368\tstring\t\tx \t\t\t%-.5s\n>>>>>>>373\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>373\tstring\t\tx \t\t\t\\b%-.3s\n#\n>430\tstring\tNTLDR\\ fehlt\\xFF\\r\\n\t\t\t\n>>444\tstring\tDatentr\\204gerfehler\\xFF\\r\\n\t\t\n>>>464\tstring\tNeustart\\ mit\\ beliebiger\\ Taste\\r\t\\b, Microsoft Windows XP Bootloader (2.german)\n>>>>417\t\tubyte&0xDF\t>0\t\t\t\n>>>>>417\tstring\t\tx\t\t\t%-.5s\n>>>>>>422\tubyte&0xDF\t>0\t\t\t\n>>>>>>>422\tstring\t\tx \t\t\t\\b%-.3s\n>>>>>425\tubyte&0xDF\t>0\t\t\t\n>>>>>>425\tstring\t\t>\\ \t\t\t\\b.%-.3s\n# variant\n>>>>371\t\tubyte\t\t>0x20\t\t\t\n>>>>>368\tubyte&0xDF\t>0\t\t\t\n>>>>>>368\tstring\t\tx \t\t\t%-.5s\n>>>>>>>373\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>373\tstring\t\tx \t\t\t\\b%-.3s\n>>>>>>376\tubyte&0xDF\t>0\t\t\t\n>>>>>>>376\tstring\t\tx \t\t\t\\b.%-.3s\n#\n>430\tstring\tNTLDR\\ fehlt\\xFF\\r\\n\t\t\t\n>>444\tstring\tMedienfehler\\xFF\\r\\n\t\t\t\n>>>459\tstring\tNeustart:\\ Taste\\ dr\\201cken\\r\t\t\\b, Microsoft Windows XP Bootloader (3.german)\n>>>>371\t\tubyte\t\t>0x20\t\t\t\n>>>>>368\tubyte&0xDF\t>0\t\t\t\n>>>>>>368\tstring\t\tx \t\t\t%-.5s\n>>>>>>>373\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>373\tstring\t\tx \t\t\t\\b%-.3s\n>>>>>>376\tubyte&0xDF\t>0\t\t\t\n>>>>>>>376\tstring\t\tx \t\t\t\\b.%-.3s\n# variant\n>>>>417\t\tubyte&0xDF\t>0\t\t\t\n>>>>>417\tstring\t\tx\t\t\t%-.5s\n>>>>>>422\tubyte&0xDF\t>0\t\t\t\n>>>>>>>422\tstring\t\tx \t\t\t\\b%-.3s\n>>>>>425\tubyte&0xDF\t>0\t\t\t\n>>>>>>425\tstring\t\t>\\ \t\t\t\\b.%-.3s\n#\n>430\tstring\tDatentr\\204ger\\ entfernen\\xFF\\r\\n\t\n>>454\tstring\tMedienfehler\\xFF\\r\\n\t\t\t\n>>>469\tstring\tNeustart:\\ Taste\\ dr\\201cken\\r\t\t\\b, Microsoft Windows XP Bootloader (4.german)\n>>>>379\t\tstring\t\t\\0\t\t\t\n>>>>>368\tubyte&0xDF\t>0\t\t\t\n>>>>>>368\tstring\t\tx \t\t\t%-.5s\n>>>>>>>373\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>373\tstring\t\tx \t\t\t\\b%-.3s\n>>>>>>376\tubyte&0xDF\t>0\t\t\t\n>>>>>>>376\tstring\t\tx \t\t\t\\b.%-.3s\n# variant\n>>>>417\t\tubyte&0xDF\t>0\t\t\t\n>>>>>417\tstring\t\tx\t\t\t%-.5s\n>>>>>>422\tubyte&0xDF\t>0\t\t\t\n>>>>>>>422\tstring\t\tx \t\t\t\\b%-.3s\n>>>>>425\tubyte&0xDF\t>0\t\t\t\n>>>>>>425\tstring\t\t>\\ \t\t\t\\b.%-.3s\n#\n\n#>3\tstring\tNTFS\\ \\ \\ \\ \t\t\t\t\n>389\tstring\tFehler\\ beim\\ Lesen\\ \n>>407\tstring\tdes\\ Datentr\\204gers\n>>>426\tstring\tNTLDR\\ fehlt\t\t\t\t\n>>>>440\tstring\tNTLDR\\ ist\\ komprimiert\n>>>>>464 string\tNeustart\\ mit\\ Strg+Alt+Entf\\r\t\t\\b, Microsoft Windows XP Bootloader NTFS (german)\n#>3\tstring\tNTFS\\ \\ \\ \\ \t\t\t\t\n>313\tstring\tA\\ disk\\ read\\ error\\ occurred.\\r\n>>345\tstring\tA\\ kernel\\ file\\ is\\ missing\\ \t\n>>>370\tstring\tfrom\\ the\\ disk.\\r\t\t\n>>>>484\tstring\tNTLDR\\ is\\ compressed\t\t\n>>>>>429 string\tInsert\\ a\\ system\\ diskette\\ \t\n>>>>>>454 string and\\ restart\\r\\nthe\\ system.\\r\t\t\\b, Microsoft Windows XP Bootloader NTFS\n# DOS loader variants different languages,offsets\n>472\tubyte&0xDF\t>0\n>>389\tstring\tInvalid\\ system\\ disk\\xFF\\r\\n\t\t\n>>>411\tstring\tDisk\\ I/O\\ error\t\t\t\n>>>>428\tstring\tReplace\\ the\\ disk,\\ and\\ \t\t\n>>>>>455 string\tpress\\ any\\ key\t\t\t\t\\b, Microsoft Windows 98 Bootloader\n#IO.SYS\n>>>>>>472\tubyte&0xDF\t>0\t\t\t\n>>>>>>>472\tstring\t\tx \t\t\t\\b %-.2s\n>>>>>>>>474\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>474\tstring\t\tx \t\t\t\\b%-.5s\n>>>>>>>>>>479\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>>>479 string\t\tx \t\t\t\\b%-.1s\n>>>>>>>480\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>480\tstring\t\tx \t\t\t\\b.%-.3s\n#MSDOS.SYS\n>>>>>>>483\tubyte&0xDF\t>0\t\t\t\\b+\n>>>>>>>>483\tstring\t\tx \t\t\t\\b%-.5s\n>>>>>>>>>488\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>>488\tstring\t\tx \t\t\t\\b%-.3s\n>>>>>>>>491\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>491\tstring\t\tx \t\t\t\\b.%-.3s\n#\n>>390\tstring\tInvalid\\ system\\ disk\\xFF\\r\\n\t\t\n>>>412\tstring\tDisk\\ I/O\\ error\\xFF\\r\\n\t\t\n>>>>429\tstring\tReplace\\ the\\ disk,\\ and\\ \t\t\n>>>>>451 string\tthen\\ press\\ any\\ key\\r\t\t\t\\b, Microsoft Windows 98 Bootloader\n>>388\tstring\tUngueltiges\\ System\\ \\xFF\\r\\n\t\t\n>>>410\tstring\tE/A-Fehler\\ \\ \\ \\ \\xFF\\r\\n\t\t\n>>>>427\tstring\tDatentraeger\\ wechseln\\ und\\ \t\t\n>>>>>453 string\tTaste\\ druecken\\r\t\t\t\\b, Microsoft Windows 95/98/ME Bootloader (german)\n#WINBOOT.SYS only not spaces (0xDF)\n>>>>>>497\tubyte&0xDF\t>0\t\t\t\n>>>>>>>497\tstring\t\tx \t\t\t%-.5s\n>>>>>>>>502\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>502\tstring\t\tx \t\t\t\\b%-.1s\n>>>>>>>>>>503\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>>>503\tstring\t\tx \t\t\t\\b%-.1s\n>>>>>>>>>>>>504\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>>>>>504 string\t\tx \t\t\t\\b%-.1s\n>>>>>>505\tubyte&0xDF\t>0\t\t\t\n>>>>>>>505\tstring\t\tx \t\t\t\\b.%-.3s\n#IO.SYS\n>>>>>>472\tubyte&0xDF\t>0\t\t\tor\n>>>>>>>472\tstring\t\tx \t\t\t\\b %-.2s\n>>>>>>>>474\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>474\tstring\t\tx \t\t\t\\b%-.5s\n>>>>>>>>>>479\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>>>479 string\t\tx \t\t\t\\b%-.1s\n>>>>>>>480\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>480\tstring\t\tx \t\t\t\\b.%-.3s\n#MSDOS.SYS\n>>>>>>>483\tubyte&0xDF\t>0\t\t\t\\b+\n>>>>>>>>483\tstring\t\tx \t\t\t\\b%-.5s\n>>>>>>>>>488\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>>488\tstring\t\tx \t\t\t\\b%-.3s\n>>>>>>>>491\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>491\tstring\t\tx \t\t\t\\b.%-.3s\n#\n>>390\tstring\tUngueltiges\\ System\\ \\xFF\\r\\n\t\t\n>>>412\tstring\tE/A-Fehler\\ \\ \\ \\ \\xFF\\r\\n\t\t\n>>>>429\tstring\tDatentraeger\\ wechseln\\ und\\ \t\t\n>>>>>455 string\tTaste\\ druecken\\r\t\t\t\\b, Microsoft Windows 95/98/ME Bootloader (German)\n#WINBOOT.SYS only not spaces (0xDF)\n>>>>>>497\tubyte&0xDF\t>0\t\t\t\n>>>>>>>497\tstring\t\tx \t\t\t%-.7s\n>>>>>>>>504\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>504\tstring\t\tx \t\t\t\\b%-.1s\n>>>>>>505\tubyte&0xDF\t>0\t\t\t\n>>>>>>>505\tstring\t\tx \t\t\t\\b.%-.3s\n#IO.SYS\n>>>>>>472\tubyte&0xDF\t>0\t\t\tor\n>>>>>>>472\tstring\t\tx \t\t\t\\b %-.2s\n>>>>>>>>474\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>474\tstring\t\tx \t\t\t\\b%-.6s\n>>>>>>>480\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>480\tstring\t\tx \t\t\t\\b.%-.3s\n#MSDOS.SYS\n>>>>>>>483\tubyte&0xDF\t>0\t\t\t\\b+\n>>>>>>>>483\tstring\t\tx \t\t\t\\b%-.5s\n>>>>>>>>>488\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>>488\tstring\t\tx \t\t\t\\b%-.3s\n>>>>>>>>491\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>491\tstring\t\tx \t\t\t\\b.%-.3s\n#\n>>389\tstring\tUngueltiges\\ System\\ \\xFF\\r\\n\t\t\n>>>411\tstring\tE/A-Fehler\\ \\ \\ \\ \\xFF\\r\\n\t\t\n>>>>428\tstring\tDatentraeger\\ wechseln\\ und\\ \t\t\n>>>>>454 string\tTaste\\ druecken\\r\t\t\t\\b, Microsoft Windows 95/98/ME Bootloader (GERMAN)\n# DOS names like IO.SYS,WINBOOT.SYS,MSDOS.SYS,WINBOOT.INI are 8 right space padded bytes+3 bytes\n>>>>>>472\tstring\t\tx \t\t\t%-.2s\n>>>>>>>474\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>474\tstring\t\tx \t\t\t\\b%-.5s\n>>>>>>>>479\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>479\tstring\t\tx \t\t\t\\b%-.1s\n>>>>>>480\tubyte&0xDF\t>0\t\t\t\n>>>>>>>480\tstring\t\tx \t\t\t\\b.%-.3s\n>>>>>>483\tubyte&0xDF\t>0\t\t\t\\b+\n>>>>>>>483\tstring\t\tx \t\t\t\\b%-.5s\n>>>>>>>488\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>488\tstring\t\tx \t\t\t\\b%-.2s\n>>>>>>>>490\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>490\tstring\t\tx \t\t\t\\b%-.1s\n>>>>>>>491\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>491\tstring\t\tx \t\t\t\\b.%-.3s\n>479\tubyte&0xDF\t>0\n>>416\tstring\tKein\\ System\\ oder\\ \t\t\t\n>>>433\tstring\tLaufwerksfehler\t\t\t\t\n>>>>450\tstring\tWechseln\\ und\\ Taste\\ dr\\201cken\t\\b, Microsoft DOS Bootloader (german)\n#IO.SYS\n>>>>>479\tstring\t\tx \t\t\t\\b %-.2s\n>>>>>>481\tubyte&0xDF\t>0\t\t\t\n>>>>>>>481\tstring\t\tx \t\t\t\\b%-.6s\n>>>>>487\tubyte&0xDF\t>0\t\t\t\n>>>>>>487\tstring\t\tx \t\t\t\\b.%-.3s\n#MSDOS.SYS\n>>>>>>490\tubyte&0xDF\t>0\t\t\t\\b+\n>>>>>>>490\tstring\t\tx \t\t\t\\b%-.5s\n>>>>>>>>495\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>495\tstring\t\tx \t\t\t\\b%-.3s\n>>>>>>>498\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>498\tstring\t\tx \t\t\t\\b.%-.3s\n#\n>376\tsearch/41\tNon-System\\ disk\\ or\\ \t\t\n>>395\tsearch/41\tdisk\\ error\\r\t\t\t\n>>>407\tsearch/41\tReplace\\ and\\ \t\t\t\n>>>>419\tsearch/41\tpress\\ \t\t\t\t\\b,\n>>>>419\tsearch/41\tstrike\\ \t\t\t\\b, old\n>>>>426\tsearch/41\tany\\ key\\ when\\ ready\\r\t\tMS or PC-DOS bootloader\n#449\t\t\tDisk\\ Boot\\ failure\\r\t\tMS 3.21\n#466\t\t\tBoot\\ Failure\\r\t\t\tMS 3.30\n>>>>>468 search/18\t\\0\t\t\t\t\n#IO.SYS,IBMBIO.COM\n>>>>>>&0\tstring\t\tx \t\t\t\\b %-.2s\n>>>>>>>&-20\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>&-1\tstring\t\tx \t\t\t\\b%-.4s\n>>>>>>>>>&-16\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>>&-1\tstring\t\tx \t\t\t\\b%-.2s\n>>>>>>&8\tubyte&0xDF\t>0\t\t\t\\b.\n>>>>>>>&-1\tstring\t\tx \t\t\t\\b%-.3s\n#MSDOS.SYS,IBMDOS.COM\n>>>>>>&11\tubyte&0xDF\t>0\t\t\t\\b+\n>>>>>>>&-1\tstring\t\tx \t\t\t\\b%-.5s\n>>>>>>>>&-6\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>&-1\tstring\t\tx \t\t\t\\b%-.1s\n>>>>>>>>>>&-5\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>>>>&-1\tstring\t\tx \t\t\t\\b%-.2s\n>>>>>>>&7\tubyte&0xDF\t>0\t\t\t\\b.\n>>>>>>>>&-1\tstring\t\tx \t\t\t\\b%-.3s\n>441\tstring\tCannot\\ load\\ from\\ harddisk.\\n\\r\n>>469\tstring\tInsert\\ Systemdisk\\ \t\t\t\n>>>487\tstring\tand\\ press\\ any\\ key.\\n\\r\t\t\\b, MS (2.11) DOS bootloader\n#>43\tstring\t\\224R-LOADER\\ \\ SYS\t\t\t=label\t\t\t\t\t\n>54\tstring\tSYS\n>>324\tstring\tVASKK\n>>>495\tstring\tNEWLDR\\0\t\t\t\t\\b, DR-DOS Bootloader (LOADER.SYS)\n#\n>98\tstring\tPress\\ a\\ key\\ to\\ retry\\0\\r\t\t\n>>120\tstring\tCannot\\ find\\ file\\ \\0\\r\t\t\n>>>139\tstring\tDisk\\ read\\ error\\0\\r\t\t\t\n>>>>156\tstring\tLoading\\ ...\\0\t\t\t\t\\b, DR-DOS (3.41) Bootloader\n#DRBIOS.SYS\n>>>>>44\t\tubyte&0xDF\t>0\t\t\t\n>>>>>>44\tstring\t\tx\t\t\t\\b %-.6s\n>>>>>>>50\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>50\tstring\t\tx \t\t\t\\b%-.2s\n>>>>>>52\tubyte&0xDF\t>0\t\t\t\n>>>>>>>52\tstring\t\tx \t\t\t\\b.%-.3s\n#\n>70\tstring\tIBMBIO\\ \\ COM\t\t\t\t\n>>472\tstring\tCannot\\ load\\ DOS!\\ \t\t\t\n>>>489\tstring\tAny\\ key\\ to\\ retry\t\t\t\\b, DR-DOS Bootloader\n>>471\tstring\tCannot\\ load\\ DOS\\ \t\t\t\n>>487\tstring\tpress\\ key\\ to\\ retry\t\t\t\\b, Open-DOS Bootloader\n#??\n>444\tstring\tKERNEL\\ \\ SYS\t\t\t\t\t\n>>314\tstring\tBOOT\\ error!\t\t\t\t\\b, FREE-DOS Bootloader\n>499\tstring\tKERNEL\\ \\ SYS\t\t\t\t\n>>305\tstring\tBOOT\\ err!\\0\t\t\t\t\\b, Free-DOS Bootloader\n>449\tstring\tKERNEL\\ \\ SYS\t\t\t\t\n>>319\tstring\tBOOT\\ error!\t\t\t\t\\b, FREE-DOS 0.5 Bootloader\n#\n>449\tstring\tLoading\\ FreeDOS\t\t\t\n>>0x1AF\t\tulelong\t\t>0\t\t\t\\b, FREE-DOS 0.95,1.0 Bootloader\n>>>497\t\tubyte&0xDF\t>0\t\t\t\n>>>>497\t\tstring\t\tx \t\t\t\\b %-.6s\n>>>>>503\tubyte&0xDF\t>0\t\t\t\n>>>>>>503\tstring\t\tx \t\t\t\\b%-.1s\n>>>>>>>504\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>504\tstring\t\tx \t\t\t\\b%-.1s\n>>>>505\t\tubyte&0xDF\t>0\t\t\t\n>>>>>505\tstring\t\tx \t\t\t\\b.%-.3s\n#\n>331\tstring\tError!.0\t\t\t\t\\b, FREE-DOS 1.0 bootloader\n#\n>125\tstring\tLoading\\ FreeDOS...\\r\t\t\t\n>>311\tstring\tBOOT\\ error!\\r\t\t\t\t\\b, FREE-DOS bootloader\n>>>441\t\tubyte&0xDF\t>0\t\t\t\n>>>>441\t\tstring\t\tx \t\t\t\\b %-.6s\n>>>>>447\tubyte&0xDF\t>0\t\t\t\n>>>>>>447\tstring\t\tx \t\t\t\\b%-.1s\n>>>>>>>448\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>448\tstring\t\tx \t\t\t\\b%-.1s\n>>>>449\t\tubyte&0xDF\t>0\t\t\t\n>>>>>449\tstring\t\tx \t\t\t\\b.%-.3s\n>124\tstring\tFreeDOS\\0\t\t\t\t\n>>331\tstring\t\\ err\\0\t\t\t\t\t\\b, FREE-DOS BETa 0.9 Bootloader\n# DOS names like KERNEL.SYS,KERNEL16.SYS,KERNEL32.SYS,METAKERN.SYS are 8 right space padded bytes+3 bytes\n>>>497\t\tubyte&0xDF\t>0\t\t\t\n>>>>497\t\tstring\t\tx \t\t\t\\b %-.6s\n>>>>>503\tubyte&0xDF\t>0\t\t\t\n>>>>>>503\tstring\t\tx \t\t\t\\b%-.1s\n>>>>>>>504\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>504\tstring\t\tx \t\t\t\\b%-.1s\n>>>>505\t\tubyte&0xDF\t>0\t\t\t\n>>>>>505\tstring\t\tx \t\t\t\\b.%-.3s\n>>333\tstring\t\\ err\\0\t\t\t\t\t\\b, FREE-DOS BEta 0.9 Bootloader\n>>>497\t\tubyte&0xDF\t>0\t\t\t\n>>>>497\t\tstring\t\tx \t\t\t\\b %-.6s\n>>>>>503\tubyte&0xDF\t>0\t\t\t\n>>>>>>503\tstring\t\tx \t\t\t\\b%-.1s\n>>>>>>>504\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>504\tstring\t\tx \t\t\t\\b%-.1s\n>>>>505\t\tubyte&0xDF\t>0\t\t\t\n>>>>>505\tstring\t\tx \t\t\t\\b.%-.3s\n>>334\tstring\t\\ err\\0\t\t\t\t\t\\b, FREE-DOS Beta 0.9 Bootloader\n>>>497\t\tubyte&0xDF\t>0\t\t\t\n>>>>497\t\tstring\t\tx \t\t\t\\b %-.6s\n>>>>>503\tubyte&0xDF\t>0\t\t\t\n>>>>>>503\tstring\t\tx \t\t\t\\b%-.1s\n>>>>>>>504\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>504\tstring\t\tx \t\t\t\\b%-.1s\n>>>>505\t\tubyte&0xDF\t>0\t\t\t\n>>>>>505\tstring\t\tx \t\t\t\\b.%-.3s\n>336\tstring\tError!\\ \t\t\t\t\n>>343\tstring\tHit\\ a\\ key\\ to\\ reboot.\t\t\\b, FREE-DOS Beta 0.9sr1 Bootloader\n>>>497\t\tubyte&0xDF\t>0\t\t\t\n>>>>497\t\tstring\t\tx \t\t\t\\b %-.6s\n>>>>>503\tubyte&0xDF\t>0\t\t\t\n>>>>>>503\tstring\t\tx \t\t\t\\b%-.1s\n>>>>>>>504\tubyte&0xDF\t>0\t\t\t\n>>>>>>>>504\tstring\t\tx \t\t\t\\b%-.1s\n>>>>505\t\tubyte&0xDF\t>0\t\t\t\n>>>>>505\tstring\t\tx \t\t\t\\b.%-.3s\n# added by Joerg Jenderek\n# http://www.visopsys.org/\n# http://partitionlogic.org.uk/\n# OEM-ID=Visopsys\n>478\t\tulelong\t0\t\t\t\t\t\n>>(1.b+326)\tstring\tI/O\\ Error\\ reading\\ \t\t\t\n>>>(1.b+344)\tstring\tVisopsys\\ loader\\r\t\t\t\n>>>>(1.b+361)\tstring\tPress\\ any\\ key\\ to\\ continue.\\r\t\\b, Visopsys loader\n# http://alexfru.chat.ru/epm.html#bootprog\n>494\tubyte\t>0x4D\t\t\t\t\t\n>>495\tstring\t>E\t\t\t\t\t\n>>>495\tstring\t<S\t\t\t\t\t\n#OEM-ID is not reliable\n>>>>3\tstring\tBootProg\t\t\t\t\n# It just looks for a program file name at the root directory\n# and loads corresponding file with following execution.\n# DOS names like STARTUP.BIN,STARTUPC.COM,STARTUPE.EXE are 8 right space padded bytes+3 bytes\n>>>>499\t\t\tubyte&0xDF\t>0\t\t\\b, COM/EXE Bootloader\n>>>>>499\t\tstring\t\tx \t\t\\b %-.1s\n>>>>>>500\t\tubyte&0xDF\t>0\t\t\n>>>>>>>500\t\tstring\t\tx \t\t\\b%-.1s\n>>>>>>>>501\t\tubyte&0xDF\t>0\t\t\n>>>>>>>>>501\t\tstring\t\tx \t\t\\b%-.1s\n>>>>>>>>>>502\t\tubyte&0xDF\t>0\t\t\n>>>>>>>>>>>502\t\tstring\t\tx \t\t\\b%-.1s\n>>>>>>>>>>>>503\t\tubyte&0xDF\t>0\t\t\n>>>>>>>>>>>>>503\tstring\t\tx \t\t\\b%-.1s\n>>>>>>>>>>>>>>504\tubyte&0xDF\t>0\t\t\n>>>>>>>>>>>>>>>504\tstring\t\tx \t\t\\b%-.1s\n>>>>>>>>>>>>>>>>505\tubyte&0xDF\t>0\t\t\n>>>>>>>>>>>>>>>>>505\tstring\t\tx \t\t\\b%-.1s\n>>>>>>>>>>>>>>>>>>506\tubyte&0xDF\t>0\t\t\n>>>>>>>>>>>>>>>>>>>506\tstring\t\tx \t\t\\b%-.1s\n#name extension\n>>>>>507\t\tubyte&0xDF\t>0\t\t\\b.\n>>>>>>507\t\tstring\t\tx \t\t\\b%-.1s\n>>>>>>>508\t\tubyte&0xDF\t>0\t\t\n>>>>>>>>508\t\tstring\t\tx \t\t\\b%-.1s\n>>>>>>>>>509\t\tubyte&0xDF\t>0\t\t\n>>>>>>>>>>509\t\tstring\t\tx \t\t\\b%-.1s\n#If the boot sector fails to read any other sector,\n#it prints a very short message (\"RE\") to the screen and hangs the computer.\n#If the boot sector fails to find needed program in the root directory,\n#it also hangs with another message (\"NF\").\n>>>>>492\t\tstring\t\tRENF\t\t\\b, FAT (12 bit)\n>>>>>495\t\tstring\t\tRENF\t\t\\b, FAT (16 bit)\n# http://alexfru.chat.ru/epm.html#bootprog\n>494\tubyte\t>0x4D\t\t\t\t\t\n>>495\tstring\t>E\t\t\t\t\t\n>>>495\tstring\t<S\t\t\t\t\t\n#OEM-ID is not reliable\n>>>>3\tstring\tBootProg\t\t\t\t\n# It just looks for a program file name at the root directory\n# and loads corresponding file with following execution.\n# DOS names like STARTUP.BIN,STARTUPC.COM,STARTUPE.EXE are 8 right space padded bytes+3 bytes\n>>>>499\t\t\tubyte&0xDF\t>0\t\t\\b, COM/EXE Bootloader\n>>>>>499\t\tstring\t\tx \t\t\\b %-.1s\n>>>>>>500\t\tubyte&0xDF\t>0\t\t\n>>>>>>>500\t\tstring\t\tx \t\t\\b%-.1s\n>>>>>>>>501\t\tubyte&0xDF\t>0\t\t\n>>>>>>>>>501\t\tstring\t\tx \t\t\\b%-.1s\n>>>>>>>>>>502\t\tubyte&0xDF\t>0\t\t\n>>>>>>>>>>>502\t\tstring\t\tx \t\t\\b%-.1s\n>>>>>>>>>>>>503\t\tubyte&0xDF\t>0\t\t\n>>>>>>>>>>>>>503\tstring\t\tx \t\t\\b%-.1s\n>>>>>>>>>>>>>>504\tubyte&0xDF\t>0\t\t\n>>>>>>>>>>>>>>>504\tstring\t\tx \t\t\\b%-.1s\n>>>>>>>>>>>>>>>>505\tubyte&0xDF\t>0\t\t\n>>>>>>>>>>>>>>>>>505\tstring\t\tx \t\t\\b%-.1s\n>>>>>>>>>>>>>>>>>>506\tubyte&0xDF\t>0\t\t\n>>>>>>>>>>>>>>>>>>>506\tstring\t\tx \t\t\\b%-.1s\n#name extension\n>>>>>507\t\tubyte&0xDF\t>0\t\t\\b.\n>>>>>>507\t\tstring\t\tx \t\t\\b%-.1s\n>>>>>>>508\t\tubyte&0xDF\t>0\t\t\n>>>>>>>>508\t\tstring\t\tx \t\t\\b%-.1s\n>>>>>>>>>509\t\tubyte&0xDF\t>0\t\t\n>>>>>>>>>>509\t\tstring\t\tx \t\t\\b%-.1s\n#If the boot sector fails to read any other sector,\n#it prints a very short message (\"RE\") to the screen and hangs the computer.\n#If the boot sector fails to find needed program in the root directory,\n#it also hangs with another message (\"NF\").\n>>>>>492\t\tstring\t\tRENF\t\t\\b, FAT (12 bit)\n>>>>>495\t\tstring\t\tRENF\t\t\\b, FAT (16 bit)\n# x86 bootloader end\n# updated by Joerg Jenderek at Sep 2007\n>3\tubyte\t0\t\t\t\n#no active flag\n>>446\tubyte\t0\t\t\t\n# partition 1 not empty\n>>>450\tubyte\t>0\t\t\t\n# partitions 3,4 empty\n>>>>482\t\tubyte\t0\t\t\t\n>>>>>498\tubyte\t0\t\t\t\n# partition 2 ID=0,5,15\n>>>>>>466\tubyte\t<0x10\t\t\t\n>>>>>>>466\tubyte\t0x05\t\t\t\\b, extended partition table\n>>>>>>>466\tubyte\t0x0F\t\t\t\\b, extended partition table (LBA)\n>>>>>>>466\tubyte\t0x0\t\t\t\\b, extended partition table (last)\t\n# JuMP short     bootcodeoffset NOP assembler instructions will usually be EB xx 90\n# http://mirror.href.com/thestarman/asm/2bytejumps.htmm#FWD\n# older drives may use Near JuMP instruction E9 xx xx\n>0\t\tlelong&0x009000EB\t0x009000EB \n>0\t\tlelong&0x000000E9\t0x000000E9 \n# minimal short forward jump found 03cx??\n# maximal short forward jump is 07fx\n>1\t\tubyte\t\t\t<0xff\t\\b, code offset 0x%x\n# mtools-3.9.8/msdos.h\n# usual values are marked with comments to get only informations of strange FAT systems\n# valid sectorsize must be a power of 2 from 32 to 32768\n>>11\t\tuleshort&0x000f\tx\t\t\n>>>11\t\tuleshort\t<32769\t\t\n>>>>11\t\tuleshort\t>31\t\t\n>>>>>21\t\tubyte&0xf0\t0xF0\t\t\n>>>>>>3\t\tstring\t\t>\\0\t\t\\b, OEM-ID \"%8.8s\"\n#http://mirror.href.com/thestarman/asm/debug/debug2.htm#IHC\n>>>>>>>8\tstring\t\tIHC\t\t\\b cached by Windows 9M\n>>>>>>11\tuleshort\t>512\t\t\\b, Bytes/sector %u\n#>>>>>>11\tuleshort\t=512\t\t\\b, Bytes/sector %u=512 (usual)\n>>>>>>11\tuleshort\t<512\t\t\\b, Bytes/sector %u\n>>>>>>13\tubyte\t\t>1\t\t\\b, sectors/cluster %u\n#>>>>>>13\tubyte\t\t=1\t\t\\b, sectors/cluster %u (usual on Floppies)\n>>>>>>14\tuleshort\t>32\t\t\\b, reserved sectors %u\n#>>>>>>14\tuleshort\t=32\t\t\\b, reserved sectors %u (usual Fat32)\n#>>>>>>14\tuleshort\t>1\t\t\\b, reserved sectors %u\n#>>>>>>14\tuleshort\t=1\t\t\\b, reserved sectors %u (usual FAT12,FAT16)\n>>>>>>14\tuleshort\t<1\t\t\\b, reserved sectors %u\n>>>>>>16\tubyte\t\t>2\t\t\\b, FATs %u\n#>>>>>>16\tubyte\t\t=2\t\t\\b, FATs %u (usual)\n>>>>>>16\tubyte\t\t=1\t\t\\b, FAT  %u\n>>>>>>16\tubyte\t\t>0\n>>>>>>17\tuleshort\t>0\t\t\\b, root entries %u\n#>>>>>>17\tuleshort\t=0\t\t\\b, root entries %u=0 (usual Fat32)\n>>>>>>19\tuleshort\t>0\t\t\\b, sectors %u (volumes <=32 MB) \n#>>>>>>19\tuleshort\t=0\t\t\\b, sectors %u=0 (usual Fat32)\n>>>>>>21\tubyte\t\t>0xF0\t\t\\b, Media descriptor 0x%x\n#>>>>>>21\tubyte\t\t=0xF0\t\t\\b, Media descriptor 0x%x (usual floppy)\n>>>>>>21\tubyte\t\t<0xF0\t\t\\b, Media descriptor 0x%x\n>>>>>>22\tuleshort\t>0\t\t\\b, sectors/FAT %u\n#>>>>>>22\tuleshort\t=0\t\t\\b, sectors/FAT %u=0 (usual Fat32)\n>>>>>>26\tubyte\t\t>2\t\t\\b, heads %u\n#>>>>>>26\tubyte\t\t=2\t\t\\b, heads %u (usual floppy)\n>>>>>>26\tubyte\t\t=1\t\t\\b, heads %u\n#skip for Digital Research DOS (version 3.41) 1440 kB Bootdisk\n>>>>>>38\tubyte\t\t!0x70\t\t\n>>>>>>>28\tulelong\t\t>0\t\t\\b, hidden sectors %u\n#>>>>>>>28\tulelong\t\t=0\t\t\\b, hidden sectors %u (usual floppy)\n>>>>>>>32\tulelong\t\t>0\t\t\\b, sectors %u (volumes > 32 MB) \n#>>>>>>>32\tulelong\t\t=0\t\t\\b, sectors %u (volumes > 32 MB)\n# FAT<32 specific \n>>>>>>82\tstring\t\t!FAT32\n#>>>>>>>36\tubyte\t\t0x80\t\t\\b, physical drive 0x%x=0x80 (usual harddisk)\n#>>>>>>>36\tubyte\t\t0\t\t\\b, physical drive 0x%x=0 (usual floppy)\n>>>>>>>36\tubyte\t\t!0x80\t\t\n>>>>>>>>36\tubyte\t\t!0\t\t\\b, physical drive 0x%x\n>>>>>>>37\tubyte\t\t>0\t\t\\b, reserved 0x%x\n#>>>>>>>37\tubyte\t\t=0\t\t\\b, reserved 0x%x\n>>>>>>>38\tubyte\t\t>0x29\t\t\\b, dos < 4.0 BootSector (0x%x)\n>>>>>>>38\tubyte\t\t<0x29\t\t\\b, dos < 4.0 BootSector (0x%x)\n>>>>>>>38\tubyte\t\t=0x29\n>>>>>>>>39\tulelong\t\tx\t\t\\b, serial number 0x%x\n>>>>>>>>43\tstring\t\t<NO\\ NAME\t\\b, label: \"%11.11s\"\n>>>>>>>>43\tstring\t\t>NO\\ NAME\t\\b, label: \"%11.11s\"\n>>>>>>>>43\tstring\t\t=NO\\ NAME\t\\b, unlabeled\n>>>>>>>54\tstring\t\tFAT\t\t\\b, FAT\n>>>>>>>>54\tstring\t\tFAT12\t\t\\b (12 bit)\n>>>>>>>>54\tstring\t\tFAT16\t\t\\b (16 bit)\n# FAT32 specific\n>>>>>>82\tstring\t\tFAT32\t\t\\b, FAT (32 bit)\n>>>>>>>36\tulelong\t\tx\t\t\\b, sectors/FAT %u\n>>>>>>>40\tuleshort\t>0\t\t\\b, extension flags %u\n#>>>>>>>40\tuleshort\t=0\t\t\\b, extension flags %u\n>>>>>>>42\tuleshort\t>0\t\t\\b, fsVersion %u\n#>>>>>>>42\tuleshort\t=0\t\t\\b, fsVersion %u (usual)\n>>>>>>>44\tulelong\t\t>2\t\t\\b, rootdir cluster %u\n#>>>>>>>44\tulelong\t\t=2\t\t\\b, rootdir cluster %u\n#>>>>>>>44\tulelong\t\t=1\t\t\\b, rootdir cluster %u\n>>>>>>>48\tuleshort\t>1\t\t\\b, infoSector %u\n#>>>>>>>48\tuleshort\t=1\t\t\\b, infoSector %u (usual)\n>>>>>>>48\tuleshort\t<1\t\t\\b, infoSector %u\n>>>>>>>50\tuleshort\t>6\t\t\\b, Backup boot sector %u\n#>>>>>>>50\tuleshort\t=6\t\t\\b, Backup boot sector %u (usual) \n>>>>>>>50\tuleshort\t<6\t\t\\b, Backup boot sector %u\n>>>>>>>54\tulelong\t\t>0\t\t\\b, reserved1 0x%x\n>>>>>>>58\tulelong\t\t>0\t\t\\b, reserved2 0x%x\n>>>>>>>62\tulelong\t\t>0\t\t\\b, reserved3 0x%x\n# same structure as FAT1X \n>>>>>>>64\tubyte\t\t>0x80\t\t\\b, physical drive 0x%x\n#>>>>>>>64\tubyte\t\t=0x80\t\t\\b, physical drive 0x%x=80 (usual harddisk)\n>>>>>>>64\tubyte&0x7F\t>0\t\t\\b, physical drive 0x%x\n#>>>>>>>64\tubyte\t\t=0\t\t\\b, physical drive 0x%x=0 (usual floppy)\n>>>>>>>65\tubyte\t\t>0\t\t\\b, reserved 0x%x\n>>>>>>>66\tubyte\t\t>0x29\t\t\\b, dos < 4.0 BootSector (0x%x)\n>>>>>>>66\tubyte\t\t<0x29\t\t\\b, dos < 4.0 BootSector (0x%x)\n>>>>>>>66\tubyte\t\t=0x29\n>>>>>>>>67\tulelong\t\tx\t\t\\b, serial number 0x%x\n>>>>>>>>71\tstring\t\t<NO\\ NAME\t\\b, label: \"%11.11s\"\n>>>>>>>71\tstring\t\t>NO\\ NAME\t\\b, label: \"%11.11s\"\n>>>>>>>71\tstring\t\t=NO\\ NAME\t\\b, unlabeled\n### FATs end\n>0x200\tlelong\t0x82564557\t\t\\b, BSD disklabel\n# FATX \n0\t\tstring\t\tFATX\t\tFATX filesystem data\n\n\n# Minix filesystems - Juan Cespedes <cespedes@debian.org>\n0x410\tleshort\t\t0x137f\t\tMinix filesystem\n0x410\tbeshort\t\t0x137f\t\tMinix filesystem (big endian)\n>0x402\tbeshort\t\t!0\t\t\\b, %d zones\n>0x1e\tstring\t\tminix\t\t\\b, bootable\n0x410\tleshort\t\t0x138f\t\tMinix filesystem, 30 char names\n0x410\tleshort\t\t0x2468\t\tMinix filesystem, version 2\n0x410\tleshort\t\t0x2478\t\tMinix filesystem, version 2, 30 char names\n\n# romfs filesystems - Juan Cespedes <cespedes@debian.org>\n0\tstring\t\t-rom1fs-\tromfs filesystem, version 1\n>8\tbelong\tx\t\t\t%d bytes,\n>16\tstring\tx\t\t\tnamed %s.\n\n# netboot image - Juan Cespedes <cespedes@debian.org>\n0\tlelong\t\t0x1b031336L\tNetboot image,\n>4\tlelong&0xFFFFFF00\t0\n>>4\tlelong&0x100\t0x000\t\tmode 2\n>>4\tlelong&0x100\t0x100\t\tmode 3\n>4\tlelong&0xFFFFFF00\t!0\tunknown mode\n\n0x18b\tstring\tOS/2\tOS/2 Boot Manager\n\n# updated by Joerg Jenderek at Oct 2008!!\n# http://syslinux.zytor.com/iso.php\n0\tulelong\t0x7c40eafa\t\tisolinux Loader\n# http://syslinux.zytor.com/pxe.php\n0\tulelong\t0x007c05ea\t\tpxelinux Loader\n0\tulelong\t0x60669c66\t\tpxelinux Loader\n\n# added by Joerg Jenderek\n# In the second sector (+0x200) are variables according to grub-0.97/stage2/asm.S or\n# grub-1.94/kern/i386/pc/startup.S\n# http://www.gnu.org/software/grub/manual/grub.html#Embedded-data\n# usual values are marked with comments to get only informations of strange GRUB loaders\n0x200\tuleshort\t\t0x70EA\t\t\n# found only version 3.{1,2}\n>0x206\t\tubeshort\t>0x0300\t\t\n# GRUB version (0.5.)95,0.93,0.94,0.96,0.97 > \"00\"\n>>0x212 \tubyte\t\t>0x29\t\t\n>>>0x213 \tubyte\t\t>0x29\t\t\n# not iso9660_stage1_5\n#>>>0\tulelong&0x00BE5652\t0x00BE5652\t\n>>>>0x213 \tubyte\t\t>0x29\t\tGRand Unified Bootloader\n# config_file for stage1_5 is 0xffffffff + default \"/boot/grub/stage2\"\n>>>>0x217 \tubyte\t\t0xFF\t\tstage1_5\n>>>>0x217 \tubyte\t\t<0xFF\t\tstage2\n>>>>0x206\tubyte\t\tx\t\t\\b version %u\n>>>>0x207\tubyte\t\tx\t\t\\b.%u\n# module_size for 1.94\n>>>>0x208\tulelong\t\t<0xffffff\t\\b, installed partition %u\n#>>>>0x208\tulelong\t\t=0xffffff\t\\b, %u (default)\n>>>>0x208\tulelong\t\t>0xffffff\t\\b, installed partition %u\n# GRUB 0.5.95 unofficial\n>>>>0x20C\tulelong&0x2E300000 0x2E300000\t\n# 0=stage2\t1=ffs\t2=e2fs\t3=fat\t4=minix\t5=reiserfs\n>>>>>0x20C\tubyte\t\tx\t\t\\b, identifier 0x%x\n#>>>>>0x20D\tubyte\t\t=0\t\t\\b, LBA flag 0x%x (default)\n>>>>>0x20D\tubyte\t\t>0\t\t\\b, LBA flag 0x%x\n# GRUB version as string\n>>>>>0x20E \tstring\t\t>\\0\t\t\\b, GRUB version %-s\n# for stage1_5 is 0xffffffff + config_file \"/boot/grub/stage2\" default\n>>>>>>0x215 \tulong\t\t0xffffffff\t\n>>>>>>>0x219 \tstring\t\t>\\0\t\t\\b, configuration file %-s\n>>>>>>0x215 \tulong\t\t!0xffffffff\t\n>>>>>>>0x215 \tstring\t\t>\\0\t\t\\b, configuration file %-s\n# newer GRUB versions\n>>>>0x20C\tulelong&0x2E300000 !0x2E300000\t\n##>>>>>0x20C\tulelong\t\t=0\t\t\\b, saved entry %d (usual)\n>>>>>0x20C\tulelong\t\t>0\t\t\\b, saved entry %d\n# for 1.94 contains kernel image size\n# for 0.93,0.94,0.96,0.97\n# 0=stage2\t1=ffs\t2=e2fs\t3=fat\t4=minix\t5=reiserfs\t6=vstafs\t7=jfs\t8=xfs\t9=iso9660\ta=ufs2\t\n>>>>>0x210\tubyte\t\tx\t\t\\b, identifier 0x%x\n# The flag for LBA forcing is in most cases 0\n#>>>>>0x211\tubyte\t\t=0\t\t\\b, LBA flag 0x%x (default)\n>>>>>0x211\tubyte\t\t>0\t\t\\b, LBA flag 0x%x\n# GRUB version as string\n>>>>>0x212 \tstring\t\t>\\0\t\t\\b, GRUB version %-s\n# for stage1_5 is 0xffffffff + config_file \"/boot/grub/stage2\" default\n>>>>>0x217 \tulong\t\t0xffffffff\t\n>>>>>>0x21b \tstring\t\t>\\0\t\t\\b, configuration file %-s\n>>>>>0x217 \tulong\t\t!0xffffffff\t\n>>>>>>0x217 \tstring\t\t>\\0\t\t\\b, configuration file %-s\n\n9564\tlelong\t\t0x00011954\tUnix Fast File system [v1] (little-endian),\n>8404\tstring\t\tx\t\tlast mounted on %s,\n#>9504\tledate\t\tx\t\tlast checked at %s,\n>8224\tledate\t\tx\t\tlast written at %s,\n>8401\tbyte\t\tx\t\tclean flag %d,\n>8228\tlelong\t\tx\t\tnumber of blocks %d,\n>8232\tlelong\t\tx\t\tnumber of data blocks %d,\n>8236\tlelong\t\tx\t\tnumber of cylinder groups %d,\n>8240\tlelong\t\tx\t\tblock size %d,\n>8244\tlelong\t\tx\t\tfragment size %d,\n>8252\tlelong\t\tx\t\tminimum percentage of free blocks %d,\n>8256\tlelong\t\tx\t\trotational delay %dms,\n>8260\tlelong\t\tx\t\tdisk rotational speed %drps,\n>8320\tlelong\t\t0\t\tTIME optimization\n>8320\tlelong\t\t1\t\tSPACE optimization\n\n42332\tlelong\t\t0x19540119\tUnix Fast File system [v2] (little-endian)\n>&-1164\tstring\t\tx\t\tlast mounted on %s,\n>&-696\tstring\t\t>\\0\t\tvolume name %s,\n>&-304\tleqldate\tx\t\tlast written at %s,\n>&-1167\tbyte\t\tx\t\tclean flag %d,\n>&-1168\tbyte\t\tx\t\treadonly flag %d,\n>&-296\tlequad\t\tx\t\tnumber of blocks %lld,\n>&-288\tlequad\t\tx\t\tnumber of data blocks %lld,\n>&-1332\tlelong\t\tx\t\tnumber of cylinder groups %d,\n>&-1328\tlelong\t\tx\t\tblock size %d,\n>&-1324\tlelong\t\tx\t\tfragment size %d,\n>&-180\tlelong\t\tx\t\taverage file size %d,\n>&-176\tlelong\t\tx\t\taverage number of files in dir %d,\n>&-272\tlequad\t\tx\t\tpending blocks to free %lld,\n>&-264\tlelong\t\tx\t\tpending inodes to free %ld,\n>&-664\tlequad\t\tx\t\tsystem-wide uuid %0llx,\n>&-1316\tlelong\t\tx\t\tminimum percentage of free blocks %d,\n>&-1248\tlelong\t\t0\t\tTIME optimization\n>&-1248\tlelong\t\t1\t\tSPACE optimization\n\n66908\tlelong\t\t0x19540119\tUnix Fast File system [v2] (little-endian)\n>&-1164\tstring\t\tx\t\tlast mounted on %s,\n>&-696\tstring\t\t>\\0\t\tvolume name %s,\n>&-304\tleqldate\tx\t\tlast written at %s,\n>&-1167\tbyte\t\tx\t\tclean flag %d,\n>&-1168\tbyte\t\tx\t\treadonly flag %d,\n>&-296\tlequad\t\tx\t\tnumber of blocks %lld,\n>&-288\tlequad\t\tx\t\tnumber of data blocks %lld,\n>&-1332\tlelong\t\tx\t\tnumber of cylinder groups %d,\n>&-1328\tlelong\t\tx\t\tblock size %d,\n>&-1324\tlelong\t\tx\t\tfragment size %d,\n>&-180\tlelong\t\tx\t\taverage file size %d,\n>&-176\tlelong\t\tx\t\taverage number of files in dir %d,\n>&-272\tlequad\t\tx\t\tpending blocks to free %lld,\n>&-264\tlelong\t\tx\t\tpending inodes to free %ld,\n>&-664\tlequad\t\tx\t\tsystem-wide uuid %0llx,\n>&-1316\tlelong\t\tx\t\tminimum percentage of free blocks %d,\n>&-1248\tlelong\t\t0\t\tTIME optimization\n>&-1248\tlelong\t\t1\t\tSPACE optimization\n\n9564\tbelong\t\t0x00011954\tUnix Fast File system [v1] (big-endian),\n>7168   belong\t\t0x4c41424c\tApple UFS Volume\n>>7186  string\t\tx\t\tnamed %s,\n>>7176  belong\t\tx\t\tvolume label version %d,\n>>7180  bedate\t\tx\t\tcreated on %s,\n>8404\tstring\t\tx\t\tlast mounted on %s,\n#>9504\tbedate\t\tx\t\tlast checked at %s,\n>8224\tbedate\t\tx\t\tlast written at %s,\n>8401\tbyte\t\tx\t\tclean flag %d,\n>8228\tbelong\t\tx\t\tnumber of blocks %d,\n>8232\tbelong\t\tx\t\tnumber of data blocks %d,\n>8236\tbelong\t\tx\t\tnumber of cylinder groups %d,\n>8240\tbelong\t\tx\t\tblock size %d,\n>8244\tbelong\t\tx\t\tfragment size %d,\n>8252\tbelong\t\tx\t\tminimum percentage of free blocks %d,\n>8256\tbelong\t\tx\t\trotational delay %dms,\n>8260\tbelong\t\tx\t\tdisk rotational speed %drps,\n>8320\tbelong\t\t0\t\tTIME optimization\n>8320\tbelong\t\t1\t\tSPACE optimization\n\n42332\tbelong\t\t0x19540119\tUnix Fast File system [v2] (big-endian)\n>&-1164\tstring\t\tx\t\tlast mounted on %s,\n>&-696\tstring\t\t>\\0\t\tvolume name %s,\n>&-304\tbeqldate\tx\t\tlast written at %s,\n>&-1167\tbyte\t\tx\t\tclean flag %d,\n>&-1168\tbyte\t\tx\t\treadonly flag %d,\n>&-296\tbequad\t\tx\t\tnumber of blocks %lld,\n>&-288\tbequad\t\tx\t\tnumber of data blocks %lld,\n>&-1332\tbelong\t\tx\t\tnumber of cylinder groups %d,\n>&-1328\tbelong\t\tx\t\tblock size %d,\n>&-1324\tbelong\t\tx\t\tfragment size %d,\n>&-180\tbelong\t\tx\t\taverage file size %d,\n>&-176\tbelong\t\tx\t\taverage number of files in dir %d,\n>&-272\tbequad\t\tx\t\tpending blocks to free %lld,\n>&-264\tbelong\t\tx\t\tpending inodes to free %ld,\n>&-664\tbequad\t\tx\t\tsystem-wide uuid %0llx,\n>&-1316\tbelong\t\tx\t\tminimum percentage of free blocks %d,\n>&-1248\tbelong\t\t0\t\tTIME optimization\n>&-1248\tbelong\t\t1\t\tSPACE optimization\n\n66908\tbelong\t\t0x19540119\tUnix Fast File system [v2] (big-endian)\n>&-1164\tstring\t\tx\t\tlast mounted on %s,\n>&-696\tstring\t\t>\\0\t\tvolume name %s,\n>&-304\tbeqldate\tx\t\tlast written at %s,\n>&-1167\tbyte\t\tx\t\tclean flag %d,\n>&-1168\tbyte\t\tx\t\treadonly flag %d,\n>&-296\tbequad\t\tx\t\tnumber of blocks %lld,\n>&-288\tbequad\t\tx\t\tnumber of data blocks %lld,\n>&-1332\tbelong\t\tx\t\tnumber of cylinder groups %d,\n>&-1328\tbelong\t\tx\t\tblock size %d,\n>&-1324\tbelong\t\tx\t\tfragment size %d,\n>&-180\tbelong\t\tx\t\taverage file size %d,\n>&-176\tbelong\t\tx\t\taverage number of files in dir %d,\n>&-272\tbequad\t\tx\t\tpending blocks to free %lld,\n>&-264\tbelong\t\tx\t\tpending inodes to free %ld,\n>&-664\tbequad\t\tx\t\tsystem-wide uuid %0llx,\n>&-1316\tbelong\t\tx\t\tminimum percentage of free blocks %d,\n>&-1248\tbelong\t\t0\t\tTIME optimization\n>&-1248\tbelong\t\t1\t\tSPACE optimization\n\n# ext2/ext3 filesystems - Andreas Dilger <adilger@dilger.ca>\n# ext4 filesystem - Eric Sandeen <sandeen@sandeen.net>\n0x438   leshort         0xEF53          Linux\n>0x44c  lelong          x               rev %d\n>0x43e  leshort         x               \\b.%d\n# No journal?  ext2\n>0x45c  lelong          ^0x0000004      ext2 filesystem data\n>>0x43a leshort         ^0x0000001      (mounted or unclean)\n# Has a journal?  ext3 or ext4\n>0x45c  lelong          &0x0000004\n#  and small INCOMPAT?\n>>0x460 lelong          <0x0000040\n#   and small RO_COMPAT?\n>>>0x464 lelong         <0x0000008      ext3 filesystem data\n#   else large RO_COMPAT?\n>>>0x464 lelong         >0x0000007      ext4 filesystem data\n#  else large INCOMPAT?\n>>0x460 lelong          >0x000003f      ext4 filesystem data\n# General flags for any ext* fs\n>0x460  lelong          &0x0000004      (needs journal recovery)\n>0x43a  leshort         &0x0000002      (errors)\n# INCOMPAT flags\n>0x460  lelong          &0x0000001      (compressed)\n#>0x460 lelong          &0x0000002      (filetype)\n#>0x460 lelong          &0x0000010      (meta bg)\n>0x460  lelong          &0x0000040      (extents)\n>0x460  lelong          &0x0000080      (64bit)\n#>0x460 lelong          &0x0000100      (mmp)\n#>0x460 lelong          &0x0000200      (flex bg)\n# RO_INCOMPAT flags\n#>0x464 lelong          &0x0000001      (sparse super)\n>0x464  lelong          &0x0000002      (large files)\n>0x464  lelong          &0x0000008      (huge files)\n#>0x464 lelong          &0x0000010      (gdt checksum)\n#>0x464 lelong          &0x0000020      (many subdirs)\n#>0x463 lelong          &0x0000040      (extra isize)\n\n# SGI disk labels - Nathan Scott <nathans@debian.org>\n0\tbelong\t\t0x0BE5A941\tSGI disk label (volume header)\n\n# SGI XFS filesystem - Nathan Scott <nathans@debian.org>\n0\tbelong\t\t0x58465342\tSGI XFS filesystem data\n>0x4\tbelong\t\tx\t\t(blksz %d,\n>0x68\tbeshort\t\tx\t\tinosz %d,\n>0x64\tbeshort\t\t^0x2004\t\tv1 dirs)\n>0x64\tbeshort\t\t&0x2004\t\tv2 dirs)\n\n############################################################################\n# Minix-ST kernel floppy\n0x800\tbelong\t\t0x46fc2700\tAtari-ST Minix kernel image\n>19\tstring\t\t\\240\\5\\371\\5\\0\\011\\0\\2\\0\t\\b, 720k floppy\n>19\tstring\t\t\\320\\2\\370\\5\\0\\011\\0\\1\\0\t\\b, 360k floppy\n\n############################################################################\n# Hmmm, is this a better way of detecting _standard_ floppy images ?\n19\tstring\t\t\\320\\2\\360\\3\\0\\011\\0\\1\\0\tDOS floppy 360k\n>0x1FE\tleshort\t\t0xAA55\t\t\\b, x86 hard disk boot sector\n19\tstring\t\t\\240\\5\\371\\3\\0\\011\\0\\2\\0\tDOS floppy 720k\n>0x1FE\tleshort\t\t0xAA55\t\t\\b, x86 hard disk boot sector\n19\tstring\t\t\\100\\013\\360\\011\\0\\022\\0\\2\\0\tDOS floppy 1440k\n>0x1FE\tleshort\t\t0xAA55\t\t\\b, x86 hard disk boot sector\n\n19\tstring\t\t\\240\\5\\371\\5\\0\\011\\0\\2\\0\tDOS floppy 720k, IBM\n>0x1FE\tleshort\t\t0xAA55\t\t\\b, x86 hard disk boot sector\n19\tstring\t\t\\100\\013\\371\\5\\0\\011\\0\\2\\0\tDOS floppy 1440k, mkdosfs\n>0x1FE\tleshort\t\t0xAA55\t\t\\b, x86 hard disk boot sector\n\n19\tstring\t\t\\320\\2\\370\\5\\0\\011\\0\\1\\0\tAtari-ST floppy 360k\n19\tstring\t\t\\240\\5\\371\\5\\0\\011\\0\\2\\0\tAtari-ST floppy 720k\n\n#  Valid media descriptor bytes for MS-DOS:\n#\n#     Byte   Capacity   Media Size and Type\n#     -------------------------------------------------\n#\n#     F0     2.88 MB    3.5-inch, 2-sided, 36-sector\n#     F0     1.44 MB    3.5-inch, 2-sided, 18-sector\n#     F9     720K       3.5-inch, 2-sided, 9-sector\n#     F9     1.2 MB     5.25-inch, 2-sided, 15-sector\n#     FD     360K       5.25-inch, 2-sided, 9-sector\n#     FF     320K       5.25-inch, 2-sided, 8-sector\n#     FC     180K       5.25-inch, 1-sided, 9-sector\n#     FE     160K       5.25-inch, 1-sided, 8-sector\n#     FE     250K       8-inch, 1-sided, single-density\n#     FD     500K       8-inch, 2-sided, single-density\n#     FE     1.2 MB     8-inch, 2-sided, double-density\n#     F8     -----      Fixed disk \n#\n#     FC     xxxK       Apricot 70x1x9 boot disk.\n#\n# Originally a bitmap:\n#  xxxxxxx0\tNot two sided\n#  xxxxxxx1\tDouble sided\n#  xxxxxx0x\tNot 8 SPT\n#  xxxxxx1x\t8 SPT\n#  xxxxx0xx\tNot Removable drive\n#  xxxxx1xx\tRemovable drive\n#  11111xxx\tMust be one.\n#\n# But now it's rather random:\n#  111111xx\tLow density disk\n#        00\tSS, Not 8 SPT\n#        01\tDS, Not 8 SPT\n#        10\tSS, 8 SPT\n#        11\tDS, 8 SPT\n#\n#  11111001\tDouble density 3 floppy disk, high density 5\n#  11110000\tHigh density 3 floppy disk\n#  11111000\tHard disk any format\n#\n\n# CDROM Filesystems\n# Modified for UDF by gerardo.cacciari@gmail.com\n32769\tstring    CD001\n!:mime\tapplication/x-iso9660-image\n>38913\tstring   !NSR0      ISO 9660 CD-ROM filesystem data\n>38913\tstring    NSR0      UDF filesystem data\n>>38917\tstring    1         (version 1.0)\n>>38917\tstring    2         (version 1.5)\n>>38917\tstring    3         (version 2.0)\n>>38917\tbyte     >0x33      (unknown version, ID 0x%X)\n>>38917\tbyte     <0x31      (unknown version, ID 0x%X)\n# \"application id\" which appears to be used as a volume label\n>32808\tstring    >\\0       '%s'\n>34816\tstring    \\000CD001\\001EL\\ TORITO\\ SPECIFICATION    (bootable)\n37633\tstring    CD001     ISO 9660 CD-ROM filesystem data (raw 2352 byte sectors)\n!:mime\tapplication/x-iso9660-image\n32776\tstring    CDROM     High Sierra CD-ROM filesystem data\n\n# cramfs filesystem - russell@coker.com.au\n0       lelong    0x28cd3d45      Linux Compressed ROM File System data, little endian\n>4      lelong  x size %lu\n>8      lelong  &1 version #2\n>8      lelong  &2 sorted_dirs\n>8      lelong  &4 hole_support\n>32     lelong  x CRC 0x%x,\n>36     lelong  x edition %lu,\n>40     lelong  x %lu blocks,\n>44     lelong  x %lu files\n\n0       belong    0x28cd3d45      Linux Compressed ROM File System data, big endian\n>4      belong  x size %lu\n>8      belong  &1 version #2\n>8      belong  &2 sorted_dirs\n>8      belong  &4 hole_support\n>32     belong  x CRC 0x%x,\n>36     belong  x edition %lu,\n>40     belong  x %lu blocks,\n>44     belong  x %lu files\n\n# reiserfs - russell@coker.com.au\n0x10034\t\tstring\tReIsErFs\tReiserFS V3.5\n0x10034\t\tstring\tReIsEr2Fs\tReiserFS V3.6\n>0x1002c \tleshort\tx\t\tblock size %d\n>0x10032\tleshort\t&2\t\t(mounted or unclean)\n>0x10000\tlelong\tx\t\tnum blocks %d\n>0x10040\tlelong\t1\t\ttea hash\n>0x10040\tlelong\t2\t\tyura hash\n>0x10040\tlelong\t3\t\tr5 hash\n\n# JFFS - russell@coker.com.au\n0\tlelong\t0x34383931\tLinux Journalled Flash File system, little endian\n0\tbelong\t0x34383931\tLinux Journalled Flash File system, big endian\n\n# EST flat binary format (which isn't, but anyway)\n# From: Mark Brown <broonie@sirena.org.uk>\n0\tstring\tESTFBINR\tEST flat binary\n\n# Aculab VoIP firmware\n# From: Mark Brown <broonie@sirena.org.uk>\n0\tstring\tVoIP\\ Startup\\ and\tAculab VoIP firmware\n>35\tstring\tx\tformat %s\n\n# u-boot/PPCBoot image file\n# From: Mark Brown <broonie@sirena.org.uk>\n0\tbelong\t0x27051956\tu-boot/PPCBoot image\n>4\tstring  PPCBoot\n>>12\tstring  x\t\tversion %s\n\n# JFFS2 file system\n0\tleshort\t0x1984\t\tLinux old jffs2 filesystem data little endian\n0\tleshort\t0x1985\t\tLinux jffs2 filesystem data little endian\n\n# Squashfs\n0\tstring\tsqsh\tSquashfs filesystem, big endian,\n>28\tbeshort\tx\tversion %d.\n>30\tbeshort x\t\\b%d,\n>28\tbeshort <3\n>>8\tbelong\tx\t%d bytes,\n>28\tbeshort >2\n>>63\tbequad x\t%lld bytes,\n#>>67\tbelong\tx\t%d bytes,\n>4\tbelong\tx\t%d inodes,\n>28\tbeshort <2\n>>32\tbeshort\tx\tblocksize: %d bytes,\n>28\tbeshort >1\n>>51\tbelong\tx\tblocksize: %d bytes,\n>39\tbedate\tx\tcreated: %s\n0\tstring\thsqs\tSquashfs filesystem, little endian,\n>28\tleshort\tx\tversion %d.\n>30\tleshort\tx\t\\b%d,\n>28\tleshort <3\n>>8\tlelong\tx\t%d bytes,\n>28\tleshort >2\n>>63\tlequad x\t%lld bytes,\n#>>63\tlelong\tx\t%d bytes,\n>4\tlelong\tx\t%d inodes,\n>28\tleshort <2\n>>32\tleshort\tx\tblocksize: %d bytes,\n>28\tleshort >1\n>>51\tlelong\tx\tblocksize: %d bytes,\n>39\tledate\tx\tcreated: %s\n\n0\tstring\t\ttd\\000\t\tfloppy image data (TeleDisk)\n\n# AFS Dump Magic\n# From: Ty Sarna <tsarna@sarna.org> \n0       string                  \\x01\\xb3\\xa1\\x13\\x22    AFS Dump\n>&0     belong                  x                       (v%d)\n>>&0    byte                    0x76\n>>>&0   belong                  x                       Vol %d,\n>>>>&0  byte                    0x6e\n>>>>>&0 string                  x                       %s\n>>>>>>&1        byte            0x74\n>>>>>>>&0       beshort         2\n>>>>>>>>&4      bedate          x                       on: %s\n>>>>>>>>&0      bedate          =0                      full dump\n>>>>>>>>&0      bedate          !0                      incremental since: %s\n\n#----------------------------------------------------------\n# VMS backup savesets - gerardo.cacciari@gmail.com\n#\n4            string  \\x01\\x00\\x01\\x00\\x01\\x00\n>(0.s+16)    string  \\x01\\x01\n>>&(&0.b+8)  byte    0x42       OpenVMS backup saveset data\n>>>40        lelong  x          (block size %d,\n>>>49        string  >\\0        original name '%s',\n>>>2         short   1024       VAX generated)\n>>>2         short   2048       AXP generated)\n>>>2         short   4096       I64 generated)\n\n# Summary: Oracle Clustered Filesystem\n# Created by: Aaron Botsis <redhat@digitalmafia.org>\n8\tstring\t\tOracleCFS\tOracle Clustered Filesystem,\n>4\tlong\t\tx\t\trev %d\n>0\tlong\t\tx\t\t\\b.%d,\n>560\tstring\t\tx\t\tlabel: %.64s,\n>136\tstring\t\tx\t\tmountpoint: %.128s\n\n# Summary: Oracle ASM tagged volume\n# Created by: Aaron Botsis <redhat@digitalmafia.org>\n32\tstring\t\tORCLDISK\tOracle ASM Volume,\n>40\tstring\t\tx\t\tDisk Name: %0.12s\n32\tstring\t\tORCLCLRD\tOracle ASM Volume (cleared),\n>40\tstring\t\tx\t\tDisk Name: %0.12s\n\n# Oracle Clustered Filesystem - Aaron Botsis <redhat@digitalmafia.org>\n8\tstring\t\tOracleCFS\tOracle Clustered Filesystem,\n>4\tlong\t\tx\t\trev %d\n>0\tlong\t\tx\t\t\\b.%d,\n>560\tstring\t\tx\t\tlabel: %.64s,\n>136\tstring\t\tx\t\tmountpoint: %.128s\n\n# Oracle ASM tagged volume - Aaron Botsis <redhat@digitalmafia.org>\n32\tstring\t\tORCLDISK\tOracle ASM Volume,\n>40\tstring\t\tx\t\tDisk Name: %0.12s\n32\tstring\t\tORCLCLRD\tOracle ASM Volume (cleared),\n>40\tstring\t\tx\t\tDisk Name: %0.12s\n\n# Compaq/HP RILOE floppy image\n# From: Dirk Jagdmann <doj@cubic.org>\n0\tstring\tCPQRFBLO\tCompaq/HP RILOE floppy image\n\n#------------------------------------------------------------------------------\n# Files-11 On-Disk Structure (OpenVMS file system) - gerardo.cacciari@gmail.com\n# These bits come from LBN 1 (home block) of ODS-2 and ODS-5 volumes, which is\n# mapped to VBN 2 of [000000]INDEXF.SYS;1\n#\n1008    string          DECFILE11B      Files-11 On-Disk Structure\n>525    byte            x               Level %d\n>525    byte            x               (ODS-%d OpenVMS file system),\n>984    string          x               volume label is '%-12.12s'\n\n# From: Thomas Klausner <wiz@NetBSD.org>\n# http://filext.com/file-extension/DAA\n# describes the daa file format. The magic would be:\n0\tstring\t\tDAA\\x0\\x0\\x0\\x0\\x0\tPowerISO Direct-Access-Archive\n\n# From Albert Cahalan <acahalan@gmail.com>\n# really le32 operation,destination,payloadsize (but quite predictable)\n# 01 00 00 00 00 00 00 c0 00 02 00 00\n0\tstring\t\t\\1\\0\\0\\0\\0\\0\\0\\300\\0\\2\\0\\0\tMarvell Libertas firmware\n\n# From Eric Sandeen\n# GFS2\n0x10000         belong          0x01161970      GFS2 Filesystem\n>0x10024        belong          x               (blocksize %d,\n>0x10060        string          >\\0             lockproto %s)\n\n# BTRFS\n0x10040         string          _BHRfS_M        BTRFS Filesystem\n>0x1012b        string          >\\0             (label \"%s\",\n>0x10090        lelong          x               sectorsize %d,\n>0x10094        lelong          x               nodesize %d,\n>0x10098        lelong          x               leafsize %d)\n\n\n# dvdisaster's .ecc\n# From: \"Nelson A. de Oliveira\" <naoliv@gmail.com>\n0\tstring\t*dvdisaster*\tdvdisaster error correction file\n\n#------------------------------------------------------------------------------\n# flash:\tfile(1) magic for Macromedia Flash file format\n#\n# See\n#\n#\thttp://www.macromedia.com/software/flash/open/\n#\n0\tstring\t\tFWS\t\tMacromedia Flash data,\n>3\tbyte\t\tx\t\tversion %d\n!:mime\tapplication/x-shockwave-flash\n0\tstring\t\tCWS\t\tMacromedia Flash data (compressed),\n!:mime\tapplication/x-shockwave-flash\n>3\tbyte\t\tx\t\tversion %d\n# From: Cal Peake <cp@absolutedigital.net>\n0\tstring\t\tFLV\t\tMacromedia Flash Video\n!:mime\tvideo/x-flv\n\n#\n# From Dave Wilson\n0\tstring AGD4\\xbe\\xb8\\xbb\\xcb\\x00\tMacromedia Freehand 9 Document\n#------------------------------------------------------------------------------\n# fonts:  file(1) magic for font data\n#\n0\tsearch/1\tFONT\t\tASCII vfont text\n0\tshort\t\t0436\t\tBerkeley vfont data\n0\tshort\t\t017001\t\tbyte-swapped Berkeley vfont data\n\n# PostScript fonts (must precede \"printer\" entries), quinlan@yggdrasil.com\n0\tstring\t\t%!PS-AdobeFont-1.\tPostScript Type 1 font text\n>20\tstring\t\t>\\0\t\t\t(%s)\n6\tstring\t\t%!PS-AdobeFont-1.\tPostScript Type 1 font program data\n\n# X11 font files in SNF (Server Natural Format) format\n0\tbelong\t\t00000004\t\tX11 SNF font data, MSB first\n0\tlelong\t\t00000004\t\tX11 SNF font data, LSB first\n\n# X11 Bitmap Distribution Format, from Daniel Quinlan (quinlan@yggdrasil.com)\n0\tsearch/1\tSTARTFONT\\ \t\tX11 BDF font text\n\n# X11 fonts, from Daniel Quinlan (quinlan@yggdrasil.com)\n# PCF must come before SGI additions (\"MIPSEL MIPS-II COFF\" collides)\n0\tstring\t\t\\001fcp\t\t\tX11 Portable Compiled Font data\n>12\tbyte\t\t0x02\t\t\t\\b, LSB first\n>12\tbyte\t\t0x0a\t\t\t\\b, MSB first\n0\tstring\t\tD1.0\\015\t\tX11 Speedo font data\n\n#------------------------------------------------------------------------------\n# FIGlet fonts and controlfiles\n# From figmagic supplied with Figlet version 2.2\n# \"David E. O'Brien\" <obrien@FreeBSD.ORG>\n0\tstring\t\tflf\t\tFIGlet font\n>3\tstring\t\t>2a\t\tversion %-2.2s\n0\tstring\t\tflc\t\tFIGlet controlfile\n>3\tstring\t\t>2a\t\tversion %-2.2s\n\n# libGrx graphics lib fonts, from Albert Cahalan (acahalan@cs.uml.edu)\n# Used with djgpp (DOS Gnu C++), sometimes Linux or Turbo C++\n0\tbelong\t\t0x14025919\tlibGrx font data,\n>8\tleshort\t\tx\t\t%dx\n>10\tleshort\t\tx\t\t\\b%d\n>40\tstring\t\tx\t\t%s\n# Misc. DOS VGA fonts, from Albert Cahalan (acahalan@cs.uml.edu)\n0\tbelong\t\t0xff464f4e\tDOS code page font data collection\n7\tbelong\t\t0x00454741\tDOS code page font data\n7\tbelong\t\t0x00564944\tDOS code page font data (from Linux?)\n4098\tstring\t\tDOSFONT\t\tDOSFONT2 encrypted font data\n\n# downloadable fonts for browser (prints type) anthon@mnt.org\n0\tstring\t\tPFR1\t\tPFR1 font\n>102\tstring\t\t>0\t\t\\b: %s\n\n# True Type fonts\n0\tstring\t\\000\\001\\000\\000\\000\tTrueType font data\n\n0\tstring\t\t\\007\\001\\001\\000Copyright\\ (c)\\ 199\tAdobe Multiple Master font\n0\tstring\t\t\\012\\001\\001\\000Copyright\\ (c)\\ 199\tAdobe Multiple Master font\n\n0\tstring\t\tttcf\t\tTrueType font collection data\n\n# Opentype font data from Avi Bercovich\n0\tstring\t\tOTTO\t\tOpenType font data \n\n# Gürkan Sengün <gurkan@linuks.mine.nu>, www.linuks.mine.nu \n0\tstring\t\tSplineFontDB:\tSpline Font Database \n>14\tstring\t\tx\t\tversion %s\n# FORTRAN source\n0\tregex/100\t\\^[Cc][\\ \\t]\tFORTRAN program\n!:mime\ttext/x-fortran\n#------------------------------------------------------------------------------\n# frame:  file(1) magic for FrameMaker files\n#\n# This stuff came on a FrameMaker demo tape, most of which is\n# copyright, but this file is \"published\" as witness the following:\n#\n# Note that this is the Framemaker Maker Interchange Format, not the\n# Normal format which would be application/vnd.framemaker.\n#\n0\tstring\t\t\\<MakerFile\tFrameMaker document\n!:mime\tapplication/x-mif\n>11\tstring\t\t5.5\t\t (5.5\n>11\tstring\t\t5.0\t\t (5.0\n>11\tstring\t\t4.0\t\t (4.0\n>11\tstring\t\t3.0\t\t (3.0\n>11\tstring\t\t2.0\t\t (2.0\n>11\tstring\t\t1.0\t\t (1.0\n>14\tbyte\t\tx\t\t  %c)\n0\tstring\t\t\\<MIFFile\tFrameMaker MIF (ASCII) file\n!:mime\tapplication/x-mif\n>9\tstring\t\t4.0\t\t (4.0)\n>9\tstring\t\t3.0\t\t (3.0)\n>9\tstring\t\t2.0\t\t (2.0)\n>9\tstring\t\t1.0\t\t (1.x)\n0\tsearch/1\t\\<MakerDictionary\tFrameMaker Dictionary text\n!:mime\tapplication/x-mif\n>17\tstring\t\t3.0\t\t (3.0)\n>17\tstring\t\t2.0\t\t (2.0)\n>17\tstring\t\t1.0\t\t (1.x)\n0\tstring\t\t\\<MakerScreenFont\tFrameMaker Font file\n!:mime\tapplication/x-mif\n>17\tstring\t\t1.01\t\t (%s)\n0\tstring\t\t\\<MML\t\tFrameMaker MML file\n!:mime\tapplication/x-mif\n0\tstring\t\t\\<BookFile\tFrameMaker Book file\n!:mime\tapplication/x-mif\n>10\tstring\t\t3.0\t\t (3.0\n>10\tstring\t\t2.0\t\t (2.0\n>10\tstring\t\t1.0\t\t (1.0\n>13\tbyte\t\tx\t\t  %c)\n# XXX - this book entry should be verified, if you find one, uncomment this\n#0\tstring\t\t\\<Book\\ \tFrameMaker Book (ASCII) file\n#!:mime\tapplication/x-mif\n#>6\tstring\t\t3.0\t\t (3.0)\n#>6\tstring\t\t2.0\t\t (2.0)\n#>6\tstring\t\t1.0\t\t (1.0)\n0\tstring\t\t\\<Maker\tIntermediate Print File\tFrameMaker IPL file\n!:mime\tapplication/x-mif\n\n#------------------------------------------------------------------------------\n# freebsd:  file(1) magic for FreeBSD objects\n#\n# All new-style FreeBSD magic numbers are in host byte order (i.e.,\n# little-endian on x86).\n#\n# XXX - this comes from the file \"freebsd\" in a recent FreeBSD version of\n# \"file\"; it, and the NetBSD stuff in \"netbsd\", appear to use different\n# schemes for distinguishing between executable images, shared libraries,\n# and object files.\n#\n# FreeBSD says:\n#\n#    Regardless of whether it's pure, demand-paged, or none of the\n#    above:\n#\n#\tif the entry point is < 4096, then it's a shared library if\n#\tthe \"has run-time loader information\" bit is set, and is\n#\tposition-independent if the \"is position-independent\" bit\n#\tis set;\n#\n#\tif the entry point is >= 4096 (or >4095, same thing), then it's\n#\tan executable, and is dynamically-linked if the \"has run-time\n#\tloader information\" bit is set.\n#\n# On x86, NetBSD says:\n#\n#    If it's neither pure nor demand-paged:\n#\n#\tif it has the \"has run-time loader information\" bit set, it's\n#\ta dynamically-linked executable;\n#\n#\tif it doesn't have that bit set, then:\n#\n#\t    if it has the \"is position-independent\" bit set, it's\n#\t    position-independent;\n#\n#\t    if the entry point is non-zero, it's an executable, otherwise\n#\t    it's an object file.\n#\n#    If it's pure:\n#\n#\tif it has the \"has run-time loader information\" bit set, it's\n#\ta dynamically-linked executable, otherwise it's just an\n#\texecutable.\n#\n#    If it's demand-paged:\n#\n#\tif it has the \"has run-time loader information\" bit set,\n#\tthen:\n#\n#\t    if the entry point is < 4096, it's a shared library;\n#\n#\t    if the entry point is = 4096 or > 4096 (i.e., >= 4096),\n#\t    it's a dynamically-linked executable);\n#\n#\tif it doesn't have the \"has run-time loader information\" bit\n#\tset, then it's just an executable.\n#\n# (On non-x86, NetBSD does much the same thing, except that it uses\n# 8192 on 68K - except for \"68k4k\", which is presumably \"68K with 4K\n# pages - SPARC, and MIPS, presumably because Sun-3's and Sun-4's\n# had 8K pages; dunno about MIPS.)\n#\n# I suspect the two will differ only in perverse and uninteresting cases\n# (\"shared\" libraries that aren't demand-paged and whose pages probably\n# won't actually be shared, executables with entry points <4096).\n#\n# I leave it to those more familiar with FreeBSD and NetBSD to figure out\n# what the right answer is (although using \">4095\", FreeBSD-style, is\n# probably better than separately checking for \"=4096\" and \">4096\",\n# NetBSD-style).  (The old \"netbsd\" file analyzed FreeBSD demand paged\n# executables using the NetBSD technique.)\n#\n0\tlelong&0377777777\t041400407\tFreeBSD/i386\n>20\tlelong\t\t\t<4096\n>>3\tbyte&0xC0\t\t&0x80\t\tshared library\n>>3\tbyte&0xC0\t\t0x40\t\tPIC object\n>>3\tbyte&0xC0\t\t0x00\t\tobject\n>20\tlelong\t\t\t>4095\n>>3\tbyte&0x80\t\t0x80\t\tdynamically linked executable\n>>3\tbyte&0x80\t\t0x00\t\texecutable\n>16\tlelong\t\t\t>0\t\tnot stripped\n\n0\tlelong&0377777777\t041400410\tFreeBSD/i386 pure\n>20\tlelong\t\t\t<4096\n>>3\tbyte&0xC0\t\t&0x80\t\tshared library\n>>3\tbyte&0xC0\t\t0x40\t\tPIC object\n>>3\tbyte&0xC0\t\t0x00\t\tobject\n>20\tlelong\t\t\t>4095\n>>3\tbyte&0x80\t\t0x80\t\tdynamically linked executable\n>>3\tbyte&0x80\t\t0x00\t\texecutable\n>16\tlelong\t\t\t>0\t\tnot stripped\n\n0\tlelong&0377777777\t041400413\tFreeBSD/i386 demand paged\n>20\tlelong\t\t\t<4096\n>>3\tbyte&0xC0\t\t&0x80\t\tshared library\n>>3\tbyte&0xC0\t\t0x40\t\tPIC object\n>>3\tbyte&0xC0\t\t0x00\t\tobject\n>20\tlelong\t\t\t>4095\n>>3\tbyte&0x80\t\t0x80\t\tdynamically linked executable\n>>3\tbyte&0x80\t\t0x00\t\texecutable\n>16\tlelong\t\t\t>0\t\tnot stripped\n\n0\tlelong&0377777777\t041400314\tFreeBSD/i386 compact demand paged\n>20\tlelong\t\t\t<4096\n>>3\tbyte&0xC0\t\t&0x80\t\tshared library\n>>3\tbyte&0xC0\t\t0x40\t\tPIC object\n>>3\tbyte&0xC0\t\t0x00\t\tobject\n>20\tlelong\t\t\t>4095\n>>3\tbyte&0x80\t\t0x80\t\tdynamically linked executable\n>>3\tbyte&0x80\t\t0x00\t\texecutable\n>16\tlelong\t\t\t>0\t\tnot stripped\n\n# XXX gross hack to identify core files\n# cores start with a struct tss; we take advantage of the following:\n# byte 7:     highest byte of the kernel stack pointer, always 0xfe\n#      8/9:   kernel (ring 0) ss value, always 0x0010\n#      10 - 27: ring 1 and 2 ss/esp, unused, thus always 0\n#      28:    low order byte of the current PTD entry, always 0 since the\n#             PTD is page-aligned\n#\n7\tstring\t\\357\\020\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\tFreeBSD/i386 a.out core file\n>1039\tstring\t>\\0\tfrom '%s'\n\n# /var/run/ld.so.hints\n# What are you laughing about?\n0\tlelong\t\t\t011421044151\tld.so hints file (Little Endian\n>4\tlelong\t\t\t>0\t\t\\b, version %d)\n>4\tbelong\t\t\t<1\t\t\\b)\n0\tbelong\t\t\t011421044151\tld.so hints file (Big Endian\n>4\tbelong\t\t\t>0\t\t\\b, version %d)\n>4\tbelong\t\t\t<1\t\t\\b)\n\n#\n# Files generated by FreeBSD scrshot(1)/vidcontrol(1) utilities\n#\n0\tstring\tSCRSHOT_\tscrshot(1) screenshot,\n>8\tbyte\tx\t\tversion %d,\n>9\tbyte\t2\t\t%d bytes in header,\n>>10\tbyte\tx\t\t%d chars wide by\n>>11\tbyte\tx\t\t%d chars high\n\n#------------------------------------------------------------------------------\n# fsav:  file(1) magic for datafellows fsav virus definition files\n# Anthon van der Neut (anthon@mnt.org)\n\n# ftp://ftp.f-prot.com/pub/{macrdef2.zip,nomacro.def}\n0\tbeshort\t\t0x1575\t\tfsav macro virus signatures\n>8\tleshort\t\t>0\t\t(%d-\n>11\tbyte\t\t>0\t\t\\b%02d-\n>10\tbyte\t\t>0\t\t\\b%02d)\n# ftp://ftp.f-prot.com/pub/sign.zip\n#10\tubyte\t\t<12\n#>9\tubyte\t\t<32\n#>>8\tubyte\t\t0x0a\n#>>>12\tubyte\t\t0x07\n#>>>>11\tuleshort\t>0\t\tfsav DOS/Windows virus signatures (%d-\n#>>>>10\tbyte\t\t0\t\t\\b01-\n#>>>>10\tbyte\t\t1\t\t\\b02-\n#>>>>10\tbyte\t\t2\t\t\\b03-\n#>>>>10\tbyte\t\t3\t\t\\b04-\n#>>>>10\tbyte\t\t4\t\t\\b05-\n#>>>>10\tbyte\t\t5\t\t\\b06-\n#>>>>10\tbyte\t\t6\t\t\\b07-\n#>>>>10\tbyte\t\t7\t\t\\b08-\n#>>>>10\tbyte\t\t8\t\t\\b09-\n#>>>>10\tbyte\t\t9\t\t\\b10-\n#>>>>10\tbyte\t\t10\t\t\\b11-\n#>>>>10\tbyte\t\t11\t\t\\b12-\n#>>>>9\tubyte\t\t>0\t\t\\b%02d)\n# ftp://ftp.f-prot.com/pub/sign2.zip\n#0\tubyte\t\t0x62\t\t\n#>1\tubyte\t\t0xF5\t\t\n#>>2\tubyte\t\t0x1\t\t\n#>>>3\tubyte\t\t0x1\t\t\n#>>>>4\tubyte\t\t0x0e\t\t\n#>>>>>13\t\tubyte\t>0\t\tfsav virus signatures\n#>>>>>>11\tubyte\tx\t\tsize 0x%02x\n#>>>>>>12\tubyte\tx\t\t\\b%02x\n#>>>>>>13\tubyte\tx\t\t\\b%02x bytes\n\n# Joerg Jenderek: joerg dot jenderek at web dot de\n# http://www.clamav.net/doc/latest/html/node45.html\n# .cvd files start with a 512 bytes colon separated header\n# ClamAV-VDB:buildDate:version:signaturesNumbers:functionalityLevelRequired:MD5:Signature:builder:buildTime\n# + gzipped tarball files\n0\tstring\t\tClamAV-VDB:\t\n>11\tstring\t\t>\\0\t\tClam AntiVirus database %-.23s\n>>34\tstring\t\t:\t\t\n>>>35\t\tstring\t\t!:\t\\b, version \n>>>>35\t\tstring\t\tx \t\\b%-.1s\n>>>>>36\t\tstring \t\t!:\t\n>>>>>>36\tstring\t\tx \t\\b%-.1s\n>>>>>>>37\tstring\t\t!:\t\n>>>>>>>>37\tstring\t\tx \t\\b%-.1s\n>>>>>>>>>38\tstring\t\t!:\t\n>>>>>>>>>>38\tstring\t\tx \t\\b%-.1s\n>512\tstring\t\t\\037\\213\t\\b, gzipped\n>769\tstring\t\tustar\\0\t\t\\b, tarred\n\n# Type: Grisoft AVG AntiVirus\n# From: David Newgas <david@newgas.net>\n0\tstring\tAVG7_ANTIVIRUS_VAULT_FILE\tAVG 7 Antivirus vault file data\n#------------------------------------------------------------------------------\n# games:  file(1) for games\n\n# Fabio Bonelli <fabiobonelli@libero.it>\n# Quake II - III data files\n0       string  IDP2        \tQuake II 3D Model file,\n>20     long    x               %lu skin(s),\n>8      long    x               (%lu x\n>12     long    x \t\t%lu),\n>40     long    x               %lu frame(s),\n>16     long    x               Frame size %lu bytes,\n>24     long  \tx               %lu vertices/frame,\n>28     long    x            \t%lu texture coordinates,\n>32     long    x               %lu triangles/frame\n\n0       string  IBSP            Quake\n>4      long    0x26            II Map file (BSP)\n>4      long    0x2E      \tIII Map file (BSP)\n\n0       string  IDS2            Quake II SP2 sprite file\n\n#---------------------------------------------------------------------------\n# Doom and Quake\n# submitted by Nicolas Patrois\n\n0       string  \\xcb\\x1dBoom\\xe6\\xff\\x03\\x01    Boom or linuxdoom demo\n# some doom lmp files don't match, I've got one beginning with \\x6d\\x02\\x01\\x01\n\n24      string  LxD\\ 203        Linuxdoom save\n>0      string  x       , name=%s\n>44     string  x       , world=%s\n\n# Quake\n\n0       string  PACK    Quake I or II world or extension\n\n#0       string  -1\\x0a  Quake I demo\n#>30     string  x        version %.4s\n#>61     string  x        level %s       \n\n#0       string  5\\x0a   Quake I save\n\n# The levels\n\n# Quake 1\n\n0\tstring\t5\\x0aIntroduction             Quake I save: start Introduction\n0\tstring\t5\\x0athe_Slipgate_Complex     Quake I save: e1m1 The slipgate complex\n0\tstring\t5\\x0aCastle_of_the_Damned     Quake I save: e1m2 Castle of the damned\n0\tstring\t5\\x0athe_Necropolis           Quake I save: e1m3 The necropolis\n0\tstring\t5\\x0athe_Grisly_Grotto        Quake I save: e1m4 The grisly grotto\n0\tstring\t5\\x0aZiggurat_Vertigo         Quake I save: e1m8 Ziggurat vertigo (secret)\n0\tstring\t5\\x0aGloom_Keep               Quake I save: e1m5 Gloom keep\n0\tstring\t5\\x0aThe_Door_To_Chthon       Quake I save: e1m6 The door to Chthon\n0\tstring\t5\\x0aThe_House_of_Chthon      Quake I save: e1m7 The house of Chthon\n0\tstring\t5\\x0athe_Installation         Quake I save: e2m1 The installation\n0\tstring\t5\\x0athe_Ogre_Citadel         Quake I save: e2m2 The ogre citadel\n0\tstring\t5\\x0athe_Crypt_of_Decay       Quake I save: e2m3 The crypt of decay (dopefish lives!)\n0\tstring\t5\\x0aUnderearth               Quake I save: e2m7 Underearth (secret)\n0\tstring\t5\\x0athe_Ebon_Fortress        Quake I save: e2m4 The ebon fortress\n0\tstring\t5\\x0athe_Wizard's_Manse       Quake I save: e2m5 The wizard's manse\n0\tstring\t5\\x0athe_Dismal_Oubliette     Quake I save: e2m6 The dismal oubliette\n0\tstring\t5\\x0aTermination_Central      Quake I save: e3m1 Termination central\n0\tstring\t5\\x0aVaults_of_Zin            Quake I save: e3m2 Vaults of Zin\n0\tstring\t5\\x0athe_Tomb_of_Terror       Quake I save: e3m3 The tomb of terror\n0\tstring\t5\\x0aSatan's_Dark_Delight     Quake I save: e3m4 Satan's dark delight\n0\tstring\t5\\x0athe_Haunted_Halls        Quake I save: e3m7 The haunted halls (secret)\n0\tstring\t5\\x0aWind_Tunnels             Quake I save: e3m5 Wind tunnels\n0\tstring\t5\\x0aChambers_of_Torment      Quake I save: e3m6 Chambers of torment\n0\tstring\t5\\x0athe_Sewage_System        Quake I save: e4m1 The sewage system\n0\tstring\t5\\x0aThe_Tower_of_Despair     Quake I save: e4m2 The tower of despair\n0\tstring\t5\\x0aThe_Elder_God_Shrine     Quake I save: e4m3 The elder god shrine\n0\tstring\t5\\x0athe_Palace_of_Hate       Quake I save: e4m4 The palace of hate\n0\tstring\t5\\x0aHell's_Atrium            Quake I save: e4m5 Hell's atrium\n0\tstring\t5\\x0athe_Nameless_City        Quake I save: e4m8 The nameless city (secret)\n0\tstring\t5\\x0aThe_Pain_Maze            Quake I save: e4m6 The pain maze\n0\tstring\t5\\x0aAzure_Agony              Quake I save: e4m7 Azure agony\n0\tstring\t5\\x0aShub-Niggurath's_Pit     Quake I save: end Shub-Niggurath's pit\n\n# Quake DeathMatch levels\n\n0\tstring\t5\\x0aPlace_of_Two_Deaths\t Quake I save: dm1 Place of two deaths\n0\tstring\t5\\x0aClaustrophobopolis\t\t Quake I save: dm2 Claustrophobopolis\n0\tstring\t5\\x0aThe_Abandoned_Base\t\t Quake I save: dm3 The abandoned base\n0\tstring\t5\\x0aThe_Bad_Place\t\t Quake I save: dm4 The bad place\n0\tstring\t5\\x0aThe_Cistern\t\t Quake I save: dm5 The cistern\n0\tstring\t5\\x0aThe_Dark_Zone\t\t Quake I save: dm6 The dark zone\n\n# Scourge of Armagon\n\n0\tstring\t5\\x0aCommand_HQ               Quake I save: start Command HQ\n0\tstring\t5\\x0aThe_Pumping_Station      Quake I save: hip1m1 The pumping station\n0\tstring\t5\\x0aStorage_Facility         Quake I save: hip1m2 Storage facility\n0\tstring\t5\\x0aMilitary_Complex         Quake I save: hip1m5 Military complex (secret)\n0\tstring\t5\\x0athe_Lost_Mine            Quake I save: hip1m3 The lost mine\n0\tstring\t5\\x0aResearch_Facility        Quake I save: hip1m4 Research facility\n0\tstring\t5\\x0aAncient_Realms           Quake I save: hip2m1 Ancient realms\n0\tstring\t5\\x0aThe_Gremlin's_Domain     Quake I save: hip2m6 The gremlin's domain (secret)\n0\tstring\t5\\x0aThe_Black_Cathedral      Quake I save: hip2m2 The black cathedral\n0\tstring\t5\\x0aThe_Catacombs            Quake I save: hip2m3 The catacombs\n0\tstring\t5\\x0athe_Crypt__              Quake I save: hip2m4 The crypt\n0\tstring\t5\\x0aMortum's_Keep            Quake I save: hip2m5 Mortum's keep\n0\tstring\t5\\x0aTur_Torment              Quake I save: hip3m1 Tur torment\n0\tstring\t5\\x0aPandemonium              Quake I save: hip3m2 Pandemonium\n0\tstring\t5\\x0aLimbo                    Quake I save: hip3m3 Limbo\n0\tstring\t5\\x0athe_Edge_of_Oblivion     Quake I save: hipdm1 The edge of oblivion (secret)\n0\tstring\t5\\x0aThe_Gauntlet             Quake I save: hip3m4 The gauntlet\n0\tstring\t5\\x0aArmagon's_Lair           Quake I save: hipend Armagon's lair\n\n# Malice\n\n0\tstring\t5\\x0aThe_Academy      Quake I save: start The academy\n0\tstring\t5\\x0aThe_Lab          Quake I save: d1 The lab\n0\tstring\t5\\x0aArea_33          Quake I save: d1b Area 33\n0\tstring\t5\\x0aSECRET_MISSIONS  Quake I save: d3b Secret missions\n0\tstring\t5\\x0aThe_Hospital     Quake I save: d10 The hospital (secret)\n0\tstring\t5\\x0aThe_Genetics_Lab Quake I save: d11 The genetics lab (secret)\n0\tstring\t5\\x0aBACK_2_MALICE    Quake I save: d4b Back to Malice\n0\tstring\t5\\x0aArea44           Quake I save: d1c Area 44\n0\tstring\t5\\x0aTakahiro_Towers  Quake I save: d2 Takahiro towers\n0\tstring\t5\\x0aA_Rat's_Life     Quake I save: d3 A rat's life\n0\tstring\t5\\x0aInto_The_Flood   Quake I save: d4 Into the flood\n0\tstring\t5\\x0aThe_Flood        Quake I save: d5 The flood\n0\tstring\t5\\x0aNuclear_Plant    Quake I save: d6 Nuclear plant\n0\tstring\t5\\x0aThe_Incinerator_Plant    Quake I save: d7 The incinerator plant\n0\tstring\t5\\x0aThe_Foundry              Quake I save: d7b The foundry\n0\tstring\t5\\x0aThe_Underwater_Base      Quake I save: d8 The underwater base\n0\tstring\t5\\x0aTakahiro_Base            Quake I save: d9 Takahiro base\n0\tstring\t5\\x0aTakahiro_Laboratories    Quake I save: d12 Takahiro laboratories\n0\tstring\t5\\x0aStayin'_Alive    Quake I save: d13 Stayin' alive\n0\tstring\t5\\x0aB.O.S.S._HQ      Quake I save: d14 B.O.S.S. HQ\n0\tstring\t5\\x0aSHOWDOWN!        Quake I save: d15 Showdown!\n\n# Malice DeathMatch levels\n\n0\tstring\t5\\x0aThe_Seventh_Precinct\t Quake I save: ddm1 The seventh precinct\n0\tstring\t5\\x0aSub_Station\t\t Quake I save: ddm2 Sub station\n0\tstring\t5\\x0aCrazy_Eights!\t\t Quake I save: ddm3 Crazy eights!\n0\tstring\t5\\x0aEast_Side_Invertationa\t Quake I save: ddm4 East side invertationa\n0\tstring\t5\\x0aSlaughterhouse\t\t Quake I save: ddm5 Slaughterhouse\n0\tstring\t5\\x0aDOMINO\t\t\t Quake I save: ddm6 Domino\n0\tstring\t5\\x0aSANDRA'S_LADDER\t\t Quake I save: ddm7 Sandra's ladder\n\n\n0\tstring\tMComprHD\tMAME CHD compressed hard disk image,\n>12\tbelong\tx\t\tversion %lu\n\n# doom - submitted by Jon Dowland\n\n0\tstring\t=IWAD\t\tdoom main IWAD data\n>4\tlelong\tx\t\tcontaining %d lumps\n0\tstring\t=PWAD\t\tdoom patch PWAD data\n>4\tlelong\tx\t\tcontaining %d lumps\n\n\n# Summary: Warcraft 3 save\n# Extension: .w3g\n# Created by: \"Nelson A. de Oliveira\" <naoliv@gmail.com>\n0\tstring\t\tWarcraft\\ III\\ recorded\\ game\t%s\n\n\n# Summary: Warcraft 3 map\n# Extension: .w3m\n# Created by: \"Nelson A. de Oliveira\" <naoliv@gmail.com>\n0\tstring\t\tHM3W\t\tWarcraft III map file\n\n\n# Summary: SGF Smart Game Format\n# Extension: .sgf\n# Reference: http://www.red-bean.com/sgf/\n# Created by: Eduardo Sabbatella <eduardo_sabbatella@yahoo.com.ar>\n# Modified by (1): Abel Cheung (regex, more game format)\n# FIXME: Some games don't have GM (game type)\n0\tregex\t\t\\\\(;.*GM\\\\[[0-9]{1,2}\\\\]\tSmart Game Format\n>2\tsearch/0x200\tGM[\n>>&0\tstring\t\t1]\t(Go)\n>>&0\tstring\t\t2]\t(Othello)\n>>&0\tstring\t\t3]\t(chess)\n>>&0\tstring\t\t4]\t(Gomoku+Renju)\n>>&0\tstring\t\t5]\t(Nine Men's Morris)\n>>&0\tstring\t\t6]\t(Backgammon)\n>>&0\tstring\t\t7]\t(Chinese chess)\n>>&0\tstring\t\t8]\t(Shogi)\n>>&0\tstring\t\t9]\t(Lines of Action)\n>>&0\tstring\t\t10]\t(Ataxx)\n>>&0\tstring\t\t11]\t(Hex)\n>>&0\tstring\t\t12]\t(Jungle)\n>>&0\tstring\t\t13]\t(Neutron)\n>>&0\tstring\t\t14]\t(Philosopher's Football)\n>>&0\tstring\t\t15]\t(Quadrature)\n>>&0\tstring\t\t16]\t(Trax)\n>>&0\tstring\t\t17]\t(Tantrix)\n>>&0\tstring\t\t18]\t(Amazons)\n>>&0\tstring\t\t19]\t(Octi)\n>>&0\tstring\t\t20]\t(Gess)\n>>&0\tstring\t\t21]\t(Twixt)\n>>&0\tstring\t\t22]\t(Zertz)\n>>&0\tstring\t\t23]\t(Plateau)\n>>&0\tstring\t\t24]\t(Yinsh)\n>>&0\tstring\t\t25]\t(Punct)\n>>&0\tstring\t\t26]\t(Gobblet)\n>>&0\tstring\t\t27]\t(hive)\n>>&0\tstring\t\t28]\t(Exxit)\n>>&0\tstring\t\t29]\t(Hnefatal)\n>>&0\tstring\t\t30]\t(Kuba)\n>>&0\tstring\t\t31]\t(Tripples)\n>>&0\tstring\t\t32]\t(Chase)\n>>&0\tstring\t\t33]\t(Tumbling Down)\n>>&0\tstring\t\t34]\t(Sahara)\n>>&0\tstring\t\t35]\t(Byte)\n>>&0\tstring\t\t36]\t(Focus)\n>>&0\tstring\t\t37]\t(Dvonn)\n>>&0\tstring\t\t38]\t(Tamsk)\n>>&0\tstring\t\t39]\t(Gipf)\n>>&0\tstring\t\t40]\t(Kropki)\n\n\n# Summary: Civilization 4 video\n# Extension: .bik\n# Created by: Abel Cheung <abelcheung@gmail.com>\n0\tstring\tBIKi\tCivilization 4 Video\n\n\n##############################################\n# NetImmerse/Gamebryo game engine entries\n\n# Summary: Gamebryo game engine file\n# Extension: .nif, .kf\n# Created by: Abel Cheung <abelcheung@gmail.com>\n0\t\tstring\t\tGamebryo\\ File\\ Format,\\ Version\\ \tGamebryo game engine file\n>&0\t\tregex\t\t[0-9a-z.]+\t\t\t\t\\b, version %s\n\n# Summary: Gamebryo game engine file\n# Extension: .kfm\n# Created by: Abel Cheung <abelcheung@gmail.com>\n0\t\tstring\t\t;Gamebryo\\ KFM\\ File\\ Version\\ \t\tGamebryo game engine animation File\n>&0\t\tregex\t\t[0-9a-z.]+\t\t\t\t\\b, version %s\n\n# Summary: NetImmerse game engine file\n# Extension .nif\n# Created by: Abel Cheung <abelcheung@gmail.com>\n0\t\tstring\t\tNetImmerse\\ File\\ Format,\\ Versio\t\t\n>&0\t\tstring\t\tn\\ \t\t\t\t\tNetImmerse game engine file\n>>&0\t\tregex\t\t[0-9a-z.]+\t\t\t\t\\b, version %s\n\n\n#------------------------------------------------------------------------------\n# gcc:  file(1) magic for GCC special files\n#\n0\tstring\t\tgpch\t\tGCC precompiled header\n\n# The version field is annoying.  It's 3 characters, not zero-terminated.\n>5\tbyte\t\tx\t\t\t(version %c\n>6\tbyte\t\tx\t\t\t\\b%c\n>7\tbyte\t\tx\t\t\t\\b%c)\n\n# 67 = 'C', 111 = 'o', 43 = '+', 79 = 'O'\n>4\tbyte\t\t67\t\t\tfor C\n>4\tbyte\t\t111\t\t\tfor Objective C\n>4\tbyte\t\t43\t\t\tfor C++\n>4\tbyte\t\t79\t\t\tfor Objective C++\n\n#------------------------------------------------------------------------------\n# GEOS files (Vidar Madsen, vidar@gimp.org)\n# semi-commonly used in embedded and handheld systems.\n0\tbelong\t0xc745c153\tGEOS\n>40\tbyte\t1\texecutable\n>40\tbyte\t2\tVMFile\n>40\tbyte\t3\tbinary\n>40\tbyte\t4\tdirectory label\n>40\tbyte\t<1\tunknown\n>40\tbyte\t>4\tunknown\n>4\tstring\t>\\0\t\\b, name \"%s\"\n#>44\tshort\tx\t\\b, version %d\n#>46\tshort\tx\t\\b.%d\n#>48\tshort\tx\t\\b, rev %d\n#>50\tshort\tx\t\\b.%d\n#>52\tshort\tx\t\\b, proto %d\n#>54\tshort\tx\t\\br%d\n#>168\tstring\t>\\0\t\\b, copyright \"%s\"\n#------------------------------------------------------------------------------\n# GIMP Gradient: file(1) magic for the GIMP's gradient data files\n# by Federico Mena <federico@nuclecu.unam.mx>\n\n0       string          GIMP\\ Gradient  GIMP gradient data\n\n#------------------------------------------------------------------------------\n# XCF:  file(1) magic for the XCF image format used in the GIMP developed\n#       by Spencer Kimball and Peter Mattis\n#       ('Bucky' LaDieu, nega@vt.edu)\n\n0\tstring\t\tgimp\\ xcf\tGIMP XCF image data,\n>9\tstring\t\tfile\t\tversion 0,\n>9\tstring\t\tv\t\tversion\n>>10\tstring\t\t>\\0\t\t%s,\n>14\tbelong\t\tx\t\t%lu x\n>18\tbelong\t\tx\t\t%lu,\n>22     belong          0               RGB Color\n>22     belong          1               Greyscale\n>22     belong          2               Indexed Color\n>22\tbelong\t\t>2\t\tUnknown Image Type.\n\n#------------------------------------------------------------------------------\n# XCF:  file(1) magic for the patterns used in the GIMP, developed\n#       by Spencer Kimball and Peter Mattis\n#       ('Bucky' LaDieu, nega@vt.edu)\n\n20      string          GPAT            GIMP pattern data,\n>24     string          x               %s\n\n#------------------------------------------------------------------------------\n# XCF:  file(1) magic for the brushes used in the GIMP, developed\n#       by Spencer Kimball and Peter Mattis\n#       ('Bucky' LaDieu, nega@vt.edu)\n\n20      string          GIMP            GIMP brush data\n\n# GIMP Curves File\n# From: \"Nelson A. de Oliveira\" <naoliv@gmail.com>\n0\tstring\t#\\040GIMP\\040Curves\\040File\tGIMP curve file\n# GNOME keyring\n# Contributed by Josh Triplett\n# FIXME: Could be simplified if pstring supported two-byte counts\n0         string   GnomeKeyring\\n\\r\\0\\n GNOME keyring\n>&0       ubyte    0                    \\b, major version 0\n>>&0      ubyte    0                    \\b, minor version 0\n>>>&0     ubyte    0                    \\b, crypto type 0 (AEL)\n>>>&0     ubyte    >0                   \\b, crypto type %hhu (unknown)\n>>>&1     ubyte    0                    \\b, hash type 0 (MD5)\n>>>&1     ubyte    >0                   \\b, hash type %hhu (unknown)\n>>>&2     ubelong  0xFFFFFFFF           \\b, name NULL\n>>>&2     ubelong  !0xFFFFFFFF\n>>>>&-4   ubelong  >255                 \\b, name too long for file's pstring type\n>>>>&-4   ubelong  <256\n>>>>>&-1  pstring  x                    \\b, name \"%s\"\n>>>>>>&0  ubeqdate x                    \\b, last modified %s\n>>>>>>&8  ubeqdate x                    \\b, created %s\n>>>>>>&16 ubelong  &1\n>>>>>>>&0 ubelong  x                    \\b, locked if idle for %u seconds\n>>>>>>&16 ubelong  ^1                   \\b, not locked if idle\n>>>>>>&24 ubelong  x                    \\b, hash iterations %u\n>>>>>>&28 ubequad  x                    \\b, salt %llu\n>>>>>>&52 ubelong  x                    \\b, %u item(s)\n#------------------------------------------------------------------------------\n# gnu:  file(1) magic for various GNU tools\n#\n# GNU nlsutils message catalog file format\n#\n0\tstring\t\t\\336\\22\\4\\225\tGNU message catalog (little endian),\n>4\tlelong\t\tx\t\trevision %d,\n>8\tlelong\t\tx\t\t%d messages\n0\tstring\t\t\\225\\4\\22\\336\tGNU message catalog (big endian),\n>4\tbelong\t\tx\t\trevision %d,\n>8\tbelong\t\tx\t\t%d messages\n# message catalogs, from Mitchum DSouza <m.dsouza@mrc-apu.cam.ac.uk>\n0\tstring\t\t*nazgul*\tNazgul style compiled message catalog\n>8\tlelong\t\t>0\t\t\\b, version %ld\n\n# GnuPG\n# The format is very similar to pgp\n0\tstring          \\001gpg                 GPG key trust database\n>4\tbyte            x                       version %d\n# Note: magic.mime had 0x8501 for the next line instead of 0x8502\n0\tbeshort\t\t0x8502\t\t\tGPG encrypted data\n!:mime\ttext/PGP # encoding: data\n\n# This magic is not particularly good, as the keyrings don't have true\n# magic. Nevertheless, it covers many keyrings.\n0       beshort         0x9901                  GPG key public ring\n!:mime\tapplication/x-gnupg-keyring\n\n# Gnumeric spreadsheet\n# This entry is only semi-helpful, as Gnumeric compresses its files, so\n# they will ordinarily reported as \"compressed\", but at least -z helps\n39      string          =<gmr:Workbook           Gnumeric spreadsheet\n\n# From: James Youngman <jay@gnu.org> \n# gnu find magic\n0\tstring\t\\0LOCATE\tGNU findutils locate database data\n>7\tstring\t>\\0\t\t\\b, format %s\n>7\tstring\t02\t\t\\b (frcode)\n\n# Files produced by GNU gettext\n0\tlong\t0xDE120495\t\tGNU-format message catalog data\n0\tlong\t0x950412DE\t\tGNU-format message catalog data\n\n#------------------------------------------------------------------------------\n# gnumeric:  file(1) magic for Gnumeric spreadsheet\n# This entry is only semi-helpful, as Gnumeric compresses its files, so\n# they will ordinarily reported as \"compressed\", but at least -z helps\n39\tstring\t=<gmr:Workbook\tGnumeric spreadsheet\n!:mime\tapplication/x-gnumeric\n\n#------------------------------------------------------------------------------\n# ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE\n#\n# ACE/gr binary\n0\tstring\t\\000\\000\\0001\\000\\000\\0000\\000\\000\\0000\\000\\000\\0002\\000\\000\\0000\\000\\000\\0000\\000\\000\\0003\t\told ACE/gr binary file\n>39\tbyte\t>0\t\t\t- version %c\n# ACE/gr ascii\n0\tstring\t#\\ xvgr\\ parameter\\ file\tACE/gr ascii file\n0\tstring\t#\\ xmgr\\ parameter\\ file\tACE/gr ascii file\n0\tstring\t#\\ ACE/gr\\ parameter\\ file\tACE/gr ascii file\n# Grace projects\n0\tstring\t#\\ Grace\\ project\\ file\t\tGrace project file\n>23\tstring\t@version\\  \t\t\t(version\n>>32\tbyte\t>0 \t\t\t\t%c\n>>33\tstring\t>\\0 \t\t\t\t\\b.%.2s\n>>35\tstring\t>\\0 \t\t\t\t\\b.%.2s)\n# ACE/gr fit description files\n0\tstring\t#\\ ACE/gr\\ fit\\ description\\ \tACE/gr fit description file\n# end of ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE\n#------------------------------------------------------------------------------\n# graphviz:  file(1) magic for http://www.graphviz.org/\n\n# FIXME: These patterns match too generally. For example, the first\n# line matches a LaTeX file containing the word \"graph\" (with a {\n# following later) and the second line matches this file.\n#0\tregex/100\t[\\r\\n\\t\\ ]*graph[\\r\\n\\t\\ ]+.*\\\\{\tgraphviz graph text\n#!:mime\ttext/vnd.graphviz\n#0\tregex/100\t[\\r\\n\\t\\ ]*digraph[\\r\\n\\t\\ ]+.*\\\\{\tgraphviz digraph text\n#!:mime\ttext/vnd.graphviz\n\n#------------------------------------------------------------------------------\n# gringotts:  file(1) magic for Gringotts\n# http://devel.pluto.linux.it/projects/Gringotts/\n# author: Germano Rizzo <mano@pluto.linux.it>\n#GRG3????Y\n0\tstring\tGRG\t\tGringotts data file\n#file format 1\n>3\tstring\t\t1\t\tv.1, MCRYPT S2K, SERPENT crypt, SHA-256 hash, ZLib lvl.9\n#file format 2\n>3\tstring\t\t2\t\tv.2, MCRYPT S2K, \n>>8\tbyte&0x70\t0x00\t\tRIJNDAEL-128 crypt,\n>>8\tbyte&0x70\t0x10\t\tSERPENT crypt,\n>>8\tbyte&0x70\t0x20\t\tTWOFISH crypt, \n>>8\tbyte&0x70\t0x30\t\tCAST-256 crypt,\n>>8\tbyte&0x70\t0x40\t\tSAFER+ crypt,\n>>8\tbyte&0x70\t0x50\t\tLOKI97 crypt,\n>>8\tbyte&0x70\t0x60\t\t3DES crypt,\n>>8\tbyte&0x70\t0x70\t\tRIJNDAEL-256 crypt,\n>>8\tbyte&0x08\t0x00\t\tSHA1 hash,\n>>8\tbyte&0x08\t0x08\t\tRIPEMD-160 hash,\n>>8\tbyte&0x04\t0x00\t\tZLib\n>>8\tbyte&0x04\t0x04\t\tBZip2\n>>8\tbyte&0x03\t0x00\t\tlvl.0\n>>8\tbyte&0x03\t0x01\t\tlvl.3\n>>8\tbyte&0x03\t0x02\t\tlvl.6\n>>8\tbyte&0x03\t0x03\t\tlvl.9\n#file format 3\n>3\tstring\t\t3\t\tv.3, OpenPGP S2K, \n>>8\tbyte&0x70\t0x00\t\tRIJNDAEL-128 crypt,\n>>8\tbyte&0x70\t0x10\t\tSERPENT crypt,\n>>8\tbyte&0x70\t0x20\t\tTWOFISH crypt, \n>>8\tbyte&0x70\t0x30\t\tCAST-256 crypt,\n>>8\tbyte&0x70\t0x40\t\tSAFER+ crypt,\n>>8\tbyte&0x70\t0x50\t\tLOKI97 crypt,\n>>8\tbyte&0x70\t0x60\t\t3DES crypt,\n>>8\tbyte&0x70\t0x70\t\tRIJNDAEL-256 crypt,\n>>8\tbyte&0x08\t0x00\t\tSHA1 hash,\n>>8\tbyte&0x08\t0x08\t\tRIPEMD-160 hash,\n>>8\tbyte&0x04\t0x00\t\tZLib\n>>8\tbyte&0x04\t0x04\t\tBZip2\n>>8\tbyte&0x03\t0x00\t\tlvl.0\n>>8\tbyte&0x03\t0x01\t\tlvl.3\n>>8\tbyte&0x03\t0x02\t\tlvl.6\n>>8\tbyte&0x03\t0x03\t\tlvl.9\n#file format >3\n>3\tstring\t\t>3\t\tv.%.1s (unknown details)\n\n#------------------------------------------------------------------------------\n# hitach-sh: file(1) magic for Hitachi Super-H\n#\n# Super-H COFF\n#\n0\tbeshort\t\t0x0500\t\tHitachi SH big-endian COFF\n>18\tbeshort&0x0002\t=0x0000\t\tobject\n>18\tbeshort&0x0002\t=0x0002\t\texecutable\n>18\tbeshort&0x0008\t=0x0008\t\t\\b, stripped\n>18\tbeshort&0x0008\t=0x0000\t\t\\b, not stripped\n#\n0\tleshort\t\t0x0550\t\tHitachi SH little-endian COFF\n>18\tleshort&0x0002\t=0x0000\t\tobject\n>18\tleshort&0x0002\t=0x0002\t\texecutable\n>18\tleshort&0x0008\t=0x0008\t\t\\b, stripped\n>18\tleshort&0x0008\t=0x0000\t\t\\b, not stripped\n\n#------------------------------------------------------------------------------\n# hp:  file(1) magic for Hewlett Packard machines (see also \"printer\")\n#\n# XXX - somebody should figure out whether any byte order needs to be\n# applied to the \"TML\" stuff; I'm assuming the Apollo stuff is\n# big-endian as it was mostly 68K-based.\n#\n# I think the 500 series was the old stack-based machines, running a\n# UNIX environment atop the \"SUN kernel\"; dunno whether it was\n# big-endian or little-endian.\n#\n# Daniel Quinlan (quinlan@yggdrasil.com): hp200 machines are 68010 based;\n# hp300 are 68020+68881 based; hp400 are also 68k.  The following basic\n# HP magic is useful for reference, but using \"long\" magic is a better\n# practice in order to avoid collisions.\n#\n# Guy Harris (guy@netapp.com): some additions to this list came from\n# HP-UX 10.0's \"/usr/include/sys/unistd.h\" (68030, 68040, PA-RISC 1.1,\n# 1.2, and 2.0).  The 1.2 and 2.0 stuff isn't in the HP-UX 10.0\n# \"/etc/magic\", though, except for the \"archive file relocatable library\"\n# stuff, and the 68030 and 68040 stuff isn't there at all - are they not\n# used in executables, or have they just not yet updated \"/etc/magic\"\n# completely?\n#\n# 0\tbeshort\t\t200\t\thp200 (68010) BSD binary\n# 0\tbeshort\t\t300\t\thp300 (68020+68881) BSD binary\n# 0\tbeshort\t\t0x20c\t\thp200/300 HP-UX binary\n# 0\tbeshort\t\t0x20d\t\thp400 (68030) HP-UX binary\n# 0\tbeshort\t\t0x20e\t\thp400 (68040?) HP-UX binary\n# 0\tbeshort\t\t0x20b\t\tPA-RISC1.0 HP-UX binary\n# 0\tbeshort\t\t0x210\t\tPA-RISC1.1 HP-UX binary\n# 0\tbeshort\t\t0x211\t\tPA-RISC1.2 HP-UX binary\n# 0\tbeshort\t\t0x214\t\tPA-RISC2.0 HP-UX binary\n\n#\n# The \"misc\" stuff needs a byte order; the archives look suspiciously\n# like the old 177545 archives (0xff65 = 0177545).\n#\n#### Old Apollo stuff\n0\tbeshort\t\t0627\t\tApollo m68k COFF executable\n>18\tbeshort\t\t^040000\t\tnot stripped\n>22\tbeshort\t\t>0\t\t- version %ld\n0\tbeshort\t\t0624\t\tapollo a88k COFF executable\n>18\tbeshort\t\t^040000\t\tnot stripped\n>22\tbeshort\t\t>0\t\t- version %ld\n0       long            01203604016     TML 0123 byte-order format\n0       long            01702407010     TML 1032 byte-order format\n0       long            01003405017     TML 2301 byte-order format\n0       long            01602007412     TML 3210 byte-order format\n#### PA-RISC 1.1\n0\tbelong \t\t0x02100106\tPA-RISC1.1 relocatable object\n0\tbelong \t\t0x02100107\tPA-RISC1.1 executable\n>168\tbelong\t\t&0x00000004\tdynamically linked\n>(144)\tbelong\t\t0x054ef630\tdynamically linked\n>96\tbelong\t\t>0\t\t- not stripped\n\n0\tbelong \t\t0x02100108\tPA-RISC1.1 shared executable\n>168\tbelong&0x4\t0x4\t\tdynamically linked\n>(144)\tbelong\t\t0x054ef630\tdynamically linked\n>96\tbelong\t\t>0\t\t- not stripped\n\n0\tbelong \t\t0x0210010b\tPA-RISC1.1 demand-load executable\n>168\tbelong&0x4\t0x4\t\tdynamically linked\n>(144)\tbelong\t\t0x054ef630\tdynamically linked\n>96\tbelong\t\t>0\t\t- not stripped\n\n0\tbelong \t\t0x0210010e\tPA-RISC1.1 shared library\n>96\tbelong\t\t>0\t\t- not stripped\n\n0\tbelong \t\t0x0210010d\tPA-RISC1.1 dynamic load library\n>96\tbelong\t\t>0\t\t- not stripped\n\n#### PA-RISC 2.0\n0\tbelong\t\t0x02140106\tPA-RISC2.0 relocatable object\n\n0       belong\t\t0x02140107\tPA-RISC2.0 executable\n>168\tbelong\t\t&0x00000004\tdynamically linked\n>(144)\tbelong\t\t0x054ef630\tdynamically linked\n>96\tbelong\t\t>0\t\t- not stripped\n\n0       belong\t\t0x02140108\tPA-RISC2.0 shared executable\n>168\tbelong\t\t&0x00000004\tdynamically linked\n>(144)\tbelong\t\t0x054ef630\tdynamically linked\n>96\tbelong\t\t>0\t\t- not stripped\n\n0       belong\t\t0x0214010b\tPA-RISC2.0 demand-load executable\n>168\tbelong\t\t&0x00000004\tdynamically linked\n>(144)\tbelong\t\t0x054ef630\tdynamically linked\n>96\tbelong\t\t>0\t\t- not stripped\n\n0       belong\t\t0x0214010e\tPA-RISC2.0 shared library\n>96\tbelong\t\t>0\t\t- not stripped\n\n0       belong\t\t0x0214010d\tPA-RISC2.0 dynamic load library\n>96\tbelong\t\t>0\t\t- not stripped\n\n#### 800\n0\tbelong \t\t0x020b0106\tPA-RISC1.0 relocatable object\n\n0\tbelong \t\t0x020b0107\tPA-RISC1.0 executable\n>168\tbelong&0x4\t0x4\t\tdynamically linked\n>(144)\tbelong\t\t0x054ef630\tdynamically linked\n>96\tbelong\t\t>0\t\t- not stripped\n\n0\tbelong \t\t0x020b0108\tPA-RISC1.0 shared executable\n>168\tbelong&0x4\t0x4\t\tdynamically linked\n>(144)\tbelong\t\t0x054ef630\tdynamically linked\n>96\tbelong\t\t>0\t\t- not stripped\n\n0\tbelong \t\t0x020b010b\tPA-RISC1.0 demand-load executable\n>168\tbelong&0x4\t0x4\t\tdynamically linked\n>(144)\tbelong\t\t0x054ef630\tdynamically linked\n>96\tbelong\t\t>0\t\t- not stripped\n\n0\tbelong \t\t0x020b010e\tPA-RISC1.0 shared library\n>96\tbelong\t\t>0\t\t- not stripped\n\n0\tbelong \t\t0x020b010d\tPA-RISC1.0 dynamic load library\n>96\tbelong\t\t>0\t\t- not stripped\n\n0\tbelong\t\t0x213c6172\tarchive file\n>68\tbelong \t\t0x020b0619\t- PA-RISC1.0 relocatable library\n>68\tbelong\t \t0x02100619\t- PA-RISC1.1 relocatable library\n>68\tbelong \t\t0x02110619\t- PA-RISC1.2 relocatable library\n>68\tbelong \t\t0x02140619\t- PA-RISC2.0 relocatable library\n\n#### 500\n0\tlong\t\t0x02080106\tHP s500 relocatable executable\n>16\tlong\t\t>0\t\t- version %ld\n\n0\tlong\t\t0x02080107\tHP s500 executable\n>16\tlong\t\t>0\t\t- version %ld\n\n0\tlong\t\t0x02080108\tHP s500 pure executable\n>16\tlong\t\t>0\t\t- version %ld\n\n#### 200\n0\tbelong \t\t0x020c0108\tHP s200 pure executable\n>4\tbeshort\t\t>0\t\t- version %ld\n>8\tbelong\t\t&0x80000000\tsave fp regs\n>8\tbelong\t\t&0x40000000\tdynamically linked\n>8\tbelong\t\t&0x20000000\tdebuggable\n>36\tbelong\t\t>0\t\tnot stripped\n\n0\tbelong\t\t0x020c0107\tHP s200 executable\n>4\tbeshort\t\t>0\t\t- version %ld\n>8\tbelong\t\t&0x80000000\tsave fp regs\n>8\tbelong\t\t&0x40000000\tdynamically linked\n>8\tbelong\t\t&0x20000000\tdebuggable\n>36\tbelong\t\t>0\t\tnot stripped\n\n0\tbelong\t\t0x020c010b\tHP s200 demand-load executable\n>4\tbeshort\t\t>0\t\t- version %ld\n>8\tbelong\t\t&0x80000000\tsave fp regs\n>8\tbelong\t\t&0x40000000\tdynamically linked\n>8\tbelong\t\t&0x20000000\tdebuggable\n>36\tbelong\t\t>0\t\tnot stripped\n\n0\tbelong\t\t0x020c0106\tHP s200 relocatable executable\n>4\tbeshort\t\t>0\t\t- version %ld\n>6\tbeshort\t\t>0\t\t- highwater %d\n>8\tbelong\t\t&0x80000000\tsave fp regs\n>8\tbelong\t\t&0x20000000\tdebuggable\n>8\tbelong\t\t&0x10000000\tPIC\n\n0\tbelong \t\t0x020a0108\tHP s200 (2.x release) pure executable\n>4\tbeshort\t\t>0\t\t- version %ld\n>36\tbelong\t\t>0\t\tnot stripped\n\n0\tbelong\t\t0x020a0107\tHP s200 (2.x release) executable\n>4\tbeshort\t\t>0\t\t- version %ld\n>36\tbelong\t\t>0\t\tnot stripped\n\n0\tbelong\t\t0x020c010e\tHP s200 shared library\n>4\tbeshort\t\t>0\t\t- version %ld\n>6\tbeshort\t\t>0\t\t- highwater %d\n>36\tbelong\t\t>0\t\tnot stripped\n\n0\tbelong\t\t0x020c010d\tHP s200 dynamic load library\n>4\tbeshort\t\t>0\t\t- version %ld\n>6\tbeshort\t\t>0\t\t- highwater %d\n>36\tbelong\t\t>0\t\tnot stripped\n\n#### MISC\n0\tlong\t\t0x0000ff65\tHP old archive\n0\tlong\t\t0x020aff65\tHP s200 old archive\n0\tlong\t\t0x020cff65\tHP s200 old archive\n0\tlong\t\t0x0208ff65\tHP s500 old archive\n\n0\tlong\t\t0x015821a6\tHP core file\n\n0\tlong\t\t0x4da7eee8\tHP-WINDOWS font\n>8\tbyte\t\t>0\t\t- version %ld\n0\tstring\t\tBitmapfile\tHP Bitmapfile\n\n0\tstring\t\tIMGfile\tCIS \tcompimg HP Bitmapfile\n# XXX - see \"lif\"\n#0\tshort\t\t0x8000\t\tlif file\n0\tlong\t\t0x020c010c\tcompiled Lisp\n\n0\tstring\t\tmsgcat01\tHP NLS message catalog,\n>8\tlong\t\t>0\t\t%d messages\n\n# Summary: HP-48/49 calculator\n# Created by: phk@data.fls.dk\n# Modified by (1): AMAKAWA Shuhei <sa264@cam.ac.uk>\n# Modified by (2): Samuel Thibault <samuel.thibault@ens-lyon.org> (HP49 support)\n0\tstring\t\tHPHP\t\tHP\n>4\tstring\t\t48\t\t48 binary\n>4\tstring\t\t49\t\t49 binary\n>7\tbyte\t\t>64\t\t- Rev %c\n>8\tleshort\t\t0x2911\t\t(ADR)\n>8\tleshort\t\t0x2933\t\t(REAL)\n>8\tleshort\t\t0x2955\t\t(LREAL)\n>8\tleshort\t\t0x2977\t\t(COMPLX)\n>8\tleshort\t\t0x299d\t\t(LCOMPLX)\n>8\tleshort\t\t0x29bf\t\t(CHAR)\n>8\tleshort\t\t0x29e8\t\t(ARRAY)\n>8\tleshort\t\t0x2a0a\t\t(LNKARRAY)\n>8\tleshort\t\t0x2a2c\t\t(STRING)\n>8\tleshort\t\t0x2a4e\t\t(HXS)\n>8\tleshort\t\t0x2a74\t\t(LIST)\n>8\tleshort\t\t0x2a96\t\t(DIR)\n>8\tleshort\t\t0x2ab8\t\t(ALG)\n>8\tleshort\t\t0x2ada\t\t(UNIT)\n>8\tleshort\t\t0x2afc\t\t(TAGGED)\n>8\tleshort\t\t0x2b1e\t\t(GROB)\n>8\tleshort\t\t0x2b40\t\t(LIB)\n>8\tleshort\t\t0x2b62\t\t(BACKUP)\n>8\tleshort\t\t0x2b88\t\t(LIBDATA)\n>8\tleshort\t\t0x2d9d\t\t(PROG)\n>8\tleshort\t\t0x2dcc\t\t(CODE)\n>8\tleshort\t\t0x2e48\t\t(GNAME)\n>8\tleshort\t\t0x2e6d\t\t(LNAME)\n>8\tleshort\t\t0x2e92\t\t(XLIB)\n\n0\tstring\t\t%%HP:\t\tHP text\n>6\tstring\t\tT(0)\t\t- T(0)\n>6\tstring\t\tT(1)\t\t- T(1)\n>6\tstring\t\tT(2)\t\t- T(2)\n>6\tstring\t\tT(3)\t\t- T(3)\n>10\tstring\t\tA(D)\t\tA(D)\n>10\tstring\t\tA(R)\t\tA(R)\n>10\tstring\t\tA(G)\t\tA(G)\n>14\tstring\t\tF(.)\t\tF(.);\n>14\tstring\t\tF(,)\t\tF(,);\n\n\n# Summary: HP-38/39 calculator\n# Created by: Samuel Thibault <samuel.thibault@ens-lyon.org>\n0\tstring\t\tHP3\n>3\tstring\t\t8\t\tHP 38\n>3\tstring\t\t9\t\tHP 39\n>4\tstring\t\tBin\t\tbinary\n>4\tstring\t\tAsc\t\tASCII\n>7\tstring\t\tA\t\t(Directory List)\n>7\tstring\t\tB\t\t(Zaplet)\n>7\tstring\t\tC\t\t(Note)\n>7\tstring\t\tD\t\t(Program)\n>7\tstring\t\tE\t\t(Variable)\n>7\tstring\t\tF\t\t(List)\n>7\tstring\t\tG\t\t(Matrix)\n>7\tstring\t\tH\t\t(Library)\n>7\tstring\t\tI\t\t(Target List)\n>7\tstring\t\tJ\t\t(ASCII Vector specification)\n>7\tstring\t\tK\t\t(wildcard)\n\n# Summary: HP-38/39 calculator\n# Created by: Samuel Thibault <samuel.thibault@ens-lyon.org>\n0\tstring\t\tHP3\n>3\tstring\t\t8\t\tHP 38\n>3\tstring\t\t9\t\tHP 39\n>4\tstring\t\tBin\t\tbinary\n>4\tstring\t\tAsc\t\tASCII\n>7\tstring\t\tA\t\t(Directory List)\n>7\tstring\t\tB\t\t(Zaplet)\n>7\tstring\t\tC\t\t(Note)\n>7\tstring\t\tD\t\t(Program)\n>7\tstring\t\tE\t\t(Variable)\n>7\tstring\t\tF\t\t(List)\n>7\tstring\t\tG\t\t(Matrix)\n>7\tstring\t\tH\t\t(Library)\n>7\tstring\t\tI\t\t(Target List)\n>7\tstring\t\tJ\t\t(ASCII Vector specification)\n>7\tstring\t\tK\t\t(wildcard)\n\n# hpBSD magic numbers\n0\tbeshort\t\t200\t\thp200 (68010) BSD\n>2\tbeshort\t\t0407\t\timpure binary\n>2\tbeshort\t\t0410\t\tread-only binary\n>2\tbeshort\t\t0413\t\tdemand paged binary\n0\tbeshort\t\t300\t\thp300 (68020+68881) BSD\n>2\tbeshort\t\t0407\t\timpure binary\n>2\tbeshort\t\t0410\t\tread-only binary\n>2\tbeshort\t\t0413\t\tdemand paged binary\n#\n# From David Gero <dgero@nortelnetworks.com>\n# HP-UX 10.20 core file format from /usr/include/sys/core.h\n# Unfortunately, HP-UX uses corehead blocks without specifying the order\n# There are four we care about:\n#     CORE_KERNEL, which starts with the string \"HP-UX\"\n#     CORE_EXEC, which contains the name of the command\n#     CORE_PROC, which contains the signal number that caused the core dump\n#     CORE_FORMAT, which contains the version of the core file format (== 1)\n# The only observed order in real core files is KERNEL, EXEC, FORMAT, PROC\n# but we include all 6 variations of the order of the first 3, and\n# assume that PROC will always be last\n# Order 1: KERNEL, EXEC, FORMAT, PROC\n0x10\t\tstring\tHP-UX\n>0\t\tbelong\t2\n>>0xC\t\tbelong\t0x3C\n>>>0x4C\t\tbelong\t0x100\n>>>>0x58\tbelong\t0x44\n>>>>>0xA0\tbelong\t1\n>>>>>>0xAC\tbelong\t4\n>>>>>>>0xB0\tbelong\t1\n>>>>>>>>0xB4\tbelong\t4\t\tcore file\n>>>>>>>>>0x90\tstring\t>\\0\t\tfrom '%s'\n>>>>>>>>>0xC4\tbelong\t3\t\t- received SIGQUIT\n>>>>>>>>>0xC4\tbelong\t4\t\t- received SIGILL\n>>>>>>>>>0xC4\tbelong\t5\t\t- received SIGTRAP\n>>>>>>>>>0xC4\tbelong\t6\t\t- received SIGABRT\n>>>>>>>>>0xC4\tbelong\t7\t\t- received SIGEMT\n>>>>>>>>>0xC4\tbelong\t8\t\t- received SIGFPE\n>>>>>>>>>0xC4\tbelong\t10\t\t- received SIGBUS\n>>>>>>>>>0xC4\tbelong\t11\t\t- received SIGSEGV\n>>>>>>>>>0xC4\tbelong\t12\t\t- received SIGSYS\n>>>>>>>>>0xC4\tbelong\t33\t\t- received SIGXCPU\n>>>>>>>>>0xC4\tbelong\t34\t\t- received SIGXFSZ\n# Order 2: KERNEL, FORMAT, EXEC, PROC\n>>>0x4C\t\tbelong\t1\n>>>>0x58\tbelong\t4\n>>>>>0x5C\tbelong\t1\n>>>>>>0x60\tbelong\t0x100\n>>>>>>>0x6C\tbelong\t0x44\n>>>>>>>>0xB4\tbelong\t4\t\tcore file\n>>>>>>>>>0xA4\tstring\t>\\0\t\tfrom '%s'\n>>>>>>>>>0xC4\tbelong\t3\t\t- received SIGQUIT\n>>>>>>>>>0xC4\tbelong\t4\t\t- received SIGILL\n>>>>>>>>>0xC4\tbelong\t5\t\t- received SIGTRAP\n>>>>>>>>>0xC4\tbelong\t6\t\t- received SIGABRT\n>>>>>>>>>0xC4\tbelong\t7\t\t- received SIGEMT\n>>>>>>>>>0xC4\tbelong\t8\t\t- received SIGFPE\n>>>>>>>>>0xC4\tbelong\t10\t\t- received SIGBUS\n>>>>>>>>>0xC4\tbelong\t11\t\t- received SIGSEGV\n>>>>>>>>>0xC4\tbelong\t12\t\t- received SIGSYS\n>>>>>>>>>0xC4\tbelong\t33\t\t- received SIGXCPU\n>>>>>>>>>0xC4\tbelong\t34\t\t- received SIGXFSZ\n# Order 3: FORMAT, KERNEL, EXEC, PROC\n0x24\t\tstring\tHP-UX\n>0\t\tbelong\t1\n>>0xC\t\tbelong\t4\n>>>0x10\t\tbelong\t1\n>>>>0x14\tbelong\t2\n>>>>>0x20\tbelong\t0x3C\n>>>>>>0x60\tbelong\t0x100\n>>>>>>>0x6C\tbelong\t0x44\n>>>>>>>>0xB4\tbelong\t4\t\tcore file\n>>>>>>>>>0xA4\tstring\t>\\0\t\tfrom '%s'\n>>>>>>>>>0xC4\tbelong\t3\t\t- received SIGQUIT\n>>>>>>>>>0xC4\tbelong\t4\t\t- received SIGILL\n>>>>>>>>>0xC4\tbelong\t5\t\t- received SIGTRAP\n>>>>>>>>>0xC4\tbelong\t6\t\t- received SIGABRT\n>>>>>>>>>0xC4\tbelong\t7\t\t- received SIGEMT\n>>>>>>>>>0xC4\tbelong\t8\t\t- received SIGFPE\n>>>>>>>>>0xC4\tbelong\t10\t\t- received SIGBUS\n>>>>>>>>>0xC4\tbelong\t11\t\t- received SIGSEGV\n>>>>>>>>>0xC4\tbelong\t12\t\t- received SIGSYS\n>>>>>>>>>0xC4\tbelong\t33\t\t- received SIGXCPU\n>>>>>>>>>0xC4\tbelong\t34\t\t- received SIGXFSZ\n# Order 4: EXEC, KERNEL, FORMAT, PROC\n0x64\t\tstring\tHP-UX\n>0\t\tbelong\t0x100\n>>0xC\t\tbelong\t0x44\n>>>0x54\t\tbelong\t2\n>>>>0x60\tbelong\t0x3C\n>>>>>0xA0\tbelong\t1\n>>>>>>0xAC\tbelong\t4\n>>>>>>>0xB0\tbelong\t1\n>>>>>>>>0xB4\tbelong\t4\t\tcore file\n>>>>>>>>>0x44\tstring\t>\\0\t\tfrom '%s'\n>>>>>>>>>0xC4\tbelong\t3\t\t- received SIGQUIT\n>>>>>>>>>0xC4\tbelong\t4\t\t- received SIGILL\n>>>>>>>>>0xC4\tbelong\t5\t\t- received SIGTRAP\n>>>>>>>>>0xC4\tbelong\t6\t\t- received SIGABRT\n>>>>>>>>>0xC4\tbelong\t7\t\t- received SIGEMT\n>>>>>>>>>0xC4\tbelong\t8\t\t- received SIGFPE\n>>>>>>>>>0xC4\tbelong\t10\t\t- received SIGBUS\n>>>>>>>>>0xC4\tbelong\t11\t\t- received SIGSEGV\n>>>>>>>>>0xC4\tbelong\t12\t\t- received SIGSYS\n>>>>>>>>>0xC4\tbelong\t33\t\t- received SIGXCPU\n>>>>>>>>>0xC4\tbelong\t34\t\t- received SIGXFSZ\n# Order 5: FORMAT, EXEC, KERNEL, PROC\n0x78\t\tstring\tHP-UX\n>0\t\tbelong\t1\n>>0xC\t\tbelong\t4\n>>>0x10\t\tbelong\t1\n>>>>0x14\tbelong\t0x100\n>>>>>0x20\tbelong\t0x44\n>>>>>>0x68\tbelong\t2\n>>>>>>>0x74\tbelong\t0x3C\n>>>>>>>>0xB4\tbelong\t4\t\tcore file\n>>>>>>>>>0x58\tstring\t>\\0\t\tfrom '%s'\n>>>>>>>>>0xC4\tbelong\t3\t\t- received SIGQUIT\n>>>>>>>>>0xC4\tbelong\t4\t\t- received SIGILL\n>>>>>>>>>0xC4\tbelong\t5\t\t- received SIGTRAP\n>>>>>>>>>0xC4\tbelong\t6\t\t- received SIGABRT\n>>>>>>>>>0xC4\tbelong\t7\t\t- received SIGEMT\n>>>>>>>>>0xC4\tbelong\t8\t\t- received SIGFPE\n>>>>>>>>>0xC4\tbelong\t10\t\t- received SIGBUS\n>>>>>>>>>0xC4\tbelong\t11\t\t- received SIGSEGV\n>>>>>>>>>0xC4\tbelong\t12\t\t- received SIGSYS\n>>>>>>>>>0xC4\tbelong\t33\t\t- received SIGXCPU\n>>>>>>>>>0xC4\tbelong\t34\t\t- received SIGXFSZ\n# Order 6: EXEC, FORMAT, KERNEL, PROC\n>0\t\tbelong\t0x100\n>>0xC\t\tbelong\t0x44\n>>>0x54\t\tbelong\t1\n>>>>0x60\tbelong\t4\n>>>>>0x64\tbelong\t1\n>>>>>>0x68\tbelong\t2\n>>>>>>>0x74\tbelong\t0x2C\n>>>>>>>>0xB4\tbelong\t4\t\tcore file\n>>>>>>>>>0x44\tstring\t>\\0\t\tfrom '%s'\n>>>>>>>>>0xC4\tbelong\t3\t\t- received SIGQUIT\n>>>>>>>>>0xC4\tbelong\t4\t\t- received SIGILL\n>>>>>>>>>0xC4\tbelong\t5\t\t- received SIGTRAP\n>>>>>>>>>0xC4\tbelong\t6\t\t- received SIGABRT\n>>>>>>>>>0xC4\tbelong\t7\t\t- received SIGEMT\n>>>>>>>>>0xC4\tbelong\t8\t\t- received SIGFPE\n>>>>>>>>>0xC4\tbelong\t10\t\t- received SIGBUS\n>>>>>>>>>0xC4\tbelong\t11\t\t- received SIGSEGV\n>>>>>>>>>0xC4\tbelong\t12\t\t- received SIGSYS\n>>>>>>>>>0xC4\tbelong\t33\t\t- received SIGXCPU\n>>>>>>>>>0xC4\tbelong\t34\t\t- received SIGXFSZ\n\n\n\n#------------------------------------------------------------------------------\n# human68k:  file(1) magic for Human68k (X680x0 DOS) binary formats\n# Magic too short!\n#0\t\tstring\tHU\t\tHuman68k\n#>68\t\tstring\tLZX\t\tLZX compressed\n#>>72\t\tstring\t>\\0\t\t(version %s)\n#>(8.L+74)\tstring\tLZX\t\tLZX compressed\n#>>(8.L+78)\tstring\t>\\0\t\t(version %s)\n#>60\t\tbelong\t>0\t\tbinded\n#>(8.L+66)\tstring\t#HUPAIR\t\thupair\n#>0\t\tstring\tHU\t\tX executable\n#>(8.L+74)\tstring\t#LIBCV1\t\t- linked PD LIBC ver 1\n#>4\t\tbelong\t>0\t\t- base address 0x%x\n#>28\t\tbelong\t>0\t\tnot stripped\n#>32\t\tbelong\t>0\t\twith debug information\n#0\t\tbeshort\t0x601a\t\tHuman68k Z executable\n#0\t\tbeshort\t0x6000\t\tHuman68k object file\n#0\t\tbelong\t0xd1000000\tHuman68k ar binary archive\n#0\t\tbelong\t0xd1010000\tHuman68k ar ascii archive\n#0\t\tbeshort\t0x0068\t\tHuman68k lib archive\n#4\t\tstring\tLZX\t\tHuman68k LZX compressed\n#>8\t\tstring\t>\\0\t\t(version %s)\n#>4\t\tstring\tLZX\t\tR executable\n#2\t\tstring\t#HUPAIR\t\tHuman68k hupair R executable\n\n#------------------------------------------------------------------------------\n# ibm370:  file(1) magic for IBM 370 and compatibles.\n#\n# \"ibm370\" said that 0x15d == 0535 was \"ibm 370 pure executable\".\n# What the heck *is* \"USS/370\"?\n# AIX 4.1's \"/etc/magic\" has\n#\n#\t0\tshort\t\t0535\t\t370 sysV executable \n#\t>12\tlong\t\t>0\t\tnot stripped\n#\t>22\tshort\t\t>0\t\t- version %d\n#\t>30\tlong\t\t>0\t\t- 5.2 format\n#\t0\tshort\t\t0530\t\t370 sysV pure executable \n#\t>12\tlong\t\t>0\t\tnot stripped\n#\t>22\tshort\t\t>0\t\t- version %d\n#\t>30\tlong\t\t>0\t\t- 5.2 format\n#\n# instead of the \"USS/370\" versions of the same magic numbers.\n#\n0\tbeshort\t\t0537\t\t370 XA sysV executable \n>12\tbelong\t\t>0\t\tnot stripped\n>22\tbeshort\t\t>0\t\t- version %d\n>30\tbelong\t\t>0\t\t- 5.2 format\n0\tbeshort\t\t0532\t\t370 XA sysV pure executable \n>12\tbelong\t\t>0\t\tnot stripped\n>22\tbeshort\t\t>0\t\t- version %d\n>30\tbelong\t\t>0\t\t- 5.2 format\n0\tbeshort\t\t054001\t\t370 sysV pure executable\n>12\tbelong\t\t>0\t\tnot stripped\n0\tbeshort\t\t055001\t\t370 XA sysV pure executable\n>12\tbelong\t\t>0\t\tnot stripped\n0\tbeshort\t\t056401\t\t370 sysV executable\n>12\tbelong\t\t>0\t\tnot stripped\n0\tbeshort\t\t057401\t\t370 XA sysV executable\n>12\tbelong\t\t>0\t\tnot stripped\n0       beshort\t\t0531\t\tSVR2 executable (Amdahl-UTS)\n>12\tbelong\t\t>0\t\tnot stripped\n>24     belong\t\t>0\t\t- version %ld\n0\tbeshort\t\t0534\t\tSVR2 pure executable (Amdahl-UTS)\n>12\tbelong\t\t>0\t\tnot stripped\n>24\tbelong\t\t>0\t\t- version %ld\n0\tbeshort\t\t0530\t\tSVR2 pure executable (USS/370)\n>12\tbelong\t\t>0\t\tnot stripped\n>24\tbelong\t\t>0\t\t- version %ld\n0\tbeshort\t\t0535\t\tSVR2 executable (USS/370)\n>12\tbelong\t\t>0\t\tnot stripped\n>24\tbelong\t\t>0\t\t- version %ld\n\n#------------------------------------------------------------------------------\n# ibm6000:  file(1) magic for RS/6000 and the RT PC.\n#\n0\tbeshort\t\t0x01df\t\texecutable (RISC System/6000 V3.1) or obj module\n>12\tbelong\t\t>0\t\tnot stripped\n# Breaks sun4 statically linked execs.\n#0      beshort\t\t0x0103\t\texecutable (RT Version 2) or obj module\n#>2\tbyte\t\t0x50\t\tpure\n#>28\tbelong\t\t>0\t\tnot stripped\n#>6\tbeshort\t\t>0\t\t- version %ld\n0\tbeshort\t\t0x0104\t\tshared library\n0\tbeshort\t\t0x0105\t\tctab data\n0\tbeshort\t\t0xfe04\t\tstructured file\n0\tstring\t\t0xabcdef\tAIX message catalog\n0\tbelong\t\t0x000001f9\tAIX compiled message catalog\n0\tstring\t\t\\<aiaff>\tarchive\n0\tstring\t\t\\<bigaf>\tarchive (big format)\n\n\n#------------------------------------------------------------------------------\n# iff:\tfile(1) magic for Interchange File Format (see also \"audio\" & \"images\")\n#\n# Daniel Quinlan (quinlan@yggdrasil.com) -- IFF was designed by Electronic\n# Arts for file interchange.  It has also been used by Apple, SGI, and\n# especially Commodore-Amiga.\n#\n# IFF files begin with an 8 byte FORM header, followed by a 4 character\n# FORM type, which is followed by the first chunk in the FORM.\n\n0\tstring\t\tFORM\t\tIFF data\n#>4\tbelong\t\tx\t\t\\b, FORM is %d bytes long\n# audio formats\n>8\tstring\t\tAIFF\t\t\\b, AIFF audio\n!:mime\taudio/x-aiff\n>8\tstring\t\tAIFC\t\t\\b, AIFF-C compressed audio\n!:mime\taudio/x-aiff\n>8\tstring\t\t8SVX\t\t\\b, 8SVX 8-bit sampled sound voice\n!:mime\taudio/x-aiff\n>8\tstring\t\t16SV\t\t\\b, 16SV 16-bit sampled sound voice\n>8\tstring\t\tSAMP\t\t\\b, SAMP sampled audio\n>8\tstring\t\tMAUD\t\t\\b, MAUD MacroSystem audio\n>8\tstring\t\tSMUS\t\t\\b, SMUS simple music\n>8\tstring\t\tCMUS\t\t\\b, CMUS complex music\n# image formats\n>8\tstring\t\tILBMBMHD\t\\b, ILBM interleaved image\n>>20\tbeshort\t\tx\t\t\\b, %d x\n>>22\tbeshort\t\tx\t\t%d\n>8\tstring\t\tRGBN\t\t\\b, RGBN 12-bit RGB image\n>8\tstring\t\tRGB8\t\t\\b, RGB8 24-bit RGB image\n>8\tstring\t\tDEEP\t\t\\b, DEEP TVPaint/XiPaint image\n>8\tstring\t\tDR2D\t\t\\b, DR2D 2-D object\n>8\tstring\t\tTDDD\t\t\\b, TDDD 3-D rendering\n>8\tstring\t\tLWOB\t\t\\b, LWOB 3-D object\n>8\tstring\t\tLWO2\t\t\\b, LWO2 3-D object, v2\n>8\tstring\t\tLWLO\t\t\\b, LWLO 3-D layered object\n>8\tstring\t\tREAL\t\t\\b, REAL Real3D rendering\n>8\tstring\t\tMC4D\t\t\\b, MC4D MaxonCinema4D rendering\n>8\tstring\t\tANIM\t\t\\b, ANIM animation\n>8\tstring\t\tYAFA\t\t\\b, YAFA animation\n>8\tstring\t\tSSA\\ \t\t\\b, SSA super smooth animation\n>8\tstring\t\tACBM\t\t\\b, ACBM continuous image\n>8\tstring\t\tFAXX\t\t\\b, FAXX fax image\n# other formats\n>8\tstring\t\tFTXT\t\t\\b, FTXT formatted text\n>8\tstring\t\tCTLG\t\t\\b, CTLG message catalog\n>8\tstring\t\tPREF\t\t\\b, PREF preferences\n>8\tstring\t\tDTYP\t\t\\b, DTYP datatype description\n>8\tstring\t\tPTCH\t\t\\b, PTCH binary patch\n>8\tstring\t\tAMFF\t\t\\b, AMFF AmigaMetaFile format\n>8\tstring\t\tWZRD\t\t\\b, WZRD StormWIZARD resource\n>8\tstring\t\tDOC\\ \t\t\\b, DOC desktop publishing document\n\n# These go at the end of the iff rules\n#\n# I don't see why these might collide with anything else.\n#\n# Interactive Fiction related formats\n#\n>8\tstring\t\tIFRS\t\t\\b, Blorb Interactive Fiction\n>>24\tstring\t\tExec\t\twith executable chunk\n>8\tstring          IFZS\t\t\\b, Z-machine or Glulx saved game file (Quetzal)\n#------------------------------------------------------------------------------\n# images:  file(1) magic for image formats (see also \"iff\", and \"c-lang\" for\n# XPM bitmaps)\n#\n# originally from jef@helios.ee.lbl.gov (Jef Poskanzer),\n# additions by janl@ifi.uio.no as well as others. Jan also suggested\n# merging several one- and two-line files into here.\n#\n# little magic: PCX (first byte is 0x0a)\n\n# Targa - matches `povray', `ppmtotga' and `xv' outputs\n# by Philippe De Muyter <phdm@macqel.be>\n# at 2, byte ImgType must be 1, 2, 3, 9, 10 or 11\n# at 1, byte CoMapType must be 1 if ImgType is 1 or 9, 0 otherwise\n# at 3, leshort Index is 0 for povray, ppmtotga and xv outputs\n# `xv' recognizes only a subset of the following (RGB with pixelsize = 24)\n# `tgatoppm' recognizes a superset (Index may be anything)\n1\tbelong&0xfff7ffff\t0x01010000\tTarga image data - Map\n>2\tbyte&8\t\t\t8\t\t- RLE\n>12\tleshort\t\t\t>0\t\t%hd x\n>14\tleshort\t\t\t>0\t\t%hd\n1\tbelong&0xfff7ffff\t0x00020000\tTarga image data - RGB\n>2\tbyte&8\t\t\t8\t\t- RLE\n>12\tleshort\t\t\t>0\t\t%hd x\n>14\tleshort\t\t\t>0\t\t%hd\n1\tbelong&0xfff7ffff\t0x00030000\tTarga image data - Mono\n>2\tbyte&8\t\t\t8\t\t- RLE\n>12\tleshort\t\t\t>0\t\t%hd x\n>14\tleshort\t\t\t>0\t\t%hd\n\n# PBMPLUS images\n# The next byte following the magic is always whitespace.\n0\tsearch/1\tP1\t\tNetpbm PBM image text\n!:mime\timage/x-portable-bitmap\n0\tsearch/1\tP2\t\tNetpbm PGM image text\n!:mime\timage/x-portable-greymap\n0\tsearch/1\tP3\t\tNetpbm PPM image text\n!:mime\timage/x-portable-pixmap\n0\tstring\t\tP4\t\tNetpbm PBM \"rawbits\" image data\n!:mime\timage/x-portable-bitmap\n0\tstring\t\tP5\t\tNetpbm PGM \"rawbits\" image data\n!:mime\timage/x-portable-greymap\n0\tstring\t\tP6\t\tNetpbm PPM \"rawbits\" image data\n!:mime\timage/x-portable-pixmap\n0\tstring\t\tP7\t\tNetpbm PAM image file\n!:mime\timage/x-portable-pixmap\n\n# From: bryanh@giraffe-data.com (Bryan Henderson)\n0\tstring\t\t\\117\\072\tSolitaire Image Recorder format\n>4\tstring\t\t\\013\t\tMGI Type 11\n>4\tstring\t\t\\021\t\tMGI Type 17\n0\tstring\t\t.MDA\t\tMicroDesign data\n>21\tbyte\t\t48\t\tversion 2\n>21\tbyte\t\t51\t\tversion 3\n0\tstring\t\t.MDP\t\tMicroDesign page data\n>21\tbyte\t\t48\t\tversion 2\n>21\tbyte\t\t51\t\tversion 3\n\n# NIFF (Navy Interchange File Format, a modification of TIFF) images\n# [GRR:  this *must* go before TIFF]\n0\tstring\t\tIIN1\t\tNIFF image data\n!:mime\timage/x-niff\n\n# Tag Image File Format, from Daniel Quinlan (quinlan@yggdrasil.com)\n# The second word of TIFF files is the TIFF version number, 42, which has\n# never changed.  The TIFF specification recommends testing for it.\n0\tstring\t\tMM\\x00\\x2a\tTIFF image data, big-endian\n!:mime\timage/tiff\n0\tstring\t\tII\\x2a\\x00\tTIFF image data, little-endian\n!:mime\timage/tiff\n\n# PNG [Portable Network Graphics, or \"PNG's Not GIF\"] images\n# (Greg Roelofs, newt@uchicago.edu)\n# (Albert Cahalan, acahalan@cs.uml.edu)\n#\n# 137 P N G \\r \\n ^Z \\n [4-byte length] H E A D [HEAD data] [HEAD crc] ...\n#\n0\tstring\t\t\\x89PNG\\x0d\\x0a\\x1a\\x0a\t\tPNG image\n!:mime\timage/png\n>16\tbelong\t\tx\t\t\\b, %ld x\n>20\tbelong\t\tx\t\t%ld,\n>24\tbyte\t\tx\t\t%d-bit\n>25\tbyte\t\t0\t\tgrayscale,\n>25\tbyte\t\t2\t\t\\b/color RGB,\n>25\tbyte\t\t3\t\tcolormap,\n>25\tbyte\t\t4\t\tgray+alpha,\n>25\tbyte\t\t6\t\t\\b/color RGBA,\n#>26\tbyte\t\t0\t\tdeflate/32K,\n>28\tbyte\t\t0\t\tnon-interlaced\n>28\tbyte\t\t1\t\tinterlaced\n\n# possible GIF replacements; none yet released!\n# (Greg Roelofs, newt@uchicago.edu)\n#\n# GRR 950115:  this was mine (\"Zip GIF\"):\n0\tstring\t\tGIF94z\t\tZIF image (GIF+deflate alpha)\n!:mime\timage/x-unknown\n#\n# GRR 950115:  this is Jeremy Wohl's Free Graphics Format (better):\n#\t\t\t\t\t\n0\tstring\t\tFGF95a\t\tFGF image (GIF+deflate beta)\n!:mime\timage/x-unknown\n#\n# GRR 950115:  this is Thomas Boutell's Portable Bitmap Format proposal\n# (best; not yet implemented):\n#\t\t\t\t\t\n0\tstring\t\tPBF\t\tPBF image (deflate compression)\n!:mime\timage/x-unknown\n\n# GIF\n0\tstring\t\tGIF8\t\tGIF image data\n!:mime\timage/gif\n!:apple\t8BIMGIFf\n>4\tstring\t\t7a\t\t\\b, version 8%s,\n>4\tstring\t\t9a\t\t\\b, version 8%s,\n>6\tleshort\t\t>0\t\t%hd x\n>8\tleshort\t\t>0\t\t%hd\n#>10\tbyte\t\t&0x80\t\tcolor mapped,\n#>10\tbyte&0x07\t=0x00\t\t2 colors\n#>10\tbyte&0x07\t=0x01\t\t4 colors\n#>10\tbyte&0x07\t=0x02\t\t8 colors\n#>10\tbyte&0x07\t=0x03\t\t16 colors\n#>10\tbyte&0x07\t=0x04\t\t32 colors\n#>10\tbyte&0x07\t=0x05\t\t64 colors\n#>10\tbyte&0x07\t=0x06\t\t128 colors\n#>10\tbyte&0x07\t=0x07\t\t256 colors\n\n# ITC (CMU WM) raster files.  It is essentially a byte-reversed Sun raster,\n# 1 plane, no encoding.\n0\tstring\t\t\\361\\0\\100\\273\tCMU window manager raster image data\n>4\tlelong\t\t>0\t\t%d x\n>8\tlelong\t\t>0\t\t%d,\n>12\tlelong\t\t>0\t\t%d-bit\n\n# Magick Image File Format\n0\tstring\t\tid=ImageMagick\tMIFF image data\n\n# Artisan\n0\tlong\t\t1123028772\tArtisan image data\n>4\tlong\t\t1\t\t\\b, rectangular 24-bit\n>4\tlong\t\t2\t\t\\b, rectangular 8-bit with colormap\n>4\tlong\t\t3\t\t\\b, rectangular 32-bit (24-bit with matte)\n\n# FIG (Facility for Interactive Generation of figures), an object-based format\n0\tsearch/1\t#FIG\t\tFIG image text\n>5\tstring\t\tx\t\t\\b, version %.3s\n\n# PHIGS\n0\tstring\t\tARF_BEGARF\t\tPHIGS clear text archive\n0\tstring\t\t@(#)SunPHIGS\t\tSunPHIGS\n# version number follows, in the form m.n\n>40\tstring\t\tSunBin\t\t\tbinary\n>32\tstring\t\tarchive\t\t\tarchive\n\n# GKS (Graphics Kernel System)\n0\tstring\t\tGKSM\t\tGKS Metafile\n>24\tstring\t\tSunGKS\t\t\\b, SunGKS\n\n# CGM image files\n0\tstring\t\tBEGMF\t\tclear text Computer Graphics Metafile\n\n# MGR bitmaps  (Michael Haardt, u31b3hs@pool.informatik.rwth-aachen.de)\n0\tstring\tyz\tMGR bitmap, modern format, 8-bit aligned\n0\tstring\tzz\tMGR bitmap, old format, 1-bit deep, 16-bit aligned\n0\tstring\txz\tMGR bitmap, old format, 1-bit deep, 32-bit aligned\n0\tstring\tyx\tMGR bitmap, modern format, squeezed\n\n# Fuzzy Bitmap (FBM) images\n0\tstring\t\t%bitmap\\0\tFBM image data\n>30\tlong\t\t0x31\t\t\\b, mono\n>30\tlong\t\t0x33\t\t\\b, color\n\n# facsimile data\n1\tstring\t\tPC\\ Research,\\ Inc\tgroup 3 fax data\n>29\tbyte\t\t0\t\t\\b, normal resolution (204x98 DPI)\n>29\tbyte\t\t1\t\t\\b, fine resolution (204x196 DPI)\n# From: Herbert Rosmanith <herp@wildsau.idv.uni.linz.at>\n0\tstring\t\tSfff\t\tstructured fax file\n\n\n# PC bitmaps (OS/2, Windows BMP files)  (Greg Roelofs, newt@uchicago.edu)\n0\tstring\t\tBM\n>14\tleshort\t\t12\t\tPC bitmap, OS/2 1.x format\n!:mime\timage/x-ms-bmp\n>>18\tleshort\t\tx\t\t\\b, %d x\n>>20\tleshort\t\tx\t\t%d\n>14\tleshort\t\t64\t\tPC bitmap, OS/2 2.x format\n!:mime\timage/x-ms-bmp\n>>18\tleshort\t\tx\t\t\\b, %d x\n>>20\tleshort\t\tx\t\t%d\n>14\tleshort\t\t40\t\tPC bitmap, Windows 3.x format\n!:mime\timage/x-ms-bmp\n>>18\tlelong\t\tx\t\t\\b, %d x\n>>22\tlelong\t\tx\t\t%d x\n>>28\tleshort\t\tx\t\t%d\n>14\tleshort\t\t128\t\tPC bitmap, Windows NT/2000 format\n!:mime\timage/x-ms-bmp\n>>18\tlelong\t\tx\t\t\\b, %d x\n>>22\tlelong\t\tx\t\t%d x\n>>28\tleshort\t\tx\t\t%d\n# Too simple - MPi\n#0\tstring\t\tIC\t\tPC icon data\n#0\tstring\t\tPI\t\tPC pointer image data\n#0\tstring\t\tCI\t\tPC color icon data\n#0\tstring\t\tCP\t\tPC color pointer image data\n# Conflicts with other entries [BABYL]\n#0\tstring\t\tBA\t\tPC bitmap array data\n\n# XPM icons (Greg Roelofs, newt@uchicago.edu)\n# note possible collision with C/REXX entry in c-lang; currently commented out\n0\tsearch/1\t/*\\ XPM\\ */\tX pixmap image text\n\n# Utah Raster Toolkit RLE images (janl@ifi.uio.no)\n0\tleshort\t\t0xcc52\t\tRLE image data,\n>6\tleshort\t\tx\t\t%d x\n>8\tleshort\t\tx\t\t%d\n>2\tleshort\t\t>0\t\t\\b, lower left corner: %d\n>4\tleshort\t\t>0\t\t\\b, lower right corner: %d\n>10\tbyte&0x1\t=0x1\t\t\\b, clear first\n>10\tbyte&0x2\t=0x2\t\t\\b, no background\n>10\tbyte&0x4\t=0x4\t\t\\b, alpha channel\n>10\tbyte&0x8\t=0x8\t\t\\b, comment\n>11\tbyte\t\t>0\t\t\\b, %d color channels\n>12\tbyte\t\t>0\t\t\\b, %d bits per pixel\n>13\tbyte\t\t>0\t\t\\b, %d color map channels\n\n# image file format (Robert Potter, potter@cs.rochester.edu)\n0\tstring\t\tImagefile\\ version-\tiff image data\n# this adds the whole header (inc. version number), informative but longish\n>10\tstring\t\t>\\0\t\t%s\n\n# Sun raster images, from Daniel Quinlan (quinlan@yggdrasil.com)\n0\tbelong\t\t0x59a66a95\tSun raster image data\n>4\tbelong\t\t>0\t\t\\b, %d x\n>8\tbelong\t\t>0\t\t%d,\n>12\tbelong\t\t>0\t\t%d-bit,\n#>16\tbelong\t\t>0\t\t%d bytes long,\n>20\tbelong\t\t0\t\told format,\n#>20\tbelong\t\t1\t\tstandard,\n>20\tbelong\t\t2\t\tcompressed,\n>20\tbelong\t\t3\t\tRGB,\n>20\tbelong\t\t4\t\tTIFF,\n>20\tbelong\t\t5\t\tIFF,\n>20\tbelong\t\t0xffff\t\treserved for testing,\n>24\tbelong\t\t0\t\tno colormap\n>24\tbelong\t\t1\t\tRGB colormap\n>24\tbelong\t\t2\t\traw colormap\n#>28\tbelong\t\t>0\t\tcolormap is %d bytes long\n\n# SGI image file format, from Daniel Quinlan (quinlan@yggdrasil.com)\n#\n# See\n#\thttp://reality.sgi.com/grafica/sgiimage.html\n#\n0\tbeshort\t\t474\t\tSGI image data\n#>2\tbyte\t\t0\t\t\\b, verbatim\n>2\tbyte\t\t1\t\t\\b, RLE\n#>3\tbyte\t\t1\t\t\\b, normal precision\n>3\tbyte\t\t2\t\t\\b, high precision\n>4\tbeshort\t\tx\t\t\\b, %d-D\n>6\tbeshort\t\tx\t\t\\b, %d x\n>8\tbeshort\t\tx\t\t%d\n>10\tbeshort\t\tx\t\t\\b, %d channel\n>10\tbeshort\t\t!1\t\t\\bs\n>80\tstring\t\t>0\t\t\\b, \"%s\"\n\n0\tstring\t\tIT01\t\tFIT image data\n>4\tbelong\t\tx\t\t\\b, %d x\n>8\tbelong\t\tx\t\t%d x\n>12\tbelong\t\tx\t\t%d\n#\n0\tstring\t\tIT02\t\tFIT image data\n>4\tbelong\t\tx\t\t\\b, %d x\n>8\tbelong\t\tx\t\t%d x\n>12\tbelong\t\tx\t\t%d\n#\n2048\tstring\t\tPCD_IPI\t\tKodak Photo CD image pack file\n>0xe02\tbyte&0x03\t0x00\t\t, landscape mode\n>0xe02\tbyte&0x03\t0x01\t\t, portrait mode\n>0xe02\tbyte&0x03\t0x02\t\t, landscape mode\n>0xe02\tbyte&0x03\t0x03\t\t, portrait mode\n0\tstring\t\tPCD_OPA\t\tKodak Photo CD overview pack file\n\n# FITS format.  Jeff Uphoff <juphoff@tarsier.cv.nrao.edu>\n# FITS is the Flexible Image Transport System, the de facto standard for\n# data and image transfer, storage, etc., for the astronomical community.\n# (FITS floating point formats are big-endian.)\n0\tstring\tSIMPLE\\ \\ =\tFITS image data\n>109\tstring\t8\t\t\\b, 8-bit, character or unsigned binary integer\n>108\tstring\t16\t\t\\b, 16-bit, two's complement binary integer\n>107\tstring\t\\ 32\t\t\\b, 32-bit, two's complement binary integer\n>107\tstring\t-32\t\t\\b, 32-bit, floating point, single precision\n>107\tstring\t-64\t\t\\b, 64-bit, floating point, double precision\n\n# other images\n0\tstring\tThis\\ is\\ a\\ BitMap\\ file\tLisp Machine bit-array-file\n\n# From SunOS 5.5.1 \"/etc/magic\" - appeared right before Sun raster image\n# stuff.\n#\n0\tbeshort\t\t0x1010\t\tPEX Binary Archive\n\n# DICOM medical imaging data\n128\tstring\tDICM\t\t\tDICOM medical imaging data\n!:mime\tapplication/dicom\n\n# XWD - X Window Dump file.\n#   As described in /usr/X11R6/include/X11/XWDFile.h\n#   used by the xwd program.\n#   Bradford Castalia, idaeim, 1/01\n4\tbelong\t7\t\t\tXWD X Window Dump image data\n>100\tstring\t>\\0\t\t\t\\b, \"%s\"\n>16\tbelong\tx\t\t\t\\b, %dx\n>20\tbelong\tx\t\t\t\\b%dx\n>12\tbelong\tx\t\t\t\\b%d\n\n# PDS - Planetary Data System\n#   These files use Parameter Value Language in the header section.\n#   Unfortunately, there is no certain magic, but the following\n#   strings have been found to be most likely.\n0\tstring\tNJPL1I00\t\tPDS (JPL) image data\n2\tstring\tNJPL1I\t\t\tPDS (JPL) image data\n0\tstring\tCCSD3ZF\t\t\tPDS (CCSD) image data\n2\tstring\tCCSD3Z\t\t\tPDS (CCSD) image data\n0\tstring\tPDS_\t\t\tPDS image data\n0\tstring\tLBLSIZE=\t\tPDS (VICAR) image data\n\n# pM8x: ATARI STAD compressed bitmap format\n#\n# from Oskar Schirmer <schirmer@scara.com> Feb 2, 2001\n# p M 8 5/6 xx yy zz data...\n# Atari ST STAD bitmap is always 640x400, bytewise runlength compressed.\n# bytes either run horizontally (pM85) or vertically (pM86). yy is the\n# most frequent byte, xx and zz are runlength escape codes, where xx is\n# used for runs of yy.\n#\n0\tstring\tpM85\t\tAtari ST STAD bitmap image data (hor)\n>5\tbyte\t0x00\t\t(white background)\n>5\tbyte\t0xFF\t\t(black background)\n0\tstring\tpM86\t\tAtari ST STAD bitmap image data (vert)\n>5\tbyte\t0x00\t\t(white background)\n>5\tbyte\t0xFF\t\t(black background)\n\n# Gürkan Sengün <gurkan@linuks.mine.nu>, www.linuks.mine.nu\n# http://www.atarimax.com/jindroush.atari.org/afmtatr.html\n0\tleshort\t0x0296\t\tAtari ATR image\n\n# XXX:\n# This is bad magic 0x5249 == 'RI' conflicts with RIFF and other\n# magic.\n# SGI RICE image file <mpruett@sgi.com>\n#0\tbeshort\t0x5249\t\tRICE image\n#>2\tbeshort\tx\t\tv%d\n#>4\tbeshort\tx\t\t(%d x\n#>6\tbeshort\tx\t\t%d)\n#>8\tbeshort\t0\t\t8 bit\n#>8\tbeshort\t1\t\t10 bit\n#>8\tbeshort\t2\t\t12 bit\n#>8\tbeshort\t3\t\t13 bit\n#>10\tbeshort\t0\t\t4:2:2\n#>10\tbeshort\t1\t\t4:2:2:4\n#>10\tbeshort\t2\t\t4:4:4\n#>10\tbeshort\t3\t\t4:4:4:4\n#>12\tbeshort\t1\t\tRGB\n#>12\tbeshort\t2\t\tCCIR601\n#>12\tbeshort\t3\t\tRP175\n#>12\tbeshort\t4\t\tYUV\n\n#------------------------------------------------------------------------------\n#\n# Marco Schmidt (marcoschmidt@users.sourceforge.net) -- an image  file format\n# for the EPOC operating system, which is used with PDAs like those from Psion\n#\n# see http://huizen.dds.nl/~frodol/psiconv/html/Index.html for a description\n# of various EPOC file formats\n\n0\tstring \\x37\\x00\\x00\\x10\\x42\\x00\\x00\\x10\\x00\\x00\\x00\\x00\\x39\\x64\\x39\\x47 EPOC MBM image file\n\n# PCX image files\n# From: Dan Fandrich <dan@coneharvesters.com>\n0\tbeshort\t\t0x0a00\tPCX ver. 2.5 image data\n0\tbeshort\t\t0x0a02\tPCX ver. 2.8 image data, with palette\n0\tbeshort\t\t0x0a03\tPCX ver. 2.8 image data, without palette\n0\tbeshort\t\t0x0a04\tPCX for Windows image data\n0\tbeshort\t\t0x0a05\tPCX ver. 3.0 image data\n>4\tleshort\t\tx      bounding box [%hd,\n>6\tleshort\t\tx      %hd] -\n>8\tleshort\t\tx      [%hd,\n>10\tleshort\t\tx      %hd],\n>65\tbyte\t\t>1\t%d planes each of\n>3\tbyte\t\tx\t%hhd-bit\n>68\tbyte\t\t0\timage,\n>68\tbyte\t\t1\tcolour,\n>68\tbyte\t\t2\tgrayscale,\n>68\tbyte\t\t>2\timage,\n>68\tbyte\t\t<0\timage,\n>12\tleshort\t\t>0\t%hd x\n>>14\tleshort\t\tx      %hd dpi,\n>2\tbyte\t\t0\tuncompressed\n>2\tbyte\t\t1\tRLE compressed\n\n# Adobe Photoshop\n0\tstring\t\t8BPS Adobe Photoshop Image\n!:mime\timage/vnd.adobe.photoshop\n\n# XV thumbnail indicator (ThMO)\n0\tstring\t\tP7\\ 332\t\tXV thumbnail image data\n\n# NITF is defined by United States MIL-STD-2500A\n0\tstring\tNITF\tNational Imagery Transmission Format\n>25\tstring\t>\\0\tdated %.14s\n\n# GEM Image: Version 1, Headerlen 8 (Wolfram Kleff)\n0\tbelong\t\t0x00010008\tGEM Image data\n>12\tbeshort\t\tx\t\t%d x\n>14\tbeshort\t\tx\t\t%d,\n>4\tbeshort\t\tx\t\t%d planes,\n>8\tbeshort\t\tx\t\t%d x\n>10\tbeshort\t\tx\t\t%d pixelsize\n\n# GEM Metafile (Wolfram Kleff)\n0\tlelong\t\t0x0018FFFF\tGEM Metafile data\n>4\tleshort\t\tx\t\tversion %d\n\n#\n# SMJPEG. A custom Motion JPEG format used by Loki Entertainment\n# Software Torbjorn Andersson <d91tan@Update.UU.SE>.\n#\n0\tstring\t\\0\\nSMJPEG\tSMJPEG\n>8\tbelong\tx\t\t%d.x data\n# According to the specification you could find any number of _TXT\n# headers here, but I can't think of any way of handling that. None of\n# the SMJPEG files I tried it on used this feature. Even if such a\n# file is encountered the output should still be reasonable.\n>16\tstring\t_SND\t\t\\b,\n>>24\tbeshort\t>0\t\t%d Hz\n>>26\tbyte\t8\t\t8-bit\n>>26\tbyte\t16\t\t16-bit\n>>28\tstring\tNONE\t\tuncompressed\n# >>28\tstring\tAPCM\t\tADPCM compressed\n>>27\tbyte\t1\t\tmono\n>>28\tbyte\t2\t\tstereo\n# Help! Isn't there any way to avoid writing this part twice?\n>>32\tstring\t_VID\t\t\\b,\n# >>>48\tstring\tJFIF\t\tJPEG\n>>>40\tbelong\t>0\t\t%d frames\n>>>44\tbeshort\t>0\t\t(%d x\n>>>46\tbeshort\t>0\t\t%d)\n>16\tstring\t_VID\t\t\\b,\n# >>32\tstring\tJFIF\t\tJPEG\n>>24\tbelong\t>0\t\t%d frames\n>>28\tbeshort\t>0\t\t(%d x\n>>30\tbeshort\t>0\t\t%d)\n\n0\tstring\tPaint\\ Shop\\ Pro\\ Image\\ File\tPaint Shop Pro Image File\n\n# \"thumbnail file\" (icon)\n# descended from \"xv\", but in use by other applications as well (Wolfram Kleff)\n0       string          P7\\ 332         XV \"thumbnail file\" (icon) data\n\n# taken from fkiss: (<yav@mte.biglobe.ne.jp> ?)\n0       string          KiSS            KISS/GS\n>4      byte            16              color\n>>5     byte            x               %d bit\n>>8     leshort         x               %d colors\n>>10    leshort         x               %d groups\n>4      byte            32              cell\n>>5     byte            x               %d bit\n>>8     leshort         x               %d x\n>>10    leshort         x               %d\n>>12    leshort         x               +%d\n>>14    leshort         x               +%d\n\n# Webshots (www.webshots.com), by John Harrison\n0       string          C\\253\\221g\\230\\0\\0\\0 Webshots Desktop .wbz file\n\n# Hercules DASD image files\n# From Jan Jaeger <jj@septa.nl>\n0       string  CKD_P370        Hercules CKD DASD image file\n>8      long    x               \\b, %d heads per cylinder\n>12     long    x               \\b, track size %d bytes\n>16     byte    x               \\b, device type 33%2.2X\n\n0       string  CKD_C370        Hercules compressed CKD DASD image file\n>8      long    x               \\b, %d heads per cylinder\n>12     long    x               \\b, track size %d bytes\n>16     byte    x               \\b, device type 33%2.2X\n\n0       string  CKD_S370        Hercules CKD DASD shadow file\n>8      long    x               \\b, %d heads per cylinder\n>12     long    x               \\b, track size %d bytes\n>16     byte    x               \\b, device type 33%2.2X\n\n# Squeak images and programs - etoffi@softhome.net\n0\tstring\t\t\\146\\031\\0\\0\tSqueak image data\n0\tsearch/1\t'From\\040Squeak\tSqueak program text\n\n# partimage: file(1) magic for PartImage files (experimental, incomplete)\n# Author: Hans-Joachim Baader <hjb@pro-linux.de>\n0\t\tstring\tPaRtImAgE-VoLuMe\tPartImage\n>0x0020\t\tstring\t0.6.1\t\tfile version %s\n>>0x0060\tlelong\t>-1\t\tvolume %ld\n#>>0x0064 8 byte identifier\n#>>0x007c reserved\n>>0x0200\tstring\t>\\0\t\ttype %s\n>>0x1400\tstring\t>\\0\t\tdevice %s,\n>>0x1600\tstring\t>\\0\t\toriginal filename %s,\n# Some fields omitted\n>>0x2744\tlelong\t0\t\tnot compressed\n>>0x2744\tlelong\t1\t\tgzip compressed\n>>0x2744\tlelong\t2\t\tbzip2 compressed\n>>0x2744\tlelong\t>2\t\tcompressed with unknown algorithm\n>0x0020\t\tstring\t>0.6.1\t\tfile version %s\n>0x0020\t\tstring\t<0.6.1\t\tfile version %s\n\n# DCX is multi-page PCX, using a simple header of up to 1024\n# offsets for the respective PCX components.\n# From: Joerg Wunsch <joerg_wunsch@uriah.heep.sax.de>\n0\tlelong\t987654321\tDCX multi-page PCX image data\n\n# Simon Walton <simonw@matteworld.com>\n# Kodak Cineon format for scanned negatives\n# http://www.kodak.com/US/en/motion/support/dlad/\n0\tlelong  0xd75f2a80\tCineon image data\n>200\tbelong  >0\t\t\\b, %ld x\n>204\tbelong  >0\t\t%ld\n\n\n# Bio-Rad .PIC is an image format used by microscope control systems\n# and related image processing software used by biologists.\n# From: Vebjorn Ljosa <vebjorn@ljosa.com>\n54\tleshort 12345\t\tBio-Rad .PIC Image File\n>0\tleshort >0\t\t%hd x\n>2\tleshort >0\t\t%hd,\n>4\tleshort =1\t\t1 image in file\n>4\tleshort >1\t\t%hd images in file\n\n# From Jan \"Yenya\" Kasprzak <kas@fi.muni.cz>\n# The description of *.mrw format can be found at\n# http://www.dalibor.cz/minolta/raw_file_format.htm\n0\tstring\t\\000MRM\t\t\tMinolta Dimage camera raw image data\n\n# Summary: DjVu image / document\n# Extension: .djvu\n# Reference: http://djvu.org/docs/DjVu3Spec.djvu\n# Submitted by: Stephane Loeuillet <stephane.loeuillet@tiscali.fr>\n# Modified by (1): Abel Cheung <abelcheung@gmail.com>\n0\tstring\tAT&TFORM\n!:mime\timage/vnd.djvu\n>12\tstring\tDJVM\t\tDjVu multiple page document\n>12\tstring\tDJVU\t\tDjVu image or single page document\n>12\tstring\tDJVI\t\tDjVu shared document\n>12\tstring\tTHUM\t\tDjVu page thumbnails\n\n\n# From Marc Espie\n0\tlelong\t20000630\t\tOpenEXR image data\n\n# From: Tom Hilinski <tom.hilinski@comcast.net>\n# http://www.unidata.ucar.edu/packages/netcdf/\n0\tstring\tCDF\\001\t\t\tNetCDF Data Format data\n\n#-----------------------------------------------------------------------\n# Hierarchical Data Format, used to facilitate scientific data exchange\n# specifications at http://hdf.ncsa.uiuc.edu/\n0\tbelong\t0x0e031301\tHierarchical Data Format (version 4) data\n!:mime\tapplication/x-hdf\n0\tstring\t\\211HDF\\r\\n\\032\tHierarchical Data Format (version 5) data\n!:mime\tapplication/x-hdf\n\n# From: Tobias Burnus <burnus@net-b.de>\n# Xara (for a while: Corel Xara) is a graphic package, see\n# http://www.xara.com/ for Windows and as GPL application for Linux\n0\tstring\tXARA\\243\\243\tXara graphics file\n\n# http://www.cartesianinc.com/Tech/\n0\tstring\tCPC\\262\t\tCartesian Perceptual Compression image\n!:mime\timage/x-cpi\n\n# From Albert Cahalan <acahalan@gmail.com>\n# puredigital used it for the CVS disposable camcorder\n#8       lelong  4       ZBM bitmap image data\n#>4      leshort x       %u x\n#>6      leshort x       %u\n\n# From Albert Cahalan <acahalan@gmail.com>\n# uncompressed 5:6:5 HighColor image for OLPC XO firmware icons\n0       string C565     OLPC firmware icon image data\n>4      leshort x       %u x\n>6      leshort x       %u\n\n# Applied Images - Image files from Cytovision\n# Gustavo Junior Alves <gjalves@gjalves.com.br>\n0\tstring\t\\xce\\xda\\xde\\xfa\tCytovision Metaphases file\n0\tstring\t\\xed\\xad\\xef\\xac\tCytovision Karyotype file\n0\tstring\t\\x0b\\x00\\x03\\x00\tCytovision FISH Probe file\n0\tstring\t\\xed\\xfe\\xda\\xbe\tCytovision FLEX file\n0\tstring\t\\xed\\xab\\xed\\xfe\tCytovision FLEX file\n0\tstring\t\\xad\\xfd\\xea\\xad\tCytovision RATS file\n\n# Wavelet Scalar Quantization format used in gray-scale fingerprint images\n# From Tano M Fotang <mfotang@quanteq.com>\n0\tstring\t\\xff\\xa0\\xff\\xa8\\x00\tWavelet Scalar Quantization image data\n\n# JPEG 2000 Code Stream Bitmap\n# From Petr Splichal <psplicha@redhat.com>\n0\tstring\t\\xFF\\x4F\\xFF\\x51\\x00\tJPEG-2000 Code Stream Bitmap data\n\n#------------------------------------------------------------------------------\n# inform:  file(1) magic for Inform interactive fiction language\n\n# URL:  http://www.inform-fiction.org/\n# From: Reuben Thomas <rrt@sc3d.org>\n\n0\tsearch/cB/100\tconstant\\ story\t\tInform source text\n\n#------------------------------------------------------------------------------\n# intel:  file(1) magic for x86 Unix\n#\n# Various flavors of x86 UNIX executable/object (other than Xenix, which\n# is in \"microsoft\").  DOS is in \"msdos\"; the ambitious soul can do\n# Windows as well.\n#\n# Windows NT belongs elsewhere, as you need x86 and MIPS and Alpha and\n# whatever comes next (HP-PA Hummingbird?).  OS/2 may also go elsewhere\n# as well, if, as, and when IBM makes it portable.\n#\n# The `versions' should be un-commented if they work for you.\n# (Was the problem just one of endianness?)\n#\n0\tleshort\t\t0502\t\tbasic-16 executable\n>12\tlelong\t\t>0\t\tnot stripped\n#>22\tleshort\t\t>0\t\t- version %ld\n0\tleshort\t\t0503\t\tbasic-16 executable (TV)\n>12\tlelong\t\t>0\t\tnot stripped\n#>22\tleshort\t\t>0\t\t- version %ld\n0\tleshort\t\t0510\t\tx86 executable\n>12\tlelong\t\t>0\t\tnot stripped\n0\tleshort\t\t0511\t\tx86 executable (TV)\n>12\tlelong\t\t>0\t\tnot stripped\n0\tleshort\t\t=0512\t\tiAPX 286 executable small model (COFF)\n>12\tlelong\t\t>0\t\tnot stripped\n#>22\tleshort\t\t>0\t\t- version %ld\n0\tleshort\t\t=0522\t\tiAPX 286 executable large model (COFF)\n>12\tlelong\t\t>0\t\tnot stripped\n#>22\tleshort\t\t>0\t\t- version %ld\n# SGI labeled the next entry as \"iAPX 386 executable\" --Dan Quinlan\n0\tleshort\t\t=0514\t\t80386 COFF executable\n>12\tlelong\t\t>0\t\tnot stripped\n>22\tleshort\t\t>0\t\t- version %ld\n\n# rom: file(1) magic for BIOS ROM Extensions found in intel machines\n#      mapped into memory between 0xC0000 and 0xFFFFF\n# From Gürkan Sengün <gurkan@linuks.mine.nu>, www.linuks.mine.nu\n0        beshort         0x55AA       BIOS (ia32) ROM Ext.\n>5       string          USB          USB\n>7       string          LDR          UNDI image\n>30      string          IBM          IBM comp. Video\n>26      string          Adaptec      Adaptec\n>28      string          Adaptec      Adaptec\n>42      string          PROMISE      Promise\n>2       byte            x            (%d*512)\n\n#------------------------------------------------------------------------------\n# interleaf:  file(1) magic for InterLeaf TPS:\n#\n0\tstring\t\t=\\210OPS\tInterleaf saved data\n0\tstring\t\t=<!OPS\t\tInterleaf document text\n>5\tstring\t\t,\\ Version\\ =\t\\b, version\n>>17\tstring\t\t>\\0\t\t%.3s\n\n#------------------------------------------------------------------------------\n# island:  file(1) magic for IslandWite/IslandDraw, from SunOS 5.5.1\n# \"/etc/magic\":\n# From: guy@netapp.com (Guy Harris)\n#\n4\tstring\t\tpgscriptver\tIslandWrite document\n13\tstring\t\tDrawFile\tIslandDraw document\n\n\n#------------------------------------------------------------------------------\n# ispell:  file(1) magic for ispell\n#\n# Ispell 3.0 has a magic of 0x9601 and ispell 3.1 has 0x9602.  This magic\n# will match 0x9600 through 0x9603 in *both* little endian and big endian.\n# (No other current magic entries collide.)\n#\n# Updated by Daniel Quinlan (quinlan@yggdrasil.com)\n#\n0\tleshort&0xFFFC\t0x9600\t\tlittle endian ispell\n>0\tbyte\t\t0\t\thash file (?),\n>0\tbyte\t\t1\t\t3.0 hash file,\n>0\tbyte\t\t2\t\t3.1 hash file,\n>0\tbyte\t\t3\t\thash file (?),\n>2\tleshort\t\t0x00\t\t8-bit, no capitalization, 26 flags\n>2\tleshort\t\t0x01\t\t7-bit, no capitalization, 26 flags\n>2\tleshort\t\t0x02\t\t8-bit, capitalization, 26 flags\n>2\tleshort\t\t0x03\t\t7-bit, capitalization, 26 flags\n>2\tleshort\t\t0x04\t\t8-bit, no capitalization, 52 flags\n>2\tleshort\t\t0x05\t\t7-bit, no capitalization, 52 flags\n>2\tleshort\t\t0x06\t\t8-bit, capitalization, 52 flags\n>2\tleshort\t\t0x07\t\t7-bit, capitalization, 52 flags\n>2\tleshort\t\t0x08\t\t8-bit, no capitalization, 128 flags\n>2\tleshort\t\t0x09\t\t7-bit, no capitalization, 128 flags\n>2\tleshort\t\t0x0A\t\t8-bit, capitalization, 128 flags\n>2\tleshort\t\t0x0B\t\t7-bit, capitalization, 128 flags\n>2\tleshort\t\t0x0C\t\t8-bit, no capitalization, 256 flags\n>2\tleshort\t\t0x0D\t\t7-bit, no capitalization, 256 flags\n>2\tleshort\t\t0x0E\t\t8-bit, capitalization, 256 flags\n>2\tleshort\t\t0x0F\t\t7-bit, capitalization, 256 flags\n>4\tleshort\t\t>0\t\tand %d string characters\n0\tbeshort&0xFFFC\t0x9600\t\tbig endian ispell\n>1\tbyte\t\t0\t\thash file (?),\n>1\tbyte\t\t1\t\t3.0 hash file,\n>1\tbyte\t\t2\t\t3.1 hash file,\n>1\tbyte\t\t3\t\thash file (?),\n>2\tbeshort\t\t0x00\t\t8-bit, no capitalization, 26 flags\n>2\tbeshort\t\t0x01\t\t7-bit, no capitalization, 26 flags\n>2\tbeshort\t\t0x02\t\t8-bit, capitalization, 26 flags\n>2\tbeshort\t\t0x03\t\t7-bit, capitalization, 26 flags\n>2\tbeshort\t\t0x04\t\t8-bit, no capitalization, 52 flags\n>2\tbeshort\t\t0x05\t\t7-bit, no capitalization, 52 flags\n>2\tbeshort\t\t0x06\t\t8-bit, capitalization, 52 flags\n>2\tbeshort\t\t0x07\t\t7-bit, capitalization, 52 flags\n>2\tbeshort\t\t0x08\t\t8-bit, no capitalization, 128 flags\n>2\tbeshort\t\t0x09\t\t7-bit, no capitalization, 128 flags\n>2\tbeshort\t\t0x0A\t\t8-bit, capitalization, 128 flags\n>2\tbeshort\t\t0x0B\t\t7-bit, capitalization, 128 flags\n>2\tbeshort\t\t0x0C\t\t8-bit, no capitalization, 256 flags\n>2\tbeshort\t\t0x0D\t\t7-bit, no capitalization, 256 flags\n>2\tbeshort\t\t0x0E\t\t8-bit, capitalization, 256 flags\n>2\tbeshort\t\t0x0F\t\t7-bit, capitalization, 256 flags\n>4\tbeshort\t\t>0\t\tand %d string characters\n# ispell 4.0 hash files  kromJx <kromJx@crosswinds.net>\n# Ispell 4.0\n0       string          ISPL            ispell\n>4      long            x               hash file version %d,\n>8      long            x               lexletters %d,\n>12     long            x               lexsize %d,\n>16     long            x               hashsize %d,\n>20     long            x               stblsize %d\n#------------------------------------------------------------\n# Java ByteCode and Mach-O binaries (e.g., Mac OS X) use the\n# same magic number, 0xcafebabe, so they are both handled\n# in the entry called \"cafebabe\".\n#------------------------------------------------------------\n# Java serialization\n# From Martin Pool (m.pool@pharos.com.au)\n0\tbeshort\t\t0xaced\t\tJava serialization data\n>2\tbeshort\t\t>0x0004\t\t\\b, version %d\n\n0\tbelong\t\t0xfeedfeed\tJava KeyStore\n!:mime\tapplication/x-java-keystore\n0\tbelong\t\t0xcececece\tJava JCE KeyStore\n!:mime\tapplication/x-java-jce-keystore\n\n# Dalvik .dex format. http://retrodev.com/android/dexformat.html\n# From <mkf@google.com> \"Mike Fleming\"\n0\tstring\tdex\\n\n>0\tregex\tdex\\n[0-9][0-9][0-9]\\0\tDalvik dex file\n>4\tstring\t>000\t\t\tversion %s\n0\tstring\tdey\\n\n>0\tregex\tdey\\n[0-9][0-9][0-9]\\0\tDalvik dex file (optimized for host)\n>4\tstring\t>000\t\t\tversion %s\n\n\n#------------------------------------------------------------------------------\n# JPEG images\n# SunOS 5.5.1 had\n#\n#\t0\tstring\t\t\\377\\330\\377\\340\tJPEG file\n#\t0\tstring\t\t\\377\\330\\377\\356\tJPG file\n#\n# both of which turn into \"JPEG image data\" here.\n#\n0\tbeshort\t\t0xffd8\t\tJPEG image data\n!:mime\timage/jpeg\n!:apple\t8BIMJPEG\n!:strength +1\n>6\tstring\t\tJFIF\t\t\\b, JFIF standard\n# The following added by Erik Rossen <rossen@freesurf.ch> 1999-09-06\n# in a vain attempt to add image size reporting for JFIF.  Note that these\n# tests are not fool-proof since some perfectly valid JPEGs are currently\n# impossible to specify in magic(4) format.\n# First, a little JFIF version info:\n>>11\tbyte\t\tx\t\t\\b %d.\n>>12\tbyte\t\tx\t\t\\b%02d\n# Next, the resolution or aspect ratio of the image:\n#>>13\tbyte\t\t0\t\t\\b, aspect ratio\n#>>13\tbyte\t\t1\t\t\\b, resolution (DPI)\n#>>13\tbyte\t\t2\t\t\\b, resolution (DPCM)\n#>>4\tbeshort\t\tx\t\t\\b, segment length %d\n# Next, show thumbnail info, if it exists:\n>>18\tbyte\t\t!0\t\t\\b, thumbnail %dx\n>>>19\tbyte\t\tx\t\t\\b%d\n\n# EXIF moved down here to avoid reporting a bogus version number,\n# and EXIF version number printing added.\n#   - Patrik R=E5dman <patrik+file-magic@iki.fi>\n>6\tstring\t\tExif\t\t\\b, EXIF standard\n# Look for EXIF IFD offset in IFD 0, and then look for EXIF version tag in EXIF IFD.\n# All possible combinations of entries have to be enumerated, since no looping\n# is possible. And both endians are possible...\n# The combinations included below are from real-world JPEGs.\n# Little-endian\n>>12\tstring\t\tII\t\t\n# IFD 0 Entry #5:\n>>>70\tleshort\t\t0x8769          \n# EXIF IFD Entry #1:\n>>>>(78.l+14)\tleshort\t0x9000\t\t\n>>>>>(78.l+23)\tbyte\tx\t\t%c\n>>>>>(78.l+24)\tbyte\tx\t\t\\b.%c\n>>>>>(78.l+25)\tbyte\t!0x30\t\t\\b%c\n# IFD 0 Entry #9:\n>>>118\tleshort\t\t0x8769          \n# EXIF IFD Entry #3:\n>>>>(126.l+38)\tleshort\t0x9000\t\t\n>>>>>(126.l+47)\tbyte\tx\t\t%c\n>>>>>(126.l+48)\tbyte\tx\t\t\\b.%c\n>>>>>(126.l+49)\tbyte\t!0x30\t\t\\b%c\n# IFD 0 Entry #10\n>>>130\tleshort\t\t0x8769          \n# EXIF IFD Entry #3:\n>>>>(138.l+38)\tleshort\t0x9000\t\t\n>>>>>(138.l+47)\tbyte\tx\t\t%c\n>>>>>(138.l+48)\tbyte\tx\t\t\\b.%c\n>>>>>(138.l+49)\tbyte\t!0x30\t\t\\b%c\n# EXIF IFD Entry #4:\n>>>>(138.l+50)\tleshort\t0x9000\t\t\n>>>>>(138.l+59)\tbyte\tx\t\t%c\n>>>>>(138.l+60)\tbyte\tx\t\t\\b.%c\n>>>>>(138.l+61)\tbyte\t!0x30\t\t\\b%c\n# EXIF IFD Entry #5:\n>>>>(138.l+62)\tleshort\t0x9000\t\t\n>>>>>(138.l+71)\tbyte\tx\t\t%c\n>>>>>(138.l+72)\tbyte\tx\t\t\\b.%c\n>>>>>(138.l+73)\tbyte\t!0x30\t\t\\b%c\n# IFD 0 Entry #11\n>>>142\tleshort\t\t0x8769          \n# EXIF IFD Entry #3:\n>>>>(150.l+38)\tleshort\t0x9000\t\t\n>>>>>(150.l+47)\tbyte\tx\t\t%c\n>>>>>(150.l+48)\tbyte\tx\t\t\\b.%c\n>>>>>(150.l+49)\tbyte\t!0x30\t\t\\b%c\n# EXIF IFD Entry #4:\n>>>>(150.l+50)\tleshort\t0x9000\t\t\n>>>>>(150.l+59)\tbyte\tx\t\t%c\n>>>>>(150.l+60)\tbyte\tx\t\t\\b.%c\n>>>>>(150.l+61)\tbyte\t!0x30\t\t\\b%c\n# EXIF IFD Entry #5:\n>>>>(150.l+62)\tleshort\t0x9000\t\t\n>>>>>(150.l+71)\tbyte\tx\t\t%c\n>>>>>(150.l+72)\tbyte\tx\t\t\\b.%c\n>>>>>(150.l+73)\tbyte\t!0x30\t\t\\b%c\n# Big-endian\n>>12\tstring\t\tMM\t\t\n# IFD 0 Entry #9:\n>>>118\tbeshort\t\t0x8769          \n# EXIF IFD Entry #1:\n>>>>(126.L+14)\tbeshort\t0x9000\t\t\n>>>>>(126.L+23)\tbyte\tx\t\t%c\n>>>>>(126.L+24)\tbyte\tx\t\t\\b.%c\n>>>>>(126.L+25)\tbyte\t!0x30\t\t\\b%c\n# EXIF IFD Entry #3:\n>>>>(126.L+38)\tbeshort\t0x9000\t\t\n>>>>>(126.L+47)\tbyte\tx\t\t%c\n>>>>>(126.L+48)\tbyte\tx\t\t\\b.%c\n>>>>>(126.L+49)\tbyte\t!0x30\t\t\\b%c\n# IFD 0 Entry #10\n>>>130\tbeshort\t\t0x8769          \n# EXIF IFD Entry #3:\n>>>>(138.L+38)\tbeshort\t0x9000\t\t\n>>>>>(138.L+47)\tbyte\tx\t\t%c\n>>>>>(138.L+48)\tbyte\tx\t\t\\b.%c\n>>>>>(138.L+49)\tbyte\t!0x30\t\t\\b%c\n# EXIF IFD Entry #5:\n>>>>(138.L+62)\tbeshort\t0x9000\t\t\n>>>>>(138.L+71)\tbyte\tx\t\t%c\n>>>>>(138.L+72)\tbyte\tx\t\t\\b.%c\n>>>>>(138.L+73)\tbyte\t!0x30\t\t\\b%c\n# IFD 0 Entry #11\n>>>142\tbeshort\t\t0x8769          \n# EXIF IFD Entry #4:\n>>>>(150.L+50)\tbeshort\t0x9000\t\t\n>>>>>(150.L+59)\tbyte\tx\t\t%c\n>>>>>(150.L+60)\tbyte\tx\t\t\\b.%c\n>>>>>(150.L+61)\tbyte\t!0x30\t\t\\b%c\n# Here things get sticky.  We can do ONE MORE marker segment with\n# indirect addressing, and that's all.  It would be great if we could\n# do pointer arithemetic like in an assembler language.  Christos?\n# And if there was some sort of looping construct to do searches, plus a few\n# named accumulators, it would be even more effective...\n# At least we can show a comment if no other segments got inserted before:\n>(4.S+5)\tbyte\t\t0xFE\n>>(4.S+8)\tstring\t\t>\\0\t\t\\b, comment: \"%s\"\n# FIXME: When we can do non-byte counted strings, we can use that to get\n# the string's count, and fix Debian bug #283760\n#>(4.S+5)\tbyte\t\t0xFE\t\t\\b, comment\n#>>(4.S+6)\tbeshort\t\tx\t\t\\b length=%d\n#>>(4.S+8)\tstring\t\t>\\0\t\t\\b, \"%s\"\n# Or, we can show the encoding type (I've included only the three most common)\n# and image dimensions if we are lucky and the SOFn (image segment) is here:\n>(4.S+5)\tbyte\t\t0xC0\t\t\\b, baseline\n>>(4.S+6)\tbyte\t\tx\t\t\\b, precision %d\n>>(4.S+7)\tbeshort\t\tx\t\t\\b, %dx\n>>(4.S+9)\tbeshort\t\tx\t\t\\b%d\n>(4.S+5)\tbyte\t\t0xC1\t\t\\b, extended sequential\n>>(4.S+6)\tbyte\t\tx\t\t\\b, precision %d\n>>(4.S+7)\tbeshort\t\tx\t\t\\b, %dx\n>>(4.S+9)\tbeshort\t\tx\t\t\\b%d\n>(4.S+5)\tbyte\t\t0xC2\t\t\\b, progressive\n>>(4.S+6)\tbyte\t\tx\t\t\\b, precision %d\n>>(4.S+7)\tbeshort\t\tx\t\t\\b, %dx\n>>(4.S+9)\tbeshort\t\tx\t\t\\b%d\n# I've commented-out quantisation table reporting.  I doubt anyone cares yet.\n#>(4.S+5)\tbyte\t\t0xDB\t\t\\b, quantisation table\n#>>(4.S+6)\tbeshort\t\tx\t\t\\b length=%d\n#>14\tbeshort\t\tx\t\t\\b, %d x\n#>16\tbeshort\t\tx\t\t\\b %d\n\n# HSI is Handmade Software's proprietary JPEG encoding scheme\n0\tstring\t\thsi1\t\tJPEG image data, HSI proprietary\n\n# From: David Santinoli <david@santinoli.com>\n0\tstring\t\t\\x00\\x00\\x00\\x0C\\x6A\\x50\\x20\\x20\\x0D\\x0A\\x87\\x0A\tJPEG 2000 image data\n\n# Type: JPEG 2000 codesream\n# From: Mathieu Malaterre <mathieu.malaterre@gmail.com>\n0\tbelong\t\t0xff4fff51\t\t\t\t\t\tJPEG 2000 codestream\n45\tbeshort\t\t0xff52\n\n#------------------------------------------------------------------------------\n# karma:  file(1) magic for Karma data files\n#\n# From <rgooch@atnf.csiro.au>\n\n0\tstring\t\tKarmaRHD Version\tKarma Data Structure Version\n>16\tbelong\t\tx\t\t%lu\n\n#------------------------------------------------------------------------------\n# kde:  file(1) magic for KDE\n\n0\t\tstring\t[KDE\\ Desktop\\ Entry]\tKDE desktop entry\n!:mime\tapplication/x-kdelnk\n0\t\tstring\t#\\ KDE\\ Config\\ File\tKDE config file\n!:mime\tapplication/x-kdelnk\n0\t\tstring\t#\\ xmcd\txmcd database file for kscd\n!:mime\ttext/x-xmcd\n#------------------------------------------------------------------------------\n# Type: Google KML, formerly Keyhole Markup Language\n# Future development of this format has been handed\n# over to the Open Geospatial Consortium.\n# http://www.opengeospatial.org/standards/kml/\n# From: Asbjoern Sloth Toennesen <asbjorn@lila.io>\n0 string    \\<?xml\n>20  search/400 \\ xmlns= \n>>&0 regex ['\"]http://earth.google.com/kml Google KML document\n!:mime application/vnd.google-earth.kml+xml\n>>>&1 string 2.0' \\b, version 2.0\n>>>&1 string 2.1' \\b, version 2.1\n>>>&1 string 2.2' \\b, version 2.2\n\n#------------------------------------------------------------------------------\n# Type: OpenGIS KML, formerly Keyhole Markup Language\n# This standard is maintained by the\n# Open Geospatial Consortium.\n# http://www.opengeospatial.org/standards/kml/\n# From: Asbjoern Sloth Toennesen <asbjorn@lila.io>\n>>&0 regex ['\"]http://www.opengis.net/kml OpenGIS KML document\n!:mime application/vnd.google-earth.kml+xml\n>>>&1 string 2.2 \\b, version 2.2\n\n#------------------------------------------------------------------------------\n# Type: Google KML Archive (ZIP based) \n# http://code.google.com/apis/kml/documentation/kml_tut.html\n# From: Asbjoern Sloth Toennesen <asbjorn@lila.io>\n0 string    PK\\003\\004\n>4  byte    0x14\n>>30  string doc.kml Compressed Google KML Document, including resources.\n!:mime application/vnd.google-earth.kmz\n#------------------------------------------------------------------------------\n# DEC SRC Virtual Paper: Lectern files\n# Karl M. Hegbloom <karlheg@inetarena.com>\n0\tstring\tlect\tDEC SRC Virtual Paper Lectern file\n#------------------------------------------------------------------------------\n# lex:  file(1) magic for lex\n#\n#\tderived empirically, your offsets may vary!\n0\tsearch/100\tyyprevious\tC program text (from lex)\n>3\tsearch/1\t>\\0\t\t for %s\n# C program text from GNU flex, from Daniel Quinlan <quinlan@yggdrasil.com>\n0\tsearch/100\tgenerated\\ by\\ flex\tC program text (from flex)\n# lex description file, from Daniel Quinlan <quinlan@yggdrasil.com>\n0\tsearch/1\t%{\t\tlex description text\n\n#------------------------------------------------------------------------------\n# lif:  file(1) magic for lif\n#\n# (Daniel Quinlan <quinlan@yggdrasil.com>)\n#\n0\tbeshort\t\t0x8000\t\tlif file\n#------------------------------------------------------------------------------\n# linux:  file(1) magic for Linux files\n#\n# Values for Linux/i386 binaries, from Daniel Quinlan <quinlan@yggdrasil.com>\n# The following basic Linux magic is useful for reference, but using\n# \"long\" magic is a better practice in order to avoid collisions.\n#\n# 2\tleshort\t\t100\t\tLinux/i386\n# >0\tleshort\t\t0407\t\timpure executable (OMAGIC)\n# >0\tleshort\t\t0410\t\tpure executable (NMAGIC)\n# >0\tleshort\t\t0413\t\tdemand-paged executable (ZMAGIC)\n# >0\tleshort\t\t0314\t\tdemand-paged executable (QMAGIC)\n#\n0\tlelong\t\t0x00640107\tLinux/i386 impure executable (OMAGIC)\n>16\tlelong\t\t0\t\t\\b, stripped\n0\tlelong\t\t0x00640108\tLinux/i386 pure executable (NMAGIC)\n>16\tlelong\t\t0\t\t\\b, stripped\n0\tlelong\t\t0x0064010b\tLinux/i386 demand-paged executable (ZMAGIC)\n>16\tlelong\t\t0\t\t\\b, stripped\n0\tlelong\t\t0x006400cc\tLinux/i386 demand-paged executable (QMAGIC)\n>16\tlelong\t\t0\t\t\\b, stripped\n#\n0\tstring\t\t\\007\\001\\000\tLinux/i386 object file\n>20\tlelong\t\t>0x1020\t\t\\b, DLL library\n# Linux-8086 stuff:\n0\tstring\t\t\\01\\03\\020\\04\tLinux-8086 impure executable\n>28\tlong\t\t!0\t\tnot stripped\n0\tstring\t\t\\01\\03\\040\\04\tLinux-8086 executable\n>28\tlong\t\t!0\t\tnot stripped\n#\n0\tstring\t\t\\243\\206\\001\\0\tLinux-8086 object file\n#\n0\tstring\t\t\\01\\03\\020\\20\tMinix-386 impure executable\n>28\tlong\t\t!0\t\tnot stripped\n0\tstring\t\t\\01\\03\\040\\20\tMinix-386 executable\n>28\tlong\t\t!0\t\tnot stripped\n# core dump file, from Bill Reynolds <bill@goshawk.lanl.gov>\n216\tlelong\t\t0421\t\tLinux/i386 core file\n>220\tstring\t\t>\\0\t\tof '%s'\n>200\tlelong\t\t>0\t\t(signal %d)\n#\n# LILO boot/chain loaders, from Daniel Quinlan <quinlan@yggdrasil.com>\n# this can be overridden by the DOS executable (COM) entry\n2\tstring\t\tLILO\t\tLinux/i386 LILO boot/chain loader\n#\n# PSF fonts, from H. Peter Anvin <hpa@yggdrasil.com>\n0\tleshort\t\t0x0436\t\tLinux/i386 PC Screen Font data,\n>2\tbyte\t\t0\t\t256 characters, no directory,\n>2\tbyte\t\t1\t\t512 characters, no directory,\n>2\tbyte\t\t2\t\t256 characters, Unicode directory,\n>2\tbyte\t\t3\t\t512 characters, Unicode directory,\n>3\tbyte\t\t>0\t\t8x%d\n# Linux swap file, from Daniel Quinlan <quinlan@yggdrasil.com>\n4086\tstring\t\tSWAP-SPACE\tLinux/i386 swap file\n# From: Jeff Bailey <jbailey@ubuntu.com>\n# Linux swap file with swsusp1 image, from Jeff Bailey <jbailey@ubuntu.com>\n4076\tstring\t\tSWAPSPACE2S1SUSPEND\tLinux/i386 swap file (new style) with SWSUSP1 image\n# according to man page of mkswap (8) March 1999\n4086\tstring\t\tSWAPSPACE2\tLinux/i386 swap file (new style)\n>0x400\tlong\t\tx\t\t%d (4K pages)\n>0x404\tlong\t\tx\t\tsize %d pages\n>>4086\tstring\t\tSWAPSPACE2\t\n>>>1052\tstring\t\t>\\0\t\tLabel %s\n# ECOFF magic for OSF/1 and Linux (only tested under Linux though)\n#\n#\tfrom Erik Troan (ewt@redhat.com) examining od dumps, so this\n#\t\tcould be wrong\n#      updated by David Mosberger (davidm@azstarnet.com) based on\n#      GNU BFD and MIPS info found below.\n#\n0\tleshort\t\t0x0183\t\tECOFF alpha\n>24\tleshort\t\t0407\t\texecutable\n>24\tleshort\t\t0410\t\tpure\n>24\tleshort\t\t0413\t\tdemand paged\n>8\tlong\t\t>0\t\tnot stripped\n>8\tlong\t\t0\t\tstripped\n>23\tleshort\t\t>0\t\t- version %ld.\n#\n# Linux kernel boot images, from Albert Cahalan <acahalan@cs.uml.edu>\n# and others such as Axel Kohlmeyer <akohlmey@rincewind.chemie.uni-ulm.de>\n# and Nicols Lichtmaier <nick@debian.org>\n# All known start with: b8 c0 07 8e d8 b8 00 90 8e c0 b9 00 01 29 f6 29\n# Linux kernel boot images (i386 arch) (Wolfram Kleff)\n514\tstring\t\tHdrS\t\tLinux kernel\n>510\tleshort\t\t0xAA55\t\tx86 boot executable\n>>518\tleshort\t\t>0x1ff\n>>>529\tbyte\t\t0\t\tzImage,\n>>>529\tbyte\t\t1\t\tbzImage,\n>>>(526.s+0x200) string\t>\\0\t\tversion %s,\n>>498\tleshort\t\t1\t\tRO-rootFS,\n>>498\tleshort\t\t0\t\tRW-rootFS,\n>>508\tleshort\t\t>0\t\troot_dev 0x%X,\n>>502\tleshort\t\t>0\t\tswap_dev 0x%X,\n>>504\tleshort\t\t>0\t\tRAMdisksize %u KB,\n>>506\tleshort\t\t0xFFFF\t\tNormal VGA\n>>506\tleshort\t\t0xFFFE\t\tExtended VGA\n>>506\tleshort\t\t0xFFFD\t\tPrompt for Videomode\n>>506\tleshort\t\t>0\t\tVideo mode %d\n# This also matches new kernels, which were caught above by \"HdrS\".\n0\t\tbelong\t0xb8c0078e\tLinux kernel\n>0x1e3\t\tstring\tLoading\t\tversion 1.3.79 or older\n>0x1e9\t\tstring\tLoading\t\tfrom prehistoric times\n\n# System.map files - Nicols Lichtmaier <nick@debian.org>\n8\tsearch/1\t\\ A\\ _text\tLinux kernel symbol map text\n\n# LSM entries - Nicols Lichtmaier <nick@debian.org>\n0\tsearch/1\tBegin3\tLinux Software Map entry text\n0\tsearch/1\tBegin4\tLinux Software Map entry text (new format)\n\n# From Matt Zimmerman, enhanced for v3 by Matthew Palmer\n0\tbelong\t0x4f4f4f4d\tUser-mode Linux COW file\n>4\tbelong\t<3\t\t\\b, version %d\n>>8\tstring\t>\\0\t\t\\b, backing file %s\n>4\tbelong\t>2\t\t\\b, version %d\n>>32\tstring\t>\\0\t\t\\b, backing file %s\n\n############################################################################\n# Linux kernel versions\n\n0\t\tstring\t\t\\xb8\\xc0\\x07\\x8e\\xd8\\xb8\\x00\\x90\tLinux\n>497\t\tleshort\t\t0\t\tx86 boot sector\n>>514\t\tbelong\t\t0x8e\tof a kernel from the dawn of time!\n>>514\t\tbelong\t\t0x908ed8b4\tversion 0.99-1.1.42\n>>514\t\tbelong\t\t0x908ed8b8\tfor memtest86\n\n>497\t\tleshort\t\t!0\t\tx86 kernel\n>>504\t\tleshort\t\t>0\t\tRAMdisksize=%u KB\n>>502\t\tleshort\t\t>0\t\tswap=0x%X\n>>508\t\tleshort\t\t>0\t\troot=0x%X\n>>>498\t\tleshort\t\t1\t\t\\b-ro\n>>>498\t\tleshort\t\t0\t\t\\b-rw\n>>506\t\tleshort\t\t0xFFFF\t\tvga=normal\n>>506\t\tleshort\t\t0xFFFE\t\tvga=extended\n>>506\t\tleshort\t\t0xFFFD\t\tvga=ask\n>>506\t\tleshort\t\t>0\t\tvga=%d\n>>514\t\tbelong\t\t0x908ed881\tversion 1.1.43-1.1.45\n>>514\t\tbelong\t\t0x15b281cd\n>>>0xa8e\tbelong\t\t0x55AA5a5a\tversion 1.1.46-1.2.13,1.3.0\n>>>0xa99\tbelong\t\t0x55AA5a5a\tversion 1.3.1,2\n>>>0xaa3\tbelong\t\t0x55AA5a5a\tversion 1.3.3-1.3.30\n>>>0xaa6\tbelong\t\t0x55AA5a5a\tversion 1.3.31-1.3.41\n>>>0xb2b\tbelong\t\t0x55AA5a5a\tversion 1.3.42-1.3.45\n>>>0xaf7\tbelong\t\t0x55AA5a5a\tversion 1.3.46-1.3.72\n>>514\t\tstring\t\tHdrS\n>>>518\t\tleshort\t\t>0x1FF\n>>>>529\t\tbyte\t\t0\t\t\\b, zImage\n>>>>529\t\tbyte\t\t1\t\t\\b, bzImage\n>>>>(526.s+0x200) string \t>\\0\t\t\\b, version %s\n\n# Linux boot sector thefts.\n0\t\tbelong\t\t0xb8c0078e\tLinux\n>0x1e6\t\tbelong\t\t0x454c4b53\tELKS Kernel\n>0x1e6\t\tbelong\t\t!0x454c4b53\tstyle boot sector\n\n############################################################################\n# Linux 8086 executable\n0\tlelong&0xFF0000FF 0xC30000E9\tLinux-Dev86 executable, headerless\n>5\tstring\t\t.\t\t\n>>4\tstring\t\t>\\0\t\t\\b, libc version %s\n\n0\tlelong&0xFF00FFFF 0x4000301\tLinux-8086 executable\n>2\tbyte&0x01\t!0\t\t\\b, unmapped zero page\n>2\tbyte&0x20\t0\t\t\\b, impure\n>2\tbyte&0x20\t!0\n>>2\tbyte&0x10\t!0\t\t\\b, A_EXEC\n>2\tbyte&0x02\t!0\t\t\\b, A_PAL\n>2\tbyte&0x04\t!0\t\t\\b, A_NSYM\n>2\tbyte&0x08\t!0\t\t\\b, A_STAND\n>2\tbyte&0x40\t!0\t\t\\b, A_PURE\n>2\tbyte&0x80\t!0\t\t\\b, A_TOVLY\n>28     long            !0              \\b, not stripped\n>37\tstring\t\t.\t\t\n>>36\tstring\t\t>\\0\t\t\\b, libc version %s\n\n# 0\tlelong&0xFF00FFFF 0x10000301\tld86 I80386 executable\n# 0\tlelong&0xFF00FFFF 0xB000301\tld86 M68K executable\n# 0\tlelong&0xFF00FFFF 0xC000301\tld86 NS16K executable\n# 0\tlelong&0xFF00FFFF 0x17000301\tld86 SPARC executable\n\n# SYSLINUX boot logo files (from 'ppmtolss16' sources)\n# http://syslinux.zytor.com/\n#\n0\tlelong\t=0x1413f33d\t\tSYSLINUX' LSS16 image data\n>4\tleshort\tx\t\t\t\\b, width %d\n>6\tleshort\tx\t\t\t\\b, height %d\n\n0\tstring\tOOOM\t\t\tUser-Mode-Linux's Copy-On-Write disk image\n>4\tbelong\tx\t\t\tversion %d\n\n# SE Linux policy database\n# From: Mike Frysinger <vapier@gentoo.org>\n0\tlelong\t0xf97cff8c\t\tSE Linux policy\n>16\tlelong\tx\t\t\tv%d\n>20\tlelong\t1\t\t\tMLS\n>24\tlelong\tx\t\t\t%d symbols\n>28\tlelong\tx\t\t\t%d ocons\n\n# Linux Logical Volume Manager (LVM) \n# Emmanuel VARAGNAT <emmanuel.varagnat@guzu.net>\n#\n# System ID, UUID and volume group name are 128 bytes long\n# but they should never be full and initialized with zeros...\n#\n# LVM1\n#\n0x0\tstring\tHM\\001\t\tLVM1 (Linux Logical Volume Manager), version 1\n>0x12c\tstring\t>\\0\t\t, System ID: %s\n\n0x0\tstring\tHM\\002\t\tLVM1 (Linux Logical Volume Manager), version 2\n>0x12c\tstring\t>\\0\t\t, System ID: %s\n\n#  LVM2\n#\n# It seems that the label header can be in one the four first sector\n# of the disk... (from _find_labeller in lib/label/label.c of LVM2)\n#\n# 0x200 seems to be the common case\n\n0x218\t\t string\tLVM2\\ 001\tLVM2 (Linux Logical Volume Manager)\n# read the offset to add to the start of the header, and the header\n# start in 0x200\n>(0x214.l+0x200) string\t>\\0\t\t, UUID: %s\n\n0x018\t\t string\tLVM2\\ 001\tLVM2 (Linux Logical Volume Manager)\n>(0x014.l)\t string\t>\\0\t\t, UUID: %s\n\n0x418\t\t string\tLVM2\\ 001\tLVM2 (Linux Logical Volume Manager)\n>(0x414.l+0x400) string\t>\\0\t\t, UUID: %s\n\n0x618\t\t string\tLVM2\\ 001\tLVM2 (Linux Logical Volume Manager)\n>(0x614.l+0x600) string\t>\\0\t\t, UUID: %s\n\n# LVM snapshot\n# from Jason Farrel\n0\tstring\tSnAp\tLVM Snapshot (CopyOnWrite store)\n>4\tlelong\t!0\t- valid,\n>4\tlelong\t0\t- invalid,\n>8\tlelong\tx\tversion %d,\n>12\tlelong\tx\tchunk_size %d\n\n# SE Linux policy database\n0\tlelong\t0xf97cff8c\t\tSE Linux policy\n>16\tlelong\tx\t\t\tv%d\n>20\tlelong\t1\t\t\tMLS\n>24\tlelong\tx\t\t\t%d symbols\n>28\tlelong\tx\t\t\t%d ocons\n\n# LUKS: Linux Unified Key Setup, On-Disk Format, http://luks.endorphin.org/spec\n# Anthon van der Neut (anthon@mnt.org)\n0\tstring\tLUKS\\xba\\xbe\tLUKS encrypted file,\n>6\tbeshort x\t\tver %d\n>8\tstring\tx\t\t[%s,\n>40\tstring\tx\t\t%s,\n>72\tstring\tx\t\t%s]\n>168\tstring\tx\t\tUUID: %s\n\n\n# Summary: Xen saved domain file\n# Created by: Radek Vokal <rvokal@redhat.com>\n0\tstring\t\tLinuxGuestRecord\tXen saved domain\n>20\tsearch/256\t(name\t\t\t\n>>&1\tstring\t\tx\t\t\t(name %s)\n\n#------------------------------------------------------------------------------\n# lisp:  file(1) magic for lisp programs\n#\n# various lisp types, from Daniel Quinlan (quinlan@yggdrasil.com)\n\n# updated by Joerg Jenderek\n# GRR: This lot is too weak\n#0\tstring\t;;\t\t\t\n# windows INF files often begin with semicolon and use CRLF as line end\n# lisp files are mainly created on unix system with LF as line end\n#>2\tsearch/4096\t!\\r\t\tLisp/Scheme program text\n#>2\tsearch/4096\t\\r\t\tWindows INF file\n\n0\tsearch/4096\t(if\\ \t\t\tLisp/Scheme program text\n!:mime\ttext/x-lisp\n0\tsearch/4096\t(setq\\ \t\t\tLisp/Scheme program text\n!:mime\ttext/x-lisp\n0\tsearch/4096\t(defvar\\ \t\tLisp/Scheme program text\n!:mime\ttext/x-lisp\n0\tsearch/4096\t(defparam\\ \t\tLisp/Scheme program text\n!:mime\ttext/x-lisp\n0\tsearch/4096\t(defun\\  \t\tLisp/Scheme program text\n!:mime\ttext/x-lisp\n0\tsearch/4096\t(autoload\\ \t\tLisp/Scheme program text\n!:mime\ttext/x-lisp\n0\tsearch/4096\t(custom-set-variables\\ \tLisp/Scheme program text\n!:mime\ttext/x-lisp\n\n# Emacs 18 - this is always correct, but not very magical.\n0\tstring\t\\012(\t\t\tEmacs v18 byte-compiled Lisp data\n!:mime\tapplication/x-elc\n# Emacs 19+ - ver. recognition added by Ian Springer\n# Also applies to XEmacs 19+ .elc files; could tell them apart with regexs\n# - Chris Chittleborough <cchittleborough@yahoo.com.au>\n0\tstring\t;ELC\t\n>4\tbyte\t>18\t\t\t\n>4\tbyte    <32\t\t\tEmacs/XEmacs v%d byte-compiled Lisp data\n!:mime\tapplication/x-elc\t\t\n\n# Files produced by CLISP Common Lisp From: Bruno Haible <haible@ilog.fr>\n0\tstring\t(SYSTEM::VERSION\\040'\tCLISP byte-compiled Lisp program (pre 2004-03-27)\n0\tstring\t(|SYSTEM|::|VERSION|\\040'\tCLISP byte-compiled Lisp program text\n\n0\tlong\t0x70768BD2\t\tCLISP memory image data\n0\tlong\t0xD28B7670\t\tCLISP memory image data, other endian\n\n#.com and .bin for MIT scheme \n0\tstring\t\\372\\372\\372\\372\tMIT scheme (library?)\n\n# From: David Allouche <david@allouche.net>\n0\tsearch/1\t\\<TeXmacs|\tTeXmacs document text\n!:mime\ttext/texmacs\n\n#------------------------------------------------------------------------------\n# llvm:  file(1) magic for LLVM byte-codes\n# URL:  http://llvm.cs.uiuc.edu/docs/BytecodeFormat.html#signature\n# From: Al Stone <ahs3@fc.hp.com>\n\n0\tstring\tllvm\tLLVM byte-codes, uncompressed\n0\tstring\tllvc0\tLLVM byte-codes, null compression\n0\tstring\tllvc1\tLLVM byte-codes, gzip compression\n0\tstring\tllvc2\tLLVM byte-codes, bzip2 compression\n#------------------------------------------------------------------------------\n# lua:  file(1) magic for Lua scripting language\n# URL:  http://www.lua.org/\n# From: Reuben Thomas <rrt@sc3d.org>, Seo Sanghyeon <tinuviel@sparcs.kaist.ac.kr>\n\n# Lua scripts\n0\tsearch/1/b\t#!\\ /usr/bin/lua\tLua script text executable\n!:mime\ttext/x-lua\n0\tsearch/1/b\t#!\\ /usr/local/bin/lua\tLua script text executable\n!:mime\ttext/x-lua\n0\tsearch/1\t#!/usr/bin/env\\ lua\tLua script text executable\n!:mime\ttext/x-lua\n0\tsearch/1\t#!\\ /usr/bin/env\\ lua\tLua script text executable\n!:mime\ttext/x-lua\n\n# Lua bytecode\n0\tstring\t\t\\033Lua\t\t\tLua bytecode,\n>4\tbyte\t\t0x50\t\t\tversion 5.0\n>4\tbyte\t\t0x51\t\t\tversion 5.1\n\n#------------------------------------------------------------------------------\n# luks:  file(1) magic for Linux Unified Key Setup\n# URL:\thttp://luks.endorphin.org/spec\n# From:\tAnthon van der Neut <anthon@mnt.org>\n\n0\tstring\t\tLUKS\\xba\\xbe\tLUKS encrypted file,\n>6\tbeshort\t\tx\t\tver %d\n>8\tstring\t\tx\t\t[%s,\n>40\tstring\t\tx\t\t%s,\n>72\tstring\t\tx\t\t%s]\n>168\tstring\t\tx\t\tUUID: %s\n#------------------------------------------------------------\n# Mach has two magic numbers, 0xcafebabe and 0xfeedface.\n# Unfortunately the first, cafebabe, is shared with\n# Java ByteCode, so they are both handled in the file \"cafebabe\".\n# The \"feedface\" ones are handled herein.\n#------------------------------------------------------------\n0\tlelong&0xfffffffe\t0xfeedface\tMach-O\n>0\tbyte\t\t0xcf\t\t64-bit\n>12\tlelong\t\t1\t\tobject\n>12\tlelong\t\t2\t\texecutable\n>12\tlelong\t\t3\t\tfixed virtual memory shared library\n>12\tlelong\t\t4\t\tcore\n>12\tlelong\t\t5\t\tpreload executable\n>12\tlelong\t\t6\t\tdynamically linked shared library\n>12\tlelong\t\t7\t\tdynamic linker\n>12\tlelong\t\t8\t\tbundle\n>12\tlelong\t\t9\t\tdynamically linked shared library stub\n>12\tlelong\t\t>9\n>>12\tlelong\t\tx\t\tfiletype=%ld\n>4\tlelong\t\t<0\n>>4\tlelong\t\tx\t\tarchitecture=%ld\n>4\tlelong\t\t1\t\tvax\n>4\tlelong\t\t2\t\tromp\n>4\tlelong\t\t3\t\tarchitecture=3\n>4\tlelong\t\t4\t\tns32032\n>4\tlelong\t\t5\t\tns32332\n>4\tlelong\t\t6\t\tm68k\n>4\tlelong\t\t7\t\ti386\n>4\tlelong\t\t8\t\tmips\n>4\tlelong\t\t9\t\tns32532\n>4\tlelong\t\t10\t\tarchitecture=10\n>4\tlelong\t\t11\t\thppa\n>4\tlelong\t\t12\t\tacorn\n>4\tlelong\t\t13\t\tm88k\n>4\tlelong\t\t14\t\tsparc\n>4\tlelong\t\t15\t\ti860-big\n>4\tlelong\t\t16\t\ti860\n>4\tlelong\t\t17\t\trs6000\n>4\tlelong\t\t18\t\tppc\n>4\tlelong\t\t16777234\tppc64\n>4\tlelong\t\t>16777234\n>>4\tlelong\t\tx\t\tarchitecture=%ld\n#\n0\tbelong&0xfffffffe\t0xfeedface\tMach-O\n>3\tbyte\t\t0xcf\t\t64-bit\n>12\tbelong\t\t1\t\tobject\n>12\tbelong\t\t2\t\texecutable\n>12\tbelong\t\t3\t\tfixed virtual memory shared library\n>12\tbelong\t\t4\t\tcore\n>12\tbelong\t\t5\t\tpreload executable\n>12\tbelong\t\t6               dynamically linked shared library\n>12\tbelong\t\t7               dynamic linker\n>12\tbelong\t\t8\t\tbundle\n>12\tbelong\t\t9\t\tdynamically linked shared library stub\n>12\tbelong\t\t>9\n>>12\tbelong\t\tx\t\tfiletype=%ld\n>4\tbelong\t\t<0\n>>4\tbelong\t\tx\t\tarchitecture=%ld\n>4\tbelong\t\t1\t\tvax\n>4\tbelong\t\t2\t\tromp\n>4\tbelong\t\t3\t\tarchitecture=3\n>4\tbelong\t\t4\t\tns32032\n>4\tbelong\t\t5\t\tns32332\n>4\tbelong\t\t6\t\tfor m68k architecture\n# from NeXTstep 3.0 <mach/machine.h>\n# i.e. mc680x0_all, ignore\n# >>8\tbelong\t\t1\t\t(mc68030)\n>>8\tbelong\t\t2\t\t(mc68040)\n>>8\tbelong\t\t3\t\t(mc68030 only)\n>4\tbelong\t\t7\t\ti386\n>4\tbelong\t\t8\t\tmips\n>4\tbelong\t\t9\t\tns32532\n>4\tbelong\t\t10\t\tarchitecture=10\n>4\tbelong\t\t11\t\thppa\n>4\tbelong\t\t12\t\tacorn\n>4\tbelong\t\t13\t\tm88k\n>4\tbelong\t\t14\t\tsparc\n>4\tbelong\t\t15\t\ti860-big\n>4\tbelong\t\t16\t\ti860\n>4\tbelong\t\t17\t\trs6000\n>4\tbelong\t\t18\t\tppc\n>4\tbelong\t\t16777234\tppc64\n>4\tbelong\t\t>16777234\n>>4\tbelong\t\tx\t\tarchitecture=%ld\n\n#------------------------------------------------------------------------------\n# macintosh description\n#\n# BinHex is the Macintosh ASCII-encoded file format (see also \"apple\")\n# Daniel Quinlan, quinlan@yggdrasil.com\n11\tstring\tmust\\ be\\ converted\\ with\\ BinHex\tBinHex binary text\n!:mime\tapplication/mac-binhex40\n>41\tstring\tx\t\t\t\t\t\\b, version %.3s\n\n# Stuffit archives are the de facto standard of compression for Macintosh\n# files obtained from most archives. (franklsm@tuns.ca)\n0\tstring\t\tSIT!\t\t\tStuffIt Archive (data)\n!:mime\tapplication/x-stuffit\n!:apple\tSIT!SIT!\n>2\tstring\t\tx\t\t\t: %s\n0\tstring\t\tSITD\t\t\tStuffIt Deluxe (data)\n>2\tstring\t\tx\t\t\t: %s\n0\tstring\t\tSeg\t\t\tStuffIt Deluxe Segment (data)\n>2\tstring\t\tx\t\t\t: %s\n\n# Newer StuffIt archives (grant@netbsd.org)\n0\tstring\t\tStuffIt\t\t\tStuffIt Archive\n!:mime\tapplication/x-stuffit\n!:apple\tSIT!SIT!\n#>162\tstring\t\t>0\t\t\t: %s\n\n# Macintosh Applications and Installation binaries (franklsm@tuns.ca)\n# GRR: Too weak\n#0\tstring\t\tAPPL\t\t\tMacintosh Application (data)\n#>2\tstring\t\tx\t\t\t\\b: %s\n\n# Macintosh System files (franklsm@tuns.ca)\n# GRR: Too weak\n#0\tstring\t\tzsys\t\t\tMacintosh System File (data)\n#0\tstring\t\tFNDR\t\t\tMacintosh Finder (data)\n#0\tstring\t\tlibr\t\t\tMacintosh Library (data)\n#>2\tstring\t\tx\t\t\t: %s\n#0\tstring\t\tshlb\t\t\tMacintosh Shared Library (data)\n#>2\tstring\t\tx\t\t\t: %s\n#0\tstring\t\tcdev\t\t\tMacintosh Control Panel (data)\n#>2\tstring\t\tx\t\t\t: %s\n#0\tstring\t\tINIT\t\t\tMacintosh Extension (data)\n#>2\tstring\t\tx\t\t\t: %s\n#0\tstring\t\tFFIL\t\t\tMacintosh Truetype Font (data)\n#>2\tstring\t\tx\t\t\t: %s\n#0\tstring\t\tLWFN\t\t\tMacintosh Postscript Font (data)\n#>2\tstring\t\tx\t\t\t: %s\n\n# Additional Macintosh Files (franklsm@tuns.ca)\n# GRR: Too weak\n#0\tstring\t\tPACT\t\t\tMacintosh Compact Pro Archive (data)\n#>2\tstring\t\tx\t\t\t: %s\n#0\tstring\t\tttro\t\t\tMacintosh TeachText File (data)\n#>2\tstring\t\tx\t\t\t: %s\n#0\tstring\t\tTEXT\t\t\tMacintosh TeachText File (data)\n#>2\tstring\t\tx\t\t\t: %s\n#0\tstring\t\tPDF\t\t\tMacintosh PDF File (data)\n#>2\tstring\t\tx\t\t\t: %s\n\n# MacBinary format (Eric Fischer, enf@pobox.com)\n#\n# Unfortunately MacBinary doesn't really have a magic number prior\n# to the MacBinary III format.  The checksum is really the way to\n# do it, but the magic file format isn't up to the challenge.\n#\n# 0\tbyte\t\t0\n# 1\tbyte\t\t\t\t# filename length\n# 2\tstring\t\t\t\t# filename\n# 65    string\t\t\t\t# file type\n# 69\tstring\t\t\t\t# file creator\n# 73\tbyte\t\t\t\t# Finder flags\n# 74\tbyte\t\t0\n# 75\tbeshort\t\t\t\t# vertical posn in window\n# 77\tbeshort\t\t\t\t# horiz posn in window\n# 79\tbeshort\t\t\t\t# window or folder ID\n# 81    byte\t\t\t\t# protected?\n# 82\tbyte\t\t0\n# 83\tbelong\t\t\t\t# length of data segment\n# 87\tbelong\t\t\t\t# length of resource segment\n# 91\tbelong\t\t\t\t# file creation date\n# 95\tbelong\t\t\t\t# file modification date\n# 99\tbeshort\t\t\t\t# length of comment after resource\n# 101\tbyte\t\t\t\t# new Finder flags\n# 102\tstring\t\tmBIN\t\t# (only in MacBinary III)\n# 106\tbyte\t\t\t\t# char. code of file name\n# 107\tbyte\t\t\t\t# still more Finder flags\n# 116\tbelong\t\t\t\t# total file length\n# 120\tbeshort\t\t\t\t# length of add'l header\n# 122\tbyte\t\t129\t\t# for MacBinary II\n# 122\tbyte\t\t130\t\t# for MacBinary III\n# 123\tbyte\t\t129\t\t# minimum version that can read fmt\n# 124\tbeshort\t\t\t\t# checksum\n#\n# This attempts to use the version numbers as a magic number, requiring\n# that the first one be 0x80, 0x81, 0x82, or 0x83, and that the second\n# be 0x81.  This works for the files I have, but maybe not for everyone's.\n\n# Unfortunately, this magic is quite weak - MPi\n#122\tbeshort&0xFCFF\t0x8081\t\tMacintosh MacBinary data\n\n# MacBinary I doesn't have the version number field at all, but MacBinary II\n# has been in use since 1987 so I hope there aren't many really old files\n# floating around that this will miss.  The original spec calls for using\n# the nulls in 0, 74, and 82 as the magic number.\n#\n# Another possibility, that would also work for MacBinary I, is to use\n# the assumption that 65-72 will all be ASCII (0x20-0x7F), that 73 will\n# have bits 1 (changed), 2 (busy), 3 (bozo), and 6 (invisible) unset,\n# and that 74 will be 0.  So something like\n# \n# 71 \tbelong&0x80804EFF 0x00000000 \tMacintosh MacBinary data\n# \n# >73\tbyte&0x01\t0x01\t\t\\b, inited\n# >73\tbyte&0x02\t0x02\t\t\\b, changed\n# >73\tbyte&0x04\t0x04\t\t\\b, busy\n# >73\tbyte&0x08\t0x08\t\t\\b, bozo\n# >73\tbyte&0x10\t0x10\t\t\\b, system\n# >73\tbyte&0x10\t0x20\t\t\\b, bundle\n# >73\tbyte&0x10\t0x40\t\t\\b, invisible\n# >73\tbyte&0x10\t0x80\t\t\\b, locked\n\n#>65\tstring\t\tx\t\t\\b, type \"%4.4s\"\n\n#>65\tstring\t\t8BIM\t\t(PhotoShop)\n#>65\tstring\t\tALB3\t\t(PageMaker 3)\n#>65\tstring\t\tALB4\t\t(PageMaker 4)\n#>65\tstring\t\tALT3\t\t(PageMaker 3)\n#>65\tstring\t\tAPPL\t\t(application)\n#>65\tstring\t\tAWWP\t\t(AppleWorks word processor)\n#>65\tstring\t\tCIRC\t\t(simulated circuit)\n#>65\tstring\t\tDRWG\t\t(MacDraw)\n#>65\tstring\t\tEPSF\t\t(Encapsulated PostScript)\n#>65\tstring\t\tFFIL\t\t(font suitcase)\n#>65\tstring\t\tFKEY\t\t(function key)\n#>65\tstring\t\tFNDR\t\t(Macintosh Finder)\n#>65\tstring\t\tGIFf\t\t(GIF image)\n#>65\tstring\t\tGzip\t\t(GNU gzip)\n#>65\tstring\t\tINIT\t\t(system extension)\n#>65\tstring\t\tLIB\\ \t\t(library)\n#>65\tstring\t\tLWFN\t\t(PostScript font)\n#>65\tstring\t\tMSBC\t\t(Microsoft BASIC)\n#>65\tstring\t\tPACT\t\t(Compact Pro archive)\n#>65\tstring\t\tPDF\\ \t\t(Portable Document Format)\n#>65\tstring\t\tPICT\t\t(picture)\n#>65\tstring\t\tPNTG\t\t(MacPaint picture)\n#>65\tstring\t\tPREF\t\t(preferences)\n#>65\tstring\t\tPROJ\t\t(Think C project)\n#>65\tstring\t\tQPRJ\t\t(Think Pascal project)\n#>65\tstring\t\tSCFL\t\t(Defender scores)\n#>65\tstring\t\tSCRN\t\t(startup screen)\n#>65\tstring\t\tSITD\t\t(StuffIt Deluxe)\n#>65\tstring\t\tSPn3\t\t(SuperPaint)\n#>65\tstring\t\tSTAK\t\t(HyperCard stack)\n#>65\tstring\t\tSeg\\ \t\t(StuffIt segment)\n#>65\tstring\t\tTARF\t\t(Unix tar archive)\n#>65\tstring\t\tTEXT\t\t(ASCII)\n#>65\tstring\t\tTIFF\t\t(TIFF image)\n#>65\tstring\t\tTOVF\t\t(Eudora table of contents)\n#>65\tstring\t\tWDBN\t\t(Microsoft Word word processor)\n#>65\tstring\t\tWORD\t\t(MacWrite word processor)\n#>65\tstring\t\tXLS\\ \t\t(Microsoft Excel)\n#>65\tstring\t\tZIVM\t\t(compress (.Z))\n#>65\tstring\t\tZSYS\t\t(Pre-System 7 system file)\n#>65\tstring\t\tacf3\t\t(Aldus FreeHand)\n#>65\tstring\t\tcdev\t\t(control panel)\n#>65\tstring\t\tdfil\t\t(Desk Acessory suitcase)\n#>65\tstring\t\tlibr\t\t(library)\n#>65\tstring\t\tnX^d\t\t(WriteNow word processor)\n#>65\tstring\t\tnX^w\t\t(WriteNow dictionary)\n#>65\tstring\t\trsrc\t\t(resource)\n#>65\tstring\t\tscbk\t\t(Scrapbook)\n#>65\tstring\t\tshlb\t\t(shared library)\n#>65\tstring\t\tttro\t\t(SimpleText read-only)\n#>65\tstring\t\tzsys\t\t(system file)\n\n#>69\tstring\t\tx\t\t\\b, creator \"%4.4s\"\n\n# Somewhere, Apple has a repository of registered Creator IDs.  These are\n# just the ones that I happened to have files from and was able to identify.\n\n#>69\tstring\t\t8BIM\t\t(Adobe Photoshop)\n#>69\tstring\t\tALD3\t\t(PageMaker 3)\n#>69\tstring\t\tALD4\t\t(PageMaker 4)\n#>69\tstring\t\tALFA\t\t(Alpha editor)\n#>69\tstring\t\tAPLS\t\t(Apple Scanner)\n#>69\tstring\t\tAPSC\t\t(Apple Scanner)\n#>69\tstring\t\tBRKL\t\t(Brickles)\n#>69\tstring\t\tBTFT\t\t(BitFont)\n#>69\tstring\t\tCCL2 \t\t(Common Lisp 2)\n#>69\tstring\t\tCCL\\ \t\t(Common Lisp)\n#>69\tstring\t\tCDmo\t\t(The Talking Moose)\n#>69\tstring\t\tCPCT\t\t(Compact Pro)\n#>69\tstring\t\tCSOm\t\t(Eudora)\n#>69\tstring\t\tDMOV\t\t(Font/DA Mover)\n#>69\tstring\t\tDSIM\t\t(DigSim)\n#>69\tstring\t\tEDIT\t\t(Macintosh Edit)\n#>69\tstring\t\tERIK\t\t(Macintosh Finder)\n#>69\tstring\t\tEXTR\t\t(self-extracting archive)\n#>69\tstring\t\tGzip\t\t(GNU gzip)\n#>69\tstring\t\tKAHL\t\t(Think C)\n#>69\tstring\t\tLWFU\t\t(LaserWriter Utility)\n#>69\tstring\t\tLZIV\t\t(compress)\n#>69\tstring\t\tMACA\t\t(MacWrite)\n#>69\tstring\t\tMACS\t\t(Macintosh operating system)\n#>69\tstring\t\tMAcK\t\t(MacKnowledge terminal emulator)\n#>69\tstring\t\tMLND\t\t(Defender)\n#>69\tstring\t\tMPNT\t\t(MacPaint)\n#>69\tstring\t\tMSBB\t\t(Microsoft BASIC (binary))\n#>69\tstring\t\tMSWD\t\t(Microsoft Word)\n#>69\tstring\t\tNCSA\t\t(NCSA Telnet)\n#>69\tstring\t\tPJMM\t\t(Think Pascal)\n#>69\tstring\t\tPSAL\t\t(Hunt the Wumpus)\n#>69\tstring\t\tPSI2\t\t(Apple File Exchange)\n#>69\tstring\t\tR*ch\t\t(BBEdit)\n#>69\tstring\t\tRMKR\t\t(Resource Maker)\n#>69\tstring\t\tRSED\t\t(Resource Editor)\n#>69\tstring\t\tRich\t\t(BBEdit)\n#>69\tstring\t\tSIT!\t\t(StuffIt)\n#>69\tstring\t\tSPNT\t\t(SuperPaint)\n#>69\tstring\t\tUnix\t\t(NeXT Mac filesystem)\n#>69\tstring\t\tVIM!\t\t(Vim editor)\n#>69\tstring\t\tWILD\t\t(HyperCard)\n#>69\tstring\t\tXCEL\t\t(Microsoft Excel)\n#>69\tstring\t\taCa2\t\t(Fontographer)\n#>69\tstring\t\taca3\t\t(Aldus FreeHand)\n#>69\tstring\t\tdosa\t\t(Macintosh MS-DOS file system)\n#>69\tstring\t\tmovr\t\t(Font/DA Mover)\n#>69\tstring\t\tnX^n\t\t(WriteNow)\n#>69\tstring\t\tpdos\t\t(Apple ProDOS file system)\n#>69\tstring\t\tscbk\t\t(Scrapbook)\n#>69\tstring\t\tttxt\t\t(SimpleText)\n#>69\tstring\t\tufox\t\t(Foreign File Access)\n\n# Just in case...\n\n102\tstring\t\tmBIN\t\tMacBinary III data with surprising version number\n\n# sas magic from Bruce Foster (bef@nwu.edu)\n#\n#0\tstring\t\tSAS\t\tSAS\n#>8\tstring\t\tx\t\t%s\n0\tstring\t\tSAS\t\tSAS\n>24\tstring\t\tDATA\t\tdata file\n>24\tstring\t\tCATALOG\t\tcatalog\n>24\tstring\t\tINDEX\t\tdata file index\n>24\tstring\t\tVIEW\t\tdata view\n# sas 7+ magic from Reinhold Koch (reinhold.koch@roche.com)\n#\n0x54    string          SAS             SAS 7+\n>0x9C   string          DATA            data file\n>0x9C   string          CATALOG         catalog\n>0x9C   string          INDEX           data file index\n>0x9C   string          VIEW            data view\n\n# spss magic for SPSS system and portable files, \n#\t from Bruce Foster (bef@nwu.edu).\n\n0\tlong\t\t0xc1e2c3c9\tSPSS Portable File\n>40\tstring \t\tx\t\t%s\n\n0\tstring\t\t$FL2\t\tSPSS System File\n>24\tstring\t\tx\t\t%s\n\n# Macintosh filesystem data\n# From \"Tom N Harris\" <telliamed@mac.com>\n# Fixed HFS+ and Partition map magic: Ethan Benson <erbenson@alaska.net>\n# The MacOS epoch begins on 1 Jan 1904 instead of 1 Jan 1970, so these\n# entries depend on the data arithmetic added after v.35\n# There's also some Pascal strings in here, ditto...\n\n# The boot block signature, according to IM:Files, is \n# \"for HFS volumes, this field always contains the value 0x4C4B.\"\n# But if this is true for MFS or HFS+ volumes, I don't know.\n# Alternatively, the boot block is supposed to be zeroed if it's\n# unused, so a simply >0 should suffice.\n\n0x400\tbeshort\t\t\t0xD2D7\t\tMacintosh MFS data\n>0\tbeshort\t\t\t0x4C4B\t\t(bootable)\n>0x40a\tbeshort\t\t\t&0x8000\t\t(locked)\n>0x402\tbeldate-0x7C25B080\tx\t\tcreated: %s,\n>0x406\tbeldate-0x7C25B080\t>0\t\tlast backup: %s,\n>0x414\tbelong\t\t\tx\t\tblock size: %d,\n>0x412\tbeshort\t\t\tx\t\tnumber of blocks: %d,\n>0x424\tpstring\t\t\tx\t\tvolume name: %s\n\n# \"BD\" is has many false positives\n#0x400\tbeshort\t\t\t0x4244\t\tMacintosh HFS data\n#>0\tbeshort\t\t\t0x4C4B\t\t(bootable)\n#>0x40a\tbeshort\t\t\t&0x8000\t\t(locked)\n#>0x40a\tbeshort\t\t\t^0x0100\t\t(mounted)\n#>0x40a\tbeshort\t\t\t&0x0200\t\t(spared blocks)\n#>0x40a\tbeshort\t\t\t&0x0800\t\t(unclean)\n#>0x47C\tbeshort\t\t\t0x482B\t\t(Embedded HFS+ Volume)\n#>0x402\tbeldate-0x7C25B080\tx\t\tcreated: %s,\n#>0x406\tbeldate-0x7C25B080\tx\t\tlast modified: %s,\n#>0x440\tbeldate-0x7C25B080\t>0\t\tlast backup: %s,\n#>0x414\tbelong\t\t\tx\t\tblock size: %d,\n#>0x412\tbeshort\t\t\tx\t\tnumber of blocks: %d,\n#>0x424\tpstring\t\t\tx\t\tvolume name: %s\n\n0x400\tbeshort\t\t\t0x482B\t\tMacintosh HFS Extended\n>&0\tbeshort\t\t\tx\t\tversion %d data\n>0\tbeshort\t\t\t0x4C4B\t\t(bootable)\n>0x404\tbelong\t\t\t^0x00000100\t(mounted)\n>&2\tbelong\t\t\t&0x00000200\t(spared blocks)\n>&2\tbelong\t\t\t&0x00000800\t(unclean)\n>&2\tbelong\t\t\t&0x00008000\t(locked)\n>&6\tstring\t\t\tx\t\tlast mounted by: '%.4s',\n# really, that should be treated as a belong and we print a string\n# based on the value. TN1150 only mentions '8.10' for \"MacOS 8.1\"\n>&14\tbeldate-0x7C25B080\tx\t\tcreated: %s,\n# only the creation date is local time, all other timestamps in HFS+ are UTC.\n>&18\tbedate-0x7C25B080\tx\t\tlast modified: %s,\n>&22\tbedate-0x7C25B080\t>0\t\tlast backup: %s,\n>&26\tbedate-0x7C25B080\t>0\t\tlast checked: %s,\n>&38\tbelong\t\t\tx\t\tblock size: %d,\n>&42\tbelong\t\t\tx\t\tnumber of blocks: %d,\n>&46\tbelong\t\t\tx\t\tfree blocks: %d\n\n# I don't think this is really necessary since it doesn't do much and \n# anything with a valid driver descriptor will also have a valid\n# partition map\n#0\t\tbeshort\t\t0x4552\t\tApple Device Driver data\n#>&24\t\tbeshort\t\t=1\t\t\\b, MacOS\n\n# Is that the partition type a cstring or a pstring? Well, IM says \"strings \n# shorter than 32 bytes must be terminated with NULL\" so I'll treat it as a \n# cstring. Of course, partitions can contain more than four entries, but \n# what're you gonna do?\n# GRR: This magic is too weak, it is just \"PM\"\n#0x200\t\tbeshort\t\t0x504D\t\tApple Partition data\n#>0x2\t\tbeshort\t\tx\t\t(block size: %d):\n#>0x230\t\tstring\t\tx\t\tfirst type: %s,\n#>0x210\t\tstring\t\tx\t\tname: %s,\n#>0x254\t\tbelong\t\tx\t\tnumber of blocks: %d,\n#>0x400\t\tbeshort\t\t0x504D\t\t\n#>>0x430\t\tstring\t\tx\t\tsecond type: %s,\n#>>0x410\t\tstring\t\tx\t\tname: %s,\n#>>0x454\t\tbelong\t\tx\t\tnumber of blocks: %d,\n#>>0x600\t\tbeshort\t\t0x504D\n#>>>0x630\tstring\t\tx\t\tthird type: %s,\n#>>>0x610\tstring\t\tx\t\tname: %s,\n#>>>0x654\tbelong\t\tx\t\tnumber of blocks: %d,\n#>>0x800\t\tbeshort\t\t0x504D\t\t\n#>>>0x830\tstring\t\tx\t\tfourth type: %s,\n#>>>0x810\tstring\t\tx\t\tname: %s,\n#>>>0x854\tbelong\t\tx\t\tnumber of blocks: %d,\n#>>>0xa00\tbeshort\t\t0x504D\t\t\n#>>>>0xa30\tstring\t\tx\t\tfifth type: %s,\n#>>>>0xa10\tstring\t\tx\t\tname: %s,\n#>>>>0xa54\tbelong\t\tx\t\tnumber of blocks: %d\n#>>>0xc00\tbeshort\t\t0x504D\n#>>>>0xc30\tstring\t\tx\t\tsixth type: %s,\n#>>>>0xc10\tstring\t\tx\t\tname: %s,\n#>>>>0xc54\tbelong\t\tx\t\tnumber of blocks: %d\n## AFAIK, only the signature is different\n#0x200\t\tbeshort\t\t0x5453\t\tApple Old Partition data\n#>0x2\t\tbeshort\t\tx\t\tblock size: %d,\n#>0x230\t\tstring\t\tx\t\tfirst type: %s,\n#>0x210\t\tstring\t\tx\t\tname: %s,\n#>0x254\t\tbelong\t\tx\t\tnumber of blocks: %d,\n#>0x400\t\tbeshort\t\t0x504D\t\t\n#>>0x430\t\tstring\t\tx\t\tsecond type: %s,\n#>>0x410\t\tstring\t\tx\t\tname: %s,\n#>>0x454\t\tbelong\t\tx\t\tnumber of blocks: %d,\n#>>0x800\t\tbeshort\t\t0x504D\t\t\n#>>>0x830\tstring\t\tx\t\tthird type: %s,\n#>>>0x810\tstring\t\tx\t\tname: %s,\n#>>>0x854\tbelong\t\tx\t\tnumber of blocks: %d,\n#>>>0xa00\tbeshort\t\t0x504D\t\t\n#>>>>0xa30\tstring\t\tx\t\tfourth type: %s,\n#>>>>0xa10\tstring\t\tx\t\tname: %s,\n#>>>>0xa54\tbelong\t\tx\t\tnumber of blocks: %d\n\n# From: Remi Mommsen <mommsen@slac.stanford.edu>\n0\t\tstring\t\tBOMStore\tMac OS X bill of materials (BOM) file\n\n#------------------------------------------------------------------------------\n# magic:  file(1) magic for magic files\n#\n0\tstring\t\t#\\ Magic\tmagic text file for file(1) cmd\n0\tlelong\t\t0xF11E041C\tmagic binary file for file(1) cmd\n>4\tlelong\t\tx\t\t(version %d) (little endian)\n0\tbelong\t\t0xF11E041C\tmagic binary file for file(1) cmd\n>4\tbelong\t\tx\t\t(version %d) (big endian)\n#------------------------------------------------------------------------------\n# mail.news:  file(1) magic for mail and news\n#\n# Unfortunately, saved netnews also has From line added in some news software.\n#0\tstring\t\tFrom \t\tmail text\n# There are tests to ascmagic.c to cope with mail and news.\n0\tstring\t\tRelay-Version: \told news text\n!:mime\tmessage/rfc822\n0\tstring\t\t#!\\ rnews\tbatched news text\n!:mime\tmessage/rfc822\n0\tstring\t\tN#!\\ rnews\tmailed, batched news text\n!:mime\tmessage/rfc822\n0\tstring\t\tForward\\ to \tmail forwarding text\n!:mime\tmessage/rfc822\n0\tstring\t\tPipe\\ to \tmail piping text\n!:mime\tmessage/rfc822\n0\tstring\t\tReturn-Path:\tsmtp mail text\n!:mime\tmessage/rfc822\n0\tstring\t\tPath:\t\tnews text\n!:mime\tmessage/news\n0\tstring\t\tXref:\t\tnews text\n!:mime\tmessage/news\n0\tstring\t\tFrom:\t\tnews or mail text\n!:mime\tmessage/rfc822\n0\tstring\t\tArticle \tsaved news text\n!:mime\tmessage/news\n0\tstring\t\tBABYL\t\tEmacs RMAIL text\n0\tstring\t\tReceived:\tRFC 822 mail text\n!:mime\tmessage/rfc822\n0\tstring\t\tMIME-Version:\tMIME entity text\n#0\tstring\t\tContent-\tMIME entity text\n\n# TNEF files...\n0\tlelong\t\t0x223E9F78\tTransport Neutral Encapsulation Format\n\n# From: Kevin Sullivan <ksulliva@psc.edu>\n0\tstring\t\t*mbx*\t\tMBX mail folder\n\n# From: Simon Matter <simon.matter@invoca.ch>\n0\tstring\t\t\\241\\002\\213\\015skiplist\\ file\\0\\0\\0\tCyrus skiplist DB\n\n# JAM(mbp) Fidonet message area databases\n# JHR file\n0\tstring\tJAM\\0\t\t\tJAM message area header file\n>12\tleshort >0\t\t\t(%d messages)\n\n# Squish Fidonet message area databases\n# SQD file (requires at least one message in the area)\n# XXX: Weak magic\n#256\tleshort\t0xAFAE4453\t\tSquish message area data file\n#>4\tleshort\t>0\t\t\t(%d messages)\n\n#0\tstring\t\t\\<!--\\ MHonArc\t\ttext/html; x-type=mhonarc\n\n#------------------------------------------------------------------------------\n# maple:  file(1) magic for maple files\n# \"H. Nanosecond\" <aldomel@ix.netcom.com>\n# Maple V release 4, a multi-purpose math program\n#\n\n# maple library .lib\n0\tstring\t\\000MVR4\\nI\tMapleVr4 library\n\n# .ind\n# no magic for these :-(\n# they are compiled indexes for maple files\n\n# .hdb \n0\tstring\t\\000\\004\\000\\000\tMaple help database\n\n# .mhp\n# this has the form <PACKAGE=name>\n0\tstring\t\\<PACKAGE=\tMaple help file\n0\tstring\t\\<HELP\\ NAME=\tMaple help file\n0\tstring\t\\n\\<HELP\\ NAME=\tMaple help file with extra carriage return at start (yuck)\n#0\tstring\t#\\ Newton\tMaple help file, old style\n0\tstring\t#\\ daub\tMaple help file, old style\n#0\tstring\t#===========\tMaple help file, old style\n\n# .mws\n0\tstring\t\\000\\000\\001\\044\\000\\221\tMaple worksheet\n#this is anomalous\n0\tstring\tWriteNow\\000\\002\\000\\001\\000\\000\\000\\000\\100\\000\\000\\000\\000\\000\tMaple worksheet, but weird\n# this has the form {VERSION 2 3 \"IBM INTEL NT\" \"2.3\" }\\n\n# that is {VERSION major_version miunor_version computer_type version_string}\n0\tstring\t{VERSION\\ \tMaple worksheet\n>9\tstring\t>\\0\tversion %.1s.\n>>>11\tstring\t>\\0\t%.1s\n\n# .mps\n0\tstring\t\\0\\0\\001$\tMaple something\n# from byte 4 it is either 'nul E' or 'soh R'\n# I think 'nul E' means a file that was saved as  a different name\n# a sort of revision marking\n# 'soh R' means new \n>4\tstring\t\\000\\105\tAn old revision\n>4\tstring\t\\001\\122\tThe latest save\n\n# .mpl\n# some of these are the same as .mps above\n#0000000 000 000 001 044 000 105 same as .mps\n#0000000 000 000 001 044 001 122 same as .mps\n\n0\tstring\t#\\n##\\ <SHAREFILE=\tMaple something\n0\tstring\t\\n#\\n##\\ <SHAREFILE=\tMaple something\n0\tstring\t##\\ <SHAREFILE=\tMaple something\n0\tstring\t#\\r##\\ <SHAREFILE=\tMaple something\n0\tstring\t\\r#\\r##\\ <SHAREFILE=\tMaple something\n0\tstring\t#\\ \\r##\\ <DESCRIBE>\tMaple something anomalous.\n\n#------------------------------------------------------------------------------\n# mathcad:  file(1) magic for Mathcad documents\n# URL:\thttp://www.mathsoft.com/\n# From:\tJosh Triplett <josh@freedesktop.org>\n\n0\tstring\t.MCAD\\t\t\tMathcad document\n#------------------------------------------------------------------------------\n# mathematica:  file(1) magic for mathematica files\n# \"H. Nanosecond\" <aldomel@ix.netcom.com>\n# Mathematica a multi-purpose math program\n# versions 2.2 and 3.0\n\n#mathematica .mb\n0\tstring\t\\064\\024\\012\\000\\035\\000\\000\\000\tMathematica version 2 notebook\n0\tstring\t\\064\\024\\011\\000\\035\\000\\000\\000\tMathematica version 2 notebook\n\n# .ma\n# multiple possibilites:\n\n0\tstring\t(*^\\n\\n::[\\011frontEndVersion\\ =\\ \tMathematica notebook\n#>41\tstring\t>\\0\t%s\n\n#0\tstring\t(*^\\n\\n::[\\011palette\tMathematica notebook version 2.x\n\n#0\tstring\t(*^\\n\\n::[\\011Information\tMathematica notebook version 2.x\n#>675\tstring\t>\\0\t%s #doesn't work well\n\n# there may be 'cr' instread of 'nl' in some does this matter?\n\n# generic:\n0\tstring\t(*^\\r\\r::[\\011\tMathematica notebook version 2.x\n0\tstring\t(*^\\r\\n\\r\\n::[\\011\tMathematica notebook version 2.x\n0\tstring\t(*^\\015\t\t\tMathematica notebook version 2.x\n0\tstring\t(*^\\n\\r\\n\\r::[\\011\tMathematica notebook version 2.x\n0\tstring\t(*^\\r::[\\011\tMathematica notebook version 2.x\n0\tstring\t(*^\\r\\n::[\\011\tMathematica notebook version 2.x\n0\tstring\t(*^\\n\\n::[\\011\tMathematica notebook version 2.x\n0\tstring\t(*^\\n::[\\011\tMathematica notebook version 2.x\n\n\n# Mathematica .mx files\n\n#0\tstring\t(*This\\ is\\ a\\ Mathematica\\ binary\\ dump\\ file.\\ It\\ can\\ be\\ loaded\\ with\\ Get.*)\tMathematica binary file\n0\tstring\t(*This\\ is\\ a\\ Mathematica\\ binary\\ \tMathematica binary file\n#>71\tstring \\000\\010\\010\\010\\010\\000\\000\\000\\000\\000\\000\\010\\100\\010\\000\\000\\000\t\n# >71... is optional\n>88\tstring\t>\\0\tfrom %s\n\n\n# Mathematica files PBF:\n# 115 115 101 120 102 106 000 001 000 000 000 203 000 001 000\n0\tstring\tMMAPBF\\000\\001\\000\\000\\000\\203\\000\\001\\000\tMathematica PBF (fonts I think)\n\n# .ml files  These are menu resources I think\n# these start with \"[0-9][0-9][0-9]\\ A~[0-9][0-9][0-9]\\ \n# how to put that into a magic rule?\n4\tstring\t\\ A~\tMAthematica .ml file\n\n# .nb files\n#too long 0\tstring\t(***********************************************************************\\n\\n\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ Mathematica-Compatible Notebook\tMathematica 3.0 notebook\n0\tstring\t(***********************\tMathematica 3.0 notebook\n\n# other (* matches it is a comment start in these langs\n# GRR: Too weak; also matches other languages e.g. ML\n#0\tstring\t(*\tMathematica, or Pascal, Modula-2 or 3 code text\n\n#########################\n# MatLab v5\n0       string  MATLAB  Matlab v5 mat-file\n>126    short   0x494d  (big endian)\n>>124   beshort x       version 0x%04x\n>126    short   0x4d49  (little endian)\n>>124   leshort x       version 0x%04x\n\n\n#------------------------------------------------------------------------------\n# matroska:  file(1) magic for Matroska files\n#\n# See http://www.matroska.org/\n#\n\n# EBML id:\n0\t\tbelong\t\t0x1a45dfa3\n# DocType id:\n>5\t\tbeshort\t\t0x4282\n# DocType contents:\n>>8\t\tstring\t\tmatroska\tMatroska data\n\n#------------------------------------------------------------------------------\n# Mavroyanopoulos Nikos <nmav@hellug.gr>\n# mcrypt:   file(1) magic for mcrypt 2.2.x;\n0\tstring\t\t\\0m\\3\t\tmcrypt 2.5 encrypted data,\n>4\tstring\t\t>\\0\t\talgorithm: %s,\n>>&1\tleshort\t\t>0\t\tkeysize: %d bytes,\n>>>&0\tstring\t\t>\\0\t\tmode: %s,\n\n0\tstring\t\t\\0m\\2\t\tmcrypt 2.2 encrypted data,\n>3\tbyte\t\t0\t\talgorithm: blowfish-448,\n>3\tbyte\t\t1\t\talgorithm: DES,\n>3\tbyte\t\t2\t\talgorithm: 3DES,\n>3\tbyte\t\t3\t\talgorithm: 3-WAY,\n>3\tbyte\t\t4\t\talgorithm: GOST,\n>3\tbyte\t\t6\t\talgorithm: SAFER-SK64,\n>3\tbyte\t\t7\t\talgorithm: SAFER-SK128,\n>3\tbyte\t\t8\t\talgorithm: CAST-128,\n>3\tbyte\t\t9\t\talgorithm: xTEA,\n>3\tbyte\t\t10\t\talgorithm: TWOFISH-128,\n>3\tbyte\t\t11\t\talgorithm: RC2,\n>3\tbyte\t\t12\t\talgorithm: TWOFISH-192,\n>3\tbyte\t\t13\t\talgorithm: TWOFISH-256,\n>3\tbyte\t\t14\t\talgorithm: blowfish-128,\n>3\tbyte\t\t15\t\talgorithm: blowfish-192,\n>3\tbyte\t\t16\t\talgorithm: blowfish-256,\n>3\tbyte\t\t100\t\talgorithm: RC6,\n>3\tbyte\t\t101\t\talgorithm: IDEA,\n>4\tbyte\t\t0\t\tmode: CBC,\n>4\tbyte\t\t1\t\tmode: ECB,\n>4\tbyte\t\t2\t\tmode: CFB,\n>4\tbyte\t\t3\t\tmode: OFB,\n>4\tbyte\t\t4\t\tmode: nOFB,\n>5\tbyte\t\t0\t\tkeymode: 8bit\n>5\tbyte\t\t1\t\tkeymode: 4bit\n>5\tbyte\t\t2\t\tkeymode: SHA-1 hash\n>5\tbyte\t\t3\t\tkeymode: MD5 hash\n\n#------------------------------------------------------------------------------\n# mercurial:  file(1) magic for Mercurial changeset bundles\n# http://www.selenic.com/mercurial/wiki/\n#\n# Jesse Glick (jesse.glick@sun.com)\n#\n\n0\tstring\t\tHG10\t\tMercurial changeset bundle\n>4\tstring\t\tUN\t\t(uncompressed)\n>4\tstring\t\tGZ\t\t(gzip compressed)\n>4\tstring\t\tBZ\t\t(bzip2 compressed)\n#------------------------------------------------------------------------------\n# mime:  file(1) magic for MIME encoded files\n#\n0\tstring\t\tContent-Type:\\ \n>14\tstring\t\t>\\0\t\t%s\n0\tstring\t\tContent-Type:\n>13\tstring\t\t>\\0\t\t%s\n\n#------------------------------------------------------------------------------\n# mips:  file(1) magic for Silicon Graphics (MIPS, IRIS, IRIX, etc.)\n#                         Dec Ultrix (MIPS)\n# all of SGI's *current* machines and OSes run in big-endian mode on the\n# MIPS machines, as far as I know.\n#\n# XXX - what is the blank \"-\" line?\n#\n# kbd file definitions\n0\tstring\tkbd!map\t\tkbd map file\n>8\tbyte\t>0\t\tVer %d:\n>10\tshort\t>0\t\twith %d table(s)\n0\tbelong\t0407\t\told SGI 68020 executable\n0\tbelong\t0410\t\told SGI 68020 pure executable\n0\tbeshort\t0x8765\t\tdisk quotas file\n0\tbeshort\t0x0506\t\tIRIS Showcase file\n>2\tbyte\t0x49\t\t-\n>3\tbyte\tx\t\t- version %ld\n0\tbeshort\t0x0226\t\tIRIS Showcase template\n>2\tbyte\t0x63\t\t-\n>3\tbyte\tx\t\t- version %ld\n0\tbelong\t0x5343464d\tIRIS Showcase file\n>4\tbyte\tx\t\t- version %ld\n0\tbelong\t0x5443464d\tIRIS Showcase template\n>4\tbyte\tx\t\t- version %ld\n0\tbelong\t0xdeadbabe\tIRIX Parallel Arena\n>8\tbelong\t>0\t\t- version %ld\n#\n0\tbeshort\t0x0160\t\tMIPSEB ECOFF executable\n>20\tbeshort\t0407\t\t(impure)\n>20\tbeshort\t0410\t\t(swapped)\n>20\tbeshort\t0413\t\t(paged)\n>8\tbelong\t>0\t\tnot stripped\n>8\tbelong\t0\t\tstripped\n>22\tbyte\tx\t\t- version %ld\n>23\tbyte\tx\t\t\b.%ld\n#\n0\tbeshort\t0x0162\t\tMIPSEL-BE ECOFF executable\n>20\tbeshort\t0407\t\t(impure)\n>20\tbeshort\t0410\t\t(swapped)\n>20\tbeshort\t0413\t\t(paged)\n>8\tbelong\t>0\t\tnot stripped\n>8\tbelong\t0\t\tstripped\n>23\tbyte\tx\t\t- version %d\n>22\tbyte\tx\t\t\b.%ld\n#\n0\tbeshort\t0x6001\t\tMIPSEB-LE ECOFF executable\n>20\tbeshort\t03401\t\t(impure)\n>20\tbeshort\t04001\t\t(swapped)\n>20\tbeshort\t05401\t\t(paged)\n>8\tbelong\t>0\t\tnot stripped\n>8\tbelong\t0\t\tstripped\n>23\tbyte\tx\t\t- version %d\n>22\tbyte\tx\t\t\b.%ld\n#\n0\tbeshort\t0x6201\t\tMIPSEL ECOFF executable\n>20\tbeshort\t03401\t\t(impure)\n>20\tbeshort\t04001\t\t(swapped)\n>20\tbeshort\t05401\t\t(paged)\n>8\tbelong\t>0\t\tnot stripped\n>8\tbelong\t0\t\tstripped\n>23\tbyte\tx\t\t- version %ld\n>22\tbyte\tx\t\t\b.%ld\n#\n# MIPS 2 additions\n#\n0\tbeshort\t0x0163\t\tMIPSEB MIPS-II ECOFF executable\n>20\tbeshort\t0407\t\t(impure)\n>20\tbeshort\t0410\t\t(swapped)\n>20\tbeshort\t0413\t\t(paged)\n>8\tbelong\t>0\t\tnot stripped\n>8\tbelong\t0\t\tstripped\n>22\tbyte\tx\t\t- version %ld\n>23\tbyte\tx\t\t\b.%ld\n#\n0\tbeshort\t0x0166\t\tMIPSEL-BE MIPS-II ECOFF executable\n>20\tbeshort\t0407\t\t(impure)\n>20\tbeshort\t0410\t\t(swapped)\n>20\tbeshort\t0413\t\t(paged)\n>8\tbelong\t>0\t\tnot stripped\n>8\tbelong\t0\t\tstripped\n>22\tbyte\tx\t\t- version %ld\n>23\tbyte\tx\t\t\b.%ld\n#\n0\tbeshort\t0x6301\t\tMIPSEB-LE MIPS-II ECOFF executable\n>20\tbeshort\t03401\t\t(impure)\n>20\tbeshort\t04001\t\t(swapped)\n>20\tbeshort\t05401\t\t(paged)\n>8\tbelong\t>0\t\tnot stripped\n>8\tbelong\t0\t\tstripped\n>23\tbyte\tx\t\t- version %ld\n>22\tbyte\tx\t\t\b.%ld\n#\n0\tbeshort\t0x6601\t\tMIPSEL MIPS-II ECOFF executable\n>20\tbeshort\t03401\t\t(impure)\n>20\tbeshort\t04001\t\t(swapped)\n>20\tbeshort\t05401\t\t(paged)\n>8\tbelong\t>0\t\tnot stripped\n>8\tbelong\t0\t\tstripped\n>23\tbyte\tx\t\t- version %ld\n>22\tbyte\tx\t\t\b.%ld\n#\n# MIPS 3 additions\n#\n0\tbeshort\t0x0140\t\tMIPSEB MIPS-III ECOFF executable\n>20\tbeshort\t0407\t\t(impure)\n>20\tbeshort\t0410\t\t(swapped)\n>20\tbeshort\t0413\t\t(paged)\n>8\tbelong\t>0\t\tnot stripped\n>8\tbelong\t0\t\tstripped\n>22\tbyte\tx\t\t- version %ld\n>23\tbyte\tx\t\t\b.%ld\n#\n0\tbeshort\t0x0142\t\tMIPSEL-BE MIPS-III ECOFF executable\n>20\tbeshort\t0407\t\t(impure)\n>20\tbeshort\t0410\t\t(swapped)\n>20\tbeshort\t0413\t\t(paged)\n>8\tbelong\t>0\t\tnot stripped\n>8\tbelong\t0\t\tstripped\n>22\tbyte\tx\t\t- version %ld\n>23\tbyte\tx\t\t\b.%ld\n#\n0\tbeshort\t0x4001\t\tMIPSEB-LE MIPS-III ECOFF executable\n>20\tbeshort\t03401\t\t(impure)\n>20\tbeshort\t04001\t\t(swapped)\n>20\tbeshort\t05401\t\t(paged)\n>8\tbelong\t>0\t\tnot stripped\n>8\tbelong\t0\t\tstripped\n>23\tbyte\tx\t\t- version %ld\n>22\tbyte\tx\t\t\b.%ld\n#\n0\tbeshort\t0x4201\t\tMIPSEL MIPS-III ECOFF executable\n>20\tbeshort\t03401\t\t(impure)\n>20\tbeshort\t04001\t\t(swapped)\n>20\tbeshort\t05401\t\t(paged)\n>8\tbelong\t>0\t\tnot stripped\n>8\tbelong\t0\t\tstripped\n>23\tbyte\tx\t\t- version %ld\n>22\tbyte\tx\t\t\b.%ld\n#\n0\tbeshort\t0x180\t\tMIPSEB Ucode\n0\tbeshort\t0x182\t\tMIPSEL-BE Ucode\n# 32bit core file\n0\tbelong\t0xdeadadb0\tIRIX core dump\n>4\tbelong\t1\t\tof\n>16\tstring\t>\\0\t\t'%s'\n# 64bit core file\n0\tbelong\t0xdeadad40\tIRIX 64-bit core dump\n>4\tbelong\t1\t\tof\n>16\tstring\t>\\0\t\t'%s'\n# N32bit core file\n0       belong\t0xbabec0bb\tIRIX N32 core dump\n>4      belong\t1               of\n>16     string\t>\\0             '%s'\n# New style crash dump file\n0\tstring\t\\x43\\x72\\x73\\x68\\x44\\x75\\x6d\\x70\tIRIX vmcore dump of\n>36\tstring\t>\\0\t\t\t\t\t'%s'\n# Trusted IRIX info\n0\tstring\tSGIAUDIT\tSGI Audit file\n>8\tbyte\tx\t\t- version %d\n>9\tbyte\tx\t\t\b.%ld\n#\n0\tstring\tWNGZWZSC\tWingz compiled script\n0\tstring\tWNGZWZSS\tWingz spreadsheet\n0\tstring\tWNGZWZHP\tWingz help file\n#\n0\tstring\t#Inventor V\tIRIS Inventor 1.0 file\n0\tstring\t#Inventor V2\tOpen Inventor 2.0 file\n# GLF is OpenGL stream encoding\n0\tstring\tglfHeadMagic();\t\tGLF_TEXT\n4\tbelong\t0x7d000000\t\tGLF_BINARY_LSB_FIRST\n4\tbelong\t0x0000007d\t\tGLF_BINARY_MSB_FIRST\n# GLS is OpenGL stream encoding; GLS is the successor of GLF\n0\tstring\tglsBeginGLS(\t\tGLS_TEXT\n4\tbelong\t0x10000000\t\tGLS_BINARY_LSB_FIRST\n4\tbelong\t0x00000010\t\tGLS_BINARY_MSB_FIRST\n\n#------------------------------------------------------------------------------\n# mirage:  file(1) magic for Mirage executables\n#\n# XXX - byte order?\n#\n0\tlong\t31415\t\tMirage Assembler m.out executable\n#-----------------------------------------------------------------------------\n# misctools:  file(1) magic for miscellaneous UNIX tools.\n#\n0\tsearch/1\t%%!!\t\t\tX-Post-It-Note text\n0\tstring/c\tBEGIN:VCALENDAR\t\tvCalendar calendar file\n0\tstring/c\tBEGIN:VCARD\t\tvCard visiting card\n!:mime\ttext/x-vcard\n\n# From: Alex Beregszaszi <alex@fsn.hu>\n4\tstring\tgtktalog\t\tGNOME Catalogue (gtktalog)\n>13\tstring\t>\\0\t\t\tversion %s\n\n# Summary: Libtool library file\n# Extension: .la\n# Submitted by: Tomasz Trojanowski <tomek@uninet.com.pl>\n0\tsearch/80\t.la\\ -\\ a\\ libtool\\ library\\ file\tlibtool library file\n\n# Summary: Libtool object file\n# Extension: .lo\n# Submitted by: Abel Cheung <abelcheung@gmail.com>\n0\tsearch/80\t.lo\\ -\\ a\\ libtool\\ object\\ file\tlibtool object file\n\n#------------------------------------------------------------------------------\n# mkid:  file(1) magic for mkid(1) databases\n#\n# ID is the binary tags database produced by mkid(1).\n#\n# XXX - byte order?\n#\n0\tstring\t\t\\311\\304\tID tags data\n>2\tshort\t\t>0\t\tversion %d\n\n#------------------------------------------------------------------------------\n# mlssa: file(1) magic for MLSSA datafiles\n#\n0\t\tlelong\t\t0xffffabcd\tMLSSA datafile,\n>4\t\tleshort\t\tx\t\talgorithm %d,\n>10\t\tlelong\t\tx\t\t%d samples\n\n#------------------------------------------------------------------------------\n# mmdf:  file(1) magic for MMDF mail files\n#\n0\tstring\t\\001\\001\\001\\001\tMMDF mailbox\n#------------------------------------------------------------------------------\n# modem:  file(1) magic for modem programs\n#\n# From: Florian La Roche <florian@knorke.saar.de>\n4\tstring\t\tResearch,\tDigifax-G3-File\n>29\tbyte\t\t1\t\t, fine resolution\n>29\tbyte\t\t0\t\t, normal resolution\n\n0\tshort\t\t0x0100\t\traw G3 data, byte-padded\n0\tshort\t\t0x1400\t\traw G3 data\n#\n# Magic data for vgetty voice formats\n# (Martin Seine & Marc Eberhard)\n\n#\n# raw modem data version 1\n#\n0    string    RMD1      raw modem data\n>4   string    >\\0       (%s /\n>20  short     >0        compression type 0x%04x)\n\n#\n# portable voice format 1\n#\n0    string    PVF1\\n         portable voice format\n>5   string    >\\0       (binary %s)\n\n#\n# portable voice format 2\n#\n0    string    PVF2\\n         portable voice format\n>5   string >\\0          (ascii %s)\n\n\n#------------------------------------------------------------------------------\n# motorola:  file(1) magic for Motorola 68K and 88K binaries\n#\n# 68K\n#\n0\tbeshort\t\t0520\t\tmc68k COFF\n>18\tbeshort\t\t^00000020\tobject\n>18\tbeshort\t\t&00000020\texecutable\n>12\tbelong\t\t>0\t\tnot stripped\n>168\tstring\t\t.lowmem\t\tApple toolbox\n>20\tbeshort\t\t0407\t\t(impure)\n>20\tbeshort\t\t0410\t\t(pure)\n>20\tbeshort\t\t0413\t\t(demand paged)\n>20\tbeshort\t\t0421\t\t(standalone)\n0\tbeshort\t\t0521\t\tmc68k executable (shared)\n>12\tbelong\t\t>0\t\tnot stripped\n0\tbeshort\t\t0522\t\tmc68k executable (shared demand paged)\n>12\tbelong\t\t>0\t\tnot stripped\n#\n# Motorola/UniSoft 68K Binary Compatibility Standard (BCS)\n#\n0\tbeshort\t\t0554\t\t68K BCS executable\n#\n# 88K\n#\n# Motorola/88Open BCS\n#\n0\tbeshort\t\t0555\t\t88K BCS executable\n#\n# Motorola S-Records, from Gerd Truschinski <gt@freebsd.first.gmd.de>\n0   string      S0          Motorola S-Record; binary data in text format\n\n# ATARI ST relocatable PRG\n#\n# from Oskar Schirmer <schirmer@scara.com> Feb 3, 2001\n# (according to Roland Waldi, Oct 21, 1987)\n# besides the magic 0x601a, the text segment size is checked to be\n# not larger than 1 MB (which is a lot on ST).\n# The additional 0x601b distinction I took from Doug Lee's magic.\n0\tbelong&0xFFFFFFF0\t0x601A0000\tAtari ST M68K contiguous executable\n>2\tbelong\t\t\tx\t\t(txt=%ld,\n>6\tbelong\t\t\tx\t\tdat=%ld,\n>10\tbelong\t\t\tx\t\tbss=%ld,\n>14\tbelong\t\t\tx\t\tsym=%ld)\n0\tbelong&0xFFFFFFF0\t0x601B0000\tAtari ST M68K non-contig executable\n>2\tbelong\t\t\tx\t\t(txt=%ld,\n>6\tbelong\t\t\tx\t\tdat=%ld,\n>10\tbelong\t\t\tx\t\tbss=%ld,\n>14\tbelong\t\t\tx\t\tsym=%ld)\n\n# Atari ST/TT... program format (sent by Wolfram Kleff <kleff@cs.uni-bonn.de>)\n0       beshort         0x601A          Atari 68xxx executable,\n>2      belong          x               text len %lu,\n>6      belong          x               data len %lu,\n>10     belong          x               BSS len %lu,\n>14     belong          x               symboltab len %lu,\n>18     belong          0\n>22     belong          &0x01           fastload flag,\n>22     belong          &0x02           may be loaded to alternate RAM,\n>22     belong          &0x04           malloc may be from alternate RAM,\n>22     belong          x               flags: 0x%lX,\n>26     beshort         0               no relocation tab\n>26     beshort         !0              + relocation tab\n>30     string          SFX             [Self-Extracting LZH SFX archive]\n>38     string          SFX             [Self-Extracting LZH SFX archive]\n>44     string          ZIP!            [Self-Extracting ZIP SFX archive]\n\n0       beshort         0x0064          Atari 68xxx CPX file\n>8      beshort         x               (version %04lx)\n\n#------------------------------------------------------------------------------\n# mozilla:  file(1) magic for Mozilla XUL fastload files \n# (XUL.mfasl and XPC.mfasl)\n# URL:\thttp://www.mozilla.org/\n# From:\tJosh Triplett <josh@freedesktop.org>\n\n0\tstring\tXPCOM\\nMozFASL\\r\\n\\x1A\t\tMozilla XUL fastload data\n\n#------------------------------------------------------------------------------\n# msdos:  file(1) magic for MS-DOS files\n#\n\n# .BAT files (Daniel Quinlan, quinlan@yggdrasil.com)\n# updated by Joerg Jenderek at Oct 2008\n0\tstring\t@\t\t\t\n>1\tstring/cB\t\\ echo\\ off\tDOS batch file text\n!:mime\ttext/x-msdos-batch\n>1\tstring/cB\techo\\ off\tDOS batch file text\n!:mime\ttext/x-msdos-batch\n>1\tstring/cB\trem\\ \t\tDOS batch file text\n!:mime\ttext/x-msdos-batch\n>1\tstring/cB\tset\\ \t\tDOS batch file text\n!:mime\ttext/x-msdos-batch\n\n\n# OS/2 batch files are REXX. the second regex is a bit generic, oh well\n# the matched commands seem to be common in REXX and uncommon elsewhere\n100\tregex/c =^[\\ \\t]{0,10}call[\\ \\t]{1,10}rxfunc OS/2 REXX batch file text\n100\tregex/c =^[\\ \\t]{0,10}say\\ ['\"]\t     OS/2 REXX batch file text\n\n0\tleshort\t\t0x14c\tMS Windows COFF Intel 80386 object file\n#>4\tledate\t\tx\tstamp %s\n0\tleshort\t\t0x166\tMS Windows COFF MIPS R4000 object file\n#>4\tledate\t\tx\tstamp %s\n0\tleshort\t\t0x184\tMS Windows COFF Alpha object file\n#>4\tledate\t\tx\tstamp %s\n0\tleshort\t\t0x268\tMS Windows COFF Motorola 68000 object file\n#>4\tledate\t\tx\tstamp %s\n0\tleshort\t\t0x1f0\tMS Windows COFF PowerPC object file\n#>4\tledate\t\tx\tstamp %s\n0\tleshort\t\t0x290\tMS Windows COFF PA-RISC object file\n#>4\tledate\t\tx\tstamp %s\n\n# XXX - according to Microsoft's spec, at an offset of 0x3c in a\n# PE-format executable is the offset in the file of the PE header;\n# unfortunately, that's a little-endian offset, and there's no way\n# to specify an indirect offset with a specified byte order.\n# So, for now, we assume the standard MS-DOS stub, which puts the\n# PE header at 0x80 = 128.\n#\n# Required OS version and subsystem version were 4.0 on some NT 3.51\n# executables built with Visual C++ 4.0, so it's not clear that\n# they're interesting.\tThe user version was 0.0, but there's\n# probably some linker directive to set it.  The linker version was\n# 3.0, except for one \".exe\" which had it as 4.20 (same damn linker!).\n#\n# many of the compressed formats were extraced from IDARC 1.23 source code\n#\n0\tstring\tMZ\n!:mime\tapplication/x-dosexec\n>0x18  leshort <0x40 MS-DOS executable\n>0 string MZ\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0PE\\0\\0 \\b, PE for MS Windows\n>>&18\tleshort&0x2000\t>0\t(DLL)\n>>&88\tleshort\t\t0\t(unknown subsystem)\n>>&88\tleshort\t\t1\t(native)\n>>&88\tleshort\t\t2\t(GUI)\n>>&88\tleshort\t\t3\t(console)\n>>&88\tleshort\t\t7\t(POSIX)\n>>&0\tleshort\t\t0x0\tunknown processor\n>>&0\tleshort\t\t0x14c\tIntel 80386\n>>&0\tleshort\t\t0x166\tMIPS R4000\n>>&0\tleshort\t\t0x184\tAlpha\n>>&0\tleshort\t\t0x268\tMotorola 68000\n>>&0\tleshort\t\t0x1f0\tPowerPC\n>>&0\tleshort\t\t0x290\tPA-RISC\n>>&18\tleshort&0x0100\t>0\t32-bit\n>>&18\tleshort&0x1000\t>0\tsystem file\n>>&0xf4 search/0x140 \\x0\\x40\\x1\\x0\n>>>(&0.l+(4)) string MSCF \\b, WinHKI CAB self-extracting archive\n>30\t\tstring\tCopyright\\ 1989-1990\\ PKWARE\\ Inc.\tSelf-extracting PKZIP archive\n!:mime\tapplication/zip\n# Is next line correct? One might expect \"Corp.\" not \"Copr.\" If it is right, add a note to that effect.\n>30\t\tstring\tPKLITE\\ Copr.\tSelf-extracting PKZIP archive\n!:mime\tapplication/zip\n\n>0x18  leshort >0x3f\n>>(0x3c.l) string PE\\0\\0 PE\n>>>(0x3c.l+25) byte\t\t1 \\b32 executable\n>>>(0x3c.l+25) byte\t\t2 \\b32+ executable\n# hooray, there's a DOS extender using the PE format, with a valid PE\n# executable inside (which just prints a message and exits if run in win)\n>>>(0x3c.l+92)\tleshort\t\t<10\n>>>>(8.s*16) string 32STUB for MS-DOS, 32rtm DOS extender\n>>>>(8.s*16) string !32STUB for MS Windows\n>>>>>(0x3c.l+22)\tleshort&0x2000\t>0\t(DLL)\n>>>>>(0x3c.l+92)\tleshort\t\t0\t(unknown subsystem)\n>>>>>(0x3c.l+92)\tleshort\t\t1\t(native)\n>>>>>(0x3c.l+92)\tleshort\t\t2\t(GUI)\n>>>>>(0x3c.l+92)\tleshort\t\t3\t(console)\n>>>>>(0x3c.l+92)\tleshort\t\t7\t(POSIX)\n>>>(0x3c.l+92)\tleshort\t\t10\t(EFI application)\n>>>(0x3c.l+92)\tleshort\t\t11\t(EFI boot service driver)\n>>>(0x3c.l+92)\tleshort\t\t12\t(EFI runtime driver)\n>>>(0x3c.l+92)\tleshort\t\t13\t(XBOX)\n>>>(0x3c.l+4)\tleshort\t\t0x0\tunknown processor\n>>>(0x3c.l+4)\tleshort\t\t0x14c\tIntel 80386\n>>>(0x3c.l+4)\tleshort\t\t0x166\tMIPS R4000\n>>>(0x3c.l+4)\tleshort\t\t0x184\tAlpha\n>>>(0x3c.l+4)\tleshort\t\t0x268\tMotorola 68000\n>>>(0x3c.l+4)\tleshort\t\t0x1f0\tPowerPC\n>>>(0x3c.l+4)\tleshort\t\t0x290\tPA-RISC\n>>>(0x3c.l+4)\tleshort\t\t0x200\tIntel Itanium\n>>>(0x3c.l+22)\tleshort&0x0100\t>0\t32-bit\n>>>(0x3c.l+22)\tleshort&0x1000\t>0\tsystem file\n>>>(0x3c.l+232) lelong\t>0\tMono/.Net assembly\n\n>>>>(0x3c.l+0xf8)\tstring\t\tUPX0 \\b, UPX compressed\n>>>>(0x3c.l+0xf8)\tsearch/0x140\tPEC2 \\b, PECompact2 compressed\n>>>>(0x3c.l+0xf8)\tsearch/0x140\tUPX2\n>>>>>(&0x10.l+(-4))\tstring\t\tPK\\3\\4 \\b, ZIP self-extracting archive (Info-Zip)\n>>>>(0x3c.l+0xf8)\tsearch/0x140\t.idata\n>>>>>(&0xe.l+(-4))\tstring\t\tPK\\3\\4 \\b, ZIP self-extracting archive (Info-Zip)\n>>>>>(&0xe.l+(-4))\tstring\t\tZZ0 \\b, ZZip self-extracting archive\n>>>>>(&0xe.l+(-4))\tstring\t\tZZ1 \\b, ZZip self-extracting archive\n>>>>(0x3c.l+0xf8)\tsearch/0x140\t.rsrc\n>>>>>(&0x0f.l+(-4))\tstring\t\ta\\\\\\4\\5 \\b, WinHKI self-extracting archive\n>>>>>(&0x0f.l+(-4))\tstring\t\tRar! \\b, RAR self-extracting archive\n>>>>>(&0x0f.l+(-4))\tsearch/0x3000\tMSCF \\b, InstallShield self-extracting archive\n>>>>>(&0x0f.l+(-4))\tsearch/32\tNullsoft \\b, Nullsoft Installer self-extracting archive\n>>>>(0x3c.l+0xf8)\tsearch/0x140\t.data\n>>>>>(&0x0f.l)\t\tstring\t\tWEXTRACT \\b, MS CAB-Installer self-extracting archive\n>>>>(0x3c.l+0xf8)\tsearch/0x140\t.petite\\0 \\b, Petite compressed\n>>>>>(0x3c.l+0xf7)\tbyte\t\tx\n>>>>>>(&0x104.l+(-4))\tstring\t\t=!sfx! \\b, ACE self-extracting archive\n>>>>(0x3c.l+0xf8)\tsearch/0x140\t.WISE \\b, WISE installer self-extracting archive\n>>>>(0x3c.l+0xf8)\tsearch/0x140\t.dz\\0\\0\\0 \\b, Dzip self-extracting archive\n>>>>(0x3c.l+0xf8)\tsearch/0x140\t.reloc\n>>>>>(&0xe.l+(-4))\tsearch/0x180\tPK\\3\\4 \\b, ZIP self-extracting archive (WinZip)\n\n>>>>&(0x3c.l+0xf8)\tsearch/0x100\t_winzip_ \\b, ZIP self-extracting archive (WinZip)\n>>>>&(0x3c.l+0xf8)\tsearch/0x100\tSharedD \\b, Microsoft Installer self-extracting archive\n>>>>0x30\t\tstring\t\tInno \\b, InnoSetup self-extracting archive\n\n>>(0x3c.l) string !PE\\0\\0 MS-DOS executable\n\n>>(0x3c.l)\t\tstring\t\tNE \\b, NE\n>>>(0x3c.l+0x36)\tbyte\t\t0 (unknown OS)\n>>>(0x3c.l+0x36)\tbyte\t\t1 for OS/2 1.x\n>>>(0x3c.l+0x36)\tbyte\t\t2 for MS Windows 3.x\n>>>(0x3c.l+0x36)\tbyte\t\t3 for MS-DOS\n>>>(0x3c.l+0x36)\tbyte\t\t>3 (unknown OS)\n>>>(0x3c.l+0x36)\tbyte\t\t0x81 for MS-DOS, Phar Lap DOS extender\n>>>(0x3c.l+0x0c)\tleshort&0x8003\t0x8002 (DLL)\n>>>(0x3c.l+0x0c)\tleshort&0x8003\t0x8001 (driver)\n>>>&(&0x24.s-1)\t\tstring\t\tARJSFX \\b, ARJ self-extracting archive\n>>>(0x3c.l+0x70)\tsearch/0x80\tWinZip(R)\\ Self-Extractor \\b, ZIP self-extracting archive (WinZip)\n\n>>(0x3c.l)\t\tstring\t\tLX\\0\\0 \\b, LX\n>>>(0x3c.l+0x0a)\tleshort\t\t<1 (unknown OS)\n>>>(0x3c.l+0x0a)\tleshort\t\t1 for OS/2\n>>>(0x3c.l+0x0a)\tleshort\t\t2 for MS Windows\n>>>(0x3c.l+0x0a)\tleshort\t\t3 for DOS\n>>>(0x3c.l+0x0a)\tleshort\t\t>3 (unknown OS)\n>>>(0x3c.l+0x10)\tlelong&0x28000\t=0x8000 (DLL)\n>>>(0x3c.l+0x10)\tlelong&0x20000\t>0 (device driver)\n>>>(0x3c.l+0x10)\tlelong&0x300\t0x300 (GUI)\n>>>(0x3c.l+0x10)\tlelong&0x28300\t<0x300 (console)\n>>>(0x3c.l+0x08)\tleshort\t\t1 i80286\n>>>(0x3c.l+0x08)\tleshort\t\t2 i80386\n>>>(0x3c.l+0x08)\tleshort\t\t3 i80486\n>>>(8.s*16)\t\tstring\t\temx \\b, emx\n>>>>&1\t\t\tstring\t\tx %s\n>>>&(&0x54.l-3)\t\tstring\t\tarjsfx \\b, ARJ self-extracting archive\n\n# MS Windows system file, supposedly a collection of LE executables\n>>(0x3c.l)\t\tstring\t\tW3 \\b, W3 for MS Windows\n\n>>(0x3c.l)\t\tstring\t\tLE\\0\\0 \\b, LE executable\n>>>(0x3c.l+0x0a)\tleshort\t\t1\n# some DOS extenders use LE files with OS/2 header\n>>>>0x240\t\tsearch/0x100\tDOS/4G for MS-DOS, DOS4GW DOS extender\n>>>>0x240\t\tsearch/0x200\tWATCOM\\ C/C++ for MS-DOS, DOS4GW DOS extender\n>>>>0x440\t\tsearch/0x100\tCauseWay\\ DOS\\ Extender for MS-DOS, CauseWay DOS extender\n>>>>0x40\t\tsearch/0x40\tPMODE/W for MS-DOS, PMODE/W DOS extender\n>>>>0x40\t\tsearch/0x40\tSTUB/32A for MS-DOS, DOS/32A DOS extender (stub)\n>>>>0x40\t\tsearch/0x80\tSTUB/32C for MS-DOS, DOS/32A DOS extender (configurable stub)\n>>>>0x40\t\tsearch/0x80\tDOS/32A for MS-DOS, DOS/32A DOS extender (embedded)\n# this is a wild guess; hopefully it is a specific signature\n>>>>&0x24\t\tlelong\t\t<0x50\n>>>>>(&0x4c.l)\t\tstring\t\t\\xfc\\xb8WATCOM\n>>>>>>&0\t\tsearch/8\t3\\xdbf\\xb9 \\b, 32Lite compressed\n# another wild guess: if real OS/2 LE executables exist, they probably have higher start EIP\n#>>>>(0x3c.l+0x1c)\tlelong\t\t>0x10000 for OS/2\n# fails with DOS-Extenders.\n>>>(0x3c.l+0x0a)\tleshort\t\t2 for MS Windows\n>>>(0x3c.l+0x0a)\tleshort\t\t3 for DOS\n>>>(0x3c.l+0x0a)\tleshort\t\t4 for MS Windows (VxD)\n>>>(&0x7c.l+0x26)\tstring\t\tUPX \\b, UPX compressed\n>>>&(&0x54.l-3)\t\tstring\t\tUNACE \\b, ACE self-extracting archive\n\n# looks like ASCII, probably some embedded copyright message.\n# and definitely not NE/LE/LX/PE\n>>0x3c\t\tlelong\t>0x20000000\n>>>(4.s*512)\tleshort !0x014c \\b, MZ for MS-DOS\n# header data too small for extended executable\n>2\t\tlong\t!0\n>>0x18\t\tleshort <0x40\n>>>(4.s*512)\tleshort !0x014c\n\n>>>>&(2.s-514)\tstring\t!LE\n>>>>>&-2\tstring\t!BW \\b, MZ for MS-DOS\n>>>>&(2.s-514)\tstring\tLE \\b, LE\n>>>>>0x240\tsearch/0x100\tDOS/4G for MS-DOS, DOS4GW DOS extender\n# educated guess since indirection is still not capable enough for complex offset\n# calculations (next embedded executable would be at &(&2*512+&0-2)\n# I suspect there are only LE executables in these multi-exe files\n>>>>&(2.s-514)\tstring\tBW\n>>>>>0x240\tsearch/0x100\tDOS/4G ,\\b LE for MS-DOS, DOS4GW DOS extender (embedded)\n>>>>>0x240\tsearch/0x100\t!DOS/4G ,\\b BW collection for MS-DOS\n\n# This sequence skips to the first COFF segment, usually .text\n>(4.s*512)\tleshort\t\t0x014c \\b, COFF\n>>(8.s*16)\tstring\t\tgo32stub for MS-DOS, DJGPP go32 DOS extender\n>>(8.s*16)\tstring\t\temx\n>>>&1\t\tstring\t\tx for DOS, Win or OS/2, emx %s\n>>&(&0x42.l-3)\tbyte\t\tx \n>>>&0x26\tstring\t\tUPX \\b, UPX compressed\n# and yet another guess: small .text, and after large .data is unusal, could be 32lite\n>>&0x2c\t\tsearch/0xa0\t.text\n>>>&0x0b\tlelong\t\t<0x2000\n>>>>&0\t\tlelong\t\t>0x6000 \\b, 32lite compressed\n\n>(8.s*16) string $WdX \\b, WDos/X DOS extender\n\n# .EXE formats (Greg Roelofs, newt@uchicago.edu)\n#\n>0x35\tstring\t\\x8e\\xc0\\xb9\\x08\\x00\\xf3\\xa5\\x4a\\x75\\xeb\\x8e\\xc3\\x8e\\xd8\\x33\\xff\\xbe\\x30\\x00\\x05 \\b, aPack compressed\n>0xe7\tstring\tLH/2\\ Self-Extract \\b, %s\n>0x1c\tstring\tdiet \\b, diet compressed\n>0x1c\tstring\tLZ09 \\b, LZEXE v0.90 compressed\n>0x1c\tstring\tLZ91 \\b, LZEXE v0.91 compressed\n>0x1c\tstring\ttz \\b, TinyProg compressed\n>0x1e\tstring\tPKLITE \\b, %s compressed\n>0x64\tstring\tW\\ Collis\\0\\0 \\b, Compack compressed\n>0x24\tstring\tLHa's\\ SFX \\b, LHa self-extracting archive\n!:mime\tapplication/x-lha\n>0x24\tstring\tLHA's\\ SFX \\b, LHa self-extracting archive\n!:mime\tapplication/x-lha\n>0x24\tstring\t\\ $ARX \\b, ARX self-extracting archive\n>0x24\tstring\t\\ $LHarc \\b, LHarc self-extracting archive\n>0x20\tstring\tSFX\\ by\\ LARC \\b, LARC self-extracting archive\n>1638\tstring\t-lh5- \\b, LHa self-extracting archive v2.13S\n>0x17888 string Rar! \\b, RAR self-extracting archive\n>0x40\tstring aPKG \\b, aPackage self-extracting archive\n\n>32\t string AIN\n>>35\t string 2\t\t\\b, AIN 2.x compressed\n>>35\t string <2\t\t\\b, AIN 1.x compressed\n>>35\t string >2\t\t\\b, AIN 1.x compressed\n>28\t string UC2X\t\t\\b, UCEXE compressed\n>28\t string WWP\\  \t\t\\b, WWPACK compressed\n\n# skip to the end of the exe\n>(4.s*512)\tlong\tx \n>>&(2.s-517)\tbyte\tx \n>>>&0\tstring\t\tPK\\3\\4 \\b, ZIP self-extracting archive\n>>>&0\tstring\t\tRar! \\b, RAR self-extracting archive\n>>>&0\tstring\t\t=!\\x11 \\b, AIN 2.x self-extracting archive\n>>>&0\tstring\t\t=!\\x12 \\b, AIN 2.x self-extracting archive\n>>>&0\tstring\t\t=!\\x17 \\b, AIN 1.x self-extracting archive\n>>>&0\tstring\t\t=!\\x18 \\b, AIN 1.x self-extracting archive\n>>>&7\tsearch/400\t**ACE** \\b, ACE self-extracting archive\n>>>&0\tsearch/0x480\tUC2SFX\\ Header \\b, UC2 self-extracting archive\n\n>0x1c\tstring\t\tRJSX \\b, ARJ self-extracting archive\n# winarj stores a message in the stub instead of the sig in the MZ header\n>0x20\tsearch/0xe0\taRJsfX \\b, ARJ self-extracting archive\n\n# a few unknown ZIP sfxes, no idea if they are needed or if they are\n# already captured by the generic patterns above\n>122\t\tstring\t\tWindows\\ self-extracting\\ ZIP\t\\b, ZIP self-extracting archive\n>(8.s*16)\tsearch/0x20\tPKSFX \\b, ZIP self-extracting archive (PKZIP)\n# TODO: how to add this? >FileSize-34 string Windows\\ Self-Installing\\ Executable \\b, ZIP self-extracting archive\n#\n\n# TELVOX Teleinformatica CODEC self-extractor for OS/2:\n>49801\tstring\t\\x79\\xff\\x80\\xff\\x76\\xff\t\\b, CODEC archive v3.21\n>>49824 leshort\t\t=1\t\t\t\\b, 1 file\n>>49824 leshort\t\t>1\t\t\t\\b, %u files\n\n# .COM formats (Daniel Quinlan, quinlan@yggdrasil.com)\n# Uncommenting only the first two lines will cover about 2/3 of COM files,\n# but it isn't feasible to match all COM files since there must be at least\n# two dozen different one-byte \"magics\".\n# test too generic ?\n0\tbyte\t\t0xe9\t\tDOS executable (COM)\n>0x1FE leshort\t\t0xAA55\t\t\\b, boot code\n>6\tstring\t\tSFX\\ of\\ LHarc\t(%s)\n0\tbelong\t0xffffffff\t\tDOS executable (device driver)\n#CMD640X2.SYS\n>10\tstring\t>\\x23\t\t\t\n>>10\tstring\t!\\x2e\t\t\t\n>>>17\tstring\t<\\x5B\t\t\t\n>>>>10\tstring\tx\t\t\t\\b, name: %.8s\n#UDMA.SYS KEYB.SYS CMD640X2.SYS\n>10\tstring\t<\\x41\t\t\t\n>>12\tstring\t>\\x40\t\t\t\n>>>10\tstring\t!$\t\t\t\n>>>>12\tstring\tx\t\t\t\\b, name: %.8s\n#BTCDROM.SYS ASPICD.SYS\n>22\tstring\t>\\x40\t\t\t\n>>22\tstring\t<\\x5B\t\t\t\n>>>23\tstring\t<\\x5B\t\t\t\n>>>>22\tstring\tx\t\t\t\\b, name: %.8s\n#ATAPICD.SYS\n>76\tstring\t\\0\t\t\t\n>>77\tstring\t>\\x40\t\t\t\n>>>77\tstring\t<\\x5B\t\t\t\n>>>>77\tstring\tx\t\t\t\\b, name: %.8s\n# test too generic ?\n0\tbyte\t\t0x8c\t\tDOS executable (COM)\n# updated by Joerg Jenderek at Oct 2008\n0\tulelong\t\t0xffff10eb\tDR-DOS executable (COM)\n# byte 0xeb conflicts with \"sequent\" magic leshort 0xn2eb\n0\tubeshort&0xeb8d\t>0xeb00\t\t\n# DR-DOS STACKER.COM SCREATE.SYS missed\n>0\tbyte\t\t0xeb\t\tDOS executable (COM)\n>>0x1FE leshort\t\t0xAA55\t\t\\b, boot code\n>>85\tstring\t\tUPX\t\t\\b, UPX compressed\n>>4\tstring\t\t\\ $ARX\t\t\\b, ARX self-extracting archive\n>>4\tstring\t\t\\ $LHarc\t\\b, LHarc self-extracting archive\n>>0x20e string\t\tSFX\\ by\\ LARC\t\\b, LARC self-extracting archive\n# updated by Joerg Jenderek at Oct 2008\n#0\tbyte\t\t0xb8\t\tCOM executable\n0\tuleshort&0x80ff\t0x00b8\t\t\n# modified by Joerg Jenderek\n>1\tlelong\t\t!0x21cd4cff\tCOM executable for DOS\n# http://syslinux.zytor.com/comboot.php\n# (32-bit COMBOOT) programs *.C32 contain 32-bit code and run in flat-memory 32-bit protected mode\n# start with assembler instructions mov eax,21cd4cffh\n0\tuleshort&0xc0ff\t0xc0b8\t\t\n>1\tlelong\t\t0x21cd4cff\tCOM executable (32-bit COMBOOT)\n0\tstring\t\\x81\\xfc\t\t\n>4\tstring\t\\x77\\x02\\xcd\\x20\\xb9\t\n>>36\tstring\tUPX!\t\t\tFREE-DOS executable (COM), UPX compressed\n252\tstring Must\\ have\\ DOS\\ version DR-DOS executable (COM)\n# added by Joerg Jenderek at Oct 2008\n# GRR search is not working\n#34\tsearch/2\tUPX!\t\tFREE-DOS executable (COM), UPX compressed\n34\tstring\tUPX!\t\t\tFREE-DOS executable (COM), UPX compressed\n35\tstring\tUPX!\t\t\tFREE-DOS executable (COM), UPX compressed\n# GRR search is not working\n#2\tsearch/28\t\\xcd\\x21\tCOM executable for MS-DOS\n#WHICHFAT.cOM\n2\tstring\t\\xcd\\x21\t\tCOM executable for DOS\n#DELTREE.cOM DELTREE2.cOM\n4\tstring\t\\xcd\\x21\t\tCOM executable for DOS\n#IFMEMDSK.cOM ASSIGN.cOM COMP.cOM\n5\tstring\t\\xcd\\x21\t\tCOM executable for DOS\n#DELTMP.COm HASFAT32.cOM\n7\tstring\t\\xcd\\x21\t\t\n>0\tbyte\t!0xb8\t\t\tCOM executable for DOS\n#COMP.cOM MORE.COm\n10\tstring\t\\xcd\\x21\t\t\n>5\tstring\t!\\xcd\\x21\t\tCOM executable for DOS\n#comecho.com\n13\tstring\t\\xcd\\x21\t\tCOM executable for DOS\n#HELP.COm EDIT.coM\n18\tstring\t\\xcd\\x21\t\tCOM executable for MS-DOS\n#NWRPLTRM.COm\n23\tstring\t\\xcd\\x21\t\tCOM executable for MS-DOS\n#LOADFIX.cOm LOADFIX.cOm\n30\tstring\t\\xcd\\x21\t\tCOM executable for MS-DOS\n#syslinux.com 3.11\n70\tstring\t\\xcd\\x21\t\tCOM executable for DOS\n# many compressed/converted COMs start with a copy loop instead of a jump\n0x6\tsearch/0xa\t\\xfc\\x57\\xf3\\xa5\\xc3\tCOM executable for MS-DOS\n0x6\tsearch/0xa\t\\xfc\\x57\\xf3\\xa4\\xc3\tCOM executable for DOS\n>0x18\tsearch/0x10\t\\x50\\xa4\\xff\\xd5\\x73\t\\b, aPack compressed\n0x3c\tstring\t\tW\\ Collis\\0\\0\t\tCOM executable for MS-DOS, Compack compressed\n# FIXME: missing diet .com compression\n\n# miscellaneous formats\n0\tstring\t\tLZ\t\tMS-DOS executable (built-in)\n#0\tbyte\t\t0xf0\t\tMS-DOS program library data\n#\n\n# AAF files:\n# <stuartc@rd.bbc.co.uk> Stuart Cunningham\n0\tstring\t\\320\\317\\021\\340\\241\\261\\032\\341AAFB\\015\\000OM\\006\\016\\053\\064\\001\\001\\001\\377\t\t\tAAF legacy file using MS Structured Storage\n>30\tbyte\t9\t\t(512B sectors)\n>30\tbyte\t12\t\t(4kB sectors)\n0\tstring\t\\320\\317\\021\\340\\241\\261\\032\\341\\001\\002\\001\\015\\000\\002\\000\\000\\006\\016\\053\\064\\003\\002\\001\\001\t\t\tAAF file using MS Structured Storage\n>30\tbyte\t9\t\t(512B sectors)\n>30\tbyte\t12\t\t(4kB sectors)\n\n# Popular applications\n2080\tstring\tMicrosoft\\ Word\\ 6.0\\ Document\t%s\n!:mime\tapplication/msword\n2080\tstring\tDocumento\\ Microsoft\\ Word\\ 6 Spanish Microsoft Word 6 document data\n!:mime\tapplication/msword\n# Pawel Wiecek <coven@i17linuxb.ists.pwr.wroc.pl> (for polish Word)\n2112\tstring\tMSWordDoc\t\t\tMicrosoft Word document data\n!:mime\tapplication/msword\n#\n0\tbelong\t0x31be0000\t\t\tMicrosoft Word Document\n!:mime\tapplication/msword\n#\n0\tstring\tPO^Q`\t\t\t\tMicrosoft Word 6.0 Document\n!:mime\tapplication/msword\n#\n0\tstring\t\\376\\067\\0\\043\t\t\tMicrosoft Office Document\n!:mime\tapplication/msword\n0\tstring\t\\333\\245-\\0\\0\\0\t\t\tMicrosoft Office Document\n!:mime\tapplication/msword\n512\tstring\t\t\\354\\245\\301\t\tMicrosoft Word Document\n!:mime\tapplication/msword\n#\n2080\tstring\tMicrosoft\\ Excel\\ 5.0\\ Worksheet\t%s\n!:mime\tapplication/vnd.ms-excel\n\n2080\tstring\tFoglio\\ di\\ lavoro\\ Microsoft\\ Exce\t%s\n!:mime\tapplication/vnd.ms-excel\n#\n# Pawel Wiecek <coven@i17linuxb.ists.pwr.wroc.pl> (for polish Excel)\n2114\tstring\tBiff5\t\tMicrosoft Excel 5.0 Worksheet\n!:mime\tapplication/vnd.ms-excel\n# Italian MS-Excel\n2121\tstring\tBiff5\t\tMicrosoft Excel 5.0 Worksheet\n!:mime\tapplication/vnd.ms-excel\n0\tstring\t\\x09\\x04\\x06\\x00\\x00\\x00\\x10\\x00\tMicrosoft Excel Worksheet\n!:mime\tapplication/vnd.ms-excel\n#\n0\tbelong\t0x00001a00\tLotus 1-2-3\n!:mime\tapplication/x-123\n>4\tbelong\t0x00100400\twk3 document data\n>4\tbelong\t0x02100400\twk4 document data\n>4\tbelong\t0x07800100\tfm3 or fmb document data\n>4\tbelong\t0x07800000\tfm3 or fmb document data\n#\n0\tbelong\t0x00000200\tLotus 1-2-3\n!:mime\tapplication/x-123\n>4\tbelong\t0x06040600\twk1 document data\n>4\tbelong\t0x06800200\tfmt document data\n0\tstring\t\tWordPro\\0\tLotus WordPro\n!:mime\tapplication/vnd.lotus-wordpro\n0\tstring\t\tWordPro\\r\\373\tLotus WordPro\n!:mime\tapplication/vnd.lotus-wordpro\n\n\n# Summary: Script used by InstallScield to uninstall applications\n# Extension: .isu\n# Submitted by: unknown\n# Modified by (1): Abel Cheung <abelcheung@gmail.com> (replace useless entry)\n0\t\tstring\t\t\\x71\\xa8\\x00\\x00\\x01\\x02\n>12\t\tstring\t\tStirling\\ Technologies,\t\tInstallShield Uninstall Script\n\n# Winamp .avs\n#0\tstring\tNullsoft\\ AVS\\ Preset\\ \\060\\056\\061\\032 A plug in for Winamp ms-windows Freeware media player\n0\tstring\tNullsoft\\ AVS\\ Preset\\ \tWinamp plug in\n\n# Windows Metafont .WMF\n0\tstring\t\\327\\315\\306\\232\tms-windows metafont .wmf\n0\tstring\t\\002\\000\\011\\000\tms-windows metafont .wmf\n0\tstring\t\\001\\000\\011\\000\tms-windows metafont .wmf\n\n#tz3 files whatever that is (MS Works files)\n0\tstring\t\\003\\001\\001\\004\\070\\001\\000\\000\ttz3 ms-works file\n0\tstring\t\\003\\002\\001\\004\\070\\001\\000\\000\ttz3 ms-works file\n0\tstring\t\\003\\003\\001\\004\\070\\001\\000\\000\ttz3 ms-works file\n\n# PGP sig files .sig\n#0 string \\211\\000\\077\\003\\005\\000\\063\\237\\127 065 to  \\027\\266\\151\\064\\005\\045\\101\\233\\021\\002 PGP sig\n0 string \\211\\000\\077\\003\\005\\000\\063\\237\\127\\065\\027\\266\\151\\064\\005\\045\\101\\233\\021\\002 PGP sig\n0 string \\211\\000\\077\\003\\005\\000\\063\\237\\127\\066\\027\\266\\151\\064\\005\\045\\101\\233\\021\\002 PGP sig\n0 string \\211\\000\\077\\003\\005\\000\\063\\237\\127\\067\\027\\266\\151\\064\\005\\045\\101\\233\\021\\002 PGP sig\n0 string \\211\\000\\077\\003\\005\\000\\063\\237\\127\\070\\027\\266\\151\\064\\005\\045\\101\\233\\021\\002 PGP sig\n0 string \\211\\000\\077\\003\\005\\000\\063\\237\\127\\071\\027\\266\\151\\064\\005\\045\\101\\233\\021\\002 PGP sig\n0 string \\211\\000\\225\\003\\005\\000\\062\\122\\207\\304\\100\\345\\042 PGP sig\n\n# windows zips files .dmf\n0\tstring\tMDIF\\032\\000\\010\\000\\000\\000\\372\\046\\100\\175\\001\\000\\001\\036\\001\\000 MS Windows special zipped file\n\n\n#ico files\n0\tstring\t\\102\\101\\050\\000\\000\\000\\056\\000\\000\\000\\000\\000\\000\\000\tIcon for MS Windows\n\n# Windows icons (Ian Springer <ips@fpk.hp.com>)\n0\tstring\t\\000\\000\\001\\000\tMS Windows icon resource\n!:mime\timage/x-ico\n>4\tbyte\t1\t\t\t- 1 icon\n>4\tbyte\t>1\t\t\t- %d icons\n>>6\tbyte\t>0\t\t\t\\b, %dx\n>>>7\tbyte\t>0\t\t\t\\b%d\n>>8\tbyte\t0\t\t\t\\b, 256-colors\n>>8\tbyte\t>0\t\t\t\\b, %d-colors\n\n\n# .chr files\n0\tstring\tPK\\010\\010BGI\tBorland font \n>4\tstring\t>\\0\t%s\n# then there is a copyright notice\n\n\n# .bgi files\n0\tstring\tpk\\010\\010BGI\tBorland device \n>4\tstring\t>\\0\t%s\n# then there is a copyright notice\n\n\n# Windows Recycle Bin record file (named INFO2)\n# By Abel Cheung (abelcheung AT gmail dot com)\n# Version 4 always has 280 bytes (0x118) per record, version 5 has 800 bytes\n# Since Vista uses another structure, INFO2 structure probably won't change\n# anymore. Detailed analysis in:\n# http://www.cybersecurityinstitute.biz/downloads/INFO2.pdf\n0\tlelong\t\t0x00000004\n>12\tlelong\t\t0x00000118\tWindows Recycle Bin INFO2 file (Win98 or below)\n\n0\tlelong\t\t0x00000005\n>12\tlelong\t\t0x00000320\tWindows Recycle Bin INFO2 file (Win2k - WinXP)\n\n\n##### put in Either Magic/font or Magic/news\n# Acroread or something\t files wrongly identified as G3\t .pfm\n# these have the form \\000 \\001 any? \\002 \\000 \\000\n# or \\000 \\001 any? \\022 \\000 \\000\n#0\tstring\t\\000\\001 pfm?\n#>3\tstring\t\\022\\000\\000Copyright\\\tyes\n#>3\tstring\t\\002\\000\\000Copyright\\\tyes\n#>3\tstring\t>\\0\toops, not a font file. Cancel that.\n#it clashes with ttf files so put it lower down.\n\n# From Doug Lee via a FreeBSD pr\n9\tstring\t\tGERBILDOC\tFirst Choice document\n9\tstring\t\tGERBILDB\tFirst Choice database\n9\tstring\t\tGERBILCLIP\tFirst Choice database\n0\tstring\t\tGERBIL\t\tFirst Choice device file\n9\tstring\t\tRABBITGRAPH\tRabbitGraph file\n0\tstring\t\tDCU1\t\tBorland Delphi .DCU file\n0\tstring\t\t=!<spell>\tMKS Spell hash list (old format)\n0\tstring\t\t=!<spell2>\tMKS Spell hash list\n# Too simple - MPi\n#0\tstring\t\tAH\t\tHalo(TM) bitmapped font file\n0\tlelong\t\t0x08086b70\tTurboC BGI file\n0\tlelong\t\t0x08084b50\tTurboC Font file\n\n# WARNING: below line conflicts with Infocom game data Z-machine 3\n0\tbyte\t\t0x03\t\tDBase 3 data file\n>0x04\tlelong\t\t0\t\t(no records)\n>0x04\tlelong\t\t>0\t\t(%ld records)\n0\tbyte\t\t0x83\t\tDBase 3 data file with memo(s)\n>0x04\tlelong\t\t0\t\t(no records)\n>0x04\tlelong\t\t>0\t\t(%ld records)\n0\tleshort\t\t0x0006\t\tDBase 3 index file\n0\tstring\t\tPMCC\t\tWindows 3.x .GRP file\n1\tstring\t\tRDC-meg\t\tMegaDots \n>8\tbyte\t\t>0x2F\t\tversion %c\n>9\tbyte\t\t>0x2F\t\t\\b.%c file\n0\tlelong\t\t0x4C\n>4\tlelong\t\t0x00021401\tWindows shortcut file\n\n# DOS EPS Binary File Header\n# From: Ed Sznyter <ews@Black.Market.NET>\n0\tbelong\t\t0xC5D0D3C6\tDOS EPS Binary File\n>4\tlong\t\t>0\t\tPostscript starts at byte %d\n>>8\tlong\t\t>0\t\tlength %d\n>>>12\tlong\t\t>0\t\tMetafile starts at byte %d\n>>>>16\tlong\t\t>0\t\tlength %d\n>>>20\tlong\t\t>0\t\tTIFF starts at byte %d\n>>>>24\tlong\t\t>0\t\tlength %d\n\n# TNEF magic From \"Joomy\" <joomy@se-ed.net> \n# Microsoft Outlook's Transport Neutral Encapsulation Format (TNEF)\n0\tleshort\t\t0x223e9f78\tTNEF\n!:mime\tapplication/vnd.ms-tnef\n\n# HtmlHelp files (.chm)\n0\tstring\tITSF\\003\\000\\000\\000\\x60\\000\\000\\000\\001\\000\\000\\000\tMS Windows HtmlHelp Data\n\n# GFA-BASIC (Wolfram Kleff)\n2\tstring\t\tGFA-BASIC3\tGFA-BASIC 3 data\n\n#------------------------------------------------------------------------------\n# From Stuart Caie <kyzer@4u.net> (developer of cabextract)\n# Microsoft Cabinet files\n0\tstring\t\tMSCF\\0\\0\\0\\0\tMicrosoft Cabinet archive data\n!:mime application/vnd.ms-cab-compressed\n>8\tlelong\t\tx\t\t\\b, %u bytes\n>28\tleshort\t\t1\t\t\\b, 1 file\n>28\tleshort\t\t>1\t\t\\b, %u files\n\n# InstallShield Cabinet files\n0\tstring\t\tISc(\t\tInstallShield Cabinet archive data\n>5\tbyte&0xf0\t=0x60\t\tversion 6,\n>5\tbyte&0xf0\t!0x60\t\tversion 4/5,\n>(12.l+40)\tlelong\tx\t\t%u files\n\n# Windows CE package files\n0\tstring\t\tMSCE\\0\\0\\0\\0\tMicrosoft WinCE install header\n>20\tlelong\t\t0\t\t\\b, architecture-independent\n>20\tlelong\t\t103\t\t\\b, Hitachi SH3\n>20\tlelong\t\t104\t\t\\b, Hitachi SH4\n>20\tlelong\t\t0xA11\t\t\\b, StrongARM\n>20\tlelong\t\t4000\t\t\\b, MIPS R4000\n>20\tlelong\t\t10003\t\t\\b, Hitachi SH3\n>20\tlelong\t\t10004\t\t\\b, Hitachi SH3E\n>20\tlelong\t\t10005\t\t\\b, Hitachi SH4\n>20\tlelong\t\t70001\t\t\\b, ARM 7TDMI\n>52\tleshort\t\t1\t\t\\b, 1 file\n>52\tleshort\t\t>1\t\t\\b, %u files\n>56\tleshort\t\t1\t\t\\b, 1 registry entry\n>56\tleshort\t\t>1\t\t\\b, %u registry entries\n\n\n# Windows Enhanced Metafile (EMF)\n# See msdn.microsoft.com/archive/en-us/dnargdi/html/msdn_enhmeta.asp \n# for further information.\n0\tulelong 1\n>40\tstring\t\\ EMF\t\tWindows Enhanced Metafile (EMF) image data\n>>44\tulelong x\t\tversion 0x%x\n\n# From: Alex Beregszaszi <alex@fsn.hu>\n0\tstring\tCOWD\t\tVMWare3\n>4\tbyte\t3\t\tdisk image\n>>32\tlelong\tx\t\t(%d/\n>>36\tlelong\tx\t\t\\b%d/\n>>40\tlelong\tx\t\t\\b%d)\n>4\tbyte\t2\t\tundoable disk image\n>>32\tstring\t>\\0\t\t(%s)\n\n0\tstring\tVMDK\t\t VMware4 disk image\n0\tstring\tKDMV\t\t VMware4 disk image\n\n#--------------------------------------------------------------------\n# Qemu Emulator Images\n# Lines written by Friedrich Schwittay (f.schwittay@yousable.de)\n# Made by reading sources and doing trial and error on existing\n# qcow files\n0\tstring\tQFI\tQemu Image, Format: Qcow\n\n# Uncomment the following line to display Magic (only used for debugging\n# this magic number)\n#>0\tstring\tx\t, Magic: %s\n\n# There are currently 2 Versions: \"1\" and \"2\"\n# I do not use Version 2 and therefor branch here\n# but can assure: it works (tested on both versions)\n# Also my Qemu 0.9.0 which uses this Version 2 refuses\n# to start in its bios\n>0x04\tbelong\t2\t, Version: 2\n>0x04\tbelong\t1\t, Version: 1\n\n# Using the existence of the Backing File Offset to Branch or not\n# to read Backing File Information\n>>0xc\t belong\t >0\t , Backing File( Offset: %lu\n>>>(0xc.L)\t string >\\0\t, Path: %s\n\n# Didn't get the trick here how qemu stores the \"Size\" at this Position\n# There is actually something stored but nothing makes sense\n# The header in the sources talks about it\n#>>>16\t lelong\t x\t , Size: %lu\n\n# Modification time of the Backing File\n# Really useful if you want to know if your backing\n# file is still usable together with this image\n>>>20\t bedate x\t, Mtime: %s )\n\n# Don't know how to calculate in Magicfiles\n# Also: this Information is not reliably\n#\tstored in image-files\n>>24\t lelong\t x\t , Disk Size could be: %d * 256 bytes\n\n0\tstring\tQEVM\t\tQEMU's suspend to disk image\n\n0\tstring\tBochs\\ Virtual\\ HD\\ Image\tBochs disk image,\n>32\tstring\tx\t\t\t\ttype %s,\n>48\tstring\tx\t\t\t\tsubtype %s\n\n0\tlelong\t0x02468ace\t\t\tBochs Sparse disk image\n\n# from http://filext.com by Derek M Jones <derek@knosof.co.uk>\n# False positive with PPT (also currently this string is too long)\n#0\tstring\t\\xD0\\xCF\\x11\\xE0\\xA1\\xB1\\x1A\\xE1\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x3E\\x00\\x03\\x00\\xFE\\xFF\\x09\\x00\\x06\tMicrosoft Installer\n0\tstring\t\\320\\317\\021\\340\\241\\261\\032\\341\tMicrosoft Office Document\n#>48\tbyte\t0x1B\t\t\t\t\tExcel Document\n#!:mime application/vnd.ms-excel\n>546\tstring\tbjbj\t\t\tMicrosoft Word Document\n!:mime\tapplication/msword\n>546\tstring\tjbjb\t\t\tMicrosoft Word Document\n!:mime\tapplication/msword\n\n0\tstring\t\\224\\246\\056\t\tMicrosoft Word Document\n!:mime\tapplication/msword\n\n512\tstring\tR\\0o\\0o\\0t\\0\\ \\0E\\0n\\0t\\0r\\0y\tMicrosoft Word Document\n!:mime\tapplication/msword\n\n# From: \"Nelson A. de Oliveira\" <naoliv@gmail.com>\n# Magic type for Dell's BIOS .hdr files\n# Dell's .hdr\n0\tstring $RBU\n>23\tstring Dell\t\t\t%s system BIOS\n>48\tstring x\t\t\tversion %.3s\n\n# Type: Microsoft DirectDraw Surface\n# URL:\thttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/reference/DDSFileReference/ddsfileformat.asp\n# From: Morten Hustveit <morten@debian.org>\n0\tstring\tDDS\\040\\174\\000\\000\\000 Microsoft DirectDraw Surface (DDS),\n>16\tlelong\t>0\t\t\t%hd x\n>12\tlelong\t>0\t\t\t%hd,\n>84\tstring\tx\t\t\t%.4s\n\n# Type: Microsoft Document Imaging Format (.mdi)\n# URL:\thttp://en.wikipedia.org/wiki/Microsoft_Document_Imaging_Format\n# From: Daniele Sempione <scrows@oziosi.org>\n0\tshort\t0x5045\t\t\tMicrosoft Document Imaging Format\n\n# MS eBook format (.lit)\n0\tstring\tITOLITLS\t\tMicrosoft Reader eBook Data\n>8\tlelong\tx\t\t\t\\b, version %u\n!:mime\t\t\t\t\tapplication/x-ms-reader\n\n#------------------------------------------------------------------------------\n# msvc:  file(1) magic for msvc\n# \"H. Nanosecond\" <aldomel@ix.netcom.com>\n# Microsoft visual C\n# \n# I have version 1.0\n\n# .aps\n0\tstring\tHWB\\000\\377\\001\\000\\000\\000\tMicrosoft Visual C .APS file\n\n# .ide\n#too long 0\tstring\t\\102\\157\\162\\154\\141\\156\\144\\040\\103\\053\\053\\040\\120\\162\\157\\152\\145\\143\\164\\040\\106\\151\\154\\145\\012\\000\\032\\000\\002\\000\\262\\000\\272\\276\\372\\316\tMSVC .ide\n0\tstring\t\\102\\157\\162\\154\\141\\156\\144\\040\\103\\053\\053\\040\\120\\162\\157\tMSVC .ide\n\n# .res\n0\tstring\t\\000\\000\\000\\000\\040\\000\\000\\000\\377\tMSVC .res\n0\tstring\t\\377\\003\\000\\377\\001\\000\\020\\020\\350\tMSVC .res\n0\tstring\t\\377\\003\\000\\377\\001\\000\\060\\020\\350\tMSVC .res\n\n#.lib\n0\tstring\t\\360\\015\\000\\000\tMicrosoft Visual C library\n0\tstring\t\\360\\075\\000\\000\tMicrosoft Visual C library\n0\tstring\t\\360\\175\\000\\000\tMicrosoft Visual C library\n\n#.pch\n0\tstring\tDTJPCH0\\000\\022\\103\\006\\200\tMicrosoft Visual C .pch\n\n# .pdb\n# too long 0\tstring\tMicrosoft\\ C/C++\\ program\\ database\\ \n0\tstring\tMicrosoft\\ C/C++\\ \tMSVC program database\n>18\tstring\tprogram\\ database\\ \t\n>33\tstring\t>\\0\tver %s\n\n#.sbr\n0\tstring\t\\000\\002\\000\\007\\000\tMSVC .sbr\n>5\tstring \t>\\0\t%s\n\n#.bsc\n0\tstring\t\\002\\000\\002\\001\tMSVC .bsc\n\n#.wsp\n0\tstring\t1.00\\ .0000.0000\\000\\003\tMSVC .wsp version 1.0000.0000\n# these seem to start with the version and contain menus\n# ------------------------------------------------------------------------\n# mup: file(1) magic for Mup (Music Publisher) input file.\n#\n# From: Abel Cheung <abel (@) oaka.org>\n#\n# NOTE: This header is mainly proposed in the Arkkra mailing list,\n# and is not a mandatory header because of old mup input file\n# compatibility. Noteedit also use mup format, but is not forcing\n# user to use any header as well.\n#\n0\t\tsearch/1\t//!Mup\t\tMup music publication program input text\n>6\t\tstring\t\t-Arkkra\t\t(Arkkra)\n>>13\t\tstring\t\t-\t\t\n>>>16\t\tstring\t\t.\t\t\n>>>>14\t\tstring\t\tx\t\t\\b, need V%.4s\n>>>15\t\tstring\t\t.\t\t\n>>>>14\t\tstring\t\tx\t\t\\b, need V%.3s\n>6\t\tstring\t\t-\t\t\n>>9\t\tstring\t\t.\t\t\n>>>7\t\tstring\t\tx\t\t\\b, need V%.4s\n>>8\t\tstring\t\t.\t\t\n>>>7\t\tstring\t\tx\t\t\\b, need V%.3s\n\n#-----------------------------------------------------------------------------\n# natinst:  file(1) magic for National Instruments Code Files\n\n#\n# From <egamez@fcfm.buap.mx> Enrique Gmez-Flores\n# version 1\n# Many formats still missing, we use, for the moment LabVIEW\n# We guess VXI format file. VISA, LabWindowsCVI, BridgeVIEW, etc, are missing\n#\n0       string          RSRC            National Instruments,\n# Check if it's a LabVIEW File\n>8      string          LV              LabVIEW File,\n# Check wich kind of file is\n>>10    string          SB              Code Resource File, data\n>>10    string          IN              Virtual Instrument Program, data\n>>10    string          AR              VI Library, data\n# This is for Menu Libraries\n>8      string          LMNULBVW        Portable File Names, data\n# This is for General Resources\n>8      string          rsc             Resources File, data\n# This is for VXI Package\n0       string          VMAP            National Instruments, VXI File, data\n\n#------------------------------------------------------------------------------\n# ncr:  file(1) magic for NCR Tower objects\n#\n# contributed by\n# Michael R. Wayne  ***  TMC & Associates  ***  INTERNET: wayne@ford-vax.arpa\n# uucp: {philabs | pyramid} !fmsrl7!wayne   OR   wayne@fmsrl7.UUCP\n#\n0\tbeshort\t\t000610\tTower/XP rel 2 object\n>12\t   belong\t\t>0\tnot stripped\n>20\t   beshort\t\t0407\texecutable\n>20\t   beshort\t\t0410\tpure executable\n>22\t   beshort\t\t>0\t- version %ld\n0\tbeshort\t\t000615\tTower/XP rel 2 object\n>12\t   belong\t\t>0\tnot stripped\n>20\t   beshort\t\t0407\texecutable\n>20\t   beshort\t\t0410\tpure executable\n>22\t   beshort\t\t>0\t- version %ld\n0\tbeshort\t\t000620\tTower/XP rel 3 object\n>12\t   belong\t\t>0\tnot stripped\n>20\t   beshort\t\t0407\texecutable\n>20\t   beshort\t\t0410\tpure executable\n>22\t   beshort\t\t>0\t- version %ld\n0\tbeshort\t\t000625\tTower/XP rel 3 object\n>12\t   belong\t\t>0\tnot stripped\n>20\t   beshort\t\t0407\texecutable\n>20\t   beshort\t\t0410\tpure executable\n>22\t   beshort\t\t>0\t- version %ld\n0\tbeshort\t\t000630\tTower32/600/400 68020 object\n>12\t   belong\t\t>0\tnot stripped\n>20\t   beshort\t\t0407\texecutable\n>20\t   beshort\t\t0410\tpure executable\n>22\t   beshort\t\t>0\t- version %ld\n0\tbeshort\t\t000640\tTower32/800 68020\n>18\t   beshort\t\t&020000\tw/68881 object\n>18\t   beshort\t\t&040000\tcompatible object\n>18\t   beshort\t\t&060000\tobject\n>20\t   beshort\t\t0407\texecutable\n>20\t   beshort\t\t0413\tpure executable\n>12\t   belong\t\t>0\tnot stripped\n>22\t   beshort\t\t>0\t- version %ld\n0\tbeshort\t\t000645\tTower32/800 68010\n>18\t   beshort\t\t&040000\tcompatible object\n>18\t   beshort\t\t&060000 object\n>20\t   beshort\t\t0407\texecutable\n>20\t   beshort\t\t0413\tpure executable\n>12\t   belong\t\t>0\tnot stripped\n>22\t   beshort\t\t>0\t- version %ld\n\n#------------------------------------------------------------------------------\n# netbsd:  file(1) magic for NetBSD objects\n#\n# All new-style magic numbers are in network byte order.\n#\n\n0\tlelong\t\t\t000000407\ta.out NetBSD little-endian object file\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong\t\t\t000000407\ta.out NetBSD big-endian object file\n>16\tbelong\t\t\t>0\t\tnot stripped\n\n0\tbelong&0377777777\t041400413\ta.out NetBSD/i386 demand paged\n>0\tbyte\t\t\t&0x80\t\t\n>>20\tlelong\t\t\t<4096\t\tshared library\n>>20\tlelong\t\t\t=4096\t\tdynamically linked executable\n>>20\tlelong\t\t\t>4096\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t041400410\ta.out NetBSD/i386 pure\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t041400407\ta.out NetBSD/i386\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\n>>0\tbyte\t\t\t&0x40\t\tposition independent\n>>20\tlelong\t\t\t!0\t\texecutable\n>>20\tlelong\t\t\t=0\t\tobject file\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t041400507\ta.out NetBSD/i386 core\n>12\tstring\t\t\t>\\0\t\tfrom '%s'\n>32\tlelong\t\t\t!0\t\t(signal %d)\n\n0\tbelong&0377777777\t041600413\ta.out NetBSD/m68k demand paged\n>0\tbyte\t\t\t&0x80\t\t\n>>20\tbelong\t\t\t<8192\t\tshared library\n>>20\tbelong\t\t\t=8192\t\tdynamically linked executable\n>>20\tbelong\t\t\t>8192\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tbelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t041600410\ta.out NetBSD/m68k pure\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tbelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t041600407\ta.out NetBSD/m68k\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\n>>0\tbyte\t\t\t&0x40\t\tposition independent\n>>20\tbelong\t\t\t!0\t\texecutable\n>>20\tbelong\t\t\t=0\t\tobject file\n>16\tbelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t041600507\ta.out NetBSD/m68k core\n>12\tstring\t\t\t>\\0\t\tfrom '%s'\n>32\tbelong\t\t\t!0\t\t(signal %d)\n\n0\tbelong&0377777777\t042000413\ta.out NetBSD/m68k4k demand paged\n>0\tbyte\t\t\t&0x80\t\t\n>>20\tbelong\t\t\t<4096\t\tshared library\n>>20\tbelong\t\t\t=4096\t\tdynamically linked executable\n>>20\tbelong\t\t\t>4096\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tbelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t042000410\ta.out NetBSD/m68k4k pure\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tbelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t042000407\ta.out NetBSD/m68k4k\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\n>>0\tbyte\t\t\t&0x40\t\tposition independent\n>>20\tbelong\t\t\t!0\t\texecutable\n>>20\tbelong\t\t\t=0\t\tobject file\n>16\tbelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t042000507\ta.out NetBSD/m68k4k core\n>12\tstring\t\t\t>\\0\t\tfrom '%s'\n>32\tbelong\t\t\t!0\t\t(signal %d)\n\n0\tbelong&0377777777\t042200413\ta.out NetBSD/ns32532 demand paged\n>0\tbyte\t\t\t&0x80\t\t\n>>20\tlelong\t\t\t<4096\t\tshared library\n>>20\tlelong\t\t\t=4096\t\tdynamically linked executable\n>>20\tlelong\t\t\t>4096\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t042200410\ta.out NetBSD/ns32532 pure\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t042200407\ta.out NetBSD/ns32532\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\n>>0\tbyte\t\t\t&0x40\t\tposition independent\n>>20\tlelong\t\t\t!0\t\texecutable\n>>20\tlelong\t\t\t=0\t\tobject file\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t042200507\ta.out NetBSD/ns32532 core\n>12\tstring\t\t\t>\\0\t\tfrom '%s'\n>32\tlelong\t\t\t!0\t\t(signal %d)\n\n0\tbelong&0377777777\t045200507\ta.out NetBSD/powerpc core\n>12\tstring\t\t\t>\\0\t\tfrom '%s'\n\n0\tbelong&0377777777\t042400413\ta.out NetBSD/sparc demand paged\n>0\tbyte\t\t\t&0x80\t\t\n>>20\tbelong\t\t\t<8192\t\tshared library\n>>20\tbelong\t\t\t=8192\t\tdynamically linked executable\n>>20\tbelong\t\t\t>8192\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tbelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t042400410\ta.out NetBSD/sparc pure\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tbelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t042400407\ta.out NetBSD/sparc\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\n>>0\tbyte\t\t\t&0x40\t\tposition independent\n>>20\tbelong\t\t\t!0\t\texecutable\n>>20\tbelong\t\t\t=0\t\tobject file\n>16\tbelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t042400507\ta.out NetBSD/sparc core\n>12\tstring\t\t\t>\\0\t\tfrom '%s'\n>32\tbelong\t\t\t!0\t\t(signal %d)\n\n0\tbelong&0377777777\t042600413\ta.out NetBSD/pmax demand paged\n>0\tbyte\t\t\t&0x80\t\t\n>>20\tlelong\t\t\t<4096\t\tshared library\n>>20\tlelong\t\t\t=4096\t\tdynamically linked executable\n>>20\tlelong\t\t\t>4096\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t042600410\ta.out NetBSD/pmax pure\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t042600407\ta.out NetBSD/pmax\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\n>>0\tbyte\t\t\t&0x40\t\tposition independent\n>>20\tlelong\t\t\t!0\t\texecutable\n>>20\tlelong\t\t\t=0\t\tobject file\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t042600507\ta.out NetBSD/pmax core\n>12\tstring\t\t\t>\\0\t\tfrom '%s'\n>32\tlelong\t\t\t!0\t\t(signal %d)\n\n0\tbelong&0377777777\t043000413\ta.out NetBSD/vax 1k demand paged\n>0\tbyte\t\t\t&0x80\t\t\n>>20\tlelong\t\t\t<4096\t\tshared library\n>>20\tlelong\t\t\t=4096\t\tdynamically linked executable\n>>20\tlelong\t\t\t>4096\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t043000410\ta.out NetBSD/vax 1k pure\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t043000407\ta.out NetBSD/vax 1k\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\n>>0\tbyte\t\t\t&0x40\t\tposition independent\n>>20\tlelong\t\t\t!0\t\texecutable\n>>20\tlelong\t\t\t=0\t\tobject file\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t043000507\ta.out NetBSD/vax 1k core\n>12\tstring\t\t\t>\\0\t\tfrom '%s'\n>32\tlelong\t\t\t!0\t\t(signal %d)\n\n0\tbelong&0377777777\t045400413\ta.out NetBSD/vax 4k demand paged\n>0\tbyte\t\t\t&0x80\t\t\n>>20\tlelong\t\t\t<4096\t\tshared library\n>>20\tlelong\t\t\t=4096\t\tdynamically linked executable\n>>20\tlelong\t\t\t>4096\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t045400410\ta.out NetBSD/vax 4k pure\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t045400407\ta.out NetBSD/vax 4k\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\n>>0\tbyte\t\t\t&0x40\t\tposition independent\n>>20\tlelong\t\t\t!0\t\texecutable\n>>20\tlelong\t\t\t=0\t\tobject file\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t045400507\ta.out NetBSD/vax 4k core\n>12\tstring\t\t\t>\\0\t\tfrom '%s'\n>32\tlelong\t\t\t!0\t\t(signal %d)\n\n# NetBSD/alpha does not support (and has never supported) a.out objects,\n# so no rules are provided for them.  NetBSD/alpha ELF objects are \n# dealt with in \"elf\".\n0\tlelong\t\t0x00070185\t\tECOFF NetBSD/alpha binary\n>10\tleshort\t\t0x0001\t\t\tnot stripped\n>10\tleshort\t\t0x0000\t\t\tstripped\n0\tbelong&0377777777\t043200507\ta.out NetBSD/alpha core\n>12\tstring\t\t\t>\\0\t\tfrom '%s'\n>32\tlelong\t\t\t!0\t\t(signal %d)\n\n0\tbelong&0377777777\t043400413\ta.out NetBSD/mips demand paged\n>0\tbyte\t\t\t&0x80\t\t\n>>20\tbelong\t\t\t<8192\t\tshared library\n>>20\tbelong\t\t\t=8192\t\tdynamically linked executable\n>>20\tbelong\t\t\t>8192\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tbelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t043400410\ta.out NetBSD/mips pure\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tbelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t043400407\ta.out NetBSD/mips\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\n>>0\tbyte\t\t\t&0x40\t\tposition independent\n>>20\tbelong\t\t\t!0\t\texecutable\n>>20\tbelong\t\t\t=0\t\tobject file\n>16\tbelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t043400507\ta.out NetBSD/mips core\n>12\tstring\t\t\t>\\0\t\tfrom '%s'\n>32\tbelong\t\t\t!0\t\t(signal %d)\n\n0\tbelong&0377777777\t043600413\ta.out NetBSD/arm32 demand paged\n>0\tbyte\t\t\t&0x80\n>>20\tlelong\t\t\t<4096\t\tshared library\n>>20\tlelong\t\t\t=4096\t\tdynamically linked executable\n>>20\tlelong\t\t\t>4096\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t043600410\ta.out NetBSD/arm32 pure\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\t\texecutable\n>16\tlelong\t\t\t>0\t\tnot stripped\n0\tbelong&0377777777\t043600407\ta.out NetBSD/arm32\n>0\tbyte\t\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t\t^0x80\n>>0\tbyte\t\t\t&0x40\t\tposition independent\n>>20\tlelong\t\t\t!0\t\texecutable\n>>20\tlelong\t\t\t=0\t\tobject file\n>16\tlelong\t\t\t>0\t\tnot stripped\n# NetBSD/arm26 has always used ELF objects, but it shares a core file\n# format with NetBSD/arm32.\n0\tbelong&0377777777\t043600507\ta.out NetBSD/arm core\n>12\tstring\t\t\t>\\0\t\tfrom '%s'\n>32\tlelong\t\t\t!0\t\t(signal %d)\n\n#------------------------------------------------------------------------------\n# netscape:  file(1) magic for Netscape files\n# \"H. Nanosecond\" <aldomel@ix.netcom.com>\n# version 3 and 4 I think\n#\n\n# Netscape Address book  .nab\n0\tstring \\000\\017\\102\\104\\000\\000\\000\\000\\000\\000\\001\\000\\000\\000\\000\\002\\000\\000\\000\\002\\000\\000\\004\\000 Netscape Address book\n\n# Netscape Communicator address book\n0   string   \\000\\017\\102\\111 Netscape Communicator address book\n\n# .snm Caches\n0\tstring\t\t#\\ Netscape\\ folder\\ cache\tNetscape folder cache\n0\tstring\t\\000\\036\\204\\220\\000\tNetscape folder cache\n# .n2p \n# Net 2 Phone \n#0\tstring\t123\\130\\071\\066\\061\\071\\071\\071\\060\\070\\061\\060\\061\\063\\060\n0\tstring\tSX961999\tNet2phone\n\n#\n#This is files ending in .art, FIXME add more rules\n0       string          JG\\004\\016\\0\\0\\0\\0      ART\n\n#------------------------------------------------------------------------------\n# netware:  file(1) magic for NetWare Loadable Modules (NLMs)\n# From: Mads Martin Joergensen <mmj@suse.de>\n\n0\tstring\tNetWare\\ Loadable\\ Module\tNetWare Loadable Module\n\n#------------------------------------------------------------------------------\n# news:  file(1) magic for SunOS NeWS fonts (not \"news\" as in \"netnews\")\n#\n0\tstring\t\tStartFontMetrics\tASCII font metrics\n0\tstring\t\tStartFont\tASCII font bits\n0\tbelong\t\t0x137A2944\tNeWS bitmap font\n0\tbelong\t\t0x137A2947\tNeWS font family\n0\tbelong\t\t0x137A2950\tscalable OpenFont binary\n0\tbelong\t\t0x137A2951\tencrypted scalable OpenFont binary\n8\tbelong\t\t0x137A2B45\tX11/NeWS bitmap font\n8\tbelong\t\t0x137A2B48\tX11/NeWS font family\n#------------------------------------------------------------------------------\n# nitpicker:  file(1) magic for Flowfiles.\n# From: Christian Jachmann <C.Jachmann@gmx.net> http://www.nitpicker.de\n0\tstring\tNPFF\tNItpicker Flow File \n>4\tbyte\tx\tV%d.\n>5\tbyte\tx\t%d\n>6\tbedate\tx\tstarted: %s\n>10\tbedate\tx\tstopped: %s\n>14\tbelong\tx\tBytes: %u\n>18\tbelong\tx\tBytes1: %u\n>22\tbelong\tx\tFlows: %u\n>26\tbelong\tx\tPkts: %u\n\n#------------------------------------------------------------------------------\n# ocaml: file(1) magic for Objective Caml files.\n0\tstring\tCaml1999\tObjective caml\n>8\tstring\tX\t\texec file\n>8\tstring\tI\t\tinterface file (.cmi)\n>8\tstring\tO\t\tobject file (.cmo)\n>8\tstring\tA\t\tlibrary file (.cma)\n>8\tstring\tY\t\tnative object file (.cmx)\n>8\tstring\tZ\t\tnative library file (.cmxa)\n>8\tstring\tM\t\tabstract syntax tree implementation file\n>8\tstring\tN\t\tabstract syntax tree interface file\n>9\tstring\t>\\0\t\t(Version %3.3s).\n#------------------------------------------------------------------------------\n# octave binary data file(1) magic, from Dirk Eddelbuettel <edd@debian.org>\n0\tstring\t\tOctave-1-L\tOctave binary data (little endian)\n0\tstring\t\tOctave-1-B\tOctave binary data (big endian)\n\n#------------------------------------------------------------------------------\n# Microsoft OLE 2 Compound Documents : file(1) magic for Microsoft Structured\n# storage (http://en.wikipedia.org/wiki/Structured_Storage)\n# Additional tests for OLE 2 Compound Documents should be under this recipe.\n\n0   string  \\320\\317\\021\\340\\241\\261\\032\\341      OLE 2 Compound Document\n# - Microstation V8 DGN files (www.bentley.com)\n#   Last update on 10/23/2006 by Lester Hightower\n> 0x480  string  D\\000g\\000n\\000~\\000H                : Microstation V8 DGN\n# - Visio documents\n#   Last update on 10/23/2006 by Lester Hightower\n> 0x480  string  V\\000i\\000s\\000i\\000o\\000D\\000o\\000c : Visio Document\n\n#------------------------------------------------------------------------------\n# olf:  file(1) magic for OLF executables\n#\n# We have to check the byte order flag to see what byte order all the\n# other stuff in the header is in.\n#\n# MIPS R3000 may also be for MIPS R2000.\n# What're the correct byte orders for the nCUBE and the Fujitsu VPP500?\n#\n# Created by Erik Theisen <etheisen@openbsd.org>\n# Based on elf from Daniel Quinlan <quinlan@yggdrasil.com>\n0\tstring\t\t\\177OLF\t\tOLF\n>4\tbyte\t\t0\t\tinvalid class\n>4\tbyte\t\t1\t\t32-bit\n>4\tbyte\t\t2\t\t64-bit\n>7\tbyte\t\t0\t\tinvalid os\n>7\tbyte\t\t1\t\tOpenBSD\n>7\tbyte\t\t2\t\tNetBSD\n>7\tbyte\t\t3\t\tFreeBSD\n>7\tbyte\t\t4\t\t4.4BSD\n>7\tbyte\t\t5\t\tLinux\n>7\tbyte\t\t6\t\tSVR4\n>7\tbyte\t\t7\t\tesix\n>7\tbyte\t\t8\t\tSolaris\n>7\tbyte\t\t9\t\tIrix\n>7\tbyte\t\t10\t\tSCO\n>7\tbyte\t\t11\t\tDell\n>7\tbyte\t\t12\t\tNCR\n>5\tbyte\t\t0\t\tinvalid byte order\n>5\tbyte\t\t1\t\tLSB\n>>16\tleshort\t\t0\t\tno file type,\n>>16\tleshort\t\t1\t\trelocatable,\n>>16\tleshort\t\t2\t\texecutable,\n>>16\tleshort\t\t3\t\tshared object,\n# Core handling from Peter Tobias <tobias@server.et-inf.fho-emden.de>\n# corrections by Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de>\n>>16\tleshort\t\t4\t\tcore file\n>>>(0x38+0xcc) string\t>\\0\t\tof '%s'\n>>>(0x38+0x10) lelong\t>0\t\t(signal %d),\n>>16\tleshort\t\t&0xff00\t\tprocessor-specific,\n>>18\tleshort\t\t0\t\tno machine,\n>>18\tleshort\t\t1\t\tAT&T WE32100 - invalid byte order,\n>>18\tleshort\t\t2\t\tSPARC - invalid byte order,\n>>18\tleshort\t\t3\t\tIntel 80386,\n>>18\tleshort\t\t4\t\tMotorola 68000 - invalid byte order,\n>>18\tleshort\t\t5\t\tMotorola 88000 - invalid byte order,\n>>18\tleshort\t\t6\t\tIntel 80486,\n>>18\tleshort\t\t7\t\tIntel 80860,\n>>18\tleshort\t\t8\t\tMIPS R3000_BE - invalid byte order,\n>>18\tleshort\t\t9\t\tAmdahl - invalid byte order,\n>>18\tleshort\t\t10\t\tMIPS R3000_LE,\n>>18\tleshort\t\t11\t\tRS6000 - invalid byte order,\n>>18\tleshort\t\t15\t\tPA-RISC - invalid byte order,\n>>18\tleshort\t\t16\t\tnCUBE,\n>>18\tleshort\t\t17\t\tVPP500,\n>>18\tleshort\t\t18\t\tSPARC32PLUS,\n>>18\tleshort\t\t20\t\tPowerPC,\n>>18\tleshort\t\t0x9026\t\tAlpha,\n>>20\tlelong\t\t0\t\tinvalid version\n>>20\tlelong\t\t1\t\tversion 1\n>>36\tlelong\t\t1\t\tMathCoPro/FPU/MAU Required\n>8\tstring\t\t>\\0\t\t(%s)\n>5\tbyte\t\t2\t\tMSB\n>>16\tbeshort\t\t0\t\tno file type,\n>>16\tbeshort\t\t1\t\trelocatable,\n>>16\tbeshort\t\t2\t\texecutable,\n>>16\tbeshort\t\t3\t\tshared object,\n>>16\tbeshort\t\t4\t\tcore file,\n>>>(0x38+0xcc) string\t>\\0\t\tof '%s'\n>>>(0x38+0x10) belong\t>0\t\t(signal %d),\n>>16\tbeshort\t\t&0xff00\t\tprocessor-specific,\n>>18\tbeshort\t\t0\t\tno machine,\n>>18\tbeshort\t\t1\t\tAT&T WE32100,\n>>18\tbeshort\t\t2\t\tSPARC,\n>>18\tbeshort\t\t3\t\tIntel 80386 - invalid byte order,\n>>18\tbeshort\t\t4\t\tMotorola 68000,\n>>18\tbeshort\t\t5\t\tMotorola 88000,\n>>18\tbeshort\t\t6\t\tIntel 80486 - invalid byte order,\n>>18\tbeshort\t\t7\t\tIntel 80860,\n>>18\tbeshort\t\t8\t\tMIPS R3000_BE,\n>>18\tbeshort\t\t9\t\tAmdahl,\n>>18\tbeshort\t\t10\t\tMIPS R3000_LE - invalid byte order,\n>>18\tbeshort\t\t11\t\tRS6000,\n>>18\tbeshort\t\t15\t\tPA-RISC,\n>>18\tbeshort\t\t16\t\tnCUBE,\n>>18\tbeshort\t\t17\t\tVPP500,\n>>18\tbeshort\t\t18\t\tSPARC32PLUS,\n>>18\tbeshort\t\t20\t\tPowerPC or cisco 4500,\n>>18\tbeshort\t\t21\t\tcisco 7500,\n>>18\tbeshort\t\t24\t\tcisco SVIP,\n>>18\tbeshort\t\t25\t\tcisco 7200,\n>>18\tbeshort\t\t36\t\tcisco 12000,\n>>18\tbeshort\t\t0x9026\t\tAlpha,\n>>20\tbelong\t\t0\t\tinvalid version\n>>20\tbelong\t\t1\t\tversion 1\n>>36\tbelong\t\t1\t\tMathCoPro/FPU/MAU Required\n#------------------------------------------------------------------------------\n# os2:  file(1) magic for OS/2 files\n#\n\n# Provided 1998/08/22 by\n# David Mediavilla <davidme.news@REMOVEIFNOTSPAMusa.net>\n1\tsearch/1\tInternetShortcut\tMS Windows 95 Internet shortcut text\n>24\tsearch/1\t>\\ \t\t\t(URL=<%s>)\n\n# OS/2 URL objects\n# Provided 1998/08/22 by\n# David Mediavilla <davidme.news@REMOVEIFNOTSPAMusa.net>\n#0\tstring\thttp:\t\t\tOS/2 URL object text\n#>5\tstring\t>\\\t\t\t(WWW) <http:%s>\n#0\tstring\tmailto:\t\t\tOS/2 URL object text\n#>7\tstring\t>\\\t\t\t(email) <%s>\n#0\tstring\tnews:\t\t\tOS/2 URL object text\n#>5\tstring\t>\\\t\t\t(Usenet) <%s>\n#0\tstring\tftp:\t\t\tOS/2 URL object text\n#>4\tstring\t>\\\t\t\t(FTP) <ftp:%s>\n#0\tstring\tfile:\t\t\tOS/2 URL object text\n#>5\tstring\t>\\\t\t\t(Local file) <%s>\n\n# >>>>> OS/2 INF/HLP <<<<<  (source: Daniel Dissett ddissett@netcom.com)\n# Carl Hauser (chauser.parc@xerox.com) and \n# Marcus Groeber (marcusg@ph-cip.uni-koeln.de)\n# list the following header format in inf02a.doc:\n#\n#  int16 ID;           // ID magic word (5348h = \"HS\")\n#  int8  unknown1;     // unknown purpose, could be third letter of ID\n#  int8  flags;        // probably a flag word...\n#                      //  bit 0: set if INF style file\n#                      //  bit 4: set if HLP style file\n#                      // patching this byte allows reading HLP files\n#                      // using the VIEW command, while help files \n#                      // seem to work with INF settings here as well.\n#  int16 hdrsize;      // total size of header\n#  int16 unknown2;     // unknown purpose\n# \n0   string  HSP\\x01\\x9b\\x00 OS/2 INF\n>107 string >0                      (%s)\n0   string  HSP\\x10\\x9b\\x00     OS/2 HLP\n>107 string >0                      (%s)\n\n# OS/2 INI (this is a guess)\n0  string   \\xff\\xff\\xff\\xff\\x14\\0\\0\\0  OS/2 INI\n#------------------------------------------------------------------------------\n# os400:  file(1) magic for IBM OS/400 files\n#\n# IBM OS/400 (i5/OS) Save file (SAVF) - gerardo.cacciari@gmail.com\n# In spite of its quite variable format (due to internal memory page\n# length differences between CISC and RISC versions of the OS) the\n# SAVF structure hasn't suitable offsets to identify the catalog\n# header in the first descriptor where there are some useful infos,\n# so we must search in a somewhat large area for a particular string\n# that represents the EBCDIC encoding of 'QSRDSSPC' (save/restore\n# descriptor space) preceded by a two byte constant.\n#\n1090\t search/7393\t\\x19\\xDB\\xD8\\xE2\\xD9\\xC4\\xE2\\xE2\\xD7\\xC3 IBM OS/400 save file data\n>&212\t byte\t\t0x01\t\t\t \\b, created with SAVOBJ\n>&212\t byte\t\t0x02\t\t\t \\b, created with SAVLIB\n>&212\t byte\t\t0x07\t\t\t \\b, created with SAVCFG\n>&212\t byte\t\t0x08\t\t\t \\b, created with SAVSECDTA\n>&212\t byte\t\t0x0A\t\t\t \\b, created with SAVSECDTA\n>&212\t byte\t\t0x0B\t\t\t \\b, created with SAVDLO\n>&212\t byte\t\t0x0D\t\t\t \\b, created with SAVLICPGM\n>&212\t byte\t\t0x11\t\t\t \\b, created with SAVCHGOBJ\n>&213\t byte\t\t0x44\t\t\t \\b, at least V5R4 to open\n>&213\t byte\t\t0x43\t\t\t \\b, at least V5R3 to open\n>&213\t byte\t\t0x42\t\t\t \\b, at least V5R2 to open\n>&213\t byte\t\t0x41\t\t\t \\b, at least V5R1 to open\n>&213\t byte\t\t0x40\t\t\t \\b, at least V4R5 to open\n>&213\t byte\t\t0x3F\t\t\t \\b, at least V4R4 to open\n>&213\t byte\t\t0x3E\t\t\t \\b, at least V4R3 to open\n>&213\t byte\t\t0x3C\t\t\t \\b, at least V4R2 to open\n>&213\t byte\t\t0x3D\t\t\t \\b, at least V4R1M4 to open\n>&213\t byte\t\t0x3B\t\t\t \\b, at least V4R1 to open\n>&213\t byte\t\t0x3A\t\t\t \\b, at least V3R7 to open\n>&213\t byte\t\t0x35\t\t\t \\b, at least V3R6 to open\n>&213\t byte\t\t0x36\t\t\t \\b, at least V3R2 to open\n>&213\t byte\t\t0x34\t\t\t \\b, at least V3R1 to open\n>&213\t byte\t\t0x31\t\t\t \\b, at least V3R0M5 to open\n>&213\t byte\t\t0x30\t\t\t \\b, at least V2R3 to open\n#\n# Copyright (c) 1996 Ignatios Souvatzis. All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions\n# are met:\n# 1. Redistributions of source code must retain the above copyright\n#    notice, this list of conditions and the following disclaimer.\n# 2. Redistributions in binary form must reproduce the above copyright\n#    notice, this list of conditions and the following disclaimer in the\n#    documentation and/or other materials provided with the distribution.\n# 3. All advertising materials mentioning features or use of this software\n#    must display the following acknowledgement:\n#      This product includes software developed by Ignatios Souvatzis for\n#      the NetBSD project.\n# 4. The name of the author may not be used to endorse or promote products\n#    derived from this software without specific prior written permission.\n#\n#\n# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  \n# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n#\n#\n# OS9/6809 module descriptions:\n#\n0\tbeshort\t\t0x87CD\tOS9/6809 module:\n#\n>6\tbyte&0x0f\t0x00\tnon-executable\n>6\tbyte&0x0f\t0x01\tmachine language\n>6\tbyte&0x0f\t0x02\tBASIC I-code\n>6\tbyte&0x0f\t0x03\tPascal P-code\n>6\tbyte&0x0f\t0x04\tC I-code\n>6\tbyte&0x0f\t0x05\tCOBOL I-code\n>6\tbyte&0x0f\t0x06\tFortran I-code\n#\n>6\tbyte&0xf0\t0x10\tprogram executable\n>6\tbyte&0xf0\t0x20\tsubroutine\n>6\tbyte&0xf0\t0x30\tmulti-module\n>6\tbyte&0xf0\t0x40\tdata module\n#\n>6\tbyte&0xf0\t0xC0\tsystem module\n>6\tbyte&0xf0\t0xD0\tfile manager\n>6\tbyte&0xf0\t0xE0\tdevice driver\n>6\tbyte&0xf0\t0xF0\tdevice descriptor\n#\n# OS9/m68k stuff (to be continued)\n#\n0\tbeshort\t\t0x4AFC\tOS9/68K module:\n#\n# attr\n>0x14\tbyte&0x80\t0x80\tre-entrant\n>0x14\tbyte&0x40\t0x40\tghost\n>0x14\tbyte&0x20\t0x20\tsystem-state\n#\n# lang:\n#\n>0x13\tbyte\t\t1\tmachine language\n>0x13\tbyte\t\t2\tBASIC I-code\n>0x13\tbyte\t\t3\tPascal P-code\n>0x13\tbyte\t\t4\tC I-code\n>0x13\tbyte\t\t5\tCOBOL I-code\n>0x13\tbyte\t\t6\tFortran I-code\n#\n#\n# type:\n#\n>0x12\tbyte\t\t1\tprogram executable\n>0x12\tbyte\t\t2\tsubroutine\n>0x12\tbyte\t\t3\tmulti-module\n>0x12\tbyte\t\t4\tdata module\n>0x12\tbyte\t\t11\ttrap library\n>0x12\tbyte\t\t12\tsystem module\n>0x12\tbyte\t\t13\tfile manager\n>0x12\tbyte\t\t14\tdevice driver\n>0x12\tbyte\t\t15\tdevice descriptor\n#\n# Mach magic number info\n#\n0\tlong\t\t0xefbe\tOSF/Rose object\n# I386 magic number info\n#\n0\tshort\t\t0565\ti386 COFF object\n\n#------------------------------------------------------------------------------\n# palm:  file(1) magic for PalmOS {.prc,.pdb}: applications, docfiles, and hacks\n#\n# Brian Lalor <blalor@hcirisc.cs.binghamton.edu>\n\n# appl\n60      belong                  0x6170706c      PalmOS application\n>0      string                  >\\0             \"%s\"\n# TEXt\n60      belong                  0x54455874      AportisDoc file\n>0      string                  >\\0             \"%s\"\n# HACK\n60      belong                  0x4841434b      HackMaster hack\n>0      string                  >\\0             \"%s\"\n\n# Variety of PalmOS document types\n# Michael-John Turner <mj@debian.org>\n# Thanks to Hasan Umit Ezerce <humit@tr-net.net.tr> for his DocType\n60\tstring\t                BVokBDIC\tBDicty PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                DB99DBOS\tDB PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                vIMGView\tFireViewer/ImageViewer PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                PmDBPmDB\tHanDBase PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                InfoINDB\tInfoView PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                ToGoToGo\tiSilo PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                JfDbJBas\tJFile PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                JfDbJFil\tJFile Pro PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                DATALSdb\tList PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                Mdb1Mdb1\tMobileDB PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                PNRdPPrs\tPeanutPress PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                DataPlkr\tPlucker PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                DataSprd\tQuickSheet PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                SM01SMem\tSuperMemo PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                TEXtTlDc\tTealDoc PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                InfoTlIf\tTealInfo PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                DataTlMl\tTealMeal PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                DataTlPt\tTealPaint PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                dataTDBP\tThinkDB PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                TdatTide\tTides PalmOS document\n>0\tstring                  >\\0             \"%s\"\n60\tstring\t                ToRaTRPW\tTomeRaider PalmOS document\n>0\tstring                  >\\0             \"%s\"\n\n# A GutenPalm zTXT etext for use on Palm Pilots (http://gutenpalm.sf.net)\n# For version 1.xx zTXTs, outputs version and numbers of bookmarks and\n#   annotations.\n# For other versions, just outputs version.\n#\n60\t\tstring\t\tzTXT\t\tA GutenPalm zTXT e-book\n>0\t\tstring\t\t>\\0\t\t\"%s\"\n>(0x4E.L)\tbyte\t\t0\n>>(0x4E.L+1)\tbyte\t\tx\t\t(v0.%02d)\n>(0x4E.L)\tbyte\t\t1\n>>(0x4E.L+1)\tbyte\t\tx\t\t(v1.%02d)\n>>>(0x4E.L+10)\tbeshort\t\t>0\n>>>>(0x4E.L+10) beshort\t\t<2\t\t- 1 bookmark\n>>>>(0x4E.L+10) beshort\t\t>1\t\t- %d bookmarks\n>>>(0x4E.L+14)\tbeshort\t\t>0\n>>>>(0x4E.L+14) beshort\t\t<2\t\t- 1 annotation\n>>>>(0x4E.L+14) beshort\t\t>1\t\t- %d annotations\n>(0x4E.L)\tbyte\t\t>1\t\t(v%d.\n>>(0x4E.L+1)\tbyte\t\tx\t\t%02d)\n\n# Palm OS .prc file types\n60\t\tstring\t\tlibr\t\tPalm OS dynamic library data\n>0\t\tstring\t\t>\\0\t\t\"%s\"\n60\t\tstring\t\tptch\t\tPalm OS operating system patch data\n>0\t\tstring\t\t>\\0\t\t\"%s\"\n\n# Mobipocket (www.mobipocket.com), donated by Carl Witty\n60\tstring\t                BOOKMOBI\tMobipocket E-book\n>0\tstring                  >\\0             \"%s\"\n\n#------------------------------------------------------------------------------\n#\n# Parix COFF executables\n# From: Ignatios Souvatzis <ignatios@cs.uni-bonn.de>\n#\n0\tbeshort&0xfff\t0xACE\tPARIX\n>0\tbyte&0xf0\t0x80\tT800\n>0\tbyte&0xf0\t0x90\tT9000\n>19\tbyte&0x02\t0x02\texecutable\n>19\tbyte&0x02\t0x00\tobject\n>19\tbyte&0x0c\t0x00\tnot stripped\n\n#------------------------------------------------------------------------------\n# pbm:  file(1) magic for Portable Bitmap files\n#\n# XXX - byte order?\n#\n0\tshort\t0x2a17\t\"compact bitmap\" format (Poskanzer)\n#------------------------------------------------------------------------------\n# pdf:  file(1) magic for Portable Document Format\n#\n\n0\tstring\t\t%PDF-\t\tPDF document\n!:mime\tapplication/pdf\n>5\tbyte\t\tx\t\t\\b, version %c\n>7\tbyte\t\tx\t\t\\b.%c\n\n# From: Nick Schmalenberger <nick@schmalenberger.us>\n# Forms Data Format\n0       string          %FDF-           FDF document\n>5      byte            x               \\b, version %c\n>7      byte            x               \\b.%c\n\n#------------------------------------------------------------------------------\n# pdp:  file(1) magic for PDP-11 executable/object and APL workspace\n#\n0\tlelong\t\t0101555\t\tPDP-11 single precision APL workspace\n0\tlelong\t\t0101554\t\tPDP-11 double precision APL workspace\n#\n# PDP-11 a.out\n#\n0\tleshort\t\t0407\t\tPDP-11 executable\n>8\tleshort\t\t>0\t\tnot stripped\n>15\tbyte\t\t>0\t\t- version %ld\n\n0\tleshort\t\t0401\t\tPDP-11 UNIX/RT ldp\n0\tleshort\t\t0405\t\tPDP-11 old overlay\n\n0\tleshort\t\t0410\t\tPDP-11 pure executable\n>8\tleshort\t\t>0\t\tnot stripped\n>15\tbyte\t\t>0\t\t- version %ld\n\n0\tleshort\t\t0411\t\tPDP-11 separate I&D executable\n>8\tleshort\t\t>0\t\tnot stripped\n>15\tbyte\t\t>0\t\t- version %ld\n\n0\tleshort\t\t0437\t\tPDP-11 kernel overlay\n\n# These last three are derived from 2.11BSD file(1)\n0\tleshort\t\t0413\t\tPDP-11 demand-paged pure executable\n>8\tleshort\t\t>0\t\tnot stripped\n\n0\tleshort\t\t0430\t\tPDP-11 overlaid pure executable\n>8\tleshort\t\t>0\t\tnot stripped\n\n0\tleshort\t\t0431\t\tPDP-11 overlaid separate executable\n>8\tleshort\t\t>0\t\tnot stripped\n#------------------------------------------------------------------------------\n# perl:  file(1) magic for Larry Wall's perl language.\n#\n# The `eval' lines recognizes an outrageously clever hack.\n# Keith Waclena <keith@cerberus.uchicago.edu>\n# Send additions to <perl5-porters@perl.org>\n0\tsearch/1/b\t#!\\ /bin/perl\t\t\tPerl script text executable\n!:mime\ttext/x-perl\n0\tsearch/1\teval\\ \"exec\\ /bin/perl\t\tPerl script text\n!:mime\ttext/x-perl\n0\tsearch/1/b\t#!\\ /usr/bin/perl\t\tPerl script text executable\n!:mime\ttext/x-perl\n0\tsearch/1\teval\\ \"exec\\ /usr/bin/perl\tPerl script text\n!:mime\ttext/x-perl\n0\tsearch/1/b\t#!\\ /usr/local/bin/perl\t\tPerl script text executable\n!:mime\ttext/x-perl\n0\tsearch/1\teval\\ \"exec\\ /usr/local/bin/perl\tPerl script text\n!:mime\ttext/x-perl\n0\tsearch/1\teval\\ '(exit\\ $?0)'\\ &&\\ eval\\ 'exec\tPerl script text\n!:mime\ttext/x-perl\n\n\n# by Dmitry V. Levin and Alexey Tourbin\n# check the first line\n0\tsearch/1\tpackage\n>0\tregex\t\t\\^package[\\ \\t]+[0-9A-Za-z_:]+\\ *;\tPerl5 module source text\n# not 'p', check other lines\n0\tsearch/1\t!p\n>0\tregex\t\t\\^package[\\ \\t]+[0-9A-Za-z_:]+\\ *;\n>>0\tregex\t\t\\^1\\ *;|\\^(use|sub|my)\\ .*[(;{=]\tPerl5 module source text\n\n\n\n# Perl POD documents\n# From: Tom Hukins <tom@eborcom.com>\n0\tsearch/1/B\t\\=pod\\n\t\tPerl POD document text\n0\tsearch/1/B\t\\n\\=pod\\n\tPerl POD document text\n0\tsearch/1/B\t\\=head1\\ \tPerl POD document text\n0\tsearch/1/B\t\\n\\=head1\\ \tPerl POD document text\n0\tsearch/1/B\t\\=head2\\ \tPerl POD document text\n0\tsearch/1/B\t\\n\\=head2\\ \tPerl POD document text\n\n# Perl Storable data files.\n0\tstring\tperl-store\tperl Storable (v0.6) data\n>4\tbyte\t>0\t(net-order %d)\n>>4\tbyte\t&01\t(network-ordered)\n>>4\tbyte\t=3\t(major 1)\n>>4\tbyte\t=2\t(major 1)\n\n0\tstring\tpst0\tperl Storable (v0.7) data\n>4\tbyte\t>0\n>>4\tbyte\t&01\t(network-ordered)\n>>4\tbyte\t=5\t(major 2)\n>>4\tbyte\t=4\t(major 2)\n>>5\tbyte\t>0\t(minor %d)\n\n#------------------------------------------------------------------------------\n# pgp:  file(1) magic for Pretty Good Privacy\n# see http://lists.gnupg.org/pipermail/gnupg-devel/1999-September/016052.html\n#\n0       beshort         0x9900                  PGP key public ring\n!:mime\tapplication/x-pgp-keyring\n0       beshort         0x9501                  PGP key security ring\n!:mime\tapplication/x-pgp-keyring\n0       beshort         0x9500                  PGP key security ring\n!:mime\tapplication/x-pgp-keyring\n0\tbeshort\t\t0xa600\t\t\tPGP encrypted data\n#!:mime\tapplication/pgp-encrypted\n#0\tstring\t\t-----BEGIN\\040PGP\ttext/PGP armored data\n!:mime\ttext/PGP # encoding: armored data\n#>15\tstring\tPUBLIC\\040KEY\\040BLOCK-\tpublic key block\n#>15\tstring\tMESSAGE-\t\tmessage\n#>15\tstring\tSIGNED\\040MESSAGE-\tsigned message\n#>15\tstring\tPGP\\040SIGNATURE-\tsignature\n\n2\tstring\t---BEGIN\\ PGP\\ PUBLIC\\ KEY\\ BLOCK-\tPGP public key block\n!:mime\tapplication/pgp-keys\n0\tstring\t-----BEGIN\\040PGP\\40MESSAGE-\t\tPGP message\n!:mime\tapplication/pgp\n0\tstring\t-----BEGIN\\040PGP\\40SIGNATURE-\t\tPGP signature\n!:mime\tapplication/pgp-signature\n\n#------------------------------------------------------------------------------\n# pkgadd:  file(1) magic for SysV R4 PKG Datastreams\n#\n0       string          #\\ PaCkAgE\\ DaTaStReAm  pkg Datastream (SVR4)\n!:mime\tapplication/x-svr4-package\n\n#------------------------------------------------------------------------------\n# plan9:  file(1) magic for AT&T Bell Labs' Plan 9 executables\n# From: \"Stefan A. Haubenthal\" <polluks@web.de>\n#\n0\tbelong\t\t0x00000107\tPlan 9 executable, Motorola 68k\n0\tbelong\t\t0x000001EB\tPlan 9 executable, Intel 386\n0\tbelong\t\t0x00000247\tPlan 9 executable, Intel 960\n0\tbelong\t\t0x000002AB\tPlan 9 executable, SPARC\n0\tbelong\t\t0x00000407\tPlan 9 executable, MIPS R3000\n0\tbelong\t\t0x0000048B\tPlan 9 executable, AT&T DSP 3210\n0\tbelong\t\t0x00000517\tPlan 9 executable, MIPS R4000 BE\n0\tbelong\t\t0x000005AB\tPlan 9 executable, AMD 29000\n0\tbelong\t\t0x00000647\tPlan 9 executable, ARM 7-something\n0\tbelong\t\t0x000006EB\tPlan 9 executable, PowerPC\n0\tbelong\t\t0x00000797\tPlan 9 executable, MIPS R4000 LE\n0\tbelong\t\t0x0000084B\tPlan 9 executable, DEC Alpha\n\n#------------------------------------------------------------------------------\n# plus5:  file(1) magic for Plus Five's UNIX MUMPS\n#\n# XXX - byte order?  Paging Hokey....\n#\n0\tshort\t\t0x259\t\tmumps avl global\n>2\tbyte\t\t>0\t\t(V%d)\n>6\tbyte\t\t>0\t\twith %d byte name\n>7\tbyte\t\t>0\t\tand %d byte data cells\n0\tshort\t\t0x25a\t\tmumps blt global\n>2\tbyte\t\t>0\t\t(V%d)\n>8\tshort\t\t>0\t\t- %d byte blocks\n>15\tbyte\t\t0x00\t\t- P/D format\n>15\tbyte\t\t0x01\t\t- P/K/D format\n>15\tbyte\t\t0x02\t\t- K/D format\n>15\tbyte\t\t>0x02\t\t- Bad Flags\n\n#------------------------------------------------------------------------------\n# printer:  file(1) magic for printer-formatted files\n#\n\n# PostScript, updated by Daniel Quinlan (quinlan@yggdrasil.com)\n0\tstring\t\t%!\t\tPostScript document text\n!:mime\tapplication/postscript\n!:apple\tASPSTEXT\n>2\tstring\t\tPS-Adobe-\tconforming\n>>11\tstring\t\t>\\0\t\tDSC level %.3s\n>>>15\tstring\t\tEPS\t\t\\b, type %s\n>>>15\tstring\t\tQuery\t\t\\b, type %s\n>>>15\tstring\t\tExitServer\t\\b, type %s\n>>>15   search/1000\t\t%%LanguageLevel:\\ \n>>>>&0\tstring\t\t>\\0\t\t\\b, Level %s\n# Some PCs have the annoying habit of adding a ^D as a document separator\n0\tstring\t\t\\004%!\t\tPostScript document text\n!:mime\tapplication/postscript\n!:apple\tASPSTEXT\n>3\tstring\t\tPS-Adobe-\tconforming\n>>12\tstring\t\t>\\0\t\tDSC level %.3s\n>>>16\tstring\t\tEPS\t\t\\b, type %s\n>>>16\tstring\t\tQuery\t\t\\b, type %s\n>>>16\tstring\t\tExitServer\t\\b, type %s\n>>>16   search/1000\t\t%%LanguageLevel:\\ \n>>>>&0\tstring\t\t>\\0\t\t\\b, Level %s\n0\tstring\t\t\\033%-12345X%!PS\tPostScript document\n\n# DOS EPS Binary File Header\n# From: Ed Sznyter <ews@Black.Market.NET>\n0       belong          0xC5D0D3C6      DOS EPS Binary File\n>4      long            >0              Postscript starts at byte %d\n>>8     long            >0              length %d\n>>>12   long            >0              Metafile starts at byte %d\n>>>>16  long            >0              length %d\n>>>20   long            >0              TIFF starts at byte %d\n>>>>24  long            >0              length %d\n\n# Summary: Adobe's PostScript Printer Description File\n# Extension: .ppd\n# Reference: http://partners.adobe.com/public/developer/en/ps/5003.PPD_Spec_v4.3.pdf, Section 3.8\n# Submitted by: Yves Arrouye <arrouye@marin.fdn.fr>\n#\n0\tstring\t\t*PPD-Adobe:\\x20\tPPD file\n>&0\tstring\t\tx\t\t\\b, version %s\n\n# HP Printer Job Language\n0\tstring\t\t\\033%-12345X@PJL\tHP Printer Job Language data\n# HP Printer Job Language\n# The header found on Win95 HP plot files is the \"Silliest Thing possible\" \n# (TM)\n# Every driver puts the language at some random position, with random case\n# (LANGUAGE and Language)\n# For example the LaserJet 5L driver puts the \"PJL ENTER LANGUAGE\" in line 10\n# From: Uwe Bonnes <bon@elektron.ikp.physik.th-darmstadt.de>\n# \n0\tstring\t\t\\033%-12345X@PJL\tHP Printer Job Language data\n>&0\tstring\t\t>\\0\t\t\t%s\t\t\t\n>>&0\tstring\t\t>\\0\t\t\t%s\t\t\t\n>>>&0\tstring\t\t>\\0\t\t\t%s\t\t\n>>>>&0\tstring\t\t>\\0\t\t\t%s\t\t\n#>15\tstring\t\t\\ ENTER\\ LANGUAGE\\ =\n#>31\tstring\t\tPostScript\t\tPostScript\n\n# HP Printer Control Language, Daniel Quinlan (quinlan@yggdrasil.com)\n0\tstring\t\t\\033E\\033\tHP PCL printer data\n>3\tstring\t\t\\&l0A\t\t- default page size\n>3\tstring\t\t\\&l1A\t\t- US executive page size\n>3\tstring\t\t\\&l2A\t\t- US letter page size\n>3\tstring\t\t\\&l3A\t\t- US legal page size\n>3\tstring\t\t\\&l26A\t\t- A4 page size\n>3\tstring\t\t\\&l80A\t\t- Monarch envelope size\n>3\tstring\t\t\\&l81A\t\t- No. 10 envelope size\n>3\tstring\t\t\\&l90A\t\t- Intl. DL envelope size\n>3\tstring\t\t\\&l91A\t\t- Intl. C5 envelope size\n>3\tstring\t\t\\&l100A\t\t- Intl. B5 envelope size\n>3\tstring\t\t\\&l-81A\t\t- No. 10 envelope size (landscape)\n>3\tstring\t\t\\&l-90A\t\t- Intl. DL envelope size (landscape)\n\n# IMAGEN printer-ready files:\n0\tstring\t@document(\t\tImagen printer\n# this only works if \"language xxx\" is first item in Imagen header.\n>10\tstring\tlanguage\\ impress\t(imPRESS data)\n>10\tstring\tlanguage\\ daisy\t\t(daisywheel text)\n>10\tstring\tlanguage\\ diablo\t(daisywheel text)\n>10\tstring\tlanguage\\ printer\t(line printer emulation)\n>10\tstring\tlanguage\\ tektronix\t(Tektronix 4014 emulation)\n# Add any other languages that your Imagen uses - remember\n# to keep the word `text' if the file is human-readable.\n# [GRR 950115:  missing \"postscript\" or \"ultrascript\" (whatever it was called)]\n#\n# Now magic for IMAGEN font files...\n0\tstring\t\tRast\t\tRST-format raster font data\n>45\tstring\t\t>0\t\tface %s\n# From Jukka Ukkonen\n0\tstring\t\t\\033[K\\002\\0\\0\\017\\033(a\\001\\0\\001\\033(g\tCanon Bubble Jet BJC formatted data\n\n# From <mike@flyn.org>\n# These are the /etc/magic entries to decode data sent to an Epson printer.\n0       string          \\x1B\\x40\\x1B\\x28\\x52\\x08\\x00\\x00REMOTE1P        Epson Stylus Color 460 data\n\n\n#------------------------------------------------------------------------------\n# zenographics:  file(1) magic for Zenographics ZjStream printer data\n# Rick Richardson  rickr@mn.rr.com\n0\tstring\t\tJZJZ\n>0x12\tstring\t\tZZ\t\tZenographics ZjStream printer data (big-endian)\n0\tstring\t\tZJZJ\n>0x12\tstring\t\tZZ\t\tZenographics ZjStream printer data (little-endian)\n\n\n#------------------------------------------------------------------------------\n# Oak Technologies printer stream\n# Rick Richardson <rickr@mn.rr.com>\n0       string          OAK\n>0x07\tbyte\t\t0\n>0x0b\tbyte\t\t0\tOak Technologies printer stream\n\n# This would otherwise be recognized as PostScript - nick@debian.org\n0\tstring\t\t%!VMF \t\tSunClock's Vector Map Format data\n\n#------------------------------------------------------------------------------\n# HP LaserJet 1000 series downloadable firmware file\n0\tstring\t\\xbe\\xefABCDEFGH\tHP LaserJet 1000 series downloadable firmware   \n\n# From: Paolo <oopla@users.sf.net>\n# Epson ESC/Page, ESC/PageColor \n0\tstring\t\\x1b\\x01@EJL\tEpson ESC/Page language printer data\n\n#------------------------------------------------------------------------------\n# project:  file(1) magic for Project management\n# \n# Magic strings for ftnchek project files. Alexander Mai\n0\tstring\tFTNCHEK_\\ P\tproject file for ftnchek\n>10\tstring\t1\t\tversion 2.7\n>10\tstring\t2\t\tversion 2.8 to 2.10\n>10\tstring\t3\t\tversion 2.11 or later\n\n#------------------------------------------------------------------------------\n# psdbms:  file(1) magic for psdatabase\n#\n0\tbelong&0xff00ffff\t0x56000000\tps database\n>1\tstring\t>\\0\tversion %s\n>4\tstring\t>\\0\tfrom kernel %s\n#------------------------------------------------------------------------------\n# psion:  file(1) magic for Psion handhelds data\n# from: Peter Breitenlohner <peb@mppmu.mpg.de>\n#\n0\tlelong\t\t0x10000037\tPsion Series 5\n>4\tlelong\t\t0x10000039\tfont file\n>4\tlelong\t\t0x1000003A\tprinter driver\n>4\tlelong\t\t0x1000003B\tclipboard\n>4\tlelong\t\t0x10000042\tmulti-bitmap image\n>4\tlelong\t\t0x1000006A\tapplication information file\n>4\tlelong\t\t0x1000006D\n>>8\tlelong\t\t0x1000007D\tsketch image\n!:mime image/x-psion-sketch\n>>8\tlelong\t\t0x1000007E\tvoice note\n>>8\tlelong\t\t0x1000007F\tword file\n>>8\tlelong\t\t0x10000085\tOPL program\n>>8\tlelong\t\t0x10000088\tsheet file\n>>8\tlelong\t\t0x100001C4\tEasyFax initialisation file\n>4\tlelong\t\t0x10000073\tOPO module\n>4\tlelong\t\t0x10000074\tOPL application\n>4\tlelong\t\t0x1000008A\texported multi-bitmap image\n\n0\tlelong\t\t0x10000041\tPsion Series 5 ROM multi-bitmap image\n\n0\tlelong\t\t0x10000050\tPsion Series 5\n>4\tlelong\t\t0x1000006D\tdatabase\n>4\tlelong\t\t0x100000E4\tini file\n\n0\tlelong\t\t0x10000079\tPsion Series 5 binary:\n>4\tlelong\t\t0x00000000\tDLL\n>4\tlelong\t\t0x10000049\tcomms hardware library\n>4\tlelong\t\t0x1000004A\tcomms protocol library\n>4\tlelong\t\t0x1000005D\tOPX\n>4\tlelong\t\t0x1000006C\tapplication\n>4\tlelong\t\t0x1000008D\tDLL\n>4\tlelong\t\t0x100000AC\tlogical device driver\n>4\tlelong\t\t0x100000AD\tphysical device driver\n>4\tlelong\t\t0x100000E5\tfile transfer protocol\n>4\tlelong\t\t0x100000E5\tfile transfer protocol\n>4\tlelong\t\t0x10000140\tprinter definition\n>4\tlelong\t\t0x10000141\tprinter definition\n\n0\tlelong\t\t0x1000007A\tPsion Series 5 executable\n\n#------------------------------------------------------------------------------\n# pulsar:  file(1) magic for Pulsar POP3 daemon binary files\n#\n# http://pulsar.sourceforge.net\n# mailto:rok.papez@lugos.si\n#\n\n0\tbelong\t0x1ee7f11e\tPulsar POP3 daemon mailbox cache file.\n>4\tubelong\tx\t\tVersion: %d.\n>8\tubelong\tx\t\t\\b%d\n\n\n#------------------------------------------------------------------------------\n# pyramid:  file(1) magic for Pyramids\n#\n# XXX - byte order?\n#\n0\tlong\t\t0x50900107\tPyramid 90x family executable\n0\tlong\t\t0x50900108\tPyramid 90x family pure executable\n>16\tlong\t\t>0\t\tnot stripped\n0\tlong\t\t0x5090010b\tPyramid 90x family demand paged pure executable\n>16\tlong\t\t>0\t\tnot stripped\n\n#------------------------------------------------------------------------------\n# python:  file(1) magic for python\n#\n# From: David Necas <yeti@physics.muni.cz>\n# often the module starts with a multiline string\n0\tstring\t\t\"\"\"\ta python script text executable\n# MAGIC as specified in Python/import.c (1.5 to 2.3.0a)\n# 20121  ( YEAR - 1995 ) + MONTH  + DAY (little endian followed by \"\\r\\n\"\n0\tbelong\t\t0x994e0d0a\tpython 1.5/1.6 byte-compiled\n0\tbelong\t\t0x87c60d0a\tpython 2.0 byte-compiled\n0\tbelong\t\t0x2aeb0d0a\tpython 2.1 byte-compiled\n0\tbelong\t\t0x2ded0d0a\tpython 2.2 byte-compiled\n0\tbelong\t\t0x3bf20d0a\tpython 2.3 byte-compiled\n0\tbelong\t\t0x6df20d0a\tpython 2.4 byte-compiled\n0\tbelong\t\t0xb3f20d0a\tpython 2.5 byte-compiled\n0\tbelong\t\t0xd1f20d0a\tpython 2.6 byte-compiled\n\n\n0\tstring/b  #!\\ /usr/bin/python\tpython script text executable\n\n\n#------------------------------------------------------------------------------\n# file(1) magic for revision control files\n# From Hendrik Scholz <hendrik@scholz.net>\n0\tstring\t/1\\ :pserver:\tcvs password text file\n\n# Conary changesets\n# From: Jonathan Smith <smithj@rpath.com>\n0\tbelong\t0xea3f81bb\tConary changeset data\n\n# Type: Git bundles (git-bundle)\n# From: Josh Triplett <josh@freedesktop.org>\n0\tstring\t#\\ v2\\ git\\ bundle\\n\tGit bundle\n\n# Type:\tMercurial bundles\n# From:\tSeo Sanghyeon <tinuviel@sparcs.kaist.ac.kr>\n0\tstring\tHG10\t\tMercurial bundle,\n>4\tstring\tUN\t\tuncompressed\n>4\tstring\tBZ\t\tbzip2 compressed\n\n#------------------------------------------------------------------------------\n# riff:  file(1) magic for RIFF format\n# See\n#\n#\thttp://www.seanet.com/users/matts/riffmci/riffmci.htm\n#\n# AVI section extended by Patrik Rdman <patrik+file-magic@iki.fi>\n#\n0\tstring\t\tRIFF\t\tRIFF (little-endian) data\n# RIFF Palette format\n>8\tstring\t\tPAL\t\t\\b, palette\n>>16\tleshort\t\tx\t\t\\b, version %d\n>>18\tleshort\t\tx\t\t\\b, %d entries\n# RIFF Device Independent Bitmap format\n>8\tstring\t\tRDIB\t\t\\b, device-independent bitmap\n>>16\tstring\t\tBM\t\t\n>>>30\tleshort\t\t12\t\t\\b, OS/2 1.x format\n>>>>34\tleshort\t\tx\t\t\\b, %d x\n>>>>36\tleshort\t\tx\t\t%d\n>>>30\tleshort\t\t64\t\t\\b, OS/2 2.x format\n>>>>34\tleshort\t\tx\t\t\\b, %d x\n>>>>36\tleshort\t\tx\t\t%d\n>>>30\tleshort\t\t40\t\t\\b, Windows 3.x format\n>>>>34\tlelong\t\tx\t\t\\b, %d x\n>>>>38\tlelong\t\tx\t\t%d x\n>>>>44\tleshort\t\tx\t\t%d\n# RIFF MIDI format\n>8\tstring\t\tRMID\t\t\\b, MIDI\n# RIFF Multimedia Movie File format\n>8\tstring\t\tRMMP\t\t\\b, multimedia movie\n# RIFF wrapper for MP3\n>8\tstring\t\tRMP3\t\t\\b, MPEG Layer 3 audio\n# Microsoft WAVE format (*.wav)\n>8\tstring\t\tWAVE\t\t\\b, WAVE audio\n!:mime\taudio/x-wav\n>>20\tleshort\t\t1\t\t\\b, Microsoft PCM\n>>>34\tleshort\t\t>0\t\t\\b, %d bit\n>>20\tleshort\t\t2\t\t\\b, Microsoft ADPCM\n>>20\tleshort\t\t6\t\t\\b, ITU G.711 A-law\n>>20\tleshort\t\t7\t\t\\b, ITU G.711 mu-law\n>>20\tleshort\t\t17\t\t\\b, IMA ADPCM\n>>20\tleshort\t\t20\t\t\\b, ITU G.723 ADPCM (Yamaha)\n>>20\tleshort\t\t49\t\t\\b, GSM 6.10\n>>20\tleshort\t\t64\t\t\\b, ITU G.721 ADPCM\n>>20\tleshort\t\t80\t\t\\b, MPEG\n>>20\tleshort\t\t85\t\t\\b, MPEG Layer 3\n>>22\tleshort\t\t=1\t\t\\b, mono\n>>22\tleshort\t\t=2\t\t\\b, stereo\n>>22\tleshort\t\t>2\t\t\\b, %d channels\n>>24\tlelong\t\t>0\t\t%d Hz\n# Corel Draw Picture\n>8\tstring\t\tCDRA\t\t\\b, Corel Draw Picture\n!:mime\timage/x-coreldraw\n# AVI == Audio Video Interleave\n>8\tstring\t\tAVI\\040\t\t\\b, AVI\n!:mime\tvideo/x-msvideo\n>>12    string          LIST\n>>>20   string          hdrlavih\n>>>>&36 lelong          x               \\b, %lu x\n>>>>&40 lelong          x               %lu,\n>>>>&4  lelong          >1000000        <1 fps,\n>>>>&4  lelong          1000000         1.00 fps,\n>>>>&4  lelong          500000          2.00 fps,\n>>>>&4  lelong          333333          3.00 fps,\n>>>>&4  lelong          250000          4.00 fps,\n>>>>&4  lelong          200000          5.00 fps,\n>>>>&4  lelong          166667          6.00 fps,\n>>>>&4  lelong          142857          7.00 fps,\n>>>>&4  lelong          125000          8.00 fps,\n>>>>&4  lelong          111111          9.00 fps,\n>>>>&4  lelong          100000          10.00 fps,\n# ]9.9,10.1[\n>>>>&4  lelong          <101010\n>>>>>&-4        lelong  >99010\n>>>>>>&-4       lelong  !100000         ~10 fps,\n>>>>&4  lelong          83333           12.00 fps,\n# ]11.9,12.1[\n>>>>&4  lelong          <84034\n>>>>>&-4        lelong  >82645\n>>>>>>&-4       lelong  !83333          ~12 fps,\n>>>>&4  lelong          66667           15.00 fps,\n# ]14.9,15.1[\n>>>>&4  lelong          <67114\n>>>>>&-4        lelong  >66225\n>>>>>>&-4       lelong  !66667          ~15 fps,\n>>>>&4  lelong          50000           20.00 fps,\n>>>>&4  lelong          41708           23.98 fps,\n>>>>&4  lelong          41667           24.00 fps,\n# ]23.9,24.1[\n>>>>&4  lelong          <41841\n>>>>>&-4        lelong  >41494\n>>>>>>&-4       lelong  !41708\n>>>>>>>&-4      lelong  !41667          ~24 fps,\n>>>>&4  lelong          40000           25.00 fps,\n# ]24.9,25.1[\n>>>>&4  lelong          <40161\n>>>>>&-4        lelong  >39841\n>>>>>>&-4       lelong  !40000          ~25 fps,\n>>>>&4  lelong          33367           29.97 fps,\n>>>>&4  lelong          33333           30.00 fps,\n# ]29.9,30.1[\n>>>>&4  lelong          <33445\n>>>>>&-4        lelong  >33223\n>>>>>>&-4       lelong  !33367\n>>>>>>>&-4      lelong  !33333          ~30 fps,\n>>>>&4  lelong          <32224          >30 fps,\n##>>>>&4  lelong          x               (%lu)\n##>>>>&20 lelong          x               %lu frames,\n# Note: The tests below assume that the AVI has 1 or 2 streams,\n#       \"vids\" optionally followed by \"auds\".\n#       (Should cover 99.9% of all AVIs.)\n# assuming avih length = 56\n>>>88   string  LIST\n>>>>96  string  strlstrh\n>>>>>108        string  vids    video:\n>>>>>>&0        lelong  0               uncompressed\n# skip past vids strh\n>>>>>>(104.l+108)       string  strf\n>>>>>>>(104.l+132)      lelong          1       RLE 8bpp\n>>>>>>>(104.l+132)      string/c        cvid    Cinepak\n>>>>>>>(104.l+132)      string/c        i263    Intel I.263\n>>>>>>>(104.l+132)      string/c        iv32    Indeo 3.2\n>>>>>>>(104.l+132)      string/c        iv41    Indeo 4.1\n>>>>>>>(104.l+132)      string/c        iv50    Indeo 5.0\n>>>>>>>(104.l+132)      string/c        mp42    Microsoft MPEG-4 v2\n>>>>>>>(104.l+132)      string/c        mp43    Microsoft MPEG-4 v3\n>>>>>>>(104.l+132)      string/c        fmp4    FFMpeg MPEG-4\n>>>>>>>(104.l+132)      string/c        mjpg    Motion JPEG\n>>>>>>>(104.l+132)      string/c        div3    DivX 3\n>>>>>>>>112             string/c        div3    Low-Motion\n>>>>>>>>112             string/c        div4    Fast-Motion\n>>>>>>>(104.l+132)      string/c        divx    DivX 4\n>>>>>>>(104.l+132)      string/c        dx50    DivX 5\n>>>>>>>(104.l+132)      string/c        xvid    XviD\n>>>>>>>(104.l+132)\tstring/c\th264\tH.264\n>>>>>>>(104.l+132)      string/c        wmv3    Windows Media Video 9\n>>>>>>>(104.l+132)      string/c        h264    X.264 or H.264\n>>>>>>>(104.l+132)      lelong  0\n##>>>>>>>(104.l+132)      string  x       (%.4s)\n# skip past first (video) LIST\n>>>>(92.l+96)   string  LIST\n>>>>>(92.l+104) string  strlstrh\n>>>>>>(92.l+116)        string          auds    \\b, audio:\n# auds strh length = 56:\n>>>>>>>(92.l+172)       string          strf\n>>>>>>>>(92.l+180)      leshort 0x0001  uncompressed PCM\n>>>>>>>>(92.l+180)      leshort 0x0002  ADPCM\n>>>>>>>>(92.l+180)      leshort 0x0006  aLaw\n>>>>>>>>(92.l+180)      leshort 0x0007  uLaw\n>>>>>>>>(92.l+180)      leshort 0x0050  MPEG-1 Layer 1 or 2\n>>>>>>>>(92.l+180)      leshort 0x0055  MPEG-1 Layer 3\n>>>>>>>>(92.l+180)      leshort 0x2000  Dolby AC3\n>>>>>>>>(92.l+180)      leshort 0x0161  DivX\n##>>>>>>>>(92.l+180)      leshort x       (0x%.4x)\n>>>>>>>>(92.l+182)      leshort 1       (mono,\n>>>>>>>>(92.l+182)      leshort 2       (stereo,\n>>>>>>>>(92.l+182)      leshort >2      (%d channels,\n>>>>>>>>(92.l+184)      lelong  x       %d Hz)\n# auds strh length = 64:\n>>>>>>>(92.l+180)       string          strf\n>>>>>>>>(92.l+188)      leshort 0x0001  uncompressed PCM\n>>>>>>>>(92.l+188)      leshort 0x0002  ADPCM\n>>>>>>>>(92.l+188)      leshort 0x0055  MPEG-1 Layer 3\n>>>>>>>>(92.l+188)      leshort 0x2000  Dolby AC3\n>>>>>>>>(92.l+188)      leshort 0x0161  DivX\n##>>>>>>>>(92.l+188)      leshort x       (0x%.4x)\n>>>>>>>>(92.l+190)      leshort 1       (mono,\n>>>>>>>>(92.l+190)      leshort 2       (stereo,\n>>>>>>>>(92.l+190)      leshort >2      (%d channels,\n>>>>>>>>(92.l+192)      lelong  x       %d Hz)\n# Animated Cursor format\n>8\tstring\t\tACON\t\t\\b, animated cursor\n# SoundFont 2 <mpruett@sgi.com>\n>8\tstring\t\tsfbk\t\tSoundFont/Bank\n# MPEG-1 wrapped in a RIFF, apparently\n>8      string          CDXA            \\b, wrapped MPEG-1 (CDXA)\n>8\tstring\t\t4XMV\t\t\\b, 4X Movie file \n\n#\n# XXX - some of the below may only appear in little-endian form.\n#\n# Also \"MV93\" appears to be for one form of Macromedia Director\n# files, and \"GDMF\" appears to be another multimedia format.\n#\n0\tstring\t\tRIFX\t\tRIFF (big-endian) data\n# RIFF Palette format\n>8\tstring\t\tPAL\t\t\\b, palette\n>>16\tbeshort\t\tx\t\t\\b, version %d\n>>18\tbeshort\t\tx\t\t\\b, %d entries\n# RIFF Device Independent Bitmap format\n>8\tstring\t\tRDIB\t\t\\b, device-independent bitmap\n>>16\tstring\t\tBM\t\t\n>>>30\tbeshort\t\t12\t\t\\b, OS/2 1.x format\n>>>>34\tbeshort\t\tx\t\t\\b, %d x\n>>>>36\tbeshort\t\tx\t\t%d\n>>>30\tbeshort\t\t64\t\t\\b, OS/2 2.x format\n>>>>34\tbeshort\t\tx\t\t\\b, %d x\n>>>>36\tbeshort\t\tx\t\t%d\n>>>30\tbeshort\t\t40\t\t\\b, Windows 3.x format\n>>>>34\tbelong\t\tx\t\t\\b, %d x\n>>>>38\tbelong\t\tx\t\t%d x\n>>>>44\tbeshort\t\tx\t\t%d\n# RIFF MIDI format\n>8\tstring\t\tRMID\t\t\\b, MIDI\n# RIFF Multimedia Movie File format\n>8\tstring\t\tRMMP\t\t\\b, multimedia movie\n# Microsoft WAVE format (*.wav)\n>8\tstring\t\tWAVE\t\t\\b, WAVE audio\n>>20\tleshort\t\t1\t\t\\b, Microsoft PCM\n>>>34\tleshort\t\t>0\t\t\\b, %d bit\n>>22\tbeshort\t\t=1\t\t\\b, mono\n>>22\tbeshort\t\t=2\t\t\\b, stereo\n>>22\tbeshort\t\t>2\t\t\\b, %d channels\n>>24\tbelong\t\t>0\t\t%d Hz\n# Corel Draw Picture\n>8\tstring\t\tCDRA\t\t\\b, Corel Draw Picture\n# AVI == Audio Video Interleave\n>8\tstring\t\tAVI\\040\t\t\\b, AVI\n# Animated Cursor format\n>8\tstring\t\tACON\t\t\\b, animated cursor\n# Notation Interchange File Format (big-endian only)\n>8\tstring\t\tNIFF\t\t\\b, Notation Interchange File Format\n# SoundFont 2 <mpruett@sgi.com>\n>8\tstring\t\tsfbk\t\tSoundFont/Bank\n#------------------------------------------------------------------------------\n#\n# RPM: file(1) magic for Red Hat Packages   Erik Troan (ewt@redhat.com)\n#\n0\tbeshort\t\t0xedab\n>2\tbeshort\t\t0xeedb\t\tRPM\n!:mime\tapplication/x-rpm\n>>4\tbyte\t\tx\t\tv%d\n>>6\tbeshort\t\t0\t\tbin\n>>6\tbeshort\t\t1\t\tsrc\n>>8\tbeshort\t\t1\t\ti386\n>>8\tbeshort\t\t2\t\tAlpha\n>>8\tbeshort\t\t3\t\tSparc\n>>8\tbeshort\t\t4\t\tMIPS\n>>8\tbeshort\t\t5\t\tPowerPC\n>>8\tbeshort\t\t6\t\t68000\n>>8\tbeshort\t\t7\t\tSGI\n>>8\tbeshort\t\t8\t\tRS6000\n>>8\tbeshort\t\t9\t\tIA64\n>>8\tbeshort\t\t10\t\tSparc64\n>>8\tbeshort\t\t11\t\tMIPSel\n>>8\tbeshort\t\t12\t\tARM\n>>10\tstring\t\tx\t\t%s\n\n#------------------------------------------------------------------------------\n# rtf:\tfile(1) magic for Rich Text Format (RTF)\n#\n# Duncan P. Simpson, D.P.Simpson@dcs.warwick.ac.uk\n#\n0\tstring\t\t{\\\\rtf\t\tRich Text Format data,\n!:mime\ttext/rtf\n>5\tstring\t\t1\t\tversion 1,\n>>6\tstring\t\t\\\\ansi\t\tANSI\n>>6\tstring\t\t\\\\mac\t\tApple Macintosh\n>>6\tstring\t\t\\\\pc\t\tIBM PC, code page 437\n>>6\tstring\t\t\\\\pca\t\tIBM PS/2, code page 850\n>>6\tdefault\t\tx\t\tunknown character set\n>5\tdefault\t\tx\t\tunknown version\n#------------------------------------------------------------------------------\n# ruby:  file(1) magic for Lua scripting language\n# URL:  http://www.ruby-lang.org/\n# From: Reuben Thomas <rrt@sc3d.org>\n\n# Ruby scripts\n0\tsearch/1/b\t#!\\ /usr/bin/ruby\tRuby script text executable\n0\tsearch/1/b\t#!\\ /usr/local/bin/ruby\tRuby script text executable\n0\tsearch/1\t#!/usr/bin/env\\ ruby\tRuby script text executable\n0\tsearch/1\t#!\\ /usr/bin/env\\ ruby\tRuby script text executable\n\n#------------------------------------------------------------------------------\n# sc:  file(1) magic for \"sc\" spreadsheet\n#\n38\tstring\t\tSpreadsheet\tsc spreadsheet file\n!:mime\tapplication/x-sc\n\n#------------------------------------------------------------------------------\n# sccs:  file(1) magic for SCCS archives\n#\n# SCCS archive structure:\n# \\001h01207\n# \\001s 00276/00000/00000\n# \\001d D 1.1 87/09/23 08:09:20 ian 1 0\n# \\001c date and time created 87/09/23 08:09:20 by ian\n# \\001e\n# \\001u\n# \\001U\n# ... etc.\n# Now '\\001h' happens to be the same as the 3B20's a.out magic number (0550).\n# *Sigh*. And these both came from various parts of the USG.\n# Maybe we should just switch everybody from SCCS to RCS!\n# Further, you can't just say '\\001h0', because the five-digit number\n# is a checksum that could (presumably) have any leading digit,\n# and we don't have regular expression matching yet. \n# Hence the following official kludge:\n8\tstring\t\t\\001s\\ \t\t\tSCCS archive data\n#------------------------------------------------------------------------------\n# scientific:  file(1) magic for scientific formats \n#\n# From: Joe Krahn <krahn@niehs.nih.gov>\n\n########################################################\n# CCP4 data and plot files:\n0\tstring\t\tMTZ\\040\t\tMTZ reflection file\n\n92\tstring\t\tPLOT%%84\tPlot84 plotting file\n>52\tbyte\t\t1\t\t, Little-endian\n>55\tbyte\t\t1\t\t, Big-endian\n\n########################################################\n# Electron density MAP/MASK formats\n\n0\tstring\t\tEZD_MAP\tNEWEZD Electron Density Map\n109\tstring\t\tMAP\\040(  Old EZD Electron Density Map\n\n0\tstring/c\t:-)\\040Origin\tBRIX Electron Density Map\n>170\tstring\t\t>0\t, Sigma:%.12s\n#>4\tstring\t\t>0\t%.178s\n#>4\taddr\t\tx\t%.178s\n\n7\tstring\t\t18\\040!NTITLE\tXPLOR ASCII Electron Density Map\n9\tstring\t\t\\040!NTITLE\\012\\040REMARK\tCNS ASCII electron density map\n\n208\tstring\t\tMAP\\040\tCCP4 Electron Density Map\n# Assumes same stamp for float and double (normal case)\n>212\tbyte\t\t17\t\\b, Big-endian\n>212\tbyte\t\t34\t\\b, VAX format\n>212\tbyte\t\t68\t\\b, Little-endian\n>212\tbyte\t\t85\t\\b, Convex native\n\n############################################################\n# X-Ray Area Detector images\n0\tstring\tR-AXIS4\\ \\ \\ \tR-Axis Area Detector Image:\n>796\tlelong\t<20\t\tLittle-endian, IP #%d,\n>>768\tlelong\t>0\t\tSize=%dx\n>>772\tlelong\t>0\t\t\\b%d\n>796\tbelong\t<20\t\tBig-endian, IP #%d,\n>>768\tbelong\t>0\t\tSize=%dx\n>>772\tbelong\t>0\t\t\\b%d\n\n0\tstring\tRAXIS\\ \\ \\ \\ \\ \tR-Axis Area Detector Image, Win32:\n>796\tlelong\t<20\t\tLittle-endian, IP #%d,\n>>768\tlelong\t>0\t\tSize=%dx\n>>772\tlelong\t>0\t\t\\b%d\n>796\tbelong\t<20\t\tBig-endian, IP #%d,\n>>768\tbelong\t>0\t\tSize=%dx\n>>772\tbelong\t>0\t\t\\b%d\n\n\n1028\tstring\tMMX\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\tMAR Area Detector Image,\n>1072\tulong\t>1\t\tCompressed(%d),\n>1100\tulong\t>1\t\t%d headers,\n>1104\tulong\t>0\t\t%d x\n>1108\tulong\t>0\t\t%d,\n>1120\tulong\t>0\t\t%d bits/pixel\n\n# Type: GEDCOM genealogical (family history) data\n# From: Giuseppe Bilotta\n0       search/1/c\t0\\ HEAD         GEDCOM genealogy text\n>&0     search\t\t1\\ GEDC\n>>&0    search\t\t2\\ VERS         version\n>>>&1   search/1\t>\\0\t\t%s\n# From: Phil Endecott <phil05@chezphil.org>\n0\tstring\t\\000\\060\\000\\040\\000\\110\\000\\105\\000\\101\\000\\104\t\tGEDCOM data\n0\tstring\t\\060\\000\\040\\000\\110\\000\\105\\000\\101\\000\\104\\000\t\tGEDCOM data\n0\tstring\t\\376\\377\\000\\060\\000\\040\\000\\110\\000\\105\\000\\101\\000\\104\tGEDCOM data\n0\tstring\t\\377\\376\\060\\000\\040\\000\\110\\000\\105\\000\\101\\000\\104\\000\tGEDCOM data\n0\tsearch/1\t\t-----BEGIN\\ CERTIFICATE------\tRFC1421 Security Certificate text\n0\tsearch/1\t\t-----BEGIN\\ NEW\\ CERTIFICATE\tRFC1421 Security Certificate Signing Request text\n0\tbelong\t0xedfeedfe\tSun 'jks' Java Keystore File data\n\n#------------------------------------------------------------------------------\n# sendmail:  file(1) magic for sendmail config files\n#\n# XXX - byte order?\n#\n0\tbyte\t046\t  Sendmail frozen configuration \n>16\tstring\t>\\0\t  - version %s\n0\tshort\t0x271c\t  Sendmail frozen configuration\n>16\tstring\t>\\0\t  - version %s\n\n#------------------------------------------------------------------------------\n# sendmail:  file(1) magic for sendmail m4(1) files\n#\n# From Hendrik Scholz <hendrik@scholz.net>\n# i.e. files in /usr/share/sendmail/cf/\n#\n0   string  divert(-1)\\n    sendmail m4 text file\n\n\n#------------------------------------------------------------------------------\n# sequent:  file(1) magic for Sequent machines\n#\n# Sequent information updated by Don Dwiggins <atsun!dwiggins>.\n# For Sequent's multiprocessor systems (incomplete).\n0\tlelong\t0x00ea        \tBALANCE NS32000 .o\n>16\tlelong\t>0\t\tnot stripped\n>124\tlelong\t>0\t\tversion %ld\n0\tlelong\t0x10ea        \tBALANCE NS32000 executable (0 @ 0)\n>16\tlelong  >0            \tnot stripped\n>124\tlelong\t>0\t\tversion %ld\n0\tlelong\t0x20ea        \tBALANCE NS32000 executable (invalid @ 0)\n>16\tlelong  >0            \tnot stripped\n>124\tlelong\t>0\t\tversion %ld\n0\tlelong\t0x30ea        \tBALANCE NS32000 standalone executable\n>16\tlelong  >0          \tnot stripped\n>124\tlelong\t>0\t\tversion %ld\n#\n# Symmetry information added by Jason Merrill <jason@jarthur.claremont.edu>.\n# Symmetry magic nums will not be reached if DOS COM comes before them;\n# byte 0xeb is matched before these get a chance.\n0\tleshort\t0x12eb\t\tSYMMETRY i386 .o\n>16\tlelong\t>0\t\tnot stripped\n>124\tlelong\t>0\t\tversion %ld\n0\tleshort\t0x22eb\t\tSYMMETRY i386 executable (0 @ 0)\n>16\tlelong\t>0\t\tnot stripped\n>124\tlelong\t>0\t\tversion %ld\n0\tleshort\t0x32eb\t\tSYMMETRY i386 executable (invalid @ 0)\n>16\tlelong\t>0\t\tnot stripped\n>124\tlelong\t>0\t\tversion %ld\n0\tleshort\t0x42eb\t\tSYMMETRY i386 standalone executable\n>16\tlelong\t>0\t\tnot stripped\n>124\tlelong\t>0\t\tversion %ld\n\n#------------------------------------------------------------------------------\n# sgi:  file(1) magic for Silicon Graphics applications\n\n#\n#\n# Performance Co-Pilot file types\n0\tstring\tPmNs\t\t\t\tPCP compiled namespace (V.0)\n0\tstring\tPmN\t\t\t\tPCP compiled namespace\n>3\tstring\t>\\0\t\t\t\t(V.%1.1s)\n#3\tlelong\t0x84500526\t\t\tPCP archive\n3\tbelong\t0x84500526\t\t\tPCP archive\n>7\tbyte\tx\t\t\t\t(V.%d)\n#>20\tlelong\t-2\t\t\t\ttemporal index\n#>20\tlelong\t-1\t\t\t\tmetadata\n#>20\tlelong\t0\t\t\t\tlog volume #0\n#>20\tlelong\t>0\t\t\t\tlog volume #%ld\n>20\tbelong\t-2\t\t\t\ttemporal index\n>20\tbelong\t-1\t\t\t\tmetadata\n>20\tbelong\t0\t\t\t\tlog volume #0\n>20\tbelong\t>0\t\t\t\tlog volume #%ld\n>24\tstring\t>\\0\t\t\t\thost: %s\n0\tstring\tPCPFolio\t\t\tPCP\n>9\tstring\tVersion:\t\t\tArchive Folio\n>18\tstring\t>\\0\t\t\t\t(V.%s)\n0\tstring\t#pmchart\t\t\tPCP pmchart view\n>9\tstring\tVersion\n>17\tstring\t>\\0\t\t\t\t(V%-3.3s)\n0\tstring\t#kmchart\t\t\tPCP kmchart view\n>9\tstring\tVersion\n>17\tstring\t>\\0\t\t\t\t(V.%s)\n0\tstring\tpmview\t\t\t\tPCP pmview config\n>7\tstring\tVersion\n>15\tstring\t>\\0\t\t\t\t(V%-3.3s)\n0\tstring\t#pmlogger\t\t\tPCP pmlogger config\n>10\tstring\tVersion\n>18\tstring\t>\\0\t\t\t\t(V%1.1s)\n0\tstring\t#pmdahotproc\t\t\tPCP pmdahotproc config\n>13\tstring\tVersion\n>21\tstring\t>\\0\t\t\t\t(V%-3.3s)\n0\tstring\tPcPh\t\t\t\tPCP Help\n>4\tstring\t1\t\t\t\tIndex\n>4\tstring\t2\t\t\t\tText\n>5\tstring\t>\\0\t\t\t\t(V.%1.1s)\n0\tstring\t#pmieconf-rules\t\t\tPCP pmieconf rules\n>16\tstring\t>\\0\t\t\t\t(V.%1.1s)\n3\tstring\tpmieconf-pmie\t\t\tPCP pmie config\n>17\tstring\t>\\0\t\t\t\t(V.%1.1s)\n\n# SpeedShop data files\n0\tlelong\t0x13130303\t\t\tSpeedShop data file\n\n# mdbm files\n0\tlelong\t0x01023962\t\t\tmdbm file, version 0 (obsolete)\n0\tstring\tmdbm\t\t\t\tmdbm file,\n>5\tbyte\tx\t\t\t\tversion %d,\n>6\tbyte\tx\t\t\t\t2^%d pages,\n>7\tbyte\tx\t\t\t\tpagesize 2^%d,\n>17\tbyte\tx\t\t\t\thash %d,\n>11\tbyte\tx\t\t\t\tdataformat %d\n\n# Alias Maya files\n0\tstring\t//Maya ASCII\tAlias Maya Ascii File,\n>13\tstring\t>\\0\tversion %s\n8\tstring\tMAYAFOR4\tAlias Maya Binary File,\n>32\tstring\t>\\0\tversion %s scene\n8\tstring\tMayaFOR4\tAlias Maya Binary File,\n>32\tstring\t>\\0\tversion %s scene\n8\tstring\tCIMG\t\tAlias Maya Image File\n8\tstring\tDEEP\t\tAlias Maya Image File\n#------------------------------------------------------------------------------\n# Type:\tSVG Vectorial Graphics\n# From:\tNoel Torres <tecnico@ejerciciosresueltos.com>\n0\tstring\t\t\\<?xml\\ version=\"\n>15\tstring\t\t>\\0\n>>23\tsearch/400\t\\<svg\t\t\tSVG Scalable Vector Graphics image\n!:mime\timage/svg+xml\n>>23\tsearch/400\t\\<gnc-v2\t\tGnuCash file\n!:mime\tapplication/x-gnucash\n\n# Sitemap file\n0\tstring\t\t\\<?xml\\ version=\"\n>15\tstring\t\t>\\0\n>>23\tsearch/400\t\\<urlset\t\tXML Sitemap document text\n!:mime\tapplication/xml-sitemap\n\n#------------------------------------------------------------------------------\n# sgml:  file(1) magic for Standard Generalized Markup Language\n# HyperText Markup Language (HTML) is an SGML document type,\n# from Daniel Quinlan (quinlan@yggdrasil.com)\n# adapted to string extenstions by Anthon van der Neut <anthon@mnt.org)\n0\tsearch/1/cB\t\\<!doctype\\ html\tHTML document text\n!:mime\ttext/html\n0\tsearch/1/cb\t\\<head\t\t\tHTML document text\n!:mime\ttext/html\n0\tsearch/1/cb\t\\<title\t\t\tHTML document text\n!:mime\ttext/html\n0\tsearch/1/cb\t\\<html\t\t\tHTML document text\n!:mime\ttext/html\n\n# Extensible markup language (XML), a subset of SGML\n# from Marc Prud'hommeaux (marc@apocalypse.org)\n0\tsearch/1/cb\t\\<?xml\t\t\tXML document text\n!:mime\tapplication/xml\n0\tstring\t\t\\<?xml\\ version\\ \"\tXML\n!:mime\tapplication/xml\n0\tstring\t\t\\<?xml\\ version=\"\tXML\n!:mime\tapplication/xml\n>15\tsearch/1\t>\\0\t\t\t%.3s document text\n>>23\tsearch/1\t\\<xsl:stylesheet\t(XSL stylesheet)\n>>24\tsearch/1\t\\<xsl:stylesheet\t(XSL stylesheet)\n0\tstring\t\t\\<?xml\\ version='\tXML\n!:mime\tapplication/xml\n>15\tsearch/1\t>\\0\t\t\t%.3s document text\n>>23\tsearch/1\t\\<xsl:stylesheet\t(XSL stylesheet)\n>>24\tsearch/1\t\\<xsl:stylesheet\t(XSL stylesheet)\n0\tsearch/1/b\t\\<?xml\t\t\tXML document text\n!:mime\tapplication/xml\n0\tsearch/1/b\t\\<?XML\t\t\tbroken XML document text\n!:mime\tapplication/xml\n\n\n# SGML, mostly from rph@sq\n0\tsearch/1/cb\t\\<!doctype\t\texported SGML document text\n0\tsearch/1/cb\t\\<!subdoc\t\texported SGML subdocument text\n0\tsearch/1/cb\t\\<!--\t\t\texported SGML document text\n\n# Web browser cookie files\n# (Mozilla, Galeon, Netscape 4, Konqueror..)\n# Ulf Harnhammar <ulfh@update.uu.se>\n0\tsearch/1\t#\\ HTTP\\ Cookie\\ File\tWeb browser cookie text\n0\tsearch/1\t#\\ Netscape\\ HTTP\\ Cookie\\ File\tNetscape cookie text\n0\tsearch/1\t#\\ KDE\\ Cookie\\ File\tKonqueror cookie text\n\n#------------------------------------------------------------------------\n# file(1) magic for sharc files\n#\n# SHARC DSP, MIDI SysEx and RiscOS filetype definitions added by \n# FutureGroove Music (dsp@futuregroove.de)\n\n#------------------------------------------------------------------------\n#0\tstring\t\t\tDraw\t\tRiscOS Drawfile\n#0\tstring\t\t\tPACK\t\tRiscOS PackdDir archive\n\n#------------------------------------------------------------------------\n# SHARC DSP stuff (based on the FGM SHARC DSP SDK)\n\n#0\tstring\t\t\t=!\t\tAssembler source\n#0\tstring\t\t\tAnalog\t\tADi asm listing file\n0\tstring\t\t\t.SYSTEM\t\tSHARC architecture file\n0\tstring\t\t\t.system\t\tSHARC architecture file\n\n0\tleshort\t\t\t0x521C\t\tSHARC COFF binary\n>2\tleshort\t\t\t>1\t\t, %hd sections\n>>12\tlelong\t\t\t>0\t\t, not stripped\n\n#------------------------------------------------------------------------------\n# sinclair:  file(1) sinclair QL\n\n# additions to /etc/magic by Thomas M. Ott (ThMO)\n\n# Sinclair QL floppy disk formats (ThMO)\n0\tstring\t=QL5\t\tQL disk dump data,\n>3\tstring\t=A\t\t720 KB,\n>3\tstring\t=B\t\t1.44 MB,\n>3\tstring\t=C\t\t3.2 MB,\n>4\tstring\t>\\0\t\tlabel:%.10s\n\n# Sinclair QL OS dump (ThMO)\n# (NOTE: if `file' would be able to use indirect references in a endian format\n#\t differing from the natural host format, this could be written more\n#\t reliably and faster...)\n#\n# we *can't* lookup QL OS code dumps, because `file' is UNABLE to read more\n# than the first 8K of a file... #-(\n#\n#0\t\tbelong\t=0x30000\n#>49124\t\tbelong\t<47104\n#>>49128\t\tbelong\t<47104\n#>>>49132\tbelong\t<47104\n#>>>>49136\tbelong\t<47104\tQL OS dump data,\n#>>>>>49148\tstring\t>\\0\ttype %.3s,\n#>>>>>49142\tstring\t>\\0\tversion %.4s\n\n# Sinclair QL firmware executables (ThMO)\n0\tstring\tNqNqNq`\\004\tQL firmware executable (BCPL)\n\n# Sinclair QL libraries (was ThMO)\n0\tbeshort\t0xFB01\t\tQDOS object\n>2\tpstring\tx\t\t'%s'\n\n# Sinclair QL executables (was ThMO)\n4\tbelong\t0x4AFB\t\tQDOS executable\n>9\tpstring\tx\t\t'%s'\n\n# Sinclair QL ROM (ThMO)\n0\tbelong\t=0x4AFB0001\tQL plugin-ROM data,\n>9\tpstring\t=\\0\t\tun-named\n>9\tpstring\t>\\0\t\tnamed: %s\n#------------------------------------------------------------------------------\n# Sketch Drawings: http://sketch.sourceforge.net/ \n# From: Edwin Mons <e@ik.nu>\n0\tsearch/1\t##Sketch\tSketch document text\n\n#-----------------------------------------------\n# GNU Smalltalk image, starting at version 1.6.2\n# From: catull_us@yahoo.com\n#\n0\tstring\tGSTIm\\0\\0\tGNU SmallTalk\n# little-endian\n>7\tbyte&1\t=0\t\tLE image version\n>>10\tbyte\tx\t\t%d.\n>>9\tbyte\tx\t\t\\b%d.\n>>8\tbyte\tx\t\t\\b%d\n#>>12\tlelong\tx\t\t, data: %ld\n#>>16\tlelong\tx\t\t, table: %ld\n#>>20\tlelong\tx\t\t, memory: %ld\n# big-endian\n>7\tbyte&1\t=1\t\tBE image version\n>>8\tbyte\tx\t\t%d.\n>>9\tbyte\tx\t\t\\b%d.\n>>10\tbyte\tx\t\t\\b%d\n#>>12\tbelong\tx\t\t, data: %ld\n#>>16\tbelong\tx\t\t, table: %ld\n#>>20\tbelong\tx\t\t, memory: %ld\n\n\n\n#------------------------------------------------------------------------------\n# sniffer:  file(1) magic for packet capture files\n#\n# From: guy@alum.mit.edu (Guy Harris)\n#\n\n#\n# Microsoft Network Monitor 1.x capture files.\n#\n0\tstring\t\tRTSS\t\tNetMon capture file\n>5\tbyte\t\tx\t\t- version %d\n>4\tbyte\t\tx\t\t\\b.%d\n>6\tleshort\t\t0\t\t(Unknown)\n>6\tleshort\t\t1\t\t(Ethernet)\n>6\tleshort\t\t2\t\t(Token Ring)\n>6\tleshort\t\t3\t\t(FDDI)\n>6\tleshort\t\t4\t\t(ATM)\n\n#\n# Microsoft Network Monitor 2.x capture files.\n#\n0\tstring\t\tGMBU\t\tNetMon capture file\n>5\tbyte\t\tx\t\t- version %d\n>4\tbyte\t\tx\t\t\\b.%d\n>6\tleshort\t\t0\t\t(Unknown)\n>6\tleshort\t\t1\t\t(Ethernet)\n>6\tleshort\t\t2\t\t(Token Ring)\n>6\tleshort\t\t3\t\t(FDDI)\n>6\tleshort\t\t4\t\t(ATM)\n\n#\n# Network General Sniffer capture files.\n# Sorry, make that \"Network Associates Sniffer capture files.\"\n# Sorry, make that \"Network General old DOS Sniffer capture files.\"\n#\n0\tstring\t\tTRSNIFF\\ data\\ \\ \\ \\ \\032\tSniffer capture file\n>33\tbyte\t\t2\t\t(compressed)\n>23\tleshort\t\tx\t\t- version %d\n>25\tleshort\t\tx\t\t\\b.%d\n>32\tbyte\t\t0\t\t(Token Ring)\n>32\tbyte\t\t1\t\t(Ethernet)\n>32\tbyte\t\t2\t\t(ARCNET)\n>32\tbyte\t\t3\t\t(StarLAN)\n>32\tbyte\t\t4\t\t(PC Network broadband)\n>32\tbyte\t\t5\t\t(LocalTalk)\n>32\tbyte\t\t6\t\t(Znet)\n>32\tbyte\t\t7\t\t(Internetwork Analyzer)\n>32\tbyte\t\t9\t\t(FDDI)\n>32\tbyte\t\t10\t\t(ATM)\n\n#\n# Cinco Networks NetXRay capture files.\n# Sorry, make that \"Network General Sniffer Basic capture files.\"\n# Sorry, make that \"Network Associates Sniffer Basic capture files.\"\n# Sorry, make that \"Network Associates Sniffer Basic, and Windows\n# Sniffer Pro\", capture files.\"\n# Sorry, make that \"Network General Sniffer capture files.\"\n#\n0\tstring\t\tXCP\\0\t\tNetXRay capture file\n>4\tstring\t\t>\\0\t\t- version %s\n>44\tleshort\t\t0\t\t(Ethernet)\n>44\tleshort\t\t1\t\t(Token Ring)\n>44\tleshort\t\t2\t\t(FDDI)\n>44\tleshort\t\t3\t\t(WAN)\n>44\tleshort\t\t8\t\t(ATM)\n>44\tleshort\t\t9\t\t(802.11)\n\n#\n# \"libpcap\" capture files.\n# (We call them \"tcpdump capture file(s)\" for now, as \"tcpdump\" is\n# the main program that uses that format, but there are other programs\n# that use \"libpcap\", or that use the same capture file format.)\n#\n0\tubelong\t\t0xa1b2c3d4\ttcpdump capture file (big-endian)\n>4\tbeshort\t\tx\t\t- version %d\n>6\tbeshort\t\tx\t\t\\b.%d\n>20\tbelong\t\t0\t\t(No link-layer encapsulation\n>20\tbelong\t\t1\t\t(Ethernet\n>20\tbelong\t\t2\t\t(3Mb Ethernet\n>20\tbelong\t\t3\t\t(AX.25\n>20\tbelong\t\t4\t\t(ProNET\n>20\tbelong\t\t5\t\t(CHAOS\n>20\tbelong\t\t6\t\t(Token Ring\n>20\tbelong\t\t7\t\t(BSD ARCNET\n>20\tbelong\t\t8\t\t(SLIP\n>20\tbelong\t\t9\t\t(PPP\n>20\tbelong\t\t10\t\t(FDDI\n>20\tbelong\t\t11\t\t(RFC 1483 ATM\n>20\tbelong\t\t12\t\t(raw IP\n>20\tbelong\t\t13\t\t(BSD/OS SLIP\n>20\tbelong\t\t14\t\t(BSD/OS PPP\n>20\tbelong\t\t19\t\t(Linux ATM Classical IP\n>20\tbelong\t\t50\t\t(PPP or Cisco HDLC\n>20\tbelong\t\t51\t\t(PPP-over-Ethernet\n>20\tbelong\t\t99\t\t(Symantec Enterprise Firewall\n>20\tbelong\t\t100\t\t(RFC 1483 ATM\n>20\tbelong\t\t101\t\t(raw IP\n>20\tbelong\t\t102\t\t(BSD/OS SLIP\n>20\tbelong\t\t103\t\t(BSD/OS PPP\n>20\tbelong\t\t104\t\t(BSD/OS Cisco HDLC\n>20\tbelong\t\t105\t\t(802.11\n>20\tbelong\t\t106\t\t(Linux Classical IP over ATM\n>20\tbelong\t\t107\t\t(Frame Relay\n>20\tbelong\t\t108\t\t(OpenBSD loopback\n>20\tbelong\t\t109\t\t(OpenBSD IPsec encrypted\n>20\tbelong\t\t112\t\t(Cisco HDLC\n>20\tbelong\t\t113\t\t(Linux \"cooked\"\n>20\tbelong\t\t114\t\t(LocalTalk\n>20\tbelong\t\t117\t\t(OpenBSD PFLOG\n>20\tbelong\t\t119\t\t(802.11 with Prism header\n>20\tbelong\t\t122\t\t(RFC 2625 IP over Fibre Channel\n>20\tbelong\t\t123\t\t(SunATM\n>20\tbelong\t\t127\t\t(802.11 with radiotap header\n>20\tbelong\t\t129\t\t(Linux ARCNET\n>20\tbelong\t\t138\t\t(Apple IP over IEEE 1394\n>20\tbelong\t\t140\t\t(MTP2\n>20\tbelong\t\t141\t\t(MTP3\n>20\tbelong\t\t143\t\t(DOCSIS\n>20\tbelong\t\t144\t\t(IrDA\n>20\tbelong\t\t147\t\t(Private use 0\n>20\tbelong\t\t148\t\t(Private use 1\n>20\tbelong\t\t149\t\t(Private use 2\n>20\tbelong\t\t150\t\t(Private use 3\n>20\tbelong\t\t151\t\t(Private use 4\n>20\tbelong\t\t152\t\t(Private use 5\n>20\tbelong\t\t153\t\t(Private use 6\n>20\tbelong\t\t154\t\t(Private use 7\n>20\tbelong\t\t155\t\t(Private use 8\n>20\tbelong\t\t156\t\t(Private use 9\n>20\tbelong\t\t157\t\t(Private use 10\n>20\tbelong\t\t158\t\t(Private use 11\n>20\tbelong\t\t159\t\t(Private use 12\n>20\tbelong\t\t160\t\t(Private use 13\n>20\tbelong\t\t161\t\t(Private use 14\n>20\tbelong\t\t162\t\t(Private use 15\n>20\tbelong\t\t163\t\t(802.11 with AVS header\n>16\tbelong\t\tx\t\t\\b, capture length %d)\n0\tulelong\t\t0xa1b2c3d4\ttcpdump capture file (little-endian)\n>4\tleshort\t\tx\t\t- version %d\n>6\tleshort\t\tx\t\t\\b.%d\n>20\tlelong\t\t0\t\t(No link-layer encapsulation\n>20\tlelong\t\t1\t\t(Ethernet\n>20\tlelong\t\t2\t\t(3Mb Ethernet\n>20\tlelong\t\t3\t\t(AX.25\n>20\tlelong\t\t4\t\t(ProNET\n>20\tlelong\t\t5\t\t(CHAOS\n>20\tlelong\t\t6\t\t(Token Ring\n>20\tlelong\t\t7\t\t(ARCNET\n>20\tlelong\t\t8\t\t(SLIP\n>20\tlelong\t\t9\t\t(PPP\n>20\tlelong\t\t10\t\t(FDDI\n>20\tlelong\t\t11\t\t(RFC 1483 ATM\n>20\tlelong\t\t12\t\t(raw IP\n>20\tlelong\t\t13\t\t(BSD/OS SLIP\n>20\tlelong\t\t14\t\t(BSD/OS PPP\n>20\tlelong\t\t19\t\t(Linux ATM Classical IP\n>20\tlelong\t\t50\t\t(PPP or Cisco HDLC\n>20\tlelong\t\t51\t\t(PPP-over-Ethernet\n>20\tlelong\t\t99\t\t(Symantec Enterprise Firewall\n>20\tlelong\t\t100\t\t(RFC 1483 ATM\n>20\tlelong\t\t101\t\t(raw IP\n>20\tlelong\t\t102\t\t(BSD/OS SLIP\n>20\tlelong\t\t103\t\t(BSD/OS PPP\n>20\tlelong\t\t104\t\t(BSD/OS Cisco HDLC\n>20\tlelong\t\t105\t\t(802.11\n>20\tlelong\t\t106\t\t(Linux Classical IP over ATM\n>20\tlelong\t\t107\t\t(Frame Relay\n>20\tlelong\t\t108\t\t(OpenBSD loopback\n>20\tlelong\t\t109\t\t(OpenBSD IPsec encrypted\n>20\tlelong\t\t112\t\t(Cisco HDLC\n>20\tlelong\t\t113\t\t(Linux \"cooked\"\n>20\tlelong\t\t114\t\t(LocalTalk\n>20\tlelong\t\t117\t\t(OpenBSD PFLOG\n>20\tlelong\t\t119\t\t(802.11 with Prism header\n>20\tlelong\t\t122\t\t(RFC 2625 IP over Fibre Channel\n>20\tlelong\t\t123\t\t(SunATM\n>20\tlelong\t\t127\t\t(802.11 with radiotap header\n>20\tlelong\t\t129\t\t(Linux ARCNET\n>20\tlelong\t\t138\t\t(Apple IP over IEEE 1394\n>20\tlelong\t\t140\t\t(MTP2\n>20\tlelong\t\t141\t\t(MTP3\n>20\tlelong\t\t143\t\t(DOCSIS\n>20\tlelong\t\t144\t\t(IrDA\n>20\tlelong\t\t147\t\t(Private use 0\n>20\tlelong\t\t148\t\t(Private use 1\n>20\tlelong\t\t149\t\t(Private use 2\n>20\tlelong\t\t150\t\t(Private use 3\n>20\tlelong\t\t151\t\t(Private use 4\n>20\tlelong\t\t152\t\t(Private use 5\n>20\tlelong\t\t153\t\t(Private use 6\n>20\tlelong\t\t154\t\t(Private use 7\n>20\tlelong\t\t155\t\t(Private use 8\n>20\tlelong\t\t156\t\t(Private use 9\n>20\tlelong\t\t157\t\t(Private use 10\n>20\tlelong\t\t158\t\t(Private use 11\n>20\tlelong\t\t159\t\t(Private use 12\n>20\tlelong\t\t160\t\t(Private use 13\n>20\tlelong\t\t161\t\t(Private use 14\n>20\tlelong\t\t162\t\t(Private use 15\n>20\tlelong\t\t163\t\t(802.11 with AVS header\n>16\tlelong\t\tx\t\t\\b, capture length %d)\n\n#\n# \"libpcap\"-with-Alexey-Kuznetsov's-patches capture files.\n# (We call them \"tcpdump capture file(s)\" for now, as \"tcpdump\" is\n# the main program that uses that format, but there are other programs\n# that use \"libpcap\", or that use the same capture file format.)\n#\n0\tubelong\t\t0xa1b2cd34\textended tcpdump capture file (big-endian)\n>4\tbeshort\t\tx\t\t- version %d\n>6\tbeshort\t\tx\t\t\\b.%d\n>20\tbelong\t\t0\t\t(No link-layer encapsulation\n>20\tbelong\t\t1\t\t(Ethernet\n>20\tbelong\t\t2\t\t(3Mb Ethernet\n>20\tbelong\t\t3\t\t(AX.25\n>20\tbelong\t\t4\t\t(ProNET\n>20\tbelong\t\t5\t\t(CHAOS\n>20\tbelong\t\t6\t\t(Token Ring\n>20\tbelong\t\t7\t\t(ARCNET\n>20\tbelong\t\t8\t\t(SLIP\n>20\tbelong\t\t9\t\t(PPP\n>20\tbelong\t\t10\t\t(FDDI\n>20\tbelong\t\t11\t\t(RFC 1483 ATM\n>20\tbelong\t\t12\t\t(raw IP\n>20\tbelong\t\t13\t\t(BSD/OS SLIP\n>20\tbelong\t\t14\t\t(BSD/OS PPP\n>16\tbelong\t\tx\t\t\\b, capture length %d)\n0\tulelong\t\t0xa1b2cd34\textended tcpdump capture file (little-endian)\n>4\tleshort\t\tx\t\t- version %d\n>6\tleshort\t\tx\t\t\\b.%d\n>20\tlelong\t\t0\t\t(No link-layer encapsulation\n>20\tlelong\t\t1\t\t(Ethernet\n>20\tlelong\t\t2\t\t(3Mb Ethernet\n>20\tlelong\t\t3\t\t(AX.25\n>20\tlelong\t\t4\t\t(ProNET\n>20\tlelong\t\t5\t\t(CHAOS\n>20\tlelong\t\t6\t\t(Token Ring\n>20\tlelong\t\t7\t\t(ARCNET\n>20\tlelong\t\t8\t\t(SLIP\n>20\tlelong\t\t9\t\t(PPP\n>20\tlelong\t\t10\t\t(FDDI\n>20\tlelong\t\t11\t\t(RFC 1483 ATM\n>20\tlelong\t\t12\t\t(raw IP\n>20\tlelong\t\t13\t\t(BSD/OS SLIP\n>20\tlelong\t\t14\t\t(BSD/OS PPP\n>16\tlelong\t\tx\t\t\\b, capture length %d)\n\n#\n# AIX \"iptrace\" capture files.\n#\n0\tstring\t\tiptrace\\ 1.0\t\"iptrace\" capture file\n0\tstring\t\tiptrace\\ 2.0\t\"iptrace\" capture file\n\n#\n# Novell LANalyzer capture files.\n#\n0\tleshort\t\t0x1001\t\tLANalyzer capture file\n0\tleshort\t\t0x1007\t\tLANalyzer capture file\n\n#\n# HP-UX \"nettl\" capture files.\n#\n0\tstring\t\t\\x54\\x52\\x00\\x64\\x00\t\"nettl\" capture file\n\n#\n# RADCOM WAN/LAN Analyzer capture files.\n#\n0\tstring\t\t\\x42\\xd2\\x00\\x34\\x12\\x66\\x22\\x88\tRADCOM WAN/LAN Analyzer capture file\n\n#\n# NetStumbler log files.  Not really packets, per se, but about as\n# close as you can get.  These are log files from NetStumbler, a\n# Windows program, that scans for 802.11b networks.\n#\n0\tstring\t\tNetS\t\tNetStumbler log file\n>8\tlelong\t\tx\t\t\\b, %d stations found\n\n#\n# EtherPeek/AiroPeek \"version 9\" capture files.\n#\n0\tstring\t\t\\177ver\t\tEtherPeek/AiroPeek capture file\n\n#\n# Visual Networks traffic capture files.\n#\n0\tstring\t\t\\x05VNF\t\tVisual Networks traffic capture file\n\n#\n# Network Instruments Observer capture files.\n#\n0\tstring\t\tObserverPktBuffe\tNetwork Instruments Observer capture file\n\n#\n# Files from Accellent Group's 5View products.\n#\n0\tstring\t\t\\xaa\\xaa\\xaa\\xaa\t5View capture file\n#------------------------------------------------------------------------------\n# softquad:  file(1) magic for SoftQuad Publishing Software\n#\n# Author/Editor and RulesBuilder\n#\n# XXX - byte order?\n#\n0\tstring\t\t\\<!SQ\\ DTD>\tCompiled SGML rules file\n>9\tstring\t\t>\\0\t\t Type %s\n0\tstring\t\t\\<!SQ\\ A/E>\tA/E SGML Document binary\n>9\tstring\t\t>\\0\t\t Type %s\n0\tstring\t\t\\<!SQ\\ STS>\tA/E SGML binary styles file\n>9\tstring\t\t>\\0\t\t Type %s\n0\tshort\t\t0xc0de\t\tCompiled PSI (v1) data\n0\tshort\t\t0xc0da\t\tCompiled PSI (v2) data\n>3\tstring\t\t>\\0\t\t(%s)\n# Binary sqtroff font/desc files...\n0\tshort\t\t0125252\t\tSoftQuad DESC or font file binary\n>2\tshort\t\t>0\t\t- version %d\n# Bitmaps...\n0\tsearch/1\tSQ\\ BITMAP1\tSoftQuad Raster Format text\n#0\tstring\t\tSQ\\ BITMAP2\tSoftQuad Raster Format data\n# sqtroff intermediate language (replacement for ditroff int. lang.)\n0\tstring\t\tX\\ \t\tSoftQuad troff Context intermediate\n>2\tstring\t\t495\t\tfor AT&T 495 laser printer\n>2\tstring\t\thp\t\tfor Hewlett-Packard LaserJet\n>2\tstring\t\timpr\t\tfor IMAGEN imPRESS\n>2\tstring\t\tps\t\tfor PostScript\n\n# From: Michael Piefel <piefel@debian.org>\n# sqtroff intermediate language (replacement for ditroff int. lang.)\n0\tstring\t\tX\\ 495\t\tSoftQuad troff Context intermediate for AT&T 495 laser printer\n0\tstring\t\tX\\ hp\t\tSoftQuad troff Context intermediate for HP LaserJet\n0\tstring\t\tX\\ impr\t\tSoftQuad troff Context intermediate for IMAGEN imPRESS\n0\tstring\t\tX\\ ps\t\tSoftQuad troff Context intermediate for PostScript\n\n#------------------------------------------------------------------------------\n# spec:  file(1) magic for SPEC raw results (*.raw, *.rsf)\n#\n# Cloyce D. Spradling <cloyce@headgear.org>\n\n0\tstring\tspec\t\t\tSPEC\n>4\tstring\t.cpu\t\t\tCPU\n>>8\tstring\t<:\t\t\t\\b%.4s\n>>12\tstring\t.\t\t\traw result text\n\n17\tstring\tversion=SPECjbb\t\tSPECjbb\n>32\tstring\t<:\t\t\t\\b%.4s\n>>37\tstring\t<:\t\t\tv%.4s raw result text\n\n0\tstring\tBEGIN\\040SPECWEB\tSPECweb\n>13\tstring\t<:\t\t\t\\b%.2s\n>>15\tstring\t_SSL\t\t\t\\b_SSL\n>>>20\tstring\t<:\t\t\tv%.4s raw result text\n>>16\tstring\t<:\t\t\tv%.4s raw result text\n\n#------------------------------------------------------------------------------\n# spectrum:  file(1) magic for Spectrum emulator files.\n#\n# John Elliott <jce@seasip.demon.co.uk>\n\n#\n# Spectrum +3DOS header\n#\n0       string          PLUS3DOS\\032    Spectrum +3 data\n>15     byte            0               - BASIC program\n>15     byte            1               - number array\n>15     byte            2               - character array\n>15     byte            3               - memory block\n>>16    belong          0x001B0040      (screen)\n>15     byte            4               - Tasword document\n>15     string          TAPEFILE        - ZXT tapefile\n#\n# Tape file. This assumes the .TAP starts with a Spectrum-format header,\n# which nearly all will.\n#\n0       string          \\023\\000\\000    Spectrum .TAP data\n>4      string          x               \"%-10.10s\"\n>3      byte            0               - BASIC program\n>3      byte            1               - number array\n>3      byte            2               - character array\n>3      byte            3               - memory block\n>>14    belong          0x001B0040      (screen)\n\n# The following three blocks are from pak21-spectrum@srcf.ucam.org\n# TZX tape images\n0      string          ZXTape!\\x1a     Spectrum .TZX data\n>8     byte            x               version %d\n>9     byte            x               \\b.%d\n\n# RZX input recording files\n0      string          RZX!            Spectrum .RZX data\n>4     byte            x               version %d\n>5     byte            x               \\b.%d\n\n# Floppy disk images\n0      string          MV\\ -\\ CPCEMU\\ Disk-Fil Amstrad/Spectrum .DSK data\n0      string          MV\\ -\\ CPC\\ format\\ Dis Amstrad/Spectrum DU54 .DSK data\n0      string          EXTENDED\\ CPC\\ DSK\\ Fil Amstrad/Spectrum Extended .DSK data\n0      string          SINCLAIR        Spectrum .SCL Betadisk image\n\n# Hard disk images\n0      string          RS-IDE\\x1a      Spectrum .HDF hard disk image\n>7     byte            x               \\b, version 0x%02x\n\n#------------------------------------------------------------------------------\n# sql:  file(1) magic for SQL files\n#\n# From: \"Marty Leisner\" <mleisner@eng.mc.xerox.com>\n# Recognize some MySQL files.\n#\n0\tbeshort\t\t\t0xfe01\t\tMySQL table definition file\n>2\tbyte\t\t\tx\t\tVersion %d\n0\tbelong&0xffffff00\t0xfefe0300\tMySQL MISAM index file\n>3\tbyte\t\t\tx\t\tVersion %d\n0\tbelong&0xffffff00\t0xfefe0700\tMySQL MISAM compressed data file\n>3\tbyte\t\t\tx\t\tVersion %d\n0\tbelong&0xffffff00\t0xfefe0500\tMySQL ISAM index file\n>3\tbyte\t\t\tx\t\tVersion %d\n0\tbelong&0xffffff00\t0xfefe0600\tMySQL ISAM compressed data file\n>3\tbyte\t\t\tx\t\tVersion %d\n0\tstring\t\t \t\\376bin\t\tMySQL replication log\n\n#------------------------------------------------------------------------------\n# iRiver H Series database file \n# From Ken Guest <ken@linux.ie>\n# As observed from iRivNavi.iDB and unencoded firmware\n#\n0   string\t\tiRivDB\tiRiver Database file\n>11  string\t>\\0\tVersion %s\n>39  string\t\tiHP-100\t[H Series]\n\n#------------------------------------------------------------------------------\n# SQLite database files\n# Ken Guest <ken@linux.ie>, Ty Sarna, Zack Weinberg\n#\n# Version 1 used GDBM internally; its files cannot be distinguished\n# from other GDBM files.\n#\n# Version 2 used this format:\n0\tstring\t**\\ This\\ file\\ contains\\ an\\ SQLite  SQLite 2.x database\n\n# Version 3 of SQLite allows applications to embed their own \"user version\"\n# number in the database.  Detect this and distinguish those files.\n\n0   string  SQLite\\ format\\ 3\n>60 string  _MTN               Monotone source repository\n>60 belong  !0                 SQLite 3.x database, user version %u\n>60 belong  0                  SQLite 3.x database\n\n#------------------------------------------------------------------------------\n# sun:  file(1) magic for Sun machines\n#\n# Values for big-endian Sun (MC680x0, SPARC) binaries on pre-5.x\n# releases.  (5.x uses ELF.)\n#\n0\tbelong&077777777\t0600413\t\tsparc demand paged\n>0\tbyte\t\t&0x80\n>>20\tbelong\t\t<4096\t\tshared library\n>>20\tbelong\t\t=4096\t\tdynamically linked executable\n>>20\tbelong\t\t>4096\t\tdynamically linked executable\n>0\tbyte\t\t^0x80\t\texecutable\n>16\tbelong\t\t>0\t\tnot stripped\n\n0\tbelong&077777777\t0600410\t\tsparc pure\n>0\tbyte\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t^0x80\t\texecutable\n>16\tbelong\t\t>0\t\tnot stripped\n\n0\tbelong&077777777\t0600407\t\tsparc\n>0\tbyte\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t^0x80\t\texecutable\n>16\tbelong\t\t>0\t\tnot stripped\n\n0\tbelong&077777777\t0400413\t\tmc68020 demand paged\n>0\tbyte\t\t&0x80\n>>20\tbelong\t\t<4096\t\tshared library\n>>20\tbelong\t\t=4096\t\tdynamically linked executable\n>>20\tbelong\t\t>4096\t\tdynamically linked executable\n>0\tbyte\t\t^0x80\t\texecutable\n>16\tbelong\t\t>0\t\tnot stripped\n\n0\tbelong&077777777\t0400410\t\tmc68020 pure\n>0\tbyte\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t^0x80\t\texecutable\n>16\tbelong\t\t>0\t\tnot stripped\n\n0\tbelong&077777777\t0400407\t\tmc68020\n>0\tbyte\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t^0x80\t\texecutable\n>16\tbelong\t\t>0\t\tnot stripped\n\n0\tbelong&077777777\t0200413\t\tmc68010 demand paged\n>0\tbyte\t\t&0x80\n>>20\tbelong\t\t<4096\t\tshared library\n>>20\tbelong\t\t=4096\t\tdynamically linked executable\n>>20\tbelong\t\t>4096\t\tdynamically linked executable\n>0\tbyte\t\t^0x80\t\texecutable\n>16\tbelong\t\t>0\t\tnot stripped\n\n0\tbelong&077777777\t0200410\t\tmc68010 pure\n>0\tbyte\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t^0x80\t\texecutable\n>16\tbelong\t\t>0\t\tnot stripped\n\n0\tbelong&077777777\t0200407\t\tmc68010\n>0\tbyte\t\t&0x80\t\tdynamically linked executable\n>0\tbyte\t\t^0x80\t\texecutable\n>16\tbelong\t\t>0\t\tnot stripped\n\n# reworked these to avoid anything beginning with zero becoming \"old sun-2\"\n0\tbelong\t\t0407\t\told sun-2 executable\n>16\tbelong\t\t>0\t\tnot stripped\n0\tbelong\t\t0410\t\told sun-2 pure executable\n>16\tbelong\t\t>0\t\tnot stripped\n0\tbelong\t\t0413\t\told sun-2 demand paged executable\n>16\tbelong\t\t>0\t\tnot stripped\n\n#\n# Core files.  \"SPARC 4.x BCP\" means \"core file from a SunOS 4.x SPARC\n# binary executed in compatibility mode under SunOS 5.x\".\n#\n0\tbelong\t\t0x080456\tSunOS core file\n>4\tbelong\t\t432\t\t(SPARC)\n>>132\tstring\t\t>\\0\t\tfrom '%s'\n>>116\tbelong\t\t=3\t\t(quit)\n>>116\tbelong\t\t=4\t\t(illegal instruction)\n>>116\tbelong\t\t=5\t\t(trace trap)\n>>116\tbelong\t\t=6\t\t(abort)\n>>116\tbelong\t\t=7\t\t(emulator trap)\n>>116\tbelong\t\t=8\t\t(arithmetic exception)\n>>116\tbelong\t\t=9\t\t(kill)\n>>116\tbelong\t\t=10\t\t(bus error)\n>>116\tbelong\t\t=11\t\t(segmentation violation)\n>>116\tbelong\t\t=12\t\t(bad argument to system call)\n>>116\tbelong\t\t=29\t\t(resource lost)\n>>120\tbelong\t\tx\t\t(T=%dK,\n>>124\tbelong\t\tx\t\tD=%dK,\n>>128\tbelong\t\tx\t\tS=%dK)\n>4\tbelong\t\t826\t\t(68K)\n>>128\tstring\t\t>\\0\t\tfrom '%s'\n>4\tbelong\t\t456\t\t(SPARC 4.x BCP)\n>>152\tstring\t\t>\\0\t\tfrom '%s'\n# Sun SunPC\n0\tlong\t\t0xfa33c08e\tSunPC 4.0 Hard Disk\n0\tstring\t\t#SUNPC_CONFIG\tSunPC 4.0 Properties Values\n# Sun snoop (see RFC 1761, which describes the capture file format).\n#\n0\tstring\t\tsnoop\t\tSnoop capture file\n>8\tbelong\t\t>0\t\t- version %ld\n>12\tbelong\t\t0\t\t(IEEE 802.3)\n>12\tbelong\t\t1\t\t(IEEE 802.4)\n>12\tbelong\t\t2\t\t(IEEE 802.5)\n>12\tbelong\t\t3\t\t(IEEE 802.6)\n>12\tbelong\t\t4\t\t(Ethernet)\n>12\tbelong\t\t5\t\t(HDLC)\n>12\tbelong\t\t6\t\t(Character synchronous)\n>12\tbelong\t\t7\t\t(IBM channel-to-channel adapter)\n>12\tbelong\t\t8\t\t(FDDI)\n>12\tbelong\t\t9\t\t(Unknown)\n\n# Microsoft ICM color profile\n36\tstring\t\tacspMSFT\tMicrosoft ICM Color Profile\n# Sun KCMS\n36\tstring\t\tacsp\t\tKodak Color Management System, ICC Profile\n\n#---------------------------------------------------------------------------\n# The following entries have been tested by Duncan Laurie <duncan@sun.com> (a\n# lead Sun/Cobalt developer) who agrees that they are good and worthy of\n# inclusion.\n\n# Boot ROM images for Sun/Cobalt Linux server appliances\n0       string  Cobalt\\ Networks\\ Inc.\\nFirmware\\ v     Paged COBALT boot rom\n>38     string x        V%.4s\n\n# New format for Sun/Cobalt boot ROMs is annoying, it stores the version code\n# at the very end where file(1) can't get it.\n0       string CRfs     COBALT boot rom data (Flat boot rom or file system)\n\n\n#------------------------------------------------------------------------\n# sysex: file(1) magic for MIDI sysex files\n#\n# \n0\tbyte\t\t\t0xF0\t\tSysEx File -\n\n# North American Group\n>1\tbyte\t\t\t0x01\t\tSequential\n>1\tbyte\t\t\t0x02\t\tIDP\n>1\tbyte\t\t\t0x03\t\tOctavePlateau\n>1\tbyte\t\t\t0x04\t\tMoog\n>1\tbyte\t\t\t0x05\t\tPassport\n>1\tbyte\t\t\t0x06\t\tLexicon\n>1\tbyte\t\t\t0x07\t\tKurzweil/Future Retro\n>>3\tbyte\t\t\t0x77\t\t777\n>>4\tbyte\t\t\t0x00\t\tBank\n>>4\tbyte\t\t\t0x01\t\tSong\n>>5\tbyte\t\t\t0x0f\t\t16\n>>5\tbyte\t\t\t0x0e\t\t15\n>>5\tbyte\t\t\t0x0d\t\t14\n>>5\tbyte\t\t\t0x0c\t\t13\n>>5\tbyte\t\t\t0x0b\t\t12\n>>5\tbyte\t\t\t0x0a\t\t11\n>>5\tbyte\t\t\t0x09\t\t10\n>>5\tbyte\t\t\t0x08\t\t9\n>>5\tbyte\t\t\t0x07\t\t8\n>>5\tbyte\t\t\t0x06\t\t7\n>>5\tbyte\t\t\t0x05\t\t6\n>>5\tbyte\t\t\t0x04\t\t5\n>>5\tbyte\t\t\t0x03\t\t4\n>>5\tbyte\t\t\t0x02\t\t3\n>>5\tbyte\t\t\t0x01\t\t2\n>>5\tbyte\t\t\t0x00\t\t1\n>>5\tbyte\t\t\t0x10\t\t(ALL)\n>>2\tbyte\t\t\tx\t\t\t\\b, Channel %d\n>1\tbyte\t\t\t0x08\t\tFender\n>1\tbyte\t\t\t0x09\t\tGulbransen\n>1\tbyte\t\t\t0x0a\t\tAKG\n>1\tbyte\t\t\t0x0b\t\tVoyce\n>1\tbyte\t\t\t0x0c\t\tWaveframe\n>1\tbyte\t\t\t0x0d\t\tADA\n>1\tbyte\t\t\t0x0e\t\tGarfield\n>1\tbyte\t\t\t0x0f\t\tEnsoniq\n>1\tbyte\t\t\t0x10\t\tOberheim\n>>2\tbyte\t\t\t0x06\t\tMatrix 6 series\n>>3\tbyte\t\t\t0x0A\t\tDump (All)\n>>3\tbyte\t\t\t0x01\t\tDump (Bank)\n>>4 belong\t\t\t0x0002040E\t\tMatrix 1000\n>>>11 byte\t\t\t<2\t\t\tUser bank %d\n>>>11 byte\t\t\t>1\t\t\tPreset bank %d\n>1\tbyte\t\t\t0x11\t\tApple\n>1\tbyte\t\t\t0x12\t\tGreyMatter\n>1\tbyte\t\t\t0x14\t\tPalmTree\n>1\tbyte\t\t\t0x15\t\tJLCooper\n>1\tbyte\t\t\t0x16\t\tLowrey\n>1\tbyte\t\t\t0x17\t\tAdamsSmith\n>1\tbyte\t\t\t0x18\t\tE-mu\n>1\tbyte\t\t\t0x19\t\tHarmony\n>1\tbyte\t\t\t0x1a\t\tART\n>1\tbyte\t\t\t0x1b\t\tBaldwin\n>1\tbyte\t\t\t0x1c\t\tEventide\n>1\tbyte\t\t\t0x1d\t\tInventronics\n>1\tbyte\t\t\t0x1f\t\tClarity\n\n# European Group\n>1\tbyte\t\t\t0x21\t\tSIEL\n>1\tbyte\t\t\t0x22\t\tSynthaxe\n>1\tbyte\t\t\t0x24\t\tHohner\n>1\tbyte\t\t\t0x25\t\tTwister\n>1\tbyte\t\t\t0x26\t\tSolton\n>1\tbyte\t\t\t0x27\t\tJellinghaus\n>1\tbyte\t\t\t0x28\t\tSouthworth\n>1\tbyte\t\t\t0x29\t\tPPG\n>1\tbyte\t\t\t0x2a\t\tJEN\n>1\tbyte\t\t\t0x2b\t\tSSL\n>1\tbyte\t\t\t0x2c\t\tAudioVertrieb\n\n>1\tbyte\t\t\t0x2f\t\tELKA\n>>3\tbyte\t\t\t0x09\t\tEK-44\n\n>1\tbyte\t\t\t0x30\t\tDynacord\n>1\tbyte\t\t\t0x31\t\tJomox\n>1\tbyte\t\t\t0x33\t\tClavia\n>1\tbyte\t\t\t0x39\t\tSoundcraft\n# Some Waldorf info from http://Stromeko.Synth.net/Downloads#WaldorfDocs\n>1\tbyte\t\t\t0x3e\t\tWaldorf\n>>2\tbyte\t\t\t0x00\t\tmicroWave\n>>2\tbyte\t\t\t0x0E\t\tmicrowave2 / XT\n>>2\tbyte\t\t\t0x0F\t\tQ / Q+\n>>3\tbyte\t\t\t=0\t\t\t(default id)\n>>3 byte\t\t\t>0\t\t\t(\n>>>3 byte\t\t\t<0x7F\t\t\\bdevice %d)\n>>>3 byte\t\t\t=0x7F\t\t\\bbroadcast id)\n>>3\tbyte\t\t\t0x7f\t\tMicrowave I\n>>>4\tbyte\t\t\t0x00\t\tSNDR (Sound Request)\n>>>4\tbyte\t\t\t0x10\t\tSNDD (Sound Dump)\n>>>4\tbyte\t\t\t0x20\t\tSNDP (Sound Parameter Change)\n>>>4\tbyte\t\t\t0x30\t\tSNDQ (Sound Parameter Inquiry)\n>>>4\tbyte\t\t\t0x70\t\tBOOT (Sound Reserved)\n>>>4\tbyte\t\t\t0x01\t\tMULR (Multi Request)\n>>>4\tbyte\t\t\t0x11\t\tMULD (Multi Dump)\n>>>4\tbyte\t\t\t0x21\t\tMULP (Multi Parameter Change)\n>>>4\tbyte\t\t\t0x31\t\tMULQ (Multi Parameter Inquiry)\n>>>4\tbyte\t\t\t0x71\t\tOS (Multi Reserved)\n>>>4\tbyte\t\t\t0x02\t\tDRMR (Drum Map Request)\n>>>4\tbyte\t\t\t0x12\t\tDRMD (Drum Map Dump)\n>>>4\tbyte\t\t\t0x22\t\tDRMP (Drum Map Parameter Change)\n>>>4\tbyte\t\t\t0x32\t\tDRMQ (Drum Map Parameter Inquiry)\n>>>4\tbyte\t\t\t0x72\t\tBIN (Drum Map Reserved)\n>>>4\tbyte\t\t\t0x03\t\tPATR (Sequencer Pattern Request)\n>>>4\tbyte\t\t\t0x13\t\tPATD (Sequencer Pattern Dump)\n>>>4\tbyte\t\t\t0x23\t\tPATP (Sequencer Pattern Parameter Change)\n>>>4\tbyte\t\t\t0x33\t\tPATQ (Sequencer Pattern Parameter Inquiry)\n>>>4\tbyte\t\t\t0x73\t\tAFM (Sequencer Pattern Reserved)\n>>>4\tbyte\t\t\t0x04\t\tGLBR (Global Parameter Request)\n>>>4\tbyte\t\t\t0x14\t\tGLBD (Global Parameter Dump)\n>>>4\tbyte\t\t\t0x24\t\tGLBP (Global Parameter Parameter Change)\n>>>4\tbyte\t\t\t0x34\t\tGLBQ (Global Parameter Parameter Inquiry)\n>>>4\tbyte\t\t\t0x07\t\tMODR (Mode Parameter Request)\n>>>4\tbyte\t\t\t0x17\t\tMODD (Mode Parameter Dump)\n>>>4\tbyte\t\t\t0x27\t\tMODP (Mode Parameter Parameter Change)\n>>>4\tbyte\t\t\t0x37\t\tMODQ (Mode Parameter Parameter Inquiry)\n>>2\tbyte\t\t\t0x10\t\tmicroQ\n>>>4\tbyte\t\t\t0x00\t\tSNDR (Sound Request)\n>>>4\tbyte\t\t\t0x10\t\tSNDD (Sound Dump)\n>>>4\tbyte\t\t\t0x20\t\tSNDP (Sound Parameter Change)\n>>>4\tbyte\t\t\t0x30\t\tSNDQ (Sound Parameter Inquiry)\n>>>4\tbyte\t\t\t0x70\t\t(Sound Reserved)\n>>>4\tbyte\t\t\t0x01\t\tMULR (Multi Request)\n>>>4\tbyte\t\t\t0x11\t\tMULD (Multi Dump)\n>>>4\tbyte\t\t\t0x21\t\tMULP (Multi Parameter Change)\n>>>4\tbyte\t\t\t0x31\t\tMULQ (Multi Parameter Inquiry)\n>>>4\tbyte\t\t\t0x71\t\tOS (Multi Reserved)\n>>>4\tbyte\t\t\t0x02\t\tDRMR (Drum Map Request)\n>>>4\tbyte\t\t\t0x12\t\tDRMD (Drum Map Dump)\n>>>4\tbyte\t\t\t0x22\t\tDRMP (Drum Map Parameter Change)\n>>>4\tbyte\t\t\t0x32\t\tDRMQ (Drum Map Parameter Inquiry)\n>>>4\tbyte\t\t\t0x72\t\tBIN (Drum Map Reserved)\n>>>4\tbyte\t\t\t0x04\t\tGLBR (Global Parameter Request)\n>>>4\tbyte\t\t\t0x14\t\tGLBD (Global Parameter Dump)\n>>>4\tbyte\t\t\t0x24\t\tGLBP (Global Parameter Parameter Change)\n>>>4\tbyte\t\t\t0x34\t\tGLBQ (Global Parameter Parameter Inquiry)\n>>2\tbyte\t\t\t0x11\t\trackAttack\n>>>4\tbyte\t\t\t0x00\t\tSNDR (Sound Parameter Request)\n>>>4\tbyte\t\t\t0x10\t\tSNDD (Sound Parameter Dump)\n>>>4\tbyte\t\t\t0x20\t\tSNDP (Sound Parameter Parameter Change)\n>>>4\tbyte\t\t\t0x30\t\tSNDQ (Sound Parameter Parameter Inquiry)\n>>>4\tbyte\t\t\t0x01\t\tPRGR (Program Parameter Request)\n>>>4\tbyte\t\t\t0x11\t\tPRGD (Program Parameter Dump)\n>>>4\tbyte\t\t\t0x21\t\tPRGP (Program Parameter Parameter Change)\n>>>4\tbyte\t\t\t0x31\t\tPRGQ (Program Parameter Parameter Inquiry)\n>>>4\tbyte\t\t\t0x71\t\tOS (Program Parameter Reserved)\n>>>4\tbyte\t\t\t0x03\t\tPATR (Pattern Parameter Request)\n>>>4\tbyte\t\t\t0x13\t\tPATD (Pattern Parameter Dump)\n>>>4\tbyte\t\t\t0x23\t\tPATP (Pattern Parameter Parameter Change)\n>>>4\tbyte\t\t\t0x33\t\tPATQ (Pattern Parameter Parameter Inquiry)\n>>>4\tbyte\t\t\t0x04\t\tGLBR (Global Parameter Request)\n>>>4\tbyte\t\t\t0x14\t\tGLBD (Global Parameter Dump)\n>>>4\tbyte\t\t\t0x24\t\tGLBP (Global Parameter Parameter Change)\n>>>4\tbyte\t\t\t0x34\t\tGLBQ (Global Parameter Parameter Inquiry)\n>>>4\tbyte\t\t\t0x05\t\tEFXR (FX Parameter Request)\n>>>4\tbyte\t\t\t0x15\t\tEFXD (FX Parameter Dump)\n>>>4\tbyte\t\t\t0x25\t\tEFXP (FX Parameter Parameter Change)\n>>>4\tbyte\t\t\t0x35\t\tEFXQ (FX Parameter Parameter Inquiry)\n>>>4\tbyte\t\t\t0x07\t\tMODR (Mode Command Request)\n>>>4\tbyte\t\t\t0x17\t\tMODD (Mode Command Dump)\n>>>4\tbyte\t\t\t0x27\t\tMODP (Mode Command Parameter Change)\n>>>4\tbyte\t\t\t0x37\t\tMODQ (Mode Command Parameter Inquiry)\n>>2\tbyte\t\t\t0x03\t\tWave\n>>>4\tbyte\t\t\t0x00\t\tSBPR (Soundprogram)\n>>>4\tbyte\t\t\t0x01\t\tSAPR (Performance)\n>>>4\tbyte\t\t\t0x02\t\tSWAVE (Wave)\n>>>4\tbyte\t\t\t0x03\t\tSWTBL (Wave control table)\n>>>4\tbyte\t\t\t0x04\t\tSVT (Velocity Curve)\n>>>4\tbyte\t\t\t0x05\t\tSTT (Tuning Table)\n>>>4\tbyte\t\t\t0x06\t\tSGLB (Global Parameters)\n>>>4\tbyte\t\t\t0x07\t\tSARRMAP (Performance Program Change Map)\n>>>4\tbyte\t\t\t0x08\t\tSBPRMAP (Sound Program Change Map)\n>>>4\tbyte\t\t\t0x09\t\tSBPRPAR (Sound Parameter)\n>>>4\tbyte\t\t\t0x0A\t\tSARRPAR (Performance Parameter)\n>>>4\tbyte\t\t\t0x0B\t\tSINSPAR (Instrument/External Parameter)\n>>>4\tbyte\t\t\t0x0F\t\tSBULK (Bulk Switch on/off)\n\n# Japanese Group\n>1\tbyte\t\t\t0x40\t\tKawai\n>>3\tbyte\t\t\t0x20\t\tK1\n>>3\tbyte\t\t\t0x22\t\tK4\n\n>1\tbyte\t\t\t0x41\t\tRoland\n>>3\tbyte\t\t\t0x14\t\tD-50\n>>3\tbyte\t\t\t0x2b\t\tU-220\n>>3\tbyte\t\t\t0x02\t\tTR-707\n\n>1\tbyte\t\t\t0x42\t\tKorg\n>>3\tbyte\t\t\t0x19\t\tM1\n\n>1\tbyte\t\t\t0x43\t\tYamaha\n>1\tbyte\t\t\t0x44\t\tCasio\n>1\tbyte\t\t\t0x46\t\tKamiya\n>1\tbyte\t\t\t0x47\t\tAkai\n>1\tbyte\t\t\t0x48\t\tVictor\n>1\tbyte\t\t\t0x49\t\tMesosha\n>1\tbyte\t\t\t0x4b\t\tFujitsu\n>1\tbyte\t\t\t0x4c\t\tSony\n>1\tbyte\t\t\t0x4e\t\tTeac\n>1\tbyte\t\t\t0x50\t\tMatsushita\n>1\tbyte\t\t\t0x51\t\tFostex\n>1\tbyte\t\t\t0x52\t\tZoom\n>1\tbyte\t\t\t0x54\t\tMatsushita\n>1\tbyte\t\t\t0x57\t\tAcoustic tech. lab.\n\n>1\tbelong&0xffffff00\t0x00007400\tTa Horng\n>1\tbelong&0xffffff00\t0x00007500\te-Tek\n>1\tbelong&0xffffff00\t0x00007600\tE-Voice\n>1\tbelong&0xffffff00\t0x00007700\tMidisoft\n>1\tbelong&0xffffff00\t0x00007800\tQ-Sound\n>1\tbelong&0xffffff00\t0x00007900\tWestrex\n>1\tbelong&0xffffff00\t0x00007a00\tNvidia*\n>1\tbelong&0xffffff00\t0x00007b00\tESS\n>1\tbelong&0xffffff00\t0x00007c00\tMediatrix\n>1\tbelong&0xffffff00\t0x00007d00\tBrooktree\n>1\tbelong&0xffffff00\t0x00007e00\tOtari\n>1\tbelong&0xffffff00\t0x00007f00\tKey Electronics\n>1\tbelong&0xffffff00\t0x00010000\tShure\n>1\tbelong&0xffffff00\t0x00010100\tAuraSound\n>1\tbelong&0xffffff00\t0x00010200\tCrystal\n>1\tbelong&0xffffff00\t0x00010300\tRockwell\n>1\tbelong&0xffffff00\t0x00010400\tSilicon Graphics\n>1\tbelong&0xffffff00\t0x00010500\tMidiman\n>1\tbelong&0xffffff00\t0x00010600\tPreSonus\n>1\tbelong&0xffffff00\t0x00010800\tTopaz\n>1\tbelong&0xffffff00\t0x00010900\tCast Lightning\n>1\tbelong&0xffffff00\t0x00010a00\tMicrosoft\n>1\tbelong&0xffffff00\t0x00010b00\tSonic Foundry\n>1\tbelong&0xffffff00\t0x00010c00\tLine 6\n>1\tbelong&0xffffff00\t0x00010d00\tBeatnik Inc.\n>1\tbelong&0xffffff00\t0x00010e00\tVan Koerving\n>1\tbelong&0xffffff00\t0x00010f00\tAltech Systems\n>1\tbelong&0xffffff00\t0x00011000\tS & S Research\n>1\tbelong&0xffffff00\t0x00011100\tVLSI Technology\n>1\tbelong&0xffffff00\t0x00011200\tChromatic\n>1\tbelong&0xffffff00\t0x00011300\tSapphire\n>1\tbelong&0xffffff00\t0x00011400\tIDRC\n>1\tbelong&0xffffff00\t0x00011500\tJustonic Tuning\n>1\tbelong&0xffffff00\t0x00011600\tTorComp\n>1\tbelong&0xffffff00\t0x00011700\tNewtek Inc.\n>1\tbelong&0xffffff00\t0x00011800\tSound Sculpture\n>1\tbelong&0xffffff00\t0x00011900\tWalker Technical\n>1\tbelong&0xffffff00\t0x00011a00\tDigital Harmony\n>1\tbelong&0xffffff00\t0x00011b00\tInVision\n>1\tbelong&0xffffff00\t0x00011c00\tT-Square\n>1\tbelong&0xffffff00\t0x00011d00\tNemesys\n>1\tbelong&0xffffff00\t0x00011e00\tDBX\n>1\tbelong&0xffffff00\t0x00011f00\tSyndyne\n>1\tbelong&0xffffff00\t0x00012000\tBitheadz\t\n>1\tbelong&0xffffff00\t0x00012100\tCakewalk\n>1\tbelong&0xffffff00\t0x00012200\tStaccato\n>1\tbelong&0xffffff00\t0x00012300\tNational Semicon.\n>1\tbelong&0xffffff00\t0x00012400\tBoom Theory\n>1\tbelong&0xffffff00\t0x00012500\tVirtual DSP Corp\n>1\tbelong&0xffffff00\t0x00012600\tAntares\n>1\tbelong&0xffffff00\t0x00012700\tAngel Software\n>1\tbelong&0xffffff00\t0x00012800\tSt Louis Music\n>1\tbelong&0xffffff00\t0x00012900\tLyrrus dba G-VOX\n>1\tbelong&0xffffff00\t0x00012a00\tAshley Audio\n>1\tbelong&0xffffff00\t0x00012b00\tVari-Lite\n>1\tbelong&0xffffff00\t0x00012c00\tSummit Audio\n>1\tbelong&0xffffff00\t0x00012d00\tAureal Semicon.\n>1\tbelong&0xffffff00\t0x00012e00\tSeaSound\n>1\tbelong&0xffffff00\t0x00012f00\tU.S. Robotics\n>1\tbelong&0xffffff00\t0x00013000\tAurisis\n>1\tbelong&0xffffff00\t0x00013100\tNearfield Multimedia\n>1\tbelong&0xffffff00\t0x00013200\tFM7 Inc.\n>1\tbelong&0xffffff00\t0x00013300\tSwivel Systems\n>1\tbelong&0xffffff00\t0x00013400\tHyperactive\n>1\tbelong&0xffffff00\t0x00013500\tMidiLite\n>1\tbelong&0xffffff00\t0x00013600\tRadical\n>1\tbelong&0xffffff00\t0x00013700\tRoger Linn\n>1\tbelong&0xffffff00\t0x00013800\tHelicon\n>1\tbelong&0xffffff00\t0x00013900\tEvent\n>1\tbelong&0xffffff00\t0x00013a00\tSonic Network\n>1\tbelong&0xffffff00\t0x00013b00\tRealtime Music\n>1\tbelong&0xffffff00\t0x00013c00\tApogee Digital\n\n>1\tbelong&0xffffff00\t0x00202b00\tMedeli Electronics\n>1\tbelong&0xffffff00\t0x00202c00\tCharlie Lab\n>1\tbelong&0xffffff00\t0x00202d00\tBlue Chip Music\n>1\tbelong&0xffffff00\t0x00202e00\tBEE OH Corp\n>1\tbelong&0xffffff00\t0x00202f00\tLG Semicon America\n>1\tbelong&0xffffff00\t0x00203000\tTESI\n>1\tbelong&0xffffff00\t0x00203100\tEMAGIC\n>1\tbelong&0xffffff00\t0x00203200\tBehringer\n>1\tbelong&0xffffff00\t0x00203300\tAccess Music\n>1\tbelong&0xffffff00\t0x00203400\tSynoptic\n>1\tbelong&0xffffff00\t0x00203500\tHanmesoft Corp\n>1\tbelong&0xffffff00\t0x00203600\tTerratec\n>1\tbelong&0xffffff00\t0x00203700\tProel SpA\n>1\tbelong&0xffffff00\t0x00203800\tIBK MIDI\n>1\tbelong&0xffffff00\t0x00203900\tIRCAM\n>1\tbelong&0xffffff00\t0x00203a00\tPropellerhead Software\n>1\tbelong&0xffffff00\t0x00203b00\tRed Sound Systems\n>1\tbelong&0xffffff00\t0x00203c00\tElectron ESI AB\n>1\tbelong&0xffffff00\t0x00203d00\tSintefex Audio\n>1\tbelong&0xffffff00\t0x00203e00\tMusic and More\n>1\tbelong&0xffffff00\t0x00203f00\tAmsaro\n>1\tbelong&0xffffff00\t0x00204000\tCDS Advanced Technology\n>1\tbelong&0xffffff00\t0x00204100\tTouched by Sound\n>1\tbelong&0xffffff00\t0x00204200\tDSP Arts\n>1\tbelong&0xffffff00\t0x00204300\tPhil Rees Music\n>1\tbelong&0xffffff00\t0x00204400\tStamer Musikanlagen GmbH\n>1\tbelong&0xffffff00\t0x00204500\tSoundart\n>1\tbelong&0xffffff00\t0x00204600\tC-Mexx Software\n>1\tbelong&0xffffff00\t0x00204700\tKlavis Tech.\n>1\tbelong&0xffffff00\t0x00204800\tNoteheads AB\n\n0\tstring\t\t\tT707\t\tRoland TR-707 Data\n#------------------------------------------------------------------------------\n# teapot:  file(1) magic for \"teapot\" spreadsheet\n#\n0       string          #!teapot\\012xdr      teapot work sheet (XDR format)\n\n#------------------------------------------------------------------------------\n# terminfo:  file(1) magic for terminfo\n#\n# XXX - byte order for screen images?\n#\n0\tstring\t\t\\032\\001\tCompiled terminfo entry\n0\tshort\t\t0433\t\tCurses screen image\n0\tshort\t\t0434\t\tCurses screen image\n#------------------------------------------------------------------------------\n# tex:  file(1) magic for TeX files\n#\n# XXX - needs byte-endian stuff (big-endian and little-endian DVI?)\n#\n# From <conklin@talisman.kaleida.com>\n\n# Although we may know the offset of certain text fields in TeX DVI\n# and font files, we can't use them reliably because they are not\n# zero terminated. [but we do anyway, christos]\n0\tstring\t\t\\367\\002\tTeX DVI file\n!:mime\tapplication/x-dvi\n>16\tstring\t\t>\\0\t\t(%s)\n0\tstring\t\t\\367\\203\tTeX generic font data\n0\tstring\t\t\\367\\131\tTeX packed font data\n>3\tstring\t\t>\\0\t\t(%s)\n0\tstring\t\t\\367\\312\tTeX virtual font data\n0\tsearch/1\tThis\\ is\\ TeX,\tTeX transcript text\n0\tsearch/1\tThis\\ is\\ METAFONT,\tMETAFONT transcript text\n\n# There is no way to detect TeX Font Metric (*.tfm) files without\n# breaking them apart and reading the data.  The following patterns\n# match most *.tfm files generated by METAFONT or afm2tfm.\n2\tstring\t\t\\000\\021\tTeX font metric data\n!:mime\tapplication/x-tex-tfm\n>33\tstring\t\t>\\0\t\t(%s)\n2\tstring\t\t\\000\\022\tTeX font metric data\n!:mime\tapplication/x-tex-tfm\n>33\tstring\t\t>\\0\t\t(%s)\n\n# Texinfo and GNU Info, from Daniel Quinlan (quinlan@yggdrasil.com)\n0\tsearch/1\t\\\\input\\ texinfo\tTexinfo source text\n!:mime\ttext/x-texinfo\n0\tsearch/1\tThis\\ is\\ Info\\ file\tGNU Info text\n!:mime\ttext/x-info\n\n# TeX documents, from Daniel Quinlan (quinlan@yggdrasil.com)\n0\tsearch/400\t\\\\input\t\tTeX document text\n!:mime\ttext/x-tex\n0\tsearch/400\t\\\\section\tLaTeX document text\n!:mime\ttext/x-tex\n0\tsearch/400\t\\\\setlength\tLaTeX document text\n!:mime\ttext/x-tex\n0\tsearch/400\t\\\\documentstyle\tLaTeX document text\n!:mime\ttext/x-tex\n0\tsearch/400\t\\\\chapter\tLaTeX document text\n!:mime\ttext/x-tex\n0\tsearch/400\t\\\\documentclass\tLaTeX 2e document text\n!:mime\ttext/x-tex\n0\tsearch/400\t\\\\relax\t\tLaTeX auxiliary file\n!:mime\ttext/x-tex\n0\tsearch/400\t\\\\contentsline\tLaTeX table of contents\n!:mime\ttext/x-tex\n0\tsearch/400\t%\\ -*-latex-*-\tLaTeX document text\n!:mime\ttext/x-tex\n\n# Tex document, from Hendrik Scholz <hendrik@scholz.net>\n0   \tsearch/1\t\\\\ifx\t\tTeX document text\n\n# Index and glossary files\n0\tsearch/400\t\\\\indexentry\tLaTeX raw index file\n0\tsearch/400\t\\\\begin{theindex}\tLaTeX sorted index\n0\tsearch/400\t\\\\glossaryentry\tLaTeX raw glossary\n0\tsearch/400\t\\\\begin{theglossary}\tLaTeX sorted glossary\n0\tsearch/400\tThis\\ is\\ makeindex\tMakeindex log file\n\n# End of TeX\n\n#------------------------------------------------------------------------------\n# file(1) magic for BibTex text files\n# From Hendrik Scholz <hendrik@scholz.net>\n\n0\tsearch/1/c\t@article{\tBibTeX text file\n0\tsearch/1/c\t@book{\t\tBibTeX text file\n0\tsearch/1/c\t@inbook{\tBibTeX text file\n0\tsearch/1/c\t@incollection{\tBibTeX text file\n0\tsearch/1/c\t@inproceedings{\tBibTeX text file\n0\tsearch/1/c\t@manual{\tBibTeX text file\n0\tsearch/1/c\t@misc{\t\tBibTeX text file\n0\tsearch/1/c\t@preamble{\tBibTeX text file\n0\tsearch/1/c\t@phdthesis{\tBibTeX text file\n0\tsearch/1/c\t@techreport{\tBibTeX text file\n0\tsearch/1/c\t@unpublished{\tBibTeX text file\n\n73\tsearch/1\t%%%\\ \\ \t\tBibTeX-file{ BibTex text file (with full header)\n\n73\tsearch/1\t%%%\\ \\ @BibTeX-style-file{   BibTeX style text file (with full header)\n\n0\tsearch/1\t%\\ BibTeX\\ standard\\ bibliography\\ \tBibTeX standard bibliography style text file\n\n0\tsearch/1\t%\\ BibTeX\\ `\tBibTeX custom bibliography style text file\n\n0\tsearch/1\t@c\\ @mapfile{\tTeX font aliases text file\n#------------------------------------------------------------------------------\n# file(1) magic for tgif(1) files\n# From Hendrik Scholz <hendrik@scholz.net>\n\n0\tstring\t%TGIF\\ x \t\tTgif file version %s\n\n# ------------------------------------------------------------------------\n# ti-8x: file(1) magic for the TI-8x and TI-9x Graphing Calculators.\n#\n# From: Ryan McGuire (rmcguire@freenet.columbus.oh.us).\n#\n# Update: Romain Lievin (roms@lpg.ticalc.org).\n#\n# NOTE: This list is not complete.\n# Files for the TI-80 and TI-81 are pretty rare. I'm not going to put the\n# program/group magic numbers in here because I cannot find any.\n0\t\tstring\t\t**TI80**\tTI-80 Graphing Calculator File.\n0\t\tstring\t\t**TI81**\tTI-81 Graphing Calculator File.\n#\n# Magic Numbers for the TI-73\n#\n0\t\tstring\t\t**TI73**\tTI-73 Graphing Calculator\n>0x00003B\tbyte\t\t0x00\t\t(real number)\n>0x00003B\tbyte\t\t0x01\t\t(list)\n>0x00003B\tbyte\t\t0x02\t\t(matrix)\n>0x00003B\tbyte\t\t0x03\t\t(equation)\n>0x00003B\tbyte\t\t0x04\t\t(string)\n>0x00003B\tbyte\t\t0x05\t\t(program)\n>0x00003B\tbyte\t\t0x06\t\t(assembly program)\n>0x00003B\tbyte\t\t0x07\t\t(picture)\n>0x00003B\tbyte\t\t0x08\t\t(gdb)\n>0x00003B\tbyte\t\t0x0C\t\t(complex number)\n>0x00003B\tbyte\t\t0x0F\t\t(window settings)\n>0x00003B\tbyte\t\t0x10\t\t(zoom)\n>0x00003B\tbyte\t\t0x11\t\t(table setup)\n>0x00003B\tbyte\t\t0x13\t\t(backup)\n\n# Magic Numbers for the TI-82\n#\n0\t\tstring\t\t**TI82**\tTI-82 Graphing Calculator\n>0x00003B\tbyte\t\t0x00\t\t(real)\n>0x00003B\tbyte\t\t0x01\t\t(list)\n>0x00003B\tbyte\t\t0x02\t\t(matrix)\n>0x00003B\tbyte\t\t0x03\t\t(Y-variable)\n>0x00003B\tbyte\t\t0x05\t\t(program)\n>0x00003B\tbyte\t\t0x06\t\t(protected prgm)\n>0x00003B\tbyte\t\t0x07\t\t(picture)\n>0x00003B\tbyte\t\t0x08\t\t(gdb)\n>0x00003B\tbyte\t\t0x0B\t\t(window settings)\n>0x00003B\tbyte\t\t0x0C\t\t(window settings)\n>0x00003B\tbyte\t\t0x0D\t\t(table setup)\n>0x00003B\tbyte\t\t0x0E\t\t(screenshot)\n>0x00003B\tbyte\t\t0x0F\t\t(backup)\n#\n# Magic Numbers for the TI-83\n#\n0\t\tstring\t\t**TI83**\tTI-83 Graphing Calculator\n>0x00003B\tbyte\t\t0x00\t\t(real)\n>0x00003B\tbyte\t\t0x01\t\t(list)\n>0x00003B\tbyte\t\t0x02\t\t(matrix)\n>0x00003B\tbyte\t\t0x03\t\t(Y-variable)\n>0x00003B\tbyte\t\t0x04\t\t(string)\n>0x00003B\tbyte\t\t0x05\t\t(program)\n>0x00003B\tbyte\t\t0x06\t\t(protected prgm)\n>0x00003B\tbyte\t\t0x07\t\t(picture)\n>0x00003B\tbyte\t\t0x08\t\t(gdb)\n>0x00003B\tbyte\t\t0x0B\t\t(window settings)\n>0x00003B\tbyte\t\t0x0C\t\t(window settings)\n>0x00003B\tbyte\t\t0x0D\t\t(table setup)\n>0x00003B\tbyte\t\t0x0E\t\t(screenshot)\n>0x00003B\tbyte\t\t0x13\t\t(backup)\n#\n# Magic Numbers for the TI-83+\n#\n0\t\tstring\t\t**TI83F*\tTI-83+ Graphing Calculator\n>0x00003B\tbyte\t\t0x00\t\t(real number)\n>0x00003B\tbyte\t\t0x01\t\t(list)\n>0x00003B\tbyte\t\t0x02\t\t(matrix)\n>0x00003B\tbyte\t\t0x03\t\t(equation)\n>0x00003B\tbyte\t\t0x04\t\t(string)\n>0x00003B\tbyte\t\t0x05\t\t(program)\n>0x00003B\tbyte\t\t0x06\t\t(assembly program)\n>0x00003B\tbyte\t\t0x07\t\t(picture)\n>0x00003B\tbyte\t\t0x08\t\t(gdb)\n>0x00003B\tbyte\t\t0x0C\t\t(complex number)\n>0x00003B\tbyte\t\t0x0F\t\t(window settings)\n>0x00003B\tbyte\t\t0x10\t\t(zoom)\n>0x00003B\tbyte\t\t0x11\t\t(table setup)\n>0x00003B\tbyte\t\t0x13\t\t(backup)\n>0x00003B\tbyte\t\t0x15\t\t(application variable)\n>0x00003B\tbyte\t\t0x17\t\t(group of variable)\n\n#\n# Magic Numbers for the TI-85\n#\n0\t\tstring\t\t**TI85**\tTI-85 Graphing Calculator\n>0x00003B\tbyte\t\t0x00\t\t(real number)\n>0x00003B\tbyte\t\t0x01\t\t(complex number)\n>0x00003B\tbyte\t\t0x02\t\t(real vector)\n>0x00003B\tbyte\t\t0x03\t\t(complex vector)\n>0x00003B\tbyte\t\t0x04\t\t(real list)\n>0x00003B\tbyte\t\t0x05\t\t(complex list)\n>0x00003B\tbyte\t\t0x06\t\t(real matrix)\n>0x00003B\tbyte\t\t0x07\t\t(complex matrix)\n>0x00003B\tbyte\t\t0x08\t\t(real constant)\n>0x00003B\tbyte\t\t0x09\t\t(complex constant)\n>0x00003B\tbyte\t\t0x0A\t\t(equation)\n>0x00003B\tbyte\t\t0x0C\t\t(string)\n>0x00003B\tbyte\t\t0x0D\t\t(function GDB)\n>0x00003B\tbyte\t\t0x0E\t\t(polar GDB)\n>0x00003B\tbyte\t\t0x0F\t\t(parametric GDB)\n>0x00003B\tbyte\t\t0x10\t\t(diffeq GDB)\n>0x00003B\tbyte\t\t0x11\t\t(picture)\n>0x00003B\tbyte\t\t0x12\t\t(program)\n>0x00003B\tbyte\t\t0x13\t\t(range)\n>0x00003B\tbyte\t\t0x17\t\t(window settings)\n>0x00003B\tbyte\t\t0x18\t\t(window settings)\n>0x00003B\tbyte\t\t0x19\t\t(window settings)\n>0x00003B\tbyte\t\t0x1A\t\t(window settings)\n>0x00003B\tbyte\t\t0x1B\t\t(zoom)\n>0x00003B\tbyte\t\t0x1D\t\t(backup)\n>0x00003B\tbyte\t\t0x1E\t\t(unknown)\n>0x00003B\tbyte\t\t0x2A\t\t(equation)\n>0x000032\tstring\t\tZS4\t\t- ZShell Version 4 File.\n>0x000032\tstring\t\tZS3\t\t- ZShell Version 3 File.\n#\n# Magic Numbers for the TI-86\n#\n0\t\tstring\t\t**TI86**\tTI-86 Graphing Calculator\n>0x00003B\tbyte\t\t0x00\t\t(real number)\n>0x00003B\tbyte\t\t0x01\t\t(complex number)\n>0x00003B\tbyte\t\t0x02\t\t(real vector)\n>0x00003B\tbyte\t\t0x03\t\t(complex vector)\n>0x00003B\tbyte\t\t0x04\t\t(real list)\n>0x00003B\tbyte\t\t0x05\t\t(complex list)\n>0x00003B\tbyte\t\t0x06\t\t(real matrix)\n>0x00003B\tbyte\t\t0x07\t\t(complex matrix)\n>0x00003B\tbyte\t\t0x08\t\t(real constant)\n>0x00003B\tbyte\t\t0x09\t\t(complex constant)\n>0x00003B\tbyte\t\t0x0A\t\t(equation)\n>0x00003B\tbyte\t\t0x0C\t\t(string)\n>0x00003B\tbyte\t\t0x0D\t\t(function GDB)\n>0x00003B\tbyte\t\t0x0E\t\t(polar GDB)\n>0x00003B\tbyte\t\t0x0F\t\t(parametric GDB)\n>0x00003B\tbyte\t\t0x10\t\t(diffeq GDB)\n>0x00003B\tbyte\t\t0x11\t\t(picture)\n>0x00003B\tbyte\t\t0x12\t\t(program)\n>0x00003B\tbyte\t\t0x13\t\t(range)\n>0x00003B\tbyte\t\t0x17\t\t(window settings)\n>0x00003B\tbyte\t\t0x18\t\t(window settings)\n>0x00003B\tbyte\t\t0x19\t\t(window settings)\n>0x00003B\tbyte\t\t0x1A\t\t(window settings)\n>0x00003B\tbyte\t\t0x1B\t\t(zoom)\n>0x00003B\tbyte\t\t0x1D\t\t(backup)\n>0x00003B\tbyte\t\t0x1E\t\t(unknown)\n>0x00003B\tbyte\t\t0x2A\t\t(equation)\n#\n# Magic Numbers for the TI-89\n#\n0\t\tstring\t\t**TI89**\tTI-89 Graphing Calculator\n>0x000048\tbyte\t\t0x00\t\t(expression)\n>0x000048\tbyte\t\t0x04\t\t(list)\n>0x000048\tbyte\t\t0x06\t\t(matrix)\n>0x000048\tbyte\t\t0x0A\t\t(data)\n>0x000048\tbyte\t\t0x0B\t\t(text)\n>0x000048\tbyte\t\t0x0C\t\t(string)\n>0x000048\tbyte\t\t0x0D\t\t(graphic data base)\n>0x000048\tbyte\t\t0x0E\t\t(figure)\n>0x000048\tbyte\t\t0x10\t\t(picture)\n>0x000048\tbyte\t\t0x12\t\t(program)\n>0x000048\tbyte\t\t0x13\t\t(function)\n>0x000048\tbyte\t\t0x14\t\t(macro)\n>0x000048\tbyte\t\t0x1C\t\t(zipped)\n>0x000048\tbyte\t\t0x21\t\t(assembler)\n#\n# Magic Numbers for the TI-92\n#\n0\t\tstring\t\t**TI92**\tTI-92 Graphing Calculator\n>0x000048\tbyte\t\t0x00\t\t(expression)\n>0x000048\tbyte\t\t0x04\t\t(list)\n>0x000048\tbyte\t\t0x06\t\t(matrix)\n>0x000048\tbyte\t\t0x0A\t\t(data)\n>0x000048\tbyte\t\t0x0B\t\t(text)\n>0x000048\tbyte\t\t0x0C\t\t(string)\n>0x000048\tbyte\t\t0x0D\t\t(graphic data base)\n>0x000048\tbyte\t\t0x0E\t\t(figure)\n>0x000048\tbyte\t\t0x10\t\t(picture)\n>0x000048\tbyte\t\t0x12\t\t(program)\n>0x000048\tbyte\t\t0x13\t\t(function)\n>0x000048\tbyte\t\t0x14\t\t(macro)\n>0x000048\tbyte\t\t0x1D\t\t(backup)\n#\n# Magic Numbers for the TI-92+/V200\n#\n0\t\tstring\t\t**TI92P*\tTI-92+/V200 Graphing Calculator\n>0x000048\tbyte\t\t0x00\t\t(expression)\n>0x000048\tbyte\t\t0x04\t\t(list)\n>0x000048\tbyte\t\t0x06\t\t(matrix)\n>0x000048\tbyte\t\t0x0A\t\t(data)\n>0x000048\tbyte\t\t0x0B\t\t(text)\n>0x000048\tbyte\t\t0x0C\t\t(string)\n>0x000048\tbyte\t\t0x0D\t\t(graphic data base)\n>0x000048\tbyte\t\t0x0E\t\t(figure)\n>0x000048\tbyte\t\t0x10\t\t(picture)\n>0x000048\tbyte\t\t0x12\t\t(program)\n>0x000048\tbyte\t\t0x13\t\t(function)\n>0x000048\tbyte\t\t0x14\t\t(macro)\n>0x000048\tbyte\t\t0x1C\t\t(zipped)\n>0x000048\tbyte\t\t0x21\t\t(assembler)\n#\n# Magic Numbers for the TI-73/83+/89/92+/V200 FLASH upgrades\n#\n0x0000016\tstring\t\tAdvanced\tTI-XX Graphing Calculator (FLASH)\n0\t\tstring\t\t**TIFL**\tTI-XX Graphing Calculator (FLASH)\n>8\t\tbyte\t\t>0\t\t- Revision %d\n>>9 \t\tbyte\t\tx\t\t\\b.%d,\n>12\t\tbyte\t\t>0\t\tRevision date %02x\n>>13\t\tbyte\t\tx\t\t\\b/%02x\n>>14\t\tbeshort\t\tx\t\t\\b/%04x,\n>17\t\tstring\t\t>/0\t\tname: '%s',\n>48\t\tbyte\t\t0x74\t\tdevice: TI-73,\n>48\t\tbyte\t\t0x73\t\tdevice: TI-83+,\n>48\t\tbyte\t\t0x98\t\tdevice: TI-89,\n>48\t\tbyte\t\t0x88\t\tdevice: TI-92+,\n>49\t\tbyte\t\t0x23\t\ttype: OS upgrade,\n>49\t\tbyte\t\t0x24\t\ttype: application,\n>49\t\tbyte\t\t0x25\t\ttype: certificate,\n>49\t\tbyte\t\t0x3e\t\ttype: license,\n>74\t\tlelong\t\t>0\t\tsize: %ld bytes\n\n# VTi & TiEmu skins (TI Graphing Calculators).\n# From: Romain Lievin (roms@lpg.ticalc.org).\n# Magic Numbers for the VTi skins\n0               string          VTI\t\tVirtual TI skin\n>3\t\tstring\t\tv\t\t- Version\n>>4\t\tbyte\t\t>0\t\t\\b %c\n>>6\t\tbyte\t\tx\t\t\\b.%c\n# Magic Numbers for the TiEmu skins\n0\t\tstring\t\tTiEmu\t\tTiEmu skin\n>6              string          v               - Version\n>>7             byte            >0              \\b %c\n>>9             byte            x               \\b.%c\n>>10\t\tbyte\t\tx\t\t\\b%c\n\n#------------------------------------------------------------------------------\n# timezone:  file(1) magic for timezone data\n#\n# from Daniel Quinlan (quinlan@yggdrasil.com)\n# this should work on Linux, SunOS, and maybe others\n# Added new official magic number for recent versions of the Olson code\n0\tstring\tTZif\ttimezone data\n>4\tbyte\t0\t\\b, old version\n>4\tbyte\t>0\t\\b, version %c\n>20\tbelong\t0\t\\b, no gmt time flags\n>20\tbelong\t1\t\\b, 1 gmt time flag\n>20\tbelong\t>1\t\\b, %d gmt time flags\n>24\tbelong\t0\t\\b, no std time flags\n>20\tbelong\t1\t\\b, 1 std time flag\n>24\tbelong\t>1\t\\b, %d std time flags\n>28\tbelong\t0\t\\b, no leap seconds\n>28\tbelong\t1\t\\b, 1 leap second\n>28\tbelong  >1\t\\b, %d leap seconds\n>32\tbelong\t0\t\\b, no transition times\n>32\tbelong\t1\t\\b, 1 transition time\n>32\tbelong  >1\t\\b, %d transition times\n>36\tbelong\t0\t\\b, no abbreviation chars\n>36\tbelong\t1\t\\b, 1 abbreviation char\n>36\tbelong\t>1\t\\b, %d abbreviation chars\n0\tstring\t\\0\\0\\0\\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\told timezone data\n0\tstring\t\\0\\0\\0\\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\\0\told timezone data\n0\tstring  \\0\\0\\0\\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\told timezone data\n0\tstring\t\\0\\0\\0\\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\\0\told timezone data\n0\tstring\t\\0\\0\\0\\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\\0\told timezone data\n0\tstring\t\\0\\0\\0\\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\\0\told timezone data\n#------------------------------------------------------------------------------\n# troff:  file(1) magic for *roff\n#\n# updated by Daniel Quinlan (quinlan@yggdrasil.com)\n\n# troff input\n0\tsearch/1\t.\\\\\"\t\ttroff or preprocessor input text\n!:mime\ttext/troff\n0\tsearch/1\t'\\\\\"\t\ttroff or preprocessor input text\n!:mime\ttext/troff\n0\tsearch/1\t'.\\\\\"\t\ttroff or preprocessor input text\n!:mime\ttext/troff\n0\tsearch/1\t\\\\\"\t\ttroff or preprocessor input text\n!:mime\ttext/troff\n0\tsearch/1\t'''\t\ttroff or preprocessor input text\n!:mime\ttext/troff\n0\tregex/20\t\\^\\\\.[A-Za-z0-9][A-Za-z0-9][\\ \\t]\ttroff or preprocessor input text\n!:mime\ttext/troff\n0\tregex/20\t\\^\\\\.[A-Za-z0-9][A-Za-z0-9]$\ttroff or preprocessor input text\n!:mime\ttext/troff\n\n# ditroff intermediate output text\n0\tsearch/1\tx\\ T\t\tditroff output text\n>4\tsearch/1\tcat\t\tfor the C/A/T phototypesetter\n>4\tsearch/1\tps\t\tfor PostScript\n>4\tsearch/1\tdvi\t\tfor DVI\n>4\tsearch/1\tascii\t\tfor ASCII\n>4\tsearch/1\tlj4\t\tfor LaserJet 4\n>4\tsearch/1\tlatin1\t\tfor ISO 8859-1 (Latin 1)\n>4\tsearch/1\tX75\t\tfor xditview at 75dpi\n>>7\tsearch/1\t-12\t\t(12pt)\n>4\tsearch/1\tX100\t\tfor xditview at 100dpi\n>>8\tsearch/1\t-12\t\t(12pt)\n\n# output data formats\n0\tstring\t\t\\100\\357\tvery old (C/A/T) troff output data\n#\n#------------------------------------------------------------------------------\n# tuxedo:\tfile(1) magic for BEA TUXEDO data files\n#\n# from Ian Springer <ispringer@hotmail.com>\n#\n0\tstring\t\t\\0\\0\\1\\236\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\tBEA TUXEDO DES mask data\n\n#------------------------------------------------------------------------------\n# typeset:  file(1) magic for other typesetting\n#\n0\tstring\t\tInterpress/Xerox\tXerox InterPress data\n>16\tstring\t\t/\t\t\t(version\n>>17\tstring\t\t>\\0\t\t\t%s)\n#---------------------------------------------------------------------------\n# Unicode:  BOM prefixed text files - Adrian Havill <havill@turbolinux.co.jp>\n# GRR: These types should be recognised in file_ascmagic so these\n# encodings can be treated by text patterns.\n# Missing types are already dealt with internally.\n#\n0\tstring\t+/v8\t\t\tUnicode text, UTF-7\n0\tstring\t+/v9\t\t\tUnicode text, UTF-7\n0\tstring\t+/v+\t\t\tUnicode text, UTF-7\n0\tstring\t+/v/\t\t\tUnicode text, UTF-7\n0\tstring\t\\335\\163\\146\\163\tUnicode text, UTF-8-EBCDIC\n0\tstring\t\\376\\377\\000\\000\tUnicode text, UTF-32, big-endian\n0\tstring\t\\377\\376\\000\\000\tUnicode text, UTF-32, little-endian\n0\tstring\t\\016\\376\\377\t\tUnicode text, SCSU (Standard Compression Scheme for Unicode)\n\n#------------------------------------------------------------------------------\n# unknown:  file(1) magic for unknown machines\n#\n# XXX - this probably should be pruned, as it'll match PDP-11 and\n# VAX image formats.\n#\n# 0x107 is 0407; 0x108 is 0410; both are PDP-11 (executable and pure,\n# respectively).\n#\n# 0x109 is 0411; that's PDP-11 split I&D, but the PDP-11 version doesn't\n# have the \"version %ld\", which may be a bogus COFFism (I don't think\n# there ever was COFF for the PDP-11).\n#\n# 0x10B is 0413; that's VAX demand-paged, but this is a short, not a\n# long, as it would be on a VAX.\n#\n# 0x10C is 0414 and 0x10E is 416; those *are* unknown.\n#\n0\tshort\t\t0x107\t\tunknown machine executable\n>8\tshort\t\t>0\t\tnot stripped\n>15\tbyte\t\t>0\t\t- version %ld\n0\tshort\t\t0x108\t\tunknown pure executable\n>8\tshort\t\t>0\t\tnot stripped\n>15\tbyte\t\t>0\t\t- version %ld\n0\tshort\t\t0x109\t\tPDP-11 separate I&D\n>8\tshort\t\t>0\t\tnot stripped\n>15\tbyte\t\t>0\t\t- version %ld\n0\tshort\t\t0x10b\t\tunknown pure executable\n>8\tshort\t\t>0\t\tnot stripped\n>15\tbyte\t\t>0\t\t- version %ld\n0\tlong\t\t0x10c\t\tunknown demand paged pure executable\n>16\tlong\t\t>0\t\tnot stripped\n0\tlong\t\t0x10e\t\tunknown readable demand paged pure executable\n#------------------------------------------------------------------------------\n# uuencode:  file(1) magic for ASCII-encoded files\n#\n\n# GRR:  the first line of xxencoded files is identical to that in uuencoded\n# files, but the first character in most subsequent lines is 'h' instead of\n# 'M'.  (xxencoding uses lowercase letters in place of most of uuencode's\n# punctuation and survives BITNET gateways better.)  If regular expressions\n# were supported, this entry could possibly be split into two with\n# \"begin\\040\\.\\*\\012M\" or \"begin\\040\\.\\*\\012h\" (where \\. and \\* are REs).\n0\tsearch/1\tbegin\\ \t\tuuencoded or xxencoded text\n\n# btoa(1) is an alternative to uuencode that requires less space.\n0\tsearch/1\txbtoa\\ Begin\tbtoa'd text\n\n# ship(1) is another, much cooler alternative to uuencode.\n# Greg Roelofs, newt@uchicago.edu\n0\tsearch/1\t$\\012ship\tship'd binary text\n\n# bencode(8) is used to encode compressed news batches (Bnews/Cnews only?)\n# Greg Roelofs, newt@uchicago.edu\n0\tsearch/1\tDecode\\ the\\ following\\ with\\ bdeco\tbencoded News text\n\n# BinHex is the Macintosh ASCII-encoded file format (see also \"apple\")\n# Daniel Quinlan, quinlan@yggdrasil.com\n11\tsearch/1\tmust\\ be\\ converted\\ with\\ BinHex\tBinHex binary text\n>41\tsearch/1\tx\t\t\t\t\t\\b, version %.3s\n\n# GRR: handle BASE64\n\n#------------------------------------------------------------------------------\n# varied.out:  file(1) magic for various USG systems\n#\n#\tHerewith many of the object file formats used by USG systems.\n#\tMost have been moved to files for a particular processor,\n#\tand deleted if they duplicate other entries.\n#\n0\tshort\t\t0610\t\tPerkin-Elmer executable\n# AMD 29K\n0\tbeshort\t\t0572\t\tamd 29k coff noprebar executable\n0\tbeshort\t\t01572\t\tamd 29k coff prebar executable\n0\tbeshort\t\t0160007\t\tamd 29k coff archive\n# Cray\n6\tbeshort\t\t0407\t\tunicos (cray) executable\n# Ultrix 4.3\n596\tstring\t\t\\130\\337\\377\\377\tUltrix core file\n>600\tstring\t\t>\\0\t\tfrom '%s'\n# BeOS and MAcOS PEF executables\n# From: hplus@zilker.net (Jon Watte)\n0\tstring\t\tJoy!peffpwpc\theader for PowerPC PEF executable\n#\n# ava assembler/linker Uros Platise <uros.platise@ijs.si>\n0       string          avaobj  AVR assembler object code\n>7      string          >\\0     version '%s'\n# gnu gmon magic From: Eugen Dedu <dedu@ese-metz.fr>\n0\tstring\t\tgmon\t\tGNU prof performance data\n>4\tlong\t\tx\t\t- version %ld\n# From: Dave Pearson <davep@davep.org>\n# Harbour <URL:http://www.harbour-project.org/> HRB files.\n0\tstring\t\t\\xc0HRB\t\tHarbour HRB file\n>4\tshort\t\tx\t\tversion %d\n\n# From: Alex Beregszaszi <alex@fsn.hu>\n# 0\tstring\t\texec \t\tBugOS executable\n# 0\tstring\t\tpack\t\tBugOS archive\n\n# From: Jason Spence <jspence@lightconsulting.com>\n# Generated by the \"examples\" in STM's ST40 devkit, and derived code.\n0\tlelong\t\t0x13a9f17e\tST40 component image format\n>4\tstring\t\t>\\0\t\t\\b, name '%s'\n\n#------------------------------------------------------------------------------\n# varied.script:  file(1) magic for various interpreter scripts\n\n0\tstring\t\t#!\\ /\t\t\ta\n>3\tstring\t\t>\\0\t\t\t%s script text executable\n0\tstring\t\t#!\\t/\t\t\ta\n>3\tstring\t\t>\\0\t\t\t%s script text executable\n0\tstring\t\t#!/\t\t\ta\n>2\tstring\t\t>\\0\t\t\t%s script text executable\n0\tstring\t\t#!\\ \t\t\tscript text executable\n>3\tstring\t\t>\\0\t\t\tfor %s\n\n# From: arno <arenevier@fdn.fr>\n# mozilla xpconnect typelib\n# see http://www.mozilla.org/scriptable/typelib_file.html\n0\tstring \t\tXPCOM\\nTypeLib\\r\\n\\032\t\tXPConnect Typelib\n>0x10  byte        x       version %d\n>>0x11 byte        x      \\b.%d\n\n#------------------------------------------------------------------------------\n# vax:  file(1) magic for VAX executable/object and APL workspace\n#\n0\tlelong\t\t0101557\t\tVAX single precision APL workspace\n0\tlelong\t\t0101556\t\tVAX double precision APL workspace\n\n#\n# VAX a.out (32V, BSD)\n#\n0\tlelong\t\t0407\t\tVAX executable\n>16\tlelong\t\t>0\t\tnot stripped\n\n0\tlelong\t\t0410\t\tVAX pure executable\n>16\tlelong\t\t>0\t\tnot stripped\n\n0\tlelong\t\t0413\t\tVAX demand paged pure executable\n>16\tlelong\t\t>0\t\tnot stripped\n\n0\tlelong\t\t0420\t\tVAX demand paged (first page unmapped) pure executable\n>16\tlelong\t\t>0\t\tnot stripped\n\n#\n# VAX COFF\n#\n# The `versions' should be un-commented if they work for you.\n# (Was the problem just one of endianness?)\n#\n0\tleshort\t\t0570\t\tVAX COFF executable\n>12\tlelong\t\t>0\t\tnot stripped\n>22\tleshort\t\t>0\t\t- version %ld\n0\tleshort\t\t0575\t\tVAX COFF pure executable\n>12\tlelong\t\t>0\t\tnot stripped\n>22\tleshort\t\t>0\t\t- version %ld\n\n#------------------------------------------------------------------------------\n# vicar:  file(1) magic for VICAR files.\n#\n# From: Ossama Othman <othman@astrosun.tn.cornell.edu\n# VICAR is JPL's in-house spacecraft image processing program\n# VICAR image\n0\tstring\tLBLSIZE=\tVICAR image data\n>32\tstring\tBYTE\t\t\\b, 8 bits  = VAX byte\n>32\tstring\tHALF\t\t\\b, 16 bits = VAX word     = Fortran INTEGER*2\n>32\tstring\tFULL\t\t\\b, 32 bits = VAX longword = Fortran INTEGER*4\n>32\tstring\tREAL\t\t\\b, 32 bits = VAX longword = Fortran REAL*4\n>32\tstring\tDOUB\t\t\\b, 64 bits = VAX quadword = Fortran REAL*8\n>32\tstring\tCOMPLEX\t\t\\b, 64 bits = VAX quadword = Fortran COMPLEX*8\n# VICAR label file\n43\tstring\tSFDU_LABEL\tVICAR label file\n#------------------------------------------------------------------------------\n# Virtutech Compressed Random Access File Format\n#\n# From <gustav@virtutech.com>\n0      string          \\211\\277\\036\\203        Virtutech CRAFF\n>4     belong          x               v%d\n>20    belong          0               uncompressed\n>20    belong          1               bzipp2ed\n>20    belong          2               gzipped\n>24    belong          0               not clean\n\n#------------------------------------------------------------------------------\n# visx:  file(1) magic for Visx format files\n#\n0\tshort\t\t0x5555\t\tVISX image file\n>2\tbyte\t\t0\t\t(zero)\n>2\tbyte\t\t1\t\t(unsigned char)\n>2\tbyte\t\t2\t\t(short integer)\n>2\tbyte\t\t3\t\t(float 32)\n>2\tbyte\t\t4\t\t(float 64)\n>2\tbyte\t\t5\t\t(signed char)\n>2\tbyte\t\t6\t\t(bit-plane)\n>2\tbyte\t\t7\t\t(classes)\n>2\tbyte\t\t8\t\t(statistics)\n>2\tbyte\t\t10\t\t(ascii text)\n>2\tbyte\t\t15\t\t(image segments)\n>2\tbyte\t\t100\t\t(image set)\n>2\tbyte\t\t101\t\t(unsigned char vector)\n>2\tbyte\t\t102\t\t(short integer vector)\n>2\tbyte\t\t103\t\t(float 32 vector)\n>2\tbyte\t\t104\t\t(float 64 vector)\n>2\tbyte\t\t105\t\t(signed char vector)\n>2\tbyte\t\t106\t\t(bit plane vector)\n>2\tbyte\t\t121\t\t(feature vector)\n>2\tbyte\t\t122\t\t(feature vector library)\n>2\tbyte\t\t124\t\t(chain code)\n>2\tbyte\t\t126\t\t(bit vector)\n>2\tbyte\t\t130\t\t(graph)\n>2\tbyte\t\t131\t\t(adjacency graph)\n>2\tbyte\t\t132\t\t(adjacency graph library)\n>2\tstring\t\t.VISIX\t\t(ascii text)\n\n#------------------------------------------------------------------------------\n# vms:  file(1) magic for VMS executables (experimental)\n#\n# VMS .exe formats, both VAX and AXP (Greg Roelofs, newt@uchicago.edu)\n\n# GRR 950122:  I'm just guessing on these, based on inspection of the headers\n# of three executables each for Alpha and VAX architectures.  The VAX files\n# all had headers similar to this:\n#\n#   00000  b0 00 30 00 44 00 60 00  00 00 00 00 30 32 30 35  ..0.D.`.....0205\n#   00010  01 01 00 00 ff ff ff ff  ff ff ff ff 00 00 00 00  ................\n#\n0\tstring\t\\xb0\\0\\x30\\0\tVMS VAX executable\n>44032\tstring\tPK\\003\\004\t\\b, Info-ZIP SFX archive v5.12 w/decryption\n#\n# The AXP files all looked like this, except that the byte at offset 0x22\n# was 06 in some of them and 07 in others:\n#\n#   00000  03 00 00 00 00 00 00 00  ec 02 00 00 10 01 00 00  ................\n#   00010  68 00 00 00 98 00 00 00  b8 00 00 00 00 00 00 00  h...............\n#   00020  00 00 07 00 00 00 00 00  00 00 00 00 00 00 00 00  ................\n#   00030  00 00 00 00 01 00 00 00  00 00 00 00 00 00 00 00  ................\n#   00040  00 00 00 00 ff ff ff ff  ff ff ff ff 02 00 00 00  ................\n#\n0\tbelong\t0x03000000\tVMS Alpha executable\n>75264\tstring\tPK\\003\\004\t\\b, Info-ZIP SFX archive v5.12 w/decryption\n\n# -----------------------------------------------------------\n# VMware specific files (deducted from version 1.1 and log file entries)\n# Anthon van der Neut (anthon@mnt.org)\n0\tbelong\t0x4d52564e\tVMware nvram \n\n#------------------------------------------------------------------------------\n# vorbis:  file(1) magic for Ogg/Vorbis files\n#\n# From Felix von Leitner <leitner@fefe.de>\n# Extended by Beni Cherniavsky <cben@crosswinds.net>\n# Further extended by Greg Wooledge <greg@wooledge.org>\n#\n# Most (everything but the number of channels and bitrate) is commented\n# out with `##' as it's not interesting to the average user.  The most\n# probable things advanced users would want to uncomment are probably\n# the number of comments and the encoder version.\n#\n# FIXME: The first match has been made a search, so that it can skip\n# over prepended ID3 tags. This will work for MIME type detection, but\n# won't work for detecting other properties of the file (they all need\n# to be made relative to the search). In any case, if the file has ID3\n# tags, the ID3 information will be printed, not the Ogg information,\n# so until that's fixed, this doesn't matter.\n# FIXME[2]: Disable the above for now, since search assumes text mode.\n#\n# --- Ogg Framing ---\n#0\t\tsearch/1000\tOggS\t\tOgg data\n0\t\tstring\tOggS\t\tOgg data\n!:mime\t\tapplication/ogg\n>4\t\tbyte\t\t!0\t\tUNKNOWN REVISION %u\n##>4\t\tbyte\t\t0\t\trevision 0\n>4\t\tbyte\t\t0\n##>>14\t\tlelong\t\tx\t\t(Serial %lX)\n# non-Vorbis content: FLAC (Free Lossless Audio Codec, http://flac.sourceforge.net)\n>>28\t\tstring\t\t\\x7fFLAC\t\\b, FLAC audio\n# non-Vorbis content: Theora\n>>28\t\tstring\t\t\\x80theora\t\\b, Theora video\n# non-Vorbis content: Kate\n>>28\t\tstring\t\t\\x80kate\\0\\0\\0\\0\t\\b, Kate\n>>>37\t\tubyte\t\tx\t\tv%u\n>>>38\t\tubyte\t\tx\t\t\\b.%u,\n>>>40\t\tbyte\t\t0\t\tutf8 encoding,\n>>>40\t\tbyte\t\t!0\t\tunknown character encoding,\n>>>60\t\tstring\t\t>\\0\t\tlanguage %s,\n>>>60\t\tstring\t\t\\0\t\tno language set,\n>>>76\t\tstring\t\t>\\0\t\tcategory %s\n>>>76\t\tstring\t\t\\0\t\tno category set\n# non-Vorbis content: Skeleton\n>>28\t\tstring\t\tfishead\\0\t\\b, Skeleton\n>>>36\t\tshort\t\tx\t\tv%u\n>>>40\t\tshort\t\tx\t\t\\b.%u\n# non-Vorbis content: Speex\n>>28\t\tstring\t\tSpeex\\ \\ \\ \t\\b, Speex audio\n# non-Vorbis content: OGM\n>>28\t\tstring\t\t\\x01video\\0\\0\\0\t\\b, OGM video\n>>>37\t\tstring/c\tdiv3\t\t(DivX 3)\n>>>37\t\tstring/c\tdivx\t\t(DivX 4)\n>>>37\t\tstring/c\tdx50\t\t(DivX 5)\n>>>37\t\tstring/c\txvid\t\t(XviD)\n# --- First vorbis packet - general header ---\n>>28\t\tstring\t\t\\x01vorbis\t\\b, Vorbis audio,\n>>>35\t\tlelong\t\t!0\t\tUNKNOWN VERSION %lu,\n##>>>35\t\tlelong\t\t0\t\tversion 0,\n>>>35\t\tlelong\t\t0\n>>>>39\t\tubyte\t\t1\t\tmono,\n>>>>39\t\tubyte\t\t2\t\tstereo,\n>>>>39\t\tubyte\t\t>2\t\t%u channels,\n>>>>40\t\tlelong\t\tx\t\t%lu Hz\n# Minimal, nominal and maximal bitrates specified when encoding\n>>>>48\t\tstring\t\t<\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\t\\b,\n# The above tests if at least one of these is specified:\n>>>>>52\t\tlelong\t\t!-1\n# Vorbis RC2 has a bug which puts -1000 in the min/max bitrate fields\n# instead of -1.\n# Vorbis 1.0 uses 0 instead of -1.\n>>>>>>52\tlelong\t\t!0\n>>>>>>>52\tlelong\t\t!-1000\n>>>>>>>>52\tlelong\t\tx\t\t<%lu\n>>>>>48\t\tlelong\t\t!-1\n>>>>>>48\tlelong\t\tx\t\t~%lu\n>>>>>44\t\tlelong\t\t!-1\n>>>>>>44\tlelong\t\t!-1000\n>>>>>>>44\tlelong\t\t!0\n>>>>>>>>44\tlelong\t\tx\t\t>%lu\n>>>>>48\t\tstring\t\t<\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\tbps\n# -- Second vorbis header packet - the comments\n# A kludge to read the vendor string.  It's a counted string, not a\n# zero-terminated one, so file(1) can't read it in a generic way.\n# libVorbis is the only one existing currently, so I detect specifically\n# it.  The interesting value is the cvs date (8 digits decimal).\n# Post-RC1 Ogg files have the second header packet (and thus the version)\n# in a different place, so we must use an indirect offset.\n>>>(84.b+85)\t\tstring\t\t\\x03vorbis\n>>>>(84.b+96)\t\tstring/c\tXiphophorus\\ libVorbis\\ I\t\\b, created by: Xiphophorus libVorbis I\n>>>>>(84.b+120)\t\tstring\t\t>00000000\t\n# Map to beta version numbers:\n>>>>>>(84.b+120)\tstring\t\t<20000508\t(<beta1, prepublic)\n>>>>>>(84.b+120)\tstring\t\t20000508\t(1.0 beta 1 or beta 2)\n>>>>>>(84.b+120)\tstring\t\t>20000508\n>>>>>>>(84.b+120)\tstring\t\t<20001031\t(beta2-3)\n>>>>>>(84.b+120)\tstring\t\t20001031\t(1.0 beta 3)\n>>>>>>(84.b+120)\tstring\t\t>20001031\n>>>>>>>(84.b+120)\tstring\t\t<20010225\t(beta3-4)\n>>>>>>(84.b+120)\tstring\t\t20010225\t(1.0 beta 4)\n>>>>>>(84.b+120)\tstring\t\t>20010225\n>>>>>>>(84.b+120)\tstring\t\t<20010615\t(beta4-RC1)\n>>>>>>(84.b+120)\tstring\t\t20010615\t(1.0 RC1)\n>>>>>>(84.b+120)\tstring\t\t20010813\t(1.0 RC2)\n>>>>>>(84.b+120)\tstring\t\t20010816\t(RC2 - Garf tuned v1)\n>>>>>>(84.b+120)\tstring\t\t20011014\t(RC2 - Garf tuned v2)\n>>>>>>(84.b+120)\tstring\t\t20011217\t(1.0 RC3)\n>>>>>>(84.b+120)\tstring\t\t20011231\t(1.0 RC3)\n# Some pre-1.0 CVS snapshots still had \"Xiphphorus\"...\n>>>>>>(84.b+120)\tstring\t\t>20011231\t(pre-1.0 CVS)\n# For the 1.0 release, Xiphophorus is replaced by Xiph.Org\n>>>>(84.b+96)\t\tstring/c\tXiph.Org\\ libVorbis\\ I\t\\b, created by: Xiph.Org libVorbis I\n>>>>>(84.b+117)\t\tstring\t\t>00000000\t\n>>>>>>(84.b+117)\tstring\t\t<20020717\t(pre-1.0 CVS)\n>>>>>>(84.b+117)\tstring\t\t20020717\t(1.0)\n>>>>>>(84.b+117)\tstring\t\t20030909\t(1.0.1)\n>>>>>>(84.b+117)\tstring\t\t20040629\t(1.1.0 RC1)\n\n#------------------------------------------------------------------------------\n# VXL: file(1) magic for VXL binary IO data files\n#\n# from Ian Scott <scottim@sf.net>\n#\n# VXL is a collection of C++ libraries for Computer Vision.\n# See the vsl chapter in the VXL Book for more info\n# http://www.isbe.man.ac.uk/public_vxl_doc/books/vxl/book.html\n# http:/vxl.sf.net\n\n2\tlelong\t0x472b2c4e\tVXL data file,\n>0\tleshort\t>0\t\tschema version no %d\n\n#------------------------------------------------------------------------------\n# warc:  file(1) magic for WARC files\n\n0\tstring\tWARC/\tWARC Archive\n>5\tstring\tx\tversion %.4s\n#------------------------------------------------------------------------------\n# weak:  file(1) magic for very weak magic entries, disabled by default\n#\n# These entries are so weak that they might interfere identification of\n# other formats. Example include:\n# - Only identify for 1 or 2 bytes\n# - Match against very wide range of values\n# - Match against generic word in some spoken languages (e.g. English)\n\n# Summary: Computer Graphics Metafile\n# Extension: .cgm\n#0\tbeshort&0xffe0\t0x0020\t\tbinary Computer Graphics Metafile\n#0\tbeshort\t\t0x3020\t\tcharacter Computer Graphics Metafile\n\n#0\tstring\t\t=!!\t\tBennet Yee's \"face\" format\n\n#------------------------------------------------------------------------------\n# windows:  file(1) magic for Microsoft Windows\n#\n# This file is mainly reserved for files where programs\n# using them are run almost always on MS Windows 3.x or\n# above, or files only used exclusively in Windows OS,\n# where there is no better category to allocate for.\n# For example, even though WinZIP almost run on Windows\n# only, it is better to treat them as \"archive\" instead.\n# For format usable in DOS, such as generic executable\n# format, please specify under \"msdos\" file.\n#\n\n\n# Summary: Outlook Express DBX file\n# Extension: .dbx\n# Created by: Christophe Monniez\n0\tstring\t\\xCF\\xAD\\x12\\xFE\tMS Outlook Express DBX file\n>4\tbyte\t=0xC5\t\t\t\\b, message database\n>4\tbyte\t=0xC6\t\t\t\\b, folder database\n>4\tbyte\t=0xC7\t\t\t\\b, account information\n>4\tbyte\t=0x30\t\t\t\\b, offline database\n\n\n# Summary: Windows crash dump\n# Extension: .dmp\n# Created by: Andreas Schuster (http://computer.forensikblog.de/)\n# Reference (1): http://computer.forensikblog.de/en/2008/02/64bit_magic.html\n# Modified by (1): Abel Cheung (Avoid match with first 4 bytes only)\n0\tstring\t\tPAGE\t\t\n>4\tstring\t\tDUMP\t\tMS Windows 32bit crash dump\n>>0x05c\tbyte            0\t\t\\b, no PAE\n>>0x05c\tbyte            1\t\t\\b, PAE\n>>0xf88\tlelong\t\t1\t\t\\b, full dump\n>>0xf88\tlelong\t\t2\t\t\\b, kernel dump\n>>0xf88\tlelong\t\t3\t\t\\b, small dump\n>>0x068\tlelong\t\tx\t\t\\b, %ld pages\n>4\tstring\t\tDU64\t\tMS Windows 64bit crash dump\n>>0xf98\tlelong\t\t1\t\t\\b, full dump\n>>0xf98\tlelong\t\t2\t\t\\b, kernel dump\n>>0xf98\tlelong\t\t3\t\t\\b, small dump\n>>0x090\tlequad\t\tx\t\t\\b, %lld pages\n\n\n# Summary: Vista Event Log\n# Extension: .evtx\n# Created by: Andreas Schuster (http://computer.forensikblog.de/)\n# Reference (1): http://computer.forensikblog.de/en/2007/05/some_magic.html\n0\tstring\t\tElfFile\\0\tMS Windows Vista Event Log\n>0x2a\tleshort\t\tx\t\t\\b, %d chunks\n>>0x10\tlelong\t\tx\t\t\\b (no. %d in use)\n>0x18\tlelong\t\t>1\t\t\\b, next record no. %d\n>0x18\tlelong\t\t=1\t\t\\b, empty\n>0x78\tlelong\t\t&1\t\t\\b, DIRTY\n>0x78\tlelong\t\t&2\t\t\\b, FULL\n\n\n# Summary: Windows 3.1 group files\n# Extension: .grp\n# Created by: unknown\n0\tstring\t\t\\120\\115\\103\\103\tMS Windows 3.1 group files\n\n\n# Summary: Old format help files\n# Extension: .hlp\n# Created by: Dirk Jagdmann <doj@cubic.org>\n0\tlelong\t\t0x00035f3f\t\tMS Windows 3.x help file\n\n\n# Summary: Hyper terminal\n# Extension: .ht\n# Created by: unknown\n0\tstring\t\tHyperTerminal\\ \n>15\tstring\t\t1.0\\ --\\ HyperTerminal\\ data\\ file\tMS Windows HyperTerminal profile\n\n\n# Summary: Windows shortcut\n# Extension: .lnk\n# Created by: unknown\n0\tstring\t\t\\114\\0\\0\\0\\001\\024\\002\\0\\0\\0\\0\\0\\300\\0\\0\\0\\0\\0\\0\\106\tMS Windows shortcut\n\n\n# Summary: Outlook Personal Folders\n# Created by: unknown\n0\tlelong\t\t0x4E444221\tMicrosoft Outlook email folder\n>10\tleshort\t\t0x0e\t\t(<=2002)\n>10\tleshort\t\t0x17\t\t(>=2003)\n\n\n# Summary: Windows help cache\n# Created by: unknown\n0\tstring\t\t\\164\\146\\115\\122\\012\\000\\000\\000\\001\\000\\000\\000\tMS Windows help cache\n\n\n# Summary: IE cache file\n# Created by: Christophe Monniez\n0\tstring\tClient\\ UrlCache\\ MMF \tInternet Explorer cache file\n>20\tstring\t>\\0\t\t\tversion %s\n\n\n# Summary: Registry files\n# Created by: unknown\n# Modified by (1): Joerg Jenderek\n0\tstring\t\tregf\t\tMS Windows registry file, NT/2000 or above\n0\tstring\t\tCREG\t\tMS Windows 95/98/ME registry file\n0\tstring\t\tSHCC3\t\tMS Windows 3.1 registry file\n\n\n# Summary: Windows Registry text\n# Extension: .reg\n# Submitted by: Abel Cheung <abelcheung@gmail.com>\n0\tstring\t\tREGEDIT4\\r\\n\\r\\n\tWindows Registry text (Win95 or above)\n0\tstring\t\tWindows\\ Registry\\ Editor\\ \n>&0\tstring\t\tVersion\\ 5.00\\r\\n\\r\\n\tWindows Registry text (Win2K or above)\n\n\n# From: Pal Tamas <folti@balabit.hu>\n# Autorun File\n0       string/c          [autorun]\\r\\n   Microsoft Windows Autorun file.\n!:mime\tapplication/x-setupscript. \n#------------------------------------------------------------------------------\n# wireless-regdb:        file(1) magic for CRDA wireless-regdb file format\n#\n0\tstring\tRGDB\tCRDA wireless regulatory database file\n>4\tbelong\t19\t(Version 1)\n#------------------------------------------------------------------------------\n# wordprocessors:  file(1) magic fo word processors.\n#\n####### PWP file format used on Smith Corona Personal Word Processors:\n2\tstring\t\\040\\040\\040\\040\\040\\040\\040\\040\\040\\040\\040ML4D\\040'92\tSmith Corona PWP\n>24\tbyte\t2\t\\b, single spaced\n>24\tbyte\t3\t\\b, 1.5 spaced\n>24\tbyte\t4\t\\b, double spaced\n>25\tbyte\t0x42\t\\b, letter\n>25\tbyte\t0x54\t\\b, legal\n>26\tbyte\t0x46\t\\b, A4\n\n#WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE\n0\tstring\t\\377WPC\\020\\000\\000\\000\\022\\012\\001\\001\\000\\000\\000\\000\t(WP) loadable file\n>15\tbyte\t0\tOptimized for Intel\n>15\tbyte\t1\tOptimized for Non-Intel\n1\tstring\tWPC\t(Corel/WP)\n>8\tshort\t257\tWordPerfect macro\n>8\tshort\t258\tWordPerfect help file\n>8\tshort\t259\tWordPerfect keyboard file\n>8\tshort\t266\tWordPerfect document\n>8\tshort\t267\tWordPerfect dictionary\n>8\tshort\t268\tWordPerfect thesaurus\n>8\tshort\t269\tWordPerfect block\n>8\tshort\t270\tWordPerfect rectangular block\n>8\tshort\t271\tWordPerfect column block\n>8\tshort\t272\tWordPerfect printer data\n>8\tshort\t275\tWordPerfect printer data\n>8\tshort\t276\tWordPerfect driver resource data\n>8\tshort\t279\tWordPerfect hyphenation code\n>8\tshort\t280\tWordPerfect hyphenation data\n>8\tshort\t281\tWordPerfect macro resource data\n>8\tshort\t283\tWordPerfect hyphenation lex\n>8\tshort\t285\tWordPerfect wordlist\n>8\tshort\t286\tWordPerfect equation resource data\n>8\tshort\t289\tWordPerfect spell rules\n>8\tshort\t290\tWordPerfect dictionary rules\n>8\tshort\t295\tWordPerfect spell rules (Microlytics)\n>8\tshort\t299\tWordPerfect settings file\n>8\tshort\t301\tWordPerfect 4.2 document\n>8\tshort\t325\tWordPerfect dialog file\n>8\tshort\t332\tWordPerfect button bar\n>8\tshort\t513\tShell macro\n>8\tshort\t522\tShell definition\n>8\tshort\t769\tNotebook macro\n>8\tshort\t770\tNotebook help file\n>8\tshort\t771\tNotebook keyboard file\n>8\tshort\t778\tNotebook definition\n>8\tshort\t1026\tCalculator help file\n>8\tshort \t1538\tCalendar help file\n>8\tshort \t1546\tCalendar data file\n>8\tshort\t1793\tEditor macro\n>8\tshort\t1794\tEditor help file\n>8\tshort\t1795\tEditor keyboard file\n>8\tshort\t1817\tEditor macro resource file\n>8\tshort \t2049\tMacro editor macro\n>8\tshort \t2050\tMacro editor help file\n>8\tshort\t2051\tMacro editor keyboard file\n>8\tshort\t2305\tPlanPerfect macro\n>8\tshort\t2306\tPlanPerfect help file\n>8\tshort\t2307\tPlanPerfect keyboard file\n>8\tshort\t2314\tPlanPerfect worksheet\n>8\tshort\t2319\tPlanPerfect printer definition\n>8\tshort\t2322\tPlanPerfect graphic definition\n>8\tshort\t2323\tPlanPerfect data\n>8\tshort\t2324\tPlanPerfect temporary printer\n>8\tshort\t2329\tPlanPerfect macro resource data\n>8\tbyte\t11\tMail\n>8\tshort\t2818\thelp file\n>8\tshort\t2821\tdistribution list\n>8\tshort\t2826\tout box\n>8\tshort\t2827\tin box\n>8\tshort\t2836\tusers archived mailbox\n>8\tshort\t2837\tarchived message database\n>8\tshort\t2838\tarchived attachments\n>8\tshort\t3083\tPrinter temporary file\n>8\tshort\t3330\tScheduler help file\n>8\tshort\t3338\tScheduler in file\n>8\tshort\t3339\tScheduler out file\n>8\tshort\t3594\tGroupWise settings file\n>8\tshort\t3601\tGroupWise directory services\n>8\tshort\t3627\tGroupWise settings file\n>8\tshort\t4362\tTerminal resource data\n>8\tshort\t4363\tTerminal resource data\n>8\tshort\t4395\tTerminal resource data\n>8\tshort\t4619\tGUI loadable text\n>8\tshort\t4620\tgraphics resource data\n>8\tshort\t4621\tprinter settings file\n>8\tshort\t4622\tport definition file\n>8\tshort\t4623\tprint queue parameters\n>8\tshort\t4624\tcompressed file\n>8\tshort\t5130\tNetwork service msg file\n>8\tshort\t5131\tNetwork service msg file\n>8\tshort\t5132\tAsync gateway login msg\n>8\tshort\t5134\tGroupWise message file\n>8\tshort\t7956\tGroupWise admin domain database\n>8\tshort\t7957\tGroupWise admin host database\n>8\tshort\t7959\tGroupWise admin remote host database\n>8\tshort\t7960\tGroupWise admin ADS deferment data file\n>8\tshort\t8458\tIntelliTAG (SGML) compiled DTD\n>8\tlong\t18219264\tWordPerfect graphic image (1.0)\n>8\tlong\t18219520\tWordPerfect graphic image (2.0)\n#end of WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE\n\n# Hangul (Korean) Word Processor File\n0\tstring\tHWP\\ Document\\ File\tHangul (Korean) Word Processor File 3.0\n# From: Won-Kyu Park <wkpark@kldp.org>\n512\tstring\t\tR\\0o\\0o\\0t\\0\tHangul (Korean) Word Processor File 2000\n!:mime\tapplication/x-hwp\n\n# CosmicBook, from Benot Rouits\n0       string  CSBK    Ted Neslson's CosmicBook hypertext file\n\n2       string  EYWR    AmigaWriter file\n\n# chi:  file(1) magic for ChiWriter files\n0       string          \\\\1cw\\          ChiWriter file\n>5      string          >\\0             version %s\n0       string          \\\\1cw           ChiWriter file\n\n# Quark Express from http://www.garykessler.net/library/file_sigs.html\n2\tstring\tIIXPR3\t\t\tIntel Quark Express Document (English)\n2\tstring\tIIXPRa\t\t\tIntel Quark Express Document (Korean)\n2\tstring\tMMXPR3\t\t\tMotorola Quark Express Document (English)\n!:mime\tapplication/x-quark-xpress-3\n2\tstring\tMMXPRa\t\t\tMotorola Quark Express Document (Korean)\n\n# adobe indesign (document, whatever...) from querkan\n0\tbelong\t0x0606edf5\t\tAdobe InDesign\n>16\tstring\tDOCUMENT\t\tDocument\n\n#------------------------------------------------------------------------------\n# ichitaro456: file(1) magic for Just System Word Processor Ichitaro\n#\n# Contributor kenzo-:\n# Reversed-engineered JS Ichitaro magic numbers\n#\n\n0\tstring\t\tDOC\n>43\tbyte\t\t0x14\tJust System Word Processor Ichitaro v4\n!:mime\tapplication/x-ichitaro4\n>144\tstring\tJDASH\t\tapplication/x-ichitaro4\n\n0\tstring\t\tDOC\n>43\tbyte\t\t0x15\tJust System Word Processor Ichitaro v5\n!:mime\tapplication/x-ichitaro5\n\n0\tstring\t\tDOC\n>43\tbyte\t\t0x16\tJust System Word Processor Ichitaro v6\n!:mime\tapplication/x-ichitaro6\n\n#------------------------------------------------------------------------------\n# file(1) magic(5) data for xdelta  Josh MacDonald <jmacd@CS.Berkeley.EDU>\n#\n0\tstring\t%XDELTA%\tXDelta binary patch file 0.14\n0\tstring\t%XDZ000%\tXDelta binary patch file 0.18\n0\tstring\t%XDZ001%\tXDelta binary patch file 0.20\n0\tstring\t%XDZ002%\tXDelta binary patch file 1.0\n0\tstring\t%XDZ003%\tXDelta binary patch file 1.0.4\n0\tstring\t%XDZ004%\tXDelta binary patch file 1.1\n\n#------------------------------------------------------------------------------\n# xenix:  file(1) magic for Microsoft Xenix\n#\n# \"Middle model\" stuff, and \"Xenix 8086 relocatable or 80286 small\n# model\" lifted from \"magic.xenix\", with comment \"derived empirically;\n# treat as folklore until proven\"\n#\n# \"small model\", \"large model\", \"huge model\" stuff lifted from XXX\n#\n# XXX - \"x.out\" collides with PDP-11 archives\n#\n0\tstring\t\tcore\t\tcore file (Xenix)\n0\tbyte\t\t0x80\t\t8086 relocatable (Microsoft)\n0\tleshort\t\t0xff65\t\tx.out\n>2\tstring\t\t__.SYMDEF\t randomized\n>0\tbyte\t\tx\t\tarchive\n0\tleshort\t\t0x206\t\tMicrosoft a.out\n>8\tleshort\t\t1\t\tMiddle model\n>0x1e\tleshort\t\t&0x10\t\toverlay\n>0x1e\tleshort\t\t&0x2\t\tseparate\n>0x1e\tleshort\t\t&0x4\t\tpure\n>0x1e\tleshort\t\t&0x800\t\tsegmented\n>0x1e\tleshort\t\t&0x400\t\tstandalone\n>0x1e\tleshort\t\t&0x8\t\tfixed-stack\n>0x1c\tbyte\t\t&0x80\t\tbyte-swapped\n>0x1c\tbyte\t\t&0x40\t\tword-swapped\n>0x10\tlelong\t\t>0\t\tnot-stripped\n>0x1e\tleshort\t\t^0xc000\t\tpre-SysV\n>0x1e\tleshort\t\t&0x4000\t\tV2.3\n>0x1e\tleshort\t\t&0x8000\t\tV3.0\n>0x1c\tbyte\t\t&0x4\t\t86\n>0x1c\tbyte\t\t&0xb\t\t186\n>0x1c\tbyte\t\t&0x9\t\t286\n>0x1c\tbyte\t\t&0xa\t\t386\n>0x1f\tbyte\t\t<0x040\t\tsmall model\n>0x1f\tbyte\t\t=0x048\t\tlarge model\t\n>0x1f\tbyte\t\t=0x049\t\thuge model \n>0x1e\tleshort\t\t&0x1\t\texecutable\n>0x1e\tleshort\t\t^0x1\t\tobject file\n>0x1e\tleshort\t\t&0x40\t\tLarge Text\n>0x1e\tleshort\t\t&0x20\t\tLarge Data\n>0x1e\tleshort\t\t&0x120\t\tHuge Objects Enabled\n>0x10\tlelong\t\t>0\t\tnot stripped\n\n0\tleshort\t\t0x140\t\told Microsoft 8086 x.out\n>0x3\tbyte\t\t&0x4\t\tseparate\n>0x3\tbyte\t\t&0x2\t\tpure\n>0\tbyte\t\t&0x1\t\texecutable\n>0\tbyte\t\t^0x1\t\trelocatable\n>0x14\tlelong\t\t>0\t\tnot stripped\n\n0\tlelong\t\t0x206\t\tb.out\n>0x1e\tleshort\t\t&0x10\t\toverlay\n>0x1e\tleshort\t\t&0x2\t\tseparate\n>0x1e\tleshort\t\t&0x4\t\tpure\n>0x1e\tleshort\t\t&0x800\t\tsegmented\n>0x1e\tleshort\t\t&0x400\t\tstandalone\n>0x1e\tleshort\t\t&0x1\t\texecutable\n>0x1e\tleshort\t\t^0x1\t\tobject file\n>0x1e\tleshort\t\t&0x4000\t\tV2.3\n>0x1e\tleshort\t\t&0x8000\t\tV3.0\n>0x1c\tbyte\t\t&0x4\t\t86\n>0x1c\tbyte\t\t&0xb\t\t186\n>0x1c\tbyte\t\t&0x9\t\t286\n>0x1c\tbyte\t\t&0x29\t\t286\n>0x1c\tbyte\t\t&0xa\t\t386\n>0x1e\tleshort\t\t&0x4\t\tLarge Text\n>0x1e\tleshort\t\t&0x2\t\tLarge Data\n>0x1e\tleshort\t\t&0x102\t\tHuge Objects Enabled\n\n0\tleshort\t\t0x580\t\tXENIX 8086 relocatable or 80286 small model\n\n#------------------------------------------------------------------------------\n# This is Aaron's attempt at a MAGIC file for Xilinx .bit files.\n# Xilinx-Magic@RevRagnarok.com\n# Got the info from FPGA-FAQ 0026\n#\n# First there is the sync header and its length\n0\tbeshort 0x0009\n>2 \tbelong\t=0x0ff00ff0\n>>&0\tbelong  =0x0ff00ff0\n>>>&0\tbeshort =0x0000\t\n>>>>&0\tpstring\ta\tXilinx BIT data\n# Next is a Pascal-style string with the NCD name. We want to capture that.\n>>>>0x0F\tpstring\tx\t- from %s\n# It is followed by a NUL\n>>>>>&1\tbyte\t0x00\n# And then 'b'\n>>>>>&2\tstring b\n# With the part number:\n#>>>>>&5 string\t4v\t(Virtex4)\n#>>>>>&5 string  2v\t(Virtex II\n#>>>>>>&0\tstring\t!p\t\\b)\n#>>>>>>&0\tstring\tp\tPro)\n>>>>>&4\tpstring x\t- for %s\n# And then NUL / 'c' / Build Data / NUL / 'd' / Date / NUL / 'e' / Data Length\n>>>>>>&1\tbyte\t0x00\n>>>>>>&2\tstring\tc\n>>>>>>&4\tpstring\tx\t- built %s\n>>>>>>>&1\tbyte\t0x00\n>>>>>>>&2\tstring\td\n>>>>>>>&4\tpstring\tx\t\\b(%s)\n>>>>>>>>&1\tbyte\t0x00\n>>>>>>>>&2\tstring\te\n>>>>>>>>&4\tbelong\tx\t- data length 0x%lx\n\n#------------------------------------------------------------------------------\n# xo65 object files\n# From: \"Ullrich von Bassewitz\" <uz@cc65.org>\n#\n0\tstring\t\t\\x55\\x7A\\x6E\\x61\txo65 object,\n>4\tleshort\t\tx\t\t\tversion %d,\n>6\tleshort&0x0001 =0x0001\t\t\twith debug info\n>6\tleshort&0x0001 =0x0000\t\t\tno debug info\n\n# xo65 library files\n0\tstring\t\t\\x6E\\x61\\x55\\x7A\txo65 library,\n>4\tleshort\t\tx\t\t\tversion %d\n\n# o65 object files\n0\tstring\t\t\\x01\\x00\\x6F\\x36\\x35\to65\n>6\tleshort&0x1000\t=0x0000\t\t\texecutable,\n>6\tleshort&0x1000\t=0x1000\t\t\tobject,\n>5\tbyte\t\tx\t\t\tversion %d,\n>6\tleshort&0x8000\t=0x8000\t\t\t65816,\n>6\tleshort&0x8000\t=0x0000\t\t\t6502,\n>6\tleshort&0x2000\t=0x2000\t\t\t32 bit,\n>6\tleshort&0x2000\t=0x0000\t\t\t16 bit,\n>6\tleshort&0x4000\t=0x4000\t\t\tpage reloc,\n>6\tleshort&0x4000\t=0x0000\t\t\tbyte reloc,\n>6\tleshort&0x0003\t=0x0000\t\t\talignment 1\n>6\tleshort&0x0003\t=0x0001\t\t\talignment 2\n>6\tleshort&0x0003\t=0x0002\t\t\talignment 4\n>6\tleshort&0x0003\t=0x0003\t\t\talignment 256\n\n#------------------------------------------------------------------------------\n# xwindows:  file(1) magic for various X/Window system file formats.\n\n# Compiled X Keymap \n# XKM (compiled X keymap) files (including version and byte ordering)\n1\tstring\tmkx\t\t\t\tCompiled XKB Keymap: lsb,\n>0\tbyte\t>0\t\t\t\tversion %d\n>0\tbyte\t=0\t\t\t\tobsolete\n0\tstring\txkm\t\t\t\tCompiled XKB Keymap: msb,\n>3\tbyte\t>0\t\t\t\tversion %d\n>0\tbyte\t=0\t\t\t\tobsolete\n\n# xfsdump archive\n0\tstring\txFSdump0\t\t\txfsdump archive\n>8\tbelong\tx\t(version %d)\n\n# Jaleo XFS files\n0\tlong\t395726\t\t\t\tJaleo XFS file\n>4\tlong\tx\t\t\t\t- version %ld\n>8\tlong\tx\t\t\t\t- [%ld -\n>20\tlong\tx\t\t\t\t\b%ldx\n>24\tlong\tx\t\t\t\t\b%ldx\n>28\tlong\t1008\t\t\t\t\bYUV422]\n>28\tlong\t1000\t\t\t\t\bRGB24]\n\n# Xcursor data\n# X11 mouse cursor format defined in libXcursor, see\n# http://www.x.org/archive/X11R6.8.1/doc/Xcursor.3.html\n# http://cgit.freedesktop.org/xorg/lib/libXcursor/tree/include/X11/Xcursor/Xcursor.h\n0\tstring\t\tXcur\t\tXcursor data\n!:mime\timage/x-xcursor\n>10\tleshort\t\tx\t\tversion %hd\n>>8\tleshort\t\tx\t\t\\b.%hd\n\n#------------------------------------------------------------------------------\n# zilog:  file(1) magic for Zilog Z8000.\n#\n# Was it big-endian or little-endian?  My Product Specification doesn't\n# say.\n#\n0\tlong\t\t0xe807\t\tobject file (z8000 a.out)\n0\tlong\t\t0xe808\t\tpure object file (z8000 a.out)\n0\tlong\t\t0xe809\t\tseparate object file (z8000 a.out)\n0\tlong\t\t0xe805\t\toverlay object file (z8000 a.out)\n\n#------------------------------------------------------------------------------\n# zyxel:  file(1) magic for ZyXEL modems\n#\n# From <rob@pe1chl.ampr.org>\n# These are the /etc/magic entries to decode datafiles as used for the\n# ZyXEL U-1496E DATA/FAX/VOICE modems.  (This header conforms to a\n# ZyXEL-defined standard)\n\n0\tstring\t\tZyXEL\\002\tZyXEL voice data\n>10\tbyte\t\t0\t\t- CELP encoding\n>10\tbyte&0x0B\t1\t\t- ADPCM2 encoding\n>10\tbyte&0x0B\t2\t\t- ADPCM3 encoding\n>10\tbyte&0x0B\t3\t\t- ADPCM4 encoding\n>10\tbyte&0x0B\t8\t\t- New ADPCM3 encoding\n>10\tbyte&0x04\t4\t\twith resync\n"
  },
  {
    "path": "OptolithiumGui/views/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\n__author__ = 'Alexei Gladkikh'\n"
  },
  {
    "path": "OptolithiumGui/views/appconfig.py",
    "content": "# This file is part of Optolithium lithography modelling software.\r\n#\r\n# Copyright (C) 2015 Alexei Gladkikh\r\n#\r\n# This software is dual-licensed: you can redistribute it and/or modify\r\n# it under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version only for NON-COMMERCIAL usage.\r\n#\r\n# This program is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n#\r\n# If you are interested in other licensing models, including a commercial-\r\n# license, please contact the author at gladkikhalexei@gmail.com\r\n\r\n\r\nimport os\r\nimport subprocess\r\nimport sys\r\nimport helpers\r\nimport config\r\nimport logging as module_logging\r\nfrom qt import QtGui, QtCore, connect, Slot\r\nfrom views.common import WarningBox\r\nfrom config import Configuration, MEGABYTE, MAXIMUM_DIALOG_BUTTON_WIDTH\r\n\r\n\r\n__author__ = 'Alexei Gladkikh'\r\n\r\n\r\nlogging = module_logging.getLogger(__name__)\r\nlogging.setLevel(module_logging.DEBUG)\r\nhelpers.logStreamEnable(logging)\r\n\r\n\r\nclass AppConfigurationView(QtGui.QDialog):\r\n\r\n    def int_edit(self):\r\n        edit = QtGui.QLineEdit(self)\r\n        edit.setMaximumWidth(50)\r\n        edit.setValidator(QtGui.QIntValidator(self))\r\n        return edit\r\n\r\n    def button(self, name, callback):\r\n        btn = QtGui.QPushButton(name, self)\r\n        btn.setFixedWidth(60)\r\n        connect(btn.clicked, callback)\r\n        return btn\r\n\r\n    def __init__(self, parent):\r\n        \"\"\"\r\n        :param QtGui.QWidget parent: Exposure and focus view widget parent\r\n        \"\"\"\r\n        super(AppConfigurationView, self).__init__(parent)\r\n\r\n        self.setWindowTitle(config.APPLICATION_NAME + \" Application Configuration Data\")\r\n\r\n        self.grid_lay = QtGui.QGridLayout()\r\n\r\n        cell_size = 75\r\n\r\n        self.grid_lay.setColumnMinimumWidth(1, cell_size)\r\n        self.grid_lay.setColumnMinimumWidth(2, cell_size)\r\n        self.grid_lay.setColumnMinimumWidth(3, cell_size)\r\n        self.grid_lay.setColumnMinimumWidth(4, cell_size)\r\n\r\n        self.map_path_label = QtGui.QLabel(\"GDSII layer map path:\", self)\r\n        self.map_path_edit = QtGui.QLineEdit(self)\r\n        self.map_path_edit.setMinimumWidth(4*cell_size)\r\n        self.map_path_btn_browse = self.button(\"Browse\", self.onBrowseLayerMapPath)\r\n        self.map_path_btn_edit = self.button(\"Edit\", self.onLayerMapEdit)\r\n\r\n        self.grid_lay.addWidget(self.map_path_label, 0, 0)\r\n        self.grid_lay.addWidget(self.map_path_edit, 0, 1, 1, 4)\r\n        self.grid_lay.addWidget(self.map_path_btn_browse, 0, 5)\r\n        self.grid_lay.addWidget(self.map_path_btn_edit, 0, 6)\r\n\r\n        self.db_path_label = QtGui.QLabel(\"Application database path:\", self)\r\n        self.db_path_edit = QtGui.QLineEdit(self)\r\n        self.db_path_edit.setMinimumWidth(4*cell_size)\r\n        self.db_path_btn_browse = self.button(\"Browse\", self.onBrowseApplicationDatabase)\r\n\r\n        self.grid_lay.addWidget(self.db_path_label, 1, 0)\r\n        self.grid_lay.addWidget(self.db_path_edit, 1, 1, 1, 4)\r\n        self.grid_lay.addWidget(self.db_path_btn_browse, 1, 5)\r\n\r\n        self.plugin_paths_label = QtGui.QLabel(\"Plugins paths:\", self)\r\n        self.plugin_paths_edit = QtGui.QLineEdit(self)\r\n        self.plugin_paths_edit.setMinimumWidth(4*cell_size)\r\n        self.plugin_paths_btn_add = self.button(\"Add\", self.onPluginPathAdd)\r\n\r\n        self.grid_lay.addWidget(self.plugin_paths_label, 2, 0)\r\n        self.grid_lay.addWidget(self.plugin_paths_edit, 2, 1, 1, 4)\r\n        self.grid_lay.addWidget(self.plugin_paths_btn_add, 2, 5)\r\n\r\n        self.memory_update_label = QtGui.QLabel(\"Memory update interval (ms):\", self)\r\n        self.memory_update_edit = self.int_edit()\r\n\r\n        self.grid_lay.addWidget(self.memory_update_label, 3, 0)\r\n        self.grid_lay.addWidget(self.memory_update_edit, 3, 1)\r\n\r\n        self.dpi_label = QtGui.QLabel(\"Graphics DPI:\", self)\r\n        self.dpi_edit = self.int_edit()\r\n\r\n        self.grid_lay.addWidget(self.dpi_label, 4, 0)\r\n        self.grid_lay.addWidget(self.dpi_edit, 4, 1)\r\n\r\n        self.gds_size_label = QtGui.QLabel(\"Maximum size of GDSII file (MiB):\", self)\r\n        self.gds_size_edit = self.int_edit()\r\n\r\n        self.grid_lay.addWidget(self.gds_size_label, 3, 2)\r\n        self.grid_lay.addWidget(self.gds_size_edit, 3, 3)\r\n\r\n        self.thread_count_label = QtGui.QLabel(\"Maximum thread count:\", self)\r\n        self.thread_count_edit = self.int_edit()\r\n\r\n        self.grid_lay.addWidget(self.thread_count_label, 4, 2)\r\n        self.grid_lay.addWidget(self.thread_count_edit, 4, 3)\r\n\r\n        self.buttons_hlay = QtGui.QHBoxLayout()\r\n\r\n        self.button_ok = self.button(\"Ok\", self.accept)\r\n        self.button_ok.setFixedWidth(MAXIMUM_DIALOG_BUTTON_WIDTH)\r\n        self.button_cancel = self.button(\"Cancel\", self.reject)\r\n        self.button_cancel.setFixedWidth(MAXIMUM_DIALOG_BUTTON_WIDTH)\r\n        self.button_ok.setDefault(True)\r\n\r\n        self.buttons_hlay.addWidget(self.button_cancel)\r\n        self.buttons_hlay.addWidget(self.button_ok)\r\n        self.buttons_hlay.setAlignment(QtCore.Qt.AlignRight)\r\n\r\n        self.vlay = QtGui.QVBoxLayout(self)\r\n        self.vlay.addLayout(self.grid_lay)\r\n        self.vlay.addLayout(self.buttons_hlay)\r\n\r\n    def _set_config_values(self):\r\n        self.map_path_edit.setText(Configuration.layer_map_path)\r\n        self.db_path_edit.setText(Configuration.db_path)\r\n        self.plugin_paths_edit.setText(Configuration.PLUGIN_PATHS_SEPARATOR.join(Configuration.plugin_paths))\r\n        self.memory_update_edit.setText(str(Configuration.memory_update_interval))\r\n        self.dpi_edit.setText(str(Configuration.dpi))\r\n        self.gds_size_edit.setText(str(Configuration.maximum_gds_size/MEGABYTE))\r\n        self.thread_count_edit.setText(str(Configuration.thread_count))\r\n\r\n    def showEvent(self, *args, **kwargs):\r\n        self._set_config_values()\r\n        super(AppConfigurationView, self).showEvent(*args, **kwargs)\r\n\r\n    # noinspection PyPep8Naming\r\n    @Slot()\r\n    def onLayerMapEdit(self):\r\n        filepath = self.map_path_edit.text()\r\n        if os.path.isfile(filepath) and os.access(filepath, os.W_OK) or \\\r\n           os.access(os.path.dirname(filepath), os.W_OK):\r\n            if sys.platform.startswith(config.darwin):\r\n                subprocess.call((\"open\", filepath))\r\n            elif os.name == config.nt:\r\n                subprocess.call((\"notepad\", filepath))\r\n            elif os.name == config.posix:\r\n                subprocess.call((\"xdg-open\", filepath))\r\n        else:\r\n            WarningBox(self, \"Selected file %s can't be written\" % filepath)\r\n\r\n    # noinspection PyPep8Naming\r\n    @Slot()\r\n    def onBrowseLayerMapPath(self):\r\n        file_path, _ = QtGui.QFileDialog.getOpenFileName(\r\n            self, \"Choose GDSII Layer Map File\",\r\n            self.map_path_edit.text(), \"JavaScript Object Notation files (*.json)\")\r\n\r\n        if file_path:\r\n            self.map_path_edit.setText(file_path)\r\n\r\n    # noinspection PyPep8Naming\r\n    @Slot()\r\n    def onBrowseApplicationDatabase(self):\r\n        file_path, _ = QtGui.QFileDialog.getOpenFileName(\r\n            self, \"Choose Application Database File\",\r\n            self.db_path_edit.text(), \"SQLite Database (*.db)\")\r\n\r\n        if file_path:\r\n            self.db_path_edit.setText(file_path)\r\n\r\n    # noinspection PyPep8Naming\r\n    @Slot()\r\n    def onPluginPathAdd(self):\r\n        plugin_path = QtGui.QFileDialog.getExistingDirectory(\r\n            self, \"Choose Additional Plugins Directory\",\r\n            Configuration.SYSTEM_PLUGINS_PATH,\r\n            QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontResolveSymlinks)\r\n\r\n        if plugin_path and os.access(plugin_path, os.R_OK) and \\\r\n           plugin_path not in self.plugin_paths_edit.text().split(Configuration.PLUGIN_PATHS_SEPARATOR):\r\n            path = self.plugin_paths_edit.text() + Configuration.PLUGIN_PATHS_SEPARATOR + os.path.abspath(plugin_path)\r\n            self.plugin_paths_edit.setText(path)\r\n\r\n    def accept(self, *args, **kwargs):\r\n        Configuration.layer_map_path = self.map_path_edit.text()\r\n        Configuration.db_path = self.db_path_edit.text()\r\n        Configuration.plugin_paths = self.plugin_paths_edit.text()\r\n        logging.info(\"%s\" % Configuration.plugin_paths)\r\n\r\n        Configuration.dpi = self.dpi_edit.text()\r\n        Configuration.thread_count = self.thread_count_edit.text()\r\n        Configuration.maximum_gds_size = int(self.gds_size_edit.text()) * MEGABYTE\r\n        Configuration.memory_update_interval = self.memory_update_edit.text()\r\n        Configuration.save()\r\n        return super(AppConfigurationView, self).accept(*args, **kwargs)"
  },
  {
    "path": "OptolithiumGui/views/common.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport sys\nimport math\nimport traceback\nimport logging as module_logging\n\nfrom qt import QtGui, QtCore, connect, disconnect, Slot, GlobalSignals, backend_name\n\nfrom metrics import MetricNotImplementedError\n\nfrom resources import Resources\n# from database.base import Float, Integer\n\nfrom config import APPLICATION_NAME, KILOBYTE, MEGABYTE, GIGABYTE\n\nfrom numpy import isnan\nfrom matplotlib import rcParams\nfrom matplotlib.colors import LinearSegmentedColormap\nfrom matplotlib.cm import register_cmap\n\nrcParams[\"backend.qt4\"] = backend_name\n\n# CAUTION: That's important not to import matplotlib because it sets up its own gui, mainloop and canvas.\n# Backend name PySide or PyQt4 is setup in matplotrc file\nfrom matplotlib.figure import Figure\nfrom matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas\nfrom matplotlib.backends.backend_qt4agg import NavigationToolbar2QT\n\nimport config\nimport helpers\nimport options\n\nfrom options.structures import get_field\n\n\n__author__ = 'Alexei Gladkikh'\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.INFO)\nhelpers.logStreamEnable(logging)\n\n\nNavigationToolbar = NavigationToolbar2QT\nmsgBox = QtGui.QMessageBox\n\n\nProlithColormap = LinearSegmentedColormap.from_list(\"prolith\", [\"#0000FF\", \"#00FFFF\", \"#00FF00\", \"#FFFF00\", \"#FF6209\"])\nregister_cmap(cmap=ProlithColormap)\n\n\n# noinspection PyPep8Naming\ndef QuestionBox(parent, message, buttons=msgBox.Yes | msgBox.No, default=msgBox.Yes):\n    \"\"\"\n    :type parent: QtGui.QWidget\n    :type message: str\n    :type buttons: int\n    :type default: int\n    :rtype: int\n    \"\"\"\n    # noinspection PyCallByClass,PyTypeChecker\n    return msgBox.question(parent, APPLICATION_NAME, message, buttons, default)\n\n\n# noinspection PyPep8Naming\ndef WarningBox(parent, message):\n    \"\"\"\n    :type parent: QtGui.QWidget\n    :type message: str\n    :rtype: int\n    \"\"\"\n    # noinspection PyCallByClass,PyTypeChecker\n    return msgBox.warning(parent, APPLICATION_NAME, message, msgBox.Ok)\n\n\n# noinspection PyPep8Naming\ndef ErrorBox(parent, message):\n    \"\"\"\n    :type parent: QtGui.QWidget\n    :type message: str\n    :rtype: int\n    \"\"\"\n    # noinspection PyCallByClass,PyTypeChecker\n    return msgBox.critical(parent, APPLICATION_NAME, message, msgBox.Ok)\n\n\n# noinspection PyPep8Naming\ndef InformationBox(parent, message, buttons=msgBox.Abort, default=msgBox.Abort):\n    \"\"\"\n    :type parent: QtGui.QWidget\n    :type message: str\n    :type buttons: int\n    :type default: int\n    :rtype: int\n    \"\"\"\n    # noinspection PyCallByClass,PyTypeChecker\n    return msgBox.information(parent, APPLICATION_NAME, message, buttons, default)\n\n\nclass ExtendedErrorBox(msgBox):\n    def __init__(self, title, message, info):\n        # noinspection PyCallByClass\n        msgBox.__init__(self)\n        self.setWindowTitle(\"%s error\" % APPLICATION_NAME)\n        self.setText(title)\n        self.setInformativeText(message)\n        self.setStandardButtons(msgBox.Close | msgBox.Ok)\n        self.setDefaultButton(msgBox.Ok)\n        self.setIcon(msgBox.Warning)\n        self.setWindowIcon(Resources(\"icons/Logo\"))\n        # exc_type, exc_value, exc_traceback = sys.exc_info()\n        # exc_string = traceback.format_tb(exc_traceback)\n        self.setDetailedText(info)\n\n\nclass QTracebackMessageBox(msgBox):\n    def __init__(self):\n        # noinspection PyCallByClass\n        msgBox.__init__(self)\n        self.setWindowTitle(\"%s runtime error\" % APPLICATION_NAME)\n        self.setText(\"An error has occurred during perform action!\")\n        self.setInformativeText(traceback.format_exc(limit=1))\n        self.setStandardButtons(msgBox.Close | msgBox.Ok)\n        self.setDefaultButton(msgBox.Ok)\n        self.setIcon(msgBox.Warning)\n        self.setWindowIcon(Resources(\"icons/Logo\"))\n        exc_type, exc_value, exc_traceback = sys.exc_info()\n        exc_string = traceback.format_tb(exc_traceback)\n        self.setDetailedText(\"\\n\".join(exc_string))\n\n\ndef show_traceback(function):\n\n    def wrapped(*args, **kwargs):\n        try:\n            return function(*args, **kwargs)\n        except:\n            msg_box = QTracebackMessageBox()\n            reply = msg_box.exec_()\n            if reply == msgBox.Close:\n                sys.exit(1)\n            raise\n\n    return wrapped\n\n\ndef rgbf(color):\n    \"\"\"\n    Converts QColor to RGB float.\n\n    :rtype: float, float, float\n    \"\"\"\n    return color.red()/255.0, color.green()/255.0, color.blue()/255.0\n\n\nclass QSliderNumeric(QtGui.QSlider):\n\n    def __init__(self, parent, p_object=None, abstract_field=options.Numeric, orientation=QtCore.Qt.Vertical):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type p_object: options.Variable or None\n        :type abstract_field: options.Numeric\n        \"\"\"\n        QtGui.QSlider.__init__(self, orientation, parent)\n\n        self.__p_object = None\n        self.__field = None\n\n        if p_object is not None:\n            self.setObject(p_object, abstract_field)\n\n        connect(self.valueChanged, self.__onValueChanged)\n\n    # noinspection PyPep8Naming\n    def setObject(self, p_object, abstract_field=options.Numeric):\n        self.__p_object = p_object\n        self.__field = get_field(p_object, abstract_field)\n        \"\"\":type: options.Numeric\"\"\"\n\n        connect(self.__p_object.signals[self.__field], GlobalSignals.onChanged)\n\n        self.setValue(getattr(p_object, self.__field.key))\n        self.setRange(self.__field.min, self.__field.max)\n\n        connect(self.__p_object.signals[self.__field], self.__onValueChanged)\n\n    # noinspection PyPep8Naming\n    @Slot()\n    @Slot(int)\n    def __onValueChanged(self, *args):\n        # args is not empty only when event come from Gui\n        # if event come from p_object then args is empty and it's only flag\n        if self.__p_object is not None:\n            if args:\n                setattr(self.__p_object, self.__field.key, args[0])\n            else:\n                self.setValue(getattr(self.__p_object, self.__field.key))\n\n\nclass QLineEditNumeric(QtGui.QLineEdit):\n\n    def __init__(self, parent, p_object=None, abstract_field=options.Numeric):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type p_object: options.Variable or None\n        :type abstract_field: options.Numeric or options.AttributedProperty or database.orm.Column\n        \"\"\"\n        super(QLineEditNumeric, self).__init__(parent)\n\n        self.__p_object = None\n        self.__field = None\n        self.__validator = None\n\n        if p_object is not None:\n            self.setObject(p_object, abstract_field)\n\n        self.setFixedWidth(config.DEFAULT_EDIT_WIDTH)\n\n        connect(self.editingFinished, self.__onEditingFinished)\n\n    # noinspection PyPep8Naming\n    def setObject(self, p_object, abstract_field=options.Numeric):\n        \"\"\"\n        :type p_object: options.Variable or options.MaterialLayer\n        :type abstract_field: options.Numeric or options.AttributedProperty or database.orm.Column\n        \"\"\"\n        if self.__p_object is not None:\n            disconnect(self.__p_object.signals[self.__field], self.__changeText)\n\n        self.__p_object = p_object\n        self.__field = get_field(p_object, abstract_field)\n        \"\"\":type: options.Numeric\"\"\"\n\n        connect(self.__p_object.signals[self.__field], GlobalSignals.onChanged)\n\n        value = getattr(self.__p_object, self.__field.key)\n\n        if isinstance(value, float):\n            self.__validator = QtGui.QDoubleValidator(self)\n            self.__validator.setNotation(QtGui.QDoubleValidator.StandardNotation)\n            precision = (self.__field.precision\n                         if self.__field.precision is not None\n                         else config.DEFAULT_DECIMAL_COUNT)\n            self.__validator.setDecimals(precision)\n        elif isinstance(value, int):\n            self.__validator = QtGui.QIntValidator(self)\n\n        self.setText(str(value))\n\n        self.setValidator(self.__validator)\n\n        connect(self.__p_object.signals[self.__field], self.__changeText)\n\n    # noinspection PyPep8Naming\n    def unsetObject(self):\n        if self.__p_object is not None:\n            disconnect(self.__p_object.signals[self.__field], self.__changeText)\n            disconnect(self.__p_object.signals[self.__field], GlobalSignals.onChanged)\n            self.__p_object = None\n            self.__field = None\n            self.setText(str())\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def __changeText(self):\n        value = getattr(self.__p_object, self.__field.key)\n        self.setText(str(value))\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def __onEditingFinished(self):\n        # logging.info(\"Value after edit finished: %s\" % self.text())\n        if self.__p_object is not None:\n            try:\n                cast_result = self.__field.type.python_type(self.text())\n            except ValueError:\n                logging.warning(\"Can't convert value %s to %s\" %\n                                (self.text(), self.__field.type.python_type.__name__))\n            else:\n                setattr(self.__p_object, self.__field.key, cast_result)\n\n\nclass QObjectNumeric(QtCore.QObject):\n\n    def __init__(self, parent, p_object=None, abstract_field=options.Numeric, global_signals=False):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type p_object: options.Variable or None\n        :type abstract_field: options.Numeric or options.AttributedProperty or database.orm.Column\n        :type global_signals: bool\n        \"\"\"\n        super(QObjectNumeric, self).__init__(parent)\n\n        self.__global_signals = global_signals\n\n        self.__p_object = None\n        self.__field = None\n        self.__value = None\n\n        if p_object is not None:\n            self.setObject(p_object, abstract_field)\n\n    @property\n    def object(self):\n        return self.__p_object\n\n    @property\n    def field(self):\n        return self.__field\n\n    @property\n    def value(self):\n        return self.__value\n\n    @value.setter\n    def value(self, data):\n        if self.__p_object is not None:\n            try:\n                cast_result = self.__field.type.python_type(data) if data is not None else None\n            except ValueError:\n                logging.warning(\"Can't convert value %s to %s\" %\n                                (self.text(), self.__field.type.python_type.__name__))\n            else:\n                # v = getattr(self.__p_object, self.__field.key)\n                # logging.info(\n                #     \"Object: %s Field: %s Value: %s -> %s\" %\n                #     (self.__p_object, self.__field.key, v, cast_result))\n                setattr(self.__p_object, self.__field.key, cast_result)\n                self.__value = data\n\n    # noinspection PyPep8Naming\n    def setObject(self, p_object, abstract_field=options.Numeric):\n        \"\"\"\n        :type p_object: options.structures.Variable or options.structures.MaterialLayer\n        :type abstract_field: options.Numeric or options.AttributedProperty or database.orm.Column\n        \"\"\"\n        if self.__p_object is not None:\n            disconnect(self.__p_object.signals[self.__field], self.__field_changed)\n\n        self.__p_object = p_object\n        self.__field = get_field(p_object, abstract_field)\n        \"\"\":type: options.structures.Numeric\"\"\"\n\n        if self.__global_signals:\n            connect(self.__p_object.signals[self.__field], GlobalSignals.onChanged)\n\n        self.value = getattr(self.__p_object, self.__field.key)\n\n        connect(self.__p_object.signals[self.__field], self.__field_changed)\n\n    # noinspection PyPep8Naming\n    def unsetObject(self):\n        if self.__p_object is not None:\n            disconnect(self.__p_object.signals[self.__field], self.__field_changed)\n            if self.__global_signals:\n                disconnect(self.__p_object.signals[self.__field], GlobalSignals.onChanged)\n            self.__p_object = None\n            self.__field = None\n            self.__value = None\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def __field_changed(self):\n        self.__value = getattr(self.__p_object, self.__field.key)\n\n\nclass QComboBoxEnum(QtGui.QComboBox):\n\n    def __init__(self, parent, p_object=None, abstract_field=options.Enum):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type p_object: options.Variable or None\n        :type abstract_field: options.Enum\n        \"\"\"\n        QtGui.QComboBox.__init__(self, parent)\n\n        self.__p_object = None\n        self.__field = None\n\n        if p_object is not None:\n            self.setObject(p_object, abstract_field)\n\n        connect(self.currentIndexChanged, self.__onIndexChanged)\n\n    # noinspection PyPep8Naming\n    def setObject(self, p_object, abstract_field=options.Enum):\n        \"\"\"\n        :type p_object: options.Variable or None\n        :type abstract_field: options.Enum\n        \"\"\"\n        self.__p_object = p_object\n        self.__field = get_field(p_object, abstract_field)\n        \"\"\":type: options.Enum\"\"\"\n\n        connect(self.__p_object.signals[self.__field], GlobalSignals.onChanged)\n\n        self.clear()\n        self.addItems(self.__field.variants)\n        self.setCurrentIndex(self.findText(getattr(self.__p_object, self.__field.key)))\n\n    # noinspection PyPep8Naming\n    @Slot(int)\n    def __onIndexChanged(self, index):\n        if self.__p_object is not None:\n            value = str(self.itemText(index))\n            setattr(self.__p_object, self.__field.key, value)\n\n\nclass QLabelMulti(QtGui.QLabel):\n\n    class _MemoryFormat(object):\n        pass\n\n    memory_format = _MemoryFormat()\n\n    def _enum_items(self):\n        for item in self._items:\n            obj, abstract_field = item\n            field = get_field(obj, abstract_field)\n            yield obj, field\n\n    def __init__(self, parent, items=None, frmt=None):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type items: list of (options.Variable,\n                              options.Abstract or options.AttributedProperty or database.orm.Column) or None\n        :type frmt: str or None\n        \"\"\"\n        QtGui.QLabel.__init__(self, parent)\n\n        self._items = None\n        self._format = frmt\n\n        if items is not None:\n            self.setObject(items)\n\n        self.setAlignment(QtCore.Qt.AlignCenter)\n\n    # noinspection PyPep8Naming\n    def setObject(self, items, frmt=None):\n        \"\"\":type items: list of (options.Variable,\n                                 options.Abstract or options.AttributedProperty or database.orm.Column)\"\"\"\n\n        if self._items is not None:\n            if len(items) != len(self._items) and self._format is not None and frmt is None:\n                raise ValueError(\"Number of objects not equal previous object number but format is not changed!\")\n\n            for obj, field in self._enum_items():\n                disconnect(obj.signals[field], self.__onTextChanged)\n\n        self._items = items\n        for obj, field in self._enum_items():\n            connect(obj.signals[field], self.__onTextChanged)\n\n        if frmt is not None:\n            self._format = frmt\n        elif self._format is None:\n            self._format = \"%s \"*len(self._items)\n\n        self.__onTextChanged()\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def __onTextChanged(self):\n        values = [getattr(obj, field.key) if getattr(obj, field.key) is not None else \"- Undefined -\"\n                  for obj, field in self._enum_items()]\n\n        if self._format is QLabelMulti.memory_format:\n            if len(values) != 1:\n                raise ValueError(\"Can't use memory format to more than one item\")\n            value = float(values[0])\n            if value > 10.0*GIGABYTE:\n                self.setText(\"%d GiB\" % int(math.ceil(value/10.0/GIGABYTE)))\n            elif value > MEGABYTE:\n                self.setText(\"%d MiB\" % int(math.ceil(value/MEGABYTE)))\n            elif value > KILOBYTE:\n                self.setText(\"%d KiB\" % int(math.ceil(value/KILOBYTE)))\n            else:\n                self.setText(\"%d Bytes\" % int(math.ceil(value)))\n        else:\n            self.setText(self._format % tuple(values))\n\n\nclass QLabel(QLabelMulti):\n\n    def __init__(self, parent, p_object=None, abstract_field=options.Abstract, frmt=None):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type p_object: options.Variable or None\n        :type abstract_field: options.Abstract or options.AttributedProperty or database.orm.Column\n        :type frmt: str or None\n        \"\"\"\n        # QLabelMulti constructor can't be called because that result in incontinence.\n        # QLabelMulti.__init__ call setObject thinking that constructor belongs to QLabelMulti\n        # but in really setObject override by QLabel class.\n        QtGui.QLabel.__init__(self, parent)\n\n        self._items = None\n        self._format = frmt\n\n        if p_object is not None:\n            self.setObject(p_object, abstract_field)\n\n        self.setAlignment(QtCore.Qt.AlignRight)\n\n    def setObject(self, p_object, abstract_field=options.Abstract):\n        \"\"\"\n        :type p_object: options.Variable or None\n        :type abstract_field: options.Abstract or options.AttributedProperty or database.orm.Column\n        \"\"\"\n        QLabelMulti.setObject(self, [(p_object, abstract_field)])\n\n\nclass QFramedLabel(QLabel):\n\n    def __init__(self, parent, p_object=None, abstract_field=options.Abstract, frmt=None):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type p_object: options.Variable or None\n        :type abstract_field: options.Abstract or options.AttributedProperty or database.orm.Column\n        :type frmt: str or None\n        \"\"\"\n        QLabel.__init__(self, parent, p_object, abstract_field, frmt)\n        self.setAlignment(QtCore.Qt.AlignRight)\n        self.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Sunken)\n        self.setStyleSheet(\"QLabel{padding: 3px 3px 3px 3px;}\")\n\n\nclass QStackWidgetTab(QtGui.QWidget):\n\n    def __init__(self, parent):\n        super(QStackWidgetTab, self).__init__(parent)\n        self.__vlayout = None\n        self.__hlayout = None\n\n    # noinspection PyPep8Naming\n    def onSetActive(self):\n        pass\n\n    def reset(self):\n        pass\n\n    # noinspection PyPep8Naming\n    def setUnstretchable(self, layout):\n\n        self.__vlayout = QtGui.QVBoxLayout()\n        self.__vlayout.addLayout(layout)\n        self.__vlayout.addStretch(1)\n\n        self.__hlayout = QtGui.QHBoxLayout(self)\n        self.__hlayout.addLayout(self.__vlayout)\n        self.__hlayout.addStretch(1)\n\n\nclass QStackedWidget(QtGui.QStackedWidget):\n\n    def setCurrentWidget(self, widget):\n        if isinstance(widget, QStackWidgetTab):\n            widget.onSetActive()\n        QtGui.QStackedWidget.setCurrentWidget(self, widget)\n\n\nclass QGraphPlot(FigureCanvas):\n\n    def __init__(self, parent, width=None, height=None, figsize=None):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type width: int\n        :type height: int\n        \"\"\"\n        self._figure = Figure(dpi=config.Configuration.dpi, figsize=figsize)\n        \"\"\":type: matplotlib.figure.Figure\"\"\"\n\n        super(QGraphPlot, self).__init__(self._figure)\n        self.setParent(parent)\n\n        if width is not None and height is not None:\n            self.setFixedSize(width, height)\n\n        color = self.palette().color(QtGui.QPalette.Window)\n        self._figure.patch.set_facecolor(rgbf(color))\n\n    def add_subplot(self, position=111, **kwargs):\n        \"\"\":rtype: matplotlib.axes.Axes\"\"\"\n        return self._figure.add_subplot(position, **kwargs)\n        # if aspect is None:\n        #     return self._figure.add_subplot(position)\n        # else:\n        #     return self._figure.add_subplot(position, aspect=aspect)\n\n    def clear(self):\n        self._figure.clf()\n\n    def redraw(self):\n        if self._figure.get_axes():\n            self._figure.tight_layout(pad=0.1)\n            self.draw()\n\n    def resizeEvent(self, event=None):\n        FigureCanvas.resizeEvent(self, event)\n        self.redraw()\n\n\nclass ParameterGroupBox(QtGui.QGroupBox):\n\n    def edit(self, p_object=None):\n        result = QLineEditNumeric(self, p_object)\n        result.setFixedWidth(config.DEFAULT_EDIT_WIDTH)\n        return result\n\n    def framed_label(self, p_object=None):\n        result = QFramedLabel(self, p_object)\n        result.setAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter)\n        # result.setFixedWidth(config.DEFAULT_EDIT_WIDTH)\n        result.setMinimumWidth(80)\n        result.setFixedHeight(25)\n        return result\n\n    def __init__(self, title, parent):\n        super(ParameterGroupBox, self).__init__(title, parent)\n        self.__prms = dict()\n        self.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Maximum)\n        # self.setMinimumWidth(250)\n        # self.setFixedWidth(390)\n\n    def _add_plugin_parameters(self, p_object, layout):\n        for item in self.__prms.values():\n            item[\"edit\"].unsetObject()\n            container = item[\"layout\"].takeAt(0)\n            while container:\n                del container\n                container = item[\"layout\"].takeAt(0)\n            item[\"edit\"].setParent(None)\n            item[\"label\"].setParent(None)\n            item[\"layout\"].setParent(None)\n\n        self.__prms.clear()\n\n        for variable in p_object.variables:\n            hlayout = QtGui.QHBoxLayout()\n            label = QtGui.QLabel(variable.name, self)\n            edit = self.edit(variable)\n            self.__prms[variable.name] = {\"layout\": hlayout, \"edit\": edit, \"label\": label}\n            hlayout.addWidget(label)\n            hlayout.addStretch()\n            hlayout.addWidget(edit)\n            layout.addLayout(hlayout)\n\n\n# noinspection PyPep8Naming\ndef QLoadDialogFactory(db_type, plugin_type, plot_type):\n\n    class QLoadDialog(QtGui.QDialog):\n\n        def __init__(self, parent, appdb):\n            \"\"\"\n            :type parent: QtGui.QMainWindow\n            :type appdb: ApplicationDatabase\n            \"\"\"\n            QtGui.QDialog.__init__(self, parent)\n\n            name = db_type.title\n\n            self.setWindowTitle(\"Load %s\" % name)\n            self.setWindowIcon(parent.windowIcon())\n\n            self.__appdb = appdb\n\n            self.__db_type = db_type\n            self.__plugin_type = plugin_type\n\n            self.__select_group = QtGui.QGroupBox(\"Select Parametric (Plugin) or Database %s\" % name, self)\n            self.__select_group_layout = QtGui.QHBoxLayout(self.__select_group)\n\n            self.__parametric_label = QtGui.QLabel(\"Parametric:\")\n            self.__parametric_list = QtGui.QListWidget(self.__select_group)\n            self.__parametric_layout = QtGui.QVBoxLayout()\n            self.__parametric_layout.addWidget(self.__parametric_label)\n            self.__parametric_layout.addWidget(self.__parametric_list)\n            self.__select_group_layout.addLayout(self.__parametric_layout)\n\n            self.__database_label = QtGui.QLabel(\"Database:\")\n            self.__database_list = QtGui.QListWidget(self.__select_group)\n            self.__database_layout = QtGui.QVBoxLayout()\n            self.__database_layout.addWidget(self.__database_label)\n            self.__database_layout.addWidget(self.__database_list)\n            self.__select_group_layout.addLayout(self.__database_layout)\n            self.__select_group.setFixedHeight(200)\n\n            self.__plot = plot_type(self)\n            self.__plot.setEnabled(False)\n\n            self.__plot_hlay = QtGui.QHBoxLayout()\n            self.__plot_hlay.addWidget(self.__plot)\n            self.__plot_hlay.setAlignment(QtCore.Qt.AlignCenter)\n\n            self.__buttons_layout = QtGui.QHBoxLayout()\n            self.__load_button = QtGui.QPushButton(\"Load\", self)\n            self.__load_button.setFixedWidth(config.MAXIMUM_DIALOG_BUTTON_WIDTH)\n            self.__cancel_button = QtGui.QPushButton(\"Cancel\", self)\n            self.__cancel_button.setFixedWidth(config.MAXIMUM_DIALOG_BUTTON_WIDTH)\n\n            self.__buttons_layout.addStretch()\n            self.__buttons_layout.addWidget(self.__load_button)\n            self.__buttons_layout.addWidget(self.__cancel_button)\n\n            for plugin in self.__appdb[self.__plugin_type]:\n                self.__parametric_list.addItem(plugin.name)\n\n            connect(self.__load_button.clicked, self.accept)\n            connect(self.__cancel_button.clicked, self.reject)\n\n            connect(self.__parametric_list.itemSelectionChanged, self._accept_state_handler)\n            connect(self.__database_list.itemSelectionChanged, self._accept_state_handler)\n            connect(self.__parametric_list.itemSelectionChanged, self._change_material)\n            connect(self.__database_list.itemSelectionChanged, self._change_material)\n\n            self.__layout = QtGui.QVBoxLayout(self)\n            self.__layout.addWidget(self.__select_group)\n            self.__layout.addLayout(self.__plot_hlay)\n            self.__layout.addLayout(self.__buttons_layout)\n\n            self._accept_state_handler()\n\n        def update_database_list(self):\n            self.__database_list.clear()\n            for p_object in self.__appdb[self.__db_type]:\n                self.__database_list.addItem(p_object.name)\n\n        def showEvent(self, *args, **kwargs):\n            self.update_database_list()\n            super(QLoadDialog, self).showEvent(*args, **kwargs)\n\n        # noinspection PyUnusedLocal\n        def _accept_state_handler(self, *args):\n            self.__plot.setEnabled(self.is_item_selected)\n            self.__load_button.setEnabled(self.is_item_selected)\n\n        def _change_material(self):\n            if self.sender() is self.__parametric_list:\n                self.__database_list.clearSelection()\n            elif self.sender() is self.__database_list:\n                self.__parametric_list.clearSelection()\n\n            if self.object is not None:\n                self.__plot.setObject(self.object)\n\n        @property\n        def object(self):\n            if self.__database_list.selectedItems():\n                item = self.__database_list.currentItem()\n                return self.__appdb[self.__db_type].filter(self.__db_type.name == item.text()).one()\n\n            elif self.__parametric_list.selectedItems():\n                item = self.__parametric_list.currentItem()\n                abstract = self.__appdb[self.__plugin_type].\\\n                    filter(self.__plugin_type.name == item.text()).one()\n                return abstract.produce()\n\n        @property\n        def is_item_selected(self):\n            return bool(self.__parametric_list.selectedItems() or self.__database_list.selectedItems())\n\n    return QLoadDialog\n\n\ndef calculate_table_width(table_widget):\n    \"\"\"\n    :type table_widget: QtGui.QTableView\n    :rtype: int\n    \"\"\"\n    layout = table_widget.layout()\n    if layout is not None:\n        left, top, right, bottom = table_widget.layout().getContentsMargins()\n    else:\n        left, top, right, bottom = 0, 0, 0, 0\n\n    extra_left = left + table_widget.frameWidth()\n    extra_right = right + table_widget.frameWidth()\n\n    min_width = extra_left + extra_right\n\n    if table_widget.verticalHeader().isVisible():\n        min_width += table_widget.verticalHeader().width()\n\n    for k in xrange(table_widget.horizontalHeader().count()):\n        min_width += table_widget.columnWidth(k)\n\n    min_width += table_widget.verticalScrollBar().height()/2 + table_widget.frameWidth()\n\n    return min_width\n\n\nclass QMetrologyTable(QtGui.QTableWidget):\n\n    CAPTION_INDEX = 0\n    VALUE_INDEX = 1\n    HEIGHT = 25\n    OVERSIZE = 5\n\n    @staticmethod\n    def __create_item(text):\n        item = QtGui.QTableWidgetItem(text)\n        item.setFlags(item.flags() & ~QtCore.Qt.ItemIsEditable)\n        return item\n\n    def __init__(self, parent, metrics):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type metrics: list of metrology.MetrologyInterface\n        \"\"\"\n        super(QMetrologyTable, self).__init__(parent)\n        self.setColumnCount(2)\n        self.setHorizontalHeaderLabels([\"Metric name\", \"Metric value\"])\n\n        self.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)\n        self.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)\n        self.horizontalHeader().setClickable(False)\n        self.verticalHeader().setVisible(False)\n        self.verticalHeader().setDefaultSectionSize(self.HEIGHT)\n        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)\n        self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)\n        self.resizeColumnsToContents()\n\n        self.setColumnWidth(self.CAPTION_INDEX, 155)\n        self.setColumnWidth(self.VALUE_INDEX, 75)\n\n        self.setFixedWidth(calculate_table_width(self) + self.OVERSIZE)\n        self.setMinimumHeight(240)\n\n        self.__p_object = None\n        self.__metrics = metrics\n\n    # noinspection PyPep8Naming\n    def setObject(self, p_object, **kwargs):\n        self.clearContents()\n        rows = 0\n        self.setRowCount(len(self.__metrics))\n        for k, metric in enumerate(self.__metrics):\n            try:\n                value = metric(p_object, **kwargs)\n            except MetricNotImplementedError:\n                pass\n            else:\n                string = metric.format % value if not isnan(value) else \"N/A\"\n                self.setItem(rows, self.CAPTION_INDEX, self.__create_item(metric.caption))\n                self.setItem(rows, self.VALUE_INDEX, self.__create_item(string))\n                rows += 1\n\n        self.setRowCount(rows)\n        self.__p_object = p_object"
  },
  {
    "path": "OptolithiumGui/views/controls.py",
    "content": "#!/usr/bin/env python\r\n# -*- coding: utf-8 -*-\r\n\r\n# This file is part of Optolithium lithography modelling software.\r\n#\r\n# Copyright (C) 2015 Alexei Gladkikh\r\n#\r\n# This software is dual-licensed: you can redistribute it and/or modify\r\n# it under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version only for NON-COMMERCIAL usage.\r\n#\r\n# This program is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n#\r\n# If you are interested in other licensing models, including a commercial-\r\n# license, please contact the author at gladkikhalexei@gmail.com\r\n\r\nfrom qt import QtGui, QtCore, connect\r\n\r\nimport helpers\r\nimport logging as module_logging\r\n\r\n\r\n__author__ = 'Alexei Gladkikh'\r\n\r\n\r\nlogging = module_logging.getLogger(__name__)\r\nlogging.setLevel(module_logging.INFO)\r\nhelpers.logStreamEnable(logging)\r\n\r\n\r\nclass ControlBar(QtCore.QObject):\r\n\r\n    class ActionData(object):\r\n        def __init__(self, name, text, icon=None, callback=None, status_tip=None, shortcut=None, enabled=True):\r\n            \"\"\"\r\n            :type name: str\r\n            :type text: str\r\n            :type icon: QtGui.QIcon\r\n            :type status_tip: str or None\r\n            :type shortcut: str or None\r\n            :type enabled: bool\r\n            \"\"\"\r\n            self.name = name\r\n            self.text = text\r\n            self.icon = icon\r\n            self.callback = callback\r\n            self.status_tip = status_tip\r\n            self.shortcut = shortcut\r\n            self.enabled = enabled and self.callback is not None\r\n\r\n    def __init__(self, parent, name, text):\r\n        \"\"\":type parent: QtGui.QMainWindow\"\"\"\r\n        QtCore.QObject.__init__(self, parent)\r\n\r\n        self.setObjectName(name)\r\n\r\n        self.__text = text\r\n\r\n        self.__actions = dict()\r\n        \"\"\":type: dict from str to QtGui.QAction\"\"\"\r\n\r\n        self.__parent = parent\r\n        \"\"\":type parent: QtGui.QMainWindow\"\"\"\r\n\r\n        self.__menubar = QtGui.QMenu(text, self.__parent.menuBar())\r\n        \"\"\":type parent: tGui.QMenu\"\"\"\r\n\r\n        self.__menubar.setObjectName(\"MenuBar_\" + name)\r\n\r\n        self.__toolbar = None\r\n        \"\"\":type: QtGui.QToolBar or None\"\"\"\r\n\r\n        self.__parent.menuBar().addMenu(self.__menubar)\r\n\r\n    def add_separator(self):\r\n        logging.debug(\"Create separator\")\r\n        self.__menubar.addSeparator()\r\n\r\n        if self.__toolbar is not None:\r\n            self.__toolbar.addSeparator()\r\n\r\n    def add_action(self, data):\r\n        \"\"\"\r\n        :type data: ControlBar.ActionData\r\n        :rtype: QtGui.QAction\r\n        \"\"\"\r\n\r\n        logging.debug(\"Create action: %s\" % data.name)\r\n\r\n        if data.icon is not None:\r\n            logging.debug(\"Set action icon\")\r\n            if self.__toolbar is None:\r\n                self.__toolbar = QtGui.QToolBar(self.__text, self.__parent)\r\n                self.__toolbar.setObjectName(\"ToolBar_\" + self.objectName())\r\n                self.__parent.addToolBar(self.__toolbar)\r\n\r\n            self.__actions[data.name] = QtGui.QAction(data.icon, data.text, self)\r\n            self.__toolbar.addAction(self.__actions[data.name])\r\n        else:\r\n            self.__actions[data.name] = QtGui.QAction(data.text, self)\r\n\r\n        if data.status_tip is not None:\r\n            logging.debug(\"Set action status tip\")\r\n            self.__actions[data.name].setStatusTip(data.status_tip)\r\n\r\n        if data.shortcut is not None:\r\n            logging.debug(\"Set action shortcut\")\r\n            self.__actions[data.name].setShortcut(data.shortcut)\r\n\r\n        if data.callback is not None:\r\n            logging.debug(\"Set action callback\")\r\n            connect(self.__actions[data.name].triggered, data.callback)\r\n\r\n        logging.debug(\"Add action to menubar\")\r\n        self.__menubar.addAction(self.__actions[data.name])\r\n\r\n        logging.debug(\"Set object name\")\r\n        self.__actions[data.name].setObjectName(\"%s.%s\" % (self.objectName(), data.name))\r\n\r\n        logging.debug(\"Enable action\")\r\n        self.__actions[data.name].setEnabled(data.enabled)\r\n\r\n        logging.debug(\"Action %s created successfully\" % data.name)\r\n        return self.__actions[data.name]\r\n\r\n    def set_group(self, group):\r\n        \"\"\":type group: QtGui.QActionGroup\"\"\"\r\n        checkable = group.isExclusive()\r\n        for action in self.__actions.values():\r\n            action.setCheckable(checkable)\r\n            group.addAction(action)\r\n\r\n    def __getitem__(self, item):\r\n        \"\"\":type item: str\"\"\"\r\n        return self.__actions[item]\r\n\r\n    @property\r\n    def parent(self):\r\n        \"\"\":rtype: QtGui.QMainWindow\"\"\"\r\n        return self.__parent\r\n\r\n    @staticmethod\r\n    def group(controls_list, exclusive=True):\r\n        \"\"\"\r\n        :type controls_list: list of ControlBar\r\n        :type exclusive: bool\r\n        \"\"\"\r\n        different_parents = set([control.parent for control in controls_list])\r\n\r\n        if len(different_parents) > 1:\r\n            raise ValueError(\"Parent of the control bars must be the same when adding into action group!\")\r\n        elif len(different_parents) == 0:\r\n            raise IndexError(\"Input list must not be empty!\")\r\n\r\n        parent = different_parents.pop()\r\n\r\n        action_group = QtGui.QActionGroup(parent)\r\n        action_group.setExclusive(exclusive)\r\n\r\n        for control in controls_list:\r\n            control.set_group(action_group)\r\n\r\n\r\nclass ControlsView(QtCore.QObject):\r\n\r\n    class ControlData(object):\r\n        def __init__(self, name, text, actions):\r\n            \"\"\"\r\n            :type name: str\r\n            :type text: str\r\n            :type actions: list[ControlBar.ActionData|None]\r\n            \"\"\"\r\n            self.name = name\r\n            self.text = text\r\n            self.actions = actions\r\n\r\n    def __init__(self, parent, controls_data, groups=None):\r\n        \"\"\"\r\n        :param QtGui.QMainWindow parent: Where\r\n        :param list of ControlsView.ControlData controls_data: Required data to create control view\r\n        :param list[tuple[str]] or None groups: Create action groups for the toolbars\r\n        \"\"\"\r\n        QtCore.QObject.__init__(self, parent)\r\n\r\n        self.__controls = dict()\r\n        \"\"\":type: dict from str to ControlBar\"\"\"\r\n\r\n        for control in controls_data:\r\n            logging.debug(\"Create control: %s\" % control.name)\r\n            self.__controls[control.name] = ControlBar(parent, control.name, control.text)\r\n            for action_data in control.actions:\r\n                if action_data is not None:\r\n                    self.__controls[control.name].add_action(action_data)\r\n                else:\r\n                    self.__controls[control.name].add_separator()\r\n\r\n        if groups is not None:\r\n            for group in groups:\r\n                ControlBar.group([self.__controls[control_name] for control_name in group])\r\n\r\n    def __getitem__(self, item):\r\n        \"\"\"\r\n        :type item: str\r\n        :rtype: ControlBar\r\n        \"\"\"\r\n        return self.__controls[item]\r\n"
  },
  {
    "path": "OptolithiumGui/views/dbview.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport os\nimport logging as module_logging\n\nfrom resources import Resources\nfrom database import orm\nfrom database.common import ApplicationDatabase\nfrom qt import QtGui, QtCore, connect, Signal\nfrom views.common import QStackWidgetTab, QuestionBox, WarningBox, msgBox, show_traceback\nimport helpers\n\n\n__author__ = 'Alexei Gladkikh'\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.INFO)\nhelpers.logStreamEnable(logging)\n\n\nclass QTreeWidgetDrag(QtGui.QTreeWidget):\n\n    dropped = Signal(str)\n\n    class QSizeDelegate(QtGui.QItemDelegate):\n        def __init__(self):\n            QtGui.QItemDelegate.__init__(self)\n\n        def sizeHint(self, option, index):\n            return QtCore.QSize(18, 18)\n\n    def __init__(self, parent):\n        QtGui.QTreeWidget.__init__(self, parent)\n        self.setAcceptDrops(True)\n        delegate = QTreeWidgetDrag.QSizeDelegate()\n        self.setItemDelegate(delegate)\n\n    # noinspection PyPep8Naming\n    def dragEnterEvent(self, event):\n        if event.mimeData().hasUrls():\n            event.accept()\n        else:\n            event.ignore()\n\n    def dragMoveEvent(self, event):\n        if event.mimeData().hasUrls:\n            event.setDropAction(QtCore.Qt.CopyAction)\n            event.accept()\n        else:\n            event.ignore()\n\n    # noinspection PyPep8Naming\n    def dropEvent(self, event):\n        file_list = list()\n        for url in event.mimeData().urls():\n            path = url.toLocalFile()\n            if os.path.isfile(path):\n                file_list.append(path)\n\n        if len(file_list) == 1:\n            self.dropped.emit(str(file_list[0]))\n\n        elif len(file_list) > 1:\n            label_pattern = \"Loading file \\'%s\\' into database\"\n            progress = QtGui.QProgressDialog(str(), \"Abort\", 0, len(file_list), self)\n            progress.setWindowTitle(\"Import Objects\")\n            progress.setWindowModality(QtCore.Qt.WindowModal)\n            progress.show()\n\n            for k, path in enumerate(file_list):\n                progress.setLabelText(label_pattern % helpers.GetFilename(path))\n                self.dropped.emit(str(path))\n                progress.setValue(k)\n                if progress.wasCanceled():\n                    break\n\n            progress.setValue(len(file_list))\n            progress.close()\n\n\nclass QDatabaseTreeWidget(QTreeWidgetDrag):\n\n    NAME_COLUMN = 0\n    COUNT_COLUMN = 1\n    TIME_COLUMN = 2\n    DESC_COLUMN = 3\n\n    HEADER = {\n        NAME_COLUMN: \"Name\",\n        COUNT_COLUMN: \"#\",\n        TIME_COLUMN: \"Timestamp\",\n        DESC_COLUMN: \"Description\"\n    }\n\n    @staticmethod\n    def listify(data):\n        return [value for index, value in sorted(data.iteritems())]\n\n    def __init__(self, parent, database):\n        \"\"\"\n        :param parent: QtGui.QWidget\n        :type database: database.ApplicationDatabase\n        \"\"\"\n        QTreeWidgetDrag.__init__(self, parent)\n\n        self.__root = None\n        \"\"\":type: QtGui.QTreeWidgetItem\"\"\"\n\n        self.__standard_root = None\n        \"\"\":type: QtGui.QTreeWidgetItem\"\"\"\n\n        self.__plugin_root = None\n        \"\"\":type: QtGui.QTreeWidgetItem\"\"\"\n\n        self.__nodes = dict()\n        \"\"\":type: dict from str to QtGui.QTreeWidgetItem\"\"\"\n\n        self.__database = database\n        \"\"\":type: database.ApplicationDatabase\"\"\"\n\n        logging.info(\"Configure database view\")\n\n        self.setColumnCount(4)\n        self.setColumnWidth(QDatabaseTreeWidget.NAME_COLUMN, 300)\n        self.setColumnWidth(QDatabaseTreeWidget.COUNT_COLUMN, 40)\n        self.setColumnWidth(QDatabaseTreeWidget.TIME_COLUMN, 140)\n        self.setHeaderLabels(self.listify(QDatabaseTreeWidget.HEADER))\n        self.sortItems(QDatabaseTreeWidget.NAME_COLUMN, QtCore.Qt.AscendingOrder)\n        self.setSortingEnabled(True)\n\n        logging.info(\"Reload database objects\")\n        self.reload()\n\n        self.__undeleteable_items = {self.__root, self.__standard_root, self.__plugin_root}\n\n        logging.info(\"Configure actions\")\n        # Add item to database action\n        connect(self.dropped, self.__onFileDropped)\n        # Remove item from database action\n        self.installEventFilter(self)\n\n    def reload(self):\n        self.clear()\n        self.__nodes.clear()\n        self.__configure_root()\n        self.__load_content()\n\n    def __configure_root(self):\n        self.__root = QtGui.QTreeWidgetItem([os.path.abspath(self.__database.path)])\n        self.__root.setIcon(0, Resources(\"icons/Folder\"))\n        self.addTopLevelItem(self.__root)\n        self.__root.setFirstColumnSpanned(True)\n\n        self.__standard_root = QtGui.QTreeWidgetItem([\"Standard objects\"])\n        self.__standard_root.setIcon(0, Resources(\"icons/Folder\"))\n        self.__standard_root.setFirstColumnSpanned(True)\n\n        self.__plugin_root = QtGui.QTreeWidgetItem([\"Plugins\"])\n        self.__plugin_root.setIcon(0, Resources(\"icons/Folder\"))\n        self.__plugin_root.setFirstColumnSpanned(True)\n\n        self.__root.addChildren([self.__standard_root, self.__plugin_root])\n\n    @staticmethod\n    def __align_text_bottom(item):\n        \"\"\":type item: QtGui.QTreeWidgetItem\"\"\"\n        for k in xrange(len(QDatabaseTreeWidget.HEADER)):\n            alignment = item.textAlignment(k) | QtCore.Qt.AlignBottom\n            item.setTextAlignment(k, alignment)\n\n    def __load_table(self, table):\n        table_data = self.__database[table]\n        if table.title not in self.__nodes:\n            node = QtGui.QTreeWidgetItem()\n            node.setText(QDatabaseTreeWidget.NAME_COLUMN, table.title)\n            node.setText(QDatabaseTreeWidget.COUNT_COLUMN, str(table_data.count()))\n            node.setIcon(QDatabaseTreeWidget.NAME_COLUMN, Resources(\"icons/Folder\"))\n            self.__align_text_bottom(node)\n            self.__nodes[table.title] = node\n        for p_object in table_data:\n            self.__add_item(p_object)\n        return self.__nodes[table.title]\n\n    def __load_content(self):\n        for table in self.__database.standard_tables:\n            node = self.__load_table(table)\n            self.__standard_root.addChild(node)\n        self.__standard_root.setExpanded(True)\n\n        for table in self.__database.plugin_tables:\n            node = self.__load_table(table)\n            self.__plugin_root.addChild(node)\n        self.__plugin_root.setExpanded(True)\n\n        self.__root.setExpanded(True)\n\n    def __add_item(self, p_object):\n        \"\"\":type p_object: orm.Generic\"\"\"\n        node = self.__nodes[p_object.title]\n        data = {\n            QDatabaseTreeWidget.NAME_COLUMN: p_object.name,\n            QDatabaseTreeWidget.COUNT_COLUMN: str(),\n            QDatabaseTreeWidget.TIME_COLUMN: p_object.created.strftime(\"%d.%m.%y %H:%M:%S\"),\n            QDatabaseTreeWidget.DESC_COLUMN: p_object.desc\n        }\n        result = self.listify(data)\n        item = QtGui.QTreeWidgetItem(result)\n        item.setIcon(QDatabaseTreeWidget.NAME_COLUMN, Resources(p_object.icon))\n        item.setTextAlignment(QDatabaseTreeWidget.TIME_COLUMN, QtCore.Qt.AlignRight)\n        self.__align_text_bottom(item)\n        node.addChild(item)\n        node.setText(QDatabaseTreeWidget.COUNT_COLUMN, str(node.childCount()))\n\n    def __get_item(self, p_object):\n        \"\"\":type p_object: orm.Generic\"\"\"\n        node = self.__nodes[p_object.title]\n        for k in xrange(node.childCount()):\n            item = node.child(k)\n            if str(item.text(QDatabaseTreeWidget.NAME_COLUMN)) == p_object.name:\n                return item\n        return None\n\n    def __remove_item(self, p_object):\n        \"\"\":type p_object: orm.Generic or QtGui.QTreeWidgetItem\"\"\"\n        if isinstance(p_object, orm.Generic):\n            node = self.__nodes[p_object.title]\n            item = self.__get_item(p_object)\n            node.removeChild(item)\n        elif isinstance(p_object, QtGui.QTreeWidgetItem):\n            node = p_object.parent()\n            node.removeChild(p_object)\n        else:\n            raise TypeError(\"Only Generic or QTreeWidgetItem types are possible\")\n        node.setText(QDatabaseTreeWidget.COUNT_COLUMN, str(node.childCount()))\n\n    def __replace_item(self, p_object):\n        \"\"\":type p_object: orm.Generic\"\"\"\n        self.__remove_item(p_object)\n        self.__add_item(p_object)\n\n    # noinspection PyPep8Naming\n    @show_traceback\n    def __onFileDropped(self, path):\n        \"\"\":type path: str\"\"\"\n        logging.debug(\"File \\\"%s\\\" dropped\" % str(path))\n        try:\n            new_objects = self.__database.import_object(str(path))\n        except ApplicationDatabase.ObjectExisted as existed:\n            replay = QuestionBox(self, \"%s \\\"%s\\\" already existed, replace it?\" %\n                                       (existed.object.identifier, existed.object.name))\n            if replay == msgBox.Yes:\n                self.__database.replace(existed.object)\n                self.__replace_item(existed.object)\n        except ApplicationDatabase.ImportError as error:\n            WarningBox(self, error.message)\n        else:\n            for obj in new_objects:\n                logging.info(\"%s added to database\" % obj)\n                self.__add_item(obj)\n\n    def eventFilter(self, p_object, event=None):\n        \"\"\"\n        This event filter required to detect when \"Delete\" key press then confirmation dialog appeared\n        to delete the object selected under mouse.\n\n        :type p_object: QtCore.QObject\n        :type event: QtCore.QEvent\n        \"\"\"\n        # noinspection PyUnresolvedReferences\n        if p_object is self and event.type() == QtCore.QEvent.KeyPress and event.key() == QtCore.Qt.Key_Delete:\n            item = self.currentItem()\n            if item not in self.__undeleteable_items and item not in set(self.__nodes.values()):\n                name = unicode(item.text(QDatabaseTreeWidget.NAME_COLUMN))\n                reply = QuestionBox(self, \"Do you really want to delete it?\")\n                if reply == msgBox.Yes:\n                    for obj in self.__database.remove(name=name):\n                        self.__remove_item(obj)\n                return True\n        return QTreeWidgetDrag.eventFilter(self, p_object, event)\n\n\nclass DatabaseView(QStackWidgetTab):\n    def __init__(self, parent, database):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type database: database.ApplicationDatabase\n        \"\"\"\n        QStackWidgetTab.__init__(self, parent)\n        self.__data_tree = QDatabaseTreeWidget(self, database)\n\n        # Create widget layout\n        self.__layout = QtGui.QHBoxLayout(self)\n        self.__layout.addWidget(self.__data_tree)\n\n    def onSetActive(self):\n        self.__data_tree.reload()\n"
  },
  {
    "path": "OptolithiumGui/views/development.py",
    "content": "#!/usr/bin/env python\r\n# -*- coding: utf-8 -*-\r\n\r\n# This file is part of Optolithium lithography modelling software.\r\n#\r\n# Copyright (C) 2015 Alexei Gladkikh\r\n#\r\n# This software is dual-licensed: you can redistribute it and/or modify\r\n# it under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version only for NON-COMMERCIAL usage.\r\n#\r\n# This program is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n#\r\n# If you are interested in other licensing models, including a commercial-\r\n# license, please contact the author at gladkikhalexei@gmail.com\r\n\r\nimport numpy\r\nimport logging as module_logging\r\n\r\nfrom database import orm\r\nfrom qt import QtGui, connect, disconnect, Slot\r\nfrom views.common import QStackWidgetTab, QLineEditNumeric, QGraphPlot\r\n\r\nimport config\r\nimport helpers\r\n\r\n\r\n__author__ = 'Alexei Gladkikh'\r\n\r\n\r\nlogging = module_logging.getLogger(__name__)\r\nlogging.setLevel(module_logging.DEBUG)\r\nhelpers.logStreamEnable(logging)\r\n\r\n\r\n# noinspection PyPep8Naming\r\nclass sproperty(object):\r\n    \"\"\"Property descriptor that can only be set\"\"\"\r\n    def __init__(self, func, doc=None):\r\n        self.func = func\r\n        self.__doc__ = doc if doc is not None else func.__doc__\r\n\r\n    def __set__(self, obj, value):\r\n        return self.func(obj, value)\r\n\r\n\r\nclass DevelopmentGraph(QGraphPlot):\r\n\r\n    pac_data = numpy.arange(0.0, 1.0, config.DEV_RATE_PAC_STEP)\r\n\r\n    def __init__(self, parent):\r\n        \"\"\":type parent: QtGui.QWidget\"\"\"\r\n        QGraphPlot.__init__(self, parent, width=320, height=240)\r\n\r\n        self._ax = self.add_subplot()\r\n\r\n        self.__developer = None\r\n        \"\"\":type: orm.DeveloperInterface\"\"\"\r\n\r\n    def __draw_graph(self, developer):\r\n        \"\"\":type developer: orm.DeveloperInterface\"\"\"\r\n        self._ax.clear()\r\n\r\n        pac_data = DevelopmentGraph.pac_data\r\n        # rate_data = [developer.rate(pac) for pac in pac_data]\r\n        rate_data = developer.rate(pac_data, [0.0])\r\n\r\n        self._ax.plot(pac_data, rate_data, \"r-\")\r\n\r\n        self._ax.grid()\r\n\r\n        self._ax.set_xlabel(\"Photo-active component concentration\")\r\n        self._ax.set_ylabel(\"Development Rate (nm/s)\")\r\n\r\n        self._ax.patch.set_alpha(0.0)\r\n\r\n        self._ax.set_ylim([min(rate_data), max(rate_data)])\r\n\r\n        self.redraw()\r\n\r\n    @sproperty\r\n    def developer(self, developer):\r\n        \"\"\":type developer: orm.DeveloperInterface or None\"\"\"\r\n        if developer is not None:\r\n            self.__developer = developer\r\n            self.update_graph()\r\n\r\n            if isinstance(developer, orm.DeveloperExpr):\r\n                for obj in developer.object_values:\r\n                    connect(obj.signals[orm.DeveloperExprArgValue.value], self.update_graph)\r\n        else:\r\n            if isinstance(self.__developer, orm.DeveloperExpr):\r\n                for obj in self.__developer.object_values:\r\n                    disconnect(obj.signals[orm.DeveloperExprArgValue.value], self.update_graph)\r\n            self.__developer = None\r\n            self._ax.clear()\r\n            self.redraw()\r\n\r\n    @Slot()\r\n    def update_graph(self):\r\n        self.__draw_graph(self.__developer)\r\n\r\n\r\nclass DevelopmentView(QStackWidgetTab):\r\n\r\n    def __init__(self, parent, development, wafer_stack):\r\n        \"\"\"\r\n        :param QtGui.QWidget parent: Exposure and focus view widget parent\r\n        :param options.structures.Development development: Development options parameters\r\n        :param options.structures.WaferProcess wafer_stack: Wafer stack\r\n        \"\"\"\r\n        QStackWidgetTab.__init__(self, parent)\r\n\r\n        self.__wafer_stack = wafer_stack\r\n\r\n        self.__dev_time_label = QtGui.QLabel(\"Development Time (sec):\")\r\n        self.__dev_time = QLineEditNumeric(self, development.develop_time)\r\n        self.__dev_rate_graph = DevelopmentGraph(self)\r\n\r\n        self.__hlay = QtGui.QHBoxLayout()\r\n        self.__hlay.addStretch()\r\n        self.__hlay.addWidget(self.__dev_time_label)\r\n        self.__hlay.addWidget(self.__dev_time)\r\n\r\n        self.__vlay = QtGui.QVBoxLayout()\r\n        self.__vlay.addSpacing(30)\r\n        self.__vlay.addLayout(self.__hlay)\r\n        self.__vlay.addStretch()\r\n\r\n        self.__glay = QtGui.QVBoxLayout()\r\n        self.__vlay.addSpacing(20)\r\n        self.__glay.addWidget(self.__dev_rate_graph)\r\n        self.__glay.addStretch()\r\n\r\n        # self.__graph_layout.addWidget(self.__dev_rate_graph)\r\n\r\n        self.__layout = QtGui.QHBoxLayout(self)\r\n        self.__layout.addLayout(self.__vlay)\r\n        self.__layout.addLayout(self.__glay)\r\n        self.__layout.addStretch()\r\n\r\n    def onSetActive(self):\r\n        self.__dev_rate_graph.developer = self.__wafer_stack.resist.developer\r\n\r\n    def reset(self):\r\n        self.__dev_rate_graph.developer = self.__wafer_stack.resist.developer\r\n"
  },
  {
    "path": "OptolithiumGui/views/diffraction.py",
    "content": "#!/usr/bin/env python\r\n# -*- coding: utf-8 -*-\r\n\r\n# This file is part of Optolithium lithography modelling software.\r\n#\r\n# Copyright (C) 2015 Alexei Gladkikh\r\n#\r\n# This software is dual-licensed: you can redistribute it and/or modify\r\n# it under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version only for NON-COMMERCIAL usage.\r\n#\r\n# This program is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n#\r\n# If you are interested in other licensing models, including a commercial-\r\n# license, please contact the author at gladkikhalexei@gmail.com\r\n\r\nimport numpy\r\nimport logging as module_logging\r\nfrom matplotlib.patches import Circle\r\nfrom scipy import interpolate\r\n\r\nfrom qt import QtGui, connect, Slot\r\nfrom views.common import QStackWidgetTab, QGraphPlot, ProlithColormap, show_traceback\r\n\r\nimport helpers\r\nfrom auxmath import middle, cartesian\r\n\r\n\r\n__author__ = 'Alexei Gladkikh'\r\n\r\n\r\nlogging = module_logging.getLogger(__name__)\r\nlogging.setLevel(module_logging.DEBUG)\r\nhelpers.logStreamEnable(logging)\r\n\r\n\r\nclass DiffractionPatternGraph(QGraphPlot):\r\n\r\n    _extent_coef = 1.2\r\n    _continuous_threshold = 75\r\n\r\n    ABS = 0\r\n    PHASE = 1\r\n\r\n    type_map = {\r\n        ABS: \"Diffraction Pattern Amplitude\",\r\n        PHASE: \"Diffraction Pattern Phase\"\r\n    }\r\n\r\n    _inverse_map = {v: k for k, v in type_map.items()}\r\n\r\n    type_handlers = {\r\n        ABS: numpy.abs,\r\n        PHASE: lambda z: numpy.angle(z, deg=True)\r\n    }\r\n\r\n    @staticmethod\r\n    def type_by_name(name):\r\n        return DiffractionPatternGraph._inverse_map[name]\r\n\r\n    @staticmethod\r\n    def _calculate_graphs_bbox(main_size, left, right, top, bottom, hgap, vgap):\r\n        main_bbox = [left, bottom, main_size, main_size]\r\n\r\n        bottom_xplot = bottom + main_size + vgap\r\n        xplot_height = 1.0 - bottom_xplot - top\r\n        xplot_bbox = [left, bottom_xplot, main_size, xplot_height]\r\n\r\n        left_yplot = left + main_size + hgap\r\n        yplot_width = 1.0 - left_yplot - right\r\n        yplot_bbox = [left_yplot, bottom, yplot_width, main_size]\r\n\r\n        return main_bbox, xplot_bbox, yplot_bbox\r\n\r\n    def __init__(self, parent, options):\r\n        \"\"\":type parent: QtGui.QWidget\"\"\"\r\n        super(DiffractionPatternGraph, self).__init__(parent)\r\n        self.setMinimumSize(600, 600)\r\n\r\n        self._options = options\r\n\r\n        self._pattern = None\r\n        self._x0 = None\r\n        self._y0 = None\r\n        self._current_x = 0\r\n        self._current_y = 0\r\n        self._output_type = DiffractionPatternGraph.ABS\r\n        self._draw_zero_term = True\r\n        self._block_redraw = False\r\n\r\n        self.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding)\r\n\r\n        main_bbox, xplot_bbox, yplot_bbox = self._calculate_graphs_bbox(\r\n            main_size=0.6, left=0.10, right=0.01, top=0.01, bottom=0.10, hgap=0.05, vgap=0.05)\r\n\r\n        self._axis_main = self._figure.add_axes(main_bbox, frameon=True)\r\n        self._axis_xplot = self._figure.add_axes(xplot_bbox, frameon=True)\r\n        self._axis_yplot = self._figure.add_axes(yplot_bbox, frameon=True)\r\n\r\n    def resizeEvent(self, event=None):\r\n        # Require to fix square aspect ration of the figure.\r\n        # Because matplotlib can only set aspect ratio only for axes not for full figure\r\n        if isinstance(event, QtGui.QResizeEvent) and event.size().height() != event.size().width():\r\n            width = event.size().width()\r\n            height = event.size().height()\r\n            if width < height:\r\n                height = width\r\n            else:\r\n                width = height\r\n            self.resize(height, width)\r\n        else:\r\n            super(DiffractionPatternGraph, self).resizeEvent(event)\r\n\r\n    def redraw(self):\r\n        # Disable tight_layout because here a custom multi-component plot\r\n        if self._figure.get_axes():\r\n            self.draw()\r\n\r\n    def draw_graph(self):\r\n        if self._block_redraw:\r\n            return\r\n        self._update_main(redraw=False)\r\n        self._update_xplot(redraw=False)\r\n        self._update_yplot(redraw=False)\r\n        self.redraw()\r\n\r\n    def block_redraw(self, value):\r\n        self._block_redraw = value\r\n\r\n    @property\r\n    def pattern(self):\r\n        return self._pattern\r\n\r\n    @pattern.setter\r\n    def pattern(self, value):\r\n        self._pattern = value\r\n        self._x0 = middle(self._pattern.frqx)\r\n        self._y0 = middle(self._pattern.frqy)\r\n        self.draw_graph()\r\n\r\n    @property\r\n    def current_x(self):\r\n        return self._current_x\r\n\r\n    @current_x.setter\r\n    def current_x(self, indx):\r\n        self._current_x = indx\r\n        # When we change x index then Y-PLOT will update\r\n        self._update_yplot()\r\n\r\n    @property\r\n    def current_y(self):\r\n        return self._current_y\r\n\r\n    @current_y.setter\r\n    def current_y(self, indx):\r\n        self._current_y = indx\r\n        # When we change y index then X-PLOT will update\r\n        self._update_xplot()\r\n\r\n    @property\r\n    def output_type(self):\r\n        return self._output_type\r\n\r\n    @output_type.setter\r\n    def output_type(self, value):\r\n        self._output_type = value\r\n        self.draw_graph()\r\n\r\n    @property\r\n    def draw_zero_term(self):\r\n        return self._draw_zero_term\r\n\r\n    @draw_zero_term.setter\r\n    def draw_zero_term(self, value):\r\n        self._draw_zero_term = value\r\n        self.draw_graph()\r\n\r\n    def _update_main(self, redraw=True):\r\n        if self._block_redraw:\r\n            return\r\n\r\n        self._axis_main.clear()\r\n\r\n        output_handler = self.type_handlers[self.output_type]\r\n\r\n        na = self._options.imaging_tool.numerical_aperture.value\r\n        wvl = self._options.imaging_tool.wavelength.value\r\n\r\n        vlim = self._extent_coef * na\r\n\r\n        if self._pattern.frqx.size < self._continuous_threshold and \\\r\n           self._pattern.frqy.size < self._continuous_threshold:\r\n            # Discrete data\r\n            xy = cartesian(wvl*self.pattern.frqy, wvl*self.pattern.frqx)\r\n            cy, cx = xy[:, 1], xy[:, 0]\r\n            v = output_handler(self.pattern.values)\r\n\r\n            if not self._draw_zero_term:\r\n                v[self._y0, self._x0] = \"nan\"\r\n\r\n            # Remove points outer the objective\r\n            # ym, xm = numpy.meshgrid(wvl*self.pattern.frqy, wvl*self.pattern.frqx)\r\n            # v[(xm**2 + ym**2) > na*na] = \"nan\"\r\n            v[self._pattern.cxy > na] = \"nan\"\r\n\r\n            # TODO: Set to nan value outer the circle...\r\n            self._axis_main.scatter(cy, cx, c=v, cmap=ProlithColormap, s=75, zorder=1)\r\n\r\n            self._axis_main.grid()\r\n        else:\r\n            # Continuous data\r\n            xi = yi = numpy.linspace(-na, na, 101)\r\n            lookup_table = interpolate.interp1d(xi, xrange(len(xi)), kind=\"nearest\")\r\n\r\n            cols = lookup_table(wvl*self.pattern.frqx)\r\n            rows = lookup_table(wvl*self.pattern.frqy)\r\n            data = numpy.zeros([len(xi), len(yi)], dtype=float)\r\n            for k, (row, col) in enumerate(cartesian(rows, cols)):\r\n                data[row, col] = output_handler(self.pattern.values.item(k))\r\n\r\n            # Cut elements that not in pupil (can't use direction cosines matrix because data was upsampled)\r\n            xm, ym = numpy.meshgrid(xi, yi)\r\n            data[(xm**2 + ym**2) > na*na] = \"nan\"\r\n            # self._axis_main.contour(xi, yi, data, cmap=ProlithColormap)\r\n            image = self._axis_main.imshow(data, cmap=ProlithColormap, zorder=1)\r\n            image.set_extent([-na, na, -na, na])\r\n\r\n        circle = Circle(xy=[0.0, 0.0], radius=na, edgecolor=\"k\", facecolor=\"#DDDDDD\", linewidth=4, zorder=0)\r\n        self._axis_main.add_patch(circle)\r\n\r\n        self._axis_main.set_xlim(-vlim, vlim)\r\n        self._axis_main.set_ylim(-vlim, vlim)\r\n\r\n        self._axis_main.set_xlabel(\"X Pupil Position\")\r\n        self._axis_main.set_ylabel(\"Y Pupil Position\")\r\n\r\n        self._axis_main.patch.set_alpha(0.0)\r\n\r\n        if redraw:\r\n            self.redraw()\r\n\r\n    def _update_xplot(self, redraw=True):\r\n        if self._block_redraw:\r\n            return\r\n\r\n        self._axis_xplot.clear()\r\n\r\n        na = self._options.imaging_tool.numerical_aperture.value\r\n\r\n        output_handler = self.type_handlers[self.output_type]\r\n\r\n        values = output_handler(self.pattern.values[self._y0 + self.current_y, :])\r\n        values[abs(self.pattern.cx) > na] = \"nan\"\r\n\r\n        if self._pattern.frqx.size < self._continuous_threshold:\r\n            # Discrete data\r\n\r\n            if not self._draw_zero_term and self._pattern.frqx.size != 1:\r\n                values[self._x0] = \"nan\"\r\n\r\n            markerline, stemlines, _ = self._axis_xplot.stem(self.pattern.cx, values, \"k-\", markerfmt=\"k^\")\r\n            markerline.set_markersize(10)\r\n            for k, item in enumerate(stemlines):\r\n                item.set_linewidth(2)\r\n        else:\r\n            # Continuous data\r\n            self._axis_xplot.plot(self.pattern.cx, values, \"k-\", linewidth=2)\r\n\r\n        vlim = self._extent_coef * na\r\n        self._axis_xplot.set_xlim(-vlim, vlim)\r\n\r\n        if self.output_type == DiffractionPatternGraph.ABS:\r\n            self._axis_xplot.set_ylim(0.0, numpy.nanmax(values)*self._extent_coef)\r\n        elif self.output_type == DiffractionPatternGraph.PHASE:\r\n            self._axis_xplot.set_yticks(numpy.arange(-180.0, 240.0, 60.0))\r\n            self._axis_xplot.set_ylim(-210.0, 210.0)\r\n        else:\r\n            raise RuntimeError(\"Unknown output type diffraction pattern type\")\r\n\r\n        self._axis_xplot.patch.set_alpha(0.0)\r\n\r\n        if redraw:\r\n            self.redraw()\r\n\r\n    def _update_yplot(self, redraw=True):\r\n        if self._block_redraw:\r\n            return\r\n\r\n        def swap(line2d):\r\n            xdata = line2d.get_xdata()\r\n            ydata = line2d.get_ydata()\r\n            line2d.set_xdata(ydata)\r\n            line2d.set_ydata(xdata)\r\n\r\n        self._axis_yplot.clear()\r\n\r\n        na = self._options.imaging_tool.numerical_aperture.value\r\n\r\n        output_handler = self.type_handlers[self.output_type]\r\n\r\n        values = output_handler(self.pattern.values[:, self._x0 + self.current_x])\r\n        values[abs(self.pattern.cy) > na] = \"nan\"\r\n\r\n        vlim = self._extent_coef * self._options.imaging_tool.numerical_aperture.value\r\n\r\n        if self._pattern.frqy.size < self._continuous_threshold:\r\n            # Discrete data\r\n\r\n            if not self._draw_zero_term and self._pattern.frqy.size != 1:\r\n                values[self._y0] = \"nan\"\r\n\r\n            markerline, stemlines, baseline = self._axis_yplot.stem(self.pattern.cy, values, 'k-', markerfmt=\"k>\")\r\n            swap(markerline)\r\n            swap(baseline)\r\n            markerline.set_markersize(10)\r\n            for k, item in enumerate(stemlines):\r\n                swap(item)\r\n                item.set_linewidth(2)\r\n            self._axis_yplot.set_xlim(*self._axis_yplot.get_ylim())\r\n        else:\r\n            # Continuous data\r\n            self._axis_yplot.plot(values, self.pattern.cy, \"k-\", linewidth=2)\r\n\r\n        self._axis_yplot.set_ylim(-vlim, vlim)\r\n        if self.output_type == DiffractionPatternGraph.ABS:\r\n            vmax = numpy.nanmax(values)*self._extent_coef\r\n            self._axis_yplot.set_xlim(0.0, vmax if vmax != 0.0 else 0.1)\r\n        elif self.output_type == DiffractionPatternGraph.PHASE:\r\n            self._axis_yplot.set_xticks(numpy.arange(-180.0, 240.0, 60.0))\r\n            self._axis_yplot.set_xlim(-210.0, 210.0)\r\n        else:\r\n            raise RuntimeError(\"Unknown output type diffraction pattern type\")\r\n\r\n        for label in self._axis_yplot.get_xticklabels():\r\n            label.set_rotation(270.0)\r\n\r\n        self._axis_yplot.patch.set_alpha(0.0)\r\n\r\n        if redraw:\r\n            self.redraw()\r\n\r\n\r\nclass DiffractionPatternView(QStackWidgetTab):\r\n\r\n    def __init__(self, parent, simulation):\r\n        \"\"\"\r\n        :param QtGui.QWidget parent: Diffraction pattern view widget parent\r\n        :param core.Core simulation: Simulation Core\r\n        \"\"\"\r\n        super(DiffractionPatternView, self).__init__(parent)\r\n        self.__simulation = simulation\r\n\r\n        self.__type_label = QtGui.QLabel(\"Display:\", self)\r\n        self.__type_combo = QtGui.QComboBox(self)\r\n        for type_index in sorted(DiffractionPatternGraph.type_map):\r\n            self.__type_combo.addItem(DiffractionPatternGraph.type_map[type_index])\r\n        self.__show_zero_chkbox = QtGui.QCheckBox(\"Draw (0, 0) order term\", self)\r\n        self.__show_zero_chkbox.setChecked(True)\r\n        self.__kx_spinbox = QtGui.QSpinBox(self)\r\n        self.__kx_spinbox.setFixedWidth(80)\r\n        self.__ky_spinbox = QtGui.QSpinBox(self)\r\n        self.__ky_spinbox.setFixedWidth(80)\r\n\r\n        self.__graph = DiffractionPatternGraph(self, simulation.options)\r\n\r\n        self.__options_layout = QtGui.QVBoxLayout()\r\n        self.__options_layout.addWidget(self.__type_label)\r\n        self.__options_layout.addWidget(self.__type_combo)\r\n\r\n        self.__options_layout.addSpacing(15)\r\n\r\n        self.__options_layout.addWidget(self.__show_zero_chkbox)\r\n\r\n        self.__options_layout.addSpacing(15)\r\n\r\n        self.__kxy_layout = QtGui.QFormLayout()\r\n        self.__kxy_layout.addRow(\"X-Axis at:\", self.__kx_spinbox)\r\n        self.__kxy_layout.addRow(\"Y-Axis at:\", self.__ky_spinbox)\r\n        self.__options_layout.addLayout(self.__kxy_layout)\r\n\r\n        self.__options_layout.addStretch()\r\n\r\n        self.__graph_layout = QtGui.QVBoxLayout()\r\n        self.__graph_layout.addWidget(self.__graph)\r\n\r\n        self.__layout = QtGui.QHBoxLayout(self)\r\n        self.__layout.addLayout(self.__options_layout)\r\n        self.__layout.addLayout(self.__graph_layout)\r\n\r\n        connect(self.__type_combo.currentIndexChanged, self.on_combobox_changed)\r\n        connect(self.__show_zero_chkbox.stateChanged, self.on_chkbox_toggled)\r\n        connect(self.__kx_spinbox.valueChanged, self.on_kx_spin_changed)\r\n        connect(self.__ky_spinbox.valueChanged, self.on_ky_spin_changed)\r\n\r\n    @Slot(int)\r\n    def on_combobox_changed(self, indx):\r\n        self.__graph.output_type = indx\r\n\r\n    @Slot(bool)\r\n    def on_chkbox_toggled(self, state):\r\n        self.__graph.draw_zero_term = state\r\n\r\n    @Slot(int)\r\n    def on_kx_spin_changed(self, value):\r\n        self.__graph.current_x = value\r\n\r\n    @Slot(int)\r\n    def on_ky_spin_changed(self, value):\r\n        self.__graph.current_y = value\r\n\r\n    @show_traceback\r\n    def onSetActive(self):\r\n        pattern = self.__simulation.diffraction.calculate()\r\n\r\n        self.__graph.block_redraw(True)\r\n\r\n        self.__kx_spinbox.setRange(numpy.min(pattern.kx), numpy.max(pattern.kx))\r\n        self.__ky_spinbox.setRange(numpy.min(pattern.ky), numpy.max(pattern.ky))\r\n        self.__kx_spinbox.setValue(0)\r\n        self.__ky_spinbox.setValue(0)\r\n        self.__type_combo.setCurrentIndex(DiffractionPatternGraph.ABS)\r\n        self.__graph.pattern = pattern\r\n\r\n        self.__graph.block_redraw(False)\r\n        self.__graph.draw_graph()\r\n"
  },
  {
    "path": "OptolithiumGui/views/exposure.py",
    "content": "#!/usr/bin/env python\r\n# -*- coding: utf-8 -*-\r\n\r\n# This file is part of Optolithium lithography modelling software.\r\n#\r\n# Copyright (C) 2015 Alexei Gladkikh\r\n#\r\n# This software is dual-licensed: you can redistribute it and/or modify\r\n# it under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version only for NON-COMMERCIAL usage.\r\n#\r\n# This program is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n#\r\n# If you are interested in other licensing models, including a commercial-\r\n# license, please contact the author at gladkikhalexei@gmail.com\r\n\r\nimport logging as module_logging\r\n\r\nfrom matplotlib.patches import Rectangle\r\n\r\nfrom qt import QtGui, connect, Slot\r\nfrom views.common import QStackWidgetTab, QLineEditNumeric, QComboBoxEnum, QGraphPlot\r\nfrom options.structures import Abstract\r\n\r\nimport helpers\r\nimport config\r\n\r\n\r\n__author__ = 'Alexei Gladkikh'\r\n\r\n\r\nlogging = module_logging.getLogger(__name__)\r\nlogging.setLevel(module_logging.INFO)\r\nhelpers.logStreamEnable(logging)\r\n\r\n\r\nclass ExposureDoseBox(QtGui.QGroupBox):\r\n    def __init__(self, parent, exposure_focus):\r\n        \"\"\"\r\n        :type parent: QtGui.QWidget\r\n        :type exposure_focus: options.structures.ExposureFocus\r\n        \"\"\"\r\n        QtGui.QGroupBox.__init__(self, \"Exposure Dose\", parent)\r\n\r\n        self.__exposure_focus = exposure_focus\r\n        self.__dose_edit = QLineEditNumeric(self, self.__exposure_focus.exposure)\r\n\r\n        self.__hlayout = QtGui.QHBoxLayout()\r\n        self.__hlayout.addStretch()\r\n        self.__hlayout.addWidget(QtGui.QLabel(\"Exposure Energy (mJ/cm2):\"))\r\n        self.__hlayout.addWidget(self.__dose_edit)\r\n\r\n        self.__layout = QtGui.QVBoxLayout(self)\r\n        self.__layout.addLayout(self.__hlayout)\r\n        # self.__layout.addStretch()\r\n\r\n\r\nclass DoseCalibrationBox(QtGui.QGroupBox):\r\n    def __init__(self, parent, exposure_focus):\r\n        \"\"\"\r\n        :type parent: QtGui.QWidget\r\n        :type exposure_focus: options.structures.ExposureFocus\r\n        \"\"\"\r\n        QtGui.QGroupBox.__init__(self, \"Dose Calibration\", parent)\r\n        self.__exposure_focus = exposure_focus\r\n        self.__correctable_edit = QLineEditNumeric(self, self.__exposure_focus.dose_correctable)\r\n\r\n        self.__hlayout = QtGui.QHBoxLayout()\r\n        self.__hlayout.addStretch()\r\n        self.__hlayout.addWidget(QtGui.QLabel(\"Dose correctable (mJ/cm2):\"))\r\n        self.__hlayout.addWidget(self.__correctable_edit)\r\n\r\n        self.__layout = QtGui.QVBoxLayout(self)\r\n        self.__label = QtGui.QLabel(\"Note: Stepper's dose meter located at the mask side\")\r\n        self.__layout.addWidget(self.__label)\r\n        self.__layout.addLayout(self.__hlayout)\r\n        # self.__layout.addStretch()\r\n\r\n\r\nclass WaferFocus(QtGui.QGroupBox):\r\n    def __init__(self, parent, exposure_focus):\r\n        \"\"\"\r\n        :type parent: QtGui.QWidget\r\n        :type exposure_focus: options.structures.ExposureFocus\r\n        \"\"\"\r\n        QtGui.QGroupBox.__init__(self, \"Wafer Focus\", parent)\r\n        self.__exposure_focus = exposure_focus\r\n        self.__position_edit = QLineEditNumeric(self, self.__exposure_focus.focus)\r\n        self.__relative_combo = QComboBoxEnum(self, self.__exposure_focus.focal_relative_to)\r\n        self.__direction_combo = QComboBoxEnum(self, self.__exposure_focus.focal_direction)\r\n\r\n        self.__pos_layout = QtGui.QHBoxLayout()\r\n        self.__pos_layout.addStretch()\r\n        self.__pos_layout.addWidget(QtGui.QLabel(\"Focal Position (microns):\"))\r\n        self.__pos_layout.addWidget(self.__position_edit)\r\n\r\n        self.__rel_layout = QtGui.QHBoxLayout()\r\n        self.__rel_layout.addStretch()\r\n        self.__rel_layout.addWidget(QtGui.QLabel(\"Position is relative to \"))\r\n        self.__rel_layout.addWidget(self.__relative_combo)\r\n        self.__rel_layout.addWidget(QtGui.QLabel(\" of resist\"))\r\n\r\n        self.__dir_layout = QtGui.QHBoxLayout()\r\n        self.__dir_layout.addStretch()\r\n        self.__dir_layout.addWidget(QtGui.QLabel(\"Positive numbers move the Focal Position \"))\r\n        self.__dir_layout.addWidget(self.__direction_combo)\r\n\r\n        self.__layout = QtGui.QVBoxLayout(self)\r\n        self.__layout.addLayout(self.__pos_layout)\r\n        self.__layout.addLayout(self.__rel_layout)\r\n        self.__layout.addLayout(self.__dir_layout)\r\n        # self.__layout.addStretch()\r\n\r\n\r\nclass FocusGraph(QGraphPlot):\r\n\r\n    def __init__(self, parent, exposure_focus, wafer_stack):\r\n        \"\"\"\r\n        :type parent: QtGui.QWidget\r\n        :type exposure_focus: options.structures.ExposureFocus\r\n        :type wafer_stack: options.structures.WaferProcess\r\n        \"\"\"\r\n        QGraphPlot.__init__(self, parent, width=320, height=400)\r\n        self.__exposure_focus = exposure_focus\r\n        self.__wafer_stack = wafer_stack\r\n        self._ax = self.add_subplot()\r\n        connect(self.__exposure_focus.focus.signals[Abstract], self.update_graph)\r\n        connect(self.__exposure_focus.focal_direction.signals[Abstract], self.update_graph)\r\n        connect(self.__exposure_focus.focal_relative_to.signals[Abstract], self.update_graph)\r\n\r\n    def draw_graph(self, focus, relative_to, direction, thickness):\r\n        \"\"\"\r\n        :type focus: float\r\n        :type relative_to: float\r\n        :type direction: float\r\n        :type thickness: float\r\n        \"\"\"\r\n        top_focus = self.__exposure_focus.focal_plane\r\n        bottom_focus = thickness - top_focus\r\n        max_y = max(thickness, bottom_focus) + thickness/5.0\r\n        min_y = min(0.0, thickness, bottom_focus) - thickness/5.0\r\n\r\n        self._ax.clear()\r\n\r\n        self._ax.set_xlim(0.0, 1.0)\r\n        self._ax.set_ylim(min_y, max_y)\r\n\r\n        self._ax.add_patch(Rectangle([0.2, 0.0], 0.4, thickness, facecolor=config.RESIST_FILL_COLOR))\r\n        self._ax.add_patch(Rectangle([0.0, min_y], 1.0, abs(min_y), color='b', linewidth=0, fill=None, hatch=\"///\"))\r\n        self._ax.plot([0.1, 0.7], [bottom_focus, bottom_focus], color='k', linestyle='-', linewidth=2)\r\n\r\n        logging.debug(\"Focus: %s, relative: %s, direction: %s, thickness: %s -> top: %s, bottom: %s\" %\r\n                      (focus, relative_to, direction, thickness, top_focus, bottom_focus))\r\n\r\n        self._ax.grid()\r\n\r\n        self._ax.set_title(\"Relative Wafer Focal Position\")\r\n        self._ax.get_xaxis().set_visible(False)\r\n        self._ax.patch.set_alpha(0.0)\r\n\r\n        self.redraw()\r\n\r\n    @Slot()\r\n    def update_graph(self):\r\n        self.draw_graph(\r\n            self.__exposure_focus.focus.value,\r\n            self.__exposure_focus.focal_relative_to.value,\r\n            self.__exposure_focus.focal_direction.value,\r\n            self.__wafer_stack.resist.thickness)\r\n\r\n\r\nclass ExposureFocusView(QStackWidgetTab):\r\n\r\n    def __init__(self, parent, exposure_focus, wafer_stack):\r\n        \"\"\"\r\n        :param QtGui.QWidget parent: Exposure and focus view widget parent\r\n        :param options.structures.ExposureFocus exposure_focus: Exposure and focus options parameters\r\n        :param options.structures.WaferProcess wafer_stack: Wafer stack\r\n        \"\"\"\r\n        QStackWidgetTab.__init__(self, parent)\r\n\r\n        self.__exposure = ExposureDoseBox(self, exposure_focus)\r\n        self.__calibration = DoseCalibrationBox(self, exposure_focus)\r\n        self.__focus = WaferFocus(self, exposure_focus)\r\n        self.__focus_graph = FocusGraph(self, exposure_focus, wafer_stack)\r\n\r\n        self.__layout = QtGui.QVBoxLayout()\r\n        self.__layout.addWidget(self.__exposure)\r\n        self.__layout.addWidget(self.__calibration)\r\n        self.__layout.addSpacing(10)\r\n        self.__layout.addWidget(self.__focus)\r\n        self.__layout.addStretch()\r\n\r\n        self.__graph_layout = QtGui.QVBoxLayout()\r\n        self.__graph_layout.addWidget(self.__focus_graph)\r\n        self.__graph_layout.addStretch()\r\n\r\n        self.__hlayout = QtGui.QHBoxLayout(self)\r\n        self.__hlayout.addLayout(self.__layout)\r\n        self.__hlayout.addSpacing(10)\r\n        self.__hlayout.addLayout(self.__graph_layout)\r\n        self.__hlayout.addStretch()\r\n\r\n    def onSetActive(self):\r\n        self.__focus_graph.update_graph()\r\n"
  },
  {
    "path": "OptolithiumGui/views/imaging.py",
    "content": "# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport logging as module_logging\n\nfrom scipy import ndimage\nfrom qt import connect, disconnect, Slot, QtGui, QtCore\nfrom views.common import QStackWidgetTab, ParameterGroupBox, QLoadDialogFactory, QGraphPlot, ProlithColormap\nfrom options.common import Abstract\nfrom database import orm\n\nimport numpy\nimport helpers\n\n\n__author__ = 'Alexei Gladkikh'\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.DEBUG)\nhelpers.logStreamEnable(logging)\n\n\nclass StandardImagingPlot(QGraphPlot):\n    \"\"\"\n    Abstract class. Method _get_values must be reimplemented.\n    \"\"\"\n\n    @staticmethod\n    def _get_values(p_object, x, y):\n        raise NotImplementedError\n\n    def __init__(self, parent, p_object=None):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        # :type p_object: orm.SourceShape | orm.ConcretePluginSourceShape | None\n        \"\"\"\n        super(StandardImagingPlot, self).__init__(parent)\n\n        self.setFixedSize(290, 290)\n        self.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding)\n\n        self.__interp = None\n        \"\"\":type: scipy.interpolate.interp2d\"\"\"\n\n        self.__p_object = None\n        # \"\"\":type: orm.SourceShape | orm.ConcretePluginSourceShape | None\"\"\"\n\n        self._ax = self.add_subplot()\n        self._ax.set_aspect(\"equal\")\n\n        if p_object is not None:\n            self.setObject(p_object)\n\n    # noinspection PyPep8Naming\n    def setObject(self, p_object):\n        # \"\"\":type p_object: orm.SourceShape | orm.ConcretePluginSourceShape\"\"\"\n\n        if self.__p_object is not None:\n            for variable in self.__p_object.variables:\n                disconnect(variable.signals[Abstract], self.__onValueChanged)\n\n        self.__p_object = p_object\n\n        for variable in self.__p_object.variables:\n            connect(variable.signals[Abstract], self.__onValueChanged)\n\n        self.__onValueChanged()\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def __onValueChanged(self):\n        self.draw_graph()\n\n    def draw_graph(self):\n        self._ax.clear()\n\n        self._ax.set_xlabel(\"X Pupil Position\")\n        self._ax.set_ylabel(\"Y Pupil Position\")\n\n        self._ax.set_xlim(left=-1.0, right=1.0)\n        self._ax.set_ylim(bottom=-1.0, top=1.0)\n\n        x = y = numpy.arange(-1.0, 1.01, 0.02)\n\n        values = self._get_values(self.__p_object, x, y)\n\n        values = ndimage.gaussian_filter(values, 0.8)\n        values = ndimage.median_filter(values, 5)\n        # self._ax.imshow(intensity, cmap=ProlithColormap, interpolation='nearest', extent=[-1.0, 1.0, -1.0, 1.0])\n        self._ax.contourf(x, y, values, cmap=ProlithColormap)\n\n        self._ax.set_aspect(\"equal\")\n\n        self._ax.grid()\n\n        self.redraw()\n\n\nclass SourceShapePlot(StandardImagingPlot):\n\n    @staticmethod\n    def _get_values(p_object, x, y):\n        return p_object.intensity(x, y)\n\n\nclass PupilFilterPlot(StandardImagingPlot):\n\n    @staticmethod\n    def _get_values(p_object, x, y):\n        return numpy.abs(p_object.coefficients(x, y))\n\n\nLoadSourceShapeDialog = QLoadDialogFactory(orm.SourceShape, orm.AbstractPluginSourceShape, SourceShapePlot)\nLoadPupilFilterDialog = QLoadDialogFactory(orm.PupilFilter, orm.AbstractPluginPupilFilter, PupilFilterPlot)\n\n\nclass SourceShapeBox(ParameterGroupBox):\n\n    def __init__(self, parent, imaging_tool, appdb):\n        \"\"\"\n        :type imaging_tool: options.structures.ImagingTool\n        :type appdb: ApplicationDatabase\n        \"\"\"\n        super(SourceShapeBox, self).__init__(\"Source Shape\", parent)\n\n        self.__imaging_tools = imaging_tool\n\n        self.__load_source_shape_dlg = LoadSourceShapeDialog(self, appdb)\n\n        # -- Buttons section --\n\n        self.__buttons_hlayout = QtGui.QHBoxLayout()\n\n        self.__load_source_shape_button = QtGui.QPushButton(\"Load Source Shape\", self)\n        connect(self.__load_source_shape_button.pressed, self.__load_source_shape)\n\n        self.__save_source_shape_button = QtGui.QPushButton(\"Save to Database\", self)\n        connect(self.__save_source_shape_button.pressed, self.__save_source_shape)\n        # TODO 15: Add saving of the source shape to the database from plugin state\n        self.__save_source_shape_button.setEnabled(False)\n\n        self.__buttons_hlayout.addWidget(self.__load_source_shape_button)\n        self.__buttons_hlayout.addWidget(self.__save_source_shape_button)\n        self.__buttons_hlayout.addStretch()\n\n        # -- Name section --\n\n        self.__name_hlayout = QtGui.QHBoxLayout()\n\n        self.__name_label = QtGui.QLabel(\"Name:\", self)\n        self.__name_edit = QtGui.QLineEdit(self)\n        self.__name_edit.setMinimumWidth(200)\n\n        self.__name_hlayout.addWidget(self.__name_label)\n        self.__name_hlayout.addWidget(self.__name_edit)\n        # self.__name_hlayout.addStretch()\n\n        # -- Plot section --\n\n        self.__source_shape_hlay = QtGui.QHBoxLayout()\n        self.__source_shape_plot = SourceShapePlot(self)\n        self.__source_shape_hlay.addWidget(self.__source_shape_plot)\n        self.__source_shape_hlay.setAlignment(QtCore.Qt.AlignCenter)\n\n        # -- Parameters section --\n\n        self.__prms = {}\n        self.__parameters_vlayout = QtGui.QVBoxLayout()\n\n        # -- Body --\n\n        self.__vlayout = QtGui.QVBoxLayout(self)\n        self.__vlayout.addLayout(self.__buttons_hlayout)\n        self.__vlayout.addLayout(self.__name_hlayout)\n        self.__vlayout.addLayout(self.__parameters_vlayout)\n        self.__vlayout.addLayout(self.__source_shape_hlay)\n\n        self.setObject(imaging_tool.source_shape)\n\n    # noinspection PyPep8Naming\n    def setObject(self, p_object):\n        \"\"\":type p_object: orm.SourceShape | orm.ConcretePluginSourceShape\"\"\"\n        self.__imaging_tools.source_shape = p_object\n        self.__name_edit.setText(p_object.name)\n        self._add_plugin_parameters(p_object, self.__parameters_vlayout)\n        self.__source_shape_plot.setObject(p_object)\n\n    @Slot()\n    def __load_source_shape(self):\n        if self.__load_source_shape_dlg.exec_():\n            source_shape = self.__load_source_shape_dlg.object\n            logging.info(\"Load source shape: %s [%s]\" % (source_shape.name, type(source_shape).__name__))\n            self.setObject(source_shape)\n\n    @Slot()\n    def __save_source_shape(self):\n        pass\n\n    def reset(self):\n        self.setObject(self.__imaging_tools.source_shape)\n\n\nclass SpectrumBox(ParameterGroupBox):\n\n    def __init__(self, parent, imaging_tool):\n        \"\"\":type imaging_tool: options.structures.ImagingTool\"\"\"\n        super(SpectrumBox, self).__init__(\"Spectrum\", parent)\n        self.__wavelength_label = QtGui.QLabel(\"Wavelength (nm):\")\n        self.__wavelength_edit = self.edit(imaging_tool.wavelength)\n        self.__hlayout = QtGui.QHBoxLayout(self)\n        self.__hlayout.addWidget(self.__wavelength_label)\n        self.__hlayout.addStretch()\n        self.__hlayout.addWidget(self.__wavelength_edit)\n\n\nclass PupilFilterBox(ParameterGroupBox):\n\n    def __init__(self, parent, imaging_tool, appdb):\n        \"\"\":type imaging_tool: options.structures.ImagingTool\"\"\"\n        super(PupilFilterBox, self).__init__(\"Pupil Filter\", parent)\n\n        self.__imaging_tool = imaging_tool\n\n        self.__load_pupil_filter_dlg = LoadPupilFilterDialog(self, appdb)\n\n        self.__body = QtGui.QWidget(self)\n        self.__body_layout = QtGui.QVBoxLayout(self.__body)\n\n        # -- Buttons section --\n\n        self.__buttons_hlayout = QtGui.QHBoxLayout()\n\n        self.__load_pupil_filter_button = QtGui.QPushButton(\"Load Pupil Filter\", self)\n        connect(self.__load_pupil_filter_button.pressed, self.__load_pupil_filter)\n\n        self.__unload_pupil_filter_button = QtGui.QPushButton(\"Unload\", self)\n        connect(self.__unload_pupil_filter_button.pressed, self.__unload_pupil_filter)\n\n        self.__save_pupil_filter_button = QtGui.QPushButton(\"Save to Database\", self)\n        connect(self.__save_pupil_filter_button.pressed, self.__save_pupil_filter)\n\n        # TODO 15: Add saving of the pupil filter to the database from plugin state\n        self.__save_pupil_filter_button.setEnabled(False)\n\n        self.__buttons_hlayout.addWidget(self.__load_pupil_filter_button)\n        self.__buttons_hlayout.addWidget(self.__unload_pupil_filter_button)\n        self.__buttons_hlayout.addWidget(self.__save_pupil_filter_button)\n        self.__buttons_hlayout.addStretch()\n\n        # -- Name section --\n\n        self.__name_hlayout = QtGui.QHBoxLayout()\n\n        self.__name_label = QtGui.QLabel(\"Name:\", self.__body)\n        self.__name_edit = QtGui.QLineEdit(self.__body)\n        self.__name_edit.setMinimumWidth(200)\n\n        self.__name_hlayout.addWidget(self.__name_label)\n        self.__name_hlayout.addWidget(self.__name_edit)\n\n        # -- Plot section --\n\n        self.__pupil_filter_hlay = QtGui.QHBoxLayout()\n        self.__pupil_filter_plot = PupilFilterPlot(self.__body)\n        self.__pupil_filter_hlay.addWidget(self.__pupil_filter_plot)\n        self.__pupil_filter_hlay.setAlignment(QtCore.Qt.AlignCenter)\n\n        # -- Parameters section --\n\n        self.__prms = {}\n        self.__parameters_vlayout = QtGui.QVBoxLayout()\n\n        # -- Body --\n\n        self.__body_layout.addLayout(self.__name_hlayout)\n        self.__body_layout.addLayout(self.__parameters_vlayout)\n        self.__body_layout.addLayout(self.__pupil_filter_hlay)\n\n        self.__vlayout = QtGui.QVBoxLayout(self)\n        self.__vlayout.addLayout(self.__buttons_hlayout)\n        self.__vlayout.addWidget(self.__body)\n\n        self.setObject(self.__imaging_tool.pupil_filter)\n\n    # noinspection PyPep8Naming\n    def setObject(self, p_object):\n        \"\"\":type p_object: orm.PupilFilter | orm.ConcretePluginPupilFilter | None\"\"\"\n\n        is_present = p_object is not None\n\n        self.__save_pupil_filter_button.setEnabled(is_present)\n        self.__body.setVisible(is_present)\n\n        if is_present:\n            self.__name_edit.setText(p_object.name)\n            self._add_plugin_parameters(p_object, self.__parameters_vlayout)\n            self.__pupil_filter_plot.setObject(p_object)\n\n    @Slot()\n    def __load_pupil_filter(self):\n        if self.__load_pupil_filter_dlg.exec_():\n            pupil_filter = self.__load_pupil_filter_dlg.object\n            logging.info(\"Load pupil filter: %s [%s]\" % (pupil_filter.name, type(pupil_filter).__name__))\n            self.__imaging_tool.pupil_filter = pupil_filter\n            self.setObject(self.__imaging_tool.pupil_filter)\n            self.__imaging_tool.dirty = True\n            # self.__imaging_tool.changed.emit()\n\n    @Slot()\n    def __unload_pupil_filter(self):\n        self.__imaging_tool.pupil_filter = None\n        self.setObject(None)\n        self.__imaging_tool.dirty = True\n        self.__imaging_tool.changed.emit()\n\n    @Slot()\n    def __save_pupil_filter(self):\n        pass\n\n    def reset(self):\n        self.setObject(self.__imaging_tool.pupil_filter)\n\n\nclass ObjectiveLensBox(ParameterGroupBox):\n\n    def __init__(self, parent, imaging_tool):\n        \"\"\":type imaging_tool: options.structures.ImagingTool\"\"\"\n        super(ObjectiveLensBox, self).__init__(\"Objective Lens\", parent)\n\n        self.__numerical_aperture_hlay = QtGui.QHBoxLayout()\n        self.__numerical_aperture_label = QtGui.QLabel(\"Numerical Aperture:\")\n        self.__numerical_aperture_edit = self.edit(imaging_tool.numerical_aperture)\n        self.__numerical_aperture_hlay.addWidget(self.__numerical_aperture_label)\n        self.__numerical_aperture_hlay.addStretch()\n        self.__numerical_aperture_hlay.addWidget(self.__numerical_aperture_edit)\n\n        self.__reduction_ratio_hlay = QtGui.QHBoxLayout()\n        self.__reduction_ratio_label = QtGui.QLabel(\"Reduction Ratio:\")\n        self.__reduction_ratio_edit = self.edit(imaging_tool.reduction_ratio)\n        self.__reduction_ratio_hlay.addWidget(self.__reduction_ratio_label)\n        self.__reduction_ratio_hlay.addStretch()\n        self.__reduction_ratio_hlay.addWidget(self.__reduction_ratio_edit)\n\n        self.__flare_hlay = QtGui.QHBoxLayout()\n        self.__flare_label = QtGui.QLabel(\"Flare:\")\n        self.__flare_edit = self.edit(imaging_tool.flare)\n        self.__flare_hlay.addWidget(self.__flare_label)\n        self.__flare_hlay.addStretch()\n        self.__flare_hlay.addWidget(self.__flare_edit)\n\n        self.__vlayout = QtGui.QVBoxLayout(self)\n        self.__vlayout.addLayout(self.__numerical_aperture_hlay)\n        self.__vlayout.addLayout(self.__reduction_ratio_hlay)\n        self.__vlayout.addLayout(self.__flare_hlay)\n\n        # self.setSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)\n\n\nclass ImmersionBox(ParameterGroupBox):\n\n    def __init__(self, parent, imaging_tool):\n        \"\"\":type imaging_tool: options.structures.ImagingTool\"\"\"\n        super(ImmersionBox, self).__init__(\"Immersion Lithography\", parent)\n\n        self.__imaging_tool = imaging_tool\n\n        self.__immersion_enable_checkbox = QtGui.QCheckBox(\"Enable Immersion\", self)\n        connect(self.__immersion_enable_checkbox.stateChanged, self.immersionStateChanged)\n        # TODO: Add immersion calculation\n        self.__immersion_enable_checkbox.setEnabled(False)\n\n        self.__refraction_index_label = QtGui.QLabel(\"Refractive Index:\")\n        self.__refraction_index_edit = self.edit(self.__imaging_tool.immersion)\n\n        self.__hlayout = QtGui.QHBoxLayout(self)\n        self.__hlayout.addWidget(self.__immersion_enable_checkbox)\n        self.__hlayout.addStretch()\n        self.__hlayout.addWidget(self.__refraction_index_label)\n        self.__hlayout.addWidget(self.__refraction_index_edit)\n\n        self.immersionStateChanged(self.__imaging_tool.immersion_enabled)\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def immersionStateChanged(self, immersion_enabled):\n        self.__imaging_tool.immersion_enabled = immersion_enabled\n        self.__refraction_index_label.setEnabled(immersion_enabled)\n        self.__refraction_index_edit.setEnabled(immersion_enabled)\n\n\nclass ImagingView(QStackWidgetTab):\n    def __init__(self, parent, opts, appdb):\n        \"\"\"\n        :param QtGui.QWidget parent: Widget parent\n        :param options.structures.Options opts: Current application options\n        :param ApplicationDatabase appdb: Application database object\n        \"\"\"\n        super(ImagingView, self).__init__(parent)\n\n        self.__objective_lens = ObjectiveLensBox(self, opts.imaging_tool)\n        self.__immersion = ImmersionBox(self, opts.imaging_tool)\n        self.__spectrum = SpectrumBox(self, opts.imaging_tool)\n        self.__source_shape = SourceShapeBox(self, opts.imaging_tool, appdb)\n        self.__pupil_filer = PupilFilterBox(self, opts.imaging_tool, appdb)\n\n        self.__vlayout_left = QtGui.QVBoxLayout()\n        self.__vlayout_left.addWidget(self.__spectrum)\n        self.__vlayout_left.addWidget(self.__source_shape)\n        self.__vlayout_left.addWidget(self.__immersion)\n        self.__vlayout_left.addStretch()\n\n        # self.__vlayout_middle = QtGui.QVBoxLayout()\n        # self.__vlayout_middle.addStretch()\n\n        self.__vlayout_right = QtGui.QVBoxLayout()\n        self.__vlayout_right.addWidget(self.__objective_lens)\n        self.__vlayout_right.addWidget(self.__pupil_filer)\n        self.__vlayout_right.addStretch()\n\n        self.__hlayout = QtGui.QHBoxLayout(self)\n        self.__hlayout.addLayout(self.__vlayout_left)\n        # self.__hlayout.addLayout(self.__vlayout_middle)\n        self.__hlayout.addLayout(self.__vlayout_right)\n        self.__hlayout.addStretch()\n\n    def reset(self):\n        self.__source_shape.reset()\n        self.__pupil_filer.reset()"
  },
  {
    "path": "OptolithiumGui/views/mask.py",
    "content": "#!/usr/bin/env python\r\n# -*- coding: utf-8 -*-\r\n\r\n# This file is part of Optolithium lithography modelling software.\r\n#\r\n# Copyright (C) 2015 Alexei Gladkikh\r\n#\r\n# This software is dual-licensed: you can redistribute it and/or modify\r\n# it under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version only for NON-COMMERCIAL usage.\r\n#\r\n# This program is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n#\r\n# If you are interested in other licensing models, including a commercial-\r\n# license, please contact the author at gladkikhalexei@gmail.com\r\n\r\nimport logging as module_logging\r\nimport math\r\nimport os\r\nimport tempfile\r\n\r\nfrom matplotlib.patches import Rectangle, Polygon\r\nimport subprocess\r\n\r\nfrom qt import connect, disconnect, Slot, QtGui, QtCore\r\nfrom views.common import QStackWidgetTab, QFramedLabel, msgBox, ErrorBox, \\\r\n    ParameterGroupBox, QLoadDialogFactory, QGraphPlot, QuestionBox, rgbf\r\nfrom options.common import Abstract\r\nfrom database import orm, dbparser\r\n\r\nimport helpers\r\nimport config\r\n\r\n__author__ = 'Alexei Gladkikh'\r\n\r\n\r\nlogging = module_logging.getLogger(__name__)\r\nlogging.setLevel(module_logging.DEBUG)\r\nhelpers.logStreamEnable(logging)\r\n\r\n\r\nclass MaskParametersBox(ParameterGroupBox):\r\n    def __init__(self, parent, mask=None):\r\n        \"\"\"\r\n        :type parent: QtGui.QWidget\r\n        :type mask: orm.Mask | orm.ConcretePluginMask | None\r\n        \"\"\"\r\n        super(MaskParametersBox, self).__init__(\"Mask Parameters\", parent)\r\n\r\n        self.__layout = QtGui.QVBoxLayout(self)\r\n\r\n        self.setMinimumHeight(50)\r\n\r\n        if mask is not None:\r\n            self.setObject(mask)\r\n\r\n    # noinspection PyPep8Naming\r\n    def setObject(self, mask):\r\n        \"\"\":type mask: orm.Mask | orm.ConcretePluginMask | None\"\"\"\r\n        self._add_plugin_parameters(mask, self.__layout)\r\n\r\n\r\nclass MaskCoordBox(ParameterGroupBox):\r\n\r\n    def __init__(self, parent, mask=None):\r\n        \"\"\"\r\n        :type parent: QtGui.QWidget\r\n        :type mask: orm.Mask | orm.ConcretePluginMask | None\r\n        \"\"\"\r\n        super(MaskCoordBox, self).__init__(\"Mask Coordinates\", parent)\r\n\r\n        self.__form_layout = QtGui.QGridLayout()\r\n\r\n        self.__top_label = QtGui.QLabel(\"Top (nm):\")\r\n        self.__top_label.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)\r\n        self.__left_label = QtGui.QLabel(\"Left (nm):\")\r\n        self.__bottom_label = QtGui.QLabel(\"Bottom (nm):\")\r\n        self.__bottom_label.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)\r\n        self.__right_label = QtGui.QLabel(\"Right (nm)\")\r\n\r\n        self.__top_value = self.framed_label()\r\n        self.__left_value = self.framed_label()\r\n        self.__bottom_value = self.framed_label()\r\n        self.__right_value = self.framed_label()\r\n\r\n        self.__form_layout.addWidget(self.__top_label, 0, 0, 1, 2)\r\n        self.__form_layout.addWidget(self.__left_label, 1, 0)\r\n        self.__form_layout.addWidget(self.__bottom_label, 2, 0, 1, 2)\r\n        self.__form_layout.addWidget(self.__right_label, 1, 5)\r\n\r\n        self.__form_layout.addWidget(self.__top_value, 0, 2, 1, 2)\r\n        self.__form_layout.addWidget(self.__left_value, 1, 1, 1, 2)\r\n        self.__form_layout.addWidget(self.__bottom_value, 2, 2, 1, 2)\r\n        self.__form_layout.addWidget(self.__right_value, 1, 3, 1, 2)\r\n\r\n        self.__form_layout.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)\r\n\r\n        self.__layout = QtGui.QHBoxLayout(self)\r\n        self.__layout.addLayout(self.__form_layout)\r\n\r\n        self.__mask = None\r\n        \"\"\":type: orm.Mask | orm.ConcretePluginMask | None\"\"\"\r\n\r\n        if mask is not None:\r\n            self.setObject(mask)\r\n\r\n    # noinspection PyPep8Naming\r\n    @Slot()\r\n    def updateValues(self):\r\n        [left, bottom] = self.__mask.boundary[0]\r\n        [right, top] = self.__mask.boundary[1]\r\n        if self.__mask.dimensions == 1:\r\n            if top == 0.0 and bottom == 0.0:\r\n                self.__top_value.setText(str())\r\n                self.__bottom_value.setText(str())\r\n                self.__right_value.setText(\"%.1f nm\" % right)\r\n                self.__left_value.setText(\"%.1f nm\" % left)\r\n            elif right == 0.0 and left == 0.0:\r\n                self.__top_value.setText(\"%.1f nm\" % top)\r\n                self.__bottom_value.setText(\"%.1f nm\" % bottom)\r\n                self.__right_value.setText(str())\r\n                self.__left_value.setText(str())\r\n            else:\r\n                raise RuntimeError(\"Unknown one-dimension mask direction nor X, nor Y (%.1f, %.1f, %.1f, %.1f)\" %\r\n                                   (left, bottom, right, top))\r\n\r\n        elif self.__mask.dimensions == 2:\r\n            self.__top_value.setText(\"%.1f nm\" % top)\r\n            self.__bottom_value.setText(\"%.1f nm\" % bottom)\r\n            self.__right_value.setText(\"%.1f nm\" % right)\r\n            self.__left_value.setText(\"%.1f nm\" % left)\r\n        else:\r\n            raise RuntimeError(\"Wrong mask dimensions count\")\r\n\r\n    # noinspection PyPep8Naming\r\n    def setObject(self, p_object):\r\n        \"\"\":type p_object: orm.Mask | orm.ConcretePluginMask | None\"\"\"\r\n        if self.__mask is not None:\r\n            for variable in self.__mask.variables:\r\n                disconnect(variable.signals[Abstract], self.updateValues)\r\n\r\n        self.__mask = p_object\r\n\r\n        for variable in self.__mask.variables:\r\n            connect(variable.signals[Abstract], self.updateValues)\r\n\r\n        self.updateValues()\r\n\r\n\r\nclass MaskBackgroundBox(ParameterGroupBox):\r\n\r\n    def __init__(self, parent, mask=None):\r\n        \"\"\"\r\n        :type parent: QtGui.QWidget\r\n        :type mask: orm.Mask | orm.ConcretePluginMask | None\r\n        \"\"\"\r\n        super(MaskBackgroundBox, self).__init__(\"Mask Background\", parent)\r\n\r\n        self.__mask = None\r\n        \"\"\":type: orm.Mask | orm.ConcretePluginMask | None\"\"\"\r\n\r\n        self.__hlayout = QtGui.QHBoxLayout()\r\n\r\n        self.__transmittance_label = QtGui.QLabel(\"Transmittance:\", self)\r\n        self.__transmittance_edit = self.edit()\r\n\r\n        self.__phase_label = QtGui.QLabel(\"Phase (deg):\", self)\r\n        self.__phase_edit = self.edit()\r\n\r\n        self.__hlayout.addWidget(self.__transmittance_label)\r\n        self.__hlayout.addWidget(self.__transmittance_edit)\r\n        self.__hlayout.addSpacing(20)\r\n        self.__hlayout.addWidget(self.__phase_label)\r\n        self.__hlayout.addWidget(self.__phase_edit)\r\n        self.__hlayout.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)\r\n\r\n        self.__layout = QtGui.QVBoxLayout(self)\r\n        self.__layout.addLayout(self.__hlayout)\r\n        self.__layout.addSpacing(5)\r\n\r\n        if mask is not None:\r\n            self.setObject(mask)\r\n\r\n    # noinspection PyPep8Naming\r\n    def setObject(self, p_object):\r\n        \"\"\":type p_object: orm.Mask | orm.ConcretePluginMask | None\"\"\"\r\n        if self.__mask is not None:\r\n            self.__transmittance_edit.unsetObject()\r\n            self.__phase_edit.unsetObject()\r\n\r\n        self.__mask = p_object\r\n\r\n        self.__transmittance_edit.setObject(self.__mask, orm.Mask.background)\r\n        self.__phase_edit.setObject(self.__mask, orm.Mask.phase)\r\n\r\n\r\nclass PolygonHighlighter(helpers.DisposableInterface):\r\n    def __init__(self, polygon, highlight_color=\"#FF0000\", linewidth=5.0):\r\n        \"\"\"\r\n        :type polygon: Polygon\r\n        :type highlight_color: str\r\n        \"\"\"\r\n        super(PolygonHighlighter, self).__init__()\r\n        self.polygon = polygon\r\n        self.highlight_color = highlight_color\r\n        self.linewidth = linewidth\r\n        self.highlighted = False\r\n        self.backup_color = None\r\n        self.backup_linewidth = None\r\n        self.cid = polygon.figure.canvas.mpl_connect(\"motion_notify_event\", self)\r\n\r\n    def __call__(self, event):\r\n        if event.inaxes == self.polygon.axes:\r\n            if self.polygon.contains_point([event.x, event.y]):\r\n                # Don't merge into one if - not working - highlight is blinking... I don't know why\r\n                if not self.highlighted:\r\n                    self.backup_color = self.polygon.get_edgecolor()\r\n                    self.polygon.set_edgecolor(self.highlight_color)\r\n                    self.polygon.set_linewidth(self.linewidth)\r\n                    self.highlighted = True\r\n                    self.polygon.figure.canvas.draw()\r\n            elif self.highlighted:\r\n                self.polygon.set_edgecolor(self.backup_color)\r\n                self.polygon.set_linewidth(self.backup_linewidth)\r\n                self.backup_color = None\r\n                self.backup_linewidth = None\r\n                self.highlighted = False\r\n                self.polygon.figure.canvas.draw()\r\n\r\n    def dispose(self):\r\n        self.polygon.figure.canvas.mpl_disconnect(self.cid)\r\n        self.polygon = None\r\n\r\n\r\nclass MaskPlot(QGraphPlot):\r\n\r\n    #                       0.0    ,  30.0,      90.0,     150.0,     210.0,     270.0,     330.0\r\n    phase_colormap = [\"#FFFFFF\", \"#80FFFF\", \"#FFFF80\", \"#FF80FF\", \"#80FF80\", \"#8080FF\", \"#FFFFFF\"]\r\n\r\n    @staticmethod\r\n    def _get_color(transmittance, phase):\r\n        phase_color = MaskPlot.phase_colormap[int(math.floor((phase + 30.0) / 60.0))]\r\n        rgb = rgbf(QtGui.QColor(phase_color))\r\n        return rgb[0]*transmittance, rgb[1]*transmittance, rgb[2]*transmittance\r\n\r\n    def __init__(self, parent, p_object=None):\r\n        \"\"\"\r\n        :type parent: QtGui.QWidget\r\n        :type p_object: orm.Mask | orm.ConcretePluginMask | None\r\n        \"\"\"\r\n        super(MaskPlot, self).__init__(parent)\r\n\r\n        self.setMinimumSize(200, 200)\r\n        self.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding)\r\n\r\n        self.__mask = None\r\n        \"\"\":type: orm.Mask | options.ConcretePluginMask | None\"\"\"\r\n\r\n        self._ax = self.add_subplot()\r\n\r\n        for axis in ['top', 'bottom', 'left', 'right']:\r\n            self._ax.spines[axis].set_linewidth(2)\r\n\r\n        self._highlighters = helpers.DisposableList()\r\n\r\n        if p_object is not None:\r\n            self.setObject(p_object)\r\n\r\n    # noinspection PyPep8Naming\r\n    def setObject(self, p_object):\r\n        \"\"\":type p_object: orm.Mask | orm.ConcretePluginMask | None\"\"\"\r\n\r\n        if self.__mask is not None:\r\n            for variable in self.__mask.variables:\r\n                disconnect(variable.signals[Abstract], self.__onValueChanged)\r\n            disconnect(self.__mask.signals[orm.Mask.background], self.__onValueChanged)\r\n            disconnect(self.__mask.signals[orm.Mask.phase], self.__onValueChanged)\r\n\r\n        self.__mask = p_object\r\n\r\n        for variable in self.__mask.variables:\r\n            connect(variable.signals[Abstract], self.__onValueChanged)\r\n        connect(self.__mask.signals[orm.Mask.background], self.__onValueChanged)\r\n        connect(self.__mask.signals[orm.Mask.phase], self.__onValueChanged)\r\n\r\n        self.__onValueChanged()\r\n\r\n    # noinspection PyPep8Naming\r\n    @Slot()\r\n    def __onValueChanged(self):\r\n        self.draw_graph()\r\n\r\n    def draw_graph(self):\r\n        self._highlighters.dispose()\r\n        self._ax.clear()\r\n\r\n        if self.__mask.dimensions == 2:\r\n\r\n            [left, bottom] = self.__mask.boundary[0]\r\n            [right, top] = self.__mask.boundary[1]\r\n            self._ax.set_xlim(left, right)\r\n            self._ax.set_ylim(bottom, top)\r\n\r\n            bg_color = MaskPlot._get_color(self.__mask.background, self.__mask.phase)\r\n\r\n            self._ax.add_patch(Rectangle([left, bottom], right-left, top-bottom, color=bg_color, linewidth=1.0))\r\n            for region in self.__mask.regions:\r\n                xy = [[p.x, p.y] for p in region.points]\r\n                color = MaskPlot._get_color(region.transmittance, region.phase)\r\n                polygon = Polygon(xy, facecolor=color, edgecolor=color, linewidth=1.0)\r\n                self._ax.add_patch(polygon)\r\n                self._highlighters.append(PolygonHighlighter(polygon))\r\n\r\n            self._ax.set_aspect('equal')\r\n\r\n        elif self.__mask.dimensions == 1:\r\n            # TODO: Take into account Y-direction mask\r\n\r\n            [left, _] = self.__mask.boundary[0]\r\n            [right, _] = self.__mask.boundary[1]\r\n            self._ax.set_xlim(left, right)\r\n            self._ax.set_ylim(-1.0, 1.0)\r\n\r\n            bg_color = MaskPlot._get_color(self.__mask.background, self.__mask.phase)\r\n\r\n            self._ax.add_patch(Rectangle([left, -1.0], right-left, 2.0, color=bg_color, linewidth=1.0))\r\n            for region in self.__mask.regions:\r\n                xy = [[region.points[0].x, -1.0], [region.points[0].x, 1.0],\r\n                      [region.points[1].x, 1.0], [region.points[1].x, -1.0]]\r\n                color = MaskPlot._get_color(region.transmittance, region.phase)\r\n                self._ax.add_patch(Polygon(xy, color=color))\r\n\r\n            self._ax.set_aspect('auto')\r\n\r\n        else:\r\n\r\n            raise RuntimeError(\"Wrong mask dimensions count\")\r\n\r\n        self.redraw()\r\n\r\n\r\nLoadMaskDialog = QLoadDialogFactory(orm.Mask, orm.AbstractPluginMask, MaskPlot)\r\n\r\n\r\nclass MaskView(QStackWidgetTab):\r\n    def __init__(self, parent, opts, appdb):\r\n        \"\"\"\r\n        :param QtGui.QWidget parent: Widget parent\r\n        :param options.structures.Options opts: Current application options\r\n        :param ApplicationDatabase appdb: Application database object\r\n        \"\"\"\r\n        super(MaskView, self).__init__(parent)\r\n\r\n        self.__mask = opts.mask\r\n        self.__appdb = appdb\r\n\r\n        self.__load_mask_dlg = LoadMaskDialog(self, appdb)\r\n\r\n        self.__header_prms_hlay = QtGui.QHBoxLayout()\r\n        self.__load_button = QtGui.QPushButton(\"Load Mask...\")\r\n        self.__edit_button = QtGui.QPushButton(\"Edit Mask...\")\r\n        self.__save_button = QtGui.QPushButton(\"Save Mask to Database\")\r\n\r\n        connect(self.__load_button.pressed, self._load_mask)\r\n        connect(self.__edit_button.pressed, self._edit_mask)\r\n        connect(self.__save_button.pressed, self._save_mask)\r\n\r\n        self.__header_prms_hlay.addWidget(self.__load_button)\r\n        self.__header_prms_hlay.addWidget(self.__edit_button)\r\n        self.__header_prms_hlay.addWidget(self.__save_button)\r\n        self.__header_prms_hlay.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)\r\n\r\n        self.__label = QtGui.QLabel(\"Mask Type:\")\r\n        self.__type_label = QFramedLabel(self)\r\n\r\n        self.__hlayout_type = QtGui.QHBoxLayout()\r\n        self.__hlayout_type.addWidget(self.__label)\r\n        self.__hlayout_type.addWidget(self.__type_label)\r\n        self.__hlayout_type.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)\r\n\r\n        self.__parameters = MaskParametersBox(self)\r\n        self.__coordinates = MaskCoordBox(self)\r\n        self.__background = MaskBackgroundBox(self)\r\n\r\n        self.__parameters_vlay = QtGui.QVBoxLayout()\r\n        self.__parameters_vlay.addLayout(self.__header_prms_hlay)\r\n        self.__parameters_vlay.addLayout(self.__hlayout_type)\r\n        self.__parameters_vlay.addWidget(self.__parameters)\r\n        self.__parameters_vlay.addSpacing(20)\r\n        self.__parameters_vlay.addWidget(self.__coordinates)\r\n        self.__parameters_vlay.addWidget(self.__background)\r\n        self.__parameters_vlay.addStretch()\r\n\r\n        self.__header_plot_hlay = QtGui.QHBoxLayout()\r\n        self.__name_label = QtGui.QLabel(\"Name:\")\r\n        self.__name_edit = QtGui.QLineEdit()\r\n        self.__name_edit.setFixedWidth(400)\r\n        self.__header_plot_hlay.addWidget(self.__name_label)\r\n        self.__header_plot_hlay.addWidget(self.__name_edit)\r\n        self.__transmit_comment_label = QtGui.QLabel(\r\n            \"Black = 0% transmittance\\n\"\r\n            \"White = 100% transmittance\")\r\n        self.__header_plot_hlay.addStretch()\r\n\r\n        self.__mask_plot = MaskPlot(self)\r\n\r\n        self.__plot_vlay = QtGui.QVBoxLayout()\r\n        self.__plot_vlay.addLayout(self.__header_plot_hlay)\r\n        self.__plot_vlay.addWidget(self.__transmit_comment_label)\r\n        self.__plot_vlay.addSpacing(20)\r\n        self.__plot_vlay.addWidget(self.__mask_plot)\r\n\r\n        self.__hlay = QtGui.QHBoxLayout(self)\r\n        self.__hlay.addLayout(self.__parameters_vlay)\r\n        self.__hlay.addSpacing(20)\r\n        self.__hlay.addLayout(self.__plot_vlay)\r\n\r\n        self.__hlay.setStretchFactor(self.__parameters_vlay, 0.0)\r\n        self.__hlay.setStretchFactor(self.__plot_vlay, 2.0)\r\n\r\n        self.setObject(self.__mask.container)\r\n\r\n    # noinspection PyPep8Naming\r\n    def setObject(self, mask):\r\n        \"\"\":rtype: orm.ConcretePluginMask | orm.Mask\"\"\"\r\n        self.__mask.container = mask\r\n        edit_save_enabled = isinstance(mask, orm.Mask)\r\n        self.__edit_button.setEnabled(edit_save_enabled)\r\n        self.__save_button.setEnabled(edit_save_enabled)\r\n        self.__name_edit.setText(self.__mask.container.name)\r\n        self.__type_label.setText(\"%dD\" % self.__mask.container.dimensions)\r\n        self.__mask_plot.setObject(self.__mask.container)\r\n        self.__parameters.setObject(self.__mask.container)\r\n        self.__coordinates.setObject(self.__mask.container)\r\n        self.__background.setObject(self.__mask.container)\r\n\r\n    @Slot()\r\n    def _load_mask(self):\r\n        if self.__load_mask_dlg.exec_():\r\n            mask = self.__load_mask_dlg.object\r\n            logging.info(\"Load mask: %s [%s]\" % (mask.name, type(mask).__name__))\r\n            self.setObject(mask)\r\n\r\n    @Slot()\r\n    def _edit_mask(self):\r\n        tmp = tempfile.NamedTemporaryFile(delete=False, suffix=\".gds2\")\r\n        is_ok = self.__mask.container.gds(tmp)\r\n        tmp.close()\r\n\r\n        if not is_ok:\r\n            ErrorBox(self, \"Can't covert to GDSII format current layout using this mapping file\")\r\n            os.unlink(tmp.name)\r\n            return\r\n\r\n        try:\r\n            subprocess.call([config.KLAYOUT_PATH, \"-e\", \"%s\" % tmp.name])\r\n        except OSError as error:\r\n            if error.errno == 2:\r\n                ErrorBox(self, \"KLayout editor can't be found. Please download it if you wish to edit the layout.\")\r\n        else:\r\n            p_object = dbparser.LayoutParser().parse(tmp.name)\r\n            self.setObject(p_object)\r\n        finally:\r\n            os.unlink(tmp.name)\r\n\r\n    @Slot()\r\n    def _save_mask(self):\r\n        mask_name = self.__name_edit.text()\r\n        try:\r\n            mask = self.__appdb[orm.Mask].filter(orm.Mask.name == mask_name).one()\r\n            \"\"\":type: orm.Mask\"\"\"\r\n        except orm.NoResultFound:\r\n            self.__mask.container.name = mask_name\r\n            self.__appdb.add(self.__mask.container.clone())\r\n        else:\r\n            replay = QuestionBox(self, \"%s \\\"%s\\\" already existed, replace it?\" % (mask.identifier, mask.name))\r\n            if replay == msgBox.Yes:\r\n                mask.container.assign(self.__mask.container)\r\n                self.__appdb.commit()\r\n\r\n    def reset(self):\r\n        self.setObject(self.__mask.container)"
  },
  {
    "path": "OptolithiumGui/views/metrology.py",
    "content": "# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nfrom qt import QtGui\nfrom views.common import QStackWidgetTab, QLineEditNumeric, QComboBoxEnum\n\n\n__author__ = 'Alexei Gladkikh'\n\n\nclass _MetrologyBoxBase(QtGui.QGroupBox):\n\n    def _add_edit(self, p_object, _class=QLineEditNumeric):\n        layout = QtGui.QHBoxLayout()\n        layout.addWidget(QtGui.QLabel(p_object.name + \": \"))\n        edit = _class(self, p_object)\n        layout.addStretch()\n        layout.addWidget(edit)\n        self._layout.addLayout(layout)\n        return edit\n\n\nclass LevelsBox(_MetrologyBoxBase):\n\n    def __init__(self, parent, metrology):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type metrology: options.structures.Metrology\n        \"\"\"\n        super(LevelsBox, self).__init__(\"Levels\", parent)\n        self._metrology = metrology\n        self._layout = QtGui.QVBoxLayout(self)\n        self._edits = [\n            self._add_edit(self._metrology.aerial_image_level),\n            self._add_edit(self._metrology.image_in_resist_level),\n            self._add_edit(self._metrology.latent_image_level),\n            self._add_edit(self._metrology.peb_latent_image_level),\n        ]\n\n\nclass MiscBox(_MetrologyBoxBase):\n\n    def __init__(self, parent, metrology):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type metrology: options.structures.Metrology\n        \"\"\"\n        super(MiscBox, self).__init__(\"Miscellaneous\", parent)\n        self._metrology = metrology\n        self._layout = QtGui.QVBoxLayout(self)\n        self._edits = [\n            self._add_edit(self._metrology.mask_tonality, _class=QComboBoxEnum),\n            self._add_edit(self._metrology.measurement_height),\n            self._add_edit(self._metrology.variate_meas_height, _class=QComboBoxEnum),\n            self._add_edit(self._metrology.cd_bias),\n        ]\n\n\nclass MetrologyView(QStackWidgetTab):\n\n    def __init__(self, parent, options):\n        \"\"\"\n        :param QtGui.QWidget parent: Widget parent\n        :param options.structures.Options options: Program options\n        \"\"\"\n        QStackWidgetTab.__init__(self, parent)\n\n        self.__options = options\n\n        self.__vlayout = QtGui.QVBoxLayout()\n\n        self.__levels_box = LevelsBox(self, self.__options.metrology)\n        self.__misc_box = MiscBox(self, self.__options.metrology)\n\n        self.__vlayout.addWidget(self.__levels_box)\n        self.__vlayout.addWidget(self.__misc_box)\n        self.__vlayout.addStretch()\n\n        self.__hlayout = QtGui.QHBoxLayout(self)\n        self.__hlayout.addLayout(self.__vlayout)\n        self.__hlayout.addStretch()"
  },
  {
    "path": "OptolithiumGui/views/numerics.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport logging as module_logging\nimport psutil\n\nfrom qt import QtGui, QtCore, connect, Slot\nfrom views.common import QStackWidgetTab, QFramedLabel, QSliderNumeric, QLineEditNumeric, QComboBoxEnum\n\nfrom config import MEGABYTE\nfrom options.structures import Abstract, Numeric, Variable\n\nimport config\nimport helpers\n\n\n__author__ = 'Alexei Gladkikh'\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.INFO)\nhelpers.logStreamEnable(logging)\n\n\nclass SourceGridView(QtGui.QGroupBox):\n    def __init__(self, numerics, parent):\n        \"\"\"\n        :param options.Numerics numerics: Programs options\n        :param QtGui.QWidget parent: View parent\n        \"\"\"\n        QtGui.QGroupBox.__init__(self, \"Source Grid\", parent)\n        self._slow_label = QtGui.QLabel(\"Slower,\\nMore Accurate\")\n        self._slow_label.setAlignment(QtCore.Qt.AlignCenter)\n        self._fast_label = QtGui.QLabel(\"Faster,\\nLess Accurate\")\n        self._fast_label.setAlignment(QtCore.Qt.AlignCenter)\n        self._factor_label = QtGui.QLabel(\"Speed Factor\")\n        self._factor_label_slider = QFramedLabel(self, numerics.speed_factor)\n        self._factor_slider = QSliderNumeric(self, numerics.speed_factor, orientation=QtCore.Qt.Horizontal)\n        self._grid_layout = QtGui.QGridLayout(self)\n        self._grid_layout.addWidget(self._slow_label, 0, 2, 1, 2)\n        self._grid_layout.addWidget(self._fast_label, 0, 8, 1, 2)\n        self._grid_layout.addWidget(self._factor_label, 1, 1)\n        self._grid_layout.addWidget(self._factor_label_slider, 1, 2)\n        self._grid_layout.addWidget(self._factor_slider, 1, 3, 1, 8)\n\n\nclass TargetGridView(QtGui.QGroupBox):\n    def __init__(self, numerics, parent):\n        \"\"\"\n        :param options.Numerics numerics: Programs options\n        :param QtGui.QWidget parent: View parent\n        \"\"\"\n        QtGui.QGroupBox.__init__(self, \"Target Grid Sizes\", parent)\n\n        self._xy_edit = QLineEditNumeric(self, numerics.grid_xy)\n        self._xy_edit.setMaximumWidth(60)\n        self._xy_edit.setAlignment(QtCore.Qt.AlignRight)\n        self._z_edit = QLineEditNumeric(self, numerics.grid_z)\n        self._z_edit.setMaximumWidth(60)\n        self._z_edit.setAlignment(QtCore.Qt.AlignRight)\n        self.__form_layout = QtGui.QFormLayout(self)\n        self.__form_layout.addRow(\"X/Y (nm):\", self._xy_edit)\n        self.__form_layout.addRow(\"Z (nm):\", self._z_edit)\n\n\nclass SystemMemoryView(QtGui.QGroupBox):\n\n    double_precision = 8\n    stages_count = 4\n\n    class GridLayout(QtGui.QGridLayout):\n        def __init__(self, *args, **kwargs):\n            super(SystemMemoryView.GridLayout, self).__init__(*args, **kwargs)\n            self.__current_row = 0\n\n        # noinspection PyPep8Naming\n        def addRow(self, name, widget):\n            self.addWidget(QtGui.QLabel(name), self.__current_row, 0)\n            self.addWidget(widget, self.__current_row, 1)\n            self.__current_row += 1\n\n    def __init__(self, numerics, mask, resist, parent):\n        \"\"\"\n        :param options.structures.Numerics numerics: Mask steps and source steps\n        :param options.structures.Mask mask: Mask required to get X/Y dimensions to calculate memory consumption\n        :param options.structures.Resist resist: Resist required to get thickness for Z direction\n        :param QtGui.QWidget parent: View parent\n        \"\"\"\n        fmt = QFramedLabel.memory_format\n\n        QtGui.QGroupBox.__init__(self, \"System memory state\", parent)\n\n        self.__mask = mask\n        self.__resist = resist\n        self.__numerics = numerics\n\n        connect(self.__numerics.grid_xy.signals[Abstract], self.__grid_updated)\n        connect(self.__numerics.grid_z.signals[Abstract], self.__grid_updated)\n        connect(self.__numerics.speed_factor.signals[Abstract], self.__speed_factor_updated)\n\n        usage = psutil.phymem_usage()\n        mem_ai_required = self.__calc_required_memory_ai()\n        mem_3d_required = self.__calc_required_memory_3d()\n        self.__mem_used = Variable(Numeric(dtype=float), value=float(usage.used), name=\"UsedMemory\")\n        self.__mem_free = Variable(Numeric(dtype=float), value=float(usage.free), name=\"FreeMemory\")\n        self.__mem_total = Variable(Numeric(dtype=float), value=float(usage.total), name=\"TotalMemory\")\n        self.__mem_ai_required = Variable(Numeric(dtype=float), value=mem_ai_required, name=\"RequiredAIMemory\")\n        self.__mem_3d_required = Variable(Numeric(dtype=float), value=mem_3d_required, name=\"Required3DMemory\")\n\n        self.__source_shape_grid = Variable(\n            Numeric(dtype=float), value=float(numerics.source_stepxy), name=\"SourceShapeGrid\")\n\n        self.__info_layout = SystemMemoryView.GridLayout()\n        self.__info_layout.addRow(\"Virtual memory used:\", QFramedLabel(self, self.__mem_used, frmt=fmt))\n        self.__info_layout.addRow(\"Memory available:\", QFramedLabel(self, self.__mem_free, frmt=fmt))\n        self.__info_layout.addRow(\"Memory total:\", QFramedLabel(self, self.__mem_total, frmt=fmt))\n        self.__info_layout.addRow(\"Aerial image memory req.:\", QFramedLabel(self, self.__mem_ai_required, frmt=fmt))\n        self.__info_layout.addRow(\"Resist 2D/3D memory req.:\", QFramedLabel(self, self.__mem_3d_required, frmt=fmt))\n        self.__info_layout.addRow(\"Source shape grid:\", QFramedLabel(self, self.__source_shape_grid, frmt=\"%.03f um\"))\n\n        self.__layout = QtGui.QVBoxLayout(self)\n        self.__layout.addLayout(self.__info_layout)\n        self.__layout.addStretch()\n\n        self.__mem_update_timer = QtCore.QTimer(self)\n        connect(self.__mem_update_timer.timeout, self.__update_memory)\n        self.__mem_update_timer.start(config.Configuration.memory_update_interval)\n\n        self.__grid_updated()\n\n    # noinspection PyPep8Naming\n    def setObject(self, options):\n        self.__mask = options.mask\n        self.__resist = options.wafer_process.resist\n        self.__grid_updated()\n\n    @Slot()\n    def __speed_factor_updated(self):\n        self.__source_shape_grid.value = self.__numerics.source_stepxy\n\n    @Slot()\n    def __grid_updated(self):\n        self.__update_memory()\n        self.__mem_ai_required.value = self.__calc_required_memory_ai()\n        self.__mem_3d_required.value = self.__calc_required_memory_3d()\n\n    def __calc_required_memory_ai(self):\n        # return 8 * (1000.0/self.__numerics.grid_xy.value)**2 * (1000.0/self.__numerics.grid_z.value)\n        sizes = self.__mask.container.boundary[1] - self.__mask.container.boundary[0]\n\n        vx = (sizes.x / self.__numerics.grid_xy.value + 1.0) if sizes.x != 0.0 else 1.0\n        vy = (sizes.y / self.__numerics.grid_xy.value + 1.0) if sizes.y != 0.0 else 1.0\n\n        return self.double_precision * vx * vy\n\n    def __calc_required_memory_3d(self):\n        # return 8 * (1000.0/self.__numerics.grid_xy.value)**2 * (1000.0/self.__numerics.grid_z.value)\n        vz = self.__resist.thickness / self.__numerics.grid_z.value + 1.0\n        return self.stages_count * self.__calc_required_memory_ai() * vz\n\n    @Slot()\n    def __update_memory(self):\n        usage = psutil.virtual_memory()\n        self.__mem_used.value = float(usage.used)\n        self.__mem_free.value = float(usage.available)\n        self.__mem_total.value = float(usage.total)\n\n\nclass NumericsView(QStackWidgetTab):\n\n    def __init__(self, parent, options):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :param options.structures.Options options: Programs options\n        \"\"\"\n        QStackWidgetTab.__init__(self, parent)\n\n        self.__options = options\n\n        self.__calc_mode_combobox = QComboBoxEnum(self, self.__options.numerics.calculation_model)\n        # TODO: Add vector model\n        self.__calc_mode_combobox.setEnabled(False)\n\n        self.__form_layout = QtGui.QFormLayout()\n        self.__form_layout.addRow(\"Image calculation mode:\", self.__calc_mode_combobox)\n\n        self.__source_grid_groupbox = SourceGridView(self.__options.numerics, self)\n        self.__target_grid_groupbox = TargetGridView(self.__options.numerics, self)\n        self.__system_memory_groupbox = SystemMemoryView(\n            self.__options.numerics, self.__options.mask, self.__options.wafer_process.resist, self)\n\n        self.__grid_layout = QtGui.QGridLayout()\n        self.__grid_layout.addLayout(self.__form_layout, 0, 0)\n        self.__grid_layout.addWidget(self.__source_grid_groupbox, 1, 0)\n        self.__grid_layout.addWidget(self.__target_grid_groupbox, 2, 0)\n        self.__grid_layout.addWidget(self.__system_memory_groupbox, 1, 1, 2, 1)\n\n        self.setUnstretchable(self.__grid_layout)\n\n    def onSetActive(self):\n        self.__system_memory_groupbox.setObject(self.__options)\n\n    def reset(self):\n        self.__system_memory_groupbox.setObject(self.__options)"
  },
  {
    "path": "OptolithiumGui/views/peb.py",
    "content": "#!/usr/bin/env python\r\n# -*- coding: utf-8 -*-\r\n\r\n# This file is part of Optolithium lithography modelling software.\r\n#\r\n# Copyright (C) 2015 Alexei Gladkikh\r\n#\r\n# This software is dual-licensed: you can redistribute it and/or modify\r\n# it under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version only for NON-COMMERCIAL usage.\r\n#\r\n# This program is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n#\r\n# If you are interested in other licensing models, including a commercial-\r\n# license, please contact the author at gladkikhalexei@gmail.com\r\n\r\nimport logging as module_logging\r\n\r\nfrom qt import connect, disconnect, Slot, QtGui\r\nfrom views.common import QStackWidgetTab, QLabel, QLineEditNumeric, QGraphPlot\r\nfrom database import orm\r\nfrom options import Abstract\r\nfrom resources import Resources\r\n\r\nimport config\r\nimport helpers\r\n\r\n\r\n__author__ = 'Alexei Gladkikh'\r\n\r\n\r\nlogging = module_logging.getLogger(__name__)\r\nlogging.setLevel(module_logging.DEBUG)\r\nhelpers.logStreamEnable(logging)\r\n\r\n\r\nclass TemperatureProfileGraph(QGraphPlot):\r\n\r\n    def __init__(self, parent, peb=None):\r\n        \"\"\"\r\n        :type parent: QtGui.QWidget\r\n        :type peb: options.PostExposureBake\r\n        \"\"\"\r\n        super(TemperatureProfileGraph, self).__init__(parent, 420, 315)\r\n\r\n        self._ax = self.add_subplot()\r\n\r\n        self.__peb = None\r\n\r\n        if peb is not None:\r\n            self.setObject(peb)\r\n\r\n    # noinspection PyPep8Naming\r\n    def setObject(self, p_object):\r\n        if self.__peb is not None:\r\n            disconnect(self.__peb.time.signals[Abstract], self.__onValueChanged)\r\n            disconnect(self.__peb.temp.signals[Abstract], self.__onValueChanged)\r\n\r\n        self.__peb = p_object\r\n\r\n        connect(self.__peb.time.signals[Abstract], self.__onValueChanged)\r\n        connect(self.__peb.temp.signals[Abstract], self.__onValueChanged)\r\n\r\n        self.__onValueChanged()\r\n\r\n    # noinspection PyPep8Naming\r\n    @Slot()\r\n    def __onValueChanged(self):\r\n        self.draw_graph(self.__peb.time.value, self.__peb.temp.value)\r\n\r\n    def draw_graph(self, time, temp):\r\n        \"\"\"\r\n        :type time: float\r\n        :type temp: float\r\n        \"\"\"\r\n        self._ax.clear()\r\n\r\n        self._ax.plot([0.0, time], [temp, temp], \"r-\")\r\n        self._ax.set_xlabel(\"Time (sec)\")\r\n        self._ax.set_ylabel(\"Temperature (degree C)\")\r\n\r\n        self._ax.patch.set_alpha(0.0)\r\n\r\n        self.redraw()\r\n\r\n\r\nclass TemperatureProfileBox(QtGui.QGroupBox):\r\n\r\n    def __init__(self, parent, peb, resist):\r\n        \"\"\"\r\n        :type parent: QtGui.QWidget\r\n        :type peb: options.PostExposureBake\r\n        :type resist: options.structures.Resist\r\n        \"\"\"\r\n        super(TemperatureProfileBox, self).__init__(\"Post Exposure Bake (PEB) Temperature Profile\", parent)\r\n\r\n        self.__resist = None\r\n        self.__peb = None\r\n\r\n        self.__hlayout_resist = QtGui.QHBoxLayout()\r\n        self.__resist_icon = QtGui.QLabel()\r\n        self.__resist_icon.setFixedSize(24, 24)\r\n        self.__resist_icon.setPixmap(QtGui.QPixmap(Resources(orm.Resist.icon, \"path\")))\r\n        self.__resist_name = QLabel(self)\r\n        self.__hlayout_resist.addWidget(self.__resist_icon)\r\n        self.__hlayout_resist.addWidget(self.__resist_name)\r\n        self.__hlayout_resist.addStretch()\r\n\r\n        self.__diffusion_length = QtGui.QLabel(self)\r\n        self.__profile_graph = TemperatureProfileGraph(self)\r\n\r\n        self.__layout = QtGui.QVBoxLayout(self)\r\n\r\n        self.__layout.addLayout(self.__hlayout_resist)\r\n        self.__layout.addWidget(self.__diffusion_length)\r\n        self.__layout.addWidget(self.__profile_graph)\r\n        self.__layout.addStretch()\r\n\r\n        self.setPeb(peb)\r\n        self.setResist(resist)\r\n\r\n    # noinspection PyPep8Naming\r\n    def setResist(self, resist):\r\n        \"\"\":type resist: options.structures.Resist\"\"\"\r\n        if self.__resist is not None:\r\n            disconnect(self.__resist.peb.signals[orm.PebParameters.ln_ar], self.__onValueChanged)\r\n            disconnect(self.__resist.peb.signals[orm.PebParameters.ea], self.__onValueChanged)\r\n\r\n        self.__resist = resist\r\n        self.__resist_name.setObject(self.__resist.db, orm.Resist.name)\r\n\r\n        connect(self.__resist.peb.signals[orm.PebParameters.ln_ar], self.__onValueChanged)\r\n        connect(self.__resist.peb.signals[orm.PebParameters.ea], self.__onValueChanged)\r\n\r\n        self.__onValueChanged()\r\n\r\n    # noinspection PyPep8Naming\r\n    def setPeb(self, peb):\r\n        if self.__peb is not None:\r\n            disconnect(self.__peb.time.signals[Abstract], self.__onValueChanged)\r\n            disconnect(self.__peb.temp.signals[Abstract], self.__onValueChanged)\r\n\r\n        self.__peb = peb\r\n        self.__profile_graph.setObject(peb)\r\n\r\n        connect(self.__peb.time.signals[Abstract], self.__onValueChanged)\r\n        connect(self.__peb.temp.signals[Abstract], self.__onValueChanged)\r\n\r\n        self.__onValueChanged()\r\n\r\n    # noinspection PyPep8Naming\r\n    @Slot()\r\n    def __onValueChanged(self):\r\n        if self.__resist is not None:\r\n            self.__diffusion_length.setText(\r\n                \"PAC Diffusion Length (nm): %.1f\" %\r\n                self.__resist.peb.diffusion_length(self.__peb.temp.value, self.__peb.time.value))\r\n\r\n\r\nclass ParametersBox(QtGui.QGroupBox):\r\n\r\n    def edit(self, p_object):\r\n        result = QLineEditNumeric(self, p_object)\r\n        result.setFixedWidth(config.DEFAULT_EDIT_WIDTH)\r\n        return result\r\n\r\n    def __init__(self, parent, peb):\r\n        \"\"\"\r\n        :type parent: QtGui.QWidget\r\n        :type peb: options.PostExposureBake\r\n        \"\"\"\r\n        super(ParametersBox, self).__init__(\"Temperature profile parameters\", parent)\r\n\r\n        self.__hlayout_control = QtGui.QHBoxLayout()\r\n        self.__load_button = QtGui.QPushButton(\"Load...\", self)\r\n        self.__load_button.setEnabled(False)\r\n        self.__save_button = QtGui.QPushButton(\"Save to Database\", self)\r\n        self.__save_button.setEnabled(False)\r\n        self.__hlayout_control.addWidget(self.__load_button)\r\n        self.__hlayout_control.addWidget(self.__save_button)\r\n        self.__hlayout_control.addStretch()\r\n\r\n        self.__hlayout_name = QtGui.QHBoxLayout()\r\n        self.__hlayout_name.addWidget(QtGui.QLabel(\"Model name:\"))\r\n        self.__model_edit = QtGui.QLineEdit(\"Ideal Model\")\r\n        self.__model_edit.setEnabled(False)\r\n        self.__hlayout_name.addWidget(self.__model_edit)\r\n\r\n        self.__form_layout = QtGui.QFormLayout()\r\n        self.__form_layout.addRow(\"Temperature (C):\", self.edit(peb.temp))\r\n        self.__form_layout.addRow(\"Duration (sec):\", self.edit(peb.time))\r\n\r\n        self.__layout = QtGui.QVBoxLayout(self)\r\n        self.__layout.addLayout(self.__hlayout_control)\r\n        self.__layout.addLayout(self.__hlayout_name)\r\n        self.__layout.addSpacing(30)\r\n        self.__layout.addLayout(self.__form_layout)\r\n        self.__layout.addStretch()\r\n\r\n        self.setFixedWidth(350)\r\n\r\n\r\nclass PostExposureBakeView(QStackWidgetTab):\r\n    def __init__(self, parent, opts):\r\n        \"\"\"\r\n        :param QtGui.QWidget parent: Widget parent\r\n        :param options.Options opts: Current application options\r\n        \"\"\"\r\n        super(PostExposureBakeView, self).__init__(parent)\r\n\r\n        self.__options = opts\r\n\r\n        self.__parameters = ParametersBox(self, opts.peb)\r\n        self.__profile = TemperatureProfileBox(self, opts.peb, opts.wafer_process.resist)\r\n\r\n        self.__hlay = QtGui.QHBoxLayout()\r\n        self.__hlay.addWidget(self.__parameters)\r\n        self.__hlay.addWidget(self.__profile)\r\n        self.__hlay.addStretch()\r\n\r\n        self.__vlay = QtGui.QVBoxLayout(self)\r\n        self.__vlay.addLayout(self.__hlay)\r\n        self.__vlay.addStretch()\r\n\r\n    def reset(self):\r\n        self.__profile.setPeb(self.__options.peb)\r\n        self.__profile.setResist(self.__options.wafer_process.resist)\r\n"
  },
  {
    "path": "OptolithiumGui/views/resist.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport logging as module_logging\n\nfrom qt import QtGui, QtCore, connect, disconnect, Slot\nfrom database import orm\nfrom database.common import ApplicationDatabase\nfrom views.common import QStackWidgetTab, QLineEditNumeric, QGraphPlot, QLabel, QuestionBox, ErrorBox, msgBox\nfrom views.development import DevelopmentGraph\nfrom options import structures\n\nimport config\nimport helpers\n\n\n__author__ = 'Alexei Gladkikh'\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.DEBUG)\nhelpers.logStreamEnable(logging)\n\n\nclass AbstractResistInfoBox(QtGui.QGroupBox):\n\n    def __init__(self, title, parent):\n        QtGui.QGroupBox.__init__(self, title, parent)\n\n    # noinspection PyPep8Naming\n    def setObject(self, resist):\n        pass\n\n\nclass AbstractResistTab(QStackWidgetTab):\n\n    def __init__(self, parent):\n        \"\"\":type parent: QtGui.QWidget\"\"\"\n        # FIXME: Add parent to QStackWidgetTab\n        QStackWidgetTab.__init__(self, parent)\n\n    # noinspection PyPep8Naming\n    def setObject(self, resist):\n        pass\n\n    def update_view(self):\n        pass\n\n\nclass AbstractResistInfoTab(AbstractResistTab):\n\n    class General(AbstractResistInfoBox):\n        def __init__(self, parent):\n            AbstractResistInfoBox.__init__(self, \"General\", parent)\n\n            self.__general_layout = QtGui.QFormLayout(self)\n\n            self.__name = QLabel(self)\n            self.__wavelength = QLabel(self, frmt=\"%s <i>nm</i>\")\n            self.__refractive = QLabel(self)\n\n            self.__general_layout.addRow(\"Name:\", self.__name)\n            self.__general_layout.addRow(\"Wavelength:\", self.__wavelength)\n            self.__general_layout.addRow(\"Refractive index:\", self.__refractive)\n\n        # noinspection PyPep8Naming\n        def setObject(self, resist):\n            \"\"\":type resist: options.structures.Resist\"\"\"\n            # logging.debug(\"Set resist: %s\" % resist)\n            p_object = resist if isinstance(resist, orm.Resist) else resist.db\n            self.__name.setObject(p_object, orm.Resist.name)\n            self.__wavelength.setObject(resist.exposure, orm.ExposureParameters.wavelength)\n            self.__refractive.setObject(resist.exposure, orm.ExposureParameters.n)\n\n    class Exposure(AbstractResistInfoBox):\n        def __init__(self, parent):\n            AbstractResistInfoBox.__init__(self, \"Exposure\", parent)\n\n            self.__lnar = QLabel(self, frmt=\"%s <i>nm2/s</i>\")\n            self.__ea = QLabel(self, frmt=\"%s <i>kcal/mole</i>\")\n\n            self.__dill_a = QLabel(self, frmt=\"%s <i>1/um</i>\")\n            self.__dill_b = QLabel(self, frmt=\"%s <i>1/um</i>\")\n            self.__dill_c = QLabel(self, frmt=\"%s <i>cm2/mJ</i>\")\n\n            self.__exposure_layout = QtGui.QFormLayout(self)\n\n            self.__exposure_layout.addRow(\"Ln(Ar):\", self.__lnar)\n            self.__exposure_layout.addRow(\"Ea:\", self.__ea)\n\n            self.__exposure_layout.addRow(\"Dill A:\", self.__dill_a)\n            self.__exposure_layout.addRow(\"Dill B:\", self.__dill_b)\n            self.__exposure_layout.addRow(\"Dill C:\", self.__dill_c)\n\n        # noinspection PyPep8Naming\n        def setObject(self, resist):\n            \"\"\":type resist: options.structures.Resist\"\"\"\n            # TODO: Add minimum and maximum\n            self.__lnar.setObject(resist.peb, orm.PebParameters.ln_ar)\n            self.__ea.setObject(resist.peb, orm.PebParameters.ea)\n\n            self.__dill_a.setObject(resist.exposure, orm.ExposureParameters.a)\n            self.__dill_b.setObject(resist.exposure, orm.ExposureParameters.b)\n            self.__dill_c.setObject(resist.exposure, orm.ExposureParameters.c)\n\n    class Development(AbstractResistInfoBox):\n        def __init__(self, parent):\n            AbstractResistInfoBox.__init__(self, \"Development\", parent)\n\n            self.__label_model_name = QLabel(self)\n            self.__dev_layout = QtGui.QFormLayout(self)\n            self.__dev_layout.addRow(\"Model:\", self.__label_model_name)\n\n        # noinspection PyPep8Naming\n        def setObject(self, resist):\n            \"\"\":type resist: options.structures.Resist\"\"\"\n            # name = resist.developer.name if resist.developer is not None else str()\n            # self.__label_model_name.setText(name)\n            p_object = resist if isinstance(resist, orm.Resist) else resist.db\n            self.__label_model_name.setObject(p_object, orm.Resist.developer)\n\n    def __init__(self, parent):\n        \"\"\":type parent: QtGui.QWidget\"\"\"\n        AbstractResistTab.__init__(self, parent)\n\n        self._hlayout = QtGui.QHBoxLayout()\n\n        self.__info_boxes = dict()\n        \"\"\":type: dict from str to AbstractResistInfoBox\"\"\"\n\n        self.__info_boxes[\"general\"] = AbstractResistInfoTab.General(self)\n        self.__info_boxes[\"exposure\"] = AbstractResistInfoTab.Exposure(self)\n        self.__info_boxes[\"development\"] = AbstractResistInfoTab.Development(self)\n\n        self.__info_layout = QtGui.QVBoxLayout()\n        self.__info_layout.addWidget(self.__info_boxes[\"general\"])\n        self.__info_layout.addWidget(self.__info_boxes[\"exposure\"])\n        self.__info_layout.addWidget(self.__info_boxes[\"development\"])\n        self.__info_layout.addStretch()\n\n        self._hlayout.addLayout(self.__info_layout)\n\n        self.__vlayout = QtGui.QVBoxLayout(self)\n        self.__vlayout.addLayout(self._hlayout)\n        self.__vlayout.addStretch()\n\n    def setObject(self, resist):\n        \"\"\":type resist: options.structures.Resist\"\"\"\n        for info_box in self.__info_boxes.values():\n            info_box.setObject(resist)\n\n\nclass ResistInfoTab(AbstractResistInfoTab):\n    def __init__(self, parent):\n        AbstractResistInfoTab.__init__(self, parent)\n        self.__comment_group = QtGui.QGroupBox(\"Comments\", self)\n        self.__comment_group_layout = QtGui.QVBoxLayout(self.__comment_group)\n        self.__comment_edit = QtGui.QTextEdit(self.__comment_group)\n        self.__comment_group_layout.addWidget(self.__comment_edit)\n        self.__comment_layout = QtGui.QVBoxLayout()\n        self.__comment_layout.addWidget(self.__comment_group)\n        self._hlayout.addLayout(self.__comment_layout)\n\n\nclass LoadResistDialog(QtGui.QDialog):\n\n    class ResistInfoLoad(AbstractResistInfoTab):\n        def __init__(self, parent):\n            AbstractResistInfoTab.__init__(self, parent)\n\n    def __init__(self, parent, appdb):\n        \"\"\"\n        :type parent: QtGui.QMainWindow\n        :type appdb: ApplicationDatabase\n        \"\"\"\n        QtGui.QDialog.__init__(self, parent)\n\n        self.__appdb = appdb\n\n        self.setWindowTitle(\"Load Resist\")\n        self.setWindowIcon(parent.windowIcon())\n\n        self.__select_group = QtGui.QGroupBox(\"Select Resist\", self)\n        self.__select_group_layout = QtGui.QHBoxLayout(self.__select_group)\n        self.__resist_list = QtGui.QListWidget(self.__select_group)\n        self.__select_group_layout.addWidget(self.__resist_list)\n\n        for resist in appdb[orm.Resist]:\n            self.__resist_list.addItem(resist.name)\n\n        self.__buttons_layout = QtGui.QHBoxLayout()\n        self.__load_button = QtGui.QPushButton(\"Load resist\", self)\n        self.__load_button.setFixedWidth(config.MAXIMUM_DIALOG_BUTTON_WIDTH)\n        self.__cancel_button = QtGui.QPushButton(\"Cancel\", self)\n        self.__cancel_button.setFixedWidth(config.MAXIMUM_DIALOG_BUTTON_WIDTH)\n\n        self.__buttons_layout.addStretch()\n        self.__buttons_layout.addWidget(self.__load_button)\n        self.__buttons_layout.addWidget(self.__cancel_button)\n\n        self.__resist_info = LoadResistDialog.ResistInfoLoad(self)\n\n        connect(self.__load_button.clicked, self.accept)\n        connect(self.__cancel_button.clicked, self.reject)\n        connect(self.__resist_list.itemSelectionChanged, self._change_resist)\n\n        self.__hlayout = QtGui.QVBoxLayout()\n        self.__hlayout.addWidget(self.__select_group)\n        self.__hlayout.addWidget(self.__resist_info)\n\n        self.__vlayout = QtGui.QVBoxLayout(self)\n        self.__vlayout.addLayout(self.__hlayout)\n        self.__vlayout.addLayout(self.__buttons_layout)\n\n    @Slot()\n    def _change_resist(self):\n        self.__resist_info.setObject(self.dbresist)\n\n    @property\n    def dbresist(self):\n        \"\"\":rtype: orm.Resist\"\"\"\n        name = str(self.__resist_list.currentItem().text())\n        return self.__appdb[orm.Resist].filter(orm.Resist.name == name).one()\n\n\nclass ResistExposureTab(AbstractResistTab):\n\n    class Edit(QLineEditNumeric):\n        def __init__(self, *__args):\n            QLineEditNumeric.__init__(self, *__args)\n            self.setFixedWidth(75)\n            self.setAlignment(QtCore.Qt.AlignRight)\n\n    class PebView(AbstractResistInfoBox):\n\n        class Graph(QGraphPlot):\n            def __init__(self, parent, temp):\n                \"\"\"\n                :type parent: QtGui.QWidget\n                :type temp: options.Variable\n                \"\"\"\n                QGraphPlot.__init__(self, parent, width=320, height=240)\n\n                self._ax = self.add_subplot()\n\n                self.__resist = None\n                \"\"\":type: options.structures.Resist\"\"\"\n\n                self.__temp = temp\n\n                connect(self.__temp.signals[structures.Abstract], self.__onValueChanged)\n\n            def draw_graph(self, peb, temp):\n                \"\"\"\n                :param orm.PebParameters peb: Post exposure bake parameters\n                :param float or None temp: Current option temperature (to set graph intervals)\n                \"\"\"\n                self._ax.clear()\n\n                if peb is not None and temp is not None:\n                    offset = config.PEB_TEMP_GRAPH_RANGE/2.0\n                    temp_range = range(int(temp-offset), int(temp+offset))\n                    diff_range = peb.diffusivity(temp_range)\n\n                    self._ax.plot(temp_range, diff_range, \"r-\")\n\n                    self._ax.grid()\n\n                    self._ax.set_xlabel(\"Temperature (C)\")\n                    self._ax.set_ylabel(\"PEB Diffusivity (nm2/s)\")\n\n                    self._ax.patch.set_alpha(0.0)\n\n                    self.redraw()\n\n            # noinspection PyPep8Naming\n            @Slot()\n            def __onValueChanged(self):\n                self.draw_graph(self.__resist.peb, self.__temp.value)\n\n            # noinspection PyPep8Naming\n            def setObject(self, resist):\n                \"\"\":type resist: options.structures.Resist\"\"\"\n                if self.__resist is not None:\n                    disconnect(self.__resist.peb.signals[orm.PebParameters.ln_ar], self.__onValueChanged)\n                    disconnect(self.__resist.peb.signals[orm.PebParameters.ea], self.__onValueChanged)\n\n                self.__resist = resist\n\n                connect(self.__resist.peb.signals[orm.PebParameters.ln_ar], self.__onValueChanged)\n                connect(self.__resist.peb.signals[orm.PebParameters.ea], self.__onValueChanged)\n\n                self.__onValueChanged()\n\n        def __init__(self, parent, temp):\n            \"\"\"\n            :type parent: QtGui.QWidget\n            :type temp: options.Variable\n            \"\"\"\n            QtGui.QGroupBox.__init__(self, \"Post Exposure Bake\", parent)\n\n            self.__peb_graph = ResistExposureTab.PebView.Graph(self, temp)\n\n            self.__graph_layout = QtGui.QHBoxLayout()\n            self.__graph_layout.addWidget(self.__peb_graph)\n\n            self.__ln_ar = ResistExposureTab.Edit(self)\n            self.__ea = ResistExposureTab.Edit(self)\n\n            self.__values_layout = QtGui.QHBoxLayout()\n            self.__values_layout.addWidget(QtGui.QLabel(\"Ln(Ar) (nm2/s):\"))\n            self.__values_layout.addWidget(self.__ln_ar)\n            self.__values_layout.addStretch()\n            self.__values_layout.addWidget(QtGui.QLabel(\"Ea (kcal/mole):\"))\n            self.__values_layout.addWidget(self.__ea)\n\n            self.__layout = QtGui.QVBoxLayout(self)\n            self.__layout.addLayout(self.__graph_layout)\n            self.__layout.addLayout(self.__values_layout)\n            # self.__layout.addStretch()\n\n        def setObject(self, resist):\n            \"\"\":type resist: options.structures.Resist\"\"\"\n            self.__ln_ar.setObject(resist.peb, orm.PebParameters.ln_ar)\n            self.__ea.setObject(resist.peb, orm.PebParameters.ea)\n            self.__peb_graph.setObject(resist)\n\n    class ExposureView(AbstractResistInfoBox):\n        def __init__(self, parent):\n            QtGui.QGroupBox.__init__(self, \"Exposure Dill model\", parent)\n\n            # TODO: Fix constraints\n            self.__dill_a = ResistExposureTab.Edit(self)\n            self.__dill_b = ResistExposureTab.Edit(self)\n            self.__dill_c = ResistExposureTab.Edit(self)\n\n            self.__vlayout = QtGui.QFormLayout(self)\n            self.__vlayout.addRow(\"A (1/um):\", self.__dill_a)\n            self.__vlayout.addRow(\"B (1/um):\", self.__dill_b)\n            self.__vlayout.addRow(\"C (1/um):\", self.__dill_c)\n\n        def setObject(self, resist):\n            \"\"\":type resist: options.structures.Resist\"\"\"\n            self.__dill_a.setObject(resist.exposure, orm.ExposureParameters.a)\n            self.__dill_b.setObject(resist.exposure, orm.ExposureParameters.b)\n            self.__dill_c.setObject(resist.exposure, orm.ExposureParameters.c)\n\n    class PropertyView(AbstractResistInfoBox):\n        def __init__(self, parent):\n            QtGui.QGroupBox.__init__(self, \"Exposure Dill model\", parent)\n\n            # TODO: Fix constraints\n            self.__wavelength = ResistExposureTab.Edit(self)\n            self.__refractive_n = ResistExposureTab.Edit(self)\n\n            self.__vlayout = QtGui.QFormLayout(self)\n            self.__vlayout.addRow(\"Wavelength (nm):\", self.__wavelength)\n            self.__vlayout.addRow(\"Unexposed refractive:\", self.__refractive_n)\n\n        def setObject(self, resist):\n            \"\"\":type resist: options.structures.Resist\"\"\"\n            self.__wavelength.setObject(resist.exposure, orm.ExposureParameters.wavelength)\n            self.__refractive_n.setObject(resist.exposure, orm.ExposureParameters.n)\n\n    def __init__(self, parent, peb_temp):\n        \"\"\"\n        :param QtGui.QWidget parent: Widget parent\n        :param options.Variable peb_temp: PEB temperature options field\n        \"\"\"\n        AbstractResistTab.__init__(self, parent)\n\n        self.__views = dict()\n        \"\"\":type: dict from str to AbstractResistInfoBox\"\"\"\n\n        self.__views[\"property\"] = ResistExposureTab.PropertyView(self)\n        self.__views[\"exposure\"] = ResistExposureTab.ExposureView(self)\n        self.__views[\"peb\"] = ResistExposureTab.PebView(self, peb_temp)\n\n        self.__vlayout = QtGui.QVBoxLayout()\n        self.__vlayout.addWidget(self.__views[\"property\"])\n        self.__vlayout.addWidget(self.__views[\"exposure\"])\n        self.__vlayout.addStretch()\n\n        self.__peb_layout = QtGui.QVBoxLayout()\n        self.__peb_layout.addWidget(self.__views[\"peb\"])\n        self.__peb_layout.addStretch()\n\n        self.__layout = QtGui.QHBoxLayout(self)\n        self.__layout.addLayout(self.__vlayout)\n        self.__layout.addLayout(self.__peb_layout)\n        # self.__layout.addStretch()\n\n    def setObject(self, resist):\n        \"\"\":type resist: options.structures.Resist\"\"\"\n        for view in self.__views.values():\n            view.setObject(resist)\n\n\nclass ResistDevelopmentTab(AbstractResistTab):\n\n    NEW_PLUGIN_RESIST_NAME = \"Plugin based developer\"\n    NEW_PLUGIN_RESIST_TEXT = \"Add new plugin development model...\"\n\n    class DevRateSheetView(QStackWidgetTab):\n        def __init__(self, parent):\n            \"\"\":type parent: QtGui.QWidget\"\"\"\n            QStackWidgetTab.__init__(self, parent)\n            self.__label = QtGui.QLabel(\"Parameters of the development rate sheet data can't be changed. \"\n                                        \"Objects of those type can be import at the Database tab.\")\n            self.__label.setAlignment(QtCore.Qt.AlignLeft)\n            self.__label.setWordWrap(True)\n\n            self.__dev_rate_graph = DevelopmentGraph(self)\n\n            self.__layout = QtGui.QHBoxLayout(self)\n            self.__layout.addWidget(self.__label)\n            self.__layout.addStretch()\n            self.__layout.addWidget(self.__dev_rate_graph)\n\n        # noinspection PyPep8Naming\n        def setObject(self, resist):\n            \"\"\":type resist: options.structures.Resist or None\"\"\"\n            if resist is not None:\n                self.__dev_rate_graph.developer = resist.developer\n            else:\n                self.__dev_rate_graph.developer = None\n\n    class DevRateExprView(QStackWidgetTab):\n\n        class ModelView(QStackWidgetTab):\n            def __init__(self, parent, model, graph):\n                \"\"\"\n                :type parent: QtGui.QWidget\n                :type model: orm.DevelopmentModel\n                :type graph: ResistDevelopmentTab.Graph\n                \"\"\"\n                QStackWidgetTab.__init__(self, parent)\n                self.__layout = QtGui.QVBoxLayout(self)\n                self.__graph = graph\n                self.__args = dict()\n                for arg in model.args:\n                    hlayout = QtGui.QHBoxLayout()\n                    edit = QLineEditNumeric(self)\n                    edit.setFixedWidth(75)\n                    edit.setAlignment(QtCore.Qt.AlignRight)\n                    self.__args[arg.name] = {\"layout\": hlayout, \"edit\": edit}\n                    hlayout.addWidget(QtGui.QLabel(arg.name, self))\n                    hlayout.addStretch()\n                    hlayout.addWidget(edit)\n                    self.__layout.addLayout(hlayout)\n                self.__layout.addStretch()\n\n            # noinspection PyPep8Naming\n            def setObject(self, resist):\n                \"\"\":type resist: options.structures.Resist or None\"\"\"\n                if resist is not None:\n                    # logging.info(\"Model view set new resist developer: %s\" % resist.developer)\n\n                    developer = resist.developer\n                    \"\"\":type: orm.DeveloperExpr\"\"\"\n                    for arg, p_object in zip(developer.model.args, developer.object_values):\n                        self.__args[arg.name][\"edit\"].setObject(p_object, orm.DeveloperExprArgValue.value)\n                    self.__graph.developer = developer\n                else:\n                    self.__graph.developer = None\n                    # If resist is None clear resist links with NumericEdit views\n                    for item in self.__args.values():\n                        item[\"edit\"].unsetObject()\n\n        def __init__(self, parent, appdb):\n            \"\"\"\n            :type parent: QtGui.QWidget\n            :type appdb: ApplicationDatabase\n            \"\"\"\n            QStackWidgetTab.__init__(self, parent)\n\n            self.__appdb = appdb\n            self.__resist = None\n            \"\"\":type: options.structures.Resist\"\"\"\n\n            self.__dev_rate_graph = DevelopmentGraph(self)\n\n            self.__group = QtGui.QGroupBox(\"Parameters\", self)\n\n            self.__views = dict()\n            self.__parameters_widgets = QtGui.QStackedWidget(self.__group)\n            self.__dev_models = QtGui.QComboBox(self.__group)\n\n            for model in self.__appdb[orm.DevelopmentModel]:\n                self.__dev_models.addItem(model.name)\n                self.__views[model.name] = ResistDevelopmentTab.DevRateExprView.ModelView(\n                    self, model, self.__dev_rate_graph)\n                self.__parameters_widgets.addWidget(self.__views[model.name])\n            self.__dev_models.setFixedWidth(200)\n            connect(self.__dev_models.currentIndexChanged, self.__onIndexChanged)\n\n            self.__temporary_check_box = QtGui.QCheckBox(\"Coupled\", self.__group)\n            connect(self.__temporary_check_box.stateChanged, self._temporary_box_unchecked)\n\n            self.__group_layout = QtGui.QVBoxLayout(self.__group)\n            self.__group_layout.addWidget(self.__dev_models)\n            self.__group_layout.addWidget(self.__temporary_check_box)\n            self.__group_layout.addWidget(self.__parameters_widgets)\n            self.__group_layout.addStretch()\n\n            self.__layout = QtGui.QHBoxLayout(self)\n            self.__layout.addWidget(self.__group)\n            self.__layout.addStretch()\n            self.__layout.addWidget(self.__dev_rate_graph)\n\n        @Slot()\n        def _temporary_box_unchecked(self):\n            if not self.__temporary_check_box.isChecked():\n                replay = QuestionBox(\n                    self, \"Do you really want to decouple:\\n\"\n                          \"Developer \\\"%s\\\" from \\\"%s\\\" resist?\\n\"\n                          \"Note: This action can't be undone, DB resist and developer will be replaced\" %\n                          (self.__resist.developer.name, self.__resist.name)\n                )\n                if replay == msgBox.Yes:\n                    self.__resist.developer.temporary = False\n                    self.__resist.onOptionChanged()\n                    self.__appdb.replace(self.__resist)\n                    logging.info(\"Temporary [%s]: %s\" % (self.__resist.developer.id, self.__resist.developer.temporary))\n                    self.__temporary_check_box.setEnabled(False)\n                    self.__temporary_check_box.setText(\"Coupled\")\n                else:\n                    self.__temporary_check_box.setChecked(True)\n\n        # noinspection PyPep8Naming\n        @Slot(int)\n        def __onIndexChanged(self, index):\n            name = str(self.__dev_models.itemText(index))\n            view = self.__views[name]\n            # Clear previous links with views\n            self.__parameters_widgets.currentWidget().setObject(None)\n            self.__parameters_widgets.setCurrentWidget(view)\n            self.__temporary_check_box.blockSignals(True)\n            self.__temporary_check_box.setChecked(self.__resist.developer.temporary)\n            self.__temporary_check_box.setEnabled(self.__resist.developer.temporary)\n            self.__temporary_check_box.blockSignals(False)\n            text = \"Coupled with %s\" % self.__resist.name if self.__temporary_check_box.isChecked() else \"Coupled\"\n            self.__temporary_check_box.setText(text)\n            db_model = self.__appdb[orm.DevelopmentModel].filter(orm.DevelopmentModel.name == name).one()\n            if self.__resist.developer.model is not db_model:\n                self.__resist.developer.change_model(db_model)\n                self.__resist.onOptionChanged()\n            view.setObject(self.__resist)\n\n        # noinspection PyPep8Naming\n        def setObject(self, resist):\n            \"\"\":type resist: options.structures.Resist\"\"\"\n            self.__resist = resist\n            index = self.__dev_models.findText(resist.developer.model.name)\n            self.__dev_models.blockSignals(True)\n            self.__dev_models.setCurrentIndex(-1)\n            self.__dev_models.blockSignals(False)\n            self.__dev_models.setCurrentIndex(index)\n\n    class DevRateNone(QStackWidgetTab):\n\n        def __init__(self, parent):\n            \"\"\":type parent: QtGui.QWidget\"\"\"\n            QStackWidgetTab.__init__(self, parent)\n            self.__label = QtGui.QLabel(\"Development rate was not set to this resist. \"\n                                        \"To be able to run simulation resist must be set.\")\n            self.__label.setAlignment(QtCore.Qt.AlignCenter)\n            self.__label.setWordWrap(True)\n\n            self.__layout = QtGui.QVBoxLayout(self)\n            self.__layout.addWidget(self.__label)\n\n    def __init__(self, parent, appdb):\n        \"\"\"\n        Initializer of ResistDevelopmentTab class\n\n        :type parent: QtGui.QWidget\n        :type appdb: ApplicationDatabase\n        \"\"\"\n        AbstractResistTab.__init__(self, parent)\n\n        self.__appdb = appdb\n        self.__resist = None\n        \"\"\":type: options.structures.Resist\"\"\"\n\n        # -- Header --\n\n        self.__dev_name_combobox = QtGui.QComboBox(self)\n        self.__dev_name_combobox.setFixedWidth(300)\n        connect(self.__dev_name_combobox.currentIndexChanged, self.__onIndexChanged)\n\n        self.__save_button = QtGui.QPushButton(\"Save Developer\")\n        self.__save_button.setFixedWidth(120)\n        self.__save_button.setEnabled(False)\n        connect(self.__save_button.clicked, self._save_developer)\n\n        self.__save_button_as = QtGui.QPushButton(\"Save Developer As...\")\n        self.__save_button_as.setFixedWidth(120)\n        self.__save_button_as.setEnabled(False)\n        connect(self.__save_button_as.clicked, self._save_developer_as)\n\n        self.__header_layout = QtGui.QHBoxLayout()\n        self.__header_layout.addWidget(self.__dev_name_combobox)\n        self.__header_layout.addStretch()\n        self.__header_layout.addWidget(self.__save_button)\n        self.__header_layout.addWidget(self.__save_button_as)\n\n        # -- Body --\n\n        self.__parameters_widgets = QtGui.QStackedWidget(self)\n        self.__views = {\n            orm.DeveloperSheet: ResistDevelopmentTab.DevRateSheetView(self),\n            orm.DeveloperExpr: ResistDevelopmentTab.DevRateExprView(self, self.__appdb),\n            None: ResistDevelopmentTab.DevRateNone(self)\n        }\n        for widget in self.__views.values():\n            self.__parameters_widgets.addWidget(widget)\n\n        # -- Tab --\n\n        self.__vlayout = QtGui.QVBoxLayout(self)\n        self.__vlayout.addLayout(self.__header_layout)\n        self.__vlayout.addWidget(self.__parameters_widgets)\n        self.__vlayout.addStretch()\n\n    # noinspection PyPep8Naming\n    @Slot(int)\n    def __onIndexChanged(self, index):\n        name = str(self.__dev_name_combobox.itemText(index))\n        if not name:\n            return\n\n        if name == self.NEW_PLUGIN_RESIST_TEXT:\n            dev_model = self.__appdb[orm.DevelopmentModel].first()\n            if dev_model is None:\n                ErrorBox(self, \"Can't create new plugin resist development model because no suitable plugins found\")\n                return\n            developer = orm.DeveloperExpr(self.NEW_PLUGIN_RESIST_NAME, dev_model)\n        elif self.__resist.developer is not None and self.__resist.developer.name == name:\n            developer = self.__resist.developer\n        else:\n            db_developer = self.__appdb[orm.DeveloperInterface].filter(orm.Generic.name == name).one()\n            developer = db_developer.clone() if isinstance(db_developer, orm.DeveloperExpr) else db_developer\n\n        view = self.__views[type(developer)]\n        self.__parameters_widgets.setCurrentWidget(view)\n        self.__resist.developer = developer\n        view.setObject(self.__resist)\n\n        self.__save_button.setEnabled(isinstance(self.__resist.developer, orm.DeveloperExpr))\n        self.__save_button_as.setEnabled(isinstance(self.__resist.developer, orm.DeveloperExpr))\n\n    def _save_developer_payload(self, name):\n        \"\"\":type name: str\"\"\"\n        try:\n            developer = self.__appdb[orm.DeveloperInterface].filter(orm.DeveloperInterface.name == name).one()\n            \"\"\":type: orm.DeveloperInterface\"\"\"\n        except orm.NoResultFound:\n            self.__resist.developer.name = name\n            self.__appdb.add(self.__resist.developer.clone())\n        else:\n            replay = QuestionBox(self, \"%s \\\"%s\\\" already existed, replace it?\" %\n                                       (developer.identifier, developer.name))\n            if replay == msgBox.Yes:\n                developer.assign(self.__resist.developer)\n                self.__appdb.commit()\n\n    @Slot()\n    def _save_developer(self):\n        name = str(self.__dev_name_combobox.currentText())\n        self._save_developer_payload(name)\n\n    @Slot()\n    def _save_developer_as(self):\n        name, is_accept = QtGui.QInputDialog.getText(\n            self.parent(), \"Save developer as...\",\n            \"Specify name of the new developer:\",\n            QtGui.QLineEdit.Normal,\n            str(self.__dev_name_combobox.currentText()))\n        if is_accept:\n            self._save_developer_payload(str(name))\n            self.update_view()\n\n    def update_view(self):\n        # Block signals otherwise it automatically change resist\n        self.__dev_name_combobox.blockSignals(True)\n        self.__dev_name_combobox.clear()\n\n        developers = {self.__resist.developer.name} if self.__resist.developer is not None else set()\n        for item in self.__appdb[orm.DeveloperInterface]:\n            if isinstance(item, orm.DeveloperSheet) or (isinstance(item, orm.DeveloperExpr) and not item.temporary):\n                developers.add(item.name)\n\n        self.__dev_name_combobox.addItems([self.NEW_PLUGIN_RESIST_TEXT] + list(developers))\n        self.__dev_name_combobox.setCurrentIndex(-1)\n\n        self.__dev_name_combobox.blockSignals(False)\n\n        if self.__resist.developer is not None:\n            index = self.__dev_name_combobox.findText(self.__resist.developer.name)\n            self.__dev_name_combobox.setCurrentIndex(index)\n        else:\n            self.__parameters_widgets.setCurrentWidget(self.__views[None])\n\n    def setObject(self, resist):\n        \"\"\":type resist: options.structures.Resist\"\"\"\n        self.__resist = resist\n        self.update_view()\n\n\nclass ResistView(QStackWidgetTab):\n\n    def _create_header(self):\n        self.__button_load = QtGui.QPushButton(\"Load Resist\")\n        self.__button_load.adjustSize()\n        self.__button_load.setFixedWidth(self.__button_load.width()+20)\n        connect(self.__button_load.clicked, self._load_resist)\n\n        self.__button_save = QtGui.QPushButton(\"Save Resist to Database\")\n        self.__button_save.adjustSize()\n        self.__button_save.setFixedWidth(self.__button_save.width()+20)\n        connect(self.__button_save.clicked, self._save_resist)\n\n        self.__label_name = QtGui.QLabel(\"Name:\")\n\n        self.__edit_name = QtGui.QLineEdit()\n        self.__edit_name.setMinimumWidth(100)\n\n        self.__header_layout = QtGui.QHBoxLayout()\n        self.__header_layout.addWidget(self.__button_load)\n        self.__header_layout.addWidget(self.__button_save)\n        self.__header_layout.addSpacing(20)\n        self.__header_layout.addWidget(self.__label_name)\n        self.__header_layout.addWidget(self.__edit_name)\n\n    @Slot()\n    def _load_resist(self):\n        load_resist_dlg = LoadResistDialog(self.parent(), self.__appdb)\n        if load_resist_dlg.exec_():\n            # Make a clone of the resist to avoid undesired changes of it's properties in the database\n            db_resist = load_resist_dlg.dbresist.clone()\n            logging.info(\"Load resist: %s\" % db_resist.name)\n            thickness = self.__wafer_process.resist.thickness\n            self.__wafer_process.resist = structures.Resist(db_resist, thickness)\n            self.setObject(self.__wafer_process.resist)\n\n    @Slot()\n    def _save_resist(self):\n\n        def get_db_developer(_resist):\n            \"\"\"\n            Get object from the database (real database id required)\n\n            :type _resist: options.structures.Resist\n            :rtype: orm.DeveloperInterface\n            \"\"\"\n            try:\n                db_developer = self.__appdb[orm.DeveloperInterface].\\\n                    filter(orm.DeveloperInterface.name == _resist.developer.name).one()\n            except orm.NoResultFound:\n                db_developer = None\n\n            return db_developer\n\n        name = str(self.__edit_name.text())\n        try:\n            db_resist = self.__appdb[orm.Resist].filter(orm.Resist.name == name).one()\n            \"\"\":type: orm.Resist\"\"\"\n        except orm.NoResultFound:\n            self.__wafer_process.resist.name = name\n            self.__wafer_process.resist.developer = get_db_developer(self.__wafer_process.resist)\n            self.__appdb.add(self.__wafer_process.resist.db.clone())\n        else:\n            replay = QuestionBox(\n                self, \"%s \\\"%s\\\" already existed, replace it?\" %\n                (self.__wafer_process.resist.identifier, self.__wafer_process.resist.name))\n            if replay == msgBox.Yes:\n                db_resist.assign(\n                    self.__wafer_process.resist.db,\n                    developer=get_db_developer(self.__wafer_process.resist))\n                self.__appdb.commit()\n\n    def _create_body(self):\n        self.__tab_widget = QtGui.QTabWidget(self)\n\n        self.__tab_widget.addTab(ResistInfoTab(self.__tab_widget), \"Information\")\n        self.__tab_widget.addTab(ResistExposureTab(self.__tab_widget, self.__peb_temp), \"Exposure/PEB\")\n        self.__tab_widget.addTab(ResistDevelopmentTab(self.__tab_widget, self.__appdb), \"Development\")\n\n        self.__body_layout = QtGui.QHBoxLayout()\n        self.__body_layout.addWidget(self.__tab_widget)\n        self.__body_layout.addStretch()\n\n        connect(self.__tab_widget.currentChanged, self.__onTabChanged)\n\n    def _enumerate_tabs(self):\n        for k in xrange(self.__tab_widget.count()):\n            yield self.__tab_widget.widget(k)\n\n    # @property\n    # def resist(self):\n    #     return self.__resist\n\n    # @resist.setter\n    # def resist(self, value):\n    #     \"\"\":type value: options.structures.Resist\"\"\"\n    #     self.__resist = value\n    #     self.__edit_name.setText(value.name)\n    #     for tab in self._enumerate_tabs():\n    #         tab.resist = value\n\n    # noinspection PyPep8Naming\n    def setObject(self, resist):\n        \"\"\":type resist: options.structures.Resist\"\"\"\n        self.__resist = resist\n        self.__edit_name.setText(resist.name)\n        for tab in self._enumerate_tabs():\n            tab.setObject(resist)\n\n    # noinspection PyPep8Naming\n    @Slot(int)\n    def __onTabChanged(self, *args):\n        for tab in self._enumerate_tabs():\n            tab.onSetActive()\n\n    def __init__(self, parent, wafer_process, peb_temp, appdb):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :param WaferProcess wafer_process: Wafer stack process options\n        :param Variable peb_temp: PEB temperature options field\n        :type appdb: ApplicationDatabase\n        \"\"\"\n        QStackWidgetTab.__init__(self, parent)\n        self.setObjectName(\"ResistView\")\n\n        self.__wafer_process = wafer_process\n        self.__peb_temp = peb_temp\n        self.__appdb = appdb\n\n        self.__resist = None\n\n        # --- Header members ---\n        self.__button_load = None\n        \"\"\":type: QtGui.QPushButton\"\"\"\n        self.__button_save = None\n        \"\"\":type: QtGui.QPushButton\"\"\"\n        self.__label_name = None\n        \"\"\":type: QtGui.QLabel\"\"\"\n        self.__edit_name = None\n        \"\"\":type: QtGui.QLineEdit\"\"\"\n        self.__header_layout = None\n        \"\"\":type: QtGui.QHBoxLayout\"\"\"\n\n        # --- Body members ---\n\n        self.__tab_widget = None\n        \"\"\":type: QtGui.QTabWidget\"\"\"\n        self.__body_layout = None\n        \"\"\":type: QtGui.QHBoxLayout\"\"\"\n\n        # --- Setup ---\n\n        self._create_header()\n        self._create_body()\n\n        self.__layout = QtGui.QVBoxLayout()\n        self.__layout.addLayout(self.__header_layout)\n        self.__layout.addSpacing(20)\n        self.__layout.addLayout(self.__body_layout)\n        self.__layout.addStretch()\n\n        self.__hlayout = QtGui.QHBoxLayout(self)\n        self.__hlayout.addLayout(self.__layout)\n        self.__hlayout.addStretch()\n\n        self.setObject(self.__wafer_process.resist)\n\n    def reset(self):\n        self.setObject(self.__wafer_process.resist)"
  },
  {
    "path": "OptolithiumGui/views/sets.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport logging as module_logging\n\nfrom copy import deepcopy\nfrom auxmath import cartesian\nfrom numpy import arange, array, ndarray, savetxt, NaN\nfrom cStringIO import StringIO\nfrom config import COMMON_LINES_COLOR\nfrom qt import QtGui, QtCore, connect, disconnect, Signal, Slot\nfrom views.common import QObjectNumeric, QStackWidgetTab, QGraphPlot, calculate_table_width, msgBox, NavigationToolbar\nfrom options.structures import Options, AbstractOptionsBase, Variable, StandardLayer, Resist, Numeric\nfrom database.orm import StandardObject, ConcretePluginCommon, DeveloperExprArgValue, \\\n    DeveloperInterface, DeveloperExpr, DeveloperSheet, PebParameters, ExposureParameters\nfrom resources import Resources\n\nimport helpers\n\n\n__author__ = 'Alexei Gladkikh'\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.INFO)\nhelpers.logStreamEnable(logging)\n\n\n_MINIMUM_HEIGHT = 230\n\n\ndef thread_name():\n    # noinspection PyArgumentList\n    return QtCore.QThread.currentThread().objectName()\n\n\ndef listify(data):\n    return [str(value) for index, value in sorted(data.iteritems())]\n\n\nclass AbstractGroupBox(QtGui.QGroupBox):\n\n    def __init__(self, title, parent):\n        super(AbstractGroupBox, self).__init__(title, parent)\n\n    # noinspection PyPep8Naming\n    def setObject(self, options):\n        pass\n\n\nclass InputVariablesTree(QtGui.QTreeWidget):\n\n    NAME_COLUMN = 0\n    VALUE_COLUMN = 1\n    INDEX_COLUMN = 2\n\n    HEADER = {\n        INDEX_COLUMN: \"VariableIndex\",\n        NAME_COLUMN: \"Variable name\",\n        VALUE_COLUMN: \"Value\",\n    }\n\n    EXPOSURE_N_NAME = \"Exposure Resist n\"\n    EXPOSURE_A_NAME = \"Exposure Dill A\"\n    EXPOSURE_B_NAME = \"Exposure Dill B\"\n    EXPOSURE_C_NAME = \"Exposure Dill C\"\n\n    PEB_LN_AR_NAME = \"PEB Ln(Ar)\"\n    PEB_EA_NAME = \"PEB Ea\"\n\n    THICKNESS = \"Thickness\"\n    REFRACTIVE_INDEX_REAL = \"Refractive Index Real\"\n    REFRACTIVE_INDEX_IMAG = \"Refractive Index Imag\"\n\n    SELECTABLE = QtCore.Qt.ItemIsSelectable\n\n    def __init__(self, parent, options):\n        \"\"\"\n        :param QtGui.QWidget parent: Parent\n        :param options.structures.Options options: Program options\n        \"\"\"\n        super(InputVariablesTree, self).__init__(parent)\n        self.setColumnCount(3)\n        self.setColumnWidth(InputVariablesTree.INDEX_COLUMN, 40)\n        self.setColumnWidth(InputVariablesTree.NAME_COLUMN, 250)\n        self.setColumnWidth(InputVariablesTree.VALUE_COLUMN, 40)\n        self.setHeaderLabels(listify(InputVariablesTree.HEADER))\n\n        self.setColumnHidden(InputVariablesTree.INDEX_COLUMN, True)\n\n        self.setMinimumHeight(_MINIMUM_HEIGHT)\n        self.setFixedWidth(400)\n\n        self.__root = self.invisibleRootItem()\n\n        self.__options = None\n        \"\"\":type: options.structures.Options\"\"\"\n\n        self.__nodes = dict()\n        \"\"\":type: dict[int, QObjectNumeric]\"\"\"\n        self.__counter = 0\n\n        self.setObject(options)\n\n    @staticmethod\n    def set_selectable(row, value):\n        flags = row.flags() | InputVariablesTree.SELECTABLE \\\n            if value else row.flags() & ~InputVariablesTree.SELECTABLE\n        row.setFlags(flags)\n\n    def variable_by_indx(self, index):\n        return self.__nodes[index]\n\n    def indx_by_variable(self, variable):\n        for indx, stored_variable in self.__nodes.iteritems():\n            if variable.object == stored_variable.object:\n                return indx\n        return None\n\n    def lookup_item(self, check):\n        def __search(_node):\n            for _k in xrange(_node.childCount()):\n                _child = _node.child(_k)\n                # logging.info(\"Node = %s value = %s index = %r/%r\" %\n                #              (_child.text(0), _child.text(1), _child.text(2), index))\n                if check(_child):\n                    return _child\n                _result = __search(_child)\n                if _result is not None:\n                    return _result\n            return None\n\n        for k in xrange(self.__root.childCount()):\n            node = self.__root.child(k)\n            result = __search(node)\n            if result is not None:\n                return result\n\n    def item_by_indx(self, index):\n        return self.lookup_item(lambda node: node.text(InputVariablesTree.INDEX_COLUMN) == index)\n\n    def item_by_name(self, name):\n        return self.lookup_item(lambda node: node.text(InputVariablesTree.NAME_COLUMN) == name)\n\n    def clear(self):\n        super(InputVariablesTree, self).clear()\n        self.__nodes.clear()\n        self.__counter = 0\n        self.__root = self.invisibleRootItem()\n\n    def __add_indexed_node(self, root, container, field=Numeric, title=None):\n        self.__counter += 1\n\n        index_str = str(self.__counter)\n        name_str = title if title is not None else container.name\n\n        wrapper = QObjectNumeric(self, container, field)\n\n        data = {\n            self.INDEX_COLUMN: index_str,\n            self.NAME_COLUMN: name_str,\n            self.VALUE_COLUMN: str(wrapper.value)\n        }\n\n        self.__nodes[index_str] = wrapper\n\n        values = listify(data)\n        # logging.info(\"Add indexed node: %s\" % values)\n\n        node = QtGui.QTreeWidgetItem(values)\n        root.addChild(node)\n        return node\n\n    def __add_header_node(self, root, name, value=None):\n        value_str = str(value) if value is not None else str()\n\n        data = {\n            self.INDEX_COLUMN: str(),\n            self.NAME_COLUMN: str(name),\n            self.VALUE_COLUMN: value_str\n        }\n\n        node = QtGui.QTreeWidgetItem(listify(data))\n        root.addChild(node)\n        return node\n\n    def __add_wafer_process(self, root, wafer_stack):\n        node_stack = self.__add_header_node(root, \"Wafer Process\")\n        for stack_layer in wafer_stack:\n            node_layer = self.__add_header_node(node_stack, stack_layer.name)\n            if isinstance(stack_layer, StandardLayer):\n                self.__add_indexed_node(node_layer, stack_layer, StandardLayer.thickness, title=self.THICKNESS)\n            if not isinstance(stack_layer, Resist) and stack_layer.is_parametric:\n                self.__add_indexed_node(node_layer, stack_layer, StandardLayer.real, title=self.REFRACTIVE_INDEX_REAL)\n                self.__add_indexed_node(node_layer, stack_layer, StandardLayer.imag, title=self.REFRACTIVE_INDEX_IMAG)\n\n    def __add_exposure(self, root, exposure):\n        self.__add_indexed_node(root, exposure, ExposureParameters.n, self.EXPOSURE_N_NAME)\n        self.__add_indexed_node(root, exposure, ExposureParameters.a, self.EXPOSURE_A_NAME)\n        self.__add_indexed_node(root, exposure, ExposureParameters.b, self.EXPOSURE_B_NAME)\n        self.__add_indexed_node(root, exposure, ExposureParameters.c, self.EXPOSURE_C_NAME)\n\n    def __add_peb(self, root, peb):\n        self.__add_indexed_node(root, peb, PebParameters.ln_ar)\n        self.__add_indexed_node(root, peb, PebParameters.ea)\n\n    def __add_developer(self, root, field):\n        \"\"\":type field: DeveloperInterface\"\"\"\n        if isinstance(field, DeveloperExpr):\n            for arg, value_object in zip(field.model.args, field.object_values):\n                self.__add_indexed_node(root, value_object, DeveloperExprArgValue.value, title=arg.name)\n        elif isinstance(field, DeveloperSheet):\n            self.__add_header_node(root, \"Development model\", field.name)\n\n    def __add_resist(self, root, resist):\n        \"\"\"\n        :type root: QtGui.QTreeWidgetItem\n        :type resist: options.structures.Resist\n        \"\"\"\n        node = self.__add_header_node(root, \"Resist\", resist.name)\n        self.__add_exposure(node, resist.exposure)\n        self.__add_peb(node, resist.peb)\n        self.__add_developer(node, resist.developer)\n\n    def __add_variable(self, root, p_object):\n        self.__add_indexed_node(root, p_object)\n\n    def __add_plugin_object(self, root, plugin):\n        \"\"\"\n        :type root: QtGui.QTreeWidgetItem\n        :type plugin: ConcretePluginCommon\n        \"\"\"\n        node = self.__add_header_node(root, str(plugin._base.title), plugin.name)\n        for variable in plugin.variables:\n            self.__add_variable(node, variable)\n\n    # noinspection PyMethodMayBeStatic\n    def __add_db_object(self, root, p_object):\n        \"\"\":type p_object: orm.Generic or StandardObject\"\"\"\n        self.__add_header_node(root, p_object.title, p_object.name)\n\n    def __add_composite(self, root, composite):\n        \"\"\"\n        :type composite: options.structures.AbstractOptionsBase or\n                         orm.Generic or orm.ConcretePluginCommon\n        \"\"\"\n        name = composite.identifier if isinstance(composite, AbstractOptionsBase) else composite.name\n        node = self.__add_header_node(root, name)\n        for name, field in composite.__dict__.iteritems():\n            if isinstance(field, Variable):\n                self.__add_variable(node, field)\n            elif isinstance(field, StandardObject):\n                self.__add_db_object(node, field)\n            elif isinstance(field, ConcretePluginCommon):\n                self.__add_plugin_object(node, field)\n\n    def check_variable(self, item):\n        index = item.text(InputVariablesTree.INDEX_COLUMN)\n        name = item.text(InputVariablesTree.NAME_COLUMN)\n        item.setIcon(InputVariablesTree.NAME_COLUMN, Resources(\"icons/Ok\"))\n        self.set_selectable(item, False)\n        variable = self.variable_by_indx(index)\n        self.clearSelection()\n        return name, index, variable\n\n    def uncheck_variable(self, index):\n        item = self.item_by_indx(index)\n        item.setIcon(InputVariablesTree.NAME_COLUMN, QtGui.QIcon())\n        self.set_selectable(item, True)\n\n    # noinspection PyPep8Naming\n    def setObject(self, options):\n        \"\"\":param options.structures.Options options: Program options\"\"\"\n        self.clear()\n        self.__options = options\n        self.__add_wafer_process(self.__root, self.__options.wafer_process)\n        self.__add_resist(self.__root, self.__options.wafer_process.resist)\n        self.__add_composite(self.__root, self.__options.mask)\n        self.__add_composite(self.__root, self.__options.imaging_tool)\n        self.__add_composite(self.__root, self.__options.exposure_focus)\n        self.__add_composite(self.__root, self.__options.peb)\n        self.__add_composite(self.__root, self.__options.development)\n\n    def set_expand_collapse_all(self, expand):\n        def __recursive(_node):\n            for _k in xrange(_node.childCount()):\n                _child = _node.child(_k)\n                __recursive(_child)\n                _child.setExpanded(expand)\n            _node.setExpanded(expand)\n\n        for k in xrange(self.__root.childCount()):\n            __recursive(self.__root.child(k))\n\n\nclass InputVariablesTable(QtGui.QTableWidget):\n\n    ORD_COLUMN = 0\n    NAME_COLUMN = 1\n    START_COLUMN = 2\n    STOP_COLUMN = 3\n    INTERVAL_COLUMN = 4\n    INDEX_COLUMN = 5\n\n    CHANGEABLE_COLUMNS = [START_COLUMN, STOP_COLUMN, INTERVAL_COLUMN]\n\n    HEADER = {\n        ORD_COLUMN: \"#\",\n        NAME_COLUMN: \"Variable name\",\n        START_COLUMN: \"Start\",\n        STOP_COLUMN: \"Stop\",\n        INTERVAL_COLUMN: \"Interval\",\n        INDEX_COLUMN: \"VariableIndex\"\n    }\n\n    OVERSIZE = 0\n    HEIGHT = 20\n\n    ENABLED = QtCore.Qt.ItemIsEnabled\n    READONLY = QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled\n    EDITABLE = QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled\n\n    variablesChanged = Signal(list)\n    valuesChanged = Signal(dict)\n\n    def __init__(self, parent):\n        \"\"\"\n        :param QtGui.QWidget parent: Widget parent\n        \"\"\"\n        super(InputVariablesTable, self).__init__(parent)\n\n        self.setColumnCount(6)\n        self.setColumnWidth(InputVariablesTable.ORD_COLUMN, 40)\n        self.setColumnWidth(InputVariablesTable.NAME_COLUMN, 200)\n        self.setColumnWidth(InputVariablesTable.START_COLUMN, 60)\n        self.setColumnWidth(InputVariablesTable.STOP_COLUMN, 60)\n        self.setColumnWidth(InputVariablesTable.INTERVAL_COLUMN, 60)\n        self.setHorizontalHeaderLabels(listify(InputVariablesTable.HEADER))\n\n        self.setColumnHidden(InputVariablesTable.INDEX_COLUMN, True)\n\n        self.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)\n        self.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)\n        self.horizontalHeader().setClickable(False)\n        self.verticalHeader().setVisible(False)\n        self.verticalHeader().setDefaultSectionSize(self.HEIGHT)\n        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)\n        self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)\n\n        self.setFixedWidth(calculate_table_width(self) + self.OVERSIZE)\n        self.setMinimumHeight(_MINIMUM_HEIGHT)\n\n        connect(self.itemChanged, self.onItemChanged)\n\n        self.__variables = list()\n        self.__values = dict()\n\n    def clearContents(self, *args, **kwargs):\n        super(InputVariablesTable, self).clearContents(*args, **kwargs)\n        self.setRowCount(0)\n        self.__variables = list()\n        self.__values = dict()\n\n    def __reord_rows(self):\n        for k in xrange(self.rowCount()):\n            ord_item = QtGui.QTableWidgetItem(str(k + 1))\n            ord_item.setFlags(InputVariablesTable.READONLY)\n            ord_item.setTextAlignment(QtCore.Qt.AlignRight)\n            self.setItem(k, InputVariablesTable.ORD_COLUMN, ord_item)\n\n    def add_variable(self, name, index, wrapper):\n        row = self.rowCount()\n\n        self.__variables.append(wrapper)\n        self.__values[wrapper] = dict()\n\n        self.setRowCount(row + 1)\n        name_item = QtGui.QTableWidgetItem(name)\n        index_item = QtGui.QTableWidgetItem(str(index))\n        for item in (name_item, index_item):\n            item.setFlags(InputVariablesTable.READONLY)\n        self.setItem(row, InputVariablesTable.NAME_COLUMN, name_item)\n        self.setItem(row, InputVariablesTable.START_COLUMN, QtGui.QTableWidgetItem())\n        self.setItem(row, InputVariablesTable.STOP_COLUMN, QtGui.QTableWidgetItem())\n        self.setItem(row, InputVariablesTable.INTERVAL_COLUMN, QtGui.QTableWidgetItem())\n        self.setItem(row, InputVariablesTable.INDEX_COLUMN, index_item)\n        self.setRowHeight(row, InputVariablesTable.HEIGHT)\n        self.__reord_rows()\n\n        self.variablesChanged.emit(self.__variables)\n\n        return row\n\n    @property\n    def variables(self):\n        return self.__variables\n\n    @property\n    def values(self):\n        return self.__values\n\n    def remove_variable(self, row):\n        del self.__values[self.__variables[row]]\n        self.__variables.remove(self.__variables[row])\n        self.removeRow(row)\n        self.__reord_rows()\n        self.variablesChanged.emit(self.__variables)\n\n    VALUES_DICT_MAP = {\n        START_COLUMN: \"START\",\n        STOP_COLUMN: \"STOP\",\n        INTERVAL_COLUMN: \"INTERVAL\"\n    }\n\n    # noinspection PyPep8Naming\n    @Slot(QtGui.QTreeWidgetItem)\n    def onItemChanged(self, item):\n        row = item.row()\n        col = item.column()\n        # logging.info(\"Current row/col: %s %s\" % (row, col))\n        if row != -1 and col in InputVariablesTable.CHANGEABLE_COLUMNS:\n            variable = self.__variables[row]\n            key = self.VALUES_DICT_MAP[col]\n            try:\n                self.__values[variable][key] = float(item.text())\n                # logging.info(\"Change [%s, %s]: %s -> %s\" % (row, col, self.__values[variable][key], item.text()))\n            except ValueError:\n                item.setText(str())\n                # logging.info(\"Change [%s, %s]: (rejected)\" % (row, col))\n            else:\n                self.valuesChanged.emit(self.__values)\n                # logging.info(\"Emit value %s\" % self.__values)\n\n\nclass InputVariablesBox(AbstractGroupBox):\n\n    MAX_VARIABLES = 2\n\n    variablesChanged = Signal(list)\n    valuesChanged = Signal(dict)\n\n    def __init__(self, parent, options):\n        \"\"\"\n        :param QtGui.QWidget parent: Parent\n        :param options.structures.Options options: Program options\n        \"\"\"\n        super(InputVariablesBox, self).__init__(\"Input variables\", parent)\n        self.__options = options\n\n        self.__tree_layout = QtGui.QVBoxLayout()\n        self.__input_variables_tree = InputVariablesTree(self, self.__options)\n        connect(self.__input_variables_tree.itemSelectionChanged, self.onTreeSelectionChanged)\n\n        self.__button_expand_all = QtGui.QPushButton(\"Expand all\", self)\n        self.__button_collapse_all = QtGui.QPushButton(\"Collapse all\", self)\n        connect(self.__button_expand_all.clicked, self.onExpandAllClicked)\n        connect(self.__button_collapse_all.clicked, self.onCollapseAllClicked)\n        self.__buttons_colexp_layout = QtGui.QHBoxLayout()\n        self.__buttons_colexp_layout.addWidget(self.__button_expand_all)\n        self.__buttons_colexp_layout.addWidget(self.__button_collapse_all)\n\n        self.__tree_layout.addWidget(self.__input_variables_tree)\n        self.__tree_layout.addLayout(self.__buttons_colexp_layout)\n\n        self.__buttons_addrem_layout = QtGui.QVBoxLayout()\n        self.__button_add = QtGui.QPushButton(\"+\", self)\n        self.__button_remove = QtGui.QPushButton(\"-\", self)\n        self.__button_add.setEnabled(False)\n        self.__button_remove.setEnabled(False)\n        connect(self.__button_add.clicked, self.onAddVariableButtonClicked)\n        connect(self.__button_remove.clicked, self.onRemoveVariableButtonClicked)\n        self.__buttons_addrem_layout.addWidget(self.__button_add)\n        self.__buttons_addrem_layout.addWidget(self.__button_remove)\n\n        self.__input_variables_table = InputVariablesTable(self)\n        connect(self.__input_variables_table.itemSelectionChanged, self.onTableSelectionChanged)\n        connect(self.__input_variables_table.variablesChanged, self.onVariablesChanged)\n        connect(self.__input_variables_table.valuesChanged, self.onValuesChanged)\n\n        self.__layout = QtGui.QHBoxLayout(self)\n\n        self.__layout.addLayout(self.__tree_layout)\n        self.__layout.addLayout(self.__buttons_addrem_layout)\n        self.__layout.addWidget(self.__input_variables_table)\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def onTreeSelectionChanged(self):\n        items = self.__input_variables_tree.selectedItems()\n        # check whether item has item column (otherwise it's only header not a variable)\n        self.__button_add.setEnabled(\n            bool(items) and\n            bool(items[0].text(InputVariablesTree.INDEX_COLUMN)) and\n            self.__input_variables_table.rowCount() < self.MAX_VARIABLES\n        )\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def onTableSelectionChanged(self):\n        items = self.__input_variables_table.selectedItems()\n        self.__button_remove.setEnabled(bool(items))\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def onAddVariableButtonClicked(self):\n        items = self.__input_variables_tree.selectedItems()\n        if items and items[0].text(InputVariablesTree.INDEX_COLUMN):\n            name, index, variable = self.__input_variables_tree.check_variable(items[0])\n            self.__input_variables_table.add_variable(name, index, variable)\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def onRemoveVariableButtonClicked(self):\n        row = self.__input_variables_table.currentRow()\n        index = self.__input_variables_table.item(row, InputVariablesTable.INDEX_COLUMN)\n        self.__input_variables_tree.uncheck_variable(index.text())\n        self.__input_variables_table.remove_variable(row)\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def onExpandAllClicked(self):\n        self.__input_variables_tree.set_expand_collapse_all(True)\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def onCollapseAllClicked(self):\n        self.__input_variables_tree.set_expand_collapse_all(False)\n\n    # noinspection PyPep8Naming\n    @Slot(list)\n    def onVariablesChanged(self, data):\n        self.variablesChanged.emit(data)\n\n    # noinspection PyPep8Naming\n    @Slot(dict)\n    def onValuesChanged(self, data):\n        self.valuesChanged.emit(data)\n\n    def setObject(self, options):\n        self.__options = options\n        self.__input_variables_tree.setObject(options)\n        selected_items = []\n        for variable in self.__input_variables_table.variables:\n            indx = self.__input_variables_tree.indx_by_variable(variable)\n            if indx is not None:\n                item = self.__input_variables_tree.item_by_indx(indx)\n                selected_items.append((item, self.__input_variables_table.values[variable]))\n        self.__input_variables_table.clearContents()\n        for item, values in selected_items:\n            name, index, variable = self.__input_variables_tree.check_variable(item)\n            row = self.__input_variables_table.add_variable(name, index, variable)\n            inv_map = {v: k for k, v in self.__input_variables_table.VALUES_DICT_MAP.items()}\n            for key, value in values.iteritems():\n                col = inv_map[key]\n                self.__input_variables_table.setItem(row, col, QtGui.QTableWidgetItem(str(value)))\n\n\nclass OutputVariableTree(QtGui.QTreeWidget):\n\n    NAME_COLUMN = 0\n\n    HEADER = {\n        NAME_COLUMN: \"Stage/Metric name\",\n    }\n\n    def __init__(self, parent, core):\n        super(OutputVariableTree, self).__init__(parent)\n\n        self.__core = core\n\n        self.setColumnCount(1)\n        self.setColumnWidth(InputVariablesTable.NAME_COLUMN, 200)\n        self.setHeaderLabels(listify(OutputVariableTree.HEADER))\n\n        self.setMinimumHeight(_MINIMUM_HEIGHT)\n        self.setFixedWidth(400)\n\n        self.__root = self.invisibleRootItem()\n        \"\"\":type: QtGui.QTreeWidgetItem\"\"\"\n\n        self.__stages = dict()\n\n        self.__current_stage = None\n\n        self.__add_stages()\n\n    def __add_stages(self):\n        for stage in self.__core:\n            self.__stages[stage.name] = stage\n            node = QtGui.QTreeWidgetItem([stage.name])\n            self.__root.addChild(node)\n\n    def __item_by_name(self, stage_name):\n        for k in xrange(self.__root.childCount()):\n            node = self.__root.child(k)\n            if node.text(OutputVariableTree.NAME_COLUMN) == stage_name:\n                return node\n        return None\n\n    @property\n    def stage(self):\n        return self.__current_stage\n\n    @stage.setter\n    def stage(self, stage_name):\n        if stage_name is not None:\n            node = self.__item_by_name(stage_name)\n            node.setIcon(OutputVariableTree.NAME_COLUMN, Resources(\"icons/Ok\"))\n            self.__current_stage = self.__stages[stage_name]\n        elif self.__current_stage is not None:\n            node = self.__item_by_name(self.__current_stage.name)\n            node.setIcon(OutputVariableTree.NAME_COLUMN, QtGui.QIcon())\n            self.__current_stage = None\n\n\ndef make_range(**kwargs):\n    return arange(kwargs[\"START\"], kwargs[\"STOP\"] + kwargs[\"INTERVAL\"], kwargs[\"INTERVAL\"])\n\n\nclass SimulationSetsPayload(QtCore.QObject):\n\n    calculationDone = Signal()\n    taskStarted = Signal(int)\n    taskDone = Signal()\n\n    def __init__(self):\n        super(SimulationSetsPayload, self).__init__()\n        self.name = None\n\n        self.stage = None\n        \"\"\":type: core.AbstractStage\"\"\"\n\n        self.variables = []\n        \"\"\":type: list of QObjectNumeric\"\"\"\n        self.values = dict()\n\n        self.mutex = QtCore.QMutex()\n        self.variable_changed = QtCore.QWaitCondition()\n\n        self.calculation_results = None\n\n        self.__aborted = False\n        self.__done = False\n\n    @property\n    def aborted(self):\n        return self.__aborted\n\n    @property\n    def done(self):\n        return self.__done\n\n    @property\n    def is_config_ok(self):\n        is_variables = bool(self.variables)\n        is_stage = self.stage is not None\n        is_values = True\n\n        if len(self.variables) == len(self.values):\n            for values in self.values.values():\n                # logging.info(\"Values: %s\" % values)\n                if set(values.keys()) != {\"START\", \"STOP\", \"INTERVAL\"}:\n                    is_values = False\n                    break\n        else:\n            is_values = False\n\n        # logging.info(\"%s %s %s\" % (is_variables, is_stage, is_values))\n        return is_variables and is_values and is_stage\n\n    @Slot()\n    def start(self):\n        # logging.info(\n        #     \"Starting simulation set in %s with %s to stage: %s\" %\n        #     (thread_name(), self.variables, self.stage))\n        self.name = None\n        self.__aborted = False\n        self.__done = False\n\n    def __move_to_main_thread(self):\n        # noinspection PyArgumentList\n        main_thread = QtGui.QApplication.instance().thread()\n        self.moveToThread(main_thread)\n\n    def __restore(self, backup):\n        for variable in self.variables:\n            variable.value = backup[variable]\n\n    @Slot(str)\n    def task(self, task_name):\n\n        self.name = task_name\n\n        # logging.info(\"Preparing calculation in '%s'\" % thread_name())\n        backup_variables = {}\n\n        arrays = []\n        for variable in self.variables:\n            # self.mutex.lock()\n            # variable.value = None\n            backup_variables[variable] = variable.value\n            arrays.append(make_range(**self.values[variable]))\n            # self.variable_changed.wait(self.mutex)\n            # self.mutex.unlock()\n        calculation_points = cartesian(*arrays)\n\n        self.taskStarted.emit(len(calculation_points))\n\n        self.calculation_results = list()\n\n        # logging.info(\"Run calculation of the simulation set in '%s'\" % thread_name())\n        for calculation_point in calculation_points:\n\n            # logging.debug(\"Mutex lock\")\n            self.mutex.lock()\n\n            for variable, value in zip(self.variables, calculation_point):\n                # logging.debug(\"Change variable from thread %s to %s\" % (thread_name(), value))\n                variable.value = value\n\n            # Workaround for thread not to hangs up, wait no more than one second\n            for k in range(100):\n                # while self.stage.has_result:\n                # logging.info(\"Waiting for all variables changed and stage invalidated in '%s'\" % thread_name())\n                # if self.variable_changed.wait(self.mutex, 10):\n                #     logging.info(\"Variables changed done\")\n                if self.variable_changed.wait(self.mutex, 10) and not self.stage.has_result:\n                    break\n            else:\n                logging.warning(\"Stop waiting of all variables changed and stage invalidated in '%s'\" % thread_name())\n\n            if self.__aborted:\n                logging.info(\"Task abort reported by '%s'\" % thread_name())\n                self.mutex.unlock()\n                self.__restore(backup_variables)\n                self.__move_to_main_thread()\n                break\n\n            # logging.info(\"Run stage calculation '%s'\" % thread_name())\n            try:\n                self.calculation_results.append(self.stage.calculate())\n            except Exception:\n                self.calculation_results.append(None)\n                logging.error(\"Error during calculation\")\n            # else:\n            #     logging.info(\"Stage calculation done '%s'\" % thread_name())\n            # self.metrics[] = {metric: SimulationSetsPayload.calc(metric, result) for metric in self.stage.metrics}\n            # logging.info(\"'%s': Result at %s = %s\" % (thread_name(), calculation_point, metrics))\n\n            self.calculationDone.emit()\n\n            # logging.debug(\"Mutex unlock\")\n            self.mutex.unlock()\n        else:\n            self.__done = True\n            self.taskDone.emit()\n            self.__restore(backup_variables)\n            self.__move_to_main_thread()\n\n    def abort(self):\n        if not self.__done and not self.__aborted:\n            # logging.info(\"Abort calculations signal obtained '%s'\" % thread_name())\n            self.__aborted = True\n            # logging.info(\"WakeAll threads for aborting calculation\")\n            self.variable_changed.wakeAll()\n\n\nclass QWorker(QtCore.QThread):\n\n    def __init__(self, payload, *args, **kwargs):\n        super(QWorker, self).__init__(*args, **kwargs)\n        self.__payload = payload\n        self.__payload.moveToThread(self)\n        connect(self.started, self.__payload.start)\n        connect(self.__payload.taskDone, self.quit)\n\n    @Slot()\n    def quit(self):\n        self.__payload.abort()\n        super(QWorker, self).quit()\n\n\nclass SimulationSetsControl(QtGui.QWidget):\n\n    SET_NAME_PATTERN = \"Set #%s\"\n    RESULT_VALUE_PATTERN = \"%s\"\n\n    launched = Signal(str)\n    finished = Signal(SimulationSetsPayload)\n\n    def __init__(self, parent, core):\n        super(SimulationSetsControl, self).__init__(parent)\n\n        self.__core = core\n\n        self.__layout = QtGui.QVBoxLayout(self)\n\n        self.__label_info = QtGui.QLabel(\n            \"Pressing launch button simulation set will be performed \\n\"\n            \"for given input variable till final selected stage not reached.\", self)\n\n        self.__label_final_value = QtGui.QLabel(\"Simulation set result value:\")\n\n        self.__edit_final_value = QtGui.QLineEdit(self)\n        self.__edit_final_value.setReadOnly(True)\n        self.__edit_final_value.setFixedWidth(300)\n\n        self.__layout_control = QtGui.QHBoxLayout()\n        self.__button_launch = QtGui.QPushButton(\"Launch Simulations\", self)\n        self.__button_launch.setFixedWidth(165)\n        self.__button_launch.setEnabled(False)\n        self.__edit_set_name = QtGui.QLineEdit(self.SET_NAME_PATTERN % 1, self)\n        self.__edit_set_name.setFixedWidth(125)\n        self.__layout_control.addWidget(self.__edit_set_name)\n        self.__layout_control.addWidget(self.__button_launch)\n        self.__layout_control.setAlignment(QtCore.Qt.AlignLeft)\n\n        connect(self.__button_launch.clicked, self.__onLaunchButtonClicked)\n\n        self.__label_progress_info = QtGui.QLabel(\"Simulation set progress:\")\n        self.__progress_bar = QtGui.QProgressBar()\n\n        self.__layout.addWidget(self.__label_info)\n        self.__layout.addSpacing(20)\n        self.__layout.addWidget(self.__label_final_value)\n        self.__layout.addWidget(self.__edit_final_value)\n        self.__layout.addLayout(self.__layout_control)\n        self.__layout.addSpacing(20)\n        self.__layout.addWidget(self.__label_progress_info)\n        self.__layout.addWidget(self.__progress_bar)\n\n        self.__layout.setAlignment(QtCore.Qt.AlignTop)\n\n        self.wait_box = msgBox(msgBox.NoIcon, \"Simulations\", \"Please, wait...\", msgBox.Abort, self)\n\n        self.__payload = SimulationSetsPayload()\n        connect(self.launched, self.__payload.task)\n        connect(self.__payload.taskStarted, self.__onTaskStarted)\n        connect(self.__payload.taskDone, self.__onTaskDone)\n        connect(self.__payload.calculationDone, self.__onCalculationDone)\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def __onLaunchButtonClicked(self):\n        connect(self.__payload.stage.invalidated, self.__onStageInvalidated)\n\n        worker = QWorker(self.__payload, objectName=\"WorkerThread\")\n\n        worker.start()\n\n        self.launched.emit(self.__edit_set_name.text())\n\n        self.wait_box.exec_()\n\n        if not self.__payload.done:\n            worker.quit()\n\n        worker.wait()\n\n    # noinspection PyPep8Naming\n    @Slot(int)\n    def __onTaskStarted(self, count):\n        # logging.info(\"Initialize progress bar in '%s'\" % thread_name())\n        self.__progress_bar.setFormat(\"%%p%% (%%v/%s)\" % count)\n        self.__progress_bar.setRange(0, count)\n        self.__progress_bar.setValue(0)\n\n    # noinspection PyPep8Naming\n    @Slot(bool)\n    def __onTaskDone(self):\n        # logging.info(\"Simulation set done '%s'\" % thread_name())\n        self.wait_box.close()\n        self.finished.emit(self.__payload)\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def __onCalculationDone(self):\n        number = self.__progress_bar.value() + 1\n        # logging.info(\"Calculation #%s done reported by '%s'\" % (number, thread_name()))\n        self.__progress_bar.setValue(number)\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def __onStageInvalidated(self):\n        # logging.info(\"Wake all waiting variable in '%s'\" % thread_name())\n        self.__payload.variable_changed.wakeAll()\n\n    @property\n    def stage(self):\n        return self.__stage\n\n    @stage.setter\n    def stage(self, stage):\n        if stage is not None:\n            text = self.RESULT_VALUE_PATTERN % stage.name\n            self.__edit_final_value.setText(text)\n        else:\n            self.__edit_final_value.setText(str())\n        self.__payload.stage = stage\n        self.__button_launch.setEnabled(self.__payload.is_config_ok)\n\n    def set_input_variables(self, data):\n        self.__payload.variables = data\n        self.__button_launch.setEnabled(self.__payload.is_config_ok)\n\n    def set_input_values(self, data):\n        self.__payload.values = data\n        self.__button_launch.setEnabled(self.__payload.is_config_ok)\n\n\nclass OutputVariableBox(AbstractGroupBox):\n\n    finished = Signal(SimulationSetsPayload)\n\n    def __init__(self, parent, core):\n        super(OutputVariableBox, self).__init__(\"Output variable\", parent)\n\n        self.__output_variable_tree = OutputVariableTree(self, core)\n        connect(self.__output_variable_tree.itemSelectionChanged, self.onTreeItemSelectionChanged)\n\n        self.__control_widget = SimulationSetsControl(self, core)\n\n        self.__layout_accres = QtGui.QHBoxLayout()\n        self.__button_accept = QtGui.QPushButton(\"Accept\", self)\n        connect(self.__button_accept.clicked, self.onAcceptButtonClicked)\n        self.__button_accept.setEnabled(False)\n        self.__button_reset = QtGui.QPushButton(\"Reset\", self)\n        connect(self.__button_reset.clicked, self.onResetButtonClicked)\n        self.__button_reset.setEnabled(False)\n        self.__layout_accres.addWidget(self.__button_accept)\n        self.__layout_accres.addWidget(self.__button_reset)\n\n        self.__layout_tree = QtGui.QVBoxLayout()\n        self.__layout_tree.addWidget(self.__output_variable_tree)\n        self.__layout_tree.addLayout(self.__layout_accres)\n\n        self.__layout = QtGui.QHBoxLayout(self)\n        self.__layout.addLayout(self.__layout_tree)\n        self.__layout.addWidget(self.__control_widget)\n\n        connect(self.__control_widget.finished, self.onFinished)\n\n    # noinspection PyPep8Naming\n    @Slot(SimulationSetsPayload)\n    def onFinished(self, results):\n        self.finished.emit(results)\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def onTreeItemSelectionChanged(self):\n        items = self.__output_variable_tree.selectedItems()\n        self.__button_accept.setEnabled(self.__output_variable_tree.stage is None and bool(items))\n        self.__button_reset.setEnabled(self.__output_variable_tree.stage is not None)\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def onAcceptButtonClicked(self):\n        items = self.__output_variable_tree.selectedItems()\n        self.__output_variable_tree.stage = items[0].text(OutputVariableTree.NAME_COLUMN)\n        self.__control_widget.stage = self.__output_variable_tree.stage\n        self.__output_variable_tree.clearSelection()\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def onResetButtonClicked(self):\n        self.__output_variable_tree.stage = None\n        self.__control_widget.stage = None\n        self.__output_variable_tree.clearSelection()\n\n    @Slot(list)\n    def set_input_variables(self, data):\n        self.__control_widget.set_input_variables(data)\n\n    @Slot(dict)\n    def set_input_values(self, data):\n        self.__control_widget.set_input_values(data)\n\n\nclass ConfigurationTab(QStackWidgetTab):\n\n    finished = Signal(SimulationSetsPayload)\n\n    def __init__(self, parent, core):\n        \"\"\"\n        :param QtGui.QWidget parent: Parent widget\n        \"\"\"\n        super(ConfigurationTab, self).__init__(parent)\n\n        self.__core = core\n\n        self.__input_variables_box = InputVariablesBox(self, self.__core.options)\n        self.__output_variables_box = OutputVariableBox(self, self.__core)\n\n        connect(self.__input_variables_box.variablesChanged, self.__output_variables_box.set_input_variables)\n        connect(self.__input_variables_box.valuesChanged, self.__output_variables_box.set_input_values)\n\n        self.__layout = QtGui.QVBoxLayout(self)\n        self.__layout.addWidget(self.__input_variables_box)\n        self.__layout.addWidget(self.__output_variables_box)\n        # self.__layout.addStretch()\n\n        connect(self.__output_variables_box.finished, self.onFinished)\n\n    # noinspection PyPep8Naming\n    @Slot(SimulationSetsPayload)\n    def onFinished(self, results):\n        self.finished.emit(results)\n\n    def onSetActive(self):\n        self.__input_variables_box.setObject(self.__core.options)\n\n\nclass SimulationSetsGraph(QGraphPlot):\n\n    def __init__(self, parent, options):\n        super(SimulationSetsGraph, self).__init__(parent)\n        self.__options = options\n        self.axes = self.add_subplot()\n\n    def _plot_1d(self, results, metric):\n        \"\"\":type results: SimulationSetsPayload\"\"\"\n        variable = results.variables[0]\n        x = make_range(**results.values[variable])\n        values = [metric(calculation_result, **results.stage.metrics_kwargs)\n                  for calculation_result in results.calculation_results]\n        self.axes.plot(x, values, \"o-\", linewidth=2.0, color=COMMON_LINES_COLOR)\n        self.axes.set_xlabel(variable.object.name)\n        self.axes.set_ylabel(metric.caption)\n\n    def _plot_2d(self, results, metric, sequence):\n        variable_x = results.variables[sequence[0]]\n        variable_p = results.variables[sequence[1]]\n\n        x = make_range(**results.values[variable_x])\n        y = make_range(**results.values[variable_p])\n        rows, cols = len(y), len(x)\n\n        # 1  2  3  4\n        # 5  6  7  8\n        # 9 10 11 12\n\n        # 0 4 8\n        # 1 5 9\n\n        for k, p in enumerate(y):\n            if sequence[0] == 0:\n                indexes = range(k, cols*rows + k, rows)\n            else:\n                indexes = range(k*cols, (k+1)*cols)\n\n            current_results = [r for s, r in enumerate(results.calculation_results) if s in indexes]\n            # values = [self.calc(metric, calculation_result) for calculation_result in current_results]\n            values = [metric(calculation_result, **results.stage.metrics_kwargs)\n                      for calculation_result in current_results]\n            self.axes.plot(x, values, marker=\"o\", linewidth=2.0, label=str(p))\n        self.axes.set_xlabel(variable_x.object.name)\n        self.axes.set_ylabel(metric.caption)\n        self.axes.legend()\n\n    # noinspection PyPep8Naming\n    def setObject(self, results, metric, sequence=None):\n        self.axes.clear()\n        if len(results.variables) == 1:\n            self._plot_1d(results, metric)\n        elif len(results.variables) == 2:\n            self._plot_2d(results, metric, sequence)\n        self.axes.grid()\n        self.redraw()\n\n\nclass SimulationResultsContainer(object):\n\n    def __init__(self, payload):\n        \"\"\":type payload: SimulationSetsPayload\"\"\"\n        self.stage = payload.stage\n        self.calculation_results = payload.calculation_results\n        self.values = payload.values\n        self.variables = payload.variables\n\n\nclass SimulationResultsTab(QStackWidgetTab):\n\n    def __init__(self, parent, options):\n        super(SimulationResultsTab, self).__init__(parent)\n\n        self.__results = None\n        \"\"\":type: SimulationSetsPayload\"\"\"\n\n        self.__control_layout = QtGui.QHBoxLayout()\n\n        self.__metric_label = QtGui.QLabel(\"Metric: \", self)\n        self.__metric_combobox = QtGui.QComboBox(self)\n        self.__metric_combobox.setMaximumWidth(300)\n        connect(self.__metric_combobox.currentIndexChanged, self.__onItemChanged)\n        self.__button_exchange = QtGui.QPushButton(\"Exchange\", self)\n        self.__button_exchange.setEnabled(False)\n        connect(self.__button_exchange.clicked, self.__onButtonExchangeClicked)\n        self.__button_export = QtGui.QPushButton(\"Clipboard\", self)\n        connect(self.__button_export.clicked, self.__onButtonExportClicked)\n\n        self.__sequence = [0, 1]\n\n        self.__control_layout.addWidget(self.__metric_label)\n        self.__control_layout.addWidget(self.__metric_combobox)\n        self.__control_layout.addSpacing(10)\n        self.__control_layout.addWidget(self.__button_exchange)\n        self.__control_layout.addWidget(self.__button_export)\n        self.__control_layout.setAlignment(QtCore.Qt.AlignLeft)\n\n        self.__graph = SimulationSetsGraph(self, options)\n        self.__toolbar = NavigationToolbar(self.__graph, self)\n\n        self.__control_layout.addWidget(self.__toolbar)\n\n        self.__layout = QtGui.QVBoxLayout(self)\n        self.__layout.addLayout(self.__control_layout)\n        self.__layout.addWidget(self.__graph)\n\n    # noinspection PyPep8Naming\n    def setObject(self, results):\n        \"\"\":type results: SimulationSetsPayload\"\"\"\n\n        self.__button_exchange.setEnabled(len(results.variables) > 1)\n\n        self.__results = SimulationResultsContainer(results)\n\n        self.__metric_combobox.clear()\n        for metric in results.stage.metrics:\n            self.__metric_combobox.addItem(metric.caption)\n\n        if self.__results.stage.metrics:\n            self.__graph.setObject(self.__results, self.__results.stage.metrics[0], self.__sequence)\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def __onButtonExchangeClicked(self):\n        self.__sequence[0], self.__sequence[1] = self.__sequence[1], self.__sequence[0]\n        index = self.__metric_combobox.currentIndex()\n        self.__graph.setObject(self.__results, self.__results.stage.metrics[index], self.__sequence)\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def __onButtonExportClicked(self):\n        lines = self.__graph.axes.get_lines()\n        if not lines:\n            return\n        line0 = lines[0]\n        data0 = line0.get_xydata()\n        rows = len(lines)\n        cols = data0.shape[0]\n        result = ndarray(shape=[rows+1, cols+1], dtype=float)\n        result[0, 1:] = data0[:, 0]\n        for k, line in enumerate(lines):\n            try:\n                result[k+1, 0] = float(line.get_label())\n            except ValueError:\n                result[k+1, 0] = NaN\n            result[k+1, 1:] = line.get_xydata()[:, 1]\n        s = StringIO()\n        savetxt(s, result.transpose(), fmt='%.5f', delimiter=\"\\t\")\n        # noinspection PyArgumentList\n        clipboard = QtGui.QApplication.clipboard()\n        clipboard.setText(s.getvalue())\n\n    # noinspection PyPep8Naming\n    @Slot()\n    def __onItemChanged(self, index):\n        self.__graph.setObject(self.__results, self.__results.stage.metrics[index], self.__sequence)\n\n\nclass SimulationSets(QStackWidgetTab):\n\n    def __init__(self, parent, core):\n        \"\"\"\n        :param QtGui.QWidget parent: Widget parent\n        \"\"\"\n        super(SimulationSets, self).__init__(parent)\n        self.__tab_widget = QtGui.QTabWidget(self)\n\n        self.__core = core\n\n        self.__configuration_tab = ConfigurationTab(self.__tab_widget, core)\n        self.__result_tabs = dict()\n\n        self.__tab_widget.addTab(self.__configuration_tab, \"Configuration\")\n\n        self.__layout = QtGui.QVBoxLayout()\n        self.__layout.addWidget(self.__tab_widget)\n\n        connect(self.__configuration_tab.finished, self.__onFinished)\n\n    # noinspection PyPep8Naming\n    @Slot(SimulationSetsPayload)\n    def __onFinished(self, results):\n        if results.name in self.__result_tabs:\n            self.__result_tabs[results.name].setObject(results)\n        else:\n            self.__result_tabs[results.name] = SimulationResultsTab(self, self.__core.options)\n            self.__tab_widget.addTab(self.__result_tabs[results.name], results.name)\n            self.__result_tabs[results.name].setObject(results)\n\n    def onSetActive(self):\n        self.__configuration_tab.onSetActive()\n"
  },
  {
    "path": "OptolithiumGui/views/simulations.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport logging as module_logging\nimport optolithiumc as oplc\n\nfrom numpy import rot90, asfortranarray, linspace, round, arange\nfrom scipy.interpolate import interp2d\nfrom matplotlib.collections import PathCollection\nfrom matplotlib.patches import Polygon, Rectangle\nfrom matplotlib.colors import BoundaryNorm\n# from mpl_toolkits.mplot3d.art3d import Poly3DCollection\nfrom qt import QtGui, QtCore, connect, Slot\nfrom config import COMMON_LINES_COLOR, RESIST_FILL_COLOR, RESIST_LINES_COLOR, RESIST_CONTOUR_COLOR\nfrom views.common import QStackWidgetTab, QGraphPlot, QMetrologyTable, \\\n    ProlithColormap, show_traceback, NavigationToolbar\nfrom metrics import contour_sign\n\nimport helpers\n\n\n__author__ = 'Alexei Gladkikh'\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.DEBUG)\nhelpers.logStreamEnable(logging)\n\n\ndef get_selection_rectangle(x0, y0, event):\n    right, left = (x0, event.xdata) if x0 > event.xdata else (event.xdata, x0)\n    top, bottom = (y0, event.ydata) if y0 > event.ydata else (event.ydata, y0)\n    return right, left, top, bottom\n\n\ndef get_selection_percentage(right, left, top, bottom, xlim, ylim):\n    perc_x = float(right - left) / float(xlim[1] - xlim[0]) * 100\n    perc_y = float(top - bottom) / float(ylim[1] - ylim[0]) * 100\n    return perc_x, perc_y\n\n\nclass Ability(object):\n\n    p1d = 0   # graph 1d\n    xy2d = 1  # xy plot 2d\n    xz2d = 2  # xz or yz plot 2d (image)\n    p2d = 3   # profile 2d\n    p3d = 4   # profile 3d\n\n    def enable(self, axes):\n        raise NotImplementedError(\"Ability enable method not implemented\")\n\n    def disable(self):\n        raise NotImplementedError(\"Ability disable method not implemented\")\n\n    @property\n    def suites(self):\n        raise NotImplementedError(\"Suites property not implemented\")\n\n\nclass RulerAbility(Ability):\n\n    SNAP_DISTANCE = 10.0\n    SINGLE_CLICK_DISTANCE = 10.0\n    MEASURE_MOUSE_BUTTON = 1\n\n    Arbitrary = 0\n    Manhattan = 1\n    Diagonal = 2\n\n    def __init__(self):\n        self.__axes = None\n        self.__enabled = False\n\n        self.__pressed_x = None\n        self.__pressed_y = None\n        self.__pressed = False\n\n        self.__press_cid = None\n        self.__release_cid = None\n        self.__motion_cid = None\n        self.__key_press_cid = None\n        self.__key_release_cid = None\n\n        self.__current_ruler = None\n\n        self.__shift_held = False\n        self.__ctrl_held = False\n\n        self.__rulers = []\n\n    def enable(self, axes):\n        if not self.__enabled:\n            self.__axes = axes\n            self.__press_cid = self.__axes.figure.canvas.mpl_connect(\"button_press_event\", self._on_mouse_press)\n            self.__release_cid = self.__axes.figure.canvas.mpl_connect(\"button_release_event\", self._on_mouse_release)\n            self.__motion_cid = self.__axes.figure.canvas.mpl_connect(\"motion_notify_event\", self._on_mouse_move)\n            self.__key_press_cid = self.__axes.figure.canvas.mpl_connect(\"key_press_event\", self._on_key_press)\n            self.__key_release_cid = self.__axes.figure.canvas.mpl_connect(\"key_release_event\", self._on_key_release)\n            self.__enabled = True\n        elif self.__axes is not axes:\n            self.disable()\n            self.enable(axes)\n\n    def disable(self):\n        if self.__enabled:\n            self.__axes.figure.canvas.mpl_disconnect(self.__press_cid)\n            self.__axes.figure.canvas.mpl_disconnect(self.__release_cid)\n            self.__axes.figure.canvas.mpl_disconnect(self.__motion_cid)\n            self.__axes.figure.canvas.mpl_disconnect(self.__key_press_cid)\n            self.__axes.figure.canvas.mpl_disconnect(self.__key_release_cid)\n            self.__axes = None\n            self.__enabled = False\n\n    @property\n    def suites(self):\n        return [Ability.p2d, Ability.xy2d]\n\n    def _on_key_press(self, event):\n        logging.info(\"key pressed = %s\" % event)\n        if event.key == \"shift\":\n            self.__shift_held = True\n        elif event.key == \"ctrl\":\n            self.__ctrl_held = True\n\n    def _on_key_release(self, event):\n        if event.key == \"shift\":\n            self.__shift_held = False\n        elif event.key == \"ctrl\":\n            self.__ctrl_held = False\n\n    def _on_mouse_press(self, event):\n        # logging.info(\"Mouse press event\")\n        if self.__enabled and event.inaxes == self.__axes and event.button == self.MEASURE_MOUSE_BUTTON:\n            self.__pressed_x = event.xdata\n            self.__pressed_y = event.ydata\n            self.__pressed = True\n\n    def _lookup_nearest_point(self, event):\n\n        def _check_polygon(_points, _polygon, _clicked_point):\n            for k in range(len(_polygon)-2):\n                edge = oplc.Edge2d(_polygon[k][0], _polygon[k][1], _polygon[k+1][0], _polygon[k+1][1])\n                normal_point = _clicked_point.normal_intersect(edge)\n                if normal_point.classify(edge) == oplc.BETWEEN:\n                    _points.append(normal_point)\n\n        possible_points = []\n        clicked_point = oplc.Point2d(event.xdata, event.ydata)\n        # logging.info(\"Collections: %s\" % self.__axes.collections)\n        for collection in filter(lambda c: isinstance(c, PathCollection), self.__axes.collections):\n            for path in collection.get_paths():\n                for polygon in path.to_polygons():\n                    # logging.info(\"POLYGON: %s\" % len(polygon))\n                    # Matplotlib duplicate the last point of the polygon to times\n                    # (also this point is close polygon, e.i. equal to first)\n                    _check_polygon(possible_points, polygon, clicked_point)\n\n                    # for k in range(len(polygon)-2):\n                    #     edge = oplc.Edge(polygon[k][0], polygon[k][1], polygon[k+1][0], polygon[k+1][1])\n                    #     normal_point = clicked_point.normal_intersect(edge)\n                    #     if normal_point.classify(edge) == oplc.BETWEEN:\n                    #         possible_points.append(normal_point)\n\n        for polygon in filter(lambda p: isinstance(p, Polygon), self.__axes.patches):\n            _check_polygon(possible_points, polygon.xy, clicked_point)\n\n        # logging.info(\"POINTS: %s\" % possible_points)\n        if possible_points:\n            nearest_point = min(possible_points, key=lambda p: oplc.Edge2d(p, clicked_point).length())\n            e = oplc.Edge2d(nearest_point, clicked_point)\n            xlim = self.__axes.get_xlim()\n            ylim = self.__axes.get_ylim()\n            p_x = abs(e.dx()) / (xlim[1] - xlim[0]) * 100\n            p_y = abs(e.dy()) / (ylim[1] - ylim[0]) * 100\n            if p_x < self.SNAP_DISTANCE and p_y < self.SNAP_DISTANCE:\n                return nearest_point\n\n        return None\n\n    def _normalize_last_point(self, edge):\n        \"\"\":type edge: oplc.Edge2d \"\"\"\n        if self.__shift_held:\n            if edge.dx() < edge.dy():\n                edge.org.x = edge.dst.x\n            else:\n                edge.org.y = edge.dst.y\n\n    def _on_mouse_release(self, event):\n        # logging.info(\"Mouse release event\")\n        if self.__enabled and event.inaxes == self.__axes and event.button == self.MEASURE_MOUSE_BUTTON:\n            right, left, top, bottom = get_selection_rectangle(self.__pressed_x, self.__pressed_y, event)\n            perc_x, perc_y = get_selection_percentage(\n                right, left, top, bottom, self.__axes.get_xlim(), self.__axes.get_ylim())\n\n            if perc_x < 1.0 and perc_y < 1.0:\n                nearest_point = self._lookup_nearest_point(event)\n                if nearest_point is not None:\n                    if self.__current_ruler is None:\n                        self.__current_ruler = self.__axes.annotate(\n                            '', xy=(nearest_point.x, nearest_point.y), xycoords=\"data\",\n                            xytext=(event.xdata, event.ydata), textcoords=\"data\", size=20, color=\"r\",\n                            arrowprops=dict(arrowstyle=\"<|-|>\", mutation_scale=20, edgecolor=\"k\",\n                                            linewidth=2, shrinkA=0, shrinkB=0))\n                        # self.__axes.add_line(self.__current_ruler)\n                    else:\n                        x0 = self.__current_ruler.xy[0]\n                        y0 = self.__current_ruler.xy[1]\n                        edge = oplc.Edge2d(nearest_point.x, nearest_point.y, x0, y0)\n                        self._normalize_last_point(edge)\n                        self.__rulers.append(self.__current_ruler)\n                        self.__current_ruler = None\n                        self.__rulers[-1].xytext = (edge.org.x, edge.org.y)\n                        text = \"%.1f\" % edge.length()\n                        self.__rulers[-1].set_text(text)\n\n        self.__pressed_x = self.__pressed_y = None\n        self.__pressed = False\n        self.__axes.figure.canvas.draw()\n\n    def _on_mouse_move(self, event):\n        # logging.info(\"Mouse moved\")\n        if event.inaxes == self.__axes and self.__current_ruler is not None:\n            x0 = self.__current_ruler.xy[0]\n            y0 = self.__current_ruler.xy[1]\n            self.__current_ruler.xytext = (event.xdata, event.ydata)\n            self.__current_ruler.set_text(\"%.1f\" % oplc.Edge2d(event.xdata, event.ydata, x0, y0).length())\n            self.__axes.figure.canvas.draw()\n\n\nclass GetPointAbility(Ability):\n\n    def __init__(self):\n        self.__axes = None\n        self.__enabled = False\n        self.__press_cid = None\n        self.__interp = None\n\n    def enable(self, axes):\n        if not self.__enabled:\n            self.__axes = axes\n            self.__press_cid = self.__axes.figure.canvas.mpl_connect(\"button_press_event\", self._on_mouse_press)\n            data = self.__axes.images[0].get_array()\n            rows, cols = data.shape\n            xlim = self.__axes.get_xlim()\n            ylim = self.__axes.get_ylim()\n            self.__interp = interp2d(x=linspace(xlim[0], xlim[1], cols), y=linspace(ylim[1], ylim[0], rows), z=data)\n            self.__enabled = True\n        elif self.__axes is not axes:\n            self.disable()\n            self.enable(axes)\n\n    def disable(self):\n        if self.__enabled:\n            self.__axes.figure.canvas.mpl_disconnect(self.__press_cid)\n            self.__axes = None\n            self.__enabled = False\n\n    @property\n    def suites(self):\n        return [Ability.xz2d]\n\n    def _on_mouse_press(self, event):\n        # logging.info(\"Mouse press event\")\n        if self.__enabled and event.inaxes == self.__axes and event.button == 1 and event.dblclick:\n            z = self.__interp(event.xdata, event.ydata)\n            self.__axes.text(event.xdata, event.ydata, \"%.3f\" % z, fontsize=20, color='crimson')\n            self.__axes.plot(event.xdata, event.ydata, \"o\", color=COMMON_LINES_COLOR)\n            logging.info(\"X = %.2f Y = %.2f Z = %.2f\" % (event.xdata, event.ydata, z))\n            self.__axes.figure.canvas.draw()\n\n\nAXES_NAMES_MAPPING = {\n    oplc.X_1D: [\"X Position (nm)\", \"Intensity\"],\n    oplc.Y_1D: [\"Y Position (nm)\", \"Intensity\"],\n    oplc.XY_2D: [\"X Position (nm)\", \"Y Position (nm)\"],\n    oplc.XZ_2D: [\"X Position (nm)\", \"Z Position (nm)\"],\n    oplc.YZ_2D: [\"Y Position (nm)\", \"Z Position (nm)\"],\n    oplc.XYZ_3D: [\"X Position (nm)\", \"Y Position (nm)\", \"Z Position (nm)\"]\n}\n\n\nclass _ResistSimulationsGraphBase(QGraphPlot):\n\n    _extent_coef = 1.2\n    _aspect_thresh = 10.0\n    _aspect_coef = 2.0\n    _abilities_types = []\n\n    def __init__(self, parent, options):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type options: options.structures.Options\n        \"\"\"\n        super(_ResistSimulationsGraphBase, self).__init__(parent)\n        self.setMinimumSize(600, 600)\n\n        self._options = options\n\n        self.__current_axes = None\n        self.__resist_volume = None\n        self.__draw_mask = False\n        self.__mask_polygons = []\n\n        self.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding)\n\n        self._abilities = [cls() for cls in self.__class__._abilities_types]\n\n    def _plot1d(self, x, values, **kwargs):\n        raise NotImplementedError(\"Plot of the 1D resist volume data is not implemented\")\n\n    def _plot2dxy(self, x, y, values, **kwargs):\n        raise NotImplementedError(\"Plot of the 2D top view resist volume data is not implemented\")\n\n    def _plot2dxz(self, x, z, values, **kwargs):\n        raise NotImplementedError(\"Plot of the 2D cross section view resist volume data is not implemented\")\n\n    def _plot3d(self, x, y, z, values, **kwargs):\n        raise NotImplementedError(\"Plot of the 3D resist volume data is not implemented\")\n\n    def _plot2d_profile(self, x, z, polygons, **kwargs):\n        raise NotImplementedError(\"Plot of the 2D resist profile data is not implemented\")\n\n    def _plot3d_profile(self, x, y, z, polygons, **kwargs):\n        raise NotImplementedError(\"Plot of the 3D resist profile data is not implemented\")\n\n    def _enable_abilities(self, axes, suite):\n        \"\"\":param int suite: One of Ability suite\"\"\"\n        for ability in self._abilities:\n            if suite in ability.suites:\n                ability.enable(axes)\n\n    def _disable_abilities(self):\n        for ability in self._abilities:\n            ability.disable()\n\n    def _draw_resist_volume(self, resist_volume, **kwargs):\n        self.__resist_volume = resist_volume\n        if resist_volume.has_x and resist_volume.has_y:\n            if resist_volume.has_z:\n                ax = self._plot3d(resist_volume.x, resist_volume.y, resist_volume.z, resist_volume.values, **kwargs)\n                self._enable_abilities(ax, Ability.p3d)\n            else:\n                ax = self._plot2dxy(resist_volume.x, resist_volume.y, resist_volume.values[:, :, 0], **kwargs)\n                self._enable_abilities(ax, Ability.xy2d)\n        elif resist_volume.has_x:\n            if not resist_volume.has_z:\n                ax = self._plot1d(resist_volume.x, resist_volume.values[0, :, 0], **kwargs)\n                self._enable_abilities(ax, Ability.p1d)\n            else:\n                ax = self._plot2dxz(resist_volume.x, resist_volume.z, resist_volume.values[0, :, :], **kwargs)\n                self._enable_abilities(ax, Ability.xz2d)\n        elif resist_volume.has_y:\n            if not resist_volume.has_z:\n                ax = self._plot1d(resist_volume.y, resist_volume.values[:, 0, 0], **kwargs)\n                self._enable_abilities(ax, Ability.p1d)\n            else:\n                ax = self._plot2dxz(resist_volume.y, resist_volume.z, resist_volume.values[:, 0, :], **kwargs)\n                self._enable_abilities(ax, Ability.xz2d)\n        else:\n            raise RuntimeError(\"Can't plot given empty data\")\n        axes_names = AXES_NAMES_MAPPING[resist_volume.axes]\n        ax.set_xlabel(axes_names[0])\n        ax.set_ylabel(axes_names[1])\n        return ax\n\n    def _draw_resist_profile(self, resist_profile, **kwargs):\n        \"\"\":type resist_profile: oplc.ResistProfile\"\"\"\n        if resist_profile.axes == oplc.XYZ_3D:\n            ax = self._plot3d_profile(\n                resist_profile.x, resist_profile.y,\n                resist_profile.z, resist_profile.polygons, **kwargs)\n            self._enable_abilities(ax, Ability.p3d)\n        elif resist_profile.axes == oplc.XZ_2D:\n            ax = self._plot2d_profile(resist_profile.x, resist_profile.z, resist_profile.polygons, **kwargs)\n            self._enable_abilities(ax, Ability.p2d)\n        elif resist_profile.axes == oplc.YZ_2D:\n            ax = self._plot2d_profile(resist_profile.y, resist_profile.z, resist_profile.polygons, **kwargs)\n            self._enable_abilities(ax, Ability.p2d)\n        else:\n            raise RuntimeError(\"Wrong resist profile data\")\n        axes_names = AXES_NAMES_MAPPING[resist_profile.axes]\n        ax.set_xlabel(axes_names[0])\n        ax.set_ylabel(axes_names[1])\n        return ax\n\n    def _add_mask(self, axes):\n        if axes is None:\n            logging.warning(\"Trying to draw mask on non-existing axes\")\n            return\n\n        mask = self._options.mask.container\n        # Centering mask - that required for diffraction calculation and aerial_image will be centered also in core\n        offset = mask.boundary[0] + (mask.boundary[1] - mask.boundary[0]) / 2.0\n        \"\"\":type: Point\"\"\"\n        for region in mask.regions:\n            xy = [[p.x - offset.x, p.y - offset.y] for p in region.points]\n            self.__mask_polygons.append(axes.add_patch(Polygon(xy, alpha=0.25, facecolor=\"black\")))\n            self.__mask_polygons.append(axes.add_patch(Polygon(xy, fill=False, edgecolor=\"crimson\", linewidth=1.25)))\n        self.__draw_mask = True\n\n    def _clear_mask(self):\n        for polygon in self.__mask_polygons:\n            polygon.remove()\n        self.__mask_polygons = []\n        self.__draw_mask = False\n\n    @property\n    def draw_mask(self):\n        return self.__draw_mask\n\n    @draw_mask.setter\n    def draw_mask(self, enabled):\n        if not enabled:\n            self._clear_mask()\n            self.redraw()\n        elif self.__resist_volume.axes == oplc.XY_2D:\n            self._add_mask(self.__current_axes)\n            self.redraw()\n\n    _drawers = {\n        oplc.RESIST_VOLUME: _draw_resist_volume,\n        oplc.RESIST_PROFILE: _draw_resist_profile\n    }\n\n    def draw_graph(self, resist_data, graph_title, **kwargs):\n        was_mask_enabled = self.draw_mask\n        self._clear_mask()\n        self._figure.clear()\n        # noinspection PyCallingNonCallable\n        self.__current_axes = self._drawers[resist_data.type](self, resist_data, **kwargs)\n        self.__current_axes.set_title(graph_title)\n        self.__current_axes.grid()\n        if was_mask_enabled:\n            self._add_mask(self.__current_axes)\n        self.redraw()\n\n\nclass _CommonResistSimulationsGraph(_ResistSimulationsGraphBase):\n\n    def _draw_graph_2dxz(self, ax, cb, x, z, values, **kwargs):\n        raise NotImplementedError(\"Class %s has not implemented method\" % self.__class__.__name__)\n\n    # noinspection PyUnusedLocal\n    def _plot1d(self, x, values, **kwargs):\n        ax = self.add_subplot()\n        ax.set_ylabel(\"Intensity\")\n        ax.plot(x, values, linewidth=3.5, color=COMMON_LINES_COLOR)\n        ax.set_xlim(min(x), max(x))\n        ax.set_ylim(0.0, max(values) * self._extent_coef)\n        ax.set_aspect(\"auto\")\n        return ax\n\n    def _plot2dxy(self, x, y, values, **kwargs):\n        ax = self.add_subplot()\n\n        ax.set_xlabel(\"X coordinates (nm)\")\n        ax.set_ylabel(\"Y coordinates (nm)\")\n\n        ax.set_xlim(left=min(x), right=max(x))\n        ax.set_ylim(bottom=min(y), top=max(y))\n\n        level = kwargs.get(\"level\")\n\n        ax.contourf(x, y, values[:, :], colors=RESIST_FILL_COLOR, levels=[0.0, level])\n        ax.contour(x, y, values[:, :], colors=RESIST_LINES_COLOR, levels=[0.0, 0.3])\n\n        ax.set_aspect(\"equal\")\n\n        return ax\n\n    @staticmethod\n    def _set_scale(ax, left, right, top, bottom):\n        aspect = (right - left) / (top - bottom)\n        if 1.0/_ResistSimulationsGraphBase._aspect_thresh < aspect < _ResistSimulationsGraphBase._aspect_thresh:\n            ax.set_aspect(\"equal\")\n        else:\n            ax.set_aspect((right - left) / (top - bottom) / _ResistSimulationsGraphBase._aspect_coef)\n            ax.set_title(ax.title.get_text() + \" (NOT IN SCALE)\")\n\n    def _plot2dxz(self, x, z, values, **kwargs):\n        # Rotate required because when slices row-slice or col-slice matrix is rotated\n        values = rot90(values)\n\n        ax = self.add_subplot(211)\n        cb = self.add_subplot(212)\n\n        self._draw_graph_2dxz(ax, cb, x, z, values, **kwargs)\n\n        left, right, bottom, top = min(x), max(x), min(z), max(z)\n        ax.set_xlim(left, right)\n        ax.set_ylim(bottom, top)\n\n        level = kwargs.get(\"level\")\n\n        negative = contour_sign(self._options.mask.container.background, **kwargs)\n\n        polygons = oplc.contours(asfortranarray(x), asfortranarray(z), asfortranarray(values), level, negative)\n        # logging.info(\"Total contours found: %s\" % len(polygons))\n        for polygon in polygons:\n            # logging.info(\"Contour: %s\" % polygon)\n            xy = [[edge.org.x, edge.org.y] for edge in polygon]\n            ax.add_patch(Polygon(xy, fill=False, edgecolor=COMMON_LINES_COLOR, linewidth=3.0))\n\n        _CommonResistSimulationsGraph._set_scale(ax, left, right, top, bottom)\n\n        return ax\n\n    def _plot3d(self, x, y, z, values, **kwargs):\n        \"\"\"\n        This is only for testing not complete yet!!!\n        \"\"\"\n        import numpy\n        from matplotlib import cm\n        from mpl_toolkits.mplot3d.art3d import Poly3DCollection\n        from matplotlib.tri import Triangulation\n\n        ax = self.add_subplot(projection=\"3d\")\n        ax.set_aspect(\"equal\")\n\n        # ax.set_xlabel(\"X coordinates (nm)\")\n        # ax.set_ylabel(\"Y coordinates (nm)\")\n        # ax.set_zlabel(\"Z coordinates (nm)\")\n\n        level = kwargs.get(\"level\")\n        negative = contour_sign(self._options.mask.container.background, **kwargs)\n        surface = oplc.isosurface(\n            asfortranarray(x), asfortranarray(y), asfortranarray(z[::-1]),\n            asfortranarray(values), level, negative)\n\n        # logging.info(\"X = %s, Y = %s, Z = %s\" % (surface.x, surface.y, surface.z))\n\n        # ax.plot_trisurf(\n        #     surface.x, surface.y, surface.z,\n        #     shade=True, color=RESIST_FILL_COLOR, linewidth=0.1, edgecolor=\"white\")\n        #\n        # vx = max(x) - min(x)\n        # vy = max(y) - min(y)\n        # vz = max(z) - min(z)\n        # max_v = max(vx, vy, vz)\n        # ax.pbaspect = [vx / max_v, vy / max_v, vz / max_v]\n        # ax.auto_scale_xyz(x, y, z, True)\n\n        normals = []\n        faces = []\n        for triangle in surface.triangles:\n            face = numpy.asarray([\n                (triangle.a.x, triangle.a.y, triangle.a.z),\n                (triangle.b.x, triangle.b.y, triangle.b.z),\n                (triangle.c.x, triangle.c.y, triangle.c.z)])\n            faces.append(face)\n            n = triangle.normal()\n            normals.append(numpy.asarray([n.x, n.y, n.z]))\n\n        # colset = ax._shade_colors(RESIST_FILL_COLOR, normals)\n        polyc = Poly3DCollection(faces, facecolors=RESIST_FILL_COLOR, linewidths=0.01, edgecolors=\"black\")\n        # polyc.set_facecolors(colset)\n        ax.add_collection(polyc)\n        max_x, min_x = max(x), min(x)\n        max_y, min_y = max(y), min(y)\n        max_z, min_z = max(z), min(z)\n        vx = max_x - min_x\n        vy = max_y - min_y\n        vz = max_z - min_z\n        max_v = max(vx, vy, vz)\n        ax.pbaspect = [vx / max_v, vy / max_v, vz / max_v]\n        ax.auto_scale_xyz([min_x, max_x], [min_y, max_y], [min_z, max_z], True)\n\n        return ax\n\n\nclass ImageResistSimulationsGraph(_CommonResistSimulationsGraph):\n\n    _abilities_types = [RulerAbility, GetPointAbility]\n\n    def _draw_graph_2dxz(self, ax, cb, x, z, values, **kwargs):\n        title = kwargs.get(\"title\")\n        left, right, bottom, top = min(x), max(x), min(z), max(z)\n        img = ax.imshow(\n            values, cmap=ProlithColormap, interpolation='nearest',\n            extent=[left, right, bottom, top], vmin=values.min(), vmax=values.max())\n        ticks = round(linspace(start=float(values.min()), stop=float(values.max()), num=10), 4)\n        self._figure.colorbar(img, cax=cb, ticks=ticks, orientation='horizontal')\n        cb.set_aspect(0.05)\n        cb.set_title(title)\n\n\nclass ContourResistSimulationsGraph(_CommonResistSimulationsGraph):\n\n    _abilities_types = []\n    _max_time = 20000.0\n\n    @staticmethod\n    def _levels(values, development):\n        base = development.develop_time.value / 8.0\n        levels = 2 ** arange(0, 9) * base\n        \"\"\":type: numpy.multiarray.ndarray\"\"\"\n        levels[0] = 0.0\n        levels[-1] = max(ContourResistSimulationsGraph._max_time, values.max(), levels.max())\n        return round(levels, 3)\n\n    def _draw_graph_2dxz(self, ax, cb, x, z, values, **kwargs):\n        title = kwargs.get(\"title\")\n        levels = self._levels(values, self._options.development)\n        boundary_norm = BoundaryNorm(levels, ProlithColormap.N)\n        img = ax.contourf(x, z, values, cmap=ProlithColormap, levels=levels, norm=boundary_norm)\n        ax.contour(x, z, values, colors=RESIST_CONTOUR_COLOR, levels=levels)\n        self._figure.colorbar(img, cax=cb, ticks=levels, orientation='horizontal')\n        cb.set_aspect(0.05)\n        cb.set_title(title)\n\n\nclass ProfileResistSimulationsGraph(_CommonResistSimulationsGraph):\n\n    _abilities_types = [RulerAbility]\n\n    def _plot2d_profile(self, x, z, polygons, **kwargs):\n        ax = self.add_subplot()\n\n        left, right, bottom, top = min(x), max(x), min(z), max(z)\n        ax.set_xlim(left, right)\n        ax.set_ylim(bottom, top)\n\n        # logging.info(\"Total contours found: %s\" % len(polygons))\n        for polygon in polygons:\n            # logging.info(\"Contour: %s\" % polygon)\n            xy = [[edge.org.x, edge.org.y] for edge in polygon]\n            ax.add_patch(Polygon(xy, facecolor=RESIST_FILL_COLOR, edgecolor=RESIST_LINES_COLOR, linewidth=3.0))\n\n        # Test of angle determination\n        # from numpy import isnan\n        # from metrics import _calculate_lstsq_v2\n        # from matplotlib.lines import Line2D\n        # a_b = _calculate_lstsq_v2(polygons)\n        # if isinstance(a_b, tuple):\n        #     a, b = a_b\n        #     f = lambda x: a*x+b\n        #     x = [f(bottom), f(top)]\n        #     y = [bottom, top]\n        #     logging.info(\"x = %s, y = %s\" % (x, y))\n        #     ax.add_line(Line2D(x, y, lw=5., color='r'))\n\n        _CommonResistSimulationsGraph._set_scale(ax, left, right, top, bottom)\n\n        return ax\n\n\n# noinspection PyPep8Naming\ndef SimulationViewsFactory(graph_class):\n\n    class _AbstractSimulationsView(QStackWidgetTab):\n\n        _graph_class = None\n\n        def __init__(self, parent, stage, options):\n            \"\"\"\n            :param QtGui.QWidget parent: Resist simulation view widget parent\n            \"\"\"\n            super(_AbstractSimulationsView, self).__init__(parent)\n\n            self.__options = options\n            self.__stage = stage\n\n            self.__metrology_label = QtGui.QLabel(\"Metrology results:\", self)\n\n            self._parameters = QMetrologyTable(self, stage.metrics)\n\n            self.__x_axis_label = QtGui.QLabel(\"X Axis:\", self)\n            self._x_axis_edit = QtGui.QLineEdit(self)\n            self._x_axis_edit.setEnabled(False)\n            self._x_axis_edit.setFixedWidth(self._parameters.width())\n\n            self.__y_axis_label = QtGui.QLabel(\"Y Axis:\", self)\n            self._y_axis_edit = QtGui.QLineEdit(self)\n            self._y_axis_edit.setEnabled(False)\n            self._y_axis_edit.setFixedWidth(self._parameters.width())\n\n            self._draw_mask_chkbox = QtGui.QCheckBox(\"Draw original mask\", self)\n            connect(self._draw_mask_chkbox.toggled, self.on_draw_mask_chkbox_toggled)\n            self._draw_mask_chkbox.setChecked(False)\n\n            self.__parameters_layout = QtGui.QVBoxLayout()\n            self.__parameters_layout.addWidget(self.__x_axis_label)\n            self.__parameters_layout.addWidget(self._x_axis_edit)\n            self.__parameters_layout.addSpacing(10)\n            self.__parameters_layout.addWidget(self.__y_axis_label)\n            self.__parameters_layout.addWidget(self._y_axis_edit)\n            self.__parameters_layout.addSpacing(30)\n            self.__parameters_layout.addWidget(self.__metrology_label)\n            self.__parameters_layout.addWidget(self._parameters)\n            self.__parameters_layout.addWidget(self._draw_mask_chkbox)\n            self.__parameters_layout.addStretch()\n\n            self._graph = graph_class(self, options)\n            self._toolbar = NavigationToolbar(self._graph, self)\n\n            self.__graph_layout = QtGui.QVBoxLayout()\n            # self.__graph_layout.setAlignment(QtCore.Qt.AlignTop | QtCore.Qt.AlignHCenter)\n            self.__graph_layout.addWidget(self._toolbar)\n            self.__graph_layout.addWidget(self._graph)\n            self.__graph_layout.addStretch()\n\n            self.__layout = QtGui.QHBoxLayout(self)\n            self.__layout.addLayout(self.__parameters_layout)\n            self.__layout.addLayout(self.__graph_layout)\n\n        @property\n        def options(self):\n            return self.__options\n\n        @Slot(bool)\n        def on_draw_mask_chkbox_toggled(self, state):\n            self._graph.draw_mask = state\n\n        @show_traceback\n        def onSetActive(self):\n            data = self.__stage.calculate()\n            axes_names = AXES_NAMES_MAPPING[data.axes]\n            self._x_axis_edit.setText(axes_names[0])\n            self._y_axis_edit.setText(axes_names[1])\n            self._draw_mask_chkbox.setEnabled(data.axes == oplc.XY_2D)\n            self._graph.draw_graph(data, self.__stage.name, **self.__stage.metrics_kwargs)\n            self._parameters.setObject(data, **self.__stage.metrics_kwargs)\n\n    return _AbstractSimulationsView\n\n\n_ImageViewClass = SimulationViewsFactory(ImageResistSimulationsGraph)\n_ContourViewClass = SimulationViewsFactory(ContourResistSimulationsGraph)\n_ProfileViewClass = SimulationViewsFactory(ProfileResistSimulationsGraph)\n\n\nAerialImageView = ImageInResistView = LatentImageView = PebLatentImageView = _ImageViewClass\nDevelopContoursView = _ContourViewClass\nResistProfileView = _ProfileViewClass"
  },
  {
    "path": "OptolithiumGui/views/summary.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport logging as module_logging\n\nfrom qt import QtGui, QtWebKit\nfrom resources import Resources\nfrom views.common import QStackWidgetTab\n\nimport helpers\nimport options\n\n\n__author__ = 'Alexei Gladkikh'\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.INFO)\nhelpers.logStreamEnable(logging)\n\n\nclass SummaryView(QStackWidgetTab):\n\n    def __init__(self, parent, opts):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :param options.Options opts: Program options\n        \"\"\"\n        QStackWidgetTab.__init__(self, parent)\n\n        self.__options = opts\n        self.__template = Resources(\"xhtml/report\")\n        \"\"\":type: str\"\"\"\n\n        self.web_view = QtWebKit.QWebView(self)\n\n        self.__layout = QtGui.QHBoxLayout(self)\n        self.__layout.addWidget(self.web_view)\n\n    def onSetActive(self):\n        html = self.__template % {\"filename\": self.__options.filename, \"body\": self.__options.report()}\n        self.web_view.setHtml(html)\n\n    def print_(self, printer):\n        self.web_view.print_(printer)\n\n    def reset(self):\n        self.onSetActive()\n"
  },
  {
    "path": "OptolithiumGui/views/wafer.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# This file is part of Optolithium lithography modelling software.\n#\n# Copyright (C) 2015 Alexei Gladkikh\n#\n# This software is dual-licensed: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version only for NON-COMMERCIAL usage.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n#\n# If you are interested in other licensing models, including a commercial-\n# license, please contact the author at gladkikhalexei@gmail.com\n\nimport collections\nimport logging as module_logging\n\nfrom qt import QtGui, QtCore, connect, Signal, Slot, GlobalSignals\nfrom resources import Resources\nfrom database import orm\nfrom database.common import ApplicationDatabase\nfrom views.common import QStackWidgetTab, QLineEditNumeric, QLabelMulti, \\\n    QGraphPlot, QuestionBox, msgBox, calculate_table_width\n\nimport options.structures\n\nimport config\nimport helpers\n\n\n__author__ = 'Alexei Gladkikh'\n\n\nlogging = module_logging.getLogger(__name__)\nlogging.setLevel(module_logging.INFO)\nhelpers.logStreamEnable(logging)\n\n\nclass MaterialPlot(QGraphPlot):\n\n    def __init__(self, parent, stack_layer=None, width=600, height=300):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type stack_layer: options.WaferStackLayer\n        :type width: int\n        :type height: int\n        \"\"\"\n        QGraphPlot.__init__(self, parent, width=width, height=height)\n        if stack_layer is not None:\n            self.draw_layer(stack_layer)\n\n    # noinspection PyPep8Naming\n    def draw_layer(self, stack_layer, wavelength=None):\n        \"\"\"\n        :type stack_layer: options.WaferStackLayer\n        :type wavelength: float or None\n        \"\"\"\n        self.clear()\n\n        real_ax = self.add_subplot()\n        imag_ax = real_ax.twinx()\n\n        if wavelength is not None:\n            re, im = stack_layer.refraction_at(wavelength)\n            real_ax.set_title(\"Refractive index at %.0f nm: %.2f%+.2fi\" % (wavelength, re, im))\n        else:\n            real_ax.set_title(\"Refractive index data of %s\" % stack_layer.name)\n\n        wvl = stack_layer.wavelength\n        real, imag = stack_layer.refraction\n\n        real_ax.plot(wvl, real, \"r-\", label=\"real\")\n        imag_ax.plot(wvl, imag, \"g-\", label=\"imag\")\n\n        real_ax.legend(loc=0)\n        real_ax.grid()\n\n        real_ax.set_xlabel(\"Wavelength (nm)\")\n        real_ax.set_ylabel(\"Refractive index (real)\")\n        imag_ax.set_ylabel(\"Refractive index (imag)\")\n\n        real_ax.patch.set_alpha(0.0)\n\n        self.redraw()\n\n\nclass LoadMaterialDialog(QtGui.QDialog):\n\n    def __init__(self, parent, appdb):\n        \"\"\"\n        :type parent: QtGui.QMainWindow\n        :type appdb: ApplicationDatabase\n        \"\"\"\n        QtGui.QDialog.__init__(self, parent)\n\n        self.setWindowTitle(\"Load Material\")\n        self.setWindowIcon(parent.windowIcon())\n\n        self.__appdb = appdb\n\n        self.__select_group = QtGui.QGroupBox(\"Select Material\", self)\n        self.__select_group_layout = QtGui.QHBoxLayout(self.__select_group)\n        self.__material_list = QtGui.QListWidget(self.__select_group)\n        self.__select_group_layout.addWidget(self.__material_list)\n\n        self.__material_plot = MaterialPlot(self)\n\n        self.__buttons_layout = QtGui.QHBoxLayout()\n        self.__parametric_checkbox = QtGui.QCheckBox(\"Parametric\", self)\n        self.__load_button = QtGui.QPushButton(\"Load material\", self)\n        self.__load_button.setFixedWidth(config.MAXIMUM_DIALOG_BUTTON_WIDTH)\n        self.__cancel_button = QtGui.QPushButton(\"Cancel\", self)\n        self.__cancel_button.setFixedWidth(config.MAXIMUM_DIALOG_BUTTON_WIDTH)\n\n        self.__buttons_layout.addWidget(self.__parametric_checkbox)\n        self.__buttons_layout.addStretch()\n        self.__buttons_layout.addWidget(self.__load_button)\n        self.__buttons_layout.addWidget(self.__cancel_button)\n\n        connect(self.__load_button.clicked, self.accept)\n        connect(self.__cancel_button.clicked, self.reject)\n        connect(self.__parametric_checkbox.stateChanged, self._accept_state_handler)\n        connect(self.__material_list.itemSelectionChanged, self._accept_state_handler)\n        connect(self.__material_list.itemSelectionChanged, self._change_material)\n\n        self.__layout = QtGui.QVBoxLayout(self)\n        self.__layout.addWidget(self.__select_group)\n        self.__layout.addWidget(self.__material_plot)\n        self.__layout.addLayout(self.__buttons_layout)\n\n        self.__parametric_checkbox.setCheckState(QtCore.Qt.Unchecked)\n        self._accept_state_handler()\n\n    def update_materials(self):\n        self.__material_list.clear()\n        for material in self.__appdb[orm.Material]:\n            self.__material_list.addItem(material.name)\n\n    def showEvent(self, *args, **kwargs):\n        self.update_materials()\n        super(LoadMaterialDialog, self).showEvent(*args, **kwargs)\n\n    # noinspection PyUnusedLocal\n    def _accept_state_handler(self, *args):\n        self.__select_group.setEnabled(not self.is_parametric)\n        self.__material_plot.setEnabled(not self.is_parametric)\n        self.__load_button.setEnabled(self.is_parametric or self.is_item_selected)\n\n    def _change_material(self):\n        # material = self.__appdb[orm.Material].filter(orm.Material.name == self.material).one()\n        if self.material is not None:\n            self.__material_plot.draw_layer(options.structures.Substrate(self.material))\n\n    @property\n    def material(self):\n        \"\"\":rtype: orm.Material or None\"\"\"\n        if self.is_parametric:\n            return None\n\n        name = str(self.__material_list.currentItem().text())\n        return self.__appdb[orm.Material].filter(orm.Material.name == name).one()\n\n    @property\n    def is_item_selected(self):\n        return bool(self.__material_list.selectedItems())\n\n    @property\n    def is_parametric(self):\n        return bool(self.__parametric_checkbox.checkState())\n\n\nclass QProcessStackModel(QtCore.QAbstractTableModel):\n\n    class ColumnDescriptor(object):\n        def __init__(self, index, name, width, flags):\n            \"\"\"\n            :param int index: Index of table column\n            :param str name: Name of the column\n            :param int width: Width of the column\n            :param int flags: Column flags\n            \"\"\"\n            self.index = index\n            self.name = name\n            self.width = width\n            self.flags = flags\n\n        def __eq__(self, other):\n            \"\"\":type other: int\"\"\"\n            return self.index == other\n\n    colormap = [\"#B89F9F\", \"#61A1C2\", \"#CCD7C1\", \"#7CABA4\", \"#DEC68B\", \"#D2A882\", \"#B18D9E\", \"#8F6169\",\n                \"#DEBF56\", \"#C4D19A\", \"#73BB9C\", \"#8CA5C1\", \"#9AC9C9\", \"#ECDA9D\", \"#BD8C8F\", \"#74A9AF\",\n                \"#888EBD\", \"#B6ABAD\", \"#BC9481\", \"#2E8B57\", \"#B8860B\", \"#8B0A50\", \"#473C8B\", \"#8B3A3A\",\n                \"#EEE9BF\", \"#4682B4\", \"#D8BFD8\", \"#CDBA96\", \"#B03060\", \"#8B7355\", \"#8B7355\"]\n\n    READONLY = QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled\n    EDITABLE = QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled\n\n    height = 20\n\n    columns = collections.OrderedDict([\n        (\"Step\", ColumnDescriptor(index=0, name=\"Step\", width=48, flags=READONLY)),\n        (\"Type\", ColumnDescriptor(index=1, name=\"Type\", width=80, flags=READONLY)),\n        (\"Name\", ColumnDescriptor(index=2, name=\"Name\", width=140, flags=READONLY)),\n        (\"Thickness\", ColumnDescriptor(index=3, name=\"Thickness\", width=70, flags=EDITABLE))\n    ])\n    \"\"\":type: dict from str to QProcessStackModel.ColumnDescriptor\"\"\"\n\n    def __init__(self, parent, wafer_process):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type wafer_process: options.WaferProcess\n        \"\"\"\n        QtCore.QAbstractTableModel.__init__(self, parent)\n        self._wafer_process = wafer_process\n\n    def __getitem__(self, item):\n        \"\"\"\n        :type item: int\n        :rtype: options.WaferStackLayer\n        \"\"\"\n        return self._wafer_process[item]\n\n    def __setitem__(self, row, layer):\n        \"\"\"\n        :type row: int\n        :type layer: options.WaferStackLayer\n        \"\"\"\n        self._wafer_process[row] = layer\n        self.rowChanged(row)\n\n    # noinspection PyPep8Naming\n    def rowChanged(self, row):\n        \"\"\":type row: int\"\"\"\n        # noinspection PyUnresolvedReferences\n        self.dataChanged.emit(self.createIndex(row, 0), self.createIndex(row, self.columnCount()-1))\n\n    @property\n    def resist(self):\n        \"\"\":rtype: options.Resist\"\"\"\n        return self._wafer_process.resist\n\n    @property\n    def substrate(self):\n        \"\"\":rtype: options.Substrate\"\"\"\n        return self._wafer_process.substrate\n\n    def headerData(self, section, orientation, role=None):\n        if role == QtCore.Qt.DisplayRole:\n            if orientation == QtCore.Qt.Horizontal:\n                return QProcessStackModel.columns.values()[section].name\n            elif orientation == QtCore.Qt.Vertical:\n                return str(len(self._wafer_process) - section)\n        return None\n\n    def columnCount(self, index_parent=None, *args, **kwargs):\n        return len(QProcessStackModel.columns)\n\n    def rowCount(self, index_parent=None, *args, **kwargs):\n        return len(self._wafer_process)\n\n    def flags(self, index):\n        \"\"\":type index: QtCore.QModelIndex\"\"\"\n        if not index.isValid():\n            return QtCore.Qt.ItemIsEnabled\n\n        if index.column() == QProcessStackModel.columns[\"Thickness\"] and \\\n           isinstance(self._wafer_process[index.row()], options.structures.Substrate):\n            return QProcessStackModel.READONLY\n\n        return QProcessStackModel.columns.values()[index.column()].flags\n\n    def data(self, index, role=None):\n        \"\"\"\n        :type index: QtCore.QModelIndex\n        :type role: int\n        \"\"\"\n        if index.isValid() and index.row() < len(self._wafer_process):\n            if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:\n                stack_layer = self._wafer_process[index.row()]\n                if index.column() == QProcessStackModel.columns[\"Step\"]:\n                    return str(len(self._wafer_process) - index.row())\n                elif index.column() == QProcessStackModel.columns[\"Type\"]:\n                    return str(stack_layer.type)\n                elif index.column() == QProcessStackModel.columns[\"Name\"]:\n                    return str(stack_layer.name)\n                elif index.column() == QProcessStackModel.columns[\"Thickness\"]:\n                    if isinstance(stack_layer, options.structures.StandardLayer):\n                        return str(stack_layer.thickness)\n                    elif isinstance(stack_layer, options.structures.Substrate):\n                        return None\n            elif role == QtCore.Qt.SizeHintRole:\n                width = QProcessStackModel.columns.values()[index.column()].width\n                return QtCore.QSize(width, QProcessStackModel.height)\n            elif role == QtCore.Qt.BackgroundColorRole:\n                if index.column() == QProcessStackModel.columns[\"Step\"]:\n                    return QtGui.QColor(QProcessStackModel.colormap[index.row()])\n        return None\n\n    def setData(self, index, value, role=None):\n        \"\"\"\n        :type index: QtCore.QModelIndex\n        :type value: QtCore.QVariant\n        :type role: int\n        :rtype: bool\n        \"\"\"\n        if not index.isValid() or role != QtCore.Qt.EditRole:\n            return False\n\n        if index.column() == QProcessStackModel.columns[\"Thickness\"]:\n            stack_layer = self._wafer_process[index.row()]\n            if isinstance(stack_layer, (options.structures.StandardLayer, options.structures.Resist)):\n                # try:\n                #     stack_layer.thickness = float(value)\n                # except ValueError:\n                #     return False\n                #\n                # return True\n                try:\n                    thickness = float(value)\n                except ValueError:\n                    return False\n                else:\n                    if stack_layer.thickness != thickness:\n                        stack_layer.thickness = thickness\n                        GlobalSignals.changed.emit()\n                    return True\n\n        return False\n\n    # noinspection PyMethodOverriding\n    def insertRow(self, row, stack_layer):\n        index = QtCore.QModelIndex()\n        self.beginInsertRows(index, row, row)\n        self._wafer_process.insert(row, stack_layer)\n        self.endInsertRows()\n\n        GlobalSignals.changed.emit()\n        return True\n\n    # noinspection PyMethodOverriding\n    def removeRow(self, row):\n        index = QtCore.QModelIndex()\n        self.beginRemoveRows(index, row, row)\n        self._wafer_process.remove(row)\n        self.endRemoveRows()\n\n        GlobalSignals.changed.emit()\n        return True\n\n    # noinspection PyPep8Naming\n    def moveRows(self, source_row, dest_row):\n        if source_row == dest_row:\n            return False\n\n        # PyQt4 crash if source index lower than destination index\n        if source_row < dest_row:\n            source_row, dest_row = dest_row, source_row\n\n        wp = self._wafer_process\n        source_parent = QtCore.QModelIndex()\n        dest_parent = QtCore.QModelIndex()\n        self.beginMoveRows(source_parent, source_row, source_row, dest_parent, dest_row)\n        wp[source_row], wp[dest_row] = wp[dest_row], wp[source_row]\n        self.endMoveRows()\n\n        GlobalSignals.changed.emit()\n        return True\n\n\nclass QProcessStackTable(QtGui.QTableView):\n\n    def __init__(self, parent, model):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type model: QProcessStackModel\n        \"\"\"\n        QtGui.QTableView.__init__(self, parent)\n        self.setModel(model)\n        self.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)\n        self.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)\n        self.horizontalHeader().setClickable(False)\n        self.verticalHeader().setClickable(False)\n        self.verticalHeader().setVisible(False)\n        self.verticalHeader().setDefaultSectionSize(QProcessStackModel.height)\n        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)\n        self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)\n        self.resizeColumnsToContents()\n        self.setMinimumWidth(calculate_table_width(self))\n\n    def current_row(self):\n        \"\"\":rtype: int\"\"\"\n        return self.selectionModel().currentIndex().row()\n\n\nclass QProcessStack(QtGui.QGroupBox):\n\n    rowChanged = Signal(int)\n\n    def _create_button(self, icon_directory, handler):\n        button = QtGui.QPushButton(str(), self)\n        button.setIcon(Resources(icon_directory))\n        button.setIconSize(QtCore.QSize(26, 26))\n        button.setFixedSize(QtCore.QSize(36, 36))\n        button.setEnabled(False)\n        connect(button.clicked, handler)\n        self.__header_layout.addWidget(button)\n        return button\n\n    def __init__(self, parent, model, load_dialog):\n        \"\"\"\n        :param QtGui.QWidget parent: Widget parent\n        :param QProcessStackModel model: GUI data model\n        :param LoadMaterialDialog load_dialog: Material dialog loader\n        \"\"\"\n        QtGui.QGroupBox.__init__(self, \"Process Stack\", parent)\n        self.setObjectName(\"QProcessStack\")\n\n        self.__data_model = model\n        self.__load_material_dlg = load_dialog\n\n        self.__header_layout = QtGui.QHBoxLayout()\n        self.__add_button = self._create_button(\"icons/Plus\", self.insert_layer)\n        self.__remove_button = self._create_button(\"icons/Minus\", self.remove_layer)\n        self.__up_button = self._create_button(\"icons/ArrowUp\", self.layer_upper)\n        self.__down_button = self._create_button(\"icons/ArrowDown\", self.layer_lower)\n        self.__header_layout.addStretch(1)\n\n        self.__process_table = QProcessStackTable(self, self.__data_model)\n        \n        # PySide crash if not create temporary variable \n        selection_model = self.__process_table.selectionModel()\n        connect(selection_model.selectionChanged, self._item_changed)\n        # Even selection automatically changed when endMoveRows perform selectionChanged not emitted\n        connect(self.__data_model.rowsMoved, self._item_changed)\n\n        self.__layout = QtGui.QVBoxLayout(self)\n        self.__layout.addLayout(self.__header_layout)\n        self.__layout.addWidget(self.__process_table)\n\n    def _can_stack_be_edit(self, *rows):\n        \"\"\"\n        Check if layer can be removed, move up or down in the stack\n\n        :type rows: tuple of int\n        :rtype: bool\n        \"\"\"\n        for row in rows:\n            if row >= self.__data_model.rowCount() or \\\n               isinstance(self.__data_model[row], (options.structures.Substrate, options.structures.Resist)):\n                return False\n        return True\n\n    @Slot(QtCore.QModelIndex, int, int, QtCore.QModelIndex, int)\n    @Slot(QtGui.QItemSelection, QtGui.QItemSelection)\n    def _item_changed(self, *args):\n        self.__add_button.setEnabled(True)\n\n        row = self.__process_table.current_row()\n\n        self.__remove_button.setEnabled(self._can_stack_be_edit(row))\n\n        # Because the top layer always must be resist\n        self.__up_button.setEnabled(self._can_stack_be_edit(row-1, row))\n        # Because bottom layer always must be substrate\n        self.__down_button.setEnabled(self._can_stack_be_edit(row, row+1))\n\n        self.rowChanged.emit(row)\n\n    def insert_layer(self):\n        logging.info(\"Insert layer\")\n        if self.__load_material_dlg.exec_():\n            logging.info(\"%s, parametric: %s\" %\n                         (self.__load_material_dlg.material,\n                          self.__load_material_dlg.is_parametric))\n            # If top layer selected then add index because top layer must be resist\n            row = self.__process_table.current_row() if self.__process_table.current_row() != 0 else 1\n\n            if self.__load_material_dlg.is_parametric:\n                stack_layer = options.structures.StandardLayer.parametric(\n                    self.__data_model.resist.exposure.wavelength,\n                    config.DEFAULT_LAYER_REAL_INDEX,\n                    config.DEFAULT_LAYER_IMAG_INDEX,\n                    config.DEFAULT_LAYER_THICKNESS)\n            else:\n                stack_layer = options.structures.StandardLayer(\n                    self.__load_material_dlg.material, config.DEFAULT_LAYER_THICKNESS)\n\n            self.__data_model.insertRow(row, stack_layer)\n            self.__process_table.selectRow(row)\n\n    def remove_layer(self):\n        self.__data_model.removeRow(self.__process_table.current_row())\n\n    def layer_upper(self):\n        row = self.__process_table.current_row()\n        self.__data_model.moveRows(row, row-1)\n\n    def layer_lower(self):\n        row = self.__process_table.current_row()\n        self.__data_model.moveRows(row+1, row)\n\n    def current_row(self):\n        return self.__process_table.current_row()\n\n\nclass QProcessStepResistConfig(QStackWidgetTab):\n\n    def __init__(self, parent):\n        \"\"\":type parent: QtGui.QWidget\"\"\"\n        QStackWidgetTab.__init__(self, parent)\n        self.__label = QtGui.QLabel(\"Resist can be loaded from application database or \"\n                                    \"resist parameters could be changed at \\\"Resist\\\" tabs\")\n        self.__label.setAlignment(QtCore.Qt.AlignCenter)\n        self.__label.setWordWrap(True)\n        self.__layout = QtGui.QVBoxLayout(self)\n        self.__layout.addWidget(self.__label)\n        self.__layout.setAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignTop)\n        self.__layout.addStretch()\n\n\nclass QProcessStepDepositDbConfig(QStackWidgetTab):\n\n    def __init__(self, parent):\n        \"\"\":type parent: QtGui.QWidget\"\"\"\n        QStackWidgetTab.__init__(self, parent)\n        self.material_plot = MaterialPlot(self, width=500, height=250)\n        self.__layout = QtGui.QVBoxLayout(self)\n        self.__layout.addWidget(self.material_plot)\n\n\nclass QProcessStepDepositPrmConfig(QStackWidgetTab):\n\n    class IndexEdit(QLineEditNumeric):\n        def __init__(self, *__args):\n            QLineEditNumeric.__init__(self, *__args)\n            self.setAlignment(QtCore.Qt.AlignRight)\n            self.setMinimumWidth(50)\n            self.setMaximumWidth(100)\n\n    def __init__(self, parent):\n        \"\"\":type parent: QtGui.QWidget\"\"\"\n        QStackWidgetTab.__init__(self, parent)\n        self.__layout = QtGui.QVBoxLayout(self)\n        self.__layout_form = QtGui.QFormLayout()\n\n        self.__real = self.IndexEdit(self)\n        self.__imag = self.IndexEdit(self)\n\n        self.__label = QLabelMulti(self, frmt=\"Refractive index %.3f+%.3fi @ wavelength %.1f nm\")\n        self.__label.setAlignment(QtCore.Qt.AlignCenter)\n\n        self.__layout.addWidget(self.__label)\n        self.__layout_form.addRow(\"Real part:\", self.__real)\n        self.__layout_form.addRow(\"Imag part:\", self.__imag)\n        self.__layout.addLayout(self.__layout_form)\n        self.__layout.setAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignTop)\n\n    # noinspection PyPep8Naming\n    def setObjects(self, layer, resist):\n        \"\"\"\n        :type layer: options.structures.MaterialLayer or options.structures.Substrate\n        :type resist: options.Resist\n        \"\"\"\n        self.__label.setObject([\n            (layer, options.structures.MaterialLayer.real),\n            (layer, options.structures.MaterialLayer.imag),\n            (resist.exposure, orm.ExposureParameters.wavelength)\n        ])\n        self.__real.setObject(layer, options.structures.MaterialLayer.real)\n        self.__imag.setObject(layer, options.structures.MaterialLayer.imag)\n\n\nclass QProcessStepProperty(QtGui.QGroupBox):\n\n    def __init__(self, parent, model, appdb, load_dialog):\n        \"\"\"\n        :param QtGui.QWidget parent: Widget parent\n        :param QProcessStackModel model: GUI data model\n        :param ApplicationDatabase appdb: Application database\n        :param LoadMaterialDialog load_dialog: Material dialog loader\n        \"\"\"\n        QtGui.QGroupBox.__init__(self, \"Process Properties Step\", parent)\n        self.setObjectName(\"QProcessStepProperty\")\n\n        self.__data_model = model\n        self.__appdb = appdb\n        self.__load_material_dlg = load_dialog\n        self.__current_row = None\n\n        self.__layout = QtGui.QVBoxLayout(self)\n\n        self.__label_name = QtGui.QLabel(\"Name:\")\n        self.__edit_name = QtGui.QLineEdit()\n        self.__edit_name.setFixedWidth(250)\n\n        self.__load_button = QtGui.QPushButton(\"Load\")\n        connect(self.__load_button.clicked, self._load_material)\n\n        self.__save_button = QtGui.QPushButton(\"Save to database\")\n        connect(self.__save_button.clicked, self._save_material)\n\n        self._controls_set_enabled(False)\n\n        self.__header_layout = QtGui.QHBoxLayout()\n        self.__header_layout.setObjectName(\"QProcessStepProperty.QHBoxLayout\")\n        self.__header_layout.addWidget(self.__label_name)\n        self.__header_layout.addWidget(self.__edit_name)\n        self.__header_layout.addWidget(self.__load_button)\n        self.__header_layout.addWidget(self.__save_button)\n\n        self.__parameters_widgets = QtGui.QStackedWidget(self)\n        self.__db_view = QProcessStepDepositDbConfig(self)\n        self.__prm_view = QProcessStepDepositPrmConfig(self)\n        self.__resist_view = QProcessStepResistConfig(self)\n        self.__parameters_widgets.addWidget(self.__db_view)\n        self.__parameters_widgets.addWidget(self.__prm_view)\n        self.__parameters_widgets.addWidget(self.__resist_view)\n\n        self.__layout.addLayout(self.__header_layout)\n        self.__layout.addWidget(self.__parameters_widgets)\n\n    def _load_material(self):\n        if self.__load_material_dlg.exec_():\n            # FIXME: Exception here self.__current_row IndexError\n            wavelength = self.__data_model.resist.exposure.wavelength\n            layer_class = type(self.__data_model[self.__current_row])\n            layer = layer_class.default_parametric(wavelength) if self.__load_material_dlg.is_parametric \\\n                else layer_class.db_stored(self.__load_material_dlg.material, config.DEFAULT_LAYER_THICKNESS)\n\n            self.__data_model[self.__current_row] = layer\n            self.changeMaterial(self.__current_row)\n            GlobalSignals.changed.emit()\n\n    def _save_material(self):\n        row = self.__current_row\n\n        material = self.__data_model[row].db.clone()\n        material.name = str(self.__edit_name.text())\n\n        if QProcessStepProperty.AddObjectToDb(self, self.__appdb, material):\n            layer_class = type(self.__data_model[row])\n            self.__data_model[row] = layer_class.db_stored(material, config.DEFAULT_LAYER_THICKNESS)\n            self.changeMaterial(row)\n\n    # noinspection PyPep8Naming\n    @staticmethod\n    def AddObjectToDb(parent, appdb, p_object):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :type appdb: ApplicationDatabase\n        :type p_object: orm.Generic\n        \"\"\"\n        try:\n            appdb.add(p_object)\n        except ApplicationDatabase.ObjectExisted as existed:\n            replay = QuestionBox(\n                parent, \"%s \\\"%s\\\" already existed, replace it?\" %\n                        (existed.object.identifier, existed.object.name)\n            )\n            if replay == msgBox.Yes:\n                appdb.replace(existed.object)\n            else:\n                return False\n\n        return True\n\n    def _controls_set_enabled(self, enabled):\n        \"\"\":type enabled: bool\"\"\"\n        self.__edit_name.setEnabled(enabled)\n        self.__load_button.setEnabled(enabled)\n        self.__save_button.setEnabled(enabled)\n\n    # noinspection PyPep8Naming\n    @Slot(int)\n    def changeMaterial(self, index):\n        layer = self.__data_model[index]\n        resist = self.__data_model.resist\n        self.__current_row = index\n        self.setTitle(\"Process Properties Step: %d Type: %s\" % (self.__data_model.rowCount() - index, layer.type))\n\n        if isinstance(layer, options.structures.Resist):\n            self.__parameters_widgets.setCurrentWidget(self.__resist_view)\n            self._controls_set_enabled(False)\n        elif isinstance(layer, (options.structures.Substrate, options.structures.StandardLayer)):\n            if layer.is_parametric:\n                self.__parameters_widgets.setCurrentWidget(self.__prm_view)\n                self.__prm_view.setObjects(layer, resist)\n            else:\n                self.__parameters_widgets.setCurrentWidget(self.__db_view)\n                self.__db_view.material_plot.draw_layer(layer, self.__data_model.resist.exposure.wavelength)\n            self._controls_set_enabled(True)\n\n        self.__edit_name.setText(layer.name)\n\n\nclass WaferProcessView(QStackWidgetTab):\n    def __init__(self, parent, wafer_process, appdb):\n        \"\"\"\n        :type parent: QtGui.QWidget\n        :param options.WaferProcess wafer_process: Wafer stack process options\n        :type appdb: ApplicationDatabase\n        \"\"\"\n        QStackWidgetTab.__init__(self, parent)\n        self.setObjectName(\"WaferProcessView\")\n        self.__wafer_process = wafer_process\n        self.__appdb = appdb\n\n        self.__load_material_dlg = LoadMaterialDialog(self, self.__appdb)\n\n        self.__data_model = QProcessStackModel(self, wafer_process)\n        self.__process_stack = QProcessStack(self, self.__data_model, self.__load_material_dlg)\n        self.__process_step_property = QProcessStepProperty(\n            self, self.__data_model, self.__appdb, self.__load_material_dlg)\n        \n        self.__layout = QtGui.QGridLayout()\n        self.__layout.addWidget(self.__process_stack, 0, 0)\n        self.__layout.addWidget(self.__process_step_property, 0, 1)\n\n        connect(self.__process_stack.rowChanged, self.__process_step_property.changeMaterial)\n\n        self.setUnstretchable(self.__layout)\n\n    def reset(self):\n        self.__data_model.reset()\n        self.__process_step_property.changeMaterial(self.__process_stack.current_row())"
  },
  {
    "path": "OptolithiumGui/xhtml/report.xhtml",
    "content": "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n<style>\n@page {\n  margin: 2cm;\n  margin-bottom: 2.5cm;\n  @frame footer {\n    bottom: 2cm;\n    margin-left: 1cm;\n    margin-right: 1cm;\n    height: 1cm;\n  }\n}\n\nh1 {\n    font-family: Helvetica;\n    font-weight: bold;\n    font-size: 24px;\n    text-align: center;\n}\n\nh2 {\n    font-family: Helvetica;\n    font-weight: bold;\n    font-size: 16px;\n}\n\nbody {\n   font-family: Helvetica;\n   font-size: 16px;\n}\n\n.report {\n    height: 16px;\n    padding-top: 0.5;\n    padding-bottom: 0.5;\n    line-height: 50%%;\n}\n\n.report-icon {\n    width: 16px;\n}\n\n.report-name {\n    width: 270px;\n}\n\n.report-value {\n    width: 250px;\n}\n\n.report-subvalue {\n    margin-left: 30px;\n}\n</style>\n\n<body>\n  <h1>Optolithium</h1>\n  <h2>%(filename)s</h2>\n  %(body)s\n</body>\n</html>"
  },
  {
    "path": "README.md",
    "content": "# Optolithium #\r\n\r\n![Logo.png](https://github.com/xthebat/optolithium/blob/master/Logo.png)\r\n\r\n## What is it? ##\r\n\r\nOptolithium is a optical lithography (see [Photolithography](http://en.wikipedia.org/wiki/Photolithography)) modelling software that allow to calculate results at the different steps of process. It's open-source software and it isn't aimed to correspond to high-end VLSI fabrication technological nodes. The main goal of the project is studying students basics of nanotechnological processes (as an example is optical lithography). Optolithium refers to [computational lithography](http://en.wikipedia.org/wiki/Computational_lithography) software and can be used for simulation of different stage of the lithography process. The following stages can be simulated at current version: \r\n\r\n* Aerial image\r\n* Aerial image in resist \r\n* Exposed latent image in resist\r\n* PEB latent image in resist\r\n* Develop time contours\r\n* Resist profile\r\n\r\nAlso automated simulation set with variating at most two parameters is available.\r\nAt this time only 2D resist profile modelling is implemented but one of roadmap's point is add 3D simulation possibility. The following figure denotes resist profile simulations results for 365 nm technological process:\r\n\r\n![Optolithium-Profile.png](https://github.com/xthebat/optolithium/blob/master/Profile.png)\r\nScreenshot of the main window of Optolithium software with simulation results of aerial image in resist as distribution of light intensity. Also an effect of standing waves could be seen in this figure.  \r\n\r\n![Optolithium_IR.png](https://github.com/xthebat/optolithium/blob/master/Profile_IR.png)\r\n\r\n## Papers\r\n\r\nNote: all papers made in Russian language.\r\n\r\n- [Optical lithography basics](https://github.com/xthebat/optolithium/releases/download/papers/Optical.Lithography.Simulation.Basics.pdf)\r\n- [Lithography lecture](https://github.com/xthebat/optolithium/releases/download/papers/4.Lecture.ppt.pdf)\r\n- [Simulation lecture](https://github.com/xthebat/optolithium/releases/download/papers/7.Lecture.ppt.pdf)\r\n- [Optolithium lecture](https://github.com/xthebat/optolithium/releases/download/papers/8.Lecture.Optolithium.ppt.pdf)\r\n\r\n## What are internals? ##\r\n\r\nThe program can be considered as two main part:\r\n\r\n* The Core (OptolithiumC) - part of software that required high performance calculations and different iterations throughout list, arrays and etc.\r\n* The GUI (OptoltihiumGui) - another part where interaction with user performed. This part use OptolithiumC for optical lithography modelling.\r\n\r\nAccordingly, Optolithium software separated into two parts, is written primarily by mean of the two complementary programming language: Python (only version 2.7 supported) and C++11x. The Optolithium Core wrapped with Python binding and can be used sheer without OptolithiumGui module. Also software can be extent by plugins. Plugin is standalone shared library with a special exported symbol (descriptor) and Optolithium plugin can represent different objects modelling object:\r\n\r\n* Photomask 1D/2D\r\n* Source shape map model\r\n* Optical system pupil filter model\r\n* Resist rate development model\r\n\r\nAnyone could simple write own plugin using C programming language with definition in header file:\r\n\r\n    <OPTOLITHIUM_SRC>/OptolithiumC/include/optolithium.h\r\n\r\nAt this time next plugins have already implemented:\r\n\r\n* 1D - binary space\r\n* 1D - binary line\r\n* 1D - binary line with SRAF (Sub-Resolution Assist Features)\r\n* Annular source shape\r\n* Partially coherent source shape\r\n* Coherent source shape \r\n* Mack resist rate model\r\n* Enhanced Mack resist rate model\r\n* Notch resist rate model\r\n\r\n## Current software state ##\r\n\r\nOptolithium is open source software and under developing. There are a lot of bugs may appear when you work with software. I'll be glad if detailed reports and bug description will be added to issue whenever it possible. That helps me to improve Optolithium and make it more comprehensive.\r\n\r\n## How to run software? ##\r\n\r\nYou can choose one of two choices: the first use prebuilt by mean of Cython executable distributive and the second is compile and configure software by your self. When using prebuilt binaries total package will be in binary but if you will built it from source you can only compile Optolithium Core (not necessarily Cythonize Optolithium GUI module written in pure Python). Development of the source code was carried out with opportunity to compile Optolithium Core under various OS: Windows, Linux and Mac OS X. Currently prebuilt packages you could found in Downloads.\r\n\r\nSince a half of program written in Python programming language GUI can be run without any compilation and set up. You only required to install all dependencies libraries that were used in GUI module (see OptolithiumGui below) . As for photolithography modelling core it should be compiled using GCC compatible compiler. To compile go into OptolithiumC directory and run build using CMake:\r\n\r\n    cd <OPTOLITHIUM_SRC>/OptolithiumC\r\n    cmake CMakeLists.txt\r\n    make install\r\n\r\nThese commands will build OptolithiumC module (core) and also build standard plugins set.\r\nThe software tested for build with GNU GCC Toolchain hence MinGW required in Windows operating system environment. Also cmake configuration command should be replaced with the next:\r\n\r\n    cmake CMakeLists.txt -G \"MSYS Makefiles\"\r\n\r\n## Fourier Transform ##\r\n\r\nSince light diffraction simulation is tied to a huge count of Fourier transform calculation a very fast algorithm and approaches or library must be used. The one fastest library to calculate Fourier transform is [FFTW3](http://www.fftw.org/) it can be used thought the front-end is presented in source code. Currently Optolithium used it self Fourier Transform library. FFTW3 can be activated by uncommenting the following line in CMakeLists.txt (see \"How to run software?\")\r\n\r\n    SET(OPTOLITHIUMC_USE_FFTW_LIBRARY \"ON\") \r\n\r\nand comment the following:\r\n\r\n    SET(OPTOLITHIUMC_USE_FOURIER_LIBRARY \"ON\")\r\n\r\nThis front-end has been used just to compare performance FFTW3 library and Optolithium Fourier library. The comparison has been made for ~160 1D-simulation of binary line when calculate Focus-Exposure Matrix using  \"Simulation Sets\" tab (X/Y and Z grid = 5 nm, Speed Factor = 5) on Intel Core i7 2.2 GHz with 8 Gb RAM. In result Optolithium Fourier library is approximately 2.5 times slower then FFTW3 library in presented benchmark (NOTE: it isn't mean that for any other simulation types, masks, models and etc. Optolithium Fourier library will be in 2.5 times slower the results can be different).\r\n\r\nThe source code of the Optolithium Fourier Transform library is presented under the next path:\r\n\r\n    <OPTOLITHIUM_SRC>/OptolithiumC/libs/fourier\r\n\r\nThe simple benchmark code can be found in src/check.c files\r\n\r\n### Optolithium Fourier Transform library License ###\r\n\r\nCopyright © 2015 *Alexei Gladkikh*. All rights reserved.\r\nThis software may be modified and distributed under the terms of the BSD license.  See the LICENSE file for details.\r\n\r\n## Dependencies ##\r\n\r\n### Optolithium GUI ###\r\n\r\nBecause the project required heavily numerical calculation different third party libraries have been used (Note Optolithium has been tested with the specified versions of libraries)\r\n\r\n* [Python 2.7.8](https://www.python.org/)\r\n* [PySide 1.2.1](https://pypi.python.org/pypi/PySide)\r\n* [NumPy-1.6.2](https://pypi.python.org/pypi/numpy)\r\n* [SciPy-0.15.1](https://pypi.python.org/pypi/scipy)\r\n* [Matplotlib-1.4.0](https://pypi.python.org/pypi/matplotlib)\r\n* [SQLAlchemy-0.9.4](https://pypi.python.org/pypi/SQLAlchemy)\r\n* [python-gdsii-0.2.1](https://pypi.python.org/pypi/python-gdsii/)\r\n* [bson-0.3.3](https://pypi.python.org/pypi/bson)\r\n* [psutils-2.2.1](https://pypi.python.org/pypi/psutil)\r\n* [filemagic-1.6](https://pypi.python.org/pypi/filemagic/1.6)\r\n\r\nBinary packages and libraries\r\n\r\n* [File for Windows](http://gnuwin32.sourceforge.net/packages/file.htm) \r\n\r\n### Optolithium Core ###\r\n\r\nSee in: <OPTOLITHIUM_SRC>/OptolithiumC/libs\r\n\r\n* [Armadillo](http://arma.sourceforge.net/)\r\n* [armanpy-0.1.3](http://sourceforge.net/projects/armanpy/) - modified\r\n* [clipper-6.1.3](http://www.angusj.com/delphi/clipper.php)\r\n* [easylogging++.h](https://github.com/easylogging/easyloggingpp)\r\n* [LSMLIB](https://github.com/ktchu/LSMLIB) - modified\r\n* [SWIG-3.0.5](http://www.swig.org/) *Attention*: version equal or above 3.0.5 is required\r\n\r\n## Optolithium License ##\r\n\r\nCopyright © 2014-2015 *Alexei Gladkikh*\r\n\r\nThis software is dual-licensed: 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 only for NON-COMMERCIAL usage.\r\n\r\nThis 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.\r\n \r\nIf you are interested in other licensing models, including a commercial-license, please contact the author at gladkikhalexei@gmail.com\r\n\r\n## Armadillo ##\r\n\r\nArmadillo is a C++ linear algebra library (matrix maths) aiming towards a good balance between speed and ease of use. The syntax is deliberately similar to Matlab. The library provides efficient classes for vectors, matrices and cubes, as well as many functions which operate on the classes (eg. contiguous and non-contiguous submatrix views). This library is useful for conversion of research code into production environments, or if C++ has been decided as the language of choice, due to speed and/or integration capabilities.\r\n\r\nThe library is open-source software, and is distributed under a license that is useful in both open-source and commercial/proprietary contexts. Armadillo is primarily developed at NICTA (Australia), with contributions from around the world.  More information about NICTA can be obtained from http://nicta.com.au\r\n\r\nMain developers: Conrad Sanderson(lead developer; NICTA, Australia), Ryan Curtin(sparse matrices; Georgia Tech, USA)\r\n\r\n=================================================================================\r\n\r\n* The Armadillo library can be distributed and/or modified under the terms of the Mozilla Public License 2.0 (MPL).\r\n* You are free to choose the license for work that uses the Armadillo library (eg. a proprietary application).\r\n* The MPL does not automatically apply to your programs.\r\n\r\n## armanpy ##\r\n\r\nCopyright © 2012-2014 Thomas Natschlдger (thomas.natschlaeger@gmail.com)\r\n\r\nArmaNpy is a set of SWIG interface files which allows generating Python bindings to C++ code which uses the Armadillo matrix library. From within Python any Armadillo matrices are represented as NumPy matrices. This is possible due to the same memory layout used. Copying of memory is avoided whenever possible. It also supports boost::shared_ptr wrapped return values of Armadillo matrices.\r\n\r\n=================================================================================\r\n\r\nArmaNpy is provided without any warranty of fitness for any purpose. You can redistribute this file and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation, either version 3 of the License or (at your option) any later version. (see http://www.opensource.org/licenses for more info).\r\n\r\n## clipper ##\r\n\r\nCopyright © 2010-2014 Angus Johnson. Freeware for both open source and commercial applications (Boost Software License).\r\n\r\nThe Clipper library performs line & polygon clipping - intersection, union, difference & exclusive-or, and line & polygon offsetting. The library is based on Vatti's clipping algorithm. The download package contains the library's full source code (written in Delphi, C++ and C#), numerous demos, a help file and links to third party Python, Perl, Ruby and Haskell modules.\r\n\r\n## LSMLIB ##\r\n\r\nCopyright © 2005 The Trustees of Princeton University and Board of Regents of the University of Texas.  All rights reserved.\r\nCopyright © 2009 Kevin T. Chu.  All rights reserved.\r\n\r\nThe Level Set Method Library (LSMLIB) provides support for the serial and parallel simulation of implicit surface and curve dynamics in two- and three-dimensions. It contains an implementation of the basic level set method algorithms and numerical kernels described in \"Level Set Methods and Dynamics Implicit Surfaces\" by S. Osher and R. Fedkiw and \"Level Set Methods and Fast Marching Methods\" by J.A. Sethian. It also contains implementations of several advanced level set method techniques available in the literature.\r\n\r\n=================================================================================\r\n\r\nFull license text you could found [here](https://github.com/ktchu/LSMLIB/blob/master/LICENSE)\r\n\r\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\r\n\r\n* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\r\n* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\r\n* Redistribution and use of the software (in either source code or binary form) must be for research or instructional use.\r\n* Neither the name of Princeton University, the University of Texas at Austin nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior  written permission.\r\n\r\n## Easylogging++ ##\r\n\r\nCopyright © 2015 muflihun.com under the terms of The MIT License (MIT)\r\n\r\nEasylogging++ is single header only, feature-rich, efficient logging library for C++ applications. It has been written keeping three things in mind; performance, management (setup, configure, logging, simplicity) and portability. Its highly configurable and extremely useful for small to large sized projects.\r\n\r\n## PySide ##\r\n\r\nCopyright PySide Team under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation.\r\n\r\nPython bindings for the Qt cross-platform application and UI framework. PySide is the Python Qt bindings project, providing access the complete Qt 4.8 framework as well as to generator tools for rapidly generating bindings for any C++ libraries. The PySide project is developed in the open, with all facilities you’d expect from any modern OSS project such as all code in a git repository, an open Bugzilla for reporting bugs, and an open design process. We welcome any contribution without requiring a transfer of copyright.\r\n\r\n## NumPy ##\r\n\r\nCopyright NumPy Developers under the terms of BSD license.\r\n\r\nNumPy is a general-purpose array-processing package designed to efficiently manipulate large multi-dimensional arrays of arbitrary records without sacrificing too much speed for small multi-dimensional arrays. NumPy is built on the Numeric code base and adds features introduced by numarray as well as an extended C-API and the ability to create arrays of arbitrary type which also makes NumPy suitable for interfacing with general-purpose data-base applications. There are also basic facilities for discrete fourier transform, basic linear algebra and random number generation.\r\n\r\n## SciPy ##\r\n\r\nCopyright SciPy Developers under the terms of BSD license.\r\n\r\nSciPy (pronounced “Sigh Pie”) is open-source software for mathematics, science, and engineering. The SciPy library depends on NumPy, which provides convenient and fast N-dimensional array manipulation. The SciPy library is built to work with NumPy arrays, and provides many user-friendly and efficient numerical routines such as routines for numerical integration and optimization. Together, they run on all popular operating systems, are quick to install, and are free of charge. NumPy and SciPy are easy to use, but powerful enough to be depended upon by some of the world’s leading scientists and engineers. If you need to manipulate numbers on a computer and display or publish the results, give SciPy a try!\r\n\r\n## Matplotlib ##\r\n\r\nCopyright John D. Hunter, Michael Droettboom under the terms of BSD license.\r\n\r\nPython plotting package matplotlib strives to produce publication quality 2D graphics for interactive graphing, scientific publishing, user interface development and web application servers targeting multiple user interfaces and hardcopy output formats. There is a ‘pylab’ mode which emulates matlab graphics.\r\n\r\n## SQLAlchemy ##\r\n\r\nCopyright Mike Bayer under the terms of MIT license.\r\n\r\nSQLAlchemy is the Python SQL toolkit and Object Relational Mapper that gives application developers the full power and flexibility of SQL. SQLAlchemy provides a full suite of well known enterprise-level persistence patterns, designed for efficient and high-performing database access, adapted into a simple and Pythonic domain language.\r\n\r\n## python-gdsii ##\r\n\r\nCopyright Eugeniy Meshcheryakov under the terms of the GNU Lesser General Public License (LGPL) 3+\r\n\r\npython-gdsii is a library that can be used to read, create, modify and save GDSII files. It supports both low-level record I/O and high level interface to GDSII libraries (databases), structures, and elements. This package also includes scripts that can be used to convert binary GDS file to a simple text format (gds2txt), YAML (gds2yaml), and from text fromat back to GDSII (txt2gds).\r\n\r\n## bson ##\r\n\r\nCopyright Kou Man Tong under the terms of BSD license.\r\n\r\nIndependent BSON codec for Python that doesn’t depend on MongoDB.\r\n\r\n## psutils ##\r\n\r\nCopyright Giampaolo Rodola under the terms of BSD license.\r\n\r\npsutil is a cross-platform library for retrieving information onrunning processes and system utilization (CPU, memory, disks, network)in Python.\r\n\r\n## filemagic ##\r\n\r\nCopyright Aaron Iles under the terms of ASL license.\r\n\r\nA Python API for libmagic, the library behind the Unix file command\r\n"
  },
  {
    "path": "installer/GPL-V2.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1031{\\fonttbl{\\f0\\fswiss\\fcharset0 Arial;}}\r\n{\\*\\generator Msftedit 5.41.21.2500;}\\viewkind4\\uc1\\pard\\f0\\fs20\\tab\\tab     GNU GENERAL PUBLIC LICENSE\\par\r\n\\tab\\tab        Version 2, June 1991\\par\r\n\\par\r\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\\par\r\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\\par\r\n Everyone is permitted to copy and distribute verbatim copies\\par\r\n of this license document, but changing it is not allowed.\\par\r\n\\par\r\n\\tab\\tab\\tab     Preamble\\par\r\n\\par\r\n  The licenses for most software are designed to take away your\\par\r\nfreedom to share and change it.  By contrast, the GNU General Public\\par\r\nLicense is intended to guarantee your freedom to share and change free\\par\r\nsoftware--to make sure the software is free for all its users.  This\\par\r\nGeneral Public License applies to most of the Free Software\\par\r\nFoundation's software and to any other program whose authors commit to\\par\r\nusing it.  (Some other Free Software Foundation software is covered by\\par\r\nthe GNU Lesser General Public License instead.)  You can apply it to\\par\r\nyour programs, too.\\par\r\n\\par\r\n  When we speak of free software, we are referring to freedom, not\\par\r\nprice.  Our General Public Licenses are designed to make sure that you\\par\r\nhave the freedom to distribute copies of free software (and charge for\\par\r\nthis service if you wish), that you receive source code or can get it\\par\r\nif you want it, that you can change the software or use pieces of it\\par\r\nin new free programs; and that you know you can do these things.\\par\r\n\\par\r\n  To protect your rights, we need to make restrictions that forbid\\par\r\nanyone to deny you these rights or to ask you to surrender the rights.\\par\r\nThese restrictions translate to certain responsibilities for you if you\\par\r\ndistribute copies of the software, or if you modify it.\\par\r\n\\par\r\n  For example, if you distribute copies of such a program, whether\\par\r\ngratis or for a fee, you must give the recipients all the rights that\\par\r\nyou have.  You must make sure that they, too, receive or can get the\\par\r\nsource code.  And you must show them these terms so they know their\\par\r\nrights.\\par\r\n\\par\r\n  We protect your rights with two steps: (1) copyright the software, and\\par\r\n(2) offer you this license which gives you legal permission to copy,\\par\r\ndistribute and/or modify the software.\\par\r\n\\par\r\n  Also, for each author's protection and ours, we want to make certain\\par\r\nthat everyone understands that there is no warranty for this free\\par\r\nsoftware.  If the software is modified by someone else and passed on, we\\par\r\nwant its recipients to know that what they have is not the original, so\\par\r\nthat any problems introduced by others will not reflect on the original\\par\r\nauthors' reputations.\\par\r\n\\par\r\n  Finally, any free program is threatened constantly by software\\par\r\npatents.  We wish to avoid the danger that redistributors of a free\\par\r\nprogram will individually obtain patent licenses, in effect making the\\par\r\nprogram proprietary.  To prevent this, we have made it clear that any\\par\r\npatent must be licensed for everyone's free use or not licensed at all.\\par\r\n\\par\r\n  The precise terms and conditions for copying, distribution and\\par\r\nmodification follow.\\par\r\n\\par\r\n\\tab\\tab     GNU GENERAL PUBLIC LICENSE\\par\r\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\\par\r\n\\par\r\n  0. This License applies to any program or other work which contains\\par\r\na notice placed by the copyright holder saying it may be distributed\\par\r\nunder the terms of this General Public License.  The \"Program\", below,\\par\r\nrefers to any such program or work, and a \"work based on the Program\"\\par\r\nmeans either the Program or any derivative work under copyright law:\\par\r\nthat is to say, a work containing the Program or a portion of it,\\par\r\neither verbatim or with modifications and/or translated into another\\par\r\nlanguage.  (Hereinafter, translation is included without limitation in\\par\r\nthe term \"modification\".)  Each licensee is addressed as \"you\".\\par\r\n\\par\r\nActivities other than copying, distribution and modification are not\\par\r\ncovered by this License; they are outside its scope.  The act of\\par\r\nrunning the Program is not restricted, and the output from the Program\\par\r\nis covered only if its contents constitute a work based on the\\par\r\nProgram (independent of having been made by running the Program).\\par\r\nWhether that is true depends on what the Program does.\\par\r\n\\par\r\n  1. You may copy and distribute verbatim copies of the Program's\\par\r\nsource code as you receive it, in any medium, provided that you\\par\r\nconspicuously and appropriately publish on each copy an appropriate\\par\r\ncopyright notice and disclaimer of warranty; keep intact all the\\par\r\nnotices that refer to this License and to the absence of any warranty;\\par\r\nand give any other recipients of the Program a copy of this License\\par\r\nalong with the Program.\\par\r\n\\par\r\nYou may charge a fee for the physical act of transferring a copy, and\\par\r\nyou may at your option offer warranty protection in exchange for a fee.\\par\r\n\\par\r\n  2. You may modify your copy or copies of the Program or any portion\\par\r\nof it, thus forming a work based on the Program, and copy and\\par\r\ndistribute such modifications or work under the terms of Section 1\\par\r\nabove, provided that you also meet all of these conditions:\\par\r\n\\par\r\n    a) You must cause the modified files to carry prominent notices\\par\r\n    stating that you changed the files and the date of any change.\\par\r\n\\par\r\n    b) You must cause any work that you distribute or publish, that in\\par\r\n    whole or in part contains or is derived from the Program or any\\par\r\n    part thereof, to be licensed as a whole at no charge to all third\\par\r\n    parties under the terms of this License.\\par\r\n\\par\r\n    c) If the modified program normally reads commands interactively\\par\r\n    when run, you must cause it, when started running for such\\par\r\n    interactive use in the most ordinary way, to print or display an\\par\r\n    announcement including an appropriate copyright notice and a\\par\r\n    notice that there is no warranty (or else, saying that you provide\\par\r\n    a warranty) and that users may redistribute the program under\\par\r\n    these conditions, and telling the user how to view a copy of this\\par\r\n    License.  (Exception: if the Program itself is interactive but\\par\r\n    does not normally print such an announcement, your work based on\\par\r\n    the Program is not required to print an announcement.)\\par\r\n\\par\r\nThese requirements apply to the modified work as a whole.  If\\par\r\nidentifiable sections of that work are not derived from the Program,\\par\r\nand can be reasonably considered independent and separate works in\\par\r\nthemselves, then this License, and its terms, do not apply to those\\par\r\nsections when you distribute them as separate works.  But when you\\par\r\ndistribute the same sections as part of a whole which is a work based\\par\r\non the Program, the distribution of the whole must be on the terms of\\par\r\nthis License, whose permissions for other licensees extend to the\\par\r\nentire whole, and thus to each and every part regardless of who wrote it.\\par\r\n\\par\r\nThus, it is not the intent of this section to claim rights or contest\\par\r\nyour rights to work written entirely by you; rather, the intent is to\\par\r\nexercise the right to control the distribution of derivative or\\par\r\ncollective works based on the Program.\\par\r\n\\par\r\nIn addition, mere aggregation of another work not based on the Program\\par\r\nwith the Program (or with a work based on the Program) on a volume of\\par\r\na storage or distribution medium does not bring the other work under\\par\r\nthe scope of this License.\\par\r\n\\par\r\n  3. You may copy and distribute the Program (or a work based on it,\\par\r\nunder Section 2) in object code or executable form under the terms of\\par\r\nSections 1 and 2 above provided that you also do one of the following:\\par\r\n\\par\r\n    a) Accompany it with the complete corresponding machine-readable\\par\r\n    source code, which must be distributed under the terms of Sections\\par\r\n    1 and 2 above on a medium customarily used for software interchange; or,\\par\r\n\\par\r\n    b) Accompany it with a written offer, valid for at least three\\par\r\n    years, to give any third party, for a charge no more than your\\par\r\n    cost of physically performing source distribution, a complete\\par\r\n    machine-readable copy of the corresponding source code, to be\\par\r\n    distributed under the terms of Sections 1 and 2 above on a medium\\par\r\n    customarily used for software interchange; or,\\par\r\n\\par\r\n    c) Accompany it with the information you received as to the offer\\par\r\n    to distribute corresponding source code.  (This alternative is\\par\r\n    allowed only for noncommercial distribution and only if you\\par\r\n    received the program in object code or executable form with such\\par\r\n    an offer, in accord with Subsection b above.)\\par\r\n\\par\r\nThe source code for a work means the preferred form of the work for\\par\r\nmaking modifications to it.  For an executable work, complete source\\par\r\ncode means all the source code for all modules it contains, plus any\\par\r\nassociated interface definition files, plus the scripts used to\\par\r\ncontrol compilation and installation of the executable.  However, as a\\par\r\nspecial exception, the source code distributed need not include\\par\r\nanything that is normally distributed (in either source or binary\\par\r\nform) with the major components (compiler, kernel, and so on) of the\\par\r\noperating system on which the executable runs, unless that component\\par\r\nitself accompanies the executable.\\par\r\n\\par\r\nIf distribution of executable or object code is made by offering\\par\r\naccess to copy from a designated place, then offering equivalent\\par\r\naccess to copy the source code from the same place counts as\\par\r\ndistribution of the source code, even though third parties are not\\par\r\ncompelled to copy the source along with the object code.\\par\r\n\\par\r\n  4. You may not copy, modify, sublicense, or distribute the Program\\par\r\nexcept as expressly provided under this License.  Any attempt\\par\r\notherwise to copy, modify, sublicense or distribute the Program is\\par\r\nvoid, and will automatically terminate your rights under this License.\\par\r\nHowever, parties who have received copies, or rights, from you under\\par\r\nthis License will not have their licenses terminated so long as such\\par\r\nparties remain in full compliance.\\par\r\n\\par\r\n  5. You are not required to accept this License, since you have not\\par\r\nsigned it.  However, nothing else grants you permission to modify or\\par\r\ndistribute the Program or its derivative works.  These actions are\\par\r\nprohibited by law if you do not accept this License.  Therefore, by\\par\r\nmodifying or distributing the Program (or any work based on the\\par\r\nProgram), you indicate your acceptance of this License to do so, and\\par\r\nall its terms and conditions for copying, distributing or modifying\\par\r\nthe Program or works based on it.\\par\r\n\\par\r\n  6. Each time you redistribute the Program (or any work based on the\\par\r\nProgram), the recipient automatically receives a license from the\\par\r\noriginal licensor to copy, distribute or modify the Program subject to\\par\r\nthese terms and conditions.  You may not impose any further\\par\r\nrestrictions on the recipients' exercise of the rights granted herein.\\par\r\nYou are not responsible for enforcing compliance by third parties to\\par\r\nthis License.\\par\r\n\\par\r\n  7. If, as a consequence of a court judgment or allegation of patent\\par\r\ninfringement or for any other reason (not limited to patent issues),\\par\r\nconditions are imposed on you (whether by court order, agreement or\\par\r\notherwise) that contradict the conditions of this License, they do not\\par\r\nexcuse you from the conditions of this License.  If you cannot\\par\r\ndistribute so as to satisfy simultaneously your obligations under this\\par\r\nLicense and any other pertinent obligations, then as a consequence you\\par\r\nmay not distribute the Program at all.  For example, if a patent\\par\r\nlicense would not permit royalty-free redistribution of the Program by\\par\r\nall those who receive copies directly or indirectly through you, then\\par\r\nthe only way you could satisfy both it and this License would be to\\par\r\nrefrain entirely from distribution of the Program.\\par\r\n\\par\r\nIf any portion of this section is held invalid or unenforceable under\\par\r\nany particular circumstance, the balance of the section is intended to\\par\r\napply and the section as a whole is intended to apply in other\\par\r\ncircumstances.\\par\r\n\\par\r\nIt is not the purpose of this section to induce you to infringe any\\par\r\npatents or other property right claims or to contest validity of any\\par\r\nsuch claims; this section has the sole purpose of protecting the\\par\r\nintegrity of the free software distribution system, which is\\par\r\nimplemented by public license practices.  Many people have made\\par\r\ngenerous contributions to the wide range of software distributed\\par\r\nthrough that system in reliance on consistent application of that\\par\r\nsystem; it is up to the author/donor to decide if he or she is willing\\par\r\nto distribute software through any other system and a licensee cannot\\par\r\nimpose that choice.\\par\r\n\\par\r\nThis section is intended to make thoroughly clear what is believed to\\par\r\nbe a consequence of the rest of this License.\\par\r\n\\par\r\n  8. If the distribution and/or use of the Program is restricted in\\par\r\ncertain countries either by patents or by copyrighted interfaces, the\\par\r\noriginal copyright holder who places the Program under this License\\par\r\nmay add an explicit geographical distribution limitation excluding\\par\r\nthose countries, so that distribution is permitted only in or among\\par\r\ncountries not thus excluded.  In such case, this License incorporates\\par\r\nthe limitation as if written in the body of this License.\\par\r\n\\par\r\n  9. The Free Software Foundation may publish revised and/or new versions\\par\r\nof the General Public License from time to time.  Such new versions will\\par\r\nbe similar in spirit to the present version, but may differ in detail to\\par\r\naddress new problems or concerns.\\par\r\n\\par\r\nEach version is given a distinguishing version number.  If the Program\\par\r\nspecifies a version number of this License which applies to it and \"any\\par\r\nlater version\", you have the option of following the terms and conditions\\par\r\neither of that version or of any later version published by the Free\\par\r\nSoftware Foundation.  If the Program does not specify a version number of\\par\r\nthis License, you may choose any version ever published by the Free Software\\par\r\nFoundation.\\par\r\n\\par\r\n  10. If you wish to incorporate parts of the Program into other free\\par\r\nprograms whose distribution conditions are different, write to the author\\par\r\nto ask for permission.  For software which is copyrighted by the Free\\par\r\nSoftware Foundation, write to the Free Software Foundation; we sometimes\\par\r\nmake exceptions for this.  Our decision will be guided by the two goals\\par\r\nof preserving the free status of all derivatives of our free software and\\par\r\nof promoting the sharing and reuse of software generally.\\par\r\n\\par\r\n\\tab\\tab\\tab     NO WARRANTY\\par\r\n\\par\r\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\\par\r\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\\par\r\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\\par\r\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\\par\r\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\\par\r\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\\par\r\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\\par\r\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\\par\r\nREPAIR OR CORRECTION.\\par\r\n\\par\r\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\\par\r\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\\par\r\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\\par\r\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\\par\r\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\\par\r\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\\par\r\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\\par\r\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\\par\r\nPOSSIBILITY OF SUCH DAMAGES.\\par\r\n\\par\r\n\\tab\\tab      END OF TERMS AND CONDITIONS\\par\r\n\\par\r\n\\tab     How to Apply These Terms to Your New Programs\\par\r\n\\par\r\n  If you develop a new program, and you want it to be of the greatest\\par\r\npossible use to the public, the best way to achieve this is to make it\\par\r\nfree software which everyone can redistribute and change under these terms.\\par\r\n\\par\r\n  To do so, attach the following notices to the program.  It is safest\\par\r\nto attach them to the start of each source file to most effectively\\par\r\nconvey the exclusion of warranty; and each file should have at least\\par\r\nthe \"copyright\" line and a pointer to where the full notice is found.\\par\r\n\\par\r\n    <one line to give the program's name and a brief idea of what it does.>\\par\r\n    Copyright (C) <year>  <name of author>\\par\r\n\\par\r\n    This program is free software; you can redistribute it and/or modify\\par\r\n    it under the terms of the GNU General Public License as published by\\par\r\n    the Free Software Foundation; either version 2 of the License, or\\par\r\n    (at your option) any later version.\\par\r\n\\par\r\n    This program is distributed in the hope that it will be useful,\\par\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\\par\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\par\r\n    GNU General Public License for more details.\\par\r\n\\par\r\n    You should have received a copy of the GNU General Public License along\\par\r\n    with this program; if not, write to the Free Software Foundation, Inc.,\\par\r\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\\par\r\n\\par\r\nAlso add information on how to contact you by electronic and paper mail.\\par\r\n\\par\r\nIf the program is interactive, make it output a short notice like this\\par\r\nwhen it starts in an interactive mode:\\par\r\n\\par\r\n    Gnomovision version 69, Copyright (C) year name of author\\par\r\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\\par\r\n    This is free software, and you are welcome to redistribute it\\par\r\n    under certain conditions; type `show c' for details.\\par\r\n\\par\r\nThe hypothetical commands `show w' and `show c' should show the appropriate\\par\r\nparts of the General Public License.  Of course, the commands you use may\\par\r\nbe called something other than `show w' and `show c'; they could even be\\par\r\nmouse-clicks or menu items--whatever suits your program.\\par\r\n\\par\r\nYou should also get your employer (if you work as a programmer) or your\\par\r\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\\par\r\nnecessary.  Here is a sample; alter the names:\\par\r\n\\par\r\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\\par\r\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\\par\r\n\\par\r\n  <signature of Ty Coon>, 1 April 1989\\par\r\n  Ty Coon, President of Vice\\par\r\n\\par\r\nThis General Public License does not permit incorporating your program into\\par\r\nproprietary programs.  If your program is a subroutine library, you may\\par\r\nconsider it more useful to permit linking proprietary applications with the\\par\r\nlibrary.  If this is what you want to do, use the GNU Lesser General\\par\r\nPublic License instead of this License.\\par\r\n}\r\n\u0000"
  },
  {
    "path": "installer/Optolithium.aip",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<DOCUMENT Type=\"Advanced Installer\" CreateVersion=\"12.3.1\" version=\"12.3.1\" Modules=\"simple\" RootPath=\".\" Language=\"en\" Id=\"{527E7426-5903-474B-BFD7-8ECF3ED01783}\">\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiPropsComponent\">\r\n    <ROW Property=\"AI_BITMAP_DISPLAY_MODE\" Value=\"0\"/>\r\n    <ROW Property=\"ALLUSERS\" Value=\"1\" MultiBuildValue=\"DefaultBuild:2\"/>\r\n    <ROW Property=\"ARPCOMMENTS\" Value=\"This installer database contains the logic and data required to install [|ProductName].\" ValueLocId=\"*\"/>\r\n    <ROW Property=\"ARPCONTACT\" Value=\"gladkikhalexei@gmail.com\"/>\r\n    <ROW Property=\"ARPNOMODIFY\" MultiBuildValue=\"DefaultBuild:1\"/>\r\n    <ROW Property=\"ARPNOREPAIR\" Value=\"1\"/>\r\n    <ROW Property=\"ARPPRODUCTICON\" Value=\"icon_1.exe\" Type=\"8\"/>\r\n    <ROW Property=\"ARPURLINFOABOUT\" Value=\"https://bitbucket.org/gladkikhalexei/optolithium/overview\"/>\r\n    <ROW Property=\"Manufacturer\" Value=\"Optolithium, inc\"/>\r\n    <ROW Property=\"ProductCode\" Value=\"1033:{AAF3E491-63F0-4D06-AA69-2EBA121828AC} \" Type=\"16\"/>\r\n    <ROW Property=\"ProductLanguage\" Value=\"1033\"/>\r\n    <ROW Property=\"ProductName\" Value=\"Optolithium\"/>\r\n    <ROW Property=\"ProductVersion\" Value=\"0.3.0\" Type=\"32\"/>\r\n    <ROW Property=\"REBOOT\" MultiBuildValue=\"DefaultBuild:ReallySuppress\"/>\r\n    <ROW Property=\"SecureCustomProperties\" Value=\"OLDPRODUCTS;AI_NEWERPRODUCTFOUND\"/>\r\n    <ROW Property=\"UpgradeCode\" Value=\"{4B614687-8FB0-4599-9BD8-2CC3EC563821}\"/>\r\n    <ROW Property=\"WindowsType9X\" MultiBuildValue=\"DefaultBuild:Windows 9x/ME\" ValueLocId=\"-\"/>\r\n    <ROW Property=\"WindowsType9XDisplay\" MultiBuildValue=\"DefaultBuild:Windows 9x/ME\" ValueLocId=\"-\"/>\r\n    <ROW Property=\"WindowsTypeNT40\" MultiBuildValue=\"DefaultBuild:Windows NT 4.0\" ValueLocId=\"-\"/>\r\n    <ROW Property=\"WindowsTypeNT40Display\" MultiBuildValue=\"DefaultBuild:Windows NT 4.0\" ValueLocId=\"-\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiDirsComponent\">\r\n    <ROW Directory=\"APPDIR\" Directory_Parent=\"TARGETDIR\" DefaultDir=\"APPDIR:.\" IsPseudoRoot=\"1\"/>\r\n    <ROW Directory=\"DesktopFolder\" Directory_Parent=\"TARGETDIR\" DefaultDir=\"DESKTO~1|DesktopFolder\" IsPseudoRoot=\"1\"/>\r\n    <ROW Directory=\"Optolithium_Dir\" Directory_Parent=\"ProgramMenuFolder\" DefaultDir=\"OPTOLI~1|Optolithium\"/>\r\n    <ROW Directory=\"ProgramMenuFolder\" Directory_Parent=\"TARGETDIR\" DefaultDir=\"PROGRA~1|ProgramMenuFolder\" IsPseudoRoot=\"1\"/>\r\n    <ROW Directory=\"SHORTCUTDIR\" Directory_Parent=\"TARGETDIR\" DefaultDir=\"SHORTC~1|SHORTCUTDIR\" IsPseudoRoot=\"1\"/>\r\n    <ROW Directory=\"TARGETDIR\" DefaultDir=\"SourceDir\"/>\r\n    <ROW Directory=\"afm_Dir\" Directory_Parent=\"fonts_Dir\" DefaultDir=\"afm\"/>\r\n    <ROW Directory=\"axes_grid_Dir\" Directory_Parent=\"sample_data_Dir\" DefaultDir=\"AXES_G~1|axes_grid\"/>\r\n    <ROW Directory=\"data_Dir\" Directory_Parent=\"share_Dir\" DefaultDir=\"data\"/>\r\n    <ROW Directory=\"dev_models_Dir\" Directory_Parent=\"plugins_Dir\" DefaultDir=\"DEV_MO~1|dev_models\"/>\r\n    <ROW Directory=\"fonts_Dir\" Directory_Parent=\"mpldata_Dir\" DefaultDir=\"fonts\"/>\r\n    <ROW Directory=\"icons_Dir\" Directory_Parent=\"APPDIR\" DefaultDir=\"icons\"/>\r\n    <ROW Directory=\"imageformats_Dir\" Directory_Parent=\"APPDIR\" DefaultDir=\"IMAGEF~1|imageformats\"/>\r\n    <ROW Directory=\"images_Dir\" Directory_Parent=\"mpldata_Dir\" DefaultDir=\"images\"/>\r\n    <ROW Directory=\"masks_Dir\" Directory_Parent=\"plugins_Dir\" DefaultDir=\"masks\"/>\r\n    <ROW Directory=\"misc_Dir\" Directory_Parent=\"share_Dir\" DefaultDir=\"misc\"/>\r\n    <ROW Directory=\"mpldata_Dir\" Directory_Parent=\"APPDIR\" DefaultDir=\"mpl-data\"/>\r\n    <ROW Directory=\"pdfcorefonts_Dir\" Directory_Parent=\"fonts_Dir\" DefaultDir=\"PDFCOR~1|pdfcorefonts\"/>\r\n    <ROW Directory=\"plugins_Dir\" Directory_Parent=\"APPDIR\" DefaultDir=\"plugins\"/>\r\n    <ROW Directory=\"pupil_filters_Dir\" Directory_Parent=\"plugins_Dir\" DefaultDir=\"PUPIL_~1|pupil_filters\"/>\r\n    <ROW Directory=\"sample_data_Dir\" Directory_Parent=\"mpldata_Dir\" DefaultDir=\"SAMPLE~1|sample_data\"/>\r\n    <ROW Directory=\"share_Dir\" Directory_Parent=\"APPDIR\" DefaultDir=\"share\"/>\r\n    <ROW Directory=\"source_shapes_Dir\" Directory_Parent=\"plugins_Dir\" DefaultDir=\"SOURCE~1|source_shapes\"/>\r\n    <ROW Directory=\"ttf_Dir\" Directory_Parent=\"fonts_Dir\" DefaultDir=\"ttf\"/>\r\n    <ROW Directory=\"xhtml_Dir\" Directory_Parent=\"APPDIR\" DefaultDir=\"xhtml\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiCompsComponent\">\r\n    <ROW Component=\"About.png\" ComponentId=\"{67CB4E72-E95C-45A5-858B-7048CC412F90}\" Directory_=\"icons_Dir\" Attributes=\"0\" KeyPath=\"About.png\" Type=\"0\"/>\r\n    <ROW Component=\"CourierBold.afm\" ComponentId=\"{73AE4EC7-E320-47AA-B08C-3C07806ED27A}\" Directory_=\"pdfcorefonts_Dir\" Attributes=\"0\" KeyPath=\"CourierBold.afm\" Type=\"0\"/>\r\n    <ROW Component=\"Optolithium\" ComponentId=\"{223DBC60-26B9-4997-8ACD-496A71C11B6C}\" Directory_=\"Optolithium_Dir\" Attributes=\"0\"/>\r\n    <ROW Component=\"ProductInformation\" ComponentId=\"{24217319-6B24-4D0B-9A40-30FA6E51321A}\" Directory_=\"APPDIR\" Attributes=\"4\" KeyPath=\"Version\"/>\r\n    <ROW Component=\"QtCore4.dll\" ComponentId=\"{0286B08C-E9E1-489D-982A-8577E72AA0E4}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"QtCore4.dll\"/>\r\n    <ROW Component=\"QtGui4.dll\" ComponentId=\"{406F4368-9146-4C93-AD19-6CD6347EAA4E}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"QtGui4.dll\"/>\r\n    <ROW Component=\"QtNetwork4.dll\" ComponentId=\"{61F3FB95-4787-4DDE-BF21-9C953EF8218D}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"QtNetwork4.dll\"/>\r\n    <ROW Component=\"QtWebKit4.dll\" ComponentId=\"{AB8130F7-923D-4F8D-87E4-D86F77DB9827}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"QtWebKit4.dll\"/>\r\n    <ROW Component=\"SHORTCUTDIR\" ComponentId=\"{0F3B2F57-1334-48D1-AEF7-16A23E6F548C}\" Directory_=\"SHORTCUTDIR\" Attributes=\"0\"/>\r\n    <ROW Component=\"_clipper.pyd\" ComponentId=\"{6B7803F3-03B8-4F6A-B052-CE9419529276}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"_clipper.pyd\" Type=\"0\"/>\r\n    <ROW Component=\"aPolysilicon.MAT\" ComponentId=\"{896AB97C-AB00-4AD2-B257-31229F8A9F5C}\" Directory_=\"data_Dir\" Attributes=\"0\" KeyPath=\"aPolysilicon.MAT\" Type=\"0\"/>\r\n    <ROW Component=\"aapl.csv\" ComponentId=\"{5DA837AF-9822-44A4-B516-C69AB1690F64}\" Directory_=\"sample_data_Dir\" Attributes=\"0\" KeyPath=\"aapl.csv\" Type=\"0\"/>\r\n    <ROW Component=\"back.png\" ComponentId=\"{5FA29D6A-1238-409C-9802-15C6D804168E}\" Directory_=\"images_Dir\" Attributes=\"0\" KeyPath=\"back.png\" Type=\"0\"/>\r\n    <ROW Component=\"bivariate_normal.npy\" ComponentId=\"{1E78432E-8DB2-4029-A961-1D65261B06ED}\" Directory_=\"axes_grid_Dir\" Attributes=\"0\" KeyPath=\"bivariate_normal.npy\" Type=\"0\"/>\r\n    <ROW Component=\"cmb10.ttf\" ComponentId=\"{335EF8AF-5DE6-4CB1-8A91-8423A7D29447}\" Directory_=\"ttf_Dir\" Attributes=\"0\" KeyPath=\"COPYRIGHT.TXT\" Type=\"0\"/>\r\n    <ROW Component=\"cmex10.afm\" ComponentId=\"{12BF564C-8901-4934-80BB-8B42127A8862}\" Directory_=\"afm_Dir\" Attributes=\"0\" KeyPath=\"cmex10.afm\" Type=\"0\"/>\r\n    <ROW Component=\"libannular.dll\" ComponentId=\"{4DB1DC43-33E6-4D69-AF5E-14870195B7A3}\" Directory_=\"source_shapes_Dir\" Attributes=\"0\" KeyPath=\"libannular.dll\"/>\r\n    <ROW Component=\"libcentral_obscuration.dll\" ComponentId=\"{61C008B5-D18A-4B6D-9744-7D172AC1764E}\" Directory_=\"pupil_filters_Dir\" Attributes=\"0\" KeyPath=\"libcentral_obscuration.dll\"/>\r\n    <ROW Component=\"libcoherent.dll\" ComponentId=\"{FC4F48DE-CC54-4C14-B8DA-2012F6CE1816}\" Directory_=\"source_shapes_Dir\" Attributes=\"0\" KeyPath=\"libcoherent.dll\"/>\r\n    <ROW Component=\"libconvenient.dll\" ComponentId=\"{C2666FAF-BBFB-4EC0-B679-024ED15FFC66}\" Directory_=\"source_shapes_Dir\" Attributes=\"0\" KeyPath=\"libconvenient.dll\"/>\r\n    <ROW Component=\"libenhanced.dll\" ComponentId=\"{1B61B3F1-21AD-44DF-8DDA-F9DF7050F007}\" Directory_=\"dev_models_Dir\" Attributes=\"0\" KeyPath=\"libenhanced.dll\"/>\r\n    <ROW Component=\"libenhanced_notch.dll\" ComponentId=\"{B6C56C1A-129A-4F42-9BD1-C16E9BB40E30}\" Directory_=\"dev_models_Dir\" Attributes=\"0\" KeyPath=\"libenhanced_notch.dll\"/>\r\n    <ROW Component=\"libfftw33.dll\" ComponentId=\"{D0E0108B-9C58-465E-B267-A0E3F53F404C}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"libfftw33.dll\"/>\r\n    <ROW Component=\"libfiveBarLine.dll\" ComponentId=\"{1BCD3611-D28B-4EA3-B988-B99A8CC261D5}\" Directory_=\"masks_Dir\" Attributes=\"0\" KeyPath=\"libfiveBarLine.dll\"/>\r\n    <ROW Component=\"libgcc_s_dw21.dll\" ComponentId=\"{4B61B02E-DE04-4916-9527-895F6606540B}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"libgcc_s_dw21.dll\"/>\r\n    <ROW Component=\"libline1D.dll\" ComponentId=\"{93C5C663-372C-4FF5-B4D1-08EC7B778CCC}\" Directory_=\"masks_Dir\" Attributes=\"0\" KeyPath=\"libline1D.dll\"/>\r\n    <ROW Component=\"libline1D_SRAF.dll\" ComponentId=\"{EE3BA500-CAED-4555-A26B-480812B712C6}\" Directory_=\"masks_Dir\" Attributes=\"0\" KeyPath=\"libline1D_SRAF.dll\"/>\r\n    <ROW Component=\"libmack.dll\" ComponentId=\"{BC3E8443-B666-414A-A15F-DC1AD0DC23BF}\" Directory_=\"dev_models_Dir\" Attributes=\"0\" KeyPath=\"libmack.dll\"/>\r\n    <ROW Component=\"libnotch.dll\" ComponentId=\"{EA3D9E58-1782-4FBC-A0DD-E5F218279587}\" Directory_=\"dev_models_Dir\" Attributes=\"0\" KeyPath=\"libnotch.dll\"/>\r\n    <ROW Component=\"libnotch_depth.dll\" ComponentId=\"{780DC854-075A-4F92-AC66-943527AAFE60}\" Directory_=\"dev_models_Dir\" Attributes=\"0\" KeyPath=\"libnotch_depth.dll\"/>\r\n    <ROW Component=\"libspace1D.dll\" ComponentId=\"{E6035E25-2C5C-463E-8718-C25C0096EC1E}\" Directory_=\"masks_Dir\" Attributes=\"0\" KeyPath=\"libspace1D.dll\"/>\r\n    <ROW Component=\"libstdc6.dll\" ComponentId=\"{9FEDB75B-8A40-4B6E-9A92-3EBCC422FE47}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"libstdc6.dll\"/>\r\n    <ROW Component=\"libwinpthread1.dll\" ComponentId=\"{B42A0D6F-0561-40FB-A96E-139504DC6AFA}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"libwinpthread1.dll\"/>\r\n    <ROW Component=\"lineprops.glade\" ComponentId=\"{A5D60681-98AB-467F-8622-FA35CA003E5C}\" Directory_=\"mpldata_Dir\" Attributes=\"0\" KeyPath=\"lineprops.glade\" Type=\"0\"/>\r\n    <ROW Component=\"magic\" ComponentId=\"{A420B4EA-DD1E-4757-9CC2-15B956B54269}\" Directory_=\"misc_Dir\" Attributes=\"0\" KeyPath=\"magic\" Type=\"0\"/>\r\n    <ROW Component=\"magic.dll\" ComponentId=\"{FC7C2758-6F8D-4F7E-8D46-6B6D1931FF78}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"magic.dll\"/>\r\n    <ROW Component=\"optolithium.exe\" ComponentId=\"{CFCDE20F-E15C-4A34-BF18-F5C5EA527F42}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"optolithium.exe\"/>\r\n    <ROW Component=\"pysidepython2.7.dll\" ComponentId=\"{CAE1FF8C-7A24-46C8-8E1D-E719FAF67E19}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"pysidepython2.7.dll\"/>\r\n    <ROW Component=\"python27.dll\" ComponentId=\"{A029A295-D083-4B13-BBC1-8C6CA3E750EE}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"python27.dll\"/>\r\n    <ROW Component=\"pywintypes27.dll\" ComponentId=\"{5FB721B0-1EC8-45FF-991B-120C71A86DCC}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"pywintypes27.dll\"/>\r\n    <ROW Component=\"qgif4.dll\" ComponentId=\"{A6051BC0-6F74-4ED9-93A2-FEB950A156FE}\" Directory_=\"imageformats_Dir\" Attributes=\"0\" KeyPath=\"qgif4.dll\"/>\r\n    <ROW Component=\"qgifd4.dll\" ComponentId=\"{2A47E4E6-F3B1-4F22-B07E-B19C3FECAF23}\" Directory_=\"imageformats_Dir\" Attributes=\"0\" KeyPath=\"qgifd4.dll\"/>\r\n    <ROW Component=\"qico4.dll\" ComponentId=\"{7AAB0F12-6FF4-4192-A065-EC4A96857102}\" Directory_=\"imageformats_Dir\" Attributes=\"0\" KeyPath=\"qico4.dll\"/>\r\n    <ROW Component=\"qicod4.dll\" ComponentId=\"{1053F7FA-E726-4D0D-9F55-46741A996A24}\" Directory_=\"imageformats_Dir\" Attributes=\"0\" KeyPath=\"qicod4.dll\"/>\r\n    <ROW Component=\"qjpeg4.dll\" ComponentId=\"{22AAC5D4-A8DC-4AB2-8A52-C7738B88B932}\" Directory_=\"imageformats_Dir\" Attributes=\"0\" KeyPath=\"qjpeg4.dll\"/>\r\n    <ROW Component=\"qjpegd4.dll\" ComponentId=\"{0962A1C5-841F-4807-8363-DF32ACB61D1C}\" Directory_=\"imageformats_Dir\" Attributes=\"0\" KeyPath=\"qjpegd4.dll\"/>\r\n    <ROW Component=\"qmng4.dll\" ComponentId=\"{C54F2AAB-BB7F-4AAC-9686-36CC4647364D}\" Directory_=\"imageformats_Dir\" Attributes=\"0\" KeyPath=\"qmng4.dll\"/>\r\n    <ROW Component=\"qmngd4.dll\" ComponentId=\"{B4177CE4-6CE4-4628-B4FE-C7A9A5E75ED0}\" Directory_=\"imageformats_Dir\" Attributes=\"0\" KeyPath=\"qmngd4.dll\"/>\r\n    <ROW Component=\"qsvg4.dll\" ComponentId=\"{A0355FEA-7E8D-4B7F-BFA8-392E482563BF}\" Directory_=\"imageformats_Dir\" Attributes=\"0\" KeyPath=\"qsvg4.dll\"/>\r\n    <ROW Component=\"qsvgd4.dll\" ComponentId=\"{445F2392-975A-472C-BA28-1B4479FD85B2}\" Directory_=\"imageformats_Dir\" Attributes=\"0\" KeyPath=\"qsvgd4.dll\"/>\r\n    <ROW Component=\"qtga4.dll\" ComponentId=\"{7B1F080A-3260-4EA5-9096-8D24CCB93E2F}\" Directory_=\"imageformats_Dir\" Attributes=\"0\" KeyPath=\"qtga4.dll\"/>\r\n    <ROW Component=\"qtgad4.dll\" ComponentId=\"{16A50DD7-BF90-4AE1-A736-F22723DDB4A1}\" Directory_=\"imageformats_Dir\" Attributes=\"0\" KeyPath=\"qtgad4.dll\"/>\r\n    <ROW Component=\"qtiff4.dll\" ComponentId=\"{DC54DFA8-25FD-4EC7-856F-471920668A11}\" Directory_=\"imageformats_Dir\" Attributes=\"0\" KeyPath=\"qtiff4.dll\"/>\r\n    <ROW Component=\"qtiffd4.dll\" ComponentId=\"{3767D0B1-AD70-499A-9D81-FA7651D354CD}\" Directory_=\"imageformats_Dir\" Attributes=\"0\" KeyPath=\"qtiffd4.dll\"/>\r\n    <ROW Component=\"regex2.dll\" ComponentId=\"{DEDD0EB2-7ED0-4F9F-8027-709710D73B89}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"regex2.dll\"/>\r\n    <ROW Component=\"report.xhtml\" ComponentId=\"{938CC6D2-6A04-4761-AB6A-27254A265EFA}\" Directory_=\"xhtml_Dir\" Attributes=\"0\" KeyPath=\"report.xhtml\" Type=\"0\"/>\r\n    <ROW Component=\"shibokenpython2.7.dll\" ComponentId=\"{EC9EB59A-1B68-411A-A040-FD137FB2E022}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"shibokenpython2.7.dll\"/>\r\n    <ROW Component=\"sqlite3.dll\" ComponentId=\"{A4EA11D6-6905-42D4-B109-4B0F034366F0}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"sqlite3.dll\"/>\r\n    <ROW Component=\"zlib1.dll\" ComponentId=\"{A5432476-E481-47A3-AED5-16FACD29C6EE}\" Directory_=\"APPDIR\" Attributes=\"0\" KeyPath=\"zlib1.dll\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiFeatsComponent\">\r\n    <ROW Feature=\"MainFeature\" Title=\"MainFeature\" Description=\"Description\" Display=\"1\" Level=\"1\" Directory_=\"APPDIR\" Attributes=\"0\" Components=\"About.png CourierBold.afm Optolithium ProductInformation QtCore4.dll QtGui4.dll QtNetwork4.dll QtWebKit4.dll SHORTCUTDIR _clipper.pyd aPolysilicon.MAT aapl.csv back.png bivariate_normal.npy cmb10.ttf cmex10.afm libannular.dll libcentral_obscuration.dll libcoherent.dll libconvenient.dll libenhanced.dll libenhanced_notch.dll libfftw33.dll libfiveBarLine.dll libgcc_s_dw21.dll libline1D.dll libline1D_SRAF.dll libmack.dll libnotch.dll libnotch_depth.dll libspace1D.dll libstdc6.dll libwinpthread1.dll lineprops.glade magic magic.dll optolithium.exe pysidepython2.7.dll python27.dll pywintypes27.dll qgif4.dll qgifd4.dll qico4.dll qicod4.dll qjpeg4.dll qjpegd4.dll qmng4.dll qmngd4.dll qsvg4.dll qsvgd4.dll qtga4.dll qtgad4.dll qtiff4.dll qtiffd4.dll regex2.dll report.xhtml shibokenpython2.7.dll sqlite3.dll zlib1.dll\"/>\r\n    <ATTRIBUTE name=\"CurrentFeature\" value=\"MainFeature\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiFilesComponent\">\r\n    <ROW File=\"AAPL.dat.gz\" Component_=\"aapl.csv\" FileName=\"AAPLDA~1.GZ|AAPL.dat.gz\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\AAPL.dat.gz\" SelfReg=\"false\" NextFile=\"aapl.npy.gz\"/>\r\n    <ROW File=\"About.png\" Component_=\"About.png\" FileName=\"About.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\About.png\" SelfReg=\"false\" NextFile=\"AerialImage.png\"/>\r\n    <ROW File=\"AerialImage.png\" Component_=\"About.png\" FileName=\"AERIAL~1.PNG|AerialImage.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\AerialImage.png\" SelfReg=\"false\" NextFile=\"ArrowDown.png\"/>\r\n    <ROW File=\"AirVacuum.MAT\" Component_=\"aPolysilicon.MAT\" FileName=\"AIR-VA~1.MAT|Air-Vacuum.MAT\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\share\\data\\Air-Vacuum.MAT\" SelfReg=\"false\" NextFile=\"fivebar.MSK\"/>\r\n    <ROW File=\"ArrowDown.png\" Component_=\"About.png\" FileName=\"ARROWD~1.PNG|ArrowDown.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\ArrowDown.png\" SelfReg=\"false\" NextFile=\"ArrowUp.png\"/>\r\n    <ROW File=\"ArrowUp.png\" Component_=\"About.png\" FileName=\"ArrowUp.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\ArrowUp.png\" SelfReg=\"false\" NextFile=\"Banner.png\"/>\r\n    <ROW File=\"Banner.png\" Component_=\"About.png\" FileName=\"Banner.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Banner.png\" SelfReg=\"false\" NextFile=\"Database.png\"/>\r\n    <ROW File=\"COPYRIGHT.TXT\" Component_=\"cmb10.ttf\" FileName=\"COPYRI~1.TXT|COPYRIGHT.TXT\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\COPYRIGHT.TXT\" SelfReg=\"false\" NextFile=\"LICENSE_STIX\"/>\r\n    <ROW File=\"Courier.afm\" Component_=\"CourierBold.afm\" FileName=\"Courier.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\pdfcorefonts\\Courier.afm\" SelfReg=\"false\" NextFile=\"HelveticaBold.afm\"/>\r\n    <ROW File=\"CourierBold.afm\" Component_=\"CourierBold.afm\" FileName=\"COURIE~1.AFM|Courier-Bold.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\pdfcorefonts\\Courier-Bold.afm\" SelfReg=\"false\" NextFile=\"CourierBoldOblique.afm\"/>\r\n    <ROW File=\"CourierBoldOblique.afm\" Component_=\"CourierBold.afm\" FileName=\"COURIE~2.AFM|Courier-BoldOblique.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\pdfcorefonts\\Courier-BoldOblique.afm\" SelfReg=\"false\" NextFile=\"CourierOblique.afm\"/>\r\n    <ROW File=\"CourierOblique.afm\" Component_=\"CourierBold.afm\" FileName=\"COURIE~3.AFM|Courier-Oblique.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\pdfcorefonts\\Courier-Oblique.afm\" SelfReg=\"false\" NextFile=\"Courier.afm\"/>\r\n    <ROW File=\"Database.png\" Component_=\"About.png\" FileName=\"Database.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Database.png\" SelfReg=\"false\" NextFile=\"Database_v2.png\"/>\r\n    <ROW File=\"Database_v2.png\" Component_=\"About.png\" FileName=\"DATABA~1.PNG|Database_v2.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Database_v2.png\" SelfReg=\"false\" NextFile=\"Development.png\"/>\r\n    <ROW File=\"DevelopTimeContours.png\" Component_=\"About.png\" FileName=\"DEVELO~2.PNG|DevelopTimeContours.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\DevelopTimeContours.png\" SelfReg=\"false\" NextFile=\"DiffractionPattern.png\"/>\r\n    <ROW File=\"Development.png\" Component_=\"About.png\" FileName=\"DEVELO~1.PNG|Development.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Development.png\" SelfReg=\"false\" NextFile=\"DevelopTimeContours.png\"/>\r\n    <ROW File=\"DiffractionPattern.png\" Component_=\"About.png\" FileName=\"DIFFRA~1.PNG|DiffractionPattern.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\DiffractionPattern.png\" SelfReg=\"false\" NextFile=\"Exit.png\"/>\r\n    <ROW File=\"Exit.png\" Component_=\"About.png\" FileName=\"Exit.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Exit.png\" SelfReg=\"false\" NextFile=\"ExposureAndFocus.png\"/>\r\n    <ROW File=\"ExposureAndFocus.png\" Component_=\"About.png\" FileName=\"EXPOSU~1.PNG|ExposureAndFocus.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\ExposureAndFocus.png\" SelfReg=\"false\" NextFile=\"Folder.png\"/>\r\n    <ROW File=\"Folder.png\" Component_=\"About.png\" FileName=\"Folder.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Folder.png\" SelfReg=\"false\" NextFile=\"Form.png\"/>\r\n    <ROW File=\"Form.png\" Component_=\"About.png\" FileName=\"Form.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Form.png\" SelfReg=\"false\" NextFile=\"Help.png\"/>\r\n    <ROW File=\"Help.png\" Component_=\"About.png\" FileName=\"Help.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Help.png\" SelfReg=\"false\" NextFile=\"ImageInResist.png\"/>\r\n    <ROW File=\"Helvetica.afm\" Component_=\"CourierBold.afm\" FileName=\"HELVET~4.AFM|Helvetica.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\pdfcorefonts\\Helvetica.afm\" SelfReg=\"false\" NextFile=\"readme.txt\"/>\r\n    <ROW File=\"HelveticaBold.afm\" Component_=\"CourierBold.afm\" FileName=\"HELVET~1.AFM|Helvetica-Bold.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-Bold.afm\" SelfReg=\"false\" NextFile=\"HelveticaBoldOblique.afm\"/>\r\n    <ROW File=\"HelveticaBoldOblique.afm\" Component_=\"CourierBold.afm\" FileName=\"HELVET~2.AFM|Helvetica-BoldOblique.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-BoldOblique.afm\" SelfReg=\"false\" NextFile=\"HelveticaOblique.afm\"/>\r\n    <ROW File=\"HelveticaOblique.afm\" Component_=\"CourierBold.afm\" FileName=\"HELVET~3.AFM|Helvetica-Oblique.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-Oblique.afm\" SelfReg=\"false\" NextFile=\"Helvetica.afm\"/>\r\n    <ROW File=\"INTC.dat.gz\" Component_=\"aapl.csv\" FileName=\"INTCDA~1.GZ|INTC.dat.gz\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\INTC.dat.gz\" SelfReg=\"false\" NextFile=\"lena.jpg\"/>\r\n    <ROW File=\"ImageInResist.png\" Component_=\"About.png\" FileName=\"IMAGEI~1.PNG|ImageInResist.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\ImageInResist.png\" SelfReg=\"false\" NextFile=\"ImagingTool.png\"/>\r\n    <ROW File=\"ImagingTool.png\" Component_=\"About.png\" FileName=\"IMAGIN~1.PNG|ImagingTool.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\ImagingTool.png\" SelfReg=\"false\" NextFile=\"LatentImage.png\"/>\r\n    <ROW File=\"LICENSE_STIX\" Component_=\"cmb10.ttf\" FileName=\"LICENS~1|LICENSE_STIX\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\LICENSE_STIX\" SelfReg=\"false\" NextFile=\"README.TXT_3\"/>\r\n    <ROW File=\"LatentImage.png\" Component_=\"About.png\" FileName=\"LATENT~1.PNG|LatentImage.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\LatentImage.png\" SelfReg=\"false\" NextFile=\"Logo.png\"/>\r\n    <ROW File=\"Logo.png\" Component_=\"About.png\" FileName=\"Logo.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Logo.png\" SelfReg=\"false\" NextFile=\"Mask.png\"/>\r\n    <ROW File=\"Mask.png\" Component_=\"About.png\" FileName=\"Mask.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Mask.png\" SelfReg=\"false\" NextFile=\"Material.png\"/>\r\n    <ROW File=\"Material.png\" Component_=\"About.png\" FileName=\"Material.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Material.png\" SelfReg=\"false\" NextFile=\"Metrology.png\"/>\r\n    <ROW File=\"Metrology.png\" Component_=\"About.png\" FileName=\"METROL~1.PNG|Metrology.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Metrology.png\" SelfReg=\"false\" NextFile=\"Minus.png\"/>\r\n    <ROW File=\"Minduka_Present_Blue_Pack.png\" Component_=\"aapl.csv\" FileName=\"MINDUK~1.PNG|Minduka_Present_Blue_Pack.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\Minduka_Present_Blue_Pack.png\" SelfReg=\"false\" NextFile=\"msft.csv\"/>\r\n    <ROW File=\"Minus.png\" Component_=\"About.png\" FileName=\"Minus.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Minus.png\" SelfReg=\"false\" NextFile=\"NewFile.png\"/>\r\n    <ROW File=\"NewFile.png\" Component_=\"About.png\" FileName=\"NewFile.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\NewFile.png\" SelfReg=\"false\" NextFile=\"No.png\"/>\r\n    <ROW File=\"No.png\" Component_=\"About.png\" FileName=\"No.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\No.png\" SelfReg=\"false\" NextFile=\"Numerics.png\"/>\r\n    <ROW File=\"Numerics.png\" Component_=\"About.png\" FileName=\"Numerics.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Numerics.png\" SelfReg=\"false\" NextFile=\"Ok.png\"/>\r\n    <ROW File=\"Ok.png\" Component_=\"About.png\" FileName=\"Ok.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Ok.png\" SelfReg=\"false\" NextFile=\"Open.png\"/>\r\n    <ROW File=\"Open.png\" Component_=\"About.png\" FileName=\"Open.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Open.png\" SelfReg=\"false\" NextFile=\"PEB.png\"/>\r\n    <ROW File=\"PEB.png\" Component_=\"About.png\" FileName=\"PEB.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\PEB.png\" SelfReg=\"false\" NextFile=\"Plus.png\"/>\r\n    <ROW File=\"Plus.png\" Component_=\"About.png\" FileName=\"Plus.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Plus.png\" SelfReg=\"false\" NextFile=\"PostBakeImage.png\"/>\r\n    <ROW File=\"PostBakeImage.png\" Component_=\"About.png\" FileName=\"POSTBA~1.PNG|PostBakeImage.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\PostBakeImage.png\" SelfReg=\"false\" NextFile=\"Preferences.png\"/>\r\n    <ROW File=\"Preferences.png\" Component_=\"About.png\" FileName=\"PREFER~1.PNG|Preferences.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Preferences.png\" SelfReg=\"false\" NextFile=\"PupilFilter.png\"/>\r\n    <ROW File=\"PupilFilter.png\" Component_=\"About.png\" FileName=\"PUPILF~1.PNG|PupilFilter.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\PupilFilter.png\" SelfReg=\"false\" NextFile=\"Queue.png\"/>\r\n    <ROW File=\"PySide.QtCore.pyd\" Component_=\"_clipper.pyd\" FileName=\"PYSIDE~1.PYD|PySide.QtCore.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\PySide.QtCore.pyd\" SelfReg=\"false\" NextFile=\"PySide.QtGui.pyd\"/>\r\n    <ROW File=\"PySide.QtGui.pyd\" Component_=\"_clipper.pyd\" FileName=\"PYSIDE~2.PYD|PySide.QtGui.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\PySide.QtGui.pyd\" SelfReg=\"false\" NextFile=\"PySide.QtNetwork.pyd\"/>\r\n    <ROW File=\"PySide.QtNetwork.pyd\" Component_=\"_clipper.pyd\" FileName=\"PYSIDE~3.PYD|PySide.QtNetwork.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\PySide.QtNetwork.pyd\" SelfReg=\"false\" NextFile=\"PySide.QtWebKit.pyd\"/>\r\n    <ROW File=\"PySide.QtWebKit.pyd\" Component_=\"_clipper.pyd\" FileName=\"PYSIDE~4.PYD|PySide.QtWebKit.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\PySide.QtWebKit.pyd\" SelfReg=\"false\" NextFile=\"pysidepython2.7.dll\"/>\r\n    <ROW File=\"QtCore4.dll\" Component_=\"QtCore4.dll\" FileName=\"QtCore4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\QtCore4.dll\" SelfReg=\"false\" NextFile=\"QtGui4.dll\"/>\r\n    <ROW File=\"QtGui4.dll\" Component_=\"QtGui4.dll\" FileName=\"QtGui4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\QtGui4.dll\" SelfReg=\"false\" NextFile=\"QtNetwork4.dll\"/>\r\n    <ROW File=\"QtNetwork4.dll\" Component_=\"QtNetwork4.dll\" FileName=\"QTNETW~1.DLL|QtNetwork4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\QtNetwork4.dll\" SelfReg=\"false\" NextFile=\"QtWebKit4.dll\"/>\r\n    <ROW File=\"QtWebKit4.dll\" Component_=\"QtWebKit4.dll\" FileName=\"QTWEBK~1.DLL|QtWebKit4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\QtWebKit4.dll\" SelfReg=\"false\" NextFile=\"regex2.dll\"/>\r\n    <ROW File=\"Queue.png\" Component_=\"About.png\" FileName=\"Queue.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Queue.png\" SelfReg=\"false\" NextFile=\"Registration.png\"/>\r\n    <ROW File=\"README.TXT_3\" Component_=\"cmb10.ttf\" FileName=\"README.TXT\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\README.TXT\" SelfReg=\"false\" NextFile=\"RELEASENOTES.TXT\"/>\r\n    <ROW File=\"README.txt_4\" Component_=\"aapl.csv\" FileName=\"README.txt\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\README.txt\" SelfReg=\"false\" NextFile=\"s1045.ima.gz\"/>\r\n    <ROW File=\"RELEASENOTES.TXT\" Component_=\"cmb10.ttf\" FileName=\"RELEAS~1.TXT|RELEASENOTES.TXT\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\RELEASENOTES.TXT\" SelfReg=\"false\" NextFile=\"STIXGeneral.ttf\"/>\r\n    <ROW File=\"Registration.png\" Component_=\"About.png\" FileName=\"REGIST~1.PNG|Registration.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Registration.png\" SelfReg=\"false\" NextFile=\"Resist.png\"/>\r\n    <ROW File=\"Resist.png\" Component_=\"About.png\" FileName=\"Resist.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Resist.png\" SelfReg=\"false\" NextFile=\"ResistProfile.png\"/>\r\n    <ROW File=\"ResistProfile.png\" Component_=\"About.png\" FileName=\"RESIST~1.PNG|ResistProfile.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\ResistProfile.png\" SelfReg=\"false\" NextFile=\"Save.png\"/>\r\n    <ROW File=\"STIXGeneral.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXGE~1.TTF|STIXGeneral.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXGeneral.ttf\" SelfReg=\"false\" NextFile=\"STIXGeneralBol.ttf\"/>\r\n    <ROW File=\"STIXGeneralBol.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXGE~2.TTF|STIXGeneralBol.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXGeneralBol.ttf\" SelfReg=\"false\" NextFile=\"STIXGeneralBolIta.ttf\"/>\r\n    <ROW File=\"STIXGeneralBolIta.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXGE~3.TTF|STIXGeneralBolIta.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXGeneralBolIta.ttf\" SelfReg=\"false\" NextFile=\"STIXGeneralItalic.ttf\"/>\r\n    <ROW File=\"STIXGeneralItalic.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXGE~4.TTF|STIXGeneralItalic.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXGeneralItalic.ttf\" SelfReg=\"false\" NextFile=\"STIXNonUni.ttf\"/>\r\n    <ROW File=\"STIXNonUni.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXNO~1.TTF|STIXNonUni.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXNonUni.ttf\" SelfReg=\"false\" NextFile=\"STIXNonUniBol.ttf\"/>\r\n    <ROW File=\"STIXNonUniBol.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXNO~2.TTF|STIXNonUniBol.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXNonUniBol.ttf\" SelfReg=\"false\" NextFile=\"STIXNonUniBolIta.ttf\"/>\r\n    <ROW File=\"STIXNonUniBolIta.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXNO~3.TTF|STIXNonUniBolIta.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXNonUniBolIta.ttf\" SelfReg=\"false\" NextFile=\"STIXNonUniIta.ttf\"/>\r\n    <ROW File=\"STIXNonUniIta.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXNO~4.TTF|STIXNonUniIta.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXNonUniIta.ttf\" SelfReg=\"false\" NextFile=\"STIXSizFiveSymReg.ttf\"/>\r\n    <ROW File=\"STIXSizFiveSymReg.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXSI~1.TTF|STIXSizFiveSymReg.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXSizFiveSymReg.ttf\" SelfReg=\"false\" NextFile=\"STIXSizFourSymBol.ttf\"/>\r\n    <ROW File=\"STIXSizFourSymBol.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXSI~2.TTF|STIXSizFourSymBol.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXSizFourSymBol.ttf\" SelfReg=\"false\" NextFile=\"STIXSizFourSymReg.ttf\"/>\r\n    <ROW File=\"STIXSizFourSymReg.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXSI~3.TTF|STIXSizFourSymReg.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXSizFourSymReg.ttf\" SelfReg=\"false\" NextFile=\"STIXSizOneSymBol.ttf\"/>\r\n    <ROW File=\"STIXSizOneSymBol.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXSI~4.TTF|STIXSizOneSymBol.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXSizOneSymBol.ttf\" SelfReg=\"false\" NextFile=\"STIXSizOneSymReg.ttf\"/>\r\n    <ROW File=\"STIXSizOneSymReg.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXSI~5.TTF|STIXSizOneSymReg.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXSizOneSymReg.ttf\" SelfReg=\"false\" NextFile=\"STIXSizThreeSymBol.ttf\"/>\r\n    <ROW File=\"STIXSizThreeSymBol.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXSI~6.TTF|STIXSizThreeSymBol.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXSizThreeSymBol.ttf\" SelfReg=\"false\" NextFile=\"STIXSizThreeSymReg.ttf\"/>\r\n    <ROW File=\"STIXSizThreeSymReg.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXSI~7.TTF|STIXSizThreeSymReg.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXSizThreeSymReg.ttf\" SelfReg=\"false\" NextFile=\"STIXSizTwoSymBol.ttf\"/>\r\n    <ROW File=\"STIXSizTwoSymBol.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXSI~8.TTF|STIXSizTwoSymBol.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXSizTwoSymBol.ttf\" SelfReg=\"false\" NextFile=\"STIXSizTwoSymReg.ttf\"/>\r\n    <ROW File=\"STIXSizTwoSymReg.ttf\" Component_=\"cmb10.ttf\" FileName=\"STIXSI~9.TTF|STIXSizTwoSymReg.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\STIXSizTwoSymReg.ttf\" SelfReg=\"false\" NextFile=\"Vera.ttf\"/>\r\n    <ROW File=\"Save.png\" Component_=\"About.png\" FileName=\"Save.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Save.png\" SelfReg=\"false\" NextFile=\"SimulationSets.png\"/>\r\n    <ROW File=\"SiDioxide.MAT\" Component_=\"aPolysilicon.MAT\" FileName=\"SIDIOX~1.MAT|Si Dioxide.MAT\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\share\\data\\Si Dioxide.MAT\" SelfReg=\"false\" NextFile=\"SiNitride.MAT\"/>\r\n    <ROW File=\"SiNitride.MAT\" Component_=\"aPolysilicon.MAT\" FileName=\"SINITR~1.MAT|Si Nitride.MAT\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\share\\data\\Si Nitride.MAT\" SelfReg=\"false\" NextFile=\"Silicon.MAT\"/>\r\n    <ROW File=\"Silicon.MAT\" Component_=\"aPolysilicon.MAT\" FileName=\"Silicon.MAT\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\share\\data\\Silicon.MAT\" SelfReg=\"false\" NextFile=\"magic\"/>\r\n    <ROW File=\"SimulationSets.png\" Component_=\"About.png\" FileName=\"SIMULA~1.PNG|SimulationSets.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\SimulationSets.png\" SelfReg=\"false\" NextFile=\"SourceShape.png\"/>\r\n    <ROW File=\"SourceShape.png\" Component_=\"About.png\" FileName=\"SOURCE~1.PNG|SourceShape.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\SourceShape.png\" SelfReg=\"false\" NextFile=\"Summary.png\"/>\r\n    <ROW File=\"Summary.png\" Component_=\"About.png\" FileName=\"Summary.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Summary.png\" SelfReg=\"false\" NextFile=\"Tools.png\"/>\r\n    <ROW File=\"Symbol.afm\" Component_=\"CourierBold.afm\" FileName=\"Symbol.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\pdfcorefonts\\Symbol.afm\" SelfReg=\"false\" NextFile=\"TimesBold.afm\"/>\r\n    <ROW File=\"TimesBold.afm\" Component_=\"CourierBold.afm\" FileName=\"TIMES-~1.AFM|Times-Bold.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\pdfcorefonts\\Times-Bold.afm\" SelfReg=\"false\" NextFile=\"TimesBoldItalic.afm\"/>\r\n    <ROW File=\"TimesBoldItalic.afm\" Component_=\"CourierBold.afm\" FileName=\"TIMES-~2.AFM|Times-BoldItalic.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\pdfcorefonts\\Times-BoldItalic.afm\" SelfReg=\"false\" NextFile=\"TimesItalic.afm\"/>\r\n    <ROW File=\"TimesItalic.afm\" Component_=\"CourierBold.afm\" FileName=\"TIMES-~3.AFM|Times-Italic.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\pdfcorefonts\\Times-Italic.afm\" SelfReg=\"false\" NextFile=\"TimesRoman.afm\"/>\r\n    <ROW File=\"TimesRoman.afm\" Component_=\"CourierBold.afm\" FileName=\"TIMES-~4.AFM|Times-Roman.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\pdfcorefonts\\Times-Roman.afm\" SelfReg=\"false\" NextFile=\"ZapfDingbats.afm\"/>\r\n    <ROW File=\"Tools.png\" Component_=\"About.png\" FileName=\"Tools.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Tools.png\" SelfReg=\"false\" NextFile=\"WaferStack.png\"/>\r\n    <ROW File=\"Vera.ttf\" Component_=\"cmb10.ttf\" FileName=\"Vera.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\Vera.ttf\" SelfReg=\"false\" NextFile=\"VeraBd.ttf\"/>\r\n    <ROW File=\"VeraBI.ttf\" Component_=\"cmb10.ttf\" FileName=\"VeraBI.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\VeraBI.ttf\" SelfReg=\"false\" NextFile=\"VeraIt.ttf\"/>\r\n    <ROW File=\"VeraBd.ttf\" Component_=\"cmb10.ttf\" FileName=\"VeraBd.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\VeraBd.ttf\" SelfReg=\"false\" NextFile=\"VeraBI.ttf\"/>\r\n    <ROW File=\"VeraIt.ttf\" Component_=\"cmb10.ttf\" FileName=\"VeraIt.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\VeraIt.ttf\" SelfReg=\"false\" NextFile=\"VeraMoBd.ttf\"/>\r\n    <ROW File=\"VeraMoBI.ttf\" Component_=\"cmb10.ttf\" FileName=\"VeraMoBI.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\VeraMoBI.ttf\" SelfReg=\"false\" NextFile=\"VeraMoIt.ttf\"/>\r\n    <ROW File=\"VeraMoBd.ttf\" Component_=\"cmb10.ttf\" FileName=\"VeraMoBd.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\VeraMoBd.ttf\" SelfReg=\"false\" NextFile=\"VeraMoBI.ttf\"/>\r\n    <ROW File=\"VeraMoIt.ttf\" Component_=\"cmb10.ttf\" FileName=\"VeraMoIt.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\VeraMoIt.ttf\" SelfReg=\"false\" NextFile=\"VeraMono.ttf\"/>\r\n    <ROW File=\"VeraMono.ttf\" Component_=\"cmb10.ttf\" FileName=\"VeraMono.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\VeraMono.ttf\" SelfReg=\"false\" NextFile=\"VeraSe.ttf\"/>\r\n    <ROW File=\"VeraSe.ttf\" Component_=\"cmb10.ttf\" FileName=\"VeraSe.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\VeraSe.ttf\" SelfReg=\"false\" NextFile=\"VeraSeBd.ttf\"/>\r\n    <ROW File=\"VeraSeBd.ttf\" Component_=\"cmb10.ttf\" FileName=\"VeraSeBd.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\VeraSeBd.ttf\" SelfReg=\"false\" NextFile=\"back.png\"/>\r\n    <ROW File=\"WaferStack.png\" Component_=\"About.png\" FileName=\"WAFERS~1.PNG|WaferStack.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\WaferStack.png\" SelfReg=\"false\" NextFile=\"Wait.png\"/>\r\n    <ROW File=\"Wait.png\" Component_=\"About.png\" FileName=\"Wait.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Wait.png\" SelfReg=\"false\" NextFile=\"Website.png\"/>\r\n    <ROW File=\"Website.png\" Component_=\"About.png\" FileName=\"Website.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\icons\\Website.png\" SelfReg=\"false\" NextFile=\"qgif4.dll\"/>\r\n    <ROW File=\"ZapfDingbats.afm\" Component_=\"CourierBold.afm\" FileName=\"ZAPFDI~1.AFM|ZapfDingbats.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\pdfcorefonts\\ZapfDingbats.afm\" SelfReg=\"false\" NextFile=\"cmb10.ttf\"/>\r\n    <ROW File=\"_clipper.pyd\" Component_=\"_clipper.pyd\" FileName=\"_clipper.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\_clipper.pyd\" SelfReg=\"false\" NextFile=\"_ctypes.pyd\"/>\r\n    <ROW File=\"_ctypes.pyd\" Component_=\"_clipper.pyd\" FileName=\"_ctypes.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\_ctypes.pyd\" SelfReg=\"false\" NextFile=\"_hashlib.pyd\"/>\r\n    <ROW File=\"_hashlib.pyd\" Component_=\"_clipper.pyd\" FileName=\"_hashlib.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\_hashlib.pyd\" SelfReg=\"false\" NextFile=\"_optolithiumc.pyd\"/>\r\n    <ROW File=\"_optolithiumc.pyd\" Component_=\"_clipper.pyd\" FileName=\"_OPTOL~1.PYD|_optolithiumc.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\_optolithiumc.pyd\" SelfReg=\"false\" NextFile=\"_psutil_windows.pyd\"/>\r\n    <ROW File=\"_psutil_windows.pyd\" Component_=\"_clipper.pyd\" FileName=\"_PSUTI~1.PYD|_psutil_windows.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\_psutil_windows.pyd\" SelfReg=\"false\" NextFile=\"_socket.pyd\"/>\r\n    <ROW File=\"_socket.pyd\" Component_=\"_clipper.pyd\" FileName=\"_socket.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\_socket.pyd\" SelfReg=\"false\" NextFile=\"_sqlite3.pyd\"/>\r\n    <ROW File=\"_sqlite3.pyd\" Component_=\"_clipper.pyd\" FileName=\"_sqlite3.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\_sqlite3.pyd\" SelfReg=\"false\" NextFile=\"_ssl.pyd\"/>\r\n    <ROW File=\"_ssl.pyd\" Component_=\"_clipper.pyd\" FileName=\"_ssl.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\_ssl.pyd\" SelfReg=\"false\" NextFile=\"bz2.pyd\"/>\r\n    <ROW File=\"aPolysilicon.MAT\" Component_=\"aPolysilicon.MAT\" FileName=\"A-POLY~1.MAT|a-Polysilicon.MAT\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\share\\data\\a-Polysilicon.MAT\" SelfReg=\"false\" NextFile=\"AirVacuum.MAT\"/>\r\n    <ROW File=\"aapl.csv\" Component_=\"aapl.csv\" FileName=\"aapl.csv\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\aapl.csv\" SelfReg=\"false\" NextFile=\"AAPL.dat.gz\"/>\r\n    <ROW File=\"aapl.npy.gz\" Component_=\"aapl.csv\" FileName=\"AAPLNP~1.GZ|aapl.npy.gz\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\aapl.npy.gz\" SelfReg=\"false\" NextFile=\"ada.png\"/>\r\n    <ROW File=\"ada.png\" Component_=\"aapl.csv\" FileName=\"ada.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\ada.png\" SelfReg=\"false\" NextFile=\"bivariate_normal.npy\"/>\r\n    <ROW File=\"back.png\" Component_=\"back.png\" FileName=\"back.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\back.png\" SelfReg=\"false\" NextFile=\"back.ppm\"/>\r\n    <ROW File=\"back.ppm\" Component_=\"back.png\" FileName=\"back.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\back.ppm\" SelfReg=\"false\" NextFile=\"back.svg\"/>\r\n    <ROW File=\"back.svg\" Component_=\"back.png\" FileName=\"back.svg\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\back.svg\" SelfReg=\"false\" NextFile=\"back.xpm\"/>\r\n    <ROW File=\"back.xpm\" Component_=\"back.png\" FileName=\"back.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\back.xpm\" SelfReg=\"false\" NextFile=\"filesave.png\"/>\r\n    <ROW File=\"bivariate_normal.npy\" Component_=\"bivariate_normal.npy\" FileName=\"BIVARI~1.NPY|bivariate_normal.npy\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\axes_grid\\bivariate_normal.npy\" SelfReg=\"false\" NextFile=\"ct.raw.gz\"/>\r\n    <ROW File=\"bz2.pyd\" Component_=\"_clipper.pyd\" FileName=\"bz2.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\bz2.pyd\" SelfReg=\"false\" NextFile=\"libfftw33.dll\"/>\r\n    <ROW File=\"cmb10.ttf\" Component_=\"cmb10.ttf\" FileName=\"cmb10.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\cmb10.ttf\" SelfReg=\"false\" NextFile=\"cmex10.ttf\"/>\r\n    <ROW File=\"cmex10.afm\" Component_=\"cmex10.afm\" FileName=\"cmex10.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\cmex10.afm\" SelfReg=\"false\" NextFile=\"cmmi10.afm\"/>\r\n    <ROW File=\"cmex10.ttf\" Component_=\"cmb10.ttf\" FileName=\"cmex10.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\cmex10.ttf\" SelfReg=\"false\" NextFile=\"cmmi10.ttf\"/>\r\n    <ROW File=\"cmmi10.afm\" Component_=\"cmex10.afm\" FileName=\"cmmi10.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\cmmi10.afm\" SelfReg=\"false\" NextFile=\"cmr10.afm\"/>\r\n    <ROW File=\"cmmi10.ttf\" Component_=\"cmb10.ttf\" FileName=\"cmmi10.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\cmmi10.ttf\" SelfReg=\"false\" NextFile=\"cmr10.ttf\"/>\r\n    <ROW File=\"cmr10.afm\" Component_=\"cmex10.afm\" FileName=\"cmr10.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\cmr10.afm\" SelfReg=\"false\" NextFile=\"cmsy10.afm\"/>\r\n    <ROW File=\"cmr10.ttf\" Component_=\"cmb10.ttf\" FileName=\"cmr10.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\cmr10.ttf\" SelfReg=\"false\" NextFile=\"cmss10.ttf\"/>\r\n    <ROW File=\"cmss10.ttf\" Component_=\"cmb10.ttf\" FileName=\"cmss10.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\cmss10.ttf\" SelfReg=\"false\" NextFile=\"cmsy10.ttf\"/>\r\n    <ROW File=\"cmsy10.afm\" Component_=\"cmex10.afm\" FileName=\"cmsy10.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\cmsy10.afm\" SelfReg=\"false\" NextFile=\"cmtt10.afm\"/>\r\n    <ROW File=\"cmsy10.ttf\" Component_=\"cmb10.ttf\" FileName=\"cmsy10.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\cmsy10.ttf\" SelfReg=\"false\" NextFile=\"cmtt10.ttf\"/>\r\n    <ROW File=\"cmtt10.afm\" Component_=\"cmex10.afm\" FileName=\"cmtt10.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\cmtt10.afm\" SelfReg=\"false\" NextFile=\"pagd8a.afm\"/>\r\n    <ROW File=\"cmtt10.ttf\" Component_=\"cmb10.ttf\" FileName=\"cmtt10.ttf\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\ttf\\cmtt10.ttf\" SelfReg=\"false\" NextFile=\"COPYRIGHT.TXT\"/>\r\n    <ROW File=\"ct.raw.gz\" Component_=\"aapl.csv\" FileName=\"CTRAW~1.GZ|ct.raw.gz\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\ct.raw.gz\" SelfReg=\"false\" NextFile=\"data_x_x2_x3.csv\"/>\r\n    <ROW File=\"data_x_x2_x3.csv\" Component_=\"aapl.csv\" FileName=\"DATA_X~1.CSV|data_x_x2_x3.csv\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\data_x_x2_x3.csv\" SelfReg=\"false\" NextFile=\"demodata.csv\"/>\r\n    <ROW File=\"demodata.csv\" Component_=\"aapl.csv\" FileName=\"demodata.csv\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\demodata.csv\" SelfReg=\"false\" NextFile=\"eeg.dat\"/>\r\n    <ROW File=\"eeg.dat\" Component_=\"aapl.csv\" FileName=\"eeg.dat\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\eeg.dat\" SelfReg=\"false\" NextFile=\"embedding_in_wx3.xrc\"/>\r\n    <ROW File=\"embedding_in_wx3.xrc\" Component_=\"aapl.csv\" FileName=\"EMBEDD~1.XRC|embedding_in_wx3.xrc\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\embedding_in_wx3.xrc\" SelfReg=\"false\" NextFile=\"goog.npy\"/>\r\n    <ROW File=\"filesave.png\" Component_=\"back.png\" FileName=\"filesave.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\filesave.png\" SelfReg=\"false\" NextFile=\"filesave.ppm\"/>\r\n    <ROW File=\"filesave.ppm\" Component_=\"back.png\" FileName=\"filesave.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\filesave.ppm\" SelfReg=\"false\" NextFile=\"filesave.svg\"/>\r\n    <ROW File=\"filesave.svg\" Component_=\"back.png\" FileName=\"filesave.svg\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\filesave.svg\" SelfReg=\"false\" NextFile=\"filesave.xpm\"/>\r\n    <ROW File=\"filesave.xpm\" Component_=\"back.png\" FileName=\"filesave.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\filesave.xpm\" SelfReg=\"false\" NextFile=\"forward.png\"/>\r\n    <ROW File=\"fivebar.MSK\" Component_=\"aPolysilicon.MAT\" FileName=\"fivebar.MSK\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\share\\data\\fivebar.MSK\" SelfReg=\"false\" NextFile=\"iline.res\"/>\r\n    <ROW File=\"forward.png\" Component_=\"back.png\" FileName=\"forward.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\forward.png\" SelfReg=\"false\" NextFile=\"forward.ppm\"/>\r\n    <ROW File=\"forward.ppm\" Component_=\"back.png\" FileName=\"forward.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\forward.ppm\" SelfReg=\"false\" NextFile=\"forward.svg\"/>\r\n    <ROW File=\"forward.svg\" Component_=\"back.png\" FileName=\"forward.svg\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\forward.svg\" SelfReg=\"false\" NextFile=\"forward.xpm\"/>\r\n    <ROW File=\"forward.xpm\" Component_=\"back.png\" FileName=\"forward.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\forward.xpm\" SelfReg=\"false\" NextFile=\"hand.png\"/>\r\n    <ROW File=\"goog.npy\" Component_=\"aapl.csv\" FileName=\"goog.npy\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\goog.npy\" SelfReg=\"false\" NextFile=\"grace_hopper.jpg\"/>\r\n    <ROW File=\"grace_hopper.jpg\" Component_=\"aapl.csv\" FileName=\"GRACE_~1.JPG|grace_hopper.jpg\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\grace_hopper.jpg\" SelfReg=\"false\" NextFile=\"grace_hopper.png\"/>\r\n    <ROW File=\"grace_hopper.png\" Component_=\"aapl.csv\" FileName=\"GRACE_~1.PNG|grace_hopper.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\grace_hopper.png\" SelfReg=\"false\" NextFile=\"INTC.dat.gz\"/>\r\n    <ROW File=\"hand.png\" Component_=\"back.png\" FileName=\"hand.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\hand.png\" SelfReg=\"false\" NextFile=\"hand.ppm\"/>\r\n    <ROW File=\"hand.ppm\" Component_=\"back.png\" FileName=\"hand.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\hand.ppm\" SelfReg=\"false\" NextFile=\"hand.svg\"/>\r\n    <ROW File=\"hand.svg\" Component_=\"back.png\" FileName=\"hand.svg\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\hand.svg\" SelfReg=\"false\" NextFile=\"hand.xpm\"/>\r\n    <ROW File=\"hand.xpm\" Component_=\"back.png\" FileName=\"hand.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\hand.xpm\" SelfReg=\"false\" NextFile=\"home.png\"/>\r\n    <ROW File=\"home.png\" Component_=\"back.png\" FileName=\"home.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\home.png\" SelfReg=\"false\" NextFile=\"home.ppm\"/>\r\n    <ROW File=\"home.ppm\" Component_=\"back.png\" FileName=\"home.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\home.ppm\" SelfReg=\"false\" NextFile=\"home.svg\"/>\r\n    <ROW File=\"home.svg\" Component_=\"back.png\" FileName=\"home.svg\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\home.svg\" SelfReg=\"false\" NextFile=\"home.xpm\"/>\r\n    <ROW File=\"home.xpm\" Component_=\"back.png\" FileName=\"home.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\home.xpm\" SelfReg=\"false\" NextFile=\"matplotlib.gif\"/>\r\n    <ROW File=\"iline.res\" Component_=\"aPolysilicon.MAT\" FileName=\"i-line.res\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\share\\data\\i-line.res\" SelfReg=\"false\" NextFile=\"SiDioxide.MAT\"/>\r\n    <ROW File=\"lena.jpg\" Component_=\"aapl.csv\" FileName=\"lena.jpg\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\lena.jpg\" SelfReg=\"false\" NextFile=\"lena.png\"/>\r\n    <ROW File=\"lena.png\" Component_=\"aapl.csv\" FileName=\"lena.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\lena.png\" SelfReg=\"false\" NextFile=\"logo2.png\"/>\r\n    <ROW File=\"libannular.dll\" Component_=\"libannular.dll\" FileName=\"LIBANN~1.DLL|libannular.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\plugins\\source_shapes\\libannular.dll\" SelfReg=\"false\" NextFile=\"libcoherent.dll\"/>\r\n    <ROW File=\"libcentral_obscuration.dll\" Component_=\"libcentral_obscuration.dll\" FileName=\"LIBCEN~1.DLL|libcentral_obscuration.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\plugins\\pupil_filters\\libcentral_obscuration.dll\" SelfReg=\"false\" NextFile=\"libannular.dll\"/>\r\n    <ROW File=\"libcoherent.dll\" Component_=\"libcoherent.dll\" FileName=\"LIBCOH~1.DLL|libcoherent.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\plugins\\source_shapes\\libcoherent.dll\" SelfReg=\"false\" NextFile=\"libconvenient.dll\"/>\r\n    <ROW File=\"libconvenient.dll\" Component_=\"libconvenient.dll\" FileName=\"LIBCON~1.DLL|libconvenient.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\plugins\\source_shapes\\libconvenient.dll\" SelfReg=\"false\" NextFile=\"aPolysilicon.MAT\"/>\r\n    <ROW File=\"libenhanced.dll\" Component_=\"libenhanced.dll\" FileName=\"LIBENH~1.DLL|libenhanced.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\plugins\\dev_models\\libenhanced.dll\" SelfReg=\"false\" NextFile=\"libenhanced_notch.dll\"/>\r\n    <ROW File=\"libenhanced_notch.dll\" Component_=\"libenhanced_notch.dll\" FileName=\"LIBENH~2.DLL|libenhanced_notch.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\plugins\\dev_models\\libenhanced_notch.dll\" SelfReg=\"false\" NextFile=\"libmack.dll\"/>\r\n    <ROW File=\"libfftw33.dll\" Component_=\"libfftw33.dll\" FileName=\"LIBFFT~1.DLL|libfftw3-3.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\libfftw3-3.dll\" SelfReg=\"false\" NextFile=\"libgcc_s_dw21.dll\"/>\r\n    <ROW File=\"libfiveBarLine.dll\" Component_=\"libfiveBarLine.dll\" FileName=\"LIBFIV~1.DLL|libfiveBarLine.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\plugins\\masks\\libfiveBarLine.dll\" SelfReg=\"false\" NextFile=\"libline1D.dll\"/>\r\n    <ROW File=\"libgcc_s_dw21.dll\" Component_=\"libgcc_s_dw21.dll\" FileName=\"LIBGCC~1.DLL|libgcc_s_dw2-1.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\libgcc_s_dw2-1.dll\" SelfReg=\"false\" NextFile=\"library.zip\"/>\r\n    <ROW File=\"libline1D.dll\" Component_=\"libline1D.dll\" FileName=\"LIBLIN~1.DLL|libline1D.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\plugins\\masks\\libline1D.dll\" SelfReg=\"false\" NextFile=\"libline1D_SRAF.dll\"/>\r\n    <ROW File=\"libline1D_SRAF.dll\" Component_=\"libline1D_SRAF.dll\" FileName=\"LIBLIN~2.DLL|libline1D_SRAF.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\plugins\\masks\\libline1D_SRAF.dll\" SelfReg=\"false\" NextFile=\"libspace1D.dll\"/>\r\n    <ROW File=\"libmack.dll\" Component_=\"libmack.dll\" FileName=\"libmack.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\plugins\\dev_models\\libmack.dll\" SelfReg=\"false\" NextFile=\"libnotch.dll\"/>\r\n    <ROW File=\"libnotch.dll\" Component_=\"libnotch.dll\" FileName=\"libnotch.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\plugins\\dev_models\\libnotch.dll\" SelfReg=\"false\" NextFile=\"libnotch_depth.dll\"/>\r\n    <ROW File=\"libnotch_depth.dll\" Component_=\"libnotch_depth.dll\" FileName=\"LIBNOT~1.DLL|libnotch_depth.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\plugins\\dev_models\\libnotch_depth.dll\" SelfReg=\"false\" NextFile=\"libfiveBarLine.dll\"/>\r\n    <ROW File=\"library.zip\" Component_=\"_clipper.pyd\" FileName=\"library.zip\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\library.zip\" SelfReg=\"false\" NextFile=\"libstdc6.dll\"/>\r\n    <ROW File=\"libspace1D.dll\" Component_=\"libspace1D.dll\" FileName=\"LIBSPA~1.DLL|libspace1D.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\plugins\\masks\\libspace1D.dll\" SelfReg=\"false\" NextFile=\"libcentral_obscuration.dll\"/>\r\n    <ROW File=\"libstdc6.dll\" Component_=\"libstdc6.dll\" FileName=\"LIBSTD~1.DLL|libstdc++-6.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\libstdc++-6.dll\" SelfReg=\"false\" NextFile=\"libwinpthread1.dll\"/>\r\n    <ROW File=\"libwinpthread1.dll\" Component_=\"libwinpthread1.dll\" FileName=\"LIBWIN~1.DLL|libwinpthread-1.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\libwinpthread-1.dll\" SelfReg=\"false\" NextFile=\"lxml.etree.pyd\"/>\r\n    <ROW File=\"lineprops.glade\" Component_=\"lineprops.glade\" FileName=\"LINEPR~1.GLA|lineprops.glade\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\lineprops.glade\" SelfReg=\"false\" NextFile=\"matplotlibrc_2\"/>\r\n    <ROW File=\"logo2.png\" Component_=\"aapl.csv\" FileName=\"logo2.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\logo2.png\" SelfReg=\"false\" NextFile=\"membrane.dat\"/>\r\n    <ROW File=\"lxml.etree.pyd\" Component_=\"_clipper.pyd\" FileName=\"LXMLET~1.PYD|lxml.etree.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\lxml.etree.pyd\" SelfReg=\"false\" NextFile=\"magic.dll\"/>\r\n    <ROW File=\"magic\" Component_=\"magic\" FileName=\"magic\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\share\\misc\\magic\" SelfReg=\"false\" NextFile=\"magic.mgc\"/>\r\n    <ROW File=\"magic.dll\" Component_=\"magic.dll\" FileName=\"magic.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\magic.dll\" SelfReg=\"false\" NextFile=\"matplotlib._cntr.pyd\"/>\r\n    <ROW File=\"magic.mgc\" Component_=\"magic\" FileName=\"magic.mgc\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\share\\misc\\magic.mgc\" SelfReg=\"false\" NextFile=\"report.xhtml\"/>\r\n    <ROW File=\"matplotlib._cntr.pyd\" Component_=\"_clipper.pyd\" FileName=\"MATPLO~1.PYD|matplotlib._cntr.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\matplotlib._cntr.pyd\" SelfReg=\"false\" NextFile=\"matplotlib._delaunay.pyd\"/>\r\n    <ROW File=\"matplotlib._delaunay.pyd\" Component_=\"_clipper.pyd\" FileName=\"MATPLO~2.PYD|matplotlib._delaunay.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\matplotlib._delaunay.pyd\" SelfReg=\"false\" NextFile=\"matplotlib._image.pyd\"/>\r\n    <ROW File=\"matplotlib._image.pyd\" Component_=\"_clipper.pyd\" FileName=\"MATPLO~3.PYD|matplotlib._image.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\matplotlib._image.pyd\" SelfReg=\"false\" NextFile=\"matplotlib._path.pyd\"/>\r\n    <ROW File=\"matplotlib._path.pyd\" Component_=\"_clipper.pyd\" FileName=\"MATPLO~4.PYD|matplotlib._path.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\matplotlib._path.pyd\" SelfReg=\"false\" NextFile=\"matplotlib._png.pyd\"/>\r\n    <ROW File=\"matplotlib._png.pyd\" Component_=\"_clipper.pyd\" FileName=\"MATPLO~5.PYD|matplotlib._png.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\matplotlib._png.pyd\" SelfReg=\"false\" NextFile=\"matplotlib._tri.pyd\"/>\r\n    <ROW File=\"matplotlib._tri.pyd\" Component_=\"_clipper.pyd\" FileName=\"MATPLO~6.PYD|matplotlib._tri.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\matplotlib._tri.pyd\" SelfReg=\"false\" NextFile=\"matplotlib.backends._backend_agg.pyd\"/>\r\n    <ROW File=\"matplotlib.backends._backend_agg.pyd\" Component_=\"_clipper.pyd\" FileName=\"MATPLO~7.PYD|matplotlib.backends._backend_agg.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\matplotlib.backends._backend_agg.pyd\" SelfReg=\"false\" NextFile=\"matplotlib.ft2font.pyd\"/>\r\n    <ROW File=\"matplotlib.ft2font.pyd\" Component_=\"_clipper.pyd\" FileName=\"MATPLO~8.PYD|matplotlib.ft2font.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\matplotlib.ft2font.pyd\" SelfReg=\"false\" NextFile=\"matplotlib.ttconv.pyd\"/>\r\n    <ROW File=\"matplotlib.gif\" Component_=\"back.png\" FileName=\"MATPLO~1.GIF|matplotlib.gif\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\matplotlib.gif\" SelfReg=\"false\" NextFile=\"matplotlib.png\"/>\r\n    <ROW File=\"matplotlib.png\" Component_=\"back.png\" FileName=\"MATPLO~1.PNG|matplotlib.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\matplotlib.png\" SelfReg=\"false\" NextFile=\"matplotlib.svg\"/>\r\n    <ROW File=\"matplotlib.svg\" Component_=\"back.png\" FileName=\"MATPLO~1.SVG|matplotlib.svg\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\matplotlib.svg\" SelfReg=\"false\" NextFile=\"move.png\"/>\r\n    <ROW File=\"matplotlib.ttconv.pyd\" Component_=\"_clipper.pyd\" FileName=\"MATPLO~9.PYD|matplotlib.ttconv.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\matplotlib.ttconv.pyd\" SelfReg=\"false\" NextFile=\"matplotlibrc\"/>\r\n    <ROW File=\"matplotlibrc\" Component_=\"_clipper.pyd\" FileName=\"MATPLO~1|matplotlibrc\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\matplotlibrc\" SelfReg=\"false\" NextFile=\"numpy.core._sort.pyd\"/>\r\n    <ROW File=\"matplotlibrc_2\" Component_=\"lineprops.glade\" FileName=\"MATPLO~1|matplotlibrc\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\matplotlibrc\" SelfReg=\"false\" NextFile=\"aapl.csv\"/>\r\n    <ROW File=\"membrane.dat\" Component_=\"aapl.csv\" FileName=\"membrane.dat\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\membrane.dat\" SelfReg=\"false\" NextFile=\"Minduka_Present_Blue_Pack.png\"/>\r\n    <ROW File=\"move.png\" Component_=\"back.png\" FileName=\"move.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\move.png\" SelfReg=\"false\" NextFile=\"move.ppm\"/>\r\n    <ROW File=\"move.ppm\" Component_=\"back.png\" FileName=\"move.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\move.ppm\" SelfReg=\"false\" NextFile=\"move.svg\"/>\r\n    <ROW File=\"move.svg\" Component_=\"back.png\" FileName=\"move.svg\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\move.svg\" SelfReg=\"false\" NextFile=\"move.xpm\"/>\r\n    <ROW File=\"move.xpm\" Component_=\"back.png\" FileName=\"move.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\move.xpm\" SelfReg=\"false\" NextFile=\"qt4_editor_options.png\"/>\r\n    <ROW File=\"msft.csv\" Component_=\"aapl.csv\" FileName=\"msft.csv\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\msft.csv\" SelfReg=\"false\" NextFile=\"README.txt_4\"/>\r\n    <ROW File=\"numpy.core._sort.pyd\" Component_=\"_clipper.pyd\" FileName=\"NUMPYC~1.PYD|numpy.core._sort.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\numpy.core._sort.pyd\" SelfReg=\"false\" NextFile=\"numpy.core.multiarray.pyd\"/>\r\n    <ROW File=\"numpy.core.multiarray.pyd\" Component_=\"_clipper.pyd\" FileName=\"NUMPYC~2.PYD|numpy.core.multiarray.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\numpy.core.multiarray.pyd\" SelfReg=\"false\" NextFile=\"numpy.core.scalarmath.pyd\"/>\r\n    <ROW File=\"numpy.core.scalarmath.pyd\" Component_=\"_clipper.pyd\" FileName=\"NUMPYC~3.PYD|numpy.core.scalarmath.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\numpy.core.scalarmath.pyd\" SelfReg=\"false\" NextFile=\"numpy.core.umath.pyd\"/>\r\n    <ROW File=\"numpy.core.umath.pyd\" Component_=\"_clipper.pyd\" FileName=\"NUMPYC~4.PYD|numpy.core.umath.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\numpy.core.umath.pyd\" SelfReg=\"false\" NextFile=\"numpy.fft.fftpack_lite.pyd\"/>\r\n    <ROW File=\"numpy.fft.fftpack_lite.pyd\" Component_=\"_clipper.pyd\" FileName=\"NUMPYF~1.PYD|numpy.fft.fftpack_lite.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\numpy.fft.fftpack_lite.pyd\" SelfReg=\"false\" NextFile=\"numpy.lib._compiled_base.pyd\"/>\r\n    <ROW File=\"numpy.lib._compiled_base.pyd\" Component_=\"_clipper.pyd\" FileName=\"NUMPYL~1.PYD|numpy.lib._compiled_base.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\numpy.lib._compiled_base.pyd\" SelfReg=\"false\" NextFile=\"numpy.linalg.lapack_lite.pyd\"/>\r\n    <ROW File=\"numpy.linalg.lapack_lite.pyd\" Component_=\"_clipper.pyd\" FileName=\"NUMPYL~2.PYD|numpy.linalg.lapack_lite.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\numpy.linalg.lapack_lite.pyd\" SelfReg=\"false\" NextFile=\"numpy.random.mtrand.pyd\"/>\r\n    <ROW File=\"numpy.random.mtrand.pyd\" Component_=\"_clipper.pyd\" FileName=\"NUMPYR~1.PYD|numpy.random.mtrand.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\numpy.random.mtrand.pyd\" SelfReg=\"false\" NextFile=\"optolithium.exe\"/>\r\n    <ROW File=\"optolithium.exe\" Component_=\"optolithium.exe\" FileName=\"OPTOLI~1.EXE|optolithium.exe\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\optolithium.exe\" SelfReg=\"false\" NextFile=\"pyexpat.pyd\" DigSign=\"true\"/>\r\n    <ROW File=\"pagd8a.afm\" Component_=\"cmex10.afm\" FileName=\"pagd8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pagd8a.afm\" SelfReg=\"false\" NextFile=\"pagdo8a.afm\"/>\r\n    <ROW File=\"pagdo8a.afm\" Component_=\"cmex10.afm\" FileName=\"pagdo8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pagdo8a.afm\" SelfReg=\"false\" NextFile=\"pagk8a.afm\"/>\r\n    <ROW File=\"pagk8a.afm\" Component_=\"cmex10.afm\" FileName=\"pagk8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pagk8a.afm\" SelfReg=\"false\" NextFile=\"pagko8a.afm\"/>\r\n    <ROW File=\"pagko8a.afm\" Component_=\"cmex10.afm\" FileName=\"pagko8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pagko8a.afm\" SelfReg=\"false\" NextFile=\"pbkd8a.afm\"/>\r\n    <ROW File=\"pbkd8a.afm\" Component_=\"cmex10.afm\" FileName=\"pbkd8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pbkd8a.afm\" SelfReg=\"false\" NextFile=\"pbkdi8a.afm\"/>\r\n    <ROW File=\"pbkdi8a.afm\" Component_=\"cmex10.afm\" FileName=\"pbkdi8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pbkdi8a.afm\" SelfReg=\"false\" NextFile=\"pbkl8a.afm\"/>\r\n    <ROW File=\"pbkl8a.afm\" Component_=\"cmex10.afm\" FileName=\"pbkl8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pbkl8a.afm\" SelfReg=\"false\" NextFile=\"pbkli8a.afm\"/>\r\n    <ROW File=\"pbkli8a.afm\" Component_=\"cmex10.afm\" FileName=\"pbkli8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pbkli8a.afm\" SelfReg=\"false\" NextFile=\"pcrb8a.afm\"/>\r\n    <ROW File=\"pcrb8a.afm\" Component_=\"cmex10.afm\" FileName=\"pcrb8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pcrb8a.afm\" SelfReg=\"false\" NextFile=\"pcrbo8a.afm\"/>\r\n    <ROW File=\"pcrbo8a.afm\" Component_=\"cmex10.afm\" FileName=\"pcrbo8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pcrbo8a.afm\" SelfReg=\"false\" NextFile=\"pcrr8a.afm\"/>\r\n    <ROW File=\"pcrr8a.afm\" Component_=\"cmex10.afm\" FileName=\"pcrr8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pcrr8a.afm\" SelfReg=\"false\" NextFile=\"pcrro8a.afm\"/>\r\n    <ROW File=\"pcrro8a.afm\" Component_=\"cmex10.afm\" FileName=\"pcrro8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pcrro8a.afm\" SelfReg=\"false\" NextFile=\"phvb8a.afm\"/>\r\n    <ROW File=\"phvb8a.afm\" Component_=\"cmex10.afm\" FileName=\"phvb8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\phvb8a.afm\" SelfReg=\"false\" NextFile=\"phvb8an.afm\"/>\r\n    <ROW File=\"phvb8an.afm\" Component_=\"cmex10.afm\" FileName=\"phvb8an.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\phvb8an.afm\" SelfReg=\"false\" NextFile=\"phvbo8a.afm\"/>\r\n    <ROW File=\"phvbo8a.afm\" Component_=\"cmex10.afm\" FileName=\"phvbo8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\phvbo8a.afm\" SelfReg=\"false\" NextFile=\"phvbo8an.afm\"/>\r\n    <ROW File=\"phvbo8an.afm\" Component_=\"cmex10.afm\" FileName=\"phvbo8an.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\phvbo8an.afm\" SelfReg=\"false\" NextFile=\"phvl8a.afm\"/>\r\n    <ROW File=\"phvl8a.afm\" Component_=\"cmex10.afm\" FileName=\"phvl8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\phvl8a.afm\" SelfReg=\"false\" NextFile=\"phvlo8a.afm\"/>\r\n    <ROW File=\"phvlo8a.afm\" Component_=\"cmex10.afm\" FileName=\"phvlo8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\phvlo8a.afm\" SelfReg=\"false\" NextFile=\"phvr8a.afm\"/>\r\n    <ROW File=\"phvr8a.afm\" Component_=\"cmex10.afm\" FileName=\"phvr8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\phvr8a.afm\" SelfReg=\"false\" NextFile=\"phvr8an.afm\"/>\r\n    <ROW File=\"phvr8an.afm\" Component_=\"cmex10.afm\" FileName=\"phvr8an.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\phvr8an.afm\" SelfReg=\"false\" NextFile=\"phvro8a.afm\"/>\r\n    <ROW File=\"phvro8a.afm\" Component_=\"cmex10.afm\" FileName=\"phvro8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\phvro8a.afm\" SelfReg=\"false\" NextFile=\"phvro8an.afm\"/>\r\n    <ROW File=\"phvro8an.afm\" Component_=\"cmex10.afm\" FileName=\"phvro8an.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\phvro8an.afm\" SelfReg=\"false\" NextFile=\"pncb8a.afm\"/>\r\n    <ROW File=\"pncb8a.afm\" Component_=\"cmex10.afm\" FileName=\"pncb8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pncb8a.afm\" SelfReg=\"false\" NextFile=\"pncbi8a.afm\"/>\r\n    <ROW File=\"pncbi8a.afm\" Component_=\"cmex10.afm\" FileName=\"pncbi8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pncbi8a.afm\" SelfReg=\"false\" NextFile=\"pncr8a.afm\"/>\r\n    <ROW File=\"pncr8a.afm\" Component_=\"cmex10.afm\" FileName=\"pncr8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pncr8a.afm\" SelfReg=\"false\" NextFile=\"pncri8a.afm\"/>\r\n    <ROW File=\"pncri8a.afm\" Component_=\"cmex10.afm\" FileName=\"pncri8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pncri8a.afm\" SelfReg=\"false\" NextFile=\"pplb8a.afm\"/>\r\n    <ROW File=\"pplb8a.afm\" Component_=\"cmex10.afm\" FileName=\"pplb8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pplb8a.afm\" SelfReg=\"false\" NextFile=\"pplbi8a.afm\"/>\r\n    <ROW File=\"pplbi8a.afm\" Component_=\"cmex10.afm\" FileName=\"pplbi8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pplbi8a.afm\" SelfReg=\"false\" NextFile=\"pplr8a.afm\"/>\r\n    <ROW File=\"pplr8a.afm\" Component_=\"cmex10.afm\" FileName=\"pplr8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pplr8a.afm\" SelfReg=\"false\" NextFile=\"pplri8a.afm\"/>\r\n    <ROW File=\"pplri8a.afm\" Component_=\"cmex10.afm\" FileName=\"pplri8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pplri8a.afm\" SelfReg=\"false\" NextFile=\"psyr.afm\"/>\r\n    <ROW File=\"psyr.afm\" Component_=\"cmex10.afm\" FileName=\"psyr.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\psyr.afm\" SelfReg=\"false\" NextFile=\"ptmb8a.afm\"/>\r\n    <ROW File=\"ptmb8a.afm\" Component_=\"cmex10.afm\" FileName=\"ptmb8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\ptmb8a.afm\" SelfReg=\"false\" NextFile=\"ptmbi8a.afm\"/>\r\n    <ROW File=\"ptmbi8a.afm\" Component_=\"cmex10.afm\" FileName=\"ptmbi8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\ptmbi8a.afm\" SelfReg=\"false\" NextFile=\"ptmr8a.afm\"/>\r\n    <ROW File=\"ptmr8a.afm\" Component_=\"cmex10.afm\" FileName=\"ptmr8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\ptmr8a.afm\" SelfReg=\"false\" NextFile=\"ptmri8a.afm\"/>\r\n    <ROW File=\"ptmri8a.afm\" Component_=\"cmex10.afm\" FileName=\"ptmri8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\ptmri8a.afm\" SelfReg=\"false\" NextFile=\"putb8a.afm\"/>\r\n    <ROW File=\"putb8a.afm\" Component_=\"cmex10.afm\" FileName=\"putb8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\putb8a.afm\" SelfReg=\"false\" NextFile=\"putbi8a.afm\"/>\r\n    <ROW File=\"putbi8a.afm\" Component_=\"cmex10.afm\" FileName=\"putbi8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\putbi8a.afm\" SelfReg=\"false\" NextFile=\"putr8a.afm\"/>\r\n    <ROW File=\"putr8a.afm\" Component_=\"cmex10.afm\" FileName=\"putr8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\putr8a.afm\" SelfReg=\"false\" NextFile=\"putri8a.afm\"/>\r\n    <ROW File=\"putri8a.afm\" Component_=\"cmex10.afm\" FileName=\"putri8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\putri8a.afm\" SelfReg=\"false\" NextFile=\"pzcmi8a.afm\"/>\r\n    <ROW File=\"pyexpat.pyd\" Component_=\"_clipper.pyd\" FileName=\"pyexpat.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\pyexpat.pyd\" SelfReg=\"false\" NextFile=\"PySide.QtCore.pyd\"/>\r\n    <ROW File=\"pysidepython2.7.dll\" Component_=\"pysidepython2.7.dll\" FileName=\"PYSIDE~1.DLL|pyside-python2.7.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\pyside-python2.7.dll\" SelfReg=\"false\" NextFile=\"python27.dll\"/>\r\n    <ROW File=\"python27.dll\" Component_=\"python27.dll\" FileName=\"python27.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\python27.dll\" SelfReg=\"false\" NextFile=\"pywintypes27.dll\"/>\r\n    <ROW File=\"pywintypes27.dll\" Component_=\"pywintypes27.dll\" FileName=\"PYWINT~1.DLL|pywintypes27.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\pywintypes27.dll\" SelfReg=\"false\" NextFile=\"QtCore4.dll\"/>\r\n    <ROW File=\"pzcmi8a.afm\" Component_=\"cmex10.afm\" FileName=\"pzcmi8a.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pzcmi8a.afm\" SelfReg=\"false\" NextFile=\"pzdr.afm\"/>\r\n    <ROW File=\"pzdr.afm\" Component_=\"cmex10.afm\" FileName=\"pzdr.afm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\afm\\pzdr.afm\" SelfReg=\"false\" NextFile=\"CourierBold.afm\"/>\r\n    <ROW File=\"qgif4.dll\" Component_=\"qgif4.dll\" FileName=\"qgif4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\imageformats\\qgif4.dll\" SelfReg=\"false\" NextFile=\"qgifd4.dll\"/>\r\n    <ROW File=\"qgifd4.dll\" Component_=\"qgifd4.dll\" FileName=\"qgifd4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\imageformats\\qgifd4.dll\" SelfReg=\"false\" NextFile=\"qico4.dll\"/>\r\n    <ROW File=\"qico4.dll\" Component_=\"qico4.dll\" FileName=\"qico4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\imageformats\\qico4.dll\" SelfReg=\"false\" NextFile=\"qicod4.dll\"/>\r\n    <ROW File=\"qicod4.dll\" Component_=\"qicod4.dll\" FileName=\"qicod4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\imageformats\\qicod4.dll\" SelfReg=\"false\" NextFile=\"qjpeg4.dll\"/>\r\n    <ROW File=\"qjpeg4.dll\" Component_=\"qjpeg4.dll\" FileName=\"qjpeg4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\imageformats\\qjpeg4.dll\" SelfReg=\"false\" NextFile=\"qjpegd4.dll\"/>\r\n    <ROW File=\"qjpegd4.dll\" Component_=\"qjpegd4.dll\" FileName=\"qjpegd4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\imageformats\\qjpegd4.dll\" SelfReg=\"false\" NextFile=\"qmng4.dll\"/>\r\n    <ROW File=\"qmng4.dll\" Component_=\"qmng4.dll\" FileName=\"qmng4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\imageformats\\qmng4.dll\" SelfReg=\"false\" NextFile=\"qmngd4.dll\"/>\r\n    <ROW File=\"qmngd4.dll\" Component_=\"qmngd4.dll\" FileName=\"qmngd4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\imageformats\\qmngd4.dll\" SelfReg=\"false\" NextFile=\"qsvg4.dll\"/>\r\n    <ROW File=\"qsvg4.dll\" Component_=\"qsvg4.dll\" FileName=\"qsvg4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\imageformats\\qsvg4.dll\" SelfReg=\"false\" NextFile=\"qsvgd4.dll\"/>\r\n    <ROW File=\"qsvgd4.dll\" Component_=\"qsvgd4.dll\" FileName=\"qsvgd4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\imageformats\\qsvgd4.dll\" SelfReg=\"false\" NextFile=\"qtga4.dll\"/>\r\n    <ROW File=\"qt4_editor_options.png\" Component_=\"back.png\" FileName=\"QT4_ED~1.PNG|qt4_editor_options.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\qt4_editor_options.png\" SelfReg=\"false\" NextFile=\"qt4_editor_options.svg\"/>\r\n    <ROW File=\"qt4_editor_options.svg\" Component_=\"back.png\" FileName=\"QT4_ED~1.SVG|qt4_editor_options.svg\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\qt4_editor_options.svg\" SelfReg=\"false\" NextFile=\"stock_close.ppm\"/>\r\n    <ROW File=\"qtga4.dll\" Component_=\"qtga4.dll\" FileName=\"qtga4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\imageformats\\qtga4.dll\" SelfReg=\"false\" NextFile=\"qtgad4.dll\"/>\r\n    <ROW File=\"qtgad4.dll\" Component_=\"qtgad4.dll\" FileName=\"qtgad4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\imageformats\\qtgad4.dll\" SelfReg=\"false\" NextFile=\"qtiff4.dll\"/>\r\n    <ROW File=\"qtiff4.dll\" Component_=\"qtiff4.dll\" FileName=\"qtiff4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\imageformats\\qtiff4.dll\" SelfReg=\"false\" NextFile=\"qtiffd4.dll\"/>\r\n    <ROW File=\"qtiffd4.dll\" Component_=\"qtiffd4.dll\" FileName=\"qtiffd4.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\imageformats\\qtiffd4.dll\" SelfReg=\"false\" NextFile=\"cmex10.afm\"/>\r\n    <ROW File=\"readme.txt\" Component_=\"CourierBold.afm\" FileName=\"readme.txt\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\fonts\\pdfcorefonts\\readme.txt\" SelfReg=\"false\" NextFile=\"Symbol.afm\"/>\r\n    <ROW File=\"regex2.dll\" Component_=\"regex2.dll\" FileName=\"regex2.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\regex2.dll\" SelfReg=\"false\" NextFile=\"scipy.interpolate._fitpack.pyd\"/>\r\n    <ROW File=\"report.xhtml\" Component_=\"report.xhtml\" FileName=\"REPORT~1.XHT|report.xhtml\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\xhtml\\report.xhtml\" SelfReg=\"false\"/>\r\n    <ROW File=\"s1045.ima.gz\" Component_=\"aapl.csv\" FileName=\"S1045I~1.GZ|s1045.ima.gz\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\sample_data\\s1045.ima.gz\" SelfReg=\"false\" NextFile=\"libenhanced.dll\"/>\r\n    <ROW File=\"scipy.interpolate._fitpack.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYI~1.PYD|scipy.interpolate._fitpack.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.interpolate._fitpack.pyd\" SelfReg=\"false\" NextFile=\"scipy.interpolate._interpolate.pyd\"/>\r\n    <ROW File=\"scipy.interpolate._interpolate.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYI~2.PYD|scipy.interpolate._interpolate.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.interpolate._interpolate.pyd\" SelfReg=\"false\" NextFile=\"scipy.interpolate.dfitpack.pyd\"/>\r\n    <ROW File=\"scipy.interpolate.dfitpack.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYI~3.PYD|scipy.interpolate.dfitpack.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.interpolate.dfitpack.pyd\" SelfReg=\"false\" NextFile=\"scipy.interpolate.interpnd.pyd\"/>\r\n    <ROW File=\"scipy.interpolate.interpnd.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYI~4.PYD|scipy.interpolate.interpnd.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.interpolate.interpnd.pyd\" SelfReg=\"false\" NextFile=\"scipy.lib.blas.cblas.pyd\"/>\r\n    <ROW File=\"scipy.lib.blas.cblas.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYL~1.PYD|scipy.lib.blas.cblas.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.lib.blas.cblas.pyd\" SelfReg=\"false\" NextFile=\"scipy.lib.blas.fblas.pyd\"/>\r\n    <ROW File=\"scipy.lib.blas.fblas.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYL~2.PYD|scipy.lib.blas.fblas.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.lib.blas.fblas.pyd\" SelfReg=\"false\" NextFile=\"scipy.lib.lapack.calc_lwork.pyd\"/>\r\n    <ROW File=\"scipy.lib.lapack.calc_lwork.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYL~3.PYD|scipy.lib.lapack.calc_lwork.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.lib.lapack.calc_lwork.pyd\" SelfReg=\"false\" NextFile=\"scipy.lib.lapack.clapack.pyd\"/>\r\n    <ROW File=\"scipy.lib.lapack.clapack.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYL~4.PYD|scipy.lib.lapack.clapack.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.lib.lapack.clapack.pyd\" SelfReg=\"false\" NextFile=\"scipy.lib.lapack.flapack.pyd\"/>\r\n    <ROW File=\"scipy.lib.lapack.flapack.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYL~5.PYD|scipy.lib.lapack.flapack.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.lib.lapack.flapack.pyd\" SelfReg=\"false\" NextFile=\"scipy.linalg._cblas.pyd\"/>\r\n    <ROW File=\"scipy.linalg._cblas.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYL~6.PYD|scipy.linalg._cblas.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.linalg._cblas.pyd\" SelfReg=\"false\" NextFile=\"scipy.linalg._clapack.pyd\"/>\r\n    <ROW File=\"scipy.linalg._clapack.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYL~7.PYD|scipy.linalg._clapack.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.linalg._clapack.pyd\" SelfReg=\"false\" NextFile=\"scipy.linalg._fblas.pyd\"/>\r\n    <ROW File=\"scipy.linalg._fblas.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYL~8.PYD|scipy.linalg._fblas.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.linalg._fblas.pyd\" SelfReg=\"false\" NextFile=\"scipy.linalg._flapack.pyd\"/>\r\n    <ROW File=\"scipy.linalg._flapack.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYL~9.PYD|scipy.linalg._flapack.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.linalg._flapack.pyd\" SelfReg=\"false\" NextFile=\"scipy.linalg._flinalg.pyd\"/>\r\n    <ROW File=\"scipy.linalg._flinalg.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPY~10.PYD|scipy.linalg._flinalg.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.linalg._flinalg.pyd\" SelfReg=\"false\" NextFile=\"scipy.linalg._interpolative.pyd\"/>\r\n    <ROW File=\"scipy.linalg._interpolative.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPY~11.PYD|scipy.linalg._interpolative.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.linalg._interpolative.pyd\" SelfReg=\"false\" NextFile=\"scipy.linalg.calc_lwork.pyd\"/>\r\n    <ROW File=\"scipy.linalg.calc_lwork.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPY~12.PYD|scipy.linalg.calc_lwork.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.linalg.calc_lwork.pyd\" SelfReg=\"false\" NextFile=\"scipy.ndimage._nd_image.pyd\"/>\r\n    <ROW File=\"scipy.ndimage._nd_image.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYN~1.PYD|scipy.ndimage._nd_image.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.ndimage._nd_image.pyd\" SelfReg=\"false\" NextFile=\"scipy.ndimage._ni_label.pyd\"/>\r\n    <ROW File=\"scipy.ndimage._ni_label.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYN~2.PYD|scipy.ndimage._ni_label.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.ndimage._ni_label.pyd\" SelfReg=\"false\" NextFile=\"scipy.optimize._cobyla.pyd\"/>\r\n    <ROW File=\"scipy.optimize._cobyla.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYO~1.PYD|scipy.optimize._cobyla.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.optimize._cobyla.pyd\" SelfReg=\"false\" NextFile=\"scipy.optimize._lbfgsb.pyd\"/>\r\n    <ROW File=\"scipy.optimize._lbfgsb.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYO~2.PYD|scipy.optimize._lbfgsb.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.optimize._lbfgsb.pyd\" SelfReg=\"false\" NextFile=\"scipy.optimize._minpack.pyd\"/>\r\n    <ROW File=\"scipy.optimize._minpack.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYO~3.PYD|scipy.optimize._minpack.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.optimize._minpack.pyd\" SelfReg=\"false\" NextFile=\"scipy.optimize._nnls.pyd\"/>\r\n    <ROW File=\"scipy.optimize._nnls.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYO~4.PYD|scipy.optimize._nnls.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.optimize._nnls.pyd\" SelfReg=\"false\" NextFile=\"scipy.optimize._slsqp.pyd\"/>\r\n    <ROW File=\"scipy.optimize._slsqp.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYO~5.PYD|scipy.optimize._slsqp.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.optimize._slsqp.pyd\" SelfReg=\"false\" NextFile=\"scipy.optimize._zeros.pyd\"/>\r\n    <ROW File=\"scipy.optimize._zeros.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYO~6.PYD|scipy.optimize._zeros.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.optimize._zeros.pyd\" SelfReg=\"false\" NextFile=\"scipy.optimize.minpack2.pyd\"/>\r\n    <ROW File=\"scipy.optimize.minpack2.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYO~7.PYD|scipy.optimize.minpack2.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.optimize.minpack2.pyd\" SelfReg=\"false\" NextFile=\"scipy.optimize.moduleTNC.pyd\"/>\r\n    <ROW File=\"scipy.optimize.moduleTNC.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYO~8.PYD|scipy.optimize.moduleTNC.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.optimize.moduleTNC.pyd\" SelfReg=\"false\" NextFile=\"scipy.sparse.csgraph._min_spanning_tree.pyd\"/>\r\n    <ROW File=\"scipy.sparse.csgraph._min_spanning_tree.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYS~1.PYD|scipy.sparse.csgraph._min_spanning_tree.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.sparse.csgraph._min_spanning_tree.pyd\" SelfReg=\"false\" NextFile=\"scipy.sparse.csgraph._shortest_path.pyd\"/>\r\n    <ROW File=\"scipy.sparse.csgraph._shortest_path.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYS~2.PYD|scipy.sparse.csgraph._shortest_path.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.sparse.csgraph._shortest_path.pyd\" SelfReg=\"false\" NextFile=\"scipy.sparse.csgraph._tools.pyd\"/>\r\n    <ROW File=\"scipy.sparse.csgraph._tools.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYS~3.PYD|scipy.sparse.csgraph._tools.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.sparse.csgraph._tools.pyd\" SelfReg=\"false\" NextFile=\"scipy.sparse.csgraph._traversal.pyd\"/>\r\n    <ROW File=\"scipy.sparse.csgraph._traversal.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYS~4.PYD|scipy.sparse.csgraph._traversal.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.sparse.csgraph._traversal.pyd\" SelfReg=\"false\" NextFile=\"scipy.sparse.linalg.dsolve._superlu.pyd\"/>\r\n    <ROW File=\"scipy.sparse.linalg.dsolve._superlu.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYS~5.PYD|scipy.sparse.linalg.dsolve._superlu.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.sparse.linalg.dsolve._superlu.pyd\" SelfReg=\"false\" NextFile=\"scipy.sparse.linalg.eigen.arpack._arpack.pyd\"/>\r\n    <ROW File=\"scipy.sparse.linalg.eigen.arpack._arpack.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYS~6.PYD|scipy.sparse.linalg.eigen.arpack._arpack.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.sparse.linalg.eigen.arpack._arpack.pyd\" SelfReg=\"false\" NextFile=\"scipy.sparse.linalg.isolve._iterative.pyd\"/>\r\n    <ROW File=\"scipy.sparse.linalg.isolve._iterative.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYS~7.PYD|scipy.sparse.linalg.isolve._iterative.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.sparse.linalg.isolve._iterative.pyd\" SelfReg=\"false\" NextFile=\"scipy.sparse.sparsetools._bsr.pyd\"/>\r\n    <ROW File=\"scipy.sparse.sparsetools._bsr.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYS~8.PYD|scipy.sparse.sparsetools._bsr.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.sparse.sparsetools._bsr.pyd\" SelfReg=\"false\" NextFile=\"scipy.sparse.sparsetools._coo.pyd\"/>\r\n    <ROW File=\"scipy.sparse.sparsetools._coo.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPYS~9.PYD|scipy.sparse.sparsetools._coo.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.sparse.sparsetools._coo.pyd\" SelfReg=\"false\" NextFile=\"scipy.sparse.sparsetools._csc.pyd\"/>\r\n    <ROW File=\"scipy.sparse.sparsetools._csc.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPY~13.PYD|scipy.sparse.sparsetools._csc.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.sparse.sparsetools._csc.pyd\" SelfReg=\"false\" NextFile=\"scipy.sparse.sparsetools._csgraph.pyd\"/>\r\n    <ROW File=\"scipy.sparse.sparsetools._csgraph.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPY~14.PYD|scipy.sparse.sparsetools._csgraph.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.sparse.sparsetools._csgraph.pyd\" SelfReg=\"false\" NextFile=\"scipy.sparse.sparsetools._csr.pyd\"/>\r\n    <ROW File=\"scipy.sparse.sparsetools._csr.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPY~15.PYD|scipy.sparse.sparsetools._csr.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.sparse.sparsetools._csr.pyd\" SelfReg=\"false\" NextFile=\"scipy.sparse.sparsetools._dia.pyd\"/>\r\n    <ROW File=\"scipy.sparse.sparsetools._dia.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPY~16.PYD|scipy.sparse.sparsetools._dia.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.sparse.sparsetools._dia.pyd\" SelfReg=\"false\" NextFile=\"scipy.spatial._distance_wrap.pyd\"/>\r\n    <ROW File=\"scipy.spatial._distance_wrap.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPY~17.PYD|scipy.spatial._distance_wrap.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.spatial._distance_wrap.pyd\" SelfReg=\"false\" NextFile=\"scipy.spatial.ckdtree.pyd\"/>\r\n    <ROW File=\"scipy.spatial.ckdtree.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPY~18.PYD|scipy.spatial.ckdtree.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.spatial.ckdtree.pyd\" SelfReg=\"false\" NextFile=\"scipy.spatial.qhull.pyd\"/>\r\n    <ROW File=\"scipy.spatial.qhull.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPY~19.PYD|scipy.spatial.qhull.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.spatial.qhull.pyd\" SelfReg=\"false\" NextFile=\"scipy.special._ufuncs.pyd\"/>\r\n    <ROW File=\"scipy.special._ufuncs.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPY~20.PYD|scipy.special._ufuncs.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.special._ufuncs.pyd\" SelfReg=\"false\" NextFile=\"scipy.special._ufuncs_cxx.pyd\"/>\r\n    <ROW File=\"scipy.special._ufuncs_cxx.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPY~21.PYD|scipy.special._ufuncs_cxx.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.special._ufuncs_cxx.pyd\" SelfReg=\"false\" NextFile=\"scipy.special.specfun.pyd\"/>\r\n    <ROW File=\"scipy.special.specfun.pyd\" Component_=\"_clipper.pyd\" FileName=\"SCIPY~22.PYD|scipy.special.specfun.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\scipy.special.specfun.pyd\" SelfReg=\"false\" NextFile=\"select.pyd\"/>\r\n    <ROW File=\"select.pyd\" Component_=\"_clipper.pyd\" FileName=\"select.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\select.pyd\" SelfReg=\"false\" NextFile=\"shibokenpython2.7.dll\"/>\r\n    <ROW File=\"shibokenpython2.7.dll\" Component_=\"shibokenpython2.7.dll\" FileName=\"SHIBOK~1.DLL|shiboken-python2.7.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\shiboken-python2.7.dll\" SelfReg=\"false\" NextFile=\"sip.pyd\"/>\r\n    <ROW File=\"sip.pyd\" Component_=\"_clipper.pyd\" FileName=\"sip.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\sip.pyd\" SelfReg=\"false\" NextFile=\"sqlalchemy.cprocessors.pyd\"/>\r\n    <ROW File=\"sqlalchemy.cprocessors.pyd\" Component_=\"_clipper.pyd\" FileName=\"SQLALC~1.PYD|sqlalchemy.cprocessors.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\sqlalchemy.cprocessors.pyd\" SelfReg=\"false\" NextFile=\"sqlalchemy.cresultproxy.pyd\"/>\r\n    <ROW File=\"sqlalchemy.cresultproxy.pyd\" Component_=\"_clipper.pyd\" FileName=\"SQLALC~2.PYD|sqlalchemy.cresultproxy.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\sqlalchemy.cresultproxy.pyd\" SelfReg=\"false\" NextFile=\"sqlalchemy.cutils.pyd\"/>\r\n    <ROW File=\"sqlalchemy.cutils.pyd\" Component_=\"_clipper.pyd\" FileName=\"SQLALC~3.PYD|sqlalchemy.cutils.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\sqlalchemy.cutils.pyd\" SelfReg=\"false\" NextFile=\"sqlite3.dll\"/>\r\n    <ROW File=\"sqlite3.dll\" Component_=\"sqlite3.dll\" FileName=\"sqlite3.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\sqlite3.dll\" SelfReg=\"false\" NextFile=\"sympy.mpmath.libmp.exec_py3.py\"/>\r\n    <ROW File=\"stock_close.ppm\" Component_=\"back.png\" FileName=\"STOCK_~1.PPM|stock_close.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_close.ppm\" SelfReg=\"false\" NextFile=\"stock_close.xpm\"/>\r\n    <ROW File=\"stock_close.xpm\" Component_=\"back.png\" FileName=\"STOCK_~1.XPM|stock_close.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_close.xpm\" SelfReg=\"false\" NextFile=\"stock_down.ppm\"/>\r\n    <ROW File=\"stock_down.ppm\" Component_=\"back.png\" FileName=\"STOCK_~2.PPM|stock_down.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_down.ppm\" SelfReg=\"false\" NextFile=\"stock_down.xpm\"/>\r\n    <ROW File=\"stock_down.xpm\" Component_=\"back.png\" FileName=\"STOCK_~2.XPM|stock_down.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_down.xpm\" SelfReg=\"false\" NextFile=\"stock_left.ppm\"/>\r\n    <ROW File=\"stock_left.ppm\" Component_=\"back.png\" FileName=\"STOCK_~3.PPM|stock_left.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_left.ppm\" SelfReg=\"false\" NextFile=\"stock_left.xpm\"/>\r\n    <ROW File=\"stock_left.xpm\" Component_=\"back.png\" FileName=\"STOCK_~3.XPM|stock_left.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_left.xpm\" SelfReg=\"false\" NextFile=\"stock_refresh.ppm\"/>\r\n    <ROW File=\"stock_refresh.ppm\" Component_=\"back.png\" FileName=\"STOCK_~4.PPM|stock_refresh.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_refresh.ppm\" SelfReg=\"false\" NextFile=\"stock_refresh.xpm\"/>\r\n    <ROW File=\"stock_refresh.xpm\" Component_=\"back.png\" FileName=\"STOCK_~4.XPM|stock_refresh.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_refresh.xpm\" SelfReg=\"false\" NextFile=\"stock_right.ppm\"/>\r\n    <ROW File=\"stock_right.ppm\" Component_=\"back.png\" FileName=\"STOCK_~5.PPM|stock_right.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_right.ppm\" SelfReg=\"false\" NextFile=\"stock_right.xpm\"/>\r\n    <ROW File=\"stock_right.xpm\" Component_=\"back.png\" FileName=\"STOCK_~5.XPM|stock_right.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_right.xpm\" SelfReg=\"false\" NextFile=\"stock_save_as.ppm\"/>\r\n    <ROW File=\"stock_save_as.ppm\" Component_=\"back.png\" FileName=\"STOCK_~6.PPM|stock_save_as.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_save_as.ppm\" SelfReg=\"false\" NextFile=\"stock_save_as.xpm\"/>\r\n    <ROW File=\"stock_save_as.xpm\" Component_=\"back.png\" FileName=\"STOCK_~6.XPM|stock_save_as.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_save_as.xpm\" SelfReg=\"false\" NextFile=\"stock_up.ppm\"/>\r\n    <ROW File=\"stock_up.ppm\" Component_=\"back.png\" FileName=\"stock_up.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_up.ppm\" SelfReg=\"false\" NextFile=\"stock_up.xpm\"/>\r\n    <ROW File=\"stock_up.xpm\" Component_=\"back.png\" FileName=\"stock_up.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_up.xpm\" SelfReg=\"false\" NextFile=\"stock_zoomin.ppm\"/>\r\n    <ROW File=\"stock_zoomin.ppm\" Component_=\"back.png\" FileName=\"STOCK_~7.PPM|stock_zoom-in.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_zoom-in.ppm\" SelfReg=\"false\" NextFile=\"stock_zoomin.xpm\"/>\r\n    <ROW File=\"stock_zoomin.xpm\" Component_=\"back.png\" FileName=\"STOCK_~7.XPM|stock_zoom-in.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_zoom-in.xpm\" SelfReg=\"false\" NextFile=\"stock_zoomout.ppm\"/>\r\n    <ROW File=\"stock_zoomout.ppm\" Component_=\"back.png\" FileName=\"STOCK_~8.PPM|stock_zoom-out.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_zoom-out.ppm\" SelfReg=\"false\" NextFile=\"stock_zoomout.xpm\"/>\r\n    <ROW File=\"stock_zoomout.xpm\" Component_=\"back.png\" FileName=\"STOCK_~8.XPM|stock_zoom-out.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\stock_zoom-out.xpm\" SelfReg=\"false\" NextFile=\"subplots.png\"/>\r\n    <ROW File=\"subplots.png\" Component_=\"back.png\" FileName=\"subplots.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\subplots.png\" SelfReg=\"false\" NextFile=\"subplots.ppm\"/>\r\n    <ROW File=\"subplots.ppm\" Component_=\"back.png\" FileName=\"subplots.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\subplots.ppm\" SelfReg=\"false\" NextFile=\"subplots.xpm\"/>\r\n    <ROW File=\"subplots.xpm\" Component_=\"back.png\" FileName=\"subplots.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\subplots.xpm\" SelfReg=\"false\" NextFile=\"zoom_to_rect.png\"/>\r\n    <ROW File=\"sympy.mpmath.libmp.exec_py3.py\" Component_=\"_clipper.pyd\" FileName=\"SYMPYM~1.PY|sympy.mpmath.libmp.exec_py3.py\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\sympy.mpmath.libmp.exec_py3.py\" SelfReg=\"false\" NextFile=\"unicodedata.pyd\"/>\r\n    <ROW File=\"unicodedata.pyd\" Component_=\"_clipper.pyd\" FileName=\"UNICOD~1.PYD|unicodedata.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\unicodedata.pyd\" SelfReg=\"false\" NextFile=\"win32api.pyd\"/>\r\n    <ROW File=\"win32api.pyd\" Component_=\"_clipper.pyd\" FileName=\"win32api.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\win32api.pyd\" SelfReg=\"false\" NextFile=\"win32pdh.pyd\"/>\r\n    <ROW File=\"win32pdh.pyd\" Component_=\"_clipper.pyd\" FileName=\"win32pdh.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\win32pdh.pyd\" SelfReg=\"false\" NextFile=\"win32pipe.pyd\"/>\r\n    <ROW File=\"win32pipe.pyd\" Component_=\"_clipper.pyd\" FileName=\"WIN32P~1.PYD|win32pipe.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\win32pipe.pyd\" SelfReg=\"false\" NextFile=\"win32wnet.pyd\"/>\r\n    <ROW File=\"win32wnet.pyd\" Component_=\"_clipper.pyd\" FileName=\"WIN32W~1.PYD|win32wnet.pyd\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\win32wnet.pyd\" SelfReg=\"false\" NextFile=\"zlib1.dll\"/>\r\n    <ROW File=\"zlib1.dll\" Component_=\"zlib1.dll\" FileName=\"zlib1.dll\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\zlib1.dll\" SelfReg=\"false\" NextFile=\"About.png\"/>\r\n    <ROW File=\"zoom_to_rect.png\" Component_=\"back.png\" FileName=\"ZOOM_T~1.PNG|zoom_to_rect.png\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\zoom_to_rect.png\" SelfReg=\"false\" NextFile=\"zoom_to_rect.ppm\"/>\r\n    <ROW File=\"zoom_to_rect.ppm\" Component_=\"back.png\" FileName=\"ZOOM_T~1.PPM|zoom_to_rect.ppm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\zoom_to_rect.ppm\" SelfReg=\"false\" NextFile=\"zoom_to_rect.svg\"/>\r\n    <ROW File=\"zoom_to_rect.svg\" Component_=\"back.png\" FileName=\"ZOOM_T~1.SVG|zoom_to_rect.svg\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\zoom_to_rect.svg\" SelfReg=\"false\" NextFile=\"zoom_to_rect.xpm\"/>\r\n    <ROW File=\"zoom_to_rect.xpm\" Component_=\"back.png\" FileName=\"ZOOM_T~1.XPM|zoom_to_rect.xpm\" Attributes=\"0\" SourcePath=\"..\\OptolithiumGui\\build\\exe.win32-2.7\\mpl-data\\images\\zoom_to_rect.xpm\" SelfReg=\"false\" NextFile=\"lineprops.glade\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.BuildComponent\">\r\n    <ROW BuildKey=\"DefaultBuild\" BuildName=\"DefaultBuild\" BuildOrder=\"1\" BuildType=\"0\" Languages=\"en\" InstallationType=\"4\" UseLargeSchema=\"true\"/>\r\n    <ATTRIBUTE name=\"CurrentBuild\" value=\"DefaultBuild\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.DictionaryComponent\">\r\n    <ROW Path=\"&lt;AI_DICTS&gt;ui.ail\"/>\r\n    <ROW Path=\"&lt;AI_DICTS&gt;ui_en.ail\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.FragmentComponent\">\r\n    <ROW Fragment=\"CommonUI.aip\" Path=\"&lt;AI_FRAGS&gt;CommonUI.aip\"/>\r\n    <ROW Fragment=\"FolderDlg.aip\" Path=\"&lt;AI_THEMES&gt;classic\\fragments\\FolderDlg.aip\"/>\r\n    <ROW Fragment=\"LicenseAgreementDlg.aip\" Path=\"&lt;AI_THEMES&gt;classic\\fragments\\LicenseAgreementDlg.aip\"/>\r\n    <ROW Fragment=\"MaintenanceTypeDlg.aip\" Path=\"&lt;AI_THEMES&gt;classic\\fragments\\MaintenanceTypeDlg.aip\"/>\r\n    <ROW Fragment=\"MaintenanceWelcomeDlg.aip\" Path=\"&lt;AI_THEMES&gt;classic\\fragments\\MaintenanceWelcomeDlg.aip\"/>\r\n    <ROW Fragment=\"SequenceDialogs.aip\" Path=\"&lt;AI_THEMES&gt;classic\\fragments\\SequenceDialogs.aip\"/>\r\n    <ROW Fragment=\"Sequences.aip\" Path=\"&lt;AI_FRAGS&gt;Sequences.aip\"/>\r\n    <ROW Fragment=\"StaticUIStrings.aip\" Path=\"&lt;AI_FRAGS&gt;StaticUIStrings.aip\"/>\r\n    <ROW Fragment=\"UI.aip\" Path=\"&lt;AI_THEMES&gt;classic\\fragments\\UI.aip\"/>\r\n    <ROW Fragment=\"Validation.aip\" Path=\"&lt;AI_FRAGS&gt;Validation.aip\"/>\r\n    <ROW Fragment=\"VerifyRemoveDlg.aip\" Path=\"&lt;AI_THEMES&gt;classic\\fragments\\VerifyRemoveDlg.aip\"/>\r\n    <ROW Fragment=\"VerifyRepairDlg.aip\" Path=\"&lt;AI_THEMES&gt;classic\\fragments\\VerifyRepairDlg.aip\"/>\r\n    <ROW Fragment=\"WelcomeDlg.aip\" Path=\"&lt;AI_THEMES&gt;classic\\fragments\\WelcomeDlg.aip\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiBinaryComponent\">\r\n    <ROW Name=\"aicustact.dll\" SourcePath=\"&lt;AI_CUSTACTS&gt;aicustact.dll\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiControlComponent\">\r\n    <ROW Dialog_=\"LicenseAgreementDlg\" Control=\"AgreementText\" Type=\"ScrollableText\" X=\"20\" Y=\"60\" Width=\"330\" Height=\"120\" Attributes=\"7\" Text=\"GPL-V2.rtf\" Order=\"400\" TextLocId=\"Control.Text.LicenseAgreementDlg#AgreementText_2\" MsiKey=\"LicenseAgreementDlg#AgreementText\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiControlEventComponent\">\r\n    <ROW Dialog_=\"WelcomeDlg\" Control_=\"Next\" Event=\"NewDialog\" Argument=\"LicenseAgreementDlg\" Condition=\"AI_INSTALL\" Ordering=\"1\"/>\r\n    <ROW Dialog_=\"FolderDlg\" Control_=\"Next\" Event=\"NewDialog\" Argument=\"VerifyReadyDlg\" Condition=\"AI_INSTALL\" Ordering=\"201\"/>\r\n    <ROW Dialog_=\"FolderDlg\" Control_=\"Back\" Event=\"NewDialog\" Argument=\"LicenseAgreementDlg\" Condition=\"AI_INSTALL\" Ordering=\"1\"/>\r\n    <ROW Dialog_=\"MaintenanceWelcomeDlg\" Control_=\"Next\" Event=\"NewDialog\" Argument=\"MaintenanceTypeDlg\" Condition=\"AI_MAINT\" Ordering=\"99\"/>\r\n    <ROW Dialog_=\"VerifyReadyDlg\" Control_=\"Install\" Event=\"EndDialog\" Argument=\"Return\" Condition=\"AI_MAINT\" Ordering=\"198\"/>\r\n    <ROW Dialog_=\"VerifyReadyDlg\" Control_=\"Back\" Event=\"NewDialog\" Argument=\"CustomizeDlg\" Condition=\"AI_MAINT\" Ordering=\"202\"/>\r\n    <ROW Dialog_=\"VerifyReadyDlg\" Control_=\"Install\" Event=\"EndDialog\" Argument=\"Return\" Condition=\"AI_INSTALL\" Ordering=\"197\"/>\r\n    <ROW Dialog_=\"VerifyReadyDlg\" Control_=\"Back\" Event=\"NewDialog\" Argument=\"FolderDlg\" Condition=\"AI_INSTALL\" Ordering=\"201\"/>\r\n    <ROW Dialog_=\"CustomizeDlg\" Control_=\"Next\" Event=\"NewDialog\" Argument=\"VerifyReadyDlg\" Condition=\"AI_MAINT\" Ordering=\"101\"/>\r\n    <ROW Dialog_=\"CustomizeDlg\" Control_=\"Back\" Event=\"NewDialog\" Argument=\"MaintenanceTypeDlg\" Condition=\"AI_MAINT\" Ordering=\"1\"/>\r\n    <ROW Dialog_=\"MaintenanceTypeDlg\" Control_=\"ChangeButton\" Event=\"NewDialog\" Argument=\"CustomizeDlg\" Condition=\"AI_MAINT\" Ordering=\"501\"/>\r\n    <ROW Dialog_=\"MaintenanceTypeDlg\" Control_=\"Back\" Event=\"NewDialog\" Argument=\"MaintenanceWelcomeDlg\" Condition=\"AI_MAINT\" Ordering=\"1\"/>\r\n    <ROW Dialog_=\"MaintenanceTypeDlg\" Control_=\"RemoveButton\" Event=\"NewDialog\" Argument=\"VerifyRemoveDlg\" Condition=\"AI_MAINT AND InstallMode=&quot;Remove&quot;\" Ordering=\"601\"/>\r\n    <ROW Dialog_=\"VerifyRemoveDlg\" Control_=\"Back\" Event=\"NewDialog\" Argument=\"MaintenanceTypeDlg\" Condition=\"AI_MAINT AND InstallMode=&quot;Remove&quot;\" Ordering=\"1\"/>\r\n    <ROW Dialog_=\"MaintenanceTypeDlg\" Control_=\"RepairButton\" Event=\"NewDialog\" Argument=\"VerifyRepairDlg\" Condition=\"AI_MAINT AND InstallMode=&quot;Repair&quot;\" Ordering=\"601\"/>\r\n    <ROW Dialog_=\"VerifyRepairDlg\" Control_=\"Back\" Event=\"NewDialog\" Argument=\"MaintenanceTypeDlg\" Condition=\"AI_MAINT AND InstallMode=&quot;Repair&quot;\" Ordering=\"1\"/>\r\n    <ROW Dialog_=\"VerifyRepairDlg\" Control_=\"Repair\" Event=\"EndDialog\" Argument=\"Return\" Condition=\"AI_MAINT AND InstallMode=&quot;Repair&quot;\" Ordering=\"399\" Options=\"1\"/>\r\n    <ROW Dialog_=\"VerifyRemoveDlg\" Control_=\"Remove\" Event=\"EndDialog\" Argument=\"Return\" Condition=\"AI_MAINT AND InstallMode=&quot;Remove&quot;\" Ordering=\"299\" Options=\"1\"/>\r\n    <ROW Dialog_=\"PatchWelcomeDlg\" Control_=\"Next\" Event=\"NewDialog\" Argument=\"VerifyReadyDlg\" Condition=\"AI_PATCH\" Ordering=\"201\"/>\r\n    <ROW Dialog_=\"ResumeDlg\" Control_=\"Install\" Event=\"EndDialog\" Argument=\"Return\" Condition=\"AI_RESUME\" Ordering=\"299\"/>\r\n    <ROW Dialog_=\"LicenseAgreementDlg\" Control_=\"Next\" Event=\"NewDialog\" Argument=\"FolderDlg\" Condition=\"AI_INSTALL\" Ordering=\"1\"/>\r\n    <ROW Dialog_=\"LicenseAgreementDlg\" Control_=\"Back\" Event=\"NewDialog\" Argument=\"WelcomeDlg\" Condition=\"AI_INSTALL\" Ordering=\"1\"/>\r\n    <ROW Dialog_=\"VerifyReadyDlg\" Control_=\"Install\" Event=\"EndDialog\" Argument=\"Return\" Condition=\"AI_PATCH\" Ordering=\"199\"/>\r\n    <ROW Dialog_=\"VerifyReadyDlg\" Control_=\"Back\" Event=\"NewDialog\" Argument=\"PatchWelcomeDlg\" Condition=\"AI_PATCH\" Ordering=\"203\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiCreateFolderComponent\">\r\n    <ROW Directory_=\"Optolithium_Dir\" Component_=\"Optolithium\" ManualDelete=\"false\"/>\r\n    <ROW Directory_=\"SHORTCUTDIR\" Component_=\"SHORTCUTDIR\" ManualDelete=\"false\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiCustActComponent\">\r\n    <ROW Action=\"AI_DOWNGRADE\" Type=\"19\" Target=\"4010\"/>\r\n    <ROW Action=\"AI_DpiContentScale\" Type=\"1\" Source=\"aicustact.dll\" Target=\"DpiContentScale\"/>\r\n    <ROW Action=\"AI_InstallModeCheck\" Type=\"1\" Source=\"aicustact.dll\" Target=\"UpdateInstallMode\" WithoutSeq=\"true\"/>\r\n    <ROW Action=\"AI_PREPARE_UPGRADE\" Type=\"65\" Source=\"aicustact.dll\" Target=\"PrepareUpgrade\"/>\r\n    <ROW Action=\"AI_RESTORE_LOCATION\" Type=\"65\" Source=\"aicustact.dll\" Target=\"RestoreLocation\"/>\r\n    <ROW Action=\"AI_ResolveKnownFolders\" Type=\"1\" Source=\"aicustact.dll\" Target=\"AI_ResolveKnownFolders\"/>\r\n    <ROW Action=\"AI_SETMIXINSTLOCATION\" Type=\"1\" Source=\"aicustact.dll\" Target=\"MixedAllUsersInstallLocation\"/>\r\n    <ROW Action=\"AI_SHOW_LOG\" Type=\"65\" Source=\"aicustact.dll\" Target=\"LaunchLogFile\" WithoutSeq=\"true\"/>\r\n    <ROW Action=\"AI_STORE_LOCATION\" Type=\"51\" Source=\"ARPINSTALLLOCATION\" Target=\"[APPDIR]\"/>\r\n    <ROW Action=\"SET_APPDIR\" Type=\"307\" Source=\"APPDIR\" Target=\"[ProgramFilesFolder][Manufacturer]\\[ProductName]\" MultiBuildTarget=\"DefaultBuild:[AI_UserProgramFiles]\\[ProductName]\"/>\r\n    <ROW Action=\"SET_SHORTCUTDIR\" Type=\"307\" Source=\"SHORTCUTDIR\" Target=\"[ProgramMenuFolder][ProductName]\"/>\r\n    <ROW Action=\"SET_TARGETDIR_TO_APPDIR\" Type=\"51\" Source=\"TARGETDIR\" Target=\"[APPDIR]\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiIconsComponent\">\r\n    <ROW Name=\"SystemFoldermsiexec.exe\" SourcePath=\"&lt;AI_RES&gt;uninstall.ico\" Index=\"0\"/>\r\n    <ROW Name=\"icon_1.exe\" SourcePath=\"..\\OptolithiumGui\\icon.ico\" Index=\"0\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiIniFileComponent\">\r\n    <ROW IniFile=\"URL\" FileName=\"Home.url\" DirProperty=\"SHORTCUTDIR\" Section=\"InternetShortcut\" Key=\"URL\" Value=\"https://bitbucket.org/gladkikhalexei/optolithium/overview\" Action=\"0\" Component_=\"About.png\"/>\r\n    <ROW IniFile=\"URL_1\" FileName=\"Home.url\" DirProperty=\"Optolithium_Dir\" Section=\"InternetShortcut\" Key=\"URL\" Value=\"https://bitbucket.org/gladkikhalexei/optolithium/overview\" Action=\"0\" Component_=\"About.png\"/>\r\n    <ROW IniFile=\"WorkingDirectory\" FileName=\"Home.url\" DirProperty=\"SHORTCUTDIR\" Section=\"InternetShortcut\" Key=\"WorkingDirectory\" Value=\"[SHORTCUTDIR]\" Action=\"0\" Component_=\"About.png\"/>\r\n    <ROW IniFile=\"WorkingDirectory_1\" FileName=\"Home.url\" DirProperty=\"Optolithium_Dir\" Section=\"InternetShortcut\" Key=\"WorkingDirectory\" Value=\"[Optolithium_Dir]\" Action=\"0\" Component_=\"About.png\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiInstExSeqComponent\">\r\n    <ROW Action=\"AI_DOWNGRADE\" Condition=\"AI_NEWERPRODUCTFOUND AND (UILevel &lt;&gt; 5)\" Sequence=\"210\"/>\r\n    <ROW Action=\"AI_RESTORE_LOCATION\" Condition=\"APPDIR=&quot;&quot;\" Sequence=\"749\"/>\r\n    <ROW Action=\"AI_STORE_LOCATION\" Condition=\"(Not Installed) OR REINSTALL\" Sequence=\"1501\"/>\r\n    <ROW Action=\"AI_PREPARE_UPGRADE\" Condition=\"AI_UPGRADE=&quot;No&quot; AND (Not Installed)\" Sequence=\"1399\"/>\r\n    <ROW Action=\"AI_ResolveKnownFolders\" Sequence=\"51\"/>\r\n    <ROW Action=\"AI_SETMIXINSTLOCATION\" Sequence=\"748\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiInstallUISequenceComponent\">\r\n    <ROW Action=\"AI_RESTORE_LOCATION\" Condition=\"APPDIR=&quot;&quot;\" Sequence=\"749\"/>\r\n    <ROW Action=\"AI_ResolveKnownFolders\" Sequence=\"52\"/>\r\n    <ROW Action=\"AI_DpiContentScale\" Sequence=\"51\"/>\r\n    <ROW Action=\"AI_SETMIXINSTLOCATION\" Sequence=\"748\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiLaunchConditionsComponent\">\r\n    <ROW Condition=\"(VersionNT &lt;&gt; 400)\" Description=\"[ProductName] cannot be installed on the following Windows versions: [WindowsTypeNT40Display]\" DescriptionLocId=\"AI.LaunchCondition.NoNT40\" IsPredefined=\"true\" Builds=\"DefaultBuild\"/>\r\n    <ROW Condition=\"VersionNT\" Description=\"[ProductName] cannot be installed on [WindowsType9XDisplay]\" DescriptionLocId=\"AI.LaunchCondition.No9X\" IsPredefined=\"true\" Builds=\"DefaultBuild\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiRegsComponent\">\r\n    <ROW Registry=\"Path\" Root=\"-1\" Key=\"Software\\[Manufacturer]\\[ProductName]\" Name=\"Path\" Value=\"[APPDIR]\" Component_=\"ProductInformation\"/>\r\n    <ROW Registry=\"Version\" Root=\"-1\" Key=\"Software\\[Manufacturer]\\[ProductName]\" Name=\"Version\" Value=\"[ProductVersion]\" Component_=\"ProductInformation\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiShortsComponent\">\r\n    <ROW Shortcut=\"Optolithium\" Directory_=\"SHORTCUTDIR\" Name=\"OPTOLI~1|Optolithium\" Component_=\"optolithium.exe\" Target=\"[#optolithium.exe]\" Description=\"Open Source Optical Lithography Simulation Software\" Hotkey=\"0\" IconIndex=\"0\" ShowCmd=\"1\" WkDir=\"APPDIR\"/>\r\n    <ROW Shortcut=\"Optolithium_1\" Directory_=\"Optolithium_Dir\" Name=\"OPTOLI~1|Optolithium\" Component_=\"optolithium.exe\" Target=\"[#optolithium.exe]\" Description=\"Open Source Optical Lithography Simulation Software\" Hotkey=\"0\" IconIndex=\"0\" ShowCmd=\"1\" WkDir=\"APPDIR\"/>\r\n    <ROW Shortcut=\"Optolithium_2\" Directory_=\"DesktopFolder\" Name=\"OPTOLI~1|Optolithium\" Component_=\"optolithium.exe\" Target=\"[#optolithium.exe]\" Description=\"Open Source Optical Lithography Simulation Software\" Hotkey=\"0\" IconIndex=\"0\" ShowCmd=\"1\" WkDir=\"APPDIR\"/>\r\n    <ROW Shortcut=\"SharedData\" Directory_=\"Optolithium_Dir\" Name=\"SHARED~1|Shared Data\" Component_=\"zlib1.dll\" Target=\"[data_Dir]\" Hotkey=\"0\" IconIndex=\"0\" ShowCmd=\"1\"/>\r\n    <ROW Shortcut=\"SharedData_1\" Directory_=\"SHORTCUTDIR\" Name=\"SHARED~1|Shared Data\" Component_=\"zlib1.dll\" Target=\"[data_Dir]\" Hotkey=\"0\" IconIndex=\"0\" ShowCmd=\"1\"/>\r\n    <ROW Shortcut=\"Uninstall\" Directory_=\"Optolithium_Dir\" Name=\"UNINST~1|Uninstall\" Component_=\"zlib1.dll\" Target=\"[SystemFolder]msiexec.exe\" Arguments=\"/x [ProductCode]\" Hotkey=\"0\" Icon_=\"SystemFoldermsiexec.exe\" IconIndex=\"0\" ShowCmd=\"1\"/>\r\n    <ROW Shortcut=\"Uninstall_1\" Directory_=\"SHORTCUTDIR\" Name=\"UNINST~1|Uninstall\" Component_=\"zlib1.dll\" Target=\"[SystemFolder]msiexec.exe\" Arguments=\"/x [ProductCode]\" Hotkey=\"0\" Icon_=\"SystemFoldermsiexec.exe\" IconIndex=\"0\" ShowCmd=\"1\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiThemeComponent\">\r\n    <ATTRIBUTE name=\"UsedTheme\" value=\"classic\"/>\r\n  </COMPONENT>\r\n  <COMPONENT cid=\"caphyon.advinst.msicomp.MsiUpgradeComponent\">\r\n    <ROW UpgradeCode=\"[|UpgradeCode]\" VersionMin=\"0.0.1\" VersionMax=\"[|ProductVersion]\" Attributes=\"257\" ActionProperty=\"OLDPRODUCTS\"/>\r\n    <ROW UpgradeCode=\"[|UpgradeCode]\" VersionMin=\"[|ProductVersion]\" Attributes=\"2\" ActionProperty=\"AI_NEWERPRODUCTFOUND\"/>\r\n  </COMPONENT>\r\n</DOCUMENT>\r\n"
  }
]